8 /* HMAC-MD5 test vectors as per RFC 2202 */
11 guint8 key_md5_test1[] = {
12 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
13 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b };
14 guint8 result_md5_test1[] = {
15 0x92, 0x94, 0x72, 0x7a, 0x36, 0x38, 0xbb, 0x1c, 0x13, 0xf4,
16 0x8e, 0xf8, 0x15, 0x8b, 0xfc, 0x9d };
19 guint8 result_md5_test2[] = {
20 0x75, 0x0c, 0x78, 0x3e, 0x6a, 0xb0, 0xb5, 0x03, 0xea, 0xa8,
21 0x6e, 0x31, 0x0a, 0x5d, 0xb7, 0x38 };
24 guint8 key_md5_test3[] = {
25 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
26 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa };
27 guint8 data_md5_test3[] = {
28 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
29 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
30 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
31 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
32 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd };
33 guint8 result_md5_test3[] = {
34 0x56, 0xbe, 0x34, 0x52, 0x1d, 0x14, 0x4c, 0x88, 0xdb, 0xb8,
35 0xc7, 0x33, 0xf0, 0xe8, 0xb3, 0xf6 };
38 guint8 key_md5_test4[] = {
39 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
40 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
41 0x15, 0x16, 0x17, 0x18, 0x19 };
42 guint8 data_md5_test4[] = {
43 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
44 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
45 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
46 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
47 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd };
48 guint8 result_md5_test4[] = {
49 0x69, 0x7e, 0xaf, 0x0a, 0xca, 0x3a, 0x3a, 0xea, 0x3a, 0x75,
50 0x16, 0x47, 0x46, 0xff, 0xaa, 0x79 };
53 guint8 key_md5_test5[] = {
54 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
55 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c};
56 guint8 result_md5_test5[] = {
57 0x56, 0x46, 0x1e, 0xf2, 0x34, 0x2e, 0xdc, 0x00, 0xf9, 0xba,
58 0xb9, 0x95, 0x69, 0x0e, 0xfd, 0x4c };
61 guint8 key_md5_test6[] = {
62 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
63 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
64 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
65 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
66 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
67 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
68 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
69 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa };
70 guint8 result_md5_test6[] = {
71 0x6b, 0x1a, 0xb7, 0xfe, 0x4b, 0xd7, 0xbf, 0x8f, 0x0b, 0x62,
72 0xe6, 0xce, 0x61, 0xb9, 0xd0, 0xcd };
75 guint8 key_md5_test7[] = {
76 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
77 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
78 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
79 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
80 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
81 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
82 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
83 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa };
84 guint8 result_md5_test7[] = {
85 0x6f, 0x63, 0x0f, 0xad, 0x67, 0xcd, 0xa0, 0xee, 0x1f, 0xb1,
86 0xf5, 0x62, 0xdb, 0x3a, 0xa5, 0x3e };
88 /* HMAC-SHA1 test vectors as per RFC 2202 */
91 guint8 key_sha1_test1[] = {
92 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
93 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b };
94 guint8 result_sha1_test1[] = {
95 0xb6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64, 0xe2, 0x8b,
96 0xc0, 0xb6, 0xfb, 0x37, 0x8c, 0x8e, 0xf1, 0x46, 0xbe, 0x00 };
99 guint8 result_sha1_test2[] = {
100 0xef, 0xfc, 0xdf, 0x6a, 0xe5, 0xeb, 0x2f, 0xa2, 0xd2, 0x74,
101 0x16, 0xd5, 0xf1, 0x84, 0xdf, 0x9c, 0x25, 0x9a, 0x7c, 0x79 };
104 guint8 key_sha1_test3[] = {
105 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
106 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa };
107 guint8 data_sha1_test3[] = {
108 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
109 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
110 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
111 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
112 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd };
113 guint8 result_sha1_test3[] = {
114 0x12, 0x5d, 0x73, 0x42, 0xb9, 0xac, 0x11, 0xcd, 0x91, 0xa3,
115 0x9a, 0xf4, 0x8a, 0xa1, 0x7b, 0x4f, 0x63, 0xf1, 0x75, 0xd3 };
118 guint8 key_sha1_test4[] = {
119 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
120 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
121 0x15, 0x16, 0x17, 0x18, 0x19 };
122 guint8 data_sha1_test4[] = {
123 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
124 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
125 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
126 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
127 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd };
128 guint8 result_sha1_test4[] = {
129 0x4c, 0x90, 0x07, 0xf4, 0x02, 0x62, 0x50, 0xc6, 0xbc, 0x84,
130 0x14, 0xf9, 0xbf, 0x50, 0xc8, 0x6c, 0x2d, 0x72, 0x35, 0xda };
133 guint8 key_sha1_test5[] = {
134 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
135 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c };
136 guint8 result_sha1_test5[] = {
137 0x4c, 0x1a, 0x03, 0x42, 0x4b, 0x55, 0xe0, 0x7f, 0xe7, 0xf2,
138 0x7b, 0xe1, 0xd5, 0x8b, 0xb9, 0x32, 0x4a, 0x9a, 0x5a, 0x04 };
141 guint8 key_sha1_test6_7[] = {
142 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
143 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
144 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
145 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
146 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
147 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
148 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
149 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa };
151 guint8 result_sha1_test6[] = {
152 0xaa, 0x4a, 0xe5, 0xe1, 0x52, 0x72, 0xd0, 0x0e, 0x95, 0x70,
153 0x56, 0x37, 0xce, 0x8a, 0x3b, 0x55, 0xed, 0x40, 0x21, 0x12 };
155 guint8 result_sha1_test7[] = {
156 0xe8, 0xe9, 0x9d, 0xf, 0x45, 0x23, 0x7d, 0x78, 0x6d, 0x6b,
157 0xba, 0xa7, 0x96, 0x5c, 0x78, 0x8, 0xbb, 0xff, 0x1a, 0x91 };
161 GChecksumType digest_type;
169 HmacCase hmac_md5_tests[] = {
170 { G_CHECKSUM_MD5, key_md5_test1, 16, "Hi There", 8, result_md5_test1 },
171 { G_CHECKSUM_MD5, "Jefe", 4, "what do ya want for nothing?", 28,
173 { G_CHECKSUM_MD5, key_md5_test3, 16, data_md5_test3, 50,
175 { G_CHECKSUM_MD5, key_md5_test4, 25, data_md5_test4, 50,
177 { G_CHECKSUM_MD5, key_md5_test5, 16, "Test With Truncation", 20,
179 { G_CHECKSUM_MD5, key_md5_test6, 80,
180 "Test Using Larger Than Block-Size Key - Hash Key First", 54,
182 { G_CHECKSUM_MD5, key_md5_test7, 80,
183 "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data",
184 73, result_md5_test7 },
185 { -1, NULL, 0, NULL, 0, NULL },
188 HmacCase hmac_sha1_tests[] = {
189 { G_CHECKSUM_SHA1, key_sha1_test1, 20, "Hi There", 8, result_sha1_test1 },
190 { G_CHECKSUM_SHA1, "Jefe", 4, "what do ya want for nothing?", 28,
192 { G_CHECKSUM_SHA1, key_sha1_test3, 20, data_sha1_test3, 50,
194 { G_CHECKSUM_SHA1, key_sha1_test4, 25, data_sha1_test4, 50,
196 { G_CHECKSUM_SHA1, key_sha1_test5, 20, "Test With Truncation", 20,
198 { G_CHECKSUM_SHA1, key_sha1_test6_7, 80,
199 "Test Using Larger Than Block-Size Key - Hash Key First", 54,
201 { G_CHECKSUM_SHA1, key_sha1_test6_7, 80,
202 "Test Using Larger Than Block-Size Key and Larger" \
203 " Than One Block-Size Data", 73, result_sha1_test7, },
204 { -1, NULL, 0, NULL, 0, NULL },
208 test_hmac (HmacCase *t)
211 gsize digest_len, hmac_len;
214 hmac_len = digest_len = g_checksum_type_get_length (t->digest_type);
215 digest = g_malloc (hmac_len);
217 hmac = g_hmac_new (t->digest_type, t->key, t->key_len);
218 g_hmac_update (hmac, t->data, t->data_len);
219 g_hmac_get_digest (hmac, digest, &digest_len);
221 g_assert_cmpuint (digest_len, ==, hmac_len);
222 g_assert (memcmp (digest, t->result, digest_len) == 0);
229 test_hmac_ref_unref (void)
233 hmac = g_hmac_new (G_CHECKSUM_SHA1, (guchar*)"aaa", 3);
234 check = g_hmac_ref (hmac);
235 g_assert (check == hmac);
236 g_hmac_unref (check);
241 test_hmac_copy (void)
245 hmac = g_hmac_new (G_CHECKSUM_SHA256, (guchar*)"aaa", 3);
246 check = g_hmac_copy (hmac);
247 g_assert (check != hmac);
248 g_assert_cmpstr (g_hmac_get_string (hmac), ==, g_hmac_get_string (check));
249 g_hmac_unref (check);
254 test_hmac_for_data (void)
259 string = g_compute_hmac_for_data (G_CHECKSUM_SHA1,
261 (guchar*)"bcdef", 5);
263 hmac = g_hmac_new (G_CHECKSUM_SHA1, (guchar*)"aaa", 3);
264 g_hmac_update (hmac, (guchar*)"bcdef", 5);
265 g_assert_cmpstr (string, ==, g_hmac_get_string (hmac));
271 test_hmac_for_string (void)
276 string = g_compute_hmac_for_string (G_CHECKSUM_SHA1,
280 hmac = g_hmac_new (G_CHECKSUM_SHA1, (guchar*)"aaa", 3);
281 g_hmac_update (hmac, (guchar*)"bcdef", 5);
282 g_assert_cmpstr (string, ==, g_hmac_get_string (hmac));
292 g_test_init (&argc, &argv, NULL);
294 for (i = 0 ; hmac_sha1_tests[i].key_len > 0 ; i++)
296 gchar *name = g_strdup_printf ("/hmac/sha1-%d", i + 1);
297 g_test_add_data_func (name, hmac_sha1_tests + i,
298 (void (*)(const void *)) test_hmac);
302 for (i = 0 ; hmac_md5_tests[i].key_len > 0 ; i++)
304 gchar *name = g_strdup_printf ("/hmac/md5-%d", i + 1);
305 g_test_add_data_func (name, hmac_md5_tests + i,
306 (void (*)(const void *)) test_hmac);
310 g_test_add_func ("/hmac/ref-unref", test_hmac_ref_unref);
311 g_test_add_func ("/hmac/copy", test_hmac_copy);
312 g_test_add_func ("/hmac/for-data", test_hmac_for_data);
313 g_test_add_func ("/hmac/for-string", test_hmac_for_string);
315 return g_test_run ();