github.com/mattn/go@v0.0.0-20171011075504-07f7db3ea99f/src/crypto/hmac/hmac_test.go (about)

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