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