HPUX 9.X on m68k with gcc
[openssl.git] / apps / req.c
index 60f09551e5627aa8f0f5f1986762ad07191bf9d8..c406b6444c0f64e4e64db12f3ca19bc1d5b58b7c 100644 (file)
@@ -73,7 +73,6 @@
 #include <openssl/x509v3.h>
 #include <openssl/objects.h>
 #include <openssl/pem.h>
-#include <openssl/engine.h>
 
 #define SECTION                "req"
 
@@ -85,6 +84,7 @@
 #define V3_EXTENSIONS  "x509_extensions"
 #define REQ_EXTENSIONS "req_extensions"
 #define STRING_MASK    "string_mask"
+#define UTF8_IN                "utf8"
 
 #define DEFAULT_KEY_LENGTH     512
 #define MIN_KEY_LENGTH         384
  * -rand file(s) - load the file(s) into the PRNG.
  * -newkey     - make a key and a request.
  * -modulus    - print RSA modulus.
+ * -pubkey     - output Public Key.
  * -x509       - output a self signed X509 structure instead.
  * -asn1-kludge        - output new certificate request in a format that some CA's
  *               require.  This format is wrong
  */
 
-static int make_REQ(X509_REQ *req,EVP_PKEY *pkey,char *dn,int attribs);
-static int build_subject(X509_REQ *req, char *subj);
+static int make_REQ(X509_REQ *req,EVP_PKEY *pkey,char *dn,int attribs,
+               unsigned long chtype);
+static int build_subject(X509_REQ *req, char *subj, unsigned long chtype);
 static int prompt_info(X509_REQ *req,
                STACK_OF(CONF_VALUE) *dn_sk, char *dn_sect,
-               STACK_OF(CONF_VALUE) *attr_sk, char *attr_sect, int attribs);
+               STACK_OF(CONF_VALUE) *attr_sk, char *attr_sect, int attribs,
+               unsigned long chtype);
 static int auto_info(X509_REQ *req, STACK_OF(CONF_VALUE) *sk,
-                               STACK_OF(CONF_VALUE) *attr, int attribs);
+                               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,
-                               int n_max);
+                               int n_max, unsigned long chtype);
 static int add_DN_object(X509_NAME *n, char *text, char *def, char *value,
-       int nid,int n_min,int n_max);
+       int nid,int n_min,int n_max, unsigned long chtype);
 #ifndef OPENSSL_NO_RSA
 static void MS_CALLBACK req_cb(int p,int n,void *arg);
 #endif
@@ -156,7 +160,7 @@ int MAIN(int argc, char **argv)
        long newkey = -1;
        BIO *in=NULL,*out=NULL;
        int informat,outformat,verify=0,noout=0,text=0,keyform=FORMAT_PEM;
-       int nodes=0,kludge=0,newhdr=0,subject=0;
+       int nodes=0,kludge=0,newhdr=0,subject=0,pubkey=0;
        char *infile,*outfile,*prog,*keyfile=NULL,*template=NULL,*keyout=NULL;
        char *engine=NULL;
        char *extensions = NULL;
@@ -170,6 +174,7 @@ int MAIN(int argc, char **argv)
        char *p;
        char *subj = NULL;
        const EVP_MD *md_alg=NULL,*digest=EVP_md5();
+       unsigned long chtype = MBSTRING_ASC;
 #ifndef MONOLITH
        MS_STATIC char config_name[256];
 #endif
@@ -214,6 +219,10 @@ int MAIN(int argc, char **argv)
                        if (--argc < 1) goto bad;
                        keyfile= *(++argv);
                        }
+               else if (strcmp(*argv,"-pubkey") == 0)
+                       {
+                       pubkey=1;
+                       }
                else if (strcmp(*argv,"-new") == 0)
                        {
                        newreq=1;
@@ -339,6 +348,8 @@ int MAIN(int argc, char **argv)
                        noout=1;
                else if (strcmp(*argv,"-verbose") == 0)
                        verbose=1;
+               else if (strcmp(*argv,"-utf8") == 0)
+                       chtype = MBSTRING_UTF8;
                else if (strcmp(*argv,"-nameopt") == 0)
                        {
                        if (--argc < 1) goto bad;
@@ -406,6 +417,7 @@ bad:
                BIO_printf(bio_err," -in arg        input file\n");
                BIO_printf(bio_err," -out arg       output file\n");
                BIO_printf(bio_err," -text          text form of request\n");
+               BIO_printf(bio_err," -pubkey        output public key\n");
                BIO_printf(bio_err," -noout         do not output REQ\n");
                BIO_printf(bio_err," -verify        verify signature on REQ\n");
                BIO_printf(bio_err," -modulus       RSA modulus\n");
@@ -421,7 +433,7 @@ bad:
                BIO_printf(bio_err,"                the random number generator\n");
                BIO_printf(bio_err," -newkey rsa:bits generate a new RSA key of 'bits' in size\n");
                BIO_printf(bio_err," -newkey dsa:file generate a new DSA key, parameters taken from CA in 'file'\n");
-               BIO_printf(bio_err," -[digest]      Digest to sign with (md5, sha1, md2, mdc2)\n");
+               BIO_printf(bio_err," -[digest]      Digest to sign with (md5, sha1, md2, mdc2, md4)\n");
                BIO_printf(bio_err," -config file   request template file.\n");
                BIO_printf(bio_err," -subj arg      set or modify request subject\n");
                BIO_printf(bio_err," -new           new request.\n");
@@ -434,6 +446,7 @@ bad:
                BIO_printf(bio_err,"                have been reported as requiring\n");
                BIO_printf(bio_err," -extensions .. specify certificate extension section (override value in config file)\n");
                BIO_printf(bio_err," -reqexts ..    specify request extension section (override value in config file)\n");
+               BIO_printf(bio_err," -utf8          input characters are UTF8 (default ASCII)\n");
                goto end;
                }
 
@@ -466,7 +479,8 @@ bad:
                {
                long errline;
 
-               BIO_printf(bio_err,"Using configuration from %s\n",template);
+               if( verbose )
+                       BIO_printf(bio_err,"Using configuration from %s\n",template);
                req_conf=NCONF_new(NULL);
                i=NCONF_load(req_conf,template,&errline);
                if (i == 0)
@@ -478,9 +492,10 @@ bad:
        else
                {
                req_conf=config;
-               BIO_printf(bio_err,"Using configuration from %s\n",
+               if( verbose )
+                       BIO_printf(bio_err,"Using configuration from %s\n",
                        default_config_file);
-               if (i == 0)
+               if (req_conf == NULL)
                        {
                        BIO_printf(bio_err,"Unable to load config info\n");
                        }
@@ -565,6 +580,16 @@ bad:
                goto end;
        }
 
+       if (chtype != MBSTRING_UTF8)
+               {
+               p = NCONF_get_string(req_conf, SECTION, UTF8_IN);
+               if (!p)
+                       ERR_clear_error();
+               else if (!strcmp(p, "yes"))
+                       chtype = MBSTRING_UTF8;
+               }
+
+
        if(!req_exts)
                {
                req_exts = NCONF_get_string(req_conf, SECTION, REQ_EXTENSIONS);
@@ -768,7 +793,7 @@ loop:
                                goto end;
                                }
 
-                       i=make_REQ(req,pkey,subj,!x509);
+                       i=make_REQ(req,pkey,subj,!x509, chtype);
                        subj=NULL; /* done processing '-subj' option */
                        if ((kludge > 0) && !sk_X509_ATTRIBUTE_num(req->req_info->attributes))
                                {
@@ -860,7 +885,7 @@ loop:
                        print_name(bio_err, "old subject=", X509_REQ_get_subject_name(req), nmflag);
                        }
 
-               if (build_subject(req, subj) == 0)
+               if (build_subject(req, subj, chtype) == 0)
                        {
                        BIO_printf(bio_err, "ERROR: cannot modify subject\n");
                        ex=1;
@@ -899,12 +924,13 @@ loop:
                else if (i == 0)
                        {
                        BIO_printf(bio_err,"verify failure\n");
+                       ERR_print_errors(bio_err);
                        }
                else /* if (i > 0) */
                        BIO_printf(bio_err,"verify OK\n");
                }
 
-       if (noout && !text && !modulus && !subject)
+       if (noout && !text && !modulus && !subject && !pubkey)
                {
                ex=0;
                goto end;
@@ -933,6 +959,20 @@ loop:
                        }
                }
 
+       if (pubkey)
+               {
+               EVP_PKEY *tpubkey; 
+               tpubkey=X509_REQ_get_pubkey(req);
+               if (tpubkey == NULL)
+                       {
+                       BIO_printf(bio_err,"Error getting public key\n");
+                       ERR_print_errors(bio_err);
+                       goto end;
+                       }
+               PEM_write_bio_PUBKEY(out, tpubkey);
+               EVP_PKEY_free(tpubkey);
+               }
+
        if (text)
                {
                if (x509)
@@ -951,24 +991,25 @@ loop:
 
        if (modulus)
                {
-               EVP_PKEY *pubkey;
+               EVP_PKEY *tpubkey;
 
                if (x509)
-                       pubkey=X509_get_pubkey(x509ss);
+                       tpubkey=X509_get_pubkey(x509ss);
                else
-                       pubkey=X509_REQ_get_pubkey(req);
-               if (pubkey == NULL)
+                       tpubkey=X509_REQ_get_pubkey(req);
+               if (tpubkey == NULL)
                        {
                        fprintf(stdout,"Modulus=unavailable\n");
                        goto end; 
                        }
                fprintf(stdout,"Modulus=");
 #ifndef OPENSSL_NO_RSA
-               if (pubkey->type == EVP_PKEY_RSA)
-                       BN_print(out,pubkey->pkey.rsa->n);
+               if (tpubkey->type == EVP_PKEY_RSA)
+                       BN_print(out,tpubkey->pkey.rsa->n);
                else
 #endif
                        fprintf(stdout,"Wrong Algorithm type");
+               EVP_PKEY_free(tpubkey);
                fprintf(stdout,"\n");
                }
 
@@ -1028,7 +1069,8 @@ end:
        EXIT(ex);
        }
 
-static int make_REQ(X509_REQ *req, EVP_PKEY *pkey, char *subj, int attribs)
+static int make_REQ(X509_REQ *req, EVP_PKEY *pkey, char *subj, int attribs,
+                       unsigned long chtype)
        {
        int ret=0,i;
        char no_prompt = 0;
@@ -1074,13 +1116,13 @@ static int make_REQ(X509_REQ *req, EVP_PKEY *pkey, char *subj, int attribs)
        if (!X509_REQ_set_version(req,0L)) goto err; /* version 1 */
 
        if (no_prompt) 
-               i = auto_info(req, dn_sk, attr_sk, attribs);
+               i = auto_info(req, dn_sk, attr_sk, attribs, chtype);
        else 
                {
                if (subj)
-                       i = build_subject(req, subj);
+                       i = build_subject(req, subj, chtype);
                else
-                       i = prompt_info(req, dn_sk, dn_sect, attr_sk, attr_sect, attribs);
+                       i = prompt_info(req, dn_sk, dn_sect, attr_sk, attr_sect, attribs, chtype);
                }
        if(!i) goto err;
 
@@ -1091,7 +1133,7 @@ err:
        return(ret);
        }
 
-static int build_subject(X509_REQ *req, char *subject)
+static int build_subject(X509_REQ *req, char *subject, unsigned long chtype)
        {
        X509_NAME *n = NULL;
 
@@ -1140,7 +1182,7 @@ static int build_subject(X509_REQ *req, char *subject)
                        continue;
                        }
 
-               if (!X509_NAME_add_entry_by_NID(n, nid, MBSTRING_ASC, (unsigned char*)ne_value, -1,-1,0))
+               if (!X509_NAME_add_entry_by_NID(n, nid, chtype, (unsigned char*)ne_value, -1,-1,0))
                        {
                        X509_NAME_free(n);
                        return 0;
@@ -1156,7 +1198,8 @@ static int build_subject(X509_REQ *req, char *subject)
 
 static int prompt_info(X509_REQ *req,
                STACK_OF(CONF_VALUE) *dn_sk, char *dn_sect,
-               STACK_OF(CONF_VALUE) *attr_sk, char *attr_sect, int attribs)
+               STACK_OF(CONF_VALUE) *attr_sk, char *attr_sect, int attribs,
+               unsigned long chtype)
        {
        int i;
        char *p,*q;
@@ -1229,7 +1272,7 @@ start:            for (;;)
                                n_max = -1;
 
                        if (!add_DN_object(subj,v->value,def,value,nid,
-                               n_min,n_max))
+                               n_min,n_max, chtype))
                                return 0;
                        }
                if (X509_NAME_entry_count(subj) == 0)
@@ -1285,7 +1328,7 @@ start2:                   for (;;)
                                        n_max = -1;
 
                                if (!add_attribute_object(req,
-                                       v->value,def,value,nid,n_min,n_max))
+                                       v->value,def,value,nid,n_min,n_max, chtype))
                                        return 0;
                                }
                        }
@@ -1301,7 +1344,7 @@ start2:                   for (;;)
        }
 
 static int auto_info(X509_REQ *req, STACK_OF(CONF_VALUE) *dn_sk,
-                       STACK_OF(CONF_VALUE) *attr_sk, int attribs)
+                       STACK_OF(CONF_VALUE) *attr_sk, int attribs, unsigned long chtype)
        {
        int i;
        char *p,*q;
@@ -1329,7 +1372,7 @@ static int auto_info(X509_REQ *req, STACK_OF(CONF_VALUE) *dn_sk,
                                if(*p) type = p;
                                break;
                        }
-               if (!X509_NAME_add_entry_by_txt(subj,type, MBSTRING_ASC,
+               if (!X509_NAME_add_entry_by_txt(subj,type, chtype,
                                (unsigned char *) v->value,-1,-1,0)) return 0;
 
                }
@@ -1344,7 +1387,7 @@ static int auto_info(X509_REQ *req, STACK_OF(CONF_VALUE) *dn_sk,
                        for (i = 0; i < sk_CONF_VALUE_num(attr_sk); i++)
                                {
                                v=sk_CONF_VALUE_value(attr_sk,i);
-                               if(!X509_REQ_add1_attr_by_txt(req, v->name, MBSTRING_ASC,
+                               if(!X509_REQ_add1_attr_by_txt(req, v->name, chtype,
                                        (unsigned char *)v->value, -1)) return 0;
                                }
                        }
@@ -1353,7 +1396,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,
-            int nid, int n_min, int n_max)
+            int nid, int n_min, int n_max, unsigned long chtype)
        {
        int i,ret=0;
        MS_STATIC char buf[1024];
@@ -1401,7 +1444,7 @@ start:
        ebcdic2ascii(buf, buf, i);
 #endif
        if(!req_check_len(i, n_min, n_max)) goto start;
-       if (!X509_NAME_add_entry_by_NID(n,nid, MBSTRING_ASC,
+       if (!X509_NAME_add_entry_by_NID(n,nid, chtype,
                                (unsigned char *) buf, -1,-1,0)) goto err;
        ret=1;
 err:
@@ -1410,7 +1453,7 @@ err:
 
 static int add_attribute_object(X509_REQ *req, char *text,
                                char *def, char *value, int nid, int n_min,
-                               int n_max)
+                               int n_max, unsigned long chtype)
        {
        int i;
        static char buf[1024];
@@ -1460,7 +1503,7 @@ start:
 #endif
        if(!req_check_len(i, n_min, n_max)) goto start;
 
-       if(!X509_REQ_add1_attr_by_NID(req, nid, MBSTRING_ASC,
+       if(!X509_REQ_add1_attr_by_NID(req, nid, chtype,
                                        (unsigned char *)buf, -1)) {
                BIO_printf(bio_err, "Error adding attribute\n");
                ERR_print_errors(bio_err);