openssl_rsa_pss_verify 0.0.1

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