Fixed tfm_fp_mul_2 and tfm_fp_mul_d to handle leading digit correctly.
[crypto.git] / lib / silcmath / tests / test_silcmp.c
1 /* SILC MP API tests */
2
3 #include "silccrypto.h"
4
5 /* Test results */
6
7 const char *num =
8 "12345678901234560982730284776329476199876349211974638723947362976";
9 const char *num16 =
10 "1E02BC1E9785872282806CD2F75C9C037D185B159C6BF928C4FAA0";
11 const char *num2 =
12 "111100000001010111100000111101001011110000101100001110010001010000010100000000110110011010010111101110101110010011100000000110111110100011000010110110001010110011100011010111111100100101000110001001111101010100000";
13
14 /* Add */
15 const char *numplusnum =
16 "24691357802469121965460569552658952399752698423949277447894725952";
17
18 /* Div UI */
19 const char *numdiv3 =
20 "8230452600823040655153523184219650799917566141316425815964908650";
21
22 /* Sub */
23 const char *numsubnum =
24 "16460905201646081310307046368439301599835132282632851631929817302";
25
26 /* Mul */
27 const char *nummulnum =
28 "406442100086368525205432595008864090782598685309019707370392150100104880233122729099893851398423765038006246640472147376718021504";
29
30 /* Pow 9 */
31 const char *numpow9 =
32 "30268310490095248136374442593960735340043215092235037140910676088144"
33 "35058076907508346521934800012973063581682693747048031478666348478106"
34 "44683456845011455064024666852414062817276759918308447029021294253178"
35 "33315247099510816723345641886025287379547228426885091818754699607678"
36 "21224366024226166683969708998047098297710016071652606735552588847286"
37 "34852468216958922270511264725208810741994612375692799609732354209956"
38 "40819760982889468862162693712340583165661711574919011669535502396672"
39 "40312267464770558012687533541147373851940126476804050825510259049427"
40 "65748814943077966488645043069629580317025213490538353938548940375954"
41 "82427393090269404947604548936674976991676788833885882090558205985379"
42 "89472452919247278891609709393833528917324368765083583279471748113886"
43 "79206753418608834013097102872543865922235479608256858601874978505022"
44 "00266244958174441947434256912448253544273297263228373429056333060573"
45 "16358665005119352040979366412364735432045274742825321120330834699236"
46 "76412760737356102356966921386940229431060689424016835315932709079195"
47 "30189129058275516394261019070663759164289157669667381917985720833067"
48 "7211314718626801218364761769796339230934500991496997725669208457478144";
49
50 /* Pow 99, SHA1 digest */
51 const char *numpow99 =
52 "E8BB0A6A5D56133A25F8B640F63E65431179385B";
53
54 /* Mod */
55 const char *nummod =
56 "406442100086368525205432595008864090782598685309019707370392150100104880233122729099893851398423765038006246640472147376718021504";
57
58 /* Sqrt */
59 const char *numsqrt =
60 "20160409224179169057262993915549091951057267453046056852604825434";
61
62 /* Exptmod */
63 const char *numexptmod =
64 "173429534539409901711356454898127569290532192909973256589717126062627843574169918766243051602605611974408600605387662387616633336";
65
66 /* Modinv */
67 const char *numinv =
68 "148304443647050524986847521354145653720804753630979716002896148087342832655697121528033378180741078274204970432436357573430185481";
69
70 /* AND */
71 const char *numand =
72 "13575514895142195405643119649905581499134975342931066988498846464";
73
74 /* OR */
75 const char *numor =
76 "406442100086368525205432595008864090782598685309019707370392150106689774562159702751513725664067275489928538750587137240824000475";
77
78 /* XOR */
79 const char *numxor =
80 "406442100086368525205432595008864090782598685309019707370392150093114259667017507345870606014161693990793563407656070252325154011";
81
82
83 int main(int argc, char **argv)
84 {
85   SilcBool success = FALSE;
86   unsigned char i[65535], r[65535], hash[20];
87   SilcMPInt mp1, mp2, mp3, mp4;
88   SilcUInt32 ui;
89   SilcHash sha1;
90
91   silc_runtime_init();
92
93   if (argc > 1 && !strcmp(argv[1], "-d")) {
94     silc_log_debug(TRUE);
95     silc_log_quick(TRUE);
96     silc_log_debug_hexdump(TRUE);
97     silc_log_set_debug_string("*mp*,*math*,*tfm*,*tma*,*gmp*,*stack*");
98   }
99
100   silc_hash_alloc("sha1", &sha1);
101
102   if (!silc_mp_init(&mp1))
103     goto err;
104   if (!silc_mp_init(&mp2))
105     goto err;
106   if (!silc_mp_init(&mp3))
107     goto err;
108   if (!silc_mp_init(&mp4))
109     goto err;
110
111   SILC_LOG_DEBUG(("Set number: %s", num));
112   silc_mp_set_str(&mp1, num, 10);
113
114   SILC_LOG_DEBUG(("Get number, base 10"));
115   if (!silc_mp_get_str(r, &mp1, 10))
116     goto err;
117   SILC_LOG_DEBUG(("Number: %s", r));
118   if (strcmp(num, r))
119     goto err;
120
121
122   SILC_LOG_DEBUG(("Get number, base 16"));
123   if (!silc_mp_get_str(r, &mp1, 16))
124     goto err;
125   SILC_LOG_DEBUG(("Number: %s", r));
126   if (strcmp(num16, r))
127     goto err;
128
129   SILC_LOG_DEBUG(("Get number, base 2"));
130   if (!silc_mp_get_str(r, &mp1, 2))
131     goto err;
132   SILC_LOG_DEBUG(("Number: %s", r));
133   if (strcmp(num2, r))
134     goto err;
135
136
137   SILC_LOG_DEBUG(("Get size in base 2"));
138   ui = silc_mp_sizeinbase(&mp1, 2);
139   SILC_LOG_DEBUG(("Size: %d (should be %d)", ui, strlen(num2)));
140   if (ui != strlen(num2))
141     goto err;
142
143   SILC_LOG_DEBUG(("Get size in base 16"));
144   ui = silc_mp_sizeinbase(&mp1, 16);
145   SILC_LOG_DEBUG(("Size: %d (should be %d)", ui, strlen(num16)));
146   if (ui != strlen(num16))
147     goto err;
148
149   SILC_LOG_DEBUG(("Get size in base 10"));
150   ui = silc_mp_sizeinbase(&mp1, 10);
151   SILC_LOG_DEBUG(("Size: %d (should be %d)", ui, strlen(num)));
152   if (ui != strlen(num))
153     goto err;
154
155
156   SILC_LOG_DEBUG(("Set integer"));
157   if (!silc_mp_set(&mp2, &mp1))
158     goto err;
159   SILC_LOG_DEBUG(("Compare integers"));
160   if (silc_mp_cmp(&mp1, &mp2) != 0)
161     goto err;
162   SILC_LOG_DEBUG(("Match"));
163
164   SILC_LOG_DEBUG(("Set small UI integer"));
165   if (!silc_mp_set_ui(&mp2, 99999))
166     goto err;
167   SILC_LOG_DEBUG(("Compare integers"));
168   if (silc_mp_cmp_ui(&mp2, 99999) != 0)
169     goto err;
170   SILC_LOG_DEBUG(("Match"));
171
172
173   SILC_LOG_DEBUG(("Get UI"));
174   ui = silc_mp_get_ui(&mp1);
175   SILC_LOG_DEBUG(("UI: %lu", ui));
176   if (ui != 683997856)
177     goto err;
178
179
180   SILC_LOG_DEBUG(("Add %s + %s", num, num));
181   if (!silc_mp_add(&mp3, &mp1, &mp1))
182     goto err;
183   if (!silc_mp_get_str(r, &mp3, 10))
184     goto err;
185   SILC_LOG_DEBUG((" = %s", r));
186   if (strcmp(r, numplusnum))
187     goto err;
188
189   silc_mp_uninit(&mp1);
190   if (!silc_mp_init(&mp1))
191     goto err;
192
193   SILC_LOG_DEBUG(("Div %s / 3", r));
194   if (!silc_mp_div_ui(&mp4, &mp3, 3))
195     goto err;
196   if (!silc_mp_get_str(i, &mp4, 10))
197     goto err;
198   SILC_LOG_DEBUG((" = %s", i));
199   if (strcmp(i, numdiv3))
200     goto err;
201
202   SILC_LOG_DEBUG(("Sub %s - %s", r, i));
203   if (!silc_mp_sub(&mp4, &mp3, &mp4))
204     goto err;
205   if (!silc_mp_get_str(i, &mp4, 10))
206     goto err;
207   SILC_LOG_DEBUG((" = %s", i));
208   if (strcmp(i, numsubnum))
209     goto err;
210
211   SILC_LOG_DEBUG(("Mul %s * %s", r, i));
212   if (!silc_mp_mul(&mp4, &mp3, &mp4))
213     goto err;
214   if (!silc_mp_get_str(i, &mp4, 10))
215     goto err;
216   SILC_LOG_DEBUG((" = %s", i));
217   if (strcmp(i, nummulnum))
218     goto err;
219
220   SILC_LOG_DEBUG(("Pow %s ^ 9", i));
221   if (!silc_mp_pow_ui(&mp3, &mp4, 9))
222     goto err;
223   if (!silc_mp_get_str(r, &mp3, 10))
224     goto err;
225   SILC_LOG_DEBUG((" = %s", r));
226   if (strcmp(r, numpow9))
227     goto err;
228
229   SILC_LOG_DEBUG(("Pow %s ^ 99", i));
230   if (!silc_mp_pow_ui(&mp3, &mp4, 99))
231     goto err;
232   if (!silc_mp_get_str(i, &mp3, 10))
233     goto err;
234   silc_hash_make(sha1, i, strlen(i), hash);
235   silc_data2hex(hash, 20, i, sizeof(i));
236   SILC_LOG_DEBUG(("  digest = %s", i));
237   if (strcmp(i, numpow99))
238     goto err;
239
240   SILC_LOG_DEBUG(("Mod %s", r));
241   if (!silc_mp_mod(&mp3, &mp4, &mp3))
242     goto err;
243   if (!silc_mp_get_str(r, &mp3, 10))
244     goto err;
245   SILC_LOG_DEBUG(("  = %s", r));
246   if (strcmp(r, nummod))
247     goto err;
248
249   SILC_LOG_DEBUG(("Sqrt %s", r));
250   if (!silc_mp_sqrt(&mp4, &mp3))
251     goto err;
252   if (!silc_mp_get_str(i, &mp4, 10))
253     goto err;
254   SILC_LOG_DEBUG(("  = %s", i));
255   if (strcmp(i, numsqrt))
256     goto err;
257
258   if (!silc_mp_add_ui(&mp3, &mp3, 1))
259     goto err;
260   if (!silc_mp_get_str(r, &mp3, 10))
261     goto err;
262   SILC_LOG_DEBUG(("Exptmod %s ^ %s mod %s", i, i, r));
263   if (!silc_mp_pow_mod(&mp1, &mp4, &mp4, &mp3))
264     goto err;
265   if (!silc_mp_get_str(i, &mp1, 10))
266     goto err;
267   SILC_LOG_DEBUG(("  = %s", i));
268   if (strcmp(i, numexptmod))
269     goto err;
270
271   SILC_LOG_DEBUG(("GCD"));
272   if (!silc_mp_gcd(&mp2, &mp1, &mp3))
273     goto err;
274   if (!silc_mp_get_str(i, &mp2, 10))
275     goto err;
276   SILC_LOG_DEBUG(("  = %s", i));
277   if (silc_mp_cmp_ui(&mp2, 1) != 0)
278     goto err;
279
280   SILC_LOG_DEBUG(("Modinv"));
281   if (!silc_mp_modinv(&mp2, &mp1, &mp3))
282     goto err;
283   if (!silc_mp_get_str(i, &mp2, 10))
284     goto err;
285   SILC_LOG_DEBUG(("  = %s", i));
286   if (strcmp(i, numinv))
287     goto err;
288
289   SILC_LOG_DEBUG(("AND"));
290   if (!silc_mp_and(&mp1, &mp4, &mp3))
291     goto err;
292   if (!silc_mp_get_str(i, &mp1, 10))
293     goto err;
294   SILC_LOG_DEBUG(("  = %s", i));
295   if (strcmp(i, numand))
296     goto err;
297
298   SILC_LOG_DEBUG(("OR"));
299   if (!silc_mp_or(&mp1, &mp4, &mp3))
300     goto err;
301   if (!silc_mp_get_str(i, &mp1, 10))
302     goto err;
303   SILC_LOG_DEBUG(("  = %s", i));
304   if (strcmp(i, numor))
305     goto err;
306
307   SILC_LOG_DEBUG(("XOR"));
308   if (!silc_mp_xor(&mp1, &mp4, &mp3))
309     goto err;
310   if (!silc_mp_get_str(i, &mp1, 10))
311     goto err;
312   SILC_LOG_DEBUG(("  = %s", i));
313   if (strcmp(i, numxor))
314     goto err;
315
316
317   silc_mp_uninit(&mp1);
318   silc_mp_uninit(&mp2);
319   silc_mp_uninit(&mp3);
320   silc_mp_uninit(&mp4);
321
322   silc_hash_free(sha1);
323
324   success = TRUE;
325
326  err:
327   SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
328   fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
329
330   silc_runtime_uninit();
331
332   return !success;
333 }