1 /* 2 * Copyright 2006-2016 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #include <stdio.h> 11 #include "internal/cryptlib.h" 12 #include <openssl/x509.h> 13 #include <openssl/asn1.h> 14 #include "dh_locl.h" 15 #include <openssl/bn.h> 16 #include "internal/asn1_int.h" 17 #include "internal/evp_int.h" 18 #include <openssl/cms.h> 19 20 /* 21 * i2d/d2i like DH parameter functions which use the appropriate routine for 22 * PKCS#3 DH or X9.42 DH. 23 */ 24 25 static DH *d2i_dhp(const EVP_PKEY *pkey, const unsigned char **pp, 26 long length) 27 { 28 if (pkey->ameth == &dhx_asn1_meth) 29 return d2i_DHxparams(NULL, pp, length); 30 return d2i_DHparams(NULL, pp, length); 31 } 32 33 static int i2d_dhp(const EVP_PKEY *pkey, const DH *a, unsigned char **pp) 34 { 35 if (pkey->ameth == &dhx_asn1_meth) 36 return i2d_DHxparams(a, pp); 37 return i2d_DHparams(a, pp); 38 } 39 40 static void int_dh_free(EVP_PKEY *pkey) 41 { 42 DH_free(pkey->pkey.dh); 43 } 44 45 static int dh_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey) 46 { 47 const unsigned char *p, *pm; 48 int pklen, pmlen; 49 int ptype; 50 const void *pval; 51 const ASN1_STRING *pstr; 52 X509_ALGOR *palg; 53 ASN1_INTEGER *public_key = NULL; 54 55 DH *dh = NULL; 56 57 if (!X509_PUBKEY_get0_param(NULL, &p, &pklen, &palg, pubkey)) 58 return 0; 59 X509_ALGOR_get0(NULL, &ptype, &pval, palg); 60 61 if (ptype != V_ASN1_SEQUENCE) { 62 DHerr(DH_F_DH_PUB_DECODE, DH_R_PARAMETER_ENCODING_ERROR); 63 goto err; 64 } 65 66 pstr = pval; 67 pm = pstr->data; 68 pmlen = pstr->length; 69 70 if ((dh = d2i_dhp(pkey, &pm, pmlen)) == NULL) { 71 DHerr(DH_F_DH_PUB_DECODE, DH_R_DECODE_ERROR); 72 goto err; 73 } 74 75 if ((public_key = d2i_ASN1_INTEGER(NULL, &p, pklen)) == NULL) { 76 DHerr(DH_F_DH_PUB_DECODE, DH_R_DECODE_ERROR); 77 goto err; 78 } 79 80 /* We have parameters now set public key */ 81 if ((dh->pub_key = ASN1_INTEGER_to_BN(public_key, NULL)) == NULL) { 82 DHerr(DH_F_DH_PUB_DECODE, DH_R_BN_DECODE_ERROR); 83 goto err; 84 } 85 86 ASN1_INTEGER_free(public_key); 87 EVP_PKEY_assign(pkey, pkey->ameth->pkey_id, dh); 88 return 1; 89 90 err: 91 ASN1_INTEGER_free(public_key); 92 DH_free(dh); 93 return 0; 94 95 } 96 97 static int dh_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey) 98 { 99 DH *dh; 100 int ptype; 101 unsigned char *penc = NULL; 102 int penclen; 103 ASN1_STRING *str; 104 ASN1_INTEGER *pub_key = NULL; 105 106 dh = pkey->pkey.dh; 107 108 str = ASN1_STRING_new(); 109 if (str == NULL) { 110 DHerr(DH_F_DH_PUB_ENCODE, ERR_R_MALLOC_FAILURE); 111 goto err; 112 } 113 str->length = i2d_dhp(pkey, dh, &str->data); 114 if (str->length <= 0) { 115 DHerr(DH_F_DH_PUB_ENCODE, ERR_R_MALLOC_FAILURE); 116 goto err; 117 } 118 ptype = V_ASN1_SEQUENCE; 119 120 pub_key = BN_to_ASN1_INTEGER(dh->pub_key, NULL); 121 if (!pub_key) 122 goto err; 123 124 penclen = i2d_ASN1_INTEGER(pub_key, &penc); 125 126 ASN1_INTEGER_free(pub_key); 127 128 if (penclen <= 0) { 129 DHerr(DH_F_DH_PUB_ENCODE, ERR_R_MALLOC_FAILURE); 130 goto err; 131 } 132 133 if (X509_PUBKEY_set0_param(pk, OBJ_nid2obj(pkey->ameth->pkey_id), 134 ptype, str, penc, penclen)) 135 return 1; 136 137 err: 138 OPENSSL_free(penc); 139 ASN1_STRING_free(str); 140 141 return 0; 142 } 143 144 /* 145 * PKCS#8 DH is defined in PKCS#11 of all places. It is similar to DH in that 146 * the AlgorithmIdentifier contains the parameters, the private key is 147 * explicitly included and the pubkey must be recalculated. 148 */ 149 150 static int dh_priv_decode(EVP_PKEY *pkey, const PKCS8_PRIV_KEY_INFO *p8) 151 { 152 const unsigned char *p, *pm; 153 int pklen, pmlen; 154 int ptype; 155 const void *pval; 156 const ASN1_STRING *pstr; 157 const X509_ALGOR *palg; 158 ASN1_INTEGER *privkey = NULL; 159 160 DH *dh = NULL; 161 162 if (!PKCS8_pkey_get0(NULL, &p, &pklen, &palg, p8)) 163 return 0; 164 165 X509_ALGOR_get0(NULL, &ptype, &pval, palg); 166 167 if (ptype != V_ASN1_SEQUENCE) 168 goto decerr; 169 if ((privkey = d2i_ASN1_INTEGER(NULL, &p, pklen)) == NULL) 170 goto decerr; 171 172 pstr = pval; 173 pm = pstr->data; 174 pmlen = pstr->length; 175 if ((dh = d2i_dhp(pkey, &pm, pmlen)) == NULL) 176 goto decerr; 177 178 /* We have parameters now set private key */ 179 if ((dh->priv_key = BN_secure_new()) == NULL 180 || !ASN1_INTEGER_to_BN(privkey, dh->priv_key)) { 181 DHerr(DH_F_DH_PRIV_DECODE, DH_R_BN_ERROR); 182 goto dherr; 183 } 184 /* Calculate public key */ 185 if (!DH_generate_key(dh)) 186 goto dherr; 187 188 EVP_PKEY_assign(pkey, pkey->ameth->pkey_id, dh); 189 190 ASN1_STRING_clear_free(privkey); 191 192 return 1; 193 194 decerr: 195 DHerr(DH_F_DH_PRIV_DECODE, EVP_R_DECODE_ERROR); 196 dherr: 197 DH_free(dh); 198 ASN1_STRING_clear_free(privkey); 199 return 0; 200 } 201 202 static int dh_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey) 203 { 204 ASN1_STRING *params = NULL; 205 ASN1_INTEGER *prkey = NULL; 206 unsigned char *dp = NULL; 207 int dplen; 208 209 params = ASN1_STRING_new(); 210 211 if (params == NULL) { 212 DHerr(DH_F_DH_PRIV_ENCODE, ERR_R_MALLOC_FAILURE); 213 goto err; 214 } 215 216 params->length = i2d_dhp(pkey, pkey->pkey.dh, ¶ms->data); 217 if (params->length <= 0) { 218 DHerr(DH_F_DH_PRIV_ENCODE, ERR_R_MALLOC_FAILURE); 219 goto err; 220 } 221 params->type = V_ASN1_SEQUENCE; 222 223 /* Get private key into integer */ 224 prkey = BN_to_ASN1_INTEGER(pkey->pkey.dh->priv_key, NULL); 225 226 if (!prkey) { 227 DHerr(DH_F_DH_PRIV_ENCODE, DH_R_BN_ERROR); 228 goto err; 229 } 230 231 dplen = i2d_ASN1_INTEGER(prkey, &dp); 232 233 ASN1_STRING_clear_free(prkey); 234 prkey = NULL; 235 236 if (!PKCS8_pkey_set0(p8, OBJ_nid2obj(pkey->ameth->pkey_id), 0, 237 V_ASN1_SEQUENCE, params, dp, dplen)) 238 goto err; 239 240 return 1; 241 242 err: 243 OPENSSL_free(dp); 244 ASN1_STRING_free(params); 245 ASN1_STRING_clear_free(prkey); 246 return 0; 247 } 248 249 static int dh_param_decode(EVP_PKEY *pkey, 250 const unsigned char **pder, int derlen) 251 { 252 DH *dh; 253 254 if ((dh = d2i_dhp(pkey, pder, derlen)) == NULL) { 255 DHerr(DH_F_DH_PARAM_DECODE, ERR_R_DH_LIB); 256 return 0; 257 } 258 EVP_PKEY_assign(pkey, pkey->ameth->pkey_id, dh); 259 return 1; 260 } 261 262 static int dh_param_encode(const EVP_PKEY *pkey, unsigned char **pder) 263 { 264 return i2d_dhp(pkey, pkey->pkey.dh, pder); 265 } 266 267 static int do_dh_print(BIO *bp, const DH *x, int indent, int ptype) 268 { 269 int reason = ERR_R_BUF_LIB; 270 const char *ktype = NULL; 271 BIGNUM *priv_key, *pub_key; 272 273 if (ptype == 2) 274 priv_key = x->priv_key; 275 else 276 priv_key = NULL; 277 278 if (ptype > 0) 279 pub_key = x->pub_key; 280 else 281 pub_key = NULL; 282 283 if (x->p == NULL || (ptype == 2 && priv_key == NULL) 284 || (ptype > 0 && pub_key == NULL)) { 285 reason = ERR_R_PASSED_NULL_PARAMETER; 286 goto err; 287 } 288 289 if (ptype == 2) 290 ktype = "DH Private-Key"; 291 else if (ptype == 1) 292 ktype = "DH Public-Key"; 293 else 294 ktype = "DH Parameters"; 295 296 BIO_indent(bp, indent, 128); 297 if (BIO_printf(bp, "%s: (%d bit)\n", ktype, BN_num_bits(x->p)) <= 0) 298 goto err; 299 indent += 4; 300 301 if (!ASN1_bn_print(bp, "private-key:", priv_key, NULL, indent)) 302 goto err; 303 if (!ASN1_bn_print(bp, "public-key:", pub_key, NULL, indent)) 304 goto err; 305 306 if (!ASN1_bn_print(bp, "prime:", x->p, NULL, indent)) 307 goto err; 308 if (!ASN1_bn_print(bp, "generator:", x->g, NULL, indent)) 309 goto err; 310 if (x->q && !ASN1_bn_print(bp, "subgroup order:", x->q, NULL, indent)) 311 goto err; 312 if (x->j && !ASN1_bn_print(bp, "subgroup factor:", x->j, NULL, indent)) 313 goto err; 314 if (x->seed) { 315 int i; 316 BIO_indent(bp, indent, 128); 317 BIO_puts(bp, "seed:"); 318 for (i = 0; i < x->seedlen; i++) { 319 if ((i % 15) == 0) { 320 if (BIO_puts(bp, "\n") <= 0 321 || !BIO_indent(bp, indent + 4, 128)) 322 goto err; 323 } 324 if (BIO_printf(bp, "%02x%s", x->seed[i], 325 ((i + 1) == x->seedlen) ? "" : ":") <= 0) 326 goto err; 327 } 328 if (BIO_write(bp, "\n", 1) <= 0) 329 return 0; 330 } 331 if (x->counter && !ASN1_bn_print(bp, "counter:", x->counter, NULL, indent)) 332 goto err; 333 if (x->length != 0) { 334 BIO_indent(bp, indent, 128); 335 if (BIO_printf(bp, "recommended-private-length: %d bits\n", 336 (int)x->length) <= 0) 337 goto err; 338 } 339 340 return 1; 341 342 err: 343 DHerr(DH_F_DO_DH_PRINT, reason); 344 return 0; 345 } 346 347 static int int_dh_size(const EVP_PKEY *pkey) 348 { 349 return DH_size(pkey->pkey.dh); 350 } 351 352 static int dh_bits(const EVP_PKEY *pkey) 353 { 354 return BN_num_bits(pkey->pkey.dh->p); 355 } 356 357 static int dh_security_bits(const EVP_PKEY *pkey) 358 { 359 return DH_security_bits(pkey->pkey.dh); 360 } 361 362 static int dh_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b) 363 { 364 if (BN_cmp(a->pkey.dh->p, b->pkey.dh->p) || 365 BN_cmp(a->pkey.dh->g, b->pkey.dh->g)) 366 return 0; 367 else if (a->ameth == &dhx_asn1_meth) { 368 if (BN_cmp(a->pkey.dh->q, b->pkey.dh->q)) 369 return 0; 370 } 371 return 1; 372 } 373 374 static int int_dh_bn_cpy(BIGNUM **dst, const BIGNUM *src) 375 { 376 BIGNUM *a; 377 378 /* 379 * If source is read only just copy the pointer, so 380 * we don't have to reallocate it. 381 */ 382 if (src == NULL) 383 a = NULL; 384 else if (BN_get_flags(src, BN_FLG_STATIC_DATA) 385 && !BN_get_flags(src, BN_FLG_MALLOCED)) 386 a = (BIGNUM *)src; 387 else if ((a = BN_dup(src)) == NULL) 388 return 0; 389 BN_clear_free(*dst); 390 *dst = a; 391 return 1; 392 } 393 394 static int int_dh_param_copy(DH *to, const DH *from, int is_x942) 395 { 396 if (is_x942 == -1) 397 is_x942 = ! !from->q; 398 if (!int_dh_bn_cpy(&to->p, from->p)) 399 return 0; 400 if (!int_dh_bn_cpy(&to->g, from->g)) 401 return 0; 402 if (is_x942) { 403 if (!int_dh_bn_cpy(&to->q, from->q)) 404 return 0; 405 if (!int_dh_bn_cpy(&to->j, from->j)) 406 return 0; 407 OPENSSL_free(to->seed); 408 to->seed = NULL; 409 to->seedlen = 0; 410 if (from->seed) { 411 to->seed = OPENSSL_memdup(from->seed, from->seedlen); 412 if (!to->seed) 413 return 0; 414 to->seedlen = from->seedlen; 415 } 416 } else 417 to->length = from->length; 418 return 1; 419 } 420 421 DH *DHparams_dup(DH *dh) 422 { 423 DH *ret; 424 ret = DH_new(); 425 if (ret == NULL) 426 return NULL; 427 if (!int_dh_param_copy(ret, dh, -1)) { 428 DH_free(ret); 429 return NULL; 430 } 431 return ret; 432 } 433 434 static int dh_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from) 435 { 436 if (to->pkey.dh == NULL) { 437 to->pkey.dh = DH_new(); 438 if (to->pkey.dh == NULL) 439 return 0; 440 } 441 return int_dh_param_copy(to->pkey.dh, from->pkey.dh, 442 from->ameth == &dhx_asn1_meth); 443 } 444 445 static int dh_missing_parameters(const EVP_PKEY *a) 446 { 447 if (a->pkey.dh == NULL || a->pkey.dh->p == NULL || a->pkey.dh->g == NULL) 448 return 1; 449 return 0; 450 } 451 452 static int dh_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) 453 { 454 if (dh_cmp_parameters(a, b) == 0) 455 return 0; 456 if (BN_cmp(b->pkey.dh->pub_key, a->pkey.dh->pub_key) != 0) 457 return 0; 458 else 459 return 1; 460 } 461 462 static int dh_param_print(BIO *bp, const EVP_PKEY *pkey, int indent, 463 ASN1_PCTX *ctx) 464 { 465 return do_dh_print(bp, pkey->pkey.dh, indent, 0); 466 } 467 468 static int dh_public_print(BIO *bp, const EVP_PKEY *pkey, int indent, 469 ASN1_PCTX *ctx) 470 { 471 return do_dh_print(bp, pkey->pkey.dh, indent, 1); 472 } 473 474 static int dh_private_print(BIO *bp, const EVP_PKEY *pkey, int indent, 475 ASN1_PCTX *ctx) 476 { 477 return do_dh_print(bp, pkey->pkey.dh, indent, 2); 478 } 479 480 int DHparams_print(BIO *bp, const DH *x) 481 { 482 return do_dh_print(bp, x, 4, 0); 483 } 484 485 #ifndef OPENSSL_NO_CMS 486 static int dh_cms_decrypt(CMS_RecipientInfo *ri); 487 static int dh_cms_encrypt(CMS_RecipientInfo *ri); 488 #endif 489 490 static int dh_pkey_ctrl(EVP_PKEY *pkey, int op, long arg1, void *arg2) 491 { 492 switch (op) { 493 #ifndef OPENSSL_NO_CMS 494 495 case ASN1_PKEY_CTRL_CMS_ENVELOPE: 496 if (arg1 == 1) 497 return dh_cms_decrypt(arg2); 498 else if (arg1 == 0) 499 return dh_cms_encrypt(arg2); 500 return -2; 501 502 case ASN1_PKEY_CTRL_CMS_RI_TYPE: 503 *(int *)arg2 = CMS_RECIPINFO_AGREE; 504 return 1; 505 #endif 506 default: 507 return -2; 508 } 509 510 } 511 512 static int dh_pkey_public_check(const EVP_PKEY *pkey) 513 { 514 DH *dh = pkey->pkey.dh; 515 516 if (dh->pub_key == NULL) { 517 DHerr(DH_F_DH_PKEY_PUBLIC_CHECK, DH_R_MISSING_PUBKEY); 518 return 0; 519 } 520 521 return DH_check_pub_key_ex(dh, dh->pub_key); 522 } 523 524 static int dh_pkey_param_check(const EVP_PKEY *pkey) 525 { 526 DH *dh = pkey->pkey.dh; 527 528 return DH_check_ex(dh); 529 } 530 531 const EVP_PKEY_ASN1_METHOD dh_asn1_meth = { 532 EVP_PKEY_DH, 533 EVP_PKEY_DH, 534 0, 535 536 "DH", 537 "OpenSSL PKCS#3 DH method", 538 539 dh_pub_decode, 540 dh_pub_encode, 541 dh_pub_cmp, 542 dh_public_print, 543 544 dh_priv_decode, 545 dh_priv_encode, 546 dh_private_print, 547 548 int_dh_size, 549 dh_bits, 550 dh_security_bits, 551 552 dh_param_decode, 553 dh_param_encode, 554 dh_missing_parameters, 555 dh_copy_parameters, 556 dh_cmp_parameters, 557 dh_param_print, 558 0, 559 560 int_dh_free, 561 0, 562 563 0, 0, 0, 0, 0, 564 565 0, 566 dh_pkey_public_check, 567 dh_pkey_param_check 568 }; 569 570 const EVP_PKEY_ASN1_METHOD dhx_asn1_meth = { 571 EVP_PKEY_DHX, 572 EVP_PKEY_DHX, 573 0, 574 575 "X9.42 DH", 576 "OpenSSL X9.42 DH method", 577 578 dh_pub_decode, 579 dh_pub_encode, 580 dh_pub_cmp, 581 dh_public_print, 582 583 dh_priv_decode, 584 dh_priv_encode, 585 dh_private_print, 586 587 int_dh_size, 588 dh_bits, 589 dh_security_bits, 590 591 dh_param_decode, 592 dh_param_encode, 593 dh_missing_parameters, 594 dh_copy_parameters, 595 dh_cmp_parameters, 596 dh_param_print, 597 0, 598 599 int_dh_free, 600 dh_pkey_ctrl, 601 602 0, 0, 0, 0, 0, 603 604 0, 605 dh_pkey_public_check, 606 dh_pkey_param_check 607 }; 608 609 #ifndef OPENSSL_NO_CMS 610 611 static int dh_cms_set_peerkey(EVP_PKEY_CTX *pctx, 612 X509_ALGOR *alg, ASN1_BIT_STRING *pubkey) 613 { 614 const ASN1_OBJECT *aoid; 615 int atype; 616 const void *aval; 617 ASN1_INTEGER *public_key = NULL; 618 int rv = 0; 619 EVP_PKEY *pkpeer = NULL, *pk = NULL; 620 DH *dhpeer = NULL; 621 const unsigned char *p; 622 int plen; 623 624 X509_ALGOR_get0(&aoid, &atype, &aval, alg); 625 if (OBJ_obj2nid(aoid) != NID_dhpublicnumber) 626 goto err; 627 /* Only absent parameters allowed in RFC XXXX */ 628 if (atype != V_ASN1_UNDEF && atype == V_ASN1_NULL) 629 goto err; 630 631 pk = EVP_PKEY_CTX_get0_pkey(pctx); 632 if (!pk) 633 goto err; 634 if (pk->type != EVP_PKEY_DHX) 635 goto err; 636 /* Get parameters from parent key */ 637 dhpeer = DHparams_dup(pk->pkey.dh); 638 /* We have parameters now set public key */ 639 plen = ASN1_STRING_length(pubkey); 640 p = ASN1_STRING_get0_data(pubkey); 641 if (!p || !plen) 642 goto err; 643 644 if ((public_key = d2i_ASN1_INTEGER(NULL, &p, plen)) == NULL) { 645 DHerr(DH_F_DH_CMS_SET_PEERKEY, DH_R_DECODE_ERROR); 646 goto err; 647 } 648 649 /* We have parameters now set public key */ 650 if ((dhpeer->pub_key = ASN1_INTEGER_to_BN(public_key, NULL)) == NULL) { 651 DHerr(DH_F_DH_CMS_SET_PEERKEY, DH_R_BN_DECODE_ERROR); 652 goto err; 653 } 654 655 pkpeer = EVP_PKEY_new(); 656 if (pkpeer == NULL) 657 goto err; 658 EVP_PKEY_assign(pkpeer, pk->ameth->pkey_id, dhpeer); 659 dhpeer = NULL; 660 if (EVP_PKEY_derive_set_peer(pctx, pkpeer) > 0) 661 rv = 1; 662 err: 663 ASN1_INTEGER_free(public_key); 664 EVP_PKEY_free(pkpeer); 665 DH_free(dhpeer); 666 return rv; 667 } 668 669 static int dh_cms_set_shared_info(EVP_PKEY_CTX *pctx, CMS_RecipientInfo *ri) 670 { 671 int rv = 0; 672 673 X509_ALGOR *alg, *kekalg = NULL; 674 ASN1_OCTET_STRING *ukm; 675 const unsigned char *p; 676 unsigned char *dukm = NULL; 677 size_t dukmlen = 0; 678 int keylen, plen; 679 const EVP_CIPHER *kekcipher; 680 EVP_CIPHER_CTX *kekctx; 681 682 if (!CMS_RecipientInfo_kari_get0_alg(ri, &alg, &ukm)) 683 goto err; 684 685 /* 686 * For DH we only have one OID permissible. If ever any more get defined 687 * we will need something cleverer. 688 */ 689 if (OBJ_obj2nid(alg->algorithm) != NID_id_smime_alg_ESDH) { 690 DHerr(DH_F_DH_CMS_SET_SHARED_INFO, DH_R_KDF_PARAMETER_ERROR); 691 goto err; 692 } 693 694 if (EVP_PKEY_CTX_set_dh_kdf_type(pctx, EVP_PKEY_DH_KDF_X9_42) <= 0) 695 goto err; 696 697 if (EVP_PKEY_CTX_set_dh_kdf_md(pctx, EVP_sha1()) <= 0) 698 goto err; 699 700 if (alg->parameter->type != V_ASN1_SEQUENCE) 701 goto err; 702 703 p = alg->parameter->value.sequence->data; 704 plen = alg->parameter->value.sequence->length; 705 kekalg = d2i_X509_ALGOR(NULL, &p, plen); 706 if (!kekalg) 707 goto err; 708 kekctx = CMS_RecipientInfo_kari_get0_ctx(ri); 709 if (!kekctx) 710 goto err; 711 kekcipher = EVP_get_cipherbyobj(kekalg->algorithm); 712 if (!kekcipher || EVP_CIPHER_mode(kekcipher) != EVP_CIPH_WRAP_MODE) 713 goto err; 714 if (!EVP_EncryptInit_ex(kekctx, kekcipher, NULL, NULL, NULL)) 715 goto err; 716 if (EVP_CIPHER_asn1_to_param(kekctx, kekalg->parameter) <= 0) 717 goto err; 718 719 keylen = EVP_CIPHER_CTX_key_length(kekctx); 720 if (EVP_PKEY_CTX_set_dh_kdf_outlen(pctx, keylen) <= 0) 721 goto err; 722 /* Use OBJ_nid2obj to ensure we use built in OID that isn't freed */ 723 if (EVP_PKEY_CTX_set0_dh_kdf_oid(pctx, 724 OBJ_nid2obj(EVP_CIPHER_type(kekcipher))) 725 <= 0) 726 goto err; 727 728 if (ukm) { 729 dukmlen = ASN1_STRING_length(ukm); 730 dukm = OPENSSL_memdup(ASN1_STRING_get0_data(ukm), dukmlen); 731 if (!dukm) 732 goto err; 733 } 734 735 if (EVP_PKEY_CTX_set0_dh_kdf_ukm(pctx, dukm, dukmlen) <= 0) 736 goto err; 737 dukm = NULL; 738 739 rv = 1; 740 err: 741 X509_ALGOR_free(kekalg); 742 OPENSSL_free(dukm); 743 return rv; 744 } 745 746 static int dh_cms_decrypt(CMS_RecipientInfo *ri) 747 { 748 EVP_PKEY_CTX *pctx; 749 pctx = CMS_RecipientInfo_get0_pkey_ctx(ri); 750 if (!pctx) 751 return 0; 752 /* See if we need to set peer key */ 753 if (!EVP_PKEY_CTX_get0_peerkey(pctx)) { 754 X509_ALGOR *alg; 755 ASN1_BIT_STRING *pubkey; 756 if (!CMS_RecipientInfo_kari_get0_orig_id(ri, &alg, &pubkey, 757 NULL, NULL, NULL)) 758 return 0; 759 if (!alg || !pubkey) 760 return 0; 761 if (!dh_cms_set_peerkey(pctx, alg, pubkey)) { 762 DHerr(DH_F_DH_CMS_DECRYPT, DH_R_PEER_KEY_ERROR); 763 return 0; 764 } 765 } 766 /* Set DH derivation parameters and initialise unwrap context */ 767 if (!dh_cms_set_shared_info(pctx, ri)) { 768 DHerr(DH_F_DH_CMS_DECRYPT, DH_R_SHARED_INFO_ERROR); 769 return 0; 770 } 771 return 1; 772 } 773 774 static int dh_cms_encrypt(CMS_RecipientInfo *ri) 775 { 776 EVP_PKEY_CTX *pctx; 777 EVP_PKEY *pkey; 778 EVP_CIPHER_CTX *ctx; 779 int keylen; 780 X509_ALGOR *talg, *wrap_alg = NULL; 781 const ASN1_OBJECT *aoid; 782 ASN1_BIT_STRING *pubkey; 783 ASN1_STRING *wrap_str; 784 ASN1_OCTET_STRING *ukm; 785 unsigned char *penc = NULL, *dukm = NULL; 786 int penclen; 787 size_t dukmlen = 0; 788 int rv = 0; 789 int kdf_type, wrap_nid; 790 const EVP_MD *kdf_md; 791 pctx = CMS_RecipientInfo_get0_pkey_ctx(ri); 792 if (!pctx) 793 return 0; 794 /* Get ephemeral key */ 795 pkey = EVP_PKEY_CTX_get0_pkey(pctx); 796 if (!CMS_RecipientInfo_kari_get0_orig_id(ri, &talg, &pubkey, 797 NULL, NULL, NULL)) 798 goto err; 799 X509_ALGOR_get0(&aoid, NULL, NULL, talg); 800 /* Is everything uninitialised? */ 801 if (aoid == OBJ_nid2obj(NID_undef)) { 802 ASN1_INTEGER *pubk = BN_to_ASN1_INTEGER(pkey->pkey.dh->pub_key, NULL); 803 if (!pubk) 804 goto err; 805 /* Set the key */ 806 807 penclen = i2d_ASN1_INTEGER(pubk, &penc); 808 ASN1_INTEGER_free(pubk); 809 if (penclen <= 0) 810 goto err; 811 ASN1_STRING_set0(pubkey, penc, penclen); 812 pubkey->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); 813 pubkey->flags |= ASN1_STRING_FLAG_BITS_LEFT; 814 815 penc = NULL; 816 X509_ALGOR_set0(talg, OBJ_nid2obj(NID_dhpublicnumber), 817 V_ASN1_UNDEF, NULL); 818 } 819 820 /* See if custom parameters set */ 821 kdf_type = EVP_PKEY_CTX_get_dh_kdf_type(pctx); 822 if (kdf_type <= 0) 823 goto err; 824 if (!EVP_PKEY_CTX_get_dh_kdf_md(pctx, &kdf_md)) 825 goto err; 826 827 if (kdf_type == EVP_PKEY_DH_KDF_NONE) { 828 kdf_type = EVP_PKEY_DH_KDF_X9_42; 829 if (EVP_PKEY_CTX_set_dh_kdf_type(pctx, kdf_type) <= 0) 830 goto err; 831 } else if (kdf_type != EVP_PKEY_DH_KDF_X9_42) 832 /* Unknown KDF */ 833 goto err; 834 if (kdf_md == NULL) { 835 /* Only SHA1 supported */ 836 kdf_md = EVP_sha1(); 837 if (EVP_PKEY_CTX_set_dh_kdf_md(pctx, kdf_md) <= 0) 838 goto err; 839 } else if (EVP_MD_type(kdf_md) != NID_sha1) 840 /* Unsupported digest */ 841 goto err; 842 843 if (!CMS_RecipientInfo_kari_get0_alg(ri, &talg, &ukm)) 844 goto err; 845 846 /* Get wrap NID */ 847 ctx = CMS_RecipientInfo_kari_get0_ctx(ri); 848 wrap_nid = EVP_CIPHER_CTX_type(ctx); 849 if (EVP_PKEY_CTX_set0_dh_kdf_oid(pctx, OBJ_nid2obj(wrap_nid)) <= 0) 850 goto err; 851 keylen = EVP_CIPHER_CTX_key_length(ctx); 852 853 /* Package wrap algorithm in an AlgorithmIdentifier */ 854 855 wrap_alg = X509_ALGOR_new(); 856 if (wrap_alg == NULL) 857 goto err; 858 wrap_alg->algorithm = OBJ_nid2obj(wrap_nid); 859 wrap_alg->parameter = ASN1_TYPE_new(); 860 if (wrap_alg->parameter == NULL) 861 goto err; 862 if (EVP_CIPHER_param_to_asn1(ctx, wrap_alg->parameter) <= 0) 863 goto err; 864 if (ASN1_TYPE_get(wrap_alg->parameter) == NID_undef) { 865 ASN1_TYPE_free(wrap_alg->parameter); 866 wrap_alg->parameter = NULL; 867 } 868 869 if (EVP_PKEY_CTX_set_dh_kdf_outlen(pctx, keylen) <= 0) 870 goto err; 871 872 if (ukm) { 873 dukmlen = ASN1_STRING_length(ukm); 874 dukm = OPENSSL_memdup(ASN1_STRING_get0_data(ukm), dukmlen); 875 if (!dukm) 876 goto err; 877 } 878 879 if (EVP_PKEY_CTX_set0_dh_kdf_ukm(pctx, dukm, dukmlen) <= 0) 880 goto err; 881 dukm = NULL; 882 883 /* 884 * Now need to wrap encoding of wrap AlgorithmIdentifier into parameter 885 * of another AlgorithmIdentifier. 886 */ 887 penc = NULL; 888 penclen = i2d_X509_ALGOR(wrap_alg, &penc); 889 if (!penc || !penclen) 890 goto err; 891 wrap_str = ASN1_STRING_new(); 892 if (wrap_str == NULL) 893 goto err; 894 ASN1_STRING_set0(wrap_str, penc, penclen); 895 penc = NULL; 896 X509_ALGOR_set0(talg, OBJ_nid2obj(NID_id_smime_alg_ESDH), 897 V_ASN1_SEQUENCE, wrap_str); 898 899 rv = 1; 900 901 err: 902 OPENSSL_free(penc); 903 X509_ALGOR_free(wrap_alg); 904 return rv; 905 } 906 907 #endif 908