|
9 | 9 |
|
10 | 10 | #ifdef LTC_MDSA |
11 | 11 |
|
| 12 | +int dsa_import_pkcs1(const unsigned char *in, unsigned long inlen, dsa_key *key) |
| 13 | +{ |
| 14 | + int err; |
| 15 | + unsigned long zero = 0; |
| 16 | + /* get key type */ |
| 17 | + if ((err = der_decode_sequence_multi(in, inlen, |
| 18 | + LTC_ASN1_SHORT_INTEGER, 1UL, &zero, |
| 19 | + LTC_ASN1_INTEGER, 1UL, key->p, |
| 20 | + LTC_ASN1_INTEGER, 1UL, key->q, |
| 21 | + LTC_ASN1_INTEGER, 1UL, key->g, |
| 22 | + LTC_ASN1_INTEGER, 1UL, key->y, |
| 23 | + LTC_ASN1_INTEGER, 1UL, key->x, |
| 24 | + LTC_ASN1_EOL, 0UL, NULL)) == CRYPT_OK) { |
| 25 | + |
| 26 | + key->type = PK_PRIVATE; |
| 27 | + } |
| 28 | + return err; |
| 29 | +} |
| 30 | + |
12 | 31 | /** |
13 | 32 | Import a DSA key |
14 | 33 | @param in The binary packet to import from |
|
19 | 38 | int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key) |
20 | 39 | { |
21 | 40 | int err, stat; |
22 | | - unsigned long zero = 0, len; |
23 | 41 | unsigned char* tmpbuf = NULL; |
24 | 42 | unsigned char flags[1]; |
25 | 43 |
|
26 | 44 | LTC_ARGCHK(in != NULL); |
27 | | - LTC_ARGCHK(key != NULL); |
28 | | - LTC_ARGCHK(ltc_mp.name != NULL); |
29 | 45 |
|
30 | 46 | /* init key */ |
31 | | - if (mp_init_multi(&key->p, &key->g, &key->q, &key->x, &key->y, NULL) != CRYPT_OK) { |
32 | | - return CRYPT_MEM; |
33 | | - } |
| 47 | + if ((err = dsa_int_init(key)) != CRYPT_OK) return err; |
34 | 48 |
|
35 | 49 | /* try to match the old libtomcrypt format */ |
36 | 50 | err = der_decode_sequence_multi(in, inlen, LTC_ASN1_BIT_STRING, 1UL, flags, |
@@ -71,62 +85,44 @@ int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key) |
71 | 85 | goto LBL_ERR; |
72 | 86 | } |
73 | 87 | } |
74 | | - /* get key type */ |
75 | | - if ((err = der_decode_sequence_multi(in, inlen, |
76 | | - LTC_ASN1_SHORT_INTEGER, 1UL, &zero, |
77 | | - LTC_ASN1_INTEGER, 1UL, key->p, |
78 | | - LTC_ASN1_INTEGER, 1UL, key->q, |
79 | | - LTC_ASN1_INTEGER, 1UL, key->g, |
80 | | - LTC_ASN1_INTEGER, 1UL, key->y, |
81 | | - LTC_ASN1_INTEGER, 1UL, key->x, |
82 | | - LTC_ASN1_EOL, 0UL, NULL)) == CRYPT_OK) { |
83 | 88 |
|
84 | | - key->type = PK_PRIVATE; |
85 | | - } else { /* public */ |
| 89 | + if ((err = dsa_import_pkcs1(in, inlen, key)) != CRYPT_OK) { |
86 | 90 | ltc_asn1_list params[3]; |
87 | | - unsigned long tmpbuf_len = inlen; |
| 91 | + unsigned long tmpbuf_len = inlen, len; |
88 | 92 |
|
89 | 93 | LTC_SET_ASN1(params, 0, LTC_ASN1_INTEGER, key->p, 1UL); |
90 | 94 | LTC_SET_ASN1(params, 1, LTC_ASN1_INTEGER, key->q, 1UL); |
91 | 95 | LTC_SET_ASN1(params, 2, LTC_ASN1_INTEGER, key->g, 1UL); |
92 | 96 |
|
93 | 97 | tmpbuf = XCALLOC(1, tmpbuf_len); |
94 | 98 | if (tmpbuf == NULL) { |
95 | | - err = CRYPT_MEM; |
96 | | - goto LBL_ERR; |
| 99 | + return CRYPT_MEM; |
97 | 100 | } |
98 | 101 |
|
99 | 102 | len = 3; |
100 | 103 | err = x509_decode_subject_public_key_info(in, inlen, LTC_OID_DSA, |
101 | | - tmpbuf, &tmpbuf_len, |
102 | | - LTC_ASN1_SEQUENCE, params, &len); |
| 104 | + tmpbuf, &tmpbuf_len, |
| 105 | + LTC_ASN1_SEQUENCE, params, &len); |
103 | 106 | if (err != CRYPT_OK) { |
104 | 107 | XFREE(tmpbuf); |
105 | 108 | goto LBL_ERR; |
106 | 109 | } |
107 | 110 |
|
108 | | - if ((err=der_decode_integer(tmpbuf, tmpbuf_len, key->y)) != CRYPT_OK) { |
| 111 | + if ((err = der_decode_integer(tmpbuf, tmpbuf_len, key->y)) != CRYPT_OK) { |
109 | 112 | XFREE(tmpbuf); |
110 | 113 | goto LBL_ERR; |
111 | 114 | } |
112 | 115 |
|
113 | | - XFREE(tmpbuf); |
114 | 116 | key->type = PK_PUBLIC; |
| 117 | + XFREE(tmpbuf); |
115 | 118 | } |
116 | 119 |
|
117 | 120 | LBL_OK: |
118 | 121 | key->qord = mp_unsigned_bin_size(key->q); |
119 | 122 |
|
120 | | - /* quick p, q, g validation, without primality testing */ |
121 | | - if ((err = dsa_int_validate_pqg(key, &stat)) != CRYPT_OK) { |
122 | | - goto LBL_ERR; |
123 | | - } |
124 | | - if (stat == 0) { |
125 | | - err = CRYPT_INVALID_PACKET; |
126 | | - goto LBL_ERR; |
127 | | - } |
128 | | - /* validate x, y */ |
129 | | - if ((err = dsa_int_validate_xy(key, &stat)) != CRYPT_OK) { |
| 123 | + /* quick p, q, g validation, without primality testing |
| 124 | + * + x, y validation */ |
| 125 | + if ((err = dsa_int_validate(key, &stat)) != CRYPT_OK) { |
130 | 126 | goto LBL_ERR; |
131 | 127 | } |
132 | 128 | if (stat == 0) { |
|
0 commit comments