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 } 267