xref: /openbsd-src/regress/lib/libcrypto/bn/bn_to_string.c (revision 0841c4461bfd4165f538ab356cfec2f7b6bd92e6)
1 /*	$OpenBSD: bn_to_string.c,v 1.4 2023/04/10 13:57:32 tb Exp $ */
2 /*
3  * Copyright (c) 2019 Theo Buehler <tb@openbsd.org>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 #include <err.h>
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <string.h>
22 
23 #include <openssl/x509v3.h>
24 
25 char *bn_to_string(const BIGNUM *bn);
26 
27 struct convert_st {
28 	const char	*input;
29 	const char	*want;
30 };
31 
32 struct convert_st testcases[] = {
33 	{
34 		.input = "0x0",
35 		.want = "0",
36 	},
37 	{
38 		.input = "-0x0",
39 		.want = "0",
40 	},
41 	{
42 		.input = "0x7",
43 		.want = "7",
44 	},
45 	{
46 		.input = "-0x7",
47 		.want = "-7",
48 	},
49 	{
50 		.input = "0x8",
51 		.want = "8",
52 	},
53 	{
54 		.input = "-0x8",
55 		.want = "-8",
56 	},
57 	{
58 		.input = "0xF",
59 		.want = "15",
60 	},
61 	{
62 		.input = "-0xF",
63 		.want = "-15",
64 	},
65 	{
66 		.input = "0x10",
67 		.want = "16",
68 	},
69 	{
70 		.input = "-0x10",
71 		.want = "-16",
72 	},
73 	{
74 		.input = "0x7F",
75 		.want = "127",
76 	},
77 	{
78 		.input = "-0x7F",
79 		.want = "-127",
80 	},
81 	{
82 		.input = "0x80",
83 		.want = "128",
84 	},
85 	{
86 		.input = "-0x80",
87 		.want = "-128",
88 	},
89 	{
90 		.input = "0xFF",
91 		.want = "255",
92 	},
93 	{
94 		.input = "-0xFF",
95 		.want = "-255",
96 	},
97 	{
98 		.input = "0x100",
99 		.want = "256",
100 	},
101 	{
102 		.input = "0x7FFF",
103 		.want = "32767",
104 	},
105 	{
106 		.input = "-0x7FFF",
107 		.want = "-32767",
108 	},
109 	{
110 		.input = "0x8000",
111 		.want = "32768",
112 	},
113 	{
114 		.input = "-0x8000",
115 		.want = "-32768",
116 	},
117 	{
118 		.input = "0xFFFF",
119 		.want = "65535",
120 	},
121 	{
122 		.input = "-0xFFFF",
123 		.want = "-65535",
124 	},
125 	{
126 		.input = "0x10000",
127 		.want = "65536",
128 	},
129 	{
130 		.input = "-0x10000",
131 		.want = "-65536",
132 	},
133 	{
134 		.input = "0x7FFFFFFF",
135 		.want = "2147483647",
136 	},
137 	{
138 		.input = "-0x7FFFFFFF",
139 		.want = "-2147483647",
140 	},
141 	{
142 		.input = "0x80000000",
143 		.want = "2147483648",
144 	},
145 	{
146 		.input = "-0x80000000",
147 		.want = "-2147483648",
148 	},
149 	{
150 		.input = "0xFFFFFFFF",
151 		.want = "4294967295",
152 	},
153 	{
154 		.input = "-0xFFFFFFFF",
155 		.want = "-4294967295",
156 	},
157 	{
158 		.input = "0x100000000",
159 		.want = "4294967296",
160 	},
161 	{
162 		.input = "-0x100000000",
163 		.want = "-4294967296",
164 	},
165 	{
166 		.input = "0x7FFFFFFFFFFFFFFF",
167 		.want = "9223372036854775807",
168 	},
169 	{
170 		.input = "-0x7FFFFFFFFFFFFFFF",
171 		.want = "-9223372036854775807",
172 	},
173 	{
174 		.input = "0x8000000000000000",
175 		.want = "9223372036854775808",
176 	},
177 	{
178 		.input = "-0x8000000000000000",
179 		.want = "-9223372036854775808",
180 	},
181 	{
182 		.input = "0xFFFFFFFFFFFFFFFF",
183 		.want = "18446744073709551615",
184 	},
185 	{
186 		.input = "-0xFFFFFFFFFFFFFFFF",
187 		.want = "-18446744073709551615",
188 	},
189 	{
190 		.input = "0x10000000000000000",
191 		.want = "18446744073709551616",
192 	},
193 	{
194 		.input = "-0x10000000000000000",
195 		.want = "-18446744073709551616",
196 	},
197 	{
198 		.input = "0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
199 		.want = "170141183460469231731687303715884105727",
200 	},
201 	{
202 		.input = "-0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
203 		.want = "-170141183460469231731687303715884105727",
204 	},
205 	{
206 		.input = "0x80000000000000000000000000000000",
207 		.want = "0x80000000000000000000000000000000",
208 	},
209 	{
210 		.input = "-0x80000000000000000000000000000000",
211 		.want = "-0x80000000000000000000000000000000",
212 	},
213 	{
214 		.input = "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
215 		.want = "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
216 	},
217 	{
218 		.input = "-0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
219 		.want = "-0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
220 	},
221 	{
222 		.input = "0x100000000000000000000000000000000",
223 		.want = "0x0100000000000000000000000000000000",
224 	},
225 	{
226 		.input = "-0x100000000000000000000000000000000",
227 		.want = "-0x0100000000000000000000000000000000",
228 	},
229 	{
230 		.input = NULL,
231 	},
232 };
233 
234 int
235 main(int argc, char *argv[])
236 {
237 	struct convert_st	*test;
238 	ASN1_INTEGER		*aint;
239 	char			*got;
240 	int			 failed = 0;
241 
242 	for (test = testcases; test->input != NULL; test++) {
243 		if ((aint = s2i_ASN1_INTEGER(NULL, test->input)) == NULL)
244 			errx(1, "s2i_ASN1_INTEGER(%s)", test->input);
245 		if ((got = i2s_ASN1_INTEGER(NULL, aint)) == NULL)
246 			errx(1, "i2s_ASN1_INTEGER(%s)", test->input);
247 		if (strcmp(got, test->want) != 0) {
248 			warnx("want: %s, got: %s", test->want, got);
249 			failed |= 1;
250 		}
251 		ASN1_INTEGER_free(aint);
252 		free(got);
253 	}
254 
255 	return failed;
256 }
257