Annotation of embedaddon/strongswan/src/libcharon/encoding/payloads/payload.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2007 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: #include "payload.h"
! 20:
! 21: #include <encoding/payloads/ike_header.h>
! 22: #include <encoding/payloads/sa_payload.h>
! 23:
! 24: #include <encoding/payloads/nonce_payload.h>
! 25: #include <encoding/payloads/id_payload.h>
! 26: #include <encoding/payloads/ke_payload.h>
! 27: #include <encoding/payloads/notify_payload.h>
! 28: #include <encoding/payloads/auth_payload.h>
! 29: #include <encoding/payloads/cert_payload.h>
! 30: #include <encoding/payloads/certreq_payload.h>
! 31: #include <encoding/payloads/encrypted_payload.h>
! 32: #include <encoding/payloads/encrypted_fragment_payload.h>
! 33: #include <encoding/payloads/ts_payload.h>
! 34: #include <encoding/payloads/delete_payload.h>
! 35: #include <encoding/payloads/vendor_id_payload.h>
! 36: #include <encoding/payloads/cp_payload.h>
! 37: #include <encoding/payloads/configuration_attribute.h>
! 38: #include <encoding/payloads/eap_payload.h>
! 39: #include <encoding/payloads/hash_payload.h>
! 40: #include <encoding/payloads/fragment_payload.h>
! 41: #include <encoding/payloads/unknown_payload.h>
! 42:
! 43: ENUM_BEGIN(payload_type_names, PL_NONE, PL_NONE,
! 44: "PL_NONE");
! 45: ENUM_NEXT(payload_type_names, PLV1_SECURITY_ASSOCIATION, PLV1_CONFIGURATION, PL_NONE,
! 46: "SECURITY_ASSOCIATION_V1",
! 47: "PROPOSAL_V1",
! 48: "TRANSFORM_V1",
! 49: "KEY_EXCHANGE_V1",
! 50: "ID_V1",
! 51: "CERTIFICATE_V1",
! 52: "CERTREQ_V1",
! 53: "HASH_V1",
! 54: "SIGNATURE_V1",
! 55: "NONCE_V1",
! 56: "NOTIFY_V1",
! 57: "DELETE_V1",
! 58: "VENDOR_ID_V1",
! 59: "CONFIGURATION_V1");
! 60: ENUM_NEXT(payload_type_names, PLV1_NAT_D, PLV1_NAT_OA, PLV1_CONFIGURATION,
! 61: "NAT_D_V1",
! 62: "NAT_OA_V1");
! 63: ENUM_NEXT(payload_type_names, PLV2_SECURITY_ASSOCIATION, PLV2_FRAGMENT, PLV1_NAT_OA,
! 64: "SECURITY_ASSOCIATION",
! 65: "KEY_EXCHANGE",
! 66: "ID_INITIATOR",
! 67: "ID_RESPONDER",
! 68: "CERTIFICATE",
! 69: "CERTREQ",
! 70: "AUTH",
! 71: "NONCE",
! 72: "NOTIFY",
! 73: "DELETE",
! 74: "VENDOR_ID",
! 75: "TS_INITIATOR",
! 76: "TS_RESPONDER",
! 77: "ENCRYPTED",
! 78: "CONFIGURATION",
! 79: "EAP",
! 80: "GSPM",
! 81: "GROUP_ID",
! 82: "GROUP_SECURITY_ASSOCIATION",
! 83: "KEY_DOWNLOAD",
! 84: "ENCRYPTED_FRAGMENT");
! 85: #ifdef ME
! 86: ENUM_NEXT(payload_type_names, PLV2_ID_PEER, PLV2_ID_PEER, PLV2_FRAGMENT,
! 87: "ID_PEER");
! 88: ENUM_NEXT(payload_type_names, PLV1_NAT_D_DRAFT_00_03, PLV1_FRAGMENT, PLV2_ID_PEER,
! 89: "NAT_D_DRAFT_V1",
! 90: "NAT_OA_DRAFT_V1",
! 91: "FRAGMENT");
! 92: #else
! 93: ENUM_NEXT(payload_type_names, PLV1_NAT_D_DRAFT_00_03, PLV1_FRAGMENT, PLV2_FRAGMENT,
! 94: "NAT_D_DRAFT_V1",
! 95: "NAT_OA_DRAFT_V1",
! 96: "FRAGMENT");
! 97: #endif /* ME */
! 98: ENUM_NEXT(payload_type_names, PL_HEADER, PLV1_ENCRYPTED, PLV1_FRAGMENT,
! 99: "HEADER",
! 100: "UNKNOWN",
! 101: "PROPOSAL_SUBSTRUCTURE",
! 102: "PROPOSAL_SUBSTRUCTURE_V1",
! 103: "TRANSFORM_SUBSTRUCTURE",
! 104: "TRANSFORM_SUBSTRUCTURE_V1",
! 105: "TRANSFORM_ATTRIBUTE",
! 106: "TRANSFORM_ATTRIBUTE_V1",
! 107: "TRAFFIC_SELECTOR_SUBSTRUCTURE",
! 108: "CONFIGURATION_ATTRIBUTE",
! 109: "CONFIGURATION_ATTRIBUTE_V1",
! 110: "ENCRYPTED_V1");
! 111: ENUM_END(payload_type_names, PLV1_ENCRYPTED);
! 112:
! 113: /* short forms of payload names */
! 114: ENUM_BEGIN(payload_type_short_names, PL_NONE, PL_NONE,
! 115: "--");
! 116: ENUM_NEXT(payload_type_short_names, PLV1_SECURITY_ASSOCIATION, PLV1_CONFIGURATION, PL_NONE,
! 117: "SA",
! 118: "PROP",
! 119: "TRANS",
! 120: "KE",
! 121: "ID",
! 122: "CERT",
! 123: "CERTREQ",
! 124: "HASH",
! 125: "SIG",
! 126: "No",
! 127: "N",
! 128: "D",
! 129: "V",
! 130: "CP");
! 131: ENUM_NEXT(payload_type_short_names, PLV1_NAT_D, PLV1_NAT_OA, PLV1_CONFIGURATION,
! 132: "NAT-D",
! 133: "NAT-OA");
! 134: ENUM_NEXT(payload_type_short_names, PLV2_SECURITY_ASSOCIATION, PLV2_FRAGMENT, PLV1_NAT_OA,
! 135: "SA",
! 136: "KE",
! 137: "IDi",
! 138: "IDr",
! 139: "CERT",
! 140: "CERTREQ",
! 141: "AUTH",
! 142: "No",
! 143: "N",
! 144: "D",
! 145: "V",
! 146: "TSi",
! 147: "TSr",
! 148: "E",
! 149: "CP",
! 150: "EAP",
! 151: "GSPM",
! 152: "IDg",
! 153: "GSA",
! 154: "KD",
! 155: "EF");
! 156: #ifdef ME
! 157: ENUM_NEXT(payload_type_short_names, PLV2_ID_PEER, PLV2_ID_PEER, PLV2_FRAGMENT,
! 158: "IDp");
! 159: ENUM_NEXT(payload_type_short_names, PLV1_NAT_D_DRAFT_00_03, PLV1_FRAGMENT, PLV2_ID_PEER,
! 160: "NAT-D",
! 161: "NAT-OA",
! 162: "FRAG");
! 163: #else
! 164: ENUM_NEXT(payload_type_short_names, PLV1_NAT_D_DRAFT_00_03, PLV1_FRAGMENT, PLV2_FRAGMENT,
! 165: "NAT-D",
! 166: "NAT-OA",
! 167: "FRAG");
! 168: #endif /* ME */
! 169: ENUM_NEXT(payload_type_short_names, PL_HEADER, PLV1_ENCRYPTED, PLV1_FRAGMENT,
! 170: "HDR",
! 171: "UNKN",
! 172: "PROP",
! 173: "PROP",
! 174: "TRANS",
! 175: "TRANS",
! 176: "TRANSATTR",
! 177: "TRANSATTR",
! 178: "TSSUB",
! 179: "CATTR",
! 180: "CATTR",
! 181: "E");
! 182: ENUM_END(payload_type_short_names, PLV1_ENCRYPTED);
! 183:
! 184: /*
! 185: * see header
! 186: */
! 187: payload_t *payload_create(payload_type_t type)
! 188: {
! 189: switch (type)
! 190: {
! 191: case PL_HEADER:
! 192: return (payload_t*)ike_header_create();
! 193: case PLV2_SECURITY_ASSOCIATION:
! 194: case PLV1_SECURITY_ASSOCIATION:
! 195: return (payload_t*)sa_payload_create(type);
! 196: case PLV2_PROPOSAL_SUBSTRUCTURE:
! 197: case PLV1_PROPOSAL_SUBSTRUCTURE:
! 198: return (payload_t*)proposal_substructure_create(type);
! 199: case PLV2_TRANSFORM_SUBSTRUCTURE:
! 200: case PLV1_TRANSFORM_SUBSTRUCTURE:
! 201: return (payload_t*)transform_substructure_create(type);
! 202: case PLV2_TRANSFORM_ATTRIBUTE:
! 203: case PLV1_TRANSFORM_ATTRIBUTE:
! 204: return (payload_t*)transform_attribute_create(type);
! 205: case PLV2_NONCE:
! 206: case PLV1_NONCE:
! 207: return (payload_t*)nonce_payload_create(type);
! 208: case PLV2_ID_INITIATOR:
! 209: case PLV2_ID_RESPONDER:
! 210: case PLV1_ID:
! 211: case PLV1_NAT_OA:
! 212: case PLV1_NAT_OA_DRAFT_00_03:
! 213: #ifdef ME
! 214: case PLV2_ID_PEER:
! 215: #endif /* ME */
! 216: return (payload_t*)id_payload_create(type);
! 217: case PLV2_AUTH:
! 218: return (payload_t*)auth_payload_create();
! 219: case PLV2_CERTIFICATE:
! 220: case PLV1_CERTIFICATE:
! 221: return (payload_t*)cert_payload_create(type);
! 222: case PLV2_CERTREQ:
! 223: case PLV1_CERTREQ:
! 224: return (payload_t*)certreq_payload_create(type);
! 225: case PLV2_TRAFFIC_SELECTOR_SUBSTRUCTURE:
! 226: return (payload_t*)traffic_selector_substructure_create();
! 227: case PLV2_TS_INITIATOR:
! 228: return (payload_t*)ts_payload_create(TRUE);
! 229: case PLV2_TS_RESPONDER:
! 230: return (payload_t*)ts_payload_create(FALSE);
! 231: case PLV2_KEY_EXCHANGE:
! 232: case PLV1_KEY_EXCHANGE:
! 233: return (payload_t*)ke_payload_create(type);
! 234: case PLV2_NOTIFY:
! 235: case PLV1_NOTIFY:
! 236: return (payload_t*)notify_payload_create(type);
! 237: case PLV2_DELETE:
! 238: case PLV1_DELETE:
! 239: return (payload_t*)delete_payload_create(type, 0);
! 240: case PLV2_VENDOR_ID:
! 241: case PLV1_VENDOR_ID:
! 242: return (payload_t*)vendor_id_payload_create(type);
! 243: case PLV1_HASH:
! 244: case PLV1_SIGNATURE:
! 245: case PLV1_NAT_D:
! 246: case PLV1_NAT_D_DRAFT_00_03:
! 247: return (payload_t*)hash_payload_create(type);
! 248: case PLV2_CONFIGURATION:
! 249: case PLV1_CONFIGURATION:
! 250: return (payload_t*)cp_payload_create(type);
! 251: case PLV2_CONFIGURATION_ATTRIBUTE:
! 252: case PLV1_CONFIGURATION_ATTRIBUTE:
! 253: return (payload_t*)configuration_attribute_create(type);
! 254: case PLV2_EAP:
! 255: return (payload_t*)eap_payload_create();
! 256: case PLV2_ENCRYPTED:
! 257: case PLV1_ENCRYPTED:
! 258: return (payload_t*)encrypted_payload_create(type);
! 259: case PLV1_FRAGMENT:
! 260: return (payload_t*)fragment_payload_create();
! 261: case PLV2_FRAGMENT:
! 262: return (payload_t*)encrypted_fragment_payload_create();
! 263: default:
! 264: return (payload_t*)unknown_payload_create(type);
! 265: }
! 266: }
! 267:
! 268: /**
! 269: * See header.
! 270: */
! 271: bool payload_is_known(payload_type_t type, uint8_t maj_ver)
! 272: {
! 273: if (type >= PL_HEADER)
! 274: {
! 275: return TRUE;
! 276: }
! 277: switch (maj_ver)
! 278: {
! 279: case 0:
! 280: case IKEV1_MAJOR_VERSION:
! 281: if (type >= PLV1_SECURITY_ASSOCIATION && type <= PLV1_CONFIGURATION)
! 282: {
! 283: return TRUE;
! 284: }
! 285: if (type >= PLV1_NAT_D && type <= PLV1_NAT_OA)
! 286: {
! 287: return TRUE;
! 288: }
! 289: if (type >= PLV1_NAT_D_DRAFT_00_03 && type <= PLV1_FRAGMENT)
! 290: {
! 291: return TRUE;
! 292: }
! 293: if (maj_ver)
! 294: {
! 295: break;
! 296: }
! 297: /* fall-through */
! 298: case IKEV2_MAJOR_VERSION:
! 299: if (type >= PLV2_SECURITY_ASSOCIATION && type <= PLV2_EAP)
! 300: {
! 301: return TRUE;
! 302: }
! 303: if (type == PLV2_FRAGMENT)
! 304: {
! 305: return TRUE;
! 306: }
! 307: #ifdef ME
! 308: if (type == PLV2_ID_PEER)
! 309: {
! 310: return TRUE;
! 311: }
! 312: #endif
! 313: break;
! 314: default:
! 315: break;
! 316: }
! 317: return FALSE;
! 318: }
! 319:
! 320: /**
! 321: * See header.
! 322: */
! 323: void* payload_get_field(payload_t *payload, encoding_type_t type, u_int skip)
! 324: {
! 325: encoding_rule_t *rule;
! 326: int i, count;
! 327:
! 328: count = payload->get_encoding_rules(payload, &rule);
! 329: for (i = 0; i < count; i++)
! 330: {
! 331: if (rule[i].type == type && skip-- == 0)
! 332: {
! 333: return ((char*)payload) + rule[i].offset;
! 334: }
! 335: }
! 336: return NULL;
! 337: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>