Use new X509_STORE_set_verify_cb function instead of old macro.
[openssl.git] / apps / openssl.c
index f996bb3e184efb6ce5a9753a2ee75c10982f4123..851e63973581fc191c42ad418154769dae01ecc5 100644 (file)
  * type of "FUNCTION*"). This removes the necessity for macro-generated wrapper
  * functions. */
 
-/* static unsigned long MS_CALLBACK hash(FUNCTION *a); */
-static unsigned long MS_CALLBACK hash(const void *a_void);
-/* static int MS_CALLBACK cmp(FUNCTION *a,FUNCTION *b); */
-static int MS_CALLBACK cmp(const void *a_void,const void *b_void);
-static LHASH *prog_init(void );
-static int do_cmd(LHASH *prog,int argc,char *argv[]);
+static LHASH_OF(FUNCTION) *prog_init(void );
+static int do_cmd(LHASH_OF(FUNCTION) *prog,int argc,char *argv[]);
 static void list_pkey(BIO *out);
+static void list_cipher(BIO *out);
+static void list_md(BIO *out);
 char *default_config_file=NULL;
 
 /* Make sure there is only one when MONOLITH is defined */
@@ -227,7 +225,7 @@ int main(int Argc, char *Argv[])
        int n,i,ret=0;
        int argc;
        char **argv,*p;
-       LHASH *prog=NULL;
+       LHASH_OF(FUNCTION) *prog=NULL;
        long errline;
  
        arg.data=NULL;
@@ -274,9 +272,21 @@ int main(int Argc, char *Argv[])
        i=NCONF_load(config,p,&errline);
        if (i == 0)
                {
-               NCONF_free(config);
-               config = NULL;
-               ERR_clear_error();
+               if (ERR_GET_REASON(ERR_peek_last_error())
+                   == CONF_R_NO_SUCH_FILE)
+                       {
+                       BIO_printf(bio_err,
+                                  "WARNING: can't open config file: %s\n",p);
+                       ERR_clear_error();
+                       NCONF_free(config);
+                       config = NULL;
+                       }
+               else
+                       {
+                       ERR_print_errors(bio_err);
+                       NCONF_free(config);
+                       exit(1);
+                       }
                }
 
        prog=prog_init();
@@ -285,7 +295,7 @@ int main(int Argc, char *Argv[])
        program_name(Argv[0],pname,sizeof pname);
 
        f.name=pname;
-       fp=(FUNCTION *)lh_retrieve(prog,&f);
+       fp=lh_FUNCTION_retrieve(prog,&f);
        if (fp != NULL)
                {
                Argv[0]=pname;
@@ -320,7 +330,8 @@ int main(int Argc, char *Argv[])
                        else    prompt="OpenSSL> ";
                        fputs(prompt,stdout);
                        fflush(stdout);
-                       fgets(p,n,stdin);
+                       if (!fgets(p,n,stdin))
+                               goto end;
                        if (p[0] == '\0') goto end;
                        i=strlen(p);
                        if (i <= 1) break;
@@ -351,7 +362,7 @@ end:
                NCONF_free(config);
                config=NULL;
                }
-       if (prog != NULL) lh_free(prog);
+       if (prog != NULL) lh_FUNCTION_free(prog);
        if (arg.data != NULL) OPENSSL_free(arg.data);
 
        apps_shutdown();
@@ -367,10 +378,13 @@ end:
 
 #define LIST_STANDARD_COMMANDS "list-standard-commands"
 #define LIST_MESSAGE_DIGEST_COMMANDS "list-message-digest-commands"
+#define LIST_MESSAGE_DIGEST_ALGORITHMS "list-message-digest-algorithms"
 #define LIST_CIPHER_COMMANDS "list-cipher-commands"
+#define LIST_CIPHER_ALGORITHMS "list-cipher-algorithms"
 #define LIST_PUBLIC_KEY_ALGORITHMS "list-public-key-algorithms"
 
-static int do_cmd(LHASH *prog, int argc, char *argv[])
+
+static int do_cmd(LHASH_OF(FUNCTION) *prog, int argc, char *argv[])
        {
        FUNCTION f,*fp;
        int i,ret=1,tp,nl;
@@ -378,7 +392,22 @@ static int do_cmd(LHASH *prog, int argc, char *argv[])
        if ((argc <= 0) || (argv[0] == NULL))
                { ret=0; goto end; }
        f.name=argv[0];
-       fp=(FUNCTION *)lh_retrieve(prog,&f);
+       fp=lh_FUNCTION_retrieve(prog,&f);
+       if (fp == NULL)
+               {
+               if (EVP_get_digestbyname(argv[0]))
+                       {
+                       f.type = FUNC_TYPE_MD;
+                       f.func = dgst_main;
+                       fp = &f;
+                       }
+               else if (EVP_get_cipherbyname(argv[0]))
+                       {
+                       f.type = FUNC_TYPE_CIPHER;
+                       f.func = enc_main;
+                       fp = &f;
+                       }
+               }
        if (fp != NULL)
                {
                ret=fp->func(argc,argv);
@@ -393,7 +422,7 @@ static int do_cmd(LHASH *prog, int argc, char *argv[])
                }
 #endif
                f.name=argv[0]+3;
-               ret = (lh_retrieve(prog,&f) != NULL);
+               ret = (lh_FUNCTION_retrieve(prog,&f) != NULL);
                if (!ret)
                        BIO_printf(bio_stdout, "%s\n", argv[0]);
                else
@@ -411,7 +440,9 @@ static int do_cmd(LHASH *prog, int argc, char *argv[])
                }
        else if ((strcmp(argv[0],LIST_STANDARD_COMMANDS) == 0) ||
                (strcmp(argv[0],LIST_MESSAGE_DIGEST_COMMANDS) == 0) ||
+               (strcmp(argv[0],LIST_MESSAGE_DIGEST_ALGORITHMS) == 0) ||
                (strcmp(argv[0],LIST_CIPHER_COMMANDS) == 0) ||
+               (strcmp(argv[0],LIST_CIPHER_ALGORITHMS) == 0) ||
                (strcmp(argv[0],LIST_PUBLIC_KEY_ALGORITHMS) == 0))
                {
                int list_type;
@@ -421,8 +452,12 @@ static int do_cmd(LHASH *prog, int argc, char *argv[])
                        list_type = FUNC_TYPE_GENERAL;
                else if (strcmp(argv[0],LIST_MESSAGE_DIGEST_COMMANDS) == 0)
                        list_type = FUNC_TYPE_MD;
+               else if (strcmp(argv[0],LIST_MESSAGE_DIGEST_ALGORITHMS) == 0)
+                       list_type = FUNC_TYPE_MD_ALG;
                else if (strcmp(argv[0],LIST_PUBLIC_KEY_ALGORITHMS) == 0)
                        list_type = FUNC_TYPE_PKEY;
+               else if (strcmp(argv[0],LIST_CIPHER_ALGORITHMS) == 0)
+                       list_type = FUNC_TYPE_CIPHER_ALG;
                else /* strcmp(argv[0],LIST_CIPHER_COMMANDS) == 0 */
                        list_type = FUNC_TYPE_CIPHER;
                bio_stdout = BIO_new_fp(stdout,BIO_NOCLOSE);
@@ -438,6 +473,10 @@ static int do_cmd(LHASH *prog, int argc, char *argv[])
 
                if (list_type == FUNC_TYPE_PKEY)
                        list_pkey(bio_stdout);  
+               if (list_type == FUNC_TYPE_MD_ALG)
+                       list_md(bio_stdout);    
+               if (list_type == FUNC_TYPE_CIPHER_ALG)
+                       list_cipher(bio_stdout);        
                else
                        {
                        for (fp=functions; fp->name != NULL; fp++)
@@ -540,9 +579,61 @@ static void list_pkey(BIO *out)
                }
        }
 
-static LHASH *prog_init(void)
+static void list_cipher_fn(const EVP_CIPHER *c,
+                       const char *from, const char *to, void *arg)
+       {
+       if (c)
+               BIO_printf(arg, "%s\n", EVP_CIPHER_name(c));
+       else
+               {
+               if (!from)
+                       from = "<undefined>";
+               if (!to)
+                       to = "<undefined>";
+               BIO_printf(arg, "%s => %s\n", from, to);
+               }
+       }
+
+static void list_cipher(BIO *out)
        {
-       LHASH *ret;
+       EVP_CIPHER_do_all_sorted(list_cipher_fn, out);
+       }
+
+static void list_md_fn(const EVP_MD *m,
+                       const char *from, const char *to, void *arg)
+       {
+       if (m)
+               BIO_printf(arg, "%s\n", EVP_MD_name(m));
+       else
+               {
+               if (!from)
+                       from = "<undefined>";
+               if (!to)
+                       to = "<undefined>";
+               BIO_printf(arg, "%s => %s\n", from, to);
+               }
+       }
+
+static void list_md(BIO *out)
+       {
+       EVP_MD_do_all_sorted(list_md_fn, out);
+       }
+
+static int MS_CALLBACK function_cmp(const FUNCTION *a, const FUNCTION *b)
+       {
+       return strncmp(a->name,b->name,8);
+       }
+static IMPLEMENT_LHASH_COMP_FN(function, FUNCTION)
+
+static unsigned long MS_CALLBACK function_hash(const FUNCTION *a)
+       {
+       return lh_strhash(a->name);
+       }       
+static IMPLEMENT_LHASH_HASH_FN(function, FUNCTION)
+
+static LHASH_OF(FUNCTION) *prog_init(void)
+       {
+       LHASH_OF(FUNCTION) *ret;
        FUNCTION *f;
        size_t i;
 
@@ -551,23 +642,11 @@ static LHASH *prog_init(void)
            ;
        qsort(functions,i,sizeof *functions,SortFnByName);
 
-       if ((ret=lh_new(hash, cmp)) == NULL)
+       if ((ret=lh_FUNCTION_new()) == NULL)
                return(NULL);
 
        for (f=functions; f->name != NULL; f++)
-               lh_insert(ret,f);
+               (void)lh_FUNCTION_insert(ret,f);
        return(ret);
        }
 
-/* static int MS_CALLBACK cmp(FUNCTION *a, FUNCTION *b) */
-static int MS_CALLBACK cmp(const void *a_void, const void *b_void)
-       {
-       return(strncmp(((const FUNCTION *)a_void)->name,
-                       ((const FUNCTION *)b_void)->name,8));
-       }
-
-/* static unsigned long MS_CALLBACK hash(FUNCTION *a) */
-static unsigned long MS_CALLBACK hash(const void *a_void)
-       {
-       return(lh_strhash(((const FUNCTION *)a_void)->name));
-       }