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>