Return to sha3_shake.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / strongswan / src / libstrongswan / plugins / sha3 |
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: }