]>
Commit | Line | Data |
---|---|---|
4fd460bf LM |
1 | /* |
2 | * QEMU Crypto hmac algorithms tests | |
3 | * | |
4 | * Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD. | |
5 | * | |
6 | * Authors: | |
7 | * Longpeng(Mike) <longpeng2@huawei.com> | |
8 | * | |
9 | * This work is licensed under the terms of the GNU GPL, version 2 or | |
10 | * (at your option) any later version. See the COPYING file in the | |
11 | * top-level directory. | |
12 | * | |
13 | */ | |
14 | ||
15 | #include "qemu/osdep.h" | |
16 | #include "crypto/init.h" | |
17 | #include "crypto/hmac.h" | |
18 | ||
19 | #define INPUT_TEXT1 "ABCDEFGHIJKLMNOPQRSTUVWXY" | |
20 | #define INPUT_TEXT2 "Zabcdefghijklmnopqrstuvwx" | |
21 | #define INPUT_TEXT3 "yz0123456789" | |
22 | #define INPUT_TEXT INPUT_TEXT1 \ | |
23 | INPUT_TEXT2 \ | |
24 | INPUT_TEXT3 | |
25 | ||
26 | #define KEY "monkey monkey monkey monkey" | |
27 | ||
28 | typedef struct QCryptoHmacTestData QCryptoHmacTestData; | |
29 | struct QCryptoHmacTestData { | |
30 | QCryptoHashAlgorithm alg; | |
31 | const char *hex_digest; | |
32 | }; | |
33 | ||
34 | static QCryptoHmacTestData test_data[] = { | |
35 | { | |
36 | .alg = QCRYPTO_HASH_ALG_MD5, | |
37 | .hex_digest = | |
38 | "ede9cb83679ba82d88fbeae865b3f8fc", | |
39 | }, | |
40 | { | |
41 | .alg = QCRYPTO_HASH_ALG_SHA1, | |
42 | .hex_digest = | |
43 | "c7b5a631e3aac975c4ededfcd346e469" | |
44 | "dbc5f2d1", | |
45 | }, | |
46 | { | |
47 | .alg = QCRYPTO_HASH_ALG_SHA224, | |
48 | .hex_digest = | |
49 | "5f768179dbb29ca722875d0f461a2e2f" | |
50 | "597d0210340a84df1a8e9c63", | |
51 | }, | |
52 | { | |
53 | .alg = QCRYPTO_HASH_ALG_SHA256, | |
54 | .hex_digest = | |
55 | "3798f363c57afa6edaffe39016ca7bad" | |
56 | "efd1e670afb0e3987194307dec3197db", | |
57 | }, | |
58 | { | |
59 | .alg = QCRYPTO_HASH_ALG_SHA384, | |
60 | .hex_digest = | |
61 | "d218680a6032d33dccd9882d6a6a7164" | |
62 | "64f26623be257a9b2919b185294f4a49" | |
63 | "9e54b190bfd6bc5cedd2cd05c7e65e82", | |
64 | }, | |
65 | { | |
66 | .alg = QCRYPTO_HASH_ALG_SHA512, | |
67 | .hex_digest = | |
68 | "835a4f5b3750b4c1fccfa88da2f746a4" | |
69 | "900160c9f18964309bb736c13b59491b" | |
70 | "8e32d37b724cc5aebb0f554c6338a3b5" | |
71 | "94c4ba26862b2dadb59b7ede1d08d53e", | |
72 | }, | |
73 | { | |
74 | .alg = QCRYPTO_HASH_ALG_RIPEMD160, | |
75 | .hex_digest = | |
76 | "94964ed4c1155b62b668c241d67279e5" | |
77 | "8a711676", | |
78 | }, | |
79 | }; | |
80 | ||
81 | static const char hex[] = "0123456789abcdef"; | |
82 | ||
83 | static void test_hmac_alloc(void) | |
84 | { | |
85 | size_t i; | |
86 | ||
87 | for (i = 0; i < G_N_ELEMENTS(test_data); i++) { | |
88 | QCryptoHmacTestData *data = &test_data[i]; | |
89 | QCryptoHmac *hmac = NULL; | |
90 | uint8_t *result = NULL; | |
91 | size_t resultlen = 0; | |
92 | Error *err = NULL; | |
93 | const char *exp_output = NULL; | |
94 | int ret; | |
95 | size_t j; | |
96 | ||
97 | if (!qcrypto_hmac_supports(data->alg)) { | |
98 | return; | |
99 | } | |
100 | ||
101 | exp_output = data->hex_digest; | |
102 | ||
103 | hmac = qcrypto_hmac_new(data->alg, (const uint8_t *)KEY, | |
104 | strlen(KEY), &err); | |
105 | g_assert(err == NULL); | |
106 | g_assert(hmac != NULL); | |
107 | ||
108 | ret = qcrypto_hmac_bytes(hmac, (const char *)INPUT_TEXT, | |
109 | strlen(INPUT_TEXT), &result, | |
110 | &resultlen, &err); | |
111 | g_assert(err == NULL); | |
112 | g_assert(ret == 0); | |
113 | ||
114 | for (j = 0; j < resultlen; j++) { | |
115 | g_assert(exp_output[j * 2] == hex[(result[j] >> 4) & 0xf]); | |
116 | g_assert(exp_output[j * 2 + 1] == hex[result[j] & 0xf]); | |
117 | } | |
118 | ||
119 | qcrypto_hmac_free(hmac); | |
120 | ||
121 | g_free(result); | |
122 | } | |
123 | } | |
124 | ||
125 | static void test_hmac_prealloc(void) | |
126 | { | |
127 | size_t i; | |
128 | ||
129 | for (i = 0; i < G_N_ELEMENTS(test_data); i++) { | |
130 | QCryptoHmacTestData *data = &test_data[i]; | |
131 | QCryptoHmac *hmac = NULL; | |
132 | uint8_t *result = NULL; | |
133 | size_t resultlen = 0; | |
134 | Error *err = NULL; | |
135 | const char *exp_output = NULL; | |
136 | int ret; | |
137 | size_t j; | |
138 | ||
139 | if (!qcrypto_hmac_supports(data->alg)) { | |
140 | return; | |
141 | } | |
142 | ||
143 | exp_output = data->hex_digest; | |
144 | ||
145 | resultlen = strlen(exp_output) / 2; | |
146 | result = g_new0(uint8_t, resultlen); | |
147 | ||
148 | hmac = qcrypto_hmac_new(data->alg, (const uint8_t *)KEY, | |
149 | strlen(KEY), &err); | |
150 | g_assert(err == NULL); | |
151 | g_assert(hmac != NULL); | |
152 | ||
153 | ret = qcrypto_hmac_bytes(hmac, (const char *)INPUT_TEXT, | |
154 | strlen(INPUT_TEXT), &result, | |
155 | &resultlen, &err); | |
156 | g_assert(err == NULL); | |
157 | g_assert(ret == 0); | |
158 | ||
159 | exp_output = data->hex_digest; | |
160 | for (j = 0; j < resultlen; j++) { | |
161 | g_assert(exp_output[j * 2] == hex[(result[j] >> 4) & 0xf]); | |
162 | g_assert(exp_output[j * 2 + 1] == hex[result[j] & 0xf]); | |
163 | } | |
164 | ||
165 | qcrypto_hmac_free(hmac); | |
166 | ||
167 | g_free(result); | |
168 | } | |
169 | } | |
170 | ||
171 | static void test_hmac_iov(void) | |
172 | { | |
173 | size_t i; | |
174 | ||
175 | for (i = 0; i < G_N_ELEMENTS(test_data); i++) { | |
176 | QCryptoHmacTestData *data = &test_data[i]; | |
177 | QCryptoHmac *hmac = NULL; | |
178 | uint8_t *result = NULL; | |
179 | size_t resultlen = 0; | |
180 | Error *err = NULL; | |
181 | const char *exp_output = NULL; | |
182 | int ret; | |
183 | size_t j; | |
184 | struct iovec iov[3] = { | |
185 | { .iov_base = (char *)INPUT_TEXT1, .iov_len = strlen(INPUT_TEXT1) }, | |
186 | { .iov_base = (char *)INPUT_TEXT2, .iov_len = strlen(INPUT_TEXT2) }, | |
187 | { .iov_base = (char *)INPUT_TEXT3, .iov_len = strlen(INPUT_TEXT3) }, | |
188 | }; | |
189 | ||
190 | if (!qcrypto_hmac_supports(data->alg)) { | |
191 | return; | |
192 | } | |
193 | ||
194 | exp_output = data->hex_digest; | |
195 | ||
196 | hmac = qcrypto_hmac_new(data->alg, (const uint8_t *)KEY, | |
197 | strlen(KEY), &err); | |
198 | g_assert(err == NULL); | |
199 | g_assert(hmac != NULL); | |
200 | ||
201 | ret = qcrypto_hmac_bytesv(hmac, iov, 3, &result, | |
202 | &resultlen, &err); | |
203 | g_assert(err == NULL); | |
204 | g_assert(ret == 0); | |
205 | ||
206 | for (j = 0; j < resultlen; j++) { | |
207 | g_assert(exp_output[j * 2] == hex[(result[j] >> 4) & 0xf]); | |
208 | g_assert(exp_output[j * 2 + 1] == hex[result[j] & 0xf]); | |
209 | } | |
210 | ||
211 | qcrypto_hmac_free(hmac); | |
212 | ||
213 | g_free(result); | |
214 | } | |
215 | } | |
216 | ||
217 | static void test_hmac_digest(void) | |
218 | { | |
219 | size_t i; | |
220 | ||
221 | for (i = 0; i < G_N_ELEMENTS(test_data); i++) { | |
222 | QCryptoHmacTestData *data = &test_data[i]; | |
223 | QCryptoHmac *hmac = NULL; | |
224 | uint8_t *result = NULL; | |
225 | Error *err = NULL; | |
226 | const char *exp_output = NULL; | |
227 | int ret; | |
228 | ||
229 | if (!qcrypto_hmac_supports(data->alg)) { | |
230 | return; | |
231 | } | |
232 | ||
233 | exp_output = data->hex_digest; | |
234 | ||
235 | hmac = qcrypto_hmac_new(data->alg, (const uint8_t *)KEY, | |
236 | strlen(KEY), &err); | |
237 | g_assert(err == NULL); | |
238 | g_assert(hmac != NULL); | |
239 | ||
240 | ret = qcrypto_hmac_digest(hmac, (const char *)INPUT_TEXT, | |
241 | strlen(INPUT_TEXT), (char **)&result, | |
242 | &err); | |
243 | g_assert(err == NULL); | |
244 | g_assert(ret == 0); | |
245 | ||
246 | g_assert_cmpstr((const char *)result, ==, exp_output); | |
247 | ||
248 | qcrypto_hmac_free(hmac); | |
249 | ||
250 | g_free(result); | |
251 | } | |
252 | } | |
253 | ||
254 | int main(int argc, char **argv) | |
255 | { | |
256 | g_test_init(&argc, &argv, NULL); | |
257 | ||
258 | g_assert(qcrypto_init(NULL) == 0); | |
259 | ||
260 | g_test_add_func("/crypto/hmac/iov", test_hmac_iov); | |
261 | g_test_add_func("/crypto/hmac/alloc", test_hmac_alloc); | |
262 | g_test_add_func("/crypto/hmac/prealloc", test_hmac_prealloc); | |
263 | g_test_add_func("/crypto/hmac/digest", test_hmac_digest); | |
264 | ||
265 | return g_test_run(); | |
266 | } |