diff options
Diffstat (limited to 'lib/sha1.go')
-rw-r--r-- | lib/sha1.go | 68 |
1 files changed, 67 insertions, 1 deletions
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 +} |