summaryrefslogtreecommitdiffstats
path: root/libtomcrypt/pk/dsa/dsa_export.c
diff options
context:
space:
mode:
Diffstat (limited to 'libtomcrypt/pk/dsa/dsa_export.c')
-rw-r--r--libtomcrypt/pk/dsa/dsa_export.c117
1 files changed, 60 insertions, 57 deletions
diff --git a/libtomcrypt/pk/dsa/dsa_export.c b/libtomcrypt/pk/dsa/dsa_export.c
index 5a2d5df..01569e7 100644
--- a/libtomcrypt/pk/dsa/dsa_export.c
+++ b/libtomcrypt/pk/dsa/dsa_export.c
@@ -10,7 +10,6 @@
*/
#include "tomcrypt.h"
-
/**
@file dsa_export.c
DSA implementation, export key, Tom St Denis
@@ -26,74 +25,78 @@
@param key The key to export
@return CRYPT_OK if successful
*/
-int dsa_export(unsigned char *out, unsigned long *outlen, int type, dsa_key *key)
+int dsa_export(unsigned char *out, unsigned long *outlen, int type,
+ dsa_key * key)
{
- unsigned long zero=0;
- int err;
+ unsigned long zero = 0;
+ int err;
+
+ LTC_ARGCHK(out != NULL);
+ LTC_ARGCHK(outlen != NULL);
+ LTC_ARGCHK(key != NULL);
+
+ /* can we store the static header? */
+ if (type == PK_PRIVATE && key->type != PK_PRIVATE) {
+ return CRYPT_PK_TYPE_MISMATCH;
+ }
- LTC_ARGCHK(out != NULL);
- LTC_ARGCHK(outlen != NULL);
- LTC_ARGCHK(key != NULL);
+ if (type != PK_PUBLIC && type != PK_PRIVATE) {
+ return CRYPT_INVALID_ARG;
+ }
- /* can we store the static header? */
- if (type == PK_PRIVATE && key->type != PK_PRIVATE) {
- return CRYPT_PK_TYPE_MISMATCH;
- }
+ /* This encoding is different from the one in original
+ * libtomcrypt. It uses a compatible encoding with gnutls
+ * and openssl
+ */
+ if (type == PK_PRIVATE) {
+ return der_encode_sequence_multi(out, outlen,
+ 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);
+ } else {
+ unsigned long tmplen = (mp_count_bits(&key->y) / 8) + 8;
+ unsigned char *tmp = XMALLOC(tmplen);
+ ltc_asn1_list int_list[3];
- if (type != PK_PUBLIC && type != PK_PRIVATE) {
- return CRYPT_INVALID_ARG;
- }
+ if (tmp == NULL) {
+ return CRYPT_MEM;
+ }
- /* This encoding is different from the one in original
- * libtomcrypt. It uses a compatible encoding with gnutls
- * and openssl
- */
- if (type == PK_PRIVATE) {
- return der_encode_sequence_multi(out, outlen,
- 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);
- } else {
- unsigned long tmplen = (mp_count_bits(&key->y)/8)+8;
- unsigned char* tmp = XMALLOC(tmplen);
- ltc_asn1_list int_list[3];
-
- if (tmp == NULL) {
- return CRYPT_MEM;
- }
-
- err = der_encode_integer(&key->y, tmp, &tmplen);
- if (err != CRYPT_OK) {
- goto error;
- }
+ err = der_encode_integer(&key->y, tmp, &tmplen);
+ if (err != CRYPT_OK) {
+ goto error;
+ }
- int_list[0].data = &key->p;
- int_list[0].size = 1UL;
- int_list[0].type = LTC_ASN1_INTEGER;
- int_list[1].data = &key->q;
- int_list[1].size = 1UL;
- int_list[1].type = LTC_ASN1_INTEGER;
- int_list[2].data = &key->g;
- int_list[2].size = 1UL;
- int_list[2].type = LTC_ASN1_INTEGER;
+ int_list[0].data = &key->p;
+ int_list[0].size = 1UL;
+ int_list[0].type = LTC_ASN1_INTEGER;
+ int_list[1].data = &key->q;
+ int_list[1].size = 1UL;
+ int_list[1].type = LTC_ASN1_INTEGER;
+ int_list[2].data = &key->g;
+ int_list[2].size = 1UL;
+ int_list[2].type = LTC_ASN1_INTEGER;
+
+ err = der_encode_subject_public_key_info(out, outlen,
+ PKA_DSA, tmp, tmplen,
+ LTC_ASN1_SEQUENCE,
+ int_list,
+ sizeof(int_list) /
+ sizeof(int_list[0]));
- err = der_encode_subject_public_key_info(out, outlen,
- PKA_DSA, tmp, tmplen,
- LTC_ASN1_SEQUENCE, int_list, sizeof(int_list)/sizeof(int_list[0]));
-
error:
- XFREE(tmp);
- return err;
- }
+ XFREE(tmp);
+ return err;
+ }
}
#endif
-
/* $Source: /cvs/libtom/libtomcrypt/src/pk/dsa/dsa_export.c,v $ */
/* $Revision: 1.10 $ */
/* $Date: 2007/05/12 14:32:35 $ */