|
@@ -26,9 +26,9 @@
|
|
*/
|
|
*/
|
|
int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key)
|
|
int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key)
|
|
{
|
|
{
|
|
- unsigned char flags[1];
|
|
|
|
int err;
|
|
int err;
|
|
unsigned long zero = 0;
|
|
unsigned long zero = 0;
|
|
|
|
+ unsigned char* tmpbuf = NULL;
|
|
|
|
|
|
LTC_ARGCHK(in != NULL);
|
|
LTC_ARGCHK(in != NULL);
|
|
LTC_ARGCHK(key != NULL);
|
|
LTC_ARGCHK(key != NULL);
|
|
@@ -41,30 +41,41 @@ int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key)
|
|
|
|
|
|
/* get key type */
|
|
/* get key type */
|
|
if ((err = der_decode_sequence_multi(in, inlen,
|
|
if ((err = der_decode_sequence_multi(in, inlen,
|
|
- LTC_ASN1_BIT_STRING, 1UL, flags,
|
|
|
|
- LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) {
|
|
|
|
- /* private key */
|
|
|
|
- if ((err = der_decode_sequence_multi(in, inlen,
|
|
|
|
LTC_ASN1_SHORT_INTEGER, 1UL, &zero,
|
|
LTC_ASN1_SHORT_INTEGER, 1UL, &zero,
|
|
LTC_ASN1_INTEGER, 1UL, key->p,
|
|
LTC_ASN1_INTEGER, 1UL, key->p,
|
|
LTC_ASN1_INTEGER, 1UL, key->q,
|
|
LTC_ASN1_INTEGER, 1UL, key->q,
|
|
LTC_ASN1_INTEGER, 1UL, key->g,
|
|
LTC_ASN1_INTEGER, 1UL, key->g,
|
|
LTC_ASN1_INTEGER, 1UL, key->y,
|
|
LTC_ASN1_INTEGER, 1UL, key->y,
|
|
LTC_ASN1_INTEGER, 1UL, key->x,
|
|
LTC_ASN1_INTEGER, 1UL, key->x,
|
|
- LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) {
|
|
|
|
- goto error;
|
|
|
|
- }
|
|
|
|
|
|
+ LTC_ASN1_EOL, 0UL, NULL)) == CRYPT_OK) {
|
|
|
|
+
|
|
key->type = PK_PRIVATE;
|
|
key->type = PK_PRIVATE;
|
|
} else { /* public */
|
|
} else { /* public */
|
|
- if ((err = der_decode_sequence_multi(in, inlen,
|
|
|
|
- LTC_ASN1_BIT_STRING, 1UL, flags,
|
|
|
|
- LTC_ASN1_INTEGER, 1UL, key->g,
|
|
|
|
- LTC_ASN1_INTEGER, 1UL, key->p,
|
|
|
|
- LTC_ASN1_INTEGER, 1UL, key->q,
|
|
|
|
- LTC_ASN1_INTEGER, 1UL, key->y,
|
|
|
|
- LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) {
|
|
|
|
- goto error;
|
|
|
|
|
|
+ ltc_asn1_list params[3];
|
|
|
|
+ unsigned long tmpbuf_len = MAX_RSA_SIZE*8;
|
|
|
|
+
|
|
|
|
+ LTC_SET_ASN1(params, 0, LTC_ASN1_INTEGER, key->p, 1UL);
|
|
|
|
+ LTC_SET_ASN1(params, 1, LTC_ASN1_INTEGER, key->q, 1UL);
|
|
|
|
+ LTC_SET_ASN1(params, 2, LTC_ASN1_INTEGER, key->g, 1UL);
|
|
|
|
+
|
|
|
|
+ tmpbuf = XCALLOC(1, tmpbuf_len);
|
|
|
|
+ if (tmpbuf == NULL) {
|
|
|
|
+ err = CRYPT_MEM;
|
|
|
|
+ goto LBL_ERR;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ err = der_decode_subject_public_key_info(in, inlen,
|
|
|
|
+ PKA_DSA, tmpbuf, &tmpbuf_len,
|
|
|
|
+ LTC_ASN1_SEQUENCE, params, 3);
|
|
|
|
+ if (err != CRYPT_OK) {
|
|
|
|
+ goto LBL_ERR;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ((err=der_decode_integer(tmpbuf, tmpbuf_len, key->y)) != CRYPT_OK) {
|
|
|
|
+ goto LBL_ERR;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ XFREE(tmpbuf);
|
|
key->type = PK_PUBLIC;
|
|
key->type = PK_PUBLIC;
|
|
}
|
|
}
|
|
key->qord = mp_unsigned_bin_size(key->q);
|
|
key->qord = mp_unsigned_bin_size(key->q);
|
|
@@ -72,11 +83,12 @@ int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key)
|
|
if (key->qord >= LTC_MDSA_MAX_GROUP || key->qord <= 15 ||
|
|
if (key->qord >= LTC_MDSA_MAX_GROUP || key->qord <= 15 ||
|
|
(unsigned long)key->qord >= mp_unsigned_bin_size(key->p) || (mp_unsigned_bin_size(key->p) - key->qord) >= LTC_MDSA_DELTA) {
|
|
(unsigned long)key->qord >= mp_unsigned_bin_size(key->p) || (mp_unsigned_bin_size(key->p) - key->qord) >= LTC_MDSA_DELTA) {
|
|
err = CRYPT_INVALID_PACKET;
|
|
err = CRYPT_INVALID_PACKET;
|
|
- goto error;
|
|
|
|
|
|
+ goto LBL_ERR;
|
|
}
|
|
}
|
|
|
|
|
|
return CRYPT_OK;
|
|
return CRYPT_OK;
|
|
-error:
|
|
|
|
|
|
+LBL_ERR:
|
|
|
|
+ XFREE(tmpbuf);
|
|
mp_clear_multi(key->p, key->g, key->q, key->x, key->y, NULL);
|
|
mp_clear_multi(key->p, key->g, key->q, key->x, key->y, NULL);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|