LCOV - code coverage report
Current view: top level - dsa - dsa_ameth.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 119 273 43.6 %
Date: 2014-08-02 Functions: 12 23 52.2 %
Branches: 62 191 32.5 %

           Branch data     Line data    Source code
       1                 :            : /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
       2                 :            :  * project 2006.
       3                 :            :  */
       4                 :            : /* ====================================================================
       5                 :            :  * Copyright (c) 2006 The OpenSSL Project.  All rights reserved.
       6                 :            :  *
       7                 :            :  * Redistribution and use in source and binary forms, with or without
       8                 :            :  * modification, are permitted provided that the following conditions
       9                 :            :  * are met:
      10                 :            :  *
      11                 :            :  * 1. Redistributions of source code must retain the above copyright
      12                 :            :  *    notice, this list of conditions and the following disclaimer. 
      13                 :            :  *
      14                 :            :  * 2. Redistributions in binary form must reproduce the above copyright
      15                 :            :  *    notice, this list of conditions and the following disclaimer in
      16                 :            :  *    the documentation and/or other materials provided with the
      17                 :            :  *    distribution.
      18                 :            :  *
      19                 :            :  * 3. All advertising materials mentioning features or use of this
      20                 :            :  *    software must display the following acknowledgment:
      21                 :            :  *    "This product includes software developed by the OpenSSL Project
      22                 :            :  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
      23                 :            :  *
      24                 :            :  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
      25                 :            :  *    endorse or promote products derived from this software without
      26                 :            :  *    prior written permission. For written permission, please contact
      27                 :            :  *    licensing@OpenSSL.org.
      28                 :            :  *
      29                 :            :  * 5. Products derived from this software may not be called "OpenSSL"
      30                 :            :  *    nor may "OpenSSL" appear in their names without prior written
      31                 :            :  *    permission of the OpenSSL Project.
      32                 :            :  *
      33                 :            :  * 6. Redistributions of any form whatsoever must retain the following
      34                 :            :  *    acknowledgment:
      35                 :            :  *    "This product includes software developed by the OpenSSL Project
      36                 :            :  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
      37                 :            :  *
      38                 :            :  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
      39                 :            :  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      40                 :            :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
      41                 :            :  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
      42                 :            :  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      43                 :            :  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
      44                 :            :  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
      45                 :            :  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      46                 :            :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
      47                 :            :  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
      48                 :            :  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
      49                 :            :  * OF THE POSSIBILITY OF SUCH DAMAGE.
      50                 :            :  * ====================================================================
      51                 :            :  *
      52                 :            :  * This product includes cryptographic software written by Eric Young
      53                 :            :  * (eay@cryptsoft.com).  This product includes software written by Tim
      54                 :            :  * Hudson (tjh@cryptsoft.com).
      55                 :            :  *
      56                 :            :  */
      57                 :            : 
      58                 :            : #include <stdio.h>
      59                 :            : #include "cryptlib.h"
      60                 :            : #include <openssl/x509.h>
      61                 :            : #include <openssl/asn1.h>
      62                 :            : #include <openssl/dsa.h>
      63                 :            : #include <openssl/bn.h>
      64                 :            : #ifndef OPENSSL_NO_CMS
      65                 :            : #include <openssl/cms.h>
      66                 :            : #endif
      67                 :            : #include "asn1_locl.h"
      68                 :            : 
      69                 :         79 : static int dsa_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey)
      70                 :            :         {
      71                 :            :         const unsigned char *p, *pm;
      72                 :            :         int pklen, pmlen;
      73                 :            :         int ptype;
      74                 :            :         void *pval;
      75                 :            :         ASN1_STRING *pstr;
      76                 :            :         X509_ALGOR *palg;
      77                 :         79 :         ASN1_INTEGER *public_key = NULL;
      78                 :            : 
      79                 :         79 :         DSA *dsa = NULL;
      80                 :            : 
      81         [ +  - ]:         79 :         if (!X509_PUBKEY_get0_param(NULL, &p, &pklen, &palg, pubkey))
      82                 :            :                 return 0;
      83                 :         79 :         X509_ALGOR_get0(NULL, &ptype, &pval, palg);
      84                 :            : 
      85                 :            : 
      86         [ +  + ]:         79 :         if (ptype == V_ASN1_SEQUENCE)
      87                 :            :                 {
      88                 :         78 :                 pstr = pval;    
      89                 :         78 :                 pm = pstr->data;
      90                 :         78 :                 pmlen = pstr->length;
      91                 :            : 
      92         [ -  + ]:         78 :                 if (!(dsa = d2i_DSAparams(NULL, &pm, pmlen)))
      93                 :            :                         {
      94                 :          0 :                         DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_DECODE_ERROR);
      95                 :          0 :                         goto err;
      96                 :            :                         }
      97                 :            : 
      98                 :            :                 }
      99         [ +  - ]:          1 :         else if ((ptype == V_ASN1_NULL) || (ptype == V_ASN1_UNDEF))
     100                 :            :                 {
     101         [ -  + ]:          1 :                 if (!(dsa = DSA_new()))
     102                 :            :                         {
     103                 :          0 :                         DSAerr(DSA_F_DSA_PUB_DECODE, ERR_R_MALLOC_FAILURE);
     104                 :          0 :                         goto err;
     105                 :            :                         }
     106                 :            :                 }
     107                 :            :         else
     108                 :            :                 {
     109                 :          0 :                 DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_PARAMETER_ENCODING_ERROR);
     110                 :          0 :                 goto err;
     111                 :            :                 }
     112                 :            : 
     113         [ -  + ]:         79 :         if (!(public_key=d2i_ASN1_INTEGER(NULL, &p, pklen)))
     114                 :            :                 {
     115                 :          0 :                 DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_DECODE_ERROR);
     116                 :          0 :                 goto err;
     117                 :            :                 }
     118                 :            : 
     119         [ -  + ]:         79 :         if (!(dsa->pub_key = ASN1_INTEGER_to_BN(public_key, NULL)))
     120                 :            :                 {
     121                 :          0 :                 DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_BN_DECODE_ERROR);
     122                 :          0 :                 goto err;
     123                 :            :                 }
     124                 :            : 
     125                 :         79 :         ASN1_INTEGER_free(public_key);
     126                 :         79 :         EVP_PKEY_assign_DSA(pkey, dsa);
     127                 :         79 :         return 1;
     128                 :            : 
     129                 :            :         err:
     130         [ #  # ]:          0 :         if (public_key)
     131                 :          0 :                 ASN1_INTEGER_free(public_key);
     132         [ #  # ]:          0 :         if (dsa)
     133                 :          0 :                 DSA_free(dsa);
     134                 :            :         return 0;
     135                 :            : 
     136                 :            :         }
     137                 :            : 
     138                 :          0 : static int dsa_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey)
     139                 :            :         {
     140                 :            :         DSA *dsa;
     141                 :          0 :         void *pval = NULL;
     142                 :            :         int ptype;
     143                 :          0 :         unsigned char *penc = NULL;
     144                 :            :         int penclen;
     145                 :            : 
     146                 :          0 :         dsa=pkey->pkey.dsa;
     147 [ #  # ][ #  # ]:          0 :         if (pkey->save_parameters && dsa->p && dsa->q && dsa->g)
         [ #  # ][ #  # ]
     148                 :            :                 {
     149                 :            :                 ASN1_STRING *str;
     150                 :          0 :                 str = ASN1_STRING_new();
     151                 :          0 :                 str->length = i2d_DSAparams(dsa, &str->data);
     152         [ #  # ]:          0 :                 if (str->length <= 0)
     153                 :            :                         {
     154                 :          0 :                         DSAerr(DSA_F_DSA_PUB_ENCODE, ERR_R_MALLOC_FAILURE);
     155                 :          0 :                         goto err;
     156                 :            :                         }
     157                 :            :                 pval = str;
     158                 :            :                 ptype = V_ASN1_SEQUENCE;
     159                 :            :                 }
     160                 :            :         else
     161                 :            :                 ptype = V_ASN1_UNDEF;
     162                 :            : 
     163                 :          0 :         dsa->write_params=0;
     164                 :            : 
     165                 :          0 :         penclen = i2d_DSAPublicKey(dsa, &penc);
     166                 :            : 
     167         [ #  # ]:          0 :         if (penclen <= 0)
     168                 :            :                 {
     169                 :          0 :                 DSAerr(DSA_F_DSA_PUB_ENCODE, ERR_R_MALLOC_FAILURE);
     170                 :          0 :                 goto err;
     171                 :            :                 }
     172                 :            : 
     173         [ #  # ]:          0 :         if (X509_PUBKEY_set0_param(pk, OBJ_nid2obj(EVP_PKEY_DSA),
     174                 :            :                                 ptype, pval, penc, penclen))
     175                 :            :                 return 1;
     176                 :            : 
     177                 :            :         err:
     178         [ #  # ]:          0 :         if (penc)
     179                 :          0 :                 OPENSSL_free(penc);
     180         [ #  # ]:          0 :         if (pval)
     181                 :          0 :                 ASN1_STRING_free(pval);
     182                 :            : 
     183                 :            :         return 0;
     184                 :            :         }
     185                 :            : 
     186                 :            : /* In PKCS#8 DSA: you just get a private key integer and parameters in the
     187                 :            :  * AlgorithmIdentifier the pubkey must be recalculated.
     188                 :            :  */
     189                 :            :         
     190                 :         37 : static int dsa_priv_decode(EVP_PKEY *pkey, PKCS8_PRIV_KEY_INFO *p8)
     191                 :            :         {
     192                 :            :         const unsigned char *p, *pm;
     193                 :            :         int pklen, pmlen;
     194                 :            :         int ptype;
     195                 :            :         void *pval;
     196                 :            :         ASN1_STRING *pstr;
     197                 :            :         X509_ALGOR *palg;
     198                 :         37 :         ASN1_INTEGER *privkey = NULL;
     199                 :         37 :         BN_CTX *ctx = NULL;
     200                 :            : 
     201                 :         37 :         STACK_OF(ASN1_TYPE) *ndsa = NULL;
     202                 :         37 :         DSA *dsa = NULL;
     203                 :            : 
     204         [ +  - ]:         37 :         if (!PKCS8_pkey_get0(NULL, &p, &pklen, &palg, p8))
     205                 :            :                 return 0;
     206                 :         37 :         X509_ALGOR_get0(NULL, &ptype, &pval, palg);
     207                 :            : 
     208                 :            :         /* Check for broken DSA PKCS#8, UGH! */
     209         [ -  + ]:         37 :         if (*p == (V_ASN1_SEQUENCE|V_ASN1_CONSTRUCTED))
     210                 :            :                 {
     211                 :            :                 ASN1_TYPE *t1, *t2;
     212         [ #  # ]:          0 :                 if(!(ndsa = d2i_ASN1_SEQUENCE_ANY(NULL, &p, pklen)))
     213                 :            :                         goto decerr;
     214         [ #  # ]:          0 :                 if (sk_ASN1_TYPE_num(ndsa) != 2)
     215                 :            :                         goto decerr;
     216                 :            :                 /* Handle Two broken types:
     217                 :            :                  * SEQUENCE {parameters, priv_key}
     218                 :            :                  * SEQUENCE {pub_key, priv_key}
     219                 :            :                  */
     220                 :            : 
     221                 :          0 :                 t1 = sk_ASN1_TYPE_value(ndsa, 0);
     222                 :          0 :                 t2 = sk_ASN1_TYPE_value(ndsa, 1);
     223         [ #  # ]:          0 :                 if (t1->type == V_ASN1_SEQUENCE)
     224                 :            :                         {
     225                 :          0 :                         p8->broken = PKCS8_EMBEDDED_PARAM;
     226                 :          0 :                         pval = t1->value.ptr;
     227                 :            :                         }
     228         [ #  # ]:          0 :                 else if (ptype == V_ASN1_SEQUENCE)
     229                 :          0 :                         p8->broken = PKCS8_NS_DB;
     230                 :            :                 else
     231                 :            :                         goto decerr;
     232                 :            : 
     233         [ #  # ]:          0 :                 if (t2->type != V_ASN1_INTEGER)
     234                 :            :                         goto decerr;
     235                 :            : 
     236                 :          0 :                 privkey = t2->value.integer;
     237                 :            :                 }
     238                 :            :         else
     239                 :            :                 {
     240                 :         37 :                 const unsigned char *q = p;
     241         [ +  - ]:         37 :                 if (!(privkey=d2i_ASN1_INTEGER(NULL, &p, pklen)))
     242                 :            :                         goto decerr;
     243         [ -  + ]:         37 :                 if (privkey->type == V_ASN1_NEG_INTEGER)
     244                 :            :                         {
     245                 :          0 :                         p8->broken = PKCS8_NEG_PRIVKEY;
     246                 :          0 :                         ASN1_INTEGER_free(privkey);
     247         [ #  # ]:          0 :                         if (!(privkey=d2i_ASN1_UINTEGER(NULL, &q, pklen)))
     248                 :            :                                 goto decerr;
     249                 :            :                         }
     250         [ +  - ]:         37 :                 if (ptype != V_ASN1_SEQUENCE)
     251                 :            :                         goto decerr;
     252                 :            :                 }
     253                 :            : 
     254                 :         37 :         pstr = pval;    
     255                 :         37 :         pm = pstr->data;
     256                 :         37 :         pmlen = pstr->length;
     257         [ +  - ]:         37 :         if (!(dsa = d2i_DSAparams(NULL, &pm, pmlen)))
     258                 :            :                 goto decerr;
     259                 :            :         /* We have parameters now set private key */
     260         [ -  + ]:         37 :         if (!(dsa->priv_key = ASN1_INTEGER_to_BN(privkey, NULL)))
     261                 :            :                 {
     262                 :          0 :                 DSAerr(DSA_F_DSA_PRIV_DECODE,DSA_R_BN_ERROR);
     263                 :          0 :                 goto dsaerr;
     264                 :            :                 }
     265                 :            :         /* Calculate public key */
     266         [ -  + ]:         37 :         if (!(dsa->pub_key = BN_new()))
     267                 :            :                 {
     268                 :          0 :                 DSAerr(DSA_F_DSA_PRIV_DECODE, ERR_R_MALLOC_FAILURE);
     269                 :          0 :                 goto dsaerr;
     270                 :            :                 }
     271         [ -  + ]:         37 :         if (!(ctx = BN_CTX_new()))
     272                 :            :                 {
     273                 :          0 :                 DSAerr(DSA_F_DSA_PRIV_DECODE, ERR_R_MALLOC_FAILURE);
     274                 :          0 :                 goto dsaerr;
     275                 :            :                 }
     276                 :            :                         
     277         [ -  + ]:         37 :         if (!BN_mod_exp(dsa->pub_key, dsa->g, dsa->priv_key, dsa->p, ctx))
     278                 :            :                 {
     279                 :          0 :                 DSAerr(DSA_F_DSA_PRIV_DECODE,DSA_R_BN_ERROR);
     280                 :          0 :                 goto dsaerr;
     281                 :            :                 }
     282                 :            : 
     283                 :         37 :         EVP_PKEY_assign_DSA(pkey, dsa);
     284                 :         37 :         BN_CTX_free (ctx);
     285         [ -  + ]:         37 :         if(ndsa)
     286                 :          0 :                 sk_ASN1_TYPE_pop_free(ndsa, ASN1_TYPE_free);
     287                 :            :         else
     288                 :         37 :                 ASN1_INTEGER_free(privkey);
     289                 :            : 
     290                 :            :         return 1;
     291                 :            : 
     292                 :            :         decerr:
     293                 :          0 :         DSAerr(DSA_F_DSA_PRIV_DECODE, EVP_R_DECODE_ERROR);
     294                 :            :         dsaerr:
     295                 :          0 :         BN_CTX_free (ctx);
     296         [ #  # ]:          0 :         if (privkey)
     297                 :          0 :                 ASN1_INTEGER_free(privkey);
     298                 :          0 :         sk_ASN1_TYPE_pop_free(ndsa, ASN1_TYPE_free);
     299                 :          0 :         DSA_free(dsa);
     300                 :          0 :         return 0;
     301                 :            :         }
     302                 :            : 
     303                 :          0 : static int dsa_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey)
     304                 :            : {
     305                 :          0 :         ASN1_STRING *params = NULL;
     306                 :          0 :         ASN1_INTEGER *prkey = NULL;
     307                 :          0 :         unsigned char *dp = NULL;
     308                 :            :         int dplen;
     309                 :            : 
     310         [ #  # ]:          0 :         if (!pkey->pkey.dsa->priv_key)
     311                 :            :                 {
     312                 :          0 :                 DSAerr(DSA_F_DSA_PRIV_ENCODE,DSA_R_MISSING_PARAMETERS);
     313                 :          0 :                 goto err;
     314                 :            :                 }
     315                 :            : 
     316                 :          0 :         params = ASN1_STRING_new();
     317                 :            : 
     318         [ #  # ]:          0 :         if (!params)
     319                 :            :                 {
     320                 :          0 :                 DSAerr(DSA_F_DSA_PRIV_ENCODE,ERR_R_MALLOC_FAILURE);
     321                 :          0 :                 goto err;
     322                 :            :                 }
     323                 :            : 
     324                 :          0 :         params->length = i2d_DSAparams(pkey->pkey.dsa, &params->data);
     325         [ #  # ]:          0 :         if (params->length <= 0)
     326                 :            :                 {
     327                 :          0 :                 DSAerr(DSA_F_DSA_PRIV_ENCODE,ERR_R_MALLOC_FAILURE);
     328                 :          0 :                 goto err;
     329                 :            :                 }
     330                 :          0 :         params->type = V_ASN1_SEQUENCE;
     331                 :            : 
     332                 :            :         /* Get private key into integer */
     333                 :          0 :         prkey = BN_to_ASN1_INTEGER(pkey->pkey.dsa->priv_key, NULL);
     334                 :            : 
     335         [ #  # ]:          0 :         if (!prkey)
     336                 :            :                 {
     337                 :          0 :                 DSAerr(DSA_F_DSA_PRIV_ENCODE,DSA_R_BN_ERROR);
     338                 :          0 :                 goto err;
     339                 :            :                 }
     340                 :            : 
     341                 :          0 :         dplen = i2d_ASN1_INTEGER(prkey, &dp);
     342                 :            : 
     343                 :          0 :         ASN1_INTEGER_free(prkey);
     344                 :            : 
     345         [ #  # ]:          0 :         if (!PKCS8_pkey_set0(p8, OBJ_nid2obj(NID_dsa), 0,
     346                 :            :                                 V_ASN1_SEQUENCE, params, dp, dplen))
     347                 :            :                 goto err;
     348                 :            : 
     349                 :            :         return 1;
     350                 :            : 
     351                 :            : err:
     352         [ #  # ]:          0 :         if (dp != NULL)
     353                 :          0 :                 OPENSSL_free(dp);
     354         [ #  # ]:          0 :         if (params != NULL)
     355                 :          0 :                 ASN1_STRING_free(params);
     356         [ #  # ]:          0 :         if (prkey != NULL)
     357                 :          0 :                 ASN1_INTEGER_free(prkey);
     358                 :            :         return 0;
     359                 :            : }
     360                 :            : 
     361                 :         80 : static int int_dsa_size(const EVP_PKEY *pkey)
     362                 :            :         {
     363                 :         80 :         return(DSA_size(pkey->pkey.dsa));
     364                 :            :         }
     365                 :            : 
     366                 :          0 : static int dsa_bits(const EVP_PKEY *pkey)
     367                 :            :         {
     368                 :          0 :         return BN_num_bits(pkey->pkey.dsa->p);
     369                 :            :         }
     370                 :            : 
     371                 :          0 : static int dsa_security_bits(const EVP_PKEY *pkey)
     372                 :            :         {
     373                 :          0 :         return DSA_security_bits(pkey->pkey.dsa);
     374                 :            :         }
     375                 :            : 
     376                 :         44 : static int dsa_missing_parameters(const EVP_PKEY *pkey)
     377                 :            :         {
     378                 :            :         DSA *dsa;
     379                 :         44 :         dsa=pkey->pkey.dsa;
     380 [ +  + ][ +  - ]:         44 :         if ((dsa->p == NULL) || (dsa->q == NULL) || (dsa->g == NULL))
                 [ +  - ]
     381                 :            :                         return 1;
     382                 :         43 :         return 0;
     383                 :            :         }
     384                 :            : 
     385                 :          1 : static int dsa_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from)
     386                 :            :         {
     387                 :            :         BIGNUM *a;
     388                 :            : 
     389         [ +  - ]:          1 :         if ((a=BN_dup(from->pkey.dsa->p)) == NULL)
     390                 :            :                 return 0;
     391         [ -  + ]:          1 :         if (to->pkey.dsa->p != NULL)
     392                 :          0 :                 BN_free(to->pkey.dsa->p);
     393                 :          1 :         to->pkey.dsa->p=a;
     394                 :            : 
     395         [ +  - ]:          1 :         if ((a=BN_dup(from->pkey.dsa->q)) == NULL)
     396                 :            :                 return 0;
     397         [ -  + ]:          1 :         if (to->pkey.dsa->q != NULL)
     398                 :          0 :                 BN_free(to->pkey.dsa->q);
     399                 :          1 :         to->pkey.dsa->q=a;
     400                 :            : 
     401         [ +  - ]:          1 :         if ((a=BN_dup(from->pkey.dsa->g)) == NULL)
     402                 :            :                 return 0;
     403         [ -  + ]:          1 :         if (to->pkey.dsa->g != NULL)
     404                 :          0 :                 BN_free(to->pkey.dsa->g);
     405                 :          1 :         to->pkey.dsa->g=a;
     406                 :          1 :         return 1;
     407                 :            :         }
     408                 :            : 
     409                 :         37 : static int dsa_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b)
     410                 :            :         {
     411   [ +  -  +  - ]:         74 :         if (    BN_cmp(a->pkey.dsa->p,b->pkey.dsa->p) ||
     412         [ -  + ]:         74 :                 BN_cmp(a->pkey.dsa->q,b->pkey.dsa->q) ||
     413                 :         37 :                 BN_cmp(a->pkey.dsa->g,b->pkey.dsa->g))
     414                 :            :                 return 0;
     415                 :            :         else
     416                 :            :                 return 1;
     417                 :            :         }
     418                 :            : 
     419                 :         37 : static int dsa_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b)
     420                 :            :         {
     421         [ +  - ]:         37 :         if (BN_cmp(b->pkey.dsa->pub_key,a->pkey.dsa->pub_key) != 0)
     422                 :            :                 return 0;
     423                 :            :         else
     424                 :         37 :                 return 1;
     425                 :            :         }
     426                 :            : 
     427                 :        118 : static void int_dsa_free(EVP_PKEY *pkey)
     428                 :            :         {
     429                 :        118 :         DSA_free(pkey->pkey.dsa);
     430                 :        118 :         }
     431                 :            : 
     432                 :         10 : static void update_buflen(const BIGNUM *b, size_t *pbuflen)
     433                 :            :         {
     434                 :            :         size_t i;
     435         [ +  + ]:         10 :         if (!b)
     436                 :         10 :                 return;
     437         [ +  + ]:          6 :         if (*pbuflen < (i = (size_t)BN_num_bytes(b)))
     438                 :          2 :                         *pbuflen = i;
     439                 :            :         }
     440                 :            : 
     441                 :          2 : static int do_dsa_print(BIO *bp, const DSA *x, int off, int ptype)
     442                 :            :         {
     443                 :          2 :         unsigned char *m=NULL;
     444                 :          2 :         int ret=0;
     445                 :          2 :         size_t buf_len=0;
     446                 :          2 :         const char *ktype = NULL;
     447                 :            : 
     448                 :            :         const BIGNUM *priv_key, *pub_key;
     449                 :            : 
     450         [ +  - ]:          2 :         if (ptype == 2)
     451                 :          2 :                 priv_key = x->priv_key;
     452                 :            :         else
     453                 :            :                 priv_key = NULL;
     454                 :            : 
     455         [ +  - ]:          2 :         if (ptype > 0)
     456                 :          2 :                 pub_key = x->pub_key;
     457                 :            :         else
     458                 :            :                 pub_key = NULL;
     459                 :            : 
     460         [ -  + ]:          2 :         if (ptype == 2)
     461                 :            :                 ktype = "Private-Key";
     462         [ #  # ]:          0 :         else if (ptype == 1)
     463                 :            :                 ktype = "Public-Key";
     464                 :            :         else
     465                 :          0 :                 ktype = "DSA-Parameters";
     466                 :            : 
     467                 :          2 :         update_buflen(x->p, &buf_len);
     468                 :          2 :         update_buflen(x->q, &buf_len);
     469                 :          2 :         update_buflen(x->g, &buf_len);
     470                 :          2 :         update_buflen(priv_key, &buf_len);
     471                 :          2 :         update_buflen(pub_key, &buf_len);
     472                 :            : 
     473                 :          2 :         m=(unsigned char *)OPENSSL_malloc(buf_len+10);
     474         [ -  + ]:          2 :         if (m == NULL)
     475                 :            :                 {
     476                 :          0 :                 DSAerr(DSA_F_DO_DSA_PRINT,ERR_R_MALLOC_FAILURE);
     477                 :          0 :                 goto err;
     478                 :            :                 }
     479                 :            : 
     480         [ -  + ]:          2 :         if (priv_key)
     481                 :            :                 {
     482         [ #  # ]:          0 :                 if(!BIO_indent(bp,off,128))
     483                 :            :                    goto err;
     484         [ #  # ]:          0 :                 if (BIO_printf(bp,"%s: (%d bit)\n",ktype, BN_num_bits(x->p))
     485                 :            :                         <= 0) goto err;
     486                 :            :                 }
     487                 :            : 
     488         [ +  - ]:          2 :         if (!ASN1_bn_print(bp,"priv:",priv_key,m,off))
     489                 :            :                 goto err;
     490         [ +  - ]:          2 :         if (!ASN1_bn_print(bp,"pub: ",pub_key,m,off))
     491                 :            :                 goto err;
     492         [ +  - ]:          2 :         if (!ASN1_bn_print(bp,"P:   ",x->p,m,off)) goto err;
     493         [ +  - ]:          2 :         if (!ASN1_bn_print(bp,"Q:   ",x->q,m,off)) goto err;
     494         [ +  - ]:          2 :         if (!ASN1_bn_print(bp,"G:   ",x->g,m,off)) goto err;
     495                 :          2 :         ret=1;
     496                 :            : err:
     497         [ +  - ]:          2 :         if (m != NULL) OPENSSL_free(m);
     498                 :          2 :         return(ret);
     499                 :            :         }
     500                 :            : 
     501                 :          0 : static int dsa_param_decode(EVP_PKEY *pkey,
     502                 :            :                                         const unsigned char **pder, int derlen)
     503                 :            :         {
     504                 :            :         DSA *dsa;
     505         [ #  # ]:          0 :         if (!(dsa = d2i_DSAparams(NULL, pder, derlen)))
     506                 :            :                 {
     507                 :          0 :                 DSAerr(DSA_F_DSA_PARAM_DECODE, ERR_R_DSA_LIB);
     508                 :          0 :                 return 0;
     509                 :            :                 }
     510                 :          0 :         EVP_PKEY_assign_DSA(pkey, dsa);
     511                 :          0 :         return 1;
     512                 :            :         }
     513                 :            : 
     514                 :          0 : static int dsa_param_encode(const EVP_PKEY *pkey, unsigned char **pder)
     515                 :            :         {
     516                 :          0 :         return i2d_DSAparams(pkey->pkey.dsa, pder);
     517                 :            :         }
     518                 :            : 
     519                 :          0 : static int dsa_param_print(BIO *bp, const EVP_PKEY *pkey, int indent,
     520                 :            :                                                         ASN1_PCTX *ctx)
     521                 :            :         {
     522                 :          0 :         return do_dsa_print(bp, pkey->pkey.dsa, indent, 0);
     523                 :            :         }
     524                 :            : 
     525                 :          0 : static int dsa_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent,
     526                 :            :                                                         ASN1_PCTX *ctx)
     527                 :            :         {
     528                 :          0 :         return do_dsa_print(bp, pkey->pkey.dsa, indent, 1);
     529                 :            :         }
     530                 :            : 
     531                 :            : 
     532                 :          2 : static int dsa_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent,
     533                 :            :                                                         ASN1_PCTX *ctx)
     534                 :            :         {
     535                 :          2 :         return do_dsa_print(bp, pkey->pkey.dsa, indent, 2);
     536                 :            :         }
     537                 :            : 
     538                 :          0 : static int old_dsa_priv_decode(EVP_PKEY *pkey,
     539                 :            :                                         const unsigned char **pder, int derlen)
     540                 :            :         {
     541                 :            :         DSA *dsa;
     542         [ #  # ]:          0 :         if (!(dsa = d2i_DSAPrivateKey (NULL, pder, derlen)))
     543                 :            :                 {
     544                 :          0 :                 DSAerr(DSA_F_OLD_DSA_PRIV_DECODE, ERR_R_DSA_LIB);
     545                 :          0 :                 return 0;
     546                 :            :                 }
     547                 :          0 :         EVP_PKEY_assign_DSA(pkey, dsa);
     548                 :          0 :         return 1;
     549                 :            :         }
     550                 :            : 
     551                 :          0 : static int old_dsa_priv_encode(const EVP_PKEY *pkey, unsigned char **pder)
     552                 :            :         {
     553                 :          0 :         return i2d_DSAPrivateKey(pkey->pkey.dsa, pder);
     554                 :            :         }
     555                 :            : 
     556                 :          0 : static int dsa_sig_print(BIO *bp, const X509_ALGOR *sigalg,
     557                 :            :                                         const ASN1_STRING *sig,
     558                 :            :                                         int indent, ASN1_PCTX *pctx)
     559                 :            :         {
     560                 :            :         DSA_SIG *dsa_sig;
     561                 :            :         const unsigned char *p;
     562         [ #  # ]:          0 :         if (!sig)
     563                 :            :                 {
     564         [ #  # ]:          0 :                 if (BIO_puts(bp, "\n") <= 0)
     565                 :            :                         return 0;
     566                 :            :                 else
     567                 :          0 :                         return 1;
     568                 :            :                 }
     569                 :          0 :         p = sig->data;
     570                 :          0 :         dsa_sig = d2i_DSA_SIG(NULL, &p, sig->length);
     571         [ #  # ]:          0 :         if (dsa_sig)
     572                 :            :                 {
     573                 :          0 :                 int rv = 0;
     574                 :          0 :                 size_t buf_len = 0;
     575                 :          0 :                 unsigned char *m=NULL;
     576                 :          0 :                 update_buflen(dsa_sig->r, &buf_len);
     577                 :          0 :                 update_buflen(dsa_sig->s, &buf_len);
     578                 :          0 :                 m = OPENSSL_malloc(buf_len+10);
     579         [ #  # ]:          0 :                 if (m == NULL)
     580                 :            :                         {
     581                 :          0 :                         DSAerr(DSA_F_DSA_SIG_PRINT,ERR_R_MALLOC_FAILURE);
     582                 :          0 :                         goto err;
     583                 :            :                         }
     584                 :            : 
     585         [ #  # ]:          0 :                 if (BIO_write(bp, "\n", 1) != 1)
     586                 :            :                         goto err;
     587                 :            : 
     588         [ #  # ]:          0 :                 if (!ASN1_bn_print(bp,"r:   ",dsa_sig->r,m,indent))
     589                 :            :                         goto err;
     590         [ #  # ]:          0 :                 if (!ASN1_bn_print(bp,"s:   ",dsa_sig->s,m,indent))
     591                 :            :                         goto err;
     592                 :          0 :                 rv = 1;
     593                 :            :                 err:
     594         [ #  # ]:          0 :                 if (m)
     595                 :          0 :                         OPENSSL_free(m);
     596                 :          0 :                 DSA_SIG_free(dsa_sig);
     597                 :            :                 return rv;
     598                 :            :                 }
     599                 :          0 :         return X509_signature_dump(bp, sig, indent);
     600                 :            :         }
     601                 :            : 
     602                 :        102 : static int dsa_pkey_ctrl(EVP_PKEY *pkey, int op, long arg1, void *arg2)
     603                 :            :         {
     604   [ +  +  -  +  :        102 :         switch (op)
                      - ]
     605                 :            :                 {
     606                 :            :                 case ASN1_PKEY_CTRL_PKCS7_SIGN:
     607         [ +  - ]:         11 :                 if (arg1 == 0)
     608                 :            :                         {
     609                 :            :                         int snid, hnid;
     610                 :            :                         X509_ALGOR *alg1, *alg2;
     611                 :         11 :                         PKCS7_SIGNER_INFO_get0_algs(arg2, NULL, &alg1, &alg2);
     612 [ +  - ][ +  - ]:         11 :                         if (alg1 == NULL || alg1->algorithm == NULL)
     613                 :          0 :                                 return -1;
     614                 :         11 :                         hnid = OBJ_obj2nid(alg1->algorithm);
     615         [ +  - ]:         11 :                         if (hnid == NID_undef)
     616                 :            :                                 return -1;
     617         [ +  - ]:         11 :                         if (!OBJ_find_sigid_by_algs(&snid, hnid, EVP_PKEY_id(pkey)))
     618                 :            :                                 return -1; 
     619                 :         11 :                         X509_ALGOR_set0(alg2, OBJ_nid2obj(snid), V_ASN1_UNDEF, 0);
     620                 :            :                         }
     621                 :            :                 return 1;
     622                 :            : #ifndef OPENSSL_NO_CMS
     623                 :            :                 case ASN1_PKEY_CTRL_CMS_SIGN:
     624         [ +  + ]:         54 :                 if (arg1 == 0)
     625                 :            :                         {
     626                 :            :                         int snid, hnid;
     627                 :            :                         X509_ALGOR *alg1, *alg2;
     628                 :         26 :                         CMS_SignerInfo_get0_algs(arg2, NULL, NULL, &alg1, &alg2);
     629 [ +  - ][ +  - ]:         26 :                         if (alg1 == NULL || alg1->algorithm == NULL)
     630                 :          0 :                                 return -1;
     631                 :         26 :                         hnid = OBJ_obj2nid(alg1->algorithm);
     632         [ +  - ]:         26 :                         if (hnid == NID_undef)
     633                 :            :                                 return -1;
     634         [ +  - ]:         26 :                         if (!OBJ_find_sigid_by_algs(&snid, hnid, EVP_PKEY_id(pkey)))
     635                 :            :                                 return -1; 
     636                 :         26 :                         X509_ALGOR_set0(alg2, OBJ_nid2obj(snid), V_ASN1_UNDEF, 0);
     637                 :            :                         }
     638                 :            :                 return 1;
     639                 :            : 
     640                 :            :                 case ASN1_PKEY_CTRL_CMS_RI_TYPE:
     641                 :          0 :                 *(int *)arg2 = CMS_RECIPINFO_NONE;
     642                 :          0 :                 return 1;
     643                 :            : #endif
     644                 :            : 
     645                 :            :                 case ASN1_PKEY_CTRL_DEFAULT_MD_NID:
     646                 :         37 :                 *(int *)arg2 = NID_sha1;
     647                 :         37 :                 return 2;
     648                 :            : 
     649                 :            :                 default:
     650                 :            :                 return -2;
     651                 :            : 
     652                 :            :                 }
     653                 :            : 
     654                 :            :         }
     655                 :            : 
     656                 :            : /* NB these are sorted in pkey_id order, lowest first */
     657                 :            : 
     658                 :            : const EVP_PKEY_ASN1_METHOD dsa_asn1_meths[] = 
     659                 :            :         {
     660                 :            : 
     661                 :            :                 {
     662                 :            :                 EVP_PKEY_DSA2,
     663                 :            :                 EVP_PKEY_DSA,
     664                 :            :                 ASN1_PKEY_ALIAS
     665                 :            :                 },
     666                 :            : 
     667                 :            :                 {
     668                 :            :                 EVP_PKEY_DSA1,
     669                 :            :                 EVP_PKEY_DSA,
     670                 :            :                 ASN1_PKEY_ALIAS
     671                 :            :                 },
     672                 :            : 
     673                 :            :                 {
     674                 :            :                 EVP_PKEY_DSA4,
     675                 :            :                 EVP_PKEY_DSA,
     676                 :            :                 ASN1_PKEY_ALIAS
     677                 :            :                 },
     678                 :            : 
     679                 :            :                 {
     680                 :            :                 EVP_PKEY_DSA3,
     681                 :            :                 EVP_PKEY_DSA,
     682                 :            :                 ASN1_PKEY_ALIAS
     683                 :            :                 },
     684                 :            : 
     685                 :            :                 {
     686                 :            :                 EVP_PKEY_DSA,
     687                 :            :                 EVP_PKEY_DSA,
     688                 :            :                 0,
     689                 :            : 
     690                 :            :                 "DSA",
     691                 :            :                 "OpenSSL DSA method",
     692                 :            : 
     693                 :            :                 dsa_pub_decode,
     694                 :            :                 dsa_pub_encode,
     695                 :            :                 dsa_pub_cmp,
     696                 :            :                 dsa_pub_print,
     697                 :            : 
     698                 :            :                 dsa_priv_decode,
     699                 :            :                 dsa_priv_encode,
     700                 :            :                 dsa_priv_print,
     701                 :            : 
     702                 :            :                 int_dsa_size,
     703                 :            :                 dsa_bits,
     704                 :            :                 dsa_security_bits,
     705                 :            : 
     706                 :            :                 dsa_param_decode,
     707                 :            :                 dsa_param_encode,
     708                 :            :                 dsa_missing_parameters,
     709                 :            :                 dsa_copy_parameters,
     710                 :            :                 dsa_cmp_parameters,
     711                 :            :                 dsa_param_print,
     712                 :            :                 dsa_sig_print,
     713                 :            : 
     714                 :            :                 int_dsa_free,
     715                 :            :                 dsa_pkey_ctrl,
     716                 :            :                 old_dsa_priv_decode,
     717                 :            :                 old_dsa_priv_encode
     718                 :            :                 }
     719                 :            :         };
     720                 :            : 

Generated by: LCOV version 1.9