Annotation of embedaddon/bird2/lib/mac_test.c, revision 1.1.1.1
1.1 misho 1: /*
2: * BIRD Library -- SHA and HMAC-SHA functions tests
3: *
4: * (c) 2015 CZ.NIC z.s.p.o.
5: *
6: * Can be freely distributed and used under the terms of the GNU GPL.
7: */
8:
9: #include "test/birdtest.h"
10: #include "test/bt-utils.h"
11:
12: #include "lib/mac.h"
13:
14:
15: #define define_test_hash_fn(name,id) \
16: static int \
17: test_##name(void *out_, const void *in_, const void *expected_out_) \
18: { \
19: char *out = out_; \
20: const char *in = in_; \
21: const char *expected_out = expected_out_; \
22: \
23: struct mac_context ctx; \
24: mac_init(&ctx, id, NULL, 0); \
25: mac_update(&ctx, in, strlen(in)); \
26: byte *out_bin = mac_final(&ctx); \
27: \
28: uint len = mac_type_length(id); \
29: bt_bytes_to_hex(out, out_bin, len); \
30: \
31: return strncmp(out, expected_out, 2*len+1) == 0; \
32: }
33:
34: define_test_hash_fn(md5, ALG_MD5)
35: define_test_hash_fn(sha1, ALG_SHA1)
36: define_test_hash_fn(sha224, ALG_SHA224)
37: define_test_hash_fn(sha256, ALG_SHA256)
38: define_test_hash_fn(sha384, ALG_SHA384)
39: define_test_hash_fn(sha512, ALG_SHA512)
40:
41:
42: static int
43: t_md5(void)
44: {
45: struct bt_pair test_vectors[] = {
46: {
47: .in = "",
48: .out = "d41d8cd98f00b204e9800998ecf8427e",
49: },
50: {
51: .in = "a",
52: .out = "0cc175b9c0f1b6a831c399e269772661",
53: },
54: {
55: .in = "abc",
56: .out = "900150983cd24fb0d6963f7d28e17f72",
57: },
58: {
59: .in = "message digest",
60: .out = "f96b697d7cb7938d525a2f31aaf161d0",
61: },
62: {
63: .in = "abcdefghijklmnopqrstuvwxyz",
64: .out = "c3fcd3d76192e4007dfb496cca67e13b",
65: },
66: {
67: .in = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
68: .out = "d174ab98d277d9f5a5611c2c9f419d9f",
69: },
70: {
71: .in = "12345678901234567890123456789012345678901234567890123456789012345678901234567890",
72: .out = "57edf4a22be3c955ac49da2e2107b67a",
73: },
74: };
75:
76: return bt_assert_batch(test_vectors, test_md5, bt_fmt_str, bt_fmt_str);
77: }
78:
79:
80: /*
81: * Testing SHAxxx functions
82: */
83:
84:
85: static int
86: t_sha1(void)
87: {
88: struct bt_pair test_vectors[] = {
89: {
90: .in = "",
91: .out = "da39a3ee5e6b4b0d3255bfef95601890afd80709",
92: },
93: {
94: .in = "a",
95: .out = "86f7e437faa5a7fce15d1ddcb9eaeaea377667b8",
96: },
97: {
98: .in = "abc",
99: .out = "a9993e364706816aba3e25717850c26c9cd0d89d",
100: },
101: {
102: .in = "message digest",
103: .out = "c12252ceda8be8994d5fa0290a47231c1d16aae3",
104: },
105: {
106: .in = "abcdefghijklmnopqrstuvwxyz",
107: .out = "32d10c7b8cf96570ca04ce37f2a19d84240d3a89",
108: },
109: {
110: .in = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
111: .out = "761c457bf73b14d27e9e9265c46f4b4dda11f940",
112: },
113: {
114: .in = "12345678901234567890123456789012345678901234567890123456789012345678901234567890",
115: .out = "50abf5706a150990a08b2c5ea40fa0e585554732",
116: },
117: {
118: .in = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
119: .out = "6a64fcc1fb970f7339ce886601775d2efea5cd4b",
120: },
121: };
122:
123: return bt_assert_batch(test_vectors, test_sha1, bt_fmt_str, bt_fmt_str);
124: }
125:
126: static int
127: t_sha224(void)
128: {
129: struct bt_pair test_vectors[] = {
130: {
131: .in = "",
132: .out = "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f",
133: },
134: {
135: .in = "a",
136: .out = "abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5",
137: },
138: {
139: .in = "abc",
140: .out = "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7",
141: },
142: {
143: .in = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
144: .out = "75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525",
145: },
146: {
147: .in = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
148: .out = "cca7dd1a332a17775d8b0429bdb45055c2d4368ebaab0c7cf385586e",
149: },
150: };
151:
152: return bt_assert_batch(test_vectors, test_sha224, bt_fmt_str, bt_fmt_str);
153: }
154:
155: static int
156: t_sha256(void)
157: {
158: struct bt_pair test_vectors[] = {
159: {
160: .in = "",
161: .out = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
162: },
163: {
164: .in = "a",
165: .out = "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
166: },
167: {
168: .in = "abc",
169: .out = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad",
170: },
171: {
172: .in = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
173: .out = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1",
174: },
175: {
176: .in = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
177: .out = "bf18b43b61652b5d73f41ebf3d72e5e43aebf5076f497dde31ea3de9de4998ef",
178: },
179: };
180:
181: return bt_assert_batch(test_vectors, test_sha256, bt_fmt_str, bt_fmt_str);
182: }
183:
184: static int
185: t_sha384(void)
186: {
187: struct bt_pair test_vectors[] = {
188: {
189: .in = "",
190: .out = "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b",
191: },
192: {
193: .in = "a",
194: .out = "54a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31",
195: },
196: {
197: .in = "abc",
198: .out = "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7",
199: },
200: {
201: .in = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
202: .out = "3391fdddfc8dc7393707a65b1b4709397cf8b1d162af05abfe8f450de5f36bc6b0455a8520bc4e6f5fe95b1fe3c8452b",
203: },
204: {
205: .in = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
206: .out = "6452928a62ca915a60f2d16ea22cc832d8ecb35443d78a3ff6986e7def9174a1dc16ce2ff65d3ed1666db98357f3c05e",
207: },
208: };
209:
210: return bt_assert_batch(test_vectors, test_sha384, bt_fmt_str, bt_fmt_str);
211: }
212:
213: static int
214: t_sha512(void)
215: {
216: struct bt_pair test_vectors[] = {
217: {
218: .in = "",
219: .out = "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
220: },
221: {
222: .in = "a",
223: .out = "1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75",
224: },
225: {
226: .in = "abc",
227: .out = "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f",
228: },
229: {
230: .in = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
231: .out = "204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445",
232: },
233: {
234: .in = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
235: .out = "415509a1c345371acb3e27a88b3835e3b6dfebcbbab5134850596f4db64d7bb22ac42c3cd179446a80c92b8be955460eb536eac01389a7e1fdf09d1dca83922f",
236: },
237: };
238:
239: return bt_assert_batch(test_vectors, test_sha512, bt_fmt_str, bt_fmt_str);
240: }
241:
242:
243: /*
244: * Testing SHAxxx HMAC functions
245: */
246:
247: #define HMAC_BUFFER_SIZE 160
248: struct hmac_data_in {
249: byte key[HMAC_BUFFER_SIZE];
250: uint key_len;
251: byte data[HMAC_BUFFER_SIZE];
252: uint data_len;
253: };
254:
255: static void
256: hmac_in_fmt(char *buf, size_t size, const void *data_)
257: {
258: uint i;
259: const struct hmac_data_in *data = data_;
260:
261: snprintf(buf, size, "data: '");
262: for (i = 0; i < data->data_len; i++)
263: snprintf(buf+strlen(buf), size-strlen(buf), bt_is_char(data->data[i]) ? "%c" : " 0x%02x", data->data[i]);
264:
265: snprintf(buf+strlen(buf), size-strlen(buf), "', key: '");
266: for (i = 0; i < data->key_len; i++)
267: snprintf(buf+strlen(buf), size-strlen(buf), bt_is_char(data->key[i]) ? "%c" : " 0x%02x", data->key[i]);
268: snprintf(buf+strlen(buf), size-strlen(buf), "'");
269: }
270:
271: #define define_test_hmac_fn(name,id) \
272: static int \
273: test_##name##_hmac(void *out_, const void *in_, const void *expected_out_) \
274: { \
275: char *out = out_; \
276: const struct hmac_data_in *in = in_; \
277: const char *expected_out = expected_out_; \
278: \
279: struct mac_context ctx; \
280: mac_init(&ctx, id, in->key, in->key_len); \
281: mac_update(&ctx, in->data, in->data_len); \
282: byte *out_bin = mac_final(&ctx); \
283: \
284: uint len = mac_type_length(id); \
285: bt_bytes_to_hex(out, out_bin, len); \
286: \
287: return strncmp(out, expected_out, 2*len+1) == 0; \
288: }
289:
290: define_test_hmac_fn(md5, ALG_HMAC_MD5)
291: define_test_hmac_fn(sha1, ALG_HMAC_SHA1)
292: define_test_hmac_fn(sha224, ALG_HMAC_SHA224)
293: define_test_hmac_fn(sha256, ALG_HMAC_SHA256)
294: define_test_hmac_fn(sha384, ALG_HMAC_SHA384)
295: define_test_hmac_fn(sha512, ALG_HMAC_SHA512)
296:
297:
298: static int
299: t_md5_hmac(void)
300: {
301: struct bt_pair test_vectors[] = {
302: {
303: .in = & (struct hmac_data_in) {
304: .key = {
305: 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
306: 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
307: },
308: .key_len = 16,
309: .data = "Hi There",
310: .data_len = 8,
311: },
312: .out = "9294727a3638bb1c13f48ef8158bfc9d",
313: },
314: {
315: .in = & (struct hmac_data_in) {
316: .key = "Jefe",
317: .key_len = 4,
318: .data = "what do ya want for nothing?",
319: .data_len = 28,
320: },
321: .out = "750c783e6ab0b503eaa86e310a5db738",
322: },
323: {
324: .in = & (struct hmac_data_in) {
325: .key = {
326: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
327: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
328: },
329: .key_len = 16,
330: .data = {
331: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
332: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
333: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
334: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
335: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
336: },
337: .data_len = 50,
338: },
339: .out = "56be34521d144c88dbb8c733f0e8b3f6",
340: },
341: {
342: .in = & (struct hmac_data_in) {
343: .key = {
344: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
345: 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
346: 0x15, 0x16, 0x17, 0x18, 0x19,
347: },
348: .key_len = 25,
349: .data = {
350: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
351: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
352: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
353: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
354: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
355: },
356: .data_len = 50,
357: },
358: .out = "697eaf0aca3a3aea3a75164746ffaa79",
359: },
360: {
361: .in = & (struct hmac_data_in) {
362: .key = {
363: 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
364: 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
365: },
366: .key_len = 16,
367: .data = "Test With Truncation",
368: .data_len = 20,
369: },
370: .out = "56461ef2342edc00f9bab995690efd4c",
371: },
372: {
373: .in = & (struct hmac_data_in) {
374: .key = {
375: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
376: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
377: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
378: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
379: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
380: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
381: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
382: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
383: },
384: .key_len = 80,
385: .data = "Test Using Larger Than Block-Size Key - Hash Key First",
386: .data_len = 54,
387: },
388: .out = "6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd",
389: },
390: {
391: .in = & (struct hmac_data_in) {
392: .key = {
393: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
394: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
395: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
396: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
397: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
398: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
399: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
400: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
401: },
402: .key_len = 80,
403: .data = "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data",
404: .data_len = 73,
405: },
406: .out = "6f630fad67cda0ee1fb1f562db3aa53e",
407: },
408: };
409:
410: return bt_assert_batch(test_vectors, test_md5_hmac, hmac_in_fmt, bt_fmt_str);
411: }
412:
413: static int
414: t_sha1_hmac(void)
415: {
416: struct bt_pair test_vectors[] = {
417: {
418: .in = & (struct hmac_data_in) {
419: .key = {
420: 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
421: 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
422: },
423: .key_len = 20,
424: .data = "Hi There",
425: .data_len = 8,
426: },
427: .out = "b617318655057264e28bc0b6fb378c8ef146be00",
428: },
429: {
430: .in = & (struct hmac_data_in) {
431: .key = "Jefe",
432: .key_len = 4,
433: .data = "what do ya want for nothing?",
434: .data_len = 28,
435: },
436: .out = "effcdf6ae5eb2fa2d27416d5f184df9c259a7c79",
437: },
438: {
439: .in = & (struct hmac_data_in) {
440: .key = {
441: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
442: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
443: },
444: .key_len = 20,
445: .data = {
446: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
447: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
448: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
449: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
450: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
451: },
452: .data_len = 50,
453: },
454: .out = "125d7342b9ac11cd91a39af48aa17b4f63f175d3",
455: },
456: {
457: .in = & (struct hmac_data_in) {
458: .key = {
459: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
460: 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
461: 0x15, 0x16, 0x17, 0x18, 0x19,
462: },
463: .key_len = 25,
464: .data = {
465: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
466: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
467: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
468: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
469: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
470: },
471: .data_len = 50,
472: },
473: .out = "4c9007f4026250c6bc8414f9bf50c86c2d7235da",
474: },
475: {
476: .in = & (struct hmac_data_in) {
477: .key = {
478: 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
479: 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
480: },
481: .key_len = 20,
482: .data = "Test With Truncation",
483: .data_len = 20,
484: },
485: .out = "4c1a03424b55e07fe7f27be1d58bb9324a9a5a04",
486: },
487: {
488: .in = & (struct hmac_data_in) {
489: .key = {
490: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
491: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
492: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
493: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
494: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
495: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
496: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
497: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
498: },
499: .key_len = 80,
500: .data = "Test Using Larger Than Block-Size Key - Hash Key First",
501: .data_len = 54,
502: },
503: .out = "aa4ae5e15272d00e95705637ce8a3b55ed402112",
504: },
505: {
506: .in = & (struct hmac_data_in) {
507: .key = {
508: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
509: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
510: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
511: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
512: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
513: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
514: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
515: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
516: },
517: .key_len = 80,
518: .data = "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data",
519: .data_len = 73,
520: },
521: .out = "e8e99d0f45237d786d6bbaa7965c7808bbff1a91",
522: },
523: {
524: .in = & (struct hmac_data_in) {
525: .key = {
526: 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
527: 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
528: 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
529: 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
530: 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
531: 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61,
532: 0x61, 0x61, 0x61, 0x61,
533: },
534: .key_len = 64,
535: .data = "Test Using key 64 bytes sized",
536: .data_len = 29,
537: },
538: .out = "a55d4fb80962a6b3d2e720705314bee417d68cf6",
539: },
540: };
541:
542: return bt_assert_batch(test_vectors, test_sha1_hmac, hmac_in_fmt, bt_fmt_str);
543: }
544:
545: static int
546: t_sha224_hmac(void)
547: {
548: struct bt_pair test_vectors[] = {
549: {
550: .in = & (struct hmac_data_in) {
551: .key = {
552: 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
553: 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
554: },
555: .key_len = 20,
556: .data = "Hi There",
557: .data_len = 8,
558: },
559: .out = "896fb1128abbdf196832107cd49df33f47b4b1169912ba4f53684b22",
560: },
561: {
562: .in = & (struct hmac_data_in) {
563: .key = "Jefe",
564: .key_len = 4,
565: .data = "what do ya want for nothing?",
566: .data_len = 28,
567: },
568: .out = "a30e01098bc6dbbf45690f3a7e9e6d0f8bbea2a39e6148008fd05e44",
569: },
570: {
571: .in = & (struct hmac_data_in) {
572: .key = {
573: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
574: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
575: },
576: .key_len = 20,
577: .data = {
578: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
579: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
580: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
581: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
582: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
583: },
584: .data_len = 50,
585: },
586: .out = "7fb3cb3588c6c1f6ffa9694d7d6ad2649365b0c1f65d69d1ec8333ea",
587: },
588: {
589: .in = & (struct hmac_data_in) {
590: .key = {
591: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
592: 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
593: 0x15, 0x16, 0x17, 0x18, 0x19,
594: },
595: .key_len = 25,
596: .data = {
597: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
598: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
599: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
600: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
601: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
602: },
603: .data_len = 50,
604: },
605: .out = "6c11506874013cac6a2abc1bb382627cec6a90d86efc012de7afec5a",
606: },
607: {
608: .in = & (struct hmac_data_in) {
609: .key = {
610: 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
611: 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
612: },
613: .key_len = 20,
614: .data = "Test With Truncation",
615: .data_len = 20,
616: },
617: .out = "0e2aea68a90c8d37c988bcdb9fca6fa8099cd857c7ec4a1815cac54c",
618: },
619: {
620: .in = & (struct hmac_data_in) {
621: .key = {
622: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
623: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
624: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
625: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
626: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
627: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
628: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
629: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
630: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
631: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
632: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
633: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
634: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
635: 0xaa,
636: },
637: .key_len = 131,
638: .data = "Test Using Larger Than Block-Size Key - Hash Key First",
639: .data_len = 54,
640: },
641: .out = "95e9a0db962095adaebe9b2d6f0dbce2d499f112f2d2b7273fa6870e",
642: },
643: {
644: .in = & (struct hmac_data_in) {
645: .key = {
646: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
647: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
648: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
649: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
650: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
651: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
652: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
653: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
654: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
655: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
656: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
657: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
658: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
659: 0xaa,
660: },
661: .key_len = 131,
662: .data = "This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.",
663: .data_len = 152,
664: },
665: .out = "3a854166ac5d9f023f54d517d0b39dbd946770db9c2b95c9f6f565d1",
666: },
667: };
668:
669: return bt_assert_batch(test_vectors, test_sha224_hmac, hmac_in_fmt, bt_fmt_str);
670: }
671:
672: static int
673: t_sha256_hmac(void)
674: {
675: struct bt_pair test_vectors[] = {
676: {
677: .in = & (struct hmac_data_in) {
678: .key = {
679: 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
680: 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
681: },
682: .key_len = 20,
683: .data = "Hi There",
684: .data_len = 8,
685: },
686: .out = "b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7",
687: },
688: {
689: .in = & (struct hmac_data_in) {
690: .key = "Jefe",
691: .key_len = 4,
692: .data = "what do ya want for nothing?",
693: .data_len = 28,
694: },
695: .out = "5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843",
696: },
697: {
698: .in = & (struct hmac_data_in) {
699: .key = {
700: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
701: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
702: },
703: .key_len = 20,
704: .data = {
705: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
706: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
707: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
708: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
709: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
710: },
711: .data_len = 50,
712: },
713: .out = "773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565fe",
714: },
715: {
716: .in = & (struct hmac_data_in) {
717: .key = {
718: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
719: 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
720: 0x15, 0x16, 0x17, 0x18, 0x19,
721: },
722: .key_len = 25,
723: .data = {
724: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
725: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
726: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
727: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
728: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
729: },
730: .data_len = 50,
731: },
732: .out = "82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665b",
733: },
734: {
735: .in = & (struct hmac_data_in) {
736: .key = {
737: 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
738: 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
739: },
740: .key_len = 20,
741: .data = "Test With Truncation",
742: .data_len = 20,
743: },
744: .out = "a3b6167473100ee06e0c796c2955552bfa6f7c0a6a8aef8b93f860aab0cd20c5",
745: },
746: {
747: .in = & (struct hmac_data_in) {
748: .key = {
749: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
750: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
751: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
752: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
753: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
754: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
755: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
756: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
757: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
758: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
759: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
760: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
761: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
762: 0xaa,
763: },
764: .key_len = 131,
765: .data = "Test Using Larger Than Block-Size Key - Hash Key First",
766: .data_len = 54,
767: },
768: .out = "60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f0ee37f54",
769: },
770: {
771: .in = & (struct hmac_data_in) {
772: .key = {
773: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
774: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
775: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
776: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
777: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
778: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
779: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
780: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
781: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
782: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
783: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
784: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
785: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
786: 0xaa,
787: },
788: .key_len = 131,
789: .data = "This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.",
790: .data_len = 152,
791: },
792: .out = "9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f51535c3a35e2",
793: },
794: };
795:
796: return bt_assert_batch(test_vectors, test_sha256_hmac, hmac_in_fmt, bt_fmt_str);
797: }
798:
799: static int
800: t_sha384_hmac(void)
801: {
802: struct bt_pair test_vectors[] = {
803: {
804: .in = & (struct hmac_data_in) {
805: .key = {
806: 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
807: 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
808: },
809: .key_len = 20,
810: .data = "Hi There",
811: .data_len = 8,
812: },
813: .out = "afd03944d84895626b0825f4ab46907f15f9dadbe4101ec682aa034c7cebc59cfaea9ea9076ede7f4af152e8b2fa9cb6",
814: },
815: {
816: .in = & (struct hmac_data_in) {
817: .key = "Jefe",
818: .key_len = 4,
819: .data = "what do ya want for nothing?",
820: .data_len = 28,
821: },
822: .out = "af45d2e376484031617f78d2b58a6b1b9c7ef464f5a01b47e42ec3736322445e8e2240ca5e69e2c78b3239ecfab21649",
823: },
824: {
825: .in = & (struct hmac_data_in) {
826: .key = {
827: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
828: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
829: },
830: .key_len = 20,
831: .data = {
832: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
833: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
834: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
835: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
836: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
837: },
838: .data_len = 50,
839: },
840: .out = "88062608d3e6ad8a0aa2ace014c8a86f0aa635d947ac9febe83ef4e55966144b2a5ab39dc13814b94e3ab6e101a34f27",
841: },
842: {
843: .in = & (struct hmac_data_in) {
844: .key = {
845: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
846: 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
847: 0x15, 0x16, 0x17, 0x18, 0x19,
848: },
849: .key_len = 25,
850: .data = {
851: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
852: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
853: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
854: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
855: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
856: },
857: .data_len = 50,
858: },
859: .out = "3e8a69b7783c25851933ab6290af6ca77a9981480850009cc5577c6e1f573b4e6801dd23c4a7d679ccf8a386c674cffb",
860: },
861: {
862: .in = & (struct hmac_data_in) {
863: .key = {
864: 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
865: 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
866: },
867: .key_len = 20,
868: .data = "Test With Truncation",
869: .data_len = 20,
870: },
871: .out = "3abf34c3503b2a23a46efc619baef897f4c8e42c934ce55ccbae9740fcbc1af4ca62269e2a37cd88ba926341efe4aeea",
872: },
873: {
874: .in = & (struct hmac_data_in) {
875: .key = {
876: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
877: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
878: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
879: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
880: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
881: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
882: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
883: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
884: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
885: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
886: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
887: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
888: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
889: 0xaa,
890: },
891: .key_len = 131,
892: .data = "Test Using Larger Than Block-Size Key - Hash Key First",
893: .data_len = 54,
894: },
895: .out = "4ece084485813e9088d2c63a041bc5b44f9ef1012a2b588f3cd11f05033ac4c60c2ef6ab4030fe8296248df163f44952",
896: },
897: {
898: .in = & (struct hmac_data_in) {
899: .key = {
900: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
901: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
902: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
903: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
904: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
905: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
906: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
907: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
908: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
909: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
910: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
911: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
912: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
913: 0xaa,
914: },
915: .key_len = 131,
916: .data = "This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.",
917: .data_len = 152,
918: },
919: .out = "6617178e941f020d351e2f254e8fd32c602420feb0b8fb9adccebb82461e99c5a678cc31e799176d3860e6110c46523e",
920: },
921: };
922:
923: return bt_assert_batch(test_vectors, test_sha384_hmac, hmac_in_fmt, bt_fmt_str);
924: }
925:
926: static int
927: t_sha512_hmac(void)
928: {
929: struct bt_pair test_vectors[] = {
930: {
931: .in = & (struct hmac_data_in) {
932: .key = {
933: 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
934: 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
935: },
936: .key_len = 20,
937: .data = "Hi There",
938: .data_len = 8,
939: },
940: .out = "87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854",
941: },
942: {
943: .in = & (struct hmac_data_in) {
944: .key = "Jefe",
945: .key_len = 4,
946: .data = "what do ya want for nothing?",
947: .data_len = 28,
948: },
949: .out = "164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737",
950: },
951: {
952: .in = & (struct hmac_data_in) {
953: .key = {
954: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
955: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
956: },
957: .key_len = 20,
958: .data = {
959: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
960: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
961: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
962: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
963: 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
964: },
965: .data_len = 50,
966: },
967: .out = "fa73b0089d56a284efb0f0756c890be9b1b5dbdd8ee81a3655f83e33b2279d39bf3e848279a722c806b485a47e67c807b946a337bee8942674278859e13292fb",
968: },
969: {
970: .in = & (struct hmac_data_in) {
971: .key = {
972: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
973: 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
974: 0x15, 0x16, 0x17, 0x18, 0x19,
975: },
976: .key_len = 25,
977: .data = {
978: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
979: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
980: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
981: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
982: 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
983: },
984: .data_len = 50,
985: },
986: .out = "b0ba465637458c6990e5a8c5f61d4af7e576d97ff94b872de76f8050361ee3dba91ca5c11aa25eb4d679275cc5788063a5f19741120c4f2de2adebeb10a298dd",
987: },
988: {
989: .in = & (struct hmac_data_in) {
990: .key = {
991: 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
992: 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
993: },
994: .key_len = 20,
995: .data = "Test With Truncation",
996: .data_len = 20,
997: },
998: .out = "415fad6271580a531d4179bc891d87a650188707922a4fbb36663a1eb16da008711c5b50ddd0fc235084eb9d3364a1454fb2ef67cd1d29fe6773068ea266e96b",
999: },
1000: {
1001: .in = & (struct hmac_data_in) {
1002: .key = {
1003: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1004: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1005: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1006: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1007: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1008: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1009: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1010: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1011: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1012: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1013: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1014: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1015: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1016: 0xaa,
1017: },
1018: .key_len = 131,
1019: .data = "Test Using Larger Than Block-Size Key - Hash Key First",
1020: .data_len = 54,
1021: },
1022: .out = "80b24263c7c1a3ebb71493c1dd7be8b49b46d1f41b4aeec1121b013783f8f3526b56d037e05f2598bd0fd2215d6a1e5295e64f73f63f0aec8b915a985d786598",
1023: },
1024: {
1025: .in = & (struct hmac_data_in) {
1026: .key = {
1027: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1028: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1029: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1030: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1031: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1032: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1033: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1034: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1035: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1036: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1037: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1038: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1039: 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1040: 0xaa,
1041: },
1042: .key_len = 131,
1043: .data = "This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.",
1044: .data_len = 152,
1045: },
1046: .out = "e37b6a775dc87dbaa4dfa9f96e5e3ffddebd71f8867289865df5a32d20cdc944b6022cac3c4982b10d5eeb55c3e4de15134676fb6de0446065c97440fa8c6a58",
1047: },
1048: };
1049:
1050: return bt_assert_batch(test_vectors, test_sha512_hmac, hmac_in_fmt, bt_fmt_str);
1051: }
1052:
1053:
1054: /*
1055: * Testing SHAxxx concating independence
1056: */
1057:
1058: #include "lib/sha256.h"
1059: #include "lib/sha512.h"
1060:
1061: static int
1062: t_sha256_concating(void)
1063: {
1064: char hash_a[SHA256_HEX_SIZE];
1065: char hash_b[SHA256_HEX_SIZE];
1066:
1067: char *str_a = "a" "bb" "ccc" "dddd" "eeeee" "ffffff";
1068: char *str_b1 = "a" ;
1069: char *str_b2 = "bb" ;
1070: char *str_b3 = "ccc" ;
1071: char *str_b4 = "dddd" ;
1072: char *str_b5 = "eeeee" ;
1073: char *str_b6 = "ffffff";
1074:
1075: struct hash_context ctx_a;
1076: sha256_init(&ctx_a);
1077: sha256_update(&ctx_a, str_a, strlen(str_a));
1078: byte *hash_a_ = sha256_final(&ctx_a);
1079: bt_bytes_to_hex(hash_a, hash_a_, SHA256_SIZE);
1080:
1081: struct hash_context ctx_b;
1082: sha256_init(&ctx_b);
1083: sha256_update(&ctx_b, str_b1, strlen(str_b1));
1084: sha256_update(&ctx_b, str_b2, strlen(str_b2));
1085: sha256_update(&ctx_b, str_b3, strlen(str_b3));
1086: sha256_update(&ctx_b, str_b4, strlen(str_b4));
1087: sha256_update(&ctx_b, str_b5, strlen(str_b5));
1088: sha256_update(&ctx_b, str_b6, strlen(str_b6));
1089: byte *hash_b_ = sha256_final(&ctx_b);
1090: bt_bytes_to_hex(hash_b, hash_b_, SHA256_SIZE);
1091:
1092: int are_hash_a_b_equal = (strncmp(hash_a, hash_b, sizeof(hash_a)) == 0);
1093: bt_assert_msg(are_hash_a_b_equal, "Hashes A: %s, B: %s should be same", hash_a, hash_b);
1094:
1095: return 1;
1096: }
1097:
1098:
1099: static int
1100: t_sha512_concating(void)
1101: {
1102: char hash_a[SHA512_HEX_SIZE];
1103: char hash_b[SHA512_HEX_SIZE];
1104:
1105: char *str_a = "a" "bb" "ccc" "dddd" "eeeee" "ffffff";
1106: char *str_b1 = "a" ;
1107: char *str_b2 = "bb" ;
1108: char *str_b3 = "ccc" ;
1109: char *str_b4 = "dddd" ;
1110: char *str_b5 = "eeeee" ;
1111: char *str_b6 = "ffffff";
1112:
1113: struct hash_context ctx_a;
1114: sha512_init(&ctx_a);
1115: sha512_update(&ctx_a, str_a, strlen(str_a));
1116: byte *hash_a_ = sha512_final(&ctx_a);
1117: bt_bytes_to_hex(hash_a, hash_a_, SHA512_SIZE);
1118:
1119: struct hash_context ctx_b;
1120: sha512_init(&ctx_b);
1121: sha512_update(&ctx_b, str_b1, strlen(str_b1));
1122: sha512_update(&ctx_b, str_b2, strlen(str_b2));
1123: sha512_update(&ctx_b, str_b3, strlen(str_b3));
1124: sha512_update(&ctx_b, str_b4, strlen(str_b4));
1125: sha512_update(&ctx_b, str_b5, strlen(str_b5));
1126: sha512_update(&ctx_b, str_b6, strlen(str_b6));
1127: byte *hash_b_ = sha512_final(&ctx_b);
1128: bt_bytes_to_hex(hash_b, hash_b_, SHA512_SIZE);
1129:
1130: int are_hash_a_b_equal = (strncmp(hash_a, hash_b, sizeof(hash_a)) == 0);
1131: bt_assert_msg(are_hash_a_b_equal, "Hashes A: %s, B: %s should be same", hash_a, hash_b);
1132:
1133: return 1;
1134: }
1135:
1136: int
1137: main(int argc, char *argv[])
1138: {
1139: bt_init(argc, argv);
1140:
1141: bt_test_suite(t_md5, "Testing MD5 by RFC 1321");
1142: bt_test_suite(t_sha1, "Testing SHA-1");
1143: bt_test_suite(t_sha224, "Testing SHA-224");
1144: bt_test_suite(t_sha256, "Testing SHA-256");
1145: bt_test_suite(t_sha384, "Testing SHA-384");
1146: bt_test_suite(t_sha512, "Testing SHA-512");
1147:
1148: bt_test_suite(t_md5_hmac, "Testing HMAC-MD5 by RFC 2202");
1149: bt_test_suite(t_sha1_hmac, "Testing HMAC-SHA-1 by RFC 2202");
1150: bt_test_suite(t_sha224_hmac, "Testing HMAC-SHA-224 by RFC 4231");
1151: bt_test_suite(t_sha256_hmac, "Testing HMAC-SHA-256 by RFC 4231");
1152: bt_test_suite(t_sha384_hmac, "Testing HMAC-SHA-384 by RFC 4231");
1153: bt_test_suite(t_sha512_hmac, "Testing HMAC-SHA-512 by RFC 4231");
1154:
1155: bt_test_suite(t_sha256_concating, "Testing concatenation input string to hash using sha256_update");
1156: bt_test_suite(t_sha512_concating, "Testing concatenation input string to hash using sha512_update");
1157:
1158: return bt_exit_value();
1159: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>