LCOV - code coverage report
Current view: top level - rsa - rsa_ameth.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 278 418 66.5 %
Date: 2014-08-02 Functions: 29 33 87.9 %
Branches: 146 361 40.4 %

           Branch data     Line data    Source code
       1                 :            : /* crypto/rsa/rsa_ameth.c */
       2                 :            : /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
       3                 :            :  * project 2006.
       4                 :            :  */
       5                 :            : /* ====================================================================
       6                 :            :  * Copyright (c) 2006 The OpenSSL Project.  All rights reserved.
       7                 :            :  *
       8                 :            :  * Redistribution and use in source and binary forms, with or without
       9                 :            :  * modification, are permitted provided that the following conditions
      10                 :            :  * are met:
      11                 :            :  *
      12                 :            :  * 1. Redistributions of source code must retain the above copyright
      13                 :            :  *    notice, this list of conditions and the following disclaimer. 
      14                 :            :  *
      15                 :            :  * 2. Redistributions in binary form must reproduce the above copyright
      16                 :            :  *    notice, this list of conditions and the following disclaimer in
      17                 :            :  *    the documentation and/or other materials provided with the
      18                 :            :  *    distribution.
      19                 :            :  *
      20                 :            :  * 3. All advertising materials mentioning features or use of this
      21                 :            :  *    software must display the following acknowledgment:
      22                 :            :  *    "This product includes software developed by the OpenSSL Project
      23                 :            :  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
      24                 :            :  *
      25                 :            :  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
      26                 :            :  *    endorse or promote products derived from this software without
      27                 :            :  *    prior written permission. For written permission, please contact
      28                 :            :  *    licensing@OpenSSL.org.
      29                 :            :  *
      30                 :            :  * 5. Products derived from this software may not be called "OpenSSL"
      31                 :            :  *    nor may "OpenSSL" appear in their names without prior written
      32                 :            :  *    permission of the OpenSSL Project.
      33                 :            :  *
      34                 :            :  * 6. Redistributions of any form whatsoever must retain the following
      35                 :            :  *    acknowledgment:
      36                 :            :  *    "This product includes software developed by the OpenSSL Project
      37                 :            :  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
      38                 :            :  *
      39                 :            :  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
      40                 :            :  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      41                 :            :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
      42                 :            :  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
      43                 :            :  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      44                 :            :  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
      45                 :            :  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
      46                 :            :  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      47                 :            :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
      48                 :            :  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
      49                 :            :  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
      50                 :            :  * OF THE POSSIBILITY OF SUCH DAMAGE.
      51                 :            :  * ====================================================================
      52                 :            :  *
      53                 :            :  * This product includes cryptographic software written by Eric Young
      54                 :            :  * (eay@cryptsoft.com).  This product includes software written by Tim
      55                 :            :  * Hudson (tjh@cryptsoft.com).
      56                 :            :  *
      57                 :            :  */
      58                 :            : 
      59                 :            : #include <stdio.h>
      60                 :            : #include "cryptlib.h"
      61                 :            : #include <openssl/asn1t.h>
      62                 :            : #include <openssl/x509.h>
      63                 :            : #include <openssl/rsa.h>
      64                 :            : #include <openssl/bn.h>
      65                 :            : #ifndef OPENSSL_NO_CMS
      66                 :            : #include <openssl/cms.h>
      67                 :            : #endif
      68                 :            : #include "asn1_locl.h"
      69                 :            : 
      70                 :            : static int rsa_cms_sign(CMS_SignerInfo *si);
      71                 :            : static int rsa_cms_verify(CMS_SignerInfo *si);
      72                 :            : static int rsa_cms_decrypt(CMS_RecipientInfo *ri);
      73                 :            : static int rsa_cms_encrypt(CMS_RecipientInfo *ri);
      74                 :            : 
      75                 :         21 : static int rsa_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey)
      76                 :            :         {
      77                 :         21 :         unsigned char *penc = NULL;
      78                 :            :         int penclen;
      79                 :         21 :         penclen = i2d_RSAPublicKey(pkey->pkey.rsa, &penc);
      80         [ +  - ]:         21 :         if (penclen <= 0)
      81                 :            :                 return 0;
      82         [ -  + ]:         21 :         if (X509_PUBKEY_set0_param(pk, OBJ_nid2obj(EVP_PKEY_RSA),
      83                 :            :                                 V_ASN1_NULL, NULL, penc, penclen))
      84                 :            :                 return 1;
      85                 :            : 
      86                 :          0 :         OPENSSL_free(penc);
      87                 :          0 :         return 0;
      88                 :            :         }
      89                 :            : 
      90                 :       3654 : static int rsa_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey)
      91                 :            :         {
      92                 :            :         const unsigned char *p;
      93                 :            :         int pklen;
      94                 :       3654 :         RSA *rsa = NULL;
      95         [ +  - ]:       3654 :         if (!X509_PUBKEY_get0_param(NULL, &p, &pklen, NULL, pubkey))
      96                 :            :                 return 0;
      97         [ -  + ]:       3654 :         if (!(rsa = d2i_RSAPublicKey(NULL, &p, pklen)))
      98                 :            :                 {
      99                 :          0 :                 RSAerr(RSA_F_RSA_PUB_DECODE, ERR_R_RSA_LIB);
     100                 :          0 :                 return 0;
     101                 :            :                 }
     102                 :       3654 :         EVP_PKEY_assign_RSA (pkey, rsa);
     103                 :       3654 :         return 1;
     104                 :            :         }
     105                 :            : 
     106                 :       1094 : static int rsa_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b)
     107                 :            :         {
     108         [ +  - ]:       1094 :         if (BN_cmp(b->pkey.rsa->n,a->pkey.rsa->n) != 0
     109         [ -  + ]:       1094 :                 || BN_cmp(b->pkey.rsa->e,a->pkey.rsa->e) != 0)
     110                 :            :                         return 0;
     111                 :            :         return 1;
     112                 :            :         }
     113                 :            : 
     114                 :       1114 : static int old_rsa_priv_decode(EVP_PKEY *pkey,
     115                 :            :                                         const unsigned char **pder, int derlen)
     116                 :            :         {
     117                 :            :         RSA *rsa;
     118         [ -  + ]:       1114 :         if (!(rsa = d2i_RSAPrivateKey (NULL, pder, derlen)))
     119                 :            :                 {
     120                 :          0 :                 RSAerr(RSA_F_OLD_RSA_PRIV_DECODE, ERR_R_RSA_LIB);
     121                 :          0 :                 return 0;
     122                 :            :                 }
     123                 :       1114 :         EVP_PKEY_assign_RSA(pkey, rsa);
     124                 :       1114 :         return 1;
     125                 :            :         }
     126                 :            : 
     127                 :          0 : static int old_rsa_priv_encode(const EVP_PKEY *pkey, unsigned char **pder)
     128                 :            :         {
     129                 :          0 :         return i2d_RSAPrivateKey(pkey->pkey.rsa, pder);
     130                 :            :         }
     131                 :            : 
     132                 :         10 : static int rsa_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey)
     133                 :            :         {
     134                 :         10 :         unsigned char *rk = NULL;
     135                 :            :         int rklen;
     136                 :         10 :         rklen = i2d_RSAPrivateKey(pkey->pkey.rsa, &rk);
     137                 :            : 
     138         [ -  + ]:         10 :         if (rklen <= 0)
     139                 :            :                 {
     140                 :          0 :                 RSAerr(RSA_F_RSA_PRIV_ENCODE,ERR_R_MALLOC_FAILURE);
     141                 :          0 :                 return 0;
     142                 :            :                 }
     143                 :            : 
     144         [ -  + ]:         10 :         if (!PKCS8_pkey_set0(p8, OBJ_nid2obj(NID_rsaEncryption), 0,
     145                 :            :                                 V_ASN1_NULL, NULL, rk, rklen))
     146                 :            :                 {
     147                 :          0 :                 RSAerr(RSA_F_RSA_PRIV_ENCODE,ERR_R_MALLOC_FAILURE);
     148                 :          0 :                 return 0;
     149                 :            :                 }
     150                 :            : 
     151                 :            :         return 1;
     152                 :            :         }
     153                 :            : 
     154                 :       1086 : static int rsa_priv_decode(EVP_PKEY *pkey, PKCS8_PRIV_KEY_INFO *p8)
     155                 :            :         {
     156                 :            :         const unsigned char *p;
     157                 :            :         int pklen;
     158         [ +  - ]:       1086 :         if (!PKCS8_pkey_get0(NULL, &p, &pklen, NULL, p8))
     159                 :            :                 return 0;
     160                 :       1086 :         return old_rsa_priv_decode(pkey, &p, pklen);
     161                 :            :         }
     162                 :            : 
     163                 :       7488 : static int int_rsa_size(const EVP_PKEY *pkey)
     164                 :            :         {
     165                 :       7488 :         return RSA_size(pkey->pkey.rsa);
     166                 :            :         }
     167                 :            : 
     168                 :          3 : static int rsa_bits(const EVP_PKEY *pkey)
     169                 :            :         {
     170                 :          3 :         return BN_num_bits(pkey->pkey.rsa->n);
     171                 :            :         }
     172                 :            : 
     173                 :       2634 : static int rsa_security_bits(const EVP_PKEY *pkey)
     174                 :            :         {
     175                 :       2634 :         return RSA_security_bits(pkey->pkey.rsa);
     176                 :            :         }
     177                 :            : 
     178                 :       4778 : static void int_rsa_free(EVP_PKEY *pkey)
     179                 :            :         {
     180                 :       4778 :         RSA_free(pkey->pkey.rsa);
     181                 :       4778 :         }
     182                 :            : 
     183                 :            : 
     184                 :         80 : static void update_buflen(const BIGNUM *b, size_t *pbuflen)
     185                 :            :         {
     186                 :            :         size_t i;
     187         [ +  - ]:         80 :         if (!b)
     188                 :         80 :                 return;
     189         [ +  + ]:         80 :         if (*pbuflen < (i = (size_t)BN_num_bytes(b)))
     190                 :         40 :                         *pbuflen = i;
     191                 :            :         }
     192                 :            : 
     193                 :         40 : static int do_rsa_print(BIO *bp, const RSA *x, int off, int priv)
     194                 :            :         {
     195                 :            :         char *str;
     196                 :            :         const char *s;
     197                 :         40 :         unsigned char *m=NULL;
     198                 :         40 :         int ret=0, mod_len = 0;
     199                 :         40 :         size_t buf_len=0;
     200                 :            : 
     201                 :         40 :         update_buflen(x->n, &buf_len);
     202                 :         40 :         update_buflen(x->e, &buf_len);
     203                 :            : 
     204         [ -  + ]:         40 :         if (priv)
     205                 :            :                 {
     206                 :          0 :                 update_buflen(x->d, &buf_len);
     207                 :          0 :                 update_buflen(x->p, &buf_len);
     208                 :          0 :                 update_buflen(x->q, &buf_len);
     209                 :          0 :                 update_buflen(x->dmp1, &buf_len);
     210                 :          0 :                 update_buflen(x->dmq1, &buf_len);
     211                 :          0 :                 update_buflen(x->iqmp, &buf_len);
     212                 :            :                 }
     213                 :            : 
     214                 :         40 :         m=(unsigned char *)OPENSSL_malloc(buf_len+10);
     215         [ -  + ]:         40 :         if (m == NULL)
     216                 :            :                 {
     217                 :          0 :                 RSAerr(RSA_F_DO_RSA_PRINT,ERR_R_MALLOC_FAILURE);
     218                 :          0 :                 goto err;
     219                 :            :                 }
     220                 :            : 
     221         [ +  - ]:         40 :         if (x->n != NULL)
     222                 :         40 :                 mod_len = BN_num_bits(x->n);
     223                 :            : 
     224         [ +  - ]:         40 :         if(!BIO_indent(bp,off,128))
     225                 :            :                 goto err;
     226                 :            : 
     227 [ -  + ][ #  # ]:         40 :         if (priv && x->d)
     228                 :            :                 {
     229         [ #  # ]:          0 :                 if (BIO_printf(bp,"Private-Key: (%d bit)\n", mod_len)
     230                 :            :                         <= 0) goto err;
     231                 :            :                 str = "modulus:";
     232                 :            :                 s = "publicExponent:";
     233                 :            :                 }
     234                 :            :         else
     235                 :            :                 {
     236         [ +  - ]:         40 :                 if (BIO_printf(bp,"Public-Key: (%d bit)\n", mod_len)
     237                 :            :                         <= 0) goto err;
     238                 :            :                 str = "Modulus:";
     239                 :            :                 s= "Exponent:";
     240                 :            :                 }
     241         [ +  - ]:         40 :         if (!ASN1_bn_print(bp,str,x->n,m,off)) goto err;
     242         [ +  - ]:         40 :         if (!ASN1_bn_print(bp,s,x->e,m,off))
     243                 :            :                 goto err;
     244         [ -  + ]:         40 :         if (priv)
     245                 :            :                 {
     246         [ #  # ]:          0 :                 if (!ASN1_bn_print(bp,"privateExponent:",x->d,m,off))
     247                 :            :                         goto err;
     248         [ #  # ]:          0 :                 if (!ASN1_bn_print(bp,"prime1:",x->p,m,off))
     249                 :            :                         goto err;
     250         [ #  # ]:          0 :                 if (!ASN1_bn_print(bp,"prime2:",x->q,m,off))
     251                 :            :                         goto err;
     252         [ #  # ]:          0 :                 if (!ASN1_bn_print(bp,"exponent1:",x->dmp1,m,off))
     253                 :            :                         goto err;
     254         [ #  # ]:          0 :                 if (!ASN1_bn_print(bp,"exponent2:",x->dmq1,m,off))
     255                 :            :                         goto err;
     256         [ #  # ]:          0 :                 if (!ASN1_bn_print(bp,"coefficient:",x->iqmp,m,off))
     257                 :            :                         goto err;
     258                 :            :                 }
     259                 :            :         ret=1;
     260                 :            : err:
     261         [ +  - ]:         40 :         if (m != NULL) OPENSSL_free(m);
     262                 :         40 :         return(ret);
     263                 :            :         }
     264                 :            : 
     265                 :         40 : static int rsa_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent,
     266                 :            :                                                         ASN1_PCTX *ctx)
     267                 :            :         {
     268                 :         40 :         return do_rsa_print(bp, pkey->pkey.rsa, indent, 0);
     269                 :            :         }
     270                 :            : 
     271                 :            : 
     272                 :          0 : static int rsa_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent,
     273                 :            :                                                         ASN1_PCTX *ctx)
     274                 :            :         {
     275                 :          0 :         return do_rsa_print(bp, pkey->pkey.rsa, indent, 1);
     276                 :            :         }
     277                 :            : 
     278                 :            : /* Given an MGF1 Algorithm ID decode to an Algorithm Identifier */
     279                 :          5 : static X509_ALGOR *rsa_mgf1_decode(X509_ALGOR *alg)
     280                 :            :         {       
     281                 :            :         const unsigned char *p;
     282                 :            :         int plen;
     283         [ +  + ]:          5 :         if (alg == NULL)
     284                 :            :                 return NULL;
     285         [ +  - ]:          2 :         if (OBJ_obj2nid(alg->algorithm) != NID_mgf1)
     286                 :            :                 return NULL;
     287         [ +  - ]:          2 :         if (alg->parameter->type != V_ASN1_SEQUENCE)
     288                 :            :                 return NULL;
     289                 :            : 
     290                 :          2 :         p = alg->parameter->value.sequence->data;
     291                 :          2 :         plen = alg->parameter->value.sequence->length;
     292                 :          2 :         return d2i_X509_ALGOR(NULL, &p, plen);
     293                 :            :         }
     294                 :            : 
     295                 :          6 : static RSA_PSS_PARAMS *rsa_pss_decode(const X509_ALGOR *alg,
     296                 :            :                                         X509_ALGOR **pmaskHash)
     297                 :            :         {
     298                 :            :         const unsigned char *p;
     299                 :            :         int plen;
     300                 :            :         RSA_PSS_PARAMS *pss;
     301                 :            : 
     302                 :          3 :         *pmaskHash = NULL;
     303                 :            : 
     304 [ +  - ][ +  - ]:          3 :         if (!alg->parameter || alg->parameter->type != V_ASN1_SEQUENCE)
     305                 :            :                 return NULL;
     306                 :          3 :         p = alg->parameter->value.sequence->data;
     307                 :          3 :         plen = alg->parameter->value.sequence->length;
     308                 :          3 :         pss = d2i_RSA_PSS_PARAMS(NULL, &p, plen);
     309                 :            : 
     310         [ +  - ]:          3 :         if (!pss)
     311                 :            :                 return NULL;
     312                 :            : 
     313                 :          3 :         *pmaskHash = rsa_mgf1_decode(pss->maskGenAlgorithm);
     314                 :            : 
     315                 :            :         return pss;
     316                 :            :         }
     317                 :            : 
     318                 :          0 : static int rsa_pss_param_print(BIO *bp, RSA_PSS_PARAMS *pss, 
     319                 :            :                                 X509_ALGOR *maskHash, int indent)
     320                 :            :         {
     321                 :          0 :         int rv = 0;
     322         [ #  # ]:          0 :         if (!pss)
     323                 :            :                 {
     324         [ #  # ]:          0 :                 if (BIO_puts(bp, " (INVALID PSS PARAMETERS)\n") <= 0)
     325                 :            :                         return 0;
     326                 :          0 :                 return 1;
     327                 :            :                 }
     328         [ #  # ]:          0 :         if (BIO_puts(bp, "\n") <= 0)
     329                 :            :                 goto err;
     330         [ #  # ]:          0 :         if (!BIO_indent(bp, indent, 128))
     331                 :            :                 goto err;
     332         [ #  # ]:          0 :         if (BIO_puts(bp, "Hash Algorithm: ") <= 0)
     333                 :            :                 goto err;
     334                 :            : 
     335         [ #  # ]:          0 :         if (pss->hashAlgorithm)
     336                 :            :                 {
     337         [ #  # ]:          0 :                 if (i2a_ASN1_OBJECT(bp, pss->hashAlgorithm->algorithm) <= 0)
     338                 :            :                         goto err;
     339                 :            :                 }
     340         [ #  # ]:          0 :         else if (BIO_puts(bp, "sha1 (default)") <= 0)
     341                 :            :                 goto err;
     342                 :            : 
     343         [ #  # ]:          0 :         if (BIO_puts(bp, "\n") <= 0)
     344                 :            :                 goto err;
     345                 :            : 
     346         [ #  # ]:          0 :         if (!BIO_indent(bp, indent, 128))
     347                 :            :                 goto err;
     348                 :            : 
     349         [ #  # ]:          0 :         if (BIO_puts(bp, "Mask Algorithm: ") <= 0)
     350                 :            :                         goto err;
     351         [ #  # ]:          0 :         if (pss->maskGenAlgorithm)
     352                 :            :                 {
     353         [ #  # ]:          0 :                 if (i2a_ASN1_OBJECT(bp, pss->maskGenAlgorithm->algorithm) <= 0)
     354                 :            :                         goto err;
     355         [ #  # ]:          0 :                 if (BIO_puts(bp, " with ") <= 0)
     356                 :            :                         goto err;
     357         [ #  # ]:          0 :                 if (maskHash)
     358                 :            :                         {
     359         [ #  # ]:          0 :                         if (i2a_ASN1_OBJECT(bp, maskHash->algorithm) <= 0)
     360                 :            :                         goto err;
     361                 :            :                         }
     362         [ #  # ]:          0 :                 else if (BIO_puts(bp, "INVALID") <= 0)
     363                 :            :                         goto err;
     364                 :            :                 }
     365         [ #  # ]:          0 :         else if (BIO_puts(bp, "mgf1 with sha1 (default)") <= 0)
     366                 :            :                 goto err;
     367                 :          0 :         BIO_puts(bp, "\n");
     368                 :            : 
     369         [ #  # ]:          0 :         if (!BIO_indent(bp, indent, 128))
     370                 :            :                 goto err;
     371         [ #  # ]:          0 :         if (BIO_puts(bp, "Salt Length: 0x") <= 0)
     372                 :            :                         goto err;
     373         [ #  # ]:          0 :         if (pss->saltLength)
     374                 :            :                 {
     375         [ #  # ]:          0 :                 if (i2a_ASN1_INTEGER(bp, pss->saltLength) <= 0)
     376                 :            :                         goto err;
     377                 :            :                 }
     378         [ #  # ]:          0 :         else if (BIO_puts(bp, "14 (default)") <= 0)
     379                 :            :                 goto err;
     380                 :          0 :         BIO_puts(bp, "\n");
     381                 :            : 
     382         [ #  # ]:          0 :         if (!BIO_indent(bp, indent, 128))
     383                 :            :                 goto err;
     384         [ #  # ]:          0 :         if (BIO_puts(bp, "Trailer Field: 0x") <= 0)
     385                 :            :                         goto err;
     386         [ #  # ]:          0 :         if (pss->trailerField)
     387                 :            :                 {
     388         [ #  # ]:          0 :                 if (i2a_ASN1_INTEGER(bp, pss->trailerField) <= 0)
     389                 :            :                         goto err;
     390                 :            :                 }
     391         [ #  # ]:          0 :         else if (BIO_puts(bp, "BC (default)") <= 0)
     392                 :            :                 goto err;
     393                 :          0 :         BIO_puts(bp, "\n");
     394                 :            :         
     395                 :          0 :         rv = 1;
     396                 :            : 
     397                 :            :         err:
     398                 :          0 :         return rv;
     399                 :            : 
     400                 :            :         }
     401                 :            : 
     402                 :         77 : static int rsa_sig_print(BIO *bp, const X509_ALGOR *sigalg,
     403                 :            :                                         const ASN1_STRING *sig,
     404                 :            :                                         int indent, ASN1_PCTX *pctx)
     405                 :            :         {
     406         [ -  + ]:         77 :         if (OBJ_obj2nid(sigalg->algorithm) == NID_rsassaPss)
     407                 :            :                 {
     408                 :            :                 int rv;
     409                 :            :                 RSA_PSS_PARAMS *pss;
     410                 :            :                 X509_ALGOR *maskHash;
     411                 :          0 :                 pss = rsa_pss_decode(sigalg, &maskHash);
     412                 :          0 :                 rv = rsa_pss_param_print(bp, pss, maskHash, indent);
     413         [ #  # ]:          0 :                 if (pss)
     414                 :          0 :                         RSA_PSS_PARAMS_free(pss);
     415         [ #  # ]:          0 :                 if (maskHash)
     416                 :          0 :                         X509_ALGOR_free(maskHash);
     417         [ #  # ]:          0 :                 if (!rv)
     418                 :          0 :                         return 0;
     419                 :            :                 }
     420 [ +  + ][ +  - ]:         77 :         else if (!sig && BIO_puts(bp, "\n") <= 0)
     421                 :            :                 return 0;
     422         [ +  + ]:         77 :         if (sig)
     423                 :         40 :                 return X509_signature_dump(bp, sig, indent);
     424                 :            :         return 1;
     425                 :            :         }
     426                 :            : 
     427                 :        230 : static int rsa_pkey_ctrl(EVP_PKEY *pkey, int op, long arg1, void *arg2)
     428                 :            :         {
     429                 :        230 :         X509_ALGOR *alg = NULL;
     430   [ +  +  +  +  :        230 :         switch (op)
                +  +  - ]
     431                 :            :                 {
     432                 :            : 
     433                 :            :                 case ASN1_PKEY_CTRL_PKCS7_SIGN:
     434         [ +  - ]:         15 :                 if (arg1 == 0)
     435                 :         15 :                         PKCS7_SIGNER_INFO_get0_algs(arg2, NULL, NULL, &alg);
     436                 :            :                 break;
     437                 :            : 
     438                 :            :                 case ASN1_PKEY_CTRL_PKCS7_ENCRYPT:
     439         [ +  - ]:         12 :                 if (arg1 == 0)
     440                 :         12 :                         PKCS7_RECIP_INFO_get0_alg(arg2, &alg);
     441                 :            :                 break;
     442                 :            : #ifndef OPENSSL_NO_CMS
     443                 :            :                 case ASN1_PKEY_CTRL_CMS_SIGN:
     444         [ +  + ]:         66 :                 if (arg1 == 0)
     445                 :         33 :                         return rsa_cms_sign(arg2);
     446         [ +  - ]:         33 :                 else if (arg1 == 1)
     447                 :         33 :                         return rsa_cms_verify(arg2);
     448                 :            :                 break;
     449                 :            : 
     450                 :            :                 case ASN1_PKEY_CTRL_CMS_ENVELOPE:
     451         [ +  + ]:         44 :                 if (arg1 == 0)
     452                 :         29 :                         return rsa_cms_encrypt(arg2);
     453         [ +  - ]:         15 :                 else if (arg1 == 1)
     454                 :         15 :                         return rsa_cms_decrypt(arg2);
     455                 :            :                 break;
     456                 :            : 
     457                 :            :                 case ASN1_PKEY_CTRL_CMS_RI_TYPE:
     458                 :         40 :                 *(int *)arg2 = CMS_RECIPINFO_TRANS;
     459                 :         40 :                 return 1;
     460                 :            : #endif
     461                 :            : 
     462                 :            :                 case ASN1_PKEY_CTRL_DEFAULT_MD_NID:
     463                 :         53 :                 *(int *)arg2 = NID_sha1;
     464                 :         53 :                 return 1;
     465                 :            : 
     466                 :            :                 default:
     467                 :            :                 return -2;
     468                 :            : 
     469                 :            :                 }
     470                 :            : 
     471         [ +  - ]:         27 :         if (alg)
     472                 :         27 :                 X509_ALGOR_set0(alg, OBJ_nid2obj(NID_rsaEncryption),
     473                 :            :                                                         V_ASN1_NULL, 0);
     474                 :            : 
     475                 :            :         return 1;
     476                 :            : 
     477                 :            :         }
     478                 :            : 
     479                 :            : /* allocate and set algorithm ID from EVP_MD, default SHA1 */
     480                 :          7 : static int rsa_md_to_algor(X509_ALGOR **palg, const EVP_MD *md)
     481                 :            :         {
     482         [ +  + ]:          7 :         if (EVP_MD_type(md) == NID_sha1)
     483                 :            :                 return 1;
     484                 :          3 :         *palg = X509_ALGOR_new();
     485         [ +  - ]:          3 :         if (!*palg)
     486                 :            :                 return 0;
     487                 :          3 :         X509_ALGOR_set_md(*palg, md);
     488                 :          3 :         return 1;
     489                 :            :         }
     490                 :            : 
     491                 :            : /* Allocate and set MGF1 algorithm ID from EVP_MD */
     492                 :          5 : static int rsa_md_to_mgf1(X509_ALGOR **palg, const EVP_MD *mgf1md)
     493                 :            :         {
     494                 :          5 :         X509_ALGOR *algtmp = NULL;
     495                 :          5 :         ASN1_STRING *stmp = NULL;
     496                 :          5 :         *palg = NULL;
     497         [ +  + ]:          5 :         if (EVP_MD_type(mgf1md) == NID_sha1)
     498                 :            :                 return 1;
     499                 :            :         /* need to embed algorithm ID inside another */
     500         [ +  - ]:          2 :         if (!rsa_md_to_algor(&algtmp, mgf1md))
     501                 :            :                 goto err;
     502         [ +  - ]:          2 :         if (!ASN1_item_pack(algtmp, ASN1_ITEM_rptr(X509_ALGOR), &stmp))
     503                 :            :                         goto err;
     504                 :          2 :         *palg = X509_ALGOR_new();
     505         [ +  - ]:          2 :         if (!*palg)
     506                 :            :                 goto err;
     507                 :          2 :         X509_ALGOR_set0(*palg, OBJ_nid2obj(NID_mgf1), V_ASN1_SEQUENCE, stmp);
     508                 :          2 :         stmp = NULL;
     509                 :            :         err:
     510         [ -  + ]:          2 :         if (stmp)
     511                 :          0 :                 ASN1_STRING_free(stmp);
     512         [ +  - ]:          2 :         if (algtmp)
     513                 :          2 :                 X509_ALGOR_free(algtmp);
     514         [ -  + ]:          2 :         if (*palg)
     515                 :            :                 return 1;
     516                 :          0 :         return 0;
     517                 :            :         }
     518                 :            : 
     519                 :            : /* convert algorithm ID to EVP_MD, default SHA1 */
     520                 :          5 : static const EVP_MD *rsa_algor_to_md(X509_ALGOR *alg)
     521                 :            :         {
     522                 :            :         const EVP_MD *md;
     523         [ +  + ]:          5 :         if (!alg)
     524                 :          4 :                 return EVP_sha1();
     525                 :          1 :         md = EVP_get_digestbyobj(alg->algorithm);
     526         [ -  + ]:          1 :         if (md == NULL)
     527                 :          0 :                 RSAerr(RSA_F_RSA_ALGOR_TO_MD, RSA_R_UNKNOWN_DIGEST);
     528                 :          1 :         return md;
     529                 :            :         }
     530                 :            : /* convert MGF1 algorithm ID to EVP_MD, default SHA1 */
     531                 :          5 : static const EVP_MD *rsa_mgf1_to_md(X509_ALGOR *alg, X509_ALGOR *maskHash)
     532                 :            :         {
     533                 :            :         const EVP_MD *md;
     534         [ +  + ]:          5 :         if (!alg)
     535                 :          3 :                 return EVP_sha1();
     536                 :            :         /* Check mask and lookup mask hash algorithm */
     537         [ -  + ]:          2 :         if (OBJ_obj2nid(alg->algorithm) != NID_mgf1)
     538                 :            :                 {
     539                 :          0 :                 RSAerr(RSA_F_RSA_MGF1_TO_MD, RSA_R_UNSUPPORTED_MASK_ALGORITHM);
     540                 :          0 :                 return NULL;
     541                 :            :                 }
     542         [ -  + ]:          2 :         if (!maskHash)
     543                 :            :                 {
     544                 :          0 :                 RSAerr(RSA_F_RSA_MGF1_TO_MD, RSA_R_UNSUPPORTED_MASK_PARAMETER);
     545                 :          0 :                 return NULL;
     546                 :            :                 }
     547                 :          2 :         md = EVP_get_digestbyobj(maskHash->algorithm);
     548         [ -  + ]:          2 :         if (md == NULL)
     549                 :            :                 {
     550                 :          0 :                 RSAerr(RSA_F_RSA_MGF1_TO_MD, RSA_R_UNKNOWN_MASK_DIGEST);
     551                 :          0 :                 return NULL;
     552                 :            :                 }
     553                 :            :         return md;
     554                 :            :         }
     555                 :            : 
     556                 :            : /* Convert EVP_PKEY_CTX is PSS mode into corresponding algorithm parameter,
     557                 :            :  * suitable for setting an AlgorithmIdentifier.
     558                 :            :  */
     559                 :            : 
     560                 :          3 : static ASN1_STRING *rsa_ctx_to_pss(EVP_PKEY_CTX *pkctx)
     561                 :            :         {
     562                 :            :         const EVP_MD *sigmd, *mgf1md;
     563                 :          3 :         RSA_PSS_PARAMS *pss = NULL;
     564                 :          3 :         ASN1_STRING *os = NULL;
     565                 :          3 :         EVP_PKEY *pk = EVP_PKEY_CTX_get0_pkey(pkctx);
     566                 :          3 :         int saltlen, rv = 0;
     567         [ +  - ]:          3 :         if (EVP_PKEY_CTX_get_signature_md(pkctx, &sigmd) <= 0)
     568                 :            :                 goto err;
     569         [ +  - ]:          3 :         if (EVP_PKEY_CTX_get_rsa_mgf1_md(pkctx, &mgf1md) <= 0)
     570                 :            :                 goto err;
     571         [ +  - ]:          3 :         if (!EVP_PKEY_CTX_get_rsa_pss_saltlen(pkctx, &saltlen))
     572                 :            :                 goto err;
     573         [ -  + ]:          3 :         if (saltlen == -1)
     574                 :          0 :                 saltlen = EVP_MD_size(sigmd);
     575         [ +  - ]:          3 :         else if (saltlen == -2)
     576                 :            :                 {
     577                 :          3 :                 saltlen = EVP_PKEY_size(pk) - EVP_MD_size(sigmd) - 2;
     578         [ -  + ]:          3 :                 if (((EVP_PKEY_bits(pk) - 1) & 0x7) == 0)
     579                 :          0 :                         saltlen--;
     580                 :            :                 }
     581                 :          3 :         pss = RSA_PSS_PARAMS_new();
     582         [ +  - ]:          3 :         if (!pss)
     583                 :            :                 goto err;
     584         [ +  - ]:          3 :         if (saltlen != 20)
     585                 :            :                 {
     586                 :          3 :                 pss->saltLength = ASN1_INTEGER_new();
     587         [ +  - ]:          3 :                 if (!pss->saltLength)
     588                 :            :                         goto err;
     589         [ +  - ]:          3 :                 if (!ASN1_INTEGER_set(pss->saltLength, saltlen))
     590                 :            :                         goto err;
     591                 :            :                 }
     592         [ +  - ]:          3 :         if (!rsa_md_to_algor(&pss->hashAlgorithm, sigmd))
     593                 :            :                 goto err;
     594         [ +  - ]:          3 :         if (!rsa_md_to_mgf1(&pss->maskGenAlgorithm, mgf1md))
     595                 :            :                 goto err;
     596                 :            :         /* Finally create string with pss parameter encoding. */
     597         [ +  - ]:          3 :         if (!ASN1_item_pack(pss, ASN1_ITEM_rptr(RSA_PSS_PARAMS), &os))
     598                 :            :                 goto err;
     599                 :          3 :         rv = 1;
     600                 :            :         err:
     601         [ +  - ]:          3 :         if (pss)
     602                 :          3 :                 RSA_PSS_PARAMS_free(pss);
     603         [ +  - ]:          3 :         if (rv)
     604                 :          3 :                 return os;
     605         [ #  # ]:          0 :         if (os)
     606                 :          0 :                 ASN1_STRING_free(os);
     607                 :            :         return NULL;
     608                 :            :         }
     609                 :            : 
     610                 :            : /* From PSS AlgorithmIdentifier set public key parameters. If pkey
     611                 :            :  * isn't NULL then the EVP_MD_CTX is setup and initalised. If it
     612                 :            :  * is NULL parameters are passed to pkctx instead.
     613                 :            :  */
     614                 :            : 
     615                 :          3 : static int rsa_pss_to_ctx(EVP_MD_CTX *ctx, EVP_PKEY_CTX *pkctx,
     616                 :            :                                 X509_ALGOR *sigalg, EVP_PKEY *pkey)
     617                 :            :         {
     618                 :          3 :         int rv = -1;
     619                 :            :         int saltlen;
     620                 :          3 :         const EVP_MD *mgf1md = NULL, *md = NULL;
     621                 :            :         RSA_PSS_PARAMS *pss;
     622                 :            :         X509_ALGOR *maskHash;
     623                 :            :         /* Sanity check: make sure it is PSS */
     624         [ -  + ]:          3 :         if (OBJ_obj2nid(sigalg->algorithm) != NID_rsassaPss)
     625                 :            :                 {
     626                 :          0 :                 RSAerr(RSA_F_RSA_PSS_TO_CTX, RSA_R_UNSUPPORTED_SIGNATURE_TYPE);
     627                 :          0 :                 return -1;
     628                 :            :                 }
     629                 :            :         /* Decode PSS parameters */
     630                 :          3 :         pss = rsa_pss_decode(sigalg, &maskHash);
     631                 :            : 
     632         [ -  + ]:          3 :         if (pss == NULL)
     633                 :            :                 {
     634                 :          0 :                 RSAerr(RSA_F_RSA_PSS_TO_CTX, RSA_R_INVALID_PSS_PARAMETERS);
     635                 :          0 :                 goto err;
     636                 :            :                 }
     637                 :          3 :         mgf1md = rsa_mgf1_to_md(pss->maskGenAlgorithm, maskHash);
     638         [ +  - ]:          3 :         if (!mgf1md)
     639                 :            :                 goto err;
     640                 :          3 :         md = rsa_algor_to_md(pss->hashAlgorithm);
     641         [ +  - ]:          3 :         if (!md)
     642                 :            :                 goto err;
     643                 :            : 
     644         [ +  - ]:          3 :         if (pss->saltLength)
     645                 :            :                 {
     646                 :          3 :                 saltlen = ASN1_INTEGER_get(pss->saltLength);
     647                 :            : 
     648                 :            :                 /* Could perform more salt length sanity checks but the main
     649                 :            :                  * RSA routines will trap other invalid values anyway.
     650                 :            :                  */
     651         [ -  + ]:          3 :                 if (saltlen < 0)
     652                 :            :                         {
     653                 :          0 :                         RSAerr(RSA_F_RSA_PSS_TO_CTX, RSA_R_INVALID_SALT_LENGTH);
     654                 :          0 :                         goto err;
     655                 :            :                         }
     656                 :            :                 }
     657                 :            :         else
     658                 :            :                 saltlen = 20;
     659                 :            : 
     660                 :            :         /* low-level routines support only trailer field 0xbc (value 1)
     661                 :            :          * and PKCS#1 says we should reject any other value anyway.
     662                 :            :          */
     663 [ -  + ][ #  # ]:          3 :         if (pss->trailerField && ASN1_INTEGER_get(pss->trailerField) != 1)
     664                 :            :                 {
     665                 :          0 :                 RSAerr(RSA_F_RSA_PSS_TO_CTX, RSA_R_INVALID_TRAILER);
     666                 :          0 :                 goto err;
     667                 :            :                 }
     668                 :            : 
     669                 :            :         /* We have all parameters now set up context */
     670                 :            : 
     671         [ -  + ]:          3 :         if (pkey)
     672                 :            :                 {
     673         [ #  # ]:          0 :                 if (!EVP_DigestVerifyInit(ctx, &pkctx, md, NULL, pkey))
     674                 :            :                         goto err;
     675                 :            :                 }
     676                 :            :         else
     677                 :            :                 {
     678                 :            :                 const EVP_MD *checkmd;
     679         [ +  - ]:          3 :                 if (EVP_PKEY_CTX_get_signature_md(pkctx, &checkmd) <= 0)
     680                 :            :                         goto err;
     681         [ -  + ]:          3 :                 if (EVP_MD_type(md) != EVP_MD_type(checkmd))
     682                 :            :                         {
     683                 :          3 :                         RSAerr(RSA_F_RSA_PSS_TO_CTX, RSA_R_DIGEST_DOES_NOT_MATCH);
     684                 :          0 :                         goto err;
     685                 :            :                         }
     686                 :            :                 }
     687                 :            : 
     688         [ +  - ]:          3 :         if (EVP_PKEY_CTX_set_rsa_padding(pkctx, RSA_PKCS1_PSS_PADDING) <= 0)
     689                 :            :                 goto err;
     690                 :            : 
     691         [ +  - ]:          3 :         if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkctx, saltlen) <= 0)
     692                 :            :                 goto err;
     693                 :            : 
     694         [ +  - ]:          3 :         if (EVP_PKEY_CTX_set_rsa_mgf1_md(pkctx, mgf1md) <= 0)
     695                 :            :                 goto err;
     696                 :            :         /* Carry on */
     697                 :          3 :         rv = 1;
     698                 :            : 
     699                 :            :         err:
     700                 :          3 :         RSA_PSS_PARAMS_free(pss);
     701         [ +  + ]:          3 :         if (maskHash)
     702                 :          1 :                 X509_ALGOR_free(maskHash);
     703                 :          3 :         return rv;
     704                 :            :         }
     705                 :            : 
     706                 :         33 : static int rsa_cms_verify(CMS_SignerInfo *si)
     707                 :            :         {
     708                 :            :         int nid, nid2;
     709                 :            :         X509_ALGOR *alg;
     710                 :         33 :         EVP_PKEY_CTX *pkctx = CMS_SignerInfo_get0_pkey_ctx(si);
     711                 :         33 :         CMS_SignerInfo_get0_algs(si, NULL, NULL, NULL, &alg);
     712                 :         33 :         nid = OBJ_obj2nid(alg->algorithm);
     713         [ +  + ]:         33 :         if (nid == NID_rsaEncryption)
     714                 :            :                 return 1;
     715         [ +  - ]:          3 :         if (nid == NID_rsassaPss)
     716                 :          3 :                 return rsa_pss_to_ctx(NULL, pkctx, alg, NULL);
     717                 :            :         /* Workaround for some implementation that use a signature OID */
     718         [ #  # ]:          0 :         if (OBJ_find_sigid_algs(nid, NULL, &nid2))
     719                 :            :                 {
     720         [ #  # ]:          0 :                 if (nid2 == NID_rsaEncryption)
     721                 :            :                         return 1;
     722                 :            :                 }
     723                 :          0 :         return 0;
     724                 :            :         }
     725                 :            : 
     726                 :            : /* Customised RSA item verification routine. This is called 
     727                 :            :  * when a signature is encountered requiring special handling. We 
     728                 :            :  * currently only handle PSS.
     729                 :            :  */
     730                 :            : 
     731                 :            : 
     732                 :          0 : static int rsa_item_verify(EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn,
     733                 :            :                         X509_ALGOR *sigalg, ASN1_BIT_STRING *sig,
     734                 :            :                         EVP_PKEY *pkey)
     735                 :            :         {
     736                 :            :         /* Sanity check: make sure it is PSS */
     737         [ #  # ]:          0 :         if (OBJ_obj2nid(sigalg->algorithm) != NID_rsassaPss)
     738                 :            :                 {
     739                 :          0 :                 RSAerr(RSA_F_RSA_ITEM_VERIFY, RSA_R_UNSUPPORTED_SIGNATURE_TYPE);
     740                 :          0 :                 return -1;
     741                 :            :                 }
     742         [ #  # ]:          0 :         if (rsa_pss_to_ctx(ctx, NULL, sigalg, pkey))
     743                 :            :                 /* Carry on */
     744                 :            :                 return 2;
     745                 :          0 :         return -1;
     746                 :            :         }
     747                 :            : 
     748                 :         33 : static int rsa_cms_sign(CMS_SignerInfo *si)
     749                 :            :         {
     750                 :         33 :         int pad_mode = RSA_PKCS1_PADDING;
     751                 :            :         X509_ALGOR *alg;
     752                 :         33 :         EVP_PKEY_CTX *pkctx = CMS_SignerInfo_get0_pkey_ctx(si);
     753                 :         33 :         ASN1_STRING *os = NULL;
     754                 :         33 :         CMS_SignerInfo_get0_algs(si, NULL, NULL, NULL, &alg);
     755         [ +  + ]:         33 :         if (pkctx)
     756                 :            :                 {
     757         [ +  - ]:          3 :                 if (EVP_PKEY_CTX_get_rsa_padding(pkctx, &pad_mode) <= 0)
     758                 :            :                         return 0;
     759                 :            :                 }
     760         [ +  + ]:         33 :         if (pad_mode == RSA_PKCS1_PADDING)
     761                 :            :                 {
     762                 :         30 :                 X509_ALGOR_set0(alg, OBJ_nid2obj(NID_rsaEncryption),
     763                 :            :                                                         V_ASN1_NULL, 0);
     764                 :         30 :                 return 1;
     765                 :            :                 }
     766                 :            :         /* We don't support it */
     767         [ +  - ]:          3 :         if (pad_mode != RSA_PKCS1_PSS_PADDING)
     768                 :            :                 return 0;
     769                 :          3 :         os = rsa_ctx_to_pss(pkctx);
     770         [ +  - ]:          3 :         if (!os)
     771                 :            :                 return 0;
     772                 :          3 :         X509_ALGOR_set0(alg, OBJ_nid2obj(NID_rsassaPss), V_ASN1_SEQUENCE, os);
     773                 :          3 :         return 1;
     774                 :            :         }
     775                 :            : 
     776                 :         19 : static int rsa_item_sign(EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn,
     777                 :            :                                 X509_ALGOR *alg1, X509_ALGOR *alg2, 
     778                 :            :                                 ASN1_BIT_STRING *sig)
     779                 :            :         {
     780                 :            :         int pad_mode;
     781                 :         19 :         EVP_PKEY_CTX *pkctx = ctx->pctx;
     782         [ +  - ]:         19 :         if (EVP_PKEY_CTX_get_rsa_padding(pkctx, &pad_mode) <= 0)
     783                 :            :                 return 0;
     784         [ -  + ]:         19 :         if (pad_mode == RSA_PKCS1_PADDING)
     785                 :            :                 return 2;
     786         [ #  # ]:          0 :         if (pad_mode == RSA_PKCS1_PSS_PADDING)
     787                 :            :                 {
     788                 :          0 :                 ASN1_STRING *os1 = NULL;
     789                 :          0 :                 os1 = rsa_ctx_to_pss(pkctx);
     790         [ #  # ]:          0 :                 if (!os1)
     791                 :            :                         return 0;
     792                 :            :                 /* Duplicate parameters if we have to */
     793         [ #  # ]:          0 :                 if (alg2)
     794                 :            :                         {
     795                 :          0 :                         ASN1_STRING *os2 = ASN1_STRING_dup(os1);
     796         [ #  # ]:          0 :                         if (!os2)
     797                 :            :                                 {
     798                 :          0 :                                 ASN1_STRING_free(os1);
     799                 :          0 :                                 return 0;
     800                 :            :                                 }
     801                 :          0 :                         X509_ALGOR_set0(alg2, OBJ_nid2obj(NID_rsassaPss),
     802                 :            :                                                 V_ASN1_SEQUENCE, os2);
     803                 :            :                         }
     804                 :          0 :                 X509_ALGOR_set0(alg1, OBJ_nid2obj(NID_rsassaPss),
     805                 :            :                                         V_ASN1_SEQUENCE, os1);
     806                 :          0 :                 return 3;
     807                 :            :                 }
     808                 :            :         return 2;
     809                 :            :         }
     810                 :            : 
     811                 :          4 : static RSA_OAEP_PARAMS *rsa_oaep_decode(const X509_ALGOR *alg,
     812                 :            :                                         X509_ALGOR **pmaskHash)
     813                 :            :         {
     814                 :            :         const unsigned char *p;
     815                 :            :         int plen;
     816                 :            :         RSA_OAEP_PARAMS *pss;
     817                 :            : 
     818                 :          2 :         *pmaskHash = NULL;
     819                 :            : 
     820 [ +  - ][ +  - ]:          2 :         if (!alg->parameter || alg->parameter->type != V_ASN1_SEQUENCE)
     821                 :            :                 return NULL;
     822                 :          2 :         p = alg->parameter->value.sequence->data;
     823                 :          2 :         plen = alg->parameter->value.sequence->length;
     824                 :          2 :         pss = d2i_RSA_OAEP_PARAMS(NULL, &p, plen);
     825                 :            : 
     826         [ +  - ]:          2 :         if (!pss)
     827                 :            :                 return NULL;
     828                 :            : 
     829                 :          2 :         *pmaskHash = rsa_mgf1_decode(pss->maskGenFunc);
     830                 :            : 
     831                 :            :         return pss;
     832                 :            :         }
     833                 :            : 
     834                 :         15 : static int rsa_cms_decrypt(CMS_RecipientInfo *ri)
     835                 :            :         {
     836                 :            :         EVP_PKEY_CTX *pkctx;
     837                 :            :         X509_ALGOR *cmsalg;
     838                 :            :         int nid;
     839                 :         15 :         int rv = -1;
     840                 :         15 :         unsigned char *label = NULL;
     841                 :         15 :         int labellen = 0;
     842                 :         15 :         const EVP_MD *mgf1md = NULL, *md = NULL;
     843                 :            :         RSA_OAEP_PARAMS *oaep;
     844                 :            :         X509_ALGOR *maskHash;
     845                 :         15 :         pkctx = CMS_RecipientInfo_get0_pkey_ctx(ri);
     846         [ +  - ]:         15 :         if (!pkctx)
     847                 :            :                 return 0;
     848         [ +  - ]:         15 :         if (!CMS_RecipientInfo_ktri_get0_algs(ri, NULL, NULL, &cmsalg))
     849                 :            :                 return -1;
     850                 :         15 :         nid = OBJ_obj2nid(cmsalg->algorithm);
     851         [ +  + ]:         15 :         if (nid == NID_rsaEncryption)
     852                 :            :                 return 1;
     853         [ -  + ]:          2 :         if (nid != NID_rsaesOaep)
     854                 :            :                 {
     855                 :          0 :                 RSAerr(RSA_F_RSA_CMS_DECRYPT, RSA_R_UNSUPPORTED_ENCRYPTION_TYPE);
     856                 :          0 :                 return -1;
     857                 :            :                 }
     858                 :            :         /* Decode OAEP parameters */
     859                 :          2 :         oaep = rsa_oaep_decode(cmsalg, &maskHash);
     860                 :            : 
     861         [ -  + ]:          2 :         if (oaep == NULL)
     862                 :            :                 {
     863                 :          0 :                 RSAerr(RSA_F_RSA_CMS_DECRYPT, RSA_R_INVALID_OAEP_PARAMETERS);
     864                 :          0 :                 goto err;
     865                 :            :                 }
     866                 :            : 
     867                 :          2 :         mgf1md = rsa_mgf1_to_md(oaep->maskGenFunc, maskHash);
     868         [ +  - ]:          2 :         if (!mgf1md)
     869                 :            :                 goto err;
     870                 :          2 :         md = rsa_algor_to_md(oaep->hashFunc);
     871         [ +  - ]:          2 :         if (!md)
     872                 :            :                 goto err;
     873                 :            : 
     874         [ -  + ]:          2 :         if (oaep->pSourceFunc)
     875                 :            :                 {
     876                 :          0 :                 X509_ALGOR *plab = oaep->pSourceFunc;
     877         [ #  # ]:          0 :                 if (OBJ_obj2nid(plab->algorithm) != NID_pSpecified)
     878                 :            :                         {
     879                 :          0 :                         RSAerr(RSA_F_RSA_CMS_DECRYPT, RSA_R_UNSUPPORTED_LABEL_SOURCE);
     880                 :          0 :                         goto err;
     881                 :            :                         }
     882         [ #  # ]:          0 :                 if (plab->parameter->type != V_ASN1_OCTET_STRING)
     883                 :            :                         {
     884                 :          0 :                         RSAerr(RSA_F_RSA_CMS_DECRYPT, RSA_R_INVALID_LABEL);
     885                 :          0 :                         goto err;
     886                 :            :                         }
     887                 :            : 
     888                 :          0 :                 label = plab->parameter->value.octet_string->data;
     889                 :            :                 /* Stop label being freed when OAEP parameters are freed */
     890                 :          0 :                 plab->parameter->value.octet_string->data = NULL;
     891                 :          0 :                 labellen = plab->parameter->value.octet_string->length;
     892                 :            :                 }
     893                 :            : 
     894         [ +  - ]:          2 :         if (EVP_PKEY_CTX_set_rsa_padding(pkctx, RSA_PKCS1_OAEP_PADDING) <= 0)
     895                 :            :                 goto err;
     896         [ +  - ]:          2 :         if (EVP_PKEY_CTX_set_rsa_oaep_md(pkctx, md) <= 0)
     897                 :            :                 goto err;
     898         [ +  - ]:          2 :         if (EVP_PKEY_CTX_set_rsa_mgf1_md(pkctx, mgf1md) <= 0)
     899                 :            :                 goto err;
     900         [ +  - ]:          2 :         if (EVP_PKEY_CTX_set0_rsa_oaep_label(pkctx, label, labellen) <= 0)
     901                 :            :                 goto err;
     902                 :            :         /* Carry on */
     903                 :          2 :         rv = 1;
     904                 :            : 
     905                 :            :         err:
     906                 :          2 :         RSA_OAEP_PARAMS_free(oaep);
     907         [ +  + ]:          2 :         if (maskHash)
     908                 :          1 :                 X509_ALGOR_free(maskHash);
     909                 :          2 :         return rv;
     910                 :            :         }
     911                 :            : 
     912                 :         29 : static int rsa_cms_encrypt(CMS_RecipientInfo *ri)
     913                 :            :         {
     914                 :            :         const EVP_MD *md, *mgf1md;
     915                 :         29 :         RSA_OAEP_PARAMS *oaep = NULL;
     916                 :         29 :         ASN1_STRING *os = NULL;
     917                 :            :         X509_ALGOR *alg;
     918                 :         29 :         EVP_PKEY_CTX *pkctx = CMS_RecipientInfo_get0_pkey_ctx(ri);
     919                 :         29 :         int pad_mode = RSA_PKCS1_PADDING, rv = 0, labellen;
     920                 :            :         unsigned char *label;
     921                 :         29 :         CMS_RecipientInfo_ktri_get0_algs(ri, NULL, NULL, &alg);
     922         [ +  + ]:         29 :         if (pkctx)
     923                 :            :                 {
     924         [ +  - ]:          2 :                 if (EVP_PKEY_CTX_get_rsa_padding(pkctx, &pad_mode) <= 0)
     925                 :            :                         return 0;
     926                 :            :                 }
     927         [ +  + ]:         29 :         if (pad_mode == RSA_PKCS1_PADDING)
     928                 :            :                 {
     929                 :         27 :                 X509_ALGOR_set0(alg, OBJ_nid2obj(NID_rsaEncryption),
     930                 :            :                                                         V_ASN1_NULL, 0);
     931                 :         27 :                 return 1;
     932                 :            :                 }
     933                 :            :         /* Not supported */
     934         [ +  - ]:          2 :         if (pad_mode != RSA_PKCS1_OAEP_PADDING)
     935                 :            :                 return 0;
     936         [ +  - ]:          2 :         if (EVP_PKEY_CTX_get_rsa_oaep_md(pkctx, &md) <= 0)
     937                 :            :                 goto err;
     938         [ +  - ]:          2 :         if (EVP_PKEY_CTX_get_rsa_mgf1_md(pkctx, &mgf1md) <= 0)
     939                 :            :                 goto err;
     940                 :          2 :         labellen = EVP_PKEY_CTX_get0_rsa_oaep_label(pkctx, &label);
     941         [ +  - ]:          2 :         if (labellen < 0)
     942                 :            :                 goto err;
     943                 :          2 :         oaep = RSA_OAEP_PARAMS_new();
     944         [ +  - ]:          2 :         if (!oaep)
     945                 :            :                 goto err;
     946         [ +  - ]:          2 :         if (!rsa_md_to_algor(&oaep->hashFunc, md))
     947                 :            :                 goto err;
     948         [ +  - ]:          2 :         if (!rsa_md_to_mgf1(&oaep->maskGenFunc, mgf1md))
     949                 :            :                 goto err;
     950         [ -  + ]:          2 :         if (labellen > 0)
     951                 :            :                 {
     952                 :          0 :                 ASN1_OCTET_STRING *los = ASN1_OCTET_STRING_new();
     953                 :          0 :                 oaep->pSourceFunc = X509_ALGOR_new();
     954         [ #  # ]:          0 :                 if (!oaep->pSourceFunc)
     955                 :            :                         goto err;
     956         [ #  # ]:          0 :                 if (!los)
     957                 :            :                         goto err;
     958         [ #  # ]:          0 :                 if (!ASN1_OCTET_STRING_set(los, label, labellen))
     959                 :            :                         {
     960                 :          0 :                         ASN1_OCTET_STRING_free(los);
     961                 :          0 :                         goto err;
     962                 :            :                         }
     963                 :          0 :                 X509_ALGOR_set0(oaep->pSourceFunc, OBJ_nid2obj(NID_pSpecified),
     964                 :            :                                                 V_ASN1_OCTET_STRING, los);
     965                 :            :                 }
     966                 :            :         /* create string with pss parameter encoding. */
     967         [ +  - ]:          2 :         if (!ASN1_item_pack(oaep, ASN1_ITEM_rptr(RSA_OAEP_PARAMS), &os))
     968                 :            :                 goto err;
     969                 :          2 :         X509_ALGOR_set0(alg, OBJ_nid2obj(NID_rsaesOaep), V_ASN1_SEQUENCE, os);
     970                 :          2 :         os = NULL;
     971                 :          2 :         rv = 1;
     972                 :            :         err:
     973         [ +  - ]:          2 :         if (oaep)
     974                 :          2 :                 RSA_OAEP_PARAMS_free(oaep);
     975         [ -  + ]:          2 :         if (os)
     976                 :          0 :                 ASN1_STRING_free(os);
     977                 :          2 :         return rv;
     978                 :            :         }
     979                 :            : 
     980                 :            : const EVP_PKEY_ASN1_METHOD rsa_asn1_meths[] = 
     981                 :            :         {
     982                 :            :                 {
     983                 :            :                 EVP_PKEY_RSA,
     984                 :            :                 EVP_PKEY_RSA,
     985                 :            :                 ASN1_PKEY_SIGPARAM_NULL,
     986                 :            : 
     987                 :            :                 "RSA",
     988                 :            :                 "OpenSSL RSA method",
     989                 :            : 
     990                 :            :                 rsa_pub_decode,
     991                 :            :                 rsa_pub_encode,
     992                 :            :                 rsa_pub_cmp,
     993                 :            :                 rsa_pub_print,
     994                 :            : 
     995                 :            :                 rsa_priv_decode,
     996                 :            :                 rsa_priv_encode,
     997                 :            :                 rsa_priv_print,
     998                 :            : 
     999                 :            :                 int_rsa_size,
    1000                 :            :                 rsa_bits,
    1001                 :            :                 rsa_security_bits,
    1002                 :            : 
    1003                 :            :                 0,0,0,0,0,0,
    1004                 :            : 
    1005                 :            :                 rsa_sig_print,
    1006                 :            :                 int_rsa_free,
    1007                 :            :                 rsa_pkey_ctrl,
    1008                 :            :                 old_rsa_priv_decode,
    1009                 :            :                 old_rsa_priv_encode,
    1010                 :            :                 rsa_item_verify,
    1011                 :            :                 rsa_item_sign
    1012                 :            :                 },
    1013                 :            : 
    1014                 :            :                 {
    1015                 :            :                 EVP_PKEY_RSA2,
    1016                 :            :                 EVP_PKEY_RSA,
    1017                 :            :                 ASN1_PKEY_ALIAS
    1018                 :            :                 }
    1019                 :            :         };

Generated by: LCOV version 1.9