xref: /openbsd/lib/libcrypto/asn1/asn1.h (revision b4712960)
1 /* $OpenBSD: asn1.h,v 1.92 2024/04/10 14:55:12 beck Exp $ */
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 #ifndef HEADER_ASN1_H
60 #define HEADER_ASN1_H
61 
62 #include <time.h>
63 
64 #include <openssl/opensslconf.h>
65 
66 #ifndef OPENSSL_NO_BIO
67 #include <openssl/bio.h>
68 #endif
69 #include <openssl/bn.h>
70 #include <openssl/stack.h>
71 #include <openssl/safestack.h>
72 
73 #include <openssl/ossl_typ.h>
74 
75 #ifdef  __cplusplus
76 extern "C" {
77 #endif
78 
79 #define V_ASN1_UNIVERSAL		0x00
80 #define	V_ASN1_APPLICATION		0x40
81 #define V_ASN1_CONTEXT_SPECIFIC		0x80
82 #define V_ASN1_PRIVATE			0xc0
83 
84 #define V_ASN1_CONSTRUCTED		0x20
85 #define V_ASN1_PRIMITIVE_TAG		0x1f
86 #define V_ASN1_PRIMATIVE_TAG		0x1f
87 
88 #define V_ASN1_APP_CHOOSE		-2	/* let the recipient choose */
89 #define V_ASN1_OTHER			-3	/* used in ASN1_TYPE */
90 #define V_ASN1_ANY			-4	/* used in ASN1 template code */
91 
92 #define V_ASN1_NEG			0x100	/* negative flag */
93 
94 #define V_ASN1_UNDEF			-1
95 #define V_ASN1_EOC			0
96 #define V_ASN1_BOOLEAN			1	/**/
97 #define V_ASN1_INTEGER			2
98 #define V_ASN1_NEG_INTEGER		(2 | V_ASN1_NEG)
99 #define V_ASN1_BIT_STRING		3
100 #define V_ASN1_OCTET_STRING		4
101 #define V_ASN1_NULL			5
102 #define V_ASN1_OBJECT			6
103 #define V_ASN1_OBJECT_DESCRIPTOR	7
104 #define V_ASN1_EXTERNAL			8
105 #define V_ASN1_REAL			9
106 #define V_ASN1_ENUMERATED		10
107 #define V_ASN1_NEG_ENUMERATED		(10 | V_ASN1_NEG)
108 #define V_ASN1_UTF8STRING		12
109 #define V_ASN1_SEQUENCE			16
110 #define V_ASN1_SET			17
111 #define V_ASN1_NUMERICSTRING		18	/**/
112 #define V_ASN1_PRINTABLESTRING		19
113 #define V_ASN1_T61STRING		20
114 #define V_ASN1_TELETEXSTRING		20	/* alias */
115 #define V_ASN1_VIDEOTEXSTRING		21	/**/
116 #define V_ASN1_IA5STRING		22
117 #define V_ASN1_UTCTIME			23
118 #define V_ASN1_GENERALIZEDTIME		24	/**/
119 #define V_ASN1_GRAPHICSTRING		25	/**/
120 #define V_ASN1_ISO64STRING		26	/**/
121 #define V_ASN1_VISIBLESTRING		26	/* alias */
122 #define V_ASN1_GENERALSTRING		27	/**/
123 #define V_ASN1_UNIVERSALSTRING		28	/**/
124 #define V_ASN1_BMPSTRING		30
125 
126 #define B_ASN1_NUMERICSTRING	0x0001
127 #define B_ASN1_PRINTABLESTRING	0x0002
128 #define B_ASN1_T61STRING	0x0004
129 #define B_ASN1_TELETEXSTRING	0x0004
130 #define B_ASN1_VIDEOTEXSTRING	0x0008
131 #define B_ASN1_IA5STRING	0x0010
132 #define B_ASN1_GRAPHICSTRING	0x0020
133 #define B_ASN1_ISO64STRING	0x0040
134 #define B_ASN1_VISIBLESTRING	0x0040
135 #define B_ASN1_GENERALSTRING	0x0080
136 #define B_ASN1_UNIVERSALSTRING	0x0100
137 #define B_ASN1_OCTET_STRING	0x0200
138 #define B_ASN1_BIT_STRING	0x0400
139 #define B_ASN1_BMPSTRING	0x0800
140 #define B_ASN1_UNKNOWN		0x1000
141 #define B_ASN1_UTF8STRING	0x2000
142 #define B_ASN1_UTCTIME		0x4000
143 #define B_ASN1_GENERALIZEDTIME	0x8000
144 #define B_ASN1_SEQUENCE		0x10000
145 
146 /* For use with ASN1_mbstring_copy() */
147 #define MBSTRING_FLAG		0x1000
148 #define MBSTRING_UTF8		(MBSTRING_FLAG)
149 #define MBSTRING_ASC		(MBSTRING_FLAG|1)
150 #define MBSTRING_BMP		(MBSTRING_FLAG|2)
151 #define MBSTRING_UNIV		(MBSTRING_FLAG|4)
152 
153 #define SMIME_OLDMIME		0x400
154 #define SMIME_CRLFEOL		0x800
155 #define SMIME_STREAM		0x1000
156 
157 struct X509_algor_st;
158 DECLARE_STACK_OF(X509_ALGOR)
159 
160 #define DECLARE_ASN1_SET_OF(type) /* filled in by mkstack.pl */
161 #define IMPLEMENT_ASN1_SET_OF(type) /* nothing, no longer needed */
162 
163 #define ASN1_STRING_FLAG_BITS_LEFT 0x08 /* Set if 0x07 has bits left value */
164 /* This indicates that the ASN1_STRING is not a real value but just a place
165  * holder for the location where indefinite length constructed data should
166  * be inserted in the memory buffer
167  */
168 #define ASN1_STRING_FLAG_NDEF 0x010
169 
170 /* This flag is used by the CMS code to indicate that a string is not
171  * complete and is a place holder for content when it had all been
172  * accessed. The flag will be reset when content has been written to it.
173  */
174 
175 #define ASN1_STRING_FLAG_CONT 0x020
176 /* This flag is used by ASN1 code to indicate an ASN1_STRING is an MSTRING
177  * type.
178  */
179 #define ASN1_STRING_FLAG_MSTRING 0x040
180 /* This is the base type that holds just about everything :-) */
181 struct asn1_string_st {
182 	int length;
183 	int type;
184 	unsigned char *data;
185 	/* The value of the following field depends on the type being
186 	 * held.  It is mostly being used for BIT_STRING so if the
187 	 * input data has a non-zero 'unused bits' value, it will be
188 	 * handled correctly */
189 	long flags;
190 };
191 
192 /* ASN1_ENCODING structure: this is used to save the received
193  * encoding of an ASN1 type. This is useful to get round
194  * problems with invalid encodings which can break signatures.
195  */
196 
197 typedef struct ASN1_ENCODING_st {
198 	unsigned char *enc;	/* DER encoding */
199 	long len;		/* Length of encoding */
200 	int modified;		 /* set to 1 if 'enc' is invalid */
201 } ASN1_ENCODING;
202 
203 /* Used with ASN1 LONG type: if a long is set to this it is omitted */
204 #define ASN1_LONG_UNDEF	0x7fffffffL
205 
206 #define STABLE_FLAGS_MALLOC	0x01
207 #define STABLE_NO_MASK		0x02
208 #define DIRSTRING_TYPE	\
209  (B_ASN1_PRINTABLESTRING|B_ASN1_T61STRING|B_ASN1_BMPSTRING|B_ASN1_UTF8STRING)
210 #define PKCS9STRING_TYPE (DIRSTRING_TYPE|B_ASN1_IA5STRING)
211 
212 typedef struct asn1_string_table_st {
213 	int nid;
214 	long minsize;
215 	long maxsize;
216 	unsigned long mask;
217 	unsigned long flags;
218 } ASN1_STRING_TABLE;
219 
220 /* Declarations for template structures: for full definitions
221  * see asn1t.h
222  */
223 typedef struct ASN1_TEMPLATE_st ASN1_TEMPLATE;
224 typedef struct ASN1_TLC_st ASN1_TLC;
225 /* This is just an opaque pointer */
226 typedef struct ASN1_VALUE_st ASN1_VALUE;
227 
228 #ifndef LIBRESSL_INTERNAL
229 
230 /* Declare ASN1 functions: the implement macro in in asn1t.h */
231 
232 #define DECLARE_ASN1_FUNCTIONS(type) DECLARE_ASN1_FUNCTIONS_name(type, type)
233 
234 #define DECLARE_ASN1_ALLOC_FUNCTIONS(type) \
235 	DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, type)
236 
237 #define DECLARE_ASN1_FUNCTIONS_name(type, name) \
238 	DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \
239 	DECLARE_ASN1_ENCODE_FUNCTIONS(type, name, name)
240 
241 #define DECLARE_ASN1_FUNCTIONS_fname(type, itname, name) \
242 	DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \
243 	DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name)
244 
245 #define	DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) \
246 	type *d2i_##name(type **a, const unsigned char **in, long len); \
247 	int i2d_##name(type *a, unsigned char **out); \
248 	DECLARE_ASN1_ITEM(itname)
249 
250 #define	DECLARE_ASN1_ENCODE_FUNCTIONS_const(type, name) \
251 	type *d2i_##name(type **a, const unsigned char **in, long len); \
252 	int i2d_##name(const type *a, unsigned char **out); \
253 	DECLARE_ASN1_ITEM(name)
254 
255 #define	DECLARE_ASN1_NDEF_FUNCTION(name) \
256 	int i2d_##name##_NDEF(name *a, unsigned char **out);
257 
258 #define DECLARE_ASN1_FUNCTIONS_const(name) \
259 	DECLARE_ASN1_ALLOC_FUNCTIONS(name) \
260 	DECLARE_ASN1_ENCODE_FUNCTIONS_const(name, name)
261 
262 #define DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \
263 	type *name##_new(void); \
264 	void name##_free(type *a);
265 
266 #define DECLARE_ASN1_PRINT_FUNCTION(stname) \
267 	DECLARE_ASN1_PRINT_FUNCTION_fname(stname, stname)
268 
269 #define DECLARE_ASN1_PRINT_FUNCTION_fname(stname, fname) \
270 	int fname##_print_ctx(BIO *out, stname *x, int indent, \
271 					 const ASN1_PCTX *pctx);
272 
273 #endif /* !LIBRESSL_INTERNAL */
274 
275 #define D2I_OF(type) type *(*)(type **,const unsigned char **,long)
276 #define I2D_OF(type) int (*)(type *,unsigned char **)
277 #define I2D_OF_const(type) int (*)(const type *,unsigned char **)
278 
279 #define CHECKED_D2I_OF(type, d2i) \
280     ((d2i_of_void*) (1 ? d2i : ((D2I_OF(type))0)))
281 #define CHECKED_I2D_OF(type, i2d) \
282     ((i2d_of_void*) (1 ? i2d : ((I2D_OF(type))0)))
283 #define CHECKED_NEW_OF(type, xnew) \
284     ((void *(*)(void)) (1 ? xnew : ((type *(*)(void))0)))
285 #define CHECKED_PTR_OF(type, p) \
286     ((void*) (1 ? p : (type*)0))
287 #define CHECKED_PPTR_OF(type, p) \
288     ((void**) (1 ? p : (type**)0))
289 
290 #define TYPEDEF_D2I_OF(type) typedef type *d2i_of_##type(type **,const unsigned char **,long)
291 #define TYPEDEF_I2D_OF(type) typedef int i2d_of_##type(type *,unsigned char **)
292 #define TYPEDEF_D2I2D_OF(type) TYPEDEF_D2I_OF(type); TYPEDEF_I2D_OF(type)
293 
294 TYPEDEF_D2I2D_OF(void);
295 
296 /* The following macros and typedefs allow an ASN1_ITEM
297  * to be embedded in a structure and referenced. Since
298  * the ASN1_ITEM pointers need to be globally accessible
299  * (possibly from shared libraries) they may exist in
300  * different forms. On platforms that support it the
301  * ASN1_ITEM structure itself will be globally exported.
302  * Other platforms will export a function that returns
303  * an ASN1_ITEM pointer.
304  *
305  * To handle both cases transparently the macros below
306  * should be used instead of hard coding an ASN1_ITEM
307  * pointer in a structure.
308  *
309  * The structure will look like this:
310  *
311  * typedef struct SOMETHING_st {
312  *      ...
313  *      ASN1_ITEM_EXP *iptr;
314  *      ...
315  * } SOMETHING;
316  *
317  * It would be initialised as e.g.:
318  *
319  * SOMETHING somevar = {...,ASN1_ITEM_ref(X509),...};
320  *
321  * and the actual pointer extracted with:
322  *
323  * const ASN1_ITEM *it = ASN1_ITEM_ptr(somevar.iptr);
324  *
325  * Finally an ASN1_ITEM pointer can be extracted from an
326  * appropriate reference with: ASN1_ITEM_rptr(X509). This
327  * would be used when a function takes an ASN1_ITEM * argument.
328  *
329  */
330 
331 /* ASN1_ITEM pointer exported type */
332 typedef const ASN1_ITEM ASN1_ITEM_EXP;
333 
334 #ifndef LIBRESSL_INTERNAL
335 
336 /* Macro to obtain ASN1_ITEM pointer from exported type */
337 #define ASN1_ITEM_ptr(iptr) (iptr)
338 
339 /* Macro to include ASN1_ITEM pointer from base type */
340 #define ASN1_ITEM_ref(iptr) (&(iptr##_it))
341 
342 #define ASN1_ITEM_rptr(ref) (&(ref##_it))
343 
344 #define DECLARE_ASN1_ITEM(name) \
345 	extern const ASN1_ITEM name##_it;
346 
347 #endif /* !LIBRESSL_INTERNAL */
348 
349 /* Parameters used by ASN1_STRING_print_ex() */
350 
351 /* These determine which characters to escape:
352  * RFC2253 special characters, control characters and
353  * MSB set characters
354  */
355 
356 #define ASN1_STRFLGS_ESC_2253		1
357 #define ASN1_STRFLGS_ESC_CTRL		2
358 #define ASN1_STRFLGS_ESC_MSB		4
359 
360 
361 /* This flag determines how we do escaping: normally
362  * RC2253 backslash only, set this to use backslash and
363  * quote.
364  */
365 
366 #define ASN1_STRFLGS_ESC_QUOTE		8
367 
368 
369 /* These three flags are internal use only. */
370 
371 /* Character is a valid PrintableString character */
372 #define CHARTYPE_PRINTABLESTRING	0x10
373 /* Character needs escaping if it is the first character */
374 #define CHARTYPE_FIRST_ESC_2253		0x20
375 /* Character needs escaping if it is the last character */
376 #define CHARTYPE_LAST_ESC_2253		0x40
377 
378 /* NB the internal flags are safely reused below by flags
379  * handled at the top level.
380  */
381 
382 /* If this is set we convert all character strings
383  * to UTF8 first
384  */
385 
386 #define ASN1_STRFLGS_UTF8_CONVERT	0x10
387 
388 /* If this is set we don't attempt to interpret content:
389  * just assume all strings are 1 byte per character. This
390  * will produce some pretty odd looking output!
391  */
392 
393 #define ASN1_STRFLGS_IGNORE_TYPE	0x20
394 
395 /* If this is set we include the string type in the output */
396 #define ASN1_STRFLGS_SHOW_TYPE		0x40
397 
398 /* This determines which strings to display and which to
399  * 'dump' (hex dump of content octets or DER encoding). We can
400  * only dump non character strings or everything. If we
401  * don't dump 'unknown' they are interpreted as character
402  * strings with 1 octet per character and are subject to
403  * the usual escaping options.
404  */
405 
406 #define ASN1_STRFLGS_DUMP_ALL		0x80
407 #define ASN1_STRFLGS_DUMP_UNKNOWN	0x100
408 
409 /* These determine what 'dumping' does, we can dump the
410  * content octets or the DER encoding: both use the
411  * RFC2253 #NNNNN notation.
412  */
413 
414 #define ASN1_STRFLGS_DUMP_DER		0x200
415 
416 /* All the string flags consistent with RFC2253,
417  * escaping control characters isn't essential in
418  * RFC2253 but it is advisable anyway.
419  */
420 
421 #define ASN1_STRFLGS_RFC2253	(ASN1_STRFLGS_ESC_2253 | \
422 				ASN1_STRFLGS_ESC_CTRL | \
423 				ASN1_STRFLGS_ESC_MSB | \
424 				ASN1_STRFLGS_UTF8_CONVERT | \
425 				ASN1_STRFLGS_DUMP_UNKNOWN | \
426 				ASN1_STRFLGS_DUMP_DER)
427 
428 DECLARE_STACK_OF(ASN1_INTEGER)
429 
430 DECLARE_STACK_OF(ASN1_GENERALSTRING)
431 
432 typedef struct asn1_type_st {
433 	int type;
434 	union {
435 		char *ptr;
436 		ASN1_BOOLEAN		boolean;
437 		ASN1_STRING *		asn1_string;
438 		ASN1_OBJECT *		object;
439 		ASN1_INTEGER *		integer;
440 		ASN1_ENUMERATED *	enumerated;
441 		ASN1_BIT_STRING *	bit_string;
442 		ASN1_OCTET_STRING *	octet_string;
443 		ASN1_PRINTABLESTRING *	printablestring;
444 		ASN1_T61STRING *	t61string;
445 		ASN1_IA5STRING *	ia5string;
446 		ASN1_GENERALSTRING *	generalstring;
447 		ASN1_BMPSTRING *	bmpstring;
448 		ASN1_UNIVERSALSTRING *	universalstring;
449 		ASN1_UTCTIME *		utctime;
450 		ASN1_GENERALIZEDTIME *	generalizedtime;
451 		ASN1_VISIBLESTRING *	visiblestring;
452 		ASN1_UTF8STRING *	utf8string;
453 		/* set and sequence are left complete and still
454 		 * contain the set or sequence bytes */
455 		ASN1_STRING *		set;
456 		ASN1_STRING *		sequence;
457 		ASN1_VALUE *		asn1_value;
458 	} value;
459 } ASN1_TYPE;
460 
461 DECLARE_STACK_OF(ASN1_TYPE)
462 
463 typedef STACK_OF(ASN1_TYPE) ASN1_SEQUENCE_ANY;
464 
465 ASN1_SEQUENCE_ANY *d2i_ASN1_SEQUENCE_ANY(ASN1_SEQUENCE_ANY **a, const unsigned char **in, long len);
466 int i2d_ASN1_SEQUENCE_ANY(const ASN1_SEQUENCE_ANY *a, unsigned char **out);
467 extern const ASN1_ITEM ASN1_SEQUENCE_ANY_it;
468 ASN1_SEQUENCE_ANY *d2i_ASN1_SET_ANY(ASN1_SEQUENCE_ANY **a, const unsigned char **in, long len);
469 int i2d_ASN1_SET_ANY(const ASN1_SEQUENCE_ANY *a, unsigned char **out);
470 extern const ASN1_ITEM ASN1_SET_ANY_it;
471 
472 /* This is used to contain a list of bit names */
473 typedef struct BIT_STRING_BITNAME_st {
474 	int bitnum;
475 	const char *lname;
476 	const char *sname;
477 } BIT_STRING_BITNAME;
478 
479 #define B_ASN1_TIME \
480 			B_ASN1_UTCTIME | \
481 			B_ASN1_GENERALIZEDTIME
482 
483 #define B_ASN1_PRINTABLE \
484 			B_ASN1_NUMERICSTRING| \
485 			B_ASN1_PRINTABLESTRING| \
486 			B_ASN1_T61STRING| \
487 			B_ASN1_IA5STRING| \
488 			B_ASN1_BIT_STRING| \
489 			B_ASN1_UNIVERSALSTRING|\
490 			B_ASN1_BMPSTRING|\
491 			B_ASN1_UTF8STRING|\
492 			B_ASN1_SEQUENCE|\
493 			B_ASN1_UNKNOWN
494 
495 #define B_ASN1_DIRECTORYSTRING \
496 			B_ASN1_PRINTABLESTRING| \
497 			B_ASN1_TELETEXSTRING|\
498 			B_ASN1_BMPSTRING|\
499 			B_ASN1_UNIVERSALSTRING|\
500 			B_ASN1_UTF8STRING
501 
502 #define B_ASN1_DISPLAYTEXT \
503 			B_ASN1_IA5STRING| \
504 			B_ASN1_VISIBLESTRING| \
505 			B_ASN1_BMPSTRING|\
506 			B_ASN1_UTF8STRING
507 
508 ASN1_TYPE *ASN1_TYPE_new(void);
509 void ASN1_TYPE_free(ASN1_TYPE *a);
510 ASN1_TYPE *d2i_ASN1_TYPE(ASN1_TYPE **a, const unsigned char **in, long len);
511 int i2d_ASN1_TYPE(ASN1_TYPE *a, unsigned char **out);
512 extern const ASN1_ITEM ASN1_ANY_it;
513 
514 int ASN1_TYPE_get(const ASN1_TYPE *a);
515 void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value);
516 int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value);
517 int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b);
518 
519 ASN1_OBJECT *ASN1_OBJECT_new(void);
520 void ASN1_OBJECT_free(ASN1_OBJECT *a);
521 int i2d_ASN1_OBJECT(const ASN1_OBJECT *a, unsigned char **pp);
522 ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp,
523     long length);
524 
525 extern const ASN1_ITEM ASN1_OBJECT_it;
526 
527 DECLARE_STACK_OF(ASN1_OBJECT)
528 
529 ASN1_STRING *ASN1_STRING_new(void);
530 void ASN1_STRING_free(ASN1_STRING *a);
531 int ASN1_STRING_copy(ASN1_STRING *dst, const ASN1_STRING *str);
532 ASN1_STRING *ASN1_STRING_dup(const ASN1_STRING *a);
533 ASN1_STRING *ASN1_STRING_type_new(int type);
534 int ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b);
535   /* Since this is used to store all sorts of things, via macros, for now, make
536      its data void * */
537 int ASN1_STRING_set(ASN1_STRING *str, const void *data, int len);
538 void ASN1_STRING_set0(ASN1_STRING *str, void *data, int len);
539 int ASN1_STRING_length(const ASN1_STRING *x);
540 void ASN1_STRING_length_set(ASN1_STRING *x, int n);
541 int ASN1_STRING_type(const ASN1_STRING *x);
542 unsigned char *ASN1_STRING_data(ASN1_STRING *x);
543 const unsigned char *ASN1_STRING_get0_data(const ASN1_STRING *x);
544 
545 ASN1_BIT_STRING *ASN1_BIT_STRING_new(void);
546 void ASN1_BIT_STRING_free(ASN1_BIT_STRING *a);
547 ASN1_BIT_STRING *d2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a, const unsigned char **in, long len);
548 int i2d_ASN1_BIT_STRING(ASN1_BIT_STRING *a, unsigned char **out);
549 extern const ASN1_ITEM ASN1_BIT_STRING_it;
550 int ASN1_BIT_STRING_set(ASN1_BIT_STRING *a, unsigned char *d, int length);
551 int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value);
552 int ASN1_BIT_STRING_get_bit(const ASN1_BIT_STRING *a, int n);
553 
554 ASN1_INTEGER *ASN1_INTEGER_new(void);
555 void ASN1_INTEGER_free(ASN1_INTEGER *a);
556 ASN1_INTEGER *d2i_ASN1_INTEGER(ASN1_INTEGER **a, const unsigned char **in, long len);
557 int i2d_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **out);
558 extern const ASN1_ITEM ASN1_INTEGER_it;
559 ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a, const unsigned char **pp,
560     long length);
561 ASN1_INTEGER *	ASN1_INTEGER_dup(const ASN1_INTEGER *x);
562 int ASN1_INTEGER_cmp(const ASN1_INTEGER *x, const ASN1_INTEGER *y);
563 
564 ASN1_ENUMERATED *ASN1_ENUMERATED_new(void);
565 void ASN1_ENUMERATED_free(ASN1_ENUMERATED *a);
566 ASN1_ENUMERATED *d2i_ASN1_ENUMERATED(ASN1_ENUMERATED **a, const unsigned char **in, long len);
567 int i2d_ASN1_ENUMERATED(ASN1_ENUMERATED *a, unsigned char **out);
568 extern const ASN1_ITEM ASN1_ENUMERATED_it;
569 
570 int ASN1_UTCTIME_check(const ASN1_UTCTIME *a);
571 ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t);
572 ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t,
573     int offset_day, long offset_sec);
574 int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str);
575 
576 int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t);
577 
578 int ASN1_GENERALIZEDTIME_check(const ASN1_GENERALIZEDTIME *a);
579 ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *s,
580     time_t t);
581 ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s,
582     time_t t, int offset_day, long offset_sec);
583 int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str);
584 
585 ASN1_OCTET_STRING *ASN1_OCTET_STRING_new(void);
586 void ASN1_OCTET_STRING_free(ASN1_OCTET_STRING *a);
587 ASN1_OCTET_STRING *d2i_ASN1_OCTET_STRING(ASN1_OCTET_STRING **a, const unsigned char **in, long len);
588 int i2d_ASN1_OCTET_STRING(ASN1_OCTET_STRING *a, unsigned char **out);
589 extern const ASN1_ITEM ASN1_OCTET_STRING_it;
590 ASN1_OCTET_STRING *ASN1_OCTET_STRING_dup(const ASN1_OCTET_STRING *a);
591 int ASN1_OCTET_STRING_cmp(const ASN1_OCTET_STRING *a,
592     const ASN1_OCTET_STRING *b);
593 int ASN1_OCTET_STRING_set(ASN1_OCTET_STRING *str, const unsigned char *data,
594     int len);
595 
596 ASN1_VISIBLESTRING *ASN1_VISIBLESTRING_new(void);
597 void ASN1_VISIBLESTRING_free(ASN1_VISIBLESTRING *a);
598 ASN1_VISIBLESTRING *d2i_ASN1_VISIBLESTRING(ASN1_VISIBLESTRING **a, const unsigned char **in, long len);
599 int i2d_ASN1_VISIBLESTRING(ASN1_VISIBLESTRING *a, unsigned char **out);
600 extern const ASN1_ITEM ASN1_VISIBLESTRING_it;
601 ASN1_UNIVERSALSTRING *ASN1_UNIVERSALSTRING_new(void);
602 void ASN1_UNIVERSALSTRING_free(ASN1_UNIVERSALSTRING *a);
603 ASN1_UNIVERSALSTRING *d2i_ASN1_UNIVERSALSTRING(ASN1_UNIVERSALSTRING **a, const unsigned char **in, long len);
604 int i2d_ASN1_UNIVERSALSTRING(ASN1_UNIVERSALSTRING *a, unsigned char **out);
605 extern const ASN1_ITEM ASN1_UNIVERSALSTRING_it;
606 ASN1_UTF8STRING *ASN1_UTF8STRING_new(void);
607 void ASN1_UTF8STRING_free(ASN1_UTF8STRING *a);
608 ASN1_UTF8STRING *d2i_ASN1_UTF8STRING(ASN1_UTF8STRING **a, const unsigned char **in, long len);
609 int i2d_ASN1_UTF8STRING(ASN1_UTF8STRING *a, unsigned char **out);
610 extern const ASN1_ITEM ASN1_UTF8STRING_it;
611 ASN1_NULL *ASN1_NULL_new(void);
612 void ASN1_NULL_free(ASN1_NULL *a);
613 ASN1_NULL *d2i_ASN1_NULL(ASN1_NULL **a, const unsigned char **in, long len);
614 int i2d_ASN1_NULL(ASN1_NULL *a, unsigned char **out);
615 extern const ASN1_ITEM ASN1_NULL_it;
616 ASN1_BMPSTRING *ASN1_BMPSTRING_new(void);
617 void ASN1_BMPSTRING_free(ASN1_BMPSTRING *a);
618 ASN1_BMPSTRING *d2i_ASN1_BMPSTRING(ASN1_BMPSTRING **a, const unsigned char **in, long len);
619 int i2d_ASN1_BMPSTRING(ASN1_BMPSTRING *a, unsigned char **out);
620 extern const ASN1_ITEM ASN1_BMPSTRING_it;
621 
622 ASN1_STRING *ASN1_PRINTABLE_new(void);
623 void ASN1_PRINTABLE_free(ASN1_STRING *a);
624 ASN1_STRING *d2i_ASN1_PRINTABLE(ASN1_STRING **a, const unsigned char **in, long len);
625 int i2d_ASN1_PRINTABLE(ASN1_STRING *a, unsigned char **out);
626 extern const ASN1_ITEM ASN1_PRINTABLE_it;
627 
628 ASN1_STRING *DIRECTORYSTRING_new(void);
629 void DIRECTORYSTRING_free(ASN1_STRING *a);
630 ASN1_STRING *d2i_DIRECTORYSTRING(ASN1_STRING **a, const unsigned char **in, long len);
631 int i2d_DIRECTORYSTRING(ASN1_STRING *a, unsigned char **out);
632 extern const ASN1_ITEM DIRECTORYSTRING_it;
633 ASN1_STRING *DISPLAYTEXT_new(void);
634 void DISPLAYTEXT_free(ASN1_STRING *a);
635 ASN1_STRING *d2i_DISPLAYTEXT(ASN1_STRING **a, const unsigned char **in, long len);
636 int i2d_DISPLAYTEXT(ASN1_STRING *a, unsigned char **out);
637 extern const ASN1_ITEM DISPLAYTEXT_it;
638 ASN1_PRINTABLESTRING *ASN1_PRINTABLESTRING_new(void);
639 void ASN1_PRINTABLESTRING_free(ASN1_PRINTABLESTRING *a);
640 ASN1_PRINTABLESTRING *d2i_ASN1_PRINTABLESTRING(ASN1_PRINTABLESTRING **a, const unsigned char **in, long len);
641 int i2d_ASN1_PRINTABLESTRING(ASN1_PRINTABLESTRING *a, unsigned char **out);
642 extern const ASN1_ITEM ASN1_PRINTABLESTRING_it;
643 ASN1_T61STRING *ASN1_T61STRING_new(void);
644 void ASN1_T61STRING_free(ASN1_T61STRING *a);
645 ASN1_T61STRING *d2i_ASN1_T61STRING(ASN1_T61STRING **a, const unsigned char **in, long len);
646 int i2d_ASN1_T61STRING(ASN1_T61STRING *a, unsigned char **out);
647 extern const ASN1_ITEM ASN1_T61STRING_it;
648 ASN1_IA5STRING *ASN1_IA5STRING_new(void);
649 void ASN1_IA5STRING_free(ASN1_IA5STRING *a);
650 ASN1_IA5STRING *d2i_ASN1_IA5STRING(ASN1_IA5STRING **a, const unsigned char **in, long len);
651 int i2d_ASN1_IA5STRING(ASN1_IA5STRING *a, unsigned char **out);
652 extern const ASN1_ITEM ASN1_IA5STRING_it;
653 ASN1_GENERALSTRING *ASN1_GENERALSTRING_new(void);
654 void ASN1_GENERALSTRING_free(ASN1_GENERALSTRING *a);
655 ASN1_GENERALSTRING *d2i_ASN1_GENERALSTRING(ASN1_GENERALSTRING **a, const unsigned char **in, long len);
656 int i2d_ASN1_GENERALSTRING(ASN1_GENERALSTRING *a, unsigned char **out);
657 extern const ASN1_ITEM ASN1_GENERALSTRING_it;
658 ASN1_UTCTIME *ASN1_UTCTIME_new(void);
659 void ASN1_UTCTIME_free(ASN1_UTCTIME *a);
660 ASN1_UTCTIME *d2i_ASN1_UTCTIME(ASN1_UTCTIME **a, const unsigned char **in, long len);
661 int i2d_ASN1_UTCTIME(ASN1_UTCTIME *a, unsigned char **out);
662 extern const ASN1_ITEM ASN1_UTCTIME_it;
663 ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_new(void);
664 void ASN1_GENERALIZEDTIME_free(ASN1_GENERALIZEDTIME *a);
665 ASN1_GENERALIZEDTIME *d2i_ASN1_GENERALIZEDTIME(ASN1_GENERALIZEDTIME **a, const unsigned char **in, long len);
666 int i2d_ASN1_GENERALIZEDTIME(ASN1_GENERALIZEDTIME *a, unsigned char **out);
667 extern const ASN1_ITEM ASN1_GENERALIZEDTIME_it;
668 ASN1_TIME *ASN1_TIME_new(void);
669 void ASN1_TIME_free(ASN1_TIME *a);
670 ASN1_TIME *d2i_ASN1_TIME(ASN1_TIME **a, const unsigned char **in, long len);
671 int i2d_ASN1_TIME(ASN1_TIME *a, unsigned char **out);
672 extern const ASN1_ITEM ASN1_TIME_it;
673 
674 int ASN1_TIME_to_tm(const ASN1_TIME *s, struct tm *tm);
675 int ASN1_TIME_compare(const ASN1_TIME *t1, const ASN1_TIME *t2);
676 int ASN1_TIME_cmp_time_t(const ASN1_TIME *s, time_t t2);
677 int ASN1_TIME_normalize(ASN1_TIME *t);
678 int ASN1_TIME_set_string_X509(ASN1_TIME *time, const char *str);
679 int ASN1_TIME_diff(int *pday, int *psec, const ASN1_TIME *from,
680     const ASN1_TIME *to);
681 
682 extern const ASN1_ITEM ASN1_OCTET_STRING_NDEF_it;
683 
684 ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t t);
685 ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, time_t t, int offset_day,
686     long offset_sec);
687 int ASN1_TIME_check(const ASN1_TIME *t);
688 ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(const ASN1_TIME *t,
689     ASN1_GENERALIZEDTIME **out);
690 int ASN1_TIME_set_string(ASN1_TIME *s, const char *str);
691 
692 #ifndef OPENSSL_NO_BIO
693 int i2a_ASN1_INTEGER(BIO *bp, const ASN1_INTEGER *a);
694 int a2i_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *bs, char *buf, int size);
695 int i2a_ASN1_ENUMERATED(BIO *bp, const ASN1_ENUMERATED *a);
696 int a2i_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *bs, char *buf, int size);
697 int i2a_ASN1_OBJECT(BIO *bp, const ASN1_OBJECT *a);
698 int a2i_ASN1_STRING(BIO *bp, ASN1_STRING *bs, char *buf, int size);
699 int i2a_ASN1_STRING(BIO *bp, const ASN1_STRING *a, int type);
700 #endif
701 int i2t_ASN1_OBJECT(char *buf, int buf_len, const ASN1_OBJECT *a);
702 
703 int a2d_ASN1_OBJECT(unsigned char *out, int olen, const char *buf, int num);
704 ASN1_OBJECT *ASN1_OBJECT_create(int nid, unsigned char *data, int len,
705     const char *sn, const char *ln);
706 
707 int ASN1_INTEGER_get_uint64(uint64_t *out_val, const ASN1_INTEGER *aint);
708 int ASN1_INTEGER_set_uint64(ASN1_INTEGER *aint, uint64_t val);
709 int ASN1_INTEGER_get_int64(int64_t *out_val, const ASN1_INTEGER *aint);
710 int ASN1_INTEGER_set_int64(ASN1_INTEGER *aint, int64_t val);
711 int ASN1_INTEGER_set(ASN1_INTEGER *a, long v);
712 long ASN1_INTEGER_get(const ASN1_INTEGER *a);
713 ASN1_INTEGER *BN_to_ASN1_INTEGER(const BIGNUM *bn, ASN1_INTEGER *ai);
714 BIGNUM *ASN1_INTEGER_to_BN(const ASN1_INTEGER *ai, BIGNUM *bn);
715 
716 int ASN1_ENUMERATED_get_int64(int64_t *out_val, const ASN1_ENUMERATED *aenum);
717 int ASN1_ENUMERATED_set_int64(ASN1_ENUMERATED *aenum, int64_t val);
718 int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v);
719 long ASN1_ENUMERATED_get(const ASN1_ENUMERATED *a);
720 ASN1_ENUMERATED *BN_to_ASN1_ENUMERATED(const BIGNUM *bn, ASN1_ENUMERATED *ai);
721 BIGNUM *ASN1_ENUMERATED_to_BN(const ASN1_ENUMERATED *ai, BIGNUM *bn);
722 
723 /* General */
724 /* given a string, return the correct type, max is the maximum length */
725 int ASN1_PRINTABLE_type(const unsigned char *s, int max);
726 
727 /* SPECIALS */
728 int ASN1_get_object(const unsigned char **pp, long *plength, int *ptag,
729     int *pclass, long omax);
730 void ASN1_put_object(unsigned char **pp, int constructed, int length, int tag,
731     int xclass);
732 int ASN1_put_eoc(unsigned char **pp);
733 int ASN1_object_size(int constructed, int length, int tag);
734 
735 void *ASN1_item_dup(const ASN1_ITEM *it, void *x);
736 
737 void *ASN1_dup(i2d_of_void *i2d, d2i_of_void *d2i, void *x);
738 
739 void *ASN1_d2i_fp(void *(*xnew)(void), d2i_of_void *d2i, FILE *in, void **x);
740 
741 #define ASN1_d2i_fp_of(type,xnew,d2i,in,x) \
742     ((type*)ASN1_d2i_fp(CHECKED_NEW_OF(type, xnew), \
743 			CHECKED_D2I_OF(type, d2i), \
744 			in, \
745 			CHECKED_PPTR_OF(type, x)))
746 
747 void *ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x);
748 int ASN1_i2d_fp(i2d_of_void *i2d, FILE *out, void *x);
749 
750 #define ASN1_i2d_fp_of(type,i2d,out,x) \
751     (ASN1_i2d_fp(CHECKED_I2D_OF(type, i2d), \
752 		 out, \
753 		 CHECKED_PTR_OF(type, x)))
754 
755 #define ASN1_i2d_fp_of_const(type,i2d,out,x) \
756     (ASN1_i2d_fp(CHECKED_I2D_OF(const type, i2d), \
757 		 out, \
758 		 CHECKED_PTR_OF(const type, x)))
759 
760 int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, void *x);
761 int ASN1_STRING_print_ex_fp(FILE *fp, const ASN1_STRING *str,
762     unsigned long flags);
763 
764 int ASN1_STRING_to_UTF8(unsigned char **out, const ASN1_STRING *in);
765 
766 #ifndef OPENSSL_NO_BIO
767 void *ASN1_d2i_bio(void *(*xnew)(void), d2i_of_void *d2i, BIO *in, void **x);
768 
769 #define ASN1_d2i_bio_of(type,xnew,d2i,in,x) \
770     ((type*)ASN1_d2i_bio( CHECKED_NEW_OF(type, xnew), \
771 			  CHECKED_D2I_OF(type, d2i), \
772 			  in, \
773 			  CHECKED_PPTR_OF(type, x)))
774 
775 void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *x);
776 int ASN1_i2d_bio(i2d_of_void *i2d, BIO *out, unsigned char *x);
777 
778 #define ASN1_i2d_bio_of(type,i2d,out,x) \
779     (ASN1_i2d_bio(CHECKED_I2D_OF(type, i2d), \
780 		  out, \
781 		  CHECKED_PTR_OF(type, x)))
782 
783 #define ASN1_i2d_bio_of_const(type,i2d,out,x) \
784     (ASN1_i2d_bio(CHECKED_I2D_OF(const type, i2d), \
785 		  out, \
786 		  CHECKED_PTR_OF(const type, x)))
787 
788 int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, void *x);
789 int ASN1_UTCTIME_print(BIO *fp, const ASN1_UTCTIME *a);
790 int ASN1_GENERALIZEDTIME_print(BIO *fp, const ASN1_GENERALIZEDTIME *a);
791 int ASN1_TIME_print(BIO *fp, const ASN1_TIME *a);
792 int ASN1_STRING_print(BIO *bp, const ASN1_STRING *v);
793 int ASN1_STRING_print_ex(BIO *out, const ASN1_STRING *str, unsigned long flags);
794 int ASN1_parse(BIO *bp, const unsigned char *pp, long len, int indent);
795 int ASN1_parse_dump(BIO *bp, const unsigned char *pp, long len, int indent, int dump);
796 #endif
797 
798 unsigned long ASN1_tag2bit(int tag);
799 const char *ASN1_tag2str(int tag);
800 
801 int ASN1_UNIVERSALSTRING_to_string(ASN1_UNIVERSALSTRING *s);
802 
803 int ASN1_TYPE_set_octetstring(ASN1_TYPE *a, const unsigned char *data, int len);
804 int ASN1_TYPE_get_octetstring(const ASN1_TYPE *a, unsigned char *data,
805     int max_len);
806 int ASN1_TYPE_set_int_octetstring(ASN1_TYPE *a, long num, const unsigned char *data,
807     int len);
808 int ASN1_TYPE_get_int_octetstring(const ASN1_TYPE *a, long *num,
809     unsigned char *data, int max_len);
810 
811 ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it,
812     ASN1_OCTET_STRING **oct);
813 void *ASN1_item_unpack(const ASN1_STRING *oct, const ASN1_ITEM *it);
814 
815 void ASN1_STRING_set_default_mask(unsigned long mask);
816 int ASN1_STRING_set_default_mask_asc(const char *p);
817 unsigned long ASN1_STRING_get_default_mask(void);
818 int ASN1_mbstring_copy(ASN1_STRING **out, const unsigned char *in, int len,
819     int inform, unsigned long mask);
820 int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len,
821     int inform, unsigned long mask, long minsize, long maxsize);
822 
823 ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out,
824     const unsigned char *in, int inlen, int inform, int nid);
825 const ASN1_STRING_TABLE *ASN1_STRING_TABLE_get(int nid);
826 
827 /* ASN1 template functions */
828 
829 /* Old API compatible functions */
830 ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it);
831 void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it);
832 ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **val, const unsigned char **in,
833     long len, const ASN1_ITEM *it);
834 int ASN1_item_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it);
835 
836 ASN1_TYPE *ASN1_generate_nconf(const char *str, CONF *nconf);
837 ASN1_TYPE *ASN1_generate_v3(const char *str, X509V3_CTX *cnf);
838 
839 /* ASN1 Print flags */
840 
841 /* Indicate missing OPTIONAL fields */
842 #define ASN1_PCTX_FLAGS_SHOW_ABSENT		0x001
843 /* Mark start and end of SEQUENCE */
844 #define ASN1_PCTX_FLAGS_SHOW_SEQUENCE		0x002
845 /* Mark start and end of SEQUENCE/SET OF */
846 #define ASN1_PCTX_FLAGS_SHOW_SSOF		0x004
847 /* Show the ASN1 type of primitives */
848 #define ASN1_PCTX_FLAGS_SHOW_TYPE		0x008
849 /* Don't show ASN1 type of ANY */
850 #define ASN1_PCTX_FLAGS_NO_ANY_TYPE		0x010
851 /* Don't show ASN1 type of MSTRINGs */
852 #define ASN1_PCTX_FLAGS_NO_MSTRING_TYPE		0x020
853 /* Don't show field names in SEQUENCE */
854 #define ASN1_PCTX_FLAGS_NO_FIELD_NAME		0x040
855 /* Show structure names of each SEQUENCE field */
856 #define ASN1_PCTX_FLAGS_SHOW_FIELD_STRUCT_NAME	0x080
857 /* Don't show structure name even at top level */
858 #define ASN1_PCTX_FLAGS_NO_STRUCT_NAME		0x100
859 
860 int ASN1_item_print(BIO *out, ASN1_VALUE *ifld, int indent,
861     const ASN1_ITEM *it, const ASN1_PCTX *pctx);
862 
863 int SMIME_crlf_copy(BIO *in, BIO *out, int flags);
864 int SMIME_text(BIO *in, BIO *out);
865 
866 void ERR_load_ASN1_strings(void);
867 
868 /* Error codes for the ASN1 functions. */
869 
870 /* Function codes. */
871 #define ASN1_F_A2D_ASN1_OBJECT				 100
872 #define ASN1_F_A2I_ASN1_ENUMERATED			 101
873 #define ASN1_F_A2I_ASN1_INTEGER				 102
874 #define ASN1_F_A2I_ASN1_STRING				 103
875 #define ASN1_F_APPEND_EXP				 176
876 #define ASN1_F_ASN1_BIT_STRING_SET_BIT			 183
877 #define ASN1_F_ASN1_CB					 177
878 #define ASN1_F_ASN1_CHECK_TLEN				 104
879 #define ASN1_F_ASN1_COLLATE_PRIMITIVE			 105
880 #define ASN1_F_ASN1_COLLECT				 106
881 #define ASN1_F_ASN1_D2I_EX_PRIMITIVE			 108
882 #define ASN1_F_ASN1_D2I_FP				 109
883 #define ASN1_F_ASN1_D2I_READ_BIO			 107
884 #define ASN1_F_ASN1_DIGEST				 184
885 #define ASN1_F_ASN1_DO_ADB				 110
886 #define ASN1_F_ASN1_DUP					 111
887 #define ASN1_F_ASN1_ENUMERATED_SET			 112
888 #define ASN1_F_ASN1_ENUMERATED_TO_BN			 113
889 #define ASN1_F_ASN1_EX_C2I				 204
890 #define ASN1_F_ASN1_FIND_END				 190
891 #define ASN1_F_ASN1_GENERALIZEDTIME_ADJ			 216
892 #define ASN1_F_ASN1_GENERALIZEDTIME_SET			 185
893 #define ASN1_F_ASN1_GENERATE_V3				 178
894 #define ASN1_F_ASN1_GET_OBJECT				 114
895 #define ASN1_F_ASN1_HEADER_NEW				 115
896 #define ASN1_F_ASN1_I2D_BIO				 116
897 #define ASN1_F_ASN1_I2D_FP				 117
898 #define ASN1_F_ASN1_INTEGER_SET				 118
899 #define ASN1_F_ASN1_INTEGER_TO_BN			 119
900 #define ASN1_F_ASN1_ITEM_D2I_FP				 206
901 #define ASN1_F_ASN1_ITEM_DUP				 191
902 #define ASN1_F_ASN1_ITEM_EX_COMBINE_NEW			 121
903 #define ASN1_F_ASN1_ITEM_EX_D2I				 120
904 #define ASN1_F_ASN1_ITEM_I2D_BIO			 192
905 #define ASN1_F_ASN1_ITEM_I2D_FP				 193
906 #define ASN1_F_ASN1_ITEM_PACK				 198
907 #define ASN1_F_ASN1_ITEM_SIGN				 195
908 #define ASN1_F_ASN1_ITEM_SIGN_CTX			 220
909 #define ASN1_F_ASN1_ITEM_UNPACK				 199
910 #define ASN1_F_ASN1_ITEM_VERIFY				 197
911 #define ASN1_F_ASN1_MBSTRING_NCOPY			 122
912 #define ASN1_F_ASN1_OBJECT_NEW				 123
913 #define ASN1_F_ASN1_OUTPUT_DATA				 214
914 #define ASN1_F_ASN1_PACK_STRING				 124
915 #define ASN1_F_ASN1_PCTX_NEW				 205
916 #define ASN1_F_ASN1_PKCS5_PBE_SET			 125
917 #define ASN1_F_ASN1_SEQ_PACK				 126
918 #define ASN1_F_ASN1_SEQ_UNPACK				 127
919 #define ASN1_F_ASN1_SIGN				 128
920 #define ASN1_F_ASN1_STR2TYPE				 179
921 #define ASN1_F_ASN1_STRING_SET				 186
922 #define ASN1_F_ASN1_STRING_TABLE_ADD			 129
923 #define ASN1_F_ASN1_STRING_TYPE_NEW			 130
924 #define ASN1_F_ASN1_TEMPLATE_EX_D2I			 132
925 #define ASN1_F_ASN1_TEMPLATE_NEW			 133
926 #define ASN1_F_ASN1_TEMPLATE_NOEXP_D2I			 131
927 #define ASN1_F_ASN1_TIME_ADJ				 217
928 #define ASN1_F_ASN1_TIME_SET				 175
929 #define ASN1_F_ASN1_TYPE_GET_INT_OCTETSTRING		 134
930 #define ASN1_F_ASN1_TYPE_GET_OCTETSTRING		 135
931 #define ASN1_F_ASN1_UNPACK_STRING			 136
932 #define ASN1_F_ASN1_UTCTIME_ADJ				 218
933 #define ASN1_F_ASN1_UTCTIME_SET				 187
934 #define ASN1_F_ASN1_VERIFY				 137
935 #define ASN1_F_B64_READ_ASN1				 209
936 #define ASN1_F_B64_WRITE_ASN1				 210
937 #define ASN1_F_BIO_NEW_NDEF				 208
938 #define ASN1_F_BITSTR_CB				 180
939 #define ASN1_F_BN_TO_ASN1_ENUMERATED			 138
940 #define ASN1_F_BN_TO_ASN1_INTEGER			 139
941 #define ASN1_F_C2I_ASN1_BIT_STRING			 189
942 #define ASN1_F_C2I_ASN1_INTEGER				 194
943 #define ASN1_F_C2I_ASN1_OBJECT				 196
944 #define ASN1_F_COLLECT_DATA				 140
945 #define ASN1_F_D2I_ASN1_BIT_STRING			 141
946 #define ASN1_F_D2I_ASN1_BOOLEAN				 142
947 #define ASN1_F_D2I_ASN1_BYTES				 143
948 #define ASN1_F_D2I_ASN1_GENERALIZEDTIME			 144
949 #define ASN1_F_D2I_ASN1_HEADER				 145
950 #define ASN1_F_D2I_ASN1_INTEGER				 146
951 #define ASN1_F_D2I_ASN1_OBJECT				 147
952 #define ASN1_F_D2I_ASN1_SET				 148
953 #define ASN1_F_D2I_ASN1_TYPE_BYTES			 149
954 #define ASN1_F_D2I_ASN1_UINTEGER			 150
955 #define ASN1_F_D2I_ASN1_UTCTIME				 151
956 #define ASN1_F_D2I_AUTOPRIVATEKEY			 207
957 #define ASN1_F_D2I_NETSCAPE_RSA				 152
958 #define ASN1_F_D2I_NETSCAPE_RSA_2			 153
959 #define ASN1_F_D2I_PRIVATEKEY				 154
960 #define ASN1_F_D2I_PUBLICKEY				 155
961 #define ASN1_F_D2I_RSA_NET				 200
962 #define ASN1_F_D2I_RSA_NET_2				 201
963 #define ASN1_F_D2I_X509					 156
964 #define ASN1_F_D2I_X509_CINF				 157
965 #define ASN1_F_D2I_X509_PKEY				 159
966 #define ASN1_F_I2D_ASN1_BIO_STREAM			 211
967 #define ASN1_F_I2D_ASN1_SET				 188
968 #define ASN1_F_I2D_ASN1_TIME				 160
969 #define ASN1_F_I2D_DSA_PUBKEY				 161
970 #define ASN1_F_I2D_EC_PUBKEY				 181
971 #define ASN1_F_I2D_PRIVATEKEY				 163
972 #define ASN1_F_I2D_PUBLICKEY				 164
973 #define ASN1_F_I2D_RSA_NET				 162
974 #define ASN1_F_I2D_RSA_PUBKEY				 165
975 #define ASN1_F_LONG_C2I					 166
976 #define ASN1_F_OID_MODULE_INIT				 174
977 #define ASN1_F_PARSE_TAGGING				 182
978 #define ASN1_F_PKCS5_PBE2_SET_IV			 167
979 #define ASN1_F_PKCS5_PBE_SET				 202
980 #define ASN1_F_PKCS5_PBE_SET0_ALGOR			 215
981 #define ASN1_F_PKCS5_PBKDF2_SET				 219
982 #define ASN1_F_SMIME_READ_ASN1				 212
983 #define ASN1_F_SMIME_TEXT				 213
984 #define ASN1_F_X509_CINF_NEW				 168
985 #define ASN1_F_X509_CRL_ADD0_REVOKED			 169
986 #define ASN1_F_X509_INFO_NEW				 170
987 #define ASN1_F_X509_NAME_ENCODE				 203
988 #define ASN1_F_X509_NAME_EX_D2I				 158
989 #define ASN1_F_X509_NAME_EX_NEW				 171
990 #define ASN1_F_X509_NEW					 172
991 #define ASN1_F_X509_PKEY_NEW				 173
992 
993 /* Reason codes. */
994 #define ASN1_R_ADDING_OBJECT				 171
995 #define ASN1_R_ASN1_PARSE_ERROR				 203
996 #define ASN1_R_ASN1_SIG_PARSE_ERROR			 204
997 #define ASN1_R_AUX_ERROR				 100
998 #define ASN1_R_BAD_CLASS				 101
999 #define ASN1_R_BAD_OBJECT_HEADER			 102
1000 #define ASN1_R_BAD_PASSWORD_READ			 103
1001 #define ASN1_R_BAD_TAG					 104
1002 #define ASN1_R_BAD_TEMPLATE				 230
1003 #define ASN1_R_BMPSTRING_IS_WRONG_LENGTH		 214
1004 #define ASN1_R_BN_LIB					 105
1005 #define ASN1_R_BOOLEAN_IS_WRONG_LENGTH			 106
1006 #define ASN1_R_BUFFER_TOO_SMALL				 107
1007 #define ASN1_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER		 108
1008 #define ASN1_R_CONTEXT_NOT_INITIALISED			 217
1009 #define ASN1_R_DATA_IS_WRONG				 109
1010 #define ASN1_R_DECODE_ERROR				 110
1011 #define ASN1_R_DECODING_ERROR				 111
1012 #define ASN1_R_DEPTH_EXCEEDED				 174
1013 #define ASN1_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED	 198
1014 #define ASN1_R_ENCODE_ERROR				 112
1015 #define ASN1_R_ERROR_GETTING_TIME			 173
1016 #define ASN1_R_ERROR_LOADING_SECTION			 172
1017 #define ASN1_R_ERROR_PARSING_SET_ELEMENT		 113
1018 #define ASN1_R_ERROR_SETTING_CIPHER_PARAMS		 114
1019 #define ASN1_R_EXPECTING_AN_INTEGER			 115
1020 #define ASN1_R_EXPECTING_AN_OBJECT			 116
1021 #define ASN1_R_EXPECTING_A_BOOLEAN			 117
1022 #define ASN1_R_EXPECTING_A_TIME				 118
1023 #define ASN1_R_EXPLICIT_LENGTH_MISMATCH			 119
1024 #define ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED		 120
1025 #define ASN1_R_FIELD_MISSING				 121
1026 #define ASN1_R_FIRST_NUM_TOO_LARGE			 122
1027 #define ASN1_R_HEADER_TOO_LONG				 123
1028 #define ASN1_R_ILLEGAL_BITSTRING_FORMAT			 175
1029 #define ASN1_R_ILLEGAL_BOOLEAN				 176
1030 #define ASN1_R_ILLEGAL_CHARACTERS			 124
1031 #define ASN1_R_ILLEGAL_FORMAT				 177
1032 #define ASN1_R_ILLEGAL_HEX				 178
1033 #define ASN1_R_ILLEGAL_IMPLICIT_TAG			 179
1034 #define ASN1_R_ILLEGAL_INTEGER				 180
1035 #define ASN1_R_ILLEGAL_NEGATIVE_VALUE			 226
1036 #define ASN1_R_ILLEGAL_NESTED_TAGGING			 181
1037 #define ASN1_R_ILLEGAL_NULL				 125
1038 #define ASN1_R_ILLEGAL_NULL_VALUE			 182
1039 #define ASN1_R_ILLEGAL_OBJECT				 183
1040 #define ASN1_R_ILLEGAL_OPTIONAL_ANY			 126
1041 #define ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE		 170
1042 #define ASN1_R_ILLEGAL_TAGGED_ANY			 127
1043 #define ASN1_R_ILLEGAL_TIME_VALUE			 184
1044 #define ASN1_R_INTEGER_NOT_ASCII_FORMAT			 185
1045 #define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG		 128
1046 #define ASN1_R_INVALID_BIT_STRING_BITS_LEFT		 220
1047 #define ASN1_R_INVALID_BMPSTRING_LENGTH			 129
1048 #define ASN1_R_INVALID_DIGIT				 130
1049 #define ASN1_R_INVALID_MIME_TYPE			 205
1050 #define ASN1_R_INVALID_MODIFIER				 186
1051 #define ASN1_R_INVALID_NUMBER				 187
1052 #define ASN1_R_INVALID_OBJECT_ENCODING			 216
1053 #define ASN1_R_INVALID_SEPARATOR			 131
1054 #define ASN1_R_INVALID_TIME_FORMAT			 132
1055 #define ASN1_R_INVALID_UNIVERSALSTRING_LENGTH		 133
1056 #define ASN1_R_INVALID_UTF8STRING			 134
1057 #define ASN1_R_IV_TOO_LARGE				 135
1058 #define ASN1_R_LENGTH_ERROR				 136
1059 #define ASN1_R_LIST_ERROR				 188
1060 #define ASN1_R_MIME_NO_CONTENT_TYPE			 206
1061 #define ASN1_R_MIME_PARSE_ERROR				 207
1062 #define ASN1_R_MIME_SIG_PARSE_ERROR			 208
1063 #define ASN1_R_MISSING_EOC				 137
1064 #define ASN1_R_MISSING_SECOND_NUMBER			 138
1065 #define ASN1_R_MISSING_VALUE				 189
1066 #define ASN1_R_MSTRING_NOT_UNIVERSAL			 139
1067 #define ASN1_R_MSTRING_WRONG_TAG			 140
1068 #define ASN1_R_NESTED_ASN1_STRING			 197
1069 #define ASN1_R_NESTED_TOO_DEEP				 219
1070 #define ASN1_R_NON_HEX_CHARACTERS			 141
1071 #define ASN1_R_NOT_ASCII_FORMAT				 190
1072 #define ASN1_R_NOT_ENOUGH_DATA				 142
1073 #define ASN1_R_NO_CONTENT_TYPE				 209
1074 #define ASN1_R_NO_DEFAULT_DIGEST			 201
1075 #define ASN1_R_NO_MATCHING_CHOICE_TYPE			 143
1076 #define ASN1_R_NO_MULTIPART_BODY_FAILURE		 210
1077 #define ASN1_R_NO_MULTIPART_BOUNDARY			 211
1078 #define ASN1_R_NO_SIG_CONTENT_TYPE			 212
1079 #define ASN1_R_NULL_IS_WRONG_LENGTH			 144
1080 #define ASN1_R_OBJECT_NOT_ASCII_FORMAT			 191
1081 #define ASN1_R_ODD_NUMBER_OF_CHARS			 145
1082 #define ASN1_R_PRIVATE_KEY_HEADER_MISSING		 146
1083 #define ASN1_R_SECOND_NUMBER_TOO_LARGE			 147
1084 #define ASN1_R_SEQUENCE_LENGTH_MISMATCH			 148
1085 #define ASN1_R_SEQUENCE_NOT_CONSTRUCTED			 149
1086 #define ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG		 192
1087 #define ASN1_R_SHORT_LINE				 150
1088 #define ASN1_R_SIG_INVALID_MIME_TYPE			 213
1089 #define ASN1_R_STREAMING_NOT_SUPPORTED			 202
1090 #define ASN1_R_STRING_TOO_LONG				 151
1091 #define ASN1_R_STRING_TOO_SHORT				 152
1092 #define ASN1_R_TAG_VALUE_TOO_HIGH			 153
1093 #define ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 154
1094 #define ASN1_R_TIME_NOT_ASCII_FORMAT			 193
1095 #define ASN1_R_TOO_LARGE				 223
1096 #define ASN1_R_TOO_LONG					 155
1097 #define ASN1_R_TOO_SMALL				 224
1098 #define ASN1_R_TYPE_NOT_CONSTRUCTED			 156
1099 #define ASN1_R_TYPE_NOT_PRIMITIVE			 231
1100 #define ASN1_R_UNABLE_TO_DECODE_RSA_KEY			 157
1101 #define ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY		 158
1102 #define ASN1_R_UNEXPECTED_EOC				 159
1103 #define ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH		 215
1104 #define ASN1_R_UNKNOWN_FORMAT				 160
1105 #define ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM		 161
1106 #define ASN1_R_UNKNOWN_OBJECT_TYPE			 162
1107 #define ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE			 163
1108 #define ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM		 199
1109 #define ASN1_R_UNKNOWN_TAG				 194
1110 #define ASN1_R_UNKOWN_FORMAT				 195
1111 #define ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE		 164
1112 #define ASN1_R_UNSUPPORTED_CIPHER			 165
1113 #define ASN1_R_UNSUPPORTED_ENCRYPTION_ALGORITHM		 166
1114 #define ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE		 167
1115 #define ASN1_R_UNSUPPORTED_TYPE				 196
1116 #define ASN1_R_WRONG_INTEGER_TYPE			 225
1117 #define ASN1_R_WRONG_PUBLIC_KEY_TYPE			 200
1118 #define ASN1_R_WRONG_TAG				 168
1119 #define ASN1_R_WRONG_TYPE				 169
1120 
1121 #ifdef  __cplusplus
1122 }
1123 #endif
1124 #endif
1125