Annotation of embedaddon/strongswan/src/libcharon/encoding/message.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2006-2018 Tobias Brunner
                      3:  * Copyright (C) 2005-2010 Martin Willi
                      4:  * Copyright (C) 2010 revosec AG
                      5:  * Copyright (C) 2006 Daniel Roethlisberger
                      6:  * Copyright (C) 2005 Jan Hutter
                      7:  * HSR Hochschule fuer Technik Rapperswil
                      8:  *
                      9:  * This program is free software; you can redistribute it and/or modify it
                     10:  * under the terms of the GNU General Public License as published by the
                     11:  * Free Software Foundation; either version 2 of the License, or (at your
                     12:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                     13:  *
                     14:  * This program is distributed in the hope that it will be useful, but
                     15:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     16:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     17:  * for more details.
                     18:  */
                     19: 
                     20: #include <stdlib.h>
                     21: #include <string.h>
                     22: 
                     23: #include "message.h"
                     24: 
                     25: #include <library.h>
                     26: #include <bio/bio_writer.h>
                     27: #include <collections/array.h>
                     28: #include <daemon.h>
                     29: #include <sa/ikev1/keymat_v1.h>
                     30: #include <encoding/generator.h>
                     31: #include <encoding/parser.h>
                     32: #include <encoding/payloads/encodings.h>
                     33: #include <encoding/payloads/payload.h>
                     34: #include <encoding/payloads/hash_payload.h>
                     35: #include <encoding/payloads/encrypted_payload.h>
                     36: #include <encoding/payloads/encrypted_fragment_payload.h>
                     37: #include <encoding/payloads/unknown_payload.h>
                     38: #include <encoding/payloads/cp_payload.h>
                     39: #include <encoding/payloads/fragment_payload.h>
                     40: 
                     41: /**
                     42:  * Max number of notify payloads per IKEv2 message
                     43:  */
                     44: #define MAX_NOTIFY_PAYLOADS 20
                     45: 
                     46: /**
                     47:  * Max number of delete payloads per IKEv2 message
                     48:  */
                     49: #define MAX_DELETE_PAYLOADS 20
                     50: 
                     51: /**
                     52:  * Max number of certificate payloads per IKEv2 message
                     53:  */
                     54: #define MAX_CERT_PAYLOADS 8
                     55: 
                     56: /**
                     57:  * Max number of vendor ID payloads per IKEv2 message
                     58:  */
                     59: #define MAX_VID_PAYLOADS 20
                     60: 
                     61: /**
                     62:  * Max number of certificate request payloads per IKEv1 message
                     63:  */
                     64: #define MAX_CERTREQ_PAYLOADS 20
                     65: 
                     66: /**
                     67:  * Max number of NAT-D payloads per IKEv1 message
                     68:  */
                     69: #define MAX_NAT_D_PAYLOADS 10
                     70: 
                     71: /**
                     72:  * A payload rule defines the rules for a payload
                     73:  * in a specific message rule. It defines if and how
                     74:  * many times a payload must/can occur in a message
                     75:  * and if it must be encrypted.
                     76:  */
                     77: typedef struct {
                     78:        /* Payload type */
                     79:         payload_type_t type;
                     80:        /* Minimal occurrence of this payload. */
                     81:        size_t min_occurrence;
                     82:        /* Max occurrence of this payload. */
                     83:        size_t max_occurrence;
                     84:        /* TRUE if payload must be encrypted */
                     85:        bool encrypted;
                     86:        /* If payload occurs, the message rule is fulfilled */
                     87:        bool sufficient;
                     88: } payload_rule_t;
                     89: 
                     90: /**
                     91:  * payload ordering structure allows us to reorder payloads according to RFC.
                     92:  */
                     93: typedef struct {
                     94:        /** payload type */
                     95:        payload_type_t type;
                     96:        /** notify type, if payload == PLV2_NOTIFY */
                     97:        notify_type_t notify;
                     98: } payload_order_t;
                     99: 
                    100: /**
                    101:  * A message rule defines the kind of a message,
                    102:  * if it has encrypted contents and a list
                    103:  * of payload ordering rules and payload parsing rules.
                    104:  */
                    105: typedef struct {
                    106:        /** Type of message. */
                    107:        exchange_type_t exchange_type;
                    108:        /** Is message a request or response. */
                    109:        bool is_request;
                    110:        /** Message contains encrypted payloads. */
                    111:        bool encrypted;
                    112:        /** Number of payload rules which will follow */
                    113:        int rule_count;
                    114:        /** Pointer to first payload rule */
                    115:        payload_rule_t *rules;
                    116:        /** Number of payload order rules */
                    117:        int order_count;
                    118:        /** payload ordering rules */
                    119:        payload_order_t *order;
                    120: } message_rule_t;
                    121: 
                    122: /**
                    123:  * Message rule for IKE_SA_INIT from initiator.
                    124:  */
                    125: static payload_rule_t ike_sa_init_i_rules[] = {
                    126: /*     payload type                                    min     max                                             encr    suff */
                    127:        {PLV2_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    FALSE,  FALSE},
                    128:        {PLV2_SECURITY_ASSOCIATION,             1,      1,                                              FALSE,  FALSE},
                    129:        {PLV2_KEY_EXCHANGE,                             1,      1,                                              FALSE,  FALSE},
                    130:        {PLV2_NONCE,                                    1,      1,                                              FALSE,  FALSE},
                    131:        {PLV2_VENDOR_ID,                                0,      MAX_VID_PAYLOADS,               FALSE,  FALSE},
                    132: };
                    133: 
                    134: /**
                    135:  * payload order for IKE_SA_INIT initiator
                    136:  */
                    137: static payload_order_t ike_sa_init_i_order[] = {
                    138: /*     payload type                                    notify type */
                    139:        {PLV2_NOTIFY,                                   COOKIE},
                    140:        {PLV2_SECURITY_ASSOCIATION,             0},
                    141:        {PLV2_KEY_EXCHANGE,                             0},
                    142:        {PLV2_NONCE,                                    0},
                    143:        {PLV2_NOTIFY,                                   NAT_DETECTION_SOURCE_IP},
                    144:        {PLV2_NOTIFY,                                   NAT_DETECTION_DESTINATION_IP},
                    145:        {PLV2_NOTIFY,                                   0},
                    146:        {PLV2_VENDOR_ID,                                0},
                    147: };
                    148: 
                    149: /**
                    150:  * Message rule for IKE_SA_INIT from responder.
                    151:  */
                    152: static payload_rule_t ike_sa_init_r_rules[] = {
                    153: /*     payload type                                    min     max                                             encr    suff */
                    154:        {PLV2_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    FALSE,  TRUE},
                    155:        {PLV2_SECURITY_ASSOCIATION,             1,      1,                                              FALSE,  FALSE},
                    156:        {PLV2_KEY_EXCHANGE,                             1,      1,                                              FALSE,  FALSE},
                    157:        {PLV2_NONCE,                                    1,      1,                                              FALSE,  FALSE},
                    158:        {PLV2_CERTREQ,                                  0,      MAX_CERTREQ_PAYLOADS,   FALSE,  FALSE},
                    159:        {PLV2_VENDOR_ID,                                0,      MAX_VID_PAYLOADS,               FALSE,  FALSE},
                    160: };
                    161: 
                    162: /**
                    163:  * payload order for IKE_SA_INIT responder
                    164:  */
                    165: static payload_order_t ike_sa_init_r_order[] = {
                    166: /*     payload type                                    notify type */
                    167:        {PLV2_SECURITY_ASSOCIATION,             0},
                    168:        {PLV2_KEY_EXCHANGE,                             0},
                    169:        {PLV2_NONCE,                                    0},
                    170:        {PLV2_NOTIFY,                                   NAT_DETECTION_SOURCE_IP},
                    171:        {PLV2_NOTIFY,                                   NAT_DETECTION_DESTINATION_IP},
                    172:        {PLV2_NOTIFY,                                   HTTP_CERT_LOOKUP_SUPPORTED},
                    173:        {PLV2_CERTREQ,                                  0},
                    174:        {PLV2_NOTIFY,                                   0},
                    175:        {PLV2_VENDOR_ID,                                0},
                    176: };
                    177: 
                    178: /**
                    179:  * Message rule for IKE_AUTH from initiator.
                    180:  */
                    181: static payload_rule_t ike_auth_i_rules[] = {
                    182: /*     payload type                                    min     max                                             encr    suff */
                    183:        {PLV2_FRAGMENT,                                 0,      1,                                              TRUE,   TRUE},
                    184:        {PLV2_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    TRUE,   FALSE},
                    185:        {PLV2_EAP,                                              0,      1,                                              TRUE,   TRUE},
                    186:        {PLV2_AUTH,                                             0,      1,                                              TRUE,   TRUE},
                    187:        {PLV2_ID_INITIATOR,                             0,      1,                                              TRUE,   FALSE},
                    188:        {PLV2_CERTIFICATE,                              0,      MAX_CERT_PAYLOADS,              TRUE,   FALSE},
                    189:        {PLV2_CERTREQ,                                  0,      MAX_CERTREQ_PAYLOADS,   TRUE,   FALSE},
                    190:        {PLV2_ID_RESPONDER,                             0,      1,                                              TRUE,   FALSE},
                    191: #ifdef ME
                    192:        {PLV2_SECURITY_ASSOCIATION,             0,      1,                                              TRUE,   FALSE},
                    193:        {PLV2_TS_INITIATOR,                             0,      1,                                              TRUE,   FALSE},
                    194:        {PLV2_TS_RESPONDER,                             0,      1,                                              TRUE,   FALSE},
                    195: #else
                    196:        {PLV2_SECURITY_ASSOCIATION,             0,      1,                                              TRUE,   FALSE},
                    197:        {PLV2_TS_INITIATOR,                             0,      1,                                              TRUE,   FALSE},
                    198:        {PLV2_TS_RESPONDER,                             0,      1,                                              TRUE,   FALSE},
                    199: #endif /* ME */
                    200:        {PLV2_CONFIGURATION,                    0,      1,                                              TRUE,   FALSE},
                    201:        {PLV2_VENDOR_ID,                                0,      MAX_VID_PAYLOADS,               TRUE,   FALSE},
                    202: };
                    203: 
                    204: /**
                    205:  * payload order for IKE_AUTH initiator
                    206:  */
                    207: static payload_order_t ike_auth_i_order[] = {
                    208: /*     payload type                                    notify type */
                    209:        {PLV2_ID_INITIATOR,                             0},
                    210:        {PLV2_CERTIFICATE,                              0},
                    211:        {PLV2_NOTIFY,                                   INITIAL_CONTACT},
                    212:        {PLV2_NOTIFY,                                   HTTP_CERT_LOOKUP_SUPPORTED},
                    213:        {PLV2_CERTREQ,                                  0},
                    214:        {PLV2_ID_RESPONDER,                             0},
                    215:        {PLV2_AUTH,                                             0},
                    216:        {PLV2_EAP,                                              0},
                    217:        {PLV2_CONFIGURATION,                    0},
                    218:        {PLV2_NOTIFY,                                   IPCOMP_SUPPORTED},
                    219:        {PLV2_NOTIFY,                                   USE_TRANSPORT_MODE},
                    220:        {PLV2_NOTIFY,                                   ESP_TFC_PADDING_NOT_SUPPORTED},
                    221:        {PLV2_NOTIFY,                                   NON_FIRST_FRAGMENTS_ALSO},
                    222:        {PLV2_SECURITY_ASSOCIATION,             0},
                    223:        {PLV2_TS_INITIATOR,                             0},
                    224:        {PLV2_TS_RESPONDER,                             0},
                    225:        {PLV2_NOTIFY,                                   MOBIKE_SUPPORTED},
                    226:        {PLV2_NOTIFY,                                   ADDITIONAL_IP4_ADDRESS},
                    227:        {PLV2_NOTIFY,                                   ADDITIONAL_IP6_ADDRESS},
                    228:        {PLV2_NOTIFY,                                   NO_ADDITIONAL_ADDRESSES},
                    229:        {PLV2_NOTIFY,                                   0},
                    230:        {PLV2_VENDOR_ID,                                0},
                    231:        {PLV2_FRAGMENT,                                 0},
                    232: };
                    233: 
                    234: /**
                    235:  * Message rule for IKE_AUTH from responder.
                    236:  */
                    237: static payload_rule_t ike_auth_r_rules[] = {
                    238: /*     payload type                                    min     max                                             encr    suff */
                    239:        {PLV2_FRAGMENT,                                 0,      1,                                              TRUE,   TRUE},
                    240:        {PLV2_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    TRUE,   TRUE},
                    241:        {PLV2_EAP,                                              0,      1,                                              TRUE,   TRUE},
                    242:        {PLV2_AUTH,                                             0,      1,                                              TRUE,   TRUE},
                    243:        {PLV2_CERTIFICATE,                              0,      MAX_CERT_PAYLOADS,              TRUE,   FALSE},
                    244:        {PLV2_ID_RESPONDER,                             0,      1,                                              TRUE,   FALSE},
                    245:        {PLV2_SECURITY_ASSOCIATION,             0,      1,                                              TRUE,   FALSE},
                    246:        {PLV2_TS_INITIATOR,                             0,      1,                                              TRUE,   FALSE},
                    247:        {PLV2_TS_RESPONDER,                             0,      1,                                              TRUE,   FALSE},
                    248:        {PLV2_CONFIGURATION,                    0,      1,                                              TRUE,   FALSE},
                    249:        {PLV2_VENDOR_ID,                                0,      MAX_VID_PAYLOADS,               TRUE,   FALSE},
                    250: };
                    251: 
                    252: /**
                    253:  * payload order for IKE_AUTH responder
                    254:  */
                    255: static payload_order_t ike_auth_r_order[] = {
                    256: /*     payload type                                    notify type */
                    257:        {PLV2_ID_RESPONDER,                             0},
                    258:        {PLV2_CERTIFICATE,                              0},
                    259:        {PLV2_AUTH,                                             0},
                    260:        {PLV2_EAP,                                              0},
                    261:        {PLV2_CONFIGURATION,                    0},
                    262:        {PLV2_NOTIFY,                                   IPCOMP_SUPPORTED},
                    263:        {PLV2_NOTIFY,                                   USE_TRANSPORT_MODE},
                    264:        {PLV2_NOTIFY,                                   ESP_TFC_PADDING_NOT_SUPPORTED},
                    265:        {PLV2_NOTIFY,                                   NON_FIRST_FRAGMENTS_ALSO},
                    266:        {PLV2_SECURITY_ASSOCIATION,             0},
                    267:        {PLV2_TS_INITIATOR,                             0},
                    268:        {PLV2_TS_RESPONDER,                             0},
                    269:        {PLV2_NOTIFY,                                   AUTH_LIFETIME},
                    270:        {PLV2_NOTIFY,                                   MOBIKE_SUPPORTED},
                    271:        {PLV2_NOTIFY,                                   ADDITIONAL_IP4_ADDRESS},
                    272:        {PLV2_NOTIFY,                                   ADDITIONAL_IP6_ADDRESS},
                    273:        {PLV2_NOTIFY,                                   NO_ADDITIONAL_ADDRESSES},
                    274:        {PLV2_NOTIFY,                                   0},
                    275:        {PLV2_VENDOR_ID,                                0},
                    276:        {PLV2_FRAGMENT,                                 0},
                    277: };
                    278: 
                    279: /**
                    280:  * Message rule for INFORMATIONAL from initiator.
                    281:  */
                    282: static payload_rule_t informational_i_rules[] = {
                    283: /*     payload type                                    min     max                                             encr    suff */
                    284:        {PLV2_FRAGMENT,                                 0,      1,                                              TRUE,   TRUE},
                    285:        {PLV2_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    TRUE,   FALSE},
                    286:        {PLV2_CONFIGURATION,                    0,      1,                                              TRUE,   FALSE},
                    287:        {PLV2_DELETE,                                   0,      MAX_DELETE_PAYLOADS,    TRUE,   FALSE},
                    288:        {PLV2_VENDOR_ID,                                0,      MAX_VID_PAYLOADS,               TRUE,   FALSE},
                    289: };
                    290: 
                    291: /**
                    292:  * payload order for INFORMATIONAL initiator
                    293:  */
                    294: static payload_order_t informational_i_order[] = {
                    295: /*     payload type                                    notify type */
                    296:        {PLV2_NOTIFY,                                   UPDATE_SA_ADDRESSES},
                    297:        {PLV2_NOTIFY,                                   NAT_DETECTION_SOURCE_IP},
                    298:        {PLV2_NOTIFY,                                   NAT_DETECTION_DESTINATION_IP},
                    299:        {PLV2_NOTIFY,                                   COOKIE2},
                    300:        {PLV2_NOTIFY,                                   0},
                    301:        {PLV2_DELETE,                                   0},
                    302:        {PLV2_CONFIGURATION,                    0},
                    303:        {PLV2_FRAGMENT,                                 0},
                    304: };
                    305: 
                    306: /**
                    307:  * Message rule for INFORMATIONAL from responder.
                    308:  */
                    309: static payload_rule_t informational_r_rules[] = {
                    310: /*     payload type                                    min     max                                             encr    suff */
                    311:        {PLV2_FRAGMENT,                                 0,      1,                                              TRUE,   TRUE},
                    312:        {PLV2_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    TRUE,   FALSE},
                    313:        {PLV2_CONFIGURATION,                    0,      1,                                              TRUE,   FALSE},
                    314:        {PLV2_DELETE,                                   0,      MAX_DELETE_PAYLOADS,    TRUE,   FALSE},
                    315:        {PLV2_VENDOR_ID,                                0,      MAX_VID_PAYLOADS,               TRUE,   FALSE},
                    316: };
                    317: 
                    318: /**
                    319:  * payload order for INFORMATIONAL responder
                    320:  */
                    321: static payload_order_t informational_r_order[] = {
                    322: /*     payload type                                    notify type */
                    323:        {PLV2_NOTIFY,                                   UPDATE_SA_ADDRESSES},
                    324:        {PLV2_NOTIFY,                                   NAT_DETECTION_SOURCE_IP},
                    325:        {PLV2_NOTIFY,                                   NAT_DETECTION_DESTINATION_IP},
                    326:        {PLV2_NOTIFY,                                   COOKIE2},
                    327:        {PLV2_NOTIFY,                                   0},
                    328:        {PLV2_DELETE,                                   0},
                    329:        {PLV2_CONFIGURATION,                    0},
                    330:        {PLV2_FRAGMENT,                                 0},
                    331: };
                    332: 
                    333: /**
                    334:  * Message rule for CREATE_CHILD_SA from initiator.
                    335:  */
                    336: static payload_rule_t create_child_sa_i_rules[] = {
                    337: /*     payload type                                    min     max                                             encr    suff */
                    338:        {PLV2_FRAGMENT,                                 0,      1,                                              TRUE,   TRUE},
                    339:        {PLV2_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    TRUE,   FALSE},
                    340:        {PLV2_SECURITY_ASSOCIATION,             1,      1,                                              TRUE,   FALSE},
                    341:        {PLV2_NONCE,                                    1,      1,                                              TRUE,   FALSE},
                    342:        {PLV2_KEY_EXCHANGE,                             0,      1,                                              TRUE,   FALSE},
                    343:        {PLV2_TS_INITIATOR,                             0,      1,                                              TRUE,   FALSE},
                    344:        {PLV2_TS_RESPONDER,                             0,      1,                                              TRUE,   FALSE},
                    345:        {PLV2_CONFIGURATION,                    0,      1,                                              TRUE,   FALSE},
                    346:        {PLV2_VENDOR_ID,                                0,      MAX_VID_PAYLOADS,               TRUE,   FALSE},
                    347: };
                    348: 
                    349: /**
                    350:  * payload order for CREATE_CHILD_SA from initiator.
                    351:  */
                    352: static payload_order_t create_child_sa_i_order[] = {
                    353: /*     payload type                                    notify type */
                    354:        {PLV2_NOTIFY,                                   REKEY_SA},
                    355:        {PLV2_NOTIFY,                                   IPCOMP_SUPPORTED},
                    356:        {PLV2_NOTIFY,                                   USE_TRANSPORT_MODE},
                    357:        {PLV2_NOTIFY,                                   ESP_TFC_PADDING_NOT_SUPPORTED},
                    358:        {PLV2_NOTIFY,                                   NON_FIRST_FRAGMENTS_ALSO},
                    359:        {PLV2_SECURITY_ASSOCIATION,             0},
                    360:        {PLV2_NONCE,                                    0},
                    361:        {PLV2_KEY_EXCHANGE,                             0},
                    362:        {PLV2_TS_INITIATOR,                             0},
                    363:        {PLV2_TS_RESPONDER,                             0},
                    364:        {PLV2_NOTIFY,                                   0},
                    365:        {PLV2_FRAGMENT,                                 0},
                    366: };
                    367: 
                    368: /**
                    369:  * Message rule for CREATE_CHILD_SA from responder.
                    370:  */
                    371: static payload_rule_t create_child_sa_r_rules[] = {
                    372: /*     payload type                                    min     max                                             encr    suff */
                    373:        {PLV2_FRAGMENT,                                 0,      1,                                              TRUE,   TRUE},
                    374:        {PLV2_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    TRUE,   TRUE},
                    375:        {PLV2_SECURITY_ASSOCIATION,             1,      1,                                              TRUE,   FALSE},
                    376:        {PLV2_NONCE,                                    1,      1,                                              TRUE,   FALSE},
                    377:        {PLV2_KEY_EXCHANGE,                             0,      1,                                              TRUE,   FALSE},
                    378:        {PLV2_TS_INITIATOR,                             0,      1,                                              TRUE,   FALSE},
                    379:        {PLV2_TS_RESPONDER,                             0,      1,                                              TRUE,   FALSE},
                    380:        {PLV2_CONFIGURATION,                    0,      1,                                              TRUE,   FALSE},
                    381:        {PLV2_VENDOR_ID,                                0,      MAX_VID_PAYLOADS,               TRUE,   FALSE},
                    382: };
                    383: 
                    384: /**
                    385:  * payload order for CREATE_CHILD_SA from responder.
                    386:  */
                    387: static payload_order_t create_child_sa_r_order[] = {
                    388: /*     payload type                                    notify type */
                    389:        {PLV2_NOTIFY,                                   IPCOMP_SUPPORTED},
                    390:        {PLV2_NOTIFY,                                   USE_TRANSPORT_MODE},
                    391:        {PLV2_NOTIFY,                                   ESP_TFC_PADDING_NOT_SUPPORTED},
                    392:        {PLV2_NOTIFY,                                   NON_FIRST_FRAGMENTS_ALSO},
                    393:        {PLV2_SECURITY_ASSOCIATION,             0},
                    394:        {PLV2_NONCE,                                    0},
                    395:        {PLV2_KEY_EXCHANGE,                             0},
                    396:        {PLV2_TS_INITIATOR,                             0},
                    397:        {PLV2_TS_RESPONDER,                             0},
                    398:        {PLV2_NOTIFY,                                   ADDITIONAL_TS_POSSIBLE},
                    399:        {PLV2_NOTIFY,                                   0},
                    400:        {PLV2_FRAGMENT,                                 0},
                    401: };
                    402: 
                    403: #ifdef ME
                    404: /**
                    405:  * Message rule for ME_CONNECT from initiator.
                    406:  */
                    407: static payload_rule_t me_connect_i_rules[] = {
                    408: /*     payload type                                    min     max                                             encr    suff */
                    409:        {PLV2_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    TRUE,   TRUE},
                    410:        {PLV2_ID_PEER,                                  1,      1,                                              TRUE,   FALSE},
                    411:        {PLV2_VENDOR_ID,                                0,      MAX_VID_PAYLOADS,               TRUE,   FALSE}
                    412: };
                    413: 
                    414: /**
                    415:  * payload order for ME_CONNECT from initiator.
                    416:  */
                    417: static payload_order_t me_connect_i_order[] = {
                    418: /*     payload type                                    notify type */
                    419:        {PLV2_NOTIFY,                                   0},
                    420:        {PLV2_ID_PEER,                                  0},
                    421:        {PLV2_VENDOR_ID,                                0},
                    422: };
                    423: 
                    424: /**
                    425:  * Message rule for ME_CONNECT from responder.
                    426:  */
                    427: static payload_rule_t me_connect_r_rules[] = {
                    428: /*     payload type                                    min     max                                             encr    suff */
                    429:        {PLV2_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    TRUE,   TRUE},
                    430:        {PLV2_VENDOR_ID,                                0,      MAX_VID_PAYLOADS,               TRUE,   FALSE}
                    431: };
                    432: 
                    433: /**
                    434:  * payload order for ME_CONNECT from responder.
                    435:  */
                    436: static payload_order_t me_connect_r_order[] = {
                    437: /*     payload type                                    notify type */
                    438:        {PLV2_NOTIFY,                                   0},
                    439:        {PLV2_VENDOR_ID,                                0},
                    440: };
                    441: #endif /* ME */
                    442: 
                    443: #ifdef USE_IKEV1
                    444: /**
                    445:  * Message rule for ID_PROT from initiator.
                    446:  */
                    447: static payload_rule_t id_prot_i_rules[] = {
                    448: /*     payload type                                    min     max                                             encr    suff */
                    449:        {PLV1_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    FALSE,  FALSE},
                    450:        {PLV1_SECURITY_ASSOCIATION,             0,      1,                                              FALSE,  FALSE},
                    451:        {PLV1_KEY_EXCHANGE,                             0,      1,                                              FALSE,  FALSE},
                    452:        {PLV1_NONCE,                                    0,      1,                                              FALSE,  FALSE},
                    453:        {PLV1_VENDOR_ID,                                0,      MAX_VID_PAYLOADS,               FALSE,  FALSE},
                    454:        {PLV1_CERTREQ,                                  0,      MAX_CERTREQ_PAYLOADS,   FALSE,  FALSE},
                    455:        {PLV1_NAT_D,                                    0,      MAX_NAT_D_PAYLOADS,             FALSE,  FALSE},
                    456:        {PLV1_NAT_D_DRAFT_00_03,                0,      MAX_NAT_D_PAYLOADS,             FALSE,  FALSE},
                    457:        {PLV1_ID,                                               0,      1,                                              TRUE,   FALSE},
                    458:        {PLV1_CERTIFICATE,                              0,      MAX_CERT_PAYLOADS,              TRUE,   FALSE},
                    459:        {PLV1_SIGNATURE,                                0,      1,                                              TRUE,   FALSE},
                    460:        {PLV1_HASH,                                             0,      1,                                              TRUE,   FALSE},
                    461:        {PLV1_FRAGMENT,                                 0,      1,                                              FALSE,  TRUE},
                    462: };
                    463: 
                    464: /**
                    465:  * payload order for ID_PROT from initiator.
                    466:  */
                    467: static payload_order_t id_prot_i_order[] = {
                    468: /*     payload type                                    notify type */
                    469:        {PLV1_SECURITY_ASSOCIATION,             0},
                    470:        {PLV1_KEY_EXCHANGE,                             0},
                    471:        {PLV1_NONCE,                                    0},
                    472:        {PLV1_ID,                                               0},
                    473:        {PLV1_CERTIFICATE,                              0},
                    474:        {PLV1_SIGNATURE,                                0},
                    475:        {PLV1_HASH,                                             0},
                    476:        {PLV1_CERTREQ,                                  0},
                    477:        {PLV1_NOTIFY,                                   0},
                    478:        {PLV1_VENDOR_ID,                                0},
                    479:        {PLV1_NAT_D,                                    0},
                    480:        {PLV1_NAT_D_DRAFT_00_03,                0},
                    481:        {PLV1_FRAGMENT,                                 0},
                    482: };
                    483: 
                    484: /**
                    485:  * Message rule for ID_PROT from responder.
                    486:  */
                    487: static payload_rule_t id_prot_r_rules[] = {
                    488: /*     payload type                                    min     max                                             encr    suff */
                    489:        {PLV1_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    FALSE,  FALSE},
                    490:        {PLV1_SECURITY_ASSOCIATION,             0,      1,                                              FALSE,  FALSE},
                    491:        {PLV1_KEY_EXCHANGE,                             0,      1,                                              FALSE,  FALSE},
                    492:        {PLV1_NONCE,                                    0,      1,                                              FALSE,  FALSE},
                    493:        {PLV1_VENDOR_ID,                                0,      MAX_VID_PAYLOADS,               FALSE,  FALSE},
                    494:        {PLV1_CERTREQ,                                  0,      MAX_CERTREQ_PAYLOADS,   FALSE,  FALSE},
                    495:        {PLV1_NAT_D,                                    0,      MAX_NAT_D_PAYLOADS,             FALSE,  FALSE},
                    496:        {PLV1_NAT_D_DRAFT_00_03,                0,      MAX_NAT_D_PAYLOADS,             FALSE,  FALSE},
                    497:        {PLV1_ID,                                               0,      1,                                              TRUE,   FALSE},
                    498:        {PLV1_CERTIFICATE,                              0,      MAX_CERT_PAYLOADS,              TRUE,   FALSE},
                    499:        {PLV1_SIGNATURE,                                0,      1,                                              TRUE,   FALSE},
                    500:        {PLV1_HASH,                                             0,      1,                                              TRUE,   FALSE},
                    501:        {PLV1_FRAGMENT,                                 0,      1,                                              FALSE,  TRUE},
                    502: };
                    503: 
                    504: /**
                    505:  * payload order for ID_PROT from responder.
                    506:  */
                    507: static payload_order_t id_prot_r_order[] = {
                    508: /*     payload type                                    notify type */
                    509:        {PLV1_SECURITY_ASSOCIATION,             0},
                    510:        {PLV1_KEY_EXCHANGE,                             0},
                    511:        {PLV1_NONCE,                                    0},
                    512:        {PLV1_ID,                                               0},
                    513:        {PLV1_CERTIFICATE,                              0},
                    514:        {PLV1_SIGNATURE,                                0},
                    515:        {PLV1_HASH,                                             0},
                    516:        {PLV1_CERTREQ,                                  0},
                    517:        {PLV1_NOTIFY,                                   0},
                    518:        {PLV1_VENDOR_ID,                                0},
                    519:        {PLV1_NAT_D,                                    0},
                    520:        {PLV1_NAT_D_DRAFT_00_03,                0},
                    521:        {PLV1_FRAGMENT,                                 0},
                    522: };
                    523: 
                    524: /**
                    525:  * Message rule for AGGRESSIVE from initiator.
                    526:  */
                    527: static payload_rule_t aggressive_i_rules[] = {
                    528: /*     payload type                                    min     max                                             encr    suff */
                    529:        {PLV1_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    FALSE,  FALSE},
                    530:        {PLV1_SECURITY_ASSOCIATION,             0,      1,                                              FALSE,  FALSE},
                    531:        {PLV1_KEY_EXCHANGE,                             0,      1,                                              FALSE,  FALSE},
                    532:        {PLV1_NONCE,                                    0,      1,                                              FALSE,  FALSE},
                    533:        {PLV1_VENDOR_ID,                                0,      MAX_VID_PAYLOADS,               FALSE,  FALSE},
                    534:        {PLV1_CERTREQ,                                  0,      MAX_CERTREQ_PAYLOADS,   FALSE,  FALSE},
                    535:        {PLV1_NAT_D,                                    0,      MAX_NAT_D_PAYLOADS,             FALSE,  FALSE},
                    536:        {PLV1_NAT_D_DRAFT_00_03,                0,      MAX_NAT_D_PAYLOADS,             FALSE,  FALSE},
                    537:        {PLV1_ID,                                               0,      1,                                              FALSE,  FALSE},
                    538:        {PLV1_CERTIFICATE,                              0,      MAX_CERT_PAYLOADS,              TRUE,   FALSE},
                    539:        {PLV1_SIGNATURE,                                0,      1,                                              TRUE,   FALSE},
                    540:        {PLV1_HASH,                                             0,      1,                                              TRUE,   FALSE},
                    541:        {PLV1_FRAGMENT,                                 0,      1,                                              FALSE,  TRUE},
                    542: };
                    543: 
                    544: /**
                    545:  * payload order for AGGRESSIVE from initiator.
                    546:  */
                    547: static payload_order_t aggressive_i_order[] = {
                    548: /*     payload type                                    notify type */
                    549:        {PLV1_SECURITY_ASSOCIATION,             0},
                    550:        {PLV1_KEY_EXCHANGE,                             0},
                    551:        {PLV1_NONCE,                                    0},
                    552:        {PLV1_ID,                                               0},
                    553:        {PLV1_CERTIFICATE,                              0},
                    554:        {PLV1_CERTREQ,                                  0},
                    555:        {PLV1_NOTIFY,                                   0},
                    556:        {PLV1_VENDOR_ID,                                0},
                    557:        {PLV1_HASH,                                             0},
                    558:        {PLV1_NAT_D,                                    0},
                    559:        {PLV1_NAT_D_DRAFT_00_03,                0},
                    560:        {PLV1_SIGNATURE,                                0},
                    561:        {PLV1_FRAGMENT,                                 0},
                    562: };
                    563: 
                    564: /**
                    565:  * Message rule for AGGRESSIVE from responder.
                    566:  */
                    567: static payload_rule_t aggressive_r_rules[] = {
                    568: /*     payload type                                    min     max                                             encr    suff */
                    569:        {PLV1_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    FALSE,  FALSE},
                    570:        {PLV1_SECURITY_ASSOCIATION,             0,      1,                                              FALSE,  FALSE},
                    571:        {PLV1_KEY_EXCHANGE,                             0,      1,                                              FALSE,  FALSE},
                    572:        {PLV1_NONCE,                                    0,      1,                                              FALSE,  FALSE},
                    573:        {PLV1_VENDOR_ID,                                0,      MAX_VID_PAYLOADS,               FALSE,  FALSE},
                    574:        {PLV1_CERTREQ,                                  0,      MAX_CERTREQ_PAYLOADS,   FALSE,  FALSE},
                    575:        {PLV1_NAT_D,                                    0,      MAX_NAT_D_PAYLOADS,             FALSE,  FALSE},
                    576:        {PLV1_NAT_D_DRAFT_00_03,                0,      MAX_NAT_D_PAYLOADS,             FALSE,  FALSE},
                    577:        {PLV1_ID,                                               0,      1,                                              FALSE,  FALSE},
                    578:        {PLV1_CERTIFICATE,                              0,      MAX_CERT_PAYLOADS,              FALSE,  FALSE},
                    579:        {PLV1_SIGNATURE,                                0,      1,                                              FALSE,  FALSE},
                    580:        {PLV1_HASH,                                             0,      1,                                              FALSE,  FALSE},
                    581:        {PLV1_FRAGMENT,                                 0,      1,                                              FALSE,  TRUE},
                    582: };
                    583: 
                    584: /**
                    585:  * payload order for AGGRESSIVE from responder.
                    586:  */
                    587: static payload_order_t aggressive_r_order[] = {
                    588: /*     payload type                                    notify type */
                    589:        {PLV1_SECURITY_ASSOCIATION,             0},
                    590:        {PLV1_KEY_EXCHANGE,                             0},
                    591:        {PLV1_NONCE,                                    0},
                    592:        {PLV1_ID,                                               0},
                    593:        {PLV1_CERTIFICATE,                              0},
                    594:        {PLV1_CERTREQ,                                  0},
                    595:        {PLV1_NOTIFY,                                   0},
                    596:        {PLV1_VENDOR_ID,                                0},
                    597:        {PLV1_NAT_D,                                    0},
                    598:        {PLV1_NAT_D_DRAFT_00_03,                0},
                    599:        {PLV1_SIGNATURE,                                0},
                    600:        {PLV1_HASH,                                             0},
                    601:        {PLV1_FRAGMENT,                                 0},
                    602: };
                    603: 
                    604: /**
                    605:  * Message rule for INFORMATIONAL_V1 from initiator.
                    606:  */
                    607: static payload_rule_t informational_i_rules_v1[] = {
                    608: /*     payload type                                    min     max                                             encr    suff */
                    609:        {PLV1_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    FALSE,  FALSE},
                    610:        {PLV1_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    TRUE,   FALSE},
                    611:        {PLV1_DELETE,                                   0,      MAX_DELETE_PAYLOADS,    TRUE,   FALSE},
                    612:        {PLV1_VENDOR_ID,                                0,      MAX_VID_PAYLOADS,               TRUE,   FALSE},
                    613: };
                    614: 
                    615: /**
                    616:  * payload order for INFORMATIONAL_V1 from initiator.
                    617:  */
                    618: static payload_order_t informational_i_order_v1[] = {
                    619: /*     payload type                                    notify type */
                    620:        {PLV1_NOTIFY,                                   0},
                    621:        {PLV1_DELETE,                                   0},
                    622:        {PLV1_VENDOR_ID,                                0},
                    623: };
                    624: 
                    625: /**
                    626:  * Message rule for INFORMATIONAL_V1 from responder.
                    627:  */
                    628: static payload_rule_t informational_r_rules_v1[] = {
                    629: /*     payload type                                    min     max                                             encr    suff */
                    630:        {PLV1_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    FALSE,  FALSE},
                    631:        {PLV1_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    TRUE,   FALSE},
                    632:        {PLV1_DELETE,                                   0,      MAX_DELETE_PAYLOADS,    TRUE,   FALSE},
                    633:        {PLV1_VENDOR_ID,                                0,      MAX_VID_PAYLOADS,               TRUE,   FALSE},
                    634: };
                    635: 
                    636: /**
                    637:  * payload order for INFORMATIONAL_V1 from responder.
                    638:  */
                    639: static payload_order_t informational_r_order_v1[] = {
                    640: /*     payload type                                    notify type */
                    641:        {PLV1_NOTIFY,                                   0},
                    642:        {PLV1_DELETE,                                   0},
                    643:        {PLV1_VENDOR_ID,                                0},
                    644: };
                    645: 
                    646: /**
                    647:  * Message rule for QUICK_MODE from initiator.
                    648:  */
                    649: static payload_rule_t quick_mode_i_rules[] = {
                    650: /*     payload type                                    min     max                                             encr    suff */
                    651:        {PLV1_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    TRUE,   FALSE},
                    652:        {PLV1_VENDOR_ID,                                0,      MAX_VID_PAYLOADS,               TRUE,   FALSE},
                    653:        {PLV1_HASH,                                             0,      1,                                              TRUE,   FALSE},
                    654:        {PLV1_SECURITY_ASSOCIATION,             0,      2,                                              TRUE,   FALSE},
                    655:        {PLV1_NONCE,                                    0,      1,                                              TRUE,   FALSE},
                    656:        {PLV1_KEY_EXCHANGE,                             0,      1,                                              TRUE,   FALSE},
                    657:        {PLV1_ID,                                               0,      2,                                              TRUE,   FALSE},
                    658:        {PLV1_NAT_OA,                                   0,      2,                                              TRUE,   FALSE},
                    659:        {PLV1_NAT_OA_DRAFT_00_03,               0,      2,                                              TRUE,   FALSE},
                    660:        {PLV1_FRAGMENT,                                 0,      1,                                              FALSE,  TRUE},
                    661: };
                    662: 
                    663: /**
                    664:  * payload order for QUICK_MODE from initiator.
                    665:  */
                    666: static payload_order_t quick_mode_i_order[] = {
                    667: /*     payload type                                    notify type */
                    668:        {PLV1_NOTIFY,                                   0},
                    669:        {PLV1_VENDOR_ID,                                0},
                    670:        {PLV1_HASH,                                             0},
                    671:        {PLV1_SECURITY_ASSOCIATION,             0},
                    672:        {PLV1_NONCE,                                    0},
                    673:        {PLV1_KEY_EXCHANGE,                             0},
                    674:        {PLV1_ID,                                               0},
                    675:        {PLV1_NAT_OA,                                   0},
                    676:        {PLV1_NAT_OA_DRAFT_00_03,               0},
                    677:        {PLV1_FRAGMENT,                                 0},
                    678: };
                    679: 
                    680: /**
                    681:  * Message rule for QUICK_MODE from responder.
                    682:  */
                    683: static payload_rule_t quick_mode_r_rules[] = {
                    684: /*     payload type                                    min     max                                             encr    suff */
                    685:        {PLV1_NOTIFY,                                   0,      MAX_NOTIFY_PAYLOADS,    TRUE,   FALSE},
                    686:        {PLV1_VENDOR_ID,                                0,      MAX_VID_PAYLOADS,               TRUE,   FALSE},
                    687:        {PLV1_HASH,                                             0,      1,                                              TRUE,   FALSE},
                    688:        {PLV1_SECURITY_ASSOCIATION,             0,      2,                                              TRUE,   FALSE},
                    689:        {PLV1_NONCE,                                    0,      1,                                              TRUE,   FALSE},
                    690:        {PLV1_KEY_EXCHANGE,                             0,      1,                                              TRUE,   FALSE},
                    691:        {PLV1_ID,                                               0,      2,                                              TRUE,   FALSE},
                    692:        {PLV1_NAT_OA,                                   0,      2,                                              TRUE,   FALSE},
                    693:        {PLV1_NAT_OA_DRAFT_00_03,               0,      2,                                              TRUE,   FALSE},
                    694:        {PLV1_FRAGMENT,                                 0,      1,                                              FALSE,  TRUE},
                    695: };
                    696: 
                    697: /**
                    698:  * payload order for QUICK_MODE from responder.
                    699:  */
                    700: static payload_order_t quick_mode_r_order[] = {
                    701: /*     payload type                                    notify type */
                    702:        {PLV1_NOTIFY,                                   0},
                    703:        {PLV1_VENDOR_ID,                                0},
                    704:        {PLV1_HASH,                                             0},
                    705:        {PLV1_SECURITY_ASSOCIATION,             0},
                    706:        {PLV1_NONCE,                                    0},
                    707:        {PLV1_KEY_EXCHANGE,                             0},
                    708:        {PLV1_ID,                                               0},
                    709:        {PLV1_NAT_OA,                                   0},
                    710:        {PLV1_NAT_OA_DRAFT_00_03,               0},
                    711:        {PLV1_FRAGMENT,                                 0},
                    712: };
                    713: 
                    714: /**
                    715:  * Message rule for TRANSACTION.
                    716:  */
                    717: static payload_rule_t transaction_payload_rules_v1[] = {
                    718: /*     payload type                                    min     max     encr    suff */
                    719:        {PLV1_HASH,                                             0,      1,      TRUE,   FALSE},
                    720:        {PLV1_CONFIGURATION,                    1,      1,      FALSE,  FALSE},
                    721: };
                    722: 
                    723: /**
                    724:  * Payload order for TRANSACTION.
                    725:  */
                    726: static payload_order_t transaction_payload_order_v1[] = {
                    727: /*     payload type                                    notify type */
                    728:        {PLV1_HASH,                                             0},
                    729:        {PLV1_CONFIGURATION,                    0},
                    730: };
                    731: 
                    732: #endif /* USE_IKEV1 */
                    733: 
                    734: /**
                    735:  * Message rules, defines allowed payloads.
                    736:  */
                    737: static message_rule_t message_rules[] = {
                    738:        {IKE_SA_INIT,           TRUE,   FALSE,
                    739:                countof(ike_sa_init_i_rules), ike_sa_init_i_rules,
                    740:                countof(ike_sa_init_i_order), ike_sa_init_i_order,
                    741:        },
                    742:        {IKE_SA_INIT,           FALSE,  FALSE,
                    743:                countof(ike_sa_init_r_rules), ike_sa_init_r_rules,
                    744:                countof(ike_sa_init_r_order), ike_sa_init_r_order,
                    745:        },
                    746:        {IKE_AUTH,                      TRUE,   TRUE,
                    747:                countof(ike_auth_i_rules), ike_auth_i_rules,
                    748:                countof(ike_auth_i_order), ike_auth_i_order,
                    749:        },
                    750:        {IKE_AUTH,                      FALSE,  TRUE,
                    751:                countof(ike_auth_r_rules), ike_auth_r_rules,
                    752:                countof(ike_auth_r_order), ike_auth_r_order,
                    753:        },
                    754:        {INFORMATIONAL,         TRUE,   TRUE,
                    755:                countof(informational_i_rules), informational_i_rules,
                    756:                countof(informational_i_order), informational_i_order,
                    757:        },
                    758:        {INFORMATIONAL,         FALSE,  TRUE,
                    759:                countof(informational_r_rules), informational_r_rules,
                    760:                countof(informational_r_order), informational_r_order,
                    761:        },
                    762:        {CREATE_CHILD_SA,       TRUE,   TRUE,
                    763:                countof(create_child_sa_i_rules), create_child_sa_i_rules,
                    764:                countof(create_child_sa_i_order), create_child_sa_i_order,
                    765:        },
                    766:        {CREATE_CHILD_SA,       FALSE,  TRUE,
                    767:                countof(create_child_sa_r_rules), create_child_sa_r_rules,
                    768:                countof(create_child_sa_r_order), create_child_sa_r_order,
                    769:        },
                    770: #ifdef ME
                    771:        {ME_CONNECT,            TRUE,   TRUE,
                    772:                countof(me_connect_i_rules), me_connect_i_rules,
                    773:                countof(me_connect_i_order), me_connect_i_order,
                    774:        },
                    775:        {ME_CONNECT,            FALSE,  TRUE,
                    776:                countof(me_connect_r_rules), me_connect_r_rules,
                    777:                countof(me_connect_r_order), me_connect_r_order,
                    778:        },
                    779: #endif /* ME */
                    780: #ifdef USE_IKEV1
                    781:        {ID_PROT,                       TRUE,   FALSE,
                    782:                countof(id_prot_i_rules), id_prot_i_rules,
                    783:                countof(id_prot_i_order), id_prot_i_order,
                    784:        },
                    785:        {ID_PROT,                       FALSE,  FALSE,
                    786:                countof(id_prot_r_rules), id_prot_r_rules,
                    787:                countof(id_prot_r_order), id_prot_r_order,
                    788:        },
                    789:        {AGGRESSIVE,            TRUE,   FALSE,
                    790:                countof(aggressive_i_rules), aggressive_i_rules,
                    791:                countof(aggressive_i_order), aggressive_i_order,
                    792:        },
                    793:        {AGGRESSIVE,            FALSE,  FALSE,
                    794:                countof(aggressive_r_rules), aggressive_r_rules,
                    795:                countof(aggressive_r_order), aggressive_r_order,
                    796:        },
                    797:        {INFORMATIONAL_V1,      TRUE,   TRUE,
                    798:                countof(informational_i_rules_v1), informational_i_rules_v1,
                    799:                countof(informational_i_order_v1), informational_i_order_v1,
                    800:        },
                    801:        {INFORMATIONAL_V1,      FALSE,  TRUE,
                    802:                countof(informational_r_rules_v1), informational_r_rules_v1,
                    803:                countof(informational_r_order_v1), informational_r_order_v1,
                    804:        },
                    805:        {QUICK_MODE,            TRUE,   TRUE,
                    806:                countof(quick_mode_i_rules), quick_mode_i_rules,
                    807:                countof(quick_mode_i_order), quick_mode_i_order,
                    808:        },
                    809:        {QUICK_MODE,            FALSE,  TRUE,
                    810:                countof(quick_mode_r_rules), quick_mode_r_rules,
                    811:                countof(quick_mode_r_order), quick_mode_r_order,
                    812:        },
                    813:        {TRANSACTION,           TRUE,   TRUE,
                    814:                countof(transaction_payload_rules_v1), transaction_payload_rules_v1,
                    815:                countof(transaction_payload_order_v1), transaction_payload_order_v1,
                    816:        },
                    817:        {TRANSACTION,           FALSE,  TRUE,
                    818:                countof(transaction_payload_rules_v1), transaction_payload_rules_v1,
                    819:                countof(transaction_payload_order_v1), transaction_payload_order_v1,
                    820:        },
                    821:        /* TODO-IKEv1: define rules for other exchanges */
                    822: #endif /* USE_IKEV1 */
                    823: };
                    824: 
                    825: /**
                    826:  * Data for fragment reassembly.
                    827:  */
                    828: typedef struct {
                    829: 
                    830:        /**
                    831:         * For IKEv1 the number of the last fragment (in case we receive them out
                    832:         * of order), since the first one starts with 1 this defines the number of
                    833:         * fragments we expect.
                    834:         * For IKEv2 we store the total number of fragment we received last.
                    835:         */
                    836:        uint16_t last;
                    837: 
                    838:        /**
                    839:         * Length of all currently received fragments.
                    840:         */
                    841:        size_t len;
                    842: 
                    843:        /**
                    844:         * Maximum length of a fragmented packet.
                    845:         */
                    846:        size_t max_packet;
                    847: 
                    848: } fragment_data_t;
                    849: 
                    850: typedef struct private_message_t private_message_t;
                    851: 
                    852: /**
                    853:  * Private data of an message_t object.
                    854:  */
                    855: struct private_message_t {
                    856: 
                    857:        /**
                    858:         * Public part of a message_t object.
                    859:         */
                    860:        message_t public;
                    861: 
                    862:        /**
                    863:         * Minor version of message.
                    864:         */
                    865:        uint8_t major_version;
                    866: 
                    867:        /**
                    868:         * Major version of message.
                    869:         */
                    870:        uint8_t minor_version;
                    871: 
                    872:        /**
                    873:         * First Payload in message.
                    874:         */
                    875:        payload_type_t first_payload;
                    876: 
                    877:        /**
                    878:         * Assigned exchange type.
                    879:         */
                    880:        exchange_type_t exchange_type;
                    881: 
                    882:        /**
                    883:         * TRUE if message is a request, FALSE if a reply.
                    884:         */
                    885:        bool is_request;
                    886: 
                    887:        /**
                    888:         * The message is encrypted (IKEv1)
                    889:         */
                    890:        bool is_encrypted;
                    891: 
                    892:        /**
                    893:         * Higher version supported?
                    894:         */
                    895:        bool version_flag;
                    896: 
                    897:        /**
                    898:         * Reserved bits in IKE header
                    899:         */
                    900:        bool reserved[2];
                    901: 
                    902:        /**
                    903:         * Sorting of message disabled?
                    904:         */
                    905:        bool sort_disabled;
                    906: 
                    907:        /**
                    908:         * Message ID of this message.
                    909:         */
                    910:        uint32_t message_id;
                    911: 
                    912:        /**
                    913:         * ID of assigned IKE_SA.
                    914:         */
                    915:        ike_sa_id_t *ike_sa_id;
                    916: 
                    917:        /**
                    918:         * Assigned UDP packet, stores incoming packet or last generated one.
                    919:         */
                    920:        packet_t *packet;
                    921: 
                    922:        /**
                    923:         * Array of generated fragments (if any), as packet_t*.
                    924:         * If defragmenting (i.e. frag != NULL) this contains fragment_t*
                    925:         */
                    926:        array_t *fragments;
                    927: 
                    928:        /**
                    929:         * Linked List where payload data are stored in.
                    930:         */
                    931:        linked_list_t *payloads;
                    932: 
                    933:         /**
                    934:          * Assigned parser to parse Header and Body of this message.
                    935:          */
                    936:        parser_t *parser;
                    937: 
                    938:        /**
                    939:         * The message rule for this message instance
                    940:         */
                    941:        message_rule_t *rule;
                    942: 
                    943:        /**
                    944:         * Data used to reassemble a fragmented message
                    945:         */
                    946:        fragment_data_t *frag;
                    947: };
                    948: 
                    949: /**
                    950:  * Maximum number of fragments we will handle
                    951:  */
                    952: #define MAX_FRAGMENTS 255
                    953: 
                    954: /**
                    955:  * A single fragment within a fragmented message
                    956:  */
                    957: typedef struct {
                    958: 
                    959:        /** fragment number */
                    960:        uint8_t num;
                    961: 
                    962:        /** fragment data */
                    963:        chunk_t data;
                    964: 
                    965: } fragment_t;
                    966: 
                    967: static void fragment_destroy(fragment_t *this)
                    968: {
                    969:        chunk_free(&this->data);
                    970:        free(this);
                    971: }
                    972: 
                    973: static void reset_defrag(private_message_t *this)
                    974: {
                    975:        array_destroy_function(this->fragments, (void*)fragment_destroy, NULL);
                    976:        this->fragments = NULL;
                    977:        this->frag->last = 0;
                    978:        this->frag->len = 0;
                    979: }
                    980: 
                    981: /**
                    982:  * Get the message rule that applies to this message
                    983:  */
                    984: static message_rule_t* get_message_rule(private_message_t *this)
                    985: {
                    986:        int i;
                    987: 
                    988:        for (i = 0; i < countof(message_rules); i++)
                    989:        {
                    990:                if ((this->exchange_type == message_rules[i].exchange_type) &&
                    991:                        (this->is_request == message_rules[i].is_request))
                    992:                {
                    993:                        return &message_rules[i];
                    994:                }
                    995:        }
                    996:        return NULL;
                    997: }
                    998: 
                    999: /**
                   1000:  * Look up a payload rule
                   1001:  */
                   1002: static payload_rule_t* get_payload_rule(private_message_t *this,
                   1003:                                                                                payload_type_t type)
                   1004: {
                   1005:        int i;
                   1006: 
                   1007:        for (i = 0; i < this->rule->rule_count;i++)
                   1008:        {
                   1009:                if (this->rule->rules[i].type == type)
                   1010:                {
                   1011:                        return &this->rule->rules[i];
                   1012:                }
                   1013:        }
                   1014:        return NULL;
                   1015: }
                   1016: 
                   1017: METHOD(message_t, set_ike_sa_id, void,
                   1018:        private_message_t *this,ike_sa_id_t *ike_sa_id)
                   1019: {
                   1020:        DESTROY_IF(this->ike_sa_id);
                   1021:        this->ike_sa_id = ike_sa_id->clone(ike_sa_id);
                   1022: }
                   1023: 
                   1024: METHOD(message_t, get_ike_sa_id, ike_sa_id_t*,
                   1025:        private_message_t *this)
                   1026: {
                   1027:        return this->ike_sa_id;
                   1028: }
                   1029: 
                   1030: METHOD(message_t, set_message_id, void,
                   1031:        private_message_t *this,uint32_t message_id)
                   1032: {
                   1033:        this->message_id = message_id;
                   1034: }
                   1035: 
                   1036: METHOD(message_t, get_message_id, uint32_t,
                   1037:        private_message_t *this)
                   1038: {
                   1039:        return this->message_id;
                   1040: }
                   1041: 
                   1042: METHOD(message_t, get_initiator_spi, uint64_t,
                   1043:        private_message_t *this)
                   1044: {
                   1045:        return (this->ike_sa_id->get_initiator_spi(this->ike_sa_id));
                   1046: }
                   1047: 
                   1048: METHOD(message_t, get_responder_spi, uint64_t,
                   1049:        private_message_t *this)
                   1050: {
                   1051:        return (this->ike_sa_id->get_responder_spi(this->ike_sa_id));
                   1052: }
                   1053: 
                   1054: METHOD(message_t, set_major_version, void,
                   1055:        private_message_t *this, uint8_t major_version)
                   1056: {
                   1057:        this->major_version = major_version;
                   1058: }
                   1059: 
                   1060: METHOD(message_t, get_major_version, uint8_t,
                   1061:        private_message_t *this)
                   1062: {
                   1063:        return this->major_version;
                   1064: }
                   1065: 
                   1066: METHOD(message_t, set_minor_version, void,
                   1067:        private_message_t *this,uint8_t minor_version)
                   1068: {
                   1069:        this->minor_version = minor_version;
                   1070: }
                   1071: 
                   1072: METHOD(message_t, get_minor_version, uint8_t,
                   1073:        private_message_t *this)
                   1074: {
                   1075:        return this->minor_version;
                   1076: }
                   1077: 
                   1078: METHOD(message_t, set_exchange_type, void,
                   1079:        private_message_t *this, exchange_type_t exchange_type)
                   1080: {
                   1081:        this->exchange_type = exchange_type;
                   1082: }
                   1083: 
                   1084: METHOD(message_t, get_exchange_type, exchange_type_t,
                   1085:        private_message_t *this)
                   1086: {
                   1087:        return this->exchange_type;
                   1088: }
                   1089: 
                   1090: METHOD(message_t, get_first_payload_type, payload_type_t,
                   1091:        private_message_t *this)
                   1092: {
                   1093:        return this->first_payload;
                   1094: }
                   1095: 
                   1096: METHOD(message_t, set_request, void,
                   1097:        private_message_t *this, bool request)
                   1098: {
                   1099:        this->is_request = request;
                   1100: }
                   1101: 
                   1102: METHOD(message_t, get_request, bool,
                   1103:        private_message_t *this)
                   1104: {
                   1105:        return this->is_request;
                   1106: }
                   1107: 
                   1108: METHOD(message_t, set_version_flag, void,
                   1109:        private_message_t *this)
                   1110: {
                   1111:        this->version_flag = TRUE;
                   1112: }
                   1113: 
                   1114: METHOD(message_t, get_reserved_header_bit, bool,
                   1115:        private_message_t *this, u_int nr)
                   1116: {
                   1117:        if (nr < countof(this->reserved))
                   1118:        {
                   1119:                return this->reserved[nr];
                   1120:        }
                   1121:        return FALSE;
                   1122: }
                   1123: 
                   1124: METHOD(message_t, set_reserved_header_bit, void,
                   1125:        private_message_t *this, u_int nr)
                   1126: {
                   1127:        if (nr < countof(this->reserved))
                   1128:        {
                   1129:                this->reserved[nr] = TRUE;
                   1130:        }
                   1131: }
                   1132: 
                   1133: METHOD(message_t, is_encoded, bool,
                   1134:        private_message_t *this)
                   1135: {
                   1136:        return this->packet->get_data(this->packet).ptr != NULL;
                   1137: }
                   1138: 
                   1139: METHOD(message_t, is_fragmented, bool,
                   1140:        private_message_t *this)
                   1141: {
                   1142:        return array_count(this->fragments) > 0;
                   1143: }
                   1144: 
                   1145: METHOD(message_t, add_payload, void,
                   1146:        private_message_t *this, payload_t *payload)
                   1147: {
                   1148:        payload_t *last_payload;
                   1149: 
                   1150:        if (this->payloads->get_count(this->payloads) > 0)
                   1151:        {
                   1152:                this->payloads->get_last(this->payloads, (void **)&last_payload);
                   1153:                last_payload->set_next_type(last_payload, payload->get_type(payload));
                   1154:        }
                   1155:        else
                   1156:        {
                   1157:                this->first_payload = payload->get_type(payload);
                   1158:        }
                   1159:        payload->set_next_type(payload, PL_NONE);
                   1160:        this->payloads->insert_last(this->payloads, payload);
                   1161: 
                   1162:        DBG2(DBG_ENC ,"added payload of type %N to message",
                   1163:                 payload_type_names, payload->get_type(payload));
                   1164: }
                   1165: 
                   1166: METHOD(message_t, add_notify, void,
                   1167:        private_message_t *this, bool flush, notify_type_t type, chunk_t data)
                   1168: {
                   1169:        notify_payload_t *notify;
                   1170:        payload_t *payload;
                   1171: 
                   1172:        if (flush)
                   1173:        {
                   1174:                while (this->payloads->remove_last(this->payloads,
                   1175:                                                                                                (void**)&payload) == SUCCESS)
                   1176:                {
                   1177:                        payload->destroy(payload);
                   1178:                }
                   1179:        }
                   1180:        if (this->major_version == IKEV2_MAJOR_VERSION)
                   1181:        {
                   1182:                notify = notify_payload_create(PLV2_NOTIFY);
                   1183:        }
                   1184:        else
                   1185:        {
                   1186:                notify = notify_payload_create(PLV1_NOTIFY);
                   1187:        }
                   1188:        notify->set_notify_type(notify, type);
                   1189:        notify->set_notification_data(notify, data);
                   1190:        add_payload(this, (payload_t*)notify);
                   1191: }
                   1192: 
                   1193: METHOD(message_t, set_source, void,
                   1194:        private_message_t *this, host_t *host)
                   1195: {
                   1196:        this->packet->set_source(this->packet, host);
                   1197: }
                   1198: 
                   1199: METHOD(message_t, set_destination, void,
                   1200:        private_message_t *this, host_t *host)
                   1201: {
                   1202:        this->packet->set_destination(this->packet, host);
                   1203: }
                   1204: 
                   1205: METHOD(message_t, get_source, host_t*,
                   1206:        private_message_t *this)
                   1207: {
                   1208:        return this->packet->get_source(this->packet);
                   1209: }
                   1210: 
                   1211: METHOD(message_t, get_destination, host_t*,
                   1212:        private_message_t *this)
                   1213: {
                   1214:        return this->packet->get_destination(this->packet);
                   1215: }
                   1216: 
                   1217: METHOD(message_t, create_payload_enumerator, enumerator_t*,
                   1218:        private_message_t *this)
                   1219: {
                   1220:        return this->payloads->create_enumerator(this->payloads);
                   1221: }
                   1222: 
                   1223: METHOD(message_t, remove_payload_at, void,
                   1224:        private_message_t *this, enumerator_t *enumerator)
                   1225: {
                   1226:        this->payloads->remove_at(this->payloads, enumerator);
                   1227: }
                   1228: 
                   1229: METHOD(message_t, get_payload, payload_t*,
                   1230:        private_message_t *this, payload_type_t type)
                   1231: {
                   1232:        payload_t *current, *found = NULL;
                   1233:        enumerator_t *enumerator;
                   1234: 
                   1235:        enumerator = create_payload_enumerator(this);
                   1236:        while (enumerator->enumerate(enumerator, &current))
                   1237:        {
                   1238:                if (current->get_type(current) == type)
                   1239:                {
                   1240:                        found = current;
                   1241:                        break;
                   1242:                }
                   1243:        }
                   1244:        enumerator->destroy(enumerator);
                   1245:        return found;
                   1246: }
                   1247: 
                   1248: METHOD(message_t, get_notify, notify_payload_t*,
                   1249:        private_message_t *this, notify_type_t type)
                   1250: {
                   1251:        enumerator_t *enumerator;
                   1252:        notify_payload_t *notify = NULL;
                   1253:        payload_t *payload;
                   1254: 
                   1255:        enumerator = create_payload_enumerator(this);
                   1256:        while (enumerator->enumerate(enumerator, &payload))
                   1257:        {
                   1258:                if (payload->get_type(payload) == PLV2_NOTIFY ||
                   1259:                        payload->get_type(payload) == PLV1_NOTIFY)
                   1260:                {
                   1261:                        notify = (notify_payload_t*)payload;
                   1262:                        if (notify->get_notify_type(notify) == type)
                   1263:                        {
                   1264:                                break;
                   1265:                        }
                   1266:                        notify = NULL;
                   1267:                }
                   1268:        }
                   1269:        enumerator->destroy(enumerator);
                   1270:        return notify;
                   1271: }
                   1272: 
                   1273: /**
                   1274:  * get a string representation of the message
                   1275:  */
                   1276: static char* get_string(private_message_t *this, char *buf, int len)
                   1277: {
                   1278:        enumerator_t *enumerator;
                   1279:        payload_t *payload;
                   1280:        int written;
                   1281:        char *pos = buf;
                   1282: 
                   1283:        memset(buf, 0, len);
                   1284:        len--;
                   1285: 
                   1286:        written = snprintf(pos, len, "%N %s %u [",
                   1287:                                           exchange_type_names, this->exchange_type,
                   1288:                                           this->is_request ? "request" : "response",
                   1289:                                           this->message_id);
                   1290:        if (written >= len || written < 0)
                   1291:        {
                   1292:                return "";
                   1293:        }
                   1294:        pos += written;
                   1295:        len -= written;
                   1296: 
                   1297:        enumerator = create_payload_enumerator(this);
                   1298:        while (enumerator->enumerate(enumerator, &payload))
                   1299:        {
                   1300:                written = snprintf(pos, len, " %N", payload_type_short_names,
                   1301:                                                   payload->get_type(payload));
                   1302:                if (written >= len || written < 0)
                   1303:                {
                   1304:                        return buf;
                   1305:                }
                   1306:                pos += written;
                   1307:                len -= written;
                   1308:                if (payload->get_type(payload) == PLV2_NOTIFY ||
                   1309:                        payload->get_type(payload) == PLV1_NOTIFY)
                   1310:                {
                   1311:                        notify_payload_t *notify;
                   1312:                        notify_type_t type;
                   1313:                        chunk_t data;
                   1314: 
                   1315:                        notify = (notify_payload_t*)payload;
                   1316:                        type = notify->get_notify_type(notify);
                   1317:                        data = notify->get_notification_data(notify);
                   1318:                        if (type == MS_NOTIFY_STATUS && data.len == 4)
                   1319:                        {
                   1320:                                written = snprintf(pos, len, "(%N(%d))", notify_type_short_names,
                   1321:                                                                   type, untoh32(data.ptr));
                   1322:                        }
                   1323:                        else
                   1324:                        {
                   1325:                                written = snprintf(pos, len, "(%N)", notify_type_short_names,
                   1326:                                                                   type);
                   1327:                        }
                   1328:                        if (written >= len || written < 0)
                   1329:                        {
                   1330:                                return buf;
                   1331:                        }
                   1332:                        pos += written;
                   1333:                        len -= written;
                   1334:                }
                   1335:                if (payload->get_type(payload) == PLV2_EAP)
                   1336:                {
                   1337:                        eap_payload_t *eap = (eap_payload_t*)payload;
                   1338:                        uint32_t vendor;
                   1339:                        eap_type_t type;
                   1340:                        char method[64] = "";
                   1341: 
                   1342:                        type = eap->get_type(eap, &vendor);
                   1343:                        if (type)
                   1344:                        {
                   1345:                                if (vendor)
                   1346:                                {
                   1347:                                        snprintf(method, sizeof(method), "/%d-%d", type, vendor);
                   1348:                                }
                   1349:                                else
                   1350:                                {
                   1351:                                        snprintf(method, sizeof(method), "/%N",
                   1352:                                                         eap_type_short_names, type);
                   1353:                                }
                   1354:                        }
                   1355:                        written = snprintf(pos, len, "/%N%s", eap_code_short_names,
                   1356:                                                           eap->get_code(eap), method);
                   1357:                        if (written >= len || written < 0)
                   1358:                        {
                   1359:                                return buf;
                   1360:                        }
                   1361:                        pos += written;
                   1362:                        len -= written;
                   1363:                }
                   1364:                if (payload->get_type(payload) == PLV2_CONFIGURATION ||
                   1365:                        payload->get_type(payload) == PLV1_CONFIGURATION)
                   1366:                {
                   1367:                        cp_payload_t *cp = (cp_payload_t*)payload;
                   1368:                        enumerator_t *attributes;
                   1369:                        configuration_attribute_t *attribute;
                   1370:                        bool first = TRUE;
                   1371:                        char *pfx;
                   1372: 
                   1373:                        switch (cp->get_type(cp))
                   1374:                        {
                   1375:                                case CFG_REQUEST:
                   1376:                                        pfx = "RQ(";
                   1377:                                        break;
                   1378:                                case CFG_REPLY:
                   1379:                                        pfx = "RP(";
                   1380:                                        break;
                   1381:                                case CFG_SET:
                   1382:                                        pfx = "S(";
                   1383:                                        break;
                   1384:                                case CFG_ACK:
                   1385:                                        pfx = "A(";
                   1386:                                        break;
                   1387:                                default:
                   1388:                                        pfx = "(";
                   1389:                                        break;
                   1390:                        }
                   1391: 
                   1392:                        attributes = cp->create_attribute_enumerator(cp);
                   1393:                        while (attributes->enumerate(attributes, &attribute))
                   1394:                        {
                   1395:                                written = snprintf(pos, len, "%s%N", first ? pfx : " ",
                   1396:                                                                   configuration_attribute_type_short_names,
                   1397:                                                                   attribute->get_type(attribute));
                   1398:                                if (written >= len || written < 0)
                   1399:                                {
                   1400:                                        return buf;
                   1401:                                }
                   1402:                                pos += written;
                   1403:                                len -= written;
                   1404:                                first = FALSE;
                   1405:                        }
                   1406:                        attributes->destroy(attributes);
                   1407:                        if (!first)
                   1408:                        {
                   1409:                                written = snprintf(pos, len, ")");
                   1410:                                if (written >= len || written < 0)
                   1411:                                {
                   1412:                                        return buf;
                   1413:                                }
                   1414:                                pos += written;
                   1415:                                len -= written;
                   1416:                        }
                   1417:                }
                   1418:                if (payload->get_type(payload) == PLV1_FRAGMENT)
                   1419:                {
                   1420:                        fragment_payload_t *frag;
                   1421: 
                   1422:                        frag = (fragment_payload_t*)payload;
                   1423:                        if (frag->is_last(frag))
                   1424:                        {
                   1425:                                written = snprintf(pos, len, "(%u/%u)",
                   1426:                                                        frag->get_number(frag), frag->get_number(frag));
                   1427:                        }
                   1428:                        else
                   1429:                        {
                   1430:                                written = snprintf(pos, len, "(%u)", frag->get_number(frag));
                   1431:                        }
                   1432:                        if (written >= len || written < 0)
                   1433:                        {
                   1434:                                return buf;
                   1435:                        }
                   1436:                        pos += written;
                   1437:                        len -= written;
                   1438:                }
                   1439:                if (payload->get_type(payload) == PLV2_FRAGMENT)
                   1440:                {
                   1441:                        encrypted_fragment_payload_t *frag;
                   1442: 
                   1443:                        frag = (encrypted_fragment_payload_t*)payload;
                   1444:                        written = snprintf(pos, len, "(%u/%u)",
                   1445:                                                           frag->get_fragment_number(frag),
                   1446:                                                           frag->get_total_fragments(frag));
                   1447:                        if (written >= len || written < 0)
                   1448:                        {
                   1449:                                return buf;
                   1450:                        }
                   1451:                        pos += written;
                   1452:                        len -= written;
                   1453:                }
                   1454:                if (payload->get_type(payload) == PL_UNKNOWN)
                   1455:                {
                   1456:                        unknown_payload_t *unknown;
                   1457: 
                   1458:                        unknown = (unknown_payload_t*)payload;
                   1459:                        written = snprintf(pos, len, "(%d)", unknown->get_type(unknown));
                   1460:                        if (written >= len || written < 0)
                   1461:                        {
                   1462:                                return buf;
                   1463:                        }
                   1464:                        pos += written;
                   1465:                        len -= written;
                   1466:                }
                   1467:        }
                   1468:        enumerator->destroy(enumerator);
                   1469: 
                   1470:        /* remove last space */
                   1471:        snprintf(pos, len, " ]");
                   1472:        return buf;
                   1473: }
                   1474: 
                   1475: METHOD(message_t, disable_sort, void,
                   1476:        private_message_t *this)
                   1477: {
                   1478:        this->sort_disabled = TRUE;
                   1479: }
                   1480: 
                   1481: /**
                   1482:  * reorder payloads depending on reordering rules
                   1483:  */
                   1484: static void order_payloads(private_message_t *this)
                   1485: {
                   1486:        linked_list_t *list;
                   1487:        payload_t *payload;
                   1488:        int i;
                   1489: 
                   1490:        DBG2(DBG_ENC, "order payloads in message");
                   1491: 
                   1492:        /* move to temp list */
                   1493:        list = linked_list_create();
                   1494:        while (this->payloads->remove_last(this->payloads,
                   1495:                                                                           (void**)&payload) == SUCCESS)
                   1496:        {
                   1497:                list->insert_first(list, payload);
                   1498:        }
                   1499:        /* for each rule, ... */
                   1500:        for (i = 0; i < this->rule->order_count; i++)
                   1501:        {
                   1502:                enumerator_t *enumerator;
                   1503:                notify_payload_t *notify;
                   1504:                payload_order_t order;
                   1505: 
                   1506:                order = this->rule->order[i];
                   1507: 
                   1508:                /* ... find all payload ... */
                   1509:                enumerator = list->create_enumerator(list);
                   1510:                while (enumerator->enumerate(enumerator, &payload))
                   1511:                {
                   1512:                        /* ... with that type ... */
                   1513:                        if (payload->get_type(payload) == order.type)
                   1514:                        {
                   1515:                                notify = (notify_payload_t*)payload;
                   1516: 
                   1517:                                /**... and check notify for type. */
                   1518:                                if (order.type != PLV2_NOTIFY || order.notify == 0 ||
                   1519:                                        order.notify == notify->get_notify_type(notify))
                   1520:                                {
                   1521:                                        list->remove_at(list, enumerator);
                   1522:                                        add_payload(this, payload);
                   1523:                                }
                   1524:                        }
                   1525:                }
                   1526:                enumerator->destroy(enumerator);
                   1527:        }
                   1528:        /* append all payloads without a rule to the end */
                   1529:        while (list->remove_last(list, (void**)&payload) == SUCCESS)
                   1530:        {
                   1531:                /* do not complain about payloads in private use space */
                   1532:                if (payload->get_type(payload) < 128)
                   1533:                {
                   1534:                        DBG1(DBG_ENC, "payload %N has no ordering rule in %N %s",
                   1535:                                 payload_type_names, payload->get_type(payload),
                   1536:                                 exchange_type_names, this->rule->exchange_type,
                   1537:                                 this->rule->is_request ? "request" : "response");
                   1538:                }
                   1539:                add_payload(this, payload);
                   1540:        }
                   1541:        list->destroy(list);
                   1542: }
                   1543: 
                   1544: /**
                   1545:  * Wrap payloads in an encrypted payload
                   1546:  */
                   1547: static encrypted_payload_t* wrap_payloads(private_message_t *this)
                   1548: {
                   1549:        encrypted_payload_t *encrypted = NULL;
                   1550:        linked_list_t *payloads;
                   1551:        payload_t *current;
                   1552: 
                   1553:        /* move all payloads to a temporary list */
                   1554:        payloads = linked_list_create();
                   1555:        while (this->payloads->remove_first(this->payloads,
                   1556:                                                                                (void**)&current) == SUCCESS)
                   1557:        {
                   1558:                if (current->get_type(current) == PLV2_FRAGMENT)
                   1559:                {       /* treat encrypted fragment payload as encrypted payload */
                   1560:                        encrypted = (encrypted_payload_t*)current;
                   1561:                }
                   1562:                else
                   1563:                {
                   1564:                        payloads->insert_last(payloads, current);
                   1565:                }
                   1566:        }
                   1567:        if (encrypted)
                   1568:        {       /* simply adopt all the unencrypted payloads */
                   1569:                this->payloads->destroy(this->payloads);
                   1570:                this->payloads = payloads;
                   1571:                return encrypted;
                   1572:        }
                   1573: 
                   1574:        if (this->is_encrypted)
                   1575:        {
                   1576:                encrypted = encrypted_payload_create(PLV1_ENCRYPTED);
                   1577:        }
                   1578:        else
                   1579:        {
                   1580:                encrypted = encrypted_payload_create(PLV2_ENCRYPTED);
                   1581:        }
                   1582:        while (payloads->remove_first(payloads, (void**)&current) == SUCCESS)
                   1583:        {
                   1584:                payload_rule_t *rule;
                   1585:                payload_type_t type;
                   1586:                bool encrypt = TRUE;
                   1587: 
                   1588:                type = current->get_type(current);
                   1589:                rule = get_payload_rule(this, type);
                   1590:                if (rule)
                   1591:                {
                   1592:                        encrypt = rule->encrypted;
                   1593:                }
                   1594:                if (encrypt || this->is_encrypted)
                   1595:                {       /* encryption is forced for IKEv1 */
                   1596:                        DBG2(DBG_ENC, "insert payload %N into encrypted payload",
                   1597:                                 payload_type_names, type);
                   1598:                        encrypted->add_payload(encrypted, current);
                   1599:                }
                   1600:                else
                   1601:                {
                   1602:                        DBG2(DBG_ENC, "insert payload %N unencrypted",
                   1603:                                 payload_type_names, type);
                   1604:                        add_payload(this, current);
                   1605:                }
                   1606:        }
                   1607:        payloads->destroy(payloads);
                   1608: 
                   1609:        return encrypted;
                   1610: }
                   1611: 
                   1612: /**
                   1613:  * Creates the IKE header for this message
                   1614:  */
                   1615: static ike_header_t *create_header(private_message_t *this)
                   1616: {
                   1617:        ike_header_t *ike_header;
                   1618:        bool *reserved;
                   1619:        int i;
                   1620: 
                   1621:        ike_header = ike_header_create_version(this->major_version,
                   1622:                                                                                   this->minor_version);
                   1623:        ike_header->set_exchange_type(ike_header, this->exchange_type);
                   1624:        ike_header->set_message_id(ike_header, this->message_id);
                   1625:        if (this->major_version == IKEV2_MAJOR_VERSION)
                   1626:        {
                   1627:                ike_header->set_response_flag(ike_header, !this->is_request);
                   1628:                ike_header->set_version_flag(ike_header, this->version_flag);
                   1629:                ike_header->set_initiator_flag(ike_header,
                   1630:                                                this->ike_sa_id->is_initiator(this->ike_sa_id));
                   1631:        }
                   1632:        else
                   1633:        {
                   1634:                ike_header->set_encryption_flag(ike_header, this->is_encrypted);
                   1635:        }
                   1636:        ike_header->set_initiator_spi(ike_header,
                   1637:                                                this->ike_sa_id->get_initiator_spi(this->ike_sa_id));
                   1638:        ike_header->set_responder_spi(ike_header,
                   1639:                                                this->ike_sa_id->get_responder_spi(this->ike_sa_id));
                   1640: 
                   1641:        for (i = 0; i < countof(this->reserved); i++)
                   1642:        {
                   1643:                reserved = payload_get_field(&ike_header->payload_interface,
                   1644:                                                                         RESERVED_BIT, i);
                   1645:                if (reserved)
                   1646:                {
                   1647:                        *reserved = this->reserved[i];
                   1648:                }
                   1649:        }
                   1650:        return ike_header;
                   1651: }
                   1652: 
                   1653: /**
                   1654:  * Generates the message, if needed, wraps the payloads in an encrypted payload.
                   1655:  *
                   1656:  * The generator and the possible encrypted payload are returned.  The latter
                   1657:  * is not yet encrypted (but the transform is set).  It is also not added to
                   1658:  * the payload list (so unless there are unencrypted payloads that list will
                   1659:  * be empty afterwards).
                   1660:  */
                   1661: static status_t generate_message(private_message_t *this, keymat_t *keymat,
                   1662:                                generator_t **out_generator, encrypted_payload_t **encrypted)
                   1663: {
                   1664:        keymat_v1_t *keymat_v1 = (keymat_v1_t*)keymat;
                   1665:        generator_t *generator;
                   1666:        payload_type_t next_type;
                   1667:        enumerator_t *enumerator;
                   1668:        aead_t *aead = NULL;
                   1669:        chunk_t hash = chunk_empty;
                   1670:        char str[BUF_LEN];
                   1671:        ike_header_t *ike_header;
                   1672:        payload_t *payload, *next;
                   1673:        bool encrypting = FALSE;
                   1674: 
                   1675:        if (this->exchange_type == EXCHANGE_TYPE_UNDEFINED)
                   1676:        {
                   1677:                DBG1(DBG_ENC, "exchange type is not defined");
                   1678:                return INVALID_STATE;
                   1679:        }
                   1680: 
                   1681:        if (this->packet->get_source(this->packet) == NULL ||
                   1682:                this->packet->get_destination(this->packet) == NULL)
                   1683:        {
                   1684:                DBG1(DBG_ENC, "source/destination not defined");
                   1685:                return INVALID_STATE;
                   1686:        }
                   1687: 
                   1688:        this->rule = get_message_rule(this);
                   1689:        if (!this->rule)
                   1690:        {
                   1691:                DBG1(DBG_ENC, "no message rules specified for this message type");
                   1692:                return NOT_SUPPORTED;
                   1693:        }
                   1694: 
                   1695:        if (!this->sort_disabled)
                   1696:        {
                   1697:                order_payloads(this);
                   1698:        }
                   1699: 
                   1700:        if (keymat && keymat->get_version(keymat) == IKEV1)
                   1701:        {
                   1702:                /* get a hash for this message, if any is required */
                   1703:                if (keymat_v1->get_hash_phase2(keymat_v1, &this->public, &hash))
                   1704:                {       /* insert a HASH payload as first payload */
                   1705:                        hash_payload_t *hash_payload;
                   1706: 
                   1707:                        hash_payload = hash_payload_create(PLV1_HASH);
                   1708:                        hash_payload->set_hash(hash_payload, hash);
                   1709:                        this->payloads->insert_first(this->payloads, hash_payload);
                   1710:                        if (this->exchange_type == INFORMATIONAL_V1)
                   1711:                        {
                   1712:                                this->is_encrypted = encrypting = TRUE;
                   1713:                        }
                   1714:                        chunk_free(&hash);
                   1715:                }
                   1716:        }
                   1717: 
                   1718:        if (this->major_version == IKEV2_MAJOR_VERSION)
                   1719:        {
                   1720:                encrypting = this->rule->encrypted;
                   1721:        }
                   1722:        else if (!encrypting)
                   1723:        {
                   1724:                /* If at least one payload requires encryption, encrypt the message.
                   1725:                 * If no key material is available, the flag will be reset below. */
                   1726:                enumerator = this->payloads->create_enumerator(this->payloads);
                   1727:                while (enumerator->enumerate(enumerator, (void**)&payload))
                   1728:                {
                   1729:                        payload_rule_t *rule;
                   1730: 
                   1731:                        rule = get_payload_rule(this, payload->get_type(payload));
                   1732:                        if (rule && rule->encrypted)
                   1733:                        {
                   1734:                                this->is_encrypted = encrypting = TRUE;
                   1735:                                break;
                   1736:                        }
                   1737:                }
                   1738:                enumerator->destroy(enumerator);
                   1739:        }
                   1740: 
                   1741:        DBG1(DBG_ENC, "generating %s", get_string(this, str, sizeof(str)));
                   1742: 
                   1743:        if (keymat)
                   1744:        {
                   1745:                aead = keymat->get_aead(keymat, FALSE);
                   1746:        }
                   1747:        if (encrypting)
                   1748:        {
                   1749:                if (aead)
                   1750:                {
                   1751:                        *encrypted = wrap_payloads(this);
                   1752:                        (*encrypted)->set_transform(*encrypted, aead);
                   1753:                }
                   1754:                else if (this->exchange_type == INFORMATIONAL ||
                   1755:                                 this->exchange_type == INFORMATIONAL_V1)
                   1756:                {       /* allow sending unencrypted INFORMATIONALs */
                   1757:                        encrypting = FALSE;
                   1758:                }
                   1759:                else
                   1760:                {
                   1761:                        DBG1(DBG_ENC, "unable to encrypt payloads without AEAD transform");
                   1762:                        return FAILED;
                   1763:                }
                   1764:        }
                   1765:        if (!encrypting)
                   1766:        {
                   1767:                DBG2(DBG_ENC, "not encrypting payloads");
                   1768:                this->is_encrypted = FALSE;
                   1769:        }
                   1770: 
                   1771:        /* generate all payloads with proper next type */
                   1772:        *out_generator = generator = generator_create();
                   1773:        ike_header = create_header(this);
                   1774:        payload = (payload_t*)ike_header;
                   1775:        enumerator = create_payload_enumerator(this);
                   1776:        while (enumerator->enumerate(enumerator, &next))
                   1777:        {
                   1778:                payload->set_next_type(payload, next->get_type(next));
                   1779:                generator->generate_payload(generator, payload);
                   1780:                payload = next;
                   1781:        }
                   1782:        enumerator->destroy(enumerator);
                   1783: 
                   1784:        next_type = PL_NONE;
                   1785:        if (this->is_encrypted)
                   1786:        {       /* for encrypted IKEv1 messages */
                   1787:                next_type = (*encrypted)->payload_interface.get_next_type(
                   1788:                                                                                                                (payload_t*)*encrypted);
                   1789:        }
                   1790:        else if (*encrypted)
                   1791:        {       /* use proper IKEv2 encrypted (fragment) payload type */
                   1792:                next_type = (*encrypted)->payload_interface.get_type(
                   1793:                                                                                                                (payload_t*)*encrypted);
                   1794:        }
                   1795:        payload->set_next_type(payload, next_type);
                   1796:        generator->generate_payload(generator, payload);
                   1797:        ike_header->destroy(ike_header);
                   1798:        return SUCCESS;
                   1799: }
                   1800: 
                   1801: /**
                   1802:  * Encrypts and adds the encrypted payload (if any) to the payload list and
                   1803:  * finalizes the message generation.  Destroys the given generator.
                   1804:  */
                   1805: static status_t finalize_message(private_message_t *this, keymat_t *keymat,
                   1806:                                                generator_t *generator, encrypted_payload_t *encrypted)
                   1807: {
                   1808:        keymat_v1_t *keymat_v1 = (keymat_v1_t*)keymat;
                   1809:        chunk_t chunk;
                   1810:        uint32_t *lenpos;
                   1811: 
                   1812:        if (encrypted)
                   1813:        {
                   1814:                if (this->is_encrypted)
                   1815:                {       /* for IKEv1 instead of associated data we provide the IV */
                   1816:                        if (!keymat_v1->get_iv(keymat_v1, this->message_id, &chunk))
                   1817:                        {
                   1818:                                generator->destroy(generator);
                   1819:                                encrypted->destroy(encrypted);
                   1820:                                return FAILED;
                   1821:                        }
                   1822:                }
                   1823:                else
                   1824:                {       /* build associated data (without header of encrypted payload) */
                   1825:                        chunk = generator->get_chunk(generator, &lenpos);
                   1826:                        /* fill in length, including encrypted payload */
                   1827:                        htoun32(lenpos, chunk.len + encrypted->get_length(encrypted));
                   1828:                }
                   1829:                this->payloads->insert_last(this->payloads, encrypted);
                   1830:                if (encrypted->encrypt(encrypted, this->message_id, chunk) != SUCCESS)
                   1831:                {
                   1832:                        generator->destroy(generator);
                   1833:                        return INVALID_STATE;
                   1834:                }
                   1835:                generator->generate_payload(generator, &encrypted->payload_interface);
                   1836:        }
                   1837:        chunk = generator->get_chunk(generator, &lenpos);
                   1838:        htoun32(lenpos, chunk.len);
                   1839:        this->packet->set_data(this->packet, chunk_clone(chunk));
                   1840:        if (this->is_encrypted && this->exchange_type != INFORMATIONAL_V1)
                   1841:        {
                   1842:                /* update the IV for the next IKEv1 message */
                   1843:                chunk_t last_block;
                   1844:                aead_t *aead;
                   1845:                size_t bs;
                   1846: 
                   1847:                aead = keymat->get_aead(keymat, FALSE);
                   1848:                bs = aead->get_block_size(aead);
                   1849:                last_block = chunk_create(chunk.ptr + chunk.len - bs, bs);
                   1850:                if (!keymat_v1->update_iv(keymat_v1, this->message_id, last_block) ||
                   1851:                        !keymat_v1->confirm_iv(keymat_v1, this->message_id))
                   1852:                {
                   1853:                        generator->destroy(generator);
                   1854:                        return FAILED;
                   1855:                }
                   1856:        }
                   1857:        generator->destroy(generator);
                   1858:        return SUCCESS;
                   1859: }
                   1860: 
                   1861: METHOD(message_t, generate, status_t,
                   1862:        private_message_t *this, keymat_t *keymat, packet_t **packet)
                   1863: {
                   1864:        generator_t *generator = NULL;
                   1865:        encrypted_payload_t *encrypted = NULL;
                   1866:        status_t status;
                   1867: 
                   1868:        status = generate_message(this, keymat, &generator, &encrypted);
                   1869:        if (status != SUCCESS)
                   1870:        {
                   1871:                DESTROY_IF(generator);
                   1872:                return status;
                   1873:        }
                   1874:        status = finalize_message(this, keymat, generator, encrypted);
                   1875:        if (status != SUCCESS)
                   1876:        {
                   1877:                return status;
                   1878:        }
                   1879:        if (packet)
                   1880:        {
                   1881:                *packet = this->packet->clone(this->packet);
                   1882:        }
                   1883:        return SUCCESS;
                   1884: }
                   1885: 
                   1886: /**
                   1887:  * Creates a (basic) clone of the given message
                   1888:  */
                   1889: static message_t *clone_message(private_message_t *this)
                   1890: {
                   1891:        message_t *message;
                   1892:        host_t *src, *dst;
                   1893: 
                   1894:        src = this->packet->get_source(this->packet);
                   1895:        dst = this->packet->get_destination(this->packet);
                   1896: 
                   1897:        message = message_create(this->major_version, this->minor_version);
                   1898:        message->set_ike_sa_id(message, this->ike_sa_id);
                   1899:        message->set_message_id(message, this->message_id);
                   1900:        message->set_request(message, this->is_request);
                   1901:        message->set_source(message, src->clone(src));
                   1902:        message->set_destination(message, dst->clone(dst));
                   1903:        message->set_exchange_type(message, this->exchange_type);
                   1904:        memcpy(((private_message_t*)message)->reserved, this->reserved,
                   1905:                   sizeof(this->reserved));
                   1906:        return message;
                   1907: }
                   1908: 
                   1909: /**
                   1910:  * Create a single fragment with the given data
                   1911:  */
                   1912: static message_t *create_fragment(private_message_t *this, payload_type_t next,
                   1913:                                                                  uint16_t num, uint16_t count, chunk_t data)
                   1914: {
                   1915:        enumerator_t *enumerator;
                   1916:        payload_t *fragment, *payload;
                   1917:        message_t *message;
                   1918:        peer_cfg_t *peer_cfg;
                   1919:        ike_sa_t *ike_sa;
                   1920: 
                   1921:        message = clone_message(this);
                   1922:        if (this->major_version == IKEV1_MAJOR_VERSION)
                   1923:        {
                   1924:                /* other implementations seem to just use 0 as message ID, so here we go */
                   1925:                message->set_message_id(message, 0);
                   1926:                /* always use the initial message type for fragments, even for quick mode
                   1927:                 * or transaction messages. */
                   1928:                ike_sa = charon->bus->get_sa(charon->bus);
                   1929:                if (ike_sa && (peer_cfg = ike_sa->get_peer_cfg(ike_sa)) &&
                   1930:                        peer_cfg->use_aggressive(peer_cfg))
                   1931:                {
                   1932:                        message->set_exchange_type(message, AGGRESSIVE);
                   1933:                }
                   1934:                else
                   1935:                {
                   1936:                        message->set_exchange_type(message, ID_PROT);
                   1937:                }
                   1938:                fragment = (payload_t*)fragment_payload_create_from_data(
                   1939:                                                                                                        num, num == count, data);
                   1940:        }
                   1941:        else
                   1942:        {
                   1943:                fragment = (payload_t*)encrypted_fragment_payload_create_from_data(
                   1944:                                                                                                        num, count, data);
                   1945:                if (num == 1)
                   1946:                {
                   1947:                        /* only in the first fragment is this set to the type of the first
                   1948:                         * payload in the encrypted payload */
                   1949:                        fragment->set_next_type(fragment, next);
                   1950:                        /* move unencrypted payloads to the first fragment */
                   1951:                        enumerator = this->payloads->create_enumerator(this->payloads);
                   1952:                        while (enumerator->enumerate(enumerator, &payload))
                   1953:                        {
                   1954:                                if (payload->get_type(payload) != PLV2_ENCRYPTED)
                   1955:                                {
                   1956:                                        this->payloads->remove_at(this->payloads, enumerator);
                   1957:                                        message->add_payload(message, payload);
                   1958:                                }
                   1959:                        }
                   1960:                        enumerator->destroy(enumerator);
                   1961:                }
                   1962:        }
                   1963:        message->add_payload(message, (payload_t*)fragment);
                   1964:        return message;
                   1965: }
                   1966: 
                   1967: /**
                   1968:  * Destroy all fragments
                   1969:  */
                   1970: static void clear_fragments(private_message_t *this)
                   1971: {
                   1972:        array_destroy_offset(this->fragments, offsetof(packet_t, destroy));
                   1973:        this->fragments = NULL;
                   1974: }
                   1975: 
                   1976: /**
                   1977:  * Reduce the fragment length but ensure it stays > 0
                   1978:  */
                   1979: #define REDUCE_FRAG_LEN(fl, amount) ({ \
                   1980:        fl = max(1, (ssize_t)fl - (amount)); \
                   1981: })
                   1982: 
                   1983: METHOD(message_t, fragment, status_t,
                   1984:        private_message_t *this, keymat_t *keymat, size_t frag_len,
                   1985:        enumerator_t **fragments)
                   1986: {
                   1987:        encrypted_payload_t *encrypted = NULL;
                   1988:        generator_t *generator = NULL;
                   1989:        message_t *fragment;
                   1990:        packet_t *packet;
                   1991:        payload_type_t next = PL_NONE;
                   1992:        uint16_t num, count;
                   1993:        host_t *src, *dst;
                   1994:        chunk_t data;
                   1995:        status_t status;
                   1996:        uint32_t *lenpos;
                   1997:        size_t len;
                   1998: 
                   1999:        src = this->packet->get_source(this->packet);
                   2000:        dst = this->packet->get_destination(this->packet);
                   2001:        if (!frag_len)
                   2002:        {
                   2003:                frag_len = (src->get_family(src) == AF_INET) ? 576 : 1280;
                   2004:        }
                   2005:        /* frag_len is the complete IP datagram length, account for overhead (we
                   2006:         * assume no IP options/extension headers are used) */
                   2007:        REDUCE_FRAG_LEN(frag_len, (src->get_family(src) == AF_INET) ? 20 : 40);
                   2008:        /* 8 (UDP header) */
                   2009:        REDUCE_FRAG_LEN(frag_len, 8);
                   2010:        if (dst->get_port(dst) != IKEV2_UDP_PORT &&
                   2011:                src->get_port(src) != IKEV2_UDP_PORT)
                   2012:        {       /* reduce length due to non-ESP marker */
                   2013:                REDUCE_FRAG_LEN(frag_len, 4);
                   2014:        }
                   2015: 
                   2016:        if (is_encoded(this))
                   2017:        {
                   2018:                if (this->major_version == IKEV2_MAJOR_VERSION)
                   2019:                {
                   2020:                        encrypted = (encrypted_payload_t*)get_payload(this, PLV2_ENCRYPTED);
                   2021:                }
                   2022:                data = this->packet->get_data(this->packet);
                   2023:                len = data.len;
                   2024:        }
                   2025:        else
                   2026:        {
                   2027:                status = generate_message(this, keymat, &generator, &encrypted);
                   2028:                if (status != SUCCESS)
                   2029:                {
                   2030:                        DESTROY_IF(generator);
                   2031:                        return status;
                   2032:                }
                   2033:                data = generator->get_chunk(generator, &lenpos);
                   2034:                len = data.len + (encrypted ? encrypted->get_length(encrypted) : 0);
                   2035:        }
                   2036: 
                   2037:        /* check if we actually need to fragment the message and if we have an
                   2038:         * encrypted payload for IKEv2 */
                   2039:        if (len <= frag_len ||
                   2040:           (this->major_version == IKEV2_MAJOR_VERSION && !encrypted))
                   2041:        {
                   2042:                if (generator)
                   2043:                {
                   2044:                        status = finalize_message(this, keymat, generator, encrypted);
                   2045:                        if (status != SUCCESS)
                   2046:                        {
                   2047:                                return status;
                   2048:                        }
                   2049:                }
                   2050:                *fragments = enumerator_create_single(this->packet, NULL);
                   2051:                return SUCCESS;
                   2052:        }
                   2053: 
                   2054:        /* frag_len denoted the maximum IKE message size so far, later on it will
                   2055:         * denote the maximum content size of a fragment payload, therefore,
                   2056:         * account for IKE header */
                   2057:        REDUCE_FRAG_LEN(frag_len, 28);
                   2058: 
                   2059:        if (this->major_version == IKEV1_MAJOR_VERSION)
                   2060:        {
                   2061:                if (generator)
                   2062:                {
                   2063:                        status = finalize_message(this, keymat, generator, encrypted);
                   2064:                        if (status != SUCCESS)
                   2065:                        {
                   2066:                                return status;
                   2067:                        }
                   2068:                        data = this->packet->get_data(this->packet);
                   2069:                        generator = NULL;
                   2070:                }
                   2071:                /* overhead for the fragmentation payload header */
                   2072:                REDUCE_FRAG_LEN(frag_len, 8);
                   2073:        }
                   2074:        else
                   2075:        {
                   2076:                aead_t *aead;
                   2077: 
                   2078:                if (generator)
                   2079:                {
                   2080:                        generator->destroy(generator);
                   2081:                        generator = generator_create();
                   2082:                }
                   2083:                else
                   2084:                {       /* do not log again if it was generated previously */
                   2085:                        generator = generator_create_no_dbg();
                   2086:                }
                   2087:                next = encrypted->payload_interface.get_next_type((payload_t*)encrypted);
                   2088:                encrypted->generate_payloads(encrypted, generator);
                   2089:                data = generator->get_chunk(generator, &lenpos);
                   2090:                if (!is_encoded(this))
                   2091:                {
                   2092:                        encrypted->destroy(encrypted);
                   2093:                }
                   2094:                aead = keymat->get_aead(keymat, FALSE);
                   2095:                /* overhead for the encrypted fragment payload */
                   2096:                REDUCE_FRAG_LEN(frag_len, aead->get_iv_size(aead));
                   2097:                REDUCE_FRAG_LEN(frag_len, aead->get_icv_size(aead));
                   2098:                /* header */
                   2099:                REDUCE_FRAG_LEN(frag_len, 8);
                   2100:                /* padding and padding length */
                   2101:                frag_len = round_down(frag_len, aead->get_block_size(aead));
                   2102:                REDUCE_FRAG_LEN(frag_len, 1);
                   2103:                /* TODO-FRAG: if there are unencrypted payloads, should we account for
                   2104:                 * their length in the first fragment? we still would have to add
                   2105:                 * an encrypted fragment payload (albeit empty), even so we couldn't
                   2106:                 * prevent IP fragmentation in every case */
                   2107:        }
                   2108: 
                   2109:        count = data.len / frag_len + (data.len % frag_len ? 1 : 0);
                   2110:        this->fragments = array_create(0, count);
                   2111:        DBG1(DBG_ENC, "splitting IKE message (%zu bytes) into %hu fragments", len,
                   2112:                 count);
                   2113:        for (num = 1; num <= count; num++)
                   2114:        {
                   2115:                len = min(data.len, frag_len);
                   2116:                fragment = create_fragment(this, next, num, count,
                   2117:                                                                   chunk_create(data.ptr, len));
                   2118:                status = fragment->generate(fragment, keymat, &packet);
                   2119:                fragment->destroy(fragment);
                   2120:                if (status != SUCCESS)
                   2121:                {
                   2122:                        DBG1(DBG_ENC, "failed to generate IKE fragment");
                   2123:                        clear_fragments(this);
                   2124:                        DESTROY_IF(generator);
                   2125:                        return FAILED;
                   2126:                }
                   2127:                array_insert(this->fragments, ARRAY_TAIL, packet);
                   2128:                data = chunk_skip(data, len);
                   2129:        }
                   2130:        *fragments = array_create_enumerator(this->fragments);
                   2131:        DESTROY_IF(generator);
                   2132:        return SUCCESS;
                   2133: }
                   2134: 
                   2135: METHOD(message_t, get_packet, packet_t*,
                   2136:        private_message_t *this)
                   2137: {
                   2138:        return this->packet->clone(this->packet);
                   2139: }
                   2140: 
                   2141: METHOD(message_t, get_packet_data, chunk_t,
                   2142:        private_message_t *this)
                   2143: {
                   2144:        return this->packet->get_data(this->packet);
                   2145: }
                   2146: 
                   2147: METHOD(message_t, get_fragments, enumerator_t*,
                   2148:        private_message_t *this)
                   2149: {
                   2150:        return array_create_enumerator(this->fragments);
                   2151: }
                   2152: 
                   2153: METHOD(message_t, parse_header, status_t,
                   2154:        private_message_t *this)
                   2155: {
                   2156:        ike_header_t *ike_header;
                   2157:        status_t status;
                   2158:        bool *reserved;
                   2159:        int i;
                   2160: 
                   2161:        DBG2(DBG_ENC, "parsing header of message");
                   2162: 
                   2163:        if (!this->parser)
                   2164:        {       /* reassembled IKEv2 message, header is inherited from fragments */
                   2165:                return SUCCESS;
                   2166:        }
                   2167:        this->parser->reset_context(this->parser);
                   2168:        status = this->parser->parse_payload(this->parser, PL_HEADER,
                   2169:                                                                                 (payload_t**)&ike_header);
                   2170:        if (status != SUCCESS)
                   2171:        {
                   2172:                DBG1(DBG_ENC, "header could not be parsed");
                   2173:                return status;
                   2174: 
                   2175:        }
                   2176: 
                   2177:        status = ike_header->payload_interface.verify(
                   2178:                                                                                &ike_header->payload_interface);
                   2179:        if (status != SUCCESS)
                   2180:        {
                   2181:                DBG1(DBG_ENC, "header verification failed");
                   2182:                ike_header->destroy(ike_header);
                   2183:                return status;
                   2184:        }
                   2185: 
                   2186:        DESTROY_IF(this->ike_sa_id);
                   2187:        this->ike_sa_id = ike_sa_id_create(
                   2188:                                                                        ike_header->get_maj_version(ike_header),
                   2189:                                                                        ike_header->get_initiator_spi(ike_header),
                   2190:                                                                        ike_header->get_responder_spi(ike_header),
                   2191:                                                                        ike_header->get_initiator_flag(ike_header));
                   2192: 
                   2193:        this->exchange_type = ike_header->get_exchange_type(ike_header);
                   2194:        this->message_id = ike_header->get_message_id(ike_header);
                   2195:        this->major_version = ike_header->get_maj_version(ike_header);
                   2196:        this->minor_version = ike_header->get_min_version(ike_header);
                   2197:        if (this->major_version == IKEV2_MAJOR_VERSION)
                   2198:        {
                   2199:                this->is_request = !ike_header->get_response_flag(ike_header);
                   2200:        }
                   2201:        else
                   2202:        {
                   2203:                this->is_encrypted = ike_header->get_encryption_flag(ike_header);
                   2204:        }
                   2205:        this->first_payload = ike_header->payload_interface.get_next_type(
                   2206:                                                                                                &ike_header->payload_interface);
                   2207:        if (this->first_payload == PLV1_FRAGMENT && this->is_encrypted)
                   2208:        {       /* racoon sets the encrypted bit when sending a fragment, but these
                   2209:                 * messages are really not encrypted */
                   2210:                this->is_encrypted = FALSE;
                   2211:        }
                   2212: 
                   2213:        for (i = 0; i < countof(this->reserved); i++)
                   2214:        {
                   2215:                reserved = payload_get_field(&ike_header->payload_interface,
                   2216:                                                                         RESERVED_BIT, i);
                   2217:                if (reserved)
                   2218:                {
                   2219:                        this->reserved[i] = *reserved;
                   2220:                }
                   2221:        }
                   2222:        ike_header->destroy(ike_header);
                   2223: 
                   2224:        this->parser->set_major_version(this->parser, this->major_version);
                   2225: 
                   2226:        DBG2(DBG_ENC, "parsed a %N %s header", exchange_type_names,
                   2227:                 this->exchange_type, this->major_version == IKEV1_MAJOR_VERSION ?
                   2228:                 "message" : (this->is_request ? "request" : "response"));
                   2229:        return SUCCESS;
                   2230: }
                   2231: 
                   2232: /**
                   2233:  * Check if a payload is for a mediation extension connectivity check
                   2234:  */
                   2235: static bool is_connectivity_check(private_message_t *this, payload_t *payload)
                   2236: {
                   2237: #ifdef ME
                   2238:        if (this->exchange_type == INFORMATIONAL &&
                   2239:                payload->get_type(payload) == PLV2_NOTIFY)
                   2240:        {
                   2241:                notify_payload_t *notify = (notify_payload_t*)payload;
                   2242: 
                   2243:                switch (notify->get_notify_type(notify))
                   2244:                {
                   2245:                        case ME_CONNECTID:
                   2246:                        case ME_ENDPOINT:
                   2247:                        case ME_CONNECTAUTH:
                   2248:                                return TRUE;
                   2249:                        default:
                   2250:                                break;
                   2251:                }
                   2252:        }
                   2253: #endif /* !ME */
                   2254:        return FALSE;
                   2255: }
                   2256: 
                   2257: /**
                   2258:  * Parses and verifies the unencrypted payloads contained in the message
                   2259:  */
                   2260: static status_t parse_payloads(private_message_t *this)
                   2261: {
                   2262:        payload_type_t type = this->first_payload;
                   2263:        payload_t *payload;
                   2264:        status_t status;
                   2265: 
                   2266:        if (this->is_encrypted)
                   2267:        {       /* wrap the whole encrypted IKEv1 message in a special encrypted
                   2268:                 * payload which is then handled just like a regular payload */
                   2269:                encrypted_payload_t *encryption;
                   2270: 
                   2271:                status = this->parser->parse_payload(this->parser, PLV1_ENCRYPTED,
                   2272:                                                                                         (payload_t**)&encryption);
                   2273:                if (status != SUCCESS)
                   2274:                {
                   2275:                        DBG1(DBG_ENC, "failed to wrap encrypted IKEv1 message");
                   2276:                        return PARSE_ERROR;
                   2277:                }
                   2278:                encryption->payload_interface.set_next_type((payload_t*)encryption,
                   2279:                                                                                                        this->first_payload);
                   2280:                this->payloads->insert_last(this->payloads, encryption);
                   2281:                return SUCCESS;
                   2282:        }
                   2283: 
                   2284:        while (type != PL_NONE)
                   2285:        {
                   2286:                DBG2(DBG_ENC, "starting parsing a %N payload",
                   2287:                         payload_type_names, type);
                   2288: 
                   2289:                status = this->parser->parse_payload(this->parser, type, &payload);
                   2290:                if (status != SUCCESS)
                   2291:                {
                   2292:                        DBG1(DBG_ENC, "payload type %N could not be parsed",
                   2293:                                 payload_type_names, type);
                   2294:                        return PARSE_ERROR;
                   2295:                }
                   2296: 
                   2297:                DBG2(DBG_ENC, "verifying payload of type %N", payload_type_names, type);
                   2298:                status = payload->verify(payload);
                   2299:                if (status != SUCCESS)
                   2300:                {
                   2301:                        DBG1(DBG_ENC, "%N payload verification failed",
                   2302:                                 payload_type_names, type);
                   2303:                        payload->destroy(payload);
                   2304:                        return VERIFY_ERROR;
                   2305:                }
                   2306:                if (payload->get_type(payload) == PL_UNKNOWN)
                   2307:                {
                   2308:                        DBG2(DBG_ENC, "%N payload unknown or not allowed",
                   2309:                                 payload_type_names, type);
                   2310:                }
                   2311:                else
                   2312:                {
                   2313:                        DBG2(DBG_ENC, "%N payload verified, adding to payload list",
                   2314:                                 payload_type_names, type);
                   2315:                }
                   2316:                this->payloads->insert_last(this->payloads, payload);
                   2317: 
                   2318:                /* an encrypted (fragment) payload MUST be the last one, so STOP here.
                   2319:                 * decryption is done later */
                   2320:                if (type == PLV2_ENCRYPTED || type == PLV2_FRAGMENT)
                   2321:                {
                   2322:                        DBG2(DBG_ENC, "%N payload found, stop parsing",
                   2323:                                 payload_type_names, type);
                   2324:                        break;
                   2325:                }
                   2326:                type = payload->get_next_type(payload);
                   2327:        }
                   2328:        return SUCCESS;
                   2329: }
                   2330: 
                   2331: /**
                   2332:  * Decrypt an encrypted payload and extract all contained payloads.
                   2333:  */
                   2334: static status_t decrypt_and_extract(private_message_t *this, keymat_t *keymat,
                   2335:                                                payload_t *previous, encrypted_payload_t *encryption)
                   2336: {
                   2337:        payload_t *encrypted;
                   2338:        payload_type_t type;
                   2339:        chunk_t chunk;
                   2340:        aead_t *aead;
                   2341:        size_t bs;
                   2342:        status_t status = SUCCESS;
                   2343: 
                   2344:        if (!keymat)
                   2345:        {
                   2346:                DBG1(DBG_ENC, "found encrypted payload, but no keymat");
                   2347:                return INVALID_ARG;
                   2348:        }
                   2349:        aead = keymat->get_aead(keymat, TRUE);
                   2350:        if (!aead)
                   2351:        {
                   2352:                DBG1(DBG_ENC, "found encrypted payload, but no transform set");
                   2353:                return INVALID_ARG;
                   2354:        }
                   2355:        if (!this->parser)
                   2356:        {
                   2357:                /* reassembled IKEv2 messages are already decrypted, we still call
                   2358:                 * decrypt() to parse the contained payloads */
                   2359:                status = encryption->decrypt(encryption, chunk_empty);
                   2360:        }
                   2361:        else
                   2362:        {
                   2363:                bs = aead->get_block_size(aead);
                   2364:                encryption->set_transform(encryption, aead);
                   2365:                chunk = this->packet->get_data(this->packet);
                   2366:                if (chunk.len < encryption->get_length(encryption) ||
                   2367:                        chunk.len < bs)
                   2368:                {
                   2369:                        DBG1(DBG_ENC, "invalid payload length");
                   2370:                        return VERIFY_ERROR;
                   2371:                }
                   2372:                if (keymat->get_version(keymat) == IKEV1)
                   2373:                {       /* instead of associated data we provide the IV, we also update
                   2374:                         * the IV with the last encrypted block */
                   2375:                        keymat_v1_t *keymat_v1 = (keymat_v1_t*)keymat;
                   2376:                        chunk_t iv;
                   2377: 
                   2378:                        if (keymat_v1->get_iv(keymat_v1, this->message_id, &iv))
                   2379:                        {
                   2380:                                status = encryption->decrypt(encryption, iv);
                   2381:                                if (status == SUCCESS)
                   2382:                                {
                   2383:                                        if (!keymat_v1->update_iv(keymat_v1, this->message_id,
                   2384:                                                        chunk_create(chunk.ptr + chunk.len - bs, bs)))
                   2385:                                        {
                   2386:                                                status = FAILED;
                   2387:                                        }
                   2388:                                }
                   2389:                        }
                   2390:                        else
                   2391:                        {
                   2392:                                status = FAILED;
                   2393:                        }
                   2394:                }
                   2395:                else
                   2396:                {
                   2397:                        chunk.len -= encryption->get_length(encryption);
                   2398:                        status = encryption->decrypt(encryption, chunk);
                   2399:                }
                   2400:        }
                   2401:        if (status != SUCCESS)
                   2402:        {
                   2403:                return status;
                   2404:        }
                   2405: 
                   2406:        while ((encrypted = encryption->remove_payload(encryption)))
                   2407:        {
                   2408:                type = encrypted->get_type(encrypted);
                   2409:                if (previous)
                   2410:                {
                   2411:                        previous->set_next_type(previous, type);
                   2412:                }
                   2413:                else
                   2414:                {
                   2415:                        this->first_payload = type;
                   2416:                }
                   2417:                DBG2(DBG_ENC, "insert decrypted payload of type %N at end of list",
                   2418:                         payload_type_names, type);
                   2419:                this->payloads->insert_last(this->payloads, encrypted);
                   2420:                previous = encrypted;
                   2421:        }
                   2422:        return SUCCESS;
                   2423: }
                   2424: 
                   2425: /**
                   2426:  * Decrypt an encrypted fragment payload.
                   2427:  */
                   2428: static status_t decrypt_fragment(private_message_t *this, keymat_t *keymat,
                   2429:                                                                 encrypted_fragment_payload_t *fragment)
                   2430: {
                   2431:        encrypted_payload_t *encrypted = (encrypted_payload_t*)fragment;
                   2432:        chunk_t chunk;
                   2433:        aead_t *aead;
                   2434:        size_t bs;
                   2435: 
                   2436:        if (!keymat)
                   2437:        {
                   2438:                DBG1(DBG_ENC, "found encrypted fragment payload, but no keymat");
                   2439:                return INVALID_ARG;
                   2440:        }
                   2441:        aead = keymat->get_aead(keymat, TRUE);
                   2442:        if (!aead)
                   2443:        {
                   2444:                DBG1(DBG_ENC, "found encrypted fragment payload, but no transform set");
                   2445:                return INVALID_ARG;
                   2446:        }
                   2447:        bs = aead->get_block_size(aead);
                   2448:        encrypted->set_transform(encrypted, aead);
                   2449:        chunk = this->packet->get_data(this->packet);
                   2450:        if (chunk.len < encrypted->get_length(encrypted) ||
                   2451:                chunk.len < bs)
                   2452:        {
                   2453:                DBG1(DBG_ENC, "invalid payload length");
                   2454:                return VERIFY_ERROR;
                   2455:        }
                   2456:        chunk.len -= encrypted->get_length(encrypted);
                   2457:        return encrypted->decrypt(encrypted, chunk);
                   2458: }
                   2459: 
                   2460: /**
                   2461:  * Do we accept unencrypted ID/HASH payloads in Main Mode, as seen from
                   2462:  * some SonicWall boxes?
                   2463:  */
                   2464: static bool accept_unencrypted_mm(private_message_t *this, payload_type_t type)
                   2465: {
                   2466:        if (this->exchange_type == ID_PROT)
                   2467:        {
                   2468:                if (type == PLV1_ID || type == PLV1_HASH)
                   2469:                {
                   2470:                        return lib->settings->get_bool(lib->settings,
                   2471:                                                                        "%s.accept_unencrypted_mainmode_messages",
                   2472:                                                                        FALSE, lib->ns);
                   2473:                }
                   2474:        }
                   2475:        return FALSE;
                   2476: }
                   2477: 
                   2478: /**
                   2479:  * Decrypt payload from the encrypted payload
                   2480:  */
                   2481: static status_t decrypt_payloads(private_message_t *this, keymat_t *keymat)
                   2482: {
                   2483:        payload_t *payload, *previous = NULL;
                   2484:        enumerator_t *enumerator;
                   2485:        payload_rule_t *rule;
                   2486:        payload_type_t type;
                   2487:        status_t status = SUCCESS;
                   2488:        char *was_encrypted = NULL;
                   2489: 
                   2490:        enumerator = this->payloads->create_enumerator(this->payloads);
                   2491:        while (enumerator->enumerate(enumerator, &payload))
                   2492:        {
                   2493:                type = payload->get_type(payload);
                   2494: 
                   2495:                DBG2(DBG_ENC, "process payload of type %N", payload_type_names, type);
                   2496: 
                   2497:                if (type == PLV2_ENCRYPTED || type == PLV1_ENCRYPTED ||
                   2498:                        type == PLV2_FRAGMENT)
                   2499:                {
                   2500:                        if (was_encrypted)
                   2501:                        {
                   2502:                                DBG1(DBG_ENC, "%s can't contain other payloads of type %N",
                   2503:                                         was_encrypted, payload_type_names, type);
                   2504:                                status = VERIFY_ERROR;
                   2505:                                break;
                   2506:                        }
                   2507:                }
                   2508: 
                   2509:                if (type == PLV2_ENCRYPTED || type == PLV1_ENCRYPTED)
                   2510:                {
                   2511:                        encrypted_payload_t *encryption;
                   2512: 
                   2513:                        DBG2(DBG_ENC, "found an encrypted payload");
                   2514:                        encryption = (encrypted_payload_t*)payload;
                   2515:                        this->payloads->remove_at(this->payloads, enumerator);
                   2516: 
                   2517:                        if (enumerator->enumerate(enumerator, NULL))
                   2518:                        {
                   2519:                                DBG1(DBG_ENC, "encrypted payload is not last payload");
                   2520:                                encryption->destroy(encryption);
                   2521:                                status = VERIFY_ERROR;
                   2522:                                break;
                   2523:                        }
                   2524:                        status = decrypt_and_extract(this, keymat, previous, encryption);
                   2525:                        encryption->destroy(encryption);
                   2526:                        if (status != SUCCESS)
                   2527:                        {
                   2528:                                break;
                   2529:                        }
                   2530:                        was_encrypted = "encrypted payload";
                   2531:                }
                   2532:                else if (type == PLV2_FRAGMENT)
                   2533:                {
                   2534:                        encrypted_fragment_payload_t *fragment;
                   2535: 
                   2536:                        DBG2(DBG_ENC, "found an encrypted fragment payload");
                   2537:                        fragment = (encrypted_fragment_payload_t*)payload;
                   2538: 
                   2539:                        if (enumerator->enumerate(enumerator, NULL))
                   2540:                        {
                   2541:                                DBG1(DBG_ENC, "encrypted fragment payload is not last payload");
                   2542:                                status = VERIFY_ERROR;
                   2543:                                break;
                   2544:                        }
                   2545:                        status = decrypt_fragment(this, keymat, fragment);
                   2546:                        if (status != SUCCESS)
                   2547:                        {
                   2548:                                break;
                   2549:                        }
                   2550:                        was_encrypted = "encrypted fragment payload";
                   2551:                }
                   2552: 
                   2553:                if (type != PL_UNKNOWN && !was_encrypted &&
                   2554:                        !is_connectivity_check(this, payload) &&
                   2555:                        this->exchange_type != AGGRESSIVE)
                   2556:                {
                   2557:                        rule = get_payload_rule(this, type);
                   2558:                        if ((!rule || rule->encrypted) &&
                   2559:                                !accept_unencrypted_mm(this, type))
                   2560:                        {
                   2561:                                DBG1(DBG_ENC, "payload type %N was not encrypted",
                   2562:                                         payload_type_names, type);
                   2563:                                status = FAILED;
                   2564:                                break;
                   2565:                        }
                   2566:                }
                   2567:                previous = payload;
                   2568:        }
                   2569:        enumerator->destroy(enumerator);
                   2570:        return status;
                   2571: }
                   2572: 
                   2573: /**
                   2574:  * Verify a message and all payload according to message/payload rules
                   2575:  */
                   2576: static status_t verify(private_message_t *this)
                   2577: {
                   2578:        bool complete = FALSE;
                   2579:        int i;
                   2580: 
                   2581:        DBG2(DBG_ENC, "verifying message structure");
                   2582: 
                   2583:        /* check for payloads with wrong count */
                   2584:        for (i = 0; i < this->rule->rule_count; i++)
                   2585:        {
                   2586:                enumerator_t *enumerator;
                   2587:                payload_t *payload;
                   2588:                payload_rule_t *rule;
                   2589:                int found = 0;
                   2590: 
                   2591:                rule = &this->rule->rules[i];
                   2592:                enumerator = create_payload_enumerator(this);
                   2593:                while (enumerator->enumerate(enumerator, &payload))
                   2594:                {
                   2595:                        payload_type_t type;
                   2596: 
                   2597:                        type = payload->get_type(payload);
                   2598:                        if (type == rule->type)
                   2599:                        {
                   2600:                                found++;
                   2601:                                DBG2(DBG_ENC, "found payload of type %N",
                   2602:                                         payload_type_names, type);
                   2603:                                if (found > rule->max_occurrence)
                   2604:                                {
                   2605:                                        DBG1(DBG_ENC, "payload of type %N more than %d times (%d) "
                   2606:                                                 "occurred in current message", payload_type_names,
                   2607:                                                 type, rule->max_occurrence, found);
                   2608:                                        enumerator->destroy(enumerator);
                   2609:                                        return VERIFY_ERROR;
                   2610:                                }
                   2611:                        }
                   2612:                }
                   2613:                enumerator->destroy(enumerator);
                   2614: 
                   2615:                if (!complete && found < rule->min_occurrence)
                   2616:                {
                   2617:                        DBG1(DBG_ENC, "payload of type %N not occurred %d times (%d)",
                   2618:                                 payload_type_names, rule->type, rule->min_occurrence, found);
                   2619:                        return VERIFY_ERROR;
                   2620:                }
                   2621:                if (found && rule->sufficient)
                   2622:                {
                   2623:                        complete = TRUE;
                   2624:                }
                   2625:        }
                   2626:        return SUCCESS;
                   2627: }
                   2628: 
                   2629: METHOD(message_t, parse_body, status_t,
                   2630:        private_message_t *this, keymat_t *keymat)
                   2631: {
                   2632:        status_t status = SUCCESS;
                   2633:        char str[BUF_LEN];
                   2634: 
                   2635:        DBG2(DBG_ENC, "parsing body of message, first payload is %N",
                   2636:                 payload_type_names, this->first_payload);
                   2637: 
                   2638:        this->rule = get_message_rule(this);
                   2639:        if (!this->rule)
                   2640:        {
                   2641:                DBG1(DBG_ENC, "no message rules specified for a %N %s",
                   2642:                         exchange_type_names, this->exchange_type,
                   2643:                         this->is_request ? "request" : "response");
                   2644:                return NOT_SUPPORTED;
                   2645:        }
                   2646: 
                   2647:        /* reassembled IKEv2 messages are already parsed (except for the payloads
                   2648:         * contained in the encrypted payload, which are handled below) */
                   2649:        if (this->parser)
                   2650:        {
                   2651:                status = parse_payloads(this);
                   2652:                if (status != SUCCESS)
                   2653:                {       /* error is already logged */
                   2654:                        return status;
                   2655:                }
                   2656:        }
                   2657: 
                   2658:        status = decrypt_payloads(this, keymat);
                   2659:        if (status != SUCCESS)
                   2660:        {
                   2661:                DBG1(DBG_ENC, "could not decrypt payloads");
                   2662:                return status;
                   2663:        }
                   2664: 
                   2665:        status = verify(this);
                   2666:        if (status != SUCCESS)
                   2667:        {
                   2668:                return status;
                   2669:        }
                   2670: 
                   2671:        DBG1(DBG_ENC, "parsed %s", get_string(this, str, sizeof(str)));
                   2672: 
                   2673:        if (keymat && keymat->get_version(keymat) == IKEV1)
                   2674:        {
                   2675:                keymat_v1_t *keymat_v1 = (keymat_v1_t*)keymat;
                   2676:                chunk_t hash;
                   2677: 
                   2678:                if (keymat_v1->get_hash_phase2(keymat_v1, &this->public, &hash))
                   2679:                {
                   2680:                        hash_payload_t *hash_payload;
                   2681:                        chunk_t other_hash;
                   2682: 
                   2683:                        if (this->first_payload != PLV1_HASH)
                   2684:                        {
                   2685:                                if (this->exchange_type == INFORMATIONAL_V1)
                   2686:                                {
                   2687:                                        DBG1(DBG_ENC, "ignoring unprotected INFORMATIONAL from %H",
                   2688:                                                 this->packet->get_source(this->packet));
                   2689:                                }
                   2690:                                else
                   2691:                                {
                   2692:                                        DBG1(DBG_ENC, "expected HASH payload as first payload");
                   2693:                                }
                   2694:                                chunk_free(&hash);
                   2695:                                return VERIFY_ERROR;
                   2696:                        }
                   2697:                        hash_payload = (hash_payload_t*)get_payload(this, PLV1_HASH);
                   2698:                        other_hash = hash_payload->get_hash(hash_payload);
                   2699:                        DBG3(DBG_ENC, "HASH received %B\nHASH expected %B",
                   2700:                                 &other_hash, &hash);
                   2701:                        if (!chunk_equals_const(hash, other_hash))
                   2702:                        {
                   2703:                                DBG1(DBG_ENC, "received HASH payload does not match");
                   2704:                                chunk_free(&hash);
                   2705:                                return FAILED;
                   2706:                        }
                   2707:                        chunk_free(&hash);
                   2708:                }
                   2709:                if (this->is_encrypted && this->exchange_type != INFORMATIONAL_V1)
                   2710:                {       /* message verified, confirm IV */
                   2711:                        if (!keymat_v1->confirm_iv(keymat_v1, this->message_id))
                   2712:                        {
                   2713:                                return FAILED;
                   2714:                        }
                   2715:                }
                   2716:        }
                   2717:        return SUCCESS;
                   2718: }
                   2719: 
                   2720: /**
                   2721:  * Store the fragment data for the fragment with the given fragment number.
                   2722:  */
                   2723: static status_t add_fragment(private_message_t *this, uint16_t num,
                   2724:                                                         chunk_t data)
                   2725: {
                   2726:        fragment_t *fragment;
                   2727:        int i, insert_at = -1;
                   2728: 
                   2729:        for (i = 0; i < array_count(this->fragments); i++)
                   2730:        {
                   2731:                array_get(this->fragments, i, &fragment);
                   2732:                if (fragment->num == num)
                   2733:                {
                   2734:                        /* ignore a duplicate fragment */
                   2735:                        DBG1(DBG_ENC, "received duplicate fragment #%hu", num);
                   2736:                        return NEED_MORE;
                   2737:                }
                   2738:                if (fragment->num > num)
                   2739:                {
                   2740:                        insert_at = i;
                   2741:                        break;
                   2742:                }
                   2743:        }
                   2744:        this->frag->len += data.len;
                   2745:        if (this->frag->len > this->frag->max_packet)
                   2746:        {
                   2747:                DBG1(DBG_ENC, "fragmented IKE message is too large");
                   2748:                reset_defrag(this);
                   2749:                return FAILED;
                   2750:        }
                   2751:        INIT(fragment,
                   2752:                .num = num,
                   2753:                .data = chunk_clone(data),
                   2754:        );
                   2755:        array_insert(this->fragments, insert_at, fragment);
                   2756:        return SUCCESS;
                   2757: }
                   2758: 
                   2759: /**
                   2760:  * Merge the cached fragment data and resets the defragmentation state.
                   2761:  * Also updates the IP addresses to those of the last received fragment.
                   2762:  */
                   2763: static chunk_t merge_fragments(private_message_t *this, message_t *last)
                   2764: {
                   2765:        fragment_t *fragment;
                   2766:        bio_writer_t *writer;
                   2767:        host_t *src, *dst;
                   2768:        chunk_t data;
                   2769:        int i;
                   2770: 
                   2771:        writer = bio_writer_create(this->frag->len);
                   2772:        for (i = 0; i < array_count(this->fragments); i++)
                   2773:        {
                   2774:                array_get(this->fragments, i, &fragment);
                   2775:                writer->write_data(writer, fragment->data);
                   2776:        }
                   2777:        data = writer->extract_buf(writer);
                   2778:        writer->destroy(writer);
                   2779: 
                   2780:        /* set addresses to those of the last fragment we received */
                   2781:        src = last->get_source(last);
                   2782:        dst = last->get_destination(last);
                   2783:        this->packet->set_source(this->packet, src->clone(src));
                   2784:        this->packet->set_destination(this->packet, dst->clone(dst));
                   2785: 
                   2786:        reset_defrag(this);
                   2787:        free(this->frag);
                   2788:        this->frag = NULL;
                   2789:        return data;
                   2790: }
                   2791: 
                   2792: METHOD(message_t, add_fragment_v1, status_t,
                   2793:        private_message_t *this, message_t *message)
                   2794: {
                   2795:        fragment_payload_t *payload;
                   2796:        chunk_t data;
                   2797:        uint8_t num;
                   2798:        status_t status;
                   2799: 
                   2800:        if (!this->frag)
                   2801:        {
                   2802:                return INVALID_STATE;
                   2803:        }
                   2804:        payload = (fragment_payload_t*)message->get_payload(message, PLV1_FRAGMENT);
                   2805:        if (!payload)
                   2806:        {
                   2807:                return INVALID_ARG;
                   2808:        }
                   2809:        if (!this->fragments || this->message_id != payload->get_id(payload))
                   2810:        {
                   2811:                reset_defrag(this);
                   2812:                this->message_id = payload->get_id(payload);
                   2813:                /* we don't know the total number of fragments, assume something */
                   2814:                this->fragments = array_create(0, 4);
                   2815:        }
                   2816: 
                   2817:        num = payload->get_number(payload);
                   2818:        data = payload->get_data(payload);
                   2819:        if (!this->frag->last && payload->is_last(payload))
                   2820:        {
                   2821:                this->frag->last = num;
                   2822:        }
                   2823:        status = add_fragment(this, num, data);
                   2824:        if (status != SUCCESS)
                   2825:        {
                   2826:                return status;
                   2827:        }
                   2828: 
                   2829:        if (array_count(this->fragments) != this->frag->last)
                   2830:        {
                   2831:                /* there are some fragments missing */
                   2832:                DBG1(DBG_ENC, "received fragment #%hhu, waiting for complete IKE "
                   2833:                         "message", num);
                   2834:                return NEED_MORE;
                   2835:        }
                   2836: 
                   2837:        data = merge_fragments(this, message);
                   2838:        this->packet->set_data(this->packet, data);
                   2839:        DBG1(DBG_ENC, "received fragment #%hhu, reassembled fragmented IKE "
                   2840:                 "message (%zu bytes)", num, data.len);
                   2841: 
                   2842:        this->parser = parser_create(data);
                   2843: 
                   2844:        if (parse_header(this) != SUCCESS)
                   2845:        {
                   2846:                DBG1(DBG_IKE, "failed to parse header of reassembled IKE message");
                   2847:                return FAILED;
                   2848:        }
                   2849:        return SUCCESS;
                   2850: }
                   2851: 
                   2852: METHOD(message_t, add_fragment_v2, status_t,
                   2853:        private_message_t *this, message_t *message)
                   2854: {
                   2855:        encrypted_fragment_payload_t *encrypted_fragment;
                   2856:        encrypted_payload_t *encrypted;
                   2857:        payload_t *payload;
                   2858:        aead_t *aead;
                   2859:        enumerator_t *enumerator;
                   2860:        chunk_t data;
                   2861:        uint16_t total, num;
                   2862:        size_t len;
                   2863:        status_t status;
                   2864: 
                   2865:        if (!this->frag)
                   2866:        {
                   2867:                return INVALID_STATE;
                   2868:        }
                   2869:        payload = message->get_payload(message, PLV2_FRAGMENT);
                   2870:        if (!payload || this->message_id != message->get_message_id(message))
                   2871:        {
                   2872:                return INVALID_ARG;
                   2873:        }
                   2874:        encrypted_fragment = (encrypted_fragment_payload_t*)payload;
                   2875:        total = encrypted_fragment->get_total_fragments(encrypted_fragment);
                   2876:        if (total > MAX_FRAGMENTS)
                   2877:        {
                   2878:                DBG1(DBG_IKE, "maximum fragment count exceeded");
                   2879:                reset_defrag(this);
                   2880:                return FAILED;
                   2881:        }
                   2882:        if (!this->fragments || total > this->frag->last)
                   2883:        {
                   2884:                reset_defrag(this);
                   2885:                this->frag->last = total;
                   2886:                this->fragments = array_create(0, total);
                   2887:        }
                   2888:        num = encrypted_fragment->get_fragment_number(encrypted_fragment);
                   2889:        data = encrypted_fragment->get_content(encrypted_fragment);
                   2890:        status = add_fragment(this, num, data);
                   2891:        if (status != SUCCESS)
                   2892:        {
                   2893:                return status;
                   2894:        }
                   2895: 
                   2896:        if (num == 1)
                   2897:        {
                   2898:                /* the first fragment denotes the payload type of the first payload in
                   2899:                 * the original encrypted payload, cache that */
                   2900:                this->first_payload = payload->get_next_type(payload);
                   2901:                /* move all unencrypted payloads contained in the first fragment */
                   2902:                enumerator = message->create_payload_enumerator(message);
                   2903:                while (enumerator->enumerate(enumerator, &payload))
                   2904:                {
                   2905:                        if (payload->get_type(payload) != PLV2_FRAGMENT)
                   2906:                        {
                   2907:                                message->remove_payload_at(message, enumerator);
                   2908:                                this->payloads->insert_last(this->payloads, payload);
                   2909:                        }
                   2910:                }
                   2911:                enumerator->destroy(enumerator);
                   2912:        }
                   2913: 
                   2914:        if (array_count(this->fragments) != total)
                   2915:        {
                   2916:                /* there are some fragments missing */
                   2917:                DBG1(DBG_ENC, "received fragment #%hu of %hu, waiting for complete IKE "
                   2918:                         "message", num, total);
                   2919:                return NEED_MORE;
                   2920:        }
                   2921: 
                   2922:        encrypted = (encrypted_payload_t*)encrypted_fragment;
                   2923:        aead = encrypted->get_transform(encrypted);
                   2924: 
                   2925:        data = merge_fragments(this, message);
                   2926: 
                   2927:        encrypted = encrypted_payload_create_from_plain(this->first_payload, data);
                   2928:        encrypted->set_transform(encrypted, aead);
                   2929:        this->payloads->insert_last(this->payloads, encrypted);
                   2930:        /* update next payload type (could be an unencrypted payload) */
                   2931:        this->payloads->get_first(this->payloads, (void**)&payload);
                   2932:        this->first_payload = payload->get_type(payload);
                   2933: 
                   2934:        /* we report the length of the complete IKE message when splitting, do the
                   2935:         * same here, so add the IKEv2 header len to the reassembled payload data */
                   2936:        len = 28;
                   2937:        enumerator = create_payload_enumerator(this);
                   2938:        while (enumerator->enumerate(enumerator, &payload))
                   2939:        {
                   2940:                len += payload->get_length(payload);
                   2941:        }
                   2942:        enumerator->destroy(enumerator);
                   2943: 
                   2944:        DBG1(DBG_ENC, "received fragment #%hu of %hu, reassembled fragmented IKE "
                   2945:                 "message (%zu bytes)", num, total, len);
                   2946:        return SUCCESS;
                   2947: }
                   2948: 
                   2949: METHOD(message_t, destroy, void,
                   2950:        private_message_t *this)
                   2951: {
                   2952:        DESTROY_IF(this->ike_sa_id);
                   2953:        DESTROY_IF(this->parser);
                   2954:        this->payloads->destroy_offset(this->payloads, offsetof(payload_t, destroy));
                   2955:        this->packet->destroy(this->packet);
                   2956:        if (this->frag)
                   2957:        {
                   2958:                reset_defrag(this);
                   2959:                free(this->frag);
                   2960:        }
                   2961:        else
                   2962:        {
                   2963:                array_destroy_offset(this->fragments, offsetof(packet_t, destroy));
                   2964:        }
                   2965:        free(this);
                   2966: }
                   2967: 
                   2968: /*
                   2969:  * Described in header.
                   2970:  */
                   2971: message_t *message_create_from_packet(packet_t *packet)
                   2972: {
                   2973:        private_message_t *this;
                   2974: 
                   2975:        INIT(this,
                   2976:                .public = {
                   2977:                        .set_major_version = _set_major_version,
                   2978:                        .get_major_version = _get_major_version,
                   2979:                        .set_minor_version = _set_minor_version,
                   2980:                        .get_minor_version = _get_minor_version,
                   2981:                        .set_message_id = _set_message_id,
                   2982:                        .get_message_id = _get_message_id,
                   2983:                        .get_initiator_spi = _get_initiator_spi,
                   2984:                        .get_responder_spi = _get_responder_spi,
                   2985:                        .set_ike_sa_id = _set_ike_sa_id,
                   2986:                        .get_ike_sa_id = _get_ike_sa_id,
                   2987:                        .set_exchange_type = _set_exchange_type,
                   2988:                        .get_exchange_type = _get_exchange_type,
                   2989:                        .get_first_payload_type = _get_first_payload_type,
                   2990:                        .set_request = _set_request,
                   2991:                        .get_request = _get_request,
                   2992:                        .set_version_flag = _set_version_flag,
                   2993:                        .get_reserved_header_bit = _get_reserved_header_bit,
                   2994:                        .set_reserved_header_bit = _set_reserved_header_bit,
                   2995:                        .add_payload = _add_payload,
                   2996:                        .add_notify = _add_notify,
                   2997:                        .disable_sort = _disable_sort,
                   2998:                        .generate = _generate,
                   2999:                        .is_encoded = _is_encoded,
                   3000:                        .is_fragmented = _is_fragmented,
                   3001:                        .fragment = _fragment,
                   3002:                        .add_fragment = _add_fragment_v2,
                   3003:                        .set_source = _set_source,
                   3004:                        .get_source = _get_source,
                   3005:                        .set_destination = _set_destination,
                   3006:                        .get_destination = _get_destination,
                   3007:                        .create_payload_enumerator = _create_payload_enumerator,
                   3008:                        .remove_payload_at = _remove_payload_at,
                   3009:                        .get_payload = _get_payload,
                   3010:                        .get_notify = _get_notify,
                   3011:                        .parse_header = _parse_header,
                   3012:                        .parse_body = _parse_body,
                   3013:                        .get_packet = _get_packet,
                   3014:                        .get_packet_data = _get_packet_data,
                   3015:                        .get_fragments = _get_fragments,
                   3016:                        .destroy = _destroy,
                   3017:                },
                   3018:                .exchange_type = EXCHANGE_TYPE_UNDEFINED,
                   3019:                .is_request = TRUE,
                   3020:                .first_payload = PL_NONE,
                   3021:                .packet = packet,
                   3022:                .payloads = linked_list_create(),
                   3023:                .parser = parser_create(packet->get_data(packet)),
                   3024:        );
                   3025: 
                   3026:        return &this->public;
                   3027: }
                   3028: 
                   3029: /*
                   3030:  * Described in header.
                   3031:  */
                   3032: message_t *message_create(int major, int minor)
                   3033: {
                   3034:        message_t *this = message_create_from_packet(packet_create());
                   3035: 
                   3036:        this->set_major_version(this, major);
                   3037:        this->set_minor_version(this, minor);
                   3038: 
                   3039:        return this;
                   3040: }
                   3041: 
                   3042: /*
                   3043:  * Described in header.
                   3044:  */
                   3045: message_t *message_create_defrag(message_t *fragment)
                   3046: {
                   3047:        private_message_t *this;
                   3048: 
                   3049:        if (!fragment->get_payload(fragment, PLV1_FRAGMENT) &&
                   3050:                !fragment->get_payload(fragment, PLV2_FRAGMENT))
                   3051:        {
                   3052:                return NULL;
                   3053:        }
                   3054:        this = (private_message_t*)clone_message((private_message_t*)fragment);
                   3055:        /* we don't need a parser for IKEv2, the one for IKEv1 is created after
                   3056:         * reassembling the original message */
                   3057:        this->parser->destroy(this->parser);
                   3058:        this->parser = NULL;
                   3059:        if (fragment->get_major_version(fragment) == IKEV1_MAJOR_VERSION)
                   3060:        {
                   3061:                /* we store the fragment ID in the message ID field, which should be
                   3062:                 * zero for fragments, but make sure */
                   3063:                this->message_id = 0;
                   3064:                this->public.add_fragment = _add_fragment_v1;
                   3065:        }
                   3066:        INIT(this->frag,
                   3067:                .max_packet = lib->settings->get_int(lib->settings,
                   3068:                                                                "%s.max_packet", PACKET_MAX_DEFAULT, lib->ns),
                   3069:        );
                   3070:        return &this->public;
                   3071: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>