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