Annotation of embedaddon/strongswan/src/libstrongswan/plugins/bliss/bliss_signature.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2014 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 "bliss_signature.h"
! 17: #include "bliss_bitpacker.h"
! 18: #include "bliss_huffman_coder.h"
! 19:
! 20:
! 21: typedef struct private_bliss_signature_t private_bliss_signature_t;
! 22:
! 23: /**
! 24: * Private data of a bliss_signature_t object.
! 25: */
! 26: struct private_bliss_signature_t {
! 27: /**
! 28: * Public interface for this signer.
! 29: */
! 30: bliss_signature_t public;
! 31:
! 32: /**
! 33: * BLISS signature parameter set
! 34: */
! 35: const bliss_param_set_t *set;
! 36:
! 37: /**
! 38: * BLISS signature vector z1 of size n
! 39: */
! 40: int32_t *z1;
! 41:
! 42: /**
! 43: * BLISS signature vector z2d of size n
! 44: */
! 45: int16_t *z2d;
! 46:
! 47: /**
! 48: * Indices of sparse BLISS challenge vector c of size kappa
! 49: */
! 50: uint16_t *c_indices;
! 51:
! 52: };
! 53:
! 54: METHOD(bliss_signature_t, get_encoding, chunk_t,
! 55: private_bliss_signature_t *this)
! 56: {
! 57: bliss_bitpacker_t *packer;
! 58: bliss_huffman_coder_t *coder;
! 59: bliss_huffman_code_t *code;
! 60: int32_t z1;
! 61: uint32_t z1_sign;
! 62: uint16_t z2d_bits;
! 63: chunk_t encoding = chunk_empty;
! 64: int i;
! 65:
! 66: z2d_bits = this->set->z1_bits - this->set->d;
! 67:
! 68: /* Get Huffman code for this BLISS parameter set */
! 69: code = bliss_huffman_code_get_by_id(this->set->id);
! 70: if (!code)
! 71: {
! 72: DBG1(DBG_LIB, "no Huffman code found for parameter set %N",
! 73: bliss_param_set_id_names, this->set->id);
! 74: return chunk_empty;
! 75: }
! 76:
! 77: packer = bliss_bitpacker_create(this->set->n * this->set->z1_bits +
! 78: this->set->n * z2d_bits +
! 79: this->set->kappa * this->set->n_bits);
! 80: coder = bliss_huffman_coder_create(code, packer);
! 81:
! 82: for (i = 0; i < this->set->n; i++)
! 83: {
! 84: /* determine and remove the sign of z1[i]*/
! 85: z1_sign = this->z1[i] < 0;
! 86: z1 = z1_sign ? -this->z1[i] : this->z1[i];
! 87:
! 88: if (!packer->write_bits(packer, z1_sign, 1) ||
! 89: !packer->write_bits(packer, z1 & 0xff, 8) ||
! 90: !coder->encode(coder, z1 >> 8, this->z2d[i]))
! 91: {
! 92: goto end;
! 93: }
! 94: }
! 95: for (i = 0; i < this->set->kappa; i++)
! 96: {
! 97: if (!packer->write_bits(packer, this->c_indices[i], this->set->n_bits))
! 98: {
! 99: goto end;
! 100: }
! 101: }
! 102: encoding = packer->extract_buf(packer);
! 103:
! 104: DBG2(DBG_LIB, "efficiency of Huffman coder is %6.4f bits/tuple (%u bits)",
! 105: coder->get_bits(coder)/(double)(this->set->n),
! 106: coder->get_bits(coder));
! 107: DBG2(DBG_LIB, "generated BLISS signature (%u bits encoded in %u bytes)",
! 108: packer->get_bits(packer), encoding.len);
! 109:
! 110: end:
! 111: coder->destroy(coder);
! 112: packer->destroy(packer);
! 113: return encoding;
! 114: }
! 115:
! 116: METHOD(bliss_signature_t, get_parameters, void,
! 117: private_bliss_signature_t *this, int32_t **z1, int16_t **z2d,
! 118: uint16_t **c_indices)
! 119: {
! 120: *z1 = this->z1;
! 121: *z2d = this->z2d;
! 122: *c_indices = this->c_indices;
! 123: }
! 124:
! 125: METHOD(bliss_signature_t, destroy, void,
! 126: private_bliss_signature_t *this)
! 127: {
! 128: free(this->z1);
! 129: free(this->z2d);
! 130: free(this->c_indices);
! 131: free(this);
! 132: }
! 133:
! 134: /**
! 135: * See header.
! 136: */
! 137: bliss_signature_t *bliss_signature_create(const bliss_param_set_t *set)
! 138: {
! 139: private_bliss_signature_t *this;
! 140:
! 141: INIT(this,
! 142: .public = {
! 143: .get_encoding = _get_encoding,
! 144: .get_parameters = _get_parameters,
! 145: .destroy = _destroy,
! 146: },
! 147: .set = set,
! 148: .z1 = malloc(set->n * sizeof(int32_t)),
! 149: .z2d = malloc(set->n * sizeof(int16_t)),
! 150: .c_indices = malloc(set->n * sizeof(uint16_t)),
! 151: );
! 152:
! 153: return &this->public;
! 154: }
! 155:
! 156: /**
! 157: * See header.
! 158: */
! 159: bliss_signature_t *bliss_signature_create_from_data(const bliss_param_set_t *set,
! 160: chunk_t encoding)
! 161: {
! 162: private_bliss_signature_t *this;
! 163: bliss_bitpacker_t *packer;
! 164: bliss_huffman_coder_t *coder;
! 165: bliss_huffman_code_t *code;
! 166: uint32_t z1_sign, z1_low, value;
! 167: int32_t z1;
! 168: int16_t z2;
! 169: int i;
! 170:
! 171: /* Get Huffman code for this BLISS parameter set */
! 172: code = bliss_huffman_code_get_by_id(set->id);
! 173: if (!code)
! 174: {
! 175: DBG1(DBG_LIB, "no Huffman code found for parameter set %N",
! 176: bliss_param_set_id_names, set->id);
! 177: return NULL;
! 178: }
! 179:
! 180: if (encoding.len == 0)
! 181: {
! 182: DBG1(DBG_LIB, "zero length BLISS signature");
! 183: return NULL;
! 184: }
! 185:
! 186: INIT(this,
! 187: .public = {
! 188: .get_encoding = _get_encoding,
! 189: .get_parameters = _get_parameters,
! 190: .destroy = _destroy,
! 191: },
! 192: .set = set,
! 193: .z1 = malloc(set->n * sizeof(int32_t)),
! 194: .z2d = malloc(set->n * sizeof(int16_t)),
! 195: .c_indices = malloc(set->n * sizeof(uint16_t)),
! 196: );
! 197:
! 198: packer = bliss_bitpacker_create_from_data(encoding);
! 199: coder = bliss_huffman_coder_create(code, packer);
! 200:
! 201: for (i = 0; i < set->n; i++)
! 202: {
! 203: if (!packer->read_bits(packer, &z1_sign, 1) ||
! 204: !packer->read_bits(packer, &z1_low, 8) ||
! 205: !coder->decode(coder, &z1, &z2))
! 206: {
! 207: DBG1(DBG_LIB, "truncated BLISS signature encoding of z1/z2");
! 208: coder->destroy(coder);
! 209: packer->destroy(packer);
! 210: destroy(this);
! 211: return NULL;
! 212: }
! 213: z1 = (z1 << 8) + z1_low;
! 214: this->z1[i] = z1_sign ? -z1 : z1;
! 215: this->z2d[i] = z2;
! 216: }
! 217: coder->destroy(coder);
! 218:
! 219: for (i = 0; i < set->kappa; i++)
! 220: {
! 221: if (!packer->read_bits(packer, &value, set->n_bits))
! 222: {
! 223: DBG1(DBG_LIB, "truncated BLISS signature encoding of c_indices");
! 224: packer->destroy(packer);
! 225: destroy(this);
! 226: return NULL;
! 227: }
! 228: this->c_indices[i] = value;
! 229: }
! 230: packer->destroy(packer);
! 231:
! 232: return &this->public;
! 233: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>