Expanded bliss_bitpacker to 32 bits

This commit is contained in:
Andreas Steffen
2014-12-09 11:58:17 +01:00
parent 30a90ccf74
commit 03f2a52e9c
5 changed files with 39 additions and 41 deletions
@@ -32,9 +32,9 @@ struct private_bliss_bitpacker_t {
size_t bits; size_t bits;
/** /**
* Bit buffer for up to 16 bits * Bit buffer for up to 32 bits
*/ */
uint16_t bits_buf; uint32_t bits_buf;
/** /**
* Bits left in the bit buffer * Bits left in the bit buffer
@@ -60,9 +60,9 @@ METHOD(bliss_bitpacker_t, get_bits, size_t,
} }
METHOD(bliss_bitpacker_t, write_bits, bool, METHOD(bliss_bitpacker_t, write_bits, bool,
private_bliss_bitpacker_t *this, uint16_t value, size_t bits) private_bliss_bitpacker_t *this, uint32_t value, size_t bits)
{ {
if (bits > 16) if (bits > 32)
{ {
return FALSE; return FALSE;
} }
@@ -82,21 +82,21 @@ METHOD(bliss_bitpacker_t, write_bits, bool,
value &= (1 << (bits - this->bits_left)) - 1; value &= (1 << (bits - this->bits_left)) - 1;
bits -= this->bits_left; bits -= this->bits_left;
if (this->pos.len < 4) if (this->pos.len < 8)
{ {
return FALSE; return FALSE;
} }
htoun16(this->pos.ptr, this->bits_buf); htoun32(this->pos.ptr, this->bits_buf);
this->pos = chunk_skip(this->pos, 2); this->pos = chunk_skip(this->pos, 4);
this->bits_buf = 0; this->bits_buf = 0;
this->bits_left = 16; this->bits_left = 32;
} }
} }
METHOD(bliss_bitpacker_t, read_bits, bool, METHOD(bliss_bitpacker_t, read_bits, bool,
private_bliss_bitpacker_t *this, uint16_t *value, size_t bits) private_bliss_bitpacker_t *this, uint32_t *value, size_t bits)
{ {
if (bits > 16) if (bits > 32)
{ {
return FALSE; return FALSE;
} }
@@ -106,13 +106,13 @@ METHOD(bliss_bitpacker_t, read_bits, bool,
{ {
if (this->bits_left == 0) if (this->bits_left == 0)
{ {
if (this->pos.len < 2) if (this->pos.len < 4)
{ {
return FALSE; return FALSE;
} }
this->bits_buf = untoh16(this->pos.ptr); this->bits_buf = untoh32(this->pos.ptr);
this->pos = chunk_skip(this->pos, 2); this->pos = chunk_skip(this->pos, 4);
this->bits_left = 16; this->bits_left = 32;
} }
if (bits <= this->bits_left) if (bits <= this->bits_left)
{ {
@@ -133,8 +133,8 @@ METHOD(bliss_bitpacker_t, extract_buf, chunk_t,
{ {
chunk_t buf; chunk_t buf;
htoun16(this->pos.ptr, this->bits_buf); htoun32(this->pos.ptr, this->bits_buf);
this->pos.len -= 2; this->pos.len -= 4;
buf = this->buf; buf = this->buf;
buf.len = this->buf.len - this->pos.len - this->bits_left/8; buf.len = this->buf.len - this->pos.len - this->bits_left/8;
this->buf = this->pos = chunk_empty; this->buf = this->pos = chunk_empty;
@@ -164,8 +164,8 @@ bliss_bitpacker_t *bliss_bitpacker_create(size_t max_bits)
.extract_buf = _extract_buf, .extract_buf = _extract_buf,
.destroy = _destroy, .destroy = _destroy,
}, },
.bits_left = 16, .bits_left = 32,
.buf = chunk_alloc(round_up(max_bits, 16)/8), .buf = chunk_alloc(round_up(max_bits, 32)/8),
); );
this->pos = this->buf; this->pos = this->buf;
@@ -189,14 +189,11 @@ bliss_bitpacker_t *bliss_bitpacker_create_from_data(chunk_t data)
.destroy = _destroy, .destroy = _destroy,
}, },
.bits = 8 * data.len, .bits = 8 * data.len,
.buf = chunk_alloc(round_up(data.len, 2)), .buf = chunk_alloc(round_up(data.len, 4)),
); );
memset(this->buf.ptr + this->buf.len - 4, 0x00, 4);
memcpy(this->buf.ptr, data.ptr, data.len); memcpy(this->buf.ptr, data.ptr, data.len);
if (this->buf.len > data.len)
{
*(this->buf.ptr + data.len) = 0x00;
}
this->pos = this->buf; this->pos = this->buf;
return &this->public; return &this->public;
@@ -45,7 +45,7 @@ struct bliss_bitpacker_t {
* @param bits Number of bits to be written * @param bits Number of bits to be written
* @result TRUE if value could be written into buffer * @result TRUE if value could be written into buffer
*/ */
bool (*write_bits)(bliss_bitpacker_t *this, uint16_t value, size_t bits); bool (*write_bits)(bliss_bitpacker_t *this, uint32_t value, size_t bits);
/** /**
@@ -55,7 +55,7 @@ struct bliss_bitpacker_t {
* @param bits Number of bits to be read * @param bits Number of bits to be read
* @result TRUE if value could be read from buffer * @result TRUE if value could be read from buffer
*/ */
bool (*read_bits)(bliss_bitpacker_t *this, uint16_t *value, size_t bits); bool (*read_bits)(bliss_bitpacker_t *this, uint32_t *value, size_t bits);
/** /**
* Detach the internal octet buffer and return it * Detach the internal octet buffer and return it
@@ -388,7 +388,7 @@ bool bliss_public_key_from_asn1(chunk_t object, bliss_param_set_t *set,
uint32_t **pubkey) uint32_t **pubkey)
{ {
bliss_bitpacker_t *packer; bliss_bitpacker_t *packer;
uint16_t coefficient; uint32_t coefficient;
int i; int i;
/* skip initial bit string octet defining unused bits */ /* skip initial bit string octet defining unused bits */
@@ -405,7 +405,7 @@ bool bliss_public_key_from_asn1(chunk_t object, bliss_param_set_t *set,
for (i = 0; i < set->n; i++) for (i = 0; i < set->n; i++)
{ {
packer->read_bits(packer, &coefficient, set->q_bits); packer->read_bits(packer, &coefficient, set->q_bits);
(*pubkey)[i] = (uint32_t)coefficient; (*pubkey)[i] = coefficient;
} }
packer->destroy(packer); packer->destroy(packer);
@@ -133,8 +133,8 @@ bliss_signature_t *bliss_signature_create_from_data(bliss_param_set_t *set,
{ {
private_bliss_signature_t *this; private_bliss_signature_t *this;
bliss_bitpacker_t *packer; bliss_bitpacker_t *packer;
uint32_t z1_sign, z1_mask; uint32_t z1_sign, z1_mask, value;
uint16_t z2d_sign, z2d_mask, value, z1_bits, z2d_bits; uint16_t z2d_sign, z2d_mask, z1_bits, z2d_bits;
int i; int i;
z1_bits = set->z1_bits; z1_bits = set->z1_bits;
@@ -17,7 +17,7 @@
#include <bliss_bitpacker.h> #include <bliss_bitpacker.h>
static uint16_t bits[] = { 0, 1, 2, 3, 4, 7, 1, 14, 2, 29, 3, 28, 67}; static uint32_t bits[] = { 0, 1, 2, 3, 4, 7, 1, 14, 2, 29, 3, 28, 67};
static chunk_t packed_bits = chunk_from_chars(0x6e, 0x71, 0xe1, 0x74, static chunk_t packed_bits = chunk_from_chars(0x6e, 0x71, 0xe1, 0x74,
0x37, 0x21, 0x80); 0x37, 0x21, 0x80);
@@ -30,7 +30,7 @@ START_TEST(test_bliss_sign_bitpacker_write)
packer = bliss_bitpacker_create(49); packer = bliss_bitpacker_create(49);
ck_assert(!packer->write_bits(packer, 0, 17)); ck_assert(!packer->write_bits(packer, 0, 33));
for (i = 0; i < countof(bits); i++) for (i = 0; i < countof(bits); i++)
{ {
@@ -47,20 +47,20 @@ END_TEST
START_TEST(test_bliss_sign_bitpacker_read) START_TEST(test_bliss_sign_bitpacker_read)
{ {
uint16_t value; uint32_t value;
bliss_bitpacker_t *packer; bliss_bitpacker_t *packer;
int i; int i;
packer = bliss_bitpacker_create_from_data(packed_bits); packer = bliss_bitpacker_create_from_data(packed_bits);
ck_assert(!packer->read_bits(packer, &value, 17)); ck_assert(!packer->read_bits(packer, &value, 33));
for (i = 0; i < countof(bits); i++) for (i = 0; i < countof(bits); i++)
{ {
ck_assert(packer->read_bits(packer, &value, 1 + i/2)); ck_assert(packer->read_bits(packer, &value, 1 + i/2));
ck_assert_int_eq(value, bits[i]); ck_assert_int_eq(value, bits[i]);
} }
ck_assert(!packer->read_bits(packer, &value, 16)); ck_assert(!packer->read_bits(packer, &value, 32));
packer->destroy(packer); packer->destroy(packer);
} }
@@ -69,17 +69,18 @@ END_TEST
START_TEST(test_bliss_sign_bitpacker_fail) START_TEST(test_bliss_sign_bitpacker_fail)
{ {
bliss_bitpacker_t *packer; bliss_bitpacker_t *packer;
uint16_t value; uint32_t value;
packer = bliss_bitpacker_create(16); packer = bliss_bitpacker_create(32);
ck_assert(!packer->write_bits(packer, 0, 17)); ck_assert(!packer->write_bits(packer, 0, 33));
ck_assert( packer->write_bits(packer, 0x7f01, 15)); ck_assert( packer->write_bits(packer, 0x7f2a3b01, 31));
ck_assert(!packer->write_bits(packer, 3, 2)); ck_assert(!packer->write_bits(packer, 3, 2));
packer->destroy(packer); packer->destroy(packer);
packer = bliss_bitpacker_create_from_data(chunk_from_chars(0x7f, 0x01)); packer = bliss_bitpacker_create_from_data(
ck_assert(!packer->read_bits(packer, &value, 17)); chunk_from_chars(0x7f, 0x2a, 0x3b, 0x01));
ck_assert( packer->read_bits(packer, &value, 15)); ck_assert(!packer->read_bits(packer, &value, 33));
ck_assert( packer->read_bits(packer, &value, 31));
ck_assert(!packer->read_bits(packer, &value, 2)); ck_assert(!packer->read_bits(packer, &value, 2));
packer->destroy(packer); packer->destroy(packer);
} }