1 /* 2 * Wrapper functions for OpenSSL libcrypto 3 * Copyright (c) 2004-2013, Jouni Malinen <j (at) 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 #include <openssl/opensslv.h> 11 #include <openssl/err.h> 12 #include <openssl/des.h> 13 #include <openssl/aes.h> 14 #include <openssl/bn.h> 15 #include <openssl/evp.h> 16 #include <openssl/dh.h> 17 #include <openssl/hmac.h> 18 #include <openssl/rand.h> 19 #ifdef CONFIG_OPENSSL_CMAC 20 #include <openssl/cmac.h> 21 #endif /* CONFIG_OPENSSL_CMAC */ 22 #ifdef CONFIG_ECC 23 #include <openssl/ec.h> 24 #endif /* CONFIG_ECC */ 25 26 #include "common.h" 27 #include "wpabuf.h" 28 #include "dh_group5.h" 29 #include "sha1.h" 30 #include "sha256.h" 31 #include "crypto.h" 32 33 #if OPENSSL_VERSION_NUMBER < 0x00907000 34 #define DES_key_schedule des_key_schedule 35 #define DES_cblock des_cblock 36 #define DES_set_key(key, schedule) des_set_key((key), *(schedule)) 37 #define DES_ecb_encrypt(input, output, ks, enc) \ 38 des_ecb_encrypt((input), (output), *(ks), (enc)) 39 #endif /* openssl < 0.9.7 */ 40 41 static BIGNUM * get_group5_prime(void) 42 { 43 #if OPENSSL_VERSION_NUMBER < 0x00908000 || defined(OPENSSL_IS_BORINGSSL) 44 static const unsigned char RFC3526_PRIME_1536[] = { 45 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,0x0F,0xDA,0xA2, 46 0x21,0x68,0xC2,0x34,0xC4,0xC6,0x62,0x8B,0x80,0xDC,0x1C,0xD1, 47 0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74,0x02,0x0B,0xBE,0xA6, 48 0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,0x8E,0x34,0x04,0xDD, 49 0xEF,0x95,0x19,0xB3,0xCD,0x3A,0x43,0x1B,0x30,0x2B,0x0A,0x6D, 50 0xF2,0x5F,0x14,0x37,0x4F,0xE1,0x35,0x6D,0x6D,0x51,0xC2,0x45, 51 0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6,0xF4,0x4C,0x42,0xE9, 52 0xA6,0x37,0xED,0x6B,0x0B,0xFF,0x5C,0xB6,0xF4,0x06,0xB7,0xED, 53 0xEE,0x38,0x6B,0xFB,0x5A,0x89,0x9F,0xA5,0xAE,0x9F,0x24,0x11, 54 0x7C,0x4B,0x1F,0xE6,0x49,0x28,0x66,0x51,0xEC,0xE4,0x5B,0x3D, 55 0xC2,0x00,0x7C,0xB8,0xA1,0x63,0xBF,0x05,0x98,0xDA,0x48,0x36, 56 0x1C,0x55,0xD3,0x9A,0x69,0x16,0x3F,0xA8,0xFD,0x24,0xCF,0x5F, 57 0x83,0x65,0x5D,0x23,0xDC,0xA3,0xAD,0x96,0x1C,0x62,0xF3,0x56, 58 0x20,0x85,0x52,0xBB,0x9E,0xD5,0x29,0x07,0x70,0x96,0x96,0x6D, 59 0x67,0x0C,0x35,0x4E,0x4A,0xBC,0x98,0x04,0xF1,0x74,0x6C,0x08, 60 0xCA,0x23,0x73,0x27,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 61 }; 62 return BN_bin2bn(RFC3526_PRIME_1536, sizeof(RFC3526_PRIME_1536), NULL); 63 #else /* openssl < 0.9.8 */ 64 return get_rfc3526_prime_1536(NULL); 65 #endif /* openssl < 0.9.8 */ 66 } 67 68 #if OPENSSL_VERSION_NUMBER < 0x00908000 69 #ifndef OPENSSL_NO_SHA256 70 #ifndef OPENSSL_FIPS 71 #define NO_SHA256_WRAPPER 72 #endif 73 #endif 74 75 #endif /* openssl < 0.9.8 */ 76 77 #ifdef OPENSSL_NO_SHA256 78 #define NO_SHA256_WRAPPER 79 #endif 80 81 static int openssl_digest_vector(const EVP_MD *type, size_t num_elem, 82 const u8 *addr[], const size_t *len, u8 *mac) 83 { 84 EVP_MD_CTX ctx; 85 size_t i; 86 unsigned int mac_len; 87 88 EVP_MD_CTX_init(&ctx); 89 if (!EVP_DigestInit_ex(&ctx, type, NULL)) { 90 wpa_printf(MSG_ERROR, "OpenSSL: EVP_DigestInit_ex failed: %s", 91 ERR_error_string(ERR_get_error(), NULL)); 92 return -1; 93 } 94 for (i = 0; i < num_elem; i++) { 95 if (!EVP_DigestUpdate(&ctx, addr[i], len[i])) { 96 wpa_printf(MSG_ERROR, "OpenSSL: EVP_DigestUpdate " 97 "failed: %s", 98 ERR_error_string(ERR_get_error(), NULL)); 99 return -1; 100 } 101 } 102 if (!EVP_DigestFinal(&ctx, mac, &mac_len)) { 103 wpa_printf(MSG_ERROR, "OpenSSL: EVP_DigestFinal failed: %s", 104 ERR_error_string(ERR_get_error(), NULL)); 105 return -1; 106 } 107 108 return 0; 109 } 110 111 112 int md4_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) 113 { 114 return openssl_digest_vector(EVP_md4(), num_elem, addr, len, mac); 115 } 116 117 118 void des_encrypt(const u8 *clear, const u8 *key, u8 *cypher) 119 { 120 u8 pkey[8], next, tmp; 121 int i; 122 DES_key_schedule ks; 123 124 /* Add parity bits to the key */ 125 next = 0; 126 for (i = 0; i < 7; i++) { 127 tmp = key[i]; 128 pkey[i] = (tmp >> i) | next | 1; 129 next = tmp << (7 - i); 130 } 131 pkey[i] = next | 1; 132 133 DES_set_key((DES_cblock *) &pkey, &ks); 134 DES_ecb_encrypt((DES_cblock *) clear, (DES_cblock *) cypher, &ks, 135 DES_ENCRYPT); 136 } 137 138 139 int rc4_skip(const u8 *key, size_t keylen, size_t skip, 140 u8 *data, size_t data_len) 141 { 142 #ifdef OPENSSL_NO_RC4 143 return -1; 144 #else /* OPENSSL_NO_RC4 */ 145 EVP_CIPHER_CTX ctx; 146 int outl; 147 int res = -1; 148 unsigned char skip_buf[16]; 149 150 EVP_CIPHER_CTX_init(&ctx); 151 if (!EVP_CIPHER_CTX_set_padding(&ctx, 0) || 152 !EVP_CipherInit_ex(&ctx, EVP_rc4(), NULL, NULL, NULL, 1) || 153 !EVP_CIPHER_CTX_set_key_length(&ctx, keylen) || 154 !EVP_CipherInit_ex(&ctx, NULL, NULL, key, NULL, 1)) 155 goto out; 156 157 while (skip >= sizeof(skip_buf)) { 158 size_t len = skip; 159 if (len > sizeof(skip_buf)) 160 len = sizeof(skip_buf); 161 if (!EVP_CipherUpdate(&ctx, skip_buf, &outl, skip_buf, len)) 162 goto out; 163 skip -= len; 164 } 165 166 if (EVP_CipherUpdate(&ctx, data, &outl, data, data_len)) 167 res = 0; 168 169 out: 170 EVP_CIPHER_CTX_cleanup(&ctx); 171 return res; 172 #endif /* OPENSSL_NO_RC4 */ 173 } 174 175 176 int md5_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) 177 { 178 return openssl_digest_vector(EVP_md5(), num_elem, addr, len, mac); 179 } 180 181 182 int sha1_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) 183 { 184 return openssl_digest_vector(EVP_sha1(), num_elem, addr, len, mac); 185 } 186 187 188 #ifndef NO_SHA256_WRAPPER 189 int sha256_vector(size_t num_elem, const u8 *addr[], const size_t *len, 190 u8 *mac) 191 { 192 return openssl_digest_vector(EVP_sha256(), num_elem, addr, len, mac); 193 } 194 #endif /* NO_SHA256_WRAPPER */ 195 196 197 static const EVP_CIPHER * aes_get_evp_cipher(size_t keylen) 198 { 199 switch (keylen) { 200 case 16: 201 return EVP_aes_128_ecb(); 202 #ifndef OPENSSL_IS_BORINGSSL 203 case 24: 204 return EVP_aes_192_ecb(); 205 #endif /* OPENSSL_IS_BORINGSSL */ 206 case 32: 207 return EVP_aes_256_ecb(); 208 } 209 210 return NULL; 211 } 212 213 214 void * aes_encrypt_init(const u8 *key, size_t len) 215 { 216 EVP_CIPHER_CTX *ctx; 217 const EVP_CIPHER *type; 218 219 type = aes_get_evp_cipher(len); 220 if (type == NULL) 221 return NULL; 222 223 ctx = os_malloc(sizeof(*ctx)); 224 if (ctx == NULL) 225 return NULL; 226 EVP_CIPHER_CTX_init(ctx); 227 if (EVP_EncryptInit_ex(ctx, type, NULL, key, NULL) != 1) { 228 os_free(ctx); 229 return NULL; 230 } 231 EVP_CIPHER_CTX_set_padding(ctx, 0); 232 return ctx; 233 } 234 235 236 void aes_encrypt(void *ctx, const u8 *plain, u8 *crypt) 237 { 238 EVP_CIPHER_CTX *c = ctx; 239 int clen = 16; 240 if (EVP_EncryptUpdate(c, crypt, &clen, plain, 16) != 1) { 241 wpa_printf(MSG_ERROR, "OpenSSL: EVP_EncryptUpdate failed: %s", 242 ERR_error_string(ERR_get_error(), NULL)); 243 } 244 } 245 246 247 void aes_encrypt_deinit(void *ctx) 248 { 249 EVP_CIPHER_CTX *c = ctx; 250 u8 buf[16]; 251 int len = sizeof(buf); 252 if (EVP_EncryptFinal_ex(c, buf, &len) != 1) { 253 wpa_printf(MSG_ERROR, "OpenSSL: EVP_EncryptFinal_ex failed: " 254 "%s", ERR_error_string(ERR_get_error(), NULL)); 255 } 256 if (len != 0) { 257 wpa_printf(MSG_ERROR, "OpenSSL: Unexpected padding length %d " 258 "in AES encrypt", len); 259 } 260 EVP_CIPHER_CTX_cleanup(c); 261 os_free(c); 262 } 263 264 265 void * aes_decrypt_init(const u8 *key, size_t len) 266 { 267 EVP_CIPHER_CTX *ctx; 268 const EVP_CIPHER *type; 269 270 type = aes_get_evp_cipher(len); 271 if (type == NULL) 272 return NULL; 273 274 ctx = os_malloc(sizeof(*ctx)); 275 if (ctx == NULL) 276 return NULL; 277 EVP_CIPHER_CTX_init(ctx); 278 if (EVP_DecryptInit_ex(ctx, type, NULL, key, NULL) != 1) { 279 os_free(ctx); 280 return NULL; 281 } 282 EVP_CIPHER_CTX_set_padding(ctx, 0); 283 return ctx; 284 } 285 286 287 void aes_decrypt(void *ctx, const u8 *crypt, u8 *plain) 288 { 289 EVP_CIPHER_CTX *c = ctx; 290 int plen = 16; 291 if (EVP_DecryptUpdate(c, plain, &plen, crypt, 16) != 1) { 292 wpa_printf(MSG_ERROR, "OpenSSL: EVP_DecryptUpdate failed: %s", 293 ERR_error_string(ERR_get_error(), NULL)); 294 } 295 } 296 297 298 void aes_decrypt_deinit(void *ctx) 299 { 300 EVP_CIPHER_CTX *c = ctx; 301 u8 buf[16]; 302 int len = sizeof(buf); 303 if (EVP_DecryptFinal_ex(c, buf, &len) != 1) { 304 wpa_printf(MSG_ERROR, "OpenSSL: EVP_DecryptFinal_ex failed: " 305 "%s", ERR_error_string(ERR_get_error(), NULL)); 306 } 307 if (len != 0) { 308 wpa_printf(MSG_ERROR, "OpenSSL: Unexpected padding length %d " 309 "in AES decrypt", len); 310 } 311 EVP_CIPHER_CTX_cleanup(c); 312 os_free(ctx); 313 } 314 315 316 int crypto_mod_exp(const u8 *base, size_t base_len, 317 const u8 *power, size_t power_len, 318 const u8 *modulus, size_t modulus_len, 319 u8 *result, size_t *result_len) 320 { 321 BIGNUM *bn_base, *bn_exp, *bn_modulus, *bn_result; 322 int ret = -1; 323 BN_CTX *ctx; 324 325 ctx = BN_CTX_new(); 326 if (ctx == NULL) 327 return -1; 328 329 bn_base = BN_bin2bn(base, base_len, NULL); 330 bn_exp = BN_bin2bn(power, power_len, NULL); 331 bn_modulus = BN_bin2bn(modulus, modulus_len, NULL); 332 bn_result = BN_new(); 333 334 if (bn_base == NULL || bn_exp == NULL || bn_modulus == NULL || 335 bn_result == NULL) 336 goto error; 337 338 if (BN_mod_exp(bn_result, bn_base, bn_exp, bn_modulus, ctx) != 1) 339 goto error; 340 341 *result_len = BN_bn2bin(bn_result, result); 342 ret = 0; 343 344 error: 345 BN_clear_free(bn_base); 346 BN_clear_free(bn_exp); 347 BN_clear_free(bn_modulus); 348 BN_clear_free(bn_result); 349 BN_CTX_free(ctx); 350 return ret; 351 } 352 353 354 struct crypto_cipher { 355 EVP_CIPHER_CTX enc; 356 EVP_CIPHER_CTX dec; 357 }; 358 359 360 struct crypto_cipher * crypto_cipher_init(enum crypto_cipher_alg alg, 361 const u8 *iv, const u8 *key, 362 size_t key_len) 363 { 364 struct crypto_cipher *ctx; 365 const EVP_CIPHER *cipher; 366 367 ctx = os_zalloc(sizeof(*ctx)); 368 if (ctx == NULL) 369 return NULL; 370 371 switch (alg) { 372 #ifndef OPENSSL_NO_RC4 373 case CRYPTO_CIPHER_ALG_RC4: 374 cipher = EVP_rc4(); 375 break; 376 #endif /* OPENSSL_NO_RC4 */ 377 #ifndef OPENSSL_NO_AES 378 case CRYPTO_CIPHER_ALG_AES: 379 switch (key_len) { 380 case 16: 381 cipher = EVP_aes_128_cbc(); 382 break; 383 #ifndef OPENSSL_IS_BORINGSSL 384 case 24: 385 cipher = EVP_aes_192_cbc(); 386 break; 387 #endif /* OPENSSL_IS_BORINGSSL */ 388 case 32: 389 cipher = EVP_aes_256_cbc(); 390 break; 391 default: 392 os_free(ctx); 393 return NULL; 394 } 395 break; 396 #endif /* OPENSSL_NO_AES */ 397 #ifndef OPENSSL_NO_DES 398 case CRYPTO_CIPHER_ALG_3DES: 399 cipher = EVP_des_ede3_cbc(); 400 break; 401 case CRYPTO_CIPHER_ALG_DES: 402 cipher = EVP_des_cbc(); 403 break; 404 #endif /* OPENSSL_NO_DES */ 405 #ifndef OPENSSL_NO_RC2 406 case CRYPTO_CIPHER_ALG_RC2: 407 cipher = EVP_rc2_ecb(); 408 break; 409 #endif /* OPENSSL_NO_RC2 */ 410 default: 411 os_free(ctx); 412 return NULL; 413 } 414 415 EVP_CIPHER_CTX_init(&ctx->enc); 416 EVP_CIPHER_CTX_set_padding(&ctx->enc, 0); 417 if (!EVP_EncryptInit_ex(&ctx->enc, cipher, NULL, NULL, NULL) || 418 !EVP_CIPHER_CTX_set_key_length(&ctx->enc, key_len) || 419 !EVP_EncryptInit_ex(&ctx->enc, NULL, NULL, key, iv)) { 420 EVP_CIPHER_CTX_cleanup(&ctx->enc); 421 os_free(ctx); 422 return NULL; 423 } 424 425 EVP_CIPHER_CTX_init(&ctx->dec); 426 EVP_CIPHER_CTX_set_padding(&ctx->dec, 0); 427 if (!EVP_DecryptInit_ex(&ctx->dec, cipher, NULL, NULL, NULL) || 428 !EVP_CIPHER_CTX_set_key_length(&ctx->dec, key_len) || 429 !EVP_DecryptInit_ex(&ctx->dec, NULL, NULL, key, iv)) { 430 EVP_CIPHER_CTX_cleanup(&ctx->enc); 431 EVP_CIPHER_CTX_cleanup(&ctx->dec); 432 os_free(ctx); 433 return NULL; 434 } 435 436 return ctx; 437 } 438 439 440 int crypto_cipher_encrypt(struct crypto_cipher *ctx, const u8 *plain, 441 u8 *crypt, size_t len) 442 { 443 int outl; 444 if (!EVP_EncryptUpdate(&ctx->enc, crypt, &outl, plain, len)) 445 return -1; 446 return 0; 447 } 448 449 450 int crypto_cipher_decrypt(struct crypto_cipher *ctx, const u8 *crypt, 451 u8 *plain, size_t len) 452 { 453 int outl; 454 outl = len; 455 if (!EVP_DecryptUpdate(&ctx->dec, plain, &outl, crypt, len)) 456 return -1; 457 return 0; 458 } 459 460 461 void crypto_cipher_deinit(struct crypto_cipher *ctx) 462 { 463 EVP_CIPHER_CTX_cleanup(&ctx->enc); 464 EVP_CIPHER_CTX_cleanup(&ctx->dec); 465 os_free(ctx); 466 } 467 468 469 void * dh5_init(struct wpabuf **priv, struct wpabuf **publ) 470 { 471 DH *dh; 472 struct wpabuf *pubkey = NULL, *privkey = NULL; 473 size_t publen, privlen; 474 475 *priv = NULL; 476 *publ = NULL; 477 478 dh = DH_new(); 479 if (dh == NULL) 480 return NULL; 481 482 dh->g = BN_new(); 483 if (dh->g == NULL || BN_set_word(dh->g, 2) != 1) 484 goto err; 485 486 dh->p = get_group5_prime(); 487 if (dh->p == NULL) 488 goto err; 489 490 if (DH_generate_key(dh) != 1) 491 goto err; 492 493 publen = BN_num_bytes(dh->pub_key); 494 pubkey = wpabuf_alloc(publen); 495 if (pubkey == NULL) 496 goto err; 497 privlen = BN_num_bytes(dh->priv_key); 498 privkey = wpabuf_alloc(privlen); 499 if (privkey == NULL) 500 goto err; 501 502 BN_bn2bin(dh->pub_key, wpabuf_put(pubkey, publen)); 503 BN_bn2bin(dh->priv_key, wpabuf_put(privkey, privlen)); 504 505 *priv = privkey; 506 *publ = pubkey; 507 return dh; 508 509 err: 510 wpabuf_free(pubkey); 511 wpabuf_free(privkey); 512 DH_free(dh); 513 return NULL; 514 } 515 516 517 void * dh5_init_fixed(const struct wpabuf *priv, const struct wpabuf *publ) 518 { 519 DH *dh; 520 521 dh = DH_new(); 522 if (dh == NULL) 523 return NULL; 524 525 dh->g = BN_new(); 526 if (dh->g == NULL || BN_set_word(dh->g, 2) != 1) 527 goto err; 528 529 dh->p = get_group5_prime(); 530 if (dh->p == NULL) 531 goto err; 532 533 dh->priv_key = BN_bin2bn(wpabuf_head(priv), wpabuf_len(priv), NULL); 534 if (dh->priv_key == NULL) 535 goto err; 536 537 dh->pub_key = BN_bin2bn(wpabuf_head(publ), wpabuf_len(publ), NULL); 538 if (dh->pub_key == NULL) 539 goto err; 540 541 if (DH_generate_key(dh) != 1) 542 goto err; 543 544 return dh; 545 546 err: 547 DH_free(dh); 548 return NULL; 549 } 550 551 552 struct wpabuf * dh5_derive_shared(void *ctx, const struct wpabuf *peer_public, 553 const struct wpabuf *own_private) 554 { 555 BIGNUM *pub_key; 556 struct wpabuf *res = NULL; 557 size_t rlen; 558 DH *dh = ctx; 559 int keylen; 560 561 if (ctx == NULL) 562 return NULL; 563 564 pub_key = BN_bin2bn(wpabuf_head(peer_public), wpabuf_len(peer_public), 565 NULL); 566 if (pub_key == NULL) 567 return NULL; 568 569 rlen = DH_size(dh); 570 res = wpabuf_alloc(rlen); 571 if (res == NULL) 572 goto err; 573 574 keylen = DH_compute_key(wpabuf_mhead(res), pub_key, dh); 575 if (keylen < 0) 576 goto err; 577 wpabuf_put(res, keylen); 578 BN_clear_free(pub_key); 579 580 return res; 581 582 err: 583 BN_clear_free(pub_key); 584 wpabuf_free(res); 585 return NULL; 586 } 587 588 589 void dh5_free(void *ctx) 590 { 591 DH *dh; 592 if (ctx == NULL) 593 return; 594 dh = ctx; 595 DH_free(dh); 596 } 597 598 599 struct crypto_hash { 600 HMAC_CTX ctx; 601 }; 602 603 604 struct crypto_hash * crypto_hash_init(enum crypto_hash_alg alg, const u8 *key, 605 size_t key_len) 606 { 607 struct crypto_hash *ctx; 608 const EVP_MD *md; 609 610 switch (alg) { 611 #ifndef OPENSSL_NO_MD5 612 case CRYPTO_HASH_ALG_HMAC_MD5: 613 md = EVP_md5(); 614 break; 615 #endif /* OPENSSL_NO_MD5 */ 616 #ifndef OPENSSL_NO_SHA 617 case CRYPTO_HASH_ALG_HMAC_SHA1: 618 md = EVP_sha1(); 619 break; 620 #endif /* OPENSSL_NO_SHA */ 621 #ifndef OPENSSL_NO_SHA256 622 #ifdef CONFIG_SHA256 623 case CRYPTO_HASH_ALG_HMAC_SHA256: 624 md = EVP_sha256(); 625 break; 626 #endif /* CONFIG_SHA256 */ 627 #endif /* OPENSSL_NO_SHA256 */ 628 default: 629 return NULL; 630 } 631 632 ctx = os_zalloc(sizeof(*ctx)); 633 if (ctx == NULL) 634 return NULL; 635 HMAC_CTX_init(&ctx->ctx); 636 637 #if OPENSSL_VERSION_NUMBER < 0x00909000 638 HMAC_Init_ex(&ctx->ctx, key, key_len, md, NULL); 639 #else /* openssl < 0.9.9 */ 640 if (HMAC_Init_ex(&ctx->ctx, key, key_len, md, NULL) != 1) { 641 os_free(ctx); 642 return NULL; 643 } 644 #endif /* openssl < 0.9.9 */ 645 646 return ctx; 647 } 648 649 650 void crypto_hash_update(struct crypto_hash *ctx, const u8 *data, size_t len) 651 { 652 if (ctx == NULL) 653 return; 654 HMAC_Update(&ctx->ctx, data, len); 655 } 656 657 658 int crypto_hash_finish(struct crypto_hash *ctx, u8 *mac, size_t *len) 659 { 660 unsigned int mdlen; 661 int res; 662 663 if (ctx == NULL) 664 return -2; 665 666 if (mac == NULL || len == NULL) { 667 os_free(ctx); 668 return 0; 669 } 670 671 mdlen = *len; 672 #if OPENSSL_VERSION_NUMBER < 0x00909000 673 HMAC_Final(&ctx->ctx, mac, &mdlen); 674 res = 1; 675 #else /* openssl < 0.9.9 */ 676 res = HMAC_Final(&ctx->ctx, mac, &mdlen); 677 #endif /* openssl < 0.9.9 */ 678 HMAC_CTX_cleanup(&ctx->ctx); 679 os_free(ctx); 680 681 if (res == 1) { 682 *len = mdlen; 683 return 0; 684 } 685 686 return -1; 687 } 688 689 690 int pbkdf2_sha1(const char *passphrase, const u8 *ssid, size_t ssid_len, 691 int iterations, u8 *buf, size_t buflen) 692 { 693 #if OPENSSL_VERSION_NUMBER < 0x00908000 694 if (PKCS5_PBKDF2_HMAC_SHA1(passphrase, os_strlen(passphrase), 695 (unsigned char *) ssid, 696 ssid_len, 4096, buflen, buf) != 1) 697 return -1; 698 #else /* openssl < 0.9.8 */ 699 if (PKCS5_PBKDF2_HMAC_SHA1(passphrase, os_strlen(passphrase), ssid, 700 ssid_len, 4096, buflen, buf) != 1) 701 return -1; 702 #endif /* openssl < 0.9.8 */ 703 return 0; 704 } 705 706 707 int hmac_sha1_vector(const u8 *key, size_t key_len, size_t num_elem, 708 const u8 *addr[], const size_t *len, u8 *mac) 709 { 710 HMAC_CTX ctx; 711 size_t i; 712 unsigned int mdlen; 713 int res; 714 715 HMAC_CTX_init(&ctx); 716 #if OPENSSL_VERSION_NUMBER < 0x00909000 717 HMAC_Init_ex(&ctx, key, key_len, EVP_sha1(), NULL); 718 #else /* openssl < 0.9.9 */ 719 if (HMAC_Init_ex(&ctx, key, key_len, EVP_sha1(), NULL) != 1) 720 return -1; 721 #endif /* openssl < 0.9.9 */ 722 723 for (i = 0; i < num_elem; i++) 724 HMAC_Update(&ctx, addr[i], len[i]); 725 726 mdlen = 20; 727 #if OPENSSL_VERSION_NUMBER < 0x00909000 728 HMAC_Final(&ctx, mac, &mdlen); 729 res = 1; 730 #else /* openssl < 0.9.9 */ 731 res = HMAC_Final(&ctx, mac, &mdlen); 732 #endif /* openssl < 0.9.9 */ 733 HMAC_CTX_cleanup(&ctx); 734 735 return res == 1 ? 0 : -1; 736 } 737 738 739 int hmac_sha1(const u8 *key, size_t key_len, const u8 *data, size_t data_len, 740 u8 *mac) 741 { 742 return hmac_sha1_vector(key, key_len, 1, &data, &data_len, mac); 743 } 744 745 746 #ifdef CONFIG_SHA256 747 748 int hmac_sha256_vector(const u8 *key, size_t key_len, size_t num_elem, 749 const u8 *addr[], const size_t *len, u8 *mac) 750 { 751 HMAC_CTX ctx; 752 size_t i; 753 unsigned int mdlen; 754 int res; 755 756 HMAC_CTX_init(&ctx); 757 #if OPENSSL_VERSION_NUMBER < 0x00909000 758 HMAC_Init_ex(&ctx, key, key_len, EVP_sha256(), NULL); 759 #else /* openssl < 0.9.9 */ 760 if (HMAC_Init_ex(&ctx, key, key_len, EVP_sha256(), NULL) != 1) 761 return -1; 762 #endif /* openssl < 0.9.9 */ 763 764 for (i = 0; i < num_elem; i++) 765 HMAC_Update(&ctx, addr[i], len[i]); 766 767 mdlen = 32; 768 #if OPENSSL_VERSION_NUMBER < 0x00909000 769 HMAC_Final(&ctx, mac, &mdlen); 770 res = 1; 771 #else /* openssl < 0.9.9 */ 772 res = HMAC_Final(&ctx, mac, &mdlen); 773 #endif /* openssl < 0.9.9 */ 774 HMAC_CTX_cleanup(&ctx); 775 776 return res == 1 ? 0 : -1; 777 } 778 779 780 int hmac_sha256(const u8 *key, size_t key_len, const u8 *data, 781 size_t data_len, u8 *mac) 782 { 783 return hmac_sha256_vector(key, key_len, 1, &data, &data_len, mac); 784 } 785 786 #endif /* CONFIG_SHA256 */ 787 788 789 int crypto_get_random(void *buf, size_t len) 790 { 791 if (RAND_bytes(buf, len) != 1) 792 return -1; 793 return 0; 794 } 795 796 797 #ifdef CONFIG_OPENSSL_CMAC 798 int omac1_aes_128_vector(const u8 *key, size_t num_elem, 799 const u8 *addr[], const size_t *len, u8 *mac) 800 { 801 CMAC_CTX *ctx; 802 int ret = -1; 803 size_t outlen, i; 804 805 ctx = CMAC_CTX_new(); 806 if (ctx == NULL) 807 return -1; 808 809 if (!CMAC_Init(ctx, key, 16, EVP_aes_128_cbc(), NULL)) 810 goto fail; 811 for (i = 0; i < num_elem; i++) { 812 if (!CMAC_Update(ctx, addr[i], len[i])) 813 goto fail; 814 } 815 if (!CMAC_Final(ctx, mac, &outlen) || outlen != 16) 816 goto fail; 817 818 ret = 0; 819 fail: 820 CMAC_CTX_free(ctx); 821 return ret; 822 } 823 824 825 int omac1_aes_128(const u8 *key, const u8 *data, size_t data_len, u8 *mac) 826 { 827 return omac1_aes_128_vector(key, 1, &data, &data_len, mac); 828 } 829 #endif /* CONFIG_OPENSSL_CMAC */ 830 831 832 struct crypto_bignum * crypto_bignum_init(void) 833 { 834 return (struct crypto_bignum *) BN_new(); 835 } 836 837 838 struct crypto_bignum * crypto_bignum_init_set(const u8 *buf, size_t len) 839 { 840 BIGNUM *bn = BN_bin2bn(buf, len, NULL); 841 return (struct crypto_bignum *) bn; 842 } 843 844 845 void crypto_bignum_deinit(struct crypto_bignum *n, int clear) 846 { 847 if (clear) 848 BN_clear_free((BIGNUM *) n); 849 else 850 BN_free((BIGNUM *) n); 851 } 852 853 854 int crypto_bignum_to_bin(const struct crypto_bignum *a, 855 u8 *buf, size_t buflen, size_t padlen) 856 { 857 int num_bytes, offset; 858 859 if (padlen > buflen) 860 return -1; 861 862 num_bytes = BN_num_bytes((const BIGNUM *) a); 863 if ((size_t) num_bytes > buflen) 864 return -1; 865 if (padlen > (size_t) num_bytes) 866 offset = padlen - num_bytes; 867 else 868 offset = 0; 869 870 os_memset(buf, 0, offset); 871 BN_bn2bin((const BIGNUM *) a, buf + offset); 872 873 return num_bytes + offset; 874 } 875 876 877 int crypto_bignum_add(const struct crypto_bignum *a, 878 const struct crypto_bignum *b, 879 struct crypto_bignum *c) 880 { 881 return BN_add((BIGNUM *) c, (const BIGNUM *) a, (const BIGNUM *) b) ? 882 0 : -1; 883 } 884 885 886 int crypto_bignum_mod(const struct crypto_bignum *a, 887 const struct crypto_bignum *b, 888 struct crypto_bignum *c) 889 { 890 int res; 891 BN_CTX *bnctx; 892 893 bnctx = BN_CTX_new(); 894 if (bnctx == NULL) 895 return -1; 896 res = BN_mod((BIGNUM *) c, (const BIGNUM *) a, (const BIGNUM *) b, 897 bnctx); 898 BN_CTX_free(bnctx); 899 900 return res ? 0 : -1; 901 } 902 903 904 int crypto_bignum_exptmod(const struct crypto_bignum *a, 905 const struct crypto_bignum *b, 906 const struct crypto_bignum *c, 907 struct crypto_bignum *d) 908 { 909 int res; 910 BN_CTX *bnctx; 911 912 bnctx = BN_CTX_new(); 913 if (bnctx == NULL) 914 return -1; 915 res = BN_mod_exp((BIGNUM *) d, (const BIGNUM *) a, (const BIGNUM *) b, 916 (const BIGNUM *) c, bnctx); 917 BN_CTX_free(bnctx); 918 919 return res ? 0 : -1; 920 } 921 922 923 int crypto_bignum_inverse(const struct crypto_bignum *a, 924 const struct crypto_bignum *b, 925 struct crypto_bignum *c) 926 { 927 BIGNUM *res; 928 BN_CTX *bnctx; 929 930 bnctx = BN_CTX_new(); 931 if (bnctx == NULL) 932 return -1; 933 res = BN_mod_inverse((BIGNUM *) c, (const BIGNUM *) a, 934 (const BIGNUM *) b, bnctx); 935 BN_CTX_free(bnctx); 936 937 return res ? 0 : -1; 938 } 939 940 941 int crypto_bignum_sub(const struct crypto_bignum *a, 942 const struct crypto_bignum *b, 943 struct crypto_bignum *c) 944 { 945 return BN_sub((BIGNUM *) c, (const BIGNUM *) a, (const BIGNUM *) b) ? 946 0 : -1; 947 } 948 949 950 int crypto_bignum_div(const struct crypto_bignum *a, 951 const struct crypto_bignum *b, 952 struct crypto_bignum *c) 953 { 954 int res; 955 956 BN_CTX *bnctx; 957 958 bnctx = BN_CTX_new(); 959 if (bnctx == NULL) 960 return -1; 961 res = BN_div((BIGNUM *) c, NULL, (const BIGNUM *) a, 962 (const BIGNUM *) b, bnctx); 963 BN_CTX_free(bnctx); 964 965 return res ? 0 : -1; 966 } 967 968 969 int crypto_bignum_mulmod(const struct crypto_bignum *a, 970 const struct crypto_bignum *b, 971 const struct crypto_bignum *c, 972 struct crypto_bignum *d) 973 { 974 int res; 975 976 BN_CTX *bnctx; 977 978 bnctx = BN_CTX_new(); 979 if (bnctx == NULL) 980 return -1; 981 res = BN_mod_mul((BIGNUM *) d, (const BIGNUM *) a, (const BIGNUM *) b, 982 (const BIGNUM *) c, bnctx); 983 BN_CTX_free(bnctx); 984 985 return res ? 0 : -1; 986 } 987 988 989 int crypto_bignum_cmp(const struct crypto_bignum *a, 990 const struct crypto_bignum *b) 991 { 992 return BN_cmp((const BIGNUM *) a, (const BIGNUM *) b); 993 } 994 995 996 int crypto_bignum_bits(const struct crypto_bignum *a) 997 { 998 return BN_num_bits((const BIGNUM *) a); 999 } 1000 1001 1002 int crypto_bignum_is_zero(const struct crypto_bignum *a) 1003 { 1004 return BN_is_zero((const BIGNUM *) a); 1005 } 1006 1007 1008 int crypto_bignum_is_one(const struct crypto_bignum *a) 1009 { 1010 return BN_is_one((const BIGNUM *) a); 1011 } 1012 1013 1014 #ifdef CONFIG_ECC 1015 1016 struct crypto_ec { 1017 EC_GROUP *group; 1018 BN_CTX *bnctx; 1019 BIGNUM *prime; 1020 BIGNUM *order; 1021 }; 1022 1023 struct crypto_ec * crypto_ec_init(int group) 1024 { 1025 struct crypto_ec *e; 1026 int nid; 1027 1028 /* Map from IANA registry for IKE D-H groups to OpenSSL NID */ 1029 switch (group) { 1030 case 19: 1031 nid = NID_X9_62_prime256v1; 1032 break; 1033 case 20: 1034 nid = NID_secp384r1; 1035 break; 1036 case 21: 1037 nid = NID_secp521r1; 1038 break; 1039 case 25: 1040 nid = NID_X9_62_prime192v1; 1041 break; 1042 case 26: 1043 nid = NID_secp224r1; 1044 break; 1045 default: 1046 return NULL; 1047 } 1048 1049 e = os_zalloc(sizeof(*e)); 1050 if (e == NULL) 1051 return NULL; 1052 1053 e->bnctx = BN_CTX_new(); 1054 e->group = EC_GROUP_new_by_curve_name(nid); 1055 e->prime = BN_new(); 1056 e->order = BN_new(); 1057 if (e->group == NULL || e->bnctx == NULL || e->prime == NULL || 1058 e->order == NULL || 1059 !EC_GROUP_get_curve_GFp(e->group, e->prime, NULL, NULL, e->bnctx) || 1060 !EC_GROUP_get_order(e->group, e->order, e->bnctx)) { 1061 crypto_ec_deinit(e); 1062 e = NULL; 1063 } 1064 1065 return e; 1066 } 1067 1068 1069 void crypto_ec_deinit(struct crypto_ec *e) 1070 { 1071 if (e == NULL) 1072 return; 1073 BN_clear_free(e->order); 1074 BN_clear_free(e->prime); 1075 EC_GROUP_free(e->group); 1076 BN_CTX_free(e->bnctx); 1077 os_free(e); 1078 } 1079 1080 1081 struct crypto_ec_point * crypto_ec_point_init(struct crypto_ec *e) 1082 { 1083 if (e == NULL) 1084 return NULL; 1085 return (struct crypto_ec_point *) EC_POINT_new(e->group); 1086 } 1087 1088 1089 size_t crypto_ec_prime_len(struct crypto_ec *e) 1090 { 1091 return BN_num_bytes(e->prime); 1092 } 1093 1094 1095 size_t crypto_ec_prime_len_bits(struct crypto_ec *e) 1096 { 1097 return BN_num_bits(e->prime); 1098 } 1099 1100 1101 const struct crypto_bignum * crypto_ec_get_prime(struct crypto_ec *e) 1102 { 1103 return (const struct crypto_bignum *) e->prime; 1104 } 1105 1106 1107 const struct crypto_bignum * crypto_ec_get_order(struct crypto_ec *e) 1108 { 1109 return (const struct crypto_bignum *) e->order; 1110 } 1111 1112 1113 void crypto_ec_point_deinit(struct crypto_ec_point *p, int clear) 1114 { 1115 if (clear) 1116 EC_POINT_clear_free((EC_POINT *) p); 1117 else 1118 EC_POINT_free((EC_POINT *) p); 1119 } 1120 1121 1122 int crypto_ec_point_to_bin(struct crypto_ec *e, 1123 const struct crypto_ec_point *point, u8 *x, u8 *y) 1124 { 1125 BIGNUM *x_bn, *y_bn; 1126 int ret = -1; 1127 int len = BN_num_bytes(e->prime); 1128 1129 x_bn = BN_new(); 1130 y_bn = BN_new(); 1131 1132 if (x_bn && y_bn && 1133 EC_POINT_get_affine_coordinates_GFp(e->group, (EC_POINT *) point, 1134 x_bn, y_bn, e->bnctx)) { 1135 if (x) { 1136 crypto_bignum_to_bin((struct crypto_bignum *) x_bn, 1137 x, len, len); 1138 } 1139 if (y) { 1140 crypto_bignum_to_bin((struct crypto_bignum *) y_bn, 1141 y, len, len); 1142 } 1143 ret = 0; 1144 } 1145 1146 BN_clear_free(x_bn); 1147 BN_clear_free(y_bn); 1148 return ret; 1149 } 1150 1151 1152 struct crypto_ec_point * crypto_ec_point_from_bin(struct crypto_ec *e, 1153 const u8 *val) 1154 { 1155 BIGNUM *x, *y; 1156 EC_POINT *elem; 1157 int len = BN_num_bytes(e->prime); 1158 1159 x = BN_bin2bn(val, len, NULL); 1160 y = BN_bin2bn(val + len, len, NULL); 1161 elem = EC_POINT_new(e->group); 1162 if (x == NULL || y == NULL || elem == NULL) { 1163 BN_clear_free(x); 1164 BN_clear_free(y); 1165 EC_POINT_clear_free(elem); 1166 return NULL; 1167 } 1168 1169 if (!EC_POINT_set_affine_coordinates_GFp(e->group, elem, x, y, 1170 e->bnctx)) { 1171 EC_POINT_clear_free(elem); 1172 elem = NULL; 1173 } 1174 1175 BN_clear_free(x); 1176 BN_clear_free(y); 1177 1178 return (struct crypto_ec_point *) elem; 1179 } 1180 1181 1182 int crypto_ec_point_add(struct crypto_ec *e, const struct crypto_ec_point *a, 1183 const struct crypto_ec_point *b, 1184 struct crypto_ec_point *c) 1185 { 1186 return EC_POINT_add(e->group, (EC_POINT *) c, (const EC_POINT *) a, 1187 (const EC_POINT *) b, e->bnctx) ? 0 : -1; 1188 } 1189 1190 1191 int crypto_ec_point_mul(struct crypto_ec *e, const struct crypto_ec_point *p, 1192 const struct crypto_bignum *b, 1193 struct crypto_ec_point *res) 1194 { 1195 return EC_POINT_mul(e->group, (EC_POINT *) res, NULL, 1196 (const EC_POINT *) p, (const BIGNUM *) b, e->bnctx) 1197 ? 0 : -1; 1198 } 1199 1200 1201 int crypto_ec_point_invert(struct crypto_ec *e, struct crypto_ec_point *p) 1202 { 1203 return EC_POINT_invert(e->group, (EC_POINT *) p, e->bnctx) ? 0 : -1; 1204 } 1205 1206 1207 int crypto_ec_point_solve_y_coord(struct crypto_ec *e, 1208 struct crypto_ec_point *p, 1209 const struct crypto_bignum *x, int y_bit) 1210 { 1211 if (!EC_POINT_set_compressed_coordinates_GFp(e->group, (EC_POINT *) p, 1212 (const BIGNUM *) x, y_bit, 1213 e->bnctx) || 1214 !EC_POINT_is_on_curve(e->group, (EC_POINT *) p, e->bnctx)) 1215 return -1; 1216 return 0; 1217 } 1218 1219 1220 int crypto_ec_point_is_at_infinity(struct crypto_ec *e, 1221 const struct crypto_ec_point *p) 1222 { 1223 return EC_POINT_is_at_infinity(e->group, (const EC_POINT *) p); 1224 } 1225 1226 1227 int crypto_ec_point_is_on_curve(struct crypto_ec *e, 1228 const struct crypto_ec_point *p) 1229 { 1230 return EC_POINT_is_on_curve(e->group, (const EC_POINT *) p, e->bnctx); 1231 } 1232 1233 #endif /* CONFIG_ECC */ 1234