new option "openssl ciphers -V"
[openssl.git] / apps / req.c
index 5df8f89fcd03f7223e56f2b4b9184400eece5991..f58e65ec852f9d87177d48685be32fa8b3146c0f 100644 (file)
 #include <openssl/x509v3.h>
 #include <openssl/objects.h>
 #include <openssl/pem.h>
-#include "../crypto/cryptlib.h"
+#include <openssl/bn.h>
+#ifndef OPENSSL_NO_RSA
+#include <openssl/rsa.h>
+#endif
+#ifndef OPENSSL_NO_DSA
+#include <openssl/dsa.h>
+#endif
 
 #define SECTION                "req"
 
@@ -130,16 +136,16 @@ static int prompt_info(X509_REQ *req,
 static int auto_info(X509_REQ *req, STACK_OF(CONF_VALUE) *sk,
                                STACK_OF(CONF_VALUE) *attr, int attribs,
                                unsigned long chtype);
-static int add_attribute_object(X509_REQ *req, char *text,
-                               char *def, char *value, int nid, int n_min,
+static int add_attribute_object(X509_REQ *req, char *text, const char *def,
+                               char *value, int nid, int n_min,
                                int n_max, unsigned long chtype);
-static int add_DN_object(X509_NAME *n, char *text, char *def, char *value,
+static int add_DN_object(X509_NAME *n, char *text, const char *def, char *value,
        int nid,int n_min,int n_max, unsigned long chtype, int mval);
 #ifndef OPENSSL_NO_RSA
 static int MS_CALLBACK req_cb(int p, int n, BN_GENCB *cb);
 #endif
 static int req_check_len(int len,int n_min,int n_max);
-static int check_end(char *str, char *end);
+static int check_end(const char *str, const char *end);
 #ifndef MONOLITH
 static char *default_config_file=NULL;
 #endif
@@ -187,7 +193,7 @@ int MAIN(int argc, char **argv)
        char *p;
        char *subj = NULL;
        int multirdn = 0;
-       const EVP_MD *md_alg=NULL,*digest=EVP_md5();
+       const EVP_MD *md_alg=NULL,*digest=EVP_sha1();
        unsigned long chtype = MBSTRING_ASC;
 #ifndef MONOLITH
        char *to_free;
@@ -344,6 +350,7 @@ int MAIN(int argc, char **argv)
                                {
                                X509 *xtmp=NULL;
                                EVP_PKEY *dtmp;
+                               EC_GROUP *group;
 
                                pkey_type=TYPE_EC;
                                p+=3;
@@ -354,10 +361,10 @@ int MAIN(int argc, char **argv)
                                        }
                                if ((ec_params = EC_KEY_new()) == NULL)
                                        goto end;
-                               if ((ec_params->group = PEM_read_bio_ECPKParameters(in, NULL, NULL, NULL)) == NULL)
+                               group = PEM_read_bio_ECPKParameters(in, NULL, NULL, NULL);
+                               if (group == NULL)
                                        {
-                                       if (ec_params)
-                                               EC_KEY_free(ec_params);
+                                       EC_KEY_free(ec_params);
                                        ERR_clear_error();
                                        (void)BIO_reset(in);
                                        if ((xtmp=PEM_read_bio_X509(in,NULL,NULL,NULL)) == NULL)
@@ -369,7 +376,7 @@ int MAIN(int argc, char **argv)
                                        if ((dtmp=X509_get_pubkey(xtmp))==NULL)
                                                goto end;
                                        if (dtmp->type == EVP_PKEY_EC)
-                                               ec_params = ECParameters_dup(dtmp->pkey.eckey);
+                                               ec_params = EC_KEY_dup(dtmp->pkey.ec);
                                        EVP_PKEY_free(dtmp);
                                        X509_free(xtmp);
                                        if (ec_params == NULL)
@@ -378,12 +385,16 @@ int MAIN(int argc, char **argv)
                                                goto end;
                                                }
                                        }
+                               else
+                                       {
+                                       if (EC_KEY_set_group(ec_params, group) == 0)
+                                               goto end;
+                                       EC_GROUP_free(group);
+                                       }
 
                                BIO_free(in);
                                in=NULL;
-                               
-                               newkey = EC_GROUP_get_degree(ec_params->group);
-
+                               newkey = EC_GROUP_get_degree(EC_KEY_get0_group(ec_params));
                                }
                        else
 #endif
@@ -567,13 +578,16 @@ bad:
        else
                {
                req_conf=config;
-               if( verbose )
-                       BIO_printf(bio_err,"Using configuration from %s\n",
-                       default_config_file);
+
                if (req_conf == NULL)
                        {
-                       BIO_printf(bio_err,"Unable to load config info\n");
+                       BIO_printf(bio_err,"Unable to load config info from %s\n", default_config_file);
+                       if (newreq)
+                               goto end;
                        }
+               else if( verbose )
+                       BIO_printf(bio_err,"Using configuration from %s\n",
+                       default_config_file);
                }
 
        if (req_conf != NULL)
@@ -717,7 +731,9 @@ bad:
 
        if (newreq && (pkey == NULL))
                {
+#ifndef OPENSSL_NO_RSA
                BN_GENCB cb;
+#endif
                char *randfile = NCONF_get_string(req_conf,SECTION,"RANDFILE");
                if (randfile == NULL)
                        ERR_clear_error();
@@ -748,12 +764,16 @@ bad:
                if (pkey_type == TYPE_RSA)
                        {
                        RSA *rsa = RSA_new();
-                       if(!rsa || !RSA_generate_key_ex(rsa, newkey, 0x10001, &cb) ||
+                       BIGNUM *bn = BN_new();
+                       if(!bn || !rsa || !BN_set_word(bn, 0x10001) ||
+                                       !RSA_generate_key_ex(rsa, newkey, bn, &cb) ||
                                        !EVP_PKEY_assign_RSA(pkey, rsa))
                                {
+                               if(bn) BN_free(bn);
                                if(rsa) RSA_free(rsa);
                                goto end;
                                }
+                       BN_free(bn);
                        }
                else
 #endif
@@ -919,7 +939,9 @@ loop:
                                }
                        else
                                {
-                               if (!ASN1_INTEGER_set(X509_get_serialNumber(x509ss),0L)) goto end;
+                               if (!rand_serial(NULL,
+                                       X509_get_serialNumber(x509ss)))
+                                               goto end;
                                }
 
                        if (!X509_set_issuer_name(x509ss, X509_REQ_get_subject_name(req))) goto end;
@@ -1271,7 +1293,8 @@ static int prompt_info(X509_REQ *req,
        char buf[100];
        int nid, mval;
        long n_min,n_max;
-       char *type,*def,*value;
+       char *type, *value;
+       const char *def;
        CONF_VALUE *v;
        X509_NAME *subj;
        subj = X509_REQ_get_subject_name(req);
@@ -1497,7 +1520,7 @@ static int auto_info(X509_REQ *req, STACK_OF(CONF_VALUE) *dn_sk,
        }
 
 
-static int add_DN_object(X509_NAME *n, char *text, char *def, char *value,
+static int add_DN_object(X509_NAME *n, char *text, const char *def, char *value,
             int nid, int n_min, int n_max, unsigned long chtype, int mval)
        {
        int i,ret=0;
@@ -1553,8 +1576,8 @@ err:
        return(ret);
        }
 
-static int add_attribute_object(X509_REQ *req, char *text,
-                               char *def, char *value, int nid, int n_min,
+static int add_attribute_object(X509_REQ *req, char *text, const char *def,
+                               char *value, int nid, int n_min,
                                int n_max, unsigned long chtype)
        {
        int i;
@@ -1651,10 +1674,10 @@ static int req_check_len(int len, int n_min, int n_max)
        }
 
 /* Check if the end of a string matches 'end' */
-static int check_end(char *str, char *end)
+static int check_end(const char *str, const char *end)
 {
        int elen, slen; 
-       char *tmp;
+       const char *tmp;
        elen = strlen(end);
        slen = strlen(str);
        if(elen > slen) return 1;