Source file
src/crypto/hmac/hmac_test.go
1
2
3
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
31
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
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
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
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 },
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
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
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
576 h.Reset()
577
578
579
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
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