1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
3 * LibTomCrypt is a library that provides various cryptographic
4 * algorithms in a highly modular and flexible manner.
6 * The library is free for all purposes without any express
13 DSA implementation, export key, Tom St Denis
19 Export a DSA key to a binary packet
20 @param out [out] Where to store the packet
21 @param outlen [in/out] The max size and resulting size of the packet
22 @param type The type of key to export (PK_PRIVATE or PK_PUBLIC)
23 @param key The key to export
24 @return CRYPT_OK if successful
26 int dsa_export(unsigned char *out, unsigned long *outlen, int type, dsa_key *key)
31 LTC_ARGCHK(out != NULL);
32 LTC_ARGCHK(outlen != NULL);
33 LTC_ARGCHK(key != NULL);
38 /* can we store the static header? */
39 if (type == PK_PRIVATE && key->type != PK_PRIVATE) {
40 return CRYPT_PK_TYPE_MISMATCH;
43 if (type != PK_PUBLIC && type != PK_PRIVATE) {
44 return CRYPT_INVALID_ARG;
47 if (type == PK_PRIVATE) {
49 return der_encode_sequence_multi(out, outlen,
50 LTC_ASN1_SHORT_INTEGER, 1UL, &zero,
51 LTC_ASN1_INTEGER, 1UL, key->p,
52 LTC_ASN1_INTEGER, 1UL, key->q,
53 LTC_ASN1_INTEGER, 1UL, key->g,
54 LTC_ASN1_INTEGER, 1UL, key->y,
55 LTC_ASN1_INTEGER, 1UL, key->x,
56 LTC_ASN1_EOL, 0UL, NULL);
59 unsigned char flags[1];
61 return der_encode_sequence_multi(out, outlen,
62 LTC_ASN1_BIT_STRING, 1UL, flags,
63 LTC_ASN1_INTEGER, 1UL, key->g,
64 LTC_ASN1_INTEGER, 1UL, key->p,
65 LTC_ASN1_INTEGER, 1UL, key->q,
66 LTC_ASN1_INTEGER, 1UL, key->y,
67 LTC_ASN1_INTEGER, 1UL, key->x,
68 LTC_ASN1_EOL, 0UL, NULL);
72 unsigned long tmplen = (unsigned long)(mp_count_bits(key->y) / 8) + 8;
73 unsigned char* tmp = XMALLOC(tmplen);
74 ltc_asn1_list int_list[3];
80 err = der_encode_integer(key->y, tmp, &tmplen);
81 if (err != CRYPT_OK) {
85 LTC_SET_ASN1(int_list, 0, LTC_ASN1_INTEGER, key->p, 1UL);
86 LTC_SET_ASN1(int_list, 1, LTC_ASN1_INTEGER, key->q, 1UL);
87 LTC_SET_ASN1(int_list, 2, LTC_ASN1_INTEGER, key->g, 1UL);
89 err = der_encode_subject_public_key_info(out, outlen, PKA_DSA, tmp,
90 tmplen, LTC_ASN1_SEQUENCE, int_list,
91 sizeof(int_list) / sizeof(int_list[0]));
98 unsigned char flags[1];
100 return der_encode_sequence_multi(out, outlen,
101 LTC_ASN1_BIT_STRING, 1UL, flags,
102 LTC_ASN1_INTEGER, 1UL, key->g,
103 LTC_ASN1_INTEGER, 1UL, key->p,
104 LTC_ASN1_INTEGER, 1UL, key->q,
105 LTC_ASN1_INTEGER, 1UL, key->y,
106 LTC_ASN1_EOL, 0UL, NULL);
114 /* ref: $Format:%D$ */
115 /* git commit: $Format:%H$ */
116 /* commit time: $Format:%ai$ */