cfbd950d14d12104a7a7a2a71df2018844c559d5
[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 int main(int argc, char **argv)
83 {
84   SilcBool success = FALSE;
85   unsigned char i[65535], r[65535], hash[20];
86   SilcMPInt mp1, mp2, mp3, mp4;
87   SilcUInt32 ui;
88   SilcHash sha1;
89
90   silc_runtime_init();
91
92   if (argc > 1 && !strcmp(argv[1], "-d")) {
93     silc_log_debug(TRUE);
94     silc_log_quick(TRUE);
95     silc_log_debug_hexdump(TRUE);
96     silc_log_set_debug_string("*mp*,*math*,*tfm*,*tma*,*gmp*,*stack*");
97   }
98
99   silc_hash_alloc("sha1", &sha1);
100
101   if (!silc_mp_init(&mp1))
102     goto err;
103   if (!silc_mp_init(&mp2))
104     goto err;
105   if (!silc_mp_init(&mp3))
106     goto err;
107   if (!silc_mp_init(&mp4))
108     goto err;
109
110   SILC_LOG_DEBUG(("Set number: %s", num));
111   silc_mp_set_str(&mp1, num, 10);
112
113   SILC_LOG_DEBUG(("Get number, base 10"));
114   if (!silc_mp_get_str(r, &mp1, 10))
115     goto err;
116   SILC_LOG_DEBUG(("Number: %s", r));
117   if (strcmp(num, r))
118     goto err;
119
120
121   SILC_LOG_DEBUG(("Get number, base 16"));
122   if (!silc_mp_get_str(r, &mp1, 16))
123     goto err;
124   SILC_LOG_DEBUG(("Number: %s", r));
125   if (strcmp(num16, r))
126     goto err;
127
128   SILC_LOG_DEBUG(("Get number, base 2"));
129   if (!silc_mp_get_str(r, &mp1, 2))
130     goto err;
131   SILC_LOG_DEBUG(("Number: %s", r));
132   if (strcmp(num2, r))
133     goto err;
134
135
136   SILC_LOG_DEBUG(("Get size in base 2"));
137   ui = silc_mp_sizeinbase(&mp1, 2);
138   SILC_LOG_DEBUG(("Size: %d (should be %d)", ui, strlen(num2)));
139   if (ui != strlen(num2))
140     goto err;
141
142   SILC_LOG_DEBUG(("Get size in base 16"));
143   ui = silc_mp_sizeinbase(&mp1, 16);
144   SILC_LOG_DEBUG(("Size: %d (should be %d)", ui, strlen(num16)));
145   if (ui != strlen(num16))
146     goto err;
147
148   SILC_LOG_DEBUG(("Get size in base 10"));
149   ui = silc_mp_sizeinbase(&mp1, 10);
150   SILC_LOG_DEBUG(("Size: %d (should be %d)", ui, strlen(num)));
151   if (ui != strlen(num))
152     goto err;
153
154
155   SILC_LOG_DEBUG(("Set integer"));
156   if (!silc_mp_set(&mp2, &mp1))
157     goto err;
158   SILC_LOG_DEBUG(("Compare integers"));
159   if (silc_mp_cmp(&mp1, &mp2) != 0)
160     goto err;
161   SILC_LOG_DEBUG(("Match"));
162
163   SILC_LOG_DEBUG(("Set small UI integer"));
164   if (!silc_mp_set_ui(&mp2, 99999))
165     goto err;
166   SILC_LOG_DEBUG(("Compare integers"));
167   if (silc_mp_cmp_ui(&mp2, 99999) != 0)
168     goto err;
169   SILC_LOG_DEBUG(("Match"));
170
171
172   SILC_LOG_DEBUG(("Get UI"));
173   ui = silc_mp_get_ui(&mp1);
174   SILC_LOG_DEBUG(("UI: %lu", ui));
175   if (ui != 683997856)
176     goto err;
177
178
179   SILC_LOG_DEBUG(("Add %s + %s", num, num));
180   if (!silc_mp_add(&mp3, &mp1, &mp1))
181     goto err;
182   if (!silc_mp_get_str(r, &mp3, 10))
183     goto err;
184   SILC_LOG_DEBUG((" = %s", r));
185   if (strcmp(r, numplusnum))
186     goto err;
187
188   silc_mp_uninit(&mp1);
189   if (!silc_mp_init(&mp1))
190     goto err;
191
192   SILC_LOG_DEBUG(("Div %s / 3", r));
193   if (!silc_mp_div_ui(&mp4, &mp3, 3))
194     goto err;
195   if (!silc_mp_get_str(i, &mp4, 10))
196     goto err;
197   SILC_LOG_DEBUG((" = %s", i));
198   if (strcmp(i, numdiv3))
199     goto err;
200
201   SILC_LOG_DEBUG(("Sub %s - %s", r, i));
202   if (!silc_mp_sub(&mp4, &mp3, &mp4))
203     goto err;
204   if (!silc_mp_get_str(i, &mp4, 10))
205     goto err;
206   SILC_LOG_DEBUG((" = %s", i));
207   if (strcmp(i, numsubnum))
208     goto err;
209
210   SILC_LOG_DEBUG(("Mul %s * %s", r, i));
211   if (!silc_mp_mul(&mp4, &mp3, &mp4))
212     goto err;
213   if (!silc_mp_get_str(i, &mp4, 10))
214     goto err;
215   SILC_LOG_DEBUG((" = %s", i));
216   if (strcmp(i, nummulnum))
217     goto err;
218
219   SILC_LOG_DEBUG(("Pow %s ^ 9", i));
220   if (!silc_mp_pow_ui(&mp3, &mp4, 9))
221     goto err;
222   if (!silc_mp_get_str(r, &mp3, 10))
223     goto err;
224   SILC_LOG_DEBUG((" = %s", r));
225   if (strcmp(r, numpow9))
226     goto err;
227
228   SILC_LOG_DEBUG(("Pow %s ^ 99", i));
229   if (!silc_mp_pow_ui(&mp3, &mp4, 99))
230     goto err;
231   if (!silc_mp_get_str(i, &mp3, 10))
232     goto err;
233   silc_hash_make(sha1, i, strlen(i), hash);
234   silc_data2hex(hash, 20, i, sizeof(i));
235   SILC_LOG_DEBUG(("  digest = %s", i));
236   if (strcmp(i, numpow99))
237     goto err;
238
239   SILC_LOG_DEBUG(("Mod %s", r));
240   if (!silc_mp_mod(&mp3, &mp4, &mp3))
241     goto err;
242   if (!silc_mp_get_str(r, &mp3, 10))
243     goto err;
244   SILC_LOG_DEBUG(("  = %s", r));
245   if (strcmp(r, nummod))
246     goto err;
247
248   SILC_LOG_DEBUG(("Sqrt %s", r));
249   if (!silc_mp_sqrt(&mp4, &mp3))
250     goto err;
251   if (!silc_mp_get_str(i, &mp4, 10))
252     goto err;
253   SILC_LOG_DEBUG(("  = %s", i));
254   if (strcmp(i, numsqrt))
255     goto err;
256
257   if (!silc_mp_add_ui(&mp3, &mp3, 1))
258     goto err;
259   if (!silc_mp_get_str(r, &mp3, 10))
260     goto err;
261   SILC_LOG_DEBUG(("Exptmod %s ^ %s mod %s", i, i, r));
262   if (!silc_mp_pow_mod(&mp1, &mp4, &mp4, &mp3))
263     goto err;
264   if (!silc_mp_get_str(i, &mp1, 10))
265     goto err;
266   SILC_LOG_DEBUG(("  = %s", i));
267   if (strcmp(i, numexptmod))
268     goto err;
269
270   SILC_LOG_DEBUG(("GCD"));
271   if (!silc_mp_gcd(&mp2, &mp1, &mp3))
272     goto err;
273   if (!silc_mp_get_str(i, &mp2, 10))
274     goto err;
275   SILC_LOG_DEBUG(("  = %s", i));
276   if (silc_mp_cmp_ui(&mp2, 1) != 0)
277     goto err;
278
279   SILC_LOG_DEBUG(("Modinv"));
280   if (!silc_mp_modinv(&mp2, &mp1, &mp3))
281     goto err;
282   if (!silc_mp_get_str(i, &mp2, 10))
283     goto err;
284   SILC_LOG_DEBUG(("  = %s", i));
285   if (strcmp(i, numinv))
286     goto err;
287
288   SILC_LOG_DEBUG(("AND"));
289   if (!silc_mp_and(&mp1, &mp4, &mp3))
290     goto err;
291   if (!silc_mp_get_str(i, &mp1, 10))
292     goto err;
293   SILC_LOG_DEBUG(("  = %s", i));
294   if (strcmp(i, numand))
295     goto err;
296
297   SILC_LOG_DEBUG(("OR"));
298   if (!silc_mp_or(&mp1, &mp4, &mp3))
299     goto err;
300   if (!silc_mp_get_str(i, &mp1, 10))
301     goto err;
302   SILC_LOG_DEBUG(("  = %s", i));
303   if (strcmp(i, numor))
304     goto err;
305
306   SILC_LOG_DEBUG(("XOR"));
307   if (!silc_mp_xor(&mp1, &mp4, &mp3))
308     goto err;
309   if (!silc_mp_get_str(i, &mp1, 10))
310     goto err;
311   SILC_LOG_DEBUG(("  = %s", i));
312   if (strcmp(i, numxor))
313     goto err;
314
315
316   silc_mp_uninit(&mp1);
317   silc_mp_uninit(&mp2);
318   silc_mp_uninit(&mp3);
319   silc_mp_uninit(&mp4);
320
321   silc_hash_free(sha1);
322
323   success = TRUE;
324
325  err:
326   SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
327   fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
328
329   silc_runtime_uninit();
330
331   return !success;
332 }