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