Annotation of embedaddon/strongswan/src/conftest/hooks/ike_auth_fill.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2010 Martin Willi
                      3:  * Copyright (C) 2010 revosec AG
                      4:  *
                      5:  * This program is free software; you can redistribute it and/or modify it
                      6:  * under the terms of the GNU General Public License as published by the
                      7:  * Free Software Foundation; either version 2 of the License, or (at your
                      8:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                      9:  *
                     10:  * This program is distributed in the hope that it will be useful, but
                     11:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     12:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     13:  * for more details.
                     14:  */
                     15: 
                     16: #include "hook.h"
                     17: 
                     18: #include <time.h>
                     19: #include <netinet/udp.h>
                     20: 
                     21: #include <encoding/payloads/cert_payload.h>
                     22: #include <encoding/payloads/encrypted_payload.h>
                     23: 
                     24: typedef struct private_ike_auth_fill_t private_ike_auth_fill_t;
                     25: 
                     26: /**
                     27:  * Private data of an ike_auth_fill_t object.
                     28:  */
                     29: struct private_ike_auth_fill_t {
                     30: 
                     31:        /**
                     32:         * Implements the hook_t interface.
                     33:         */
                     34:        hook_t hook;
                     35: 
                     36:        /**
                     37:         * Alter requests or responses?
                     38:         */
                     39:        bool req;
                     40: 
                     41:        /**
                     42:         * ID of message to alter.
                     43:         */
                     44:        int id;
                     45: 
                     46:        /**
                     47:         * Number of bytes to fill IKE_AUTH up
                     48:         */
                     49:        int bytes;
                     50: };
                     51: 
                     52: /** size of non ESP-Marker */
                     53: #define NON_ESP_MARKER_LEN 4
                     54: /** length of fixed encryption payload header */
                     55: #define ENCRYPTION_PAYLOAD_HEADER_LENGTH 4
                     56: /** length of fixed cert payload header */
                     57: #define CERT_PAYLOAD_HEADER_LENGTH 5
                     58: /**
                     59:  * Calculate packet size on wire (without ethernet/IP header)
                     60:  */
                     61: static size_t calculate_wire_size(message_t *message, ike_sa_t *ike_sa)
                     62: {
                     63:        enumerator_t *enumerator;
                     64:        payload_t *payload;
                     65:        size_t size = 0;
                     66: 
                     67:        enumerator = message->create_payload_enumerator(message);
                     68:        while (enumerator->enumerate(enumerator, &payload))
                     69:        {
                     70:                size += payload->get_length(payload);
                     71:        }
                     72:        enumerator->destroy(enumerator);
                     73: 
                     74:        if (message->get_exchange_type(message) != IKE_SA_INIT)
                     75:        {
                     76:                keymat_t *keymat;
                     77:                aead_t *aead;
                     78:                size_t  bs;
                     79: 
                     80:                keymat = ike_sa->get_keymat(ike_sa);
                     81:                aead = keymat->get_aead(keymat, FALSE);
                     82:                if (aead)
                     83:                {
                     84:                        bs = aead->get_block_size(aead);
                     85:                        size += ENCRYPTION_PAYLOAD_HEADER_LENGTH + NON_ESP_MARKER_LEN +
                     86:                                aead->get_icv_size(aead) + aead->get_iv_size(aead) +
                     87:                                (bs - (size % bs));
                     88:                }
                     89:        }
                     90:        return sizeof(struct udphdr) + IKE_HEADER_LENGTH + size;
                     91: }
                     92: 
                     93: METHOD(listener_t, message, bool,
                     94:        private_ike_auth_fill_t *this, ike_sa_t *ike_sa, message_t *message,
                     95:        bool incoming, bool plain)
                     96: {
                     97:        if (!incoming && plain &&
                     98:                message->get_request(message) == this->req &&
                     99:                message->get_message_id(message) == this->id)
                    100:        {
                    101:                cert_payload_t *pld;
                    102:                size_t size, diff;
                    103:                chunk_t data;
                    104: 
                    105:                size = calculate_wire_size(message, ike_sa);
                    106:                if (size < this->bytes - CERT_PAYLOAD_HEADER_LENGTH)
                    107:                {
                    108:                        diff = this->bytes - size - CERT_PAYLOAD_HEADER_LENGTH;
                    109:                        data = chunk_alloc(diff);
                    110:                        memset(data.ptr, 0x12, data.len);
                    111:                        pld = cert_payload_create_custom(PLV2_CERTIFICATE, 201, data);
                    112:                        message->add_payload(message, &pld->payload_interface);
                    113:                        DBG1(DBG_CFG, "inserting %d dummy bytes certificate payload", diff);
                    114:                }
                    115:        }
                    116:        return TRUE;
                    117: }
                    118: 
                    119: METHOD(hook_t, destroy, void,
                    120:        private_ike_auth_fill_t *this)
                    121: {
                    122:        free(this);
                    123: }
                    124: 
                    125: /**
                    126:  * Create the IKE_AUTH fill hook
                    127:  */
                    128: hook_t *ike_auth_fill_hook_create(char *name)
                    129: {
                    130:        private_ike_auth_fill_t *this;
                    131: 
                    132:        INIT(this,
                    133:                .hook = {
                    134:                        .listener = {
                    135:                                .message = _message,
                    136:                        },
                    137:                        .destroy = _destroy,
                    138:                },
                    139:                .req = conftest->test->get_bool(conftest->test,
                    140:                                                                                "hooks.%s.request", TRUE, name),
                    141:                .id = conftest->test->get_int(conftest->test,
                    142:                                                                                "hooks.%s.id", 1, name),
                    143:                .bytes = conftest->test->get_int(conftest->test,
                    144:                                                                                "hooks.%s.bytes", 0, name),
                    145:        );
                    146: 
                    147:        return &this->hook;
                    148: }

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