Annotation of embedaddon/strongswan/src/libstrongswan/plugins/botan/botan_crypter.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2018 RenĂ© Korthaus
                      3:  * Copyright (C) 2018 Konstantinos Kolelis
                      4:  * Copyright (C) 2018 Tobias Hommel
                      5:  * Rohde & Schwarz Cybersecurity GmbH
                      6:  *
                      7:  * Permission is hereby granted, free of charge, to any person obtaining a copy
                      8:  * of this software and associated documentation files (the "Software"), to deal
                      9:  * in the Software without restriction, including without limitation the rights
                     10:  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
                     11:  * copies of the Software, and to permit persons to whom the Software is
                     12:  * furnished to do so, subject to the following conditions:
                     13:  *
                     14:  * The above copyright notice and this permission notice shall be included in
                     15:  * all copies or substantial portions of the Software.
                     16:  *
                     17:  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
                     18:  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
                     19:  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
                     20:  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
                     21:  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
                     22:  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
                     23:  * THE SOFTWARE.
                     24:  */
                     25: 
                     26: #include "botan_crypter.h"
                     27: 
                     28: #include <botan/build.h>
                     29: 
                     30: #if defined(BOTAN_HAS_AES) && defined(BOTAN_HAS_MODE_CBC)
                     31: 
                     32: #include <botan/ffi.h>
                     33: 
                     34: typedef struct private_botan_crypter_t private_botan_crypter_t;
                     35: 
                     36: /**
                     37:  * Private data of botan_crypter_t
                     38:  */
                     39: struct private_botan_crypter_t {
                     40: 
                     41:        /**
                     42:         * Public part of this class
                     43:         */
                     44:        botan_crypter_t public;
                     45: 
                     46:        /**
                     47:         * The key
                     48:         */
                     49:        chunk_t key;
                     50: 
                     51:        /**
                     52:         * The cipher name
                     53:         */
                     54:        const char* cipher_name;
                     55: };
                     56: 
                     57: /**
                     58:  * Do the actual en/decryption
                     59:  */
                     60: static bool crypt(private_botan_crypter_t *this, chunk_t data, chunk_t iv,
                     61:                                  chunk_t *dst, uint32_t init_flag)
                     62: {
                     63:        botan_cipher_t cipher;
                     64:        size_t output_written = 0;
                     65:        size_t input_consumed = 0;
                     66:        uint8_t *in, *out;
                     67:        bool success = FALSE;
                     68: 
                     69:        in = data.ptr;
                     70:        if (dst)
                     71:        {
                     72:                *dst = chunk_alloc(data.len);
                     73:                out = dst->ptr;
                     74:        }
                     75:        else
                     76:        {
                     77:                out = data.ptr;
                     78:        }
                     79: 
                     80:        if (botan_cipher_init(&cipher, this->cipher_name, init_flag))
                     81:        {
                     82:                return FALSE;
                     83:        }
                     84: 
                     85:        if (!botan_cipher_set_key(cipher, this->key.ptr, this->key.len) &&
                     86:                !botan_cipher_start(cipher, iv.ptr, iv.len) &&
                     87:                !botan_cipher_update(cipher, BOTAN_CIPHER_UPDATE_FLAG_FINAL, out,
                     88:                                                         data.len, &output_written, in, data.len,
                     89:                                                         &input_consumed) &&
                     90:                (output_written == input_consumed))
                     91:        {
                     92:                success = TRUE;
                     93:        }
                     94: 
                     95:        botan_cipher_destroy(cipher);
                     96:        return success;
                     97: }
                     98: 
                     99: METHOD(crypter_t, decrypt, bool,
                    100:        private_botan_crypter_t *this, chunk_t data, chunk_t iv, chunk_t *dst)
                    101: {
                    102:        return crypt(this, data, iv, dst, BOTAN_CIPHER_INIT_FLAG_DECRYPT);
                    103: }
                    104: 
                    105: 
                    106: METHOD(crypter_t, encrypt, bool,
                    107:        private_botan_crypter_t *this, chunk_t data, chunk_t iv, chunk_t *dst)
                    108: {
                    109:        return crypt(this, data, iv, dst, BOTAN_CIPHER_INIT_FLAG_ENCRYPT);
                    110: }
                    111: 
                    112: METHOD(crypter_t, get_block_size, size_t,
                    113:        private_botan_crypter_t *this)
                    114: {
                    115:        return AES_BLOCK_SIZE;
                    116: }
                    117: 
                    118: METHOD(crypter_t, get_iv_size, size_t,
                    119:        private_botan_crypter_t *this)
                    120: {
                    121:        return AES_BLOCK_SIZE;
                    122: }
                    123: 
                    124: METHOD(crypter_t, get_key_size, size_t,
                    125:        private_botan_crypter_t *this)
                    126: {
                    127:        return this->key.len;
                    128: }
                    129: 
                    130: METHOD(crypter_t, set_key, bool,
                    131:        private_botan_crypter_t *this, chunk_t key)
                    132: {
                    133:        memcpy(this->key.ptr, key.ptr, min(key.len, this->key.len));
                    134:        return TRUE;
                    135: }
                    136: 
                    137: METHOD(crypter_t, destroy, void,
                    138:        private_botan_crypter_t *this)
                    139: {
                    140:        chunk_clear(&this->key);
                    141:        free(this);
                    142: }
                    143: 
                    144: /*
                    145:  * Described in header
                    146:  */
                    147: botan_crypter_t *botan_crypter_create(encryption_algorithm_t algo,
                    148:                                                                          size_t key_size)
                    149: {
                    150:        private_botan_crypter_t *this;
                    151: 
                    152:        INIT(this,
                    153:                .public = {
                    154:                        .crypter = {
                    155:                                .encrypt = _encrypt,
                    156:                                .decrypt = _decrypt,
                    157:                                .get_block_size = _get_block_size,
                    158:                                .get_iv_size = _get_iv_size,
                    159:                                .get_key_size = _get_key_size,
                    160:                                .set_key = _set_key,
                    161:                                .destroy = _destroy,
                    162:                        },
                    163:                },
                    164:        );
                    165: 
                    166:        switch (algo)
                    167:        {
                    168:                case ENCR_AES_CBC:
                    169:                        switch (key_size)
                    170:                        {
                    171:                                case 16:
                    172:                                        /* AES 128 */
                    173:                                        this->cipher_name = "AES-128/CBC/NoPadding";
                    174:                                        break;
                    175:                                case 24:
                    176:                                        /* AES-192 */
                    177:                                        this->cipher_name = "AES-192/CBC/NoPadding";
                    178:                                        break;
                    179:                                case 32:
                    180:                                        /* AES-256 */
                    181:                                        this->cipher_name = "AES-256/CBC/NoPadding";
                    182:                                        break;
                    183:                                default:
                    184:                                        free(this);
                    185:                                        return NULL;
                    186:                        }
                    187:                        break;
                    188:                default:
                    189:                        free(this);
                    190:                        return NULL;
                    191:        }
                    192: 
                    193:        this->key = chunk_alloc(key_size);
                    194:        return &this->public;
                    195: }
                    196: 
                    197: #endif

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