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
|
/**
* @file encodings.h
*
* @brief Type definitions for parser and generator
* Also, Payload types are defined here.
*
* Header is parsed like a payload and gets its one payload_id
* from PRIVATE USE space. Also the substructures get their own
* payload_id from PRIVATE_USE space
*
*
*/
/*
* Copyright (C) 2005 Jan Hutter, Martin Willi
* 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.
*/
#ifndef ENCODINGS_H_
#define ENCODINGS_H_
#include <freeswan.h>
#include <pluto/constants.h>
#include <pluto/defs.h>
/**
* @brief 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
* enum value.
*/
typedef enum encoding_type_e encoding_type_t;
enum encoding_type_e{
/**
* 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,
/**
* @brief 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,
/**
* @brief 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
*
* 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.
*/
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 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.
*/
SPI_SIZE
};
/**
* 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.
*
* For examples see directory encodings/
*
* This rules are used by parser and generator
*/
typedef struct encoding_rule_s encoding_rule_t;
struct encoding_rule_s{
/**
* Encoding type
*/
encoding_type_t type;
/**
* Offset in the data struct
*/
u_int32_t offset;
};
/**
* Payload-Types of a IKEv2-Message
*
*
* Header and substructures are also defined as
* payload types with values of PRIVATE USE space
*/
typedef enum payload_type_e payload_type_t;
enum payload_type_e{
/**
* SA
*/
SECURITY_ASSOCIATION = 33,
/**
* KE
*/
KEY_EXCHANGE = 34,
/**
* IDi
*/
ID_INITIATOR = 35,
/**
* IDr
*/
ID_RESPONDER = 36,
/**
* CERT
*/
CERTIFICATE = 37,
/**
* CERTREQ
*/
CERTIFICATE_REQUEST = 38,
/**
* AUTH
*/
AUTHENTICATION = 39,
/**
* Ni, Nr
*/
NONCE = 40,
/**
* N
*/
NOTIFY = 41,
/**
* D
*/
DELETE = 42,
/**
* V
*/
VENDOR_ID = 43,
/**
* TSi
*/
TRAFFIC_SELECTOR_INITIATOR = 44,
/**
* TSr
*/
TRAFFIC_SELECTOR_RESPONDER = 45,
/**
* E
*/
ENCRYPTED = 46,
/**
* CP
*/
CONFIGURATION = 47,
/**
* EAP
*/
EXTENSIBLE_AUTHENTICATION = 48,
/**
* Header has value 140 of PRIVATE USE space
*/
HEADER = 140
};
/**
* Information of a specific payload are stored in this struct
*
* The following informations are needed for each payload
* - payload type
* - length of its associated data struct in bytes
* - encoding rules array
* - encoding rules count
*/
typedef struct payload_info_s payload_info_t;
struct payload_info_s{
/**
* Type of payload
*/
payload_type_t payload_type;
/**
* Length of associated data struct in bytes
*/
size_t data_struct_length;
/**
* Pointer to the encoding rules array
*/
encoding_rule_t *ecoding_rules;
/**
* Number of encoding rules for the specific payload_type
*/
size_t encoding_rules_count;
};
#endif /*ENCODINGS_H_*/
|