xref: /dragonfly/crypto/libressl/crypto/gost/gost_asn1.c (revision f5b1c8a1e6dbe9333aed363dba27c2ff58be6174)
1 /**********************************************************************
2  *                          gost_keytrans.c                           *
3  *             Copyright (c) 2005-2006 Cryptocom LTD                  *
4  *         This file is distributed under the same license as OpenSSL *
5  *                                                                    *
6  *   ASN1 structure definition for GOST key transport                 *
7  *          Requires OpenSSL 0.9.9 for compilation                    *
8  **********************************************************************/
9 
10 #include <openssl/opensslconf.h>
11 
12 #ifndef OPENSSL_NO_GOST
13 #include <openssl/asn1t.h>
14 #include <openssl/x509.h>
15 #include <openssl/gost.h>
16 
17 #include "gost_locl.h"
18 #include "gost_asn1.h"
19 
20 static const ASN1_TEMPLATE GOST_KEY_TRANSPORT_seq_tt[] = {
21           {
22                     .flags = 0,
23                     .tag = 0,
24                     .offset = offsetof(GOST_KEY_TRANSPORT, key_info),
25                     .field_name = "key_info",
26                     .item = &GOST_KEY_INFO_it,
27           },
28           {
29                     .flags = ASN1_TFLG_IMPLICIT,
30                     .tag = 0,
31                     .offset = offsetof(GOST_KEY_TRANSPORT, key_agreement_info),
32                     .field_name = "key_agreement_info",
33                     .item = &GOST_KEY_AGREEMENT_INFO_it,
34           },
35 };
36 
37 const ASN1_ITEM GOST_KEY_TRANSPORT_it = {
38           .itype = ASN1_ITYPE_NDEF_SEQUENCE,
39           .utype = V_ASN1_SEQUENCE,
40           .templates = GOST_KEY_TRANSPORT_seq_tt,
41           .tcount = sizeof(GOST_KEY_TRANSPORT_seq_tt) / sizeof(ASN1_TEMPLATE),
42           .funcs = NULL,
43           .size = sizeof(GOST_KEY_TRANSPORT),
44           .sname = "GOST_KEY_TRANSPORT",
45 };
46 
47 GOST_KEY_TRANSPORT *
d2i_GOST_KEY_TRANSPORT(GOST_KEY_TRANSPORT ** a,const unsigned char ** in,long len)48 d2i_GOST_KEY_TRANSPORT(GOST_KEY_TRANSPORT **a, const unsigned char **in, long len)
49 {
50           return (GOST_KEY_TRANSPORT *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
51               &GOST_KEY_TRANSPORT_it);
52 }
53 
54 int
i2d_GOST_KEY_TRANSPORT(GOST_KEY_TRANSPORT * a,unsigned char ** out)55 i2d_GOST_KEY_TRANSPORT(GOST_KEY_TRANSPORT *a, unsigned char **out)
56 {
57           return ASN1_item_i2d((ASN1_VALUE *)a, out, &GOST_KEY_TRANSPORT_it);
58 }
59 
60 GOST_KEY_TRANSPORT *
GOST_KEY_TRANSPORT_new(void)61 GOST_KEY_TRANSPORT_new(void)
62 {
63           return (GOST_KEY_TRANSPORT *)ASN1_item_new(&GOST_KEY_TRANSPORT_it);
64 }
65 
66 void
GOST_KEY_TRANSPORT_free(GOST_KEY_TRANSPORT * a)67 GOST_KEY_TRANSPORT_free(GOST_KEY_TRANSPORT *a)
68 {
69           ASN1_item_free((ASN1_VALUE *)a, &GOST_KEY_TRANSPORT_it);
70 }
71 
72 static const ASN1_TEMPLATE GOST_KEY_INFO_seq_tt[] = {
73           {
74                     .flags = 0,
75                     .tag = 0,
76                     .offset = offsetof(GOST_KEY_INFO, encrypted_key),
77                     .field_name = "encrypted_key",
78                     .item = &ASN1_OCTET_STRING_it,
79           },
80           {
81                     .flags = 0,
82                     .tag = 0,
83                     .offset = offsetof(GOST_KEY_INFO, imit),
84                     .field_name = "imit",
85                     .item = &ASN1_OCTET_STRING_it,
86           },
87 };
88 
89 const ASN1_ITEM GOST_KEY_INFO_it = {
90           .itype = ASN1_ITYPE_NDEF_SEQUENCE,
91           .utype = V_ASN1_SEQUENCE,
92           .templates = GOST_KEY_INFO_seq_tt,
93           .tcount = sizeof(GOST_KEY_INFO_seq_tt) / sizeof(ASN1_TEMPLATE),
94           .funcs = NULL,
95           .size = sizeof(GOST_KEY_INFO),
96           .sname = "GOST_KEY_INFO",
97 };
98 
99 GOST_KEY_INFO *
d2i_GOST_KEY_INFO(GOST_KEY_INFO ** a,const unsigned char ** in,long len)100 d2i_GOST_KEY_INFO(GOST_KEY_INFO **a, const unsigned char **in, long len)
101 {
102           return (GOST_KEY_INFO *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
103               &GOST_KEY_INFO_it);
104 }
105 
106 int
i2d_GOST_KEY_INFO(GOST_KEY_INFO * a,unsigned char ** out)107 i2d_GOST_KEY_INFO(GOST_KEY_INFO *a, unsigned char **out)
108 {
109           return ASN1_item_i2d((ASN1_VALUE *)a, out, &GOST_KEY_INFO_it);
110 }
111 
112 GOST_KEY_INFO *
GOST_KEY_INFO_new(void)113 GOST_KEY_INFO_new(void)
114 {
115           return (GOST_KEY_INFO *)ASN1_item_new(&GOST_KEY_INFO_it);
116 }
117 
118 void
GOST_KEY_INFO_free(GOST_KEY_INFO * a)119 GOST_KEY_INFO_free(GOST_KEY_INFO *a)
120 {
121           ASN1_item_free((ASN1_VALUE *)a, &GOST_KEY_INFO_it);
122 }
123 
124 static const ASN1_TEMPLATE GOST_KEY_AGREEMENT_INFO_seq_tt[] = {
125           {
126                     .flags = 0,
127                     .tag = 0,
128                     .offset = offsetof(GOST_KEY_AGREEMENT_INFO, cipher),
129                     .field_name = "cipher",
130                     .item = &ASN1_OBJECT_it,
131           },
132           {
133                     .flags = ASN1_TFLG_IMPLICIT | ASN1_TFLG_OPTIONAL,
134                     .tag = 0,
135                     .offset = offsetof(GOST_KEY_AGREEMENT_INFO, ephem_key),
136                     .field_name = "ephem_key",
137                     .item = &X509_PUBKEY_it,
138           },
139           {
140                     .flags = 0,
141                     .tag = 0,
142                     .offset = offsetof(GOST_KEY_AGREEMENT_INFO, eph_iv),
143                     .field_name = "eph_iv",
144                     .item = &ASN1_OCTET_STRING_it,
145           },
146 };
147 
148 const ASN1_ITEM GOST_KEY_AGREEMENT_INFO_it = {
149           .itype = ASN1_ITYPE_NDEF_SEQUENCE,
150           .utype = V_ASN1_SEQUENCE,
151           .templates = GOST_KEY_AGREEMENT_INFO_seq_tt,
152           .tcount = sizeof(GOST_KEY_AGREEMENT_INFO_seq_tt) / sizeof(ASN1_TEMPLATE),
153           .funcs = NULL,
154           .size = sizeof(GOST_KEY_AGREEMENT_INFO),
155           .sname = "GOST_KEY_AGREEMENT_INFO",
156 };
157 
158 GOST_KEY_AGREEMENT_INFO *
d2i_GOST_KEY_AGREEMENT_INFO(GOST_KEY_AGREEMENT_INFO ** a,const unsigned char ** in,long len)159 d2i_GOST_KEY_AGREEMENT_INFO(GOST_KEY_AGREEMENT_INFO **a, const unsigned char **in, long len)
160 {
161           return (GOST_KEY_AGREEMENT_INFO *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
162               &GOST_KEY_AGREEMENT_INFO_it);
163 }
164 
165 int
i2d_GOST_KEY_AGREEMENT_INFO(GOST_KEY_AGREEMENT_INFO * a,unsigned char ** out)166 i2d_GOST_KEY_AGREEMENT_INFO(GOST_KEY_AGREEMENT_INFO *a, unsigned char **out)
167 {
168           return ASN1_item_i2d((ASN1_VALUE *)a, out, &GOST_KEY_AGREEMENT_INFO_it);
169 }
170 
171 GOST_KEY_AGREEMENT_INFO *
GOST_KEY_AGREEMENT_INFO_new(void)172 GOST_KEY_AGREEMENT_INFO_new(void)
173 {
174           return (GOST_KEY_AGREEMENT_INFO *)ASN1_item_new(&GOST_KEY_AGREEMENT_INFO_it);
175 }
176 
177 void
GOST_KEY_AGREEMENT_INFO_free(GOST_KEY_AGREEMENT_INFO * a)178 GOST_KEY_AGREEMENT_INFO_free(GOST_KEY_AGREEMENT_INFO *a)
179 {
180           ASN1_item_free((ASN1_VALUE *)a, &GOST_KEY_AGREEMENT_INFO_it);
181 }
182 
183 
184 static const ASN1_TEMPLATE GOST_KEY_PARAMS_seq_tt[] = {
185           {
186                     .flags = 0,
187                     .tag = 0,
188                     .offset = offsetof(GOST_KEY_PARAMS, key_params),
189                     .field_name = "key_params",
190                     .item = &ASN1_OBJECT_it,
191           },
192           {
193                     .flags = 0,
194                     .tag = 0,
195                     .offset = offsetof(GOST_KEY_PARAMS, hash_params),
196                     .field_name = "hash_params",
197                     .item = &ASN1_OBJECT_it,
198           },
199           {
200                     .flags = ASN1_TFLG_OPTIONAL,
201                     .tag = 0,
202                     .offset = offsetof(GOST_KEY_PARAMS, cipher_params),
203                     .field_name = "cipher_params",
204                     .item = &ASN1_OBJECT_it,
205           },
206 };
207 
208 const ASN1_ITEM GOST_KEY_PARAMS_it = {
209           .itype = ASN1_ITYPE_NDEF_SEQUENCE,
210           .utype = V_ASN1_SEQUENCE,
211           .templates = GOST_KEY_PARAMS_seq_tt,
212           .tcount = sizeof(GOST_KEY_PARAMS_seq_tt) / sizeof(ASN1_TEMPLATE),
213           .funcs = NULL,
214           .size = sizeof(GOST_KEY_PARAMS),
215           .sname = "GOST_KEY_PARAMS",
216 };
217 
218 GOST_KEY_PARAMS *
d2i_GOST_KEY_PARAMS(GOST_KEY_PARAMS ** a,const unsigned char ** in,long len)219 d2i_GOST_KEY_PARAMS(GOST_KEY_PARAMS **a, const unsigned char **in, long len)
220 {
221           return (GOST_KEY_PARAMS *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
222               &GOST_KEY_PARAMS_it);
223 }
224 
225 int
i2d_GOST_KEY_PARAMS(GOST_KEY_PARAMS * a,unsigned char ** out)226 i2d_GOST_KEY_PARAMS(GOST_KEY_PARAMS *a, unsigned char **out)
227 {
228           return ASN1_item_i2d((ASN1_VALUE *)a, out, &GOST_KEY_PARAMS_it);
229 }
230 
231 GOST_KEY_PARAMS *
GOST_KEY_PARAMS_new(void)232 GOST_KEY_PARAMS_new(void)
233 {
234           return (GOST_KEY_PARAMS *)ASN1_item_new(&GOST_KEY_PARAMS_it);
235 }
236 
237 void
GOST_KEY_PARAMS_free(GOST_KEY_PARAMS * a)238 GOST_KEY_PARAMS_free(GOST_KEY_PARAMS *a)
239 {
240           ASN1_item_free((ASN1_VALUE *)a, &GOST_KEY_PARAMS_it);
241 }
242 
243 static const ASN1_TEMPLATE GOST_CIPHER_PARAMS_seq_tt[] = {
244           {
245                     .flags = 0,
246                     .tag = 0,
247                     .offset = offsetof(GOST_CIPHER_PARAMS, iv),
248                     .field_name = "iv",
249                     .item = &ASN1_OCTET_STRING_it,
250           },
251           {
252                     .flags = 0,
253                     .tag = 0,
254                     .offset = offsetof(GOST_CIPHER_PARAMS, enc_param_set),
255                     .field_name = "enc_param_set",
256                     .item = &ASN1_OBJECT_it,
257           },
258 };
259 
260 const ASN1_ITEM GOST_CIPHER_PARAMS_it = {
261           .itype = ASN1_ITYPE_NDEF_SEQUENCE,
262           .utype = V_ASN1_SEQUENCE,
263           .templates = GOST_CIPHER_PARAMS_seq_tt,
264           .tcount = sizeof(GOST_CIPHER_PARAMS_seq_tt) / sizeof(ASN1_TEMPLATE),
265           .funcs = NULL,
266           .size = sizeof(GOST_CIPHER_PARAMS),
267           .sname = "GOST_CIPHER_PARAMS",
268 };
269 
270 GOST_CIPHER_PARAMS *
d2i_GOST_CIPHER_PARAMS(GOST_CIPHER_PARAMS ** a,const unsigned char ** in,long len)271 d2i_GOST_CIPHER_PARAMS(GOST_CIPHER_PARAMS **a, const unsigned char **in, long len)
272 {
273           return (GOST_CIPHER_PARAMS *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
274               &GOST_CIPHER_PARAMS_it);
275 }
276 
277 int
i2d_GOST_CIPHER_PARAMS(GOST_CIPHER_PARAMS * a,unsigned char ** out)278 i2d_GOST_CIPHER_PARAMS(GOST_CIPHER_PARAMS *a, unsigned char **out)
279 {
280           return ASN1_item_i2d((ASN1_VALUE *)a, out, &GOST_CIPHER_PARAMS_it);
281 }
282 
283 GOST_CIPHER_PARAMS *
GOST_CIPHER_PARAMS_new(void)284 GOST_CIPHER_PARAMS_new(void)
285 {
286           return (GOST_CIPHER_PARAMS *)ASN1_item_new(&GOST_CIPHER_PARAMS_it);
287 }
288 
289 void
GOST_CIPHER_PARAMS_free(GOST_CIPHER_PARAMS * a)290 GOST_CIPHER_PARAMS_free(GOST_CIPHER_PARAMS *a)
291 {
292           ASN1_item_free((ASN1_VALUE *)a, &GOST_CIPHER_PARAMS_it);
293 }
294 
295 #endif
296