]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/wpa/src/crypto/crypto_wolfssl.c
Update hostapd/wpa_supplicant to 2.8 to fix multiple vulnerabilities.
[FreeBSD/FreeBSD.git] / contrib / wpa / src / crypto / crypto_wolfssl.c
1 /*
2  * Wrapper functions for libwolfssl
3  * Copyright (c) 2004-2017, Jouni Malinen <j@w1.fi>
4  *
5  * This software may be distributed under the terms of the BSD license.
6  * See README for more details.
7  */
8
9 #include "includes.h"
10
11 #include "common.h"
12 #include "crypto.h"
13
14 /* wolfSSL headers */
15 #include <wolfssl/options.h>
16 #include <wolfssl/wolfcrypt/md4.h>
17 #include <wolfssl/wolfcrypt/md5.h>
18 #include <wolfssl/wolfcrypt/sha.h>
19 #include <wolfssl/wolfcrypt/sha256.h>
20 #include <wolfssl/wolfcrypt/sha512.h>
21 #include <wolfssl/wolfcrypt/hmac.h>
22 #include <wolfssl/wolfcrypt/pwdbased.h>
23 #include <wolfssl/wolfcrypt/arc4.h>
24 #include <wolfssl/wolfcrypt/des3.h>
25 #include <wolfssl/wolfcrypt/aes.h>
26 #include <wolfssl/wolfcrypt/dh.h>
27 #include <wolfssl/wolfcrypt/cmac.h>
28 #include <wolfssl/wolfcrypt/ecc.h>
29 #include <wolfssl/openssl/bn.h>
30
31
32 #ifndef CONFIG_FIPS
33
34 int md4_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac)
35 {
36         Md4 md4;
37         size_t i;
38
39         if (TEST_FAIL())
40                 return -1;
41
42         wc_InitMd4(&md4);
43
44         for (i = 0; i < num_elem; i++)
45                 wc_Md4Update(&md4, addr[i], len[i]);
46
47         wc_Md4Final(&md4, mac);
48
49         return 0;
50 }
51
52
53 int md5_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac)
54 {
55         wc_Md5 md5;
56         size_t i;
57
58         if (TEST_FAIL())
59                 return -1;
60
61         wc_InitMd5(&md5);
62
63         for (i = 0; i < num_elem; i++)
64                 wc_Md5Update(&md5, addr[i], len[i]);
65
66         wc_Md5Final(&md5, mac);
67
68         return 0;
69 }
70
71 #endif /* CONFIG_FIPS */
72
73
74 int sha1_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac)
75 {
76         wc_Sha sha;
77         size_t i;
78
79         if (TEST_FAIL())
80                 return -1;
81
82         wc_InitSha(&sha);
83
84         for (i = 0; i < num_elem; i++)
85                 wc_ShaUpdate(&sha, addr[i], len[i]);
86
87         wc_ShaFinal(&sha, mac);
88
89         return 0;
90 }
91
92
93 #ifndef NO_SHA256_WRAPPER
94 int sha256_vector(size_t num_elem, const u8 *addr[], const size_t *len,
95                   u8 *mac)
96 {
97         wc_Sha256 sha256;
98         size_t i;
99
100         if (TEST_FAIL())
101                 return -1;
102
103         wc_InitSha256(&sha256);
104
105         for (i = 0; i < num_elem; i++)
106                 wc_Sha256Update(&sha256, addr[i], len[i]);
107
108         wc_Sha256Final(&sha256, mac);
109
110         return 0;
111 }
112 #endif /* NO_SHA256_WRAPPER */
113
114
115 #ifdef CONFIG_SHA384
116 int sha384_vector(size_t num_elem, const u8 *addr[], const size_t *len,
117                   u8 *mac)
118 {
119         wc_Sha384 sha384;
120         size_t i;
121
122         if (TEST_FAIL())
123                 return -1;
124
125         wc_InitSha384(&sha384);
126
127         for (i = 0; i < num_elem; i++)
128                 wc_Sha384Update(&sha384, addr[i], len[i]);
129
130         wc_Sha384Final(&sha384, mac);
131
132         return 0;
133 }
134 #endif /* CONFIG_SHA384 */
135
136
137 #ifdef CONFIG_SHA512
138 int sha512_vector(size_t num_elem, const u8 *addr[], const size_t *len,
139                   u8 *mac)
140 {
141         wc_Sha512 sha512;
142         size_t i;
143
144         if (TEST_FAIL())
145                 return -1;
146
147         wc_InitSha512(&sha512);
148
149         for (i = 0; i < num_elem; i++)
150                 wc_Sha512Update(&sha512, addr[i], len[i]);
151
152         wc_Sha512Final(&sha512, mac);
153
154         return 0;
155 }
156 #endif /* CONFIG_SHA512 */
157
158
159 static int wolfssl_hmac_vector(int type, const u8 *key,
160                                size_t key_len, size_t num_elem,
161                                const u8 *addr[], const size_t *len, u8 *mac,
162                                unsigned int mdlen)
163 {
164         Hmac hmac;
165         size_t i;
166
167         (void) mdlen;
168
169         if (TEST_FAIL())
170                 return -1;
171
172         if (wc_HmacSetKey(&hmac, type, key, (word32) key_len) != 0)
173                 return -1;
174         for (i = 0; i < num_elem; i++)
175                 if (wc_HmacUpdate(&hmac, addr[i], len[i]) != 0)
176                         return -1;
177         if (wc_HmacFinal(&hmac, mac) != 0)
178                 return -1;
179         return 0;
180 }
181
182
183 #ifndef CONFIG_FIPS
184
185 int hmac_md5_vector(const u8 *key, size_t key_len, size_t num_elem,
186                     const u8 *addr[], const size_t *len, u8 *mac)
187 {
188         return wolfssl_hmac_vector(WC_MD5, key, key_len, num_elem, addr, len,
189                                    mac, 16);
190 }
191
192
193 int hmac_md5(const u8 *key, size_t key_len, const u8 *data, size_t data_len,
194              u8 *mac)
195 {
196         return hmac_md5_vector(key, key_len, 1, &data, &data_len, mac);
197 }
198
199 #endif /* CONFIG_FIPS */
200
201
202 int hmac_sha1_vector(const u8 *key, size_t key_len, size_t num_elem,
203                      const u8 *addr[], const size_t *len, u8 *mac)
204 {
205         return wolfssl_hmac_vector(WC_SHA, key, key_len, num_elem, addr, len,
206                                    mac, 20);
207 }
208
209
210 int hmac_sha1(const u8 *key, size_t key_len, const u8 *data, size_t data_len,
211               u8 *mac)
212 {
213         return hmac_sha1_vector(key, key_len, 1, &data, &data_len, mac);
214 }
215
216
217 #ifdef CONFIG_SHA256
218
219 int hmac_sha256_vector(const u8 *key, size_t key_len, size_t num_elem,
220                        const u8 *addr[], const size_t *len, u8 *mac)
221 {
222         return wolfssl_hmac_vector(WC_SHA256, key, key_len, num_elem, addr, len,
223                                    mac, 32);
224 }
225
226
227 int hmac_sha256(const u8 *key, size_t key_len, const u8 *data,
228                 size_t data_len, u8 *mac)
229 {
230         return hmac_sha256_vector(key, key_len, 1, &data, &data_len, mac);
231 }
232
233 #endif /* CONFIG_SHA256 */
234
235
236 #ifdef CONFIG_SHA384
237
238 int hmac_sha384_vector(const u8 *key, size_t key_len, size_t num_elem,
239                        const u8 *addr[], const size_t *len, u8 *mac)
240 {
241         return wolfssl_hmac_vector(WC_SHA384, key, key_len, num_elem, addr, len,
242                                    mac, 48);
243 }
244
245
246 int hmac_sha384(const u8 *key, size_t key_len, const u8 *data,
247                 size_t data_len, u8 *mac)
248 {
249         return hmac_sha384_vector(key, key_len, 1, &data, &data_len, mac);
250 }
251
252 #endif /* CONFIG_SHA384 */
253
254
255 #ifdef CONFIG_SHA512
256
257 int hmac_sha512_vector(const u8 *key, size_t key_len, size_t num_elem,
258                        const u8 *addr[], const size_t *len, u8 *mac)
259 {
260         return wolfssl_hmac_vector(WC_SHA512, key, key_len, num_elem, addr, len,
261                                    mac, 64);
262 }
263
264
265 int hmac_sha512(const u8 *key, size_t key_len, const u8 *data,
266                 size_t data_len, u8 *mac)
267 {
268         return hmac_sha512_vector(key, key_len, 1, &data, &data_len, mac);
269 }
270
271 #endif /* CONFIG_SHA512 */
272
273
274 int pbkdf2_sha1(const char *passphrase, const u8 *ssid, size_t ssid_len,
275                 int iterations, u8 *buf, size_t buflen)
276 {
277         if (wc_PBKDF2(buf, (const byte*)passphrase, os_strlen(passphrase), ssid,
278                       ssid_len, iterations, buflen, WC_SHA) != 0)
279                 return -1;
280         return 0;
281 }
282
283
284 #ifdef CONFIG_DES
285 int des_encrypt(const u8 *clear, const u8 *key, u8 *cypher)
286 {
287         Des des;
288         u8  pkey[8], next, tmp;
289         int i;
290
291         /* Add parity bits to the key */
292         next = 0;
293         for (i = 0; i < 7; i++) {
294                 tmp = key[i];
295                 pkey[i] = (tmp >> i) | next | 1;
296                 next = tmp << (7 - i);
297         }
298         pkey[i] = next | 1;
299
300         wc_Des_SetKey(&des, pkey, NULL, DES_ENCRYPTION);
301         wc_Des_EcbEncrypt(&des, cypher, clear, DES_BLOCK_SIZE);
302
303         return 0;
304 }
305 #endif /* CONFIG_DES */
306
307
308 void * aes_encrypt_init(const u8 *key, size_t len)
309 {
310         Aes *aes;
311
312         if (TEST_FAIL())
313                 return NULL;
314
315         aes = os_malloc(sizeof(Aes));
316         if (!aes)
317                 return NULL;
318
319         if (wc_AesSetKey(aes, key, len, NULL, AES_ENCRYPTION) < 0) {
320                 os_free(aes);
321                 return NULL;
322         }
323
324         return aes;
325 }
326
327
328 int aes_encrypt(void *ctx, const u8 *plain, u8 *crypt)
329 {
330         wc_AesEncryptDirect(ctx, crypt, plain);
331         return 0;
332 }
333
334
335 void aes_encrypt_deinit(void *ctx)
336 {
337         os_free(ctx);
338 }
339
340
341 void * aes_decrypt_init(const u8 *key, size_t len)
342 {
343         Aes *aes;
344
345         if (TEST_FAIL())
346                 return NULL;
347
348         aes = os_malloc(sizeof(Aes));
349         if (!aes)
350                 return NULL;
351
352         if (wc_AesSetKey(aes, key, len, NULL, AES_DECRYPTION) < 0) {
353                 os_free(aes);
354                 return NULL;
355         }
356
357         return aes;
358 }
359
360
361 int aes_decrypt(void *ctx, const u8 *crypt, u8 *plain)
362 {
363         wc_AesDecryptDirect(ctx, plain, crypt);
364         return 0;
365 }
366
367
368 void aes_decrypt_deinit(void *ctx)
369 {
370         os_free(ctx);
371 }
372
373
374 int aes_128_cbc_encrypt(const u8 *key, const u8 *iv, u8 *data, size_t data_len)
375 {
376         Aes aes;
377         int ret;
378
379         if (TEST_FAIL())
380                 return -1;
381
382         ret = wc_AesSetKey(&aes, key, 16, iv, AES_ENCRYPTION);
383         if (ret != 0)
384                 return -1;
385
386         ret = wc_AesCbcEncrypt(&aes, data, data, data_len);
387         if (ret != 0)
388                 return -1;
389         return 0;
390 }
391
392
393 int aes_128_cbc_decrypt(const u8 *key, const u8 *iv, u8 *data, size_t data_len)
394 {
395         Aes aes;
396         int ret;
397
398         if (TEST_FAIL())
399                 return -1;
400
401         ret = wc_AesSetKey(&aes, key, 16, iv, AES_DECRYPTION);
402         if (ret != 0)
403                 return -1;
404
405         ret = wc_AesCbcDecrypt(&aes, data, data, data_len);
406         if (ret != 0)
407                 return -1;
408         return 0;
409 }
410
411
412 int aes_wrap(const u8 *kek, size_t kek_len, int n, const u8 *plain, u8 *cipher)
413 {
414         int ret;
415
416         if (TEST_FAIL())
417                 return -1;
418
419         ret = wc_AesKeyWrap(kek, kek_len, plain, n * 8, cipher, (n + 1) * 8,
420                             NULL);
421         return ret != (n + 1) * 8 ? -1 : 0;
422 }
423
424
425 int aes_unwrap(const u8 *kek, size_t kek_len, int n, const u8 *cipher,
426                u8 *plain)
427 {
428         int ret;
429
430         if (TEST_FAIL())
431                 return -1;
432
433         ret = wc_AesKeyUnWrap(kek, kek_len, cipher, (n + 1) * 8, plain, n * 8,
434                               NULL);
435         return ret != n * 8 ? -1 : 0;
436 }
437
438
439 #ifndef CONFIG_NO_RC4
440 int rc4_skip(const u8 *key, size_t keylen, size_t skip, u8 *data,
441              size_t data_len)
442 {
443 #ifndef NO_RC4
444         Arc4 arc4;
445         unsigned char skip_buf[16];
446
447         wc_Arc4SetKey(&arc4, key, keylen);
448
449         while (skip >= sizeof(skip_buf)) {
450                 size_t len = skip;
451
452                 if (len > sizeof(skip_buf))
453                         len = sizeof(skip_buf);
454                 wc_Arc4Process(&arc4, skip_buf, skip_buf, len);
455                 skip -= len;
456         }
457
458         wc_Arc4Process(&arc4, data, data, data_len);
459
460         return 0;
461 #else /* NO_RC4 */
462         return -1;
463 #endif /* NO_RC4 */
464 }
465 #endif /* CONFIG_NO_RC4 */
466
467
468 #if defined(EAP_IKEV2) || defined(EAP_IKEV2_DYNAMIC) \
469                        || defined(EAP_SERVER_IKEV2)
470 union wolfssl_cipher {
471         Aes aes;
472         Des3 des3;
473         Arc4 arc4;
474 };
475
476 struct crypto_cipher {
477         enum crypto_cipher_alg alg;
478         union wolfssl_cipher enc;
479         union wolfssl_cipher dec;
480 };
481
482 struct crypto_cipher * crypto_cipher_init(enum crypto_cipher_alg alg,
483                                           const u8 *iv, const u8 *key,
484                                           size_t key_len)
485 {
486         struct crypto_cipher *ctx;
487
488         ctx = os_zalloc(sizeof(*ctx));
489         if (!ctx)
490                 return NULL;
491
492         switch (alg) {
493 #ifndef CONFIG_NO_RC4
494 #ifndef NO_RC4
495         case CRYPTO_CIPHER_ALG_RC4:
496                 wc_Arc4SetKey(&ctx->enc.arc4, key, key_len);
497                 wc_Arc4SetKey(&ctx->dec.arc4, key, key_len);
498                 break;
499 #endif /* NO_RC4 */
500 #endif /* CONFIG_NO_RC4 */
501 #ifndef NO_AES
502         case CRYPTO_CIPHER_ALG_AES:
503                 switch (key_len) {
504                 case 16:
505                 case 24:
506                 case 32:
507                         break;
508                 default:
509                         os_free(ctx);
510                         return NULL;
511                 }
512                 if (wc_AesSetKey(&ctx->enc.aes, key, key_len, iv,
513                                  AES_ENCRYPTION) ||
514                     wc_AesSetKey(&ctx->dec.aes, key, key_len, iv,
515                                  AES_DECRYPTION)) {
516                         os_free(ctx);
517                         return NULL;
518                 }
519                 break;
520 #endif /* NO_AES */
521 #ifndef NO_DES3
522         case CRYPTO_CIPHER_ALG_3DES:
523                 if (key_len != DES3_KEYLEN ||
524                     wc_Des3_SetKey(&ctx->enc.des3, key, iv, DES_ENCRYPTION) ||
525                     wc_Des3_SetKey(&ctx->dec.des3, key, iv, DES_DECRYPTION)) {
526                         os_free(ctx);
527                         return NULL;
528                 }
529                 break;
530 #endif /* NO_DES3 */
531         case CRYPTO_CIPHER_ALG_RC2:
532         case CRYPTO_CIPHER_ALG_DES:
533         default:
534                 os_free(ctx);
535                 return NULL;
536         }
537
538         ctx->alg = alg;
539
540         return ctx;
541 }
542
543
544 int crypto_cipher_encrypt(struct crypto_cipher *ctx, const u8 *plain,
545                           u8 *crypt, size_t len)
546 {
547         switch (ctx->alg) {
548 #ifndef CONFIG_NO_RC4
549 #ifndef NO_RC4
550         case CRYPTO_CIPHER_ALG_RC4:
551                 wc_Arc4Process(&ctx->enc.arc4, crypt, plain, len);
552                 return 0;
553 #endif /* NO_RC4 */
554 #endif /* CONFIG_NO_RC4 */
555 #ifndef NO_AES
556         case CRYPTO_CIPHER_ALG_AES:
557                 if (wc_AesCbcEncrypt(&ctx->enc.aes, crypt, plain, len) != 0)
558                         return -1;
559                 return 0;
560 #endif /* NO_AES */
561 #ifndef NO_DES3
562         case CRYPTO_CIPHER_ALG_3DES:
563                 if (wc_Des3_CbcEncrypt(&ctx->enc.des3, crypt, plain, len) != 0)
564                         return -1;
565                 return 0;
566 #endif /* NO_DES3 */
567         default:
568                 return -1;
569         }
570         return -1;
571 }
572
573
574 int crypto_cipher_decrypt(struct crypto_cipher *ctx, const u8 *crypt,
575                           u8 *plain, size_t len)
576 {
577         switch (ctx->alg) {
578 #ifndef CONFIG_NO_RC4
579 #ifndef NO_RC4
580         case CRYPTO_CIPHER_ALG_RC4:
581                 wc_Arc4Process(&ctx->dec.arc4, plain, crypt, len);
582                 return 0;
583 #endif /* NO_RC4 */
584 #endif /* CONFIG_NO_RC4 */
585 #ifndef NO_AES
586         case CRYPTO_CIPHER_ALG_AES:
587                 if (wc_AesCbcDecrypt(&ctx->dec.aes, plain, crypt, len) != 0)
588                         return -1;
589                 return 0;
590 #endif /* NO_AES */
591 #ifndef NO_DES3
592         case CRYPTO_CIPHER_ALG_3DES:
593                 if (wc_Des3_CbcDecrypt(&ctx->dec.des3, plain, crypt, len) != 0)
594                         return -1;
595                 return 0;
596 #endif /* NO_DES3 */
597         default:
598                 return -1;
599         }
600         return -1;
601 }
602
603
604 void crypto_cipher_deinit(struct crypto_cipher *ctx)
605 {
606         os_free(ctx);
607 }
608
609 #endif
610
611
612 #ifdef CONFIG_WPS_NFC
613
614 static const unsigned char RFC3526_PRIME_1536[] = {
615         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2,
616         0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
617         0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6,
618         0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
619         0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D,
620         0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
621         0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9,
622         0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
623         0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11,
624         0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
625         0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36,
626         0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
627         0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56,
628         0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
629         0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08,
630         0xCA, 0x23, 0x73, 0x27, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
631 };
632
633 static const unsigned char RFC3526_GENERATOR_1536[] = {
634         0x02
635 };
636
637 #define RFC3526_LEN sizeof(RFC3526_PRIME_1536)
638
639
640 void * dh5_init(struct wpabuf **priv, struct wpabuf **publ)
641 {
642         WC_RNG rng;
643         DhKey *ret = NULL;
644         DhKey *dh = NULL;
645         struct wpabuf *privkey = NULL;
646         struct wpabuf *pubkey = NULL;
647         word32 priv_sz, pub_sz;
648
649         *priv = NULL;
650         wpabuf_free(*publ);
651         *publ = NULL;
652
653         dh = XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_TMP_BUFFER);
654         if (!dh)
655                 return NULL;
656         wc_InitDhKey(dh);
657
658         if (wc_InitRng(&rng) != 0) {
659                 XFREE(dh, NULL, DYNAMIC_TYPE_TMP_BUFFER);
660                 return NULL;
661         }
662
663         privkey = wpabuf_alloc(RFC3526_LEN);
664         pubkey = wpabuf_alloc(RFC3526_LEN);
665         if (!privkey || !pubkey)
666                 goto done;
667
668         if (wc_DhSetKey(dh, RFC3526_PRIME_1536, sizeof(RFC3526_PRIME_1536),
669                         RFC3526_GENERATOR_1536, sizeof(RFC3526_GENERATOR_1536))
670             != 0)
671                 goto done;
672
673         if (wc_DhGenerateKeyPair(dh, &rng, wpabuf_mhead(privkey), &priv_sz,
674                                  wpabuf_mhead(pubkey), &pub_sz) != 0)
675                 goto done;
676
677         wpabuf_put(privkey, priv_sz);
678         wpabuf_put(pubkey, pub_sz);
679
680         ret = dh;
681         *priv = privkey;
682         *publ = pubkey;
683         dh = NULL;
684         privkey = NULL;
685         pubkey = NULL;
686 done:
687         wpabuf_clear_free(pubkey);
688         wpabuf_clear_free(privkey);
689         if (dh) {
690                 wc_FreeDhKey(dh);
691                 XFREE(dh, NULL, DYNAMIC_TYPE_TMP_BUFFER);
692         }
693         wc_FreeRng(&rng);
694         return ret;
695 }
696
697
698 void * dh5_init_fixed(const struct wpabuf *priv, const struct wpabuf *publ)
699 {
700         DhKey *ret = NULL;
701         DhKey *dh;
702         byte *secret;
703         word32 secret_sz;
704
705         dh = XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_TMP_BUFFER);
706         if (!dh)
707                 return NULL;
708         wc_InitDhKey(dh);
709
710         secret = XMALLOC(RFC3526_LEN, NULL, DYNAMIC_TYPE_TMP_BUFFER);
711         if (!secret)
712                 goto done;
713
714         if (wc_DhSetKey(dh, RFC3526_PRIME_1536, sizeof(RFC3526_PRIME_1536),
715                         RFC3526_GENERATOR_1536, sizeof(RFC3526_GENERATOR_1536))
716             != 0)
717                 goto done;
718
719         if (wc_DhAgree(dh, secret, &secret_sz, wpabuf_head(priv),
720                        wpabuf_len(priv), RFC3526_GENERATOR_1536,
721                        sizeof(RFC3526_GENERATOR_1536)) != 0)
722                 goto done;
723
724         if (secret_sz != wpabuf_len(publ) ||
725             os_memcmp(secret, wpabuf_head(publ), secret_sz) != 0)
726                 goto done;
727
728         ret = dh;
729         dh = NULL;
730 done:
731         if (dh) {
732                 wc_FreeDhKey(dh);
733                 XFREE(dh, NULL, DYNAMIC_TYPE_TMP_BUFFER);
734         }
735         XFREE(secret, NULL, DYNAMIC_TYPE_TMP_BUFFER);
736         return ret;
737 }
738
739
740 struct wpabuf * dh5_derive_shared(void *ctx, const struct wpabuf *peer_public,
741                                   const struct wpabuf *own_private)
742 {
743         struct wpabuf *ret = NULL;
744         struct wpabuf *secret;
745         word32 secret_sz;
746
747         secret = wpabuf_alloc(RFC3526_LEN);
748         if (!secret)
749                 goto done;
750
751         if (wc_DhAgree(ctx, wpabuf_mhead(secret), &secret_sz,
752                        wpabuf_head(own_private), wpabuf_len(own_private),
753                        wpabuf_head(peer_public), wpabuf_len(peer_public)) != 0)
754                 goto done;
755
756         wpabuf_put(secret, secret_sz);
757
758         ret = secret;
759         secret = NULL;
760 done:
761         wpabuf_clear_free(secret);
762         return ret;
763 }
764
765
766 void dh5_free(void *ctx)
767 {
768         if (!ctx)
769                 return;
770
771         wc_FreeDhKey(ctx);
772         XFREE(ctx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
773 }
774
775 #endif /* CONFIG_WPS_NFC */
776
777
778 int crypto_dh_init(u8 generator, const u8 *prime, size_t prime_len, u8 *privkey,
779                    u8 *pubkey)
780 {
781         int ret = -1;
782         WC_RNG rng;
783         DhKey *dh = NULL;
784         word32 priv_sz, pub_sz;
785
786         if (TEST_FAIL())
787                 return -1;
788
789         dh = os_malloc(sizeof(DhKey));
790         if (!dh)
791                 return -1;
792         wc_InitDhKey(dh);
793
794         if (wc_InitRng(&rng) != 0) {
795                 os_free(dh);
796                 return -1;
797         }
798
799         if (wc_DhSetKey(dh, prime, prime_len, &generator, 1) != 0)
800                 goto done;
801
802         if (wc_DhGenerateKeyPair(dh, &rng, privkey, &priv_sz, pubkey, &pub_sz)
803             != 0)
804                 goto done;
805
806         if (priv_sz < prime_len) {
807                 size_t pad_sz = prime_len - priv_sz;
808
809                 os_memmove(privkey + pad_sz, privkey, priv_sz);
810                 os_memset(privkey, 0, pad_sz);
811         }
812
813         if (pub_sz < prime_len) {
814                 size_t pad_sz = prime_len - pub_sz;
815
816                 os_memmove(pubkey + pad_sz, pubkey, pub_sz);
817                 os_memset(pubkey, 0, pad_sz);
818         }
819         ret = 0;
820 done:
821         wc_FreeDhKey(dh);
822         os_free(dh);
823         wc_FreeRng(&rng);
824         return ret;
825 }
826
827
828 int crypto_dh_derive_secret(u8 generator, const u8 *prime, size_t prime_len,
829                             const u8 *order, size_t order_len,
830                             const u8 *privkey, size_t privkey_len,
831                             const u8 *pubkey, size_t pubkey_len,
832                             u8 *secret, size_t *len)
833 {
834         int ret = -1;
835         DhKey *dh;
836         word32 secret_sz;
837
838         dh = os_malloc(sizeof(DhKey));
839         if (!dh)
840                 return -1;
841         wc_InitDhKey(dh);
842
843         if (wc_DhSetKey(dh, prime, prime_len, &generator, 1) != 0)
844                 goto done;
845
846         if (wc_DhAgree(dh, secret, &secret_sz, privkey, privkey_len, pubkey,
847                        pubkey_len) != 0)
848                 goto done;
849
850         *len = secret_sz;
851         ret = 0;
852 done:
853         wc_FreeDhKey(dh);
854         os_free(dh);
855         return ret;
856 }
857
858
859 #ifdef CONFIG_FIPS
860 int crypto_get_random(void *buf, size_t len)
861 {
862         int ret = 0;
863         WC_RNG rng;
864
865         if (wc_InitRng(&rng) != 0)
866                 return -1;
867         if (wc_RNG_GenerateBlock(&rng, buf, len) != 0)
868                 ret = -1;
869         wc_FreeRng(&rng);
870         return ret;
871 }
872 #endif /* CONFIG_FIPS */
873
874
875 #if defined(EAP_PWD) || defined(EAP_SERVER_PWD)
876 struct crypto_hash {
877         Hmac hmac;
878         int size;
879 };
880
881
882 struct crypto_hash * crypto_hash_init(enum crypto_hash_alg alg, const u8 *key,
883                                       size_t key_len)
884 {
885         struct crypto_hash *ret = NULL;
886         struct crypto_hash *hash;
887         int type;
888
889         hash = os_zalloc(sizeof(*hash));
890         if (!hash)
891                 goto done;
892
893         switch (alg) {
894 #ifndef NO_MD5
895         case CRYPTO_HASH_ALG_HMAC_MD5:
896                 hash->size = 16;
897                 type = WC_MD5;
898                 break;
899 #endif /* NO_MD5 */
900 #ifndef NO_SHA
901         case CRYPTO_HASH_ALG_HMAC_SHA1:
902                 type = WC_SHA;
903                 hash->size = 20;
904                 break;
905 #endif /* NO_SHA */
906 #ifdef CONFIG_SHA256
907 #ifndef NO_SHA256
908         case CRYPTO_HASH_ALG_HMAC_SHA256:
909                 type = WC_SHA256;
910                 hash->size = 32;
911                 break;
912 #endif /* NO_SHA256 */
913 #endif /* CONFIG_SHA256 */
914         default:
915                 goto done;
916         }
917
918         if (wc_HmacSetKey(&hash->hmac, type, key, key_len) != 0)
919                 goto done;
920
921         ret = hash;
922         hash = NULL;
923 done:
924         os_free(hash);
925         return ret;
926 }
927
928
929 void crypto_hash_update(struct crypto_hash *ctx, const u8 *data, size_t len)
930 {
931         if (!ctx)
932                 return;
933         wc_HmacUpdate(&ctx->hmac, data, len);
934 }
935
936
937 int crypto_hash_finish(struct crypto_hash *ctx, u8 *mac, size_t *len)
938 {
939         int ret = 0;
940
941         if (!ctx)
942                 return -2;
943
944         if (!mac || !len)
945                 goto done;
946
947         if (wc_HmacFinal(&ctx->hmac, mac) != 0) {
948                 ret = -1;
949                 goto done;
950         }
951
952         *len = ctx->size;
953         ret = 0;
954 done:
955         bin_clear_free(ctx, sizeof(*ctx));
956         if (TEST_FAIL())
957                 return -1;
958         return ret;
959 }
960
961 #endif
962
963
964 int omac1_aes_vector(const u8 *key, size_t key_len, size_t num_elem,
965                      const u8 *addr[], const size_t *len, u8 *mac)
966 {
967         Cmac cmac;
968         size_t i;
969         word32 sz;
970
971         if (TEST_FAIL())
972                 return -1;
973
974         if (wc_InitCmac(&cmac, key, key_len, WC_CMAC_AES, NULL) != 0)
975                 return -1;
976
977         for (i = 0; i < num_elem; i++)
978                 if (wc_CmacUpdate(&cmac, addr[i], len[i]) != 0)
979                         return -1;
980
981         sz = AES_BLOCK_SIZE;
982         if (wc_CmacFinal(&cmac, mac, &sz) != 0 || sz != AES_BLOCK_SIZE)
983                 return -1;
984
985         return 0;
986 }
987
988
989 int omac1_aes_128_vector(const u8 *key, size_t num_elem,
990                          const u8 *addr[], const size_t *len, u8 *mac)
991 {
992         return omac1_aes_vector(key, 16, num_elem, addr, len, mac);
993 }
994
995
996 int omac1_aes_128(const u8 *key, const u8 *data, size_t data_len, u8 *mac)
997 {
998         return omac1_aes_128_vector(key, 1, &data, &data_len, mac);
999 }
1000
1001
1002 int omac1_aes_256(const u8 *key, const u8 *data, size_t data_len, u8 *mac)
1003 {
1004         return omac1_aes_vector(key, 32, 1, &data, &data_len, mac);
1005 }
1006
1007
1008 struct crypto_bignum * crypto_bignum_init(void)
1009 {
1010         mp_int *a;
1011
1012         if (TEST_FAIL())
1013                 return NULL;
1014
1015         a = os_malloc(sizeof(*a));
1016         if (!a || mp_init(a) != MP_OKAY) {
1017                 os_free(a);
1018                 a = NULL;
1019         }
1020
1021         return (struct crypto_bignum *) a;
1022 }
1023
1024
1025 struct crypto_bignum * crypto_bignum_init_set(const u8 *buf, size_t len)
1026 {
1027         mp_int *a;
1028
1029         if (TEST_FAIL())
1030                 return NULL;
1031
1032         a = (mp_int *) crypto_bignum_init();
1033         if (!a)
1034                 return NULL;
1035
1036         if (mp_read_unsigned_bin(a, buf, len) != MP_OKAY) {
1037                 os_free(a);
1038                 a = NULL;
1039         }
1040
1041         return (struct crypto_bignum *) a;
1042 }
1043
1044
1045 void crypto_bignum_deinit(struct crypto_bignum *n, int clear)
1046 {
1047         if (!n)
1048                 return;
1049
1050         if (clear)
1051                 mp_forcezero((mp_int *) n);
1052         mp_clear((mp_int *) n);
1053         os_free((mp_int *) n);
1054 }
1055
1056
1057 int crypto_bignum_to_bin(const struct crypto_bignum *a,
1058                          u8 *buf, size_t buflen, size_t padlen)
1059 {
1060         int num_bytes, offset;
1061
1062         if (TEST_FAIL())
1063                 return -1;
1064
1065         if (padlen > buflen)
1066                 return -1;
1067
1068         num_bytes = (mp_count_bits((mp_int *) a) + 7) / 8;
1069         if ((size_t) num_bytes > buflen)
1070                 return -1;
1071         if (padlen > (size_t) num_bytes)
1072                 offset = padlen - num_bytes;
1073         else
1074                 offset = 0;
1075
1076         os_memset(buf, 0, offset);
1077         mp_to_unsigned_bin((mp_int *) a, buf + offset);
1078
1079         return num_bytes + offset;
1080 }
1081
1082
1083 int crypto_bignum_rand(struct crypto_bignum *r, const struct crypto_bignum *m)
1084 {
1085         int ret = 0;
1086         WC_RNG rng;
1087
1088         if (TEST_FAIL())
1089                 return -1;
1090         if (wc_InitRng(&rng) != 0)
1091                 return -1;
1092         if (mp_rand_prime((mp_int *) r,
1093                           (mp_count_bits((mp_int *) m) + 7) / 8 * 2,
1094                           &rng, NULL) != 0)
1095                 ret = -1;
1096         if (ret == 0 &&
1097             mp_mod((mp_int *) r, (mp_int *) m, (mp_int *) r) != 0)
1098                 ret = -1;
1099         wc_FreeRng(&rng);
1100         return ret;
1101 }
1102
1103
1104 int crypto_bignum_add(const struct crypto_bignum *a,
1105                       const struct crypto_bignum *b,
1106                       struct crypto_bignum *r)
1107 {
1108         return mp_add((mp_int *) a, (mp_int *) b,
1109                       (mp_int *) r) == MP_OKAY ? 0 : -1;
1110 }
1111
1112
1113 int crypto_bignum_mod(const struct crypto_bignum *a,
1114                       const struct crypto_bignum *m,
1115                       struct crypto_bignum *r)
1116 {
1117         return mp_mod((mp_int *) a, (mp_int *) m,
1118                       (mp_int *) r) == MP_OKAY ? 0 : -1;
1119 }
1120
1121
1122 int crypto_bignum_exptmod(const struct crypto_bignum *b,
1123                           const struct crypto_bignum *e,
1124                           const struct crypto_bignum *m,
1125                           struct crypto_bignum *r)
1126 {
1127         if (TEST_FAIL())
1128                 return -1;
1129
1130         return mp_exptmod((mp_int *) b, (mp_int *) e, (mp_int *) m,
1131                           (mp_int *) r) == MP_OKAY ?  0 : -1;
1132 }
1133
1134
1135 int crypto_bignum_inverse(const struct crypto_bignum *a,
1136                           const struct crypto_bignum *m,
1137                           struct crypto_bignum *r)
1138 {
1139         if (TEST_FAIL())
1140                 return -1;
1141
1142         return mp_invmod((mp_int *) a, (mp_int *) m,
1143                          (mp_int *) r) == MP_OKAY ? 0 : -1;
1144 }
1145
1146
1147 int crypto_bignum_sub(const struct crypto_bignum *a,
1148                       const struct crypto_bignum *b,
1149                       struct crypto_bignum *r)
1150 {
1151         if (TEST_FAIL())
1152                 return -1;
1153
1154         return mp_add((mp_int *) a, (mp_int *) b,
1155                       (mp_int *) r) == MP_OKAY ? 0 : -1;
1156 }
1157
1158
1159 int crypto_bignum_div(const struct crypto_bignum *a,
1160                       const struct crypto_bignum *b,
1161                       struct crypto_bignum *d)
1162 {
1163         if (TEST_FAIL())
1164                 return -1;
1165
1166         return mp_div((mp_int *) a, (mp_int *) b, (mp_int *) d,
1167                       NULL) == MP_OKAY ? 0 : -1;
1168 }
1169
1170
1171 int crypto_bignum_mulmod(const struct crypto_bignum *a,
1172                          const struct crypto_bignum *b,
1173                          const struct crypto_bignum *m,
1174                          struct crypto_bignum *d)
1175 {
1176         if (TEST_FAIL())
1177                 return -1;
1178
1179         return mp_mulmod((mp_int *) a, (mp_int *) b, (mp_int *) m,
1180                          (mp_int *) d) == MP_OKAY ?  0 : -1;
1181 }
1182
1183
1184 int crypto_bignum_rshift(const struct crypto_bignum *a, int n,
1185                          struct crypto_bignum *r)
1186 {
1187         if (mp_copy((mp_int *) a, (mp_int *) r) != MP_OKAY)
1188                 return -1;
1189         mp_rshb((mp_int *) r, n);
1190         return 0;
1191 }
1192
1193
1194 int crypto_bignum_cmp(const struct crypto_bignum *a,
1195                       const struct crypto_bignum *b)
1196 {
1197         return mp_cmp((mp_int *) a, (mp_int *) b);
1198 }
1199
1200
1201 int crypto_bignum_bits(const struct crypto_bignum *a)
1202 {
1203         return mp_count_bits((mp_int *) a);
1204 }
1205
1206
1207 int crypto_bignum_is_zero(const struct crypto_bignum *a)
1208 {
1209         return mp_iszero((mp_int *) a);
1210 }
1211
1212
1213 int crypto_bignum_is_one(const struct crypto_bignum *a)
1214 {
1215         return mp_isone((const mp_int *) a);
1216 }
1217
1218 int crypto_bignum_is_odd(const struct crypto_bignum *a)
1219 {
1220         return mp_isodd((mp_int *) a);
1221 }
1222
1223
1224 int crypto_bignum_legendre(const struct crypto_bignum *a,
1225                            const struct crypto_bignum *p)
1226 {
1227         mp_int t;
1228         int ret;
1229         int res = -2;
1230
1231         if (TEST_FAIL())
1232                 return -2;
1233
1234         if (mp_init(&t) != MP_OKAY)
1235                 return -2;
1236
1237         /* t = (p-1) / 2 */
1238         ret = mp_sub_d((mp_int *) p, 1, &t);
1239         if (ret == MP_OKAY)
1240                 mp_rshb(&t, 1);
1241         if (ret == MP_OKAY)
1242                 ret = mp_exptmod((mp_int *) a, &t, (mp_int *) p, &t);
1243         if (ret == MP_OKAY) {
1244                 if (mp_isone(&t))
1245                         res = 1;
1246                 else if (mp_iszero(&t))
1247                         res = 0;
1248                 else
1249                         res = -1;
1250         }
1251
1252         mp_clear(&t);
1253         return res;
1254 }
1255
1256
1257 #ifdef CONFIG_ECC
1258
1259 int ecc_map(ecc_point *, mp_int *, mp_digit);
1260 int ecc_projective_add_point(ecc_point *P, ecc_point *Q, ecc_point *R,
1261                              mp_int *a, mp_int *modulus, mp_digit mp);
1262
1263 struct crypto_ec {
1264         ecc_key key;
1265         mp_int a;
1266         mp_int prime;
1267         mp_int order;
1268         mp_digit mont_b;
1269         mp_int b;
1270 };
1271
1272
1273 struct crypto_ec * crypto_ec_init(int group)
1274 {
1275         int built = 0;
1276         struct crypto_ec *e;
1277         int curve_id;
1278
1279         /* Map from IANA registry for IKE D-H groups to OpenSSL NID */
1280         switch (group) {
1281         case 19:
1282                 curve_id = ECC_SECP256R1;
1283                 break;
1284         case 20:
1285                 curve_id = ECC_SECP384R1;
1286                 break;
1287         case 21:
1288                 curve_id = ECC_SECP521R1;
1289                 break;
1290         case 25:
1291                 curve_id = ECC_SECP192R1;
1292                 break;
1293         case 26:
1294                 curve_id = ECC_SECP224R1;
1295                 break;
1296 #ifdef HAVE_ECC_BRAINPOOL
1297         case 27:
1298                 curve_id = ECC_BRAINPOOLP224R1;
1299                 break;
1300         case 28:
1301                 curve_id = ECC_BRAINPOOLP256R1;
1302                 break;
1303         case 29:
1304                 curve_id = ECC_BRAINPOOLP384R1;
1305                 break;
1306         case 30:
1307                 curve_id = ECC_BRAINPOOLP512R1;
1308                 break;
1309 #endif /* HAVE_ECC_BRAINPOOL */
1310         default:
1311                 return NULL;
1312         }
1313
1314         e = os_zalloc(sizeof(*e));
1315         if (!e)
1316                 return NULL;
1317
1318         if (wc_ecc_init(&e->key) != 0 ||
1319             wc_ecc_set_curve(&e->key, 0, curve_id) != 0 ||
1320             mp_init(&e->a) != MP_OKAY ||
1321             mp_init(&e->prime) != MP_OKAY ||
1322             mp_init(&e->order) != MP_OKAY ||
1323             mp_init(&e->b) != MP_OKAY ||
1324             mp_read_radix(&e->a, e->key.dp->Af, 16) != MP_OKAY ||
1325             mp_read_radix(&e->b, e->key.dp->Bf, 16) != MP_OKAY ||
1326             mp_read_radix(&e->prime, e->key.dp->prime, 16) != MP_OKAY ||
1327             mp_read_radix(&e->order, e->key.dp->order, 16) != MP_OKAY ||
1328             mp_montgomery_setup(&e->prime, &e->mont_b) != MP_OKAY)
1329                 goto done;
1330
1331         built = 1;
1332 done:
1333         if (!built) {
1334                 crypto_ec_deinit(e);
1335                 e = NULL;
1336         }
1337         return e;
1338 }
1339
1340
1341 void crypto_ec_deinit(struct crypto_ec* e)
1342 {
1343         if (!e)
1344                 return;
1345
1346         mp_clear(&e->b);
1347         mp_clear(&e->order);
1348         mp_clear(&e->prime);
1349         mp_clear(&e->a);
1350         wc_ecc_free(&e->key);
1351         os_free(e);
1352 }
1353
1354
1355 struct crypto_ec_point * crypto_ec_point_init(struct crypto_ec *e)
1356 {
1357         if (TEST_FAIL())
1358                 return NULL;
1359         if (!e)
1360                 return NULL;
1361         return (struct crypto_ec_point *) wc_ecc_new_point();
1362 }
1363
1364
1365 size_t crypto_ec_prime_len(struct crypto_ec *e)
1366 {
1367         return (mp_count_bits(&e->prime) + 7) / 8;
1368 }
1369
1370
1371 size_t crypto_ec_prime_len_bits(struct crypto_ec *e)
1372 {
1373         return mp_count_bits(&e->prime);
1374 }
1375
1376
1377 size_t crypto_ec_order_len(struct crypto_ec *e)
1378 {
1379         return (mp_count_bits(&e->order) + 7) / 8;
1380 }
1381
1382
1383 const struct crypto_bignum * crypto_ec_get_prime(struct crypto_ec *e)
1384 {
1385         return (const struct crypto_bignum *) &e->prime;
1386 }
1387
1388
1389 const struct crypto_bignum * crypto_ec_get_order(struct crypto_ec *e)
1390 {
1391         return (const struct crypto_bignum *) &e->order;
1392 }
1393
1394
1395 void crypto_ec_point_deinit(struct crypto_ec_point *p, int clear)
1396 {
1397         ecc_point *point = (ecc_point *) p;
1398
1399         if (!p)
1400                 return;
1401
1402         if (clear) {
1403                 mp_forcezero(point->x);
1404                 mp_forcezero(point->y);
1405                 mp_forcezero(point->z);
1406         }
1407         wc_ecc_del_point(point);
1408 }
1409
1410
1411 int crypto_ec_point_x(struct crypto_ec *e, const struct crypto_ec_point *p,
1412                       struct crypto_bignum *x)
1413 {
1414         return mp_copy(((ecc_point *) p)->x, (mp_int *) x) == MP_OKAY ? 0 : -1;
1415 }
1416
1417
1418 int crypto_ec_point_to_bin(struct crypto_ec *e,
1419                            const struct crypto_ec_point *point, u8 *x, u8 *y)
1420 {
1421         ecc_point *p = (ecc_point *) point;
1422
1423         if (TEST_FAIL())
1424                 return -1;
1425
1426         if (!mp_isone(p->z)) {
1427                 if (ecc_map(p, &e->prime, e->mont_b) != MP_OKAY)
1428                         return -1;
1429         }
1430
1431         if (x) {
1432                 if (crypto_bignum_to_bin((struct crypto_bignum *)p->x, x,
1433                                          e->key.dp->size,
1434                                          e->key.dp->size) <= 0)
1435                         return -1;
1436         }
1437
1438         if (y) {
1439                 if (crypto_bignum_to_bin((struct crypto_bignum *) p->y, y,
1440                                          e->key.dp->size,
1441                                          e->key.dp->size) <= 0)
1442                         return -1;
1443         }
1444
1445         return 0;
1446 }
1447
1448
1449 struct crypto_ec_point * crypto_ec_point_from_bin(struct crypto_ec *e,
1450                                                   const u8 *val)
1451 {
1452         ecc_point *point = NULL;
1453         int loaded = 0;
1454
1455         if (TEST_FAIL())
1456                 return NULL;
1457
1458         point = wc_ecc_new_point();
1459         if (!point)
1460                 goto done;
1461
1462         if (mp_read_unsigned_bin(point->x, val, e->key.dp->size) != MP_OKAY)
1463                 goto done;
1464         val += e->key.dp->size;
1465         if (mp_read_unsigned_bin(point->y, val, e->key.dp->size) != MP_OKAY)
1466                 goto done;
1467         mp_set(point->z, 1);
1468
1469         loaded = 1;
1470 done:
1471         if (!loaded) {
1472                 wc_ecc_del_point(point);
1473                 point = NULL;
1474         }
1475         return (struct crypto_ec_point *) point;
1476 }
1477
1478
1479 int crypto_ec_point_add(struct crypto_ec *e, const struct crypto_ec_point *a,
1480                         const struct crypto_ec_point *b,
1481                         struct crypto_ec_point *c)
1482 {
1483         mp_int mu;
1484         ecc_point *ta = NULL, *tb = NULL;
1485         ecc_point *pa = (ecc_point *) a, *pb = (ecc_point *) b;
1486         mp_int *modulus = &e->prime;
1487         int ret;
1488
1489         if (TEST_FAIL())
1490                 return -1;
1491
1492         ret = mp_init(&mu);
1493         if (ret != MP_OKAY)
1494                 return -1;
1495
1496         ret = mp_montgomery_calc_normalization(&mu, modulus);
1497         if (ret != MP_OKAY) {
1498                 mp_clear(&mu);
1499                 return -1;
1500         }
1501
1502         if (!mp_isone(&mu)) {
1503                 ta = wc_ecc_new_point();
1504                 if (!ta) {
1505                         mp_clear(&mu);
1506                         return -1;
1507                 }
1508                 tb = wc_ecc_new_point();
1509                 if (!tb) {
1510                         wc_ecc_del_point(ta);
1511                         mp_clear(&mu);
1512                         return -1;
1513                 }
1514
1515                 if (mp_mulmod(pa->x, &mu, modulus, ta->x) != MP_OKAY ||
1516                     mp_mulmod(pa->y, &mu, modulus, ta->y) != MP_OKAY ||
1517                     mp_mulmod(pa->z, &mu, modulus, ta->z) != MP_OKAY ||
1518                     mp_mulmod(pb->x, &mu, modulus, tb->x) != MP_OKAY ||
1519                     mp_mulmod(pb->y, &mu, modulus, tb->y) != MP_OKAY ||
1520                     mp_mulmod(pb->z, &mu, modulus, tb->z) != MP_OKAY) {
1521                         ret = -1;
1522                         goto end;
1523                 }
1524                 pa = ta;
1525                 pb = tb;
1526         }
1527
1528         ret = ecc_projective_add_point(pa, pb, (ecc_point *) c, &e->a,
1529                                        &e->prime, e->mont_b);
1530         if (ret != 0) {
1531                 ret = -1;
1532                 goto end;
1533         }
1534
1535         if (ecc_map((ecc_point *) c, &e->prime, e->mont_b) != MP_OKAY)
1536                 ret = -1;
1537         else
1538                 ret = 0;
1539 end:
1540         wc_ecc_del_point(tb);
1541         wc_ecc_del_point(ta);
1542         mp_clear(&mu);
1543         return ret;
1544 }
1545
1546
1547 int crypto_ec_point_mul(struct crypto_ec *e, const struct crypto_ec_point *p,
1548                         const struct crypto_bignum *b,
1549                         struct crypto_ec_point *res)
1550 {
1551         int ret;
1552
1553         if (TEST_FAIL())
1554                 return -1;
1555
1556         ret = wc_ecc_mulmod((mp_int *) b, (ecc_point *) p, (ecc_point *) res,
1557                             &e->a, &e->prime, 1);
1558         return ret == 0 ? 0 : -1;
1559 }
1560
1561
1562 int crypto_ec_point_invert(struct crypto_ec *e, struct crypto_ec_point *p)
1563 {
1564         ecc_point *point = (ecc_point *) p;
1565
1566         if (TEST_FAIL())
1567                 return -1;
1568
1569         if (mp_sub(&e->prime, point->y, point->y) != MP_OKAY)
1570                 return -1;
1571
1572         return 0;
1573 }
1574
1575
1576 int crypto_ec_point_solve_y_coord(struct crypto_ec *e,
1577                                   struct crypto_ec_point *p,
1578                                   const struct crypto_bignum *x, int y_bit)
1579 {
1580         byte buf[1 + 2 * MAX_ECC_BYTES];
1581         int ret;
1582         int prime_len = crypto_ec_prime_len(e);
1583
1584         if (TEST_FAIL())
1585                 return -1;
1586
1587         buf[0] = y_bit ? ECC_POINT_COMP_ODD : ECC_POINT_COMP_EVEN;
1588         ret = crypto_bignum_to_bin(x, buf + 1, prime_len, prime_len);
1589         if (ret <= 0)
1590                 return -1;
1591         ret = wc_ecc_import_point_der(buf, 1 + 2 * ret, e->key.idx,
1592                                       (ecc_point *) p);
1593         if (ret != 0)
1594                 return -1;
1595
1596         return 0;
1597 }
1598
1599
1600 struct crypto_bignum *
1601 crypto_ec_point_compute_y_sqr(struct crypto_ec *e,
1602                               const struct crypto_bignum *x)
1603 {
1604         mp_int *y2 = NULL;
1605         mp_int t;
1606         int calced = 0;
1607
1608         if (TEST_FAIL())
1609                 return NULL;
1610
1611         if (mp_init(&t) != MP_OKAY)
1612                 return NULL;
1613
1614         y2 = (mp_int *) crypto_bignum_init();
1615         if (!y2)
1616                 goto done;
1617
1618         if (mp_sqrmod((mp_int *) x, &e->prime, y2) != 0 ||
1619             mp_mulmod((mp_int *) x, y2, &e->prime, y2) != 0 ||
1620             mp_mulmod((mp_int *) x, &e->a, &e->prime, &t) != 0 ||
1621             mp_addmod(y2, &t, &e->prime, y2) != 0 ||
1622             mp_addmod(y2, &e->b, &e->prime, y2) != 0)
1623                 goto done;
1624
1625         calced = 1;
1626 done:
1627         if (!calced) {
1628                 if (y2) {
1629                         mp_clear(y2);
1630                         os_free(y2);
1631                 }
1632                 mp_clear(&t);
1633         }
1634
1635         return (struct crypto_bignum *) y2;
1636 }
1637
1638
1639 int crypto_ec_point_is_at_infinity(struct crypto_ec *e,
1640                                    const struct crypto_ec_point *p)
1641 {
1642         return wc_ecc_point_is_at_infinity((ecc_point *) p);
1643 }
1644
1645
1646 int crypto_ec_point_is_on_curve(struct crypto_ec *e,
1647                                 const struct crypto_ec_point *p)
1648 {
1649         return wc_ecc_is_point((ecc_point *) p, &e->a, &e->b, &e->prime) ==
1650                 MP_OKAY;
1651 }
1652
1653
1654 int crypto_ec_point_cmp(const struct crypto_ec *e,
1655                         const struct crypto_ec_point *a,
1656                         const struct crypto_ec_point *b)
1657 {
1658         return wc_ecc_cmp_point((ecc_point *) a, (ecc_point *) b);
1659 }
1660
1661
1662 struct crypto_ecdh {
1663         struct crypto_ec *ec;
1664 };
1665
1666 struct crypto_ecdh * crypto_ecdh_init(int group)
1667 {
1668         struct crypto_ecdh *ecdh = NULL;
1669         WC_RNG rng;
1670         int ret;
1671
1672         if (wc_InitRng(&rng) != 0)
1673                 goto fail;
1674
1675         ecdh = os_zalloc(sizeof(*ecdh));
1676         if (!ecdh)
1677                 goto fail;
1678
1679         ecdh->ec = crypto_ec_init(group);
1680         if (!ecdh->ec)
1681                 goto fail;
1682
1683         ret = wc_ecc_make_key_ex(&rng, ecdh->ec->key.dp->size, &ecdh->ec->key,
1684                                  ecdh->ec->key.dp->id);
1685         if (ret < 0)
1686                 goto fail;
1687
1688 done:
1689         wc_FreeRng(&rng);
1690
1691         return ecdh;
1692 fail:
1693         crypto_ecdh_deinit(ecdh);
1694         ecdh = NULL;
1695         goto done;
1696 }
1697
1698
1699 void crypto_ecdh_deinit(struct crypto_ecdh *ecdh)
1700 {
1701         if (ecdh) {
1702                 crypto_ec_deinit(ecdh->ec);
1703                 os_free(ecdh);
1704         }
1705 }
1706
1707
1708 struct wpabuf * crypto_ecdh_get_pubkey(struct crypto_ecdh *ecdh, int inc_y)
1709 {
1710         struct wpabuf *buf = NULL;
1711         int ret;
1712         int len = ecdh->ec->key.dp->size;
1713
1714         buf = wpabuf_alloc(inc_y ? 2 * len : len);
1715         if (!buf)
1716                 goto fail;
1717
1718         ret = crypto_bignum_to_bin((struct crypto_bignum *)
1719                                    ecdh->ec->key.pubkey.x, wpabuf_put(buf, len),
1720                                    len, len);
1721         if (ret < 0)
1722                 goto fail;
1723         if (inc_y) {
1724                 ret = crypto_bignum_to_bin((struct crypto_bignum *)
1725                                            ecdh->ec->key.pubkey.y,
1726                                            wpabuf_put(buf, len), len, len);
1727                 if (ret < 0)
1728                         goto fail;
1729         }
1730
1731 done:
1732         return buf;
1733 fail:
1734         wpabuf_free(buf);
1735         buf = NULL;
1736         goto done;
1737 }
1738
1739
1740 struct wpabuf * crypto_ecdh_set_peerkey(struct crypto_ecdh *ecdh, int inc_y,
1741                                         const u8 *key, size_t len)
1742 {
1743         int ret;
1744         struct wpabuf *pubkey = NULL;
1745         struct wpabuf *secret = NULL;
1746         word32 key_len = ecdh->ec->key.dp->size;
1747         ecc_point *point = NULL;
1748         size_t need_key_len = inc_y ? 2 * key_len : key_len;
1749
1750         if (len < need_key_len)
1751                 goto fail;
1752         pubkey = wpabuf_alloc(1 + 2 * key_len);
1753         if (!pubkey)
1754                 goto fail;
1755         wpabuf_put_u8(pubkey, inc_y ? ECC_POINT_UNCOMP : ECC_POINT_COMP_EVEN);
1756         wpabuf_put_data(pubkey, key, need_key_len);
1757
1758         point = wc_ecc_new_point();
1759         if (!point)
1760                 goto fail;
1761
1762         ret = wc_ecc_import_point_der(wpabuf_mhead(pubkey), 1 + 2 * key_len,
1763                                       ecdh->ec->key.idx, point);
1764         if (ret != MP_OKAY)
1765                 goto fail;
1766
1767         secret = wpabuf_alloc(key_len);
1768         if (!secret)
1769                 goto fail;
1770
1771         ret = wc_ecc_shared_secret_ex(&ecdh->ec->key, point,
1772                                       wpabuf_put(secret, key_len), &key_len);
1773         if (ret != MP_OKAY)
1774                 goto fail;
1775
1776 done:
1777         wc_ecc_del_point(point);
1778         wpabuf_free(pubkey);
1779         return secret;
1780 fail:
1781         wpabuf_free(secret);
1782         secret = NULL;
1783         goto done;
1784 }
1785
1786 #endif /* CONFIG_ECC */