f6ee643b1b16f400b5cd98de9b04e74787143f49
[platform/upstream/glib.git] / glib / tests / hmac.c
1 #include <glib.h>
2 #include <string.h>
3 #include <stdlib.h>
4
5 /* HMAC-MD5 test vectors as per RFC 2202 */
6
7 /* Test 1 */
8 guint8 key_md5_test1[] = {
9     0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
10     0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b };
11 guint8 result_md5_test1[] = {
12     0x92, 0x94, 0x72, 0x7a, 0x36, 0x38, 0xbb, 0x1c, 0x13, 0xf4,
13     0x8e, 0xf8, 0x15, 0x8b, 0xfc, 0x9d };
14
15 /* Test 2 */
16 guint8 result_md5_test2[] = {
17     0x75, 0x0c, 0x78, 0x3e, 0x6a, 0xb0, 0xb5, 0x03, 0xea, 0xa8,
18     0x6e, 0x31, 0x0a, 0x5d, 0xb7, 0x38 };
19
20 /* Test 3 */
21 guint8 key_md5_test3[] = {
22     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
23     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa };
24 guint8 data_md5_test3[] = {
25     0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
26     0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
27     0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
28     0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
29     0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd };
30 guint8 result_md5_test3[] = {
31     0x56, 0xbe, 0x34, 0x52, 0x1d, 0x14, 0x4c, 0x88, 0xdb, 0xb8,
32     0xc7, 0x33, 0xf0, 0xe8, 0xb3, 0xf6 };
33
34 /* Test 4 */
35 guint8 key_md5_test4[] = {
36     0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
37     0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
38     0x15, 0x16, 0x17, 0x18, 0x19 };
39 guint8 data_md5_test4[] = {
40     0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
41     0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
42     0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
43     0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
44     0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd };
45 guint8 result_md5_test4[] = {
46     0x69, 0x7e, 0xaf, 0x0a, 0xca, 0x3a, 0x3a, 0xea, 0x3a, 0x75,
47     0x16, 0x47, 0x46, 0xff, 0xaa, 0x79 };
48
49 /* Test 5 */
50 guint8 key_md5_test5[] = {
51     0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
52     0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c};
53 guint8 result_md5_test5[] = {
54     0x56, 0x46, 0x1e, 0xf2, 0x34, 0x2e, 0xdc, 0x00, 0xf9, 0xba,
55     0xb9, 0x95, 0x69, 0x0e, 0xfd, 0x4c };
56
57 /* Test 6 */
58 guint8 key_md5_test6[] = {
59     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
60     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
61     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
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 guint8 result_md5_test6[] = {
68     0x6b, 0x1a, 0xb7, 0xfe, 0x4b, 0xd7, 0xbf, 0x8f, 0x0b, 0x62,
69     0xe6, 0xce, 0x61, 0xb9, 0xd0, 0xcd };
70
71 /* Test 6 */
72 guint8 key_md5_test7[] = {
73     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
74     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
75     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
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 guint8 result_md5_test7[] = {
82     0x6f, 0x63, 0x0f, 0xad, 0x67, 0xcd, 0xa0, 0xee, 0x1f, 0xb1,
83     0xf5, 0x62, 0xdb, 0x3a, 0xa5, 0x3e };
84
85 /* HMAC-SHA1 test vectors as per RFC 2202 */
86
87 /* Test 1 */
88 guint8 key_sha1_test1[] = {
89     0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
90     0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b };
91 guint8 result_sha1_test1[] = {
92     0xb6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64, 0xe2, 0x8b,
93     0xc0, 0xb6, 0xfb, 0x37, 0x8c, 0x8e, 0xf1, 0x46, 0xbe, 0x00 };
94
95 /* Test 2 */
96 guint8 result_sha1_test2[] = {
97     0xef, 0xfc, 0xdf, 0x6a, 0xe5, 0xeb, 0x2f, 0xa2, 0xd2, 0x74,
98     0x16, 0xd5, 0xf1, 0x84, 0xdf, 0x9c, 0x25, 0x9a, 0x7c, 0x79 };
99
100 /* Test 3 */
101 guint8 key_sha1_test3[] = {
102     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
103     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa };
104 guint8 data_sha1_test3[] = {
105     0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
106     0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
107     0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
108     0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
109     0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd };
110 guint8 result_sha1_test3[] = {
111     0x12, 0x5d, 0x73, 0x42, 0xb9, 0xac, 0x11, 0xcd, 0x91, 0xa3,
112     0x9a, 0xf4, 0x8a, 0xa1, 0x7b, 0x4f, 0x63, 0xf1, 0x75, 0xd3 };
113
114 /* Test 4 */
115 guint8 key_sha1_test4[] = {
116     0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
117     0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
118     0x15, 0x16, 0x17, 0x18, 0x19 };
119 guint8 data_sha1_test4[] = {
120     0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
121     0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
122     0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
123     0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
124     0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd };
125 guint8 result_sha1_test4[] = {
126     0x4c, 0x90, 0x07, 0xf4, 0x02, 0x62, 0x50, 0xc6, 0xbc, 0x84,
127     0x14, 0xf9, 0xbf, 0x50, 0xc8, 0x6c, 0x2d, 0x72, 0x35, 0xda };
128
129 /* Test 5 */
130 guint8 key_sha1_test5[] = {
131     0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
132     0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c };
133 guint8 result_sha1_test5[] = {
134     0x4c, 0x1a, 0x03, 0x42, 0x4b, 0x55, 0xe0, 0x7f, 0xe7, 0xf2,
135     0x7b, 0xe1, 0xd5, 0x8b, 0xb9, 0x32, 0x4a, 0x9a, 0x5a, 0x04 };
136
137 /* Test 6 & 7*/
138 guint8 key_sha1_test6_7[] = {
139     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
140     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
141     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
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
148 guint8 result_sha1_test6[] = {
149     0xaa, 0x4a, 0xe5, 0xe1, 0x52, 0x72, 0xd0, 0x0e, 0x95, 0x70,
150     0x56, 0x37, 0xce, 0x8a, 0x3b, 0x55, 0xed, 0x40, 0x21, 0x12 };
151
152 guint8 result_sha1_test7[] = {
153     0xe8, 0xe9, 0x9d, 0xf, 0x45, 0x23, 0x7d, 0x78, 0x6d, 0x6b,
154     0xba, 0xa7, 0x96, 0x5c, 0x78, 0x8, 0xbb, 0xff, 0x1a, 0x91 };
155
156
157 typedef struct {
158   GChecksumType digest_type;
159   gpointer key;
160   gsize key_len;
161   gpointer data;
162   gsize data_len;
163   gpointer result;
164 } HmacCase;
165
166 HmacCase hmac_md5_tests[] = {
167   { G_CHECKSUM_MD5, key_md5_test1, 16, "Hi There", 8, result_md5_test1 },
168   { G_CHECKSUM_MD5, "Jefe", 4, "what do ya want for nothing?", 28,
169       result_md5_test2 },
170   { G_CHECKSUM_MD5, key_md5_test3, 16, data_md5_test3, 50,
171       result_md5_test3 },
172   { G_CHECKSUM_MD5, key_md5_test4, 25, data_md5_test4, 50,
173       result_md5_test4 },
174   { G_CHECKSUM_MD5, key_md5_test5, 16, "Test With Truncation", 20,
175       result_md5_test5 },
176   { G_CHECKSUM_MD5, key_md5_test6, 80,
177       "Test Using Larger Than Block-Size Key - Hash Key First", 54,
178       result_md5_test6 },
179   { G_CHECKSUM_MD5, key_md5_test7, 80,
180       "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data",
181       73, result_md5_test7 },
182   { -1, NULL, 0, NULL, 0, NULL },
183 };
184
185 HmacCase hmac_sha1_tests[] = {
186   { G_CHECKSUM_SHA1, key_sha1_test1, 20, "Hi There", 8, result_sha1_test1 },
187   { G_CHECKSUM_SHA1, "Jefe", 4, "what do ya want for nothing?", 28,
188       result_sha1_test2 },
189   { G_CHECKSUM_SHA1, key_sha1_test3, 20, data_sha1_test3, 50,
190       result_sha1_test3 },
191   { G_CHECKSUM_SHA1, key_sha1_test4, 25, data_sha1_test4, 50,
192       result_sha1_test4 },
193   { G_CHECKSUM_SHA1, key_sha1_test5, 20, "Test With Truncation", 20,
194     result_sha1_test5 },
195   { G_CHECKSUM_SHA1, key_sha1_test6_7, 80,
196       "Test Using Larger Than Block-Size Key - Hash Key First", 54,
197       result_sha1_test6 },
198   { G_CHECKSUM_SHA1, key_sha1_test6_7, 80,
199       "Test Using Larger Than Block-Size Key and Larger" \
200                " Than One Block-Size Data", 73, result_sha1_test7, },
201   { -1, NULL, 0, NULL, 0, NULL },
202 };
203
204 static void
205 test_hmac (HmacCase *t)
206 {
207   GHmac *hmac;
208   gsize digest_len, hmac_len;
209   gpointer digest;
210
211   hmac_len = digest_len = g_checksum_type_get_length (t->digest_type);
212   digest = g_malloc (hmac_len);
213
214   hmac = g_hmac_new (t->digest_type, t->key, t->key_len);
215   g_hmac_update (hmac, t->data, t->data_len);
216   g_hmac_get_digest (hmac, digest, &digest_len);
217
218   g_assert_cmpuint (digest_len, ==, hmac_len);
219   g_assert (memcmp (digest, t->result, digest_len) == 0);
220
221   g_free (digest);
222   g_hmac_unref (hmac);
223 }
224
225 static void
226 test_hmac_ref_unref (void)
227 {
228   GHmac *hmac, *check;
229
230   hmac = g_hmac_new (G_CHECKSUM_SHA1, (guchar*)"aaa", 3);
231   check = g_hmac_ref (hmac);
232   g_assert (check == hmac);
233   g_hmac_unref (check);
234   g_hmac_unref (hmac);
235 }
236
237 static void
238 test_hmac_copy (void)
239 {
240   GHmac *hmac, *check;
241
242   hmac = g_hmac_new (G_CHECKSUM_SHA256, (guchar*)"aaa", 3);
243   check = g_hmac_copy (hmac);
244   g_assert (check != hmac);
245   g_assert_cmpstr (g_hmac_get_string (hmac), ==, g_hmac_get_string (check));
246   g_hmac_unref (check);
247   g_hmac_unref (hmac);
248 }
249
250 static void
251 test_hmac_for_data (void)
252 {
253   gchar *string;
254   GHmac *hmac;
255
256   string = g_compute_hmac_for_data (G_CHECKSUM_SHA1,
257                                     (guchar*)"aaa", 3,
258                                     (guchar*)"bcdef", 5);
259
260   hmac = g_hmac_new (G_CHECKSUM_SHA1, (guchar*)"aaa", 3);
261   g_hmac_update (hmac, (guchar*)"bcdef", 5);
262   g_assert_cmpstr (string, ==, g_hmac_get_string (hmac));
263   g_hmac_unref (hmac);
264   g_free (string);
265 }
266
267 static void
268 test_hmac_for_string (void)
269 {
270   gchar *string;
271   GHmac *hmac;
272
273   string = g_compute_hmac_for_string (G_CHECKSUM_SHA1,
274                                       (guchar*)"aaa", 3,
275                                       "bcdef", -1);
276
277   hmac = g_hmac_new (G_CHECKSUM_SHA1, (guchar*)"aaa", 3);
278   g_hmac_update (hmac, (guchar*)"bcdef", 5);
279   g_assert_cmpstr (string, ==, g_hmac_get_string (hmac));
280   g_hmac_unref (hmac);
281   g_free (string);
282 }
283
284 int
285 main (int argc,
286     char **argv)
287 {
288   int i;
289   g_test_init (&argc, &argv, NULL);
290
291   for (i = 0 ; hmac_sha1_tests[i].key_len > 0 ; i++)
292     {
293       gchar *name = g_strdup_printf ("/hmac/sha1-%d", i + 1);
294       g_test_add_data_func (name, hmac_sha1_tests + i,
295         (void (*)(const void *)) test_hmac);
296       g_free (name);
297     }
298
299   for (i = 0 ; hmac_md5_tests[i].key_len > 0 ; i++)
300     {
301       gchar *name = g_strdup_printf ("/hmac/md5-%d", i + 1);
302       g_test_add_data_func (name, hmac_md5_tests + i,
303         (void (*)(const void *)) test_hmac);
304       g_free (name);
305     }
306
307   g_test_add_func ("/hmac/ref-unref", test_hmac_ref_unref);
308   g_test_add_func ("/hmac/copy", test_hmac_copy);
309   g_test_add_func ("/hmac/for-data", test_hmac_for_data);
310   g_test_add_func ("/hmac/for-string", test_hmac_for_string);
311
312   return g_test_run ();
313 }