summaryrefslogtreecommitdiff
path: root/src/charon/encoding/payloads/encodings.h
blob: 73c5f9c36fe87b72ff03ea5172b542fd2580b244 (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
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
/*
 * 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.
 *
 * $Id: encodings.h 3589 2008-03-13 14:14:44Z martin $
 */

/**
 * @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,
	
	/**
	 * Representing a 64 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 64 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 64 bit forward afterwards.
	 */
	U_INT_64,
	
	/**
	 * 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,
	
	/**
	 * Representating a Key Exchange Data field.
	 * 
 	 * When generating the content of the chunkt pointing to 
 	 * is written.
	 * 
	 * When parsing (Payload Length - 8) bytes are read and written into the chunk pointing to.
	 */
	KEY_EXCHANGE_DATA,
	
	/**
	 * Representating a Notification field.
	 * 
 	 * When generating the content of the chunkt pointing to 
 	 * is written.
	 * 
	 * When parsing (Payload Length - spi size - 8) bytes are read and written into the chunk pointing to.
	 */
	NOTIFICATION_DATA,
	
	/**
	 * Representating one or more proposal substructures.
	 * 
	 * The offset points to a linked_list_t pointer.
	 * 
	 * When generating the proposal_substructure_t objects are stored 
	 * in the pointed linked_list.
	 * 
	 * When parsing the parsed proposal_substructure_t objects have 
	 * to be stored in the pointed linked_list.
	 */	
	PROPOSALS,
	
	/**
	 * Representating one or more transform substructures.
	 * 
	 * The offset points to a linked_list_t pointer.
	 * 
	 * When generating the transform_substructure_t objects are stored 
	 * in the pointed linked_list.
	 * 
	 * When parsing the parsed transform_substructure_t objects have 
	 * to be stored in the pointed linked_list.
	 */	
	TRANSFORMS,
	
	/**
	 * Representating one or more Attributes of a transform substructure.
	 * 
	 * The offset points to a linked_list_t pointer.
	 * 
	 * When generating the transform_attribute_t objects are stored 
	 * in the pointed linked_list.
	 * 
	 * When parsing the parsed transform_attribute_t objects have 
	 * to be stored in the pointed linked_list.
	 */	
	TRANSFORM_ATTRIBUTES,

	/**
	 * Representating one or more Attributes of a configuration payload.
	 * 
	 * The offset points to a linked_list_t pointer.
	 * 
	 * When generating the configuration_attribute_t objects are stored 
	 * in the pointed linked_list.
	 * 
	 * When parsing the parsed configuration_attribute_t objects have 
	 * to be stored in the pointed linked_list.
	 */		
	CONFIGURATION_ATTRIBUTES,
	
	/**
	 * 
 	 * When generating the content of the chunkt pointing to 
 	 * is written.
	 * 
	 * When parsing (Payload Length - 4) bytes are read and written into the chunk pointing to.
	 */
	CONFIGURATION_ATTRIBUTE_VALUE,
	
	/**
	 * 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.
	 */
	CONFIGURATION_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 one or more Traffic selectors of a TS payload.
	 * 
	 * The offset points to a linked_list_t pointer.
	 * 
	 * When generating the traffic_selector_substructure_t objects are stored 
	 * in the pointed linked_list.
	 * 
	 * When parsing the parsed traffic_selector_substructure_t objects have 
	 * to be stored in the pointed linked_list.
	 */	
	TRAFFIC_SELECTORS,
	
	/**
	 * 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,

	/**
	 * Representating a Nonce Data field.
	 * 
 	 * When generating the content of the chunkt pointing to 
 	 * is written.
	 * 
	 * When parsing (Payload Length - 4) bytes are read and written into the chunk pointing to.
	 */
	NONCE_DATA,
	
	/**
	 * Representating a ID Data field.
	 * 
 	 * When generating the content of the chunkt pointing to 
 	 * is written.
	 * 
	 * When parsing (Payload Length - 8) bytes are read and written into the chunk pointing to.
	 */
	ID_DATA,
	
	/**
	 * Representating a AUTH Data field.
	 * 
 	 * When generating the content of the chunkt pointing to 
 	 * is written.
	 * 
	 * When parsing (Payload Length - 8) bytes are read and written into the chunk pointing to.
	 */
	AUTH_DATA,
	
	/**
	 * Representating a CERT Data field.
	 * 
 	 * When generating the content of the chunkt pointing to 
 	 * is written.
	 * 
	 * When parsing (Payload Length - 5) bytes are read and written into the chunk pointing to.
	 */
	CERT_DATA,

	/**
	 * Representating a CERTREQ Data field.
	 * 
 	 * When generating the content of the chunkt pointing to 
 	 * is written.
	 * 
	 * When parsing (Payload Length - 5) bytes are read and written into the chunk pointing to.
	 */
	CERTREQ_DATA,
	
	/**
	 * Representating an EAP message field.
	 * 
 	 * When generating the content of the chunkt pointing to 
 	 * is written.
	 * 
	 * When parsing (Payload Length - 4) bytes are read and written into the chunk pointing to.
	 */
	EAP_DATA,
	
	/**
	 * Representating the SPIS field in a DELETE payload.
	 * 
 	 * When generating the content of the chunkt pointing to 
 	 * is written.
	 * 
	 * When parsing (Payload Length - 8) bytes are read and written into the chunk pointing to.
	 */
	SPIS,
	
	/**
	 * Representating the VID DATA field in a VENDOR ID payload.
	 * 
 	 * When generating the content of the chunkt pointing to 
 	 * is written.
	 * 
	 * When parsing (Payload Length - 4) bytes are read and written into the chunk pointing to.
	 */
	VID_DATA,
	
	/**
	 * Representating the DATA of an unknown payload.
	 * 
 	 * When generating the content of the chunkt pointing to 
 	 * is written.
	 * 
	 * When parsing (Payload Length - 4) bytes are read and written into the chunk pointing to.
	 */
	UNKNOWN_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,
	
	/**
	 * Representing the encrypted data body of a encryption payload.
	 */
	ENCRYPTED_DATA,
};

/**
 * 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_ @} */