diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/hash.go | 67 | ||||
| -rw-r--r-- | lib/sha1.go | 68 | 
2 files changed, 67 insertions, 68 deletions
| diff --git a/lib/hash.go b/lib/hash.go index 363d3d6..c36ff43 100644 --- a/lib/hash.go +++ b/lib/hash.go @@ -3,31 +3,6 @@  package lib -// Converts padded messages bytes `pm` into 512-bit message blocks. -// Each 512-bit block is an array of 16 32-bit words. -// It's assumed bit length of `pm` is a multiple of 512. -func shaMessageBlocks(pm []byte) [][]uint32 { -	// Break into 512-bit blocks -	bs := BreakIntoBlocks(pm, 64) - -	mbs := make([][]uint32, 0) // Message blocks. -	for i := 0; i < len(bs); i++ { -		ws := make([]uint32, 0) // 32-bit words. - -		// Break 512-bit (64 bytes) into 32-bit words. -		for j := 0; j < 64; j = j + 4 { -			// Pack 4 bytes into a 32-bit word. -			w := (uint32(bs[i][j])<<24 | -				uint32(bs[i][j+1])<<16 | -				uint32(bs[i][j+2])<<8 | -				uint32(bs[i][j+3])) -			ws = append(ws, w) -		} -		mbs = append(mbs, ws) -	} -	return mbs -} -  // (a + b + ...) mod 2^32  func shaAdd(n ...uint32) uint32 {  	sum := uint64(0) @@ -46,45 +21,3 @@ func shaRotr(x uint32, n uint) uint32 {  func shaRotl(x uint32, n uint) uint32 {  	return (x << n) | (x >> (32 - n))  } - -// Returns Merkle–Damgård padding in bytes for length of mesage `l` -// bytes. -func MDPadding(l int) []byte { -	l = l * 8 // msg size in bits - -	// Reckon value of `k` -	k := 0 -	for ((l + 1 + k) % 512) != 448 { -		k += 1 -	} - -	// Initialize padding bytes -	pbs := make([]byte, 0) - -	// Add bit `1` as byte block. -	pbs = append(pbs, 0x80) -	f := 7 // unclaimed bits in last byte of `pbs` - -	// Add `k` bit `0`s -	for i := 0; i < k; i++ { -		if f == 0 { -			pbs = append(pbs, 0x0) -			f = 8 -		} -		f = f - 1 -	} - -	// Add `l` in a 64 bit block in `pbs` -	l64 := uint64(l) -	b64 := make([]byte, 8) // last 64-bits -	for i := 7; i >= 0; i-- { -		// Get 8 last bits. -		b64[i] = byte(l64 & 0xFF) - -		// Get rid of the last 8 bits. -		l64 = l64 >> 8 -	} -	pbs = append(pbs, b64...) - -	return pbs -} diff --git a/lib/sha1.go b/lib/sha1.go index e4ab369..989c59b 100644 --- a/lib/sha1.go +++ b/lib/sha1.go @@ -53,6 +53,30 @@ func sha1KT(t int) uint32 {  	}  } +// Converts padded messages bytes `pm` into 512-bit message blocks. +// Each 512-bit block is an array of 16 32-bit words. +func sha1MessageBlocks(pm []byte) [][]uint32 { +	// Break into 512-bit blocks +	bs := BreakIntoBlocks(pm, 64) + +	mbs := make([][]uint32, 0) // Message blocks. +	for i := 0; i < len(bs); i++ { +		ws := make([]uint32, 0) // 32-bit words. + +		// Break 512-bit (64 bytes) into 32-bit words. +		for j := 0; j < 64; j = j + 4 { +			// Pack 4 bytes into a 32-bit word. +			w := (uint32(bs[i][j])<<24 | +				uint32(bs[i][j+1])<<16 | +				uint32(bs[i][j+2])<<8 | +				uint32(bs[i][j+3])) +			ws = append(ws, w) +		} +		mbs = append(mbs, ws) +	} +	return mbs +} +  // Returns the message schedule W_t for message black `mb`  // The message schedule has 80 32-bit words.  func sha1MessageSchedule(mb []uint32) []uint32 { @@ -104,7 +128,7 @@ func (s *Sha1) Hash() []byte {  	pm := s.Pad()  	// Break into message blocks. -	mbs := shaMessageBlocks(pm) +	mbs := sha1MessageBlocks(pm)  	// Initialize hash values.  	h := make([]uint32, 5) @@ -170,3 +194,45 @@ func (s *Sha1) MacVerify(secret, msg, mac []byte) bool {  	}  	return false  } + +// Returns Merkle–Damgård padding in bytes for length of mesage `l` +// bytes. +func MDPadding(l int) []byte { +	l = l * 8 // msg size in bits + +	// Reckon value of `k` +	k := 0 +	for ((l + 1 + k) % 512) != 448 { +		k += 1 +	} + +	// Initialize padding bytes +	pbs := make([]byte, 0) + +	// Add bit `1` as byte block. +	pbs = append(pbs, 0x80) +	f := 7 // unclaimed bits in last byte of `pbs` + +	// Add `k` bit `0`s +	for i := 0; i < k; i++ { +		if f == 0 { +			pbs = append(pbs, 0x0) +			f = 8 +		} +		f = f - 1 +	} + +	// Add `l` in a 64 bit block in `pbs` +	l64 := uint64(l) +	b64 := make([]byte, 8) // last 64-bits +	for i := 7; i >= 0; i-- { +		// Get 8 last bits. +		b64[i] = byte(l64 & 0xFF) + +		// Get rid of the last 8 bits. +		l64 = l64 >> 8 +	} +	pbs = append(pbs, b64...) + +	return pbs +} | 
