Annotation of embedaddon/strongswan/src/libstrongswan/plugins/ntru/ntru_trits.c, revision 1.1.1.1

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);

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