- mapping for payload_type_t added
[strongswan.git] / Source / charon / encodings.h
1 /**
2 * @file encodings.h
3 *
4 * @brief Type definitions for parser and generator,
5 * also payload types are defined here.
6 *
7 * Header is parsed like a payload and gets its one payload_id
8 * from PRIVATE USE space. Also the substructures
9 * of specific payload types get their own payload_id
10 * from PRIVATE_USE space. See RFC for mor informations.
11 *
12 */
13
14 /*
15 * Copyright (C) 2005 Jan Hutter, Martin Willi
16 * Hochschule fuer Technik Rapperswil
17 *
18 * This program is free software; you can redistribute it and/or modify it
19 * under the terms of the GNU General Public License as published by the
20 * Free Software Foundation; either version 2 of the License, or (at your
21 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
22 *
23 * This program is distributed in the hope that it will be useful, but
24 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
25 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
26 * for more details.
27 */
28
29 #ifndef ENCODINGS_H_
30 #define ENCODINGS_H_
31
32 #include "types.h"
33 #include "definitions.h"
34
35
36 /**
37 * @brief All different kinds of encoding types.
38 *
39 * Each field of an IKEv2-Message (in header or payload)
40 * which has to be parsed or generated differently has its own
41 * type defined here.
42 */
43 typedef enum encoding_type_e encoding_type_t;
44
45 enum encoding_type_e{
46 /**
47 * Representing a 4 Bit unsigned int value
48 *
49 *
50 * When generating it must be changed from host to network order.
51 * The value is read from the associated data struct.
52 * The current write position is moved 4 bit forward afterwards.
53 *
54 * When parsing it must be changed from network to host order.
55 * The value is written to the associated data struct.
56 * The current read pointer is moved 4 bit forward afterwards.
57 */
58 U_INT_4,
59 /**
60 * Representing a 8 Bit unsigned int value
61 *
62 *
63 * When generating it must be changed from host to network order.
64 * The value is read from the associated data struct.
65 * The current write position is moved 8 bit forward afterwards.
66 *
67 * When parsing it must be changed from network to host order.
68 * The value is written to the associated data struct.
69 * The current read pointer is moved 8 bit forward afterwards.
70 */
71 U_INT_8,
72 /**
73 * Representing a 16 Bit unsigned int value
74 *
75 *
76 * When generating it must be changed from host to network order.
77 * The value is read from the associated data struct.
78 * The current write position is moved 16 bit forward afterwards.
79 *
80 * When parsing it must be changed from network to host order.
81 * The value is written to the associated data struct.
82 * The current read pointer is moved 16 bit forward afterwards.
83 */
84 U_INT_16,
85 /**
86 * Representing a 32 Bit unsigned int value
87 *
88 * When generating it must be changed from host to network order.
89 * The value is read from the associated data struct.
90 * The current write position is moved 32 bit forward afterwards.
91 *
92 * When parsing it must be changed from network to host order.
93 * The value is written to the associated data struct.
94 * The current read pointer is moved 32 bit forward afterwards.
95 */
96
97 U_INT_32,
98 /**
99 * Representing a 64 Bit unsigned int value
100 *
101 * When generating it must be changed from host to network order.
102 * The value is read from the associated data struct.
103 * The current write position is moved 64 bit forward afterwards.
104 *
105 * When parsing it must be changed from network to host order.
106 * The value is written to the associated data struct.
107 * The current read pointer is moved 64 bit forward afterwards.
108 */
109 U_INT_64,
110 /**
111 * @brief represents a RESERVED_BIT used in FLAG-Bytes
112 *
113 * When generating, the next bit is set to zero and the current write
114 * position is moved one bit forward.
115 * No value is read from the associated data struct.
116 * The current write position is moved 1 bit forward afterwards.
117 *
118 * When parsing, the current read pointer is moved one bit forward.
119 * No value is written to the associated data struct.
120 * The current read pointer is moved 1 bit forward afterwards.
121 */
122 RESERVED_BIT,
123 /**
124 * @brief represents a RESERVED_BYTE
125 *
126 * When generating, the next byte is set to zero and the current write
127 * position is moved one byte forward.
128 * No value is read from the associated data struct.
129 * The current write position is moved 1 byte forward afterwards.
130 *
131 * When parsing, the current read pointer is moved one byte forward.
132 * No value is written to the associated data struct.
133 * The current read pointer is moved 1 byte forward afterwards.
134 */
135 RESERVED_BYTE,
136 /**
137 * Representing a 1 Bit flag.
138 *
139 * When generation, the next bit is set to 1 if the associated value
140 * in the data struct is TRUE, 0 otherwise. The current write position
141 * is moved 1 bit forward afterwards.
142 *
143 * When parsing, the next bit is read and stored in the associated data
144 * struct. 0 means FALSE, 1 means TRUE, The current read pointer
145 * is moved 1 bit forward afterwards
146 */
147 FLAG,
148 /**
149 * Representating a length field
150 *
151 * When generating it must be changed from host to network order.
152 * The value is read from the associated data struct.
153 * The current write position is moved 32 bit forward afterwards.
154 *
155 * When parsing it must be changed from network to host order.
156 * The value is written to the associated data struct.
157 * The current read pointer is moved 32 bit forward afterwards.
158 */
159 LENGTH,
160 /**
161 * Representating a spi size field
162 *
163 * When generating it must be changed from host to network order.
164 * The value is read from the associated data struct.
165 * The current write position is moved 32 bit forward afterwards.
166 *
167 * When parsing it must be changed from network to host order.
168 * The value is written to the associated data struct.
169 * The current read pointer is moved 32 bit forward afterwards.
170 */
171 SPI_SIZE
172 };
173
174 /**
175 * An encoding rule is a mapping of a specific encoding type to
176 * a location in the data struct where the current field is stored to
177 * or read from.
178 *
179 * For examples see directory encodings/.
180 *
181 * This rules are used by parser and generator.
182 */
183 typedef struct encoding_rule_s encoding_rule_t;
184
185 struct encoding_rule_s{
186 /**
187 * Encoding type
188 */
189 encoding_type_t type;
190 /**
191 * Offset in the data struct
192 *
193 * When parsing, data are written to this offset of the
194 * data struct.
195 *
196 * When generating, data are read from this offset in the
197 * data struct.
198 */
199 u_int32_t offset;
200 };
201
202
203 /**
204 * Payload-Types of a IKEv2-Message
205 *
206 *
207 * Header and substructures are also defined as
208 * payload types with values from PRIVATE USE space.
209 */
210 typedef enum payload_type_e payload_type_t;
211
212 enum payload_type_e{
213
214 /**
215 * NO_PAYLOAD
216 */
217 NO_PAYLOAD = 0,
218
219 /**
220 * SA
221 */
222 SECURITY_ASSOCIATION = 33,
223 /**
224 * KE
225 */
226 KEY_EXCHANGE = 34,
227 /**
228 * IDi
229 */
230 ID_INITIATOR = 35,
231 /**
232 * IDr
233 */
234 ID_RESPONDER = 36,
235 /**
236 * CERT
237 */
238 CERTIFICATE = 37,
239 /**
240 * CERTREQ
241 */
242 CERTIFICATE_REQUEST = 38,
243 /**
244 * AUTH
245 */
246 AUTHENTICATION = 39,
247 /**
248 * Ni, Nr
249 */
250 NONCE = 40,
251 /**
252 * N
253 */
254 NOTIFY = 41,
255 /**
256 * D
257 */
258 DELETE = 42,
259 /**
260 * V
261 */
262 VENDOR_ID = 43,
263 /**
264 * TSi
265 */
266 TRAFFIC_SELECTOR_INITIATOR = 44,
267 /**
268 * TSr
269 */
270 TRAFFIC_SELECTOR_RESPONDER = 45,
271 /**
272 * E
273 */
274 ENCRYPTED = 46,
275 /**
276 * CP
277 */
278 CONFIGURATION = 47,
279 /**
280 * EAP
281 */
282 EXTENSIBLE_AUTHENTICATION = 48,
283
284 /**
285 * Header has value 140 of PRIVATE USE space
286 *
287 * This payload type is not send over wire and just
288 * used internally to handle IKEv2-Header like a payload.
289 */
290 HEADER = 140
291 };
292
293
294 /*
295 * build string mapping array for payload_type_t
296 */
297 extern mapping_t payload_type_t_mappings[];
298
299 /**
300 * Information of a specific payload are stored in this struct
301 *
302 * The following informations are needed for each payload
303 * - payload type
304 * - length of its associated data struct in bytes
305 * - encoding rules array
306 * - encoding rules count
307 */
308 typedef struct payload_info_s payload_info_t;
309
310 struct payload_info_s{
311 /**
312 * Type of payload
313 */
314 payload_type_t payload_type;
315 /**
316 * Length of associated data struct in bytes
317 */
318 size_t data_struct_length;
319
320 /**
321 * Pointer to the encoding rules array
322 */
323 encoding_rule_t *ecoding_rules;
324
325 /**
326 * Number of encoding rules for the specific payload_type
327 */
328 size_t encoding_rules_count;
329 };
330
331 #endif /*ENCODINGS_H_*/