1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
2 *
3 * LibTomCrypt is a library that provides various cryptographic
4 * algorithms in a highly modular and flexible manner.
5 *
6 * The library is free for all purposes without any express
7 * guarantee it works.
8 */
9 #include "tomcrypt.h"
10
11 /**
12 @file dsa_export.c
13 DSA implementation, export key, Tom St Denis
14 */
15
16 #ifdef LTC_MDSA
17
18 /**
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
25 */
dsa_export(unsigned char * out,unsigned long * outlen,int type,dsa_key * key)26 int dsa_export(unsigned char *out, unsigned long *outlen, int type, dsa_key *key)
27 {
28 unsigned long zero=0;
29 int err, std;
30
31 LTC_ARGCHK(out != NULL);
32 LTC_ARGCHK(outlen != NULL);
33 LTC_ARGCHK(key != NULL);
34
35 std = type & PK_STD;
36 type &= ~PK_STD;
37
38 /* can we store the static header? */
39 if (type == PK_PRIVATE && key->type != PK_PRIVATE) {
40 return CRYPT_PK_TYPE_MISMATCH;
41 }
42
43 if (type != PK_PUBLIC && type != PK_PRIVATE) {
44 return CRYPT_INVALID_ARG;
45 }
46
47 if (type == PK_PRIVATE) {
48 if (std) {
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);
57 }
58 else {
59 unsigned char flags[1];
60 flags[0] = 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);
69 }
70 } else {
71 if (std) {
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];
75
76 if (tmp == NULL) {
77 return CRYPT_MEM;
78 }
79
80 err = der_encode_integer(key->y, tmp, &tmplen);
81 if (err != CRYPT_OK) {
82 goto error;
83 }
84
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);
88
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]));
92
93 error:
94 XFREE(tmp);
95 return err;
96 }
97 else {
98 unsigned char flags[1];
99 flags[0] = 0;
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);
107 }
108 }
109 }
110
111 #endif
112
113
114 /* ref: HEAD -> master, tag: v1.18.2 */
115 /* git commit: 7e7eb695d581782f04b24dc444cbfde86af59853 */
116 /* commit time: 2018-07-01 22:49:01 +0200 */
117