more mingw related cleanups.
[openssl.git] / apps / apps.c
index 7864e792e313ddd76ea584c0fb878706a1ac3780..007e3e06c3e0858fb61bf8138cc7da5b1e69fb2e 100644 (file)
 #include <string.h>
 #include <sys/types.h>
 #include <sys/stat.h>
-#define NON_MAIN
-#include "apps.h"
-#undef NON_MAIN
+#include <ctype.h>
 #include <openssl/err.h>
 #include <openssl/x509.h>
 #include <openssl/x509v3.h>
 #include <openssl/pkcs12.h>
 #include <openssl/ui.h>
 #include <openssl/safestack.h>
+#ifndef OPENSSL_NO_ENGINE
 #include <openssl/engine.h>
+#endif
 
 #ifdef OPENSSL_SYS_WINDOWS
 #define strcasecmp _stricmp
 #else
-#include <strings.h>
+#  ifdef NO_STRINGS_H
+    int        strcasecmp();
+#  else
+#    include <strings.h>
+#  endif /* NO_STRINGS_H */
 #endif
 
-#ifdef OPENSSL_SYS_WINDOWS
-#  include "bss_file.c"
-#endif
+#define NON_MAIN
+#include "apps.h"
+#undef NON_MAIN
 
 typedef struct {
        char *name;
@@ -147,7 +151,7 @@ static UI_METHOD *ui_method = NULL;
 static int set_table_opts(unsigned long *flags, const char *arg, const NAME_EX_TBL *in_tbl);
 static int set_multi_opts(unsigned long *flags, const char *arg, const NAME_EX_TBL *in_tbl);
 
-#ifndef OPENSSL_NO_RC4
+#if !defined(OPENSSL_NO_RC4) && !defined(OPENSSL_NO_RSA)
 /* Looks like this stuff is worth moving into separate function */
 static EVP_PKEY *
 load_netscape_key(BIO *err, BIO *key, const char *file,
@@ -310,9 +314,16 @@ void program_name(char *in, char *out, int size)
 
        q=strrchr(p,'.');
        if (q == NULL)
-               q = in+size;
-       strncpy(out,p,q-p);
-       out[q-p]='\0';
+               q = p + strlen(p);
+       strncpy(out,p,size-1);
+       if (q-p >= size)
+               {
+               out[size-1]='\0';
+               }
+       else
+               {
+               out[q-p]='\0';
+               }
        }
 #else
 void program_name(char *in, char *out, int size)
@@ -324,8 +335,7 @@ void program_name(char *in, char *out, int size)
                p++;
        else
                p=in;
-       strncpy(out,p,size-1);
-       out[size-1]='\0';
+       BUF_strlcpy(out,p,size);
        }
 #endif
 #endif
@@ -333,19 +343,57 @@ void program_name(char *in, char *out, int size)
 #ifdef OPENSSL_SYS_WIN32
 int WIN32_rename(char *from, char *to)
        {
-#ifdef OPENSSL_SYS_WINNT
-       int ret;
-/* Note: MoveFileEx() doesn't work under Win95, Win98 */
-
-       ret=MoveFileEx(from,to,MOVEFILE_REPLACE_EXISTING|MOVEFILE_COPY_ALLOWED);
-       return(ret?0:-1);
+#ifndef OPENSSL_SYS_WINCE
+       /* Windows rename gives an error if 'to' exists, so delete it
+        * first and ignore file not found errror
+        */
+       if((remove(to) != 0) && (errno != ENOENT))
+               return -1;
+#undef rename
+       return rename(from, to);
 #else
-       unlink(to);
-       return MoveFile(from, to);
+       /* convert strings to UNICODE */
+       {
+       BOOL result = FALSE;
+       WCHAR* wfrom;
+       WCHAR* wto;
+       int i;
+       wfrom = malloc((strlen(from)+1)*2);
+       wto = malloc((strlen(to)+1)*2);
+       if (wfrom != NULL && wto != NULL)
+               {
+               for (i=0; i<(int)strlen(from)+1; i++)
+                       wfrom[i] = (short)from[i];
+               for (i=0; i<(int)strlen(to)+1; i++)
+                       wto[i] = (short)to[i];
+               result = MoveFile(wfrom, wto);
+               }
+       if (wfrom != NULL)
+               free(wfrom);
+       if (wto != NULL)
+               free(wto);
+       return result;
+       }
 #endif
        }
 #endif
 
+#ifdef OPENSSL_SYS_VMS
+int VMS_strcasecmp(const char *str1, const char *str2)
+       {
+       while (*str1 && *str2)
+               {
+               int res = toupper(*str1) - toupper(*str2);
+               if (res) return res < 0 ? -1 : 1;
+               }
+       if (*str1)
+               return 1;
+       if (*str2)
+               return -1;
+       return 0;
+       }
+#endif
+
 int chopup_args(ARGS *arg, char *buf, int *argc, char **argv[])
        {
        int num,len,i;
@@ -421,16 +469,20 @@ int app_init(long mesgwin)
 
 int dump_cert_text (BIO *out, X509 *x)
 {
-       char buf[256];
-       X509_NAME_oneline(X509_get_subject_name(x),buf,256);
+       char *p;
+
+       p=X509_NAME_oneline(X509_get_subject_name(x),NULL,0);
        BIO_puts(out,"subject=");
-       BIO_puts(out,buf);
+       BIO_puts(out,p);
+       OPENSSL_free(p);
 
-       X509_NAME_oneline(X509_get_issuer_name(x),buf,256);
-       BIO_puts(out,"\nissuer= ");
-       BIO_puts(out,buf);
+       p=X509_NAME_oneline(X509_get_issuer_name(x),NULL,0);
+       BIO_puts(out,"\nissuer=");
+       BIO_puts(out,p);
        BIO_puts(out,"\n");
-        return 0;
+       OPENSSL_free(p);
+
+       return 0;
 }
 
 static int ui_open(UI *ui)
@@ -486,7 +538,7 @@ static int ui_close(UI *ui)
        {
        return UI_method_get_closer(UI_OpenSSL())(ui);
        }
-int setup_ui_method()
+int setup_ui_method(void)
        {
        ui_method = UI_create_method("OpenSSL application user interface");
        UI_method_set_opener(ui_method, ui_open);
@@ -495,7 +547,7 @@ int setup_ui_method()
        UI_method_set_closer(ui_method, ui_close);
        return 0;
        }
-void destroy_ui_method()
+void destroy_ui_method(void)
        {
        if(ui_method)
                {
@@ -561,7 +613,7 @@ int password_callback(char *buf, int bufsiz, int verify,
 
                if (buff)
                        {
-                       memset(buff,0,(unsigned int)bufsiz);
+                       OPENSSL_cleanse(buff,(unsigned int)bufsiz);
                        OPENSSL_free(buff);
                        }
 
@@ -571,13 +623,13 @@ int password_callback(char *buf, int bufsiz, int verify,
                        {
                        BIO_printf(bio_err, "User interface error\n");
                        ERR_print_errors(bio_err);
-                       memset(buf,0,(unsigned int)bufsiz);
+                       OPENSSL_cleanse(buf,(unsigned int)bufsiz);
                        res = 0;
                        }
                if (ok == -2)
                        {
                        BIO_printf(bio_err,"aborted!\n");
-                       memset(buf,0,(unsigned int)bufsiz);
+                       OPENSSL_cleanse(buf,(unsigned int)bufsiz);
                        res = 0;
                        }
                UI_free(ui);
@@ -790,7 +842,7 @@ end:
        return(x);
        }
 
-EVP_PKEY *load_key(BIO *err, const char *file, int format,
+EVP_PKEY *load_key(BIO *err, const char *file, int format, int maybe_stdin,
        const char *pass, ENGINE *e, const char *key_descrip)
        {
        BIO *key=NULL;
@@ -800,11 +852,12 @@ EVP_PKEY *load_key(BIO *err, const char *file, int format,
        cb_data.password = pass;
        cb_data.prompt_info = file;
 
-       if (file == NULL)
+       if (file == NULL && (!maybe_stdin || format == FORMAT_ENGINE))
                {
                BIO_printf(err,"no keyfile specified\n");
                goto end;
                }
+#ifndef OPENSSL_NO_ENGINE
        if (format == FORMAT_ENGINE)
                {
                if (!e)
@@ -814,18 +867,26 @@ EVP_PKEY *load_key(BIO *err, const char *file, int format,
                                ui_method, &cb_data);
                goto end;
                }
+#endif
        key=BIO_new(BIO_s_file());
        if (key == NULL)
                {
                ERR_print_errors(err);
                goto end;
                }
-       if (BIO_read_filename(key,file) <= 0)
+       if (file == NULL && maybe_stdin)
                {
-               BIO_printf(err, "Error opening %s %s\n", key_descrip, file);
-               ERR_print_errors(err);
-               goto end;
+               setvbuf(stdin, NULL, _IONBF, 0);
+               BIO_set_fp(key,stdin,BIO_NOCLOSE);
                }
+       else
+               if (BIO_read_filename(key,file) <= 0)
+                       {
+                       BIO_printf(err, "Error opening %s %s\n",
+                               key_descrip, file);
+                       ERR_print_errors(err);
+                       goto end;
+                       }
        if (format == FORMAT_ASN1)
                {
                pkey=d2i_PrivateKey_bio(key, NULL);
@@ -835,7 +896,7 @@ EVP_PKEY *load_key(BIO *err, const char *file, int format,
                pkey=PEM_read_bio_PrivateKey(key,NULL,
                        (pem_password_cb *)password_callback, &cb_data);
                }
-#ifndef OPENSSL_NO_RC4
+#if !defined(OPENSSL_NO_RC4) && !defined(OPENSSL_NO_RSA)
        else if (format == FORMAT_NETSCAPE || format == FORMAT_IISSGC)
                pkey = load_netscape_key(err, key, file, key_descrip, format);
 #endif
@@ -859,7 +920,7 @@ EVP_PKEY *load_key(BIO *err, const char *file, int format,
        return(pkey);
        }
 
-EVP_PKEY *load_pubkey(BIO *err, const char *file, int format,
+EVP_PKEY *load_pubkey(BIO *err, const char *file, int format, int maybe_stdin,
        const char *pass, ENGINE *e, const char *key_descrip)
        {
        BIO *key=NULL;
@@ -869,11 +930,12 @@ EVP_PKEY *load_pubkey(BIO *err, const char *file, int format,
        cb_data.password = pass;
        cb_data.prompt_info = file;
 
-       if (file == NULL)
+       if (file == NULL && (!maybe_stdin || format == FORMAT_ENGINE))
                {
                BIO_printf(err,"no keyfile specified\n");
                goto end;
                }
+#ifndef OPENSSL_NO_ENGINE
        if (format == FORMAT_ENGINE)
                {
                if (!e)
@@ -883,17 +945,25 @@ EVP_PKEY *load_pubkey(BIO *err, const char *file, int format,
                                ui_method, &cb_data);
                goto end;
                }
+#endif
        key=BIO_new(BIO_s_file());
        if (key == NULL)
                {
                ERR_print_errors(err);
                goto end;
                }
-       if (BIO_read_filename(key,file) <= 0)
+       if (file == NULL && maybe_stdin)
                {
-               BIO_printf(err, "Error opening %s %s\n", key_descrip, file);
-               ERR_print_errors(err);
-               goto end;
+               setvbuf(stdin, NULL, _IONBF, 0);
+               BIO_set_fp(key,stdin,BIO_NOCLOSE);
+               }
+       else
+               if (BIO_read_filename(key,file) <= 0)
+                       {
+                       BIO_printf(err, "Error opening %s %s\n",
+                               key_descrip, file);
+                       ERR_print_errors(err);
+                       goto end;
                }
        if (format == FORMAT_ASN1)
                {
@@ -904,7 +974,7 @@ EVP_PKEY *load_pubkey(BIO *err, const char *file, int format,
                pkey=PEM_read_bio_PUBKEY(key,NULL,
                        (pem_password_cb *)password_callback, &cb_data);
                }
-#ifndef OPENSSL_NO_RC4
+#if !defined(OPENSSL_NO_RC4) && !defined(OPENSSL_NO_RSA)
        else if (format == FORMAT_NETSCAPE || format == FORMAT_IISSGC)
                pkey = load_netscape_key(err, key, file, key_descrip, format);
 #endif
@@ -920,8 +990,8 @@ EVP_PKEY *load_pubkey(BIO *err, const char *file, int format,
        return(pkey);
        }
 
-#ifndef OPENSSL_NO_RC4
-EVP_PKEY *
+#if !defined(OPENSSL_NO_RC4) && !defined(OPENSSL_NO_RSA)
+static EVP_PKEY *
 load_netscape_key(BIO *err, BIO *key, const char *file,
                const char *key_descrip, int format)
        {
@@ -938,7 +1008,7 @@ load_netscape_key(BIO *err, BIO *key, const char *file,
                goto error;
        for (;;)
                {
-               if (!BUF_MEM_grow(buf,size+1024*10))
+               if (!BUF_MEM_grow_clean(buf,size+1024*10))
                        goto error;
                i = BIO_read(key, &(buf->data[size]), 1024*10);
                size += i;
@@ -1066,6 +1136,7 @@ int set_cert_ex(unsigned long *flags, const char *arg)
                { "no_extensions", X509_FLAG_NO_EXTENSIONS, 0},
                { "no_sigdump", X509_FLAG_NO_SIGDUMP, 0},
                { "no_aux", X509_FLAG_NO_AUX, 0},
+               { "no_attributes", X509_FLAG_NO_ATTRIBUTES, 0},
                { "ext_default", X509V3_EXT_DEFAULT, X509V3_EXT_UNKNOWN_MASK},
                { "ext_error", X509V3_EXT_ERROR_UNKNOWN, X509V3_EXT_UNKNOWN_MASK},
                { "ext_parse", X509V3_EXT_PARSE_UNKNOWN, X509V3_EXT_UNKNOWN_MASK},
@@ -1209,18 +1280,20 @@ static int set_table_opts(unsigned long *flags, const char *arg, const NAME_EX_T
 
 void print_name(BIO *out, char *title, X509_NAME *nm, unsigned long lflags)
 {
-       char buf[256];
+       char *buf;
        char mline = 0;
        int indent = 0;
+
        if(title) BIO_puts(out, title);
        if((lflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) {
                mline = 1;
                indent = 4;
        }
        if(lflags == XN_FLAG_COMPAT) {
-               X509_NAME_oneline(nm,buf,256);
-               BIO_puts(out,buf);
+               buf = X509_NAME_oneline(nm, 0, 0);
+               BIO_puts(out, buf);
                BIO_puts(out, "\n");
+               OPENSSL_free(buf);
        } else {
                if(mline) BIO_puts(out, "\n");
                X509_NAME_print_ex(out, nm, indent, lflags);
@@ -1258,8 +1331,9 @@ X509_STORE *setup_verify(BIO *bp, char *CAfile, char *CApath)
        return NULL;
 }
 
+#ifndef OPENSSL_NO_ENGINE
 /* Try to load an engine in a shareable library */
-ENGINE *try_load_engine(BIO *err, const char *engine, int debug)
+static ENGINE *try_load_engine(BIO *err, const char *engine, int debug)
        {
        ENGINE *e = ENGINE_by_id("dynamic");
        if (e)
@@ -1314,3 +1388,37 @@ ENGINE *setup_engine(BIO *err, const char *engine, int debug)
                }
         return e;
         }
+#endif
+
+int load_config(BIO *err, CONF *cnf)
+       {
+       if (!cnf)
+               cnf = config;
+       if (!cnf)
+               return 1;
+
+       OPENSSL_load_builtin_modules();
+
+       if (CONF_modules_load(cnf, NULL, 0) <= 0)
+               {
+               BIO_printf(err, "Error configuring OpenSSL\n");
+               ERR_print_errors(err);
+               return 0;
+               }
+       return 1;
+       }
+
+char *make_config_name()
+       {
+       const char *t=X509_get_default_cert_area();
+       char *p;
+
+       p=OPENSSL_malloc(strlen(t)+strlen(OPENSSL_CONF)+2);
+       strcpy(p,t);
+#ifndef OPENSSL_SYS_VMS
+       strcat(p,"/");
+#endif
+       strcat(p,OPENSSL_CONF);
+
+       return p;
+       }