Annotation of embedaddon/strongswan/src/libstrongswan/plugins/sha3/sha3_shake.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2016 Andreas Steffen
                      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 "sha3_shake.h"
                     17: #include "sha3_keccak.h"
                     18: 
                     19: typedef struct private_sha3_shake_t private_sha3_shake_t;
                     20: 
                     21: 
                     22: /**
                     23:  * Private data structure with hashing context for SHA-3
                     24:  */
                     25: struct private_sha3_shake_t {
                     26: 
                     27:        /**
                     28:         * Public interface for this hasher.
                     29:         */
                     30:        sha3_shake_t public;
                     31: 
                     32:        /**
                     33:         * XOF algorithm to be used (XOF_SHAKE_128 or XOF_SHAKE_256)
                     34:         */
                     35:        ext_out_function_t algorithm;
                     36: 
                     37:        /**
                     38:         * SHA-3 Keccak state
                     39:         */
                     40:        sha3_keccak_t *keccak;
                     41: 
                     42:        /**
                     43:         * Capacity in bytes of the SHA-3 Keccak state
                     44:         */
                     45:        u_int capacity;
                     46: 
                     47: };
                     48: 
                     49: METHOD(xof_t, get_type, ext_out_function_t,
                     50:        private_sha3_shake_t *this)
                     51: {
                     52:        return this->algorithm;
                     53: }
                     54: 
                     55: METHOD(xof_t, get_bytes, bool,
                     56:        private_sha3_shake_t *this, size_t out_len, uint8_t *buffer)
                     57: {
                     58:        this->keccak->squeeze(this->keccak, out_len, buffer);
                     59:        return TRUE;
                     60: }
                     61: 
                     62: METHOD(xof_t, allocate_bytes, bool,
                     63:        private_sha3_shake_t *this, size_t out_len, chunk_t *chunk)
                     64: {
                     65:        *chunk = chunk_alloc(out_len);
                     66:        this->keccak->squeeze(this->keccak, out_len, chunk->ptr);
                     67:        return TRUE;
                     68: }
                     69: 
                     70: METHOD(xof_t, get_block_size, size_t,
                     71:        private_sha3_shake_t *this)
                     72: {
                     73:        return this->keccak->get_rate(this->keccak);
                     74: }
                     75: 
                     76: METHOD(xof_t, get_seed_size, size_t,
                     77:        private_sha3_shake_t *this)
                     78: {
                     79:        return this->capacity;
                     80: }
                     81: 
                     82: METHOD(xof_t, set_seed, bool,
                     83:        private_sha3_shake_t *this, chunk_t seed)
                     84: {
                     85:        this->keccak->reset(this->keccak);
                     86:        this->keccak->absorb(this->keccak, seed);
                     87:        this->keccak->finalize(this->keccak);
                     88:        return TRUE;
                     89: }
                     90: 
                     91: 
                     92: METHOD(xof_t, destroy, void,
                     93:        private_sha3_shake_t *this)
                     94: {
                     95:        this->keccak->destroy(this->keccak);
                     96:        free(this);
                     97: }
                     98: 
                     99: /*
                    100:  * Described in header.
                    101:  */
                    102: sha3_shake_t* sha3_shake_create(ext_out_function_t algorithm)
                    103: {
                    104:        private_sha3_shake_t *this;
                    105:        u_int capacity = 0;
                    106: 
                    107:        switch (algorithm)
                    108:        {
                    109:                case XOF_SHAKE_128:
                    110:                        capacity = 32;
                    111:                        break;
                    112:                case XOF_SHAKE_256:
                    113:                        capacity = 64;
                    114:                        break;
                    115:                default:
                    116:                        return NULL;
                    117:        }
                    118: 
                    119:        INIT(this,
                    120:                .public = {
                    121:                        .xof_interface = {
                    122:                                .get_type = _get_type,
                    123:                                .get_bytes = _get_bytes,
                    124:                                .allocate_bytes = _allocate_bytes,
                    125:                                .get_block_size = _get_block_size,
                    126:                                .get_seed_size = _get_seed_size,
                    127:                                .set_seed = _set_seed,
                    128:                                .destroy = _destroy,
                    129:                        },
                    130:                },
                    131:                .algorithm = algorithm,
                    132:                .capacity = capacity,
                    133:        );
                    134: 
                    135:        this->keccak = sha3_keccak_create(capacity, 0x1f);
                    136:        if (!this->keccak)
                    137:        {
                    138:                free(this);
                    139:                return NULL;
                    140:        }
                    141: 
                    142:        return &this->public;
                    143: }

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