Skip to content

Commit aeec5ea

Browse files
committed
Add SubjectPublicKeyInfo support to dsa_import()
Signed-off-by: Steffen Jaeckel <s@jaeckel.eu>
1 parent 6c54b88 commit aeec5ea

File tree

2 files changed

+74
-30
lines changed

2 files changed

+74
-30
lines changed

src/pk/asn1/x509/x509_import_spki.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ static const import_fn s_import_x509_fns[LTC_PKA_NUM] = {
1616
[LTC_PKA_RSA] = (import_fn)rsa_import_x509,
1717
[LTC_PKA_RSA_PSS] = (import_fn)rsa_import_x509,
1818
#endif
19+
#ifdef LTC_MDSA
20+
[LTC_PKA_DSA] = (import_fn)dsa_import,
21+
#endif
1922
#ifdef LTC_MECC
2023
[LTC_PKA_EC] = (import_fn)ecc_import_x509,
2124
#endif

src/pk/dsa/dsa_import.c

Lines changed: 71 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
38101
int 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

120161
LBL_OK:

0 commit comments

Comments
 (0)