Annotation of embedaddon/strongswan/src/libstrongswan/asn1/asn1.h, revision 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>