cb5cc0daeeec8157eb13631c292d5662d3223c85
[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, HMAC-SHA256 and HMAC-SHA512 test vectors
86  * as per RFCs 2202 and 4868.
87  *
88  * See: https://tools.ietf.org/html/rfc4868#section-2.7.1 */
89
90 /* Test 1 */
91 guint8 key_sha_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 guint8 result_sha256_test1[] = {
98     0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8,
99     0xaf, 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00,
100     0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32,
101     0xcf, 0xf7 };
102 guint8 result_sha512_test1[] = {
103     0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0,
104     0xb4, 0x24, 0x1a, 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2,
105     0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0, 0xb3, 0x05, 0x45, 0xe1,
106     0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7, 0x02,
107     0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d,
108     0x91, 0x4e, 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20,
109     0x3a, 0x12, 0x68, 0x54 };
110
111 /* Test 2 */
112 guint8 result_sha1_test2[] = {
113     0xef, 0xfc, 0xdf, 0x6a, 0xe5, 0xeb, 0x2f, 0xa2, 0xd2, 0x74,
114     0x16, 0xd5, 0xf1, 0x84, 0xdf, 0x9c, 0x25, 0x9a, 0x7c, 0x79 };
115 guint8 result_sha256_test2[] = {
116     0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04,
117     0x24, 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08,
118     0x9d, 0x27, 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec,
119     0x38, 0x43 };
120 guint8 result_sha512_test2[] = {
121     0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95,
122     0xfb, 0xe7, 0x3b, 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22,
123     0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27, 0x0c, 0xd7, 0xea, 0x25,
124     0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99, 0x4a,
125     0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea,
126     0xb1, 0xa3, 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a,
127     0x38, 0xbc, 0xe7, 0x37 };
128
129 /* Test 3 */
130 guint8 key_sha_test3[] = {
131     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
132     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa };
133 guint8 data_sha_test3[] = {
134     0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
135     0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
136     0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
137     0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
138     0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd };
139 guint8 result_sha1_test3[] = {
140     0x12, 0x5d, 0x73, 0x42, 0xb9, 0xac, 0x11, 0xcd, 0x91, 0xa3,
141     0x9a, 0xf4, 0x8a, 0xa1, 0x7b, 0x4f, 0x63, 0xf1, 0x75, 0xd3 };
142 guint8 result_sha256_test3[] = {
143     0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d,
144     0xb8, 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b,
145     0x3e, 0xf8, 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5,
146     0x65, 0xfe };
147 guint8 result_sha512_test3[] = {
148     0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0,
149     0xf0, 0x75, 0x6c, 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd,
150     0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8, 0x3e, 0x33, 0xb2, 0x27,
151     0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22, 0xc8,
152     0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46,
153     0xa3, 0x37, 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59,
154     0xe1, 0x32, 0x92, 0xfb };
155
156 /* Test 4 */
157 guint8 key_sha_test4[] = {
158     0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
159     0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
160     0x15, 0x16, 0x17, 0x18, 0x19 };
161 guint8 data_sha_test4[] = {
162     0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
163     0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
164     0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
165     0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
166     0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd };
167 guint8 result_sha1_test4[] = {
168     0x4c, 0x90, 0x07, 0xf4, 0x02, 0x62, 0x50, 0xc6, 0xbc, 0x84,
169     0x14, 0xf9, 0xbf, 0x50, 0xc8, 0x6c, 0x2d, 0x72, 0x35, 0xda };
170 guint8 result_sha256_test4[] = {
171     0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc,
172     0x81, 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3,
173     0xe5, 0x78, 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29,
174     0x66, 0x5b };
175 guint8 result_sha512_test4[] = {
176     0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5,
177     0xa8, 0xc5, 0xf6, 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f,
178     0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f, 0x80, 0x50, 0x36, 0x1e,
179     0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e, 0xb4,
180     0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1,
181     0x97, 0x41, 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb,
182     0x10, 0xa2, 0x98, 0xdd };
183
184 /* Test 5 (note: different for SHA-256/SHA-512) */
185 guint8 key_sha1_test5[] = {
186     0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
187     0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c };
188 guint8 result_sha1_test5[] = {
189     0x4c, 0x1a, 0x03, 0x42, 0x4b, 0x55, 0xe0, 0x7f, 0xe7, 0xf2,
190     0x7b, 0xe1, 0xd5, 0x8b, 0xb9, 0x32, 0x4a, 0x9a, 0x5a, 0x04 };
191
192 /* Test 6 & 7 (note: different for SHA-1 and SHA-256/SHA-512) */
193 guint8 key_sha1_test6_7[] = {
194     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
195     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
196     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
197     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
198     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
199     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
200     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
201     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa };
202
203 guint8 result_sha1_test6[] = {
204     0xaa, 0x4a, 0xe5, 0xe1, 0x52, 0x72, 0xd0, 0x0e, 0x95, 0x70,
205     0x56, 0x37, 0xce, 0x8a, 0x3b, 0x55, 0xed, 0x40, 0x21, 0x12 };
206
207 guint8 result_sha1_test7[] = {
208     0xe8, 0xe9, 0x9d, 0xf, 0x45, 0x23, 0x7d, 0x78, 0x6d, 0x6b,
209     0xba, 0xa7, 0x96, 0x5c, 0x78, 0x8, 0xbb, 0xff, 0x1a, 0x91 };
210
211 /* Test 5 & 6 for SHA-256 and SHA-512. */
212 guint8 key_sha256_test5_6[] = {
213     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
214     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
215     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
216     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
217     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
218     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
219     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
220     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
221     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
222     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
223     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
224     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
225     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
226     0xaa };
227
228 guint8 result_sha256_test5[] = {
229     0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a,
230     0x26, 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21,
231     0x37, 0x28, 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3,
232     0x7f, 0x54 };
233 guint8 result_sha512_test5[] = {
234     0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14,
235     0x93, 0xc1, 0xdd, 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4,
236     0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b, 0x01, 0x37, 0x83, 0xf8,
237     0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25, 0x98,
238     0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6,
239     0x4f, 0x73, 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98,
240     0x5d, 0x78, 0x65, 0x98 };
241
242 guint8 result_sha256_test6[] = {
243     0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63,
244     0x5f, 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64,
245     0x4f, 0x07, 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a,
246     0x35, 0xe2 };
247 guint8 result_sha512_test6[] = {
248     0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf,
249     0xa9, 0xf9, 0x6e, 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8,
250     0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5, 0xa3, 0x2d, 0x20, 0xcd,
251     0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82, 0xb1,
252     0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46,
253     0x76, 0xfb, 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40,
254     0xfa, 0x8c, 0x6a, 0x58 };
255
256
257 typedef struct {
258   GChecksumType digest_type;
259   gconstpointer key;
260   gsize key_len;
261   gconstpointer data;
262   gsize data_len;
263   gconstpointer result;
264 } HmacCase;
265
266 HmacCase hmac_md5_tests[] = {
267   { G_CHECKSUM_MD5, key_md5_test1, 16, "Hi There", 8, result_md5_test1 },
268   { G_CHECKSUM_MD5, "Jefe", 4, "what do ya want for nothing?", 28,
269       result_md5_test2 },
270   { G_CHECKSUM_MD5, key_md5_test3, 16, data_md5_test3, 50,
271       result_md5_test3 },
272   { G_CHECKSUM_MD5, key_md5_test4, 25, data_md5_test4, 50,
273       result_md5_test4 },
274   { G_CHECKSUM_MD5, key_md5_test5, 16, "Test With Truncation", 20,
275       result_md5_test5 },
276   { G_CHECKSUM_MD5, key_md5_test6, 80,
277       "Test Using Larger Than Block-Size Key - Hash Key First", 54,
278       result_md5_test6 },
279   { G_CHECKSUM_MD5, key_md5_test7, 80,
280       "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data",
281       73, result_md5_test7 },
282   { -1, NULL, 0, NULL, 0, NULL },
283 };
284
285 HmacCase hmac_sha1_tests[] = {
286   { G_CHECKSUM_SHA1, key_sha_test1, 20, "Hi There", 8, result_sha1_test1 },
287   { G_CHECKSUM_SHA1, "Jefe", 4, "what do ya want for nothing?", 28,
288       result_sha1_test2 },
289   { G_CHECKSUM_SHA1, key_sha_test3, 20, data_sha_test3, 50,
290       result_sha1_test3 },
291   { G_CHECKSUM_SHA1, key_sha_test4, 25, data_sha_test4, 50,
292       result_sha1_test4 },
293   { G_CHECKSUM_SHA1, key_sha1_test5, 20, "Test With Truncation", 20,
294     result_sha1_test5 },
295   { G_CHECKSUM_SHA1, key_sha1_test6_7, 80,
296       "Test Using Larger Than Block-Size Key - Hash Key First", 54,
297       result_sha1_test6 },
298   { G_CHECKSUM_SHA1, key_sha1_test6_7, 80,
299       "Test Using Larger Than Block-Size Key and Larger" \
300                " Than One Block-Size Data", 73, result_sha1_test7, },
301   { -1, NULL, 0, NULL, 0, NULL },
302 };
303
304 HmacCase hmac_sha256_tests[] = {
305   { G_CHECKSUM_SHA256, key_sha_test1, 20, "Hi There", 8, result_sha256_test1 },
306   { G_CHECKSUM_SHA256, "Jefe", 4, "what do ya want for nothing?", 28,
307       result_sha256_test2 },
308   { G_CHECKSUM_SHA256, key_sha_test3, 20, data_sha_test3, 50,
309       result_sha256_test3 },
310   { G_CHECKSUM_SHA256, key_sha_test4, 25, data_sha_test4, 50,
311       result_sha256_test4 },
312   { G_CHECKSUM_SHA256, key_sha256_test5_6, 131,
313       "Test Using Larger Than Block-Size Key - Hash Key First", 54,
314       result_sha256_test5 },
315   { G_CHECKSUM_SHA256, key_sha256_test5_6, 131,
316       "This is a test using a larger than block-size key and a larger than "
317       "block-size data. The key needs to be hashed before being used by the "
318       "HMAC algorithm.", 152, result_sha256_test6, },
319   { -1, NULL, 0, NULL, 0, NULL },
320 };
321
322 HmacCase hmac_sha512_tests[] = {
323   { G_CHECKSUM_SHA512, key_sha_test1, 20, "Hi There", 8, result_sha512_test1 },
324   { G_CHECKSUM_SHA512, "Jefe", 4, "what do ya want for nothing?", 28,
325       result_sha512_test2 },
326   { G_CHECKSUM_SHA512, key_sha_test3, 20, data_sha_test3, 50,
327       result_sha512_test3 },
328   { G_CHECKSUM_SHA512, key_sha_test4, 25, data_sha_test4, 50,
329       result_sha512_test4 },
330   { G_CHECKSUM_SHA512, key_sha256_test5_6, 131,
331       "Test Using Larger Than Block-Size Key - Hash Key First", 54,
332       result_sha512_test5 },
333   { G_CHECKSUM_SHA512, key_sha256_test5_6, 131,
334       "This is a test using a larger than block-size key and a larger than "
335       "block-size data. The key needs to be hashed before being used by the "
336       "HMAC algorithm.", 152, result_sha512_test6, },
337   { -1, NULL, 0, NULL, 0, NULL },
338 };
339
340
341 static void
342 test_hmac (HmacCase *t)
343 {
344   GHmac *hmac;
345   gsize digest_len, hmac_len;
346   gpointer digest;
347
348   hmac_len = digest_len = g_checksum_type_get_length (t->digest_type);
349   digest = g_malloc (hmac_len);
350
351   hmac = g_hmac_new (t->digest_type, t->key, t->key_len);
352   g_hmac_update (hmac, t->data, t->data_len);
353   g_hmac_get_digest (hmac, digest, &digest_len);
354
355   g_assert_cmpuint (digest_len, ==, hmac_len);
356   g_assert (memcmp (digest, t->result, digest_len) == 0);
357
358   g_free (digest);
359   g_hmac_unref (hmac);
360 }
361
362 static void
363 test_hmac_ref_unref (void)
364 {
365   GHmac *hmac, *check;
366
367   hmac = g_hmac_new (G_CHECKSUM_SHA1, (guchar*)"aaa", 3);
368   check = g_hmac_ref (hmac);
369   g_assert (check == hmac);
370   g_hmac_unref (check);
371   g_hmac_unref (hmac);
372 }
373
374 static void
375 test_hmac_copy (void)
376 {
377   GHmac *hmac, *check;
378
379   hmac = g_hmac_new (G_CHECKSUM_SHA256, (guchar*)"aaa", 3);
380   check = g_hmac_copy (hmac);
381   g_assert (check != hmac);
382   g_assert_cmpstr (g_hmac_get_string (hmac), ==, g_hmac_get_string (check));
383   g_hmac_unref (check);
384   g_hmac_unref (hmac);
385 }
386
387 static void
388 test_hmac_for_data (void)
389 {
390   gchar *string;
391   GHmac *hmac;
392
393   string = g_compute_hmac_for_data (G_CHECKSUM_SHA1,
394                                     (guchar*)"aaa", 3,
395                                     (guchar*)"bcdef", 5);
396
397   hmac = g_hmac_new (G_CHECKSUM_SHA1, (guchar*)"aaa", 3);
398   g_hmac_update (hmac, (guchar*)"bcdef", 5);
399   g_assert_cmpstr (string, ==, g_hmac_get_string (hmac));
400   g_hmac_unref (hmac);
401   g_free (string);
402 }
403
404 static void
405 test_hmac_for_string (void)
406 {
407   gchar *string;
408   GHmac *hmac;
409
410   string = g_compute_hmac_for_string (G_CHECKSUM_SHA1,
411                                       (guchar*)"aaa", 3,
412                                       "bcdef", -1);
413
414   hmac = g_hmac_new (G_CHECKSUM_SHA1, (guchar*)"aaa", 3);
415   g_hmac_update (hmac, (guchar*)"bcdef", 5);
416   g_assert_cmpstr (string, ==, g_hmac_get_string (hmac));
417   g_hmac_unref (hmac);
418   g_free (string);
419 }
420
421 int
422 main (int argc,
423     char **argv)
424 {
425   int i;
426   g_test_init (&argc, &argv, NULL);
427
428   for (i = 0 ; hmac_sha1_tests[i].key_len > 0 ; i++)
429     {
430       gchar *name = g_strdup_printf ("/hmac/sha1-%d", i + 1);
431       g_test_add_data_func (name, hmac_sha1_tests + i,
432         (void (*)(const void *)) test_hmac);
433       g_free (name);
434     }
435
436   for (i = 0 ; hmac_sha256_tests[i].key_len > 0 ; i++)
437     {
438       gchar *name = g_strdup_printf ("/hmac/sha256-%d", i + 1);
439       g_test_add_data_func (name, hmac_sha256_tests + i,
440         (void (*)(const void *)) test_hmac);
441       g_free (name);
442     }
443
444   for (i = 0 ; hmac_sha512_tests[i].key_len > 0 ; i++)
445     {
446       gchar *name = g_strdup_printf ("/hmac/sha512-%d", i + 1);
447       g_test_add_data_func (name, hmac_sha512_tests + i,
448         (void (*)(const void *)) test_hmac);
449       g_free (name);
450     }
451
452   for (i = 0 ; hmac_md5_tests[i].key_len > 0 ; i++)
453     {
454       gchar *name = g_strdup_printf ("/hmac/md5-%d", i + 1);
455       g_test_add_data_func (name, hmac_md5_tests + i,
456         (void (*)(const void *)) test_hmac);
457       g_free (name);
458     }
459
460   g_test_add_func ("/hmac/ref-unref", test_hmac_ref_unref);
461   g_test_add_func ("/hmac/copy", test_hmac_copy);
462   g_test_add_func ("/hmac/for-data", test_hmac_for_data);
463   g_test_add_func ("/hmac/for-string", test_hmac_for_string);
464
465   return g_test_run ();
466 }