Annotation of embedaddon/strongswan/src/libstrongswan/asn1/asn1.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2011-2017 Tobias Brunner
                      3:  * Copyright (C) 2006 Martin Will
                      4:  * Copyright (C) 2000-2008 Andreas Steffen
                      5:  * HSR Hochschule fuer Technik Rapperswil
                      6:  *
                      7:  * This program is free software; you can redistribute it and/or modify it
                      8:  * under the terms of the GNU General Public License as published by the
                      9:  * Free Software Foundation; either version 2 of the License, or (at your
                     10:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                     11:  *
                     12:  * This program is distributed in the hope that it will be useful, but
                     13:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     14:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     15:  * for more details.
                     16:  */
                     17: 
                     18: /**
                     19:  * @defgroup asn1i asn1
                     20:  * @{ @ingroup asn1
                     21:  */
                     22: 
                     23: #ifndef ASN1_H_
                     24: #define ASN1_H_
                     25: 
                     26: #include <stdarg.h>
                     27: 
                     28: #include <library.h>
                     29: #include <asn1/asn1.h>
                     30: 
                     31: /**
                     32:  * Definition of some primitive ASN1 types
                     33:  */
                     34: typedef enum {
                     35:        ASN1_EOC =                              0x00,
                     36:        ASN1_BOOLEAN =                  0x01,
                     37:        ASN1_INTEGER =                  0x02,
                     38:        ASN1_BIT_STRING =               0x03,
                     39:        ASN1_OCTET_STRING =             0x04,
                     40:        ASN1_NULL =                             0x05,
                     41:        ASN1_OID =                              0x06,
                     42:        ASN1_ENUMERATED =               0x0A,
                     43:        ASN1_UTF8STRING =               0x0C,
                     44:        ASN1_NUMERICSTRING =    0x12,
                     45:        ASN1_PRINTABLESTRING =  0x13,
                     46:        ASN1_T61STRING =                0x14,
                     47:        ASN1_VIDEOTEXSTRING =   0x15,
                     48:        ASN1_IA5STRING =                0x16,
                     49:        ASN1_UTCTIME =                  0x17,
                     50:        ASN1_GENERALIZEDTIME =  0x18,
                     51:        ASN1_GRAPHICSTRING =    0x19,
                     52:        ASN1_VISIBLESTRING =    0x1A,
                     53:        ASN1_GENERALSTRING =    0x1B,
                     54:        ASN1_UNIVERSALSTRING =  0x1C,
                     55:        ASN1_BMPSTRING =                0x1E,
                     56: 
                     57:        ASN1_CONSTRUCTED =              0x20,
                     58: 
                     59:        ASN1_SEQUENCE =                 0x30,
                     60:        ASN1_SET =                              0x31,
                     61: 
                     62:        ASN1_CONTEXT_S_0 =              0x80,
                     63:        ASN1_CONTEXT_S_1 =              0x81,
                     64:        ASN1_CONTEXT_S_2 =              0x82,
                     65:        ASN1_CONTEXT_S_3 =              0x83,
                     66:        ASN1_CONTEXT_S_4 =              0x84,
                     67:        ASN1_CONTEXT_S_5 =              0x85,
                     68:        ASN1_CONTEXT_S_6 =              0x86,
                     69:        ASN1_CONTEXT_S_7 =              0x87,
                     70:        ASN1_CONTEXT_S_8 =              0x88,
                     71: 
                     72:        ASN1_CONTEXT_C_0 =              0xA0,
                     73:        ASN1_CONTEXT_C_1 =              0xA1,
                     74:        ASN1_CONTEXT_C_2 =              0xA2,
                     75:        ASN1_CONTEXT_C_3 =              0xA3,
                     76:        ASN1_CONTEXT_C_4 =              0xA4,
                     77:        ASN1_CONTEXT_C_5 =              0xA5,
                     78: 
                     79:        ASN1_INVALID =                  0x100,
                     80: } asn1_t;
                     81: 
                     82: #define ASN1_INVALID_LENGTH    0xffffffff
                     83: 
                     84: /**
                     85:  * Some common prefabricated ASN.1 constants
                     86:  */
                     87: extern const chunk_t ASN1_INTEGER_0;
                     88: extern const chunk_t ASN1_INTEGER_1;
                     89: extern const chunk_t ASN1_INTEGER_2;
                     90: 
                     91: 
                     92: /** Some ASN.1 analysis functions */
                     93: 
                     94: /**
                     95:  * Build an algorithmIdentifier from a known OID with empty parameters.
                     96:  *
                     97:  * @param oid          known OID index
                     98:  * @return                     body of the corresponding ASN.1 structure, allocated
                     99:  */
                    100: chunk_t asn1_algorithmIdentifier(int oid);
                    101: 
                    102: /**
                    103:  * Build an algorithmIdentifier from a known OID and the given parameters.
                    104:  *
                    105:  * @param oid          known OID index
                    106:  * @param params       parameters to encode in the algorithmIdentifier (adopted)
                    107:  * @return                     body of the corresponding ASN.1 structure, allocated
                    108:  */
                    109: chunk_t asn1_algorithmIdentifier_params(int oid, chunk_t params);
                    110: 
                    111: /**
                    112:  * Converts an ASN.1 OID into a known OID index
                    113:  *
                    114:  * @param object       body of an OID
                    115:  * @return                     index into the oid_names[] table or OID_UNKNOWN
                    116:  */
                    117: int asn1_known_oid(chunk_t object);
                    118: 
                    119: /**
                    120:  * Converts a known OID index to an ASN.1 OID
                    121:  *
                    122:  * @param n                    index into the oid_names[] table
                    123:  * @return                     allocated OID chunk, chunk_empty if index out of range
                    124:  */
                    125: chunk_t asn1_build_known_oid(int n);
                    126: 
                    127: /**
                    128:  * Convert human readable OID to ASN.1 DER encoding, without OID header.
                    129:  *
                    130:  * @param str          OID string (e.g. 1.2.345.67.8)
                    131:  * @return                     allocated ASN.1 encoded OID, chunk_empty on error
                    132:  */
                    133: chunk_t asn1_oid_from_string(char *str);
                    134: 
                    135: /**
                    136:  * Convert a DER encoded ASN.1 OID to a human readable string.
                    137:  *
                    138:  * @param oid          DER encoded OID, without header
                    139:  * @return                     human readable OID string, allocated, NULL on error
                    140:  */
                    141: char* asn1_oid_to_string(chunk_t oid);
                    142: 
                    143: /**
                    144:  * Returns the length of an ASN.1 object
                    145:  * The blob pointer is advanced past the tag length fields
                    146:  *
                    147:  * @param blob         pointer to an ASN.1 coded blob
                    148:  * @return                     length of ASN.1 object
                    149:  */
                    150: size_t asn1_length(chunk_t *blob);
                    151: 
                    152: /**
                    153:  * Unwrap the inner content of an ASN.1 type/length wrapped object.
                    154:  *
                    155:  * @param blob         blob to parse header from, moved behind parsed content
                    156:  * @param content      inner content
                    157:  * @return                     parsed type, ASN1_INVALID if length parsing failed
                    158:  */
                    159: int asn1_unwrap(chunk_t *blob, chunk_t *content);
                    160: 
                    161: /**
                    162:  * Parses an ASN.1 algorithmIdentifier object
                    163:  *
                    164:  * @param blob         ASN.1 coded blob
                    165:  * @param level0       top-most level offset
                    166:  * @param params       returns optional [ASN.1 coded] parameters
                    167:  * @return                     known OID index or OID_UNKNOWN
                    168:  */
                    169: int asn1_parse_algorithmIdentifier(chunk_t blob, int level0, chunk_t *params);
                    170: 
                    171: /**
                    172:  * Parse the top-most level of an ASN.1 object
                    173:  *
                    174:  * @param object       ASN.1 coded object
                    175:  * @param type         Expected ASN.1 type
                    176:  * @param level0       top-most level offset
                    177:  * @param name         descriptive name of object
                    178:  * @return                     TRUE if parsing successful
                    179:  */
                    180: bool asn1_parse_simple_object(chunk_t *object, asn1_t type, u_int level0,
                    181:                                                          const char* name);
                    182: 
                    183: /**
                    184:  * Converts an ASN.1 INTEGER object to an uint64_t. If the INTEGER is longer
                    185:  * than 8 bytes only the 8 LSBs are returned.
                    186:  *
                    187:  * @param blob         body of an ASN.1 coded integer object
                    188:  * @return                     converted integer
                    189:  */
                    190: uint64_t asn1_parse_integer_uint64(chunk_t blob);
                    191: 
                    192: /**
                    193:  * Converts an uint64_t to an ASN.1 INTEGER object.
                    194:  *
                    195:  * @param val          integer to convert
                    196:  * @return                     body of an ASN.1 coded integer object
                    197:  */
                    198: chunk_t asn1_integer_from_uint64(uint64_t val);
                    199: 
                    200: /**
                    201:  * Print the value of an ASN.1 simple object
                    202:  *
                    203:  * @param object       ASN.1 object to be printed
                    204:  * @param type         asn1_t type
                    205:  * @param private      ASN.1 data is confidential (use debug level 4)
                    206:  */
                    207: void asn1_debug_simple_object(chunk_t object, asn1_t type, bool private);
                    208: 
                    209: /**
                    210:  * Converts an ASN.1 UTCTIME or GENERALIZEDTIME string to time_t
                    211:  *
                    212:  * On systems where sizeof(time_t) == 4 there will be an overflow
                    213:  * for dates
                    214:  *   > Tue, 19 Jan 2038 03:14:07 UTC (0x7fffffff)
                    215:  * and
                    216:  *   < Fri, 13 Dec 1901 20:45:52 UTC (0x80000000)
                    217:  * in both cases TIME_32_BIT_SIGNED_MAX is returned.
                    218:  *
                    219:  * @param utctime      body of an ASN.1 coded time object
                    220:  * @param type         ASN1_UTCTIME or ASN1_GENERALIZEDTIME
                    221:  * @return                     time_t in UTC
                    222:  */
                    223: time_t asn1_to_time(const chunk_t *utctime, asn1_t type);
                    224: 
                    225: /**
                    226:  * Converts time_t to an ASN.1 UTCTIME or GENERALIZEDTIME string
                    227:  *
                    228:  * @note The type is automatically changed to GENERALIZEDTIME if needed
                    229:  *
                    230:  * @param time         time_t in UTC
                    231:  * @param type         ASN1_UTCTIME or ASN1_GENERALIZEDTIME
                    232:  * @return                     body of an ASN.1 code time object
                    233:  */
                    234: chunk_t asn1_from_time(const time_t *time, asn1_t type);
                    235: 
                    236: /**
                    237:  * Parse an ASN.1 UTCTIME or GENERALIZEDTIME object
                    238:  *
                    239:  * @param blob         ASN.1 coded time object
                    240:  * @param level0       top-most level offset
                    241:  * @return                     time_t in UTC
                    242:  */
                    243: time_t asn1_parse_time(chunk_t blob, int level0);
                    244: 
                    245: /**
                    246:  * Determines if a binary blob is ASN.1 coded
                    247:  *
                    248:  * @param blob         blob to be tested
                    249:  * @return                     TRUE if blob is ASN.1 coded (SEQUENCE or SET)
                    250:  */
                    251: bool is_asn1(chunk_t blob);
                    252: 
                    253: /**
                    254:  * Determines if a character string can be coded as PRINTABLESTRING
                    255:  *
                    256:  * @param str          character string to be tested
                    257:  * @return                     TRUE if no special characters are contained
                    258:  */
                    259: bool asn1_is_printablestring(chunk_t str);
                    260: 
                    261: 
                    262: /** some ASN.1 synthesis functions */
                    263: 
                    264: /**
                    265:  * Build an empty ASN.1 object with tag and length fields already filled in
                    266:  *
                    267:  * @param object       returned object - memory is allocated by function
                    268:  * @param type         ASN.1 type to be created
                    269:  * @param datalen      size of the body to be created
                    270:  * @return                     points to the first position in the body
                    271:  */
                    272: u_char* asn1_build_object(chunk_t *object, asn1_t type, size_t datalen);
                    273: 
                    274: /**
                    275:  * Build a simple ASN.1 object
                    276:  *
                    277:  * @param tag          ASN.1 type to be created
                    278:  * @param content      content of the ASN.1 object
                    279:  * @return                     chunk containing the ASN.1 coded object
                    280:  */
                    281: chunk_t asn1_simple_object(asn1_t tag, chunk_t content);
                    282: 
                    283: /**
                    284:  * Build an ASN.1 BITSTRING object
                    285:  *
                    286:  * @param mode         'c' for copy or 'm' for move
                    287:  * @param content      content of the BITSTRING
                    288:  * @return                     chunk containing the ASN.1 coded BITSTRING
                    289:  */
                    290: chunk_t asn1_bitstring(const char *mode, chunk_t content);
                    291: 
                    292: /**
                    293:  * Build an ASN.1 INTEGER object
                    294:  *
                    295:  * @param mode         'c' for copy or 'm' for move
                    296:  * @param content      content of the INTEGER
                    297:  * @return                     chunk containing the ASN.1 coded INTEGER
                    298:  */
                    299: chunk_t asn1_integer(const char *mode, chunk_t content);
                    300: 
                    301: /**
                    302:  * Build an ASN.1 object from a variable number of individual chunks
                    303:  *
                    304:  * The mode string specifies the number of chunks, and how to handle each of
                    305:  * them with a single character: 'c' for copy (allocate new chunk), 'm' for move
                    306:  * (free given chunk) or 's' for sensitive-copy (clear given chunk, then free).
                    307:  *
                    308:  * @param type         ASN.1 type to be created
                    309:  * @param mode         for each list member: 'c', 'm' or 's'
                    310:  * @return                     chunk containing the ASN.1 coded object
                    311:  */
                    312: chunk_t asn1_wrap(asn1_t type, const char *mode, ...);
                    313: 
                    314: #endif /** ASN1_H_ @}*/

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>