1*8fb009dcSAndroid Build Coastguard Worker /* 2*8fb009dcSAndroid Build Coastguard Worker * Written by Dr Stephen N Henson ([email protected]) for the OpenSSL project 3*8fb009dcSAndroid Build Coastguard Worker * 2006. 4*8fb009dcSAndroid Build Coastguard Worker */ 5*8fb009dcSAndroid Build Coastguard Worker /* ==================================================================== 6*8fb009dcSAndroid Build Coastguard Worker * Copyright (c) 2006 The OpenSSL Project. All rights reserved. 7*8fb009dcSAndroid Build Coastguard Worker * 8*8fb009dcSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 9*8fb009dcSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions 10*8fb009dcSAndroid Build Coastguard Worker * are met: 11*8fb009dcSAndroid Build Coastguard Worker * 12*8fb009dcSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright 13*8fb009dcSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 14*8fb009dcSAndroid Build Coastguard Worker * 15*8fb009dcSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 16*8fb009dcSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in 17*8fb009dcSAndroid Build Coastguard Worker * the documentation and/or other materials provided with the 18*8fb009dcSAndroid Build Coastguard Worker * distribution. 19*8fb009dcSAndroid Build Coastguard Worker * 20*8fb009dcSAndroid Build Coastguard Worker * 3. All advertising materials mentioning features or use of this 21*8fb009dcSAndroid Build Coastguard Worker * software must display the following acknowledgment: 22*8fb009dcSAndroid Build Coastguard Worker * "This product includes software developed by the OpenSSL Project 23*8fb009dcSAndroid Build Coastguard Worker * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 24*8fb009dcSAndroid Build Coastguard Worker * 25*8fb009dcSAndroid Build Coastguard Worker * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 26*8fb009dcSAndroid Build Coastguard Worker * endorse or promote products derived from this software without 27*8fb009dcSAndroid Build Coastguard Worker * prior written permission. For written permission, please contact 28*8fb009dcSAndroid Build Coastguard Worker * [email protected]. 29*8fb009dcSAndroid Build Coastguard Worker * 30*8fb009dcSAndroid Build Coastguard Worker * 5. Products derived from this software may not be called "OpenSSL" 31*8fb009dcSAndroid Build Coastguard Worker * nor may "OpenSSL" appear in their names without prior written 32*8fb009dcSAndroid Build Coastguard Worker * permission of the OpenSSL Project. 33*8fb009dcSAndroid Build Coastguard Worker * 34*8fb009dcSAndroid Build Coastguard Worker * 6. Redistributions of any form whatsoever must retain the following 35*8fb009dcSAndroid Build Coastguard Worker * acknowledgment: 36*8fb009dcSAndroid Build Coastguard Worker * "This product includes software developed by the OpenSSL Project 37*8fb009dcSAndroid Build Coastguard Worker * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 38*8fb009dcSAndroid Build Coastguard Worker * 39*8fb009dcSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 40*8fb009dcSAndroid Build Coastguard Worker * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 41*8fb009dcSAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 42*8fb009dcSAndroid Build Coastguard Worker * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 43*8fb009dcSAndroid Build Coastguard Worker * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 44*8fb009dcSAndroid Build Coastguard Worker * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 45*8fb009dcSAndroid Build Coastguard Worker * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 46*8fb009dcSAndroid Build Coastguard Worker * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47*8fb009dcSAndroid Build Coastguard Worker * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 48*8fb009dcSAndroid Build Coastguard Worker * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 49*8fb009dcSAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 50*8fb009dcSAndroid Build Coastguard Worker * OF THE POSSIBILITY OF SUCH DAMAGE. 51*8fb009dcSAndroid Build Coastguard Worker * ==================================================================== 52*8fb009dcSAndroid Build Coastguard Worker * 53*8fb009dcSAndroid Build Coastguard Worker * This product includes cryptographic software written by Eric Young 54*8fb009dcSAndroid Build Coastguard Worker * ([email protected]). This product includes software written by Tim 55*8fb009dcSAndroid Build Coastguard Worker * Hudson ([email protected]). 56*8fb009dcSAndroid Build Coastguard Worker * 57*8fb009dcSAndroid Build Coastguard Worker */ 58*8fb009dcSAndroid Build Coastguard Worker 59*8fb009dcSAndroid Build Coastguard Worker #ifndef OPENSSL_HEADER_ASN1_INTERNAL_H 60*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_HEADER_ASN1_INTERNAL_H 61*8fb009dcSAndroid Build Coastguard Worker 62*8fb009dcSAndroid Build Coastguard Worker #include <time.h> 63*8fb009dcSAndroid Build Coastguard Worker 64*8fb009dcSAndroid Build Coastguard Worker #include <openssl/asn1.h> 65*8fb009dcSAndroid Build Coastguard Worker #include <openssl/asn1t.h> 66*8fb009dcSAndroid Build Coastguard Worker 67*8fb009dcSAndroid Build Coastguard Worker #if defined(__cplusplus) 68*8fb009dcSAndroid Build Coastguard Worker extern "C" { 69*8fb009dcSAndroid Build Coastguard Worker #endif 70*8fb009dcSAndroid Build Coastguard Worker 71*8fb009dcSAndroid Build Coastguard Worker 72*8fb009dcSAndroid Build Coastguard Worker // Wrapper functions for time functions. 73*8fb009dcSAndroid Build Coastguard Worker 74*8fb009dcSAndroid Build Coastguard Worker // OPENSSL_gmtime converts a time_t value in |time| which must be in the range 75*8fb009dcSAndroid Build Coastguard Worker // of year 0000 to 9999 to a broken out time value in |tm|. On success |tm| is 76*8fb009dcSAndroid Build Coastguard Worker // returned. On failure NULL is returned. 77*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT struct tm *OPENSSL_gmtime(const time_t *time, struct tm *result); 78*8fb009dcSAndroid Build Coastguard Worker 79*8fb009dcSAndroid Build Coastguard Worker // OPENSSL_gmtime_adj returns one on success, and updates |tm| by adding 80*8fb009dcSAndroid Build Coastguard Worker // |offset_day| days and |offset_sec| seconds. It returns zero on failure. |tm| 81*8fb009dcSAndroid Build Coastguard Worker // must be in the range of year 0000 to 9999 both before and after the update or 82*8fb009dcSAndroid Build Coastguard Worker // a failure will be returned. 83*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int OPENSSL_gmtime_adj(struct tm *tm, int offset_day, 84*8fb009dcSAndroid Build Coastguard Worker int64_t offset_sec); 85*8fb009dcSAndroid Build Coastguard Worker 86*8fb009dcSAndroid Build Coastguard Worker // OPENSSL_gmtime_diff calculates the difference between |from| and |to|. It 87*8fb009dcSAndroid Build Coastguard Worker // returns one, and outputs the difference as a number of days and seconds in 88*8fb009dcSAndroid Build Coastguard Worker // |*out_days| and |*out_secs| on success. It returns zero on failure. Both 89*8fb009dcSAndroid Build Coastguard Worker // |from| and |to| must be in the range of year 0000 to 9999 or a failure will 90*8fb009dcSAndroid Build Coastguard Worker // be returned. 91*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int OPENSSL_gmtime_diff(int *out_days, int *out_secs, 92*8fb009dcSAndroid Build Coastguard Worker const struct tm *from, 93*8fb009dcSAndroid Build Coastguard Worker const struct tm *to); 94*8fb009dcSAndroid Build Coastguard Worker 95*8fb009dcSAndroid Build Coastguard Worker // Internal ASN1 structures and functions: not for application use 96*8fb009dcSAndroid Build Coastguard Worker 97*8fb009dcSAndroid Build Coastguard Worker // These are used internally in the ASN1_OBJECT to keep track of 98*8fb009dcSAndroid Build Coastguard Worker // whether the names and data need to be free()ed 99*8fb009dcSAndroid Build Coastguard Worker #define ASN1_OBJECT_FLAG_DYNAMIC 0x01 // internal use 100*8fb009dcSAndroid Build Coastguard Worker #define ASN1_OBJECT_FLAG_DYNAMIC_STRINGS 0x04 // internal use 101*8fb009dcSAndroid Build Coastguard Worker #define ASN1_OBJECT_FLAG_DYNAMIC_DATA 0x08 // internal use 102*8fb009dcSAndroid Build Coastguard Worker 103*8fb009dcSAndroid Build Coastguard Worker // An asn1_object_st (aka |ASN1_OBJECT|) represents an ASN.1 OBJECT IDENTIFIER. 104*8fb009dcSAndroid Build Coastguard Worker // Note: Mutating an |ASN1_OBJECT| is only permitted when initializing it. The 105*8fb009dcSAndroid Build Coastguard Worker // library maintains a table of static |ASN1_OBJECT|s, which may be referenced 106*8fb009dcSAndroid Build Coastguard Worker // by non-const |ASN1_OBJECT| pointers. Code which receives an |ASN1_OBJECT| 107*8fb009dcSAndroid Build Coastguard Worker // pointer externally must assume it is immutable, even if the pointer is not 108*8fb009dcSAndroid Build Coastguard Worker // const. 109*8fb009dcSAndroid Build Coastguard Worker struct asn1_object_st { 110*8fb009dcSAndroid Build Coastguard Worker const char *sn, *ln; 111*8fb009dcSAndroid Build Coastguard Worker int nid; 112*8fb009dcSAndroid Build Coastguard Worker int length; 113*8fb009dcSAndroid Build Coastguard Worker const unsigned char *data; // data remains const after init 114*8fb009dcSAndroid Build Coastguard Worker int flags; // Should we free this one 115*8fb009dcSAndroid Build Coastguard Worker }; 116*8fb009dcSAndroid Build Coastguard Worker 117*8fb009dcSAndroid Build Coastguard Worker ASN1_OBJECT *ASN1_OBJECT_new(void); 118*8fb009dcSAndroid Build Coastguard Worker 119*8fb009dcSAndroid Build Coastguard Worker // ASN1_ENCODING is used to save the received encoding of an ASN.1 type. This 120*8fb009dcSAndroid Build Coastguard Worker // avoids problems with invalid encodings that break signatures. 121*8fb009dcSAndroid Build Coastguard Worker typedef struct ASN1_ENCODING_st { 122*8fb009dcSAndroid Build Coastguard Worker // enc is the saved DER encoding. Its ownership is determined by |buf|. 123*8fb009dcSAndroid Build Coastguard Worker uint8_t *enc; 124*8fb009dcSAndroid Build Coastguard Worker // len is the length of |enc|. If zero, there is no saved encoding. 125*8fb009dcSAndroid Build Coastguard Worker size_t len; 126*8fb009dcSAndroid Build Coastguard Worker // buf, if non-NULL, is the |CRYPTO_BUFFER| that |enc| points into. If NULL, 127*8fb009dcSAndroid Build Coastguard Worker // |enc| must be released with |OPENSSL_free|. 128*8fb009dcSAndroid Build Coastguard Worker CRYPTO_BUFFER *buf; 129*8fb009dcSAndroid Build Coastguard Worker } ASN1_ENCODING; 130*8fb009dcSAndroid Build Coastguard Worker 131*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int asn1_utctime_to_tm(struct tm *tm, const ASN1_UTCTIME *d, 132*8fb009dcSAndroid Build Coastguard Worker int allow_timezone_offset); 133*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int asn1_generalizedtime_to_tm(struct tm *tm, 134*8fb009dcSAndroid Build Coastguard Worker const ASN1_GENERALIZEDTIME *d); 135*8fb009dcSAndroid Build Coastguard Worker 136*8fb009dcSAndroid Build Coastguard Worker int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it); 137*8fb009dcSAndroid Build Coastguard Worker void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it); 138*8fb009dcSAndroid Build Coastguard Worker 139*8fb009dcSAndroid Build Coastguard Worker void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); 140*8fb009dcSAndroid Build Coastguard Worker 141*8fb009dcSAndroid Build Coastguard Worker // ASN1_item_ex_d2i parses |len| bytes from |*in| as a structure of type |it| 142*8fb009dcSAndroid Build Coastguard Worker // and writes the result to |*pval|. If |tag| is non-negative, |it| is 143*8fb009dcSAndroid Build Coastguard Worker // implicitly tagged with the tag specified by |tag| and |aclass|. If |opt| is 144*8fb009dcSAndroid Build Coastguard Worker // non-zero, the value is optional. If |buf| is non-NULL, |*in| must point into 145*8fb009dcSAndroid Build Coastguard Worker // |buf|. 146*8fb009dcSAndroid Build Coastguard Worker // 147*8fb009dcSAndroid Build Coastguard Worker // This function returns one and advances |*in| if an object was successfully 148*8fb009dcSAndroid Build Coastguard Worker // parsed, -1 if an optional value was successfully skipped, and zero on error. 149*8fb009dcSAndroid Build Coastguard Worker int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, 150*8fb009dcSAndroid Build Coastguard Worker const ASN1_ITEM *it, int tag, int aclass, char opt, 151*8fb009dcSAndroid Build Coastguard Worker CRYPTO_BUFFER *buf); 152*8fb009dcSAndroid Build Coastguard Worker 153*8fb009dcSAndroid Build Coastguard Worker // ASN1_item_ex_i2d encodes |*pval| as a value of type |it| to |out| under the 154*8fb009dcSAndroid Build Coastguard Worker // i2d output convention. It returns a non-zero length on success and -1 on 155*8fb009dcSAndroid Build Coastguard Worker // error. If |tag| is -1. the tag and class come from |it|. Otherwise, the tag 156*8fb009dcSAndroid Build Coastguard Worker // number is |tag| and the class is |aclass|. This is used for implicit tagging. 157*8fb009dcSAndroid Build Coastguard Worker // This function treats a missing value as an error, not an optional field. 158*8fb009dcSAndroid Build Coastguard Worker int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, 159*8fb009dcSAndroid Build Coastguard Worker const ASN1_ITEM *it, int tag, int aclass); 160*8fb009dcSAndroid Build Coastguard Worker 161*8fb009dcSAndroid Build Coastguard Worker void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it); 162*8fb009dcSAndroid Build Coastguard Worker 163*8fb009dcSAndroid Build Coastguard Worker // asn1_get_choice_selector returns the CHOICE selector value for |*pval|, which 164*8fb009dcSAndroid Build Coastguard Worker // must of type |it|. 165*8fb009dcSAndroid Build Coastguard Worker int asn1_get_choice_selector(ASN1_VALUE **pval, const ASN1_ITEM *it); 166*8fb009dcSAndroid Build Coastguard Worker 167*8fb009dcSAndroid Build Coastguard Worker int asn1_set_choice_selector(ASN1_VALUE **pval, int value, const ASN1_ITEM *it); 168*8fb009dcSAndroid Build Coastguard Worker 169*8fb009dcSAndroid Build Coastguard Worker // asn1_get_field_ptr returns a pointer to the field in |*pval| corresponding to 170*8fb009dcSAndroid Build Coastguard Worker // |tt|. 171*8fb009dcSAndroid Build Coastguard Worker ASN1_VALUE **asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); 172*8fb009dcSAndroid Build Coastguard Worker 173*8fb009dcSAndroid Build Coastguard Worker // asn1_do_adb returns the |ASN1_TEMPLATE| for the ANY DEFINED BY field |tt|, 174*8fb009dcSAndroid Build Coastguard Worker // based on the selector INTEGER or OID in |*pval|. If |tt| is not an ADB field, 175*8fb009dcSAndroid Build Coastguard Worker // it returns |tt|. If the selector does not match any value, it returns NULL. 176*8fb009dcSAndroid Build Coastguard Worker // If |nullerr| is non-zero, it will additionally push an error to the error 177*8fb009dcSAndroid Build Coastguard Worker // queue when there is no match. 178*8fb009dcSAndroid Build Coastguard Worker const ASN1_TEMPLATE *asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt, 179*8fb009dcSAndroid Build Coastguard Worker int nullerr); 180*8fb009dcSAndroid Build Coastguard Worker 181*8fb009dcSAndroid Build Coastguard Worker void asn1_refcount_set_one(ASN1_VALUE **pval, const ASN1_ITEM *it); 182*8fb009dcSAndroid Build Coastguard Worker int asn1_refcount_dec_and_test_zero(ASN1_VALUE **pval, const ASN1_ITEM *it); 183*8fb009dcSAndroid Build Coastguard Worker 184*8fb009dcSAndroid Build Coastguard Worker void asn1_enc_init(ASN1_VALUE **pval, const ASN1_ITEM *it); 185*8fb009dcSAndroid Build Coastguard Worker void asn1_enc_free(ASN1_VALUE **pval, const ASN1_ITEM *it); 186*8fb009dcSAndroid Build Coastguard Worker 187*8fb009dcSAndroid Build Coastguard Worker // asn1_enc_restore, if |*pval| has a saved encoding, writes it to |out| under 188*8fb009dcSAndroid Build Coastguard Worker // the i2d output convention, sets |*len| to the length, and returns one. If it 189*8fb009dcSAndroid Build Coastguard Worker // has no saved encoding, it returns zero. 190*8fb009dcSAndroid Build Coastguard Worker int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval, 191*8fb009dcSAndroid Build Coastguard Worker const ASN1_ITEM *it); 192*8fb009dcSAndroid Build Coastguard Worker 193*8fb009dcSAndroid Build Coastguard Worker // asn1_enc_save saves |inlen| bytes from |in| as |*pval|'s saved encoding. It 194*8fb009dcSAndroid Build Coastguard Worker // returns one on success and zero on error. If |buf| is non-NULL, |in| must 195*8fb009dcSAndroid Build Coastguard Worker // point into |buf|. 196*8fb009dcSAndroid Build Coastguard Worker int asn1_enc_save(ASN1_VALUE **pval, const uint8_t *in, size_t inlen, 197*8fb009dcSAndroid Build Coastguard Worker const ASN1_ITEM *it, CRYPTO_BUFFER *buf); 198*8fb009dcSAndroid Build Coastguard Worker 199*8fb009dcSAndroid Build Coastguard Worker // asn1_encoding_clear clears the cached encoding in |enc|. 200*8fb009dcSAndroid Build Coastguard Worker void asn1_encoding_clear(ASN1_ENCODING *enc); 201*8fb009dcSAndroid Build Coastguard Worker 202*8fb009dcSAndroid Build Coastguard Worker // asn1_type_value_as_pointer returns |a|'s value in pointer form. This is 203*8fb009dcSAndroid Build Coastguard Worker // usually the value object but, for BOOLEAN values, is 0 or 0xff cast to 204*8fb009dcSAndroid Build Coastguard Worker // a pointer. 205*8fb009dcSAndroid Build Coastguard Worker const void *asn1_type_value_as_pointer(const ASN1_TYPE *a); 206*8fb009dcSAndroid Build Coastguard Worker 207*8fb009dcSAndroid Build Coastguard Worker // asn1_type_set0_string sets |a|'s value to the object represented by |str| and 208*8fb009dcSAndroid Build Coastguard Worker // takes ownership of |str|. 209*8fb009dcSAndroid Build Coastguard Worker void asn1_type_set0_string(ASN1_TYPE *a, ASN1_STRING *str); 210*8fb009dcSAndroid Build Coastguard Worker 211*8fb009dcSAndroid Build Coastguard Worker // asn1_type_cleanup releases memory associated with |a|'s value, without 212*8fb009dcSAndroid Build Coastguard Worker // freeing |a| itself. 213*8fb009dcSAndroid Build Coastguard Worker void asn1_type_cleanup(ASN1_TYPE *a); 214*8fb009dcSAndroid Build Coastguard Worker 215*8fb009dcSAndroid Build Coastguard Worker // asn1_is_printable returns one if |value| is a valid Unicode codepoint for an 216*8fb009dcSAndroid Build Coastguard Worker // ASN.1 PrintableString, and zero otherwise. 217*8fb009dcSAndroid Build Coastguard Worker int asn1_is_printable(uint32_t value); 218*8fb009dcSAndroid Build Coastguard Worker 219*8fb009dcSAndroid Build Coastguard Worker // asn1_bit_string_length returns the number of bytes in |str| and sets 220*8fb009dcSAndroid Build Coastguard Worker // |*out_padding_bits| to the number of padding bits. 221*8fb009dcSAndroid Build Coastguard Worker // 222*8fb009dcSAndroid Build Coastguard Worker // This function should be used instead of |ASN1_STRING_length| to correctly 223*8fb009dcSAndroid Build Coastguard Worker // handle the non-|ASN1_STRING_FLAG_BITS_LEFT| case. 224*8fb009dcSAndroid Build Coastguard Worker int asn1_bit_string_length(const ASN1_BIT_STRING *str, 225*8fb009dcSAndroid Build Coastguard Worker uint8_t *out_padding_bits); 226*8fb009dcSAndroid Build Coastguard Worker 227*8fb009dcSAndroid Build Coastguard Worker typedef struct { 228*8fb009dcSAndroid Build Coastguard Worker int nid; 229*8fb009dcSAndroid Build Coastguard Worker long minsize; 230*8fb009dcSAndroid Build Coastguard Worker long maxsize; 231*8fb009dcSAndroid Build Coastguard Worker unsigned long mask; 232*8fb009dcSAndroid Build Coastguard Worker unsigned long flags; 233*8fb009dcSAndroid Build Coastguard Worker } ASN1_STRING_TABLE; 234*8fb009dcSAndroid Build Coastguard Worker 235*8fb009dcSAndroid Build Coastguard Worker // asn1_get_string_table_for_testing sets |*out_ptr| and |*out_len| to the table 236*8fb009dcSAndroid Build Coastguard Worker // of built-in |ASN1_STRING_TABLE| values. It is exported for testing. 237*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void asn1_get_string_table_for_testing( 238*8fb009dcSAndroid Build Coastguard Worker const ASN1_STRING_TABLE **out_ptr, size_t *out_len); 239*8fb009dcSAndroid Build Coastguard Worker 240*8fb009dcSAndroid Build Coastguard Worker typedef ASN1_VALUE *ASN1_new_func(void); 241*8fb009dcSAndroid Build Coastguard Worker typedef void ASN1_free_func(ASN1_VALUE *a); 242*8fb009dcSAndroid Build Coastguard Worker typedef ASN1_VALUE *ASN1_d2i_func(ASN1_VALUE **a, const unsigned char **in, 243*8fb009dcSAndroid Build Coastguard Worker long length); 244*8fb009dcSAndroid Build Coastguard Worker typedef int ASN1_i2d_func(ASN1_VALUE *a, unsigned char **in); 245*8fb009dcSAndroid Build Coastguard Worker 246*8fb009dcSAndroid Build Coastguard Worker typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, 247*8fb009dcSAndroid Build Coastguard Worker const ASN1_ITEM *it, int opt, ASN1_TLC *ctx); 248*8fb009dcSAndroid Build Coastguard Worker 249*8fb009dcSAndroid Build Coastguard Worker typedef int ASN1_ex_i2d(ASN1_VALUE **pval, unsigned char **out, 250*8fb009dcSAndroid Build Coastguard Worker const ASN1_ITEM *it); 251*8fb009dcSAndroid Build Coastguard Worker typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it); 252*8fb009dcSAndroid Build Coastguard Worker typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it); 253*8fb009dcSAndroid Build Coastguard Worker 254*8fb009dcSAndroid Build Coastguard Worker typedef struct ASN1_EXTERN_FUNCS_st { 255*8fb009dcSAndroid Build Coastguard Worker ASN1_ex_new_func *asn1_ex_new; 256*8fb009dcSAndroid Build Coastguard Worker ASN1_ex_free_func *asn1_ex_free; 257*8fb009dcSAndroid Build Coastguard Worker ASN1_ex_d2i *asn1_ex_d2i; 258*8fb009dcSAndroid Build Coastguard Worker ASN1_ex_i2d *asn1_ex_i2d; 259*8fb009dcSAndroid Build Coastguard Worker } ASN1_EXTERN_FUNCS; 260*8fb009dcSAndroid Build Coastguard Worker 261*8fb009dcSAndroid Build Coastguard Worker 262*8fb009dcSAndroid Build Coastguard Worker #if defined(__cplusplus) 263*8fb009dcSAndroid Build Coastguard Worker } // extern C 264*8fb009dcSAndroid Build Coastguard Worker #endif 265*8fb009dcSAndroid Build Coastguard Worker 266*8fb009dcSAndroid Build Coastguard Worker #endif // OPENSSL_HEADER_ASN1_INTERNAL_H 267