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