aboutsummaryrefslogtreecommitdiff
path: root/crypto/asn1/d2i_pr.c
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>2000-01-01 16:42:49 +0000
committerDr. Stephen Henson <steve@openssl.org>2000-01-01 16:42:49 +0000
commit20432eae41e35ea28a4d43c0dfc7acfdd9672812 (patch)
treeab6b92cdf2f38923e3e106968aa0dca236e0b4f9 /crypto/asn1/d2i_pr.c
parent47134b7864fd5e31dbdbc789d9e073742ad4c3ee (diff)
downloadopenssl-20432eae41e35ea28a4d43c0dfc7acfdd9672812.zip
openssl-20432eae41e35ea28a4d43c0dfc7acfdd9672812.tar.gz
openssl-20432eae41e35ea28a4d43c0dfc7acfdd9672812.tar.bz2
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.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/crypto/asn1/d2i_pr.c b/crypto/asn1/d2i_pr.c
index f3d1aa6..7ae8781 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);
+}