// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// This package implements the MD5 hash algorithm as defined in RFC 1321.
package md5

import (
	"hash";
	"os";
)

// The size of an MD5 checksum in bytes.
const Size = 16

const (
	_Chunk	= 64;
	_Init0	= 0x67452301;
	_Init1	= 0xEFCDAB89;
	_Init2	= 0x98BADCFE;
	_Init3	= 0x10325476;
)

// digest represents the partial evaluation of a checksum.
type digest struct {
	s	[4]uint32;
	x	[_Chunk]byte;
	nx	int;
	len	uint64;
}

func (d *digest) Reset() {
	d.s[0] = _Init0;
	d.s[1] = _Init1;
	d.s[2] = _Init2;
	d.s[3] = _Init3;
	d.nx = 0;
	d.len = 0;
}

// New returns a Hash computing the SHA1 checksum.
func New() hash.Hash {
	d := new(digest);
	d.Reset();
	return d;
}

func (d *digest) Size() int	{ return Size }

func (d *digest) Write(p []byte) (nn int, err os.Error) {
	nn = len(p);
	d.len += uint64(nn);
	if d.nx > 0 {
		n := len(p);
		if n > _Chunk-d.nx {
			n = _Chunk - d.nx
		}
		for i := 0; i < n; i++ {
			d.x[d.nx+i] = p[i]
		}
		d.nx += n;
		if d.nx == _Chunk {
			_Block(d, &d.x);
			d.nx = 0;
		}
		p = p[n:len(p)];
	}
	n := _Block(d, p);
	p = p[n:len(p)];
	if len(p) > 0 {
		for i := 0; i < len(p); i++ {
			d.x[i] = p[i]
		}
		d.nx = len(p);
	}
	return;
}

func (d *digest) Sum() []byte {
	// Padding.  Add a 1 bit and 0 bits until 56 bytes mod 64.
	len := d.len;
	var tmp [64]byte;
	tmp[0] = 0x80;
	if len%64 < 56 {
		d.Write(tmp[0 : 56-len%64])
	} else {
		d.Write(tmp[0 : 64+56-len%64])
	}

	// Length in bits.
	len <<= 3;
	for i := uint(0); i < 8; i++ {
		tmp[i] = byte(len >> (8 * i))
	}
	d.Write(tmp[0:8]);

	if d.nx != 0 {
		panicln("oops")
	}

	p := make([]byte, 16);
	j := 0;
	for i := 0; i < 4; i++ {
		s := d.s[i];
		p[j] = byte(s);
		j++;
		p[j] = byte(s >> 8);
		j++;
		p[j] = byte(s >> 16);
		j++;
		p[j] = byte(s >> 24);
		j++;
	}
	return p;
}
