Source file src/crypto/hmac/hmac_test.go

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package hmac
     6  
     7  import (
     8  	"crypto/internal/boring"
     9  	"crypto/internal/cryptotest"
    10  	"crypto/internal/fips140hash"
    11  	"crypto/md5"
    12  	"crypto/sha1"
    13  	"crypto/sha256"
    14  	"crypto/sha3"
    15  	"crypto/sha512"
    16  	"errors"
    17  	"fmt"
    18  	"hash"
    19  	"testing"
    20  )
    21  
    22  type hmacTest struct {
    23  	hash      func() hash.Hash
    24  	key       []byte
    25  	in        []byte
    26  	out       string
    27  	size      int
    28  	blocksize int
    29  }
    30  
    31  var hmacTests = []hmacTest{
    32  	// Tests from US FIPS 198
    33  	// https://csrc.nist.gov/publications/fips/fips198/fips-198a.pdf
    34  	{
    35  		sha1.New,
    36  		[]byte{
    37  			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    38  			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
    39  			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
    40  			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
    41  			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
    42  			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
    43  			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
    44  			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
    45  		},
    46  		[]byte("Sample #1"),
    47  		"4f4ca3d5d68ba7cc0a1208c9c61e9c5da0403c0a",
    48  		sha1.Size,
    49  		sha1.BlockSize,
    50  	},
    51  	{
    52  		sha1.New,
    53  		[]byte{
    54  			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
    55  			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
    56  			0x40, 0x41, 0x42, 0x43,
    57  		},
    58  		[]byte("Sample #2"),
    59  		"0922d3405faa3d194f82a45830737d5cc6c75d24",
    60  		sha1.Size,
    61  		sha1.BlockSize,
    62  	},
    63  	{
    64  		sha1.New,
    65  		[]byte{
    66  			0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
    67  			0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
    68  			0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
    69  			0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
    70  			0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
    71  			0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
    72  			0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
    73  			0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
    74  			0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
    75  			0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
    76  			0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
    77  			0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
    78  			0xb0, 0xb1, 0xb2, 0xb3,
    79  		},
    80  		[]byte("Sample #3"),
    81  		"bcf41eab8bb2d802f3d05caf7cb092ecf8d1a3aa",
    82  		sha1.Size,
    83  		sha1.BlockSize,
    84  	},
    85  
    86  	// Test from Plan 9.
    87  	{
    88  		md5.New,
    89  		[]byte("Jefe"),
    90  		[]byte("what do ya want for nothing?"),
    91  		"750c783e6ab0b503eaa86e310a5db738",
    92  		md5.Size,
    93  		md5.BlockSize,
    94  	},
    95  
    96  	// Tests from RFC 4231
    97  	{
    98  		sha256.New,
    99  		[]byte{
   100  			0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
   101  			0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
   102  			0x0b, 0x0b, 0x0b, 0x0b,
   103  		},
   104  		[]byte("Hi There"),
   105  		"b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7",
   106  		sha256.Size,
   107  		sha256.BlockSize,
   108  	},
   109  	{
   110  		sha256.New,
   111  		[]byte("Jefe"),
   112  		[]byte("what do ya want for nothing?"),
   113  		"5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843",
   114  		sha256.Size,
   115  		sha256.BlockSize,
   116  	},
   117  	{
   118  		sha256.New,
   119  		[]byte{
   120  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   121  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   122  			0xaa, 0xaa, 0xaa, 0xaa,
   123  		},
   124  		[]byte{
   125  			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
   126  			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
   127  			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
   128  			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
   129  			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
   130  			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
   131  			0xdd, 0xdd,
   132  		},
   133  		"773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565fe",
   134  		sha256.Size,
   135  		sha256.BlockSize,
   136  	},
   137  	{
   138  		sha256.New,
   139  		[]byte{
   140  			0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
   141  			0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
   142  			0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
   143  			0x19,
   144  		},
   145  		[]byte{
   146  			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
   147  			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
   148  			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
   149  			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
   150  			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
   151  			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
   152  			0xcd, 0xcd,
   153  		},
   154  		"82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665b",
   155  		sha256.Size,
   156  		sha256.BlockSize,
   157  	},
   158  	{
   159  		sha256.New,
   160  		[]byte{
   161  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   162  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   163  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   164  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   165  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   166  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   167  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   168  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   169  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   170  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   171  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   172  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   173  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   174  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   175  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   176  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   177  			0xaa, 0xaa, 0xaa,
   178  		},
   179  		[]byte("Test Using Larger Than Block-Size Key - Hash Key First"),
   180  		"60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f0ee37f54",
   181  		sha256.Size,
   182  		sha256.BlockSize,
   183  	},
   184  	{
   185  		sha256.New,
   186  		[]byte{
   187  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   188  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   189  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   190  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   191  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   192  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   193  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   194  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   195  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   196  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   197  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   198  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   199  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   200  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   201  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   202  			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
   203  			0xaa, 0xaa, 0xaa,
   204  		},
   205  		[]byte("This is a test using a larger than block-size key " +
   206  			"and a larger than block-size data. The key needs to " +
   207  			"be hashed before being used by the HMAC algorithm."),
   208  		"9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f51535c3a35e2",
   209  		sha256.Size,
   210  		sha256.BlockSize,
   211  	},
   212  
   213  	// Tests from https://csrc.nist.gov/groups/ST/toolkit/examples.html
   214  	// (truncated tag tests are left out)
   215  	{
   216  		sha1.New,
   217  		[]byte{
   218  			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   219  			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
   220  			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
   221  			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
   222  			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
   223  			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
   224  			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
   225  			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
   226  		},
   227  		[]byte("Sample message for keylen=blocklen"),
   228  		"5fd596ee78d5553c8ff4e72d266dfd192366da29",
   229  		sha1.Size,
   230  		sha1.BlockSize,
   231  	},
   232  	{
   233  		sha1.New,
   234  		[]byte{
   235  			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   236  			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
   237  			0x10, 0x11, 0x12, 0x13,
   238  		},
   239  		[]byte("Sample message for keylen<blocklen"),
   240  		"4c99ff0cb1b31bd33f8431dbaf4d17fcd356a807",
   241  		sha1.Size,
   242  		sha1.BlockSize,
   243  	},
   244  	{
   245  		sha1.New,
   246  		[]byte{
   247  			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   248  			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
   249  			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
   250  			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
   251  			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
   252  			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
   253  			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
   254  			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
   255  			0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
   256  			0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
   257  			0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
   258  			0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
   259  			0x60, 0x61, 0x62, 0x63,
   260  		},
   261  		[]byte("Sample message for keylen=blocklen"),
   262  		"2d51b2f7750e410584662e38f133435f4c4fd42a",
   263  		sha1.Size,
   264  		sha1.BlockSize,
   265  	},
   266  	{
   267  		sha256.New224,
   268  		[]byte{
   269  			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   270  			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
   271  			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
   272  			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
   273  			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
   274  			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
   275  			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
   276  			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
   277  		},
   278  		[]byte("Sample message for keylen=blocklen"),
   279  		"c7405e3ae058e8cd30b08b4140248581ed174cb34e1224bcc1efc81b",
   280  		sha256.Size224,
   281  		sha256.BlockSize,
   282  	},
   283  	{
   284  		sha256.New224,
   285  		[]byte{
   286  			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   287  			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
   288  			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
   289  			0x18, 0x19, 0x1a, 0x1b,
   290  		},
   291  		[]byte("Sample message for keylen<blocklen"),
   292  		"e3d249a8cfb67ef8b7a169e9a0a599714a2cecba65999a51beb8fbbe",
   293  		sha256.Size224,
   294  		sha256.BlockSize,
   295  	},
   296  	{
   297  		sha256.New224,
   298  		[]byte{
   299  			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   300  			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
   301  			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
   302  			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
   303  			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
   304  			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
   305  			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
   306  			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
   307  			0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
   308  			0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
   309  			0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
   310  			0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
   311  			0x60, 0x61, 0x62, 0x63,
   312  		},
   313  		[]byte("Sample message for keylen=blocklen"),
   314  		"91c52509e5af8531601ae6230099d90bef88aaefb961f4080abc014d",
   315  		sha256.Size224,
   316  		sha256.BlockSize,
   317  	},
   318  	{
   319  		sha256.New,
   320  		[]byte{
   321  			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   322  			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
   323  			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
   324  			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
   325  			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
   326  			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
   327  			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
   328  			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
   329  		},
   330  		[]byte("Sample message for keylen=blocklen"),
   331  		"8bb9a1db9806f20df7f77b82138c7914d174d59e13dc4d0169c9057b133e1d62",
   332  		sha256.Size,
   333  		sha256.BlockSize,
   334  	},
   335  	{
   336  		sha256.New,
   337  		[]byte{
   338  			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   339  			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
   340  			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
   341  			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
   342  		},
   343  		[]byte("Sample message for keylen<blocklen"),
   344  		"a28cf43130ee696a98f14a37678b56bcfcbdd9e5cf69717fecf5480f0ebdf790",
   345  		sha256.Size,
   346  		sha256.BlockSize,
   347  	},
   348  	{
   349  		sha256.New,
   350  		[]byte{
   351  			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   352  			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
   353  			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
   354  			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
   355  			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
   356  			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
   357  			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
   358  			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
   359  			0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
   360  			0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
   361  			0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
   362  			0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
   363  			0x60, 0x61, 0x62, 0x63,
   364  		},
   365  		[]byte("Sample message for keylen=blocklen"),
   366  		"bdccb6c72ddeadb500ae768386cb38cc41c63dbb0878ddb9c7a38a431b78378d",
   367  		sha256.Size,
   368  		sha256.BlockSize,
   369  	},
   370  	{
   371  		sha512.New384,
   372  		[]byte{
   373  			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   374  			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
   375  			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
   376  			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
   377  			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
   378  			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
   379  			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
   380  			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
   381  			0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
   382  			0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
   383  			0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
   384  			0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
   385  			0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
   386  			0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
   387  			0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
   388  			0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
   389  		},
   390  		[]byte("Sample message for keylen=blocklen"),
   391  		"63c5daa5e651847ca897c95814ab830bededc7d25e83eef9195cd45857a37f448947858f5af50cc2b1b730ddf29671a9",
   392  		sha512.Size384,
   393  		sha512.BlockSize,
   394  	},
   395  	{
   396  		sha512.New384,
   397  		[]byte{
   398  			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   399  			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
   400  			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
   401  			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
   402  			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
   403  			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
   404  		},
   405  		[]byte("Sample message for keylen<blocklen"),
   406  		"6eb242bdbb582ca17bebfa481b1e23211464d2b7f8c20b9ff2201637b93646af5ae9ac316e98db45d9cae773675eeed0",
   407  		sha512.Size384,
   408  		sha512.BlockSize,
   409  	},
   410  	{
   411  		sha512.New384,
   412  		[]byte{
   413  			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   414  			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
   415  			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
   416  			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
   417  			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
   418  			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
   419  			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
   420  			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
   421  			0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
   422  			0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
   423  			0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
   424  			0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
   425  			0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
   426  			0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
   427  			0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
   428  			0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
   429  			0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
   430  			0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
   431  			0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
   432  			0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
   433  			0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
   434  			0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
   435  			0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
   436  			0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
   437  			0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
   438  		},
   439  		[]byte("Sample message for keylen=blocklen"),
   440  		"5b664436df69b0ca22551231a3f0a3d5b4f97991713cfa84bff4d0792eff96c27dccbbb6f79b65d548b40e8564cef594",
   441  		sha512.Size384,
   442  		sha512.BlockSize,
   443  	},
   444  	{
   445  		sha512.New,
   446  		[]byte{
   447  			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   448  			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
   449  			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
   450  			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
   451  			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
   452  			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
   453  			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
   454  			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
   455  			0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
   456  			0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
   457  			0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
   458  			0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
   459  			0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
   460  			0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
   461  			0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
   462  			0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
   463  		},
   464  		[]byte("Sample message for keylen=blocklen"),
   465  		"fc25e240658ca785b7a811a8d3f7b4ca" +
   466  			"48cfa26a8a366bf2cd1f836b05fcb024bd36853081811d6c" +
   467  			"ea4216ebad79da1cfcb95ea4586b8a0ce356596a55fb1347",
   468  		sha512.Size,
   469  		sha512.BlockSize,
   470  	},
   471  	{
   472  		sha512.New,
   473  		[]byte{
   474  			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   475  			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
   476  			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
   477  			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
   478  			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
   479  			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
   480  			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
   481  			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
   482  		},
   483  		[]byte("Sample message for keylen<blocklen"),
   484  		"fd44c18bda0bb0a6ce0e82b031bf2818" +
   485  			"f6539bd56ec00bdc10a8a2d730b3634de2545d639b0f2cf7" +
   486  			"10d0692c72a1896f1f211c2b922d1a96c392e07e7ea9fedc",
   487  		sha512.Size,
   488  		sha512.BlockSize,
   489  	},
   490  	{
   491  		sha512.New,
   492  		[]byte{
   493  			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   494  			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
   495  			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
   496  			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
   497  			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
   498  			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
   499  			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
   500  			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
   501  			0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
   502  			0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
   503  			0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
   504  			0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
   505  			0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
   506  			0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
   507  			0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
   508  			0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
   509  			0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
   510  			0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
   511  			0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
   512  			0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
   513  			0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
   514  			0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
   515  			0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
   516  			0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
   517  			0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
   518  		},
   519  		[]byte("Sample message for keylen=blocklen"),
   520  		"d93ec8d2de1ad2a9957cb9b83f14e76a" +
   521  			"d6b5e0cce285079a127d3b14bccb7aa7286d4ac0d4ce6421" +
   522  			"5f2bc9e6870b33d97438be4aaa20cda5c5a912b48b8e27f3",
   523  		sha512.Size,
   524  		sha512.BlockSize,
   525  	},
   526  	// HMAC without key is dumb but should probably not fail.
   527  	{
   528  		sha1.New,
   529  		[]byte{},
   530  		[]byte("message"),
   531  		"d5d1ed05121417247616cfc8378f360a39da7cfa",
   532  		sha1.Size,
   533  		sha1.BlockSize,
   534  	},
   535  	{
   536  		sha256.New,
   537  		[]byte{},
   538  		[]byte("message"),
   539  		"eb08c1f56d5ddee07f7bdf80468083da06b64cf4fac64fe3a90883df5feacae4",
   540  		sha256.Size,
   541  		sha256.BlockSize,
   542  	},
   543  	{
   544  		sha512.New,
   545  		[]byte{},
   546  		[]byte("message"),
   547  		"08fce52f6395d59c2a3fb8abb281d74ad6f112b9a9c787bcea290d94dadbc82b2ca3e5e12bf2277c7fedbb0154d5493e41bb7459f63c8e39554ea3651b812492",
   548  		sha512.Size,
   549  		sha512.BlockSize,
   550  	},
   551  }
   552  
   553  func TestHMAC(t *testing.T) {
   554  	for i, tt := range hmacTests {
   555  		h := New(tt.hash, tt.key)
   556  		if s := h.Size(); s != tt.size {
   557  			t.Errorf("Size: got %v, want %v", s, tt.size)
   558  		}
   559  		if b := h.BlockSize(); b != tt.blocksize {
   560  			t.Errorf("BlockSize: got %v, want %v", b, tt.blocksize)
   561  		}
   562  		for j := 0; j < 4; j++ {
   563  			n, err := h.Write(tt.in)
   564  			if n != len(tt.in) || err != nil {
   565  				t.Errorf("test %d.%d: Write(%d) = %d, %v", i, j, len(tt.in), n, err)
   566  				continue
   567  			}
   568  
   569  			// Repetitive Sum() calls should return the same value
   570  			for k := 0; k < 2; k++ {
   571  				sum := fmt.Sprintf("%x", h.Sum(nil))
   572  				if sum != tt.out {
   573  					t.Errorf("test %d.%d.%d: have %s want %s\n", i, j, k, sum, tt.out)
   574  				}
   575  			}
   576  
   577  			// Second iteration: make sure reset works.
   578  			h.Reset()
   579  
   580  			// Third and fourth iteration: make sure hmac works on
   581  			// hashes without MarshalBinary/UnmarshalBinary
   582  			if j == 1 {
   583  				h = New(func() hash.Hash { return justHash{tt.hash()} }, tt.key)
   584  			}
   585  		}
   586  	}
   587  }
   588  
   589  func TestNoClone(t *testing.T) {
   590  	h := New(func() hash.Hash { return justHash{sha256.New()} }, []byte("key"))
   591  	if _, ok := h.(hash.Cloner); !ok {
   592  		t.Skip("no Cloner support")
   593  	}
   594  	h.Write([]byte("test"))
   595  	_, err := h.(hash.Cloner).Clone()
   596  	if !errors.Is(err, errors.ErrUnsupported) {
   597  		t.Errorf("Clone() = %v, want ErrUnsupported", err)
   598  	}
   599  }
   600  
   601  func TestSHA3Hash(t *testing.T) {
   602  	for _, tc := range []struct {
   603  		name string
   604  		fn   func() hash.Hash
   605  	}{
   606  		{
   607  			"sha3 zero init hash",
   608  			func() hash.Hash { return justHash{&sha3.SHA3{}} },
   609  		},
   610  		{
   611  			"sha3 zero init hash by linkname",
   612  			func() hash.Hash { return justHash{fips140hash.Unwrap(&sha3.SHA3{})} },
   613  		},
   614  	} {
   615  		t.Run(tc.name, func(t *testing.T) { New(tc.fn, []byte("key")) })
   616  	}
   617  }
   618  
   619  func TestNonUniqueHash(t *testing.T) {
   620  	if boring.Enabled {
   621  		t.Skip("hash.Hash provided by boringcrypto are not comparable")
   622  	}
   623  	sha := sha256.New()
   624  	defer func() {
   625  		err := recover()
   626  		if err == nil {
   627  			t.Error("expected panic when calling New with a non-unique hash generation function")
   628  		}
   629  	}()
   630  	New(func() hash.Hash { return sha }, []byte("bytes"))
   631  }
   632  
   633  // justHash implements just the hash.Hash methods and nothing else
   634  type justHash struct {
   635  	hash.Hash
   636  }
   637  
   638  func TestEqual(t *testing.T) {
   639  	a := []byte("test")
   640  	b := []byte("test1")
   641  	c := []byte("test2")
   642  
   643  	if !Equal(b, b) {
   644  		t.Error("Equal failed with equal arguments")
   645  	}
   646  	if Equal(a, b) {
   647  		t.Error("Equal accepted a prefix of the second argument")
   648  	}
   649  	if Equal(b, a) {
   650  		t.Error("Equal accepted a prefix of the first argument")
   651  	}
   652  	if Equal(b, c) {
   653  		t.Error("Equal accepted unequal slices")
   654  	}
   655  }
   656  
   657  func TestHMACHash(t *testing.T) {
   658  	for i, test := range hmacTests {
   659  		baseHash := test.hash
   660  		key := test.key
   661  
   662  		t.Run(fmt.Sprintf("test-%d", i), func(t *testing.T) {
   663  			cryptotest.TestHash(t, func() hash.Hash { return New(baseHash, key) })
   664  		})
   665  	}
   666  }
   667  
   668  func TestExtraMethods(t *testing.T) {
   669  	h := New(sha256.New, []byte("key"))
   670  	cryptotest.NoExtraMethods(t, maybeCloner(h))
   671  }
   672  
   673  func maybeCloner(h hash.Hash) any {
   674  	if c, ok := h.(hash.Cloner); ok {
   675  		return &c
   676  	}
   677  	return &h
   678  }
   679  
   680  func BenchmarkHMACSHA256_1K(b *testing.B) {
   681  	key := make([]byte, 32)
   682  	buf := make([]byte, 1024)
   683  	h := New(sha256.New, key)
   684  	b.SetBytes(int64(len(buf)))
   685  	for i := 0; i < b.N; i++ {
   686  		h.Write(buf)
   687  		mac := h.Sum(nil)
   688  		h.Reset()
   689  		buf[0] = mac[0]
   690  	}
   691  }
   692  
   693  func BenchmarkHMACSHA256_32(b *testing.B) {
   694  	key := make([]byte, 32)
   695  	buf := make([]byte, 32)
   696  	h := New(sha256.New, key)
   697  	b.SetBytes(int64(len(buf)))
   698  	for i := 0; i < b.N; i++ {
   699  		h.Write(buf)
   700  		mac := h.Sum(nil)
   701  		h.Reset()
   702  		buf[0] = mac[0]
   703  	}
   704  }
   705  
   706  func BenchmarkNewWriteSum(b *testing.B) {
   707  	buf := make([]byte, 32)
   708  	b.SetBytes(int64(len(buf)))
   709  	for i := 0; i < b.N; i++ {
   710  		h := New(sha256.New, make([]byte, 32))
   711  		h.Write(buf)
   712  		mac := h.Sum(nil)
   713  		buf[0] = mac[0]
   714  	}
   715  }
   716  

View as plain text