LCOV - code coverage report
Current view: top level - pem - pem_pkey.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 26 114 22.8 %
Date: 2014-08-02 Functions: 2 8 25.0 %
Branches: 12 70 17.1 %

           Branch data     Line data    Source code
       1                 :            : /* crypto/pem/pem_pkey.c */
       2                 :            : /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
       3                 :            :  * All rights reserved.
       4                 :            :  *
       5                 :            :  * This package is an SSL implementation written
       6                 :            :  * by Eric Young (eay@cryptsoft.com).
       7                 :            :  * The implementation was written so as to conform with Netscapes SSL.
       8                 :            :  * 
       9                 :            :  * This library is free for commercial and non-commercial use as long as
      10                 :            :  * the following conditions are aheared to.  The following conditions
      11                 :            :  * apply to all code found in this distribution, be it the RC4, RSA,
      12                 :            :  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
      13                 :            :  * included with this distribution is covered by the same copyright terms
      14                 :            :  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
      15                 :            :  * 
      16                 :            :  * Copyright remains Eric Young's, and as such any Copyright notices in
      17                 :            :  * the code are not to be removed.
      18                 :            :  * If this package is used in a product, Eric Young should be given attribution
      19                 :            :  * as the author of the parts of the library used.
      20                 :            :  * This can be in the form of a textual message at program startup or
      21                 :            :  * in documentation (online or textual) provided with the package.
      22                 :            :  * 
      23                 :            :  * Redistribution and use in source and binary forms, with or without
      24                 :            :  * modification, are permitted provided that the following conditions
      25                 :            :  * are met:
      26                 :            :  * 1. Redistributions of source code must retain the copyright
      27                 :            :  *    notice, this list of conditions and the following disclaimer.
      28                 :            :  * 2. Redistributions in binary form must reproduce the above copyright
      29                 :            :  *    notice, this list of conditions and the following disclaimer in the
      30                 :            :  *    documentation and/or other materials provided with the distribution.
      31                 :            :  * 3. All advertising materials mentioning features or use of this software
      32                 :            :  *    must display the following acknowledgement:
      33                 :            :  *    "This product includes cryptographic software written by
      34                 :            :  *     Eric Young (eay@cryptsoft.com)"
      35                 :            :  *    The word 'cryptographic' can be left out if the rouines from the library
      36                 :            :  *    being used are not cryptographic related :-).
      37                 :            :  * 4. If you include any Windows specific code (or a derivative thereof) from 
      38                 :            :  *    the apps directory (application code) you must include an acknowledgement:
      39                 :            :  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
      40                 :            :  * 
      41                 :            :  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
      42                 :            :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      43                 :            :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      44                 :            :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
      45                 :            :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      46                 :            :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      47                 :            :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      48                 :            :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      49                 :            :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      50                 :            :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      51                 :            :  * SUCH DAMAGE.
      52                 :            :  * 
      53                 :            :  * The licence and distribution terms for any publically available version or
      54                 :            :  * derivative of this code cannot be changed.  i.e. this code cannot simply be
      55                 :            :  * copied and put under another distribution licence
      56                 :            :  * [including the GNU Public Licence.]
      57                 :            :  */
      58                 :            : 
      59                 :            : #include <stdio.h>
      60                 :            : #include "cryptlib.h"
      61                 :            : #include <openssl/buffer.h>
      62                 :            : #include <openssl/objects.h>
      63                 :            : #include <openssl/evp.h>
      64                 :            : #include <openssl/rand.h>
      65                 :            : #include <openssl/x509.h>
      66                 :            : #include <openssl/pkcs12.h>
      67                 :            : #include <openssl/pem.h>
      68                 :            : #ifndef OPENSSL_NO_ENGINE
      69                 :            : #include <openssl/engine.h>
      70                 :            : #endif
      71                 :            : #ifndef OPENSSL_NO_DH
      72                 :            : #include <openssl/dh.h>
      73                 :            : #endif
      74                 :            : #include "asn1_locl.h"
      75                 :            : 
      76                 :            : int pem_check_suffix(const char *pem_str, const char *suffix);
      77                 :            : 
      78                 :       1153 : EVP_PKEY *PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u)
      79                 :            :         {
      80                 :       1153 :         char *nm=NULL;
      81                 :       1153 :         const unsigned char *p=NULL;
      82                 :       1153 :         unsigned char *data=NULL;
      83                 :            :         long len;
      84                 :            :         int slen;
      85                 :       1153 :         EVP_PKEY *ret=NULL;
      86                 :            : 
      87         [ +  - ]:       1153 :         if (!PEM_bytes_read_bio(&data, &len, &nm, PEM_STRING_EVP_PKEY, bp, cb, u))
      88                 :            :                 return NULL;
      89                 :       1153 :         p = data;
      90                 :            : 
      91         [ +  + ]:       1153 :         if (strcmp(nm,PEM_STRING_PKCS8INF) == 0) {
      92                 :            :                 PKCS8_PRIV_KEY_INFO *p8inf;
      93                 :       1127 :                 p8inf=d2i_PKCS8_PRIV_KEY_INFO(NULL, &p, len);
      94         [ +  - ]:       1127 :                 if(!p8inf) goto p8err;
      95                 :       1127 :                 ret = EVP_PKCS82PKEY(p8inf);
      96         [ -  + ]:       1127 :                 if(x) {
      97         [ #  # ]:          0 :                         if(*x) EVP_PKEY_free((EVP_PKEY *)*x);
      98                 :          0 :                         *x = ret;
      99                 :            :                 }
     100                 :       1127 :                 PKCS8_PRIV_KEY_INFO_free(p8inf);
     101         [ -  + ]:         26 :         } else if (strcmp(nm,PEM_STRING_PKCS8) == 0) {
     102                 :            :                 PKCS8_PRIV_KEY_INFO *p8inf;
     103                 :            :                 X509_SIG *p8;
     104                 :            :                 int klen;
     105                 :            :                 char psbuf[PEM_BUFSIZE];
     106                 :          0 :                 p8 = d2i_X509_SIG(NULL, &p, len);
     107         [ #  # ]:          0 :                 if(!p8) goto p8err;
     108         [ #  # ]:          0 :                 if (cb) klen=cb(psbuf,PEM_BUFSIZE,0,u);
     109                 :          0 :                 else klen=PEM_def_callback(psbuf,PEM_BUFSIZE,0,u);
     110         [ #  # ]:          0 :                 if (klen <= 0) {
     111                 :          0 :                         PEMerr(PEM_F_PEM_READ_BIO_PRIVATEKEY,
     112                 :            :                                         PEM_R_BAD_PASSWORD_READ);
     113                 :          0 :                         X509_SIG_free(p8);
     114                 :          0 :                         goto err;
     115                 :            :                 }
     116                 :          0 :                 p8inf = PKCS8_decrypt(p8, psbuf, klen);
     117                 :          0 :                 X509_SIG_free(p8);
     118         [ #  # ]:          0 :                 if(!p8inf) goto p8err;
     119                 :          0 :                 ret = EVP_PKCS82PKEY(p8inf);
     120         [ #  # ]:          0 :                 if(x) {
     121         [ #  # ]:          0 :                         if(*x) EVP_PKEY_free((EVP_PKEY *)*x);
     122                 :          0 :                         *x = ret;
     123                 :            :                 }
     124                 :          0 :                 PKCS8_PRIV_KEY_INFO_free(p8inf);
     125         [ +  - ]:         26 :         } else if ((slen = pem_check_suffix(nm, "PRIVATE KEY")) > 0)
     126                 :            :                 {
     127                 :            :                 const EVP_PKEY_ASN1_METHOD *ameth;
     128                 :         26 :                 ameth = EVP_PKEY_asn1_find_str(NULL, nm, slen);
     129 [ +  - ][ +  - ]:         26 :                 if (!ameth || !ameth->old_priv_decode)
     130                 :            :                         goto p8err;
     131                 :         26 :                 ret=d2i_PrivateKey(ameth->pkey_id,x,&p,len);
     132                 :            :                 }
     133                 :            : p8err:
     134         [ -  + ]:       1153 :         if (ret == NULL)
     135                 :          0 :                 PEMerr(PEM_F_PEM_READ_BIO_PRIVATEKEY,ERR_R_ASN1_LIB);
     136                 :            : err:
     137                 :       1153 :         OPENSSL_free(nm);
     138                 :       1153 :         OPENSSL_cleanse(data, len);
     139                 :       1153 :         OPENSSL_free(data);
     140                 :       1153 :         return(ret);
     141                 :            :         }
     142                 :            : 
     143                 :         10 : int PEM_write_bio_PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc,
     144                 :            :                                                unsigned char *kstr, int klen,
     145                 :            :                                                pem_password_cb *cb, void *u)
     146                 :            :         {
     147                 :            :         char pem_str[80];
     148 [ +  - ][ +  - ]:         10 :         if (!x->ameth || x->ameth->priv_encode)
     149                 :         10 :                 return PEM_write_bio_PKCS8PrivateKey(bp, x, enc,
     150                 :            :                                                         (char *)kstr, klen,
     151                 :            :                                                         cb, u);
     152                 :            : 
     153                 :          0 :         BIO_snprintf(pem_str, 80, "%s PRIVATE KEY", x->ameth->pem_str);
     154                 :          0 :         return PEM_ASN1_write_bio((i2d_of_void *)i2d_PrivateKey,
     155                 :            :                                 pem_str,bp,x,enc,kstr,klen,cb,u);
     156                 :            :         }
     157                 :            : 
     158                 :          0 : EVP_PKEY *PEM_read_bio_Parameters(BIO *bp, EVP_PKEY **x)
     159                 :            :         {
     160                 :          0 :         char *nm=NULL;
     161                 :          0 :         const unsigned char *p=NULL;
     162                 :          0 :         unsigned char *data=NULL;
     163                 :            :         long len;
     164                 :            :         int slen;
     165                 :          0 :         EVP_PKEY *ret=NULL;
     166                 :            : 
     167         [ #  # ]:          0 :         if (!PEM_bytes_read_bio(&data, &len, &nm, PEM_STRING_PARAMETERS,
     168                 :            :                                                                 bp, 0, NULL))
     169                 :            :                 return NULL;
     170                 :          0 :         p = data;
     171                 :            : 
     172         [ #  # ]:          0 :         if ((slen = pem_check_suffix(nm, "PARAMETERS")) > 0)
     173                 :            :                 {
     174                 :          0 :                 ret = EVP_PKEY_new();
     175         [ #  # ]:          0 :                 if (!ret)
     176                 :            :                         goto err;
     177         [ #  # ]:          0 :                 if (!EVP_PKEY_set_type_str(ret, nm, slen)
     178         [ #  # ]:          0 :                         || !ret->ameth->param_decode
     179         [ #  # ]:          0 :                         || !ret->ameth->param_decode(ret, &p, len))
     180                 :            :                         {
     181                 :          0 :                         EVP_PKEY_free(ret);
     182                 :          0 :                         ret = NULL;
     183                 :          0 :                         goto err;
     184                 :            :                         }
     185         [ #  # ]:          0 :                 if(x)
     186                 :            :                         {
     187         [ #  # ]:          0 :                         if(*x) EVP_PKEY_free((EVP_PKEY *)*x);
     188                 :          0 :                         *x = ret;
     189                 :            :                         }
     190                 :            :                 }
     191                 :            : err:
     192         [ #  # ]:          0 :         if (ret == NULL)
     193                 :          0 :                 PEMerr(PEM_F_PEM_READ_BIO_PARAMETERS,ERR_R_ASN1_LIB);
     194                 :          0 :         OPENSSL_free(nm);
     195                 :          0 :         OPENSSL_free(data);
     196                 :          0 :         return(ret);
     197                 :            :         }
     198                 :            : 
     199                 :          0 : int PEM_write_bio_Parameters(BIO *bp, EVP_PKEY *x)
     200                 :            :         {
     201                 :            :         char pem_str[80];
     202 [ #  # ][ #  # ]:          0 :         if (!x->ameth || !x->ameth->param_encode)
     203                 :            :                 return 0;
     204                 :            : 
     205                 :          0 :         BIO_snprintf(pem_str, 80, "%s PARAMETERS", x->ameth->pem_str);
     206                 :          0 :         return PEM_ASN1_write_bio(
     207                 :          0 :                 (i2d_of_void *)x->ameth->param_encode,
     208                 :            :                                 pem_str,bp,x,NULL,NULL,0,0,NULL);
     209                 :            :         }
     210                 :            : 
     211                 :            : #ifndef OPENSSL_NO_FP_API
     212                 :          0 : EVP_PKEY *PEM_read_PrivateKey(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, void *u)
     213                 :            :         {
     214                 :            :         BIO *b;
     215                 :            :         EVP_PKEY *ret;
     216                 :            : 
     217         [ #  # ]:          0 :         if ((b=BIO_new(BIO_s_file())) == NULL)
     218                 :            :                 {
     219                 :          0 :                 PEMerr(PEM_F_PEM_READ_PRIVATEKEY,ERR_R_BUF_LIB);
     220                 :          0 :                 return(0);
     221                 :            :                 }
     222                 :          0 :         BIO_set_fp(b,fp,BIO_NOCLOSE);
     223                 :          0 :         ret=PEM_read_bio_PrivateKey(b,x,cb,u);
     224                 :          0 :         BIO_free(b);
     225                 :          0 :         return(ret);
     226                 :            :         }
     227                 :            : 
     228                 :          0 : int PEM_write_PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc,
     229                 :            :                                                unsigned char *kstr, int klen,
     230                 :            :                                                pem_password_cb *cb, void *u)
     231                 :            :         {
     232                 :            :         BIO *b;
     233                 :            :         int ret;
     234                 :            : 
     235         [ #  # ]:          0 :         if ((b=BIO_new_fp(fp, BIO_NOCLOSE)) == NULL)
     236                 :            :                 {
     237                 :          0 :                 PEMerr(PEM_F_PEM_WRITE_PRIVATEKEY,ERR_R_BUF_LIB);
     238                 :          0 :                 return 0;
     239                 :            :                 }
     240                 :          0 :         ret=PEM_write_bio_PrivateKey(b, x, enc, kstr, klen, cb, u);
     241                 :          0 :         BIO_free(b);
     242                 :          0 :         return ret;
     243                 :            :         }
     244                 :            : 
     245                 :            : #endif
     246                 :            : 
     247                 :            : #ifndef OPENSSL_NO_DH
     248                 :            : 
     249                 :            : /* Transparently read in PKCS#3 or X9.42 DH parameters */
     250                 :            : 
     251                 :          0 : DH *PEM_read_bio_DHparams(BIO *bp, DH **x, pem_password_cb *cb, void *u)
     252                 :            :         {
     253                 :          0 :         char *nm=NULL;
     254                 :          0 :         const unsigned char *p=NULL;
     255                 :          0 :         unsigned char *data=NULL;
     256                 :            :         long len;
     257                 :          0 :         DH *ret=NULL;
     258                 :            : 
     259         [ #  # ]:          0 :         if (!PEM_bytes_read_bio(&data, &len, &nm, PEM_STRING_DHPARAMS,
     260                 :            :                                                                 bp, cb, u))
     261                 :            :                 return NULL;
     262                 :          0 :         p = data;
     263                 :            : 
     264         [ #  # ]:          0 :         if (!strcmp(nm, PEM_STRING_DHXPARAMS))
     265                 :          0 :                 ret = d2i_DHxparams(x, &p, len);
     266                 :            :         else
     267                 :          0 :                 ret = d2i_DHparams(x, &p, len);
     268                 :            : 
     269         [ #  # ]:          0 :         if (ret == NULL)
     270                 :          0 :                 PEMerr(PEM_F_PEM_READ_BIO_DHPARAMS,ERR_R_ASN1_LIB);
     271                 :          0 :         OPENSSL_free(nm);
     272                 :          0 :         OPENSSL_free(data);
     273                 :          0 :         return ret;
     274                 :            :         }
     275                 :            : 
     276                 :            : #ifndef OPENSSL_NO_FP_API
     277                 :          0 : DH *PEM_read_DHparams(FILE *fp, DH **x, pem_password_cb *cb, void *u)
     278                 :            :         {
     279                 :            :         BIO *b;
     280                 :            :         DH *ret;
     281                 :            : 
     282         [ #  # ]:          0 :         if ((b=BIO_new(BIO_s_file())) == NULL)
     283                 :            :                 {
     284                 :          0 :                 PEMerr(PEM_F_PEM_READ_DHPARAMS,ERR_R_BUF_LIB);
     285                 :          0 :                 return(0);
     286                 :            :                 }
     287                 :          0 :         BIO_set_fp(b,fp,BIO_NOCLOSE);
     288                 :          0 :         ret=PEM_read_bio_DHparams(b,x,cb,u);
     289                 :          0 :         BIO_free(b);
     290                 :          0 :         return(ret);
     291                 :            :         }
     292                 :            : #endif
     293                 :            : 
     294                 :            : #endif

Generated by: LCOV version 1.9