Return to ntru_trits.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / strongswan / src / libstrongswan / plugins / ntru |
1.1 misho 1: /* 2: * Copyright (C) 2013-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 "ntru_trits.h" 17: #include "ntru_convert.h" 18: 19: #include <crypto/xofs/xof_bitspender.h> 20: #include <utils/debug.h> 21: #include <utils/test.h> 22: 23: typedef struct private_ntru_trits_t private_ntru_trits_t; 24: 25: /** 26: * Private data of an ntru_trits_t object. 27: */ 28: struct private_ntru_trits_t { 29: 30: /** 31: * Public ntru_trits_t interface. 32: */ 33: ntru_trits_t public; 34: 35: /** 36: * Size of the trits array 37: */ 38: size_t trits_len; 39: 40: /** 41: * Array containing a trit per octet 42: */ 43: uint8_t *trits; 44: 45: }; 46: 47: METHOD(ntru_trits_t, get_size, size_t, 48: private_ntru_trits_t *this) 49: { 50: return this->trits_len; 51: } 52: 53: METHOD(ntru_trits_t, get_trits, uint8_t*, 54: private_ntru_trits_t *this) 55: { 56: return this->trits; 57: } 58: 59: METHOD(ntru_trits_t, destroy, void, 60: private_ntru_trits_t *this) 61: { 62: memwipe(this->trits, this->trits_len); 63: free(this->trits); 64: free(this); 65: } 66: 67: /* 68: * Described in header. 69: */ 70: ntru_trits_t *ntru_trits_create(size_t len, ext_out_function_t alg, 71: chunk_t seed) 72: { 73: private_ntru_trits_t *this; 74: uint8_t octet, buf[5], *trits; 75: size_t trits_needed; 76: xof_bitspender_t *bitspender; 77: 78: bitspender = xof_bitspender_create(alg, seed, TRUE); 79: if (!bitspender) 80: { 81: return NULL; 82: } 83: 84: INIT(this, 85: .public = { 86: .get_size = _get_size, 87: .get_trits = _get_trits, 88: .destroy = _destroy, 89: }, 90: .trits_len = len, 91: .trits = malloc(len), 92: ); 93: 94: trits = this->trits; 95: trits_needed = this->trits_len; 96: 97: while (trits_needed > 0) 98: { 99: if (!bitspender->get_byte(bitspender, &octet)) 100: { 101: bitspender->destroy(bitspender); 102: destroy(this); 103: return NULL; 104: } 105: if (octet < 243) /* 243 = 3^5 */ 106: { 107: ntru_octet_2_trits(octet, (trits_needed < 5) ? buf : trits); 108: if (trits_needed < 5) 109: { 110: memcpy(trits, buf, trits_needed); 111: break; 112: } 113: trits += 5; 114: trits_needed -= 5; 115: } 116: } 117: bitspender->destroy(bitspender); 118: 119: return &this->public; 120: } 121: 122: EXPORT_FUNCTION_FOR_TESTS(ntru, ntru_trits_create);