diff options
author | Dr. Stephen Henson <steve@openssl.org> | 2000-01-01 16:42:49 +0000 |
---|---|---|
committer | Dr. Stephen Henson <steve@openssl.org> | 2000-01-01 16:42:49 +0000 |
commit | 20432eae41e35ea28a4d43c0dfc7acfdd9672812 (patch) | |
tree | ab6b92cdf2f38923e3e106968aa0dca236e0b4f9 /crypto/asn1/d2i_pr.c | |
parent | 47134b7864fd5e31dbdbc789d9e073742ad4c3ee (diff) | |
download | openssl-20432eae41e35ea28a4d43c0dfc7acfdd9672812.tar.gz |
Fix some of the command line password stuff. New function
that can automatically determine the type of a DER encoded
"traditional" format private key and change some of the
d2i functions to use it instead of requiring the application
to work out the key type.
Diffstat (limited to 'crypto/asn1/d2i_pr.c')
-rw-r--r-- | crypto/asn1/d2i_pr.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/crypto/asn1/d2i_pr.c b/crypto/asn1/d2i_pr.c index f3d1aa6240..7ae87819de 100644 --- a/crypto/asn1/d2i_pr.c +++ b/crypto/asn1/d2i_pr.c @@ -112,3 +112,26 @@ err: return(NULL); } +/* This works like d2i_PrivateKey() except it automatically works out the type */ + +EVP_PKEY *d2i_AutoPrivateKey(EVP_PKEY **a, unsigned char **pp, + long length) +{ + STACK_OF(ASN1_TYPE) *inkey; + unsigned char *p; + int keytype; + p = *pp; + /* Dirty trick: read in the ASN1 data into a STACK_OF(ASN1_TYPE): + * by analysing it we can determine the passed structure: this + * assumes the input is surrounded by an ASN1 SEQUENCE. + */ + inkey = d2i_ASN1_SET_OF_ASN1_TYPE(NULL, &p, length, d2i_ASN1_TYPE, + ASN1_TYPE_free, V_ASN1_SEQUENCE, V_ASN1_UNIVERSAL); + /* Since we only need to discern "traditional format" RSA and DSA + * keys we can just count the elements. + */ + if(sk_ASN1_TYPE_num(inkey) == 6) keytype = EVP_PKEY_DSA; + else keytype = EVP_PKEY_RSA; + sk_ASN1_TYPE_pop_free(inkey, ASN1_TYPE_free); + return d2i_PrivateKey(keytype, a, pp, length); +} |