Commit 0b33dac3 authored by Dr. Stephen Henson's avatar Dr. Stephen Henson
Browse files

New function to retrieve ASN1 info on public key algorithms. New command

line option to print out info.
parent e2bce377
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -4,6 +4,11 @@

 Changes between 0.9.8a and 0.9.9  [xx XXX xxxx]

  *) New function EVP_PKEY_asn1_get0_info() to retrieve information about
     public key algorithms. New option to openssl utility:
     "list-public-key-algorithms" to print out info.
     [Steve Henson]

  *) Implement the Supported Elliptic Curves Extension for
     ECC ciphersuites from draft-ietf-tls-ecc-12.txt.
     [Douglas Stebila]
+48 −5
Original line number Diff line number Diff line
@@ -141,6 +141,7 @@ static unsigned long MS_CALLBACK hash(const void *a_void);
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 void list_pkey(BIO *out);
char *default_config_file=NULL;

/* Make sure there is only one when MONOLITH is defined */
@@ -367,6 +368,7 @@ end:
#define LIST_STANDARD_COMMANDS "list-standard-commands"
#define LIST_MESSAGE_DIGEST_COMMANDS "list-message-digest-commands"
#define LIST_CIPHER_COMMANDS "list-cipher-commands"
#define LIST_PUBLIC_KEY_ALGORITHMS "list-public-key-algorithms"

static int do_cmd(LHASH *prog, int argc, char *argv[])
	{
@@ -409,7 +411,8 @@ 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_CIPHER_COMMANDS) == 0))
		(strcmp(argv[0],LIST_CIPHER_COMMANDS) == 0) ||
		(strcmp(argv[0],LIST_PUBLIC_KEY_ALGORITHMS) == 0))
		{
		int list_type;
		BIO *bio_stdout;
@@ -418,6 +421,8 @@ 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_PUBLIC_KEY_ALGORITHMS) == 0)
			list_type = FUNC_TYPE_PKEY;
		else /* strcmp(argv[0],LIST_CIPHER_COMMANDS) == 0 */
			list_type = FUNC_TYPE_CIPHER;
		bio_stdout = BIO_new_fp(stdout,BIO_NOCLOSE);
@@ -427,10 +432,15 @@ static int do_cmd(LHASH *prog, int argc, char *argv[])
		bio_stdout = BIO_push(tmpbio, bio_stdout);
		}
#endif
		
		if (list_type == FUNC_TYPE_PKEY)
			list_pkey(bio_stdout);	
		else
			{
			for (fp=functions; fp->name != NULL; fp++)
				if (fp->type == list_type)
				BIO_printf(bio_stdout, "%s\n", fp->name);
					BIO_printf(bio_stdout, "%s\n",
								fp->name);
			}
		BIO_free_all(bio_stdout);
		ret=0;
		goto end;
@@ -485,6 +495,39 @@ static int SortFnByName(const void *_f1,const void *_f2)
    return strcmp(f1->name,f2->name);
    }

static void list_pkey(BIO *out)
	{
	int i;
	for (i = 0; i < EVP_PKEY_asn1_get_count(); i++)
		{
		const EVP_PKEY_ASN1_METHOD *ameth;
		int pkey_id, pkey_base_id, pkey_flags;
		const char *pinfo, *pem_str;
		ameth = EVP_PKEY_asn1_get0(i);
		EVP_PKEY_asn1_get0_info(&pkey_id, &pkey_base_id, &pkey_flags,
						&pinfo, &pem_str, ameth);
		if (pkey_flags & ASN1_PKEY_ALIAS)
			{
			BIO_printf(out, "Name: %s\n", 
					OBJ_nid2ln(pkey_id));
			BIO_printf(out, "\tType: Alias to %s\n",
					OBJ_nid2ln(pkey_base_id));
			}
		else
			{
			BIO_printf(out, "Name: %s\n", pinfo);
			BIO_printf(out, "\tType: %s Algorithm\n", 
				pkey_flags & ASN1_PKEY_DYNAMIC ?
					"External" : "Builtin");
			BIO_printf(out, "\tOID: %s\n", OBJ_nid2ln(pkey_id));
			if (pem_str == NULL)
				pem_str = "(none)";
			BIO_printf(out, "\tPEM string: %s\n", pem_str);
			}
					
		}
	}

static LHASH *prog_init(void)
	{
	LHASH *ret;
+1 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ extern int ts_main(int argc,char *argv[]);
#define FUNC_TYPE_GENERAL	1
#define FUNC_TYPE_MD		2
#define FUNC_TYPE_CIPHER	3
#define FUNC_TYPE_PKEY		4

typedef struct {
	int type;
+1 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ print <<'EOF';
#define FUNC_TYPE_GENERAL	1
#define FUNC_TYPE_MD		2
#define FUNC_TYPE_CIPHER	3
#define FUNC_TYPE_PKEY		4

typedef struct {
	int type;
+19 −0
Original line number Diff line number Diff line
@@ -186,6 +186,25 @@ int EVP_PKEY_asn1_add(const EVP_PKEY_ASN1_METHOD *ameth)
	return 1;
	}

int EVP_PKEY_asn1_get0_info(int *ppkey_id, int *ppkey_base_id, int *ppkey_flags,
				const char **pinfo, const char **ppem_str,
					const EVP_PKEY_ASN1_METHOD *ameth)
	{
	if (!ameth)
		return 0;
	if (ppkey_id)
		*ppkey_id = ameth->pkey_id;
	if (ppkey_base_id)
		*ppkey_base_id = ameth->pkey_base_id;
	if (ppkey_flags)
		*ppkey_flags = ameth->pkey_flags;
	if (pinfo)
		*pinfo = ameth->info;
	if (ppem_str)
		*ppem_str = ameth->pem_str;
	return 1;
	}

EVP_PKEY_ASN1_METHOD* EVP_PKEY_asn1_new(int id,
					const char *pem_str, const char *info)
	{
Loading