glib/tests: Clean up inclusion of unistd.h
[platform/upstream/glib.git] / glib / tests / hmac.c
1 #include <glib.h>
2 #include <string.h>
3 #ifdef G_OS_UNIX
4 #include <unistd.h>
5 #endif
6 #include <stdlib.h>
7
8 /* HMAC-MD5 test vectors as per RFC 2202 */
9
10 /* Test 1 */
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 };
17
18 /* Test 2 */
19 guint8 result_md5_test2[] = {
20     0x75, 0x0c, 0x78, 0x3e, 0x6a, 0xb0, 0xb5, 0x03, 0xea, 0xa8,
21     0x6e, 0x31, 0x0a, 0x5d, 0xb7, 0x38 };
22
23 /* Test 3 */
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 };
36
37 /* Test 4 */
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 };
51
52 /* Test 5 */
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 };
59
60 /* Test 6 */
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 };
73
74 /* Test 6 */
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 };
87
88 /* HMAC-SHA1 test vectors as per RFC 2202 */
89
90 /* Test 1 */
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 };
97
98 /* Test 2 */
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 };
102
103 /* Test 3 */
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 };
116
117 /* Test 4 */
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 };
131
132 /* Test 5 */
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 };
139
140 /* Test 6 & 7*/
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 };
150
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 };
154
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 };
158
159
160 typedef struct {
161   GChecksumType digest_type;
162   gpointer key;
163   gsize key_len;
164   gpointer data;
165   gsize data_len;
166   gpointer result;
167 } HmacCase;
168
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,
172       result_md5_test2 },
173   { G_CHECKSUM_MD5, key_md5_test3, 16, data_md5_test3, 50,
174       result_md5_test3 },
175   { G_CHECKSUM_MD5, key_md5_test4, 25, data_md5_test4, 50,
176       result_md5_test4 },
177   { G_CHECKSUM_MD5, key_md5_test5, 16, "Test With Truncation", 20,
178       result_md5_test5 },
179   { G_CHECKSUM_MD5, key_md5_test6, 80,
180       "Test Using Larger Than Block-Size Key - Hash Key First", 54,
181       result_md5_test6 },
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 },
186 };
187
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,
191       result_sha1_test2 },
192   { G_CHECKSUM_SHA1, key_sha1_test3, 20, data_sha1_test3, 50,
193       result_sha1_test3 },
194   { G_CHECKSUM_SHA1, key_sha1_test4, 25, data_sha1_test4, 50,
195       result_sha1_test4 },
196   { G_CHECKSUM_SHA1, key_sha1_test5, 20, "Test With Truncation", 20,
197     result_sha1_test5 },
198   { G_CHECKSUM_SHA1, key_sha1_test6_7, 80,
199       "Test Using Larger Than Block-Size Key - Hash Key First", 54,
200       result_sha1_test6 },
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 },
205 };
206
207 static void
208 test_hmac (HmacCase *t)
209 {
210   GHmac *hmac;
211   gsize digest_len, hmac_len;
212   gpointer digest;
213
214   hmac_len = digest_len = g_checksum_type_get_length (t->digest_type);
215   digest = g_malloc (hmac_len);
216
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);
220
221   g_assert_cmpuint (digest_len, ==, hmac_len);
222   g_assert (memcmp (digest, t->result, digest_len) == 0);
223
224   g_free (digest);
225   g_hmac_unref (hmac);
226 }
227
228 static void
229 test_hmac_ref_unref (void)
230 {
231   GHmac *hmac, *check;
232
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);
237   g_hmac_unref (hmac);
238 }
239
240 static void
241 test_hmac_copy (void)
242 {
243   GHmac *hmac, *check;
244
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);
250   g_hmac_unref (hmac);
251 }
252
253 static void
254 test_hmac_for_data (void)
255 {
256   gchar *string;
257   GHmac *hmac;
258
259   string = g_compute_hmac_for_data (G_CHECKSUM_SHA1,
260                                     (guchar*)"aaa", 3,
261                                     (guchar*)"bcdef", 5);
262
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));
266   g_hmac_unref (hmac);
267   g_free (string);
268 }
269
270 static void
271 test_hmac_for_string (void)
272 {
273   gchar *string;
274   GHmac *hmac;
275
276   string = g_compute_hmac_for_string (G_CHECKSUM_SHA1,
277                                       (guchar*)"aaa", 3,
278                                       "bcdef", -1);
279
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));
283   g_hmac_unref (hmac);
284   g_free (string);
285 }
286
287 int
288 main (int argc,
289     char **argv)
290 {
291   int i;
292   g_test_init (&argc, &argv, NULL);
293
294   for (i = 0 ; hmac_sha1_tests[i].key_len > 0 ; i++)
295     {
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);
299       g_free (name);
300     }
301
302   for (i = 0 ; hmac_md5_tests[i].key_len > 0 ; i++)
303     {
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);
307       g_free (name);
308     }
309
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);
314
315   return g_test_run ();
316 }