aboutsummaryrefslogtreecommitdiff
path: root/test/src/util/test_bits.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/src/util/test_bits.c')
-rw-r--r--test/src/util/test_bits.c486
1 files changed, 486 insertions, 0 deletions
diff --git a/test/src/util/test_bits.c b/test/src/util/test_bits.c
new file mode 100644
index 0000000..372541a
--- /dev/null
+++ b/test/src/util/test_bits.c
@@ -0,0 +1,486 @@
+/*
+ * ecgen, tool for generating Elliptic curve domain parameters
+ * Copyright (C) 2017 J08nY
+ */
+
+#include <criterion/criterion.h>
+#include <criterion/parameterized.h>
+#include <misc/types.h>
+#include "test/default.h"
+#include "test/memory.h"
+#include "util/bits.h"
+#include "util/memory.h"
+
+TestSuite(bits, .init = default_setup, .fini = default_teardown);
+
+Test(bits, test_bits_new) {
+ bits_t *bits = bits_new(10);
+ cr_assert_not_null(bits, );
+ cr_assert_eq(bits->bitlen, 10, );
+ cr_assert_eq(bits->allocated, 2, );
+ cr_assert_eq(bits->bits[0], 0, );
+ cr_assert_eq(bits->bits[1], 0, );
+ bits_free(&bits);
+}
+
+Test(bits, test_bits_copy) {
+ bits_t *bits = bits_new(10);
+ bits->bits[0] = 0b10101010;
+ bits->bits[1] = 0b11000000;
+
+ bits_t *other_bits = bits_copy(bits);
+ cr_assert_not_null(other_bits, );
+ cr_assert_eq(other_bits->allocated, bits->allocated, );
+ cr_assert_eq(other_bits->bitlen, bits->bitlen, );
+ cr_assert_eq(other_bits->bits[0], bits->bits[0], );
+ cr_assert_eq(other_bits->bits[1], bits->bits[1], );
+ bits_free(&bits);
+ bits_free(&other_bits);
+}
+
+Test(bits, test_bits_from_i) {
+ GEN i = int2n(5);
+
+ bits_t *bits = bits_from_i(i);
+ cr_assert_not_null(bits, );
+ cr_assert_eq(bits->bitlen, 6, );
+ cr_assert_eq(bits->allocated, 1, );
+ cr_assert_eq(bits->bits[0], 0b10000000, );
+ bits_free(&bits);
+}
+
+Test(bits, test_bits_from_hex) {
+ char *hex = "0ab";
+
+ bits_t *bits = bits_from_hex(hex);
+ cr_assert_not_null(bits, );
+ cr_assert_eq(bits->bitlen, 12, );
+ cr_assert_eq(bits->allocated, 2, );
+ cr_assert_eq(bits->bits[0], 0x0a, );
+ cr_assert_eq(bits->bits[1], 0xb0, );
+ bits_free(&bits);
+}
+
+Test(bits, test_bits_from_bin) {
+ char *bin = "000010101101";
+
+ bits_t *bits = bits_from_bin(bin);
+ cr_assert_not_null(bits, );
+ cr_assert_eq(bits->bitlen, 12, );
+ cr_assert_eq(bits->allocated, 2, );
+ cr_assert_eq(bits->bits[0], 0b00001010, );
+ cr_assert_eq(bits->bits[1], 0b11010000, );
+ bits_free(&bits);
+}
+
+Test(bits, test_bits_from_raw) {
+ unsigned char *raw = (unsigned char *)"\x0a\xb0";
+
+ bits_t *bits = bits_from_raw(raw, 16);
+ cr_assert_not_null(bits, );
+ cr_assert_eq(bits->bitlen, 16, );
+ cr_assert_eq(bits->allocated, 2, );
+ cr_assert_eq(bits->bits[0], 0x0a, );
+ cr_assert_eq(bits->bits[1], 0xb0, );
+ bits_free(&bits);
+}
+
+Test(bits, test_bits_from_bitvec) {
+ GEN bitvec = binary_zv(int2n(5));
+
+ bits_t *bits = bits_from_bitvec(bitvec);
+ cr_assert_not_null(bits, );
+ cr_assert_eq(bits->bitlen, 6, );
+ cr_assert_eq(bits->allocated, 1, );
+ cr_assert_eq(bits->bits[0], 0b10000000, );
+ bits_free(&bits);
+}
+
+Test(bits, test_bits_to_i) {
+ bits_t *bits = bits_new(6);
+ bits->bits[0] = 0b10000000;
+
+ GEN i = bits_to_i(bits);
+ cr_assert_not_null(bits, );
+ cr_assert(gequal(i, int2n(5)), );
+ bits_free(&bits);
+}
+
+Test(bits, test_bits_to_hex) {
+ bits_t *bits = bits_new(12);
+ bits->bits[0] = 0xab;
+ bits->bits[1] = 0xc0;
+
+ char *hex = bits_to_hex(bits);
+ cr_assert_not_null(hex, );
+ cr_assert_str_eq(hex, "abc0", );
+ try_free(hex);
+ bits_free(&bits);
+}
+
+Test(bits, test_bits_to_bin) {
+ bits_t *bits = bits_new(12);
+ bits->bits[0] = 0b10101010;
+ bits->bits[1] = 0b11110000;
+
+ char *bin = bits_to_bin(bits);
+ cr_assert_not_null(bin, );
+ cr_assert_str_eq(bin, "101010101111", );
+ try_free(bin);
+ bits_free(&bits);
+}
+
+Test(bits, test_bits_to_raw) {
+ bits_t *bits = bits_new(6);
+ bits->bits[0] = 0b10000000;
+
+ unsigned char *raw = bits_to_raw(bits);
+ size_t rawlen = bits_to_rawlen(bits);
+ cr_assert_not_null(raw, );
+ cr_assert_eq(rawlen, 1, );
+ cr_assert_eq(raw[0], 0b10000000, );
+ try_free(raw);
+ bits_free(&bits);
+}
+
+Test(bits, test_bits_to_bitvec) {
+ bits_t *bits = bits_new(6);
+ bits->bits[0] = 0b10000000;
+
+ GEN bitvec = bits_to_bitvec(bits);
+ cr_assert_not_null(bitvec, );
+ cr_assert(gequal(bitvec, binary_zv(int2n(5))), );
+}
+
+Test(bits, test_bits_concat) {
+ bits_t *one = bits_new(6);
+ one->bits[0] = 0b00000000;
+
+ bits_t *other = bits_new(8);
+ other->bits[0] = 0b11001100;
+
+ bits_t *cat = bits_concat(one, other, NULL);
+ cr_assert_not_null(cat, );
+ cr_assert_eq(cat->bitlen, 14, );
+ cr_assert_eq(cat->bits[0], 0b00000011, );
+ cr_assert_eq(cat->bits[1], 0b00110000, );
+
+ bits_free(&one);
+ bits_free(&other);
+ bits_free(&cat);
+}
+
+Test(bits, test_bits_or) {
+ bits_t *bits = bits_new(6);
+ bits->bits[0] = 0b10000000;
+
+ bits_t *other_bits = bits_new(10);
+ other_bits->bits[0] = 0b00000000;
+ other_bits->bits[1] = 0b11000000;
+
+ bits_t * or = bits_or(bits, other_bits);
+ cr_assert_not_null(or, );
+ cr_assert_eq(or->bitlen, 10, );
+ cr_assert_eq(or->bits[0], 0b00001000, );
+ cr_assert_eq(or->bits[1], 0b11000000, );
+ bits_free(&bits);
+ bits_free(&other_bits);
+ bits_free(& or);
+}
+
+Test(bits, test_bits_and) {
+ bits_t *bits = bits_new(6);
+ bits->bits[0] = 0b10000000;
+
+ bits_t *other_bits = bits_new(10);
+ other_bits->bits[0] = 0b00001000;
+ other_bits->bits[1] = 0b11000000;
+
+ bits_t *and = bits_and(bits, other_bits);
+ cr_assert_not_null(and, );
+ cr_assert_eq(and->bitlen, 10, );
+ cr_assert_eq(and->bits[0], 0b00001000, );
+ cr_assert_eq(and->bits[1], 0b00000000, );
+ bits_free(&bits);
+ bits_free(&other_bits);
+ bits_free(&and);
+}
+
+Test(bits, test_bits_notz) {
+ bits_t *bits = bits_new(6);
+ bits->bits[0] = 0b10000000;
+
+ bits_notz(bits);
+ cr_assert_eq(bits->bitlen, 6, );
+ cr_assert_eq(bits->bits[0], 0b01111100, );
+ bits_free(&bits);
+}
+
+Test(bits, test_bits_not) {
+ bits_t *bits = bits_new(6);
+ bits->bits[0] = 0b10000000;
+
+ bits_t *not = bits_not(bits);
+ cr_assert_not_null(not, );
+ cr_assert_eq(not->bitlen, 6, );
+ cr_assert_eq(not->bits[0], 0b01111100, );
+ bits_free(&bits);
+ bits_free(&not);
+}
+
+Test(bits, test_bits_rotz) {
+ bits_t *bits = bits_new(10);
+ bits->bits[0] = 0b11111000;
+ bits->bits[1] = 0b00000000;
+
+ bits_rotz(bits);
+ cr_assert_eq(bits->bitlen, 10, );
+ cr_assert_eq(bits->bits[0], 0b00000111, );
+ cr_assert_eq(bits->bits[1], 0b11000000, );
+ bits_free(&bits);
+}
+
+Test(bits, test_bits_rot) {
+ bits_t *bits = bits_new(6);
+ bits->bits[0] = 0b10000000;
+
+ bits_t *rot = bits_rot(bits);
+ cr_assert_not_null(rot, );
+ cr_assert_eq(rot->bitlen, 6, );
+ cr_assert_eq(rot->bits[0], 0b00000100, );
+ bits_free(&bits);
+ bits_free(&rot);
+
+ bits = bits_new(5);
+ bits->bits[0] = 0b10100000;
+
+ rot = bits_rot(bits);
+ cr_assert_not_null(rot, );
+ cr_assert_eq(rot->bitlen, 5, );
+ cr_assert_eq(rot->bits[0], 0b00101000, );
+ bits_free(&bits);
+ bits_free(&rot);
+}
+
+Test(bits, test_bits_shiftz) {
+ bits_t *bits = bits_new(6);
+ bits->bits[0] = 0b10101000;
+
+ bits_shiftz(bits, -1);
+ cr_assert_eq(bits->bitlen, 6, );
+ cr_assert_eq(bits->bits[0], 0b01010100, );
+ bits_free(&bits);
+}
+
+Test(bits, test_bits_shift) {
+ bits_t *bits = bits_new(8);
+ bits->bits[0] = 0b11001100;
+
+ bits_t *shift = bits_shift(bits, 2);
+ cr_assert_not_null(shift, );
+ cr_assert_eq(shift->bitlen, 8, );
+ cr_assert_eq(shift->bits[0], 0b00110000, );
+ bits_free(&bits);
+ bits_free(&shift);
+}
+
+Test(bits, test_bits_shiftrz) {
+ bits_t *bits = bits_new(8);
+ bits->bits[0] = 0b11001100;
+
+ bits_shiftrz(bits, 1);
+ cr_assert_eq(bits->bitlen, 8, );
+ cr_assert_eq(bits->bits[0], 0b10011001, );
+ bits->bits[0] = 0b11001100;
+
+ bits_shiftrz(bits, 9);
+ cr_assert_eq(bits->bitlen, 8, );
+ cr_assert_eq(bits->bits[0], 0b10011001, );
+ bits->bits[0] = 0b11001100;
+
+ bits_shiftrz(bits, -10);
+ cr_assert_eq(bits->bitlen, 8, );
+ cr_assert_eq(bits->bits[0], 0b00110011, );
+ bits_free(&bits);
+}
+
+Test(bits, test_bits_shiftr) {
+ bits_t *bits = bits_new(8);
+ bits->bits[0] = 0b11001100;
+
+ bits_t *shift = bits_shiftr(bits, 1);
+ cr_assert_eq(shift->bitlen, 8, );
+ cr_assert_eq(shift->bits[0], 0b10011001, );
+ bits_free(&bits);
+ bits_free(&shift);
+}
+
+Test(bits, test_bits_shiftiz) {
+ bits_t *bits = bits_new(8);
+ bits->bits[0] = 0b11001100;
+
+ bits_shiftiz(bits, 2);
+ cr_assert_eq(bits->bitlen, 10, );
+ cr_assert_eq(bits->bits[0], 0b11001100, );
+ cr_assert_eq(bits->bits[1], 0b00000000, );
+
+ bits_shiftiz(bits, -2);
+ cr_assert_eq(bits->bitlen, 8, );
+ cr_assert_eq(bits->bits[0], 0b11001100, );
+ bits_free(&bits);
+}
+
+Test(bits, test_bits_shitfi) {
+ bits_t *bits = bits_new(8);
+ bits->bits[0] = 0b11001100;
+
+ bits_t *shift = bits_shifti(bits, -4);
+ cr_assert_eq(shift->bitlen, 4, );
+ cr_assert_eq(shift->bits[0], 0b11000000, );
+ bits_free(&bits);
+ bits_free(&shift);
+}
+
+Test(bits, test_bits_lengthenz) {
+ bits_t *bits = bits_new(8);
+ bits->bits[0] = 0b11001100;
+
+ bits_lengthenz(bits, 4);
+ cr_assert_eq(bits->bitlen, 12, );
+ cr_assert_eq(bits->bits[0], 0b00001100, );
+ cr_assert_eq(bits->bits[1], 0b11000000, );
+
+ bits_lengthenz(bits, -4);
+ cr_assert_eq(bits->bitlen, 16, );
+ cr_assert_eq(bits->bits[0], 0b00001100, );
+ cr_assert_eq(bits->bits[1], 0b11000000, );
+
+ bits_free(&bits);
+}
+
+Test(bits, test_bits_lengthen) {
+ bits_t *bits = bits_new(6);
+ bits->bits[0] = 0b11111100;
+
+ bits_t *longer = bits_lengthen(bits, 2);
+ cr_assert_not_null(longer, );
+ cr_assert_eq(longer->bitlen, 8, );
+ cr_assert_eq(longer->bits[0], 0b00111111, );
+ bits_free(&bits);
+ bits_free(&longer);
+}
+
+Test(bits, test_bits_shortenz) {
+ bits_t *bits = bits_new(6);
+ bits->bits[0] = 0b10110100;
+
+ bits_shortenz(bits, 2);
+ cr_assert_eq(bits->bitlen, 4, );
+ cr_assert_eq(bits->bits[0], 0b11010000, );
+
+ bits_shortenz(bits, -2);
+ cr_assert_eq(bits->bitlen, 2, );
+ cr_assert_eq(bits->bits[0], 0b11000000, );
+ bits_free(&bits);
+}
+
+Test(bits, test_bits_shorten) {
+ bits_t *bits = bits_new(6);
+ bits->bits[0] = 0b10110100;
+
+ bits_t *shorter = bits_shorten(bits, 4);
+ cr_assert_not_null(shorter, );
+ cr_assert_eq(shorter->bitlen, 2, );
+ cr_assert_eq(shorter->bits[0], 0b01000000, );
+ bits_free(&bits);
+ bits_free(&shorter);
+}
+
+struct sha1_params {
+ char *data;
+ unsigned char *hashout;
+};
+
+void sha1_params_cleanup(struct criterion_test_params *ctp) {
+ struct sha1_params *params = (struct sha1_params *)ctp->params;
+ cr_free(params->data);
+ cr_free(params->hashout);
+}
+
+ParameterizedTestParameters(bits, test_bits_sha1) {
+ static struct sha1_params params[5] = {};
+ params[0].data = cr_strdup("The quick brown fox jumps over the lazy dog");
+ params[0].hashout = cr_memdup("\x2f\xd4\xe1\xc6\x7a\x2d\x28\xfc\xed\x84\x9e\xe1\xbb\x76\xe7\x39\x1b\x93\xeb\x12", 20);
+ params[1].data = cr_strdup("abc");
+ params[1].hashout = cr_memdup("\xa9\x99\x3e\x36\x47\x06\x81\x6a\xba\x3e\x25\x71\x78\x50\xc2\x6c\x9c\xd0\xd8\x9d", 20);
+ params[2].data = cr_strdup("");
+ params[2].hashout = cr_memdup("\xda\x39\xa3\xee\x5e\x6b\x4b\x0d\x32\x55\xbf\xef\x95\x60\x18\x90\xaf\xd8\x07\x09", 20);
+ params[3].data = cr_strdup("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
+ params[3].hashout = cr_memdup("\x84\x98\x3e\x44\x1c\x3b\xd2\x6e\xba\xae\x4a\xa1\xf9\x51\x29\xe5\xe5\x46\x70\xf1", 20);
+ params[4].data = cr_strdup("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
+ params[4].hashout = cr_memdup("\xa4\x9b\x24\x46\xa0\x2c\x64\x5b\xf4\x19\xf9\x95\xb6\x70\x91\x25\x3a\x04\xa2\x59", 20);
+
+ size_t nb_params = sizeof(params) / sizeof(struct sha1_params);
+ return cr_make_param_array(struct sha1_params, params, nb_params, sha1_params_cleanup);
+}
+
+ParameterizedTest(struct sha1_params *param, bits, test_bits_sha1) {
+ bits_t *bits = bits_from_raw((unsigned char *)param->data, strlen(param->data) * 8);
+ unsigned char hashout[20] = {};
+ bits_sha1(bits, hashout);
+
+ for (size_t i = 0; i < 20; ++i) {
+ cr_assert_eq(hashout[i], param->hashout[i], );
+ }
+
+ bits_free(&bits);
+}
+
+Test(bits, test_bits_eq) {
+ bits_t *bits = bits_new(6);
+ bits->bits[0] = 0b10000000;
+
+ bits_t *other_bits = bits_new(6);
+ other_bits->bits[0] = 0b10000000;
+
+ cr_assert(bits_eq(bits, other_bits), );
+
+ bits->bits[0] = 0b10010000;
+ other_bits->bits[0] = 0b10000000;
+
+ cr_assert_not(bits_eq(bits, other_bits), );
+
+ bits_free(&bits);
+ bits_free(&other_bits);
+}
+
+Test(bits, test_bits_eq_len) {
+ bits_t *bits = bits_new(5);
+ bits->bits[0] = 0b10000000;
+
+ bits_t *other_bits = bits_new(6);
+ other_bits->bits[0] = 0b10000000;
+ cr_assert_not(bits_eq(bits, other_bits), );
+ bits_free(&bits);
+ bits_free(&other_bits);
+}
+
+Test(bits, test_bits_eq_large) {
+ bits_t *bits = bits_new(10);
+ bits->bits[0] = 0b10000010;
+ bits->bits[1] = 0b11000000;
+
+ bits_t *other_bits = bits_new(10);
+ other_bits->bits[0] = 0b10000010;
+ other_bits->bits[1] = 0b11000000;
+
+ cr_assert(bits_eq(bits, other_bits), );
+
+ bits->bits[0] = 0b10000000;
+ other_bits->bits[0] = 0b00000010;
+
+ cr_assert_not(bits_eq(bits, other_bits), );
+
+ bits_free(&bits);
+ bits_free(&other_bits);
+}