Annotation of embedaddon/strongswan/src/libtls/tls_aead_null.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2014 Martin Willi
                      3:  * Copyright (C) 2014 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 "tls_aead.h"
                     17: 
                     18: typedef struct private_tls_aead_t private_tls_aead_t;
                     19: 
                     20: /**
                     21:  * Private data of an tls_aead_t object.
                     22:  */
                     23: struct private_tls_aead_t {
                     24: 
                     25:        /**
                     26:         * Public tls_aead_t interface.
                     27:         */
                     28:        tls_aead_t public;
                     29: 
                     30:        /**
                     31:         * traditional signer
                     32:         */
                     33:        signer_t *signer;
                     34: };
                     35: 
                     36: /**
                     37:  * Associated header data to create signature over
                     38:  */
                     39: typedef struct __attribute__((__packed__)) {
                     40:        uint64_t seq;
                     41:        uint8_t type;
                     42:        uint16_t version;
                     43:        uint16_t length;
                     44: } sigheader_t;
                     45: 
                     46: METHOD(tls_aead_t, encrypt, bool,
                     47:        private_tls_aead_t *this, tls_version_t version,
                     48:        tls_content_type_t type, uint64_t seq, chunk_t *data)
                     49: {
                     50:        chunk_t assoc, mac;
                     51:        sigheader_t hdr;
                     52: 
                     53:        hdr.type = type;
                     54:        htoun64(&hdr.seq, seq);
                     55:        htoun16(&hdr.version, version);
                     56:        htoun16(&hdr.length, data->len);
                     57: 
                     58:        assoc = chunk_from_thing(hdr);
                     59:        if (!this->signer->get_signature(this->signer, assoc, NULL) ||
                     60:                !this->signer->allocate_signature(this->signer, *data, &mac))
                     61:        {
                     62:                return FALSE;
                     63:        }
                     64:        *data = chunk_cat("mm", *data, mac);
                     65:        return TRUE;
                     66: }
                     67: 
                     68: METHOD(tls_aead_t, decrypt, bool,
                     69:        private_tls_aead_t *this, tls_version_t version,
                     70:        tls_content_type_t type, uint64_t seq, chunk_t *data)
                     71: {
                     72:        chunk_t assoc, mac;
                     73:        sigheader_t hdr;
                     74: 
                     75:        mac.len = this->signer->get_block_size(this->signer);
                     76:        if (data->len < mac.len)
                     77:        {
                     78:                return FALSE;
                     79:        }
                     80:        mac = chunk_skip(*data, data->len - mac.len);
                     81:        data->len -= mac.len;
                     82: 
                     83:        hdr.type = type;
                     84:        htoun64(&hdr.seq, seq);
                     85:        htoun16(&hdr.version, version);
                     86:        htoun16(&hdr.length, data->len);
                     87: 
                     88:        assoc = chunk_from_thing(hdr);
                     89:        if (!this->signer->get_signature(this->signer, assoc, NULL) ||
                     90:                !this->signer->verify_signature(this->signer, *data, mac))
                     91:        {
                     92:                return FALSE;
                     93:        }
                     94:        return TRUE;
                     95: }
                     96: 
                     97: METHOD(tls_aead_t, get_mac_key_size, size_t,
                     98:        private_tls_aead_t *this)
                     99: {
                    100:        return this->signer->get_key_size(this->signer);
                    101: }
                    102: 
                    103: METHOD(tls_aead_t, get_encr_key_size, size_t,
                    104:        private_tls_aead_t *this)
                    105: {
                    106:        return 0;
                    107: }
                    108: 
                    109: METHOD(tls_aead_t, get_iv_size, size_t,
                    110:        private_tls_aead_t *this)
                    111: {
                    112:        return 0;
                    113: }
                    114: 
                    115: METHOD(tls_aead_t, set_keys, bool,
                    116:        private_tls_aead_t *this, chunk_t mac, chunk_t encr, chunk_t iv)
                    117: {
                    118:        if (iv.len || encr.len)
                    119:        {
                    120:                return FALSE;
                    121:        }
                    122:        return this->signer->set_key(this->signer, mac);
                    123: }
                    124: 
                    125: METHOD(tls_aead_t, destroy, void,
                    126:        private_tls_aead_t *this)
                    127: {
                    128:        this->signer->destroy(this->signer);
                    129:        free(this);
                    130: }
                    131: 
                    132: /**
                    133:  * See header
                    134:  */
                    135: tls_aead_t *tls_aead_create_null(integrity_algorithm_t alg)
                    136: {
                    137:        private_tls_aead_t *this;
                    138: 
                    139:        INIT(this,
                    140:                .public = {
                    141:                        .encrypt = _encrypt,
                    142:                        .decrypt = _decrypt,
                    143:                        .get_mac_key_size = _get_mac_key_size,
                    144:                        .get_encr_key_size = _get_encr_key_size,
                    145:                        .get_iv_size = _get_iv_size,
                    146:                        .set_keys = _set_keys,
                    147:                        .destroy = _destroy,
                    148:                },
                    149:                .signer = lib->crypto->create_signer(lib->crypto, alg),
                    150:        );
                    151: 
                    152:        if (!this->signer)
                    153:        {
                    154:                free(this);
                    155:                return NULL;
                    156:        }
                    157: 
                    158:        return &this->public;
                    159: }

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