1 /* crypto/asn1/asn1.h */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young (eay@cryptsoft.com).
7  * The implementation was written so as to conform with Netscapes SSL.
8  *
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to.  The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15  *
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  *
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  *   notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *   notice, this list of conditions and the following disclaimer in the
30  *   documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  *   must display the following acknowledgement:
33  *   "This product includes cryptographic software written by
34  *    Eric Young (eay@cryptsoft.com)"
35  *   The word 'cryptographic' can be left out if the rouines from the library
36  *   being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from
38  *   the apps directory (application code) you must include an acknowledgement:
39  *   "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40  *
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  *
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58 
59 module deimos.openssl.asn1;
60 
61 import deimos.openssl._d_util;
62 
63 import deimos.openssl.asn1t; // Needed for ASN1_ITEM_st.
64 
65 import core.stdc.time;
66 public import deimos.openssl.e_os2;
67 version(OPENSSL_NO_BIO) {} else {
68 public import deimos.openssl.bio;
69 }
70 public import deimos.openssl.stack;
71 public import deimos.openssl.safestack;
72 
73 public import deimos.openssl.symhacks;
74 
75 public import deimos.openssl.ossl_typ;
76 version(OPENSSL_NO_DEPRECATED) {} else {
77 public import deimos.openssl.bn;
78 }
79 
80 
81 extern (C):
82 nothrow:
83 
84 enum V_ASN1_UNIVERSAL = 0x00;
85 enum V_ASN1_APPLICATION = 0x40;
86 enum V_ASN1_CONTEXT_SPECIFIC = 0x80;
87 enum V_ASN1_PRIVATE = 0xc0;
88 
89 enum V_ASN1_CONSTRUCTED = 0x20;
90 enum V_ASN1_PRIMITIVE_TAG = 0x1f;
91 enum V_ASN1_PRIMATIVE_TAG = 0x1f;
92 
93 enum V_ASN1_APP_CHOOSE = -2;	/* let the recipient choose */
94 enum V_ASN1_OTHER = -3;	/* used in ASN1_TYPE */
95 enum V_ASN1_ANY = -4;	/* used in ASN1 template code */
96 
97 enum V_ASN1_NEG = 0x100;	/* negative flag */
98 
99 enum V_ASN1_UNDEF = -1;
100 enum V_ASN1_EOC = 0;
101 enum V_ASN1_BOOLEAN = 1;	/**/
102 enum V_ASN1_INTEGER = 2;
103 enum V_ASN1_NEG_INTEGER = (2 | V_ASN1_NEG);
104 enum V_ASN1_BIT_STRING = 3;
105 enum V_ASN1_OCTET_STRING = 4;
106 enum V_ASN1_NULL = 5;
107 enum V_ASN1_OBJECT = 6;
108 enum V_ASN1_OBJECT_DESCRIPTOR = 7;
109 enum V_ASN1_EXTERNAL = 8;
110 enum V_ASN1_REAL = 9;
111 enum V_ASN1_ENUMERATED = 10;
112 enum V_ASN1_NEG_ENUMERATED = (10 | V_ASN1_NEG);
113 enum V_ASN1_UTF8STRING = 12;
114 enum V_ASN1_SEQUENCE = 16;
115 enum V_ASN1_SET = 17;
116 enum V_ASN1_NUMERICSTRING = 18;	/**/
117 enum V_ASN1_PRINTABLESTRING = 19;
118 enum V_ASN1_T61STRING = 20;
119 enum V_ASN1_TELETEXSTRING = 20;	/* alias */
120 enum V_ASN1_VIDEOTEXSTRING = 21;	/**/
121 enum V_ASN1_IA5STRING = 22;
122 enum V_ASN1_UTCTIME = 23;
123 enum V_ASN1_GENERALIZEDTIME = 24;	/**/
124 enum V_ASN1_GRAPHICSTRING = 25;	/**/
125 enum V_ASN1_ISO64STRING = 26;	/**/
126 enum V_ASN1_VISIBLESTRING = 26;	/* alias */
127 enum V_ASN1_GENERALSTRING = 27;	/**/
128 enum V_ASN1_UNIVERSALSTRING = 28;	/**/
129 enum V_ASN1_BMPSTRING = 30;
130 
131 /* For use with d2i_ASN1_type_bytes() */
132 enum B_ASN1_NUMERICSTRING = 0x0001;
133 enum B_ASN1_PRINTABLESTRING = 0x0002;
134 enum B_ASN1_T61STRING = 0x0004;
135 enum B_ASN1_TELETEXSTRING = 0x0004;
136 enum B_ASN1_VIDEOTEXSTRING = 0x0008;
137 enum B_ASN1_IA5STRING = 0x0010;
138 enum B_ASN1_GRAPHICSTRING = 0x0020;
139 enum B_ASN1_ISO64STRING = 0x0040;
140 enum B_ASN1_VISIBLESTRING = 0x0040;
141 enum B_ASN1_GENERALSTRING = 0x0080;
142 enum B_ASN1_UNIVERSALSTRING = 0x0100;
143 enum B_ASN1_OCTET_STRING = 0x0200;
144 enum B_ASN1_BIT_STRING = 0x0400;
145 enum B_ASN1_BMPSTRING = 0x0800;
146 enum B_ASN1_UNKNOWN = 0x1000;
147 enum B_ASN1_UTF8STRING = 0x2000;
148 enum B_ASN1_UTCTIME = 0x4000;
149 enum B_ASN1_GENERALIZEDTIME = 0x8000;
150 enum B_ASN1_SEQUENCE = 0x10000;
151 
152 /* For use with ASN1_mbstring_copy() */
153 enum MBSTRING_FLAG = 0x1000;
154 enum MBSTRING_UTF8 = (MBSTRING_FLAG);
155 enum MBSTRING_ASC = (MBSTRING_FLAG|1);
156 enum MBSTRING_BMP = (MBSTRING_FLAG|2);
157 enum MBSTRING_UNIV = (MBSTRING_FLAG|4);
158 
159 enum SMIME_OLDMIME = 0x400;
160 enum SMIME_CRLFEOL = 0x800;
161 enum SMIME_STREAM = 0x1000;
162 
163 /+mixin DECLARE_STACK_OF!(X509_ALGOR);+/
164 
165 mixin template DECLARE_ASN1_SET_OF(type) {} /* filled in by mkstack.pl */
166 mixin template IMPLEMENT_ASN1_SET_OF(type) {} /* nothing, no longer needed */
167 
168 /* We MUST make sure that, except for constness, asn1_ctx_st and
169    asn1_const_ctx are exactly the same.  Fortunately, as soon as
170    the old ASN1 parsing macros are gone, we can throw this away
171    as well... */
172 struct asn1_ctx_st {
173 	ubyte* p;/* work char pointer */
174 	int eos;	/* end of sequence read for indefinite encoding */
175 	int error;	/* error code to use when returning an error */
176 	int inf;	/* constructed if 0x20, indefinite is 0x21 */
177 	int tag;	/* tag from last 'get object' */
178 	int xclass;	/* class from last 'get object' */
179 	c_long slen;	/* length of last 'get object' */
180 	ubyte* max; /* largest value of p allowed */
181 	ubyte* q;/* temporary variable */
182 	ubyte** pp;/* variable */
183 	int line;	/* used in error processing */
184 	}
185 alias asn1_ctx_st ASN1_CTX;
186 
187 struct asn1_const_ctx_st {
188 	const(ubyte)* p;/* work char pointer */
189 	int eos;	/* end of sequence read for indefinite encoding */
190 	int error;	/* error code to use when returning an error */
191 	int inf;	/* constructed if 0x20, indefinite is 0x21 */
192 	int tag;	/* tag from last 'get object' */
193 	int xclass;	/* class from last 'get object' */
194 	c_long slen;	/* length of last 'get object' */
195 	const(ubyte)* max; /* largest value of p allowed */
196 	const(ubyte)* q;/* temporary variable */
197 	const(ubyte)** pp;/* variable */
198 	int line;	/* used in error processing */
199 	}
200 alias asn1_const_ctx_st ASN1_const_CTX;
201 
202 /* These are used internally in the ASN1_OBJECT to keep track of
203  * whether the names and data need to be free()ed */
204 enum ASN1_OBJECT_FLAG_DYNAMIC = 0x01;	/* internal use */
205 enum ASN1_OBJECT_FLAG_CRITICAL = 0x02;	/* critical x509v3 object id */
206 enum ASN1_OBJECT_FLAG_DYNAMIC_STRINGS = 0x04;	/* internal use */
207 enum ASN1_OBJECT_FLAG_DYNAMIC_DATA = 0x08;	/* internal use */
208 struct asn1_object_st {
209 	const(char)* sn,ln;
210 	int nid;
211 	int length;
212 	const(ubyte)* data;	/* data remains const after init */
213 	int flags;	/* Should we free this one */
214 	}
215 alias asn1_object_st ASN1_OBJECT;
216 
217 enum ASN1_STRING_FLAG_BITS_LEFT = 0x08; /* Set if 0x07 has bits left value */
218 /* This indicates that the ASN1_STRING is not a real value but just a place
219  * holder for the location where indefinite length constructed data should
220  * be inserted in the memory buffer
221  */
222 enum ASN1_STRING_FLAG_NDEF = 0x010;
223 
224 /* This flag is used by the CMS code to indicate that a string is not
225  * complete and is a place holder for content when it had all been
226  * accessed. The flag will be reset when content has been written to it.
227  */
228 
229 enum ASN1_STRING_FLAG_CONT = 0x020;
230 /* This flag is used by ASN1 code to indicate an ASN1_STRING is an MSTRING
231  * type.
232  */
233 enum ASN1_STRING_FLAG_MSTRING = 0x040;
234 /* This is the base type that holds just about everything :-) */
235 struct asn1_string_st {
236 	int length;
237 	int type;
238 	ubyte* data;
239 	/* The value of the following field depends on the type being
240 	 * held.  It is mostly being used for BIT_STRING so if the
241 	 * input data has a non-zero 'unused bits' value, it will be
242 	 * handled correctly */
243 	c_long flags;
244 	}
245 
246 /* ASN1_ENCODING structure: this is used to save the received
247  * encoding of an ASN1 type. This is useful to get round
248  * problems with invalid encodings which can break signatures.
249  */
250 
251 struct ASN1_ENCODING_st {
252 	ubyte* enc;	/* DER encoding */
253 	c_long len;		/* Length of encoding */
254 	int modified;		 /* set to 1 if 'enc' is invalid */
255 	}
256 alias ASN1_ENCODING_st ASN1_ENCODING;
257 
258 /* Used with ASN1 LONG type: if a c_long is set to this it is omitted */
259 enum ASN1_LONG_UNDEF = 0x7fffffff;
260 
261 enum STABLE_FLAGS_MALLOC = 0x01;
262 enum STABLE_NO_MASK = 0x02;
263 enum DIRSTRING_TYPE	= (B_ASN1_PRINTABLESTRING|B_ASN1_T61STRING|B_ASN1_BMPSTRING|B_ASN1_UTF8STRING);
264 enum PKCS9STRING_TYPE = (DIRSTRING_TYPE|B_ASN1_IA5STRING);
265 
266 struct asn1_string_table_st {
267 	int nid;
268 	c_long minsize;
269 	c_long maxsize;
270 	c_ulong mask;
271 	c_ulong flags;
272 }
273 alias asn1_string_table_st ASN1_STRING_TABLE;
274 
275 /+mixin DECLARE_STACK_OF!(ASN1_STRING_TABLE);+/
276 
277 /* size limits: this stuff is taken straight from RFC2459 */
278 
279 enum ub_name = 32768;
280 enum ub_common_name = 64;
281 enum ub_locality_name = 128;
282 enum ub_state_name = 128;
283 enum ub_organization_name = 64;
284 enum ub_organization_unit_name = 64;
285 enum ub_title = 64;
286 enum ub_email_address = 128;
287 
288 /* Declarations for template structures: for full definitions
289  * see asn1t.h
290  */
291 alias ASN1_TEMPLATE_st ASN1_TEMPLATE;
292 import deimos.openssl.asn1t; /*struct ASN1_TLC_st;*/
293 alias ASN1_TLC_st ASN1_TLC;
294 /* This is just an opaque pointer */
295 struct ASN1_VALUE_st;
296 alias ASN1_VALUE_st ASN1_VALUE;
297 
298 /* Declare ASN1 functions: the implement macro in in asn1t.h */
299 // Need to use string mixins here to avoid DMD mangling extern(C) symbol names.
300 
301 template DECLARE_ASN1_FUNCTIONS(string type) {
302 	enum DECLARE_ASN1_FUNCTIONS = DECLARE_ASN1_FUNCTIONS_name!(type, type);
303 }
304 
305 template DECLARE_ASN1_ALLOC_FUNCTIONS(string type) {
306 	enum DECLARE_ASN1_ALLOC_FUNCTIONS =
307 		DECLARE_ASN1_ALLOC_FUNCTIONS_name!(type, type);
308 }
309 
310 template DECLARE_ASN1_FUNCTIONS_name(string type, string name) {
311 	enum DECLARE_ASN1_FUNCTIONS_name =
312 		DECLARE_ASN1_ALLOC_FUNCTIONS_name!(type, name) ~
313 		DECLARE_ASN1_ENCODE_FUNCTIONS!(type, name, name);
314 }
315 
316 template DECLARE_ASN1_FUNCTIONS_fname(string type, string itname, string name) {
317 	enum DECLARE_ASN1_FUNCTIONS_fname =
318 		DECLARE_ASN1_ALLOC_FUNCTIONS_name!(type, name) ~
319 		DECLARE_ASN1_ENCODE_FUNCTIONS!(type, itname, name);
320 }
321 
322 template DECLARE_ASN1_ENCODE_FUNCTIONS(string type, string itname, string name) {
323 	enum DECLARE_ASN1_ENCODE_FUNCTIONS = "
324 		" ~ type ~ "* d2i_" ~ name ~ "(" ~ type ~ "** a, const(ubyte)** in_, c_long len);
325 		int i2d_" ~ name ~ "(" ~ type ~ "* a, ubyte** out_);
326 	" ~ DECLARE_ASN1_ITEM!itname;
327 }
328 
329 template DECLARE_ASN1_ENCODE_FUNCTIONS_const(string type, string name) {
330 	enum DECLARE_ASN1_ENCODE_FUNCTIONS_const = "
331 		" ~ type ~ "* d2i_" ~ name ~ "(" ~ type ~ "** a, const(ubyte)** in_, c_long len);
332 		int i2d_" ~ name ~ "(const(" ~ type ~ ")* a, ubyte** out_);
333 	" ~ DECLARE_ASN1_ITEM!name;
334 }
335 
336 template DECLARE_ASN1_NDEF_FUNCTION(string name) {
337 	enum DECLARE_ASN1_NDEF_FUNCTION = "
338 		int i2d_" ~ name ~ "_NDEF(" ~ name ~ "* a, ubyte** out_);
339 	";
340 }
341 
342 template DECLARE_ASN1_FUNCTIONS_const(string name) {
343 	enum DECLARE_ASN1_FUNCTIONS_const =
344 		DECLARE_ASN1_ALLOC_FUNCTIONS!name ~
345 		DECLARE_ASN1_ENCODE_FUNCTIONS_const!(name, name);
346 }
347 
348 template DECLARE_ASN1_ALLOC_FUNCTIONS_name(string type, string name) {
349 	enum DECLARE_ASN1_ALLOC_FUNCTIONS_name = "
350 		extern(C) " ~ type ~ "* " ~ name ~ "_new();
351 		extern(C) void " ~ name ~ "_free(" ~ type ~ "* a);
352 	";
353 }
354 
355 template DECLARE_ASN1_PRINT_FUNCTION(string stname) {
356 	enum DECLARE_ASN1_PRINT_FUNCTION =
357 		DECLARE_ASN1_PRINT_FUNCTION_fname!(stname, stname);
358 }
359 
360 template DECLARE_ASN1_PRINT_FUNCTION_fname(string stname, string fname) {
361 	enum DECLARE_ASN1_PRINT_FUNCTION_fname = "
362 		int " ~ fname ~ "_print_ctx(BIO* out_, " ~ stname ~ "* x, int indent,
363 					 const(ASN1_PCTX)* pctx);
364 	";
365 }
366 
367 template D2I_OF(type) {
368     alias ExternC!(type* function(type**, const(ubyte)**, c_long)) D2I_OF;
369 }
370 template I2D_OF(type) {
371     alias ExternC!(int function(type*, ubyte**)) I2D_OF;
372 }
373 template I2D_OF_const(type) {
374     alias ExternC!(int function(const(type)*, ubyte**)) I2D_OF_const;
375 }
376 
377 d2i_of_void* CHECKED_D2I_OF(type)(D2I_OF!type d2i) {
378     return cast(d2i_of_void*) (1 ? d2i : null);
379 }
380 i2d_of_void* CHECKED_I2D_OF(type)(I2D_OF!type i2d) {
381     return cast(i2d_of_void*) (1 ? i2d : null);
382 }
383 ExternC!(type* function()) CHECKED_NEW_OF(type)(ExternC!(type* function()) xnew) {
384     return typeof(return)(1 ? xnew : null);
385 }
386 void* CHECKED_PTR_OF(type)(type* p) {
387     return cast(void*)(1 ? p : null);
388 }
389 void** CHECKED_PPTR_OF(type)(type** p) {
390     return cast(void**)(1 ? p : null);
391 }
392 
393 template TYPEDEF_D2I_OF(string type) {
394     enum TYPEDEF_D2I_OF = "alias typeof(D2I_OF!(" ~ type ~ ").init) d2i_of_" ~ type ~ ";";
395 }
396 template TYPEDEF_I2D_OF(string type) {
397     enum TYPEDEF_I2D_OF = "alias typeof(I2D_OF!(" ~ type ~ ").init) i2d_of_" ~ type ~ ";";
398 }
399 template TYPEDEF_D2I2D_OF(string type) {
400     enum TYPEDEF_D2I2D_OF = TYPEDEF_D2I_OF!type ~ TYPEDEF_I2D_OF!type;
401 }
402 
403 // Probably due to a DMD @@BUG@@, the types are not available to all modules
404 // if the mixin is used.
405 // mixin(TYPEDEF_D2I2D_OF!"void");
406 alias typeof(*(D2I_OF!void).init) d2i_of_void;
407 alias typeof(*(I2D_OF!void).init) i2d_of_void;
408 
409 /* The following macros and typedefs allow an ASN1_ITEM
410  * to be embedded in a structure and referenced. Since
411  * the ASN1_ITEM pointers need to be globally accessible
412  * (possibly from shared libraries) they may exist in
413  * different forms. On platforms that support it the
414  * ASN1_ITEM structure itself will be globally exported.
415  * Other platforms will export a function that returns
416  * an ASN1_ITEM pointer.
417  *
418  * To handle both cases transparently the macros below
419  * should be used instead of hard coding an ASN1_ITEM
420  * pointer in a structure.
421  *
422  * The structure will look like this:
423  *
424  * struct SOMETHING_st {
425  *     ...
426  *     ASN1_ITEM_EXP* iptr;
427  *     ...
428  * }
429 alias SOMETHING_st SOMETHING;
430  *
431  * It would be initialised as e.g.:
432  *
433  * SOMETHING somevar = {...,ASN1_ITEM_ref(X509),...};
434  *
435  * and the actual pointer extracted with:
436  *
437  * const(ASN1_ITEM)* it = ASN1_ITEM_ptr(somevar.iptr);
438  *
439  * Finally an ASN1_ITEM pointer can be extracted from an
440  * appropriate reference with: ASN1_ITEM_rptr(X509). This
441  * would be used when a function takes an ASN1_ITEM* argument.
442  *
443  */
444 
445 version (OPENSSL_EXPORT_VAR_AS_FUNCTION) {
446 	/* Platforms that can't easily handle shared global variables are declared
447 	 * as functions returning ASN1_ITEM pointers.
448 	 */
449 
450 	/* ASN1_ITEM pointer exported type */
451 	alias const(ASN1_ITEM)* ASN1_ITEM_EXP;
452 
453 	/* Macro to obtain ASN1_ITEM pointer from exported type */
454 	template ASN1_ITEM_ptr(string iptr) {
455 		enum ASN1_ITEM_ptr = "(" ~ iptr ~ ")()";
456 	}
457 
458 	/* Macro to include ASN1_ITEM pointer from base type */
459 	template ASN1_ITEM_ref(string iptr) {
460 		enum ASN1_ITEM_ref = "(" ~ iptr ~ "_it)";
461 	}
462 
463 	template ASN1_ITEM_rptr(string ref_) {
464 		enum ASN1_ITEM_rptr = "(" ~ ref_ ~ "_it())";
465 	}
466 
467 	template DECLARE_ASN1_ITEM(string name) {
468 		enum DECLARE_ASN1_ITEM = "extern(C) const(ASN1_ITEM)* " ~ name ~ "_it();";
469 	}
470 } else {
471 	/* ASN1_ITEM pointer exported type */
472 	alias const(ASN1_ITEM) ASN1_ITEM_EXP;
473 
474 	/* Macro to obtain ASN1_ITEM pointer from exported type */
475 	template ASN1_ITEM_ptr(string iptr) {
476 		enum ASN1_ITEM_ptr = iptr;
477 	}
478 
479 	/* Macro to include ASN1_ITEM pointer from base type */
480 	template ASN1_ITEM_ref(string iptr) {
481 		enum ASN1_ITEM_ref = "(&(" ~ iptr ~ "_it))";
482 	}
483 
484 	template ASN1_ITEM_rptr(string ref_) {
485 		enum ASN1_ITEM_rptr = "(&(" ~ ref_ ~ "_it))";
486 	}
487 
488 	template DECLARE_ASN1_ITEM(string name) {
489 		enum DECLARE_ASN1_ITEM = "extern const(ASN1_ITEM) " ~ name ~ "_it;";
490 	}
491 }
492 
493 /* Parameters used by ASN1_STRING_print_ex() */
494 
495 /* These determine which characters to escape:
496  * RFC2253 special characters, control characters and
497  * MSB set characters
498  */
499 
500 enum ASN1_STRFLGS_ESC_2253 = 1;
501 enum ASN1_STRFLGS_ESC_CTRL = 2;
502 enum ASN1_STRFLGS_ESC_MSB = 4;
503 
504 
505 /* This flag determines how we do escaping: normally
506  * RC2253 backslash only, set this to use backslash and
507  * quote.
508  */
509 
510 enum ASN1_STRFLGS_ESC_QUOTE = 8;
511 
512 
513 /* These three flags are internal use only. */
514 
515 /* Character is a valid PrintableString character */
516 enum CHARTYPE_PRINTABLESTRING = 0x10;
517 /* Character needs escaping if it is the first character */
518 enum CHARTYPE_FIRST_ESC_2253 = 0x20;
519 /* Character needs escaping if it is the last character */
520 enum CHARTYPE_LAST_ESC_2253 = 0x40;
521 
522 /* NB the internal flags are safely reused below by flags
523  * handled at the top level.
524  */
525 
526 /* If this is set we convert all character strings
527  * to UTF8 first
528  */
529 
530 enum ASN1_STRFLGS_UTF8_CONVERT = 0x10;
531 
532 /* If this is set we don't attempt to interpret content:
533  * just assume all strings are 1 byte per character. This
534  * will produce some pretty odd looking output!
535  */
536 
537 enum ASN1_STRFLGS_IGNORE_TYPE = 0x20;
538 
539 /* If this is set we include the string type in the output */
540 enum ASN1_STRFLGS_SHOW_TYPE = 0x40;
541 
542 /* This determines which strings to display and which to
543  * 'dump' (hex dump of content octets or DER encoding). We can
544  * only dump non character strings or everything. If we
545  * don't dump 'unknown' they are interpreted as character
546  * strings with 1 octet per character and are subject to
547  * the usual escaping options.
548  */
549 
550 enum ASN1_STRFLGS_DUMP_ALL = 0x80;
551 enum ASN1_STRFLGS_DUMP_UNKNOWN = 0x100;
552 
553 /* These determine what 'dumping' does, we can dump the
554  * content octets or the DER encoding: both use the
555  * RFC2253 #XXXXX notation.
556  */
557 
558 enum ASN1_STRFLGS_DUMP_DER = 0x200;
559 
560 /* All the string flags consistent with RFC2253,
561  * escaping control characters isn't essential in
562  * RFC2253 but it is advisable anyway.
563  */
564 
565 enum ASN1_STRFLGS_RFC2253 =	(ASN1_STRFLGS_ESC_2253 |
566 				ASN1_STRFLGS_ESC_CTRL |
567 				ASN1_STRFLGS_ESC_MSB |
568 				ASN1_STRFLGS_UTF8_CONVERT |
569 				ASN1_STRFLGS_DUMP_UNKNOWN |
570 				ASN1_STRFLGS_DUMP_DER);
571 
572 /+mixin DECLARE_STACK_OF!(ASN1_INTEGER);+/
573 mixin DECLARE_ASN1_SET_OF!(ASN1_INTEGER);
574 
575 /+mixin DECLARE_STACK_OF!(ASN1_GENERALSTRING);+/
576 
577 struct asn1_type_st
578 	{
579 	int type;
580 	union value_ {
581 		char* ptr;
582 		ASN1_BOOLEAN		boolean;
583 		ASN1_STRING* 		asn1_string;
584 		ASN1_OBJECT* 		object;
585 		ASN1_INTEGER* 		integer;
586 		ASN1_ENUMERATED* 	enumerated;
587 		ASN1_BIT_STRING* 	bit_string;
588 		ASN1_OCTET_STRING* 	octet_string;
589 		ASN1_PRINTABLESTRING* 	printablestring;
590 		ASN1_T61STRING* 	t61string;
591 		ASN1_IA5STRING* 	ia5string;
592 		ASN1_GENERALSTRING* 	generalstring;
593 		ASN1_BMPSTRING* 	bmpstring;
594 		ASN1_UNIVERSALSTRING* 	universalstring;
595 		ASN1_UTCTIME* 		utctime;
596 		ASN1_GENERALIZEDTIME* 	generalizedtime;
597 		ASN1_VISIBLESTRING* 	visiblestring;
598 		ASN1_UTF8STRING* 	utf8string;
599 		/* set and sequence are left complete and still
600 		 * contain the set or sequence bytes */
601 		ASN1_STRING* 		set;
602 		ASN1_STRING* 		sequence;
603 		ASN1_VALUE* 		asn1_value;
604 		}
605 	value_ value;
606 	}
607 alias asn1_type_st ASN1_TYPE;
608 
609 /+mixin DECLARE_STACK_OF!(ASN1_TYPE);+/
610 mixin DECLARE_ASN1_SET_OF!(ASN1_TYPE);
611 
612 alias STACK_OF!(ASN1_TYPE) ASN1_SEQUENCE_ANY;
613 
614 mixin(DECLARE_ASN1_ENCODE_FUNCTIONS_const!("ASN1_SEQUENCE_ANY", "ASN1_SEQUENCE_ANY"));
615 mixin(DECLARE_ASN1_ENCODE_FUNCTIONS_const!("ASN1_SEQUENCE_ANY", "ASN1_SET_ANY"));
616 
617 struct NETSCAPE_X509_st {
618 	ASN1_OCTET_STRING* header;
619 	X509* cert;
620 	}
621 alias NETSCAPE_X509_st NETSCAPE_X509;
622 
623 /* This is used to contain a list of bit names */
624 struct BIT_STRING_BITNAME_st {
625 	int bitnum;
626 	const(char)* lname;
627 	const(char)* sname;
628 }
629 alias BIT_STRING_BITNAME_st BIT_STRING_BITNAME;
630 
631 
632 auto M_ASN1_STRING_length()(ASN1_STRING* x) { return x.length; }
633 void M_ASN1_STRING_length_set()(ASN1_STRING* x, int n) { x.length = n; }
634 auto M_ASN1_STRING_type()(ASN1_STRING* x) { return x.type; }
635 auto M_ASN1_STRING_data()(ASN1_STRING* x) { return x.data; }
636 
637 /* Macros for string operations */
638 ASN1_BIT_STRING* M_ASN1_BIT_STRING_new()() { return cast(ASN1_BIT_STRING*)ASN1_STRING_type_new(V_ASN1_BIT_STRING); }
639 void M_ASN1_BIT_STRING_free()(ASN1_BIT_STRING* a) { ASN1_STRING_free(cast(ASN1_STRING*)a); }
640 ASN1_BIT_STRING* M_ASN1_BIT_STRING_dup()(ASN1_BIT_STRING* a) { return cast(ASN1_BIT_STRING*)ASN1_STRING_dup(cast(ASN1_STRING*)a); }
641 auto M_ASN1_BIT_STRING_cmp()(const(ASN1_BIT_STRING)* a, const(ASN1_BIT_STRING)* b) { return ASN1_STRING_cmp(cast(const(ASN1_STRING)*)a, cast(const(ASN1_STRING)*)b); }
642 auto M_ASN1_BIT_STRING_set()(ASN1_BIT_STRING* a,const(void)* b, int c){ return ASN1_STRING_set(cast(ASN1_STRING*)a, b, c); }
643 
644 ASN1_INTEGER* M_ASN1_INTEGER_new()() { return cast(ASN1_INTEGER*)ASN1_STRING_type_new(V_ASN1_INTEGER); }
645 void M_ASN1_INTEGER_free()(ASN1_INTEGER* a) { ASN1_STRING_free(cast(ASN1_STRING*)a); }
646 ASN1_INTEGER* M_ASN1_INTEGER_dup()(ASN1_INTEGER* a) { return cast(ASN1_INTEGER*)ASN1_STRING_dup(cast(ASN1_STRING*)a); }
647 auto M_ASN1_INTEGER_cmp()(const(ASN1_INTEGER)* a, const(ASN1_INTEGER)* b) { return ASN1_STRING_cmp(cast(const(ASN1_STRING)*)a, cast(const(ASN1_STRING)*)b); }
648 
649 ASN1_ENUMERATED* M_ASN1_ENUMERATED_new()() { return cast(ASN1_ENUMERATED*)ASN1_STRING_type_new(V_ASN1_ENUMERATED); }
650 void M_ASN1_ENUMERATED_free()(ASN1_ENUMERATED* a) { ASN1_STRING_free(cast(ASN1_STRING*)a); }
651 ASN1_ENUMERATED* M_ASN1_ENUMERATED_dup()(ASN1_ENUMERATED* a) { return cast(ASN1_ENUMERATED*)ASN1_STRING_dup(cast(ASN1_STRING*)a); }
652 auto M_ASN1_ENUMERATED_cmp()(const(ASN1_ENUMERATED)* a, const(ASN1_ENUMERATED)* b) { return ASN1_STRING_cmp(cast(const(ASN1_STRING)*)a, cast(const(ASN1_STRING)*)b); }
653 
654 ASN1_OCTET_STRING* M_ASN1_OCTET_STRING_new()() { return cast(ASN1_OCTET_STRING*)ASN1_STRING_type_new(V_ASN1_OCTET_STRING); }
655 void M_ASN1_OCTET_STRING_free()(ASN1_OCTET_STRING* a) { ASN1_STRING_free(cast(ASN1_STRING*)a); }
656 ASN1_OCTET_STRING* M_ASN1_OCTET_STRING_dup()(ASN1_OCTET_STRING* a) { return cast(ASN1_OCTET_STRING*)ASN1_STRING_dup(cast(ASN1_STRING*)a); }
657 auto M_ASN1_OCTET_STRING_cmp()(const(ASN1_OCTET_STRING)* a, const(ASN1_OCTET_STRING)* b) { return ASN1_STRING_cmp(cast(const(ASN1_STRING)*)a, cast(const(ASN1_STRING)*)b); }
658 auto M_ASN1_OCTET_STRING_set()(ASN1_OCTET_STRING* a,const(void)* b, int c){ return ASN1_STRING_set(cast(ASN1_STRING*)a, b, c); }
659 auto M_ASN1_OCTET_STRING_print()(BIO* a,const(ASN1_OCTET_STRING)* b) { return ASN1_STRING_print(a,cast(ASN1_STRING*)b); }
660 auto M_i2d_ASN1_OCTET_STRING()(const(ASN1_OCTET_STRING)* a, ubyte** pp) { return i2d_ASN1_bytes(cast(ASN1_STRING*)a,pp,V_ASN1_OCTET_STRING,V_ASN1_UNIVERSAL); }
661 
662 enum B_ASN1_TIME =
663 			B_ASN1_UTCTIME |
664 			B_ASN1_GENERALIZEDTIME;
665 
666 enum B_ASN1_PRINTABLE =
667 			B_ASN1_NUMERICSTRING|
668 			B_ASN1_PRINTABLESTRING|
669 			B_ASN1_T61STRING|
670 			B_ASN1_IA5STRING|
671 			B_ASN1_BIT_STRING|
672 			B_ASN1_UNIVERSALSTRING|
673 			B_ASN1_BMPSTRING|
674 			B_ASN1_UTF8STRING|
675 			B_ASN1_SEQUENCE|
676 			B_ASN1_UNKNOWN;
677 
678 enum B_ASN1_DIRECTORYSTRING =
679 			B_ASN1_PRINTABLESTRING|
680 			B_ASN1_TELETEXSTRING|
681 			B_ASN1_BMPSTRING|
682 			B_ASN1_UNIVERSALSTRING|
683 			B_ASN1_UTF8STRING;
684 
685 enum B_ASN1_DISPLAYTEXT =
686 			B_ASN1_IA5STRING|
687 			B_ASN1_VISIBLESTRING|
688 			B_ASN1_BMPSTRING|
689 			B_ASN1_UTF8STRING;
690 /+
691 auto M_ASN1_PRINTABLE_new()() { return ASN1_STRING_type_new(V_ASN1_T61STRING); }
692 void M_ASN1_PRINTABLE_free()(ASN1_PRINTABLE* a) { ASN1_STRING_free(cast(ASN1_STRING*)a); }
693 #define M_i2d_ASN1_PRINTABLE(a,pp) i2d_ASN1_bytes((ASN1_STRING*)a,\
694 		pp,a->type,V_ASN1_UNIVERSAL)
695 #define M_d2i_ASN1_PRINTABLE(a,pp,l) \
696 		d2i_ASN1_type_bytes((ASN1_STRING**)a,pp,l, \
697 			B_ASN1_PRINTABLE)
698 
699 auto M_DIRECTORYSTRING_new()() { return ASN1_STRING_type_new(V_ASN1_PRINTABLESTRING); }
700 void M_DIRECTORYSTRING_free()(DIRECTORYSTRING* a) { ASN1_STRING_free(cast(ASN1_STRING*)a); }
701 #define M_i2d_DIRECTORYSTRING(a,pp) i2d_ASN1_bytes((ASN1_STRING*)a,\
702 						pp,a->type,V_ASN1_UNIVERSAL)
703 #define M_d2i_DIRECTORYSTRING(a,pp,l) \
704 		d2i_ASN1_type_bytes((ASN1_STRING**)a,pp,l, \
705 			B_ASN1_DIRECTORYSTRING)
706 
707 auto M_DISPLAYTEXT_new()() { return ASN1_STRING_type_new(V_ASN1_VISIBLESTRING); }
708 void M_DISPLAYTEXT_free()(DISPLAYTEXT* a) { ASN1_STRING_free(cast(ASN1_STRING*)a); }
709 #define M_i2d_DISPLAYTEXT(a,pp) i2d_ASN1_bytes((ASN1_STRING*)a,\
710 						pp,a->type,V_ASN1_UNIVERSAL)
711 #define M_d2i_DISPLAYTEXT(a,pp,l) \
712 		d2i_ASN1_type_bytes((ASN1_STRING**)a,pp,l, \
713 			B_ASN1_DISPLAYTEXT)
714 
715 ASN1_PRINTABLESTRING* M_ASN1_PRINTABLESTRING_new()() { return cast(ASN1_PRINTABLESTRING*)ASN1_STRING_type_new(V_ASN1_PRINTABLESTRING); }
716 void M_ASN1_PRINTABLESTRING_free()(ASN1_PRINTABLESTRING* a) { ASN1_STRING_free(cast(ASN1_STRING*)a); }
717 #define M_i2d_ASN1_PRINTABLESTRING(a,pp) \
718 		i2d_ASN1_bytes((ASN1_STRING*)a,pp,V_ASN1_PRINTABLESTRING,\
719 		V_ASN1_UNIVERSAL)
720 #define M_d2i_ASN1_PRINTABLESTRING(a,pp,l) \
721 		(ASN1_PRINTABLESTRING*)d2i_ASN1_type_bytes\
722 		((ASN1_STRING**)a,pp,l,B_ASN1_PRINTABLESTRING)
723 
724 ASN1_T61STRING* M_ASN1_T61STRING_new()() { return cast(ASN1_T61STRING*)ASN1_STRING_type_new(V_ASN1_T61STRING); }
725 void M_ASN1_T61STRING_free()(ASN1_T61STRING* a) { ASN1_STRING_free(cast(ASN1_STRING*)a); }
726 #define M_i2d_ASN1_T61STRING(a,pp) \
727 		i2d_ASN1_bytes((ASN1_STRING*)a,pp,V_ASN1_T61STRING,\
728 		V_ASN1_UNIVERSAL)
729 #define M_d2i_ASN1_T61STRING(a,pp,l) \
730 		(ASN1_T61STRING*)d2i_ASN1_type_bytes\
731 		((ASN1_STRING**)a,pp,l,B_ASN1_T61STRING)
732 
733 ASN1_IA5STRING* M_ASN1_IA5STRING_new()() { return cast(ASN1_IA5STRING*)ASN1_STRING_type_new(V_ASN1_IA5STRING); }
734 void M_ASN1_IA5STRING_free()(ASN1_IA5STRING* a) { ASN1_STRING_free(cast(ASN1_STRING*)a); }
735 #define M_ASN1_IA5STRING_dup(a)	\
736 		(ASN1_IA5STRING*)ASN1_STRING_dup((const(ASN1_STRING)*)a)
737 #define M_i2d_ASN1_IA5STRING(a,pp) \
738 		i2d_ASN1_bytes((ASN1_STRING*)a,pp,V_ASN1_IA5STRING,\
739 			V_ASN1_UNIVERSAL)
740 #define M_d2i_ASN1_IA5STRING(a,pp,l) \
741 		(ASN1_IA5STRING*)d2i_ASN1_type_bytes((ASN1_STRING**)a,pp,l,\
742 			B_ASN1_IA5STRING)
743 
744 ASN1_UTCTIME* M_ASN1_UTCTIME_new()() { return cast(ASN1_UTCTIME*)ASN1_STRING_type_new(V_ASN1_UTCTIME); }
745 void M_ASN1_UTCTIME_free()(ASN1_UTCTIME* a) { ASN1_STRING_free(cast(ASN1_STRING*)a); }
746 ASN1_UTCTIME* M_ASN1_UTCTIME_dup()(ASN1_UTCTIME* a) { return cast(ASN1_UTCTIME*)ASN1_STRING_dup(cast(ASN1_STRING*)a); }
747 
748 ASN1_GENERALIZEDTIME* M_ASN1_GENERALIZEDTIME_new()() { return cast(ASN1_GENERALIZEDTIME*)ASN1_STRING_type_new(V_ASN1_GENERALIZEDTIME); }
749 void M_ASN1_GENERALIZEDTIME_free()(ASN1_GENERALIZEDTIME* a) { ASN1_STRING_free(cast(ASN1_STRING*)a); }
750 ASN1_GENERALIZEDTIME* M_ASN1_GENERALIZEDTIME_dup()(ASN1_GENERALIZEDTIME* a) { return cast(ASN1_GENERALIZEDTIME*)ASN1_STRING_dup(cast(ASN1_STRING*)a); }
751 
752 ASN1_TIME* M_ASN1_TIME_new()() { return cast(ASN1_TIME*)ASN1_STRING_type_new(V_ASN1_UTCTIME); }
753 void M_ASN1_TIME_free()(ASN1_TIME* a) { ASN1_STRING_free(cast(ASN1_STRING*)a); }
754 ASN1_TIME* M_ASN1_TIME_dup()(ASN1_TIME* a) { return cast(ASN1_TIME*)ASN1_STRING_dup(cast(ASN1_STRING*)a); }
755 
756 ASN1_GENERALSTRING* M_ASN1_GENERALSTRING_new()() { return cast(ASN1_GENERALSTRING*)ASN1_STRING_type_new(V_ASN1_GENERALSTRING); }
757 void M_ASN1_GENERALSTRING_free()(ASN1_GENERALSTRING* a) { ASN1_STRING_free(cast(ASN1_STRING*)a); }
758 #define M_i2d_ASN1_GENERALSTRING(a,pp) \
759 		i2d_ASN1_bytes((ASN1_STRING*)a,pp,V_ASN1_GENERALSTRING,\
760 			V_ASN1_UNIVERSAL)
761 #define M_d2i_ASN1_GENERALSTRING(a,pp,l) \
762 		(ASN1_GENERALSTRING*)d2i_ASN1_type_bytes\
763 		((ASN1_STRING**)a,pp,l,B_ASN1_GENERALSTRING)
764 
765 ASN1_UNIVERSALSTRING* M_ASN1_UNIVERSALSTRING_new()() { return cast(ASN1_UNIVERSALSTRING*)ASN1_STRING_type_new(V_ASN1_UNIVERSALSTRING); }
766 void M_ASN1_UNIVERSALSTRING_free()(ASN1_UNIVERSALSTRING* a) { ASN1_STRING_free(cast(ASN1_STRING*)a); }
767 #define M_i2d_ASN1_UNIVERSALSTRING(a,pp) \
768 		i2d_ASN1_bytes((ASN1_STRING*)a,pp,V_ASN1_UNIVERSALSTRING,\
769 			V_ASN1_UNIVERSAL)
770 #define M_d2i_ASN1_UNIVERSALSTRING(a,pp,l) \
771 		(ASN1_UNIVERSALSTRING*)d2i_ASN1_type_bytes\
772 		((ASN1_STRING**)a,pp,l,B_ASN1_UNIVERSALSTRING)
773 
774 ASN1_BMPSTRING* M_ASN1_BMPSTRING_new()() { return cast(ASN1_BMPSTRING*)ASN1_STRING_type_new(V_ASN1_BMPSTRING); }
775 void M_ASN1_BMPSTRING_free()(ASN1_BMPSTRING* a) { ASN1_STRING_free(cast(ASN1_STRING*)a); }
776 #define M_i2d_ASN1_BMPSTRING(a,pp) \
777 		i2d_ASN1_bytes((ASN1_STRING*)a,pp,V_ASN1_BMPSTRING,\
778 			V_ASN1_UNIVERSAL)
779 #define M_d2i_ASN1_BMPSTRING(a,pp,l) \
780 		(ASN1_BMPSTRING*)d2i_ASN1_type_bytes\
781 		((ASN1_STRING**)a,pp,l,B_ASN1_BMPSTRING)
782 
783 ASN1_VISIBLESTRING* M_ASN1_VISIBLESTRING_new()() { return cast(ASN1_VISIBLESTRING*)ASN1_STRING_type_new(V_ASN1_VISIBLESTRING); }
784 void M_ASN1_VISIBLESTRING_free()(ASN1_VISIBLESTRING* a) { ASN1_STRING_free(cast(ASN1_STRING*)a); }
785 #define M_i2d_ASN1_VISIBLESTRING(a,pp) \
786 		i2d_ASN1_bytes((ASN1_STRING*)a,pp,V_ASN1_VISIBLESTRING,\
787 			V_ASN1_UNIVERSAL)
788 #define M_d2i_ASN1_VISIBLESTRING(a,pp,l) \
789 		(ASN1_VISIBLESTRING*)d2i_ASN1_type_bytes\
790 		((ASN1_STRING**)a,pp,l,B_ASN1_VISIBLESTRING)
791 
792 ASN1_UTF8STRING* M_ASN1_UTF8STRING_new()() { return cast(ASN1_UTF8STRING*)ASN1_STRING_type_new(V_ASN1_UTF8STRING); }
793 void M_ASN1_UTF8STRING_free()(ASN1_UTF8STRING* a) { ASN1_STRING_free(cast(ASN1_STRING*)a); }
794 #define M_i2d_ASN1_UTF8STRING(a,pp) \
795 		i2d_ASN1_bytes((ASN1_STRING*)a,pp,V_ASN1_UTF8STRING,\
796 			V_ASN1_UNIVERSAL)
797 #define M_d2i_ASN1_UTF8STRING(a,pp,l) \
798 		(ASN1_UTF8STRING*)d2i_ASN1_type_bytes\
799 		((ASN1_STRING**)a,pp,l,B_ASN1_UTF8STRING)
800 +/
801   /* for the is_set parameter to i2d_ASN1_SET */
802 enum IS_SEQUENCE = 0;
803 enum IS_SET = 1;
804 
805 mixin(DECLARE_ASN1_FUNCTIONS_fname!("ASN1_TYPE", "ASN1_ANY", "ASN1_TYPE"));
806 
807 int ASN1_TYPE_get(ASN1_TYPE* a);
808 void ASN1_TYPE_set(ASN1_TYPE* a, int type, void* value);
809 int ASN1_TYPE_set1(ASN1_TYPE* a, int type, const(void)* value);
810 int            ASN1_TYPE_cmp(ASN1_TYPE* a, ASN1_TYPE* b);
811 
812 ASN1_OBJECT* 	ASN1_OBJECT_new();
813 void		ASN1_OBJECT_free(ASN1_OBJECT* a);
814 int		i2d_ASN1_OBJECT(ASN1_OBJECT* a,ubyte** pp);
815 ASN1_OBJECT* 	c2i_ASN1_OBJECT(ASN1_OBJECT** a,const(ubyte)** pp,
816 			c_long length);
817 ASN1_OBJECT* 	d2i_ASN1_OBJECT(ASN1_OBJECT** a,const(ubyte)** pp,
818 			c_long length);
819 
820 mixin(DECLARE_ASN1_ITEM!"ASN1_OBJECT");
821 
822 /+mixin DECLARE_STACK_OF!(ASN1_OBJECT);+/
823 mixin DECLARE_ASN1_SET_OF!(ASN1_OBJECT);
824 
825 ASN1_STRING* 	ASN1_STRING_new();
826 void		ASN1_STRING_free(ASN1_STRING* a);
827 int		ASN1_STRING_copy(ASN1_STRING* dst, const(ASN1_STRING)* str);
828 ASN1_STRING* 	ASN1_STRING_dup(const(ASN1_STRING)* a);
829 ASN1_STRING* 	ASN1_STRING_type_new(int type );
830 int 		ASN1_STRING_cmp(const(ASN1_STRING)* a, const(ASN1_STRING)* b);
831   /* Since this is used to store all sorts of things, via macros, for now, make
832      its data void* */
833 int 		ASN1_STRING_set(ASN1_STRING* str, const(void)* data, int len);
834 void		ASN1_STRING_set0(ASN1_STRING* str, void* data, int len);
835 int ASN1_STRING_length(const(ASN1_STRING)* x);
836 void ASN1_STRING_length_set(ASN1_STRING* x, int n);
837 int ASN1_STRING_type(ASN1_STRING* x);
838 ubyte* ASN1_STRING_data(ASN1_STRING* x);
839 
840 mixin(DECLARE_ASN1_FUNCTIONS!"ASN1_BIT_STRING");
841 int		i2c_ASN1_BIT_STRING(ASN1_BIT_STRING* a,ubyte** pp);
842 ASN1_BIT_STRING* c2i_ASN1_BIT_STRING(ASN1_BIT_STRING** a,const(ubyte)** pp,
843 			c_long length);
844 int		ASN1_BIT_STRING_set(ASN1_BIT_STRING* a, ubyte* d,
845 			int length );
846 int		ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING* a, int n, int value);
847 int		ASN1_BIT_STRING_get_bit(ASN1_BIT_STRING* a, int n);
848 int            ASN1_BIT_STRING_check(ASN1_BIT_STRING* a,
849                                      ubyte* flags, int flags_len);
850 
851 version(OPENSSL_NO_BIO) {} else {
852 int ASN1_BIT_STRING_name_print(BIO* out_, ASN1_BIT_STRING* bs,
853 				BIT_STRING_BITNAME* tbl, int indent);
854 }
855 int ASN1_BIT_STRING_num_asc(char* name, BIT_STRING_BITNAME* tbl);
856 int ASN1_BIT_STRING_set_asc(ASN1_BIT_STRING* bs, char* name, int value,
857 				BIT_STRING_BITNAME* tbl);
858 
859 int		i2d_ASN1_BOOLEAN(int a,ubyte** pp);
860 int 		d2i_ASN1_BOOLEAN(int* a,const(ubyte)** pp,c_long length);
861 
862 mixin(DECLARE_ASN1_FUNCTIONS!"ASN1_INTEGER");
863 int		i2c_ASN1_INTEGER(ASN1_INTEGER* a,ubyte** pp);
864 ASN1_INTEGER* c2i_ASN1_INTEGER(ASN1_INTEGER** a,const(ubyte)** pp,
865 			c_long length);
866 ASN1_INTEGER* d2i_ASN1_UINTEGER(ASN1_INTEGER** a,const(ubyte)** pp,
867 			c_long length);
868 ASN1_INTEGER* 	ASN1_INTEGER_dup(const(ASN1_INTEGER)* x);
869 int ASN1_INTEGER_cmp(const(ASN1_INTEGER)* x, const(ASN1_INTEGER)* y);
870 
871 mixin(DECLARE_ASN1_FUNCTIONS!"ASN1_ENUMERATED");
872 
873 int ASN1_UTCTIME_check(ASN1_UTCTIME* a);
874 ASN1_UTCTIME* ASN1_UTCTIME_set(ASN1_UTCTIME* s,time_t t);
875 ASN1_UTCTIME* ASN1_UTCTIME_adj(ASN1_UTCTIME* s, time_t t,
876 				int offset_day, c_long offset_sec);
877 int ASN1_UTCTIME_set_string(ASN1_UTCTIME* s, const(char)* str);
878 int ASN1_UTCTIME_cmp_time_t(const(ASN1_UTCTIME)* s, time_t t);
879 version (none) {
880 time_t ASN1_UTCTIME_get(const(ASN1_UTCTIME)* s);
881 }
882 
883 int ASN1_GENERALIZEDTIME_check(ASN1_GENERALIZEDTIME* a);
884 ASN1_GENERALIZEDTIME* ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME* s,time_t t);
885 ASN1_GENERALIZEDTIME* ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME* s,
886 	     time_t t, int offset_day, c_long offset_sec);
887 int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME* s, const(char)* str);
888 
889 mixin(DECLARE_ASN1_FUNCTIONS!"ASN1_OCTET_STRING");
890 ASN1_OCTET_STRING* 	ASN1_OCTET_STRING_dup(const(ASN1_OCTET_STRING)* a);
891 int 	ASN1_OCTET_STRING_cmp(const(ASN1_OCTET_STRING)* a, const(ASN1_OCTET_STRING)* b);
892 int 	ASN1_OCTET_STRING_set(ASN1_OCTET_STRING* str, const(ubyte)* data, int len);
893 
894 mixin(DECLARE_ASN1_FUNCTIONS!"ASN1_VISIBLESTRING");
895 mixin(DECLARE_ASN1_FUNCTIONS!"ASN1_UNIVERSALSTRING");
896 mixin(DECLARE_ASN1_FUNCTIONS!"ASN1_UTF8STRING");
897 mixin(DECLARE_ASN1_FUNCTIONS!"ASN1_NULL");
898 mixin(DECLARE_ASN1_FUNCTIONS!"ASN1_BMPSTRING");
899 
900 int UTF8_getc(const(char)* str, int len, c_ulong* val);
901 int UTF8_putc(char* str, int len, c_ulong value);
902 
903 mixin(DECLARE_ASN1_FUNCTIONS_name!("ASN1_STRING", "ASN1_PRINTABLE"));
904 
905 mixin(DECLARE_ASN1_FUNCTIONS_name!("ASN1_STRING", "DIRECTORYSTRING"));
906 mixin(DECLARE_ASN1_FUNCTIONS_name!("ASN1_STRING", "DISPLAYTEXT"));
907 mixin(DECLARE_ASN1_FUNCTIONS!"ASN1_PRINTABLESTRING");
908 mixin(DECLARE_ASN1_FUNCTIONS!"ASN1_T61STRING");
909 mixin(DECLARE_ASN1_FUNCTIONS!"ASN1_IA5STRING");
910 mixin(DECLARE_ASN1_FUNCTIONS!"ASN1_GENERALSTRING");
911 mixin(DECLARE_ASN1_FUNCTIONS!"ASN1_UTCTIME");
912 mixin(DECLARE_ASN1_FUNCTIONS!"ASN1_GENERALIZEDTIME");
913 mixin(DECLARE_ASN1_FUNCTIONS!"ASN1_TIME");
914 
915 mixin(DECLARE_ASN1_ITEM!"ASN1_OCTET_STRING_NDEF");
916 
917 ASN1_TIME* ASN1_TIME_set(ASN1_TIME* s,time_t t);
918 ASN1_TIME* ASN1_TIME_adj(ASN1_TIME* s,time_t t,
919 				int offset_day, c_long offset_sec);
920 int ASN1_TIME_check(ASN1_TIME* t);
921 ASN1_GENERALIZEDTIME* ASN1_TIME_to_generalizedtime(ASN1_TIME* t, ASN1_GENERALIZEDTIME** out_);
922 int ASN1_TIME_set_string(ASN1_TIME* s, const(char)* str);
923 
924 int i2d_ASN1_SET(STACK_OF!(OPENSSL_BLOCK) *a, ubyte** pp,
925 		 i2d_of_void* i2d, int ex_tag, int ex_class,
926 		 int is_set);
927 STACK_OF!(OPENSSL_BLOCK) *d2i_ASN1_SET(STACK_OF!(OPENSSL_BLOCK) **a,
928 			      const(ubyte)** pp,
929 			      c_long length, d2i_of_void* d2i,
930 			      ExternC!(void function(OPENSSL_BLOCK)) free_func, int ex_tag,
931 			      int ex_class);
932 
933 version(OPENSSL_NO_BIO) {} else {
934 int i2a_ASN1_INTEGER(BIO* bp, ASN1_INTEGER* a);
935 int a2i_ASN1_INTEGER(BIO* bp,ASN1_INTEGER* bs,char* buf,int size);
936 int i2a_ASN1_ENUMERATED(BIO* bp, ASN1_ENUMERATED* a);
937 int a2i_ASN1_ENUMERATED(BIO* bp,ASN1_ENUMERATED* bs,char* buf,int size);
938 int i2a_ASN1_OBJECT(BIO* bp,ASN1_OBJECT* a);
939 int a2i_ASN1_STRING(BIO* bp,ASN1_STRING* bs,char* buf,int size);
940 int i2a_ASN1_STRING(BIO* bp, ASN1_STRING* a, int type);
941 }
942 int i2t_ASN1_OBJECT(char* buf,int buf_len,ASN1_OBJECT* a);
943 
944 int a2d_ASN1_OBJECT(ubyte* out_,int olen, const(char)* buf, int num);
945 ASN1_OBJECT* ASN1_OBJECT_create(int nid, ubyte* data,int len,
946 	const(char)* sn, const(char)* ln);
947 
948 int ASN1_INTEGER_set(ASN1_INTEGER* a, c_long v);
949 c_long ASN1_INTEGER_get(const(ASN1_INTEGER)* a);
950 ASN1_INTEGER* BN_to_ASN1_INTEGER(const(BIGNUM)* bn, ASN1_INTEGER* ai);
951 BIGNUM* ASN1_INTEGER_to_BN(const(ASN1_INTEGER)* ai,BIGNUM* bn);
952 
953 int ASN1_ENUMERATED_set(ASN1_ENUMERATED* a, c_long v);
954 c_long ASN1_ENUMERATED_get(ASN1_ENUMERATED* a);
955 ASN1_ENUMERATED* BN_to_ASN1_ENUMERATED(BIGNUM* bn, ASN1_ENUMERATED* ai);
956 BIGNUM* ASN1_ENUMERATED_to_BN(ASN1_ENUMERATED* ai,BIGNUM* bn);
957 
958 /* General */
959 /* given a string, return the correct type, max is the maximum length */
960 int ASN1_PRINTABLE_type(const(ubyte)* s, int max);
961 
962 int i2d_ASN1_bytes(ASN1_STRING* a, ubyte** pp, int tag, int xclass);
963 ASN1_STRING* d2i_ASN1_bytes(ASN1_STRING** a, const(ubyte)** pp,
964 	c_long length, int Ptag, int Pclass);
965 c_ulong ASN1_tag2bit(int tag);
966 /* type is one or more of the B_ASN1_ values. */
967 ASN1_STRING* d2i_ASN1_type_bytes(ASN1_STRING** a,const(ubyte)** pp,
968 		c_long length,int type);
969 
970 /* PARSING */
971 int asn1_Finish(ASN1_CTX* c);
972 int asn1_const_Finish(ASN1_const_CTX* c);
973 
974 /* SPECIALS */
975 int ASN1_get_object(const(ubyte)** pp, c_long* plength, int* ptag,
976 	int* pclass, c_long omax);
977 int ASN1_check_infinite_end(ubyte** p,c_long len);
978 int ASN1_const_check_infinite_end(const(ubyte)** p,c_long len);
979 void ASN1_put_object(ubyte** pp, int constructed, int length,
980 	int tag, int xclass);
981 int ASN1_put_eoc(ubyte** pp);
982 int ASN1_object_size(int constructed, int length, int tag);
983 
984 /* Used to implement other functions */
985 void* ASN1_dup(i2d_of_void* i2d, d2i_of_void* d2i, void* x);
986 
987 auto ASN1_dup_of(type)(I2D_OF!type* i2d, D2I_OF!type* d2i, type* x) {
988     return cast(type*)(ASN1_dup(CHECKED_I2D_OF!type(i2d),
989 		     CHECKED_D2I_OF!type(d2i),
990 		     CHECKED_PTR_OF!type(x)));
991 }
992 
993 auto ASN1_dup_of_const(type)(I2D_OF!(const(type))* i2d, D2I_OF!type* d2i, const(type)* x) {
994     return cast(type*)(ASN1_dup(CHECKED_I2D_OF!(const(type))(i2d),
995 		     CHECKED_D2I_OF!type(d2i),
996 		     CHECKED_PTR_OF!(const(type))(x)));
997 }
998 
999 void* ASN1_item_dup(const(ASN1_ITEM)* it, void* x);
1000 
1001 /* ASN1 alloc/free macros for when a type is only used internally */
1002 
1003 template M_ASN1_new_of(string type) {
1004 	enum M_ASN1_new_of = "(cast(" ~ type ~ "*)ASN1_item_new(ASN1_ITEM_rptr!`" ~ type ~ "`))";
1005 }
1006 template M_ASN1_free_of(string x, string type) {
1007 	enum M_ASN1_free_of = "ASN1_item_free(CHECKED_PTR_OF!(" ~ type ~ ")(" ~ x ~ "), ASN1_ITEM_rptr!`" ~ type ~ "`))";
1008 }
1009 
1010 version (OPENSSL_NO_FP_API) {} else {
1011 void* ASN1_d2i_fp(ExternC!(void* function()) xnew, d2i_of_void* d2i, FILE* in_, void** x);
1012 
1013 type* ASN1_d2i_fp_of(type)(ExternC!(type* function()) xnew, d2i,in_,x) {
1014     return cast(type*)(ASN1_d2i_fp(CHECKED_NEW_OF!type(xnew),
1015 			CHECKED_D2I_OF!type(d2i),
1016 			in_,
1017 			CHECKED_PPTR_OF!type(x)));
1018 }
1019 
1020 void* ASN1_item_d2i_fp(const(ASN1_ITEM)* it, FILE* in_, void* x);
1021 int ASN1_i2d_fp(i2d_of_void* i2d,FILE* out_,void* x);
1022 
1023 auto ASN1_i2d_fp_of(type)(I2D_OF!(type) i2d, FILE* out_, const(type)* x) {
1024 	return ASN1_i2d_fp(CHECKED_I2D_OF!(type)(i2d), out_, CHECKED_PTR_OF!(type)(x));
1025 }
1026 
1027 auto ASN1_i2d_fp_of_const(type)(I2D_OF!(const(type)) i2d, FILE* out_, const(type)* x) {
1028 	return ASN1_i2d_fp(CHECKED_I2D_OF!(const(type))(i2d), out_, CHECKED_PTR_OF!(const(type))(x));
1029 }
1030 
1031 int ASN1_item_i2d_fp(const(ASN1_ITEM)* it, FILE* out_, void* x);
1032 int ASN1_STRING_print_ex_fp(FILE* fp, ASN1_STRING* str, c_ulong flags);
1033 }
1034 
1035 int ASN1_STRING_to_UTF8(char** out_, ASN1_STRING* in_);
1036 
1037 version(OPENSSL_NO_BIO) {} else {
1038 void* ASN1_d2i_bio(ExternC!(void* function()) xnew, d2i_of_void* d2i, BIO* in_, void** x);
1039 
1040 type* ASN1_d2i_bio_of(type)(ExternC!(type* function()) xnew, D2I_OF!type d2i, BIO* in_, type** x) {
1041 	return cast(type*)ASN1_d2i_bio(CHECKED_NEW_OF!type(xnew),
1042 		CHECKED_D2I_OF!type(d2i), in_, CHECKED_PPTR_OF!type(x));
1043 }
1044 
1045 void* ASN1_item_d2i_bio(const(ASN1_ITEM)* it, BIO* in_, void* x);
1046 int ASN1_i2d_bio(i2d_of_void* i2d,BIO* out_, ubyte* x);
1047 
1048 int ASN1_i2d_bio_of(type)(I2D_OF!type* i2d,BIO* out_,type* x) {
1049 	return ASN1_i2d_bio(CHECKED_I2D_OF!type(i2d), out_, CHECKED_PTR_OF!type(x));
1050 }
1051 
1052 int ASN1_i2d_bio_of_const(type)(I2D_OF!(const(type))* i2d,BIO* out_,type* x) {
1053 	return ASN1_i2d_bio(CHECKED_I2D_OF!type(i2d), out_, CHECKED_PTR_OF!(const(type))(x));
1054 }
1055 
1056 int ASN1_item_i2d_bio(const(ASN1_ITEM)* it, BIO* out_, void* x);
1057 int ASN1_UTCTIME_print(BIO* fp, const(ASN1_UTCTIME)* a);
1058 int ASN1_GENERALIZEDTIME_print(BIO* fp, const(ASN1_GENERALIZEDTIME)* a);
1059 int ASN1_TIME_print(BIO* fp, const(ASN1_TIME)* a);
1060 int ASN1_STRING_print(BIO* bp, const(ASN1_STRING)* v);
1061 int ASN1_STRING_print_ex(BIO* out_, ASN1_STRING* str, c_ulong flags);
1062 int ASN1_bn_print(BIO* bp, const(char)* number, const(BIGNUM)* num,
1063 				ubyte* buf, int off);
1064 int ASN1_parse(BIO* bp,const(ubyte)* pp,c_long len,int indent);
1065 int ASN1_parse_dump(BIO* bp,const(ubyte)* pp,c_long len,int indent,int dump);
1066 }
1067 const(char)* ASN1_tag2str(int tag);
1068 
1069 /* Used to load and write netscape format cert */
1070 
1071 mixin(DECLARE_ASN1_FUNCTIONS!"NETSCAPE_X509");
1072 
1073 int ASN1_UNIVERSALSTRING_to_string(ASN1_UNIVERSALSTRING* s);
1074 
1075 int ASN1_TYPE_set_octetstring(ASN1_TYPE* a,
1076 	ubyte* data, int len);
1077 int ASN1_TYPE_get_octetstring(ASN1_TYPE* a,
1078 	ubyte* data, int max_len);
1079 int ASN1_TYPE_set_int_octetstring(ASN1_TYPE* a, c_long num,
1080 	ubyte* data, int len);
1081 int ASN1_TYPE_get_int_octetstring(ASN1_TYPE* a,c_long* num,
1082 	ubyte* data, int max_len);
1083 
1084 STACK_OF!(OPENSSL_BLOCK) *ASN1_seq_unpack(const(ubyte)* buf, int len,
1085 				 d2i_of_void* d2i, ExternC!(void function(OPENSSL_BLOCK)) free_func);
1086 ubyte* ASN1_seq_pack(STACK_OF!(OPENSSL_BLOCK) *safes, i2d_of_void* i2d,
1087 			     ubyte** buf, int* len );
1088 void* ASN1_unpack_string(ASN1_STRING* oct, d2i_of_void* d2i);
1089 void* ASN1_item_unpack(ASN1_STRING* oct, const(ASN1_ITEM)* it);
1090 ASN1_STRING* ASN1_pack_string(void* obj, i2d_of_void* i2d,
1091 			      ASN1_OCTET_STRING** oct);
1092 
1093 auto ASN1_pack_string_of(type)(type* obj, I2D_OF!type* i2d, ASN1_OCTET_STRING** oct) {
1094 	return ASN1_pack_string(CHECKED_PTR_OF!type(obj), CHECKED_I2D_OF!type(i2d), oct);
1095 }
1096 
1097 ASN1_STRING* ASN1_item_pack(void* obj, const(ASN1_ITEM)* it, ASN1_OCTET_STRING** oct);
1098 
1099 void ASN1_STRING_set_default_mask(c_ulong mask);
1100 int ASN1_STRING_set_default_mask_asc(const(char)* p);
1101 c_ulong ASN1_STRING_get_default_mask();
1102 int ASN1_mbstring_copy(ASN1_STRING** out_, const(ubyte)* in_, int len,
1103 					int inform, c_ulong mask);
1104 int ASN1_mbstring_ncopy(ASN1_STRING** out_, const(ubyte)* in_, int len,
1105 					int inform, c_ulong mask,
1106 					c_long minsize, c_long maxsize);
1107 
1108 ASN1_STRING* ASN1_STRING_set_by_NID(ASN1_STRING** out_,
1109 		const(ubyte)* in_, int inlen, int inform, int nid);
1110 ASN1_STRING_TABLE* ASN1_STRING_TABLE_get(int nid);
1111 int ASN1_STRING_TABLE_add(int, c_long, c_long, c_ulong, c_ulong);
1112 void ASN1_STRING_TABLE_cleanup();
1113 
1114 /* ASN1 template functions */
1115 
1116 /* Old API compatible functions */
1117 ASN1_VALUE* ASN1_item_new(const(ASN1_ITEM)* it);
1118 void ASN1_item_free(ASN1_VALUE* val, const(ASN1_ITEM)* it);
1119 ASN1_VALUE* ASN1_item_d2i(ASN1_VALUE** val, const(ubyte)** in_, c_long len, const(ASN1_ITEM)* it);
1120 int ASN1_item_i2d(ASN1_VALUE* val, ubyte** out_, const(ASN1_ITEM)* it);
1121 int ASN1_item_ndef_i2d(ASN1_VALUE* val, ubyte** out_, const(ASN1_ITEM)* it);
1122 
1123 void ASN1_add_oid_module();
1124 
1125 ASN1_TYPE* ASN1_generate_nconf(char* str, CONF* nconf);
1126 ASN1_TYPE* ASN1_generate_v3(char* str, X509V3_CTX* cnf);
1127 
1128 /* ASN1 Print flags */
1129 
1130 /* Indicate missing OPTIONAL fields */
1131 enum ASN1_PCTX_FLAGS_SHOW_ABSENT = 0x001;
1132 /* Mark start and end of SEQUENCE */
1133 enum ASN1_PCTX_FLAGS_SHOW_SEQUENCE = 0x002;
1134 /* Mark start and end of SEQUENCE/SET OF */
1135 enum ASN1_PCTX_FLAGS_SHOW_SSOF = 0x004;
1136 /* Show the ASN1 type of primitives */
1137 enum ASN1_PCTX_FLAGS_SHOW_TYPE = 0x008;
1138 /* Don't show ASN1 type of ANY */
1139 enum ASN1_PCTX_FLAGS_NO_ANY_TYPE = 0x010;
1140 /* Don't show ASN1 type of MSTRINGs */
1141 enum ASN1_PCTX_FLAGS_NO_MSTRING_TYPE = 0x020;
1142 /* Don't show field names in SEQUENCE */
1143 enum ASN1_PCTX_FLAGS_NO_FIELD_NAME = 0x040;
1144 /* Show structure names of each SEQUENCE field */
1145 enum ASN1_PCTX_FLAGS_SHOW_FIELD_STRUCT_NAME = 0x080;
1146 /* Don't show structure name even at top level */
1147 enum ASN1_PCTX_FLAGS_NO_STRUCT_NAME = 0x100;
1148 
1149 int ASN1_item_print(BIO* out_, ASN1_VALUE* ifld, int indent,
1150 				const(ASN1_ITEM)* it, const(ASN1_PCTX)* pctx);
1151 ASN1_PCTX* ASN1_PCTX_new();
1152 void ASN1_PCTX_free(ASN1_PCTX* p);
1153 c_ulong ASN1_PCTX_get_flags(ASN1_PCTX* p);
1154 void ASN1_PCTX_set_flags(ASN1_PCTX* p, c_ulong flags);
1155 c_ulong ASN1_PCTX_get_nm_flags(ASN1_PCTX* p);
1156 void ASN1_PCTX_set_nm_flags(ASN1_PCTX* p, c_ulong flags);
1157 c_ulong ASN1_PCTX_get_cert_flags(ASN1_PCTX* p);
1158 void ASN1_PCTX_set_cert_flags(ASN1_PCTX* p, c_ulong flags);
1159 c_ulong ASN1_PCTX_get_oid_flags(ASN1_PCTX* p);
1160 void ASN1_PCTX_set_oid_flags(ASN1_PCTX* p, c_ulong flags);
1161 c_ulong ASN1_PCTX_get_str_flags(ASN1_PCTX* p);
1162 void ASN1_PCTX_set_str_flags(ASN1_PCTX* p, c_ulong flags);
1163 
1164 BIO_METHOD* BIO_f_asn1();
1165 
1166 BIO* BIO_new_NDEF(BIO* out_, ASN1_VALUE* val, const(ASN1_ITEM)* it);
1167 
1168 int i2d_ASN1_bio_stream(BIO* out_, ASN1_VALUE* val, BIO* in_, int flags,
1169 				const(ASN1_ITEM)* it);
1170 int PEM_write_bio_ASN1_stream(BIO* out_, ASN1_VALUE* val, BIO* in_, int flags,
1171 				const(char)* hdr,
1172 				const(ASN1_ITEM)* it);
1173 int SMIME_write_ASN1(BIO* bio, ASN1_VALUE* val, BIO* data, int flags,
1174 				int ctype_nid, int econt_nid,
1175 				STACK_OF!(X509_ALGOR) *mdalgs,
1176 				const(ASN1_ITEM)* it);
1177 ASN1_VALUE* SMIME_read_ASN1(BIO* bio, BIO** bcont, const(ASN1_ITEM)* it);
1178 int SMIME_crlf_copy(BIO* in_, BIO* out_, int flags);
1179 int SMIME_text(BIO* in_, BIO* out_);
1180 
1181 /* BEGIN ERROR CODES */
1182 /* The following lines are auto generated by the script mkerr.pl. Any changes
1183  * made after this point may be overwritten when the script is next run.
1184  */
1185 void ERR_load_ASN1_strings();
1186 
1187 /* Error codes for the ASN1 functions. */
1188 
1189 /* Function codes. */
1190 enum ASN1_F_A2D_ASN1_OBJECT = 100;
1191 enum ASN1_F_A2I_ASN1_ENUMERATED = 101;
1192 enum ASN1_F_A2I_ASN1_INTEGER = 102;
1193 enum ASN1_F_A2I_ASN1_STRING = 103;
1194 enum ASN1_F_APPEND_EXP = 176;
1195 enum ASN1_F_ASN1_BIT_STRING_SET_BIT = 183;
1196 enum ASN1_F_ASN1_CB = 177;
1197 enum ASN1_F_ASN1_CHECK_TLEN = 104;
1198 enum ASN1_F_ASN1_COLLATE_PRIMITIVE = 105;
1199 enum ASN1_F_ASN1_COLLECT = 106;
1200 enum ASN1_F_ASN1_D2I_EX_PRIMITIVE = 108;
1201 enum ASN1_F_ASN1_D2I_FP = 109;
1202 enum ASN1_F_ASN1_D2I_READ_BIO = 107;
1203 enum ASN1_F_ASN1_DIGEST = 184;
1204 enum ASN1_F_ASN1_DO_ADB = 110;
1205 enum ASN1_F_ASN1_DUP = 111;
1206 enum ASN1_F_ASN1_ENUMERATED_SET = 112;
1207 enum ASN1_F_ASN1_ENUMERATED_TO_BN = 113;
1208 enum ASN1_F_ASN1_EX_C2I = 204;
1209 enum ASN1_F_ASN1_FIND_END = 190;
1210 enum ASN1_F_ASN1_GENERALIZEDTIME_ADJ = 216;
1211 enum ASN1_F_ASN1_GENERALIZEDTIME_SET = 185;
1212 enum ASN1_F_ASN1_GENERATE_V3 = 178;
1213 enum ASN1_F_ASN1_GET_OBJECT = 114;
1214 enum ASN1_F_ASN1_HEADER_NEW = 115;
1215 enum ASN1_F_ASN1_I2D_BIO = 116;
1216 enum ASN1_F_ASN1_I2D_FP = 117;
1217 enum ASN1_F_ASN1_INTEGER_SET = 118;
1218 enum ASN1_F_ASN1_INTEGER_TO_BN = 119;
1219 enum ASN1_F_ASN1_ITEM_D2I_FP = 206;
1220 enum ASN1_F_ASN1_ITEM_DUP = 191;
1221 enum ASN1_F_ASN1_ITEM_EX_COMBINE_NEW = 121;
1222 enum ASN1_F_ASN1_ITEM_EX_D2I = 120;
1223 enum ASN1_F_ASN1_ITEM_I2D_BIO = 192;
1224 enum ASN1_F_ASN1_ITEM_I2D_FP = 193;
1225 enum ASN1_F_ASN1_ITEM_PACK = 198;
1226 enum ASN1_F_ASN1_ITEM_SIGN = 195;
1227 enum ASN1_F_ASN1_ITEM_SIGN_CTX = 220;
1228 enum ASN1_F_ASN1_ITEM_UNPACK = 199;
1229 enum ASN1_F_ASN1_ITEM_VERIFY = 197;
1230 enum ASN1_F_ASN1_MBSTRING_NCOPY = 122;
1231 enum ASN1_F_ASN1_OBJECT_NEW = 123;
1232 enum ASN1_F_ASN1_OUTPUT_DATA = 214;
1233 enum ASN1_F_ASN1_PACK_STRING = 124;
1234 enum ASN1_F_ASN1_PCTX_NEW = 205;
1235 enum ASN1_F_ASN1_PKCS5_PBE_SET = 125;
1236 enum ASN1_F_ASN1_SEQ_PACK = 126;
1237 enum ASN1_F_ASN1_SEQ_UNPACK = 127;
1238 enum ASN1_F_ASN1_SIGN = 128;
1239 enum ASN1_F_ASN1_STR2TYPE = 179;
1240 enum ASN1_F_ASN1_STRING_SET = 186;
1241 enum ASN1_F_ASN1_STRING_TABLE_ADD = 129;
1242 enum ASN1_F_ASN1_STRING_TYPE_NEW = 130;
1243 enum ASN1_F_ASN1_TEMPLATE_EX_D2I = 132;
1244 enum ASN1_F_ASN1_TEMPLATE_NEW = 133;
1245 enum ASN1_F_ASN1_TEMPLATE_NOEXP_D2I = 131;
1246 enum ASN1_F_ASN1_TIME_ADJ = 217;
1247 enum ASN1_F_ASN1_TIME_SET = 175;
1248 enum ASN1_F_ASN1_TYPE_GET_INT_OCTETSTRING = 134;
1249 enum ASN1_F_ASN1_TYPE_GET_OCTETSTRING = 135;
1250 enum ASN1_F_ASN1_UNPACK_STRING = 136;
1251 enum ASN1_F_ASN1_UTCTIME_ADJ = 218;
1252 enum ASN1_F_ASN1_UTCTIME_SET = 187;
1253 enum ASN1_F_ASN1_VERIFY = 137;
1254 enum ASN1_F_B64_READ_ASN1 = 209;
1255 enum ASN1_F_B64_WRITE_ASN1 = 210;
1256 enum ASN1_F_BIO_NEW_NDEF = 208;
1257 enum ASN1_F_BITSTR_CB = 180;
1258 enum ASN1_F_BN_TO_ASN1_ENUMERATED = 138;
1259 enum ASN1_F_BN_TO_ASN1_INTEGER = 139;
1260 enum ASN1_F_C2I_ASN1_BIT_STRING = 189;
1261 enum ASN1_F_C2I_ASN1_INTEGER = 194;
1262 enum ASN1_F_C2I_ASN1_OBJECT = 196;
1263 enum ASN1_F_COLLECT_DATA = 140;
1264 enum ASN1_F_D2I_ASN1_BIT_STRING = 141;
1265 enum ASN1_F_D2I_ASN1_BOOLEAN = 142;
1266 enum ASN1_F_D2I_ASN1_BYTES = 143;
1267 enum ASN1_F_D2I_ASN1_GENERALIZEDTIME = 144;
1268 enum ASN1_F_D2I_ASN1_HEADER = 145;
1269 enum ASN1_F_D2I_ASN1_INTEGER = 146;
1270 enum ASN1_F_D2I_ASN1_OBJECT = 147;
1271 enum ASN1_F_D2I_ASN1_SET = 148;
1272 enum ASN1_F_D2I_ASN1_TYPE_BYTES = 149;
1273 enum ASN1_F_D2I_ASN1_UINTEGER = 150;
1274 enum ASN1_F_D2I_ASN1_UTCTIME = 151;
1275 enum ASN1_F_D2I_AUTOPRIVATEKEY = 207;
1276 enum ASN1_F_D2I_NETSCAPE_RSA = 152;
1277 enum ASN1_F_D2I_NETSCAPE_RSA_2 = 153;
1278 enum ASN1_F_D2I_PRIVATEKEY = 154;
1279 enum ASN1_F_D2I_PUBLICKEY = 155;
1280 enum ASN1_F_D2I_RSA_NET = 200;
1281 enum ASN1_F_D2I_RSA_NET_2 = 201;
1282 enum ASN1_F_D2I_X509 = 156;
1283 enum ASN1_F_D2I_X509_CINF = 157;
1284 enum ASN1_F_D2I_X509_PKEY = 159;
1285 enum ASN1_F_I2D_ASN1_BIO_STREAM = 211;
1286 enum ASN1_F_I2D_ASN1_SET = 188;
1287 enum ASN1_F_I2D_ASN1_TIME = 160;
1288 enum ASN1_F_I2D_DSA_PUBKEY = 161;
1289 enum ASN1_F_I2D_EC_PUBKEY = 181;
1290 enum ASN1_F_I2D_PRIVATEKEY = 163;
1291 enum ASN1_F_I2D_PUBLICKEY = 164;
1292 enum ASN1_F_I2D_RSA_NET = 162;
1293 enum ASN1_F_I2D_RSA_PUBKEY = 165;
1294 enum ASN1_F_LONG_C2I = 166;
1295 enum ASN1_F_OID_MODULE_INIT = 174;
1296 enum ASN1_F_PARSE_TAGGING = 182;
1297 enum ASN1_F_PKCS5_PBE2_SET_IV = 167;
1298 enum ASN1_F_PKCS5_PBE_SET = 202;
1299 enum ASN1_F_PKCS5_PBE_SET0_ALGOR = 215;
1300 enum ASN1_F_PKCS5_PBKDF2_SET = 219;
1301 enum ASN1_F_SMIME_READ_ASN1 = 212;
1302 enum ASN1_F_SMIME_TEXT = 213;
1303 enum ASN1_F_X509_CINF_NEW = 168;
1304 enum ASN1_F_X509_CRL_ADD0_REVOKED = 169;
1305 enum ASN1_F_X509_INFO_NEW = 170;
1306 enum ASN1_F_X509_NAME_ENCODE = 203;
1307 enum ASN1_F_X509_NAME_EX_D2I = 158;
1308 enum ASN1_F_X509_NAME_EX_NEW = 171;
1309 enum ASN1_F_X509_NEW = 172;
1310 enum ASN1_F_X509_PKEY_NEW = 173;
1311 
1312 /* Reason codes. */
1313 enum ASN1_R_ADDING_OBJECT = 171;
1314 enum ASN1_R_ASN1_PARSE_ERROR = 203;
1315 enum ASN1_R_ASN1_SIG_PARSE_ERROR = 204;
1316 enum ASN1_R_AUX_ERROR = 100;
1317 enum ASN1_R_BAD_CLASS = 101;
1318 enum ASN1_R_BAD_OBJECT_HEADER = 102;
1319 enum ASN1_R_BAD_PASSWORD_READ = 103;
1320 enum ASN1_R_BAD_TAG = 104;
1321 enum ASN1_R_BMPSTRING_IS_WRONG_LENGTH = 214;
1322 enum ASN1_R_BN_LIB = 105;
1323 enum ASN1_R_BOOLEAN_IS_WRONG_LENGTH = 106;
1324 enum ASN1_R_BUFFER_TOO_SMALL = 107;
1325 enum ASN1_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER = 108;
1326 enum ASN1_R_CONTEXT_NOT_INITIALISED = 217;
1327 enum ASN1_R_DATA_IS_WRONG = 109;
1328 enum ASN1_R_DECODE_ERROR = 110;
1329 enum ASN1_R_DECODING_ERROR = 111;
1330 enum ASN1_R_DEPTH_EXCEEDED = 174;
1331 enum ASN1_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED = 198;
1332 enum ASN1_R_ENCODE_ERROR = 112;
1333 enum ASN1_R_ERROR_GETTING_TIME = 173;
1334 enum ASN1_R_ERROR_LOADING_SECTION = 172;
1335 enum ASN1_R_ERROR_PARSING_SET_ELEMENT = 113;
1336 enum ASN1_R_ERROR_SETTING_CIPHER_PARAMS = 114;
1337 enum ASN1_R_EXPECTING_AN_INTEGER = 115;
1338 enum ASN1_R_EXPECTING_AN_OBJECT = 116;
1339 enum ASN1_R_EXPECTING_A_BOOLEAN = 117;
1340 enum ASN1_R_EXPECTING_A_TIME = 118;
1341 enum ASN1_R_EXPLICIT_LENGTH_MISMATCH = 119;
1342 enum ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED = 120;
1343 enum ASN1_R_FIELD_MISSING = 121;
1344 enum ASN1_R_FIRST_NUM_TOO_LARGE = 122;
1345 enum ASN1_R_HEADER_TOO_LONG = 123;
1346 enum ASN1_R_ILLEGAL_BITSTRING_FORMAT = 175;
1347 enum ASN1_R_ILLEGAL_BOOLEAN = 176;
1348 enum ASN1_R_ILLEGAL_CHARACTERS = 124;
1349 enum ASN1_R_ILLEGAL_FORMAT = 177;
1350 enum ASN1_R_ILLEGAL_HEX = 178;
1351 enum ASN1_R_ILLEGAL_IMPLICIT_TAG = 179;
1352 enum ASN1_R_ILLEGAL_INTEGER = 180;
1353 enum ASN1_R_ILLEGAL_NESTED_TAGGING = 181;
1354 enum ASN1_R_ILLEGAL_NULL = 125;
1355 enum ASN1_R_ILLEGAL_NULL_VALUE = 182;
1356 enum ASN1_R_ILLEGAL_OBJECT = 183;
1357 enum ASN1_R_ILLEGAL_OPTIONAL_ANY = 126;
1358 enum ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE = 170;
1359 enum ASN1_R_ILLEGAL_TAGGED_ANY = 127;
1360 enum ASN1_R_ILLEGAL_TIME_VALUE = 184;
1361 enum ASN1_R_INTEGER_NOT_ASCII_FORMAT = 185;
1362 enum ASN1_R_INTEGER_TOO_LARGE_FOR_LONG = 128;
1363 enum ASN1_R_INVALID_BMPSTRING_LENGTH = 129;
1364 enum ASN1_R_INVALID_DIGIT = 130;
1365 enum ASN1_R_INVALID_MIME_TYPE = 205;
1366 enum ASN1_R_INVALID_MODIFIER = 186;
1367 enum ASN1_R_INVALID_NUMBER = 187;
1368 enum ASN1_R_INVALID_OBJECT_ENCODING = 216;
1369 enum ASN1_R_INVALID_SEPARATOR = 131;
1370 enum ASN1_R_INVALID_TIME_FORMAT = 132;
1371 enum ASN1_R_INVALID_UNIVERSALSTRING_LENGTH = 133;
1372 enum ASN1_R_INVALID_UTF8STRING = 134;
1373 enum ASN1_R_IV_TOO_LARGE = 135;
1374 enum ASN1_R_LENGTH_ERROR = 136;
1375 enum ASN1_R_LIST_ERROR = 188;
1376 enum ASN1_R_MIME_NO_CONTENT_TYPE = 206;
1377 enum ASN1_R_MIME_PARSE_ERROR = 207;
1378 enum ASN1_R_MIME_SIG_PARSE_ERROR = 208;
1379 enum ASN1_R_MISSING_EOC = 137;
1380 enum ASN1_R_MISSING_SECOND_NUMBER = 138;
1381 enum ASN1_R_MISSING_VALUE = 189;
1382 enum ASN1_R_MSTRING_NOT_UNIVERSAL = 139;
1383 enum ASN1_R_MSTRING_WRONG_TAG = 140;
1384 enum ASN1_R_NESTED_ASN1_STRING = 197;
1385 enum ASN1_R_NON_HEX_CHARACTERS = 141;
1386 enum ASN1_R_NOT_ASCII_FORMAT = 190;
1387 enum ASN1_R_NOT_ENOUGH_DATA = 142;
1388 enum ASN1_R_NO_CONTENT_TYPE = 209;
1389 enum ASN1_R_NO_DEFAULT_DIGEST = 201;
1390 enum ASN1_R_NO_MATCHING_CHOICE_TYPE = 143;
1391 enum ASN1_R_NO_MULTIPART_BODY_FAILURE = 210;
1392 enum ASN1_R_NO_MULTIPART_BOUNDARY = 211;
1393 enum ASN1_R_NO_SIG_CONTENT_TYPE = 212;
1394 enum ASN1_R_NULL_IS_WRONG_LENGTH = 144;
1395 enum ASN1_R_OBJECT_NOT_ASCII_FORMAT = 191;
1396 enum ASN1_R_ODD_NUMBER_OF_CHARS = 145;
1397 enum ASN1_R_PRIVATE_KEY_HEADER_MISSING = 146;
1398 enum ASN1_R_SECOND_NUMBER_TOO_LARGE = 147;
1399 enum ASN1_R_SEQUENCE_LENGTH_MISMATCH = 148;
1400 enum ASN1_R_SEQUENCE_NOT_CONSTRUCTED = 149;
1401 enum ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG = 192;
1402 enum ASN1_R_SHORT_LINE = 150;
1403 enum ASN1_R_SIG_INVALID_MIME_TYPE = 213;
1404 enum ASN1_R_STREAMING_NOT_SUPPORTED = 202;
1405 enum ASN1_R_STRING_TOO_LONG = 151;
1406 enum ASN1_R_STRING_TOO_SHORT = 152;
1407 enum ASN1_R_TAG_VALUE_TOO_HIGH = 153;
1408 enum ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD = 154;
1409 enum ASN1_R_TIME_NOT_ASCII_FORMAT = 193;
1410 enum ASN1_R_TOO_LONG = 155;
1411 enum ASN1_R_TYPE_NOT_CONSTRUCTED = 156;
1412 enum ASN1_R_UNABLE_TO_DECODE_RSA_KEY = 157;
1413 enum ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY = 158;
1414 enum ASN1_R_UNEXPECTED_EOC = 159;
1415 enum ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH = 215;
1416 enum ASN1_R_UNKNOWN_FORMAT = 160;
1417 enum ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM = 161;
1418 enum ASN1_R_UNKNOWN_OBJECT_TYPE = 162;
1419 enum ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE = 163;
1420 enum ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM = 199;
1421 enum ASN1_R_UNKNOWN_TAG = 194;
1422 enum ASN1_R_UNKOWN_FORMAT = 195;
1423 enum ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE = 164;
1424 enum ASN1_R_UNSUPPORTED_CIPHER = 165;
1425 enum ASN1_R_UNSUPPORTED_ENCRYPTION_ALGORITHM = 166;
1426 enum ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE = 167;
1427 enum ASN1_R_UNSUPPORTED_TYPE = 196;
1428 enum ASN1_R_WRONG_PUBLIC_KEY_TYPE = 200;
1429 enum ASN1_R_WRONG_TAG = 168;
1430 enum ASN1_R_WRONG_TYPE = 169;