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