Changeset 808 for openssl/trunk/crypto/pkcs7/pk7_doit.c
- Timestamp:
- Aug 7, 2014, 8:25:37 PM (11 years ago)
- Location:
- openssl/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
openssl/trunk ¶
- Property svn:mergeinfo changed
/openssl/vendor/1.0.0-current (added) merged: 799-800,804 /openssl/vendor/1.0.0n (added) merged: 807
- Property svn:mergeinfo changed
-
TabularUnified openssl/trunk/crypto/pkcs7/pk7_doit.c ¶
r150 r808 205 205 size_t eklen; 206 206 207 int ret = 0;207 int ret = -1; 208 208 209 209 pctx = EVP_PKEY_CTX_new(pkey, NULL); 210 210 if (!pctx) 211 return 0;211 return -1; 212 212 213 213 if (EVP_PKEY_decrypt_init(pctx) <= 0) … … 236 236 ri->enc_key->data, ri->enc_key->length) <= 0) 237 237 { 238 ret = 0; 238 239 PKCS7err(PKCS7_F_PKCS7_DECRYPT_RINFO, ERR_R_EVP_LIB); 239 240 goto err; … … 241 242 242 243 ret = 1; 244 245 if (*pek) 246 { 247 OPENSSL_cleanse(*pek, *peklen); 248 OPENSSL_free(*pek); 249 } 243 250 244 251 *pek = ek; … … 423 430 STACK_OF(X509_ALGOR) *md_sk=NULL; 424 431 STACK_OF(PKCS7_RECIP_INFO) *rsk=NULL; 425 X509_ALGOR *xalg=NULL;426 432 PKCS7_RECIP_INFO *ri=NULL; 433 unsigned char *ek = NULL, *tkey = NULL; 434 int eklen = 0, tkeylen = 0; 427 435 428 436 i=OBJ_obj2nid(p7->type); … … 433 441 case NID_pkcs7_signed: 434 442 data_body=PKCS7_get_octet_string(p7->d.sign->contents); 443 if (!PKCS7_is_detached(p7) && data_body == NULL) 444 { 445 PKCS7err(PKCS7_F_PKCS7_DATADECODE,PKCS7_R_INVALID_SIGNED_DATA_TYPE); 446 goto err; 447 } 435 448 md_sk=p7->d.sign->md_algs; 436 449 break; … … 446 459 goto err; 447 460 } 448 xalg=p7->d.signed_and_enveloped->enc_data->algorithm;449 461 break; 450 462 case NID_pkcs7_enveloped: … … 458 470 goto err; 459 471 } 460 xalg=p7->d.enveloped->enc_data->algorithm;461 472 break; 462 473 default: … … 504 515 X509_OBJECT ret; 505 516 #endif 506 unsigned char *ek = NULL;507 int eklen;508 517 509 518 if ((etmp=BIO_new(BIO_f_cipher())) == NULL) … … 538 547 539 548 /* If we haven't got a certificate try each ri in turn */ 540 541 549 if (pcert == NULL) 542 550 { 551 /* Always attempt to decrypt all rinfo even 552 * after sucess as a defence against MMA timing 553 * attacks. 554 */ 543 555 for (i=0; i<sk_PKCS7_RECIP_INFO_num(rsk); i++) 544 556 { 545 557 ri=sk_PKCS7_RECIP_INFO_value(rsk,i); 558 546 559 if (pkcs7_decrypt_rinfo(&ek, &eklen, 547 ri, pkey) >0)548 break;560 ri, pkey) < 0) 561 goto err; 549 562 ERR_clear_error(); 550 ri = NULL;551 563 } 552 if (ri == NULL) 553 { 554 PKCS7err(PKCS7_F_PKCS7_DATADECODE, 555 PKCS7_R_NO_RECIPIENT_MATCHES_KEY); 564 } 565 else 566 { 567 /* Only exit on fatal errors, not decrypt failure */ 568 if (pkcs7_decrypt_rinfo(&ek, &eklen, ri, pkey) < 0) 556 569 goto err; 557 } 558 } 559 else 560 { 561 if (pkcs7_decrypt_rinfo(&ek, &eklen, ri, pkey) <= 0) 562 goto err; 570 ERR_clear_error(); 563 571 } 564 572 … … 569 577 if (EVP_CIPHER_asn1_to_param(evp_ctx,enc_alg->parameter) < 0) 570 578 goto err; 579 /* Generate random key as MMA defence */ 580 tkeylen = EVP_CIPHER_CTX_key_length(evp_ctx); 581 tkey = OPENSSL_malloc(tkeylen); 582 if (!tkey) 583 goto err; 584 if (EVP_CIPHER_CTX_rand_key(evp_ctx, tkey) <= 0) 585 goto err; 586 if (ek == NULL) 587 { 588 ek = tkey; 589 eklen = tkeylen; 590 tkey = NULL; 591 } 571 592 572 593 if (eklen != EVP_CIPHER_CTX_key_length(evp_ctx)) { … … 577 598 if(!EVP_CIPHER_CTX_set_key_length(evp_ctx, eklen)) 578 599 { 579 PKCS7err(PKCS7_F_PKCS7_DATADECODE, 580 PKCS7_R_DECRYPTED_KEY_IS_WRONG_LENGTH); 581 goto err; 600 /* Use random key as MMA defence */ 601 OPENSSL_cleanse(ek, eklen); 602 OPENSSL_free(ek); 603 ek = tkey; 604 eklen = tkeylen; 605 tkey = NULL; 582 606 } 583 607 } 608 /* Clear errors so we don't leak information useful in MMA */ 609 ERR_clear_error(); 584 610 if (EVP_CipherInit_ex(evp_ctx,NULL,NULL,ek,NULL,0) <= 0) 585 611 goto err; … … 589 615 OPENSSL_cleanse(ek,eklen); 590 616 OPENSSL_free(ek); 617 ek = NULL; 618 } 619 if (tkey) 620 { 621 OPENSSL_cleanse(tkey,tkeylen); 622 OPENSSL_free(tkey); 623 tkey = NULL; 591 624 } 592 625 … … 631 664 { 632 665 err: 666 if (ek) 667 { 668 OPENSSL_cleanse(ek,eklen); 669 OPENSSL_free(ek); 670 } 671 if (tkey) 672 { 673 OPENSSL_cleanse(tkey,tkeylen); 674 OPENSSL_free(tkey); 675 } 633 676 if (out != NULL) BIO_free_all(out); 634 677 if (btmp != NULL) BIO_free_all(btmp); … … 885 928 goto err; 886 929 OPENSSL_free(abuf); 930 abuf = NULL; 887 931 if (EVP_DigestSignFinal(&mctx, NULL, &siglen) <= 0) 888 932 goto err;
Note:
See TracChangeset
for help on using the changeset viewer.