summaryrefslogtreecommitdiffstats
path: root/libtomcrypt/pk/dsa/dsa_import.c
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2010-07-19 20:10:26 +0200
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2010-07-19 20:10:26 +0200
commit56eb45f752baa978a9ea3573faee44857678597d (patch)
tree3c7da78ba84669d0f988b98450e4e55779dfcb41 /libtomcrypt/pk/dsa/dsa_import.c
parent035b7bf3544ab9927dc2d64cf1e3214237ff0f71 (diff)
downloadcryptodev-linux-56eb45f752baa978a9ea3573faee44857678597d.tar.gz
cryptodev-linux-56eb45f752baa978a9ea3573faee44857678597d.tar.xz
cryptodev-linux-56eb45f752baa978a9ea3573faee44857678597d.zip
Public Keys are being exported to SubjectPublicKeyInfo format, instead of custom formats. For RSA keys the PKCS #1 format can be used as well.
Diffstat (limited to 'libtomcrypt/pk/dsa/dsa_import.c')
-rw-r--r--libtomcrypt/pk/dsa/dsa_import.c49
1 files changed, 30 insertions, 19 deletions
diff --git a/libtomcrypt/pk/dsa/dsa_import.c b/libtomcrypt/pk/dsa/dsa_import.c
index 88e74f5..c0680f5 100644
--- a/libtomcrypt/pk/dsa/dsa_import.c
+++ b/libtomcrypt/pk/dsa/dsa_import.c
@@ -26,9 +26,9 @@
*/
int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key)
{
- unsigned char flags[1];
int err;
unsigned long zero = 0;
+ unsigned char* tmpbuf = NULL;
LTC_ARGCHK(in != NULL);
LTC_ARGCHK(key != NULL);
@@ -40,44 +40,55 @@ int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key)
/* get key type */
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_INTEGER, 1UL, &key->p,
LTC_ASN1_INTEGER, 1UL, &key->q,
LTC_ASN1_INTEGER, 1UL, &key->g,
LTC_ASN1_INTEGER, 1UL, &key->y,
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;
-
} else { /* public */
+ 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;
+ }
- 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;
+ 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->qord = mp_unsigned_bin_size(&key->q);
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) {
err = CRYPT_INVALID_PACKET;
- goto error;
+ goto LBL_ERR;
}
return CRYPT_OK;
-error:
+
+LBL_ERR:
+ XFREE(tmpbuf);
mp_clear_multi(&key->p, &key->g, &key->q, &key->x, &key->y, NULL);
return err;
}