xref: /freebsd/crypto/openssh/regress/unittests/bitmap/tests.c (revision 1323ec571215a77ddd21294f0871979d5ad6b992)
1*1323ec57SEd Maste /* 	$OpenBSD: tests.c,v 1.2 2021/12/14 21:25:27 deraadt Exp $ */
2bc5531deSDag-Erling Smørgrav /*
3bc5531deSDag-Erling Smørgrav  * Regress test for bitmap.h bitmap API
4bc5531deSDag-Erling Smørgrav  *
5bc5531deSDag-Erling Smørgrav  * Placed in the public domain
6bc5531deSDag-Erling Smørgrav  */
7bc5531deSDag-Erling Smørgrav 
8bc5531deSDag-Erling Smørgrav #include "includes.h"
9bc5531deSDag-Erling Smørgrav 
10bc5531deSDag-Erling Smørgrav #include <sys/types.h>
11bc5531deSDag-Erling Smørgrav #include <stdio.h>
12bc5531deSDag-Erling Smørgrav #ifdef HAVE_STDINT_H
13bc5531deSDag-Erling Smørgrav #include <stdint.h>
14bc5531deSDag-Erling Smørgrav #endif
15bc5531deSDag-Erling Smørgrav #include <stdlib.h>
16bc5531deSDag-Erling Smørgrav #include <string.h>
17bc5531deSDag-Erling Smørgrav 
1819261079SEd Maste #ifdef WITH_OPENSSL
19bc5531deSDag-Erling Smørgrav #include <openssl/bn.h>
2019261079SEd Maste #endif
21bc5531deSDag-Erling Smørgrav 
22bc5531deSDag-Erling Smørgrav #include "../test_helper/test_helper.h"
23bc5531deSDag-Erling Smørgrav 
24bc5531deSDag-Erling Smørgrav #include "bitmap.h"
25bc5531deSDag-Erling Smørgrav 
26bc5531deSDag-Erling Smørgrav #define NTESTS 131
27bc5531deSDag-Erling Smørgrav 
28bc5531deSDag-Erling Smørgrav void
tests(void)29bc5531deSDag-Erling Smørgrav tests(void)
30bc5531deSDag-Erling Smørgrav {
3119261079SEd Maste #ifdef WITH_OPENSSL
32bc5531deSDag-Erling Smørgrav 	struct bitmap *b;
33bc5531deSDag-Erling Smørgrav 	BIGNUM *bn;
34bc5531deSDag-Erling Smørgrav 	size_t len;
35bc5531deSDag-Erling Smørgrav 	int i, j, k, n;
36bc5531deSDag-Erling Smørgrav 	u_char bbuf[1024], bnbuf[1024];
37bc5531deSDag-Erling Smørgrav 	int r;
38bc5531deSDag-Erling Smørgrav 
39bc5531deSDag-Erling Smørgrav 	TEST_START("bitmap_new");
40bc5531deSDag-Erling Smørgrav 	b = bitmap_new();
41bc5531deSDag-Erling Smørgrav 	ASSERT_PTR_NE(b, NULL);
42bc5531deSDag-Erling Smørgrav 	bn = BN_new();
43bc5531deSDag-Erling Smørgrav 	ASSERT_PTR_NE(bn, NULL);
44bc5531deSDag-Erling Smørgrav 	TEST_DONE();
45bc5531deSDag-Erling Smørgrav 
46bc5531deSDag-Erling Smørgrav 	TEST_START("bitmap_set_bit / bitmap_test_bit");
47bc5531deSDag-Erling Smørgrav 	for (i = -1; i < NTESTS; i++) {
48bc5531deSDag-Erling Smørgrav 		for (j = -1; j < NTESTS; j++) {
49bc5531deSDag-Erling Smørgrav 			for (k = -1; k < NTESTS; k++) {
50bc5531deSDag-Erling Smørgrav 				bitmap_zero(b);
51bc5531deSDag-Erling Smørgrav 				BN_clear(bn);
52bc5531deSDag-Erling Smørgrav 
53bc5531deSDag-Erling Smørgrav 				test_subtest_info("set %d/%d/%d", i, j, k);
54bc5531deSDag-Erling Smørgrav 				/* Set bits */
55bc5531deSDag-Erling Smørgrav 				if (i >= 0) {
56bc5531deSDag-Erling Smørgrav 					ASSERT_INT_EQ(bitmap_set_bit(b, i), 0);
57bc5531deSDag-Erling Smørgrav 					ASSERT_INT_EQ(BN_set_bit(bn, i), 1);
58bc5531deSDag-Erling Smørgrav 				}
59bc5531deSDag-Erling Smørgrav 				if (j >= 0) {
60bc5531deSDag-Erling Smørgrav 					ASSERT_INT_EQ(bitmap_set_bit(b, j), 0);
61bc5531deSDag-Erling Smørgrav 					ASSERT_INT_EQ(BN_set_bit(bn, j), 1);
62bc5531deSDag-Erling Smørgrav 				}
63bc5531deSDag-Erling Smørgrav 				if (k >= 0) {
64bc5531deSDag-Erling Smørgrav 					ASSERT_INT_EQ(bitmap_set_bit(b, k), 0);
65bc5531deSDag-Erling Smørgrav 					ASSERT_INT_EQ(BN_set_bit(bn, k), 1);
66bc5531deSDag-Erling Smørgrav 				}
67bc5531deSDag-Erling Smørgrav 
68bc5531deSDag-Erling Smørgrav 				/* Check perfect match between bitmap and bn */
69bc5531deSDag-Erling Smørgrav 				test_subtest_info("match %d/%d/%d", i, j, k);
70bc5531deSDag-Erling Smørgrav 				for (n = 0; n < NTESTS; n++) {
71bc5531deSDag-Erling Smørgrav 					ASSERT_INT_EQ(BN_is_bit_set(bn, n),
72bc5531deSDag-Erling Smørgrav 					    bitmap_test_bit(b, n));
73bc5531deSDag-Erling Smørgrav 				}
74bc5531deSDag-Erling Smørgrav 
75bc5531deSDag-Erling Smørgrav 				/* Test length calculations */
76bc5531deSDag-Erling Smørgrav 				test_subtest_info("length %d/%d/%d", i, j, k);
77bc5531deSDag-Erling Smørgrav 				ASSERT_INT_EQ(BN_num_bits(bn),
78bc5531deSDag-Erling Smørgrav 				    (int)bitmap_nbits(b));
79bc5531deSDag-Erling Smørgrav 				ASSERT_INT_EQ(BN_num_bytes(bn),
80bc5531deSDag-Erling Smørgrav 				    (int)bitmap_nbytes(b));
81bc5531deSDag-Erling Smørgrav 
82bc5531deSDag-Erling Smørgrav 				/* Test serialisation */
83bc5531deSDag-Erling Smørgrav 				test_subtest_info("serialise %d/%d/%d",
84bc5531deSDag-Erling Smørgrav 				    i, j, k);
85bc5531deSDag-Erling Smørgrav 				len = bitmap_nbytes(b);
86bc5531deSDag-Erling Smørgrav 				memset(bbuf, 0xfc, sizeof(bbuf));
87bc5531deSDag-Erling Smørgrav 				ASSERT_INT_EQ(bitmap_to_string(b, bbuf,
88bc5531deSDag-Erling Smørgrav 				    sizeof(bbuf)), 0);
89bc5531deSDag-Erling Smørgrav 				for (n = len; n < (int)sizeof(bbuf); n++)
90bc5531deSDag-Erling Smørgrav 					ASSERT_U8_EQ(bbuf[n], 0xfc);
91bc5531deSDag-Erling Smørgrav 				r = BN_bn2bin(bn, bnbuf);
92bc5531deSDag-Erling Smørgrav 				ASSERT_INT_GE(r, 0);
93bc5531deSDag-Erling Smørgrav 				ASSERT_INT_EQ(r, (int)len);
94bc5531deSDag-Erling Smørgrav 				ASSERT_MEM_EQ(bbuf, bnbuf, len);
95bc5531deSDag-Erling Smørgrav 
96bc5531deSDag-Erling Smørgrav 				/* Test deserialisation */
97bc5531deSDag-Erling Smørgrav 				test_subtest_info("deserialise %d/%d/%d",
98bc5531deSDag-Erling Smørgrav 				    i, j, k);
99bc5531deSDag-Erling Smørgrav 				bitmap_zero(b);
100bc5531deSDag-Erling Smørgrav 				ASSERT_INT_EQ(bitmap_from_string(b, bnbuf,
101bc5531deSDag-Erling Smørgrav 				    len), 0);
102bc5531deSDag-Erling Smørgrav 				for (n = 0; n < NTESTS; n++) {
103bc5531deSDag-Erling Smørgrav 					ASSERT_INT_EQ(BN_is_bit_set(bn, n),
104bc5531deSDag-Erling Smørgrav 					    bitmap_test_bit(b, n));
105bc5531deSDag-Erling Smørgrav 				}
106bc5531deSDag-Erling Smørgrav 
107bc5531deSDag-Erling Smørgrav 				/* Test clearing bits */
108bc5531deSDag-Erling Smørgrav 				test_subtest_info("clear %d/%d/%d",
109bc5531deSDag-Erling Smørgrav 				    i, j, k);
110bc5531deSDag-Erling Smørgrav 				for (n = 0; n < NTESTS; n++) {
111bc5531deSDag-Erling Smørgrav 					ASSERT_INT_EQ(bitmap_set_bit(b, n), 0);
112bc5531deSDag-Erling Smørgrav 					ASSERT_INT_EQ(BN_set_bit(bn, n), 1);
113bc5531deSDag-Erling Smørgrav 				}
114bc5531deSDag-Erling Smørgrav 				if (i >= 0) {
115bc5531deSDag-Erling Smørgrav 					bitmap_clear_bit(b, i);
116bc5531deSDag-Erling Smørgrav 					BN_clear_bit(bn, i);
117bc5531deSDag-Erling Smørgrav 				}
118bc5531deSDag-Erling Smørgrav 				if (j >= 0) {
119bc5531deSDag-Erling Smørgrav 					bitmap_clear_bit(b, j);
120bc5531deSDag-Erling Smørgrav 					BN_clear_bit(bn, j);
121bc5531deSDag-Erling Smørgrav 				}
122bc5531deSDag-Erling Smørgrav 				if (k >= 0) {
123bc5531deSDag-Erling Smørgrav 					bitmap_clear_bit(b, k);
124bc5531deSDag-Erling Smørgrav 					BN_clear_bit(bn, k);
125bc5531deSDag-Erling Smørgrav 				}
126bc5531deSDag-Erling Smørgrav 				for (n = 0; n < NTESTS; n++) {
127bc5531deSDag-Erling Smørgrav 					ASSERT_INT_EQ(BN_is_bit_set(bn, n),
128bc5531deSDag-Erling Smørgrav 					    bitmap_test_bit(b, n));
129bc5531deSDag-Erling Smørgrav 				}
130bc5531deSDag-Erling Smørgrav 			}
131bc5531deSDag-Erling Smørgrav 		}
132bc5531deSDag-Erling Smørgrav 	}
133bc5531deSDag-Erling Smørgrav 	bitmap_free(b);
134bc5531deSDag-Erling Smørgrav 	BN_free(bn);
135bc5531deSDag-Erling Smørgrav 	TEST_DONE();
13619261079SEd Maste #endif
137bc5531deSDag-Erling Smørgrav }
138bc5531deSDag-Erling Smørgrav 
139