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

View as plain text