Annotation of embedaddon/strongswan/src/libcharon/encoding/payloads/payload.h, revision 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>