99
1010#ifdef LTC_MDSA
1111
12- int dsa_import_pkcs1 (const unsigned char * in , unsigned long inlen , dsa_key * key )
12+ static int s_dsa_import_pkcs1 (const unsigned char * in , unsigned long inlen , dsa_key * key )
1313{
1414 int err ;
1515 unsigned long zero = 0 ;
@@ -33,14 +33,32 @@ static int s_dsa_import_y(const unsigned char *in, unsigned long inlen, dsa_key
3333 return der_decode_integer (in , inlen , key -> y );
3434}
3535
36- LTC_INLINE static int s_dsa_set_params (dsa_key * key , ltc_asn1_list * params )
36+ static LTC_INLINE int s_dsa_set_params (dsa_key * key , ltc_asn1_list * params )
3737{
3838 LTC_SET_ASN1 (params , 0 , LTC_ASN1_INTEGER , key -> p , 1UL );
3939 LTC_SET_ASN1 (params , 1 , LTC_ASN1_INTEGER , key -> q , 1UL );
4040 LTC_SET_ASN1 (params , 2 , LTC_ASN1_INTEGER , key -> g , 1UL );
4141 return 3 ;
4242}
4343
44+ static LTC_INLINE int s_dsa_validate (dsa_key * key )
45+ {
46+ int err , stat ;
47+ key -> qord = ltc_mp_unsigned_bin_size (key -> q );
48+
49+ /* quick p, q, g validation, without primality testing
50+ * + x, y validation */
51+ if ((err = dsa_int_validate (key , & stat )) != CRYPT_OK ) {
52+ return err ;
53+ }
54+
55+ if (stat == 0 ) {
56+ return CRYPT_INVALID_PACKET ;
57+ }
58+
59+ return CRYPT_OK ;
60+ }
61+
4462static int s_dsa_import_spki (const unsigned char * in , unsigned long inlen , dsa_key * key )
4563{
4664 int err ;
@@ -72,6 +90,28 @@ static int s_dsa_import_spki(const unsigned char *in, unsigned long inlen, dsa_k
7290 return err ;
7391}
7492
93+ int dsa_import_spki (const unsigned char * in , unsigned long inlen , dsa_key * key )
94+ {
95+ int err ;
96+
97+ LTC_ARGCHK (in != NULL );
98+
99+ /* init key */
100+ if ((err = dsa_int_init (key )) != CRYPT_OK ) return err ;
101+
102+ if ((err = s_dsa_import_spki (in , inlen , key )) != CRYPT_OK ) {
103+ goto LBL_ERR ;
104+ }
105+ if ((err = s_dsa_validate (key )) != CRYPT_OK ) {
106+ goto LBL_ERR ;
107+ }
108+
109+ return CRYPT_OK ;
110+ LBL_ERR :
111+ dsa_free (key );
112+ return err ;
113+ }
114+
75115static int s_dsa_import_x509 (const unsigned char * in , unsigned long inlen , dsa_key * key )
76116{
77117 int err ;
@@ -100,7 +140,7 @@ static int s_dsa_import_x509(const unsigned char *in, unsigned long inlen, dsa_k
100140*/
101141int dsa_import (const unsigned char * in , unsigned long inlen , dsa_key * key )
102142{
103- int err , stat ;
143+ int err ;
104144 unsigned char flags [1 ];
105145
106146 LTC_ARGCHK (in != NULL );
@@ -148,26 +188,18 @@ int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key)
148188 }
149189 }
150190
151- if (dsa_import_pkcs1 (in , inlen , key ) == CRYPT_OK ) {
191+ if (s_dsa_import_pkcs1 (in , inlen , key ) == CRYPT_OK ) {
152192 goto LBL_OK ;
153193 }
154- if (( err = s_dsa_import_spki (in , inlen , key ) ) == CRYPT_OK ) {
194+ if (s_dsa_import_spki (in , inlen , key ) == CRYPT_OK ) {
155195 goto LBL_OK ;
156196 }
157197 if ((err = s_dsa_import_x509 (in , inlen , key )) != CRYPT_OK ) {
158198 goto LBL_ERR ;
159199 }
160200
161201LBL_OK :
162- key -> qord = ltc_mp_unsigned_bin_size (key -> q );
163-
164- /* quick p, q, g validation, without primality testing
165- * + x, y validation */
166- if ((err = dsa_int_validate (key , & stat )) != CRYPT_OK ) {
167- goto LBL_ERR ;
168- }
169- if (stat == 0 ) {
170- err = CRYPT_INVALID_PACKET ;
202+ if ((err = s_dsa_validate (key )) != CRYPT_OK ) {
171203 goto LBL_ERR ;
172204 }
173205
0 commit comments