aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon/encoding/payloads/encodings.h
blob: 54830bc8c2f028c8b87fdf3e5c31d22490f2a29f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
/*
 * Copyright (C) 2005-2006 Martin Willi
 * Copyright (C) 2005 Jan Hutter
 * Hochschule fuer Technik Rapperswil
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

/**
 * @defgroup encodings encodings
 * @{ @ingroup payloads
 */

#ifndef ENCODINGS_H_
#define ENCODINGS_H_

typedef enum encoding_type_t encoding_type_t;
typedef struct encoding_rule_t encoding_rule_t;

#include <library.h>

/**
 * All different kinds of encoding types.
 *
 * Each field of an IKEv2-Message (in header or payload)
 * which has to be parsed or generated differently has its own
 * type defined here.
 *
 * Header is parsed like a payload and gets its one payload_id
 * from PRIVATE USE space. Also the substructures
 * of specific payload types get their own payload_id
 * from PRIVATE_USE space. See IKEv2-Draft for more informations.
 */
enum encoding_type_t {

	/**
	 * Representing a 4 Bit unsigned int value.
	 *
	 *
	 * When generating it must be changed from host to network order.
	 * The value is read from the associated data struct.
	 * The current write position is moved 4 bit forward afterwards.
	 *
	 * When parsing it must be changed from network to host order.
	 * The value is written to the associated data struct.
	 * The current read pointer is moved 4 bit forward afterwards.
	 */
	U_INT_4,

	/**
	 * Representing a 8 Bit unsigned int value.
	 *
	 *
	 * When generating it must be changed from host to network order.
	 * The value is read from the associated data struct.
	 * The current write position is moved 8 bit forward afterwards.
	 *
	 * When parsing it must be changed from network to host order.
	 * The value is written to the associated data struct.
	 * The current read pointer is moved 8 bit forward afterwards.
	 */
	U_INT_8,

	/**
	 * Representing a 16 Bit unsigned int value.
	 *
	 *
	 * When generating it must be changed from host to network order.
	 * The value is read from the associated data struct.
	 * The current write position is moved 16 bit forward afterwards.
	 *
	 * When parsing it must be changed from network to host order.
	 * The value is written to the associated data struct.
	 * The current read pointer is moved 16 bit forward afterwards.
	 */
	U_INT_16,

	/**
	 * Representing a 32 Bit unsigned int value.
	 *
	 * When generating it must be changed from host to network order.
	 * The value is read from the associated data struct.
	 * The current write position is moved 32 bit forward afterwards.
	 *
	 * When parsing it must be changed from network to host order.
	 * The value is written to the associated data struct.
	 * The current read pointer is moved 32 bit forward afterwards.
	 */
	U_INT_32,

	/**
	 * represents a RESERVED_BIT used in FLAG-Bytes.
	 *
	 * When generating, the next bit is set to zero and the current write
	 * position is moved one bit forward.
	 * No value is read from the associated data struct.
	 * The current write position is moved 1 bit forward afterwards.
	 *
	 * When parsing, the current read pointer is moved one bit forward.
	 * No value is written to the associated data struct.
	 * The current read pointer is moved 1 bit forward afterwards.
	 */
	RESERVED_BIT,

	/**
	 * represents a RESERVED_BYTE.
	 *
	 * When generating, the next byte is set to zero and the current write
	 * position is moved one byte forward.
	 * No value is read from the associated data struct.
	 * The current write position is moved 1 byte forward afterwards.
	 *
	 * When parsing, the current read pointer is moved one byte forward.
	 * No value is written to the associated data struct.
	 * The current read pointer is moved 1 byte forward afterwards.
	 */
	RESERVED_BYTE,

	/**
	 * Representing a 1 Bit flag.
	 *
	 * When generation, the next bit is set to 1 if the associated value
	 * in the data struct is TRUE, 0 otherwise. The current write position
	 * is moved 1 bit forward afterwards.
	 *
	 * When parsing, the next bit is read and stored in the associated data
	 * struct. 0 means FALSE, 1 means TRUE, The current read pointer
	 * is moved 1 bit forward afterwards
	 */
	FLAG,

	/**
	 * Representating a length field of a payload.
	 *
	 * When generating it must be changed from host to network order.
	 * The value is read from the associated data struct.
	 * The current write position is moved 16 bit forward afterwards.
	 *
	 * When parsing it must be changed from network to host order.
	 * The value is written to the associated data struct.
	 * The current read pointer is moved 16 bit forward afterwards.
	 */
	PAYLOAD_LENGTH,

	/**
	 * Representating a length field of a header.
	 *
	 * When generating it must be changed from host to network order.
	 * The value is read from the associated data struct.
	 * The current write position is moved 32 bit forward afterwards.
	 *
	 * When parsing it must be changed from network to host order.
	 * The value is written to the associated data struct.
	 * The current read pointer is moved 32 bit forward afterwards.
	 */
	HEADER_LENGTH,

	/**
	 * Representating a spi size field.
	 *
	 * When generating it must be changed from host to network order.
	 * The value is read from the associated data struct.
	 * The current write position is moved 8 bit forward afterwards.
	 *
	 * When parsing it must be changed from network to host order.
	 * The value is written to the associated data struct.
	 * The current read pointer is moved 8 bit forward afterwards.
	 */
	SPI_SIZE,

	/**
	 * Representating a spi field.
	 *
	 * When generating the content of the chunkt pointing to
	 * is written.
	 *
	 * When parsing SPI_SIZE bytes are read and written into the chunk pointing to.
	 */
	SPI,

	/**
	 * Representing a 1 Bit flag specifying the format of a transform attribute.
	 *
	 * When generation, the next bit is set to 1 if the associated value
	 * in the data struct is TRUE, 0 otherwise. The current write position
	 * is moved 1 bit forward afterwards.
	 *
	 * When parsing, the next bit is read and stored in the associated data
	 * struct. 0 means FALSE, 1 means TRUE, The current read pointer
	 * is moved 1 bit forward afterwards.
	 */
	ATTRIBUTE_FORMAT,

	/**
	 * Representing a 15 Bit unsigned int value used as attribute type
	 * in an attribute transform.
	 *
	 *
	 * When generating it must be changed from host to network order.
	 * The value is read from the associated data struct.
	 * The current write position is moved 15 bit forward afterwards.
	 *
	 * When parsing it must be changed from network to host order.
	 * The value is written to the associated data struct.
	 * The current read pointer is moved 15 bit forward afterwards.
	 */
	ATTRIBUTE_TYPE,

	/**
	 * Depending on the field of type ATTRIBUTE_FORMAT
	 * this field contains the length or the value of an transform attribute.
	 * Its stored in a 16 unsigned integer field.
	 *
	 * When generating it must be changed from host to network order.
	 * The value is read from the associated data struct.
	 * The current write position is moved 16 bit forward afterwards.
	 *
	 * When parsing it must be changed from network to host order.
	 * The value is written to the associated data struct.
	 * The current read pointer is moved 16 bit forward afterwards.
	 */
	ATTRIBUTE_LENGTH_OR_VALUE,

	/**
	 * This field contains the length or the value of an configuration attribute.
	 * Its stored in a 16 unsigned integer field.
	 *
	 * When generating it must be changed from host to network order.
	 * The value is read from the associated data struct.
	 * The current write position is moved 16 bit forward afterwards.
	 *
	 * When parsing it must be changed from network to host order.
	 * The value is written to the associated data struct.
	 * The current read pointer is moved 16 bit forward afterwards.
	 */
	ATTRIBUTE_LENGTH,

	/**
	 * Depending on the field of type ATTRIBUTE_FORMAT
	 * this field is available or missing and so parsed/generated
	 * or not parsed/not generated.
	 *
	 * When generating the content of the chunkt pointing to
	 * is written.
	 *
	 * When parsing SPI_SIZE bytes are read and written into the chunk pointing to.
	 */
	ATTRIBUTE_VALUE,

	/**
	 * Representating a Traffic selector type field.
	 *
	 * When generating it must be changed from host to network order.
	 * The value is read from the associated data struct.
	 * The current write position is moved 16 bit forward afterwards.
	 *
	 * When parsing it must be changed from network to host order.
	 * The value is written to the associated data struct.
	 * The current read pointer is moved 16 bit forward afterwards.
	 */
	TS_TYPE,

	/**
	 * Representating an address field in a traffic selector.
	 *
	 * Depending on the last field of type TS_TYPE
	 * this field is either 4 or 16 byte long.
	 *
	 * When generating the content of the chunkt pointing to
	 * is written.
	 *
	 * When parsing 4 or 16 bytes are read and written into the chunk pointing to.
	 */
	ADDRESS,

	/**
	 * Representing a variable length byte field.
	 */
	CHUNK_DATA,

	/**
	 * Representating an IKE_SPI field in an IKEv2 Header.
	 *
	 * When generating the value of the u_int64_t pointing to
	 * is written (host and networ order is not changed).
	 *
	 * When parsing 8 bytes are read and written into the u_int64_t pointing to.
	 */
	IKE_SPI,

	/**
	 * Representating an encrypted IKEv1 message.
	 */
	ENCRYPTED_DATA,

	/**
	 * Reprensenting a field containing a set of wrapped payloads.
	 *
	 * This type is not used directly, but as an offset to the wrapped payloads.
	 * The type of the wrapped payload is added to this encoding type.
	 *
	 * @note As payload types are added to this encoding type, it has
	 * to be the last in encoding_type_t.
	 */
	PAYLOAD_LIST = 1000 /* no comma, read above! */
};

/**
 * enum name for encoding_type_t
 */
extern enum_name_t *encoding_type_names;

/**
 * Rule how to en-/decode a payload field.
 *
 * An encoding rule is a mapping of a specific encoding type to
 * a location in the data struct where the current field is stored to
 * or read from.
 * This rules are used by parser and generator.
 */
struct encoding_rule_t {

	/**
	 * Encoding type.
	 */
	encoding_type_t type;

	/**
	 * Offset in the data struct.
	 *
	 * When parsing, data are written to this offset of the
	 * data struct.
	 *
	 * When generating, data are read from this offset in the
	 * data struct.
	 */
	u_int32_t offset;
};

#endif /** ENCODINGS_H_ @}*/