1 #include <r_util.h>
2 #include "minunit.h"
3 
test_r_big_from_to_int(void)4 static bool test_r_big_from_to_int(void) {
5 	RNumBig *a = r_big_new ();
6 
7 	mu_assert_eq (0, r_big_to_int (a), "Failed r_big_to_int");
8 
9 	r_big_from_int (a, 0xffff);
10 	mu_assert_eq (0xffff, r_big_to_int (a), "Failed r_big_from_int");
11 
12 	r_big_from_int (a, -0x7fff);
13 	mu_assert_eq (-0x7fff, r_big_to_int (a), "Failed r_big_from_int");
14 
15 	r_big_free (a);
16 	mu_end;
17 }
18 
test_r_big_from_to_hexstr(void)19 static bool test_r_big_from_to_hexstr(void) {
20 	RNumBig *a = r_big_new ();
21 	char *str;
22 
23 	r_big_from_hexstr (a, "0xffff");
24 	mu_assert_eq (0xffff, r_big_to_int (a), "Failed r_big_from_hexstr");
25 
26 	str = r_big_to_hexstr (a);
27 	mu_assert_streq_free (str, "0xffff", "Failed r_big_to_hexstr");
28 
29 	r_big_from_hexstr (a, "-0x7fff");
30 	mu_assert_eq (-0x7fff, r_big_to_int (a), "Failed r_big_from_hexstr");
31 
32 	str = r_big_to_hexstr (a);
33 	mu_assert_streq_free (str, "-0x7fff", "Failed r_big_to_hexstr");
34 
35 	r_big_free (a);
36 	mu_end;
37 }
38 
test_r_big_assign(void)39 static bool test_r_big_assign(void) {
40 	RNumBig *a = r_big_new ();
41 	RNumBig *b = r_big_new ();
42 
43 	r_big_from_int (a, 0xffff);
44 	r_big_assign (b, a);
45 	mu_assert_eq (0xffff, r_big_to_int (b), "Failed r_big_assign");
46 
47 	r_big_from_int (a, -0x7fff);
48 	r_big_assign (b, a);
49 	mu_assert_eq (-0x7fff, r_big_to_int (b), "Failed r_big_assign");
50 
51 	r_big_free (a);
52 	r_big_free (b);
53 	mu_end;
54 }
55 
test_r_big_cmp(void)56 static bool test_r_big_cmp(void) {
57 	RNumBig *a = r_big_new ();
58 	RNumBig *b = r_big_new ();
59 
60 	r_big_from_int (b, 0);
61 	r_big_from_int (a, 1);
62 	mu_assert_eq (1, r_big_cmp (a, b), "Failed r_big_cmp");
63 	mu_assert_eq (-1, r_big_cmp (b, a), "Failed r_big_cmp");
64 	mu_assert_eq (0, r_big_cmp (a, a), "Failed r_big_cmp");
65 	mu_assert_eq (0, r_big_cmp (b, b), "Failed r_big_cmp");
66 
67 	r_big_from_hexstr (b, "0xffffffffffffffff");
68 	mu_assert_eq (-1, r_big_cmp (a, b), "Failed r_big_cmp");
69 	mu_assert_eq (1, r_big_cmp (b, a), "Failed r_big_cmp");
70 	mu_assert_eq (0, r_big_cmp (a, a), "Failed r_big_cmp");
71 	mu_assert_eq (0, r_big_cmp (b, b), "Failed r_big_cmp");
72 
73 	r_big_from_int (b, 0);
74 	r_big_from_int (a, -1);
75 	mu_assert_eq (-1, r_big_cmp (a, b), "Failed r_big_cmp");
76 	mu_assert_eq (1, r_big_cmp (b, a), "Failed r_big_cmp");
77 	mu_assert_eq (0, r_big_cmp (a, a), "Failed r_big_cmp");
78 	mu_assert_eq (0, r_big_cmp (b, b), "Failed r_big_cmp");
79 
80 	r_big_from_hexstr (b, "-0x7fffffffffffffff");
81 	mu_assert_eq (1, r_big_cmp (a, b), "Failed r_big_cmp");
82 	mu_assert_eq (-1, r_big_cmp (b, a), "Failed r_big_cmp");
83 	mu_assert_eq (0, r_big_cmp (a, a), "Failed r_big_cmp");
84 	mu_assert_eq (0, r_big_cmp (b, b), "Failed r_big_cmp");
85 
86 	r_big_from_hexstr (a, "-0x7fffffffffffffff");
87 	r_big_from_hexstr (b, "0xffffffffffffffff");
88 	mu_assert_eq (-1, r_big_cmp (a, b), "Failed r_big_cmp");
89 	mu_assert_eq (1, r_big_cmp (b, a), "Failed r_big_cmp");
90 
91 	r_big_free (a);
92 	r_big_free (b);
93 	mu_end;
94 }
95 
test_r_big_add(void)96 static bool test_r_big_add(void) {
97 	RNumBig *a = r_big_new ();
98 	RNumBig *b = r_big_new ();
99 	RNumBig *c = r_big_new ();
100 
101 	r_big_from_int (a, 1);
102 	r_big_from_int (b, -1);
103 	r_big_add (c, a, b);
104 	mu_assert_eq (0, r_big_to_int (c), "Failed r_big_add");
105 	r_big_add (c, b, a);
106 	mu_assert_eq (0, r_big_to_int (c), "Failed r_big_add");
107 
108 	r_big_from_hexstr (a, "-0x7fffffffffffffff");
109 	r_big_from_hexstr (b, "0x7fffffffffffffff");
110 	r_big_add (c, a, b);
111 	mu_assert_eq (0, r_big_to_int (c), "Failed r_big_add");
112 	r_big_add (c, b, a);
113 	mu_assert_eq (0, r_big_to_int (c), "Failed r_big_add");
114 
115 	r_big_from_hexstr (a, "-0x7fffffffffffffff");
116 	r_big_assign (b, a);
117 	r_big_add (c, a, b);
118 	r_big_from_hexstr (b, "-0xfffffffffffffffe");
119 	mu_assert_eq (0, r_big_cmp (c, b), "Failed r_big_add");
120 
121 	r_big_from_hexstr (a, "0xffffffffffffffff");
122 	r_big_assign (b, a);
123 	r_big_add (c, a, b);
124 	r_big_from_hexstr (b, "0x1fffffffffffffffe");
125 	mu_assert_eq (0, r_big_cmp (c, b), "Failed r_big_add");
126 
127 	r_big_free (a);
128 	r_big_free (b);
129 	r_big_free (c);
130 	mu_end;
131 }
132 
test_r_big_sub(void)133 static bool test_r_big_sub(void) {
134 	RNumBig *a = r_big_new ();
135 	RNumBig *b = r_big_new ();
136 	RNumBig *c = r_big_new ();
137 
138 	r_big_from_int (a, 1);
139 	r_big_from_int (b, 1);
140 	r_big_sub (c, a, b);
141 	mu_assert_eq (0, r_big_to_int (c), "Failed r_big_sub");
142 	r_big_sub (c, b, a);
143 	mu_assert_eq (0, r_big_to_int (c), "Failed r_big_sub");
144 
145 	r_big_from_int (a, 1);
146 	r_big_from_int (b, -1);
147 	r_big_sub (c, a, b);
148 	mu_assert_eq (2, r_big_to_int (c), "Failed r_big_sub");
149 	r_big_sub (c, b, a);
150 	mu_assert_eq (-2, r_big_to_int (c), "Failed r_big_sub");
151 
152 	r_big_from_int (a, -1);
153 	r_big_from_int (b, -1);
154 	r_big_sub (c, a, b);
155 	mu_assert_eq (0, r_big_to_int (c), "Failed r_big_sub");
156 	r_big_sub (c, b, a);
157 	mu_assert_eq (0, r_big_to_int (c), "Failed r_big_sub");
158 
159 	r_big_from_hexstr (a, "0x7fffffffffffffff");
160 	r_big_from_hexstr (b, "0x7fffffffffffffff");
161 	r_big_sub (c, a, b);
162 	mu_assert_eq (0, r_big_to_int (c), "Failed r_big_sub");
163 	r_big_sub (c, b, a);
164 	mu_assert_eq (0, r_big_to_int (c), "Failed r_big_sub");
165 
166 	r_big_from_hexstr (a, "0x7fffffffffffffff");
167 	r_big_from_hexstr (b, "-0x7fffffffffffffff");
168 	r_big_sub (c, a, b);
169 	r_big_from_hexstr (b, "0xfffffffffffffffe");
170 	mu_assert_eq (0, r_big_cmp (c, b), "Failed r_big_sub");
171 	r_big_from_hexstr (b, "-0x7fffffffffffffff");
172 	r_big_sub (c, b, a);
173 	r_big_from_hexstr (b, "-0xfffffffffffffffe");
174 	mu_assert_eq (0, r_big_cmp (c, b), "Failed r_big_sub");
175 
176 	r_big_from_hexstr (a, "-0x7fffffffffffffff");
177 	r_big_from_hexstr (b, "-0x7fffffffffffffff");
178 	r_big_sub (c, a, b);
179 	mu_assert_eq (0, r_big_to_int (c), "Failed r_big_sub");
180 	r_big_sub (c, b, a);
181 	mu_assert_eq (0, r_big_to_int (c), "Failed r_big_sub");
182 
183 	r_big_free (a);
184 	r_big_free (b);
185 	r_big_free (c);
186 	mu_end;
187 }
188 
test_r_big_mul(void)189 static bool test_r_big_mul(void) {
190 	RNumBig *a = r_big_new ();
191 	RNumBig *b = r_big_new ();
192 	RNumBig *c = r_big_new ();
193 
194 	r_big_from_int (a, 2);
195 	r_big_from_int (b, -2);
196 	r_big_mul (c, a, b);
197 	mu_assert_eq (-4, r_big_to_int (c), "Failed r_big_mul");
198 	r_big_mul (c, b, a);
199 	mu_assert_eq (-4, r_big_to_int (c), "Failed r_big_mul");
200 
201 	r_big_from_int (a, 2);
202 	r_big_assign (b, a);
203 	r_big_mul (c, a, b);
204 	mu_assert_eq (4, r_big_to_int (c), "Failed r_big_mul");
205 	r_big_mul (c, b, a);
206 	mu_assert_eq (4, r_big_to_int (c), "Failed r_big_mul");
207 
208 	r_big_from_int (a, -2);
209 	r_big_assign (b, a);
210 	r_big_mul (c, a, b);
211 	mu_assert_eq (4, r_big_to_int (c), "Failed r_big_mul");
212 	r_big_mul (c, b, a);
213 	mu_assert_eq (4, r_big_to_int (c), "Failed r_big_mul");
214 
215 	r_big_from_hexstr (a, "0x7fffffffffffffff");
216 	r_big_from_hexstr (b, "-0x7fffffffffffffff");
217 	r_big_mul (c, a, b);
218 	r_big_from_hexstr (b, "-0x3fffffffffffffff0000000000000001");
219 	mu_assert_eq (0, r_big_cmp (c, b), "Failed r_big_mul");
220 	r_big_from_hexstr (b, "-0x7fffffffffffffff");
221 	r_big_mul (c, b, a);
222 	r_big_from_hexstr (b, "-0x3fffffffffffffff0000000000000001");
223 	mu_assert_eq (0, r_big_cmp (c, b), "Failed r_big_mul");
224 
225 	r_big_from_hexstr (a, "0x7fffffffffffffff");
226 	r_big_from_hexstr (b, "0x7fffffffffffffff");
227 	r_big_mul (c, a, b);
228 	r_big_from_hexstr (b, "0x3fffffffffffffff0000000000000001");
229 	mu_assert_eq (0, r_big_cmp (c, b), "Failed r_big_mul");
230 	r_big_from_hexstr (b, "0x7fffffffffffffff");
231 	r_big_mul (c, b, a);
232 	r_big_from_hexstr (b, "0x3fffffffffffffff0000000000000001");
233 	mu_assert_eq (0, r_big_cmp (c, b), "Failed r_big_mul");
234 
235 	r_big_from_hexstr (a, "-0x7fffffffffffffff");
236 	r_big_from_hexstr (b, "-0x7fffffffffffffff");
237 	r_big_mul (c, a, b);
238 	r_big_from_hexstr (b, "0x3fffffffffffffff0000000000000001");
239 	mu_assert_eq (0, r_big_cmp (c, b), "Failed r_big_mul");
240 	r_big_from_hexstr (b, "-0x7fffffffffffffff");
241 	r_big_mul (c, b, a);
242 	r_big_from_hexstr (b, "0x3fffffffffffffff0000000000000001");
243 	mu_assert_eq (0, r_big_cmp (c, b), "Failed r_big_mul");
244 
245 	r_big_free (a);
246 	r_big_free (b);
247 	r_big_free (c);
248 	mu_end;
249 }
250 
test_r_big_div(void)251 static bool test_r_big_div(void) {
252 	RNumBig *a = r_big_new ();
253 	RNumBig *b = r_big_new ();
254 	RNumBig *c = r_big_new ();
255 
256 	r_big_from_int (a, 2);
257 	r_big_from_int (b, -2);
258 	r_big_div (c, a, b);
259 	mu_assert_eq (-1, r_big_to_int (c), "Failed r_big_div");
260 	r_big_div (c, b, a);
261 	mu_assert_eq (-1, r_big_to_int (c), "Failed r_big_div");
262 
263 	r_big_from_int (a, 4);
264 	r_big_from_int (b, 2);
265 	r_big_div (c, a, b);
266 	mu_assert_eq (2, r_big_to_int (c), "Failed r_big_div");
267 	r_big_div (c, b, a);
268 	mu_assert_eq (0, r_big_to_int (c), "Failed r_big_div");
269 
270 	r_big_from_int (a, -3);
271 	r_big_from_int (b, -2);
272 	r_big_div (c, a, b);
273 	mu_assert_eq (1, r_big_to_int (c), "Failed r_big_div");
274 	r_big_div (c, b, a);
275 	mu_assert_eq (0, r_big_to_int (c), "Failed r_big_div");
276 
277 	r_big_from_hexstr (a, "0x7fffffffffffffff");
278 	r_big_from_int (b, 5);
279 	r_big_div (c, a, b);
280 	r_big_from_hexstr (b, "0x1999999999999999");
281 	mu_assert_eq (0, r_big_cmp (c, b), "Failed r_big_div");
282 
283 	r_big_from_hexstr (a, "0x8000000000000000");
284 	r_big_from_int (b, 0x8000);
285 	r_big_div (c, a, b);
286 	r_big_from_hexstr (b, "0x1000000000000");
287 	mu_assert_eq (0, r_big_cmp (c, b), "Failed r_big_div");
288 
289 	r_big_free (a);
290 	r_big_free (b);
291 	r_big_free (c);
292 	mu_end;
293 }
294 
test_r_big_divmod(void)295 static bool test_r_big_divmod(void) {
296 	RNumBig *a = r_big_new ();
297 	RNumBig *b = r_big_new ();
298 	RNumBig *c = r_big_new ();
299 	RNumBig *d = r_big_new ();
300 
301 	r_big_from_hexstr (a, "0x73204217f728a2fb7dc798618f23c5796675eee1ccd60a3a7be9cddf7d0eb30e9b004b0246051fcbc26ce99b67e23f07d3f2a493b1194af2777ffdfd5d66c61ba4fa2cd14536010ee00e695863039829c315c594c84170559822fcceb20afdc56a81ab7105e17efb0afd8f090bce2e5330e1c78e2e3ab26a1f49610b49b0fafa75b342b5c1a79322be4a92fac102958ed43aee787c221ea5c23e9485321c6b901cdb5c584bebcbea644a8f2c40bfbaf2dee40102e660e37d41b1f2ccee933a57693ee8ee2473bec98911ccd4b853704c7ed73b86da962845efe5399561fb3b0c37f5f0e730ddebcea7144351064f1ee04c1348125807a760186ac33316633d09");
302 	r_big_from_hexstr (b, "0x10001");
303 	r_big_divmod (c, d, a, b);
304 	r_big_from_hexstr (a, "0x731fcef828307acb02fc9564f9becbba9abb542678af918aea5ee380998e1980817fc9827c82a3491f23ca779d6aa19d3255723e3edb0c176b689294cad1fb49a9b08320c2153ef9a114c8439abffd69c5abffe8c858a7fcf0260ca8a5625863121e99526c8f126bf89196777556b8fc77e54fa8de91d3d84b71159a3416c6e3aecf93e62dc1656158e93a1186f10e9dc59d28db5346cb5ef6df9da59476d71945c2169635559694cdb5c1767f493ba9a33a5dc888985ae4e6cd0bffe29357c4117ad7734d0071c91748b58c02c76d8511522a34b06177e47800c194a0669aa59d505396dd470e87988caac45b8ac35588bdbf5498b30ead09bdb9755ced");
305 	mu_assert_eq (0, r_big_cmp (c, a), "Failed r_big_divmod");
306 	mu_assert_eq (57372, r_big_to_int (d), "Failed r_big_divmod");
307 
308 	r_big_free (a);
309 	r_big_free (b);
310 	r_big_free (c);
311 	r_big_free (d);
312 	mu_end;
313 }
314 
test_r_big_mod(void)315 static bool test_r_big_mod(void) {
316 	RNumBig *a = r_big_new ();
317 	RNumBig *b = r_big_new ();
318 	RNumBig *c = r_big_new ();
319 
320 	r_big_from_hexstr (a, "0x73204217f728a2fb7dc798618f23c5796675eee1ccd60a3a7be9cddf7d0eb30e9b004b0246051fcbc26ce99b67e23f07d3f2a493b1194af2777ffdfd5d66c61ba4fa2cd14536010ee00e695863039829c315c594c84170559822fcceb20afdc56a81ab7105e17efb0afd8f090bce2e5330e1c78e2e3ab26a1f49610b49b0fafa75b342b5c1a79322be4a92fac102958ed43aee787c221ea5c23e9485321c6b901cdb5c584bebcbea644a8f2c40bfbaf2dee40102e660e37d41b1f2ccee933a57693ee8ee2473bec98911ccd4b853704c7ed73b86da962845efe5399561fb3b0c37f5f0e730ddebcea7144351064f1ee04c1348125807a760186ac33316633d09");
321 	r_big_from_hexstr (b, "0x10001");
322 	r_big_mod (c, a, b);
323 	mu_assert_eq (57372, r_big_to_int (c), "Failed r_big_mod");
324 
325 	r_big_free (a);
326 	r_big_free (b);
327 	r_big_free (c);
328 	mu_end;
329 }
330 
test_r_big_and(void)331 static bool test_r_big_and(void) {
332 	RNumBig *a = r_big_new ();
333 	RNumBig *b = r_big_new ();
334 	RNumBig *c = r_big_new ();
335 
336 	r_big_from_hexstr (a, "0x73204217f728a2fb7dc798618f23c5796675eee1ccd60a3a7be9cddf7d0eb30e9b004b0246051fcbc26ce99b67e23f07d3f2a493b1194af2777ffdfd5d66c61ba4fa2cd14536010ee00e695863039829c315c594c84170559822fcceb20afdc56a81ab7105e17efb0afd8f090bce2e5330e1c78e2e3ab26a1f49610b49b0fafa75b342b5c1a79322be4a92fac102958ed43aee787c221ea5c23e9485321c6b901cdb5c584bebcbea644a8f2c40bfbaf2dee40102e660e37d41b1f2ccee933a57693ee8ee2473bec98911ccd4b853704c7ed73b86da962845efe5399561fb3b0c37f5f0e730ddebcea7144351064f1ee04c1348125807a760186ac33316633d09");
337 	r_big_from_hexstr (b, "0x8a1712798b2575df7ae8419ad4b43e0df66c4d2af6a327fc78ffe78b9a15dc2b9630167bfc6ca4f7958ba5073a31c0e06da3d7d0db3fac9a33546f3a62a3a2d20992da45141ed267e91e86308ab14ec027580eaa29719592b9e3a354f2135d87cebf6bfe9acf3b85deb9bb098804ce681a979b68a84594b08dd699afc7511f6790e61365f7de17df954b9a865ec840eca9cabf849b5df4d14adb31eabfb27b8f6144f18907026d41a61b59f72a5f689f8aeca79d0e5272cd2f7ba12620826fa36e3eb8d0b2c90dd76a7dda85dfd3ccad1193f50354e6e74fdbc62c1a765fe6515b2142ad1e16d9b0c914d7e345b2b40ef91f7f10b60806a850c1bccafdd080ac");
338 	r_big_and (c, a, b);
339 	r_big_from_hexstr (b, "0x2000211832020db78c000008420040966644c20c482023878e9c58b1804900a92000202440404c38008a1032220000041a284909119089233546d38402282120092084104160006e00e00100201080003100480084110109822a044b2025d854a812b7000c13a810ab98b0908040e4010818308280090200d40010b41101a6210a20225c1861302944a92824000008c800aae0018001481421a108032106b800040500803024940240a0924001f28928ae401000640624d0131a00420822a03683ea8c020410cc10811c8849853400c1093310250862045cbc42810605b2200132140a51014c980811443410402140048134810100006201040800214400008");
340 	mu_assert_eq (0, r_big_cmp (b, c), "Failed r_big_and");
341 
342 	r_big_free (a);
343 	r_big_free (b);
344 	r_big_free (c);
345 	mu_end;
346 }
347 
test_r_big_or(void)348 static bool test_r_big_or(void) {
349 	RNumBig *a = r_big_new ();
350 	RNumBig *b = r_big_new ();
351 	RNumBig *c = r_big_new ();
352 
353 	r_big_from_hexstr (a, "0x73204217f728a2fb7dc798618f23c5796675eee1ccd60a3a7be9cddf7d0eb30e9b004b0246051fcbc26ce99b67e23f07d3f2a493b1194af2777ffdfd5d66c61ba4fa2cd14536010ee00e695863039829c315c594c84170559822fcceb20afdc56a81ab7105e17efb0afd8f090bce2e5330e1c78e2e3ab26a1f49610b49b0fafa75b342b5c1a79322be4a92fac102958ed43aee787c221ea5c23e9485321c6b901cdb5c584bebcbea644a8f2c40bfbaf2dee40102e660e37d41b1f2ccee933a57693ee8ee2473bec98911ccd4b853704c7ed73b86da962845efe5399561fb3b0c37f5f0e730ddebcea7144351064f1ee04c1348125807a760186ac33316633d09");
354 	r_big_from_hexstr (b, "0x8a1712798b2575df7ae8419ad4b43e0df66c4d2af6a327fc78ffe78b9a15dc2b9630167bfc6ca4f7958ba5073a31c0e06da3d7d0db3fac9a33546f3a62a3a2d20992da45141ed267e91e86308ab14ec027580eaa29719592b9e3a354f2135d87cebf6bfe9acf3b85deb9bb098804ce681a979b68a84594b08dd699afc7511f6790e61365f7de17df954b9a865ec840eca9cabf849b5df4d14adb31eabfb27b8f6144f18907026d41a61b59f72a5f689f8aeca79d0e5272cd2f7ba12620826fa36e3eb8d0b2c90dd76a7dda85dfd3ccad1193f50354e6e74fdbc62c1a765fe6515b2142ad1e16d9b0c914d7e345b2b40ef91f7f10b60806a850c1bccafdd080ac");
355 	r_big_or (c, a, b);
356 	r_big_from_hexstr (b, "0xfb37527fff2df7ff7fefd9fbdfb7ff7df67defebfef72ffe7bffefdfff1fff2f9f305f7bfe6dbfffd7efed9f7ff3ffe7fff3f7d3fb3feefa777fffff7fe7e6dbadfafed5553ed36fe91eef78ebb3dee9e75dcfbee971f5d7b9e3ffdef21bfdc7eebfebff9fef7fffdefdbf098bceee7b3af7dfeeae7fb6fa9fdff9afcff1fffff5f753f5f7ff97ffbf4b9afedfcad5eefdfafffcff7ffef5caffb5efbfbe7b9f7ddffdd94febefebe65bdfff6afffaffdeeca79fee72f3fd6ffbf3eeee937ff76f3ef8feb6fbbfdfeb7dded5ffd3fced7fd7ff87def6ef4fffe73d9f77ffff5d7ff5f2ef3edffbfeef14d7f347ffbeeefd1f7f12fe0fa7e858ebfffbfff3bdad");
357 	mu_assert_eq (0, r_big_cmp (b, c), "Failed r_big_or");
358 
359 	r_big_free (a);
360 	r_big_free (b);
361 	r_big_free (c);
362 	mu_end;
363 }
364 
test_r_big_xor(void)365 static bool test_r_big_xor(void) {
366 	RNumBig *a = r_big_new ();
367 	RNumBig *b = r_big_new ();
368 	RNumBig *c = r_big_new ();
369 
370 	r_big_from_hexstr (a, "0x73204217f728a2fb7dc798618f23c5796675eee1ccd60a3a7be9cddf7d0eb30e9b004b0246051fcbc26ce99b67e23f07d3f2a493b1194af2777ffdfd5d66c61ba4fa2cd14536010ee00e695863039829c315c594c84170559822fcceb20afdc56a81ab7105e17efb0afd8f090bce2e5330e1c78e2e3ab26a1f49610b49b0fafa75b342b5c1a79322be4a92fac102958ed43aee787c221ea5c23e9485321c6b901cdb5c584bebcbea644a8f2c40bfbaf2dee40102e660e37d41b1f2ccee933a57693ee8ee2473bec98911ccd4b853704c7ed73b86da962845efe5399561fb3b0c37f5f0e730ddebcea7144351064f1ee04c1348125807a760186ac33316633d09");
371 	r_big_from_hexstr (b, "0x8a1712798b2575df7ae8419ad4b43e0df66c4d2af6a327fc78ffe78b9a15dc2b9630167bfc6ca4f7958ba5073a31c0e06da3d7d0db3fac9a33546f3a62a3a2d20992da45141ed267e91e86308ab14ec027580eaa29719592b9e3a354f2135d87cebf6bfe9acf3b85deb9bb098804ce681a979b68a84594b08dd699afc7511f6790e61365f7de17df954b9a865ec840eca9cabf849b5df4d14adb31eabfb27b8f6144f18907026d41a61b59f72a5f689f8aeca79d0e5272cd2f7ba12620826fa36e3eb8d0b2c90dd76a7dda85dfd3ccad1193f50354e6e74fdbc62c1a765fe6515b2142ad1e16d9b0c914d7e345b2b40ef91f7f10b60806a850c1bccafdd080ac");
372 	r_big_xor (c, a, b);
373 	r_big_from_hexstr (b, "0xf937506e7c0dd724072fd9fb5b97fb749019a3cb3a752dc603162a54e71b6f250d305d79ba69bb3c57e74c9c5dd3ffe7be5173436a26e668442b92c73fc564c9ad68f6945128d3690910ef68e9b2d6e9e44dcb3ee130e5c721c15f9a4019a042a43ec08f9f2e457ed444340083cae03b2a765ce6867f26da929ff8a48ee1e59de55551d0367984fd2b01087c9fcad5627df051fce77fea7488e5a56f8dae101f7d9fadd14ce9a6abc251d6db6ae0d26d5408a69fe83291b06eca53eace1155f40700503e96bab31ee36c16516780bce16f44ce858e70cf0a3423158f17a4dd5d6cd4b24a2ecb327e6e0094b243fdaaeeb50c3702ee0fa1c848ab7ff9ebb3bda5");
374 	mu_assert_eq (0, r_big_cmp (b, c), "Failed r_big_xor");
375 
376 	r_big_free (a);
377 	r_big_free (b);
378 	r_big_free (c);
379 	mu_end;
380 }
381 
test_r_big_inc(void)382 static bool test_r_big_inc(void) {
383 	RNumBig *a = r_big_new ();
384 
385 	r_big_from_int (a, -1);
386 	r_big_inc (a);
387 	mu_assert_eq (0, r_big_to_int (a), "Failed r_big_inc");
388 	r_big_inc (a);
389 	mu_assert_eq (1, r_big_to_int (a), "Failed r_big_inc");
390 
391 	r_big_free (a);
392 	mu_end;
393 }
394 
test_r_big_dec(void)395 static bool test_r_big_dec(void) {
396 	RNumBig *a = r_big_new ();
397 
398 	r_big_from_int (a, 1);
399 	r_big_dec (a);
400 	mu_assert_eq (0, r_big_to_int (a), "Failed r_big_dec");
401 	r_big_dec (a);
402 	mu_assert_eq (-1, r_big_to_int (a), "Failed r_big_dec");
403 
404 	r_big_free (a);
405 	mu_end;
406 }
407 
test_r_big_is_zero(void)408 static bool test_r_big_is_zero(void) {
409 	RNumBig *a = r_big_new ();
410 
411 	r_big_from_int (a, 1);
412 	r_big_dec (a);
413 	mu_assert_eq (1, r_big_is_zero (a), "Failed r_big_is_zero");
414 	r_big_dec (a);
415 	mu_assert_eq (0, r_big_is_zero (a), "Failed r_big_is_zero");
416 
417 	r_big_free (a);
418 	mu_end;
419 }
420 
test_r_big_lshift(void)421 static bool test_r_big_lshift(void) {
422 	RNumBig *a = r_big_new ();
423 	RNumBig *c = r_big_new ();
424 
425 	r_big_from_hexstr (a, "0x73204217f728a2fb7dc798618f23c5796675eee1ccd60a3a7be9cddf7d0eb30e9b004b0246051fcbc26ce99b67e23f07d3f2a493b1194af2777ffdfd5d66c61ba4fa2cd14536010ee00e695863039829c315c594c84170559822fcceb20afdc56a81ab7105e17efb0afd8f090bce2e5330e1c78e2e3ab26a1f49610b49b0fafa75b342b5c1a79322be4a92fac102958ed43aee787c221ea5c23e9485321c6b901cdb5c584bebcbea644a8f2c40bfbaf2dee40102e660e37d41b1f2ccee933a57693ee8ee2473bec98911ccd4b853704c7ed73b86da962845efe5399561fb3b0c37f5f0e730ddebcea7144351064f1ee04c1348125807a760186ac33316633d09");
426 	r_big_lshift (c, a, 1023);
427 	r_big_from_hexstr (a, "0x3990210bfb94517dbee3cc30c791e2bcb33af770e66b051d3df4e6efbe8759874d80258123028fe5e13674cdb3f11f83e9f95249d88ca5793bbffefeaeb3630dd27d1668a29b0087700734ac3181cc14e18ae2ca6420b82acc117e6759057ee2b540d5b882f0bf7d857ec78485e717299870e3c7171d59350fa4b085a4d87d7d3ad9a15ae0d3c9915f25497d60814ac76a1d773c3e110f52e11f4a42990e35c80e6dae2c25f5e5f532254796205fdd796f720081733071bea0d8f96677499d2bb49f74771239df64c488e66a5c29b8263f6b9dc36d4b1422f7f29ccab0fd9d861bfaf873986ef5e7538a21a883278f702609a4092c03d3b00c3561998b319e848000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
428 	mu_assert_eq (0, r_big_cmp (c, a), "Failed r_big_lshift");
429 
430 	r_big_free (a);
431 	r_big_free (c);
432 	mu_end;
433 }
434 
test_r_big_rshift(void)435 static bool test_r_big_rshift(void) {
436 	RNumBig *a = r_big_new ();
437 	RNumBig *c = r_big_new ();
438 
439 	r_big_from_hexstr (a, "0x73204217f728a2fb7dc798618f23c5796675eee1ccd60a3a7be9cddf7d0eb30e9b004b0246051fcbc26ce99b67e23f07d3f2a493b1194af2777ffdfd5d66c61ba4fa2cd14536010ee00e695863039829c315c594c84170559822fcceb20afdc56a81ab7105e17efb0afd8f090bce2e5330e1c78e2e3ab26a1f49610b49b0fafa75b342b5c1a79322be4a92fac102958ed43aee787c221ea5c23e9485321c6b901cdb5c584bebcbea644a8f2c40bfbaf2dee40102e660e37d41b1f2ccee933a57693ee8ee2473bec98911ccd4b853704c7ed73b86da962845efe5399561fb3b0c37f5f0e730ddebcea7144351064f1ee04c1348125807a760186ac33316633d09");
440 	r_big_rshift (c, a, 1023);
441 	r_big_from_hexstr (a, "0xe640842fee5145f6fb8f30c31e478af2ccebddc399ac1474f7d39bbefa1d661d360096048c0a3f9784d9d336cfc47e0fa7e54927623295e4eefffbfabacd8c3749f459a28a6c021dc01cd2b0c6073053862b8b299082e0ab3045f99d6415fb8ad50356e20bc2fdf615fb1e12179c5ca661c38f1c5c7564d43e92c2169361f5f4");
442 	mu_assert_eq (0, r_big_cmp (c, a), "Failed r_big_rshift");
443 
444 	r_big_free (a);
445 	r_big_free (c);
446 	mu_end;
447 }
448 
test_r_big_powm(void)449 static bool test_r_big_powm(void) {
450 	RNumBig *a = r_big_new ();
451 	RNumBig *b = r_big_new ();
452 	RNumBig *c = r_big_new ();
453 	RNumBig *m = r_big_new ();
454 
455 	r_big_from_int (a, 3);
456 	r_big_from_int (b, 4);
457 	r_big_from_int (m, 7);
458 	r_big_powm (c, a, b, m);
459 	mu_assert_eq (4, r_big_to_int (c), "Failed r_big_powm");
460 
461 	r_big_free (a);
462 	r_big_free (b);
463 	r_big_free (c);
464 	r_big_free (m);
465 	mu_end;
466 }
467 
test_r_big_isqrt(void)468 static bool test_r_big_isqrt(void) {
469 	RNumBig *a = r_big_new ();
470 	RNumBig *c = r_big_new ();
471 
472 	r_big_from_int (a, 4);
473 	r_big_isqrt (c, a);
474 	mu_assert_eq (2, r_big_to_int (c), "Failed r_big_isqrt");
475 
476 	r_big_from_int (a, 5);
477 	r_big_isqrt (c, a);
478 	mu_assert_eq (2, r_big_to_int (c), "Failed r_big_isqrt");
479 
480 	r_big_from_int (a, 6);
481 	r_big_isqrt (c, a);
482 	mu_assert_eq (2, r_big_to_int (c), "Failed r_big_isqrt");
483 
484 	r_big_from_int (a, 7);
485 	r_big_isqrt (c, a);
486 	mu_assert_eq (2, r_big_to_int (c), "Failed r_big_isqrt");
487 
488 	r_big_from_int (a, 8);
489 	r_big_isqrt (c, a);
490 	mu_assert_eq (2, r_big_to_int (c), "Failed r_big_isqrt");
491 
492 	r_big_from_int (a, 9);
493 	r_big_isqrt (c, a);
494 	mu_assert_eq (3, r_big_to_int (c), "Failed r_big_isqrt");
495 
496 	r_big_from_hexstr (a, "0x73204217f728a2fb7dc798618f23c5796675eee1ccd60a3a7be9cddf7d0eb30e9b004b0246051fcbc26ce99b67e23f07d3f2a493b1194af2777ffdfd5d66c61ba4fa2cd14536010ee00e695863039829c315c594c84170559822fcceb20afdc56a81ab");
497 	r_big_isqrt (c, a);
498 	r_big_from_hexstr (a, "0xabacc3be640aee406684e32261e8d2ea2cd09a9441904e3213a1d93732f4774876b8136dab7f5e579338ac82cc96b7651f8");
499 	mu_assert_eq (0, r_big_cmp (c, a), "Failed r_big_isqrt");
500 
501 	r_big_free (a);
502 	r_big_free (c);
503 	mu_end;
504 }
505 
all_tests(void)506 static int all_tests(void) {
507 	mu_run_test (test_r_big_from_to_int);
508 	mu_run_test (test_r_big_from_to_hexstr);
509 	mu_run_test (test_r_big_assign);
510 	mu_run_test (test_r_big_cmp);
511 	mu_run_test (test_r_big_add);
512 	mu_run_test (test_r_big_sub);
513 	mu_run_test (test_r_big_mul);
514 	mu_run_test (test_r_big_div);
515 	mu_run_test (test_r_big_divmod);
516 	mu_run_test (test_r_big_mod);
517 	mu_run_test (test_r_big_and);
518 	mu_run_test (test_r_big_or);
519 	mu_run_test (test_r_big_xor);
520 	mu_run_test (test_r_big_inc);
521 	mu_run_test (test_r_big_dec);
522 	mu_run_test (test_r_big_is_zero);
523 	mu_run_test (test_r_big_lshift);
524 	mu_run_test (test_r_big_rshift);
525 	mu_run_test (test_r_big_powm);
526 	mu_run_test (test_r_big_isqrt);
527 	return tests_passed != tests_run;
528 }
529 
main(int argc,char ** argv)530 int main (int argc, char **argv) {
531 	return all_tests ();
532 }
533