motion-openssl 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +53 -0
  3. data/lib/OpenSSL/aes.h +149 -0
  4. data/lib/OpenSSL/asn1.h +1419 -0
  5. data/lib/OpenSSL/asn1_mac.h +579 -0
  6. data/lib/OpenSSL/asn1t.h +973 -0
  7. data/lib/OpenSSL/bio.h +879 -0
  8. data/lib/OpenSSL/blowfish.h +130 -0
  9. data/lib/OpenSSL/bn.h +939 -0
  10. data/lib/OpenSSL/buffer.h +125 -0
  11. data/lib/OpenSSL/camellia.h +132 -0
  12. data/lib/OpenSSL/cast.h +107 -0
  13. data/lib/OpenSSL/cmac.h +82 -0
  14. data/lib/OpenSSL/cms.h +555 -0
  15. data/lib/OpenSSL/comp.h +79 -0
  16. data/lib/OpenSSL/conf.h +267 -0
  17. data/lib/OpenSSL/conf_api.h +89 -0
  18. data/lib/OpenSSL/crypto.h +661 -0
  19. data/lib/OpenSSL/des.h +257 -0
  20. data/lib/OpenSSL/des_old.h +497 -0
  21. data/lib/OpenSSL/dh.h +392 -0
  22. data/lib/OpenSSL/dsa.h +332 -0
  23. data/lib/OpenSSL/dso.h +451 -0
  24. data/lib/OpenSSL/dtls1.h +272 -0
  25. data/lib/OpenSSL/e_os2.h +328 -0
  26. data/lib/OpenSSL/ebcdic.h +26 -0
  27. data/lib/OpenSSL/ec.h +1282 -0
  28. data/lib/OpenSSL/ecdh.h +134 -0
  29. data/lib/OpenSSL/ecdsa.h +335 -0
  30. data/lib/OpenSSL/engine.h +960 -0
  31. data/lib/OpenSSL/err.h +389 -0
  32. data/lib/OpenSSL/evp.h +1534 -0
  33. data/lib/OpenSSL/hmac.h +109 -0
  34. data/lib/OpenSSL/idea.h +105 -0
  35. data/lib/OpenSSL/krb5_asn.h +240 -0
  36. data/lib/OpenSSL/kssl.h +197 -0
  37. data/lib/OpenSSL/lhash.h +240 -0
  38. data/lib/OpenSSL/libcrypto-tvOS.a +0 -0
  39. data/lib/OpenSSL/libcrypto.a +0 -0
  40. data/lib/OpenSSL/libssl-tvOS.a +0 -0
  41. data/lib/OpenSSL/libssl.a +0 -0
  42. data/lib/OpenSSL/md4.h +119 -0
  43. data/lib/OpenSSL/md5.h +119 -0
  44. data/lib/OpenSSL/mdc2.h +94 -0
  45. data/lib/OpenSSL/modes.h +163 -0
  46. data/lib/OpenSSL/obj_mac.h +4194 -0
  47. data/lib/OpenSSL/objects.h +1143 -0
  48. data/lib/OpenSSL/ocsp.h +637 -0
  49. data/lib/OpenSSL/opensslconf.h +262 -0
  50. data/lib/OpenSSL/opensslv.h +97 -0
  51. data/lib/OpenSSL/ossl_typ.h +211 -0
  52. data/lib/OpenSSL/pem.h +615 -0
  53. data/lib/OpenSSL/pem2.h +70 -0
  54. data/lib/OpenSSL/pkcs12.h +342 -0
  55. data/lib/OpenSSL/pkcs7.h +481 -0
  56. data/lib/OpenSSL/pqueue.h +99 -0
  57. data/lib/OpenSSL/rand.h +150 -0
  58. data/lib/OpenSSL/rc2.h +103 -0
  59. data/lib/OpenSSL/rc4.h +88 -0
  60. data/lib/OpenSSL/ripemd.h +105 -0
  61. data/lib/OpenSSL/rsa.h +664 -0
  62. data/lib/OpenSSL/safestack.h +2672 -0
  63. data/lib/OpenSSL/seed.h +149 -0
  64. data/lib/OpenSSL/sha.h +214 -0
  65. data/lib/OpenSSL/srp.h +169 -0
  66. data/lib/OpenSSL/srtp.h +147 -0
  67. data/lib/OpenSSL/ssl.h +3168 -0
  68. data/lib/OpenSSL/ssl2.h +265 -0
  69. data/lib/OpenSSL/ssl23.h +84 -0
  70. data/lib/OpenSSL/ssl3.h +774 -0
  71. data/lib/OpenSSL/stack.h +107 -0
  72. data/lib/OpenSSL/symhacks.h +516 -0
  73. data/lib/OpenSSL/tls1.h +810 -0
  74. data/lib/OpenSSL/ts.h +862 -0
  75. data/lib/OpenSSL/txt_db.h +112 -0
  76. data/lib/OpenSSL/ui.h +415 -0
  77. data/lib/OpenSSL/ui_compat.h +88 -0
  78. data/lib/OpenSSL/whrlpool.h +41 -0
  79. data/lib/OpenSSL/x509.h +1327 -0
  80. data/lib/OpenSSL/x509_vfy.h +647 -0
  81. data/lib/OpenSSL/x509v3.h +1055 -0
  82. data/lib/motion-openssl.rb +8 -0
  83. data/lib/motion-openssl/hooks.rb +8 -0
  84. data/lib/motion-openssl/hooks/openssl.rb +20 -0
  85. data/lib/motion-openssl/version.rb +5 -0
  86. data/motion/openssl.rb +1 -0
  87. data/motion/openssl/random.rb +18 -0
  88. metadata +229 -0
@@ -0,0 +1,973 @@
1
+ /* asn1t.h */
2
+ /*
3
+ * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
4
+ * 2000.
5
+ */
6
+ /* ====================================================================
7
+ * Copyright (c) 2000-2005 The OpenSSL Project. All rights reserved.
8
+ *
9
+ * Redistribution and use in source and binary forms, with or without
10
+ * modification, are permitted provided that the following conditions
11
+ * are met:
12
+ *
13
+ * 1. Redistributions of source code must retain the above copyright
14
+ * notice, this list of conditions and the following disclaimer.
15
+ *
16
+ * 2. Redistributions in binary form must reproduce the above copyright
17
+ * notice, this list of conditions and the following disclaimer in
18
+ * the documentation and/or other materials provided with the
19
+ * distribution.
20
+ *
21
+ * 3. All advertising materials mentioning features or use of this
22
+ * software must display the following acknowledgment:
23
+ * "This product includes software developed by the OpenSSL Project
24
+ * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
25
+ *
26
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
27
+ * endorse or promote products derived from this software without
28
+ * prior written permission. For written permission, please contact
29
+ * licensing@OpenSSL.org.
30
+ *
31
+ * 5. Products derived from this software may not be called "OpenSSL"
32
+ * nor may "OpenSSL" appear in their names without prior written
33
+ * permission of the OpenSSL Project.
34
+ *
35
+ * 6. Redistributions of any form whatsoever must retain the following
36
+ * acknowledgment:
37
+ * "This product includes software developed by the OpenSSL Project
38
+ * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
39
+ *
40
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
41
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
43
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
44
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
46
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
49
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
50
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
51
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
52
+ * ====================================================================
53
+ *
54
+ * This product includes cryptographic software written by Eric Young
55
+ * (eay@cryptsoft.com). This product includes software written by Tim
56
+ * Hudson (tjh@cryptsoft.com).
57
+ *
58
+ */
59
+ #ifndef HEADER_ASN1T_H
60
+ # define HEADER_ASN1T_H
61
+
62
+ # include <stddef.h>
63
+ # include <openssl/e_os2.h>
64
+ # include <openssl/asn1.h>
65
+
66
+ # ifdef OPENSSL_BUILD_SHLIBCRYPTO
67
+ # undef OPENSSL_EXTERN
68
+ # define OPENSSL_EXTERN OPENSSL_EXPORT
69
+ # endif
70
+
71
+ /* ASN1 template defines, structures and functions */
72
+
73
+ #ifdef __cplusplus
74
+ extern "C" {
75
+ #endif
76
+
77
+ # ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
78
+
79
+ /* Macro to obtain ASN1_ADB pointer from a type (only used internally) */
80
+ # define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr))
81
+
82
+ /* Macros for start and end of ASN1_ITEM definition */
83
+
84
+ # define ASN1_ITEM_start(itname) \
85
+ OPENSSL_GLOBAL const ASN1_ITEM itname##_it = {
86
+
87
+ # define ASN1_ITEM_end(itname) \
88
+ };
89
+
90
+ # else
91
+
92
+ /* Macro to obtain ASN1_ADB pointer from a type (only used internally) */
93
+ # define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr()))
94
+
95
+ /* Macros for start and end of ASN1_ITEM definition */
96
+
97
+ # define ASN1_ITEM_start(itname) \
98
+ const ASN1_ITEM * itname##_it(void) \
99
+ { \
100
+ static const ASN1_ITEM local_it = {
101
+
102
+ # define ASN1_ITEM_end(itname) \
103
+ }; \
104
+ return &local_it; \
105
+ }
106
+
107
+ # endif
108
+
109
+ /* Macros to aid ASN1 template writing */
110
+
111
+ # define ASN1_ITEM_TEMPLATE(tname) \
112
+ static const ASN1_TEMPLATE tname##_item_tt
113
+
114
+ # define ASN1_ITEM_TEMPLATE_END(tname) \
115
+ ;\
116
+ ASN1_ITEM_start(tname) \
117
+ ASN1_ITYPE_PRIMITIVE,\
118
+ -1,\
119
+ &tname##_item_tt,\
120
+ 0,\
121
+ NULL,\
122
+ 0,\
123
+ #tname \
124
+ ASN1_ITEM_end(tname)
125
+
126
+ /* This is a ASN1 type which just embeds a template */
127
+
128
+ /*-
129
+ * This pair helps declare a SEQUENCE. We can do:
130
+ *
131
+ * ASN1_SEQUENCE(stname) = {
132
+ * ... SEQUENCE components ...
133
+ * } ASN1_SEQUENCE_END(stname)
134
+ *
135
+ * This will produce an ASN1_ITEM called stname_it
136
+ * for a structure called stname.
137
+ *
138
+ * If you want the same structure but a different
139
+ * name then use:
140
+ *
141
+ * ASN1_SEQUENCE(itname) = {
142
+ * ... SEQUENCE components ...
143
+ * } ASN1_SEQUENCE_END_name(stname, itname)
144
+ *
145
+ * This will create an item called itname_it using
146
+ * a structure called stname.
147
+ */
148
+
149
+ # define ASN1_SEQUENCE(tname) \
150
+ static const ASN1_TEMPLATE tname##_seq_tt[]
151
+
152
+ # define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname)
153
+
154
+ # define ASN1_SEQUENCE_END_name(stname, tname) \
155
+ ;\
156
+ ASN1_ITEM_start(tname) \
157
+ ASN1_ITYPE_SEQUENCE,\
158
+ V_ASN1_SEQUENCE,\
159
+ tname##_seq_tt,\
160
+ sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\
161
+ NULL,\
162
+ sizeof(stname),\
163
+ #stname \
164
+ ASN1_ITEM_end(tname)
165
+
166
+ # define ASN1_NDEF_SEQUENCE(tname) \
167
+ ASN1_SEQUENCE(tname)
168
+
169
+ # define ASN1_NDEF_SEQUENCE_cb(tname, cb) \
170
+ ASN1_SEQUENCE_cb(tname, cb)
171
+
172
+ # define ASN1_SEQUENCE_cb(tname, cb) \
173
+ static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \
174
+ ASN1_SEQUENCE(tname)
175
+
176
+ # define ASN1_BROKEN_SEQUENCE(tname) \
177
+ static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_BROKEN, 0, 0, 0, 0}; \
178
+ ASN1_SEQUENCE(tname)
179
+
180
+ # define ASN1_SEQUENCE_ref(tname, cb, lck) \
181
+ static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), lck, cb, 0}; \
182
+ ASN1_SEQUENCE(tname)
183
+
184
+ # define ASN1_SEQUENCE_enc(tname, enc, cb) \
185
+ static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_ENCODING, 0, 0, cb, offsetof(tname, enc)}; \
186
+ ASN1_SEQUENCE(tname)
187
+
188
+ # define ASN1_NDEF_SEQUENCE_END(tname) \
189
+ ;\
190
+ ASN1_ITEM_start(tname) \
191
+ ASN1_ITYPE_NDEF_SEQUENCE,\
192
+ V_ASN1_SEQUENCE,\
193
+ tname##_seq_tt,\
194
+ sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\
195
+ NULL,\
196
+ sizeof(tname),\
197
+ #tname \
198
+ ASN1_ITEM_end(tname)
199
+
200
+ # define ASN1_BROKEN_SEQUENCE_END(stname) ASN1_SEQUENCE_END_ref(stname, stname)
201
+
202
+ # define ASN1_SEQUENCE_END_enc(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname)
203
+
204
+ # define ASN1_SEQUENCE_END_cb(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname)
205
+
206
+ # define ASN1_SEQUENCE_END_ref(stname, tname) \
207
+ ;\
208
+ ASN1_ITEM_start(tname) \
209
+ ASN1_ITYPE_SEQUENCE,\
210
+ V_ASN1_SEQUENCE,\
211
+ tname##_seq_tt,\
212
+ sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\
213
+ &tname##_aux,\
214
+ sizeof(stname),\
215
+ #stname \
216
+ ASN1_ITEM_end(tname)
217
+
218
+ # define ASN1_NDEF_SEQUENCE_END_cb(stname, tname) \
219
+ ;\
220
+ ASN1_ITEM_start(tname) \
221
+ ASN1_ITYPE_NDEF_SEQUENCE,\
222
+ V_ASN1_SEQUENCE,\
223
+ tname##_seq_tt,\
224
+ sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\
225
+ &tname##_aux,\
226
+ sizeof(stname),\
227
+ #stname \
228
+ ASN1_ITEM_end(tname)
229
+
230
+ /*-
231
+ * This pair helps declare a CHOICE type. We can do:
232
+ *
233
+ * ASN1_CHOICE(chname) = {
234
+ * ... CHOICE options ...
235
+ * ASN1_CHOICE_END(chname)
236
+ *
237
+ * This will produce an ASN1_ITEM called chname_it
238
+ * for a structure called chname. The structure
239
+ * definition must look like this:
240
+ * typedef struct {
241
+ * int type;
242
+ * union {
243
+ * ASN1_SOMETHING *opt1;
244
+ * ASN1_SOMEOTHER *opt2;
245
+ * } value;
246
+ * } chname;
247
+ *
248
+ * the name of the selector must be 'type'.
249
+ * to use an alternative selector name use the
250
+ * ASN1_CHOICE_END_selector() version.
251
+ */
252
+
253
+ # define ASN1_CHOICE(tname) \
254
+ static const ASN1_TEMPLATE tname##_ch_tt[]
255
+
256
+ # define ASN1_CHOICE_cb(tname, cb) \
257
+ static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \
258
+ ASN1_CHOICE(tname)
259
+
260
+ # define ASN1_CHOICE_END(stname) ASN1_CHOICE_END_name(stname, stname)
261
+
262
+ # define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type)
263
+
264
+ # define ASN1_CHOICE_END_selector(stname, tname, selname) \
265
+ ;\
266
+ ASN1_ITEM_start(tname) \
267
+ ASN1_ITYPE_CHOICE,\
268
+ offsetof(stname,selname) ,\
269
+ tname##_ch_tt,\
270
+ sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\
271
+ NULL,\
272
+ sizeof(stname),\
273
+ #stname \
274
+ ASN1_ITEM_end(tname)
275
+
276
+ # define ASN1_CHOICE_END_cb(stname, tname, selname) \
277
+ ;\
278
+ ASN1_ITEM_start(tname) \
279
+ ASN1_ITYPE_CHOICE,\
280
+ offsetof(stname,selname) ,\
281
+ tname##_ch_tt,\
282
+ sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\
283
+ &tname##_aux,\
284
+ sizeof(stname),\
285
+ #stname \
286
+ ASN1_ITEM_end(tname)
287
+
288
+ /* This helps with the template wrapper form of ASN1_ITEM */
289
+
290
+ # define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type) { \
291
+ (flags), (tag), 0,\
292
+ #name, ASN1_ITEM_ref(type) }
293
+
294
+ /* These help with SEQUENCE or CHOICE components */
295
+
296
+ /* used to declare other types */
297
+
298
+ # define ASN1_EX_TYPE(flags, tag, stname, field, type) { \
299
+ (flags), (tag), offsetof(stname, field),\
300
+ #field, ASN1_ITEM_ref(type) }
301
+
302
+ /* used when the structure is combined with the parent */
303
+
304
+ # define ASN1_EX_COMBINE(flags, tag, type) { \
305
+ (flags)|ASN1_TFLG_COMBINE, (tag), 0, NULL, ASN1_ITEM_ref(type) }
306
+
307
+ /* implicit and explicit helper macros */
308
+
309
+ # define ASN1_IMP_EX(stname, field, type, tag, ex) \
310
+ ASN1_EX_TYPE(ASN1_TFLG_IMPLICIT | ex, tag, stname, field, type)
311
+
312
+ # define ASN1_EXP_EX(stname, field, type, tag, ex) \
313
+ ASN1_EX_TYPE(ASN1_TFLG_EXPLICIT | ex, tag, stname, field, type)
314
+
315
+ /* Any defined by macros: the field used is in the table itself */
316
+
317
+ # ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
318
+ # define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) }
319
+ # define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) }
320
+ # else
321
+ # define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, tblname##_adb }
322
+ # define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, tblname##_adb }
323
+ # endif
324
+ /* Plain simple type */
325
+ # define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0,0, stname, field, type)
326
+
327
+ /* OPTIONAL simple type */
328
+ # define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type)
329
+
330
+ /* IMPLICIT tagged simple type */
331
+ # define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0)
332
+
333
+ /* IMPLICIT tagged OPTIONAL simple type */
334
+ # define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL)
335
+
336
+ /* Same as above but EXPLICIT */
337
+
338
+ # define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0)
339
+ # define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL)
340
+
341
+ /* SEQUENCE OF type */
342
+ # define ASN1_SEQUENCE_OF(stname, field, type) \
343
+ ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, stname, field, type)
344
+
345
+ /* OPTIONAL SEQUENCE OF */
346
+ # define ASN1_SEQUENCE_OF_OPT(stname, field, type) \
347
+ ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type)
348
+
349
+ /* Same as above but for SET OF */
350
+
351
+ # define ASN1_SET_OF(stname, field, type) \
352
+ ASN1_EX_TYPE(ASN1_TFLG_SET_OF, 0, stname, field, type)
353
+
354
+ # define ASN1_SET_OF_OPT(stname, field, type) \
355
+ ASN1_EX_TYPE(ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type)
356
+
357
+ /* Finally compound types of SEQUENCE, SET, IMPLICIT, EXPLICIT and OPTIONAL */
358
+
359
+ # define ASN1_IMP_SET_OF(stname, field, type, tag) \
360
+ ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF)
361
+
362
+ # define ASN1_EXP_SET_OF(stname, field, type, tag) \
363
+ ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF)
364
+
365
+ # define ASN1_IMP_SET_OF_OPT(stname, field, type, tag) \
366
+ ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL)
367
+
368
+ # define ASN1_EXP_SET_OF_OPT(stname, field, type, tag) \
369
+ ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL)
370
+
371
+ # define ASN1_IMP_SEQUENCE_OF(stname, field, type, tag) \
372
+ ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF)
373
+
374
+ # define ASN1_IMP_SEQUENCE_OF_OPT(stname, field, type, tag) \
375
+ ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL)
376
+
377
+ # define ASN1_EXP_SEQUENCE_OF(stname, field, type, tag) \
378
+ ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF)
379
+
380
+ # define ASN1_EXP_SEQUENCE_OF_OPT(stname, field, type, tag) \
381
+ ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL)
382
+
383
+ /* EXPLICIT using indefinite length constructed form */
384
+ # define ASN1_NDEF_EXP(stname, field, type, tag) \
385
+ ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_NDEF)
386
+
387
+ /* EXPLICIT OPTIONAL using indefinite length constructed form */
388
+ # define ASN1_NDEF_EXP_OPT(stname, field, type, tag) \
389
+ ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_NDEF)
390
+
391
+ /* Macros for the ASN1_ADB structure */
392
+
393
+ # define ASN1_ADB(name) \
394
+ static const ASN1_ADB_TABLE name##_adbtbl[]
395
+
396
+ # ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
397
+
398
+ # define ASN1_ADB_END(name, flags, field, app_table, def, none) \
399
+ ;\
400
+ static const ASN1_ADB name##_adb = {\
401
+ flags,\
402
+ offsetof(name, field),\
403
+ app_table,\
404
+ name##_adbtbl,\
405
+ sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\
406
+ def,\
407
+ none\
408
+ }
409
+
410
+ # else
411
+
412
+ # define ASN1_ADB_END(name, flags, field, app_table, def, none) \
413
+ ;\
414
+ static const ASN1_ITEM *name##_adb(void) \
415
+ { \
416
+ static const ASN1_ADB internal_adb = \
417
+ {\
418
+ flags,\
419
+ offsetof(name, field),\
420
+ app_table,\
421
+ name##_adbtbl,\
422
+ sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\
423
+ def,\
424
+ none\
425
+ }; \
426
+ return (const ASN1_ITEM *) &internal_adb; \
427
+ } \
428
+ void dummy_function(void)
429
+
430
+ # endif
431
+
432
+ # define ADB_ENTRY(val, template) {val, template}
433
+
434
+ # define ASN1_ADB_TEMPLATE(name) \
435
+ static const ASN1_TEMPLATE name##_tt
436
+
437
+ /*
438
+ * This is the ASN1 template structure that defines a wrapper round the
439
+ * actual type. It determines the actual position of the field in the value
440
+ * structure, various flags such as OPTIONAL and the field name.
441
+ */
442
+
443
+ struct ASN1_TEMPLATE_st {
444
+ unsigned long flags; /* Various flags */
445
+ long tag; /* tag, not used if no tagging */
446
+ unsigned long offset; /* Offset of this field in structure */
447
+ # ifndef NO_ASN1_FIELD_NAMES
448
+ const char *field_name; /* Field name */
449
+ # endif
450
+ ASN1_ITEM_EXP *item; /* Relevant ASN1_ITEM or ASN1_ADB */
451
+ };
452
+
453
+ /* Macro to extract ASN1_ITEM and ASN1_ADB pointer from ASN1_TEMPLATE */
454
+
455
+ # define ASN1_TEMPLATE_item(t) (t->item_ptr)
456
+ # define ASN1_TEMPLATE_adb(t) (t->item_ptr)
457
+
458
+ typedef struct ASN1_ADB_TABLE_st ASN1_ADB_TABLE;
459
+ typedef struct ASN1_ADB_st ASN1_ADB;
460
+
461
+ struct ASN1_ADB_st {
462
+ unsigned long flags; /* Various flags */
463
+ unsigned long offset; /* Offset of selector field */
464
+ STACK_OF(ASN1_ADB_TABLE) **app_items; /* Application defined items */
465
+ const ASN1_ADB_TABLE *tbl; /* Table of possible types */
466
+ long tblcount; /* Number of entries in tbl */
467
+ const ASN1_TEMPLATE *default_tt; /* Type to use if no match */
468
+ const ASN1_TEMPLATE *null_tt; /* Type to use if selector is NULL */
469
+ };
470
+
471
+ struct ASN1_ADB_TABLE_st {
472
+ long value; /* NID for an object or value for an int */
473
+ const ASN1_TEMPLATE tt; /* item for this value */
474
+ };
475
+
476
+ /* template flags */
477
+
478
+ /* Field is optional */
479
+ # define ASN1_TFLG_OPTIONAL (0x1)
480
+
481
+ /* Field is a SET OF */
482
+ # define ASN1_TFLG_SET_OF (0x1 << 1)
483
+
484
+ /* Field is a SEQUENCE OF */
485
+ # define ASN1_TFLG_SEQUENCE_OF (0x2 << 1)
486
+
487
+ /*
488
+ * Special case: this refers to a SET OF that will be sorted into DER order
489
+ * when encoded *and* the corresponding STACK will be modified to match the
490
+ * new order.
491
+ */
492
+ # define ASN1_TFLG_SET_ORDER (0x3 << 1)
493
+
494
+ /* Mask for SET OF or SEQUENCE OF */
495
+ # define ASN1_TFLG_SK_MASK (0x3 << 1)
496
+
497
+ /*
498
+ * These flags mean the tag should be taken from the tag field. If EXPLICIT
499
+ * then the underlying type is used for the inner tag.
500
+ */
501
+
502
+ /* IMPLICIT tagging */
503
+ # define ASN1_TFLG_IMPTAG (0x1 << 3)
504
+
505
+ /* EXPLICIT tagging, inner tag from underlying type */
506
+ # define ASN1_TFLG_EXPTAG (0x2 << 3)
507
+
508
+ # define ASN1_TFLG_TAG_MASK (0x3 << 3)
509
+
510
+ /* context specific IMPLICIT */
511
+ # define ASN1_TFLG_IMPLICIT ASN1_TFLG_IMPTAG|ASN1_TFLG_CONTEXT
512
+
513
+ /* context specific EXPLICIT */
514
+ # define ASN1_TFLG_EXPLICIT ASN1_TFLG_EXPTAG|ASN1_TFLG_CONTEXT
515
+
516
+ /*
517
+ * If tagging is in force these determine the type of tag to use. Otherwise
518
+ * the tag is determined by the underlying type. These values reflect the
519
+ * actual octet format.
520
+ */
521
+
522
+ /* Universal tag */
523
+ # define ASN1_TFLG_UNIVERSAL (0x0<<6)
524
+ /* Application tag */
525
+ # define ASN1_TFLG_APPLICATION (0x1<<6)
526
+ /* Context specific tag */
527
+ # define ASN1_TFLG_CONTEXT (0x2<<6)
528
+ /* Private tag */
529
+ # define ASN1_TFLG_PRIVATE (0x3<<6)
530
+
531
+ # define ASN1_TFLG_TAG_CLASS (0x3<<6)
532
+
533
+ /*
534
+ * These are for ANY DEFINED BY type. In this case the 'item' field points to
535
+ * an ASN1_ADB structure which contains a table of values to decode the
536
+ * relevant type
537
+ */
538
+
539
+ # define ASN1_TFLG_ADB_MASK (0x3<<8)
540
+
541
+ # define ASN1_TFLG_ADB_OID (0x1<<8)
542
+
543
+ # define ASN1_TFLG_ADB_INT (0x1<<9)
544
+
545
+ /*
546
+ * This flag means a parent structure is passed instead of the field: this is
547
+ * useful is a SEQUENCE is being combined with a CHOICE for example. Since
548
+ * this means the structure and item name will differ we need to use the
549
+ * ASN1_CHOICE_END_name() macro for example.
550
+ */
551
+
552
+ # define ASN1_TFLG_COMBINE (0x1<<10)
553
+
554
+ /*
555
+ * This flag when present in a SEQUENCE OF, SET OF or EXPLICIT causes
556
+ * indefinite length constructed encoding to be used if required.
557
+ */
558
+
559
+ # define ASN1_TFLG_NDEF (0x1<<11)
560
+
561
+ /* This is the actual ASN1 item itself */
562
+
563
+ struct ASN1_ITEM_st {
564
+ char itype; /* The item type, primitive, SEQUENCE, CHOICE
565
+ * or extern */
566
+ long utype; /* underlying type */
567
+ const ASN1_TEMPLATE *templates; /* If SEQUENCE or CHOICE this contains
568
+ * the contents */
569
+ long tcount; /* Number of templates if SEQUENCE or CHOICE */
570
+ const void *funcs; /* functions that handle this type */
571
+ long size; /* Structure size (usually) */
572
+ # ifndef NO_ASN1_FIELD_NAMES
573
+ const char *sname; /* Structure name */
574
+ # endif
575
+ };
576
+
577
+ /*-
578
+ * These are values for the itype field and
579
+ * determine how the type is interpreted.
580
+ *
581
+ * For PRIMITIVE types the underlying type
582
+ * determines the behaviour if items is NULL.
583
+ *
584
+ * Otherwise templates must contain a single
585
+ * template and the type is treated in the
586
+ * same way as the type specified in the template.
587
+ *
588
+ * For SEQUENCE types the templates field points
589
+ * to the members, the size field is the
590
+ * structure size.
591
+ *
592
+ * For CHOICE types the templates field points
593
+ * to each possible member (typically a union)
594
+ * and the 'size' field is the offset of the
595
+ * selector.
596
+ *
597
+ * The 'funcs' field is used for application
598
+ * specific functions.
599
+ *
600
+ * For COMPAT types the funcs field gives a
601
+ * set of functions that handle this type, this
602
+ * supports the old d2i, i2d convention.
603
+ *
604
+ * The EXTERN type uses a new style d2i/i2d.
605
+ * The new style should be used where possible
606
+ * because it avoids things like the d2i IMPLICIT
607
+ * hack.
608
+ *
609
+ * MSTRING is a multiple string type, it is used
610
+ * for a CHOICE of character strings where the
611
+ * actual strings all occupy an ASN1_STRING
612
+ * structure. In this case the 'utype' field
613
+ * has a special meaning, it is used as a mask
614
+ * of acceptable types using the B_ASN1 constants.
615
+ *
616
+ * NDEF_SEQUENCE is the same as SEQUENCE except
617
+ * that it will use indefinite length constructed
618
+ * encoding if requested.
619
+ *
620
+ */
621
+
622
+ # define ASN1_ITYPE_PRIMITIVE 0x0
623
+
624
+ # define ASN1_ITYPE_SEQUENCE 0x1
625
+
626
+ # define ASN1_ITYPE_CHOICE 0x2
627
+
628
+ # define ASN1_ITYPE_COMPAT 0x3
629
+
630
+ # define ASN1_ITYPE_EXTERN 0x4
631
+
632
+ # define ASN1_ITYPE_MSTRING 0x5
633
+
634
+ # define ASN1_ITYPE_NDEF_SEQUENCE 0x6
635
+
636
+ /*
637
+ * Cache for ASN1 tag and length, so we don't keep re-reading it for things
638
+ * like CHOICE
639
+ */
640
+
641
+ struct ASN1_TLC_st {
642
+ char valid; /* Values below are valid */
643
+ int ret; /* return value */
644
+ long plen; /* length */
645
+ int ptag; /* class value */
646
+ int pclass; /* class value */
647
+ int hdrlen; /* header length */
648
+ };
649
+
650
+ /* Typedefs for ASN1 function pointers */
651
+
652
+ typedef ASN1_VALUE *ASN1_new_func(void);
653
+ typedef void ASN1_free_func(ASN1_VALUE *a);
654
+ typedef ASN1_VALUE *ASN1_d2i_func(ASN1_VALUE **a, const unsigned char **in,
655
+ long length);
656
+ typedef int ASN1_i2d_func(ASN1_VALUE *a, unsigned char **in);
657
+
658
+ typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len,
659
+ const ASN1_ITEM *it, int tag, int aclass, char opt,
660
+ ASN1_TLC *ctx);
661
+
662
+ typedef int ASN1_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
663
+ const ASN1_ITEM *it, int tag, int aclass);
664
+ typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it);
665
+ typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it);
666
+
667
+ typedef int ASN1_ex_print_func(BIO *out, ASN1_VALUE **pval,
668
+ int indent, const char *fname,
669
+ const ASN1_PCTX *pctx);
670
+
671
+ typedef int ASN1_primitive_i2c(ASN1_VALUE **pval, unsigned char *cont,
672
+ int *putype, const ASN1_ITEM *it);
673
+ typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont,
674
+ int len, int utype, char *free_cont,
675
+ const ASN1_ITEM *it);
676
+ typedef int ASN1_primitive_print(BIO *out, ASN1_VALUE **pval,
677
+ const ASN1_ITEM *it, int indent,
678
+ const ASN1_PCTX *pctx);
679
+
680
+ typedef struct ASN1_COMPAT_FUNCS_st {
681
+ ASN1_new_func *asn1_new;
682
+ ASN1_free_func *asn1_free;
683
+ ASN1_d2i_func *asn1_d2i;
684
+ ASN1_i2d_func *asn1_i2d;
685
+ } ASN1_COMPAT_FUNCS;
686
+
687
+ typedef struct ASN1_EXTERN_FUNCS_st {
688
+ void *app_data;
689
+ ASN1_ex_new_func *asn1_ex_new;
690
+ ASN1_ex_free_func *asn1_ex_free;
691
+ ASN1_ex_free_func *asn1_ex_clear;
692
+ ASN1_ex_d2i *asn1_ex_d2i;
693
+ ASN1_ex_i2d *asn1_ex_i2d;
694
+ ASN1_ex_print_func *asn1_ex_print;
695
+ } ASN1_EXTERN_FUNCS;
696
+
697
+ typedef struct ASN1_PRIMITIVE_FUNCS_st {
698
+ void *app_data;
699
+ unsigned long flags;
700
+ ASN1_ex_new_func *prim_new;
701
+ ASN1_ex_free_func *prim_free;
702
+ ASN1_ex_free_func *prim_clear;
703
+ ASN1_primitive_c2i *prim_c2i;
704
+ ASN1_primitive_i2c *prim_i2c;
705
+ ASN1_primitive_print *prim_print;
706
+ } ASN1_PRIMITIVE_FUNCS;
707
+
708
+ /*
709
+ * This is the ASN1_AUX structure: it handles various miscellaneous
710
+ * requirements. For example the use of reference counts and an informational
711
+ * callback. The "informational callback" is called at various points during
712
+ * the ASN1 encoding and decoding. It can be used to provide minor
713
+ * customisation of the structures used. This is most useful where the
714
+ * supplied routines *almost* do the right thing but need some extra help at
715
+ * a few points. If the callback returns zero then it is assumed a fatal
716
+ * error has occurred and the main operation should be abandoned. If major
717
+ * changes in the default behaviour are required then an external type is
718
+ * more appropriate.
719
+ */
720
+
721
+ typedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it,
722
+ void *exarg);
723
+
724
+ typedef struct ASN1_AUX_st {
725
+ void *app_data;
726
+ int flags;
727
+ int ref_offset; /* Offset of reference value */
728
+ int ref_lock; /* Lock type to use */
729
+ ASN1_aux_cb *asn1_cb;
730
+ int enc_offset; /* Offset of ASN1_ENCODING structure */
731
+ } ASN1_AUX;
732
+
733
+ /* For print related callbacks exarg points to this structure */
734
+ typedef struct ASN1_PRINT_ARG_st {
735
+ BIO *out;
736
+ int indent;
737
+ const ASN1_PCTX *pctx;
738
+ } ASN1_PRINT_ARG;
739
+
740
+ /* For streaming related callbacks exarg points to this structure */
741
+ typedef struct ASN1_STREAM_ARG_st {
742
+ /* BIO to stream through */
743
+ BIO *out;
744
+ /* BIO with filters appended */
745
+ BIO *ndef_bio;
746
+ /* Streaming I/O boundary */
747
+ unsigned char **boundary;
748
+ } ASN1_STREAM_ARG;
749
+
750
+ /* Flags in ASN1_AUX */
751
+
752
+ /* Use a reference count */
753
+ # define ASN1_AFLG_REFCOUNT 1
754
+ /* Save the encoding of structure (useful for signatures) */
755
+ # define ASN1_AFLG_ENCODING 2
756
+ /* The Sequence length is invalid */
757
+ # define ASN1_AFLG_BROKEN 4
758
+
759
+ /* operation values for asn1_cb */
760
+
761
+ # define ASN1_OP_NEW_PRE 0
762
+ # define ASN1_OP_NEW_POST 1
763
+ # define ASN1_OP_FREE_PRE 2
764
+ # define ASN1_OP_FREE_POST 3
765
+ # define ASN1_OP_D2I_PRE 4
766
+ # define ASN1_OP_D2I_POST 5
767
+ # define ASN1_OP_I2D_PRE 6
768
+ # define ASN1_OP_I2D_POST 7
769
+ # define ASN1_OP_PRINT_PRE 8
770
+ # define ASN1_OP_PRINT_POST 9
771
+ # define ASN1_OP_STREAM_PRE 10
772
+ # define ASN1_OP_STREAM_POST 11
773
+ # define ASN1_OP_DETACHED_PRE 12
774
+ # define ASN1_OP_DETACHED_POST 13
775
+
776
+ /* Macro to implement a primitive type */
777
+ # define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0)
778
+ # define IMPLEMENT_ASN1_TYPE_ex(itname, vname, ex) \
779
+ ASN1_ITEM_start(itname) \
780
+ ASN1_ITYPE_PRIMITIVE, V_##vname, NULL, 0, NULL, ex, #itname \
781
+ ASN1_ITEM_end(itname)
782
+
783
+ /* Macro to implement a multi string type */
784
+ # define IMPLEMENT_ASN1_MSTRING(itname, mask) \
785
+ ASN1_ITEM_start(itname) \
786
+ ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \
787
+ ASN1_ITEM_end(itname)
788
+
789
+ /* Macro to implement an ASN1_ITEM in terms of old style funcs */
790
+
791
+ # define IMPLEMENT_COMPAT_ASN1(sname) IMPLEMENT_COMPAT_ASN1_type(sname, V_ASN1_SEQUENCE)
792
+
793
+ # define IMPLEMENT_COMPAT_ASN1_type(sname, tag) \
794
+ static const ASN1_COMPAT_FUNCS sname##_ff = { \
795
+ (ASN1_new_func *)sname##_new, \
796
+ (ASN1_free_func *)sname##_free, \
797
+ (ASN1_d2i_func *)d2i_##sname, \
798
+ (ASN1_i2d_func *)i2d_##sname, \
799
+ }; \
800
+ ASN1_ITEM_start(sname) \
801
+ ASN1_ITYPE_COMPAT, \
802
+ tag, \
803
+ NULL, \
804
+ 0, \
805
+ &sname##_ff, \
806
+ 0, \
807
+ #sname \
808
+ ASN1_ITEM_end(sname)
809
+
810
+ # define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \
811
+ ASN1_ITEM_start(sname) \
812
+ ASN1_ITYPE_EXTERN, \
813
+ tag, \
814
+ NULL, \
815
+ 0, \
816
+ &fptrs, \
817
+ 0, \
818
+ #sname \
819
+ ASN1_ITEM_end(sname)
820
+
821
+ /* Macro to implement standard functions in terms of ASN1_ITEM structures */
822
+
823
+ # define IMPLEMENT_ASN1_FUNCTIONS(stname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, stname, stname)
824
+
825
+ # define IMPLEMENT_ASN1_FUNCTIONS_name(stname, itname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, itname)
826
+
827
+ # define IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name(stname, itname) \
828
+ IMPLEMENT_ASN1_FUNCTIONS_ENCODE_fname(stname, itname, itname)
829
+
830
+ # define IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(stname) \
831
+ IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(static, stname, stname, stname)
832
+
833
+ # define IMPLEMENT_ASN1_ALLOC_FUNCTIONS(stname) \
834
+ IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, stname, stname)
835
+
836
+ # define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(pre, stname, itname, fname) \
837
+ pre stname *fname##_new(void) \
838
+ { \
839
+ return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \
840
+ } \
841
+ pre void fname##_free(stname *a) \
842
+ { \
843
+ ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \
844
+ }
845
+
846
+ # define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) \
847
+ stname *fname##_new(void) \
848
+ { \
849
+ return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \
850
+ } \
851
+ void fname##_free(stname *a) \
852
+ { \
853
+ ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \
854
+ }
855
+
856
+ # define IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, fname) \
857
+ IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \
858
+ IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname)
859
+
860
+ # define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \
861
+ stname *d2i_##fname(stname **a, const unsigned char **in, long len) \
862
+ { \
863
+ return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\
864
+ } \
865
+ int i2d_##fname(stname *a, unsigned char **out) \
866
+ { \
867
+ return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\
868
+ }
869
+
870
+ # define IMPLEMENT_ASN1_NDEF_FUNCTION(stname) \
871
+ int i2d_##stname##_NDEF(stname *a, unsigned char **out) \
872
+ { \
873
+ return ASN1_item_ndef_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(stname));\
874
+ }
875
+
876
+ /*
877
+ * This includes evil casts to remove const: they will go away when full ASN1
878
+ * constification is done.
879
+ */
880
+ # define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \
881
+ stname *d2i_##fname(stname **a, const unsigned char **in, long len) \
882
+ { \
883
+ return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\
884
+ } \
885
+ int i2d_##fname(const stname *a, unsigned char **out) \
886
+ { \
887
+ return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\
888
+ }
889
+
890
+ # define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \
891
+ stname * stname##_dup(stname *x) \
892
+ { \
893
+ return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \
894
+ }
895
+
896
+ # define IMPLEMENT_ASN1_PRINT_FUNCTION(stname) \
897
+ IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, stname, stname)
898
+
899
+ # define IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, itname, fname) \
900
+ int fname##_print_ctx(BIO *out, stname *x, int indent, \
901
+ const ASN1_PCTX *pctx) \
902
+ { \
903
+ return ASN1_item_print(out, (ASN1_VALUE *)x, indent, \
904
+ ASN1_ITEM_rptr(itname), pctx); \
905
+ }
906
+
907
+ # define IMPLEMENT_ASN1_FUNCTIONS_const(name) \
908
+ IMPLEMENT_ASN1_FUNCTIONS_const_fname(name, name, name)
909
+
910
+ # define IMPLEMENT_ASN1_FUNCTIONS_const_fname(stname, itname, fname) \
911
+ IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \
912
+ IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname)
913
+
914
+ /* external definitions for primitive types */
915
+
916
+ DECLARE_ASN1_ITEM(ASN1_BOOLEAN)
917
+ DECLARE_ASN1_ITEM(ASN1_TBOOLEAN)
918
+ DECLARE_ASN1_ITEM(ASN1_FBOOLEAN)
919
+ DECLARE_ASN1_ITEM(ASN1_SEQUENCE)
920
+ DECLARE_ASN1_ITEM(CBIGNUM)
921
+ DECLARE_ASN1_ITEM(BIGNUM)
922
+ DECLARE_ASN1_ITEM(LONG)
923
+ DECLARE_ASN1_ITEM(ZLONG)
924
+
925
+ DECLARE_STACK_OF(ASN1_VALUE)
926
+
927
+ /* Functions used internally by the ASN1 code */
928
+
929
+ int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it);
930
+ void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it);
931
+ int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
932
+ int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it);
933
+
934
+ void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
935
+ int ASN1_template_d2i(ASN1_VALUE **pval, const unsigned char **in, long len,
936
+ const ASN1_TEMPLATE *tt);
937
+ int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len,
938
+ const ASN1_ITEM *it, int tag, int aclass, char opt,
939
+ ASN1_TLC *ctx);
940
+
941
+ int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
942
+ const ASN1_ITEM *it, int tag, int aclass);
943
+ int ASN1_template_i2d(ASN1_VALUE **pval, unsigned char **out,
944
+ const ASN1_TEMPLATE *tt);
945
+ void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it);
946
+
947
+ int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype,
948
+ const ASN1_ITEM *it);
949
+ int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len,
950
+ int utype, char *free_cont, const ASN1_ITEM *it);
951
+
952
+ int asn1_get_choice_selector(ASN1_VALUE **pval, const ASN1_ITEM *it);
953
+ int asn1_set_choice_selector(ASN1_VALUE **pval, int value,
954
+ const ASN1_ITEM *it);
955
+
956
+ ASN1_VALUE **asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
957
+
958
+ const ASN1_TEMPLATE *asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt,
959
+ int nullerr);
960
+
961
+ int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it);
962
+
963
+ void asn1_enc_init(ASN1_VALUE **pval, const ASN1_ITEM *it);
964
+ void asn1_enc_free(ASN1_VALUE **pval, const ASN1_ITEM *it);
965
+ int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval,
966
+ const ASN1_ITEM *it);
967
+ int asn1_enc_save(ASN1_VALUE **pval, const unsigned char *in, int inlen,
968
+ const ASN1_ITEM *it);
969
+
970
+ #ifdef __cplusplus
971
+ }
972
+ #endif
973
+ #endif