xref: /openbsd-src/regress/lib/libcrypto/bn/bn_to_string.c (revision 3e75947a7d507e2b07e295ddec0607bb12d94b01)
1*3e75947aStb /*	$OpenBSD: bn_to_string.c,v 1.5 2023/04/10 21:00:16 tb Exp $ */
2b8d22d11Stb /*
3b8d22d11Stb  * Copyright (c) 2019 Theo Buehler <tb@openbsd.org>
4b8d22d11Stb  *
5b8d22d11Stb  * Permission to use, copy, modify, and distribute this software for any
6b8d22d11Stb  * purpose with or without fee is hereby granted, provided that the above
7b8d22d11Stb  * copyright notice and this permission notice appear in all copies.
8b8d22d11Stb  *
9b8d22d11Stb  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10b8d22d11Stb  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11b8d22d11Stb  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12b8d22d11Stb  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13b8d22d11Stb  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14b8d22d11Stb  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15b8d22d11Stb  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16b8d22d11Stb  */
17b8d22d11Stb 
18b8d22d11Stb #include <err.h>
19b8d22d11Stb #include <stdio.h>
2020c8b67dStb #include <stdlib.h>
21b8d22d11Stb #include <string.h>
22b8d22d11Stb 
230841c446Stb #include <openssl/x509v3.h>
24b8d22d11Stb 
25*3e75947aStb struct bn_to_string_tests {
26b8d22d11Stb 	const char	*input;
270841c446Stb 	const char	*want;
28*3e75947aStb } testcases[] = {
290841c446Stb 	{
300841c446Stb 		.input = "0x0",
310841c446Stb 		.want = "0",
320841c446Stb 	},
330841c446Stb 	{
340841c446Stb 		.input = "-0x0",
350841c446Stb 		.want = "0",
360841c446Stb 	},
370841c446Stb 	{
380841c446Stb 		.input = "0x7",
390841c446Stb 		.want = "7",
400841c446Stb 	},
410841c446Stb 	{
420841c446Stb 		.input = "-0x7",
430841c446Stb 		.want = "-7",
440841c446Stb 	},
450841c446Stb 	{
460841c446Stb 		.input = "0x8",
470841c446Stb 		.want = "8",
480841c446Stb 	},
490841c446Stb 	{
500841c446Stb 		.input = "-0x8",
510841c446Stb 		.want = "-8",
520841c446Stb 	},
530841c446Stb 	{
540841c446Stb 		.input = "0xF",
550841c446Stb 		.want = "15",
560841c446Stb 	},
570841c446Stb 	{
580841c446Stb 		.input = "-0xF",
590841c446Stb 		.want = "-15",
600841c446Stb 	},
610841c446Stb 	{
620841c446Stb 		.input = "0x10",
630841c446Stb 		.want = "16",
640841c446Stb 	},
650841c446Stb 	{
660841c446Stb 		.input = "-0x10",
670841c446Stb 		.want = "-16",
680841c446Stb 	},
690841c446Stb 	{
700841c446Stb 		.input = "0x7F",
710841c446Stb 		.want = "127",
720841c446Stb 	},
730841c446Stb 	{
740841c446Stb 		.input = "-0x7F",
750841c446Stb 		.want = "-127",
760841c446Stb 	},
770841c446Stb 	{
780841c446Stb 		.input = "0x80",
790841c446Stb 		.want = "128",
800841c446Stb 	},
810841c446Stb 	{
820841c446Stb 		.input = "-0x80",
830841c446Stb 		.want = "-128",
840841c446Stb 	},
850841c446Stb 	{
860841c446Stb 		.input = "0xFF",
870841c446Stb 		.want = "255",
880841c446Stb 	},
890841c446Stb 	{
900841c446Stb 		.input = "-0xFF",
910841c446Stb 		.want = "-255",
920841c446Stb 	},
930841c446Stb 	{
940841c446Stb 		.input = "0x100",
950841c446Stb 		.want = "256",
960841c446Stb 	},
970841c446Stb 	{
980841c446Stb 		.input = "0x7FFF",
990841c446Stb 		.want = "32767",
1000841c446Stb 	},
1010841c446Stb 	{
1020841c446Stb 		.input = "-0x7FFF",
1030841c446Stb 		.want = "-32767",
1040841c446Stb 	},
1050841c446Stb 	{
1060841c446Stb 		.input = "0x8000",
1070841c446Stb 		.want = "32768",
1080841c446Stb 	},
1090841c446Stb 	{
1100841c446Stb 		.input = "-0x8000",
1110841c446Stb 		.want = "-32768",
1120841c446Stb 	},
1130841c446Stb 	{
1140841c446Stb 		.input = "0xFFFF",
1150841c446Stb 		.want = "65535",
1160841c446Stb 	},
1170841c446Stb 	{
1180841c446Stb 		.input = "-0xFFFF",
1190841c446Stb 		.want = "-65535",
1200841c446Stb 	},
1210841c446Stb 	{
1220841c446Stb 		.input = "0x10000",
1230841c446Stb 		.want = "65536",
1240841c446Stb 	},
1250841c446Stb 	{
1260841c446Stb 		.input = "-0x10000",
1270841c446Stb 		.want = "-65536",
1280841c446Stb 	},
1290841c446Stb 	{
1300841c446Stb 		.input = "0x7FFFFFFF",
1310841c446Stb 		.want = "2147483647",
1320841c446Stb 	},
1330841c446Stb 	{
1340841c446Stb 		.input = "-0x7FFFFFFF",
1350841c446Stb 		.want = "-2147483647",
1360841c446Stb 	},
1370841c446Stb 	{
1380841c446Stb 		.input = "0x80000000",
1390841c446Stb 		.want = "2147483648",
1400841c446Stb 	},
1410841c446Stb 	{
1420841c446Stb 		.input = "-0x80000000",
1430841c446Stb 		.want = "-2147483648",
1440841c446Stb 	},
1450841c446Stb 	{
1460841c446Stb 		.input = "0xFFFFFFFF",
1470841c446Stb 		.want = "4294967295",
1480841c446Stb 	},
1490841c446Stb 	{
1500841c446Stb 		.input = "-0xFFFFFFFF",
1510841c446Stb 		.want = "-4294967295",
1520841c446Stb 	},
1530841c446Stb 	{
1540841c446Stb 		.input = "0x100000000",
1550841c446Stb 		.want = "4294967296",
1560841c446Stb 	},
1570841c446Stb 	{
1580841c446Stb 		.input = "-0x100000000",
1590841c446Stb 		.want = "-4294967296",
1600841c446Stb 	},
1610841c446Stb 	{
1620841c446Stb 		.input = "0x7FFFFFFFFFFFFFFF",
1630841c446Stb 		.want = "9223372036854775807",
1640841c446Stb 	},
1650841c446Stb 	{
1660841c446Stb 		.input = "-0x7FFFFFFFFFFFFFFF",
1670841c446Stb 		.want = "-9223372036854775807",
1680841c446Stb 	},
1690841c446Stb 	{
1700841c446Stb 		.input = "0x8000000000000000",
1710841c446Stb 		.want = "9223372036854775808",
1720841c446Stb 	},
1730841c446Stb 	{
1740841c446Stb 		.input = "-0x8000000000000000",
1750841c446Stb 		.want = "-9223372036854775808",
1760841c446Stb 	},
1770841c446Stb 	{
1780841c446Stb 		.input = "0xFFFFFFFFFFFFFFFF",
1790841c446Stb 		.want = "18446744073709551615",
1800841c446Stb 	},
1810841c446Stb 	{
1820841c446Stb 		.input = "-0xFFFFFFFFFFFFFFFF",
1830841c446Stb 		.want = "-18446744073709551615",
1840841c446Stb 	},
1850841c446Stb 	{
1860841c446Stb 		.input = "0x10000000000000000",
1870841c446Stb 		.want = "18446744073709551616",
1880841c446Stb 	},
1890841c446Stb 	{
1900841c446Stb 		.input = "-0x10000000000000000",
1910841c446Stb 		.want = "-18446744073709551616",
1920841c446Stb 	},
1930841c446Stb 	{
1940841c446Stb 		.input = "0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
1950841c446Stb 		.want = "170141183460469231731687303715884105727",
1960841c446Stb 	},
1970841c446Stb 	{
1980841c446Stb 		.input = "-0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
1990841c446Stb 		.want = "-170141183460469231731687303715884105727",
2000841c446Stb 	},
2010841c446Stb 	{
2020841c446Stb 		.input = "0x80000000000000000000000000000000",
2030841c446Stb 		.want = "0x80000000000000000000000000000000",
2040841c446Stb 	},
2050841c446Stb 	{
2060841c446Stb 		.input = "-0x80000000000000000000000000000000",
2070841c446Stb 		.want = "-0x80000000000000000000000000000000",
2080841c446Stb 	},
2090841c446Stb 	{
2100841c446Stb 		.input = "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
2110841c446Stb 		.want = "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
2120841c446Stb 	},
2130841c446Stb 	{
2140841c446Stb 		.input = "-0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
2150841c446Stb 		.want = "-0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
2160841c446Stb 	},
2170841c446Stb 	{
2180841c446Stb 		.input = "0x100000000000000000000000000000000",
2190841c446Stb 		.want = "0x0100000000000000000000000000000000",
2200841c446Stb 	},
2210841c446Stb 	{
2220841c446Stb 		.input = "-0x100000000000000000000000000000000",
2230841c446Stb 		.want = "-0x0100000000000000000000000000000000",
2240841c446Stb 	},
2250841c446Stb 	{
2260841c446Stb 		.input = NULL,
2270841c446Stb 	},
228b8d22d11Stb };
229b8d22d11Stb 
230b8d22d11Stb int
main(void)231*3e75947aStb main(void)
232b8d22d11Stb {
233*3e75947aStb 	struct bn_to_string_tests *test;
2340841c446Stb 	ASN1_INTEGER *aint;
2350841c446Stb 	char *got;
236b8d22d11Stb 	int failed = 0;
237b8d22d11Stb 
238b8d22d11Stb 	for (test = testcases; test->input != NULL; test++) {
2390841c446Stb 		if ((aint = s2i_ASN1_INTEGER(NULL, test->input)) == NULL)
2400841c446Stb 			errx(1, "s2i_ASN1_INTEGER(%s)", test->input);
2410841c446Stb 		if ((got = i2s_ASN1_INTEGER(NULL, aint)) == NULL)
2420841c446Stb 			errx(1, "i2s_ASN1_INTEGER(%s)", test->input);
2430841c446Stb 		if (strcmp(got, test->want) != 0) {
2440841c446Stb 			warnx("want: %s, got: %s", test->want, got);
2450841c446Stb 			failed |= 1;
246b8d22d11Stb 		}
2470841c446Stb 		ASN1_INTEGER_free(aint);
2480841c446Stb 		free(got);
249b8d22d11Stb 	}
250b8d22d11Stb 
251b8d22d11Stb 	return failed;
252b8d22d11Stb }
253