github.com/emmansun/gmsm@v0.29.1/pkcs/internal/md2/md2_test.go (about) 1 package md2 2 3 import ( 4 "bytes" 5 "encoding" 6 "fmt" 7 "io" 8 "testing" 9 10 "github.com/emmansun/gmsm/internal/cryptotest" 11 ) 12 13 type md2Test struct { 14 out string 15 in string 16 halfState string // marshaled hash state after first half of in written, used by TestGoldenMarshal 17 } 18 19 var golden = []md2Test{ 20 {"8350e5a3e24c153df2275c9f80692773", "", "md2\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"}, 21 {"32ec01ec4a6dac72c0ab96fb34c0b5d1", "a", "md2\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"}, 22 {"da853b0d3f88d99b30283a69e6ded6bb", "abc", "md2\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"}, 23 {"ab4f496bfb2a530b219ff33031fe06b0", "message digest", "md2\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00message\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a"}, 24 {"4e8ddff3650292ab5a4108c3aa47940b", "abcdefghijklmnopqrstuvwxyz", "md2\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00abcdefghijklm\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r"}, 25 {"da33def2a42df13975352846c30338cd", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "md2\x01\xa3k\x01X\x1a\xe6\x01\xfc\xe9\x8eH\xb5>\x8b:\xf9ho\x8a\xb1\x8f\xe1\xaf\xe4\xc5\x02¨Xs\xbb\xf8QRSTUVWXYZabcde\x00\x00\x00\x00\x00\x00\x00\x00\x1f"}, 26 {"d5976f79d83d3a0dc9806c3c66f3efd8", "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "md2\x01\x8d\xd7h\x84\x8b1\x19E\x92\xcfA\xd3\x00k\x83\xfa\xd1\xeb\xb3\\\xe8S\xac6:$j\x93\xe8=\x03\x8534567890\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00("}, 27 } 28 29 func TestGolden(t *testing.T) { 30 for i := 0; i < len(golden); i++ { 31 g := golden[i] 32 s := fmt.Sprintf("%x", Sum([]byte(g.in))) 33 if s != g.out { 34 t.Fatalf("Sum function: md2(%s) = %s want %s", g.in, s, g.out) 35 } 36 c := New() 37 buf := make([]byte, len(g.in)+4) 38 for j := 0; j < 3+4; j++ { 39 if j < 2 { 40 io.WriteString(c, g.in) 41 } else if j == 2 { 42 io.WriteString(c, g.in[0:len(g.in)/2]) 43 c.Sum(nil) 44 io.WriteString(c, g.in[len(g.in)/2:]) 45 } else if j > 2 { 46 // test unaligned write 47 buf = buf[1:] 48 copy(buf, g.in) 49 c.Write(buf[:len(g.in)]) 50 } 51 s := fmt.Sprintf("%x", c.Sum(nil)) 52 if s != g.out { 53 t.Fatalf("md2[%d](%s) = %s want %s", j, g.in, s, g.out) 54 } 55 c.Reset() 56 } 57 } 58 } 59 60 type binaryAppender interface { 61 // AppendBinary appends the binary representation of itself to the end of b 62 // (allocating a larger slice if necessary) and returns the updated slice. 63 // 64 // Implementations must not retain b, nor mutate any bytes within b[:len(b)]. 65 AppendBinary(b []byte) ([]byte, error) 66 } 67 68 func TestGoldenMarshal(t *testing.T) { 69 for _, g := range golden { 70 h := New() 71 h2 := New() 72 73 io.WriteString(h, g.in[:len(g.in)/2]) 74 75 state, err := h.(encoding.BinaryMarshaler).MarshalBinary() 76 if err != nil { 77 t.Errorf("could not marshal: %v", err) 78 continue 79 } 80 81 stateAppend, err := h.(binaryAppender).AppendBinary(make([]byte, 4, 32)) 82 if err != nil { 83 t.Errorf("could not marshal: %v", err) 84 continue 85 } 86 stateAppend = stateAppend[4:] 87 88 if string(state) != g.halfState { 89 t.Errorf("md2(%q) state = %q, want %q", g.in, state, g.halfState) 90 continue 91 } 92 93 if string(stateAppend) != g.halfState { 94 t.Errorf("md2(%q) stateAppend = %q, want %q", g.in, stateAppend, g.halfState) 95 continue 96 } 97 98 if err := h2.(encoding.BinaryUnmarshaler).UnmarshalBinary(state); err != nil { 99 t.Errorf("could not unmarshal: %v", err) 100 continue 101 } 102 103 io.WriteString(h, g.in[len(g.in)/2:]) 104 io.WriteString(h2, g.in[len(g.in)/2:]) 105 106 if actual, actual2 := h.Sum(nil), h2.Sum(nil); !bytes.Equal(actual, actual2) { 107 t.Errorf("md2(%q) = 0x%x != marshaled 0x%x", g.in, actual, actual2) 108 } 109 } 110 } 111 112 func TestSize(t *testing.T) { 113 c := New() 114 if got := c.Size(); got != Size { 115 t.Errorf("Size = %d; want %d", got, Size) 116 } 117 } 118 119 func TestBlockSize(t *testing.T) { 120 c := New() 121 if got := c.BlockSize(); got != BlockSize { 122 t.Errorf("BlockSize = %d want %d", got, BlockSize) 123 } 124 } 125 126 func TestMD2Hash(t *testing.T) { 127 t.Run("MD2", func(t *testing.T) { 128 cryptotest.TestHash(t, New) 129 }) 130 } 131 132 func TestAllocations(t *testing.T) { 133 in := []byte("hello, world!") 134 out := make([]byte, 0, Size) 135 h := New() 136 n := int(testing.AllocsPerRun(10, func() { 137 h.Reset() 138 h.Write(in) 139 out = h.Sum(out[:0]) 140 })) 141 if n > 0 { 142 t.Errorf("allocs = %d, want 0", n) 143 } 144 }