LCOV - code coverage report
Current view: top level - home/mbr/git/openssl.git/apps - req.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 459 852 53.9 %
Date: 2014-08-02 Functions: 12 15 80.0 %
Branches: 297 700 42.4 %

           Branch data     Line data    Source code
       1                 :            : /* apps/req.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                 :            : /* Until the key-gen callbacks are modified to use newer prototypes, we allow
      60                 :            :  * deprecated functions for openssl-internal code */
      61                 :            : #ifdef OPENSSL_NO_DEPRECATED
      62                 :            : #undef OPENSSL_NO_DEPRECATED
      63                 :            : #endif
      64                 :            : 
      65                 :            : #include <stdio.h>
      66                 :            : #include <stdlib.h>
      67                 :            : #include <time.h>
      68                 :            : #include <string.h>
      69                 :            : #ifdef OPENSSL_NO_STDIO
      70                 :            : #define APPS_WIN16
      71                 :            : #endif
      72                 :            : #include "apps.h"
      73                 :            : #include <openssl/bio.h>
      74                 :            : #include <openssl/evp.h>
      75                 :            : #include <openssl/conf.h>
      76                 :            : #include <openssl/err.h>
      77                 :            : #include <openssl/asn1.h>
      78                 :            : #include <openssl/x509.h>
      79                 :            : #include <openssl/x509v3.h>
      80                 :            : #include <openssl/objects.h>
      81                 :            : #include <openssl/pem.h>
      82                 :            : #include <openssl/bn.h>
      83                 :            : #ifndef OPENSSL_NO_RSA
      84                 :            : #include <openssl/rsa.h>
      85                 :            : #endif
      86                 :            : #ifndef OPENSSL_NO_DSA
      87                 :            : #include <openssl/dsa.h>
      88                 :            : #endif
      89                 :            : 
      90                 :            : #define SECTION         "req"
      91                 :            : 
      92                 :            : #define BITS            "default_bits"
      93                 :            : #define KEYFILE         "default_keyfile"
      94                 :            : #define PROMPT          "prompt"
      95                 :            : #define DISTINGUISHED_NAME      "distinguished_name"
      96                 :            : #define ATTRIBUTES      "attributes"
      97                 :            : #define V3_EXTENSIONS   "x509_extensions"
      98                 :            : #define REQ_EXTENSIONS  "req_extensions"
      99                 :            : #define STRING_MASK     "string_mask"
     100                 :            : #define UTF8_IN         "utf8"
     101                 :            : 
     102                 :            : #define DEFAULT_KEY_LENGTH      512
     103                 :            : #define MIN_KEY_LENGTH          384
     104                 :            : 
     105                 :            : #undef PROG
     106                 :            : #define PROG    req_main
     107                 :            : 
     108                 :            : /* -inform arg  - input format - default PEM (DER or PEM)
     109                 :            :  * -outform arg - output format - default PEM
     110                 :            :  * -in arg      - input file - default stdin
     111                 :            :  * -out arg     - output file - default stdout
     112                 :            :  * -verify      - check request signature
     113                 :            :  * -noout       - don't print stuff out.
     114                 :            :  * -text        - print out human readable text.
     115                 :            :  * -nodes       - no des encryption
     116                 :            :  * -config file - Load configuration file.
     117                 :            :  * -key file    - make a request using key in file (or use it for verification).
     118                 :            :  * -keyform arg - key file format.
     119                 :            :  * -rand file(s) - load the file(s) into the PRNG.
     120                 :            :  * -newkey      - make a key and a request.
     121                 :            :  * -modulus     - print RSA modulus.
     122                 :            :  * -pubkey      - output Public Key.
     123                 :            :  * -x509        - output a self signed X509 structure instead.
     124                 :            :  * -asn1-kludge - output new certificate request in a format that some CA's
     125                 :            :  *                require.  This format is wrong
     126                 :            :  */
     127                 :            : 
     128                 :            : static int make_REQ(X509_REQ *req,EVP_PKEY *pkey,char *dn,int mutlirdn,
     129                 :            :                 int attribs,unsigned long chtype);
     130                 :            : static int build_subject(X509_REQ *req, char *subj, unsigned long chtype,
     131                 :            :                 int multirdn);
     132                 :            : static int prompt_info(X509_REQ *req,
     133                 :            :                 STACK_OF(CONF_VALUE) *dn_sk, char *dn_sect,
     134                 :            :                 STACK_OF(CONF_VALUE) *attr_sk, char *attr_sect, int attribs,
     135                 :            :                 unsigned long chtype);
     136                 :            : static int auto_info(X509_REQ *req, STACK_OF(CONF_VALUE) *sk,
     137                 :            :                                 STACK_OF(CONF_VALUE) *attr, int attribs,
     138                 :            :                                 unsigned long chtype);
     139                 :            : static int add_attribute_object(X509_REQ *req, char *text, const char *def,
     140                 :            :                                 char *value, int nid, int n_min,
     141                 :            :                                 int n_max, unsigned long chtype);
     142                 :            : static int add_DN_object(X509_NAME *n, char *text, const char *def, char *value,
     143                 :            :         int nid,int n_min,int n_max, unsigned long chtype, int mval);
     144                 :            : static int genpkey_cb(EVP_PKEY_CTX *ctx);
     145                 :            : static int req_check_len(int len,int n_min,int n_max);
     146                 :            : static int check_end(const char *str, const char *end);
     147                 :            : static EVP_PKEY_CTX *set_keygen_ctx(BIO *err, const char *gstr, int *pkey_type,
     148                 :            :                                         long *pkeylen, char **palgnam,
     149                 :            :                                         ENGINE *keygen_engine);
     150                 :            : #ifndef MONOLITH
     151                 :            : static char *default_config_file=NULL;
     152                 :            : #endif
     153                 :            : static CONF *req_conf=NULL;
     154                 :            : static int batch=0;
     155                 :            : 
     156                 :            : int MAIN(int, char **);
     157                 :            : 
     158                 :         27 : int MAIN(int argc, char **argv)
     159                 :            :         {
     160                 :         27 :         ENGINE *e = NULL, *gen_eng = NULL;
     161                 :         27 :         unsigned long nmflag = 0, reqflag = 0;
     162                 :         27 :         int ex=1,x509=0,days=30;
     163                 :         27 :         X509 *x509ss=NULL;
     164                 :         27 :         X509_REQ *req=NULL;
     165                 :         27 :         EVP_PKEY_CTX *genctx = NULL;
     166                 :         27 :         const char *keyalg = NULL;
     167                 :         27 :         char *keyalgstr = NULL;
     168                 :         27 :         STACK_OF(OPENSSL_STRING) *pkeyopts = NULL, *sigopts = NULL;
     169                 :         27 :         EVP_PKEY *pkey=NULL;
     170                 :         27 :         int i=0,badops=0,newreq=0,verbose=0,pkey_type=-1;
     171                 :         27 :         long newkey = -1;
     172                 :         27 :         BIO *in=NULL,*out=NULL;
     173                 :         27 :         int informat,outformat,verify=0,noout=0,text=0,keyform=FORMAT_PEM;
     174                 :         27 :         int nodes=0,kludge=0,newhdr=0,subject=0,pubkey=0;
     175                 :         27 :         char *infile,*outfile,*prog,*keyfile=NULL,*template=NULL,*keyout=NULL;
     176                 :            : #ifndef OPENSSL_NO_ENGINE
     177                 :         27 :         char *engine=NULL;
     178                 :            : #endif
     179                 :         27 :         char *extensions = NULL;
     180                 :         27 :         char *req_exts = NULL;
     181                 :         27 :         const EVP_CIPHER *cipher=NULL;
     182                 :         27 :         ASN1_INTEGER *serial = NULL;
     183                 :         27 :         int modulus=0;
     184                 :         27 :         char *inrand=NULL;
     185                 :         27 :         char *passargin = NULL, *passargout = NULL;
     186                 :         27 :         char *passin = NULL, *passout = NULL;
     187                 :            :         char *p;
     188                 :         27 :         char *subj = NULL;
     189                 :         27 :         int multirdn = 0;
     190                 :         27 :         const EVP_MD *md_alg=NULL,*digest=NULL;
     191                 :         27 :         unsigned long chtype = MBSTRING_ASC;
     192                 :            : #ifndef MONOLITH
     193                 :            :         char *to_free;
     194                 :            :         long errline;
     195                 :            : #endif
     196                 :            : 
     197                 :         27 :         req_conf = NULL;
     198                 :            : #ifndef OPENSSL_NO_DES
     199                 :         27 :         cipher=EVP_des_ede3_cbc();
     200                 :            : #endif
     201                 :         27 :         apps_startup();
     202                 :            : 
     203         [ -  + ]:         27 :         if (bio_err == NULL)
     204         [ #  # ]:          0 :                 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
     205                 :          0 :                         BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
     206                 :            : 
     207                 :         27 :         infile=NULL;
     208                 :         27 :         outfile=NULL;
     209                 :         27 :         informat=FORMAT_PEM;
     210                 :         27 :         outformat=FORMAT_PEM;
     211                 :            : 
     212                 :         27 :         prog=argv[0];
     213                 :         27 :         argc--;
     214                 :         27 :         argv++;
     215         [ +  + ]:        140 :         while (argc >= 1)
     216                 :            :                 {
     217         [ +  + ]:        113 :                 if      (strcmp(*argv,"-inform") == 0)
     218                 :            :                         {
     219         [ +  - ]:         14 :                         if (--argc < 1) goto bad;
     220                 :         14 :                         informat=str2fmt(*(++argv));
     221                 :            :                         }
     222         [ +  + ]:         99 :                 else if (strcmp(*argv,"-outform") == 0)
     223                 :            :                         {
     224         [ +  - ]:         12 :                         if (--argc < 1) goto bad;
     225                 :         12 :                         outformat=str2fmt(*(++argv));
     226                 :            :                         }
     227                 :            : #ifndef OPENSSL_NO_ENGINE
     228         [ -  + ]:         87 :                 else if (strcmp(*argv,"-engine") == 0)
     229                 :            :                         {
     230         [ #  # ]:          0 :                         if (--argc < 1) goto bad;
     231                 :          0 :                         engine= *(++argv);
     232                 :            :                         }
     233         [ -  + ]:         87 :                 else if (strcmp(*argv,"-keygen_engine") == 0)
     234                 :            :                         {
     235         [ #  # ]:          0 :                         if (--argc < 1) goto bad;
     236                 :          0 :                         gen_eng = ENGINE_by_id(*(++argv));
     237         [ #  # ]:          0 :                         if (gen_eng == NULL)
     238                 :            :                                 {
     239                 :          0 :                                 BIO_printf(bio_err, "Can't find keygen engine %s\n", *argv);
     240                 :          0 :                                 goto end;
     241                 :            :                                 }
     242                 :            :                         }
     243                 :            : #endif
     244         [ -  + ]:         87 :                 else if (strcmp(*argv,"-key") == 0)
     245                 :            :                         {
     246         [ #  # ]:          0 :                         if (--argc < 1) goto bad;
     247                 :          0 :                         keyfile= *(++argv);
     248                 :            :                         }
     249         [ +  - ]:         87 :                 else if (strcmp(*argv,"-pubkey") == 0)
     250                 :            :                         {
     251                 :            :                         pubkey=1;
     252                 :            :                         }
     253         [ +  + ]:         87 :                 else if (strcmp(*argv,"-new") == 0)
     254                 :            :                         {
     255                 :            :                         newreq=1;
     256                 :            :                         }
     257         [ +  + ]:         77 :                 else if (strcmp(*argv,"-config") == 0)
     258                 :            :                         {       
     259         [ +  - ]:         24 :                         if (--argc < 1) goto bad;
     260                 :         24 :                         template= *(++argv);
     261                 :            :                         }
     262         [ -  + ]:         53 :                 else if (strcmp(*argv,"-keyform") == 0)
     263                 :            :                         {
     264         [ #  # ]:          0 :                         if (--argc < 1) goto bad;
     265                 :          0 :                         keyform=str2fmt(*(++argv));
     266                 :            :                         }
     267         [ +  + ]:         53 :                 else if (strcmp(*argv,"-in") == 0)
     268                 :            :                         {
     269         [ +  - ]:         17 :                         if (--argc < 1) goto bad;
     270                 :         17 :                         infile= *(++argv);
     271                 :            :                         }
     272         [ +  + ]:         36 :                 else if (strcmp(*argv,"-out") == 0)
     273                 :            :                         {
     274         [ +  - ]:         10 :                         if (--argc < 1) goto bad;
     275                 :         10 :                         outfile= *(++argv);
     276                 :            :                         }
     277         [ +  + ]:         26 :                 else if (strcmp(*argv,"-keyout") == 0)
     278                 :            :                         {
     279         [ +  - ]:          9 :                         if (--argc < 1) goto bad;
     280                 :          9 :                         keyout= *(++argv);
     281                 :            :                         }
     282         [ -  + ]:         17 :                 else if (strcmp(*argv,"-passin") == 0)
     283                 :            :                         {
     284         [ #  # ]:          0 :                         if (--argc < 1) goto bad;
     285                 :          0 :                         passargin= *(++argv);
     286                 :            :                         }
     287         [ -  + ]:         17 :                 else if (strcmp(*argv,"-passout") == 0)
     288                 :            :                         {
     289         [ #  # ]:          0 :                         if (--argc < 1) goto bad;
     290                 :          0 :                         passargout= *(++argv);
     291                 :            :                         }
     292         [ -  + ]:         17 :                 else if (strcmp(*argv,"-rand") == 0)
     293                 :            :                         {
     294         [ #  # ]:          0 :                         if (--argc < 1) goto bad;
     295                 :          0 :                         inrand= *(++argv);
     296                 :            :                         }
     297         [ -  + ]:         17 :                 else if (strcmp(*argv,"-newkey") == 0)
     298                 :            :                         {
     299         [ #  # ]:          0 :                         if (--argc < 1)
     300                 :            :                                 goto bad;
     301                 :          0 :                         keyalg = *(++argv);
     302                 :          0 :                         newreq=1;
     303                 :            :                         }
     304         [ -  + ]:         17 :                 else if (strcmp(*argv,"-pkeyopt") == 0)
     305                 :            :                         {
     306         [ #  # ]:          0 :                         if (--argc < 1)
     307                 :            :                                 goto bad;
     308         [ #  # ]:          0 :                         if (!pkeyopts)
     309                 :          0 :                                 pkeyopts = sk_OPENSSL_STRING_new_null();
     310 [ #  # ][ #  # ]:          0 :                         if (!pkeyopts || !sk_OPENSSL_STRING_push(pkeyopts, *(++argv)))
     311                 :            :                                 goto bad;
     312                 :            :                         }
     313         [ -  + ]:         17 :                 else if (strcmp(*argv,"-sigopt") == 0)
     314                 :            :                         {
     315         [ #  # ]:          0 :                         if (--argc < 1)
     316                 :            :                                 goto bad;
     317         [ #  # ]:          0 :                         if (!sigopts)
     318                 :          0 :                                 sigopts = sk_OPENSSL_STRING_new_null();
     319 [ #  # ][ #  # ]:          0 :                         if (!sigopts || !sk_OPENSSL_STRING_push(sigopts, *(++argv)))
     320                 :            :                                 goto bad;
     321                 :            :                         }
     322         [ -  + ]:         17 :                 else if (strcmp(*argv,"-batch") == 0)
     323                 :          0 :                         batch=1;
     324         [ +  - ]:         17 :                 else if (strcmp(*argv,"-newhdr") == 0)
     325                 :            :                         newhdr=1;
     326         [ +  - ]:         17 :                 else if (strcmp(*argv,"-modulus") == 0)
     327                 :            :                         modulus=1;
     328         [ +  + ]:         17 :                 else if (strcmp(*argv,"-verify") == 0)
     329                 :            :                         verify=1;
     330         [ +  + ]:         10 :                 else if (strcmp(*argv,"-nodes") == 0)
     331                 :            :                         nodes=1;
     332         [ +  + ]:          9 :                 else if (strcmp(*argv,"-noout") == 0)
     333                 :            :                         noout=1;
     334         [ +  - ]:          4 :                 else if (strcmp(*argv,"-verbose") == 0)
     335                 :            :                         verbose=1;
     336         [ +  - ]:          4 :                 else if (strcmp(*argv,"-utf8") == 0)
     337                 :            :                         chtype = MBSTRING_UTF8;
     338         [ -  + ]:          4 :                 else if (strcmp(*argv,"-nameopt") == 0)
     339                 :            :                         {
     340         [ #  # ]:          0 :                         if (--argc < 1) goto bad;
     341         [ #  # ]:          0 :                         if (!set_name_ex(&nmflag, *(++argv))) goto bad;
     342                 :            :                         }
     343         [ -  + ]:          4 :                 else if (strcmp(*argv,"-reqopt") == 0)
     344                 :            :                         {
     345         [ #  # ]:          0 :                         if (--argc < 1) goto bad;
     346         [ #  # ]:          0 :                         if (!set_cert_ex(&reqflag, *(++argv))) goto bad;
     347                 :            :                         }
     348         [ +  - ]:          4 :                 else if (strcmp(*argv,"-subject") == 0)
     349                 :            :                         subject=1;
     350         [ +  + ]:          4 :                 else if (strcmp(*argv,"-text") == 0)
     351                 :            :                         text=1;
     352         [ +  + ]:          2 :                 else if (strcmp(*argv,"-x509") == 0)
     353                 :            :                         x509=1;
     354         [ +  - ]:          1 :                 else if (strcmp(*argv,"-asn1-kludge") == 0)
     355                 :            :                         kludge=1;
     356         [ +  - ]:          1 :                 else if (strcmp(*argv,"-no-asn1-kludge") == 0)
     357                 :            :                         kludge=0;
     358         [ -  + ]:          1 :                 else if (strcmp(*argv,"-subj") == 0)
     359                 :            :                         {
     360         [ #  # ]:          0 :                         if (--argc < 1) goto bad;
     361                 :          0 :                         subj= *(++argv);
     362                 :            :                         }
     363         [ +  - ]:          1 :                 else if (strcmp(*argv,"-multivalue-rdn") == 0)
     364                 :            :                         multirdn=1;
     365         [ +  - ]:          1 :                 else if (strcmp(*argv,"-days") == 0)
     366                 :            :                         {
     367         [ +  - ]:          1 :                         if (--argc < 1) goto bad;
     368                 :          1 :                         days= atoi(*(++argv));
     369         [ -  + ]:          1 :                         if (days == 0) days=30;
     370                 :            :                         }
     371         [ #  # ]:          0 :                 else if (strcmp(*argv,"-set_serial") == 0)
     372                 :            :                         {
     373         [ #  # ]:          0 :                         if (--argc < 1) goto bad;
     374                 :          0 :                         serial = s2i_ASN1_INTEGER(NULL, *(++argv));
     375         [ #  # ]:          0 :                         if (!serial) goto bad;
     376                 :            :                         }
     377         [ #  # ]:          0 :                 else if (strcmp(*argv,"-extensions") == 0)
     378                 :            :                         {
     379         [ #  # ]:          0 :                         if (--argc < 1) goto bad;
     380                 :          0 :                         extensions = *(++argv);
     381                 :            :                         }
     382         [ #  # ]:          0 :                 else if (strcmp(*argv,"-reqexts") == 0)
     383                 :            :                         {
     384         [ #  # ]:          0 :                         if (--argc < 1) goto bad;
     385                 :          0 :                         req_exts = *(++argv);
     386                 :            :                         }
     387         [ #  # ]:          0 :                 else if ((md_alg=EVP_get_digestbyname(&((*argv)[1]))) != NULL)
     388                 :            :                         {
     389                 :            :                         /* ok */
     390                 :            :                         digest=md_alg;
     391                 :            :                         }
     392                 :            :                 else
     393                 :            :                         {
     394                 :          0 :                         BIO_printf(bio_err,"unknown option %s\n",*argv);
     395                 :          0 :                         badops=1;
     396                 :          0 :                         break;
     397                 :            :                         }
     398                 :        113 :                 argc--;
     399                 :        113 :                 argv++;
     400                 :            :                 }
     401                 :            : 
     402         [ -  + ]:         27 :         if (badops)
     403                 :            :                 {
     404                 :            : bad:
     405                 :          0 :                 BIO_printf(bio_err,"%s [options] <infile >outfile\n",prog);
     406                 :          0 :                 BIO_printf(bio_err,"where options  are\n");
     407                 :          0 :                 BIO_printf(bio_err," -inform arg    input format - DER or PEM\n");
     408                 :          0 :                 BIO_printf(bio_err," -outform arg   output format - DER or PEM\n");
     409                 :          0 :                 BIO_printf(bio_err," -in arg        input file\n");
     410                 :          0 :                 BIO_printf(bio_err," -out arg       output file\n");
     411                 :          0 :                 BIO_printf(bio_err," -text          text form of request\n");
     412                 :          0 :                 BIO_printf(bio_err," -pubkey        output public key\n");
     413                 :          0 :                 BIO_printf(bio_err," -noout         do not output REQ\n");
     414                 :          0 :                 BIO_printf(bio_err," -verify        verify signature on REQ\n");
     415                 :          0 :                 BIO_printf(bio_err," -modulus       RSA modulus\n");
     416                 :          0 :                 BIO_printf(bio_err," -nodes         don't encrypt the output key\n");
     417                 :            : #ifndef OPENSSL_NO_ENGINE
     418                 :          0 :                 BIO_printf(bio_err," -engine e      use engine e, possibly a hardware device\n");
     419                 :            : #endif
     420                 :          0 :                 BIO_printf(bio_err," -subject       output the request's subject\n");
     421                 :          0 :                 BIO_printf(bio_err," -passin        private key password source\n");
     422                 :          0 :                 BIO_printf(bio_err," -key file      use the private key contained in file\n");
     423                 :          0 :                 BIO_printf(bio_err," -keyform arg   key file format\n");
     424                 :          0 :                 BIO_printf(bio_err," -keyout arg    file to send the key to\n");
     425                 :          0 :                 BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
     426                 :          0 :                 BIO_printf(bio_err,"                load the file (or the files in the directory) into\n");
     427                 :          0 :                 BIO_printf(bio_err,"                the random number generator\n");
     428                 :          0 :                 BIO_printf(bio_err," -newkey rsa:bits generate a new RSA key of 'bits' in size\n");
     429                 :          0 :                 BIO_printf(bio_err," -newkey dsa:file generate a new DSA key, parameters taken from CA in 'file'\n");
     430                 :            : #ifndef OPENSSL_NO_ECDSA
     431                 :          0 :                 BIO_printf(bio_err," -newkey ec:file generate a new EC key, parameters taken from CA in 'file'\n");
     432                 :            : #endif
     433                 :          0 :                 BIO_printf(bio_err," -[digest]      Digest to sign with (md5, sha1, md2, mdc2, md4)\n");
     434                 :          0 :                 BIO_printf(bio_err," -config file   request template file.\n");
     435                 :          0 :                 BIO_printf(bio_err," -subj arg      set or modify request subject\n");
     436                 :          0 :                 BIO_printf(bio_err," -multivalue-rdn enable support for multivalued RDNs\n");
     437                 :          0 :                 BIO_printf(bio_err," -new           new request.\n");
     438                 :          0 :                 BIO_printf(bio_err," -batch         do not ask anything during request generation\n");
     439                 :          0 :                 BIO_printf(bio_err," -x509          output a x509 structure instead of a cert. req.\n");
     440                 :          0 :                 BIO_printf(bio_err," -days          number of days a certificate generated by -x509 is valid for.\n");
     441                 :          0 :                 BIO_printf(bio_err," -set_serial    serial number to use for a certificate generated by -x509.\n");
     442                 :          0 :                 BIO_printf(bio_err," -newhdr        output \"NEW\" in the header lines\n");
     443                 :          0 :                 BIO_printf(bio_err," -asn1-kludge   Output the 'request' in a format that is wrong but some CA's\n");
     444                 :          0 :                 BIO_printf(bio_err,"                have been reported as requiring\n");
     445                 :          0 :                 BIO_printf(bio_err," -extensions .. specify certificate extension section (override value in config file)\n");
     446                 :          0 :                 BIO_printf(bio_err," -reqexts ..    specify request extension section (override value in config file)\n");
     447                 :          0 :                 BIO_printf(bio_err," -utf8          input characters are UTF8 (default ASCII)\n");
     448                 :          0 :                 BIO_printf(bio_err," -nameopt arg    - various certificate name options\n");
     449                 :          0 :                 BIO_printf(bio_err," -reqopt arg    - various request text options\n\n");
     450                 :          0 :                 goto end;
     451                 :            :                 }
     452                 :            : 
     453                 :         27 :         ERR_load_crypto_strings();
     454         [ -  + ]:         27 :         if(!app_passwd(bio_err, passargin, passargout, &passin, &passout)) {
     455                 :          0 :                 BIO_printf(bio_err, "Error getting passwords\n");
     456                 :          0 :                 goto end;
     457                 :            :         }
     458                 :            : 
     459                 :            : #ifndef MONOLITH /* else this has happened in openssl.c (global `config') */
     460                 :            :         /* Lets load up our environment a little */
     461                 :            :         p=getenv("OPENSSL_CONF");
     462                 :            :         if (p == NULL)
     463                 :            :                 p=getenv("SSLEAY_CONF");
     464                 :            :         if (p == NULL)
     465                 :            :                 p=to_free=make_config_name();
     466                 :            :         default_config_file=p;
     467                 :            :         config=NCONF_new(NULL);
     468                 :            :         i=NCONF_load(config, p, &errline);
     469                 :            : #endif
     470                 :            : 
     471         [ +  + ]:         27 :         if (template != NULL)
     472                 :            :                 {
     473                 :         24 :                 long errline = -1;
     474                 :            : 
     475         [ -  + ]:         24 :                 if( verbose )
     476                 :          0 :                         BIO_printf(bio_err,"Using configuration from %s\n",template);
     477                 :         24 :                 req_conf=NCONF_new(NULL);
     478                 :         24 :                 i=NCONF_load(req_conf,template,&errline);
     479         [ -  + ]:         24 :                 if (i == 0)
     480                 :            :                         {
     481                 :          0 :                         BIO_printf(bio_err,"error on line %ld of %s\n",errline,template);
     482                 :         24 :                         goto end;
     483                 :            :                         }
     484                 :            :                 }
     485                 :            :         else
     486                 :            :                 {
     487                 :          3 :                 req_conf=config;
     488                 :            : 
     489         [ -  + ]:          3 :                 if (req_conf == NULL)
     490                 :            :                         {
     491                 :          0 :                         BIO_printf(bio_err,"Unable to load config info from %s\n", default_config_file);
     492         [ #  # ]:          0 :                         if (newreq)
     493                 :            :                                 goto end;
     494                 :            :                         }
     495         [ -  + ]:          3 :                 else if( verbose )
     496                 :          0 :                         BIO_printf(bio_err,"Using configuration from %s\n",
     497                 :            :                         default_config_file);
     498                 :            :                 }
     499                 :            : 
     500         [ +  - ]:         27 :         if (req_conf != NULL)
     501                 :            :                 {
     502         [ +  - ]:         27 :                 if (!load_config(bio_err, req_conf))
     503                 :            :                         goto end;
     504                 :         27 :                 p=NCONF_get_string(req_conf,NULL,"oid_file");
     505         [ +  - ]:         27 :                 if (p == NULL)
     506                 :         27 :                         ERR_clear_error();
     507         [ -  + ]:         27 :                 if (p != NULL)
     508                 :            :                         {
     509                 :            :                         BIO *oid_bio;
     510                 :            : 
     511                 :          0 :                         oid_bio=BIO_new_file(p,"r");
     512         [ #  # ]:          0 :                         if (oid_bio == NULL) 
     513                 :            :                                 {
     514                 :            :                                 /*
     515                 :            :                                 BIO_printf(bio_err,"problems opening %s for extra oid's\n",p);
     516                 :            :                                 ERR_print_errors(bio_err);
     517                 :            :                                 */
     518                 :            :                                 }
     519                 :            :                         else
     520                 :            :                                 {
     521                 :          0 :                                 OBJ_create_objects(oid_bio);
     522                 :          0 :                                 BIO_free(oid_bio);
     523                 :            :                                 }
     524                 :            :                         }
     525                 :            :                 }
     526         [ +  - ]:         27 :         if(!add_oid_section(bio_err, req_conf)) goto end;
     527                 :            : 
     528         [ +  - ]:         27 :         if (md_alg == NULL)
     529                 :            :                 {
     530                 :         27 :                 p=NCONF_get_string(req_conf,SECTION,"default_md");
     531         [ +  + ]:         27 :                 if (p == NULL)
     532                 :         18 :                         ERR_clear_error();
     533         [ +  + ]:         27 :                 if (p != NULL)
     534                 :            :                         {
     535         [ +  + ]:          9 :                         if ((md_alg=EVP_get_digestbyname(p)) != NULL)
     536                 :          5 :                                 digest=md_alg;
     537                 :            :                         }
     538                 :            :                 }
     539                 :            : 
     540         [ +  - ]:         27 :         if (!extensions)
     541                 :            :                 {
     542                 :         27 :                 extensions = NCONF_get_string(req_conf, SECTION, V3_EXTENSIONS);
     543         [ +  + ]:         27 :                 if (!extensions)
     544                 :          8 :                         ERR_clear_error();
     545                 :            :                 }
     546         [ +  + ]:         27 :         if (extensions) {
     547                 :            :                 /* Check syntax of file */
     548                 :            :                 X509V3_CTX ctx;
     549                 :         19 :                 X509V3_set_ctx_test(&ctx);
     550                 :         19 :                 X509V3_set_nconf(&ctx, req_conf);
     551         [ -  + ]:         19 :                 if(!X509V3_EXT_add_nconf(req_conf, &ctx, extensions, NULL)) {
     552                 :          0 :                         BIO_printf(bio_err,
     553                 :            :                          "Error Loading extension section %s\n", extensions);
     554                 :         19 :                         goto end;
     555                 :            :                 }
     556                 :            :         }
     557                 :            : 
     558         [ +  - ]:         27 :         if(!passin)
     559                 :            :                 {
     560                 :         27 :                 passin = NCONF_get_string(req_conf, SECTION, "input_password");
     561         [ +  - ]:         27 :                 if (!passin)
     562                 :         27 :                         ERR_clear_error();
     563                 :            :                 }
     564                 :            :         
     565         [ +  - ]:         27 :         if(!passout)
     566                 :            :                 {
     567                 :         27 :                 passout = NCONF_get_string(req_conf, SECTION, "output_password");
     568         [ +  - ]:         27 :                 if (!passout)
     569                 :         27 :                         ERR_clear_error();
     570                 :            :                 }
     571                 :            : 
     572                 :         27 :         p = NCONF_get_string(req_conf, SECTION, STRING_MASK);
     573         [ +  + ]:         27 :         if (!p)
     574                 :          8 :                 ERR_clear_error();
     575                 :            : 
     576 [ +  + ][ -  + ]:         27 :         if(p && !ASN1_STRING_set_default_mask_asc(p)) {
     577                 :          0 :                 BIO_printf(bio_err, "Invalid global string mask setting %s\n", p);
     578                 :          0 :                 goto end;
     579                 :            :         }
     580                 :            : 
     581         [ +  - ]:         27 :         if (chtype != MBSTRING_UTF8)
     582                 :            :                 {
     583                 :         27 :                 p = NCONF_get_string(req_conf, SECTION, UTF8_IN);
     584         [ +  - ]:         27 :                 if (!p)
     585                 :         27 :                         ERR_clear_error();
     586         [ #  # ]:          0 :                 else if (!strcmp(p, "yes"))
     587                 :          0 :                         chtype = MBSTRING_UTF8;
     588                 :            :                 }
     589                 :            : 
     590                 :            : 
     591         [ +  - ]:         27 :         if(!req_exts)
     592                 :            :                 {
     593                 :         27 :                 req_exts = NCONF_get_string(req_conf, SECTION, REQ_EXTENSIONS);
     594         [ +  - ]:         27 :                 if (!req_exts)
     595                 :         27 :                         ERR_clear_error();
     596                 :            :                 }
     597         [ -  + ]:         27 :         if(req_exts) {
     598                 :            :                 /* Check syntax of file */
     599                 :            :                 X509V3_CTX ctx;
     600                 :          0 :                 X509V3_set_ctx_test(&ctx);
     601                 :          0 :                 X509V3_set_nconf(&ctx, req_conf);
     602         [ #  # ]:          0 :                 if(!X509V3_EXT_add_nconf(req_conf, &ctx, req_exts, NULL)) {
     603                 :          0 :                         BIO_printf(bio_err,
     604                 :            :                          "Error Loading request extension section %s\n",
     605                 :            :                                                                 req_exts);
     606                 :          0 :                         goto end;
     607                 :            :                 }
     608                 :            :         }
     609                 :            : 
     610                 :         27 :         in=BIO_new(BIO_s_file());
     611                 :         27 :         out=BIO_new(BIO_s_file());
     612         [ +  - ]:         27 :         if ((in == NULL) || (out == NULL))
     613                 :            :                 goto end;
     614                 :            : 
     615                 :            : #ifndef OPENSSL_NO_ENGINE
     616                 :         27 :         e = setup_engine(bio_err, engine, 0);
     617                 :            : #endif
     618                 :            : 
     619         [ -  + ]:         27 :         if (keyfile != NULL)
     620                 :            :                 {
     621                 :          0 :                 pkey = load_key(bio_err, keyfile, keyform, 0, passin, e,
     622                 :            :                         "Private Key");
     623         [ #  # ]:          0 :                 if (!pkey)
     624                 :            :                         {
     625                 :            :                         /* load_key() has already printed an appropriate
     626                 :            :                            message */
     627                 :            :                         goto end;
     628                 :            :                         }
     629                 :            :                 else
     630                 :            :                         {
     631                 :          0 :                         char *randfile = NCONF_get_string(req_conf,SECTION,"RANDFILE");
     632         [ #  # ]:          0 :                         if (randfile == NULL)
     633                 :          0 :                                 ERR_clear_error();
     634                 :          0 :                         app_RAND_load_file(randfile, bio_err, 0);
     635                 :            :                         }
     636                 :            :                 }
     637                 :            : 
     638         [ +  + ]:         27 :         if (newreq && (pkey == NULL))
     639                 :            :                 {
     640                 :         10 :                 char *randfile = NCONF_get_string(req_conf,SECTION,"RANDFILE");
     641         [ -  + ]:         10 :                 if (randfile == NULL)
     642                 :          0 :                         ERR_clear_error();
     643                 :         10 :                 app_RAND_load_file(randfile, bio_err, 0);
     644         [ -  + ]:         10 :                 if (inrand)
     645                 :          0 :                         app_RAND_load_files(inrand);
     646                 :            : 
     647         [ -  + ]:         10 :                 if (!NCONF_get_number(req_conf,SECTION,BITS, &newkey))
     648                 :            :                         {
     649                 :          0 :                         newkey=DEFAULT_KEY_LENGTH;
     650                 :            :                         }
     651                 :            : 
     652         [ -  + ]:         10 :                 if (keyalg)
     653                 :            :                         {
     654                 :          0 :                         genctx = set_keygen_ctx(bio_err, keyalg, &pkey_type, &newkey,
     655                 :            :                                                         &keyalgstr, gen_eng);
     656         [ #  # ]:          0 :                         if (!genctx)
     657                 :            :                                 goto end;
     658                 :            :                         }
     659                 :            :         
     660 [ -  + ][ #  # ]:         10 :                 if (newkey < MIN_KEY_LENGTH && (pkey_type == EVP_PKEY_RSA || pkey_type == EVP_PKEY_DSA))
     661                 :            :                         {
     662                 :          0 :                         BIO_printf(bio_err,"private key length is too short,\n");
     663                 :          0 :                         BIO_printf(bio_err,"it needs to be at least %d bits, not %ld\n",MIN_KEY_LENGTH,newkey);
     664                 :          0 :                         goto end;
     665                 :            :                         }
     666                 :            : 
     667         [ +  - ]:         10 :                 if (!genctx)
     668                 :            :                         {
     669                 :         10 :                         genctx = set_keygen_ctx(bio_err, NULL, &pkey_type, &newkey,
     670                 :            :                                                         &keyalgstr, gen_eng);
     671         [ +  - ]:         10 :                         if (!genctx)
     672                 :            :                                 goto end;
     673                 :            :                         }
     674                 :            : 
     675         [ -  + ]:         10 :                 if (pkeyopts)
     676                 :            :                         {
     677                 :            :                         char *genopt;
     678         [ #  # ]:          0 :                         for (i = 0; i < sk_OPENSSL_STRING_num(pkeyopts); i++)
     679                 :            :                                 {
     680                 :          0 :                                 genopt = sk_OPENSSL_STRING_value(pkeyopts, i);
     681         [ #  # ]:          0 :                                 if (pkey_ctrl_string(genctx, genopt) <= 0)
     682                 :            :                                         {
     683                 :          0 :                                         BIO_printf(bio_err,
     684                 :            :                                                 "parameter error \"%s\"\n",
     685                 :            :                                                 genopt);
     686                 :          0 :                                         ERR_print_errors(bio_err);
     687                 :          0 :                                         goto end;
     688                 :            :                                         }
     689                 :            :                                 }
     690                 :            :                         }
     691                 :            : 
     692                 :         10 :                 BIO_printf(bio_err,"Generating a %ld bit %s private key\n",
     693                 :            :                                 newkey, keyalgstr);
     694                 :            : 
     695                 :         10 :                 EVP_PKEY_CTX_set_cb(genctx, genpkey_cb);
     696                 :         10 :                 EVP_PKEY_CTX_set_app_data(genctx, bio_err);
     697                 :            : 
     698         [ -  + ]:         10 :                 if (EVP_PKEY_keygen(genctx, &pkey) <= 0)
     699                 :            :                         {
     700                 :          0 :                         BIO_puts(bio_err, "Error Generating Key\n");
     701                 :          0 :                         goto end;
     702                 :            :                         }
     703                 :            : 
     704                 :         10 :                 EVP_PKEY_CTX_free(genctx);
     705                 :         10 :                 genctx = NULL;
     706                 :            : 
     707                 :         10 :                 app_RAND_write_file(randfile, bio_err);
     708                 :            : 
     709         [ +  + ]:         10 :                 if (keyout == NULL)
     710                 :            :                         {
     711                 :          1 :                         keyout=NCONF_get_string(req_conf,SECTION,KEYFILE);
     712         [ -  + ]:          1 :                         if (keyout == NULL)
     713                 :          0 :                                 ERR_clear_error();
     714                 :            :                         }
     715                 :            :                 
     716         [ -  + ]:         10 :                 if (keyout == NULL)
     717                 :            :                         {
     718                 :          0 :                         BIO_printf(bio_err,"writing new private key to stdout\n");
     719                 :          0 :                         BIO_set_fp(out,stdout,BIO_NOCLOSE);
     720                 :            : #ifdef OPENSSL_SYS_VMS
     721                 :            :                         {
     722                 :            :                         BIO *tmpbio = BIO_new(BIO_f_linebuffer());
     723                 :            :                         out = BIO_push(tmpbio, out);
     724                 :            :                         }
     725                 :            : #endif
     726                 :            :                         }
     727                 :            :                 else
     728                 :            :                         {
     729                 :         10 :                         BIO_printf(bio_err,"writing new private key to '%s'\n",keyout);
     730         [ -  + ]:         10 :                         if (BIO_write_filename(out,keyout) <= 0)
     731                 :            :                                 {
     732                 :          0 :                                 perror(keyout);
     733                 :          0 :                                 goto end;
     734                 :            :                                 }
     735                 :            :                         }
     736                 :            : 
     737                 :         10 :                 p=NCONF_get_string(req_conf,SECTION,"encrypt_rsa_key");
     738         [ -  + ]:         10 :                 if (p == NULL)
     739                 :            :                         {
     740                 :          0 :                         ERR_clear_error();
     741                 :          0 :                         p=NCONF_get_string(req_conf,SECTION,"encrypt_key");
     742         [ #  # ]:          0 :                         if (p == NULL)
     743                 :          0 :                                 ERR_clear_error();
     744                 :            :                         }
     745 [ +  - ][ +  - ]:         10 :                 if ((p != NULL) && (strcmp(p,"no") == 0))
     746                 :         10 :                         cipher=NULL;
     747         [ +  + ]:         10 :                 if (nodes) cipher=NULL;
     748                 :            :                 
     749                 :         10 :                 i=0;
     750                 :            : loop:
     751         [ -  + ]:         10 :                 if (!PEM_write_bio_PrivateKey(out,pkey,cipher,
     752                 :            :                         NULL,0,NULL,passout))
     753                 :            :                         {
     754         [ #  # ]:          0 :                         if ((ERR_GET_REASON(ERR_peek_error()) ==
     755         [ #  # ]:          0 :                                 PEM_R_PROBLEMS_GETTING_PASSWORD) && (i < 3))
     756                 :            :                                 {
     757                 :          0 :                                 ERR_clear_error();
     758                 :          0 :                                 i++;
     759                 :          0 :                                 goto loop;
     760                 :            :                                 }
     761                 :            :                         goto end;
     762                 :            :                         }
     763                 :         10 :                 BIO_printf(bio_err,"-----\n");
     764                 :            :                 }
     765                 :            : 
     766         [ +  + ]:         27 :         if (!newreq)
     767                 :            :                 {
     768                 :            :                 /* Since we are using a pre-existing certificate
     769                 :            :                  * request, the kludge 'format' info should not be
     770                 :            :                  * changed. */
     771                 :         17 :                 kludge= -1;
     772         [ -  + ]:         17 :                 if (infile == NULL)
     773                 :          0 :                         BIO_set_fp(in,stdin,BIO_NOCLOSE);
     774                 :            :                 else
     775                 :            :                         {
     776         [ -  + ]:         17 :                         if (BIO_read_filename(in,infile) <= 0)
     777                 :            :                                 {
     778                 :          0 :                                 perror(infile);
     779                 :          0 :                                 goto end;
     780                 :            :                                 }
     781                 :            :                         }
     782                 :            : 
     783         [ +  + ]:         17 :                 if      (informat == FORMAT_ASN1)
     784                 :          4 :                         req=d2i_X509_REQ_bio(in,NULL);
     785         [ +  - ]:         13 :                 else if (informat == FORMAT_PEM)
     786                 :         13 :                         req=PEM_read_bio_X509_REQ(in,NULL,NULL,NULL);
     787                 :            :                 else
     788                 :            :                         {
     789                 :          0 :                         BIO_printf(bio_err,"bad input format specified for X509 request\n");
     790                 :          0 :                         goto end;
     791                 :            :                         }
     792         [ -  + ]:         17 :                 if (req == NULL)
     793                 :            :                         {
     794                 :          0 :                         BIO_printf(bio_err,"unable to load X509 request\n");
     795                 :          0 :                         goto end;
     796                 :            :                         }
     797                 :            :                 }
     798                 :            : 
     799         [ +  + ]:         27 :         if (newreq || x509)
     800                 :            :                 {
     801         [ -  + ]:         10 :                 if (pkey == NULL)
     802                 :            :                         {
     803                 :          0 :                         BIO_printf(bio_err,"you need to specify a private key\n");
     804                 :          0 :                         goto end;
     805                 :            :                         }
     806                 :            : 
     807         [ +  - ]:         10 :                 if (req == NULL)
     808                 :            :                         {
     809                 :         10 :                         req=X509_REQ_new();
     810         [ +  - ]:         10 :                         if (req == NULL)
     811                 :            :                                 {
     812                 :            :                                 goto end;
     813                 :            :                                 }
     814                 :            : 
     815                 :         10 :                         i=make_REQ(req,pkey,subj,multirdn,!x509, chtype);
     816                 :         10 :                         subj=NULL; /* done processing '-subj' option */
     817 [ -  + ][ #  # ]:         10 :                         if ((kludge > 0) && !sk_X509_ATTRIBUTE_num(req->req_info->attributes))
     818                 :            :                                 {
     819                 :          0 :                                 sk_X509_ATTRIBUTE_free(req->req_info->attributes);
     820                 :          0 :                                 req->req_info->attributes = NULL;
     821                 :            :                                 }
     822         [ -  + ]:         10 :                         if (!i)
     823                 :            :                                 {
     824                 :          0 :                                 BIO_printf(bio_err,"problems making Certificate Request\n");
     825                 :          0 :                                 goto end;
     826                 :            :                                 }
     827                 :            :                         }
     828         [ +  + ]:         10 :                 if (x509)
     829                 :            :                         {
     830                 :            :                         EVP_PKEY *tmppkey;
     831                 :            :                         X509V3_CTX ext_ctx;
     832         [ +  - ]:          1 :                         if ((x509ss=X509_new()) == NULL) goto end;
     833                 :            : 
     834                 :            :                         /* Set version to V3 */
     835 [ +  - ][ +  - ]:          1 :                         if(extensions && !X509_set_version(x509ss, 2)) goto end;
     836         [ -  + ]:          1 :                         if (serial)
     837                 :            :                                 {
     838         [ #  # ]:          0 :                                 if (!X509_set_serialNumber(x509ss, serial)) goto end;
     839                 :            :                                 }
     840                 :            :                         else
     841                 :            :                                 {
     842         [ +  - ]:          1 :                                 if (!rand_serial(NULL,
     843                 :            :                                         X509_get_serialNumber(x509ss)))
     844                 :            :                                                 goto end;
     845                 :            :                                 }
     846                 :            : 
     847         [ +  - ]:          1 :                         if (!X509_set_issuer_name(x509ss, X509_REQ_get_subject_name(req))) goto end;
     848         [ +  - ]:          1 :                         if (!X509_gmtime_adj(X509_get_notBefore(x509ss),0)) goto end;
     849         [ +  - ]:          1 :                         if (!X509_time_adj_ex(X509_get_notAfter(x509ss), days, 0, NULL)) goto end;
     850         [ +  - ]:          1 :                         if (!X509_set_subject_name(x509ss, X509_REQ_get_subject_name(req))) goto end;
     851                 :          1 :                         tmppkey = X509_REQ_get_pubkey(req);
     852 [ +  - ][ +  - ]:          1 :                         if (!tmppkey || !X509_set_pubkey(x509ss,tmppkey)) goto end;
     853                 :          1 :                         EVP_PKEY_free(tmppkey);
     854                 :            : 
     855                 :            :                         /* Set up V3 context struct */
     856                 :            : 
     857                 :          1 :                         X509V3_set_ctx(&ext_ctx, x509ss, x509ss, NULL, NULL, 0);
     858                 :          1 :                         X509V3_set_nconf(&ext_ctx, req_conf);
     859                 :            : 
     860                 :            :                         /* Add extensions */
     861 [ +  - ][ -  + ]:          1 :                         if(extensions && !X509V3_EXT_add_nconf(req_conf, 
     862                 :            :                                         &ext_ctx, extensions, x509ss))
     863                 :            :                                 {
     864                 :          0 :                                 BIO_printf(bio_err,
     865                 :            :                                         "Error Loading extension section %s\n",
     866                 :            :                                         extensions);
     867                 :          0 :                                 goto end;
     868                 :            :                                 }
     869                 :            : 
     870                 :          1 :                         i=do_X509_sign(bio_err, x509ss, pkey, digest, sigopts);
     871         [ -  + ]:          1 :                         if (!i)
     872                 :            :                                 {
     873                 :          0 :                                 ERR_print_errors(bio_err);
     874                 :          1 :                                 goto end;
     875                 :            :                                 }
     876                 :            :                         }
     877                 :            :                 else
     878                 :            :                         {
     879                 :            :                         X509V3_CTX ext_ctx;
     880                 :            : 
     881                 :            :                         /* Set up V3 context struct */
     882                 :            : 
     883                 :          9 :                         X509V3_set_ctx(&ext_ctx, NULL, NULL, req, NULL, 0);
     884                 :          9 :                         X509V3_set_nconf(&ext_ctx, req_conf);
     885                 :            : 
     886                 :            :                         /* Add extensions */
     887 [ -  + ][ #  # ]:          9 :                         if(req_exts && !X509V3_EXT_REQ_add_nconf(req_conf, 
     888                 :            :                                         &ext_ctx, req_exts, req))
     889                 :            :                                 {
     890                 :          0 :                                 BIO_printf(bio_err,
     891                 :            :                                         "Error Loading extension section %s\n",
     892                 :            :                                         req_exts);
     893                 :          0 :                                 goto end;
     894                 :            :                                 }
     895                 :          9 :                         i=do_X509_REQ_sign(bio_err, req, pkey, digest, sigopts);
     896         [ -  + ]:          9 :                         if (!i)
     897                 :            :                                 {
     898                 :          0 :                                 ERR_print_errors(bio_err);
     899                 :          9 :                                 goto end;
     900                 :            :                                 }
     901                 :            :                         }
     902                 :            :                 }
     903                 :            : 
     904         [ -  + ]:         27 :         if (subj && x509)
     905                 :            :                 {
     906                 :          0 :                 BIO_printf(bio_err, "Cannot modify certificate subject\n");
     907                 :          0 :                 goto end;
     908                 :            :                 }
     909                 :            : 
     910         [ -  + ]:         27 :         if (subj && !x509)
     911                 :            :                 {
     912         [ #  # ]:          0 :                 if (verbose)
     913                 :            :                         {
     914                 :          0 :                         BIO_printf(bio_err, "Modifying Request's Subject\n");
     915                 :          0 :                         print_name(bio_err, "old subject=", X509_REQ_get_subject_name(req), nmflag);
     916                 :            :                         }
     917                 :            : 
     918         [ #  # ]:          0 :                 if (build_subject(req, subj, chtype, multirdn) == 0)
     919                 :            :                         {
     920                 :          0 :                         BIO_printf(bio_err, "ERROR: cannot modify subject\n");
     921                 :          0 :                         ex=1;
     922                 :          0 :                         goto end;
     923                 :            :                         }
     924                 :            : 
     925                 :          0 :                 req->req_info->enc.modified = 1;
     926                 :            : 
     927         [ #  # ]:          0 :                 if (verbose)
     928                 :            :                         {
     929                 :          0 :                         print_name(bio_err, "new subject=", X509_REQ_get_subject_name(req), nmflag);
     930                 :            :                         }
     931                 :            :                 }
     932                 :            : 
     933         [ +  + ]:         27 :         if (verify && !x509)
     934                 :            :                 {
     935                 :          7 :                 int tmp=0;
     936                 :            : 
     937         [ +  - ]:          7 :                 if (pkey == NULL)
     938                 :            :                         {
     939                 :          7 :                         pkey=X509_REQ_get_pubkey(req);
     940                 :          7 :                         tmp=1;
     941         [ +  - ]:          7 :                         if (pkey == NULL) goto end;
     942                 :            :                         }
     943                 :            : 
     944                 :          7 :                 i=X509_REQ_verify(req,pkey);
     945         [ +  - ]:          7 :                 if (tmp) {
     946                 :          7 :                         EVP_PKEY_free(pkey);
     947                 :          7 :                         pkey=NULL;
     948                 :            :                 }
     949                 :            : 
     950         [ +  - ]:          7 :                 if (i < 0)
     951                 :            :                         {
     952                 :            :                         goto end;
     953                 :            :                         }
     954         [ -  + ]:          7 :                 else if (i == 0)
     955                 :            :                         {
     956                 :          0 :                         BIO_printf(bio_err,"verify failure\n");
     957                 :          0 :                         ERR_print_errors(bio_err);
     958                 :            :                         }
     959                 :            :                 else /* if (i > 0) */
     960                 :          7 :                         BIO_printf(bio_err,"verify OK\n");
     961                 :            :                 }
     962                 :            : 
     963 [ +  + ][ -  + ]:         27 :         if (noout && !text && !modulus && !subject && !pubkey)
     964                 :            :                 {
     965                 :            :                 ex=0;
     966                 :            :                 goto end;
     967                 :            :                 }
     968                 :            : 
     969         [ +  + ]:         24 :         if (outfile == NULL)
     970                 :            :                 {
     971                 :         14 :                 BIO_set_fp(out,stdout,BIO_NOCLOSE);
     972                 :            : #ifdef OPENSSL_SYS_VMS
     973                 :            :                 {
     974                 :            :                 BIO *tmpbio = BIO_new(BIO_f_linebuffer());
     975                 :            :                 out = BIO_push(tmpbio, out);
     976                 :            :                 }
     977                 :            : #endif
     978                 :            :                 }
     979                 :            :         else
     980                 :            :                 {
     981 [ +  - ][ -  + ]:         10 :                 if ((keyout != NULL) && (strcmp(outfile,keyout) == 0))
     982                 :          0 :                         i=(int)BIO_append_filename(out,outfile);
     983                 :            :                 else
     984                 :         10 :                         i=(int)BIO_write_filename(out,outfile);
     985         [ -  + ]:         10 :                 if (!i)
     986                 :            :                         {
     987                 :          0 :                         perror(outfile);
     988                 :          0 :                         goto end;
     989                 :            :                         }
     990                 :            :                 }
     991                 :            : 
     992         [ -  + ]:         24 :         if (pubkey)
     993                 :            :                 {
     994                 :            :                 EVP_PKEY *tpubkey; 
     995                 :          0 :                 tpubkey=X509_REQ_get_pubkey(req);
     996         [ #  # ]:          0 :                 if (tpubkey == NULL)
     997                 :            :                         {
     998                 :          0 :                         BIO_printf(bio_err,"Error getting public key\n");
     999                 :          0 :                         ERR_print_errors(bio_err);
    1000                 :          0 :                         goto end;
    1001                 :            :                         }
    1002                 :          0 :                 PEM_write_bio_PUBKEY(out, tpubkey);
    1003                 :          0 :                 EVP_PKEY_free(tpubkey);
    1004                 :            :                 }
    1005                 :            : 
    1006         [ +  + ]:         24 :         if (text)
    1007                 :            :                 {
    1008         [ -  + ]:          2 :                 if (x509)
    1009                 :          0 :                         X509_print_ex(out, x509ss, nmflag, reqflag);
    1010                 :            :                 else    
    1011                 :          2 :                         X509_REQ_print_ex(out, req, nmflag, reqflag);
    1012                 :            :                 }
    1013                 :            : 
    1014         [ -  + ]:         24 :         if(subject) 
    1015                 :            :                 {
    1016         [ #  # ]:          0 :                 if(x509)
    1017                 :          0 :                         print_name(out, "subject=", X509_get_subject_name(x509ss), nmflag);
    1018                 :            :                 else
    1019                 :          0 :                         print_name(out, "subject=", X509_REQ_get_subject_name(req), nmflag);
    1020                 :            :                 }
    1021                 :            : 
    1022         [ -  + ]:         24 :         if (modulus)
    1023                 :            :                 {
    1024                 :            :                 EVP_PKEY *tpubkey;
    1025                 :            : 
    1026         [ #  # ]:          0 :                 if (x509)
    1027                 :          0 :                         tpubkey=X509_get_pubkey(x509ss);
    1028                 :            :                 else
    1029                 :          0 :                         tpubkey=X509_REQ_get_pubkey(req);
    1030         [ #  # ]:          0 :                 if (tpubkey == NULL)
    1031                 :            :                         {
    1032                 :          0 :                         fprintf(stdout,"Modulus=unavailable\n");
    1033                 :            :                         goto end; 
    1034                 :            :                         }
    1035                 :          0 :                 fprintf(stdout,"Modulus=");
    1036                 :            : #ifndef OPENSSL_NO_RSA
    1037         [ #  # ]:          0 :                 if (EVP_PKEY_base_id(tpubkey) == EVP_PKEY_RSA)
    1038                 :          0 :                         BN_print(out,tpubkey->pkey.rsa->n);
    1039                 :            :                 else
    1040                 :            : #endif
    1041                 :          0 :                         fprintf(stdout,"Wrong Algorithm type");
    1042                 :          0 :                 EVP_PKEY_free(tpubkey);
    1043                 :          0 :                 fprintf(stdout,"\n");
    1044                 :            :                 }
    1045                 :            : 
    1046         [ +  + ]:         24 :         if (!noout && !x509)
    1047                 :            :                 {
    1048         [ +  + ]:         21 :                 if      (outformat == FORMAT_ASN1)
    1049                 :          6 :                         i=i2d_X509_REQ_bio(out,req);
    1050         [ +  - ]:         15 :                 else if (outformat == FORMAT_PEM) {
    1051         [ -  + ]:         15 :                         if(newhdr) i=PEM_write_bio_X509_REQ_NEW(out,req);
    1052                 :         15 :                         else i=PEM_write_bio_X509_REQ(out,req);
    1053                 :            :                 } else {
    1054                 :          0 :                         BIO_printf(bio_err,"bad output format specified for outfile\n");
    1055                 :          0 :                         goto end;
    1056                 :            :                         }
    1057         [ -  + ]:         21 :                 if (!i)
    1058                 :            :                         {
    1059                 :          0 :                         BIO_printf(bio_err,"unable to write X509 request\n");
    1060                 :          0 :                         goto end;
    1061                 :            :                         }
    1062                 :            :                 }
    1063 [ +  + ][ +  - ]:         24 :         if (!noout && x509 && (x509ss != NULL))
    1064                 :            :                 {
    1065         [ -  + ]:          1 :                 if      (outformat == FORMAT_ASN1)
    1066                 :          0 :                         i=i2d_X509_bio(out,x509ss);
    1067         [ +  - ]:          1 :                 else if (outformat == FORMAT_PEM)
    1068                 :          1 :                         i=PEM_write_bio_X509(out,x509ss);
    1069                 :            :                 else    {
    1070                 :          0 :                         BIO_printf(bio_err,"bad output format specified for outfile\n");
    1071                 :          0 :                         goto end;
    1072                 :            :                         }
    1073         [ -  + ]:          1 :                 if (!i)
    1074                 :            :                         {
    1075                 :          0 :                         BIO_printf(bio_err,"unable to write X509 certificate\n");
    1076                 :          0 :                         goto end;
    1077                 :            :                         }
    1078                 :            :                 }
    1079                 :            :         ex=0;
    1080                 :            : end:
    1081                 :            : #ifndef MONOLITH
    1082                 :            :         if(to_free)
    1083                 :            :                 OPENSSL_free(to_free);
    1084                 :            : #endif
    1085         [ -  + ]:         27 :         if (ex)
    1086                 :            :                 {
    1087                 :          0 :                 ERR_print_errors(bio_err);
    1088                 :            :                 }
    1089 [ +  - ][ +  + ]:         27 :         if ((req_conf != NULL) && (req_conf != config)) NCONF_free(req_conf);
    1090                 :         27 :         BIO_free(in);
    1091                 :         27 :         BIO_free_all(out);
    1092                 :         27 :         EVP_PKEY_free(pkey);
    1093         [ -  + ]:         27 :         if (genctx)
    1094                 :          0 :                 EVP_PKEY_CTX_free(genctx);
    1095         [ -  + ]:         27 :         if (pkeyopts)
    1096                 :          0 :                 sk_OPENSSL_STRING_free(pkeyopts);
    1097         [ -  + ]:         27 :         if (sigopts)
    1098                 :          0 :                 sk_OPENSSL_STRING_free(sigopts);
    1099                 :            : #ifndef OPENSSL_NO_ENGINE
    1100         [ -  + ]:         27 :         if (gen_eng)
    1101                 :          0 :                 ENGINE_free(gen_eng);
    1102                 :            : #endif
    1103         [ +  + ]:         27 :         if (keyalgstr)
    1104                 :         10 :                 OPENSSL_free(keyalgstr);
    1105                 :         27 :         X509_REQ_free(req);
    1106                 :         27 :         X509_free(x509ss);
    1107                 :         27 :         ASN1_INTEGER_free(serial);
    1108 [ -  + ][ #  # ]:         27 :         if(passargin && passin) OPENSSL_free(passin);
    1109 [ -  + ][ #  # ]:         27 :         if(passargout && passout) OPENSSL_free(passout);
    1110                 :         27 :         OBJ_cleanup();
    1111                 :            :         apps_shutdown();
    1112                 :         27 :         OPENSSL_EXIT(ex);
    1113                 :            :         }
    1114                 :            : 
    1115                 :         10 : static int make_REQ(X509_REQ *req, EVP_PKEY *pkey, char *subj, int multirdn,
    1116                 :            :                         int attribs, unsigned long chtype)
    1117                 :            :         {
    1118                 :         10 :         int ret=0,i;
    1119                 :         10 :         char no_prompt = 0;
    1120                 :         10 :         STACK_OF(CONF_VALUE) *dn_sk, *attr_sk = NULL;
    1121                 :            :         char *tmp, *dn_sect,*attr_sect;
    1122                 :            : 
    1123                 :         10 :         tmp=NCONF_get_string(req_conf,SECTION,PROMPT);
    1124         [ +  + ]:         10 :         if (tmp == NULL)
    1125                 :          7 :                 ERR_clear_error();
    1126 [ +  + ][ +  - ]:         10 :         if((tmp != NULL) && !strcmp(tmp, "no")) no_prompt = 1;
    1127                 :            : 
    1128                 :         10 :         dn_sect=NCONF_get_string(req_conf,SECTION,DISTINGUISHED_NAME);
    1129         [ -  + ]:         10 :         if (dn_sect == NULL)
    1130                 :            :                 {
    1131                 :          0 :                 BIO_printf(bio_err,"unable to find '%s' in config\n",
    1132                 :            :                         DISTINGUISHED_NAME);
    1133                 :          0 :                 goto err;
    1134                 :            :                 }
    1135                 :         10 :         dn_sk=NCONF_get_section(req_conf,dn_sect);
    1136         [ -  + ]:         10 :         if (dn_sk == NULL)
    1137                 :            :                 {
    1138                 :          0 :                 BIO_printf(bio_err,"unable to get '%s' section\n",dn_sect);
    1139                 :          0 :                 goto err;
    1140                 :            :                 }
    1141                 :            : 
    1142                 :         10 :         attr_sect=NCONF_get_string(req_conf,SECTION,ATTRIBUTES);
    1143         [ +  - ]:         10 :         if (attr_sect == NULL)
    1144                 :            :                 {
    1145                 :         10 :                 ERR_clear_error();              
    1146                 :         10 :                 attr_sk=NULL;
    1147                 :            :                 }
    1148                 :            :         else
    1149                 :            :                 {
    1150                 :          0 :                 attr_sk=NCONF_get_section(req_conf,attr_sect);
    1151         [ #  # ]:          0 :                 if (attr_sk == NULL)
    1152                 :            :                         {
    1153                 :          0 :                         BIO_printf(bio_err,"unable to get '%s' section\n",attr_sect);
    1154                 :          0 :                         goto err;
    1155                 :            :                         }
    1156                 :            :                 }
    1157                 :            : 
    1158                 :            :         /* setup version number */
    1159         [ +  - ]:         10 :         if (!X509_REQ_set_version(req,0L)) goto err; /* version 1 */
    1160                 :            : 
    1161         [ -  + ]:         10 :         if (subj)
    1162                 :          0 :                 i = build_subject(req, subj, chtype, multirdn);
    1163         [ +  + ]:         10 :         else if (no_prompt) 
    1164                 :          3 :                 i = auto_info(req, dn_sk, attr_sk, attribs, chtype);
    1165                 :            :         else
    1166                 :          7 :                 i = prompt_info(req, dn_sk, dn_sect, attr_sk, attr_sect, attribs, chtype);
    1167         [ +  - ]:         10 :         if(!i) goto err;
    1168                 :            : 
    1169         [ +  - ]:         10 :         if (!X509_REQ_set_pubkey(req,pkey)) goto err;
    1170                 :            : 
    1171                 :         10 :         ret=1;
    1172                 :            : err:
    1173                 :         10 :         return(ret);
    1174                 :            :         }
    1175                 :            : 
    1176                 :            : /*
    1177                 :            :  * subject is expected to be in the format /type0=value0/type1=value1/type2=...
    1178                 :            :  * where characters may be escaped by \
    1179                 :            :  */
    1180                 :          0 : static int build_subject(X509_REQ *req, char *subject, unsigned long chtype, int multirdn)
    1181                 :            :         {
    1182                 :            :         X509_NAME *n;
    1183                 :            : 
    1184         [ #  # ]:          0 :         if (!(n = parse_name(subject, chtype, multirdn)))
    1185                 :            :                 return 0;
    1186                 :            : 
    1187         [ #  # ]:          0 :         if (!X509_REQ_set_subject_name(req, n))
    1188                 :            :                 {
    1189                 :          0 :                 X509_NAME_free(n);
    1190                 :          0 :                 return 0;
    1191                 :            :                 }
    1192                 :          0 :         X509_NAME_free(n);
    1193                 :          0 :         return 1;
    1194                 :            : }
    1195                 :            : 
    1196                 :            : 
    1197                 :          7 : static int prompt_info(X509_REQ *req,
    1198                 :            :                 STACK_OF(CONF_VALUE) *dn_sk, char *dn_sect,
    1199                 :            :                 STACK_OF(CONF_VALUE) *attr_sk, char *attr_sect, int attribs,
    1200                 :            :                 unsigned long chtype)
    1201                 :            :         {
    1202                 :            :         int i;
    1203                 :            :         char *p,*q;
    1204                 :            :         char buf[100];
    1205                 :            :         int nid, mval;
    1206                 :            :         long n_min,n_max;
    1207                 :            :         char *type, *value;
    1208                 :            :         const char *def;
    1209                 :            :         CONF_VALUE *v;
    1210                 :            :         X509_NAME *subj;
    1211                 :          7 :         subj = X509_REQ_get_subject_name(req);
    1212                 :            : 
    1213         [ +  - ]:          7 :         if(!batch)
    1214                 :            :                 {
    1215                 :          7 :                 BIO_printf(bio_err,"You are about to be asked to enter information that will be incorporated\n");
    1216                 :          7 :                 BIO_printf(bio_err,"into your certificate request.\n");
    1217                 :          7 :                 BIO_printf(bio_err,"What you are about to enter is what is called a Distinguished Name or a DN.\n");
    1218                 :          7 :                 BIO_printf(bio_err,"There are quite a few fields but you can leave some blank\n");
    1219                 :          7 :                 BIO_printf(bio_err,"For some fields there will be a default value,\n");
    1220                 :          7 :                 BIO_printf(bio_err,"If you enter '.', the field will be left blank.\n");
    1221                 :          7 :                 BIO_printf(bio_err,"-----\n");
    1222                 :            :                 }
    1223                 :            : 
    1224                 :            : 
    1225         [ +  - ]:         81 :         if (sk_CONF_VALUE_num(dn_sk))
    1226                 :            :                 {
    1227                 :            :                 i= -1;
    1228                 :            : start:          for (;;)
    1229                 :            :                         {
    1230                 :         81 :                         i++;
    1231         [ +  + ]:         81 :                         if (sk_CONF_VALUE_num(dn_sk) <= i) break;
    1232                 :            : 
    1233                 :         74 :                         v=sk_CONF_VALUE_value(dn_sk,i);
    1234                 :         74 :                         p=q=NULL;
    1235                 :         74 :                         type=v->name;
    1236         [ +  - ]:        148 :                         if(!check_end(type,"_min") || !check_end(type,"_max") ||
           [ +  -  +  + ]
    1237         [ +  + ]:        138 :                                 !check_end(type,"_default") ||
    1238                 :        106 :                                          !check_end(type,"_value")) continue;
    1239                 :            :                         /* Skip past any leading X. X: X, etc to allow for
    1240                 :            :                          * multiple instances 
    1241                 :            :                          */
    1242         [ +  + ]:        327 :                         for(p = v->name; *p ; p++) 
    1243 [ +  - ][ +  + ]:        306 :                                 if ((*p == ':') || (*p == ',') ||
    1244                 :            :                                                          (*p == '.')) {
    1245                 :         11 :                                         p++;
    1246         [ +  - ]:         11 :                                         if(*p) type = p;
    1247                 :            :                                         break;
    1248                 :            :                                 }
    1249         [ -  + ]:         32 :                         if (*type == '+')
    1250                 :            :                                 {
    1251                 :          0 :                                 mval = -1;
    1252                 :          0 :                                 type++;
    1253                 :            :                                 }
    1254                 :            :                         else
    1255                 :            :                                 mval = 0;
    1256                 :            :                         /* If OBJ not recognised ignore it */
    1257         [ -  + ]:         32 :                         if ((nid=OBJ_txt2nid(type)) == NID_undef) goto start;
    1258         [ -  + ]:         32 :                         if (BIO_snprintf(buf,sizeof buf,"%s_default",v->name)
    1259                 :            :                                 >= (int)sizeof(buf))
    1260                 :            :                            {
    1261                 :          0 :                            BIO_printf(bio_err,"Name '%s' too long\n",v->name);
    1262                 :          0 :                            return 0;
    1263                 :            :                            }
    1264                 :            : 
    1265         [ +  + ]:         32 :                         if ((def=NCONF_get_string(req_conf,dn_sect,buf)) == NULL)
    1266                 :            :                                 {
    1267                 :         22 :                                 ERR_clear_error();
    1268                 :         22 :                                 def="";
    1269                 :            :                                 }
    1270                 :            :                                 
    1271                 :         32 :                         BIO_snprintf(buf,sizeof buf,"%s_value",v->name);
    1272         [ -  + ]:         32 :                         if ((value=NCONF_get_string(req_conf,dn_sect,buf)) == NULL)
    1273                 :            :                                 {
    1274                 :          0 :                                 ERR_clear_error();
    1275                 :          0 :                                 value=NULL;
    1276                 :            :                                 }
    1277                 :            : 
    1278                 :         32 :                         BIO_snprintf(buf,sizeof buf,"%s_min",v->name);
    1279         [ +  - ]:         32 :                         if (!NCONF_get_number(req_conf,dn_sect,buf, &n_min))
    1280                 :            :                                 {
    1281                 :         32 :                                 ERR_clear_error();
    1282                 :         32 :                                 n_min = -1;
    1283                 :            :                                 }
    1284                 :            : 
    1285                 :         32 :                         BIO_snprintf(buf,sizeof buf,"%s_max",v->name);
    1286         [ +  - ]:         32 :                         if (!NCONF_get_number(req_conf,dn_sect,buf, &n_max))
    1287                 :            :                                 {
    1288                 :         32 :                                 ERR_clear_error();
    1289                 :         32 :                                 n_max = -1;
    1290                 :            :                                 }
    1291                 :            : 
    1292         [ +  - ]:         32 :                         if (!add_DN_object(subj,v->value,def,value,nid,
    1293                 :            :                                 n_min,n_max, chtype, mval))
    1294                 :            :                                 return 0;
    1295                 :            :                         }
    1296         [ -  + ]:          7 :                 if (X509_NAME_entry_count(subj) == 0)
    1297                 :            :                         {
    1298                 :          0 :                         BIO_printf(bio_err,"error, no objects specified in config file\n");
    1299                 :          0 :                         return 0;
    1300                 :            :                         }
    1301                 :            : 
    1302         [ +  - ]:          7 :                 if (attribs)
    1303                 :            :                         {
    1304 [ -  + ][ #  # ]:          7 :                         if ((attr_sk != NULL) && (sk_CONF_VALUE_num(attr_sk) > 0) && (!batch))
                 [ #  # ]
    1305                 :            :                                 {
    1306                 :          0 :                                 BIO_printf(bio_err,"\nPlease enter the following 'extra' attributes\n");
    1307                 :          7 :                                 BIO_printf(bio_err,"to be sent with your certificate request\n");
    1308                 :            :                                 }
    1309                 :            : 
    1310                 :            :                         i= -1;
    1311                 :            : start2:                 for (;;)
    1312                 :            :                                 {
    1313                 :          7 :                                 i++;
    1314   [ -  +  #  # ]:          7 :                                 if ((attr_sk == NULL) ||
    1315                 :          0 :                                             (sk_CONF_VALUE_num(attr_sk) <= i))
    1316                 :            :                                         break;
    1317                 :            : 
    1318                 :          0 :                                 v=sk_CONF_VALUE_value(attr_sk,i);
    1319                 :          0 :                                 type=v->name;
    1320         [ #  # ]:          0 :                                 if ((nid=OBJ_txt2nid(type)) == NID_undef)
    1321                 :            :                                         goto start2;
    1322                 :            : 
    1323         [ #  # ]:          0 :                                 if (BIO_snprintf(buf,sizeof buf,"%s_default",type)
    1324                 :            :                                         >= (int)sizeof(buf))
    1325                 :            :                                    {
    1326                 :          0 :                                    BIO_printf(bio_err,"Name '%s' too long\n",v->name);
    1327                 :          0 :                                    return 0;
    1328                 :            :                                    }
    1329                 :            : 
    1330         [ #  # ]:          0 :                                 if ((def=NCONF_get_string(req_conf,attr_sect,buf))
    1331                 :            :                                         == NULL)
    1332                 :            :                                         {
    1333                 :          0 :                                         ERR_clear_error();
    1334                 :          0 :                                         def="";
    1335                 :            :                                         }
    1336                 :            :                                 
    1337                 :            :                                 
    1338                 :          0 :                                 BIO_snprintf(buf,sizeof buf,"%s_value",type);
    1339         [ #  # ]:          0 :                                 if ((value=NCONF_get_string(req_conf,attr_sect,buf))
    1340                 :            :                                         == NULL)
    1341                 :            :                                         {
    1342                 :          0 :                                         ERR_clear_error();
    1343                 :          0 :                                         value=NULL;
    1344                 :            :                                         }
    1345                 :            : 
    1346                 :          0 :                                 BIO_snprintf(buf,sizeof buf,"%s_min",type);
    1347         [ #  # ]:          0 :                                 if (!NCONF_get_number(req_conf,attr_sect,buf, &n_min))
    1348                 :            :                                         {
    1349                 :          0 :                                         ERR_clear_error();
    1350                 :          0 :                                         n_min = -1;
    1351                 :            :                                         }
    1352                 :            : 
    1353                 :          0 :                                 BIO_snprintf(buf,sizeof buf,"%s_max",type);
    1354         [ #  # ]:          0 :                                 if (!NCONF_get_number(req_conf,attr_sect,buf, &n_max))
    1355                 :            :                                         {
    1356                 :          0 :                                         ERR_clear_error();
    1357                 :          0 :                                         n_max = -1;
    1358                 :            :                                         }
    1359                 :            : 
    1360         [ #  # ]:          0 :                                 if (!add_attribute_object(req,
    1361                 :            :                                         v->value,def,value,nid,n_min,n_max, chtype))
    1362                 :            :                                         return 0;
    1363                 :            :                                 }
    1364                 :            :                         }
    1365                 :            :                 }
    1366                 :            :         else
    1367                 :            :                 {
    1368                 :          0 :                 BIO_printf(bio_err,"No template, please set one up.\n");
    1369                 :          0 :                 return 0;
    1370                 :            :                 }
    1371                 :            : 
    1372                 :            :         return 1;
    1373                 :            : 
    1374                 :            :         }
    1375                 :            : 
    1376                 :          3 : static int auto_info(X509_REQ *req, STACK_OF(CONF_VALUE) *dn_sk,
    1377                 :            :                         STACK_OF(CONF_VALUE) *attr_sk, int attribs, unsigned long chtype)
    1378                 :            :         {
    1379                 :            :         int i;
    1380                 :            :         char *p,*q;
    1381                 :            :         char *type;
    1382                 :            :         CONF_VALUE *v;
    1383                 :            :         X509_NAME *subj;
    1384                 :            : 
    1385                 :          3 :         subj = X509_REQ_get_subject_name(req);
    1386                 :            : 
    1387         [ +  + ]:         18 :         for (i = 0; i < sk_CONF_VALUE_num(dn_sk); i++)
    1388                 :            :                 {
    1389                 :            :                 int mval;
    1390                 :         15 :                 v=sk_CONF_VALUE_value(dn_sk,i);
    1391                 :         15 :                 p=q=NULL;
    1392                 :         15 :                 type=v->name;
    1393                 :            :                 /* Skip past any leading X. X: X, etc to allow for
    1394                 :            :                  * multiple instances 
    1395                 :            :                  */
    1396         [ +  + ]:        219 :                 for(p = v->name; *p ; p++) 
    1397                 :            : #ifndef CHARSET_EBCDIC
    1398 [ +  - ][ -  + ]:        204 :                         if ((*p == ':') || (*p == ',') || (*p == '.')) {
    1399                 :            : #else
    1400                 :            :                         if ((*p == os_toascii[':']) || (*p == os_toascii[',']) || (*p == os_toascii['.'])) {
    1401                 :            : #endif
    1402                 :          0 :                                 p++;
    1403         [ #  # ]:          0 :                                 if(*p) type = p;
    1404                 :            :                                 break;
    1405                 :            :                         }
    1406                 :            : #ifndef CHARSET_EBCDIC
    1407         [ +  - ]:         15 :                 if (*p == '+')
    1408                 :            : #else
    1409                 :            :                 if (*p == os_toascii['+'])
    1410                 :            : #endif
    1411                 :            :                         {
    1412                 :            :                         p++;
    1413                 :            :                         mval = -1;
    1414                 :            :                         }
    1415                 :            :                 else
    1416                 :         15 :                         mval = 0;
    1417         [ +  - ]:         15 :                 if (!X509_NAME_add_entry_by_txt(subj,type, chtype,
    1418                 :         15 :                                 (unsigned char *) v->value,-1,-1,mval)) return 0;
    1419                 :            : 
    1420                 :            :                 }
    1421                 :            : 
    1422         [ -  + ]:          3 :                 if (!X509_NAME_entry_count(subj))
    1423                 :            :                         {
    1424                 :          0 :                         BIO_printf(bio_err,"error, no objects specified in config file\n");
    1425                 :          0 :                         return 0;
    1426                 :            :                         }
    1427         [ +  + ]:          3 :                 if (attribs)
    1428                 :            :                         {
    1429         [ -  + ]:          2 :                         for (i = 0; i < sk_CONF_VALUE_num(attr_sk); i++)
    1430                 :            :                                 {
    1431                 :          0 :                                 v=sk_CONF_VALUE_value(attr_sk,i);
    1432         [ #  # ]:          0 :                                 if(!X509_REQ_add1_attr_by_txt(req, v->name, chtype,
    1433                 :          0 :                                         (unsigned char *)v->value, -1)) return 0;
    1434                 :            :                                 }
    1435                 :            :                         }
    1436                 :            :         return 1;
    1437                 :            :         }
    1438                 :            : 
    1439                 :            : 
    1440                 :         32 : static int add_DN_object(X509_NAME *n, char *text, const char *def, char *value,
    1441                 :            :              int nid, int n_min, int n_max, unsigned long chtype, int mval)
    1442                 :            :         {
    1443                 :         32 :         int i,ret=0;
    1444                 :            :         MS_STATIC char buf[1024];
    1445                 :            : start:
    1446         [ +  - ]:         32 :         if (!batch) BIO_printf(bio_err,"%s [%s]:",text,def);
    1447                 :         32 :         (void)BIO_flush(bio_err);
    1448         [ +  - ]:         32 :         if(value != NULL)
    1449                 :            :                 {
    1450                 :         32 :                 BUF_strlcpy(buf,value,sizeof buf);
    1451                 :         32 :                 BUF_strlcat(buf,"\n",sizeof buf);
    1452                 :         32 :                 BIO_printf(bio_err,"%s\n",value);
    1453                 :            :                 }
    1454                 :            :         else
    1455                 :            :                 {
    1456                 :          0 :                 buf[0]='\0';
    1457         [ #  # ]:          0 :                 if (!batch)
    1458                 :            :                         {
    1459         [ #  # ]:          0 :                         if (!fgets(buf,sizeof buf,stdin))
    1460                 :            :                                 return 0;
    1461                 :            :                         }
    1462                 :            :                 else
    1463                 :            :                         {
    1464                 :          0 :                         buf[0] = '\n';
    1465                 :          0 :                         buf[1] = '\0';
    1466                 :            :                         }
    1467                 :            :                 }
    1468                 :            : 
    1469         [ +  - ]:         32 :         if (buf[0] == '\0') return(0);
    1470         [ +  + ]:         32 :         else if (buf[0] == '\n')
    1471                 :            :                 {
    1472 [ +  - ][ +  - ]:          1 :                 if ((def == NULL) || (def[0] == '\0'))
    1473                 :            :                         return(1);
    1474                 :          1 :                 BUF_strlcpy(buf,def,sizeof buf);
    1475                 :          1 :                 BUF_strlcat(buf,"\n",sizeof buf);
    1476                 :            :                 }
    1477 [ +  + ][ -  + ]:         31 :         else if ((buf[0] == '.') && (buf[1] == '\n')) return(1);
    1478                 :            : 
    1479                 :         31 :         i=strlen(buf);
    1480         [ -  + ]:         31 :         if (buf[i-1] != '\n')
    1481                 :            :                 {
    1482                 :          0 :                 BIO_printf(bio_err,"weird input :-(\n");
    1483                 :          0 :                 return(0);
    1484                 :            :                 }
    1485                 :         31 :         buf[--i]='\0';
    1486                 :            : #ifdef CHARSET_EBCDIC
    1487                 :            :         ebcdic2ascii(buf, buf, i);
    1488                 :            : #endif
    1489         [ -  + ]:         31 :         if(!req_check_len(i, n_min, n_max))
    1490                 :            :                 {
    1491 [ #  # ][ #  # ]:          0 :                 if (batch || value)
    1492                 :            :                         return 0;
    1493                 :            :                 goto start;
    1494                 :            :                 }
    1495                 :            : 
    1496         [ +  - ]:         31 :         if (!X509_NAME_add_entry_by_NID(n,nid, chtype,
    1497                 :            :                                 (unsigned char *) buf, -1,-1,mval)) goto err;
    1498                 :         31 :         ret=1;
    1499                 :            : err:
    1500                 :         31 :         return(ret);
    1501                 :            :         }
    1502                 :            : 
    1503                 :          0 : static int add_attribute_object(X509_REQ *req, char *text, const char *def,
    1504                 :            :                                 char *value, int nid, int n_min,
    1505                 :            :                                 int n_max, unsigned long chtype)
    1506                 :            :         {
    1507                 :            :         int i;
    1508                 :            :         static char buf[1024];
    1509                 :            : 
    1510                 :            : start:
    1511         [ #  # ]:          0 :         if (!batch) BIO_printf(bio_err,"%s [%s]:",text,def);
    1512                 :          0 :         (void)BIO_flush(bio_err);
    1513         [ #  # ]:          0 :         if (value != NULL)
    1514                 :            :                 {
    1515                 :          0 :                 BUF_strlcpy(buf,value,sizeof buf);
    1516                 :          0 :                 BUF_strlcat(buf,"\n",sizeof buf);
    1517                 :          0 :                 BIO_printf(bio_err,"%s\n",value);
    1518                 :            :                 }
    1519                 :            :         else
    1520                 :            :                 {
    1521                 :          0 :                 buf[0]='\0';
    1522         [ #  # ]:          0 :                 if (!batch)
    1523                 :            :                         {
    1524         [ #  # ]:          0 :                         if (!fgets(buf,sizeof buf,stdin))
    1525                 :            :                                 return 0;
    1526                 :            :                         }
    1527                 :            :                 else
    1528                 :            :                         {
    1529                 :          0 :                         buf[0] = '\n';
    1530                 :          0 :                         buf[1] = '\0';
    1531                 :            :                         }
    1532                 :            :                 }
    1533                 :            : 
    1534         [ #  # ]:          0 :         if (buf[0] == '\0') return(0);
    1535         [ #  # ]:          0 :         else if (buf[0] == '\n')
    1536                 :            :                 {
    1537 [ #  # ][ #  # ]:          0 :                 if ((def == NULL) || (def[0] == '\0'))
    1538                 :            :                         return(1);
    1539                 :          0 :                 BUF_strlcpy(buf,def,sizeof buf);
    1540                 :          0 :                 BUF_strlcat(buf,"\n",sizeof buf);
    1541                 :            :                 }
    1542 [ #  # ][ #  # ]:          0 :         else if ((buf[0] == '.') && (buf[1] == '\n')) return(1);
    1543                 :            : 
    1544                 :          0 :         i=strlen(buf);
    1545         [ #  # ]:          0 :         if (buf[i-1] != '\n')
    1546                 :            :                 {
    1547                 :          0 :                 BIO_printf(bio_err,"weird input :-(\n");
    1548                 :          0 :                 return(0);
    1549                 :            :                 }
    1550                 :          0 :         buf[--i]='\0';
    1551                 :            : #ifdef CHARSET_EBCDIC
    1552                 :            :         ebcdic2ascii(buf, buf, i);
    1553                 :            : #endif
    1554         [ #  # ]:          0 :         if(!req_check_len(i, n_min, n_max))
    1555                 :            :                 {
    1556 [ #  # ][ #  # ]:          0 :                 if (batch || value)
    1557                 :            :                         return 0;
    1558                 :            :                 goto start;
    1559                 :            :                 }
    1560                 :            : 
    1561         [ #  # ]:          0 :         if(!X509_REQ_add1_attr_by_NID(req, nid, chtype,
    1562                 :            :                                         (unsigned char *)buf, -1)) {
    1563                 :          0 :                 BIO_printf(bio_err, "Error adding attribute\n");
    1564                 :          0 :                 ERR_print_errors(bio_err);
    1565                 :            :                 goto err;
    1566                 :            :         }
    1567                 :            : 
    1568                 :            :         return(1);
    1569                 :            : err:
    1570                 :          0 :         return(0);
    1571                 :            :         }
    1572                 :            : 
    1573                 :         31 : static int req_check_len(int len, int n_min, int n_max)
    1574                 :            :         {
    1575         [ -  + ]:         31 :         if ((n_min > 0) && (len < n_min))
    1576                 :            :                 {
    1577                 :          0 :                 BIO_printf(bio_err,"string is too short, it needs to be at least %d bytes long\n",n_min);
    1578                 :          0 :                 return(0);
    1579                 :            :                 }
    1580         [ -  + ]:         31 :         if ((n_max >= 0) && (len > n_max))
    1581                 :            :                 {
    1582                 :          0 :                 BIO_printf(bio_err,"string is too long, it needs to be less than  %d bytes long\n",n_max);
    1583                 :          0 :                 return(0);
    1584                 :            :                 }
    1585                 :            :         return(1);
    1586                 :            :         }
    1587                 :            : 
    1588                 :            : /* Check if the end of a string matches 'end' */
    1589                 :        286 : static int check_end(const char *str, const char *end)
    1590                 :            : {
    1591                 :            :         int elen, slen; 
    1592                 :            :         const char *tmp;
    1593                 :        286 :         elen = strlen(end);
    1594                 :        286 :         slen = strlen(str);
    1595         [ +  - ]:        286 :         if(elen > slen) return 1;
    1596                 :        286 :         tmp = str + slen - elen;
    1597                 :        286 :         return strcmp(tmp, end);
    1598                 :            : }
    1599                 :            : 
    1600                 :         10 : static EVP_PKEY_CTX *set_keygen_ctx(BIO *err, const char *gstr, int *pkey_type,
    1601                 :            :                                         long *pkeylen, char **palgnam,
    1602                 :            :                                         ENGINE *keygen_engine)
    1603                 :            :         {
    1604                 :         10 :         EVP_PKEY_CTX *gctx = NULL;
    1605                 :         10 :         EVP_PKEY *param = NULL;
    1606                 :         10 :         long keylen = -1;
    1607                 :         10 :         BIO *pbio = NULL;
    1608                 :         10 :         const char *paramfile = NULL;
    1609                 :            : 
    1610         [ +  - ]:         10 :         if (gstr == NULL)
    1611                 :            :                 {
    1612                 :         10 :                 *pkey_type = EVP_PKEY_RSA;
    1613                 :         10 :                 keylen = *pkeylen;
    1614                 :            :                 }
    1615         [ #  # ]:          0 :         else if (gstr[0] >= '0' && gstr[0] <= '9')
    1616                 :            :                 {
    1617                 :          0 :                 *pkey_type = EVP_PKEY_RSA;
    1618                 :          0 :                 keylen = atol(gstr);
    1619                 :          0 :                 *pkeylen = keylen;
    1620                 :            :                 }
    1621         [ #  # ]:          0 :         else if (!strncmp(gstr, "param:", 6))
    1622                 :          0 :                 paramfile = gstr + 6;
    1623                 :            :         else
    1624                 :            :                 {
    1625                 :          0 :                 const char *p = strchr(gstr, ':');
    1626                 :            :                 int len;
    1627                 :            :                 ENGINE *tmpeng;
    1628                 :            :                 const EVP_PKEY_ASN1_METHOD *ameth;
    1629                 :            : 
    1630         [ #  # ]:          0 :                 if (p)
    1631                 :          0 :                         len = p - gstr;
    1632                 :            :                 else
    1633                 :          0 :                         len = strlen(gstr);
    1634                 :            :                 /* The lookup of a the string will cover all engines so
    1635                 :            :                  * keep a note of the implementation.
    1636                 :            :                  */
    1637                 :            : 
    1638                 :          0 :                 ameth = EVP_PKEY_asn1_find_str(&tmpeng, gstr, len);
    1639                 :            : 
    1640         [ #  # ]:          0 :                 if (!ameth)
    1641                 :            :                         {
    1642                 :          0 :                         BIO_printf(err, "Unknown algorithm %.*s\n", len, gstr);
    1643                 :          0 :                         return NULL;
    1644                 :            :                         }
    1645                 :            : 
    1646                 :          0 :                 EVP_PKEY_asn1_get0_info(NULL, pkey_type, NULL, NULL, NULL,
    1647                 :            :                                                                         ameth);
    1648                 :            : #ifndef OPENSSL_NO_ENGINE
    1649         [ #  # ]:          0 :                 if (tmpeng)
    1650                 :          0 :                         ENGINE_finish(tmpeng);
    1651                 :            : #endif
    1652         [ #  # ]:          0 :                 if (*pkey_type == EVP_PKEY_RSA)
    1653                 :            :                         {
    1654         [ #  # ]:          0 :                         if (p)
    1655                 :            :                                 {
    1656                 :          0 :                                 keylen = atol(p + 1);
    1657                 :          0 :                                 *pkeylen = keylen;
    1658                 :            :                                 }
    1659                 :            :                         else
    1660                 :          0 :                                 keylen = *pkeylen;
    1661                 :            :                         }
    1662         [ #  # ]:          0 :                 else if (p)
    1663                 :          0 :                         paramfile = p + 1;
    1664                 :            :                 }
    1665                 :            : 
    1666         [ -  + ]:         10 :         if (paramfile)
    1667                 :            :                 {
    1668                 :          0 :                 pbio = BIO_new_file(paramfile, "r");
    1669         [ #  # ]:          0 :                 if (!pbio)
    1670                 :            :                         {
    1671                 :          0 :                         BIO_printf(err, "Can't open parameter file %s\n",
    1672                 :            :                                         paramfile);
    1673                 :          0 :                         return NULL;
    1674                 :            :                         }
    1675                 :          0 :                 param = PEM_read_bio_Parameters(pbio, NULL);
    1676                 :            : 
    1677         [ #  # ]:          0 :                 if (!param)
    1678                 :            :                         {
    1679                 :            :                         X509 *x;
    1680                 :          0 :                         (void)BIO_reset(pbio);
    1681                 :          0 :                         x = PEM_read_bio_X509(pbio, NULL, NULL, NULL);
    1682         [ #  # ]:          0 :                         if (x)
    1683                 :            :                                 {
    1684                 :          0 :                                 param = X509_get_pubkey(x);
    1685                 :          0 :                                 X509_free(x);
    1686                 :            :                                 }
    1687                 :            :                         }
    1688                 :            : 
    1689                 :          0 :                 BIO_free(pbio);
    1690                 :            : 
    1691         [ #  # ]:          0 :                 if (!param)
    1692                 :            :                         {
    1693                 :          0 :                         BIO_printf(err, "Error reading parameter file %s\n",
    1694                 :            :                                         paramfile);
    1695                 :          0 :                         return NULL;
    1696                 :            :                         }
    1697         [ #  # ]:          0 :                 if (*pkey_type == -1)
    1698                 :          0 :                         *pkey_type = EVP_PKEY_id(param);
    1699         [ #  # ]:          0 :                 else if (*pkey_type != EVP_PKEY_base_id(param))
    1700                 :            :                         {
    1701                 :          0 :                         BIO_printf(err, "Key Type does not match parameters\n");
    1702                 :          0 :                         EVP_PKEY_free(param);
    1703                 :          0 :                         return NULL;
    1704                 :            :                         }
    1705                 :            :                 }
    1706                 :            : 
    1707         [ +  - ]:         10 :         if (palgnam)
    1708                 :            :                 {
    1709                 :            :                 const EVP_PKEY_ASN1_METHOD *ameth;
    1710                 :            :                 ENGINE *tmpeng;
    1711                 :            :                 const char *anam;
    1712                 :         10 :                 ameth = EVP_PKEY_asn1_find(&tmpeng, *pkey_type);
    1713         [ -  + ]:         10 :                 if (!ameth)
    1714                 :            :                         {
    1715                 :          0 :                         BIO_puts(err, "Internal error: can't find key algorithm\n");
    1716                 :          0 :                         return NULL;
    1717                 :            :                         }
    1718                 :         10 :                 EVP_PKEY_asn1_get0_info(NULL, NULL, NULL, NULL, &anam, ameth);
    1719                 :         10 :                 *palgnam = BUF_strdup(anam);
    1720                 :            : #ifndef OPENSSL_NO_ENGINE
    1721         [ -  + ]:         10 :                 if (tmpeng)
    1722                 :         10 :                         ENGINE_finish(tmpeng);
    1723                 :            : #endif
    1724                 :            :                 }
    1725                 :            : 
    1726         [ -  + ]:         10 :         if (param)
    1727                 :            :                 {
    1728                 :          0 :                 gctx = EVP_PKEY_CTX_new(param, keygen_engine);
    1729                 :          0 :                 *pkeylen = EVP_PKEY_bits(param);
    1730                 :          0 :                 EVP_PKEY_free(param);
    1731                 :            :                 }
    1732                 :            :         else
    1733                 :         10 :                 gctx = EVP_PKEY_CTX_new_id(*pkey_type, keygen_engine);
    1734                 :            : 
    1735         [ -  + ]:         10 :         if (!gctx)
    1736                 :            :                 {
    1737                 :          0 :                 BIO_puts(err, "Error allocating keygen context\n");
    1738                 :          0 :                 ERR_print_errors(err);
    1739                 :          0 :                 return NULL;
    1740                 :            :                 }
    1741                 :            : 
    1742         [ -  + ]:         10 :         if (EVP_PKEY_keygen_init(gctx) <= 0)
    1743                 :            :                 {
    1744                 :          0 :                 BIO_puts(err, "Error initializing keygen context\n");
    1745                 :          0 :                 ERR_print_errors(err);
    1746                 :          0 :                 return NULL;
    1747                 :            :                 }
    1748                 :            : #ifndef OPENSSL_NO_RSA
    1749 [ +  - ][ +  - ]:         10 :         if ((*pkey_type == EVP_PKEY_RSA) && (keylen != -1))
    1750                 :            :                 {
    1751         [ -  + ]:         10 :                 if (EVP_PKEY_CTX_set_rsa_keygen_bits(gctx, keylen) <= 0)
    1752                 :            :                         {
    1753                 :          0 :                         BIO_puts(err, "Error setting RSA keysize\n");
    1754                 :          0 :                         ERR_print_errors(err);
    1755                 :          0 :                         EVP_PKEY_CTX_free(gctx);
    1756                 :          0 :                         return NULL;
    1757                 :            :                         }
    1758                 :            :                 }
    1759                 :            : #endif
    1760                 :            : 
    1761                 :         10 :         return gctx;
    1762                 :            :         }
    1763                 :            : 
    1764                 :        560 : static int genpkey_cb(EVP_PKEY_CTX *ctx)
    1765                 :            :         {
    1766                 :        560 :         char c='*';
    1767                 :        560 :         BIO *b = EVP_PKEY_CTX_get_app_data(ctx);
    1768                 :            :         int p;
    1769                 :        560 :         p = EVP_PKEY_CTX_get_keygen_info(ctx, 0);
    1770         [ +  + ]:        560 :         if (p == 0) c='.';
    1771         [ +  + ]:        560 :         if (p == 1) c='+';
    1772         [ -  + ]:        560 :         if (p == 2) c='*';
    1773         [ +  + ]:        560 :         if (p == 3) c='\n';
    1774                 :        560 :         BIO_write(b,&c,1);
    1775                 :        560 :         (void)BIO_flush(b);
    1776                 :            : #ifdef LINT
    1777                 :            :         p=n;
    1778                 :            : #endif
    1779                 :        560 :         return 1;
    1780                 :            :         }
    1781                 :            : 
    1782                 :         17 : static int do_sign_init(BIO *err, EVP_MD_CTX *ctx, EVP_PKEY *pkey,
    1783                 :            :                         const EVP_MD *md, STACK_OF(OPENSSL_STRING) *sigopts)
    1784                 :            :         {
    1785                 :         17 :         EVP_PKEY_CTX *pkctx = NULL;
    1786                 :            :         int i;
    1787                 :         17 :         EVP_MD_CTX_init(ctx);
    1788         [ +  - ]:         17 :         if (!EVP_DigestSignInit(ctx, &pkctx, md, NULL, pkey))
    1789                 :            :                 return 0;
    1790         [ -  + ]:         17 :         for (i = 0; i < sk_OPENSSL_STRING_num(sigopts); i++)
    1791                 :            :                 {
    1792                 :          0 :                 char *sigopt = sk_OPENSSL_STRING_value(sigopts, i);
    1793         [ #  # ]:          0 :                 if (pkey_ctrl_string(pkctx, sigopt) <= 0)
    1794                 :            :                         {
    1795                 :          0 :                         BIO_printf(err, "parameter error \"%s\"\n", sigopt);
    1796                 :          0 :                         ERR_print_errors(bio_err);
    1797                 :          0 :                         return 0;
    1798                 :            :                         }
    1799                 :            :                 }
    1800                 :            :         return 1;
    1801                 :            :         }
    1802                 :            : 
    1803                 :          8 : int do_X509_sign(BIO *err, X509 *x, EVP_PKEY *pkey, const EVP_MD *md,
    1804                 :            :                         STACK_OF(OPENSSL_STRING) *sigopts)
    1805                 :            :         {
    1806                 :            :         int rv;
    1807                 :            :         EVP_MD_CTX mctx;
    1808                 :          8 :         EVP_MD_CTX_init(&mctx);
    1809                 :          8 :         rv = do_sign_init(err, &mctx, pkey, md, sigopts);
    1810         [ +  - ]:          8 :         if (rv > 0)
    1811                 :          8 :                 rv = X509_sign_ctx(x, &mctx);
    1812                 :          8 :         EVP_MD_CTX_cleanup(&mctx);
    1813                 :          8 :         return rv > 0 ? 1 : 0;
    1814                 :            :         }
    1815                 :            : 
    1816                 :            : 
    1817                 :          9 : int do_X509_REQ_sign(BIO *err, X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md,
    1818                 :            :                         STACK_OF(OPENSSL_STRING) *sigopts)
    1819                 :            :         {
    1820                 :            :         int rv;
    1821                 :            :         EVP_MD_CTX mctx;
    1822                 :          9 :         EVP_MD_CTX_init(&mctx);
    1823                 :          9 :         rv = do_sign_init(err, &mctx, pkey, md, sigopts);
    1824         [ +  - ]:          9 :         if (rv > 0)
    1825                 :          9 :                 rv = X509_REQ_sign_ctx(x, &mctx);
    1826                 :          9 :         EVP_MD_CTX_cleanup(&mctx);
    1827                 :          9 :         return rv > 0 ? 1 : 0;
    1828                 :            :         }
    1829                 :            :                 
    1830                 :            :         
    1831                 :            : 
    1832                 :          0 : int do_X509_CRL_sign(BIO *err, X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md,
    1833                 :            :                         STACK_OF(OPENSSL_STRING) *sigopts)
    1834                 :            :         {
    1835                 :            :         int rv;
    1836                 :            :         EVP_MD_CTX mctx;
    1837                 :          0 :         EVP_MD_CTX_init(&mctx);
    1838                 :          0 :         rv = do_sign_init(err, &mctx, pkey, md, sigopts);
    1839         [ #  # ]:          0 :         if (rv > 0)
    1840                 :          0 :                 rv = X509_CRL_sign_ctx(x, &mctx);
    1841                 :          0 :         EVP_MD_CTX_cleanup(&mctx);
    1842                 :          0 :         return rv > 0 ? 1 : 0;
    1843                 :            :         }
    1844                 :            :                 
    1845                 :            :         

Generated by: LCOV version 1.9