1*d3273b5bSchristos /* $NetBSD: test_bn.c,v 1.2 2017/01/28 21:31:47 christos Exp $ */
2ca1c9b0cSelric
3ca1c9b0cSelric /*
4ca1c9b0cSelric * Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan
5ca1c9b0cSelric * (Royal Institute of Technology, Stockholm, Sweden).
6ca1c9b0cSelric * All rights reserved.
7ca1c9b0cSelric *
8ca1c9b0cSelric * Redistribution and use in source and binary forms, with or without
9ca1c9b0cSelric * modification, are permitted provided that the following conditions
10ca1c9b0cSelric * are met:
11ca1c9b0cSelric *
12ca1c9b0cSelric * 1. Redistributions of source code must retain the above copyright
13ca1c9b0cSelric * notice, this list of conditions and the following disclaimer.
14ca1c9b0cSelric *
15ca1c9b0cSelric * 2. Redistributions in binary form must reproduce the above copyright
16ca1c9b0cSelric * notice, this list of conditions and the following disclaimer in the
17ca1c9b0cSelric * documentation and/or other materials provided with the distribution.
18ca1c9b0cSelric *
19ca1c9b0cSelric * 3. Neither the name of the Institute nor the names of its contributors
20ca1c9b0cSelric * may be used to endorse or promote products derived from this software
21ca1c9b0cSelric * without specific prior written permission.
22ca1c9b0cSelric *
23ca1c9b0cSelric * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24ca1c9b0cSelric * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25ca1c9b0cSelric * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26ca1c9b0cSelric * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27ca1c9b0cSelric * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28ca1c9b0cSelric * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29ca1c9b0cSelric * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30ca1c9b0cSelric * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31ca1c9b0cSelric * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32ca1c9b0cSelric * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33ca1c9b0cSelric * SUCH DAMAGE.
34ca1c9b0cSelric */
35ca1c9b0cSelric
36ca1c9b0cSelric #include <config.h>
37b9d004c6Schristos #include <krb5/roken.h>
38ca1c9b0cSelric
39ca1c9b0cSelric #include <bn.h>
40ca1c9b0cSelric #include <rand.h>
41ca1c9b0cSelric
42ca1c9b0cSelric static int
set_get(unsigned long num)43ca1c9b0cSelric set_get(unsigned long num)
44ca1c9b0cSelric {
45ca1c9b0cSelric BIGNUM *bn;
46ca1c9b0cSelric
47ca1c9b0cSelric bn = BN_new();
48ca1c9b0cSelric if (!BN_set_word(bn, num))
49ca1c9b0cSelric return 1;
50ca1c9b0cSelric
51ca1c9b0cSelric if (BN_get_word(bn) != num)
52ca1c9b0cSelric return 1;
53ca1c9b0cSelric
54ca1c9b0cSelric BN_free(bn);
55ca1c9b0cSelric return 0;
56ca1c9b0cSelric }
57ca1c9b0cSelric
58ca1c9b0cSelric #define CHECK(x) do { ret += x; } while(0)
59ca1c9b0cSelric
60ca1c9b0cSelric static int
test_BN_set_get(void)61ca1c9b0cSelric test_BN_set_get(void)
62ca1c9b0cSelric {
63ca1c9b0cSelric int ret = 0;
64ca1c9b0cSelric CHECK(set_get(0));
65ca1c9b0cSelric CHECK(set_get(1));
66ca1c9b0cSelric CHECK(set_get(0xff));
67ca1c9b0cSelric CHECK(set_get(0x1ff));
68ca1c9b0cSelric CHECK(set_get(0xffff));
69ca1c9b0cSelric CHECK(set_get(0xf000));
70ca1c9b0cSelric CHECK(set_get(ULONG_MAX / 2));
71ca1c9b0cSelric CHECK(set_get(ULONG_MAX - 1));
72ca1c9b0cSelric
73ca1c9b0cSelric return ret;
74ca1c9b0cSelric }
75ca1c9b0cSelric
76ca1c9b0cSelric static int
test_BN_bit(void)77ca1c9b0cSelric test_BN_bit(void)
78ca1c9b0cSelric {
79ca1c9b0cSelric BIGNUM *bn;
80ca1c9b0cSelric int ret = 0;
81ca1c9b0cSelric
82ca1c9b0cSelric bn = BN_new();
83ca1c9b0cSelric
84ca1c9b0cSelric /* test setting and getting of "word" */
85ca1c9b0cSelric if (!BN_set_word(bn, 1))
86ca1c9b0cSelric return 1;
87ca1c9b0cSelric if (!BN_is_bit_set(bn, 0))
88ca1c9b0cSelric ret += 1;
89ca1c9b0cSelric if (!BN_is_bit_set(bn, 0))
90ca1c9b0cSelric ret += 1;
91ca1c9b0cSelric
92ca1c9b0cSelric if (!BN_set_word(bn, 2))
93ca1c9b0cSelric return 1;
94ca1c9b0cSelric if (!BN_is_bit_set(bn, 1))
95ca1c9b0cSelric ret += 1;
96ca1c9b0cSelric
97ca1c9b0cSelric if (!BN_set_word(bn, 3))
98ca1c9b0cSelric return 1;
99ca1c9b0cSelric if (!BN_is_bit_set(bn, 0))
100ca1c9b0cSelric ret += 1;
101ca1c9b0cSelric if (!BN_is_bit_set(bn, 1))
102ca1c9b0cSelric ret += 1;
103ca1c9b0cSelric
104ca1c9b0cSelric if (!BN_set_word(bn, 0x100))
105ca1c9b0cSelric return 1;
106ca1c9b0cSelric if (!BN_is_bit_set(bn, 8))
107ca1c9b0cSelric ret += 1;
108ca1c9b0cSelric
109ca1c9b0cSelric if (!BN_set_word(bn, 0x1000))
110ca1c9b0cSelric return 1;
111ca1c9b0cSelric if (!BN_is_bit_set(bn, 12))
112ca1c9b0cSelric ret += 1;
113ca1c9b0cSelric
114ca1c9b0cSelric /* test bitsetting */
115ca1c9b0cSelric if (!BN_set_word(bn, 1))
116ca1c9b0cSelric return 1;
117ca1c9b0cSelric if (!BN_set_bit(bn, 1))
118ca1c9b0cSelric return 1;
119ca1c9b0cSelric if (BN_get_word(bn) != 3)
120ca1c9b0cSelric return 1;
121ca1c9b0cSelric if (!BN_clear_bit(bn, 0))
122ca1c9b0cSelric return 1;
123ca1c9b0cSelric if (BN_get_word(bn) != 2)
124ca1c9b0cSelric return 1;
125ca1c9b0cSelric
126ca1c9b0cSelric /* test bitsetting past end of current end */
127ca1c9b0cSelric BN_clear(bn);
128ca1c9b0cSelric if (!BN_set_bit(bn, 12))
129ca1c9b0cSelric return 1;
130ca1c9b0cSelric if (BN_get_word(bn) != 0x1000)
131ca1c9b0cSelric return 1;
132ca1c9b0cSelric
133ca1c9b0cSelric /* test bit and byte counting functions */
134ca1c9b0cSelric if (BN_num_bits(bn) != 13)
135ca1c9b0cSelric return 1;
136ca1c9b0cSelric if (BN_num_bytes(bn) != 2)
137ca1c9b0cSelric return 1;
138ca1c9b0cSelric
139ca1c9b0cSelric BN_free(bn);
140ca1c9b0cSelric return ret;
141ca1c9b0cSelric }
142ca1c9b0cSelric
143ca1c9b0cSelric struct ietest {
144ca1c9b0cSelric char *data;
145ca1c9b0cSelric size_t len;
146ca1c9b0cSelric unsigned long num;
147ca1c9b0cSelric } ietests[] = {
148ca1c9b0cSelric { "", 0, 0 },
149ca1c9b0cSelric { "\x01", 1, 1 },
150ca1c9b0cSelric { "\x02", 1, 2 },
151ca1c9b0cSelric { "\xf2", 1, 0xf2 },
152ca1c9b0cSelric { "\x01\x00", 2, 256 }
153ca1c9b0cSelric };
154ca1c9b0cSelric
155ca1c9b0cSelric static int
test_BN_import_export(void)156ca1c9b0cSelric test_BN_import_export(void)
157ca1c9b0cSelric {
158ca1c9b0cSelric BIGNUM *bn;
159ca1c9b0cSelric int ret = 0;
160ca1c9b0cSelric int i;
161ca1c9b0cSelric
162ca1c9b0cSelric bn = BN_new();
163ca1c9b0cSelric
164ca1c9b0cSelric for (i = 0; i < sizeof(ietests)/sizeof(ietests[0]); i++) {
165ca1c9b0cSelric size_t len;
166ca1c9b0cSelric unsigned char *p;
167ca1c9b0cSelric if (!BN_bin2bn((unsigned char*)ietests[i].data, ietests[i].len, bn))
168ca1c9b0cSelric return 1;
169ca1c9b0cSelric if (BN_get_word(bn) != ietests[i].num)
170ca1c9b0cSelric return 1;
171ca1c9b0cSelric len = BN_num_bytes(bn);
172ca1c9b0cSelric if (len != ietests[i].len)
173ca1c9b0cSelric return 1;
174ca1c9b0cSelric p = malloc(len + 1);
175ca1c9b0cSelric p[len] = 0xf4;
176ca1c9b0cSelric BN_bn2bin(bn, p);
177ca1c9b0cSelric if (p[len] != 0xf4)
178ca1c9b0cSelric return 1;
179ca1c9b0cSelric if (memcmp(p, ietests[i].data, ietests[i].len) != 0)
180ca1c9b0cSelric return 1;
181ca1c9b0cSelric free(p);
182ca1c9b0cSelric }
183ca1c9b0cSelric
184ca1c9b0cSelric BN_free(bn);
185ca1c9b0cSelric return ret;
186ca1c9b0cSelric }
187ca1c9b0cSelric
188ca1c9b0cSelric static int
test_BN_uadd(void)189ca1c9b0cSelric test_BN_uadd(void)
190ca1c9b0cSelric {
191ca1c9b0cSelric BIGNUM *a, *b, *c;
192ca1c9b0cSelric char *p;
193ca1c9b0cSelric
194ca1c9b0cSelric a = BN_new();
195ca1c9b0cSelric b = BN_new();
196ca1c9b0cSelric c = BN_new();
197ca1c9b0cSelric
198ca1c9b0cSelric BN_set_word(a, 1);
199ca1c9b0cSelric BN_set_word(b, 2);
200ca1c9b0cSelric
201ca1c9b0cSelric BN_uadd(c, a, b);
202ca1c9b0cSelric
203ca1c9b0cSelric if (BN_get_word(c) != 3)
204ca1c9b0cSelric return 1;
205ca1c9b0cSelric
206ca1c9b0cSelric BN_uadd(c, b, a);
207ca1c9b0cSelric
208ca1c9b0cSelric if (BN_get_word(c) != 3)
209ca1c9b0cSelric return 1;
210ca1c9b0cSelric
211ca1c9b0cSelric BN_set_word(b, 0xff);
212ca1c9b0cSelric
213ca1c9b0cSelric BN_uadd(c, a, b);
214ca1c9b0cSelric if (BN_get_word(c) != 0x100)
215ca1c9b0cSelric return 1;
216ca1c9b0cSelric
217ca1c9b0cSelric BN_uadd(c, b, a);
218ca1c9b0cSelric if (BN_get_word(c) != 0x100)
219ca1c9b0cSelric return 1;
220ca1c9b0cSelric
221ca1c9b0cSelric BN_set_word(a, 0xff);
222ca1c9b0cSelric
223ca1c9b0cSelric BN_uadd(c, a, b);
224ca1c9b0cSelric if (BN_get_word(c) != 0x1fe)
225ca1c9b0cSelric return 1;
226ca1c9b0cSelric
227ca1c9b0cSelric BN_uadd(c, b, a);
228ca1c9b0cSelric if (BN_get_word(c) != 0x1fe)
229ca1c9b0cSelric return 1;
230ca1c9b0cSelric
231ca1c9b0cSelric
232ca1c9b0cSelric BN_free(a);
233ca1c9b0cSelric BN_free(b);
234ca1c9b0cSelric
235ca1c9b0cSelric BN_hex2bn(&a, "50212A3B611D46642C825A16A354CE0FD4D85DD2");
236ca1c9b0cSelric BN_hex2bn(&b, "84B6C7E8D28ACA1614954DA");
237ca1c9b0cSelric
238ca1c9b0cSelric BN_uadd(c, b, a);
239ca1c9b0cSelric p = BN_bn2hex(c);
240ca1c9b0cSelric if (strcmp(p, "50212A3B611D466434CDC695307D7AB13621B2AC") != 0) {
241ca1c9b0cSelric free(p);
242ca1c9b0cSelric return 1;
243ca1c9b0cSelric }
244ca1c9b0cSelric free(p);
245ca1c9b0cSelric
246ca1c9b0cSelric BN_uadd(c, a, b);
247ca1c9b0cSelric p = BN_bn2hex(c);
248ca1c9b0cSelric if (strcmp(p, "50212A3B611D466434CDC695307D7AB13621B2AC") != 0) {
249ca1c9b0cSelric free(p);
250ca1c9b0cSelric return 1;
251ca1c9b0cSelric }
252ca1c9b0cSelric free(p);
253ca1c9b0cSelric
254ca1c9b0cSelric BN_free(a);
255ca1c9b0cSelric BN_free(b);
256ca1c9b0cSelric BN_free(c);
257ca1c9b0cSelric
258ca1c9b0cSelric return 0;
259ca1c9b0cSelric }
260ca1c9b0cSelric
261ca1c9b0cSelric static int
test_BN_cmp(void)262ca1c9b0cSelric test_BN_cmp(void)
263ca1c9b0cSelric {
264ca1c9b0cSelric BIGNUM *a, *b;
265ca1c9b0cSelric
266ca1c9b0cSelric a = BN_new();
267ca1c9b0cSelric b = BN_new();
268ca1c9b0cSelric
269ca1c9b0cSelric if (!BN_set_word(a, 1))
270ca1c9b0cSelric return 1;
271ca1c9b0cSelric if (!BN_set_word(b, 1))
272ca1c9b0cSelric return 1;
273ca1c9b0cSelric
274ca1c9b0cSelric if (BN_cmp(a, b) != 0)
275ca1c9b0cSelric return 1;
276ca1c9b0cSelric if (BN_cmp(b, a) != 0)
277ca1c9b0cSelric return 1;
278ca1c9b0cSelric
279ca1c9b0cSelric if (!BN_set_word(b, 2))
280ca1c9b0cSelric return 1;
281ca1c9b0cSelric
282ca1c9b0cSelric if (BN_cmp(a, b) >= 0)
283ca1c9b0cSelric return 1;
284ca1c9b0cSelric if (BN_cmp(b, a) <= 0)
285ca1c9b0cSelric return 1;
286ca1c9b0cSelric
287ca1c9b0cSelric BN_set_negative(b, 1);
288ca1c9b0cSelric
289ca1c9b0cSelric if (BN_cmp(a, b) <= 0)
290ca1c9b0cSelric return 1;
291ca1c9b0cSelric if (BN_cmp(b, a) >= 0)
292ca1c9b0cSelric return 1;
293ca1c9b0cSelric
294ca1c9b0cSelric BN_free(a);
295ca1c9b0cSelric BN_free(b);
296ca1c9b0cSelric
297ca1c9b0cSelric BN_hex2bn(&a, "50212A3B611D46642C825A16A354CE0FD4D85DD1");
298ca1c9b0cSelric BN_hex2bn(&b, "50212A3B611D46642C825A16A354CE0FD4D85DD2");
299ca1c9b0cSelric
300ca1c9b0cSelric if (BN_cmp(a, b) >= 0)
301ca1c9b0cSelric return 1;
302ca1c9b0cSelric if (BN_cmp(b, a) <= 0)
303ca1c9b0cSelric return 1;
304ca1c9b0cSelric
305ca1c9b0cSelric BN_set_negative(b, 1);
306ca1c9b0cSelric
307ca1c9b0cSelric if (BN_cmp(a, b) <= 0)
308ca1c9b0cSelric return 1;
309ca1c9b0cSelric if (BN_cmp(b, a) >= 0)
310ca1c9b0cSelric return 1;
311ca1c9b0cSelric
312ca1c9b0cSelric BN_free(a);
313ca1c9b0cSelric BN_free(b);
314ca1c9b0cSelric return 0;
315ca1c9b0cSelric }
316ca1c9b0cSelric
317ca1c9b0cSelric static int
test_BN_rand(void)318ca1c9b0cSelric test_BN_rand(void)
319ca1c9b0cSelric {
320ca1c9b0cSelric BIGNUM *bn;
321ca1c9b0cSelric
322ca1c9b0cSelric if (RAND_status() != 1)
323ca1c9b0cSelric return 0;
324ca1c9b0cSelric
325ca1c9b0cSelric bn = BN_new();
326ca1c9b0cSelric if (bn == NULL)
327ca1c9b0cSelric return 1;
328ca1c9b0cSelric
329ca1c9b0cSelric if (!BN_rand(bn, 1024, 0, 0))
330ca1c9b0cSelric return 1;
331ca1c9b0cSelric
332ca1c9b0cSelric BN_free(bn);
333ca1c9b0cSelric return 0;
334ca1c9b0cSelric }
335ca1c9b0cSelric
336ca1c9b0cSelric #define testnum 100
337ca1c9b0cSelric #define testnum2 10
338ca1c9b0cSelric
339ca1c9b0cSelric static int
test_BN_CTX(void)340ca1c9b0cSelric test_BN_CTX(void)
341ca1c9b0cSelric {
342ca1c9b0cSelric unsigned int i, j;
343ca1c9b0cSelric BIGNUM *bn;
344ca1c9b0cSelric BN_CTX *c;
345ca1c9b0cSelric
346ca1c9b0cSelric if ((c = BN_CTX_new()) == NULL)
347ca1c9b0cSelric return 1;
348ca1c9b0cSelric
349ca1c9b0cSelric for (i = 0; i < testnum; i++) {
350ca1c9b0cSelric BN_CTX_start(c);
351ca1c9b0cSelric BN_CTX_end(c);
352ca1c9b0cSelric }
353ca1c9b0cSelric
354ca1c9b0cSelric for (i = 0; i < testnum; i++)
355ca1c9b0cSelric BN_CTX_start(c);
356ca1c9b0cSelric for (i = 0; i < testnum; i++)
357ca1c9b0cSelric BN_CTX_end(c);
358ca1c9b0cSelric
359ca1c9b0cSelric for (i = 0; i < testnum; i++) {
360ca1c9b0cSelric BN_CTX_start(c);
361ca1c9b0cSelric if ((bn = BN_CTX_get(c)) == NULL)
362ca1c9b0cSelric return 1;
363ca1c9b0cSelric BN_CTX_end(c);
364ca1c9b0cSelric }
365ca1c9b0cSelric
366ca1c9b0cSelric for (i = 0; i < testnum; i++) {
367ca1c9b0cSelric BN_CTX_start(c);
368ca1c9b0cSelric for (j = 0; j < testnum2; j++)
369ca1c9b0cSelric if ((bn = BN_CTX_get(c)) == NULL)
370ca1c9b0cSelric return 1;
371ca1c9b0cSelric }
372ca1c9b0cSelric for (i = 0; i < testnum; i++)
373ca1c9b0cSelric BN_CTX_end(c);
374ca1c9b0cSelric
375ca1c9b0cSelric BN_CTX_free(c);
376ca1c9b0cSelric return 0;
377ca1c9b0cSelric }
378ca1c9b0cSelric
379ca1c9b0cSelric
380ca1c9b0cSelric int
main(int argc,char ** argv)381ca1c9b0cSelric main(int argc, char **argv)
382ca1c9b0cSelric {
383ca1c9b0cSelric int ret = 0;
384ca1c9b0cSelric
385ca1c9b0cSelric ret += test_BN_set_get();
386ca1c9b0cSelric ret += test_BN_bit();
387ca1c9b0cSelric ret += test_BN_import_export();
388ca1c9b0cSelric ret += test_BN_uadd();
389ca1c9b0cSelric ret += test_BN_cmp();
390ca1c9b0cSelric ret += test_BN_rand();
391ca1c9b0cSelric ret += test_BN_CTX();
392ca1c9b0cSelric
393ca1c9b0cSelric return ret;
394ca1c9b0cSelric }
395