hmac: Implementation of HMAC in glib
[platform/upstream/glib.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 int
243 main (int argc,
244     char **argv)
245 {
246   int i;
247   g_test_init (&argc, &argv, NULL);
248
249   for (i = 0 ; hmac_sha1_tests[i].key_len > 0 ; i++)
250     {
251       gchar *name = g_strdup_printf ("/hmac/sha1-%d", i + 1);
252       g_test_add_data_func (name, hmac_sha1_tests + i,
253         (void (*)(const void *)) test_hmac);
254       g_free (name);
255     }
256
257   for (i = 0 ; hmac_md5_tests[i].key_len > 0 ; i++)
258     {
259       gchar *name = g_strdup_printf ("/hmac/md5-%d", i + 1);
260       g_test_add_data_func (name, hmac_md5_tests + i,
261         (void (*)(const void *)) test_hmac);
262       g_free (name);
263     }
264
265   g_test_add_func ("/hmac/ref-unref", test_hmac_ref_unref);
266
267   return g_test_run ();
268 }