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