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

1.1       misho       1: /*
                      2:  * Copyright (C) 2005-2010 Martin Willi
                      3:  * Copyright (C) 2010 revosec AG
                      4:  * Copyright (C) 2005 Jan Hutter
                      5:  * HSR Hochschule fuer Technik Rapperswil
                      6:  *
                      7:  * This program is free software; you can redistribute it and/or modify it
                      8:  * under the terms of the GNU General Public License as published by the
                      9:  * Free Software Foundation; either version 2 of the License, or (at your
                     10:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                     11:  *
                     12:  * This program is distributed in the hope that it will be useful, but
                     13:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     14:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     15:  * for more details.
                     16:  */
                     17: 
                     18: #include <stddef.h>
                     19: 
                     20: #include "ke_payload.h"
                     21: 
                     22: #include <encoding/payloads/encodings.h>
                     23: 
                     24: typedef struct private_ke_payload_t private_ke_payload_t;
                     25: 
                     26: /**
                     27:  * Private data of an ke_payload_t object.
                     28:  */
                     29: struct private_ke_payload_t {
                     30: 
                     31:        /**
                     32:         * Public ke_payload_t interface.
                     33:         */
                     34:        ke_payload_t public;
                     35: 
                     36:        /**
                     37:         * Next payload type.
                     38:         */
                     39:        uint8_t  next_payload;
                     40: 
                     41:        /**
                     42:         * Critical flag.
                     43:         */
                     44:        bool critical;
                     45: 
                     46:        /**
                     47:         * Reserved bits
                     48:         */
                     49:        bool reserved_bit[7];
                     50: 
                     51:        /**
                     52:         * Reserved bytes
                     53:         */
                     54:        uint8_t reserved_byte[2];
                     55: 
                     56:        /**
                     57:         * Length of this payload.
                     58:         */
                     59:        uint16_t payload_length;
                     60: 
                     61:        /**
                     62:         * DH Group Number.
                     63:         */
                     64:        uint16_t dh_group_number;
                     65: 
                     66:        /**
                     67:         * Key Exchange Data of this KE payload.
                     68:         */
                     69:        chunk_t key_exchange_data;
                     70: 
                     71:        /**
                     72:         * Payload type, PLV2_KEY_EXCHANGE or PLV1_KEY_EXCHANGE
                     73:         */
                     74:        payload_type_t type;
                     75: };
                     76: 
                     77: /**
                     78:  * Encoding rules for IKEv2 key exchange payload.
                     79:  */
                     80: static encoding_rule_t encodings_v2[] = {
                     81:        /* 1 Byte next payload type, stored in the field next_payload */
                     82:        { U_INT_8,                              offsetof(private_ke_payload_t, next_payload)    },
                     83:        /* the critical bit */
                     84:        { FLAG,                                 offsetof(private_ke_payload_t, critical)                },
                     85:        /* 7 Bit reserved bits */
                     86:        { RESERVED_BIT,                 offsetof(private_ke_payload_t, reserved_bit[0]) },
                     87:        { RESERVED_BIT,                 offsetof(private_ke_payload_t, reserved_bit[1]) },
                     88:        { RESERVED_BIT,                 offsetof(private_ke_payload_t, reserved_bit[2]) },
                     89:        { RESERVED_BIT,                 offsetof(private_ke_payload_t, reserved_bit[3]) },
                     90:        { RESERVED_BIT,                 offsetof(private_ke_payload_t, reserved_bit[4]) },
                     91:        { RESERVED_BIT,                 offsetof(private_ke_payload_t, reserved_bit[5]) },
                     92:        { RESERVED_BIT,                 offsetof(private_ke_payload_t, reserved_bit[6]) },
                     93:        /* Length of the whole payload*/
                     94:        { PAYLOAD_LENGTH,               offsetof(private_ke_payload_t, payload_length)  },
                     95:        /* DH Group number as 16 bit field*/
                     96:        { U_INT_16,                             offsetof(private_ke_payload_t, dh_group_number) },
                     97:        /* 2 reserved bytes */
                     98:        { RESERVED_BYTE,                offsetof(private_ke_payload_t, reserved_byte[0])},
                     99:        { RESERVED_BYTE,                offsetof(private_ke_payload_t, reserved_byte[1])},
                    100:        /* Key Exchange Data is from variable size */
                    101:        { CHUNK_DATA,                   offsetof(private_ke_payload_t, key_exchange_data)},
                    102: };
                    103: 
                    104: /*
                    105:                            1                   2                   3
                    106:        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
                    107:       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                    108:       ! Next Payload  !C!  RESERVED   !         Payload Length        !
                    109:       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                    110:       !          DH Group #           !           RESERVED            !
                    111:       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                    112:       !                                                               !
                    113:       ~                       Key Exchange Data                       ~
                    114:       !                                                               !
                    115:       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                    116: */
                    117: 
                    118: static encoding_rule_t encodings_v1[] = {
                    119:        /* 1 Byte next payload type, stored in the field next_payload */
                    120:        { U_INT_8,                              offsetof(private_ke_payload_t, next_payload)    },
                    121:        /* Reserved Byte */
                    122:        { RESERVED_BYTE,                offsetof(private_ke_payload_t, reserved_byte[0])},
                    123:        /* Length of the whole payload*/
                    124:        { PAYLOAD_LENGTH,               offsetof(private_ke_payload_t, payload_length)  },
                    125:        /* Key Exchange Data is from variable size */
                    126:        { CHUNK_DATA,                   offsetof(private_ke_payload_t, key_exchange_data)},
                    127: };
                    128: 
                    129: /*
                    130:                            1                   2                   3
                    131:        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
                    132:       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                    133:       ! Next Payload  !    RESERVED   !         Payload Length        !
                    134:       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                    135:       !                                                               !
                    136:       ~                       Key Exchange Data                       ~
                    137:       !                                                               !
                    138:       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                    139: */
                    140: 
                    141: 
                    142: METHOD(payload_t, verify, status_t,
                    143:        private_ke_payload_t *this)
                    144: {
                    145:        return SUCCESS;
                    146: }
                    147: 
                    148: METHOD(payload_t, get_encoding_rules, int,
                    149:        private_ke_payload_t *this, encoding_rule_t **rules)
                    150: {
                    151:        if (this->type == PLV2_KEY_EXCHANGE)
                    152:        {
                    153:                *rules = encodings_v2;
                    154:                return countof(encodings_v2);
                    155:        }
                    156:        *rules = encodings_v1;
                    157:        return countof(encodings_v1);
                    158: }
                    159: 
                    160: METHOD(payload_t, get_header_length, int,
                    161:        private_ke_payload_t *this)
                    162: {
                    163:        if (this->type == PLV2_KEY_EXCHANGE)
                    164:        {
                    165:                return 8;
                    166:        }
                    167:        return 4;
                    168: }
                    169: 
                    170: METHOD(payload_t, get_type, payload_type_t,
                    171:        private_ke_payload_t *this)
                    172: {
                    173:        return this->type;
                    174: }
                    175: 
                    176: METHOD(payload_t, get_next_type, payload_type_t,
                    177:        private_ke_payload_t *this)
                    178: {
                    179:        return this->next_payload;
                    180: }
                    181: 
                    182: METHOD(payload_t, set_next_type, void,
                    183:        private_ke_payload_t *this,payload_type_t type)
                    184: {
                    185:        this->next_payload = type;
                    186: }
                    187: 
                    188: METHOD(payload_t, get_length, size_t,
                    189:        private_ke_payload_t *this)
                    190: {
                    191:        return this->payload_length;
                    192: }
                    193: 
                    194: METHOD(ke_payload_t, get_key_exchange_data, chunk_t,
                    195:        private_ke_payload_t *this)
                    196: {
                    197:        return this->key_exchange_data;
                    198: }
                    199: 
                    200: METHOD(ke_payload_t, get_dh_group_number, diffie_hellman_group_t,
                    201:        private_ke_payload_t *this)
                    202: {
                    203:        return this->dh_group_number;
                    204: }
                    205: 
                    206: METHOD2(payload_t, ke_payload_t, destroy, void,
                    207:        private_ke_payload_t *this)
                    208: {
                    209:        free(this->key_exchange_data.ptr);
                    210:        free(this);
                    211: }
                    212: 
                    213: /*
                    214:  * Described in header
                    215:  */
                    216: ke_payload_t *ke_payload_create(payload_type_t type)
                    217: {
                    218:        private_ke_payload_t *this;
                    219: 
                    220:        INIT(this,
                    221:                .public = {
                    222:                        .payload_interface = {
                    223:                                .verify = _verify,
                    224:                                .get_encoding_rules = _get_encoding_rules,
                    225:                                .get_header_length = _get_header_length,
                    226:                                .get_length = _get_length,
                    227:                                .get_next_type = _get_next_type,
                    228:                                .set_next_type = _set_next_type,
                    229:                                .get_type = _get_type,
                    230:                                .destroy = _destroy,
                    231:                        },
                    232:                        .get_key_exchange_data = _get_key_exchange_data,
                    233:                        .get_dh_group_number = _get_dh_group_number,
                    234:                        .destroy = _destroy,
                    235:                },
                    236:                .next_payload = PL_NONE,
                    237:                .dh_group_number = MODP_NONE,
                    238:                .type = type,
                    239:        );
                    240:        this->payload_length = get_header_length(this);
                    241:        return &this->public;
                    242: }
                    243: 
                    244: /*
                    245:  * Described in header
                    246:  */
                    247: ke_payload_t *ke_payload_create_from_diffie_hellman(payload_type_t type,
                    248:                                                                                                        diffie_hellman_t *dh)
                    249: {
                    250:        private_ke_payload_t *this;
                    251:        chunk_t value;
                    252: 
                    253:        if (!dh->get_my_public_value(dh, &value))
                    254:        {
                    255:                return NULL;
                    256:        }
                    257:        this = (private_ke_payload_t*)ke_payload_create(type);
                    258:        this->key_exchange_data = value;
                    259:        this->dh_group_number = dh->get_dh_group(dh);
                    260:        this->payload_length += this->key_exchange_data.len;
                    261: 
                    262:        return &this->public;
                    263: }

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