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