]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/wpa/src/crypto/crypto_wolfssl.c
Merge OpenSSL 1.1.1b.
[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 *privkey, size_t privkey_len,
830                             const u8 *pubkey, size_t pubkey_len,
831                             u8 *secret, size_t *len)
832 {
833         int ret = -1;
834         DhKey *dh;
835         word32 secret_sz;
836
837         dh = os_malloc(sizeof(DhKey));
838         if (!dh)
839                 return -1;
840         wc_InitDhKey(dh);
841
842         if (wc_DhSetKey(dh, prime, prime_len, &generator, 1) != 0)
843                 goto done;
844
845         if (wc_DhAgree(dh, secret, &secret_sz, privkey, privkey_len, pubkey,
846                        pubkey_len) != 0)
847                 goto done;
848
849         *len = secret_sz;
850         ret = 0;
851 done:
852         wc_FreeDhKey(dh);
853         os_free(dh);
854         return ret;
855 }
856
857
858 #ifdef CONFIG_FIPS
859 int crypto_get_random(void *buf, size_t len)
860 {
861         int ret = 0;
862         WC_RNG rng;
863
864         if (wc_InitRng(&rng) != 0)
865                 return -1;
866         if (wc_RNG_GenerateBlock(&rng, buf, len) != 0)
867                 ret = -1;
868         wc_FreeRng(&rng);
869         return ret;
870 }
871 #endif /* CONFIG_FIPS */
872
873
874 #if defined(EAP_PWD) || defined(EAP_SERVER_PWD)
875 struct crypto_hash {
876         Hmac hmac;
877         int size;
878 };
879
880
881 struct crypto_hash * crypto_hash_init(enum crypto_hash_alg alg, const u8 *key,
882                                       size_t key_len)
883 {
884         struct crypto_hash *ret = NULL;
885         struct crypto_hash *hash;
886         int type;
887
888         hash = os_zalloc(sizeof(*hash));
889         if (!hash)
890                 goto done;
891
892         switch (alg) {
893 #ifndef NO_MD5
894         case CRYPTO_HASH_ALG_HMAC_MD5:
895                 hash->size = 16;
896                 type = WC_MD5;
897                 break;
898 #endif /* NO_MD5 */
899 #ifndef NO_SHA
900         case CRYPTO_HASH_ALG_HMAC_SHA1:
901                 type = WC_SHA;
902                 hash->size = 20;
903                 break;
904 #endif /* NO_SHA */
905 #ifdef CONFIG_SHA256
906 #ifndef NO_SHA256
907         case CRYPTO_HASH_ALG_HMAC_SHA256:
908                 type = WC_SHA256;
909                 hash->size = 32;
910                 break;
911 #endif /* NO_SHA256 */
912 #endif /* CONFIG_SHA256 */
913         default:
914                 goto done;
915         }
916
917         if (wc_HmacSetKey(&hash->hmac, type, key, key_len) != 0)
918                 goto done;
919
920         ret = hash;
921         hash = NULL;
922 done:
923         os_free(hash);
924         return ret;
925 }
926
927
928 void crypto_hash_update(struct crypto_hash *ctx, const u8 *data, size_t len)
929 {
930         if (!ctx)
931                 return;
932         wc_HmacUpdate(&ctx->hmac, data, len);
933 }
934
935
936 int crypto_hash_finish(struct crypto_hash *ctx, u8 *mac, size_t *len)
937 {
938         int ret = 0;
939
940         if (!ctx)
941                 return -2;
942
943         if (!mac || !len)
944                 goto done;
945
946         if (wc_HmacFinal(&ctx->hmac, mac) != 0) {
947                 ret = -1;
948                 goto done;
949         }
950
951         *len = ctx->size;
952         ret = 0;
953 done:
954         bin_clear_free(ctx, sizeof(*ctx));
955         return ret;
956 }
957
958 #endif
959
960
961 int omac1_aes_vector(const u8 *key, size_t key_len, size_t num_elem,
962                      const u8 *addr[], const size_t *len, u8 *mac)
963 {
964         Cmac cmac;
965         size_t i;
966         word32 sz;
967
968         if (TEST_FAIL())
969                 return -1;
970
971         if (wc_InitCmac(&cmac, key, key_len, WC_CMAC_AES, NULL) != 0)
972                 return -1;
973
974         for (i = 0; i < num_elem; i++)
975                 if (wc_CmacUpdate(&cmac, addr[i], len[i]) != 0)
976                         return -1;
977
978         sz = AES_BLOCK_SIZE;
979         if (wc_CmacFinal(&cmac, mac, &sz) != 0 || sz != AES_BLOCK_SIZE)
980                 return -1;
981
982         return 0;
983 }
984
985
986 int omac1_aes_128_vector(const u8 *key, size_t num_elem,
987                          const u8 *addr[], const size_t *len, u8 *mac)
988 {
989         return omac1_aes_vector(key, 16, num_elem, addr, len, mac);
990 }
991
992
993 int omac1_aes_128(const u8 *key, const u8 *data, size_t data_len, u8 *mac)
994 {
995         return omac1_aes_128_vector(key, 1, &data, &data_len, mac);
996 }
997
998
999 int omac1_aes_256(const u8 *key, const u8 *data, size_t data_len, u8 *mac)
1000 {
1001         return omac1_aes_vector(key, 32, 1, &data, &data_len, mac);
1002 }
1003
1004
1005 struct crypto_bignum * crypto_bignum_init(void)
1006 {
1007         mp_int *a;
1008
1009         if (TEST_FAIL())
1010                 return NULL;
1011
1012         a = os_malloc(sizeof(*a));
1013         if (!a || mp_init(a) != MP_OKAY) {
1014                 os_free(a);
1015                 a = NULL;
1016         }
1017
1018         return (struct crypto_bignum *) a;
1019 }
1020
1021
1022 struct crypto_bignum * crypto_bignum_init_set(const u8 *buf, size_t len)
1023 {
1024         mp_int *a;
1025
1026         if (TEST_FAIL())
1027                 return NULL;
1028
1029         a = (mp_int *) crypto_bignum_init();
1030         if (!a)
1031                 return NULL;
1032
1033         if (mp_read_unsigned_bin(a, buf, len) != MP_OKAY) {
1034                 os_free(a);
1035                 a = NULL;
1036         }
1037
1038         return (struct crypto_bignum *) a;
1039 }
1040
1041
1042 void crypto_bignum_deinit(struct crypto_bignum *n, int clear)
1043 {
1044         if (!n)
1045                 return;
1046
1047         if (clear)
1048                 mp_forcezero((mp_int *) n);
1049         mp_clear((mp_int *) n);
1050         os_free((mp_int *) n);
1051 }
1052
1053
1054 int crypto_bignum_to_bin(const struct crypto_bignum *a,
1055                          u8 *buf, size_t buflen, size_t padlen)
1056 {
1057         int num_bytes, offset;
1058
1059         if (TEST_FAIL())
1060                 return -1;
1061
1062         if (padlen > buflen)
1063                 return -1;
1064
1065         num_bytes = (mp_count_bits((mp_int *) a) + 7) / 8;
1066         if ((size_t) num_bytes > buflen)
1067                 return -1;
1068         if (padlen > (size_t) num_bytes)
1069                 offset = padlen - num_bytes;
1070         else
1071                 offset = 0;
1072
1073         os_memset(buf, 0, offset);
1074         mp_to_unsigned_bin((mp_int *) a, buf + offset);
1075
1076         return num_bytes + offset;
1077 }
1078
1079
1080 int crypto_bignum_rand(struct crypto_bignum *r, const struct crypto_bignum *m)
1081 {
1082         int ret = 0;
1083         WC_RNG rng;
1084
1085         if (wc_InitRng(&rng) != 0)
1086                 return -1;
1087         if (mp_rand_prime((mp_int *) r,
1088                           (mp_count_bits((mp_int *) m) + 7) / 8 * 2,
1089                           &rng, NULL) != 0)
1090                 ret = -1;
1091         if (ret == 0 &&
1092             mp_mod((mp_int *) r, (mp_int *) m, (mp_int *) r) != 0)
1093                 ret = -1;
1094         wc_FreeRng(&rng);
1095         return ret;
1096 }
1097
1098
1099 int crypto_bignum_add(const struct crypto_bignum *a,
1100                       const struct crypto_bignum *b,
1101                       struct crypto_bignum *r)
1102 {
1103         return mp_add((mp_int *) a, (mp_int *) b,
1104                       (mp_int *) r) == MP_OKAY ? 0 : -1;
1105 }
1106
1107
1108 int crypto_bignum_mod(const struct crypto_bignum *a,
1109                       const struct crypto_bignum *m,
1110                       struct crypto_bignum *r)
1111 {
1112         return mp_mod((mp_int *) a, (mp_int *) m,
1113                       (mp_int *) r) == MP_OKAY ? 0 : -1;
1114 }
1115
1116
1117 int crypto_bignum_exptmod(const struct crypto_bignum *b,
1118                           const struct crypto_bignum *e,
1119                           const struct crypto_bignum *m,
1120                           struct crypto_bignum *r)
1121 {
1122         if (TEST_FAIL())
1123                 return -1;
1124
1125         return mp_exptmod((mp_int *) b, (mp_int *) e, (mp_int *) m,
1126                           (mp_int *) r) == MP_OKAY ?  0 : -1;
1127 }
1128
1129
1130 int crypto_bignum_inverse(const struct crypto_bignum *a,
1131                           const struct crypto_bignum *m,
1132                           struct crypto_bignum *r)
1133 {
1134         if (TEST_FAIL())
1135                 return -1;
1136
1137         return mp_invmod((mp_int *) a, (mp_int *) m,
1138                          (mp_int *) r) == MP_OKAY ? 0 : -1;
1139 }
1140
1141
1142 int crypto_bignum_sub(const struct crypto_bignum *a,
1143                       const struct crypto_bignum *b,
1144                       struct crypto_bignum *r)
1145 {
1146         if (TEST_FAIL())
1147                 return -1;
1148
1149         return mp_add((mp_int *) a, (mp_int *) b,
1150                       (mp_int *) r) == MP_OKAY ? 0 : -1;
1151 }
1152
1153
1154 int crypto_bignum_div(const struct crypto_bignum *a,
1155                       const struct crypto_bignum *b,
1156                       struct crypto_bignum *d)
1157 {
1158         if (TEST_FAIL())
1159                 return -1;
1160
1161         return mp_div((mp_int *) a, (mp_int *) b, (mp_int *) d,
1162                       NULL) == MP_OKAY ? 0 : -1;
1163 }
1164
1165
1166 int crypto_bignum_mulmod(const struct crypto_bignum *a,
1167                          const struct crypto_bignum *b,
1168                          const struct crypto_bignum *m,
1169                          struct crypto_bignum *d)
1170 {
1171         if (TEST_FAIL())
1172                 return -1;
1173
1174         return mp_mulmod((mp_int *) a, (mp_int *) b, (mp_int *) m,
1175                          (mp_int *) d) == MP_OKAY ?  0 : -1;
1176 }
1177
1178
1179 int crypto_bignum_rshift(const struct crypto_bignum *a, int n,
1180                          struct crypto_bignum *r)
1181 {
1182         if (mp_copy((mp_int *) a, (mp_int *) r) != MP_OKAY)
1183                 return -1;
1184         mp_rshb((mp_int *) r, n);
1185         return 0;
1186 }
1187
1188
1189 int crypto_bignum_cmp(const struct crypto_bignum *a,
1190                       const struct crypto_bignum *b)
1191 {
1192         return mp_cmp((mp_int *) a, (mp_int *) b);
1193 }
1194
1195
1196 int crypto_bignum_bits(const struct crypto_bignum *a)
1197 {
1198         return mp_count_bits((mp_int *) a);
1199 }
1200
1201
1202 int crypto_bignum_is_zero(const struct crypto_bignum *a)
1203 {
1204         return mp_iszero((mp_int *) a);
1205 }
1206
1207
1208 int crypto_bignum_is_one(const struct crypto_bignum *a)
1209 {
1210         return mp_isone((const mp_int *) a);
1211 }
1212
1213 int crypto_bignum_is_odd(const struct crypto_bignum *a)
1214 {
1215         return mp_isodd((mp_int *) a);
1216 }
1217
1218
1219 int crypto_bignum_legendre(const struct crypto_bignum *a,
1220                            const struct crypto_bignum *p)
1221 {
1222         mp_int t;
1223         int ret;
1224         int res = -2;
1225
1226         if (TEST_FAIL())
1227                 return -2;
1228
1229         if (mp_init(&t) != MP_OKAY)
1230                 return -2;
1231
1232         /* t = (p-1) / 2 */
1233         ret = mp_sub_d((mp_int *) p, 1, &t);
1234         if (ret == MP_OKAY)
1235                 mp_rshb(&t, 1);
1236         if (ret == MP_OKAY)
1237                 ret = mp_exptmod((mp_int *) a, &t, (mp_int *) p, &t);
1238         if (ret == MP_OKAY) {
1239                 if (mp_isone(&t))
1240                         res = 1;
1241                 else if (mp_iszero(&t))
1242                         res = 0;
1243                 else
1244                         res = -1;
1245         }
1246
1247         mp_clear(&t);
1248         return res;
1249 }
1250
1251
1252 #ifdef CONFIG_ECC
1253
1254 int ecc_map(ecc_point *, mp_int *, mp_digit);
1255 int ecc_projective_add_point(ecc_point *P, ecc_point *Q, ecc_point *R,
1256                              mp_int *a, mp_int *modulus, mp_digit mp);
1257
1258 struct crypto_ec {
1259         ecc_key key;
1260         mp_int a;
1261         mp_int prime;
1262         mp_int order;
1263         mp_digit mont_b;
1264         mp_int b;
1265 };
1266
1267
1268 struct crypto_ec * crypto_ec_init(int group)
1269 {
1270         int built = 0;
1271         struct crypto_ec *e;
1272         int curve_id;
1273
1274         /* Map from IANA registry for IKE D-H groups to OpenSSL NID */
1275         switch (group) {
1276         case 19:
1277                 curve_id = ECC_SECP256R1;
1278                 break;
1279         case 20:
1280                 curve_id = ECC_SECP384R1;
1281                 break;
1282         case 21:
1283                 curve_id = ECC_SECP521R1;
1284                 break;
1285         case 25:
1286                 curve_id = ECC_SECP192R1;
1287                 break;
1288         case 26:
1289                 curve_id = ECC_SECP224R1;
1290                 break;
1291 #ifdef HAVE_ECC_BRAINPOOL
1292         case 27:
1293                 curve_id = ECC_BRAINPOOLP224R1;
1294                 break;
1295         case 28:
1296                 curve_id = ECC_BRAINPOOLP256R1;
1297                 break;
1298         case 29:
1299                 curve_id = ECC_BRAINPOOLP384R1;
1300                 break;
1301         case 30:
1302                 curve_id = ECC_BRAINPOOLP512R1;
1303                 break;
1304 #endif /* HAVE_ECC_BRAINPOOL */
1305         default:
1306                 return NULL;
1307         }
1308
1309         e = os_zalloc(sizeof(*e));
1310         if (!e)
1311                 return NULL;
1312
1313         if (wc_ecc_init(&e->key) != 0 ||
1314             wc_ecc_set_curve(&e->key, 0, curve_id) != 0 ||
1315             mp_init(&e->a) != MP_OKAY ||
1316             mp_init(&e->prime) != MP_OKAY ||
1317             mp_init(&e->order) != MP_OKAY ||
1318             mp_init(&e->b) != MP_OKAY ||
1319             mp_read_radix(&e->a, e->key.dp->Af, 16) != MP_OKAY ||
1320             mp_read_radix(&e->b, e->key.dp->Bf, 16) != MP_OKAY ||
1321             mp_read_radix(&e->prime, e->key.dp->prime, 16) != MP_OKAY ||
1322             mp_read_radix(&e->order, e->key.dp->order, 16) != MP_OKAY ||
1323             mp_montgomery_setup(&e->prime, &e->mont_b) != MP_OKAY)
1324                 goto done;
1325
1326         built = 1;
1327 done:
1328         if (!built) {
1329                 crypto_ec_deinit(e);
1330                 e = NULL;
1331         }
1332         return e;
1333 }
1334
1335
1336 void crypto_ec_deinit(struct crypto_ec* e)
1337 {
1338         if (!e)
1339                 return;
1340
1341         mp_clear(&e->b);
1342         mp_clear(&e->order);
1343         mp_clear(&e->prime);
1344         mp_clear(&e->a);
1345         wc_ecc_free(&e->key);
1346         os_free(e);
1347 }
1348
1349
1350 int crypto_ec_cofactor(struct crypto_ec *e, struct crypto_bignum *cofactor)
1351 {
1352         if (!e || !cofactor)
1353                 return -1;
1354
1355         mp_set((mp_int *) cofactor, e->key.dp->cofactor);
1356         return 0;
1357 }
1358
1359
1360 struct crypto_ec_point * crypto_ec_point_init(struct crypto_ec *e)
1361 {
1362         if (TEST_FAIL())
1363                 return NULL;
1364         if (!e)
1365                 return NULL;
1366         return (struct crypto_ec_point *) wc_ecc_new_point();
1367 }
1368
1369
1370 size_t crypto_ec_prime_len(struct crypto_ec *e)
1371 {
1372         return (mp_count_bits(&e->prime) + 7) / 8;
1373 }
1374
1375
1376 size_t crypto_ec_prime_len_bits(struct crypto_ec *e)
1377 {
1378         return mp_count_bits(&e->prime);
1379 }
1380
1381
1382 size_t crypto_ec_order_len(struct crypto_ec *e)
1383 {
1384         return (mp_count_bits(&e->order) + 7) / 8;
1385 }
1386
1387
1388 const struct crypto_bignum * crypto_ec_get_prime(struct crypto_ec *e)
1389 {
1390         return (const struct crypto_bignum *) &e->prime;
1391 }
1392
1393
1394 const struct crypto_bignum * crypto_ec_get_order(struct crypto_ec *e)
1395 {
1396         return (const struct crypto_bignum *) &e->order;
1397 }
1398
1399
1400 void crypto_ec_point_deinit(struct crypto_ec_point *p, int clear)
1401 {
1402         ecc_point *point = (ecc_point *) p;
1403
1404         if (!p)
1405                 return;
1406
1407         if (clear) {
1408                 mp_forcezero(point->x);
1409                 mp_forcezero(point->y);
1410                 mp_forcezero(point->z);
1411         }
1412         wc_ecc_del_point(point);
1413 }
1414
1415
1416 int crypto_ec_point_x(struct crypto_ec *e, const struct crypto_ec_point *p,
1417                       struct crypto_bignum *x)
1418 {
1419         return mp_copy(((ecc_point *) p)->x, (mp_int *) x) == MP_OKAY ? 0 : -1;
1420 }
1421
1422
1423 int crypto_ec_point_to_bin(struct crypto_ec *e,
1424                            const struct crypto_ec_point *point, u8 *x, u8 *y)
1425 {
1426         ecc_point *p = (ecc_point *) point;
1427
1428         if (TEST_FAIL())
1429                 return -1;
1430
1431         if (!mp_isone(p->z)) {
1432                 if (ecc_map(p, &e->prime, e->mont_b) != MP_OKAY)
1433                         return -1;
1434         }
1435
1436         if (x) {
1437                 if (crypto_bignum_to_bin((struct crypto_bignum *)p->x, x,
1438                                          e->key.dp->size,
1439                                          e->key.dp->size) <= 0)
1440                         return -1;
1441         }
1442
1443         if (y) {
1444                 if (crypto_bignum_to_bin((struct crypto_bignum *) p->y, y,
1445                                          e->key.dp->size,
1446                                          e->key.dp->size) <= 0)
1447                         return -1;
1448         }
1449
1450         return 0;
1451 }
1452
1453
1454 struct crypto_ec_point * crypto_ec_point_from_bin(struct crypto_ec *e,
1455                                                   const u8 *val)
1456 {
1457         ecc_point *point = NULL;
1458         int loaded = 0;
1459
1460         if (TEST_FAIL())
1461                 return NULL;
1462
1463         point = wc_ecc_new_point();
1464         if (!point)
1465                 goto done;
1466
1467         if (mp_read_unsigned_bin(point->x, val, e->key.dp->size) != MP_OKAY)
1468                 goto done;
1469         val += e->key.dp->size;
1470         if (mp_read_unsigned_bin(point->y, val, e->key.dp->size) != MP_OKAY)
1471                 goto done;
1472         mp_set(point->z, 1);
1473
1474         loaded = 1;
1475 done:
1476         if (!loaded) {
1477                 wc_ecc_del_point(point);
1478                 point = NULL;
1479         }
1480         return (struct crypto_ec_point *) point;
1481 }
1482
1483
1484 int crypto_ec_point_add(struct crypto_ec *e, const struct crypto_ec_point *a,
1485                         const struct crypto_ec_point *b,
1486                         struct crypto_ec_point *c)
1487 {
1488         mp_int mu;
1489         ecc_point *ta = NULL, *tb = NULL;
1490         ecc_point *pa = (ecc_point *) a, *pb = (ecc_point *) b;
1491         mp_int *modulus = &e->prime;
1492         int ret;
1493
1494         if (TEST_FAIL())
1495                 return -1;
1496
1497         ret = mp_init(&mu);
1498         if (ret != MP_OKAY)
1499                 return -1;
1500
1501         ret = mp_montgomery_calc_normalization(&mu, modulus);
1502         if (ret != MP_OKAY) {
1503                 mp_clear(&mu);
1504                 return -1;
1505         }
1506
1507         if (!mp_isone(&mu)) {
1508                 ta = wc_ecc_new_point();
1509                 if (!ta) {
1510                         mp_clear(&mu);
1511                         return -1;
1512                 }
1513                 tb = wc_ecc_new_point();
1514                 if (!tb) {
1515                         wc_ecc_del_point(ta);
1516                         mp_clear(&mu);
1517                         return -1;
1518                 }
1519
1520                 if (mp_mulmod(pa->x, &mu, modulus, ta->x) != MP_OKAY ||
1521                     mp_mulmod(pa->y, &mu, modulus, ta->y) != MP_OKAY ||
1522                     mp_mulmod(pa->z, &mu, modulus, ta->z) != MP_OKAY ||
1523                     mp_mulmod(pb->x, &mu, modulus, tb->x) != MP_OKAY ||
1524                     mp_mulmod(pb->y, &mu, modulus, tb->y) != MP_OKAY ||
1525                     mp_mulmod(pb->z, &mu, modulus, tb->z) != MP_OKAY) {
1526                         ret = -1;
1527                         goto end;
1528                 }
1529                 pa = ta;
1530                 pb = tb;
1531         }
1532
1533         ret = ecc_projective_add_point(pa, pb, (ecc_point *) c, &e->a,
1534                                        &e->prime, e->mont_b);
1535         if (ret != 0) {
1536                 ret = -1;
1537                 goto end;
1538         }
1539
1540         if (ecc_map((ecc_point *) c, &e->prime, e->mont_b) != MP_OKAY)
1541                 ret = -1;
1542         else
1543                 ret = 0;
1544 end:
1545         wc_ecc_del_point(tb);
1546         wc_ecc_del_point(ta);
1547         mp_clear(&mu);
1548         return ret;
1549 }
1550
1551
1552 int crypto_ec_point_mul(struct crypto_ec *e, const struct crypto_ec_point *p,
1553                         const struct crypto_bignum *b,
1554                         struct crypto_ec_point *res)
1555 {
1556         int ret;
1557
1558         if (TEST_FAIL())
1559                 return -1;
1560
1561         ret = wc_ecc_mulmod((mp_int *) b, (ecc_point *) p, (ecc_point *) res,
1562                             &e->a, &e->prime, 1);
1563         return ret == 0 ? 0 : -1;
1564 }
1565
1566
1567 int crypto_ec_point_invert(struct crypto_ec *e, struct crypto_ec_point *p)
1568 {
1569         ecc_point *point = (ecc_point *) p;
1570
1571         if (TEST_FAIL())
1572                 return -1;
1573
1574         if (mp_sub(&e->prime, point->y, point->y) != MP_OKAY)
1575                 return -1;
1576
1577         return 0;
1578 }
1579
1580
1581 int crypto_ec_point_solve_y_coord(struct crypto_ec *e,
1582                                   struct crypto_ec_point *p,
1583                                   const struct crypto_bignum *x, int y_bit)
1584 {
1585         byte buf[1 + 2 * MAX_ECC_BYTES];
1586         int ret;
1587         int prime_len = crypto_ec_prime_len(e);
1588
1589         if (TEST_FAIL())
1590                 return -1;
1591
1592         buf[0] = y_bit ? ECC_POINT_COMP_ODD : ECC_POINT_COMP_EVEN;
1593         ret = crypto_bignum_to_bin(x, buf + 1, prime_len, prime_len);
1594         if (ret <= 0)
1595                 return -1;
1596         ret = wc_ecc_import_point_der(buf, 1 + 2 * ret, e->key.idx,
1597                                       (ecc_point *) p);
1598         if (ret != 0)
1599                 return -1;
1600
1601         return 0;
1602 }
1603
1604
1605 struct crypto_bignum *
1606 crypto_ec_point_compute_y_sqr(struct crypto_ec *e,
1607                               const struct crypto_bignum *x)
1608 {
1609         mp_int *y2 = NULL;
1610         mp_int t;
1611         int calced = 0;
1612
1613         if (TEST_FAIL())
1614                 return NULL;
1615
1616         if (mp_init(&t) != MP_OKAY)
1617                 return NULL;
1618
1619         y2 = (mp_int *) crypto_bignum_init();
1620         if (!y2)
1621                 goto done;
1622
1623         if (mp_sqrmod((mp_int *) x, &e->prime, y2) != 0 ||
1624             mp_mulmod((mp_int *) x, y2, &e->prime, y2) != 0 ||
1625             mp_mulmod((mp_int *) x, &e->a, &e->prime, &t) != 0 ||
1626             mp_addmod(y2, &t, &e->prime, y2) != 0 ||
1627             mp_addmod(y2, &e->b, &e->prime, y2) != 0)
1628                 goto done;
1629
1630         calced = 1;
1631 done:
1632         if (!calced) {
1633                 if (y2) {
1634                         mp_clear(y2);
1635                         os_free(y2);
1636                 }
1637                 mp_clear(&t);
1638         }
1639
1640         return (struct crypto_bignum *) y2;
1641 }
1642
1643
1644 int crypto_ec_point_is_at_infinity(struct crypto_ec *e,
1645                                    const struct crypto_ec_point *p)
1646 {
1647         return wc_ecc_point_is_at_infinity((ecc_point *) p);
1648 }
1649
1650
1651 int crypto_ec_point_is_on_curve(struct crypto_ec *e,
1652                                 const struct crypto_ec_point *p)
1653 {
1654         return wc_ecc_is_point((ecc_point *) p, &e->a, &e->b, &e->prime) ==
1655                 MP_OKAY;
1656 }
1657
1658
1659 int crypto_ec_point_cmp(const struct crypto_ec *e,
1660                         const struct crypto_ec_point *a,
1661                         const struct crypto_ec_point *b)
1662 {
1663         return wc_ecc_cmp_point((ecc_point *) a, (ecc_point *) b);
1664 }
1665
1666
1667 struct crypto_ecdh {
1668         struct crypto_ec *ec;
1669 };
1670
1671 struct crypto_ecdh * crypto_ecdh_init(int group)
1672 {
1673         struct crypto_ecdh *ecdh = NULL;
1674         WC_RNG rng;
1675         int ret;
1676
1677         if (wc_InitRng(&rng) != 0)
1678                 goto fail;
1679
1680         ecdh = os_zalloc(sizeof(*ecdh));
1681         if (!ecdh)
1682                 goto fail;
1683
1684         ecdh->ec = crypto_ec_init(group);
1685         if (!ecdh->ec)
1686                 goto fail;
1687
1688         ret = wc_ecc_make_key_ex(&rng, ecdh->ec->key.dp->size, &ecdh->ec->key,
1689                                  ecdh->ec->key.dp->id);
1690         if (ret < 0)
1691                 goto fail;
1692
1693 done:
1694         wc_FreeRng(&rng);
1695
1696         return ecdh;
1697 fail:
1698         crypto_ecdh_deinit(ecdh);
1699         ecdh = NULL;
1700         goto done;
1701 }
1702
1703
1704 void crypto_ecdh_deinit(struct crypto_ecdh *ecdh)
1705 {
1706         if (ecdh) {
1707                 crypto_ec_deinit(ecdh->ec);
1708                 os_free(ecdh);
1709         }
1710 }
1711
1712
1713 struct wpabuf * crypto_ecdh_get_pubkey(struct crypto_ecdh *ecdh, int inc_y)
1714 {
1715         struct wpabuf *buf = NULL;
1716         int ret;
1717         int len = ecdh->ec->key.dp->size;
1718
1719         buf = wpabuf_alloc(inc_y ? 2 * len : len);
1720         if (!buf)
1721                 goto fail;
1722
1723         ret = crypto_bignum_to_bin((struct crypto_bignum *)
1724                                    ecdh->ec->key.pubkey.x, wpabuf_put(buf, len),
1725                                    len, len);
1726         if (ret < 0)
1727                 goto fail;
1728         if (inc_y) {
1729                 ret = crypto_bignum_to_bin((struct crypto_bignum *)
1730                                            ecdh->ec->key.pubkey.y,
1731                                            wpabuf_put(buf, len), len, len);
1732                 if (ret < 0)
1733                         goto fail;
1734         }
1735
1736 done:
1737         return buf;
1738 fail:
1739         wpabuf_free(buf);
1740         buf = NULL;
1741         goto done;
1742 }
1743
1744
1745 struct wpabuf * crypto_ecdh_set_peerkey(struct crypto_ecdh *ecdh, int inc_y,
1746                                         const u8 *key, size_t len)
1747 {
1748         int ret;
1749         struct wpabuf *pubkey = NULL;
1750         struct wpabuf *secret = NULL;
1751         word32 key_len = ecdh->ec->key.dp->size;
1752         ecc_point *point = NULL;
1753         size_t need_key_len = inc_y ? 2 * key_len : key_len;
1754
1755         if (len < need_key_len)
1756                 goto fail;
1757         pubkey = wpabuf_alloc(1 + 2 * key_len);
1758         if (!pubkey)
1759                 goto fail;
1760         wpabuf_put_u8(pubkey, inc_y ? ECC_POINT_UNCOMP : ECC_POINT_COMP_EVEN);
1761         wpabuf_put_data(pubkey, key, need_key_len);
1762
1763         point = wc_ecc_new_point();
1764         if (!point)
1765                 goto fail;
1766
1767         ret = wc_ecc_import_point_der(wpabuf_mhead(pubkey), 1 + 2 * key_len,
1768                                       ecdh->ec->key.idx, point);
1769         if (ret != MP_OKAY)
1770                 goto fail;
1771
1772         secret = wpabuf_alloc(key_len);
1773         if (!secret)
1774                 goto fail;
1775
1776         ret = wc_ecc_shared_secret_ex(&ecdh->ec->key, point,
1777                                       wpabuf_put(secret, key_len), &key_len);
1778         if (ret != MP_OKAY)
1779                 goto fail;
1780
1781 done:
1782         wc_ecc_del_point(point);
1783         wpabuf_free(pubkey);
1784         return secret;
1785 fail:
1786         wpabuf_free(secret);
1787         secret = NULL;
1788         goto done;
1789 }
1790
1791 #endif /* CONFIG_ECC */