@ -72,11 +72,11 @@ extern "C" {
# endif
# endif
/* Legacy ASN.1 library.
// Legacy ASN.1 library.
*
//
* This header is part of OpenSSL ' s ASN .1 implementation . It is retained for
// This header is part of OpenSSL's ASN.1 implementation. It is retained for
* compatibility but otherwise underdocumented and not actively maintained . Use
// compatibility but otherwise underdocumented and not actively maintained. Use
* the new | CBS | and | CBB | library in < openssl / bytestring . h > instead . */
// the new |CBS| and |CBB| library in <openssl/bytestring.h> instead.
# define V_ASN1_UNIVERSAL 0x00
# define V_ASN1_UNIVERSAL 0x00
@ -87,18 +87,18 @@ extern "C" {
# define V_ASN1_CONSTRUCTED 0x20
# define V_ASN1_CONSTRUCTED 0x20
# define V_ASN1_PRIMITIVE_TAG 0x1f
# define V_ASN1_PRIMITIVE_TAG 0x1f
# define V_ASN1_APP_CHOOSE -2 /* let the recipient choose */
# define V_ASN1_APP_CHOOSE -2 // let the recipient choose
# define V_ASN1_OTHER -3 /* used in ASN1_TYPE */
# define V_ASN1_OTHER -3 // used in ASN1_TYPE
# define V_ASN1_ANY -4 /* used in ASN1 template code */
# define V_ASN1_ANY -4 // used in ASN1 template code
# define V_ASN1_NEG 0x100 /* negative flag */
# define V_ASN1_NEG 0x100 // negative flag
/* No supported universal tags may exceed this value, to avoid ambiguity with
// No supported universal tags may exceed this value, to avoid ambiguity with
* V_ASN1_NEG . */
// V_ASN1_NEG.
# define V_ASN1_MAX_UNIVERSAL 0xff
# define V_ASN1_MAX_UNIVERSAL 0xff
# define V_ASN1_UNDEF -1
# define V_ASN1_UNDEF -1
# define V_ASN1_EOC 0
# define V_ASN1_EOC 0
# define V_ASN1_BOOLEAN 1 /**/
# define V_ASN1_BOOLEAN 1 //
# define V_ASN1_INTEGER 2
# define V_ASN1_INTEGER 2
# define V_ASN1_NEG_INTEGER (2 | V_ASN1_NEG)
# define V_ASN1_NEG_INTEGER (2 | V_ASN1_NEG)
# define V_ASN1_BIT_STRING 3
# define V_ASN1_BIT_STRING 3
@ -113,22 +113,22 @@ extern "C" {
# define V_ASN1_UTF8STRING 12
# define V_ASN1_UTF8STRING 12
# define V_ASN1_SEQUENCE 16
# define V_ASN1_SEQUENCE 16
# define V_ASN1_SET 17
# define V_ASN1_SET 17
# define V_ASN1_NUMERICSTRING 18 /**/
# define V_ASN1_NUMERICSTRING 18 //
# define V_ASN1_PRINTABLESTRING 19
# define V_ASN1_PRINTABLESTRING 19
# define V_ASN1_T61STRING 20
# define V_ASN1_T61STRING 20
# define V_ASN1_TELETEXSTRING 20 /* alias */
# define V_ASN1_TELETEXSTRING 20 // alias
# define V_ASN1_VIDEOTEXSTRING 21 /**/
# define V_ASN1_VIDEOTEXSTRING 21 //
# define V_ASN1_IA5STRING 22
# define V_ASN1_IA5STRING 22
# define V_ASN1_UTCTIME 23
# define V_ASN1_UTCTIME 23
# define V_ASN1_GENERALIZEDTIME 24 /**/
# define V_ASN1_GENERALIZEDTIME 24 //
# define V_ASN1_GRAPHICSTRING 25 /**/
# define V_ASN1_GRAPHICSTRING 25 //
# define V_ASN1_ISO64STRING 26 /**/
# define V_ASN1_ISO64STRING 26 //
# define V_ASN1_VISIBLESTRING 26 /* alias */
# define V_ASN1_VISIBLESTRING 26 // alias
# define V_ASN1_GENERALSTRING 27 /**/
# define V_ASN1_GENERALSTRING 27 //
# define V_ASN1_UNIVERSALSTRING 28 /**/
# define V_ASN1_UNIVERSALSTRING 28 //
# define V_ASN1_BMPSTRING 30
# define V_ASN1_BMPSTRING 30
/* For use with d2i_ASN1_type_bytes() */
// For use with d2i_ASN1_type_bytes()
# define B_ASN1_NUMERICSTRING 0x0001
# define B_ASN1_NUMERICSTRING 0x0001
# define B_ASN1_PRINTABLESTRING 0x0002
# define B_ASN1_PRINTABLESTRING 0x0002
# define B_ASN1_T61STRING 0x0004
# define B_ASN1_T61STRING 0x0004
@ -149,79 +149,75 @@ extern "C" {
# define B_ASN1_GENERALIZEDTIME 0x8000
# define B_ASN1_GENERALIZEDTIME 0x8000
# define B_ASN1_SEQUENCE 0x10000
# define B_ASN1_SEQUENCE 0x10000
/* For use with ASN1_mbstring_copy() */
// For use with ASN1_mbstring_copy()
# define MBSTRING_FLAG 0x1000
# define MBSTRING_FLAG 0x1000
# define MBSTRING_UTF8 (MBSTRING_FLAG)
# define MBSTRING_UTF8 (MBSTRING_FLAG)
/* |MBSTRING_ASC| refers to Latin-1, not ASCII. It is used with TeletexString
// |MBSTRING_ASC| refers to Latin-1, not ASCII. It is used with TeletexString
* which , in turn , is treated as Latin - 1 rather than T .61 by OpenSSL and most
// which, in turn, is treated as Latin-1 rather than T.61 by OpenSSL and most
* other software . */
// other software.
# define MBSTRING_ASC (MBSTRING_FLAG|1)
# define MBSTRING_ASC (MBSTRING_FLAG | 1)
# define MBSTRING_BMP (MBSTRING_FLAG|2)
# define MBSTRING_BMP (MBSTRING_FLAG | 2)
# define MBSTRING_UNIV (MBSTRING_FLAG|4)
# define MBSTRING_UNIV (MBSTRING_FLAG | 4)
# define DECLARE_ASN1_SET_OF(type) /* filled in by mkstack.pl */
# define DECLARE_ASN1_SET_OF(type) // filled in by mkstack.pl
# define IMPLEMENT_ASN1_SET_OF(type) /* nothing, no longer needed */
# define IMPLEMENT_ASN1_SET_OF(type) // nothing, no longer needed
/* These are used internally in the ASN1_OBJECT to keep track of
// These are used internally in the ASN1_OBJECT to keep track of
* whether the names and data need to be free ( ) ed */
// whether the names and data need to be free()ed
# define ASN1_OBJECT_FLAG_DYNAMIC 0x01 /* internal use */
# define ASN1_OBJECT_FLAG_DYNAMIC 0x01 // internal use
# define ASN1_OBJECT_FLAG_DYNAMIC_STRINGS 0x04 /* internal use */
# define ASN1_OBJECT_FLAG_DYNAMIC_STRINGS 0x04 // internal use
# define ASN1_OBJECT_FLAG_DYNAMIC_DATA 0x08 /* internal use */
# define ASN1_OBJECT_FLAG_DYNAMIC_DATA 0x08 // internal use
struct asn1_object_st
struct asn1_object_st {
{
const char * sn , * ln ;
const char * sn , * ln ;
int nid ;
int nid ;
int length ;
int length ;
const unsigned char * data ; /* data remains const after init */
const unsigned char * data ; // data remains const after init
int flags ; /* Should we free this one */
int flags ; // Should we free this one
} ;
} ;
DEFINE_STACK_OF ( ASN1_OBJECT )
DEFINE_STACK_OF ( ASN1_OBJECT )
# define ASN1_STRING_FLAG_BITS_LEFT 0x08 /* Set if 0x07 has bits left value */
# define ASN1_STRING_FLAG_BITS_LEFT 0x08 // Set if 0x07 has bits left value
/* This flag is used by ASN1 code to indicate an ASN1_STRING is an MSTRING
// This flag is used by ASN1 code to indicate an ASN1_STRING is an MSTRING
* type .
// type.
*/
# define ASN1_STRING_FLAG_MSTRING 0x040
# define ASN1_STRING_FLAG_MSTRING 0x040
/* This is the base type that holds just about everything :-) */
// This is the base type that holds just about everything :-)
struct asn1_string_st
struct asn1_string_st {
{
int length ;
int length ;
int type ;
int type ;
unsigned char * data ;
unsigned char * data ;
/* The value of the following field depends on the type being
// The value of the following field depends on the type being
* held . It is mostly being used for BIT_STRING so if the
// held. It is mostly being used for BIT_STRING so if the
* input data has a non - zero ' unused bits ' value , it will be
// input data has a non-zero 'unused bits' value, it will be
* handled correctly */
// handled correctly
long flags ;
long flags ;
} ;
} ;
/* ASN1_ENCODING structure: this is used to save the received
// ASN1_ENCODING structure: this is used to save the received
* encoding of an ASN1 type . This is useful to get round
// encoding of an ASN1 type. This is useful to get round
* problems with invalid encodings which can break signatures .
// problems with invalid encodings which can break signatures.
*/
typedef struct ASN1_ENCODING_st {
typedef struct ASN1_ENCODING_st
unsigned char * enc ; // DER encoding
{
long len ; // Length of encoding
unsigned char * enc ; /* DER encoding */
int modified ; // set to 1 if 'enc' is invalid
long len ; /* Length of encoding */
// alias_only is zero if |enc| owns the buffer that it points to
int modified ; /* set to 1 if 'enc' is invalid */
// (although |enc| may still be NULL). If one, |enc| points into a
/* alias_only is zero if |enc| owns the buffer that it points to
// buffer that is owned elsewhere.
* ( although | enc | may still be NULL ) . If one , | enc | points into a
unsigned alias_only : 1 ;
* buffer that is owned elsewhere . */
// alias_only_on_next_parse is one iff the next parsing operation
unsigned alias_only : 1 ;
// should avoid taking a copy of the input and rather set
/* alias_only_on_next_parse is one iff the next parsing operation
// |alias_only|.
* should avoid taking a copy of the input and rather set
unsigned alias_only_on_next_parse : 1 ;
* | alias_only | . */
} ASN1_ENCODING ;
unsigned alias_only_on_next_parse : 1 ;
} ASN1_ENCODING ;
# define STABLE_FLAGS_MALLOC 0x01
# define STABLE_FLAGS_MALLOC 0x01
# define STABLE_NO_MASK 0x02
# define STABLE_NO_MASK 0x02
# define DIRSTRING_TYPE \
# define DIRSTRING_TYPE \
( B_ASN1_PRINTABLESTRING | B_ASN1_T61STRING | B_ASN1_BMPSTRING | B_ASN1_UTF8STRING )
( B_ASN1_PRINTABLESTRING | B_ASN1_T61STRING | B_ASN1_BMPSTRING | \
# define PKCS9STRING_TYPE (DIRSTRING_TYPE|B_ASN1_IA5STRING)
B_ASN1_UTF8STRING )
# define PKCS9STRING_TYPE (DIRSTRING_TYPE | B_ASN1_IA5STRING)
typedef struct asn1_string_table_st {
typedef struct asn1_string_table_st {
int nid ;
int nid ;
@ -231,7 +227,7 @@ typedef struct asn1_string_table_st {
unsigned long flags ;
unsigned long flags ;
} ASN1_STRING_TABLE ;
} ASN1_STRING_TABLE ;
/* size limits: this stuff is taken straight from RFC2459 */
// size limits: this stuff is taken straight from RFC2459
# define ub_name 32768
# define ub_name 32768
# define ub_common_name 64
# define ub_common_name 64
@ -242,15 +238,14 @@ typedef struct asn1_string_table_st {
# define ub_title 64
# define ub_title 64
# define ub_email_address 128
# define ub_email_address 128
/* Declarations for template structures: for full definitions
// Declarations for template structures: for full definitions
* see asn1t . h
// see asn1t.h
*/
typedef struct ASN1_TEMPLATE_st ASN1_TEMPLATE ;
typedef struct ASN1_TEMPLATE_st ASN1_TEMPLATE ;
typedef struct ASN1_TLC_st ASN1_TLC ;
typedef struct ASN1_TLC_st ASN1_TLC ;
/* This is just an opaque pointer */
// This is just an opaque pointer
typedef struct ASN1_VALUE_st ASN1_VALUE ;
typedef struct ASN1_VALUE_st ASN1_VALUE ;
/* Declare ASN1 functions: the implement macro in in asn1t.h */
// Declare ASN1 functions: the implement macro in in asn1t.h
# define DECLARE_ASN1_FUNCTIONS(type) DECLARE_ASN1_FUNCTIONS_name(type, type)
# define DECLARE_ASN1_FUNCTIONS(type) DECLARE_ASN1_FUNCTIONS_name(type, type)
@ -266,12 +261,14 @@ typedef struct ASN1_VALUE_st ASN1_VALUE;
DECLARE_ASN1_ENCODE_FUNCTIONS ( type , itname , name )
DECLARE_ASN1_ENCODE_FUNCTIONS ( type , itname , name )
# define DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) \
# define DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) \
OPENSSL_EXPORT type * d2i_ # # name ( type * * a , const unsigned char * * in , long len ) ; \
OPENSSL_EXPORT type * d2i_ # # name ( type * * a , const unsigned char * * in , \
long len ) ; \
OPENSSL_EXPORT int i2d_ # # name ( type * a , unsigned char * * out ) ; \
OPENSSL_EXPORT int i2d_ # # name ( type * a , unsigned char * * out ) ; \
DECLARE_ASN1_ITEM ( itname )
DECLARE_ASN1_ITEM ( itname )
# define DECLARE_ASN1_ENCODE_FUNCTIONS_const(type, name) \
# define DECLARE_ASN1_ENCODE_FUNCTIONS_const(type, name) \
OPENSSL_EXPORT type * d2i_ # # name ( type * * a , const unsigned char * * in , long len ) ; \
OPENSSL_EXPORT type * d2i_ # # name ( type * * a , const unsigned char * * in , \
long len ) ; \
OPENSSL_EXPORT int i2d_ # # name ( const type * a , unsigned char * * out ) ; \
OPENSSL_EXPORT int i2d_ # # name ( const type * a , unsigned char * * out ) ; \
DECLARE_ASN1_ITEM ( name )
DECLARE_ASN1_ITEM ( name )
@ -293,166 +290,153 @@ typedef struct ASN1_VALUE_st ASN1_VALUE;
typedef void * d2i_of_void ( void * * , const unsigned char * * , long ) ;
typedef void * d2i_of_void ( void * * , const unsigned char * * , long ) ;
typedef int i2d_of_void ( const void * , unsigned char * * ) ;
typedef int i2d_of_void ( const void * , unsigned char * * ) ;
/* The following macros and typedefs allow an ASN1_ITEM
// The following macros and typedefs allow an ASN1_ITEM
* to be embedded in a structure and referenced . Since
// to be embedded in a structure and referenced. Since
* the ASN1_ITEM pointers need to be globally accessible
// the ASN1_ITEM pointers need to be globally accessible
* ( possibly from shared libraries ) they may exist in
// (possibly from shared libraries) they may exist in
* different forms . On platforms that support it the
// different forms. On platforms that support it the
* ASN1_ITEM structure itself will be globally exported .
// ASN1_ITEM structure itself will be globally exported.
* Other platforms will export a function that returns
// Other platforms will export a function that returns
* an ASN1_ITEM pointer .
// an ASN1_ITEM pointer.
*
//
* To handle both cases transparently the macros below
// To handle both cases transparently the macros below
* should be used instead of hard coding an ASN1_ITEM
// should be used instead of hard coding an ASN1_ITEM
* pointer in a structure .
// pointer in a structure.
*
//
* The structure will look like this :
// The structure will look like this:
*
//
* typedef struct SOMETHING_st {
// typedef struct SOMETHING_st {
* . . .
// ...
* ASN1_ITEM_EXP * iptr ;
// ASN1_ITEM_EXP *iptr;
* . . .
// ...
* } SOMETHING ;
// } SOMETHING;
*
//
* It would be initialised as e . g . :
// It would be initialised as e.g.:
*
//
* SOMETHING somevar = { . . . , ASN1_ITEM_ref ( X509 ) , . . . } ;
// SOMETHING somevar = {...,ASN1_ITEM_ref(X509),...};
*
//
* and the actual pointer extracted with :
// and the actual pointer extracted with:
*
//
* const ASN1_ITEM * it = ASN1_ITEM_ptr ( somevar . iptr ) ;
// const ASN1_ITEM *it = ASN1_ITEM_ptr(somevar.iptr);
*
//
* Finally an ASN1_ITEM pointer can be extracted from an
// Finally an ASN1_ITEM pointer can be extracted from an
* appropriate reference with : ASN1_ITEM_rptr ( X509 ) . This
// appropriate reference with: ASN1_ITEM_rptr(X509). This
* would be used when a function takes an ASN1_ITEM * argument .
// would be used when a function takes an ASN1_ITEM * argument.
*
//
*/
// ASN1_ITEM pointer exported type
/* ASN1_ITEM pointer exported type */
typedef const ASN1_ITEM ASN1_ITEM_EXP ;
typedef const ASN1_ITEM ASN1_ITEM_EXP ;
/* Macro to obtain ASN1_ITEM pointer from exported type */
// Macro to obtain ASN1_ITEM pointer from exported type
# define ASN1_ITEM_ptr(iptr) (iptr)
# define ASN1_ITEM_ptr(iptr) (iptr)
/* Macro to include ASN1_ITEM pointer from base type */
// Macro to include ASN1_ITEM pointer from base type
# define ASN1_ITEM_ref(iptr) (&(iptr##_it))
# define ASN1_ITEM_ref(iptr) (&(iptr##_it))
# define ASN1_ITEM_rptr(ref) (&(ref##_it))
# define ASN1_ITEM_rptr(ref) (&(ref##_it))
# define DECLARE_ASN1_ITEM(name) \
# define DECLARE_ASN1_ITEM(name) extern OPENSSL_EXPORT const ASN1_ITEM name##_it;
extern OPENSSL_EXPORT const ASN1_ITEM name # # _it ;
/* Parameters used by ASN1_STRING_print_ex() */
// Parameters used by ASN1_STRING_print_ex()
/* These determine which characters to escape:
// These determine which characters to escape:
* RFC2253 special characters , control characters and
// RFC2253 special characters, control characters and
* MSB set characters
// MSB set characters
*/
# define ASN1_STRFLGS_ESC_2253 1
# define ASN1_STRFLGS_ESC_2253 1
# define ASN1_STRFLGS_ESC_CTRL 2
# define ASN1_STRFLGS_ESC_CTRL 2
# define ASN1_STRFLGS_ESC_MSB 4
# define ASN1_STRFLGS_ESC_MSB 4
/* This flag determines how we do escaping: normally
// This flag determines how we do escaping: normally
* RC2253 backslash only , set this to use backslash and
// RC2253 backslash only, set this to use backslash and
* quote .
// quote.
*/
# define ASN1_STRFLGS_ESC_QUOTE 8
# define ASN1_STRFLGS_ESC_QUOTE 8
/* These three flags are internal use only. */
// These three flags are internal use only.
/* Character is a valid PrintableString character */
// Character is a valid PrintableString character
# define CHARTYPE_PRINTABLESTRING 0x10
# define CHARTYPE_PRINTABLESTRING 0x10
/* Character needs escaping if it is the first character */
// Character needs escaping if it is the first character
# define CHARTYPE_FIRST_ESC_2253 0x20
# define CHARTYPE_FIRST_ESC_2253 0x20
/* Character needs escaping if it is the last character */
// Character needs escaping if it is the last character
# define CHARTYPE_LAST_ESC_2253 0x40
# define CHARTYPE_LAST_ESC_2253 0x40
/* NB the internal flags are safely reused below by flags
// NB the internal flags are safely reused below by flags
* handled at the top level .
// handled at the top level.
*/
/* If this is set we convert all character strings
// If this is set we convert all character strings
* to UTF8 first
// to UTF8 first
*/
# define ASN1_STRFLGS_UTF8_CONVERT 0x10
# define ASN1_STRFLGS_UTF8_CONVERT 0x10
/* If this is set we don't attempt to interpret content:
// If this is set we don't attempt to interpret content:
* just assume all strings are 1 byte per character . This
// just assume all strings are 1 byte per character. This
* will produce some pretty odd looking output !
// will produce some pretty odd looking output!
*/
# define ASN1_STRFLGS_IGNORE_TYPE 0x20
# define ASN1_STRFLGS_IGNORE_TYPE 0x20
/* If this is set we include the string type in the output */
// If this is set we include the string type in the output
# define ASN1_STRFLGS_SHOW_TYPE 0x40
# define ASN1_STRFLGS_SHOW_TYPE 0x40
/* This determines which strings to display and which to
// This determines which strings to display and which to
* ' dump ' ( hex dump of content octets or DER encoding ) . We can
// 'dump' (hex dump of content octets or DER encoding). We can
* only dump non character strings or everything . If we
// only dump non character strings or everything. If we
* don ' t dump ' unknown ' they are interpreted as character
// don't dump 'unknown' they are interpreted as character
* strings with 1 octet per character and are subject to
// strings with 1 octet per character and are subject to
* the usual escaping options .
// the usual escaping options.
*/
# define ASN1_STRFLGS_DUMP_ALL 0x80
# define ASN1_STRFLGS_DUMP_ALL 0x80
# define ASN1_STRFLGS_DUMP_UNKNOWN 0x100
# define ASN1_STRFLGS_DUMP_UNKNOWN 0x100
/* These determine what 'dumping' does, we can dump the
// These determine what 'dumping' does, we can dump the
* content octets or the DER encoding : both use the
// content octets or the DER encoding: both use the
* RFC2253 # XXXXX notation .
// RFC2253 #XXXXX notation.
*/
# define ASN1_STRFLGS_DUMP_DER 0x200
# define ASN1_STRFLGS_DUMP_DER 0x200
/* All the string flags consistent with RFC2253,
// All the string flags consistent with RFC2253,
* escaping control characters isn ' t essential in
// escaping control characters isn't essential in
* RFC2253 but it is advisable anyway .
// RFC2253 but it is advisable anyway.
*/
# define ASN1_STRFLGS_RFC2253 (ASN1_STRFLGS_ESC_2253 | \
# define ASN1_STRFLGS_RFC2253 \
ASN1_STRFLGS_ESC_CTRL | \
( ASN1_STRFLGS_ESC_2253 | ASN1_STRFLGS_ESC_CTRL | ASN1_STRFLGS_ESC_MSB | \
ASN1_STRFLGS_ESC_MSB | \
ASN1_STRFLGS_UTF8_CONVERT | ASN1_STRFLGS_DUMP_UNKNOWN | \
ASN1_STRFLGS_UTF8_CONVERT | \
ASN1_STRFLGS_DUMP_UNKNOWN | \
ASN1_STRFLGS_DUMP_DER )
ASN1_STRFLGS_DUMP_DER )
DEFINE_STACK_OF ( ASN1_INTEGER )
DEFINE_STACK_OF ( ASN1_INTEGER )
DECLARE_ASN1_SET_OF ( ASN1_INTEGER )
DECLARE_ASN1_SET_OF ( ASN1_INTEGER )
struct asn1_type_st
struct asn1_type_st {
{
int type ;
int type ;
union {
union {
char * ptr ;
char * ptr ;
ASN1_BOOLEAN boolean ;
ASN1_BOOLEAN boolean ;
ASN1_STRING * asn1_string ;
ASN1_STRING * asn1_string ;
ASN1_OBJECT * object ;
ASN1_OBJECT * object ;
ASN1_INTEGER * integer ;
ASN1_INTEGER * integer ;
ASN1_ENUMERATED * enumerated ;
ASN1_ENUMERATED * enumerated ;
ASN1_BIT_STRING * bit_string ;
ASN1_BIT_STRING * bit_string ;
ASN1_OCTET_STRING * octet_string ;
ASN1_OCTET_STRING * octet_string ;
ASN1_PRINTABLESTRING * printablestring ;
ASN1_PRINTABLESTRING * printablestring ;
ASN1_T61STRING * t61string ;
ASN1_T61STRING * t61string ;
ASN1_IA5STRING * ia5string ;
ASN1_IA5STRING * ia5string ;
ASN1_GENERALSTRING * generalstring ;
ASN1_GENERALSTRING * generalstring ;
ASN1_BMPSTRING * bmpstring ;
ASN1_BMPSTRING * bmpstring ;
ASN1_UNIVERSALSTRING * universalstring ;
ASN1_UNIVERSALSTRING * universalstring ;
ASN1_UTCTIME * utctime ;
ASN1_UTCTIME * utctime ;
ASN1_GENERALIZEDTIME * generalizedtime ;
ASN1_GENERALIZEDTIME * generalizedtime ;
ASN1_VISIBLESTRING * visiblestring ;
ASN1_VISIBLESTRING * visiblestring ;
ASN1_UTF8STRING * utf8string ;
ASN1_UTF8STRING * utf8string ;
/* set and sequence are left complete and still
// set and sequence are left complete and still
* contain the set or sequence bytes */
// contain the set or sequence bytes
ASN1_STRING * set ;
ASN1_STRING * set ;
ASN1_STRING * sequence ;
ASN1_STRING * sequence ;
ASN1_VALUE * asn1_value ;
ASN1_VALUE * asn1_value ;
} value ;
} value ;
} ;
} ;
DEFINE_STACK_OF ( ASN1_TYPE )
DEFINE_STACK_OF ( ASN1_TYPE )
DECLARE_ASN1_SET_OF ( ASN1_TYPE )
DECLARE_ASN1_SET_OF ( ASN1_TYPE )
@ -462,15 +446,14 @@ typedef STACK_OF(ASN1_TYPE) ASN1_SEQUENCE_ANY;
DECLARE_ASN1_ENCODE_FUNCTIONS_const ( ASN1_SEQUENCE_ANY , ASN1_SEQUENCE_ANY )
DECLARE_ASN1_ENCODE_FUNCTIONS_const ( ASN1_SEQUENCE_ANY , ASN1_SEQUENCE_ANY )
DECLARE_ASN1_ENCODE_FUNCTIONS_const ( ASN1_SEQUENCE_ANY , ASN1_SET_ANY )
DECLARE_ASN1_ENCODE_FUNCTIONS_const ( ASN1_SEQUENCE_ANY , ASN1_SET_ANY )
struct X509_algor_st
struct X509_algor_st {
{
ASN1_OBJECT * algorithm ;
ASN1_OBJECT * algorithm ;
ASN1_TYPE * parameter ;
ASN1_TYPE * parameter ;
} /* X509_ALGOR */ ;
} /* X509_ALGOR */ ;
DECLARE_ASN1_FUNCTIONS ( X509_ALGOR )
DECLARE_ASN1_FUNCTIONS ( X509_ALGOR )
/* This is used to contain a list of bit names */
// This is used to contain a list of bit names
typedef struct BIT_STRING_BITNAME_st {
typedef struct BIT_STRING_BITNAME_st {
int bitnum ;
int bitnum ;
const char * lname ;
const char * lname ;
@ -482,70 +465,55 @@ typedef struct BIT_STRING_BITNAME_st {
# define M_ASN1_STRING_type(x) ((x)->type)
# define M_ASN1_STRING_type(x) ((x)->type)
# define M_ASN1_STRING_data(x) ((x)->data)
# define M_ASN1_STRING_data(x) ((x)->data)
/* Macros for string operations */
// Macros for string operations
# define M_ASN1_BIT_STRING_new() (ASN1_BIT_STRING *) \
# define M_ASN1_BIT_STRING_new() \
ASN1_STRING_type_new ( V_ASN1_BIT_STRING )
( ASN1_BIT_STRING * ) ASN1_STRING_type_new ( V_ASN1_BIT_STRING )
# define M_ASN1_BIT_STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_BIT_STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_BIT_STRING_dup(a) (ASN1_BIT_STRING *) \
# define M_ASN1_BIT_STRING_dup(a) \
ASN1_STRING_dup ( ( const ASN1_STRING * ) a )
( ASN1_BIT_STRING * ) ASN1_STRING_dup ( ( const ASN1_STRING * ) a )
# define M_ASN1_BIT_STRING_cmp(a,b) ASN1_STRING_cmp( \
# define M_ASN1_BIT_STRING_cmp(a, b) \
( const ASN1_STRING * ) a , ( const ASN1_STRING * ) b )
ASN1_STRING_cmp ( ( const ASN1_STRING * ) a , ( const ASN1_STRING * ) b )
# define M_ASN1_BIT_STRING_set(a,b,c) ASN1_STRING_set((ASN1_STRING *)a,b,c)
# define M_ASN1_BIT_STRING_set(a, b, c) ASN1_STRING_set((ASN1_STRING *)a, b, c)
# define M_ASN1_INTEGER_new() (ASN1_INTEGER *) \
# define M_ASN1_INTEGER_new() \
ASN1_STRING_type_new ( V_ASN1_INTEGER )
( ASN1_INTEGER * ) ASN1_STRING_type_new ( V_ASN1_INTEGER )
# define M_ASN1_INTEGER_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_INTEGER_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_INTEGER_dup(a) (ASN1_INTEGER *) \
# define M_ASN1_INTEGER_dup(a) \
ASN1_STRING_dup ( ( const ASN1_STRING * ) a )
( ASN1_INTEGER * ) ASN1_STRING_dup ( ( const ASN1_STRING * ) a )
# define M_ASN1_INTEGER_cmp(a,b) ASN1_STRING_cmp( \
# define M_ASN1_INTEGER_cmp(a, b) \
( const ASN1_STRING * ) a , ( const ASN1_STRING * ) b )
ASN1_STRING_cmp ( ( const ASN1_STRING * ) a , ( const ASN1_STRING * ) b )
# define M_ASN1_ENUMERATED_new() (ASN1_ENUMERATED *) \
# define M_ASN1_ENUMERATED_new() \
ASN1_STRING_type_new ( V_ASN1_ENUMERATED )
( ASN1_ENUMERATED * ) ASN1_STRING_type_new ( V_ASN1_ENUMERATED )
# define M_ASN1_ENUMERATED_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_ENUMERATED_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_ENUMERATED_dup(a) (ASN1_ENUMERATED *) \
# define M_ASN1_ENUMERATED_dup(a) \
ASN1_STRING_dup ( ( const ASN1_STRING * ) a )
( ASN1_ENUMERATED * ) ASN1_STRING_dup ( ( const ASN1_STRING * ) a )
# define M_ASN1_ENUMERATED_cmp(a,b) ASN1_STRING_cmp( \
# define M_ASN1_ENUMERATED_cmp(a, b) \
( const ASN1_STRING * ) a , ( const ASN1_STRING * ) b )
ASN1_STRING_cmp ( ( const ASN1_STRING * ) a , ( const ASN1_STRING * ) b )
# define M_ASN1_OCTET_STRING_new() (ASN1_OCTET_STRING *) \
# define M_ASN1_OCTET_STRING_new() \
ASN1_STRING_type_new ( V_ASN1_OCTET_STRING )
( ASN1_OCTET_STRING * ) ASN1_STRING_type_new ( V_ASN1_OCTET_STRING )
# define M_ASN1_OCTET_STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_OCTET_STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_OCTET_STRING_dup(a) (ASN1_OCTET_STRING *) \
# define M_ASN1_OCTET_STRING_dup(a) \
ASN1_STRING_dup ( ( const ASN1_STRING * ) a )
( ASN1_OCTET_STRING * ) ASN1_STRING_dup ( ( const ASN1_STRING * ) a )
# define M_ASN1_OCTET_STRING_cmp(a,b) ASN1_STRING_cmp( \
# define M_ASN1_OCTET_STRING_cmp(a, b) \
( const ASN1_STRING * ) a , ( const ASN1_STRING * ) b )
ASN1_STRING_cmp ( ( const ASN1_STRING * ) a , ( const ASN1_STRING * ) b )
# define M_ASN1_OCTET_STRING_set(a,b,c) ASN1_STRING_set((ASN1_STRING *)a,b, c)
# define M_ASN1_OCTET_STRING_set(a, b, c) ASN1_STRING_set((ASN1_STRING *)a, b, c)
# define M_ASN1_OCTET_STRING_print(a,b) ASN1_STRING_print(a, (ASN1_STRING *)b)
# define M_ASN1_OCTET_STRING_print(a, b) ASN1_STRING_print(a, (ASN1_STRING *)b)
# define B_ASN1_TIME \
# define B_ASN1_TIME B_ASN1_UTCTIME | B_ASN1_GENERALIZEDTIME
B_ASN1_UTCTIME | \
B_ASN1_GENERALIZEDTIME
# define B_ASN1_PRINTABLE \
# define B_ASN1_PRINTABLE \
B_ASN1_NUMERICSTRING | \
B_ASN1_NUMERICSTRING | B_ASN1_PRINTABLESTRING | B_ASN1_T61STRING | \
B_ASN1_PRINTABLESTRING | \
B_ASN1_IA5STRING | B_ASN1_BIT_STRING | B_ASN1_UNIVERSALSTRING | \
B_ASN1_T61STRING | \
B_ASN1_BMPSTRING | B_ASN1_UTF8STRING | B_ASN1_SEQUENCE | B_ASN1_UNKNOWN
B_ASN1_IA5STRING | \
B_ASN1_BIT_STRING | \
B_ASN1_UNIVERSALSTRING | \
B_ASN1_BMPSTRING | \
B_ASN1_UTF8STRING | \
B_ASN1_SEQUENCE | \
B_ASN1_UNKNOWN
# define B_ASN1_DIRECTORYSTRING \
# define B_ASN1_DIRECTORYSTRING \
B_ASN1_PRINTABLESTRING | \
B_ASN1_PRINTABLESTRING | B_ASN1_TELETEXSTRING | B_ASN1_BMPSTRING | \
B_ASN1_TELETEXSTRING | \
B_ASN1_UNIVERSALSTRING | B_ASN1_UTF8STRING
B_ASN1_BMPSTRING | \
B_ASN1_UNIVERSALSTRING | \
B_ASN1_UTF8STRING
# define B_ASN1_DISPLAYTEXT \
# define B_ASN1_DISPLAYTEXT \
B_ASN1_IA5STRING | \
B_ASN1_IA5STRING | B_ASN1_VISIBLESTRING | B_ASN1_BMPSTRING | B_ASN1_UTF8STRING
B_ASN1_VISIBLESTRING | \
B_ASN1_BMPSTRING | \
B_ASN1_UTF8STRING
# define M_ASN1_PRINTABLE_new() ASN1_STRING_type_new(V_ASN1_T61STRING)
# define M_ASN1_PRINTABLE_new() ASN1_STRING_type_new(V_ASN1_T61STRING)
# define M_ASN1_PRINTABLE_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_PRINTABLE_free(a) ASN1_STRING_free((ASN1_STRING *)a)
@ -556,56 +524,54 @@ typedef struct BIT_STRING_BITNAME_st {
# define M_DISPLAYTEXT_new() ASN1_STRING_type_new(V_ASN1_VISIBLESTRING)
# define M_DISPLAYTEXT_new() ASN1_STRING_type_new(V_ASN1_VISIBLESTRING)
# define M_DISPLAYTEXT_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_DISPLAYTEXT_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_PRINTABLESTRING_new() (ASN1_PRINTABLESTRING *) \
# define M_ASN1_PRINTABLESTRING_new() \
ASN1_STRING_type_new ( V_ASN1_PRINTABLESTRING )
( ASN1_PRINTABLESTRING * ) ASN1_STRING_type_new ( V_ASN1_PRINTABLESTRING )
# define M_ASN1_PRINTABLESTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_PRINTABLESTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_T61STRING_new() (ASN1_T61STRING *) \
# define M_ASN1_T61STRING_new() \
ASN1_STRING_type_new ( V_ASN1_T61STRING )
( ASN1_T61STRING * ) ASN1_STRING_type_new ( V_ASN1_T61STRING )
# define M_ASN1_T61STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_T61STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_IA5STRING_new() (ASN1_IA5STRING *) \
# define M_ASN1_IA5STRING_new() \
ASN1_STRING_type_new ( V_ASN1_IA5STRING )
( ASN1_IA5STRING * ) ASN1_STRING_type_new ( V_ASN1_IA5STRING )
# define M_ASN1_IA5STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_IA5STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_IA5STRING_dup(a) \
# define M_ASN1_IA5STRING_dup(a) \
( ASN1_IA5STRING * ) ASN1_STRING_dup ( ( const ASN1_STRING * ) a )
( ASN1_IA5STRING * ) ASN1_STRING_dup ( ( const ASN1_STRING * ) a )
# define M_ASN1_UTCTIME_new() (ASN1_UTCTIME *) \
# define M_ASN1_UTCTIME_new() \
ASN1_STRING_type_new ( V_ASN1_UTCTIME )
( ASN1_UTCTIME * ) ASN1_STRING_type_new ( V_ASN1_UTCTIME )
# define M_ASN1_UTCTIME_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_UTCTIME_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_UTCTIME_dup(a) (ASN1_UTCTIME *) \
# define M_ASN1_UTCTIME_dup(a) \
ASN1_STRING_dup ( ( const ASN1_STRING * ) a )
( ASN1_UTCTIME * ) ASN1_STRING_dup ( ( const ASN1_STRING * ) a )
# define M_ASN1_GENERALIZEDTIME_new() (ASN1_GENERALIZEDTIME *) \
# define M_ASN1_GENERALIZEDTIME_new() \
ASN1_STRING_type_new ( V_ASN1_GENERALIZEDTIME )
( ASN1_GENERALIZEDTIME * ) ASN1_STRING_type_new ( V_ASN1_GENERALIZEDTIME )
# define M_ASN1_GENERALIZEDTIME_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_GENERALIZEDTIME_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_GENERALIZEDTIME_dup(a) (ASN1_GENERALIZEDTIME *)ASN1_STRING_dup( \
# define M_ASN1_GENERALIZEDTIME_dup(a) \
( const ASN1_STRING * ) a )
( ASN1_GENERALIZEDTIME * ) ASN1_STRING_dup ( ( const ASN1_STRING * ) a )
# define M_ASN1_TIME_new() (ASN1_TIME *)\
# define M_ASN1_TIME_new() (ASN1_TIME *)ASN1_STRING_type_new(V_ASN1_UTCTIME)
ASN1_STRING_type_new ( V_ASN1_UTCTIME )
# define M_ASN1_TIME_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_TIME_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_TIME_dup(a) (ASN1_TIME *)\
# define M_ASN1_TIME_dup(a) (ASN1_TIME *)ASN1_STRING_dup((const ASN1_STRING *)a)
ASN1_STRING_dup ( ( const ASN1_STRING * ) a )
# define M_ASN1_GENERALSTRING_new() (ASN1_GENERALSTRING *) \
# define M_ASN1_GENERALSTRING_new() \
ASN1_STRING_type_new ( V_ASN1_GENERALSTRING )
( ASN1_GENERALSTRING * ) ASN1_STRING_type_new ( V_ASN1_GENERALSTRING )
# define M_ASN1_GENERALSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_GENERALSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_UNIVERSALSTRING_new() (ASN1_UNIVERSALSTRING *) \
# define M_ASN1_UNIVERSALSTRING_new() \
ASN1_STRING_type_new ( V_ASN1_UNIVERSALSTRING )
( ASN1_UNIVERSALSTRING * ) ASN1_STRING_type_new ( V_ASN1_UNIVERSALSTRING )
# define M_ASN1_UNIVERSALSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_UNIVERSALSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_BMPSTRING_new() (ASN1_BMPSTRING *) \
# define M_ASN1_BMPSTRING_new() \
ASN1_STRING_type_new ( V_ASN1_BMPSTRING )
( ASN1_BMPSTRING * ) ASN1_STRING_type_new ( V_ASN1_BMPSTRING )
# define M_ASN1_BMPSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_BMPSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_VISIBLESTRING_new() (ASN1_VISIBLESTRING *) \
# define M_ASN1_VISIBLESTRING_new() \
ASN1_STRING_type_new ( V_ASN1_VISIBLESTRING )
( ASN1_VISIBLESTRING * ) ASN1_STRING_type_new ( V_ASN1_VISIBLESTRING )
# define M_ASN1_VISIBLESTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_VISIBLESTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_UTF8STRING_new() (ASN1_UTF8STRING *) \
# define M_ASN1_UTF8STRING_new() \
ASN1_STRING_type_new ( V_ASN1_UTF8STRING )
( ASN1_UTF8STRING * ) ASN1_STRING_type_new ( V_ASN1_UTF8STRING )
# define M_ASN1_UTF8STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
# define M_ASN1_UTF8STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
DECLARE_ASN1_FUNCTIONS_fname ( ASN1_TYPE , ASN1_ANY , ASN1_TYPE )
DECLARE_ASN1_FUNCTIONS_fname ( ASN1_TYPE , ASN1_ANY , ASN1_TYPE )
@ -615,55 +581,68 @@ OPENSSL_EXPORT void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value);
OPENSSL_EXPORT int ASN1_TYPE_set1 ( ASN1_TYPE * a , int type , const void * value ) ;
OPENSSL_EXPORT int ASN1_TYPE_set1 ( ASN1_TYPE * a , int type , const void * value ) ;
OPENSSL_EXPORT int ASN1_TYPE_cmp ( const ASN1_TYPE * a , const ASN1_TYPE * b ) ;
OPENSSL_EXPORT int ASN1_TYPE_cmp ( const ASN1_TYPE * a , const ASN1_TYPE * b ) ;
OPENSSL_EXPORT ASN1_OBJECT * ASN1_OBJECT_new ( void ) ;
OPENSSL_EXPORT ASN1_OBJECT * ASN1_OBJECT_new ( void ) ;
OPENSSL_EXPORT void ASN1_OBJECT_free ( ASN1_OBJECT * a ) ;
OPENSSL_EXPORT void ASN1_OBJECT_free ( ASN1_OBJECT * a ) ;
OPENSSL_EXPORT int i2d_ASN1_OBJECT ( const ASN1_OBJECT * a , unsigned char * * pp ) ;
OPENSSL_EXPORT int i2d_ASN1_OBJECT ( const ASN1_OBJECT * a , unsigned char * * pp ) ;
OPENSSL_EXPORT ASN1_OBJECT * c2i_ASN1_OBJECT ( ASN1_OBJECT * * a , const unsigned char * * pp ,
OPENSSL_EXPORT ASN1_OBJECT * c2i_ASN1_OBJECT ( ASN1_OBJECT * * a ,
const unsigned char * * pp ,
long length ) ;
long length ) ;
OPENSSL_EXPORT ASN1_OBJECT * d2i_ASN1_OBJECT ( ASN1_OBJECT * * a , const unsigned char * * pp ,
OPENSSL_EXPORT ASN1_OBJECT * d2i_ASN1_OBJECT ( ASN1_OBJECT * * a ,
const unsigned char * * pp ,
long length ) ;
long length ) ;
DECLARE_ASN1_ITEM ( ASN1_OBJECT )
DECLARE_ASN1_ITEM ( ASN1_OBJECT )
DECLARE_ASN1_SET_OF ( ASN1_OBJECT )
DECLARE_ASN1_SET_OF ( ASN1_OBJECT )
OPENSSL_EXPORT ASN1_STRING * ASN1_STRING_new ( void ) ;
OPENSSL_EXPORT ASN1_STRING * ASN1_STRING_new ( void ) ;
OPENSSL_EXPORT void ASN1_STRING_free ( ASN1_STRING * a ) ;
OPENSSL_EXPORT void ASN1_STRING_free ( ASN1_STRING * a ) ;
OPENSSL_EXPORT int ASN1_STRING_copy ( ASN1_STRING * dst , const ASN1_STRING * str ) ;
OPENSSL_EXPORT int ASN1_STRING_copy ( ASN1_STRING * dst , const ASN1_STRING * str ) ;
OPENSSL_EXPORT ASN1_STRING * ASN1_STRING_dup ( const ASN1_STRING * a ) ;
OPENSSL_EXPORT ASN1_STRING * ASN1_STRING_dup ( const ASN1_STRING * a ) ;
OPENSSL_EXPORT ASN1_STRING * ASN1_STRING_type_new ( int type ) ;
OPENSSL_EXPORT ASN1_STRING * ASN1_STRING_type_new ( int type ) ;
OPENSSL_EXPORT int ASN1_STRING_cmp ( const ASN1_STRING * a , const ASN1_STRING * b ) ;
OPENSSL_EXPORT int ASN1_STRING_cmp ( const ASN1_STRING * a , const ASN1_STRING * b ) ;
/* Since this is used to store all sorts of things, via macros, for now, make
/* Since this is used to store all sorts of things, via macros, for now, make
its data void * */
its data void * */
OPENSSL_EXPORT int ASN1_STRING_set ( ASN1_STRING * str , const void * data , int len ) ;
OPENSSL_EXPORT int ASN1_STRING_set ( ASN1_STRING * str , const void * data , int len ) ;
OPENSSL_EXPORT void ASN1_STRING_set0 ( ASN1_STRING * str , void * data , int len ) ;
OPENSSL_EXPORT void ASN1_STRING_set0 ( ASN1_STRING * str , void * data , int len ) ;
OPENSSL_EXPORT int ASN1_STRING_length ( const ASN1_STRING * x ) ;
OPENSSL_EXPORT int ASN1_STRING_length ( const ASN1_STRING * x ) ;
OPENSSL_EXPORT int ASN1_STRING_type ( const ASN1_STRING * x ) ;
OPENSSL_EXPORT int ASN1_STRING_type ( const ASN1_STRING * x ) ;
OPENSSL_EXPORT unsigned char * ASN1_STRING_data ( ASN1_STRING * x ) ;
OPENSSL_EXPORT unsigned char * ASN1_STRING_data ( ASN1_STRING * x ) ;
OPENSSL_EXPORT const unsigned char * ASN1_STRING_get0_data ( const ASN1_STRING * x ) ;
OPENSSL_EXPORT const unsigned char * ASN1_STRING_get0_data ( const ASN1_STRING * x ) ;
DECLARE_ASN1_FUNCTIONS ( ASN1_BIT_STRING )
DECLARE_ASN1_FUNCTIONS ( ASN1_BIT_STRING )
OPENSSL_EXPORT int i2c_ASN1_BIT_STRING ( const ASN1_BIT_STRING * a , unsigned char * * pp ) ;
OPENSSL_EXPORT int i2c_ASN1_BIT_STRING ( const ASN1_BIT_STRING * a ,
OPENSSL_EXPORT ASN1_BIT_STRING * c2i_ASN1_BIT_STRING ( ASN1_BIT_STRING * * a , const unsigned char * * pp , long length ) ;
unsigned char * * pp ) ;
OPENSSL_EXPORT int ASN1_BIT_STRING_set ( ASN1_BIT_STRING * a , unsigned char * d , int length ) ;
OPENSSL_EXPORT ASN1_BIT_STRING * c2i_ASN1_BIT_STRING ( ASN1_BIT_STRING * * a ,
OPENSSL_EXPORT int ASN1_BIT_STRING_set_bit ( ASN1_BIT_STRING * a , int n , int value ) ;
const unsigned char * * pp ,
long length ) ;
OPENSSL_EXPORT int ASN1_BIT_STRING_set ( ASN1_BIT_STRING * a , unsigned char * d ,
int length ) ;
OPENSSL_EXPORT int ASN1_BIT_STRING_set_bit ( ASN1_BIT_STRING * a , int n ,
int value ) ;
OPENSSL_EXPORT int ASN1_BIT_STRING_get_bit ( const ASN1_BIT_STRING * a , int n ) ;
OPENSSL_EXPORT int ASN1_BIT_STRING_get_bit ( const ASN1_BIT_STRING * a , int n ) ;
OPENSSL_EXPORT int ASN1_BIT_STRING_check ( const ASN1_BIT_STRING * a , unsigned char * flags , int flags_len ) ;
OPENSSL_EXPORT int ASN1_BIT_STRING_check ( const ASN1_BIT_STRING * a ,
unsigned char * flags , int flags_len ) ;
OPENSSL_EXPORT int i2d_ASN1_BOOLEAN ( int a , unsigned char * * pp ) ;
OPENSSL_EXPORT int i2d_ASN1_BOOLEAN ( int a , unsigned char * * pp ) ;
OPENSSL_EXPORT int d2i_ASN1_BOOLEAN ( int * a , const unsigned char * * pp , long length ) ;
OPENSSL_EXPORT int d2i_ASN1_BOOLEAN ( int * a , const unsigned char * * pp ,
long length ) ;
DECLARE_ASN1_FUNCTIONS ( ASN1_INTEGER )
DECLARE_ASN1_FUNCTIONS ( ASN1_INTEGER )
OPENSSL_EXPORT int i2c_ASN1_INTEGER ( const ASN1_INTEGER * a , unsigned char * * pp ) ;
OPENSSL_EXPORT int i2c_ASN1_INTEGER ( const ASN1_INTEGER * a , unsigned char * * pp ) ;
OPENSSL_EXPORT ASN1_INTEGER * c2i_ASN1_INTEGER ( ASN1_INTEGER * * a , const unsigned char * * pp , long length ) ;
OPENSSL_EXPORT ASN1_INTEGER * c2i_ASN1_INTEGER ( ASN1_INTEGER * * a ,
OPENSSL_EXPORT ASN1_INTEGER * ASN1_INTEGER_dup ( const ASN1_INTEGER * x ) ;
const unsigned char * * pp ,
OPENSSL_EXPORT int ASN1_INTEGER_cmp ( const ASN1_INTEGER * x , const ASN1_INTEGER * y ) ;
long length ) ;
OPENSSL_EXPORT ASN1_INTEGER * ASN1_INTEGER_dup ( const ASN1_INTEGER * x ) ;
OPENSSL_EXPORT int ASN1_INTEGER_cmp ( const ASN1_INTEGER * x ,
const ASN1_INTEGER * y ) ;
DECLARE_ASN1_FUNCTIONS ( ASN1_ENUMERATED )
DECLARE_ASN1_FUNCTIONS ( ASN1_ENUMERATED )
OPENSSL_EXPORT int ASN1_UTCTIME_check ( const ASN1_UTCTIME * a ) ;
OPENSSL_EXPORT int ASN1_UTCTIME_check ( const ASN1_UTCTIME * a ) ;
OPENSSL_EXPORT ASN1_UTCTIME * ASN1_UTCTIME_set ( ASN1_UTCTIME * s , time_t t ) ;
OPENSSL_EXPORT ASN1_UTCTIME * ASN1_UTCTIME_set ( ASN1_UTCTIME * s , time_t t ) ;
OPENSSL_EXPORT ASN1_UTCTIME * ASN1_UTCTIME_adj ( ASN1_UTCTIME * s , time_t t , int offset_day , long offset_sec ) ;
OPENSSL_EXPORT ASN1_UTCTIME * ASN1_UTCTIME_adj ( ASN1_UTCTIME * s , time_t t ,
int offset_day , long offset_sec ) ;
OPENSSL_EXPORT int ASN1_UTCTIME_set_string ( ASN1_UTCTIME * s , const char * str ) ;
OPENSSL_EXPORT int ASN1_UTCTIME_set_string ( ASN1_UTCTIME * s , const char * str ) ;
OPENSSL_EXPORT int ASN1_UTCTIME_cmp_time_t ( const ASN1_UTCTIME * s , time_t t ) ;
OPENSSL_EXPORT int ASN1_UTCTIME_cmp_time_t ( const ASN1_UTCTIME * s , time_t t ) ;
#if 0
#if 0
@ -671,15 +650,22 @@ time_t ASN1_UTCTIME_get(const ASN1_UTCTIME *s);
# endif
# endif
OPENSSL_EXPORT int ASN1_GENERALIZEDTIME_check ( const ASN1_GENERALIZEDTIME * a ) ;
OPENSSL_EXPORT int ASN1_GENERALIZEDTIME_check ( const ASN1_GENERALIZEDTIME * a ) ;
OPENSSL_EXPORT ASN1_GENERALIZEDTIME * ASN1_GENERALIZEDTIME_set ( ASN1_GENERALIZEDTIME * s , time_t t ) ;
OPENSSL_EXPORT ASN1_GENERALIZEDTIME * ASN1_GENERALIZEDTIME_set (
OPENSSL_EXPORT ASN1_GENERALIZEDTIME * ASN1_GENERALIZEDTIME_adj ( ASN1_GENERALIZEDTIME * s , time_t t , int offset_day , long offset_sec ) ;
ASN1_GENERALIZEDTIME * s , time_t t ) ;
OPENSSL_EXPORT int ASN1_GENERALIZEDTIME_set_string ( ASN1_GENERALIZEDTIME * s , const char * str ) ;
OPENSSL_EXPORT ASN1_GENERALIZEDTIME * ASN1_GENERALIZEDTIME_adj (
OPENSSL_EXPORT int ASN1_TIME_diff ( int * pday , int * psec , const ASN1_TIME * from , const ASN1_TIME * to ) ;
ASN1_GENERALIZEDTIME * s , time_t t , int offset_day , long offset_sec ) ;
OPENSSL_EXPORT int ASN1_GENERALIZEDTIME_set_string ( ASN1_GENERALIZEDTIME * s ,
const char * str ) ;
OPENSSL_EXPORT int ASN1_TIME_diff ( int * pday , int * psec , const ASN1_TIME * from ,
const ASN1_TIME * to ) ;
DECLARE_ASN1_FUNCTIONS ( ASN1_OCTET_STRING )
DECLARE_ASN1_FUNCTIONS ( ASN1_OCTET_STRING )
OPENSSL_EXPORT ASN1_OCTET_STRING * ASN1_OCTET_STRING_dup ( const ASN1_OCTET_STRING * a ) ;
OPENSSL_EXPORT ASN1_OCTET_STRING * ASN1_OCTET_STRING_dup (
OPENSSL_EXPORT int ASN1_OCTET_STRING_cmp ( const ASN1_OCTET_STRING * a , const ASN1_OCTET_STRING * b ) ;
const ASN1_OCTET_STRING * a ) ;
OPENSSL_EXPORT int ASN1_OCTET_STRING_set ( ASN1_OCTET_STRING * str , const unsigned char * data , int len ) ;
OPENSSL_EXPORT int ASN1_OCTET_STRING_cmp ( const ASN1_OCTET_STRING * a ,
const ASN1_OCTET_STRING * b ) ;
OPENSSL_EXPORT int ASN1_OCTET_STRING_set ( ASN1_OCTET_STRING * str ,
const unsigned char * data , int len ) ;
DECLARE_ASN1_FUNCTIONS ( ASN1_VISIBLESTRING )
DECLARE_ASN1_FUNCTIONS ( ASN1_VISIBLESTRING )
DECLARE_ASN1_FUNCTIONS ( ASN1_UNIVERSALSTRING )
DECLARE_ASN1_FUNCTIONS ( ASN1_UNIVERSALSTRING )
@ -699,40 +685,50 @@ DECLARE_ASN1_FUNCTIONS(ASN1_UTCTIME)
DECLARE_ASN1_FUNCTIONS ( ASN1_GENERALIZEDTIME )
DECLARE_ASN1_FUNCTIONS ( ASN1_GENERALIZEDTIME )
DECLARE_ASN1_FUNCTIONS ( ASN1_TIME )
DECLARE_ASN1_FUNCTIONS ( ASN1_TIME )
OPENSSL_EXPORT ASN1_TIME * ASN1_TIME_set ( ASN1_TIME * s , time_t t ) ;
OPENSSL_EXPORT ASN1_TIME * ASN1_TIME_set ( ASN1_TIME * s , time_t t ) ;
OPENSSL_EXPORT ASN1_TIME * ASN1_TIME_adj ( ASN1_TIME * s , time_t t , int offset_day , long offset_sec ) ;
OPENSSL_EXPORT ASN1_TIME * ASN1_TIME_adj ( ASN1_TIME * s , time_t t , int offset_day ,
long offset_sec ) ;
OPENSSL_EXPORT int ASN1_TIME_check ( const ASN1_TIME * t ) ;
OPENSSL_EXPORT int ASN1_TIME_check ( const ASN1_TIME * t ) ;
OPENSSL_EXPORT ASN1_GENERALIZEDTIME * ASN1_TIME_to_generalizedtime ( const ASN1_TIME * t , ASN1_GENERALIZEDTIME * * out ) ;
OPENSSL_EXPORT ASN1_GENERALIZEDTIME * ASN1_TIME_to_generalizedtime (
const ASN1_TIME * t , ASN1_GENERALIZEDTIME * * out ) ;
OPENSSL_EXPORT int ASN1_TIME_set_string ( ASN1_TIME * s , const char * str ) ;
OPENSSL_EXPORT int ASN1_TIME_set_string ( ASN1_TIME * s , const char * str ) ;
OPENSSL_EXPORT int i2a_ASN1_INTEGER ( BIO * bp , const ASN1_INTEGER * a ) ;
OPENSSL_EXPORT int i2a_ASN1_INTEGER ( BIO * bp , const ASN1_INTEGER * a ) ;
OPENSSL_EXPORT int i2a_ASN1_ENUMERATED ( BIO * bp , const ASN1_ENUMERATED * a ) ;
OPENSSL_EXPORT int i2a_ASN1_ENUMERATED ( BIO * bp , const ASN1_ENUMERATED * a ) ;
OPENSSL_EXPORT int i2a_ASN1_OBJECT ( BIO * bp , const ASN1_OBJECT * a ) ;
OPENSSL_EXPORT int i2a_ASN1_OBJECT ( BIO * bp , const ASN1_OBJECT * a ) ;
OPENSSL_EXPORT int i2a_ASN1_STRING ( BIO * bp , const ASN1_STRING * a , int type ) ;
OPENSSL_EXPORT int i2a_ASN1_STRING ( BIO * bp , const ASN1_STRING * a , int type ) ;
OPENSSL_EXPORT int i2t_ASN1_OBJECT ( char * buf , int buf_len , const ASN1_OBJECT * a ) ;
OPENSSL_EXPORT int i2t_ASN1_OBJECT ( char * buf , int buf_len ,
const ASN1_OBJECT * a ) ;
OPENSSL_EXPORT ASN1_OBJECT * ASN1_OBJECT_create ( int nid , unsigned char * data , int len , const char * sn , const char * ln ) ;
OPENSSL_EXPORT ASN1_OBJECT * ASN1_OBJECT_create ( int nid , unsigned char * data ,
int len , const char * sn ,
const char * ln ) ;
OPENSSL_EXPORT int ASN1_INTEGER_set ( ASN1_INTEGER * a , long v ) ;
OPENSSL_EXPORT int ASN1_INTEGER_set ( ASN1_INTEGER * a , long v ) ;
OPENSSL_EXPORT int ASN1_INTEGER_set_uint64 ( ASN1_INTEGER * out , uint64_t v ) ;
OPENSSL_EXPORT int ASN1_INTEGER_set_uint64 ( ASN1_INTEGER * out , uint64_t v ) ;
OPENSSL_EXPORT long ASN1_INTEGER_get ( const ASN1_INTEGER * a ) ;
OPENSSL_EXPORT long ASN1_INTEGER_get ( const ASN1_INTEGER * a ) ;
OPENSSL_EXPORT ASN1_INTEGER * BN_to_ASN1_INTEGER ( const BIGNUM * bn , ASN1_INTEGER * ai ) ;
OPENSSL_EXPORT ASN1_INTEGER * BN_to_ASN1_INTEGER ( const BIGNUM * bn ,
OPENSSL_EXPORT BIGNUM * ASN1_INTEGER_to_BN ( const ASN1_INTEGER * ai , BIGNUM * bn ) ;
ASN1_INTEGER * ai ) ;
OPENSSL_EXPORT BIGNUM * ASN1_INTEGER_to_BN ( const ASN1_INTEGER * ai , BIGNUM * bn ) ;
OPENSSL_EXPORT int ASN1_ENUMERATED_set ( ASN1_ENUMERATED * a , long v ) ;
OPENSSL_EXPORT int ASN1_ENUMERATED_set ( ASN1_ENUMERATED * a , long v ) ;
OPENSSL_EXPORT long ASN1_ENUMERATED_get ( const ASN1_ENUMERATED * a ) ;
OPENSSL_EXPORT long ASN1_ENUMERATED_get ( const ASN1_ENUMERATED * a ) ;
OPENSSL_EXPORT ASN1_ENUMERATED * BN_to_ASN1_ENUMERATED ( const BIGNUM * bn , ASN1_ENUMERATED * ai ) ;
OPENSSL_EXPORT ASN1_ENUMERATED * BN_to_ASN1_ENUMERATED ( const BIGNUM * bn ,
OPENSSL_EXPORT BIGNUM * ASN1_ENUMERATED_to_BN ( const ASN1_ENUMERATED * ai , BIGNUM * bn ) ;
ASN1_ENUMERATED * ai ) ;
OPENSSL_EXPORT BIGNUM * ASN1_ENUMERATED_to_BN ( const ASN1_ENUMERATED * ai ,
BIGNUM * bn ) ;
/* General */
// General
/* given a string, return the correct type, max is the maximum length */
// given a string, return the correct type, max is the maximum length
OPENSSL_EXPORT int ASN1_PRINTABLE_type ( const unsigned char * s , int max ) ;
OPENSSL_EXPORT int ASN1_PRINTABLE_type ( const unsigned char * s , int max ) ;
OPENSSL_EXPORT unsigned long ASN1_tag2bit ( int tag ) ;
OPENSSL_EXPORT unsigned long ASN1_tag2bit ( int tag ) ;
/* SPECIALS */
// SPECIALS
OPENSSL_EXPORT int ASN1_get_object ( const unsigned char * * pp , long * plength , int * ptag , int * pclass , long omax ) ;
OPENSSL_EXPORT int ASN1_get_object ( const unsigned char * * pp , long * plength ,
OPENSSL_EXPORT void ASN1_put_object ( unsigned char * * pp , int constructed , int length , int tag , int xclass ) ;
int * ptag , int * pclass , long omax ) ;
OPENSSL_EXPORT void ASN1_put_object ( unsigned char * * pp , int constructed ,
int length , int tag , int xclass ) ;
OPENSSL_EXPORT int ASN1_put_eoc ( unsigned char * * pp ) ;
OPENSSL_EXPORT int ASN1_put_eoc ( unsigned char * * pp ) ;
OPENSSL_EXPORT int ASN1_object_size ( int constructed , int length , int tag ) ;
OPENSSL_EXPORT int ASN1_object_size ( int constructed , int length , int tag ) ;
@ -741,7 +737,8 @@ OPENSSL_EXPORT void *ASN1_item_dup(const ASN1_ITEM *it, void *x);
# ifndef OPENSSL_NO_FP_API
# ifndef OPENSSL_NO_FP_API
OPENSSL_EXPORT void * ASN1_item_d2i_fp ( const ASN1_ITEM * it , FILE * in , void * x ) ;
OPENSSL_EXPORT void * ASN1_item_d2i_fp ( const ASN1_ITEM * it , FILE * in , void * x ) ;
OPENSSL_EXPORT int ASN1_item_i2d_fp ( const ASN1_ITEM * it , FILE * out , void * x ) ;
OPENSSL_EXPORT int ASN1_item_i2d_fp ( const ASN1_ITEM * it , FILE * out , void * x ) ;
OPENSSL_EXPORT int ASN1_STRING_print_ex_fp ( FILE * fp , const ASN1_STRING * str , unsigned long flags ) ;
OPENSSL_EXPORT int ASN1_STRING_print_ex_fp ( FILE * fp , const ASN1_STRING * str ,
unsigned long flags ) ;
# endif
# endif
OPENSSL_EXPORT int ASN1_STRING_to_UTF8 ( unsigned char * * out , ASN1_STRING * in ) ;
OPENSSL_EXPORT int ASN1_STRING_to_UTF8 ( unsigned char * * out , ASN1_STRING * in ) ;
@ -749,36 +746,52 @@ OPENSSL_EXPORT int ASN1_STRING_to_UTF8(unsigned char **out, ASN1_STRING *in);
OPENSSL_EXPORT void * ASN1_item_d2i_bio ( const ASN1_ITEM * it , BIO * in , void * x ) ;
OPENSSL_EXPORT void * ASN1_item_d2i_bio ( const ASN1_ITEM * it , BIO * in , void * x ) ;
OPENSSL_EXPORT int ASN1_item_i2d_bio ( const ASN1_ITEM * it , BIO * out , void * x ) ;
OPENSSL_EXPORT int ASN1_item_i2d_bio ( const ASN1_ITEM * it , BIO * out , void * x ) ;
OPENSSL_EXPORT int ASN1_UTCTIME_print ( BIO * fp , const ASN1_UTCTIME * a ) ;
OPENSSL_EXPORT int ASN1_UTCTIME_print ( BIO * fp , const ASN1_UTCTIME * a ) ;
OPENSSL_EXPORT int ASN1_GENERALIZEDTIME_print ( BIO * fp , const ASN1_GENERALIZEDTIME * a ) ;
OPENSSL_EXPORT int ASN1_GENERALIZEDTIME_print ( BIO * fp ,
const ASN1_GENERALIZEDTIME * a ) ;
OPENSSL_EXPORT int ASN1_TIME_print ( BIO * fp , const ASN1_TIME * a ) ;
OPENSSL_EXPORT int ASN1_TIME_print ( BIO * fp , const ASN1_TIME * a ) ;
OPENSSL_EXPORT int ASN1_STRING_print ( BIO * bp , const ASN1_STRING * v ) ;
OPENSSL_EXPORT int ASN1_STRING_print ( BIO * bp , const ASN1_STRING * v ) ;
OPENSSL_EXPORT int ASN1_STRING_print_ex ( BIO * out , const ASN1_STRING * str , unsigned long flags ) ;
OPENSSL_EXPORT int ASN1_STRING_print_ex ( BIO * out , const ASN1_STRING * str ,
unsigned long flags ) ;
OPENSSL_EXPORT const char * ASN1_tag2str ( int tag ) ;
OPENSSL_EXPORT const char * ASN1_tag2str ( int tag ) ;
/* Used to load and write netscape format cert */
// Used to load and write netscape format cert
OPENSSL_EXPORT void * ASN1_item_unpack ( const ASN1_STRING * oct , const ASN1_ITEM * it ) ;
OPENSSL_EXPORT void * ASN1_item_unpack ( const ASN1_STRING * oct ,
const ASN1_ITEM * it ) ;
OPENSSL_EXPORT ASN1_STRING * ASN1_item_pack ( void * obj , const ASN1_ITEM * it , ASN1_OCTET_STRING * * oct ) ;
OPENSSL_EXPORT ASN1_STRING * ASN1_item_pack ( void * obj , const ASN1_ITEM * it ,
ASN1_OCTET_STRING * * oct ) ;
OPENSSL_EXPORT void ASN1_STRING_set_default_mask ( unsigned long mask ) ;
OPENSSL_EXPORT void ASN1_STRING_set_default_mask ( unsigned long mask ) ;
OPENSSL_EXPORT int ASN1_STRING_set_default_mask_asc ( const char * p ) ;
OPENSSL_EXPORT int ASN1_STRING_set_default_mask_asc ( const char * p ) ;
OPENSSL_EXPORT unsigned long ASN1_STRING_get_default_mask ( void ) ;
OPENSSL_EXPORT unsigned long ASN1_STRING_get_default_mask ( void ) ;
OPENSSL_EXPORT int ASN1_mbstring_copy ( ASN1_STRING * * out , const unsigned char * in , int len , int inform , unsigned long mask ) ;
OPENSSL_EXPORT int ASN1_mbstring_copy ( ASN1_STRING * * out ,
OPENSSL_EXPORT int ASN1_mbstring_ncopy ( ASN1_STRING * * out , const unsigned char * in , int len , int inform , unsigned long mask , long minsize , long maxsize ) ;
const unsigned char * in , int len ,
int inform , unsigned long mask ) ;
OPENSSL_EXPORT ASN1_STRING * ASN1_STRING_set_by_NID ( ASN1_STRING * * out , const unsigned char * in , int inlen , int inform , int nid ) ;
OPENSSL_EXPORT int ASN1_mbstring_ncopy ( ASN1_STRING * * out ,
const unsigned char * in , int len ,
int inform , unsigned long mask ,
long minsize , long maxsize ) ;
OPENSSL_EXPORT ASN1_STRING * ASN1_STRING_set_by_NID ( ASN1_STRING * * out ,
const unsigned char * in ,
int inlen , int inform ,
int nid ) ;
OPENSSL_EXPORT ASN1_STRING_TABLE * ASN1_STRING_TABLE_get ( int nid ) ;
OPENSSL_EXPORT ASN1_STRING_TABLE * ASN1_STRING_TABLE_get ( int nid ) ;
OPENSSL_EXPORT int ASN1_STRING_TABLE_add ( int , long , long , unsigned long , unsigned long ) ;
OPENSSL_EXPORT int ASN1_STRING_TABLE_add ( int , long , long , unsigned long ,
unsigned long ) ;
OPENSSL_EXPORT void ASN1_STRING_TABLE_cleanup ( void ) ;
OPENSSL_EXPORT void ASN1_STRING_TABLE_cleanup ( void ) ;
/* ASN1 template functions */
// ASN1 template functions
/* Old API compatible functions */
// Old API compatible functions
OPENSSL_EXPORT ASN1_VALUE * ASN1_item_new ( const ASN1_ITEM * it ) ;
OPENSSL_EXPORT ASN1_VALUE * ASN1_item_new ( const ASN1_ITEM * it ) ;
OPENSSL_EXPORT void ASN1_item_free ( ASN1_VALUE * val , const ASN1_ITEM * it ) ;
OPENSSL_EXPORT void ASN1_item_free ( ASN1_VALUE * val , const ASN1_ITEM * it ) ;
OPENSSL_EXPORT ASN1_VALUE * ASN1_item_d2i ( ASN1_VALUE * * val , const unsigned char * * in , long len , const ASN1_ITEM * it ) ;
OPENSSL_EXPORT ASN1_VALUE * ASN1_item_d2i ( ASN1_VALUE * * val ,
OPENSSL_EXPORT int ASN1_item_i2d ( ASN1_VALUE * val , unsigned char * * out , const ASN1_ITEM * it ) ;
const unsigned char * * in , long len ,
const ASN1_ITEM * it ) ;
OPENSSL_EXPORT int ASN1_item_i2d ( ASN1_VALUE * val , unsigned char * * out ,
const ASN1_ITEM * it ) ;
OPENSSL_EXPORT ASN1_TYPE * ASN1_generate_nconf ( const char * str , CONF * nconf ) ;
OPENSSL_EXPORT ASN1_TYPE * ASN1_generate_nconf ( const char * str , CONF * nconf ) ;
OPENSSL_EXPORT ASN1_TYPE * ASN1_generate_v3 ( const char * str , X509V3_CTX * cnf ) ;
OPENSSL_EXPORT ASN1_TYPE * ASN1_generate_v3 ( const char * str , X509V3_CTX * cnf ) ;
@ -797,7 +810,7 @@ BORINGSSL_MAKE_DELETER(ASN1_TYPE, ASN1_TYPE_free)
BSSL_NAMESPACE_END
BSSL_NAMESPACE_END
} /* extern C++ */
} // extern C++
# endif
# endif