Ignore:
Timestamp:
Aug 7, 2014, 8:25:37 PM (11 years ago)
Author:
dmik
Message:

openssl: Merge version 1.0.0n from vendor to trunk.

Location:
openssl/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • openssl/trunk

  • TabularUnified openssl/trunk/crypto/pkcs7/pk7_doit.c

    r150 r808  
    205205        size_t eklen;
    206206
    207         int ret = 0;
     207        int ret = -1;
    208208
    209209        pctx = EVP_PKEY_CTX_new(pkey, NULL);
    210210        if (!pctx)
    211                 return 0;
     211                return -1;
    212212
    213213        if (EVP_PKEY_decrypt_init(pctx) <= 0)
     
    236236                                ri->enc_key->data, ri->enc_key->length) <= 0)
    237237                {
     238                ret = 0;
    238239                PKCS7err(PKCS7_F_PKCS7_DECRYPT_RINFO, ERR_R_EVP_LIB);
    239240                goto err;
     
    241242
    242243        ret = 1;
     244
     245        if (*pek)
     246                {
     247                OPENSSL_cleanse(*pek, *peklen);
     248                OPENSSL_free(*pek);
     249                }
    243250
    244251        *pek = ek;
     
    423430        STACK_OF(X509_ALGOR) *md_sk=NULL;
    424431        STACK_OF(PKCS7_RECIP_INFO) *rsk=NULL;
    425         X509_ALGOR *xalg=NULL;
    426432        PKCS7_RECIP_INFO *ri=NULL;
     433       unsigned char *ek = NULL, *tkey = NULL;
     434       int eklen = 0, tkeylen = 0;
    427435
    428436        i=OBJ_obj2nid(p7->type);
     
    433441        case NID_pkcs7_signed:
    434442                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                        }
    435448                md_sk=p7->d.sign->md_algs;
    436449                break;
     
    446459                        goto err;
    447460                        }
    448                 xalg=p7->d.signed_and_enveloped->enc_data->algorithm;
    449461                break;
    450462        case NID_pkcs7_enveloped:
     
    458470                        goto err;
    459471                        }
    460                 xalg=p7->d.enveloped->enc_data->algorithm;
    461472                break;
    462473        default:
     
    504515                X509_OBJECT ret;
    505516#endif
    506                 unsigned char *ek = NULL;
    507                 int eklen;
    508517
    509518                if ((etmp=BIO_new(BIO_f_cipher())) == NULL)
     
    538547
    539548                /* If we haven't got a certificate try each ri in turn */
    540 
    541549                if (pcert == NULL)
    542550                        {
     551                        /* Always attempt to decrypt all rinfo even
     552                         * after sucess as a defence against MMA timing
     553                         * attacks.
     554                         */
    543555                        for (i=0; i<sk_PKCS7_RECIP_INFO_num(rsk); i++)
    544556                                {
    545557                                ri=sk_PKCS7_RECIP_INFO_value(rsk,i);
     558                               
    546559                                if (pkcs7_decrypt_rinfo(&ek, &eklen,
    547                                                         ri, pkey) > 0)
    548                                         break;
     560                                                        ri, pkey) < 0)
     561                                        goto err;
    549562                                ERR_clear_error();
    550                                 ri = NULL;
    551563                                }
    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)
    556569                                goto err;
    557                                 }
    558                         }
    559                 else
    560                         {
    561                         if (pkcs7_decrypt_rinfo(&ek, &eklen, ri, pkey) <= 0)
    562                                 goto err;
     570                        ERR_clear_error();
    563571                        }
    564572
     
    569577                if (EVP_CIPHER_asn1_to_param(evp_ctx,enc_alg->parameter) < 0)
    570578                        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                        }
    571592
    572593                if (eklen != EVP_CIPHER_CTX_key_length(evp_ctx)) {
     
    577598                        if(!EVP_CIPHER_CTX_set_key_length(evp_ctx, eklen))
    578599                                {
    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;
    582606                                }
    583607                }
     608                /* Clear errors so we don't leak information useful in MMA */
     609                ERR_clear_error();
    584610                if (EVP_CipherInit_ex(evp_ctx,NULL,NULL,ek,NULL,0) <= 0)
    585611                        goto err;
     
    589615                        OPENSSL_cleanse(ek,eklen);
    590616                        OPENSSL_free(ek);
     617                       ek = NULL;
     618                        }
     619                if (tkey)
     620                        {
     621                        OPENSSL_cleanse(tkey,tkeylen);
     622                        OPENSSL_free(tkey);
     623                       tkey = NULL;
    591624                        }
    592625
     
    631664                {
    632665err:
     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                       }
    633676                if (out != NULL) BIO_free_all(out);
    634677                if (btmp != NULL) BIO_free_all(btmp);
     
    885928                goto err;
    886929        OPENSSL_free(abuf);
     930        abuf = NULL;
    887931        if (EVP_DigestSignFinal(&mctx, NULL, &siglen) <= 0)
    888932                goto err;
Note: See TracChangeset for help on using the changeset viewer.