diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gen/seed.c | 3 | ||||
| -rw-r--r-- | src/gen/types.h | 10 | ||||
| -rw-r--r-- | src/util/bits.c | 125 | ||||
| -rw-r--r-- | src/util/bits.h | 22 | ||||
| -rw-r--r-- | src/util/memory.c | 4 |
5 files changed, 115 insertions, 49 deletions
diff --git a/src/gen/seed.c b/src/gen/seed.c index 628dad5..cc26cb4 100644 --- a/src/gen/seed.c +++ b/src/gen/seed.c @@ -129,7 +129,8 @@ static void seed_W(seed_t *seed, const config_t *cfg) { GEN hash = binascii_btoi(seed->hash20, 20, ENDIAN_BIG); GEN mask = subis(int2n(itos(h)), 1); // TODO: what if I get zeros at the beginning? 0123 == 123 for PARI t_INT - // I should just convert to a t_VECSMALL of bits from the seed->hash and do everything with that. + // I should just convert to a t_VECSMALL of bits from the seed->hash and do + // everything with that. // That's alot of custom code to handle bit strings. GEN c0 = ibitand(hash, mask); } diff --git a/src/gen/types.h b/src/gen/types.h index b6d488e..8507847 100644 --- a/src/gen/types.h +++ b/src/gen/types.h @@ -91,9 +91,7 @@ typedef struct { /** * @brief */ -typedef enum { - ENDIAN_BIG = 0, ENDIAN_LITTLE -} endian_e; +typedef enum { ENDIAN_BIG = 0, ENDIAN_LITTLE } endian_e; typedef struct { unsigned char *bits; @@ -109,7 +107,7 @@ typedef struct { * @return state diff */ #define GENERATOR(gen_name) \ - int gen_name(curve_t *curve, const config_t *cfg, arg_t *args) + int gen_name(curve_t *curve, const config_t *cfg, arg_t *args) typedef GENERATOR((*gen_t)); @@ -122,8 +120,8 @@ typedef GENERATOR((*gen_t)); * @return */ #define UNROLL(unroll_name) \ - int unroll_name(curve_t *curve, const config_t *cfg, pari_sp from, \ - pari_sp to) + int unroll_name(curve_t *curve, const config_t *cfg, pari_sp from, \ + pari_sp to) typedef UNROLL((*unroll_t)); diff --git a/src/util/bits.c b/src/util/bits.c index 21cf43e..e573505 100644 --- a/src/util/bits.c +++ b/src/util/bits.c @@ -90,8 +90,7 @@ bits_t *bits_from_bitvec(GEN v) { size_t bit_len = (size_t)glength(v); bits_t *result = bits_new(bit_len); for (size_t i = 0; i < bit_len; ++i) { - if (gel(v, i + 1) == (GEN)1) - result->bits[i / 8] |= 1 << (7 - (i % 8)); + if (gel(v, i + 1) == (GEN)1) result->bits[i / 8] |= 1 << (7 - (i % 8)); } return result; } @@ -108,7 +107,7 @@ GEN bits_to_i(const bits_t *bits) { char *bits_to_hex(const bits_t *bits) { char *result = try_calloc(BYTE_LEN(bits->bitlen) * 2 + 1); - //probably right pad with zeroes, as thats what is actually stored. + // probably right pad with zeroes, as thats what is actually stored. for (size_t i = 0; i < BYTE_LEN(bits->bitlen); ++i) { sprintf(result + (i * 2), "%x", bits->bits[i]); } @@ -130,15 +129,12 @@ unsigned char *bits_to_raw(const bits_t *bits) { return try_memdup(bits->bits, BYTE_LEN(bits->bitlen)); } -size_t bits_to_rawlen(const bits_t *bits) { - return BYTE_LEN(bits->bitlen); -} +size_t bits_to_rawlen(const bits_t *bits) { return BYTE_LEN(bits->bitlen); } GEN bits_to_bitvec(const bits_t *bits) { GEN bitvec = gtovecsmall0(gen_0, bits->bitlen); for (size_t i = 0; i < bits->bitlen; ++i) { - if (GET_BIT(bits->bits, i) != 0) - gel(bitvec, i + 1) = (GEN)1; + if (GET_BIT(bits->bits, i) != 0) gel(bitvec, i + 1) = (GEN)1; } return bitvec; } @@ -152,8 +148,8 @@ static unsigned char and_func(unsigned char one, unsigned char other) { } static bits_t *bits_bitwise(const bits_t *one, const bits_t *other, - unsigned char (*bitwise_func)( - unsigned char, unsigned char)) { + unsigned char (*bitwise_func)(unsigned char, + unsigned char)) { const bits_t *shorter; const bits_t *longer; if (one->bitlen > other->bitlen) { @@ -168,13 +164,12 @@ static bits_t *bits_bitwise(const bits_t *one, const bits_t *other, for (size_t i = 0; i < longer->bitlen; ++i) { size_t longer_pos = longer->bitlen - i - 1; - unsigned char longer_bit = (unsigned char)GET_BIT(longer->bits, - longer_pos); + unsigned char longer_bit = + (unsigned char)GET_BIT(longer->bits, longer_pos); unsigned char shorter_bit = 0; if (shorter->bitlen > i) { size_t shorter_pos = shorter->bitlen - i - 1; - shorter_bit = (unsigned char)GET_BIT(shorter->bits, - shorter_pos); + shorter_bit = (unsigned char)GET_BIT(shorter->bits, shorter_pos); } unsigned char result_bit = bitwise_func(longer_bit, shorter_bit); @@ -193,8 +188,7 @@ bits_t *bits_and(const bits_t *one, const bits_t *other) { } void bits_notz(bits_t *bits) { - if (bits->bitlen == 0) - return; + if (bits->bitlen == 0) return; for (size_t i = 0; i < bits->bitlen / 8; ++i) { bits->bits[i] = ~bits->bits[i]; } @@ -203,8 +197,7 @@ void bits_notz(bits_t *bits) { unsigned char mask = 0; for (size_t i = 7; i >= 0; --i) { mask |= 1 << i; - if (--mask_len == 0) - break; + if (--mask_len == 0) break; } size_t last_pos = (bits->bitlen / 8); unsigned char anti_mask = ~mask; @@ -228,18 +221,18 @@ void bits_rotz(bits_t *bits) { for (size_t i = 0; i < bits->bitlen / 2; ++i) { size_t left_pos = i; size_t right_pos = bits->bitlen - i - 1; - unsigned char left_bit = (unsigned char)GET_BIT(original_bits, - left_pos); - unsigned char right_bit = (unsigned char)GET_BIT(original_bits, - right_pos); + unsigned char left_bit = + (unsigned char)GET_BIT(original_bits, left_pos); + unsigned char right_bit = + (unsigned char)GET_BIT(original_bits, right_pos); bits->bits[right_pos / 8] |= left_bit << (7 - (right_pos % 8)); bits->bits[left_pos / 8] |= right_bit << (7 - (left_pos % 8)); } if (bits->bitlen % 2 == 1) { size_t middle_pos = bits->bitlen / 2; - unsigned char middle_bit = (unsigned char)GET_BIT(original_bits, - middle_pos); + unsigned char middle_bit = + (unsigned char)GET_BIT(original_bits, middle_pos); bits->bits[middle_pos / 8] |= middle_bit << (7 - (middle_pos % 8)); } } @@ -251,8 +244,7 @@ bits_t *bits_rot(const bits_t *bits) { } void bits_shiftz(bits_t *bits, long amount) { - if (amount == 0) - return; + if (amount == 0) return; unsigned char original_bits[bits->allocated]; for (size_t i = 0; i < bits->allocated; ++i) { original_bits[i] = bits->bits[i]; @@ -275,8 +267,7 @@ bits_t *bits_shift(const bits_t *bits, long amount) { } void bits_shiftrz(bits_t *bits, long amount) { - if (amount == 0) - return; + if (amount == 0) return; unsigned char original_bits[bits->allocated]; for (size_t i = 0; i < bits->allocated; ++i) { original_bits[i] = bits->bits[i]; @@ -305,20 +296,82 @@ bits_t *bits_shiftr(const bits_t *bits, long amount) { return result; } +void bits_shiftiz(bits_t *bits, long amount) { + if (amount > 0) { + bits_lengthenz(bits, -amount); + } else if (amount < 0) { + bits_shortenz(bits, amount); + } +} + +bits_t *bits_shifti(const bits_t *bits, long amount) { + bits_t *result = bits_copy(bits); + bits_shiftiz(result, amount); + return result; +} + +void bits_lengthenz(bits_t *bits, long amount) { + size_t abs_amount; + if (amount > 0) { + abs_amount = (size_t)amount; + } else if (amount < 0) { + abs_amount = (size_t)-amount; + } else { + return; + } + size_t new_alloc = BYTE_LEN(bits->bitlen + abs_amount); + if (new_alloc > bits->allocated) { + bits->bits = try_realloc(bits->bits, new_alloc); + for (size_t i = bits->allocated; i < new_alloc; ++i) { + bits->bits[i] = 0; + } + bits->allocated = new_alloc; + } + bits->bitlen += abs_amount; + + if (amount > 0) { + bits_shiftz(bits, -amount); + } +} + +bits_t *bits_lengthen(const bits_t *bits, long amount) { + bits_t *result = bits_copy(bits); + bits_lengthenz(result, amount); + return result; +} + +void bits_shortenz(bits_t *bits, long amount) { + size_t new_bits; + if (amount > 0) { + new_bits = bits->bitlen - amount; + bits_shiftz(bits, amount); + } else if (amount < 0) { + new_bits = bits->bitlen + amount; + for (size_t i = new_bits; i < bits->bitlen; ++i) { + bits->bits[i / 8] &= ~(1 << (7 - (i % 8))); + } + } else { + return; + } + bits->bitlen = new_bits; +} + +bits_t *bits_shorten(const bits_t *bits, long amount) { + bits_t *result = bits_copy(bits); + bits_shortenz(result, amount); + return result; +} + bool bits_eq(const bits_t *one, const bits_t *other) { - if (one->bitlen != other->bitlen) - return false; - if (one->bitlen == 0) - return true; - if (memcmp(one->bits, other->bits, one->bitlen / 8) != 0) - return false; + if (one->bitlen != other->bitlen) return false; + if (one->bitlen == 0) return true; + if (memcmp(one->bits, other->bits, one->bitlen / 8) != 0) return false; if (one->bitlen % 8 != 0) { size_t mask_len = one->bitlen % 8; unsigned char mask = 0; for (size_t i = 7; i >= 0; --i) { mask |= 1 << i; - if (--mask_len == 0) - break; + if (--mask_len == 0) break; } size_t last_byte = (one->bitlen / 8); unsigned char one_masked = one->bits[last_byte] & mask; diff --git a/src/util/bits.h b/src/util/bits.h index 42ab899..3deeab0 100644 --- a/src/util/bits.h +++ b/src/util/bits.h @@ -8,8 +8,11 @@ #include "gen/types.h" -#define BYTE_LEN(bit_len) (((bit_len) % 8 == 0) ? (bit_len) / 8 : ((bit_len) / 8) + 1) -#define GET_BIT(bit_array, bit_pos) (((bit_array)[(bit_pos) / 8] & (1 << (7 - ((bit_pos) % 8)))) >> (7 - ((bit_pos) % 8))) +#define BYTE_LEN(bit_len) \ + (((bit_len) % 8 == 0) ? (bit_len) / 8 : ((bit_len) / 8) + 1) +#define GET_BIT(bit_array, bit_pos) \ + (((bit_array)[(bit_pos) / 8] & (1 << (7 - ((bit_pos) % 8)))) >> \ + (7 - ((bit_pos) % 8))) bits_t *bits_new(size_t bit_len); @@ -59,7 +62,18 @@ void bits_shiftrz(bits_t *bits, long amount); bits_t *bits_shiftr(const bits_t *bits, long amount); -bool bits_eq(const bits_t *one, const bits_t *other); +void bits_shiftiz(bits_t *bits, long amount); + +bits_t *bits_shifti(const bits_t *bits, long amount); + +void bits_lengthenz(bits_t *bits, long amount); + +bits_t *bits_lengthen(const bits_t *bits, long amount); +void bits_shortenz(bits_t *bits, long amount); + +bits_t *bits_shorten(const bits_t *bits, long amount); + +bool bits_eq(const bits_t *one, const bits_t *other); -#endif //ECGEN_BITS_H +#endif // ECGEN_BITS_H diff --git a/src/util/memory.c b/src/util/memory.c index bb75e32..6051459 100644 --- a/src/util/memory.c +++ b/src/util/memory.c @@ -49,8 +49,8 @@ void *try_memdup(const void *mem, size_t len) { void try_free(void *ptr) { free_func(ptr); } void set_mem_funcs(void *(*malloc_fun)(size_t), void *(*calloc_fun)(size_t), - void *(*realloc_fun)(void *, size_t), - void (*free_fun)(void *)) { + void *(*realloc_fun)(void *, size_t), + void (*free_fun)(void *)) { malloc_func = malloc_fun; calloc_func = calloc_fun; realloc_func = realloc_fun; |
