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  }