Annotation of embedaddon/strongswan/src/libcharon/plugins/ipseckey/ipseckey.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2012 Reto Guadagnini
                      3:  * HSR Hochschule fuer Technik Rapperswil
                      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 "ipseckey.h"
                     17: 
                     18: #include <library.h>
                     19: #include <utils/debug.h>
                     20: #include <bio/bio_reader.h>
                     21: 
                     22: typedef struct private_ipseckey_t private_ipseckey_t;
                     23: 
                     24: /**
                     25: * private data of the ipseckey
                     26: */
                     27: struct private_ipseckey_t {
                     28: 
                     29:        /**
                     30:         * public functions
                     31:         */
                     32:        ipseckey_t public;
                     33: 
                     34:        /**
                     35:         * Precedence
                     36:         */
                     37:        uint8_t precedence;
                     38: 
                     39:        /**
                     40:         * Gateway type
                     41:         */
                     42:        uint8_t gateway_type;
                     43: 
                     44:        /**
                     45:         * Algorithm
                     46:         */
                     47:        uint8_t algorithm;
                     48: 
                     49:        /**
                     50:         * Gateway
                     51:         */
                     52:        chunk_t gateway;
                     53: 
                     54:        /**
                     55:         * Public key
                     56:         */
                     57:        chunk_t public_key;
                     58: };
                     59: 
                     60: METHOD(ipseckey_t, get_precedence, uint8_t,
                     61:        private_ipseckey_t *this)
                     62: {
                     63:        return this->precedence;
                     64: }
                     65: 
                     66: METHOD(ipseckey_t, get_gateway_type, ipseckey_gw_type_t,
                     67:        private_ipseckey_t *this)
                     68: {
                     69:        return this->gateway_type;
                     70: }
                     71: 
                     72: METHOD(ipseckey_t, get_algorithm, ipseckey_algorithm_t,
                     73:        private_ipseckey_t *this)
                     74: {
                     75:        return this->algorithm;
                     76: }
                     77: 
                     78: METHOD(ipseckey_t, get_gateway, chunk_t,
                     79:        private_ipseckey_t *this)
                     80: {
                     81:        return this->gateway;
                     82: }
                     83: 
                     84: METHOD(ipseckey_t, get_public_key, chunk_t,
                     85:        private_ipseckey_t *this)
                     86: {
                     87:        return this->public_key;
                     88: }
                     89: 
                     90: METHOD(ipseckey_t, destroy, void,
                     91:        private_ipseckey_t *this)
                     92: {
                     93:        chunk_free(&this->gateway);
                     94:        chunk_free(&this->public_key);
                     95:        free(this);
                     96: }
                     97: 
                     98: /*
                     99:  * See header
                    100:  */
                    101: ipseckey_t *ipseckey_create_frm_rr(rr_t *rr)
                    102: {
                    103:        private_ipseckey_t *this;
                    104:        bio_reader_t *reader = NULL;
                    105:        uint8_t label;
                    106:        chunk_t tmp;
                    107: 
                    108:        INIT(this,
                    109:                        .public = {
                    110:                                .get_precedence = _get_precedence,
                    111:                                .get_gateway_type = _get_gateway_type,
                    112:                                .get_algorithm = _get_algorithm,
                    113:                                .get_gateway = _get_gateway,
                    114:                                .get_public_key = _get_public_key,
                    115:                                .destroy = _destroy,
                    116:                        },
                    117:        );
                    118: 
                    119:        if (rr->get_type(rr) != RR_TYPE_IPSECKEY)
                    120:        {
                    121:                DBG1(DBG_CFG, "unable to create an ipseckey out of an RR "
                    122:                                          "whose type is not IPSECKEY");
                    123:                free(this);
                    124:                return NULL;
                    125:        }
                    126: 
                    127:        /** Parse the content (RDATA field) of the RR */
                    128:        reader = bio_reader_create(rr->get_rdata(rr));
                    129:        if (!reader->read_uint8(reader, &this->precedence) ||
                    130:                !reader->read_uint8(reader, &this->gateway_type) ||
                    131:                !reader->read_uint8(reader, &this->algorithm))
                    132:        {
                    133:                DBG1(DBG_CFG, "ipseckey RR has a wrong format");
                    134:                reader->destroy(reader);
                    135:                free(this);
                    136:                return NULL;
                    137:        }
                    138: 
                    139:        switch (this->gateway_type)
                    140:        {
                    141:                case IPSECKEY_GW_TP_NOT_PRESENT:
                    142:                        break;
                    143: 
                    144:                case IPSECKEY_GW_TP_IPV4:
                    145:                        if (!reader->read_data(reader, 4, &this->gateway))
                    146:                        {
                    147:                                DBG1(DBG_CFG, "ipseckey gateway field does not contain an "
                    148:                                                          "IPv4 address as expected");
                    149:                                reader->destroy(reader);
                    150:                                free(this);
                    151:                                return NULL;
                    152:                        }
                    153:                        this->gateway = chunk_clone(this->gateway);
                    154:                        break;
                    155: 
                    156:                case IPSECKEY_GW_TP_IPV6:
                    157:                        if (!reader->read_data(reader, 16, &this->gateway))
                    158:                        {
                    159:                                DBG1(DBG_CFG, "ipseckey gateway field does not contain an "
                    160:                                                          "IPv6 address as expected");
                    161:                                reader->destroy(reader);
                    162:                                free(this);
                    163:                                return NULL;
                    164:                        }
                    165:                        this->gateway = chunk_clone(this->gateway);
                    166:                        break;
                    167: 
                    168:                case IPSECKEY_GW_TP_WR_ENC_DNAME:
                    169:                        /**
                    170:                         * Uncompressed domain name as defined in RFC 1035 chapter 3.
                    171:                         *
                    172:                         * TODO: Currently we ignore wire encoded domain names.
                    173:                         *
                    174:                         */
                    175:                        while (reader->read_uint8(reader, &label) &&
                    176:                                   label != 0 && label < 192)
                    177:                        {
                    178:                                if (!reader->read_data(reader, label, &tmp))
                    179:                                {
                    180:                                        DBG1(DBG_CFG, "wrong wire encoded domain name format "
                    181:                                                                  "in ipseckey gateway field");
                    182:                                        reader->destroy(reader);
                    183:                                        free(this);
                    184:                                        return NULL;
                    185:                                }
                    186:                        }
                    187:                        break;
                    188: 
                    189:                default:
                    190:                        DBG1(DBG_CFG, "unable to parse ipseckey gateway field");
                    191:                        reader->destroy(reader);
                    192:                        free(this);
                    193:                        return NULL;
                    194:        }
                    195: 
                    196:        if (!reader->read_data(reader, reader->remaining(reader),
                    197:                                                   &this->public_key))
                    198:        {
                    199:                DBG1(DBG_CFG, "failed to read ipseckey public key field");
                    200:                reader->destroy(reader);
                    201:                chunk_free(&this->gateway);
                    202:                free(this);
                    203:                return NULL;
                    204:        }
                    205:        this->public_key = chunk_clone(this->public_key);
                    206:        reader->destroy(reader);
                    207:        return &this->public;
                    208: }
                    209: 

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