1 /*
2 * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6 #ifdef ESP_PLATFORM
7 #include "esp_system.h"
8 #endif
9
10 #include "utils/includes.h"
11 #include "utils/common.h"
12 #include "crypto.h"
13 #include "random.h"
14 #include "sha256.h"
15
16 #include "mbedtls/ecp.h"
17 #include "mbedtls/entropy.h"
18 #include "mbedtls/ctr_drbg.h"
19 #include "mbedtls/md.h"
20 #include "mbedtls/aes.h"
21 #include "mbedtls/bignum.h"
22 #include "mbedtls/pkcs5.h"
23 #include "mbedtls/cmac.h"
24 #include "mbedtls/nist_kw.h"
25 #include "mbedtls/des.h"
26 #include "mbedtls/ccm.h"
27
28 #include "common.h"
29 #include "utils/wpabuf.h"
30 #include "dh_group5.h"
31 #include "md5.h"
32 #include "sha1.h"
33 #include "sha256.h"
34 #include "sha384.h"
35 #include "aes_wrap.h"
36 #include "crypto.h"
37 #ifdef ESPRESSIF_USE
38 #include "mbedtls/esp_config.h"
39 #else
40 #if defined(CONFIG_MBEDTLS)
41 #if !defined(CONFIG_MBEDTLS_CFG_FILE)
42 #include "mbedtls/config.h"
43 #else
44 #include CONFIG_MBEDTLS_CFG_FILE
45 #endif /* CONFIG_MBEDTLS_CFG_FILE */
46 #endif
47 #endif
48
49 #ifdef CONFIG_FAST_PBKDF2
50 #include "fastpbkdf2.h"
51 #endif
52
digest_vector(mbedtls_md_type_t md_type,size_t num_elem,const u8 * addr[],const size_t * len,u8 * mac)53 static int digest_vector(mbedtls_md_type_t md_type, size_t num_elem,
54 const u8 *addr[], const size_t *len, u8 *mac)
55 {
56 size_t i;
57 const mbedtls_md_info_t *md_info;
58 mbedtls_md_context_t md_ctx;
59 int ret;
60
61 mbedtls_md_init(&md_ctx);
62
63 md_info = mbedtls_md_info_from_type(md_type);
64 if (!md_info) {
65 wpa_printf(MSG_ERROR, "mbedtls_md_info_from_type() failed");
66 return -1;
67 }
68
69 ret = mbedtls_md_setup(&md_ctx, md_info, 0);
70 if (ret != 0) {
71 wpa_printf(MSG_ERROR, "mbedtls_md_setup() returned error");
72 goto cleanup;
73 }
74
75 ret = mbedtls_md_starts(&md_ctx);
76 if (ret != 0) {
77 wpa_printf(MSG_ERROR, "mbedtls_md_starts returned error");
78 goto cleanup;
79 }
80
81 for (i = 0; i < num_elem; i++) {
82 ret = mbedtls_md_update(&md_ctx, addr[i], len[i]);
83 if (ret != 0) {
84 wpa_printf(MSG_ERROR, "mbedtls_md_update ret=%d", ret);
85 goto cleanup;
86 }
87 }
88
89 ret = mbedtls_md_finish(&md_ctx, mac);
90 cleanup:
91 mbedtls_md_free(&md_ctx);
92
93 return ret;
94
95 }
96
sha256_vector(size_t num_elem,const u8 * addr[],const size_t * len,u8 * mac)97 int sha256_vector(size_t num_elem, const u8 *addr[], const size_t *len,
98 u8 *mac)
99 {
100 return digest_vector(MBEDTLS_MD_SHA256, num_elem, addr, len, mac);
101 }
102
sha384_vector(size_t num_elem,const u8 * addr[],const size_t * len,u8 * mac)103 int sha384_vector(size_t num_elem, const u8 *addr[], const size_t *len,
104 u8 *mac)
105 {
106 return digest_vector(MBEDTLS_MD_SHA384, num_elem, addr, len, mac);
107 }
108
sha512_vector(size_t num_elem,const u8 * addr[],const size_t * len,u8 * mac)109 int sha512_vector(size_t num_elem, const u8 *addr[], const size_t *len,
110 u8 *mac)
111 {
112 return digest_vector(MBEDTLS_MD_SHA512, num_elem, addr, len, mac);
113 }
114
sha1_vector(size_t num_elem,const u8 * addr[],const size_t * len,u8 * mac)115 int sha1_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac)
116 {
117 return digest_vector(MBEDTLS_MD_SHA1, num_elem, addr, len, mac);
118 }
119
md5_vector(size_t num_elem,const u8 * addr[],const size_t * len,u8 * mac)120 int md5_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac)
121 {
122 return digest_vector(MBEDTLS_MD_MD5, num_elem, addr, len, mac);
123 }
124
125 #ifdef MBEDTLS_MD4_C
md4_vector(size_t num_elem,const u8 * addr[],const size_t * len,u8 * mac)126 int md4_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac)
127 {
128 return digest_vector(MBEDTLS_MD_MD4, num_elem, addr, len, mac);
129 }
130 #endif
131
crypto_hash_init(enum crypto_hash_alg alg,const u8 * key,size_t key_len)132 struct crypto_hash * crypto_hash_init(enum crypto_hash_alg alg, const u8 *key,
133 size_t key_len)
134 {
135 mbedtls_md_context_t *ctx = NULL;
136 mbedtls_md_type_t md_type;
137 const mbedtls_md_info_t *md_info;
138 int ret;
139 int is_hmac = 0;
140
141 switch (alg) {
142 case CRYPTO_HASH_ALG_MD5:
143 case CRYPTO_HASH_ALG_HMAC_MD5:
144 md_type = MBEDTLS_MD_MD5;
145 break;
146 case CRYPTO_HASH_ALG_SHA1:
147 case CRYPTO_HASH_ALG_HMAC_SHA1:
148 md_type = MBEDTLS_MD_SHA1;
149 break;
150 case CRYPTO_HASH_ALG_SHA256:
151 case CRYPTO_HASH_ALG_HMAC_SHA256:
152 md_type = MBEDTLS_MD_SHA256;
153 break;
154 case CRYPTO_HASH_ALG_SHA384:
155 md_type = MBEDTLS_MD_SHA384;
156 break;
157 case CRYPTO_HASH_ALG_SHA512:
158 md_type = MBEDTLS_MD_SHA512;
159 break;
160 default:
161 return NULL;
162 }
163
164 switch (alg) {
165 case CRYPTO_HASH_ALG_HMAC_MD5:
166 case CRYPTO_HASH_ALG_HMAC_SHA1:
167 case CRYPTO_HASH_ALG_HMAC_SHA256:
168 is_hmac = 1;
169 break;
170 default:
171 break;
172 }
173 ctx = os_zalloc(sizeof(*ctx));
174 if (ctx == NULL) {
175 return NULL;
176 }
177
178 mbedtls_md_init(ctx);
179 md_info = mbedtls_md_info_from_type(md_type);
180 if (!md_info) {
181 goto cleanup;
182 }
183 if (mbedtls_md_setup(ctx, md_info, is_hmac) != 0) {
184 goto cleanup;
185 }
186 if (is_hmac) {
187 ret = mbedtls_md_hmac_starts(ctx, key, key_len);
188 } else {
189 ret = mbedtls_md_starts(ctx);
190 }
191 if (ret < 0) {
192 goto cleanup;
193 }
194
195 return (struct crypto_hash *)ctx;
196 cleanup:
197 mbedtls_md_free(ctx);
198 os_free(ctx);
199 return NULL;
200 }
201
crypto_hash_update(struct crypto_hash * crypto_ctx,const u8 * data,size_t len)202 void crypto_hash_update(struct crypto_hash *crypto_ctx, const u8 *data, size_t len)
203 {
204 int ret;
205 mbedtls_md_context_t *ctx = (mbedtls_md_context_t *)crypto_ctx;
206
207 if (ctx == NULL) {
208 return;
209 }
210 if (ctx->MBEDTLS_PRIVATE(hmac_ctx)) {
211 ret = mbedtls_md_hmac_update(ctx, data, len);
212 } else {
213 ret = mbedtls_md_update(ctx, data, len);
214 }
215 if (ret != 0) {
216 wpa_printf(MSG_ERROR, "%s: mbedtls_md_hmac_update failed", __func__);
217 }
218 }
219
crypto_hash_finish(struct crypto_hash * crypto_ctx,u8 * mac,size_t * len)220 int crypto_hash_finish(struct crypto_hash *crypto_ctx, u8 *mac, size_t *len)
221 {
222 int ret = 0;
223 mbedtls_md_type_t md_type;
224 mbedtls_md_context_t *ctx = (mbedtls_md_context_t *)crypto_ctx;
225
226 if (ctx == NULL) {
227 return -2;
228 }
229
230 if (mac == NULL || len == NULL) {
231 goto err;
232 }
233
234 md_type = mbedtls_md_get_type(mbedtls_md_info_from_ctx(ctx));
235 switch(md_type) {
236 case MBEDTLS_MD_MD5:
237 if (*len < MD5_MAC_LEN) {
238 *len = MD5_MAC_LEN;
239 ret = -1;
240 goto err;
241 }
242 *len = MD5_MAC_LEN;
243 break;
244 case MBEDTLS_MD_SHA1:
245 if (*len < SHA1_MAC_LEN) {
246 *len = SHA1_MAC_LEN;
247 ret = -1;
248 goto err;
249 }
250 *len = SHA1_MAC_LEN;
251 break;
252 case MBEDTLS_MD_SHA256:
253 if (*len < SHA256_MAC_LEN) {
254 *len = SHA256_MAC_LEN;
255 ret = -1;
256 goto err;
257 }
258 *len = SHA256_MAC_LEN;
259 break;
260 case MBEDTLS_MD_SHA384:
261 if (*len < SHA384_MAC_LEN) {
262 *len = SHA384_MAC_LEN;
263 ret = -1;
264 goto err;
265 }
266 *len = SHA384_MAC_LEN;
267 break;
268 case MBEDTLS_MD_SHA512:
269 if (*len < SHA512_MAC_LEN) {
270 *len = SHA512_MAC_LEN;
271 ret = -1;
272 goto err;
273 }
274 *len = SHA512_MAC_LEN;
275 break;
276 default:
277 *len = 0;
278 ret = -1;
279 goto err;
280 }
281 if (ctx->MBEDTLS_PRIVATE(hmac_ctx)) {
282 ret = mbedtls_md_hmac_finish(ctx, mac);
283 } else {
284 ret = mbedtls_md_finish(ctx, mac);
285 }
286
287 err:
288 mbedtls_md_free(ctx);
289 bin_clear_free(ctx, sizeof(*ctx));
290
291 return ret;
292 }
293
hmac_vector(mbedtls_md_type_t md_type,const u8 * key,size_t key_len,size_t num_elem,const u8 * addr[],const size_t * len,u8 * mac)294 static int hmac_vector(mbedtls_md_type_t md_type,
295 const u8 *key, size_t key_len,
296 size_t num_elem, const u8 *addr[],
297 const size_t *len, u8 *mac)
298 {
299 size_t i;
300 const mbedtls_md_info_t *md_info;
301 mbedtls_md_context_t md_ctx;
302 int ret;
303
304 mbedtls_md_init(&md_ctx);
305
306 md_info = mbedtls_md_info_from_type(md_type);
307 if (!md_info) {
308 return -1;
309 }
310
311 ret = mbedtls_md_setup(&md_ctx, md_info, 1);
312 if (ret != 0) {
313 return(ret);
314 }
315
316 ret = mbedtls_md_hmac_starts(&md_ctx, key, key_len);
317 if (ret != 0) {
318 return(ret);
319 }
320
321 for (i = 0; i < num_elem; i++) {
322 ret = mbedtls_md_hmac_update(&md_ctx, addr[i], len[i]);
323 if (ret != 0) {
324 return(ret);
325 }
326
327 }
328
329 ret = mbedtls_md_hmac_finish(&md_ctx, mac);
330
331 mbedtls_md_free(&md_ctx);
332
333 return ret;
334 }
335
hmac_sha384_vector(const u8 * key,size_t key_len,size_t num_elem,const u8 * addr[],const size_t * len,u8 * mac)336 int hmac_sha384_vector(const u8 *key, size_t key_len, size_t num_elem,
337 const u8 *addr[], const size_t *len, u8 *mac)
338 {
339 return hmac_vector(MBEDTLS_MD_SHA384, key, key_len, num_elem, addr,
340 len, mac);
341 }
342
343
hmac_sha384(const u8 * key,size_t key_len,const u8 * data,size_t data_len,u8 * mac)344 int hmac_sha384(const u8 *key, size_t key_len, const u8 *data,
345 size_t data_len, u8 *mac)
346 {
347 return hmac_sha384_vector(key, key_len, 1, &data, &data_len, mac);
348 }
349
hmac_sha256_vector(const u8 * key,size_t key_len,size_t num_elem,const u8 * addr[],const size_t * len,u8 * mac)350 int hmac_sha256_vector(const u8 *key, size_t key_len, size_t num_elem,
351 const u8 *addr[], const size_t *len, u8 *mac)
352 {
353 return hmac_vector(MBEDTLS_MD_SHA256, key, key_len, num_elem, addr,
354 len, mac);
355 }
356
hmac_sha256(const u8 * key,size_t key_len,const u8 * data,size_t data_len,u8 * mac)357 int hmac_sha256(const u8 *key, size_t key_len, const u8 *data,
358 size_t data_len, u8 *mac)
359 {
360 return hmac_sha256_vector(key, key_len, 1, &data, &data_len, mac);
361 }
362
hmac_md5_vector(const u8 * key,size_t key_len,size_t num_elem,const u8 * addr[],const size_t * len,u8 * mac)363 int hmac_md5_vector(const u8 *key, size_t key_len, size_t num_elem,
364 const u8 *addr[], const size_t *len, u8 *mac)
365 {
366 return hmac_vector(MBEDTLS_MD_MD5, key, key_len,
367 num_elem, addr, len, mac);
368 }
369
hmac_md5(const u8 * key,size_t key_len,const u8 * data,size_t data_len,u8 * mac)370 int hmac_md5(const u8 *key, size_t key_len, const u8 *data, size_t data_len,
371 u8 *mac)
372 {
373 return hmac_md5_vector(key, key_len, 1, &data, &data_len, mac);
374 }
375
hmac_sha1_vector(const u8 * key,size_t key_len,size_t num_elem,const u8 * addr[],const size_t * len,u8 * mac)376 int hmac_sha1_vector(const u8 *key, size_t key_len, size_t num_elem,
377 const u8 *addr[], const size_t *len, u8 *mac)
378 {
379 return hmac_vector(MBEDTLS_MD_SHA1, key, key_len, num_elem, addr,
380 len, mac);
381 }
382
hmac_sha1(const u8 * key,size_t key_len,const u8 * data,size_t data_len,u8 * mac)383 int hmac_sha1(const u8 *key, size_t key_len, const u8 *data, size_t data_len,
384 u8 *mac)
385 {
386 return hmac_sha1_vector(key, key_len, 1, &data, &data_len, mac);
387 }
388
aes_crypt_init(int mode,const u8 * key,size_t len)389 static void *aes_crypt_init(int mode, const u8 *key, size_t len)
390 {
391 int ret = -1;
392 mbedtls_aes_context *aes = os_malloc(sizeof(*aes));
393 if (!aes) {
394 return NULL;
395 }
396 mbedtls_aes_init(aes);
397
398 if (mode == MBEDTLS_AES_ENCRYPT) {
399 ret = mbedtls_aes_setkey_enc(aes, key, len * 8);
400 } else if (mode == MBEDTLS_AES_DECRYPT){
401 ret = mbedtls_aes_setkey_dec(aes, key, len * 8);
402 }
403 if (ret < 0) {
404 mbedtls_aes_free(aes);
405 os_free(aes);
406 wpa_printf(MSG_ERROR, "%s: mbedtls_aes_setkey_enc/mbedtls_aes_setkey_dec failed", __func__);
407 return NULL;
408 }
409
410 return (void *) aes;
411 }
412
aes_crypt(void * ctx,int mode,const u8 * in,u8 * out)413 static int aes_crypt(void *ctx, int mode, const u8 *in, u8 *out)
414 {
415 return mbedtls_aes_crypt_ecb((mbedtls_aes_context *)ctx,
416 mode, in, out);
417 }
418
aes_crypt_deinit(void * ctx)419 static void aes_crypt_deinit(void *ctx)
420 {
421 mbedtls_aes_free((mbedtls_aes_context *)ctx);
422 os_free(ctx);
423 }
424
aes_encrypt_init(const u8 * key,size_t len)425 void *aes_encrypt_init(const u8 *key, size_t len)
426 {
427 return aes_crypt_init(MBEDTLS_AES_ENCRYPT, key, len);
428 }
429
aes_encrypt(void * ctx,const u8 * plain,u8 * crypt)430 int aes_encrypt(void *ctx, const u8 *plain, u8 *crypt)
431 {
432 return aes_crypt(ctx, MBEDTLS_AES_ENCRYPT, plain, crypt);
433 }
434
aes_encrypt_deinit(void * ctx)435 void aes_encrypt_deinit(void *ctx)
436 {
437 return aes_crypt_deinit(ctx);
438 }
439
aes_decrypt_init(const u8 * key,size_t len)440 void * aes_decrypt_init(const u8 *key, size_t len)
441 {
442 return aes_crypt_init(MBEDTLS_AES_DECRYPT, key, len);
443 }
444
aes_decrypt(void * ctx,const u8 * crypt,u8 * plain)445 int aes_decrypt(void *ctx, const u8 *crypt, u8 *plain)
446 {
447 return aes_crypt(ctx, MBEDTLS_AES_DECRYPT, crypt, plain);
448 }
449
aes_decrypt_deinit(void * ctx)450 void aes_decrypt_deinit(void *ctx)
451 {
452 return aes_crypt_deinit(ctx);
453 }
454
aes_128_cbc_encrypt(const u8 * key,const u8 * iv,u8 * data,size_t data_len)455 int aes_128_cbc_encrypt(const u8 *key, const u8 *iv, u8 *data, size_t data_len)
456 {
457 int ret = 0;
458 mbedtls_aes_context ctx;
459 u8 cbc[MBEDTLS_AES_BLOCK_SIZE];
460
461 mbedtls_aes_init(&ctx);
462
463 ret = mbedtls_aes_setkey_enc(&ctx, key, 128);
464 if (ret < 0) {
465 mbedtls_aes_free(&ctx);
466 return ret;
467 }
468
469 os_memcpy(cbc, iv, MBEDTLS_AES_BLOCK_SIZE);
470 ret = mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_ENCRYPT,
471 data_len, cbc, data, data);
472 mbedtls_aes_free(&ctx);
473
474 return ret;
475 }
476
aes_128_cbc_decrypt(const u8 * key,const u8 * iv,u8 * data,size_t data_len)477 int aes_128_cbc_decrypt(const u8 *key, const u8 *iv, u8 *data, size_t data_len)
478 {
479 int ret = 0;
480 mbedtls_aes_context ctx;
481 u8 cbc[MBEDTLS_AES_BLOCK_SIZE];
482
483 mbedtls_aes_init(&ctx);
484
485 ret = mbedtls_aes_setkey_dec(&ctx, key, 128);
486 if (ret < 0) {
487 mbedtls_aes_free(&ctx);
488 return ret;
489 }
490
491 os_memcpy(cbc, iv, MBEDTLS_AES_BLOCK_SIZE);
492 ret = mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_DECRYPT,
493 data_len, cbc, data, data);
494 mbedtls_aes_free(&ctx);
495
496 return ret;
497
498 }
499
500 #ifdef CONFIG_TLS_INTERNAL_CLIENT
501 struct crypto_cipher {
502 mbedtls_cipher_context_t ctx_enc;
503 mbedtls_cipher_context_t ctx_dec;
504 };
505
crypto_init_cipher_ctx(mbedtls_cipher_context_t * ctx,const mbedtls_cipher_info_t * cipher_info,const u8 * iv,const u8 * key,size_t key_len,mbedtls_operation_t operation)506 static int crypto_init_cipher_ctx(mbedtls_cipher_context_t *ctx,
507 const mbedtls_cipher_info_t *cipher_info,
508 const u8 *iv, const u8 *key, size_t key_len,
509 mbedtls_operation_t operation)
510 {
511 mbedtls_cipher_init(ctx);
512 int ret;
513
514 ret = mbedtls_cipher_setup(ctx, cipher_info);
515 if (ret != 0) {
516 return -1;
517 }
518
519 ret = mbedtls_cipher_setkey(ctx, key, key_len * 8, operation);
520 if (ret != 0) {
521 wpa_printf(MSG_ERROR, "mbedtls_cipher_setkey returned error=%d", ret);
522 return -1;
523 }
524 ret = mbedtls_cipher_set_iv(ctx, iv, cipher_info->MBEDTLS_PRIVATE(iv_size) << MBEDTLS_IV_SIZE_SHIFT);
525 if (ret != 0) {
526 wpa_printf(MSG_ERROR, "mbedtls_cipher_set_iv returned error=%d", ret);
527 return -1;
528 }
529 ret = mbedtls_cipher_reset(ctx);
530 if (ret != 0) {
531 wpa_printf(MSG_ERROR, "mbedtls_cipher_reset() returned error=%d", ret);
532 return -1;
533 }
534
535 return 0;
536 }
537
alg_to_mbedtls_cipher(enum crypto_cipher_alg alg,size_t key_len)538 static mbedtls_cipher_type_t alg_to_mbedtls_cipher(enum crypto_cipher_alg alg,
539 size_t key_len)
540 {
541 switch (alg) {
542 case CRYPTO_CIPHER_ALG_AES:
543 if (key_len == 16) {
544 return MBEDTLS_CIPHER_AES_128_CBC;
545 }
546 if (key_len == 24) {
547 return MBEDTLS_CIPHER_AES_192_CBC;
548 }
549 if (key_len == 32) {
550 return MBEDTLS_CIPHER_AES_256_CBC;
551 }
552 break;
553 #ifdef MBEDTLS_DES_C
554 case CRYPTO_CIPHER_ALG_3DES:
555 return MBEDTLS_CIPHER_DES_EDE3_CBC;
556 case CRYPTO_CIPHER_ALG_DES:
557 return MBEDTLS_CIPHER_DES_CBC;
558 #endif
559 default:
560 break;
561 }
562
563 return MBEDTLS_CIPHER_NONE;
564 }
565
crypto_cipher_init(enum crypto_cipher_alg alg,const u8 * iv,const u8 * key,size_t key_len)566 struct crypto_cipher *crypto_cipher_init(enum crypto_cipher_alg alg,
567 const u8 *iv, const u8 *key,
568 size_t key_len)
569 {
570 struct crypto_cipher *ctx;
571 mbedtls_cipher_type_t cipher_type;
572 const mbedtls_cipher_info_t *cipher_info;
573
574 ctx = (struct crypto_cipher *)os_zalloc(sizeof(*ctx));
575 if (!ctx) {
576 return NULL;
577 }
578
579 cipher_type = alg_to_mbedtls_cipher(alg, key_len);
580 if (cipher_type == MBEDTLS_CIPHER_NONE) {
581 goto cleanup;
582 }
583
584 cipher_info = mbedtls_cipher_info_from_type(cipher_type);
585 if (cipher_info == NULL) {
586 goto cleanup;
587 }
588
589 /* Init both ctx encryption/decryption */
590 if (crypto_init_cipher_ctx(&ctx->ctx_enc, cipher_info, iv, key,
591 key_len, MBEDTLS_ENCRYPT) < 0) {
592 goto cleanup;
593 }
594
595 if (crypto_init_cipher_ctx(&ctx->ctx_dec, cipher_info, iv, key,
596 key_len, MBEDTLS_DECRYPT) < 0) {
597 goto cleanup;
598 }
599
600 if (mbedtls_cipher_set_padding_mode(&ctx->ctx_enc, MBEDTLS_PADDING_NONE) < 0) {
601 goto cleanup;
602 }
603 if (mbedtls_cipher_set_padding_mode(&ctx->ctx_dec, MBEDTLS_PADDING_NONE) < 0) {
604 goto cleanup;
605 }
606 return ctx;
607
608 cleanup:
609 os_free(ctx);
610 return NULL;
611 }
612
crypto_cipher_encrypt(struct crypto_cipher * ctx,const u8 * plain,u8 * crypt,size_t len)613 int crypto_cipher_encrypt(struct crypto_cipher *ctx, const u8 *plain,
614 u8 *crypt, size_t len)
615 {
616 int ret;
617 size_t olen = 0;
618
619 ret = mbedtls_cipher_update(&ctx->ctx_enc, plain, len, crypt, &olen);
620 if (ret != 0) {
621 return -1;
622 }
623
624 ret = mbedtls_cipher_finish(&ctx->ctx_enc, crypt + olen, &olen);
625 if (ret != 0) {
626 return -1;
627 }
628
629 return 0;
630 }
631
crypto_cipher_decrypt(struct crypto_cipher * ctx,const u8 * crypt,u8 * plain,size_t len)632 int crypto_cipher_decrypt(struct crypto_cipher *ctx, const u8 *crypt,
633 u8 *plain, size_t len)
634 {
635 int ret;
636 size_t olen = 0;
637
638 ret = mbedtls_cipher_update(&ctx->ctx_dec, crypt, len, plain, &olen);
639 if (ret != 0) {
640 return -1;
641 }
642
643 ret = mbedtls_cipher_finish(&ctx->ctx_dec, plain + olen, &olen);
644 if (ret != 0) {
645 return -1;
646 }
647
648 return 0;
649 }
650
crypto_cipher_deinit(struct crypto_cipher * ctx)651 void crypto_cipher_deinit(struct crypto_cipher *ctx)
652 {
653 mbedtls_cipher_free(&ctx->ctx_enc);
654 mbedtls_cipher_free(&ctx->ctx_dec);
655 os_free(ctx);
656 }
657 #endif
658
aes_ctr_encrypt(const u8 * key,size_t key_len,const u8 * nonce,u8 * data,size_t data_len)659 int aes_ctr_encrypt(const u8 *key, size_t key_len, const u8 *nonce,
660 u8 *data, size_t data_len)
661 {
662 int ret;
663 mbedtls_aes_context ctx;
664 uint8_t stream_block[MBEDTLS_AES_BLOCK_SIZE];
665 size_t offset = 0;
666
667 mbedtls_aes_init(&ctx);
668 ret = mbedtls_aes_setkey_enc(&ctx, key, key_len * 8);
669 if (ret < 0) {
670 goto cleanup;
671 }
672 ret = mbedtls_aes_crypt_ctr(&ctx, data_len, &offset, (u8 *)nonce,
673 stream_block, data, data);
674 cleanup:
675 mbedtls_aes_free(&ctx);
676 return ret;
677 }
678
aes_128_ctr_encrypt(const u8 * key,const u8 * nonce,u8 * data,size_t data_len)679 int aes_128_ctr_encrypt(const u8 *key, const u8 *nonce,
680 u8 *data, size_t data_len)
681 {
682 return aes_ctr_encrypt(key, 16, nonce, data, data_len);
683 }
684
685
686 #ifdef MBEDTLS_NIST_KW_C
aes_wrap(const u8 * kek,size_t kek_len,int n,const u8 * plain,u8 * cipher)687 int aes_wrap(const u8 *kek, size_t kek_len, int n, const u8 *plain, u8 *cipher)
688 {
689 mbedtls_nist_kw_context ctx;
690 size_t olen;
691 int ret = 0;
692 mbedtls_nist_kw_init(&ctx);
693
694 ret = mbedtls_nist_kw_setkey(&ctx, MBEDTLS_CIPHER_ID_AES,
695 kek, kek_len * 8, 1);
696 if (ret != 0) {
697 return ret;
698 }
699
700 ret = mbedtls_nist_kw_wrap(&ctx, MBEDTLS_KW_MODE_KW, plain,
701 n * 8, cipher, &olen, (n + 1) * 8);
702
703 mbedtls_nist_kw_free(&ctx);
704 return ret;
705 }
706
aes_unwrap(const u8 * kek,size_t kek_len,int n,const u8 * cipher,u8 * plain)707 int aes_unwrap(const u8 *kek, size_t kek_len, int n, const u8 *cipher,
708 u8 *plain)
709 {
710 mbedtls_nist_kw_context ctx;
711 size_t olen;
712 int ret = 0;
713 mbedtls_nist_kw_init(&ctx);
714
715 ret = mbedtls_nist_kw_setkey(&ctx, MBEDTLS_CIPHER_ID_AES,
716 kek, kek_len * 8, 0);
717 if (ret != 0) {
718 return ret;
719 }
720
721 ret = mbedtls_nist_kw_unwrap(&ctx, MBEDTLS_KW_MODE_KW, cipher,
722 (n + 1) * 8, plain, &olen, (n * 8));
723
724 mbedtls_nist_kw_free(&ctx);
725 return ret;
726 }
727 #endif
728
crypto_mod_exp(const uint8_t * base,size_t base_len,const uint8_t * power,size_t power_len,const uint8_t * modulus,size_t modulus_len,uint8_t * result,size_t * result_len)729 int crypto_mod_exp(const uint8_t *base, size_t base_len,
730 const uint8_t *power, size_t power_len,
731 const uint8_t *modulus, size_t modulus_len,
732 uint8_t *result, size_t *result_len)
733 {
734 mbedtls_mpi bn_base, bn_exp, bn_modulus, bn_result, bn_rinv;
735 int ret = 0;
736
737 mbedtls_mpi_init(&bn_base);
738 mbedtls_mpi_init(&bn_exp);
739 mbedtls_mpi_init(&bn_modulus);
740 mbedtls_mpi_init(&bn_result);
741 mbedtls_mpi_init(&bn_rinv);
742
743 MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&bn_base, base, base_len));
744 MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&bn_exp, power, power_len));
745 MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&bn_modulus, modulus, modulus_len));
746
747 MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&bn_result, &bn_base, &bn_exp, &bn_modulus,
748 &bn_rinv));
749
750 ret = mbedtls_mpi_write_binary(&bn_result, result, *result_len);
751
752 cleanup:
753 mbedtls_mpi_free(&bn_base);
754 mbedtls_mpi_free(&bn_exp);
755 mbedtls_mpi_free(&bn_modulus);
756 mbedtls_mpi_free(&bn_result);
757 mbedtls_mpi_free(&bn_rinv);
758
759 return ret;
760 }
761
pbkdf2_sha1(const char * passphrase,const u8 * ssid,size_t ssid_len,int iterations,u8 * buf,size_t buflen)762 int pbkdf2_sha1(const char *passphrase, const u8 *ssid, size_t ssid_len,
763 int iterations, u8 *buf, size_t buflen)
764 {
765 #ifdef CONFIG_FAST_PBKDF2
766 fastpbkdf2_hmac_sha1((const u8 *) passphrase, os_strlen(passphrase),
767 ssid, ssid_len, iterations, buf, buflen);
768 return 0;
769 #else
770 int ret = mbedtls_pkcs5_pbkdf2_hmac_ext(MBEDTLS_MD_SHA1, (const u8 *) passphrase,
771 os_strlen(passphrase) , ssid,
772 ssid_len, iterations, buflen, buf);
773 if (ret != 0) {
774 ret = -1;
775 goto cleanup;
776 }
777
778 cleanup:
779 return ret;
780 #endif
781 }
782
783 #ifdef MBEDTLS_DES_C
des_encrypt(const u8 * clear,const u8 * key,u8 * cypher)784 int des_encrypt(const u8 *clear, const u8 *key, u8 *cypher)
785 {
786 int ret;
787 mbedtls_des_context des;
788 u8 pkey[8], next, tmp;
789 int i;
790
791 /* Add parity bits to the key */
792 next = 0;
793 for (i = 0; i < 7; i++) {
794 tmp = key[i];
795 pkey[i] = (tmp >> i) | next | 1;
796 next = tmp << (7 - i);
797 }
798 pkey[i] = next | 1;
799
800 mbedtls_des_init(&des);
801 ret = mbedtls_des_setkey_enc(&des, pkey);
802 if (ret < 0) {
803 return ret;
804 }
805 ret = mbedtls_des_crypt_ecb(&des, clear, cypher);
806 mbedtls_des_free(&des);
807
808 return ret;
809 }
810 #endif
811
812 /* Only enable this if all other ciphers are using MbedTLS implementation */
813 #if defined(MBEDTLS_CCM_C) && defined(MBEDTLS_CMAC_C) && defined(MBEDTLS_NIST_KW_C)
aes_ccm_ae(const u8 * key,size_t key_len,const u8 * nonce,size_t M,const u8 * plain,size_t plain_len,const u8 * aad,size_t aad_len,u8 * crypt,u8 * auth)814 int aes_ccm_ae(const u8 *key, size_t key_len, const u8 *nonce,
815 size_t M, const u8 *plain, size_t plain_len,
816 const u8 *aad, size_t aad_len, u8 *crypt, u8 *auth)
817 {
818 int ret;
819 mbedtls_ccm_context ccm;
820
821 mbedtls_ccm_init(&ccm);
822
823 ret = mbedtls_ccm_setkey(&ccm, MBEDTLS_CIPHER_ID_AES,
824 key, key_len * 8);
825 if (ret < 0) {
826 wpa_printf(MSG_ERROR, "mbedtls_ccm_setkey failed");
827 goto cleanup;
828 }
829
830 ret = mbedtls_ccm_encrypt_and_tag(&ccm, plain_len, nonce, 13, aad,
831 aad_len, plain, crypt, auth, M);
832
833 cleanup:
834 mbedtls_ccm_free(&ccm);
835
836 return ret;
837 }
838
aes_ccm_ad(const u8 * key,size_t key_len,const u8 * nonce,size_t M,const u8 * crypt,size_t crypt_len,const u8 * aad,size_t aad_len,const u8 * auth,u8 * plain)839 int aes_ccm_ad(const u8 *key, size_t key_len, const u8 *nonce,
840 size_t M, const u8 *crypt, size_t crypt_len,
841 const u8 *aad, size_t aad_len, const u8 *auth,
842 u8 *plain)
843 {
844 int ret;
845 mbedtls_ccm_context ccm;
846
847 mbedtls_ccm_init(&ccm);
848
849 ret = mbedtls_ccm_setkey(&ccm, MBEDTLS_CIPHER_ID_AES,
850 key, key_len * 8);
851 if (ret < 0) {
852 goto cleanup;;
853 }
854
855 ret = mbedtls_ccm_star_auth_decrypt(&ccm, crypt_len,
856 nonce, 13, aad, aad_len,
857 crypt, plain, auth, M);
858
859 cleanup:
860 mbedtls_ccm_free(&ccm);
861
862 return ret;
863 }
864 #endif
865
866 #ifdef MBEDTLS_CMAC_C
omac1_aes_vector(const u8 * key,size_t key_len,size_t num_elem,const u8 * addr[],const size_t * len,u8 * mac)867 int omac1_aes_vector(const u8 *key, size_t key_len, size_t num_elem,
868 const u8 *addr[], const size_t *len, u8 *mac)
869 {
870 const mbedtls_cipher_info_t *cipher_info;
871 int i, ret = 0;
872 mbedtls_cipher_type_t cipher_type;
873 mbedtls_cipher_context_t ctx;
874
875 switch (key_len) {
876 case 16:
877 cipher_type = MBEDTLS_CIPHER_AES_128_ECB;
878 break;
879 case 24:
880 cipher_type = MBEDTLS_CIPHER_AES_192_ECB;
881 break;
882 case 32:
883 cipher_type = MBEDTLS_CIPHER_AES_256_ECB;
884 break;
885 default:
886 cipher_type = MBEDTLS_CIPHER_NONE;
887 break;
888 }
889 cipher_info = mbedtls_cipher_info_from_type(cipher_type);
890 if (cipher_info == NULL) {
891 /* Failing at this point must be due to a build issue */
892 ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE;
893 goto cleanup;
894 }
895
896 if (key == NULL || mac == NULL) {
897 return -1;
898 }
899
900 mbedtls_cipher_init(&ctx);
901
902 ret = mbedtls_cipher_setup(&ctx, cipher_info);
903 if (ret != 0) {
904 goto cleanup;
905 }
906
907 ret = mbedtls_cipher_cmac_starts(&ctx, key, key_len * 8);
908 if (ret != 0) {
909 goto cleanup;
910 }
911
912 for (i = 0 ; i < num_elem; i++) {
913 ret = mbedtls_cipher_cmac_update(&ctx, addr[i], len[i]);
914 if (ret != 0) {
915 goto cleanup;
916 }
917 }
918
919 ret = mbedtls_cipher_cmac_finish(&ctx, mac);
920 cleanup:
921 mbedtls_cipher_free(&ctx);
922 return(ret);
923 }
924
omac1_aes_128_vector(const u8 * key,size_t num_elem,const u8 * addr[],const size_t * len,u8 * mac)925 int omac1_aes_128_vector(const u8 *key, size_t num_elem,
926 const u8 *addr[], const size_t *len, u8 *mac)
927 {
928 return omac1_aes_vector(key, 16, num_elem, addr, len, mac);
929 }
930
omac1_aes_128(const u8 * key,const u8 * data,size_t data_len,u8 * mac)931 int omac1_aes_128(const u8 *key, const u8 *data, size_t data_len, u8 *mac)
932 {
933 return omac1_aes_128_vector(key, 1, &data, &data_len, mac);
934 }
935 #endif
936
crypto_dh_init(u8 generator,const u8 * prime,size_t prime_len,u8 * privkey,u8 * pubkey)937 int crypto_dh_init(u8 generator, const u8 *prime, size_t prime_len, u8 *privkey,
938 u8 *pubkey)
939 {
940 size_t pubkey_len, pad;
941
942 if (os_get_random(privkey, prime_len) < 0) {
943 return -1;
944 }
945 if (os_memcmp(privkey, prime, prime_len) > 0) {
946 /* Make sure private value is smaller than prime */
947 privkey[0] = 0;
948 }
949
950 pubkey_len = prime_len;
951 if (crypto_mod_exp(&generator, 1, privkey, prime_len, prime, prime_len,
952 pubkey, &pubkey_len) < 0) {
953 return -1;
954 }
955 if (pubkey_len < prime_len) {
956 pad = prime_len - pubkey_len;
957 os_memmove(pubkey + pad, pubkey, pubkey_len);
958 os_memset(pubkey, 0, pad);
959 }
960
961 return 0;
962 }
963
crypto_global_init(void)964 int crypto_global_init(void)
965 {
966 return 0;
967 }
968
crypto_global_deinit(void)969 void crypto_global_deinit(void)
970 {
971 }
972