1*a8c975d2Sderaadt /* $OpenBSD: tests.c,v 1.2 2021/12/14 21:25:27 deraadt Exp $ */
262b63b55Sdjm /*
362b63b55Sdjm * Regress test for bitmap.h bitmap API
462b63b55Sdjm *
562b63b55Sdjm * Placed in the public domain
662b63b55Sdjm */
762b63b55Sdjm
862b63b55Sdjm #include <sys/types.h>
962b63b55Sdjm #include <stdio.h>
1062b63b55Sdjm #include <stdint.h>
1162b63b55Sdjm #include <stdlib.h>
1262b63b55Sdjm #include <string.h>
1362b63b55Sdjm
1462b63b55Sdjm #include <openssl/bn.h>
1562b63b55Sdjm
1662b63b55Sdjm #include "test_helper.h"
1762b63b55Sdjm
1862b63b55Sdjm #include "bitmap.h"
1962b63b55Sdjm
2062b63b55Sdjm #define NTESTS 131
2162b63b55Sdjm
2262b63b55Sdjm void
tests(void)2362b63b55Sdjm tests(void)
2462b63b55Sdjm {
2562b63b55Sdjm struct bitmap *b;
2662b63b55Sdjm BIGNUM *bn;
2762b63b55Sdjm size_t len;
2862b63b55Sdjm int i, j, k, n;
2962b63b55Sdjm u_char bbuf[1024], bnbuf[1024];
3062b63b55Sdjm int r;
3162b63b55Sdjm
3262b63b55Sdjm TEST_START("bitmap_new");
3362b63b55Sdjm b = bitmap_new();
3462b63b55Sdjm ASSERT_PTR_NE(b, NULL);
3562b63b55Sdjm bn = BN_new();
3662b63b55Sdjm ASSERT_PTR_NE(bn, NULL);
3762b63b55Sdjm TEST_DONE();
3862b63b55Sdjm
3962b63b55Sdjm TEST_START("bitmap_set_bit / bitmap_test_bit");
4062b63b55Sdjm for (i = -1; i < NTESTS; i++) {
4162b63b55Sdjm for (j = -1; j < NTESTS; j++) {
4262b63b55Sdjm for (k = -1; k < NTESTS; k++) {
4362b63b55Sdjm bitmap_zero(b);
4462b63b55Sdjm BN_clear(bn);
4562b63b55Sdjm
4662b63b55Sdjm test_subtest_info("set %d/%d/%d", i, j, k);
4762b63b55Sdjm /* Set bits */
4862b63b55Sdjm if (i >= 0) {
4962b63b55Sdjm ASSERT_INT_EQ(bitmap_set_bit(b, i), 0);
5062b63b55Sdjm ASSERT_INT_EQ(BN_set_bit(bn, i), 1);
5162b63b55Sdjm }
5262b63b55Sdjm if (j >= 0) {
5362b63b55Sdjm ASSERT_INT_EQ(bitmap_set_bit(b, j), 0);
5462b63b55Sdjm ASSERT_INT_EQ(BN_set_bit(bn, j), 1);
5562b63b55Sdjm }
5662b63b55Sdjm if (k >= 0) {
5762b63b55Sdjm ASSERT_INT_EQ(bitmap_set_bit(b, k), 0);
5862b63b55Sdjm ASSERT_INT_EQ(BN_set_bit(bn, k), 1);
5962b63b55Sdjm }
6062b63b55Sdjm
6162b63b55Sdjm /* Check perfect match between bitmap and bn */
6262b63b55Sdjm test_subtest_info("match %d/%d/%d", i, j, k);
6362b63b55Sdjm for (n = 0; n < NTESTS; n++) {
6462b63b55Sdjm ASSERT_INT_EQ(BN_is_bit_set(bn, n),
6562b63b55Sdjm bitmap_test_bit(b, n));
6662b63b55Sdjm }
6762b63b55Sdjm
6862b63b55Sdjm /* Test length calculations */
6962b63b55Sdjm test_subtest_info("length %d/%d/%d", i, j, k);
7062b63b55Sdjm ASSERT_INT_EQ(BN_num_bits(bn),
7162b63b55Sdjm (int)bitmap_nbits(b));
7262b63b55Sdjm ASSERT_INT_EQ(BN_num_bytes(bn),
7362b63b55Sdjm (int)bitmap_nbytes(b));
7462b63b55Sdjm
7562b63b55Sdjm /* Test serialisation */
7662b63b55Sdjm test_subtest_info("serialise %d/%d/%d",
7762b63b55Sdjm i, j, k);
7862b63b55Sdjm len = bitmap_nbytes(b);
7962b63b55Sdjm memset(bbuf, 0xfc, sizeof(bbuf));
8062b63b55Sdjm ASSERT_INT_EQ(bitmap_to_string(b, bbuf,
8162b63b55Sdjm sizeof(bbuf)), 0);
8262b63b55Sdjm for (n = len; n < (int)sizeof(bbuf); n++)
8362b63b55Sdjm ASSERT_U8_EQ(bbuf[n], 0xfc);
8462b63b55Sdjm r = BN_bn2bin(bn, bnbuf);
8562b63b55Sdjm ASSERT_INT_GE(r, 0);
8662b63b55Sdjm ASSERT_INT_EQ(r, (int)len);
8762b63b55Sdjm ASSERT_MEM_EQ(bbuf, bnbuf, len);
8862b63b55Sdjm
8962b63b55Sdjm /* Test deserialisation */
9062b63b55Sdjm test_subtest_info("deserialise %d/%d/%d",
9162b63b55Sdjm i, j, k);
9262b63b55Sdjm bitmap_zero(b);
9362b63b55Sdjm ASSERT_INT_EQ(bitmap_from_string(b, bnbuf,
9462b63b55Sdjm len), 0);
9562b63b55Sdjm for (n = 0; n < NTESTS; n++) {
9662b63b55Sdjm ASSERT_INT_EQ(BN_is_bit_set(bn, n),
9762b63b55Sdjm bitmap_test_bit(b, n));
9862b63b55Sdjm }
9962b63b55Sdjm
10062b63b55Sdjm /* Test clearing bits */
10162b63b55Sdjm test_subtest_info("clear %d/%d/%d",
10262b63b55Sdjm i, j, k);
10362b63b55Sdjm for (n = 0; n < NTESTS; n++) {
10462b63b55Sdjm ASSERT_INT_EQ(bitmap_set_bit(b, n), 0);
10562b63b55Sdjm ASSERT_INT_EQ(BN_set_bit(bn, n), 1);
10662b63b55Sdjm }
10762b63b55Sdjm if (i >= 0) {
10862b63b55Sdjm bitmap_clear_bit(b, i);
10962b63b55Sdjm BN_clear_bit(bn, i);
11062b63b55Sdjm }
11162b63b55Sdjm if (j >= 0) {
11262b63b55Sdjm bitmap_clear_bit(b, j);
11362b63b55Sdjm BN_clear_bit(bn, j);
11462b63b55Sdjm }
11562b63b55Sdjm if (k >= 0) {
11662b63b55Sdjm bitmap_clear_bit(b, k);
11762b63b55Sdjm BN_clear_bit(bn, k);
11862b63b55Sdjm }
11962b63b55Sdjm for (n = 0; n < NTESTS; n++) {
12062b63b55Sdjm ASSERT_INT_EQ(BN_is_bit_set(bn, n),
12162b63b55Sdjm bitmap_test_bit(b, n));
12262b63b55Sdjm }
12362b63b55Sdjm }
12462b63b55Sdjm }
12562b63b55Sdjm }
12662b63b55Sdjm bitmap_free(b);
12762b63b55Sdjm BN_free(bn);
12862b63b55Sdjm TEST_DONE();
12962b63b55Sdjm }
13062b63b55Sdjm
131