summaryrefslogtreecommitdiffstats
path: root/libtomcrypt/pk/rsa/rsa_export.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/rsa/rsa_export.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/rsa/rsa_export.c')
-rw-r--r--libtomcrypt/pk/rsa/rsa_export.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/libtomcrypt/pk/rsa/rsa_export.c b/libtomcrypt/pk/rsa/rsa_export.c
index 04e59d8..33c222d 100644
--- a/libtomcrypt/pk/rsa/rsa_export.c
+++ b/libtomcrypt/pk/rsa/rsa_export.c
@@ -9,7 +9,7 @@
* Tom St Denis, tomstdenis@gmail.com, http://libtom.org
*/
#include "tomcrypt.h"
-
+#include <ncr_int.h>
/**
@file rsa_export.c
Export RSA LTC_PKCS keys, Tom St Denis
@@ -28,6 +28,7 @@
int rsa_export(unsigned char *out, unsigned long *outlen, int type, rsa_key *key)
{
unsigned long zero=0;
+ int err;
LTC_ARGCHK(out != NULL);
LTC_ARGCHK(outlen != NULL);
LTC_ARGCHK(key != NULL);
@@ -54,11 +55,27 @@ int rsa_export(unsigned char *out, unsigned long *outlen, int type, rsa_key *key
LTC_ASN1_INTEGER, 1UL, &key->qP,
LTC_ASN1_EOL, 0UL, NULL);
} else {
- /* public key */
- return der_encode_sequence_multi(out, outlen,
+ unsigned long tmplen = (mp_count_bits(&key->N)/8)*2+8;
+ unsigned char* tmp = XMALLOC(tmplen);
+
+ if (tmp == NULL) {
+ return CRYPT_MEM;
+ }
+
+ err = der_encode_sequence_multi(tmp, &tmplen,
LTC_ASN1_INTEGER, 1UL, &key->N,
LTC_ASN1_INTEGER, 1UL, &key->e,
LTC_ASN1_EOL, 0UL, NULL);
+ if (err != CRYPT_OK) {
+ goto error;
+ }
+
+ err = der_encode_subject_public_key_info(out, outlen,
+ PKA_RSA, tmp, tmplen, LTC_ASN1_NULL, NULL, 0);
+
+error:
+ XFREE(tmp);
+ return err;
}
}