@@ -28,6 +28,69 @@ int dsa_import_pkcs1(const unsigned char *in, unsigned long inlen, dsa_key *key)
2828 return err ;
2929}
3030
31+ static int s_dsa_import_y (const unsigned char * in , unsigned long inlen , dsa_key * key )
32+ {
33+ return der_decode_integer (in , inlen , key -> y );
34+ }
35+
36+ LTC_INLINE static int s_dsa_set_params (dsa_key * key , ltc_asn1_list * params )
37+ {
38+ LTC_SET_ASN1 (params , 0 , LTC_ASN1_INTEGER , key -> p , 1UL );
39+ LTC_SET_ASN1 (params , 1 , LTC_ASN1_INTEGER , key -> q , 1UL );
40+ LTC_SET_ASN1 (params , 2 , LTC_ASN1_INTEGER , key -> g , 1UL );
41+ return 3 ;
42+ }
43+
44+ static int s_dsa_import_spki (const unsigned char * in , unsigned long inlen , dsa_key * key )
45+ {
46+ int err ;
47+ unsigned char * tmpbuf = NULL ;
48+ ltc_asn1_list params [3 ];
49+ unsigned long tmpbuf_len = inlen , len ;
50+
51+ len = s_dsa_set_params (key , params );
52+
53+ tmpbuf = XCALLOC (1 , tmpbuf_len );
54+ if (tmpbuf == NULL ) {
55+ return CRYPT_MEM ;
56+ }
57+
58+ err = x509_decode_subject_public_key_info (in , inlen ,
59+ LTC_OID_DSA , tmpbuf , & tmpbuf_len ,
60+ LTC_ASN1_SEQUENCE , params , & len );
61+ if (err != CRYPT_OK ) {
62+ goto LBL_ERR ;
63+ }
64+
65+ if ((err = s_dsa_import_y (tmpbuf , tmpbuf_len , key )) != CRYPT_OK ) {
66+ goto LBL_ERR ;
67+ }
68+
69+ key -> type = PK_PUBLIC ;
70+ LBL_ERR :
71+ XFREE (tmpbuf );
72+ return err ;
73+ }
74+
75+ static int s_dsa_import_x509 (const unsigned char * in , unsigned long inlen , dsa_key * key )
76+ {
77+ int err ;
78+ ltc_asn1_list params [3 ];
79+ unsigned long len ;
80+
81+ len = s_dsa_set_params (key , params );
82+
83+ if ((err = x509_decode_public_key_from_certificate (in , inlen ,
84+ LTC_OID_DSA ,
85+ LTC_ASN1_SEQUENCE , params , & len ,
86+ (public_key_decode_cb )s_dsa_import_y , key )) == CRYPT_OK ) {
87+ key -> type = PK_PUBLIC ;
88+ return CRYPT_OK ;
89+ }
90+
91+ return err ;
92+ }
93+
3194/**
3295 Import a DSA key
3396 @param in The binary packet to import from
@@ -38,7 +101,6 @@ int dsa_import_pkcs1(const unsigned char *in, unsigned long inlen, dsa_key *key)
38101int dsa_import (const unsigned char * in , unsigned long inlen , dsa_key * key )
39102{
40103 int err , stat ;
41- unsigned char * tmpbuf = NULL ;
42104 unsigned char flags [1 ];
43105
44106 LTC_ARGCHK (in != NULL );
@@ -86,35 +148,14 @@ int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key)
86148 }
87149 }
88150
89- if (dsa_import_pkcs1 (in , inlen , key ) != CRYPT_OK ) {
90- ltc_asn1_list params [3 ];
91- unsigned long tmpbuf_len = inlen , len ;
92-
93- LTC_SET_ASN1 (params , 0 , LTC_ASN1_INTEGER , key -> p , 1UL );
94- LTC_SET_ASN1 (params , 1 , LTC_ASN1_INTEGER , key -> q , 1UL );
95- LTC_SET_ASN1 (params , 2 , LTC_ASN1_INTEGER , key -> g , 1UL );
96- len = 3 ;
97-
98- tmpbuf = XCALLOC (1 , tmpbuf_len );
99- if (tmpbuf == NULL ) {
100- return CRYPT_MEM ;
101- }
102-
103- err = x509_decode_subject_public_key_info (in , inlen ,
104- LTC_OID_DSA , tmpbuf , & tmpbuf_len ,
105- LTC_ASN1_SEQUENCE , params , & len );
106- if (err != CRYPT_OK ) {
107- XFREE (tmpbuf );
108- goto LBL_ERR ;
109- }
110-
111- if ((err = der_decode_integer (tmpbuf , tmpbuf_len , key -> y )) != CRYPT_OK ) {
112- XFREE (tmpbuf );
113- goto LBL_ERR ;
114- }
115-
116- key -> type = PK_PUBLIC ;
117- XFREE (tmpbuf );
151+ if (dsa_import_pkcs1 (in , inlen , key ) == CRYPT_OK ) {
152+ goto LBL_OK ;
153+ }
154+ if ((err = s_dsa_import_spki (in , inlen , key )) == CRYPT_OK ) {
155+ goto LBL_OK ;
156+ }
157+ if ((err = s_dsa_import_x509 (in , inlen , key )) != CRYPT_OK ) {
158+ goto LBL_ERR ;
118159 }
119160
120161LBL_OK :
0 commit comments