Marin Kraemer <Martin.Kraemer@MchP.Siemens.De> sent us patches to make
[openssl.git] / apps / req.c
index dd376949fda39c5e887dbbb4afc7b812944adb63..2c1b9ee8766f47b90d8ebf739fdbea716b8b4643 100644 (file)
  * -config file        - Load configuration file.
  * -key file   - make a request using key in file (or use it for verification).
  * -keyform    - key file format.
+ * -rand file(s) - load the file(s) into the PRNG.
  * -newkey     - make a key and a request.
  * -modulus    - print RSA modulus.
  * -x509       - output a self signed X509 structure instead.
@@ -125,7 +126,6 @@ static void MS_CALLBACK req_cb(int p,int n,void *arg);
 #endif
 static int req_check_len(int len,int min,int max);
 static int check_end(char *str, char *end);
-static int add_oid_section(LHASH *conf);
 #ifndef MONOLITH
 static char *default_config_file=NULL;
 static LHASH *config=NULL;
@@ -156,6 +156,7 @@ int MAIN(int argc, char **argv)
        char *req_exts = NULL;
        EVP_CIPHER *cipher=NULL;
        int modulus=0;
+       char *inrand=NULL;
        char *passargin = NULL, *passargout = NULL;
        char *passin = NULL, *passout = NULL;
        char *p;
@@ -239,6 +240,11 @@ int MAIN(int argc, char **argv)
                        if (--argc < 1) goto bad;
                        passargout= *(++argv);
                        }
+               else if (strcmp(*argv,"-rand") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       inrand= *(++argv);
+                       }
                else if (strcmp(*argv,"-newkey") == 0)
                        {
                        int is_numeric;
@@ -372,6 +378,9 @@ bad:
                BIO_printf(bio_err," -key file  use the private key contained in file\n");
                BIO_printf(bio_err," -keyform arg   key file format\n");
                BIO_printf(bio_err," -keyout arg    file to send the key to\n");
+               BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
+               BIO_printf(bio_err,"                load the file (or the files in the directory) into\n");
+               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");
 
@@ -457,7 +466,7 @@ bad:
                                }
                        }
                }
-               if(!add_oid_section(req_conf)) goto end;
+               if(!add_oid_section(bio_err, req_conf)) goto end;
 
        if ((md_alg == NULL) &&
                ((p=CONF_get_string(req_conf,SECTION,"default_md")) != NULL))
@@ -538,12 +547,19 @@ bad:
                        BIO_printf(bio_err,"unable to load Private key\n");
                        goto end;
                        }
+                if (EVP_PKEY_type(pkey->type) == EVP_PKEY_DSA)
+                       {
+                       char *randfile = CONF_get_string(req_conf,SECTION,"RANDFILE");
+                       app_RAND_load_file(randfile, bio_err, 0);
+                       }
                }
 
        if (newreq && (pkey == NULL))
                {
                char *randfile = CONF_get_string(req_conf,SECTION,"RANDFILE");
                app_RAND_load_file(randfile, bio_err, 0);
+               if (inrand)
+                       app_RAND_load_files(inrand);
        
                if (newkey <= 0)
                        {
@@ -1083,7 +1099,11 @@ static int auto_info(X509_REQ *req, STACK_OF(CONF_VALUE) *dn_sk,
                 * multiple instances 
                 */
                for(p = v->name; *p ; p++) 
+#ifndef CHARSET_EBCDIC
                        if ((*p == ':') || (*p == ',') || (*p == '.')) {
+#else
+                       if ((*p == os_toascii[':']) || (*p == os_toascii[',']) || (*p == os_toascii['.'])) {
+#endif
                                p++;
                                if(*p) type = p;
                                break;
@@ -1199,6 +1219,9 @@ start:
                return(0);
                }
        buf[--i]='\0';
+#ifdef CHARSET_EBCDIC
+       ebcdic2ascii(buf, buf, i);
+#endif
        if(!req_check_len(i, min, max)) goto start;
 
        if(!X509_REQ_add1_attr_by_NID(req, nid, MBSTRING_ASC,
@@ -1256,25 +1279,3 @@ static int check_end(char *str, char *end)
        tmp = str + slen - elen;
        return strcmp(tmp, end);
 }
-
-static int add_oid_section(LHASH *conf)
-{      
-       char *p;
-       STACK_OF(CONF_VALUE) *sktmp;
-       CONF_VALUE *cnf;
-       int i;
-       if(!(p=CONF_get_string(conf,NULL,"oid_section"))) return 1;
-       if(!(sktmp = CONF_get_section(conf, p))) {
-               BIO_printf(bio_err, "problem loading oid section %s\n", p);
-               return 0;
-       }
-       for(i = 0; i < sk_CONF_VALUE_num(sktmp); i++) {
-               cnf = sk_CONF_VALUE_value(sktmp, i);
-               if(OBJ_create(cnf->value, cnf->name, cnf->name) == NID_undef) {
-                       BIO_printf(bio_err, "problem creating object %s=%s\n",
-                                                        cnf->name, cnf->value);
-                       return 0;
-               }
-       }
-       return 1;
-}