Make sure to initialize AES counters to obtain proper results.
[openssl.git] / apps / apps.c
index bdd14dd51bd8967551479a73e3fabf4d314f4e42..62fa21d5d0babc838cbfe2ad918d6db00428b201 100644 (file)
 #include <openssl/engine.h>
 #endif
 
-#ifdef OPENSSL_SYS_WINDOWS
-#define strcasecmp _stricmp
-#else
-#  ifdef NO_STRINGS_H
-    int        strcasecmp();
-#  else
-#    include <strings.h>
-#  endif /* NO_STRINGS_H */
-#endif
-
 #define NON_MAIN
 #include "apps.h"
 #undef NON_MAIN
@@ -378,22 +368,6 @@ int WIN32_rename(char *from, char *to)
        }
 #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;
@@ -501,7 +475,7 @@ static int ui_read(UI *ui, UI_STRING *uis)
                        {
                        const char *password =
                                ((PW_CB_DATA *)UI_get0_user_data(ui))->password;
-                       if (password[0] != '\0')
+                       if (password && password[0] != '\0')
                                {
                                UI_set_result(ui, uis, password);
                                return 1;
@@ -525,7 +499,7 @@ static int ui_write(UI *ui, UI_STRING *uis)
                        {
                        const char *password =
                                ((PW_CB_DATA *)UI_get0_user_data(ui))->password;
-                       if (password[0] != '\0')
+                       if (password && password[0] != '\0')
                                return 1;
                        }
                default:
@@ -1519,19 +1493,44 @@ BIGNUM *load_serial(char *serialfile, int create, ASN1_INTEGER **retai)
        return(ret);
        }
 
-int save_serial(char *serialfile, BIGNUM *serial, ASN1_INTEGER **retai)
+int save_serial(char *serialfile, char *suffix, BIGNUM *serial, ASN1_INTEGER **retai)
        {
-       BIO *out;
+       char buf[1][BSIZE];
+       BIO *out = NULL;
        int ret=0;
        ASN1_INTEGER *ai=NULL;
+       int j;
 
+       if (suffix == NULL)
+               j = strlen(serialfile);
+       else
+               j = strlen(serialfile) + strlen(suffix) + 1;
+       if (j >= BSIZE)
+               {
+               BIO_printf(bio_err,"file name too long\n");
+               goto err;
+               }
+
+       if (suffix == NULL)
+               BUF_strlcpy(buf[0], serialfile, BSIZE);
+       else
+               {
+#ifndef OPENSSL_SYS_VMS
+               j = BIO_snprintf(buf[0], sizeof buf[0], "%s.%s", serialfile, suffix);
+#else
+               j = BIO_snprintf(buf[0], sizeof buf[0], "%s-%s", serialfile, suffix);
+#endif
+               }
+#ifdef RL_DEBUG
+       BIO_printf(bio_err, "DEBUG: writing \"%s\"\n", buf[0]);
+#endif
        out=BIO_new(BIO_s_file());
        if (out == NULL)
                {
                ERR_print_errors(bio_err);
                goto err;
                }
-       if (BIO_write_filename(out,serialfile) <= 0)
+       if (BIO_write_filename(out,buf[0]) <= 0)
                {
                perror(serialfile);
                goto err;
@@ -1556,6 +1555,76 @@ err:
        return(ret);
        }
 
+int rotate_serial(char *serialfile, char *new_suffix, char *old_suffix)
+       {
+       char buf[5][BSIZE];
+       int i,j;
+       struct stat sb;
+
+       i = strlen(serialfile) + strlen(old_suffix);
+       j = strlen(serialfile) + strlen(new_suffix);
+       if (i > j) j = i;
+       if (j + 1 >= BSIZE)
+               {
+               BIO_printf(bio_err,"file name too long\n");
+               goto err;
+               }
+
+#ifndef OPENSSL_SYS_VMS
+       j = BIO_snprintf(buf[0], sizeof buf[0], "%s.%s",
+               serialfile, new_suffix);
+#else
+       j = BIO_snprintf(buf[0], sizeof buf[0], "%s-%s",
+               serialfile, new_suffix);
+#endif
+#ifndef OPENSSL_SYS_VMS
+       j = BIO_snprintf(buf[1], sizeof buf[1], "%s.%s",
+               serialfile, old_suffix);
+#else
+       j = BIO_snprintf(buf[1], sizeof buf[1], "%s-%s",
+               serialfile, old_suffix);
+#endif
+       if (stat(serialfile,&sb) < 0)
+               {
+               if (errno != ENOENT 
+#ifdef ENOTDIR
+                       && errno != ENOTDIR)
+#endif
+                       goto err;
+               }
+       else
+               {
+#ifdef RL_DEBUG
+               BIO_printf(bio_err, "DEBUG: renaming \"%s\" to \"%s\"\n",
+                       serialfile, buf[1]);
+#endif
+               if (rename(serialfile,buf[1]) < 0)
+                       {
+                       BIO_printf(bio_err,
+                               "unable to rename %s to %s\n",
+                               serialfile, buf[1]);
+                       perror("reason");
+                       goto err;
+                       }
+               }
+#ifdef RL_DEBUG
+       BIO_printf(bio_err, "DEBUG: renaming \"%s\" to \"%s\"\n",
+               buf[0],serialfile);
+#endif
+       if (rename(buf[0],serialfile) < 0)
+               {
+               BIO_printf(bio_err,
+                       "unable to rename %s to %s\n",
+                       buf[0],serialfile);
+               perror("reason");
+               rename(buf[1],serialfile);
+               goto err;
+               }
+       return 1;
+ err:
+       return 0;
+       }
+
 CA_DB *load_index(char *dbfile, DB_ATTR *db_attr)
        {
        CA_DB *retdb = NULL;
@@ -1624,7 +1693,9 @@ CA_DB *load_index(char *dbfile, DB_ATTR *db_attr)
                char *p = NCONF_get_string(dbattr_conf,NULL,"unique_subject");
                if (p)
                        {
+#ifdef RL_DEBUG
                        BIO_printf(bio_err, "DEBUG[load_index]: unique_subject = \"%s\"\n", p);
+#endif
                        switch(*p)
                                {
                        case 'f': /* false */
@@ -1873,6 +1944,9 @@ int rotate_index(char *dbfile, char *new_suffix, char *old_suffix)
 
 void free_index(CA_DB *db)
        {
-       TXT_DB_free(db->db);
-       OPENSSL_free(db);
+       if (db)
+               {
+               if (db->db) TXT_DB_free(db->db);
+               OPENSSL_free(db);
+               }
        }