-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
163 additions
and
174 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,124 @@ | ||
package md2 | ||
|
||
import ( | ||
"bytes" | ||
) | ||
|
||
// The size of an MD2 checksum in bytes. | ||
const Size = 16 | ||
|
||
// The blocksize of MD2 in bytes. | ||
const BlockSize = 16 | ||
|
||
// digest represents the partial evaluation of a checksum. | ||
type digest struct { | ||
s [48]byte // state, 48 ints | ||
x [BlockSize]byte // temp storage buffer, 16 bytes | ||
nx int // how many bytes are there in the buffer | ||
len uint64 | ||
|
||
digest [Size]byte // the digest, Size | ||
} | ||
|
||
func newDigest() *digest { | ||
d := new(digest) | ||
d.Reset() | ||
return d | ||
} | ||
|
||
func (d *digest) Reset() { | ||
d.digest = [Size]byte{} | ||
d.s = [48]byte{} | ||
d.x = [BlockSize]byte{} | ||
|
||
d.nx = 0 | ||
d.len = 0 | ||
} | ||
|
||
func (d *digest) Size() int { | ||
return Size | ||
} | ||
|
||
func (d *digest) BlockSize() int { | ||
return BlockSize | ||
} | ||
|
||
// Write is the interface for IO Writer | ||
func (d *digest) Write(p []byte) (nn int, err error) { | ||
nn = len(p) | ||
|
||
plen := len(p) | ||
|
||
for d.nx + plen >= BlockSize { | ||
xx := BlockSize - d.nx | ||
|
||
copy(d.x[d.nx:], p) | ||
|
||
d.block(d.x[:]) | ||
|
||
plen -= xx | ||
d.len += uint64(xx) | ||
|
||
p = p[xx:] | ||
d.nx = 0 | ||
} | ||
|
||
copy(d.x[d.nx:], p) | ||
d.nx += plen | ||
d.len += uint64(plen) | ||
|
||
return | ||
} | ||
|
||
func (d *digest) Sum(in []byte) []byte { | ||
// Make a copy of d so that caller can keep writing and summing. | ||
d0 := *d | ||
hash := d0.checkSum() | ||
return append(in, hash[:]...) | ||
} | ||
|
||
func (d *digest) checkSum() []byte { | ||
padding := BlockSize - d.nx | ||
tmp := bytes.Repeat([]byte{byte(padding)}, padding) | ||
d.Write(tmp) | ||
|
||
// At this state we should have nothing left in buffer | ||
if d.nx != 0 { | ||
panic("d.nx != 0") | ||
} | ||
|
||
d.Write(d.digest[:]) | ||
|
||
// At this state we should have nothing left in buffer | ||
if d.nx != 0 { | ||
panic("d.nx != 0") | ||
} | ||
|
||
return d.s[:16] | ||
} | ||
|
||
func (d *digest) block(p []byte) { | ||
var t, i, j uint8 | ||
t = 0 | ||
|
||
for i = 0; i < 16; i++ { | ||
d.s[i+16] = p[i] | ||
d.s[i+32] = byte(p[i] ^ d.s[i]) | ||
} | ||
|
||
for i = 0; i < 18; i++ { | ||
for j = 0; j < 48; j++ { | ||
d.s[j] = byte(d.s[j] ^ sbox[t]) | ||
t = d.s[j] | ||
} | ||
t = byte(t + i) | ||
} | ||
|
||
t = d.digest[15] | ||
|
||
for i = 0; i < 16; i++ { | ||
d.digest[i] = byte(d.digest[i] ^ sbox[p[i]^t]) | ||
t = d.digest[i] | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
package md2 | ||
|
||
var sbox = []uint8{ | ||
41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, | ||
19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, | ||
76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, | ||
138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251, | ||
245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63, | ||
148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50, | ||
39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165, | ||
181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210, | ||
150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157, | ||
112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27, | ||
96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15, | ||
85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197, | ||
234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65, | ||
129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123, | ||
8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233, | ||
203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228, | ||
166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237, | ||
31, 26, 219, 153, 141, 51, 159, 17, 131, 20, | ||
} |