Annotation of embedaddon/strongswan/src/libcharon/encoding/payloads/payload.h, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2007-2015 Tobias Brunner
3: * Copyright (C) 2005-2006 Martin Willi
4: * Copyright (C) 2005 Jan Hutter
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 payload payload
20: * @{ @ingroup payloads
21: */
22:
23: #ifndef PAYLOAD_H_
24: #define PAYLOAD_H_
25:
26: typedef enum payload_type_t payload_type_t;
27: typedef struct payload_t payload_t;
28:
29: #include <library.h>
30: #include <encoding/payloads/encodings.h>
31:
32: /**
33: * Domain of interpretation used by IPsec/IKEv1
34: */
35: #define IKEV1_DOI_IPSEC 1
36:
37: /**
38: * Payload-Types of an IKE message.
39: *
40: * Header and substructures are also defined as
41: * payload types with values from PRIVATE USE space.
42: */
43: enum payload_type_t {
44:
45: /**
46: * End of payload list in next_payload
47: */
48: PL_NONE = 0,
49:
50: /**
51: * The security association (SA) payload containing proposals.
52: */
53: PLV1_SECURITY_ASSOCIATION = 1,
54:
55: /**
56: * The proposal payload, containing transforms.
57: */
58: PLV1_PROPOSAL = 2,
59:
60: /**
61: * The transform payload.
62: */
63: PLV1_TRANSFORM = 3,
64:
65: /**
66: * The key exchange (KE) payload containing diffie-hellman values.
67: */
68: PLV1_KEY_EXCHANGE = 4,
69:
70: /**
71: * ID payload.
72: */
73: PLV1_ID = 5,
74:
75: /**
76: * Certificate payload with certificates (CERT).
77: */
78: PLV1_CERTIFICATE = 6,
79:
80: /**
81: * Certificate request payload.
82: */
83: PLV1_CERTREQ = 7,
84:
85: /**
86: * Hash payload.
87: */
88: PLV1_HASH = 8,
89:
90: /**
91: * Signature payload
92: */
93: PLV1_SIGNATURE = 9,
94:
95: /**
96: * Nonce payload.
97: */
98: PLV1_NONCE = 10,
99:
100: /**
101: * Notification payload.
102: */
103: PLV1_NOTIFY = 11,
104:
105: /**
106: * Delete payload.
107: */
108: PLV1_DELETE = 12,
109:
110: /**
111: * Vendor id payload.
112: */
113: PLV1_VENDOR_ID = 13,
114:
115: /**
116: * Attribute payload (ISAKMP Mode Config, aka configuration payload.
117: */
118: PLV1_CONFIGURATION = 14,
119:
120: /**
121: * NAT discovery payload (NAT-D).
122: */
123: PLV1_NAT_D = 20,
124:
125: /**
126: * NAT original address payload (NAT-OA).
127: */
128: PLV1_NAT_OA = 21,
129:
130: /**
131: * The security association (SA) payload containing proposals.
132: */
133: PLV2_SECURITY_ASSOCIATION = 33,
134:
135: /**
136: * The key exchange (KE) payload containing diffie-hellman values.
137: */
138: PLV2_KEY_EXCHANGE = 34,
139:
140: /**
141: * Identification for the original initiator (IDi).
142: */
143: PLV2_ID_INITIATOR = 35,
144:
145: /**
146: * Identification for the original responder (IDr).
147: */
148: PLV2_ID_RESPONDER = 36,
149:
150: /**
151: * Certificate payload with certificates (CERT).
152: */
153: PLV2_CERTIFICATE = 37,
154:
155: /**
156: * Certificate request payload (CERTREQ).
157: */
158: PLV2_CERTREQ = 38,
159:
160: /**
161: * Authentication payload contains auth data (AUTH).
162: */
163: PLV2_AUTH = 39,
164:
165: /**
166: * Nonces, for initiator and responder (Ni, Nr, N)
167: */
168: PLV2_NONCE = 40,
169:
170: /**
171: * Notify payload (N).
172: */
173: PLV2_NOTIFY = 41,
174:
175: /**
176: * Delete payload (D)
177: */
178: PLV2_DELETE = 42,
179:
180: /**
181: * Vendor id payload (V).
182: */
183: PLV2_VENDOR_ID = 43,
184:
185: /**
186: * Traffic selector for the original initiator (TSi).
187: */
188: PLV2_TS_INITIATOR = 44,
189:
190: /**
191: * Traffic selector for the original responder (TSr).
192: */
193: PLV2_TS_RESPONDER = 45,
194:
195: /**
196: * Encrypted payload, contains other payloads (E).
197: */
198: PLV2_ENCRYPTED = 46,
199:
200: /**
201: * Configuration payload (CP).
202: */
203: PLV2_CONFIGURATION = 47,
204:
205: /**
206: * Extensible authentication payload (EAP).
207: */
208: PLV2_EAP = 48,
209:
210: /**
211: * Generic Secure Password Method (GSPM).
212: */
213: PLV2_GSPM = 49,
214:
215: /**
216: * Group Identification (draft-yeung-g-ikev2)
217: */
218: PLV2_IDG = 50,
219:
220: /**
221: * Group Security Association (draft-yeung-g-ikev2)
222: */
223: PLV2_GSA = 51,
224:
225: /**
226: * Key Download (draft-yeung-g-ikev2)
227: */
228: PLV2_KD = 52,
229:
230: /**
231: * Encrypted fragment payload (SKF), RFC 7383
232: */
233: PLV2_FRAGMENT = 53,
234:
235: #ifdef ME
236: /**
237: * Identification payload for peers has a value from
238: * the PRIVATE USE space.
239: */
240: PLV2_ID_PEER = 128,
241: #endif /* ME */
242:
243: /**
244: * NAT discovery payload (NAT-D) (drafts).
245: */
246: PLV1_NAT_D_DRAFT_00_03 = 130,
247:
248: /**
249: * NAT original address payload (NAT-OA) (drafts).
250: */
251: PLV1_NAT_OA_DRAFT_00_03 = 131,
252:
253: /**
254: * IKEv1 fragment (proprietary IKEv1 extension)
255: */
256: PLV1_FRAGMENT = 132,
257:
258: /**
259: * Header has a value of PRIVATE USE space.
260: *
261: * This type and all the following are never sent over wire and are
262: * used internally only.
263: */
264: PL_HEADER = 256,
265:
266: /**
267: * Used to handle unknown or invalid payload types.
268: */
269: PL_UNKNOWN,
270:
271: /**
272: * PLV2_PROPOSAL_SUBSTRUCTURE, IKEv2 proposals in a SA payload.
273: */
274: PLV2_PROPOSAL_SUBSTRUCTURE,
275:
276: /**
277: * PLV1_PROPOSAL_SUBSTRUCTURE, IKEv1 proposals in a SA payload.
278: */
279: PLV1_PROPOSAL_SUBSTRUCTURE,
280:
281: /**
282: * PLV2_TRANSFORM_SUBSTRUCTURE, IKEv2 transforms in a proposal substructure.
283: */
284: PLV2_TRANSFORM_SUBSTRUCTURE,
285:
286: /**
287: * PLV1_TRANSFORM_SUBSTRUCTURE, IKEv1 transforms in a proposal substructure.
288: */
289: PLV1_TRANSFORM_SUBSTRUCTURE,
290:
291: /**
292: * PLV2_TRANSFORM_ATTRIBUTE, IKEv2 attribute in a transform.
293: */
294: PLV2_TRANSFORM_ATTRIBUTE,
295:
296: /**
297: * PLV1_TRANSFORM_ATTRIBUTE, IKEv1 attribute in a transform.
298: */
299: PLV1_TRANSFORM_ATTRIBUTE,
300:
301: /**
302: * PLV2_TRAFFIC_SELECTOR_SUBSTRUCTURE, traffic selector in a TS payload.
303: */
304: PLV2_TRAFFIC_SELECTOR_SUBSTRUCTURE,
305:
306: /**
307: * PLV2_CONFIGURATION_ATTRIBUTE, IKEv2 attribute in a configuration payload.
308: */
309: PLV2_CONFIGURATION_ATTRIBUTE,
310:
311: /**
312: * PLV1_CONFIGURATION_ATTRIBUTE, IKEv1 attribute in a configuration payload.
313: */
314: PLV1_CONFIGURATION_ATTRIBUTE,
315:
316: /**
317: * This is not really a payload, but rather the complete IKEv1 message.
318: */
319: PLV1_ENCRYPTED,
320: };
321:
322: /**
323: * enum names for payload_type_t.
324: */
325: extern enum_name_t *payload_type_names;
326:
327: /**
328: * enum names for payload_type_t in a short form.
329: */
330: extern enum_name_t *payload_type_short_names;
331:
332: /**
333: * Generic interface for all payload types (incl.header and substructures).
334: *
335: * To handle all kinds of payloads on a generic way, this interface must
336: * be implemented by every payload. This allows parser_t/generator_t a simple
337: * handling of all payloads.
338: */
339: struct payload_t {
340:
341: /**
342: * Get encoding rules for this payload.
343: *
344: * @param rules location to store pointer to rules
345: * @return number of rules
346: */
347: int (*get_encoding_rules) (payload_t *this, encoding_rule_t **rules);
348:
349: /**
350: * Get non-variable header length for a variable length payload.
351: *
352: * @return fixed length of the payload
353: */
354: int (*get_header_length)(payload_t *this);
355:
356: /**
357: * Get type of payload.
358: *
359: * @return type of this payload
360: */
361: payload_type_t (*get_type) (payload_t *this);
362:
363: /**
364: * Get type of next payload or PL_NONE (0) if this is the last one.
365: *
366: * @return type of next payload
367: */
368: payload_type_t (*get_next_type) (payload_t *this);
369:
370: /**
371: * Set type of next payload.
372: *
373: * @param type type of next payload
374: */
375: void (*set_next_type) (payload_t *this,payload_type_t type);
376:
377: /**
378: * Get length of payload.
379: *
380: * @return length of this payload
381: */
382: size_t (*get_length) (payload_t *this);
383:
384: /**
385: * Verifies payload structure and makes consistency check.
386: *
387: * @return SUCCESS, FAILED if consistency not given
388: */
389: status_t (*verify) (payload_t *this);
390:
391: /**
392: * Destroys a payload and all included substructures.
393: */
394: void (*destroy) (payload_t *this);
395: };
396:
397: /**
398: * Create an empty payload.
399: *
400: * Useful for the parser, who wants a generic constructor for all payloads.
401: * It supports all payload_t methods. If a payload type is not known,
402: * an unknown_payload is created with the chunk of data in it.
403: *
404: * @param type type of the payload to create
405: * @return payload_t object
406: */
407: payload_t *payload_create(payload_type_t type);
408:
409: /**
410: * Check if a specific payload is implemented, or handled as unknown payload.
411: *
412: * @param type type of the payload to check
413: * @param maj_ver major IKE version (use 0 to skip version check)
414: * @return FALSE if payload type handled as unknown payload
415: */
416: bool payload_is_known(payload_type_t type, uint8_t maj_ver);
417:
418: /**
419: * Get the value field in a payload using encoding rules.
420: *
421: * @param payload payload to look up a field
422: * @param type encoding rule type to look up
423: * @param skip number rules of type to skip, 0 to get first
424: * @return type specific value pointer, NULL if not found
425: */
426: void* payload_get_field(payload_t *payload, encoding_type_t type, u_int skip);
427:
428: #endif /** PAYLOAD_H_ @}*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>