Commit 5ba4bf35 authored by Dr. Stephen Henson's avatar Dr. Stephen Henson
Browse files

New functions to enumerate digests and ciphers.

parent aa93b18c
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -4,6 +4,12 @@


 Changes between 0.9.8b and 0.9.9  [xx XXX xxxx]
 Changes between 0.9.8b and 0.9.9  [xx XXX xxxx]


  *) New functions EVP_CIPHER_do_all(), EVP_CIPHER_do_all_sorted(),
     EVP_MD_do_all() and EVP_MD_do_all_sorted() to enumerate internal
     digest and cipher tables. New options added to openssl utility:
     list-message-digest-algorithms and list-cipher-algorithms.
     [Steve Henson]

  *) In addition to the numerical (unsigned long) thread ID, provide
  *) In addition to the numerical (unsigned long) thread ID, provide
     for a pointer (void *) thread ID.  This helps accomodate systems
     for a pointer (void *) thread ID.  This helps accomodate systems
     that do not provide an unsigned long thread ID.  OpenSSL assumes
     that do not provide an unsigned long thread ID.  OpenSSL assumes
+55 −0
Original line number Original line Diff line number Diff line
@@ -142,6 +142,8 @@ static int MS_CALLBACK cmp(const void *a_void,const void *b_void);
static LHASH *prog_init(void );
static LHASH *prog_init(void );
static int do_cmd(LHASH *prog,int argc,char *argv[]);
static int do_cmd(LHASH *prog,int argc,char *argv[]);
static void list_pkey(BIO *out);
static void list_pkey(BIO *out);
static void list_cipher(BIO *out);
static void list_md(BIO *out);
char *default_config_file=NULL;
char *default_config_file=NULL;


/* Make sure there is only one when MONOLITH is defined */
/* Make sure there is only one when MONOLITH is defined */
@@ -367,9 +369,12 @@ end:


#define LIST_STANDARD_COMMANDS "list-standard-commands"
#define LIST_STANDARD_COMMANDS "list-standard-commands"
#define LIST_MESSAGE_DIGEST_COMMANDS "list-message-digest-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_COMMANDS "list-cipher-commands"
#define LIST_CIPHER_ALGORITHMS "list-cipher-algorithms"
#define LIST_PUBLIC_KEY_ALGORITHMS "list-public-key-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 *prog, int argc, char *argv[])
	{
	{
	FUNCTION f,*fp;
	FUNCTION f,*fp;
@@ -411,7 +416,9 @@ static int do_cmd(LHASH *prog, int argc, char *argv[])
		}
		}
	else if ((strcmp(argv[0],LIST_STANDARD_COMMANDS) == 0) ||
	else if ((strcmp(argv[0],LIST_STANDARD_COMMANDS) == 0) ||
		(strcmp(argv[0],LIST_MESSAGE_DIGEST_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_COMMANDS) == 0) ||
		(strcmp(argv[0],LIST_CIPHER_ALGORITHMS) == 0) ||
		(strcmp(argv[0],LIST_PUBLIC_KEY_ALGORITHMS) == 0))
		(strcmp(argv[0],LIST_PUBLIC_KEY_ALGORITHMS) == 0))
		{
		{
		int list_type;
		int list_type;
@@ -421,8 +428,12 @@ static int do_cmd(LHASH *prog, int argc, char *argv[])
			list_type = FUNC_TYPE_GENERAL;
			list_type = FUNC_TYPE_GENERAL;
		else if (strcmp(argv[0],LIST_MESSAGE_DIGEST_COMMANDS) == 0)
		else if (strcmp(argv[0],LIST_MESSAGE_DIGEST_COMMANDS) == 0)
			list_type = FUNC_TYPE_MD;
			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)
		else if (strcmp(argv[0],LIST_PUBLIC_KEY_ALGORITHMS) == 0)
			list_type = FUNC_TYPE_PKEY;
			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 */
		else /* strcmp(argv[0],LIST_CIPHER_COMMANDS) == 0 */
			list_type = FUNC_TYPE_CIPHER;
			list_type = FUNC_TYPE_CIPHER;
		bio_stdout = BIO_new_fp(stdout,BIO_NOCLOSE);
		bio_stdout = BIO_new_fp(stdout,BIO_NOCLOSE);
@@ -438,6 +449,10 @@ static int do_cmd(LHASH *prog, int argc, char *argv[])


		if (list_type == FUNC_TYPE_PKEY)
		if (list_type == FUNC_TYPE_PKEY)
			list_pkey(bio_stdout);	
			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
		else
			{
			{
			for (fp=functions; fp->name != NULL; fp++)
			for (fp=functions; fp->name != NULL; fp++)
@@ -540,6 +555,46 @@ static void list_pkey(BIO *out)
		}
		}
	}
	}


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)
	{
	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 LHASH *prog_init(void)
static LHASH *prog_init(void)
	{
	{
	LHASH *ret;
	LHASH *ret;
+2 −0
Original line number Original line Diff line number Diff line
@@ -50,6 +50,8 @@ extern int ts_main(int argc,char *argv[]);
#define FUNC_TYPE_MD		2
#define FUNC_TYPE_MD		2
#define FUNC_TYPE_CIPHER	3
#define FUNC_TYPE_CIPHER	3
#define FUNC_TYPE_PKEY		4
#define FUNC_TYPE_PKEY		4
#define FUNC_TYPE_MD_ALG	5
#define FUNC_TYPE_CIPHER_ALG	6


typedef struct {
typedef struct {
	int type;
	int type;
+2 −0
Original line number Original line Diff line number Diff line
@@ -14,6 +14,8 @@ print <<'EOF';
#define FUNC_TYPE_MD		2
#define FUNC_TYPE_MD		2
#define FUNC_TYPE_CIPHER	3
#define FUNC_TYPE_CIPHER	3
#define FUNC_TYPE_PKEY		4
#define FUNC_TYPE_PKEY		4
#define FUNC_TYPE_MD_ALG	5
#define FUNC_TYPE_CIPHER_ALG	6


typedef struct {
typedef struct {
	int type;
	int type;
+10 −0
Original line number Original line Diff line number Diff line
@@ -782,6 +782,16 @@ const EVP_CIPHER *EVP_get_cipherbyname(const char *name);
const EVP_MD *EVP_get_digestbyname(const char *name);
const EVP_MD *EVP_get_digestbyname(const char *name);
void EVP_cleanup(void);
void EVP_cleanup(void);


void EVP_CIPHER_do_all(void (*fn)(const EVP_CIPHER *ciph,
		const char *from, const char *to, void *x), void *arg);
void EVP_CIPHER_do_all_sorted(void (*fn)(const EVP_CIPHER *ciph,
		const char *from, const char *to, void *x), void *arg);

void EVP_MD_do_all(void (*fn)(const EVP_MD *ciph,
		const char *from, const char *to, void *x), void *arg);
void EVP_MD_do_all_sorted(void (*fn)(const EVP_MD *ciph,
		const char *from, const char *to, void *x), void *arg);

int		EVP_PKEY_decrypt_old(unsigned char *dec_key,
int		EVP_PKEY_decrypt_old(unsigned char *dec_key,
			const unsigned char *enc_key,int enc_key_len,
			const unsigned char *enc_key,int enc_key_len,
			EVP_PKEY *private_key);
			EVP_PKEY *private_key);
Loading