Fixed bad bit shift and sign extension errors

This commit is contained in:
Andreas Steffen
2014-12-23 15:40:01 +01:00
parent fd19feefa4
commit 6139c8e524
4 changed files with 34 additions and 10 deletions
@@ -62,12 +62,19 @@ METHOD(bliss_bitpacker_t, get_bits, size_t,
METHOD(bliss_bitpacker_t, write_bits, bool,
private_bliss_bitpacker_t *this, uint32_t value, size_t bits)
{
if (bits == 0)
{
return TRUE;
}
if (bits > 32)
{
return FALSE;
}
if (bits < 32)
{
value &= (1 << bits) - 1;
}
this->bits += bits;
value &= (1 << bits) - 1;
while (TRUE)
{
@@ -152,7 +159,7 @@ METHOD(bliss_bitpacker_t, destroy, void,
/**
* See header.
*/
bliss_bitpacker_t *bliss_bitpacker_create(size_t max_bits)
bliss_bitpacker_t *bliss_bitpacker_create(uint16_t max_bits)
{
private_bliss_bitpacker_t *this;
@@ -73,7 +73,7 @@ struct bliss_bitpacker_t {
*
* @param max_bits Total number of bits to be stored
*/
bliss_bitpacker_t* bliss_bitpacker_create(size_t max_bits);
bliss_bitpacker_t* bliss_bitpacker_create(uint16_t max_bits);
/**
* Create a bliss_bitpacker_t object for reading
@@ -391,12 +391,15 @@ bool bliss_public_key_from_asn1(chunk_t object, bliss_param_set_t *set,
{
bliss_bitpacker_t *packer;
uint32_t coefficient;
uint16_t needed_bits;
int i;
/* skip initial bit string octet defining unused bits */
object = chunk_skip(object, 1);
if (8 * object.len < set->n * set->q_bits)
needed_bits = set->n * set->q_bits;
if (8 * object.len < needed_bits)
{
return FALSE;
}