|
1 /* |
|
2 * mpi-test.c |
|
3 * |
|
4 * This is a general test suite for the MPI library, which tests |
|
5 * all the functions in the library with known values. The program |
|
6 * exits with a zero (successful) status if the tests pass, or a |
|
7 * nonzero status if the tests fail. |
|
8 * |
|
9 * This Source Code Form is subject to the terms of the Mozilla Public |
|
10 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
11 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
12 |
|
13 #include <stdio.h> |
|
14 #include <stdlib.h> |
|
15 #include <string.h> |
|
16 #include <stdarg.h> |
|
17 #include <limits.h> |
|
18 #include <time.h> |
|
19 |
|
20 #include "mpi.h" |
|
21 #include "mpprime.h" |
|
22 |
|
23 #include "test-info.c" |
|
24 |
|
25 /* ZS means Zero Suppressed (no leading zeros) */ |
|
26 #if MP_USE_LONG_DIGIT |
|
27 #define ZS_DIGIT_FMT "%lX" |
|
28 #elif MP_USE_LONG_LONG_DIGIT |
|
29 #define ZS_DIGIT_FMT "%llX" |
|
30 #elif MP_USE_UINT_DIGIT |
|
31 #define ZS_DIGIT_FMT "%X" |
|
32 #else |
|
33 #error "unknown type of digit" |
|
34 #endif |
|
35 |
|
36 /* |
|
37 Test vectors |
|
38 |
|
39 If you intend to change any of these values, you must also recompute |
|
40 the corresponding solutions below. Basically, these are just hex |
|
41 strings (for the big integers) or integer values (for the digits). |
|
42 |
|
43 The comparison tests think they know what relationships hold between |
|
44 these values. If you change that, you may have to adjust the code |
|
45 for the comparison tests accordingly. Most of the other tests |
|
46 should be fine as long as you re-compute the solutions, though. |
|
47 */ |
|
48 const char *mp1 = "639A868CDA0C569861B"; |
|
49 const char *mp2 = "AAFC0A3FE45E5E09DBE2C29"; |
|
50 const char *mp3 = "B55AA8DF8A7E83241F38AC7A9E479CAEF2E4D7C5"; |
|
51 const char *mp4 = "-63DBC2265B88268DC801C10EA68476B7BDE0090F"; |
|
52 const char *mp5 = "F595CB42"; |
|
53 const char *mp5a = "-4B597E"; |
|
54 const char *mp6 = "0"; |
|
55 const char *mp7 = "EBFA7121CD838CE6439CC59DDB4CBEF3"; |
|
56 const char *mp8 = "5"; |
|
57 const char *mp9 = "F74A2876A1432698923B0767DA19DCF3D71795EE"; |
|
58 const char *mp10 = "9184E72A000"; |
|
59 const char *mp11 = "54D79A3557E8"; |
|
60 const char *mp12 = "10000000000000000"; |
|
61 const char *mp13 = |
|
62 "34584F700C15A341E40BF7BFDD88A6630C8FF2B2067469372D391342BDAB6163963C" |
|
63 "D5A5C79F708BDE26E0CCF2DB66CD6D6089E29A877C45F2B050D226E6DA88"; |
|
64 const char *mp14 = |
|
65 "AC3FA0EABAAC45724814D798942A1E28E14C81E0DE8055CED630E7689DA648683645DB6E" |
|
66 "458D9F5338CC3D4E33A5D1C9BF42780133599E60DEE0049AFA8F9489501AE5C9AA2B8C13" |
|
67 "FD21285A538B2CA87A626BB56E0A654C8707535E637FF4E39174157402BDE3AA30C9F134" |
|
68 "0C1307BAA864B075A9CC828B6A5E2B2BF1AE406D920CC5E7657D7C0E697DEE5375773AF9" |
|
69 "E200A1B8FAD7CD141F9EE47ABB55511FEB9A4D99EBA22F3A3FF6792FA7EE9E5DC0EE94F7" |
|
70 "7A631EDF3D7DD7C2DAAAFDF234D60302AB63D5234CEAE941B9AF0ADDD9E6E3A940A94EE5" |
|
71 "5DB45A7C66E61EDD0477419BBEFA44C325129601C4F45671C6A0E64665DF341D17FBC71F" |
|
72 "77418BD9F4375DDB3B9D56126526D8E5E0F35A121FD4F347013DA880020A752324F31DDD" |
|
73 "9BCDB13A3B86E207A2DE086825E6EEB87B3A64232CFD8205B799BC018634AAE193F19531" |
|
74 "D6EBC19A75F27CFFAA03EB5974898F53FD569AA5CE60F431B53B0CDE715A5F382405C9C4" |
|
75 "761A8E24888328F09F7BCE4E8D80C957DF177629C8421ACCD0C268C63C0DD47C3C0D954F" |
|
76 "D79F7D7297C6788DF4B3E51381759864D880ACA246DF09533739B8BB6085EAF7AE8DC2D9" |
|
77 "F224E6874926C8D24D34B457FD2C9A586C6B99582DC24F787A39E3942786CF1D494B6EB4" |
|
78 "A513498CDA0B217C4E80BCE7DA1C704C35E071AC21E0DA9F57C27C3533F46A8D20B04137" |
|
79 "C1B1384BE4B2EB46"; |
|
80 const char *mp15 = |
|
81 "39849CF7FD65AF2E3C4D87FE5526221103D90BA26A6642FFE3C3ECC0887BBBC57E011BF1" |
|
82 "05D822A841653509C68F79EBE51C0099B8CBB04DEF31F36F5954208A3209AC122F0E11D8" |
|
83 "4AE67A494D78336A2066D394D42E27EF6B03DDAF6D69F5112C93E714D27C94F82FC7EF77" |
|
84 "445768C68EAE1C4A1407BE1B303243391D325090449764AE469CC53EC8012C4C02A72F37" |
|
85 "07ED7275D2CC8D0A14B5BCC6BF264941520EBA97E3E6BAE4EE8BC87EE0DDA1F5611A6ECB" |
|
86 "65F8AEF4F184E10CADBDFA5A2FEF828901D18C20785E5CC63473D638762DA80625003711" |
|
87 "9E984AC43E707915B133543AF9D5522C3E7180DC58E1E5381C1FB7DC6A5F4198F3E88FA6" |
|
88 "CBB6DFA8B2D1C763226B253E18BCCB79A29EE82D2DE735078C8AE3C3C86D476AAA08434C" |
|
89 "09C274BDD40A1D8FDE38D6536C22F44E807EB73DE4FB36C9F51E0BC835DDBE3A8EFCF2FE" |
|
90 "672B525769DC39230EE624D5EEDBD837C82A52E153F37378C3AD68A81A7ADBDF3345DBCE" |
|
91 "8FA18CA1DE618EF94DF72EAD928D4F45B9E51632ACF158CF8332C51891D1D12C2A7E6684" |
|
92 "360C4BF177C952579A9F442CFFEC8DAE4821A8E7A31C4861D8464CA9116C60866C5E72F7" |
|
93 "434ADBED36D54ACDFDFF70A4EFB46E285131FE725F1C637D1C62115EDAD01C4189716327" |
|
94 "BFAA79618B1656CBFA22C2C965687D0381CC2FE0245913C4D8D96108213680BD8E93E821" |
|
95 "822AD9DDBFE4BD04"; |
|
96 const char *mp16 = "4A724340668DB150339A70"; |
|
97 const char *mp17 = "8ADB90F58"; |
|
98 const char *mp18 = "C64C230AB20E5"; |
|
99 const char *mp19 = |
|
100 "F1C9DACDA287F2E3C88DCE2393B8F53DAAAC1196DC36510962B6B59454CFE64B"; |
|
101 const char *mp20 = |
|
102 "D445662C8B6FE394107B867797750C326E0F4A967E135FC430F6CD7207913AC7"; |
|
103 const char* mp21 = "2"; |
|
104 |
|
105 const mp_digit md1 = 0; |
|
106 const mp_digit md2 = 0x1; |
|
107 const mp_digit md3 = 0x80; |
|
108 const mp_digit md4 = 0x9C97; |
|
109 const mp_digit md5 = 0xF5BF; |
|
110 const mp_digit md6 = 0x14A0; |
|
111 const mp_digit md7 = 0x03E8; |
|
112 const mp_digit md8 = 0x0101; |
|
113 const mp_digit md9 = 0xA; |
|
114 |
|
115 /* |
|
116 Solutions of the form x_mpABC, where: |
|
117 |
|
118 x = (p)roduct, (s)um, (d)ifference, (q)uotient, (r)emainder, (g)cd, |
|
119 (i)nverse, (e)xponent, square roo(t), (g)cd, (l)cm. A |
|
120 leading 'm' indicates a modular operation, e.g. ms_mp12 is the |
|
121 modular sum of operands 1 and 2 |
|
122 |
|
123 ABC are the operand numbers involved in the computation. If a 'd' |
|
124 precedes the number, it is a digit operand; if a 'c' precedes it, |
|
125 it is a constant; otherwise, it is a full integer. |
|
126 */ |
|
127 |
|
128 const char *p_mp12 = "4286AD72E095C9FE009938750743174ADDD7FD1E53"; |
|
129 const char *p_mp34 = "-46BDBD66CA108C94A8CF46C325F7B6E2F2BA82D35" |
|
130 "A1BFD6934C441EE369B60CA29BADC26845E918B"; |
|
131 const char *p_mp57 = "E260C265A0A27C17AD5F4E59D6E0360217A2EBA6"; |
|
132 const char *p_mp22 = "7233B5C1097FFC77CCF55928FDC3A5D31B712FDE7A1E91"; |
|
133 const char *p_mp1d4 = "3CECEA2331F4220BEF68DED"; |
|
134 const char *p_mp8d6 = "6720"; |
|
135 const char *p_mp1113 = |
|
136 "11590FC3831C8C3C51813142C88E566408DB04F9E27642F6471A1822E0100B12F7F1" |
|
137 "5699A127C0FA9D26DCBFF458522661F30C6ADA4A07C8C90F9116893F6DBFBF24C3A2" |
|
138 "4340"; |
|
139 const char *p_mp1415 = |
|
140 "26B36540DE8B3586699CCEAE218A2842C7D5A01590E70C4A26E789107FBCDB06AA2C" |
|
141 "6DDC39E6FA18B16FCB2E934C9A5F844DAD60EE3B1EA82199EC5E9608F67F860FB965" |
|
142 "736055DF0E8F2540EB28D07F47E309B5F5D7C94FF190AB9C83A6970160CA700B1081" |
|
143 "F60518132AF28C6CEE6B7C473E461ABAC52C39CED50A08DD4E7EA8BA18DAD545126D" |
|
144 "A388F6983C29B6BE3F9DCBC15766E8E6D626A92C5296A9C4653CAE5788350C0E2107" |
|
145 "F57E5E8B6994C4847D727FF1A63A66A6CEF42B9C9E6BD04C92550B85D5527DE8A132" |
|
146 "E6BE89341A9285C7CE7FB929D871BBCBD0ED2863B6B078B0DBB30FCA66D6C64284D6" |
|
147 "57F394A0271E15B6EC7A9D530EBAC6CA262EF6F97E1A29FCE7749240E4AECA591ECF" |
|
148 "272122BC587370F9371B67BB696B3CDC1BC8C5B64B6280994EBA00CDEB8EB0F5D06E" |
|
149 "18F401D65FDCECF23DD7B9BB5B4C5458AEF2CCC09BA7F70EACB844750ACFD027521E" |
|
150 "2E047DE8388B35F8512D3DA46FF1A12D4260213602BF7BFFDB6059439B1BD0676449" |
|
151 "8D98C74F48FB3F548948D5BA0C8ECFCD054465132DC43466D6BBD59FBAF8D6D4E157" |
|
152 "2D612B40A956C7D3E140F3B8562EF18568B24D335707D5BAC7495014DF2444172426" |
|
153 "FD099DED560D30D1F945386604AFC85C64BD1E5F531F5C7840475FC0CF0F79810012" |
|
154 "4572BAF5A9910CDBD02B27FFCC3C7E5E88EF59F3AE152476E33EDA696A4F751E0AE4" |
|
155 "A3D2792DEA78E25B9110E12A19EFD09EA47FF9D6594DA445478BEB6901EAF8A35B2D" |
|
156 "FD59BEE9BF7AA8535B7D326EFA5AA2121B5EBE04DD85827A3D43BD04F4AA6D7B62A2" |
|
157 "B6D7A3077286A511A431E1EF75FCEBA3FAE9D5843A8ED17AA02BBB1B571F904699C5" |
|
158 "A6073F87DDD012E2322AB3F41F2A61F428636FE86914148E19B8EF8314ED83332F2F" |
|
159 "8C2ADE95071E792C0A68B903E060DD322A75FD0C2B992059FCCBB58AFA06B50D1634" |
|
160 "BBD93F187FCE0566609FCC2BABB269C66CEB097598AA17957BB4FDA3E64A1B30402E" |
|
161 "851CF9208E33D52E459A92C63FBB66435BB018E155E2C7F055E0B7AB82CD58FC4889" |
|
162 "372ED9EEAC2A07E8E654AB445B9298D2830D6D4DFD117B9C8ABE3968927DC24B3633" |
|
163 "BAD6E6466DB45DDAE87A0AB00336AC2CCCE176704F7214FCAB55743AB76C2B6CA231" |
|
164 "7984610B27B5786DE55C184DDF556EDFEA79A3652831940DAD941E243F482DC17E50" |
|
165 "284BC2FB1AD712A92542C573E55678878F02DFD9E3A863C7DF863227AEDE14B47AD3" |
|
166 "957190124820ADC19F5353878EDB6BF7D0C77352A6E3BDB53EEB88F5AEF6226D6E68" |
|
167 "756776A8FB49B77564147A641664C2A54F7E5B680CCC6A4D22D894E464DF20537094" |
|
168 "548F1732452F9E7F810C0B4B430C073C0FBCE03F0D03F82630654BCE166AA772E1EE" |
|
169 "DD0C08D3E3EBDF0AF54203B43AFDFC40D8FC79C97A4B0A4E1BEB14D8FCEFDDED8758" |
|
170 "6ED65B18"; |
|
171 const char *p_mp2121 = "4"; |
|
172 const char *mp_mp345 = "B9B6D3A3"; |
|
173 const char *mp_mp335 = "16609C2D"; |
|
174 |
|
175 const char *s_mp13 = "B55AA8DF8A7E83241F38B2B446B06A4FB84E5DE0"; |
|
176 const char *s_mp34 = "517EE6B92EF65C965736EB6BF7C325F73504CEB6"; |
|
177 const char *s_mp46 = "-63DBC2265B88268DC801C10EA68476B7BDE0090F"; |
|
178 const char *s_mp5d4 = "F59667D9"; |
|
179 const char *s_mp2d5 = "AAFC0A3FE45E5E09DBF21E8"; |
|
180 const char *s_mp1415 = |
|
181 "E5C43DE2B811F4A084625F96E9504039E5258D8348E698CEB9F4D4292622042DB446" |
|
182 "F75F4B65C1FB7A317257FA354BB5A45E789AEC254EAECE11F80A53E3B513822491DB" |
|
183 "D9399DEC4807A2A3A10360129AC93F4A42388D3BF20B310DD0E9E9F4BE07FC88D53A" |
|
184 "78A26091E0AB506A70813712CCBFBDD440A69A906E650EE090FDD6A42A95AC1A414D" |
|
185 "317F1A9F781E6A30E9EE142ECDA45A1E3454A1417A7B9A613DA90831CF88EA1F2E82" |
|
186 "41AE88CC4053220903C2E05BCDD42F02B8CF8868F84C64C5858BAD356143C5494607" |
|
187 "EE22E11650148BAF65A985F6FC4CA540A55697F2B5AA95D6B8CF96EF638416DE1DD6" |
|
188 "3BA9E2C09E22D03E75B60BE456C642F86B82A709253E5E087B507DE3A45F8392423F" |
|
189 "4DBC284E8DC88C43CA77BC8DCEFB6129A59025F80F90FF978116DEBB9209E306FBB9" |
|
190 "1B6111F8B8CFACB7C7C9BC12691C22EE88303E1713F1DFCEB622B8EA102F6365678B" |
|
191 "C580ED87225467AA78E875868BD53B17574BA59305BC1AC666E4B7E9ED72FCFC200E" |
|
192 "189D98FC8C5C7533739C53F52DDECDDFA5A8668BFBD40DABC9640F8FCAE58F532940" |
|
193 "8162261320A25589E9FB51B50F80056471F24B7E1AEC35D1356FC2747FFC13A04B34" |
|
194 "24FCECE10880BD9D97CA8CDEB2F5969BF4F30256EB5ED2BCD1DC64BDC2EE65217848" |
|
195 "48A37FB13F84ED4FB7ACA18C4639EE64309BDD3D552AEB4AAF44295943DC1229A497" |
|
196 "A84A"; |
|
197 |
|
198 const char *ms_mp345 = "1E71E292"; |
|
199 |
|
200 const char *d_mp12 = "-AAFBA6A55DD183FD854A60E"; |
|
201 const char *d_mp34 = "119366B05E606A9B1E73A6D8944CC1366B0C4E0D4"; |
|
202 const char *d_mp5d4 = "F5952EAB"; |
|
203 const char *d_mp6d2 = "-1"; |
|
204 const char *md_mp345 = "26596B86"; |
|
205 |
|
206 const char *q_mp42 = "-95825A1FFA1A155D5"; |
|
207 const char *r_mp42 = "-6312E99D7700A3DCB32ADF2"; |
|
208 const char *q_mp45a = "15344CDA3D841F661D2B61B6EDF7828CE36"; |
|
209 const char *r_mp45a = "-47C47B"; |
|
210 const char *q_mp7c2 = "75FD3890E6C1C67321CE62CEEDA65F79"; |
|
211 const char *q_mp3d6 = "8CAFD53C272BD6FE8B0847BDC3B539EFAB5C3"; |
|
212 const char *r_mp3d6 = "1E5"; |
|
213 const char *r_mp5d5 = "1257"; |
|
214 const char *r_mp47 = "B3A9018D970281A90FB729A181D95CB8"; |
|
215 const char *q_mp1404 = |
|
216 "-1B994D869142D3EF6123A3CBBC3C0114FA071CFCEEF4B7D231D65591D32501AD80F" |
|
217 "FF49AE4EC80514CC071EF6B42521C2508F4CB2FEAD69A2D2EF3934087DCAF88CC4C4" |
|
218 "659F1CA8A7F4D36817D802F778F1392337FE36302D6865BF0D4645625DF8BB044E19" |
|
219 "930635BE2609FAC8D99357D3A9F81F2578DE15A300964188292107DAC980E0A08CD7" |
|
220 "E938A2135FAD45D50CB1D8C2D4C4E60C27AB98B9FBD7E4DBF752C57D2674520E4BB2" |
|
221 "7E42324C0EFE84FB3E38CF6950E699E86FD45FE40D428400F2F94EDF7E94FAE10B45" |
|
222 "89329E1BF61E5A378C7B31C9C6A234F8254D4C24823B84D0BF8D671D8BC9154DFAC9" |
|
223 "49BD8ACABD6BD32DD4DC587F22C86153CB3954BDF7C2A890D623642492C482CF3E2C" |
|
224 "776FC019C3BBC61688B485E6FD35D6376089C1E33F880E84C4E51E8ABEACE1B3FB70" |
|
225 "3EAD0E28D2D44E7F1C0A859C840775E94F8C1369D985A3C5E8114B21D68B3CBB75D2" |
|
226 "791C586153C85B90CAA483E57A40E2D97950AAB84920A4396C950C87C7FFFE748358" |
|
227 "42A0BF65445B26D40F05BE164B822CA96321F41D85A289C5F5CD5F438A78704C9683" |
|
228 "422299D21899A22F853B0C93081CC9925E350132A0717A611DD932A68A0ACC6E4C7F" |
|
229 "7F685EF8C1F4910AEA5DC00BB5A36FCA07FFEAA490C547F6E14A08FE87041AB803E1" |
|
230 "BD9E23E4D367A2C35762F209073DFF48F3"; |
|
231 const char *r_mp1404 = "12FF98621ABF63144BFFC3207AC8FC10D8D1A09"; |
|
232 |
|
233 const char *q_mp13c = |
|
234 "34584F700C15A341E40BF7BFDD88A6630C8FF2B2067469372D391342" |
|
235 "BDAB6163963CD5A5C79F708BDE26E0CCF2DB66CD6D6089E29A877C45"; |
|
236 const char *r_mp13c = "F2B050D226E6DA88"; |
|
237 const char *q_mp9c16 = "F74A2876A1432698923B0767DA19DCF3D71795E"; |
|
238 const char *r_mp9c16 = "E"; |
|
239 |
|
240 const char *e_mp5d9 = "A8FD7145E727A20E52E73D22990D35D158090307A" |
|
241 "13A5215AAC4E9AB1E96BD34E531209E03310400"; |
|
242 const char *e_mp78 = "AA5F72C737DFFD8CCD108008BFE7C79ADC01A819B" |
|
243 "32B75FB82EC0FB8CA83311DA36D4063F1E57857A2" |
|
244 "1AB226563D84A15BB63CE975FF1453BD6750C58D9" |
|
245 "D113175764F5D0B3C89B262D4702F4D9640A3"; |
|
246 const char *me_mp817 = "E504493ACB02F7F802B327AB13BF25"; |
|
247 const char *me_mp5d47 = "1D45ED0D78F2778157992C951DD2734C"; |
|
248 const char *me_mp1512 = "FB5B2A28D902B9D9"; |
|
249 const char *me_mp161718 = "423C6AC6DBD74"; |
|
250 const char *me_mp5114 = |
|
251 "64F0F72807993578BBA3C7C36FFB184028F9EB9A810C92079E1498D8A80FC848E1F0" |
|
252 "25F1DE43B7F6AC063F5CC29D8A7C2D7A66269D72BF5CDC327AF88AF8EF9E601DCB0A" |
|
253 "3F35BFF3525FB1B61CE3A25182F17C0A0633B4089EA15BDC47664A43FEF639748AAC" |
|
254 "19CF58E83D8FA32CD10661D2D4210CC84792937E6F36CB601851356622E63ADD4BD5" |
|
255 "542412C2E0C4958E51FD2524AABDC7D60CFB5DB332EEC9DC84210F10FAE0BA2018F2" |
|
256 "14C9D6867C9D6E49CF28C18D06CE009FD4D04BFC8837C3FAAA773F5CCF6DED1C22DE" |
|
257 "181786AFE188540586F2D74BF312E595244E6936AE52E45742109BAA76C36F2692F5" |
|
258 "CEF97AD462B138BE92721194B163254CBAAEE9B9864B21CCDD5375BCAD0D24132724" |
|
259 "113D3374B4BCF9AA49BA5ACBC12288C0BCF46DCE6CB4A241A91BD559B130B6E9CD3D" |
|
260 "D7A2C8B280C2A278BA9BF5D93244D563015C9484B86D9FEB602501DC16EEBC3EFF19" |
|
261 "53D7999682BF1A1E3B2E7B21F4BDCA3C355039FEF55B9C0885F98DC355CA7A6D8ECF" |
|
262 "5F7F1A6E11A764F2343C823B879B44616B56BF6AE3FA2ACF5483660E618882018E3F" |
|
263 "C8459313BACFE1F93CECC37B2576A5C0B2714BD3EEDEEC22F0E7E3E77B11396B9B99" |
|
264 "D683F2447A4004BBD4A57F6A616CDDFEC595C4FC19884CC2FC21CF5BF5B0B81E0F83" |
|
265 "B9DDA0CF4DFF35BB8D31245912BF4497FD0BD95F0C604E26EA5A8EA4F5EAE870A5BD" |
|
266 "FE8C"; |
|
267 |
|
268 const char *e_mpc2d3 = "100000000000000000000000000000000"; |
|
269 |
|
270 const char *t_mp9 = "FB9B6E32FF0452A34746"; |
|
271 const char *i_mp27 = "B6AD8DCCDAF92B6FE57D062FFEE3A99"; |
|
272 const char *i_mp2019 = |
|
273 "BDF3D88DC373A63EED92903115B03FC8501910AF68297B4C41870AED3EA9F839"; |
|
274 /* "15E3FE09E8AE5523AABA197BD2D16318D3CA148EDF4AE1C1C52FC96AFAF5680B"; */ |
|
275 |
|
276 |
|
277 const char *t_mp15 = |
|
278 "795853094E59B0008093BCA8DECF68587C64BDCA2F3F7F8963DABC12F1CFFFA9B8C4" |
|
279 "365232FD4751870A0EF6CA619287C5D8B7F1747D95076AB19645EF309773E9EACEA0" |
|
280 "975FA4AE16251A8DA5865349C3A903E3B8A2C0DEA3C0720B6020C7FED69AFF62BB72" |
|
281 "10FAC443F9FFA2950776F949E819260C2AF8D94E8A1431A40F8C23C1973DE5D49AA2" |
|
282 "0B3FF5DA5C1D5324E712A78FF33A9B1748F83FA529905924A31DF38643B3F693EF9B" |
|
283 "58D846BB1AEAE4523ECC843FF551C1B300A130B65C1677402778F98C51C10813250E" |
|
284 "2496882877B069E877B59740DC1226F18A5C0F66F64A5F59A9FAFC5E9FC45AEC0E7A" |
|
285 "BEE244F7DD3AC268CF512A0E52E4F5BE5B94"; |
|
286 |
|
287 const char *g_mp71 = "1"; |
|
288 const char *g_mp25 = "7"; |
|
289 const char *l_mp1011 = "C589E3D7D64A6942A000"; |
|
290 |
|
291 /* mp9 in radices from 5 to 64 inclusive */ |
|
292 #define LOW_RADIX 5 |
|
293 #define HIGH_RADIX 64 |
|
294 const char *v_mp9[] = { |
|
295 "404041130042310320100141302000203430214122130002340212132414134210033", |
|
296 "44515230120451152500101352430105520150025145320010504454125502", |
|
297 "644641136612541136016610100564613624243140151310023515322", |
|
298 "173512120732412062323044435407317550316717172705712756", |
|
299 "265785018434285762514442046172754680368422060744852", |
|
300 "1411774500397290569709059837552310354075408897518", |
|
301 "184064268501499311A17746095910428222A241708032A", |
|
302 "47706011B225950B02BB45602AA039893118A85950892", |
|
303 "1A188C826B982353CB58422563AC602B783101671A86", |
|
304 "105957B358B89B018958908A9114BC3DDC410B77982", |
|
305 "CB7B3387E23452178846C55DD9D70C7CA9AEA78E8", |
|
306 "F74A2876A1432698923B0767DA19DCF3D71795EE", |
|
307 "17BF7C3673B76D7G7A5GA836277296F806E7453A", |
|
308 "2EBG8HH3HFA6185D6H0596AH96G24C966DD3HG2", |
|
309 "6G3HGBFEG8I3F25EAF61B904EIA40CFDH2124F", |
|
310 "10AHC3D29EBHDF3HD97905CG0JA8061855C3FI", |
|
311 "3BA5A55J5K699B2D09C38A4B237CH51IHA132", |
|
312 "EDEA90DJ0B5CB3FGG1C8587FEB99D3C143CA", |
|
313 "31M26JI1BBD56K3I028MML4EEDMAJK60LGLE", |
|
314 "GGG5M3142FKKG82EJ28111D70EMHC241E4E", |
|
315 "4446F4D5H10982023N297BF0DKBBHLLJB0I", |
|
316 "12E9DEEOBMKAKEP0IM284MIP7FO1O521M46", |
|
317 "85NN0HD48NN2FDDB1F5BMMKIB8CK20MDPK", |
|
318 "2D882A7A0O0JPCJ4APDRIB77IABAKDGJP2", |
|
319 "MFMCI0R7S27AAA3O3L2S8K44HKA7O02CN", |
|
320 "7IGQS73FFSHC50NNH44B6PTTNLC3M6H78", |
|
321 "2KLUB3U9850CSN6ANIDNIF1LB29MJ43LH", |
|
322 "UT52GTL18CJ9H4HR0TJTK6ESUFBHF5FE", |
|
323 "BTVL87QQBMUGF8PFWU4W3VU7U922QTMW", |
|
324 "4OG10HW0MSWJBIDEE2PDH24GA7RIHIAA", |
|
325 "1W8W9AX2DRUX48GXOLMK0PE42H0FEUWN", |
|
326 "SVWI84VBH069WR15W1U2VTK06USY8Z2", |
|
327 "CPTPNPDa5TYCPPNLALENT9IMX2GL0W2", |
|
328 "5QU21UJMRaUYYYYYN6GHSMPOYOXEEUY", |
|
329 "2O2Q7C6RPPB1SXJ9bR4035SPaQQ3H2W", |
|
330 "18d994IbT4PHbD7cGIPCRP00bbQO0bc", |
|
331 "NcDUEEWRO7XT76260WGeBHPVa72RdA", |
|
332 "BbX2WCF9VfSB5LPdJAdeXKV1fd6LC2", |
|
333 "60QDKW67P4JSQaTdQg7JE9ISafLaVU", |
|
334 "33ba9XbDbRdNF4BeDB2XYMhAVDaBdA", |
|
335 "1RIPZJA8gT5L5H7fTcaRhQ39geMMTc", |
|
336 "d65j70fBATjcDiidPYXUGcaBVVLME", |
|
337 "LKA9jhPabDG612TXWkhfT2gMXNIP2", |
|
338 "BgNaYhjfT0G8PBcYRP8khJCR3C9QE", |
|
339 "6Wk8RhJTAgDh10fYAiUVB1aM0HacG", |
|
340 "3dOCjaf78kd5EQNViUZWj3AfFL90I", |
|
341 "290VWkL3aiJoW4MBbHk0Z0bDo22Ni", |
|
342 "1DbDZ1hpPZNUDBUp6UigcJllEdC26", |
|
343 "dFSOLBUM7UZX8Vnc6qokGIOiFo1h", |
|
344 "NcoUYJOg0HVmKI9fR2ag0S8R2hrK", |
|
345 "EOpiJ5Te7oDe2pn8ZhAUKkhFHlZh", |
|
346 "8nXK8rp8neV8LWta1WDgd1QnlWsU", |
|
347 "5T3d6bcSBtHgrH9bCbu84tblaa7r", |
|
348 "3PlUDIYUvMqOVCir7AtquK5dWanq", |
|
349 "2A70gDPX2AtiicvIGGk9poiMtgvu", |
|
350 "1MjiRxjk10J6SVAxFguv9kZiUnIc", |
|
351 "rpre2vIDeb4h3sp50r1YBbtEx9L", |
|
352 "ZHcoip0AglDAfibrsUcJ9M1C8fm", |
|
353 "NHP18+eoe6uU54W49Kc6ZK7+bT2", |
|
354 "FTAA7QXGoQOaZi7PzePtFFN5vNk" |
|
355 }; |
|
356 |
|
357 const unsigned char b_mp4[] = { |
|
358 0x01, |
|
359 #if MP_DIGIT_MAX > MP_32BIT_MAX |
|
360 0x00, 0x00, 0x00, 0x00, |
|
361 #endif |
|
362 0x63, 0xDB, 0xC2, 0x26, |
|
363 0x5B, 0x88, 0x26, 0x8D, |
|
364 0xC8, 0x01, 0xC1, 0x0E, |
|
365 0xA6, 0x84, 0x76, 0xB7, |
|
366 0xBD, 0xE0, 0x09, 0x0F |
|
367 }; |
|
368 |
|
369 /* Search for a test suite name in the names table */ |
|
370 int find_name(char *name); |
|
371 void reason(char *fmt, ...); |
|
372 |
|
373 /*------------------------------------------------------------------------*/ |
|
374 /*------------------------------------------------------------------------*/ |
|
375 |
|
376 char g_intbuf[4096]; /* buffer for integer comparison */ |
|
377 char a_intbuf[4096]; /* buffer for integer comparison */ |
|
378 int g_verbose = 1; /* print out reasons for failure? */ |
|
379 int res; |
|
380 |
|
381 #define IFOK(x) { if (MP_OKAY > (res = (x))) { \ |
|
382 reason("test %s failed: error %d\n", #x, res); return 1; }} |
|
383 |
|
384 int main(int argc, char *argv[]) |
|
385 { |
|
386 int which, res; |
|
387 |
|
388 srand((unsigned int)time(NULL)); |
|
389 |
|
390 if (argc < 2) { |
|
391 fprintf(stderr, "Usage: %s <test-suite> | list\n" |
|
392 "Type '%s help' for assistance\n", argv[0], argv[0]); |
|
393 return 2; |
|
394 } else if(argc > 2) { |
|
395 if(strcmp(argv[2], "quiet") == 0) |
|
396 g_verbose = 0; |
|
397 } |
|
398 |
|
399 if(strcmp(argv[1], "help") == 0) { |
|
400 fprintf(stderr, "Help for mpi-test\n\n" |
|
401 "This program is a test driver for the MPI library, which\n" |
|
402 "tests all the various functions in the library to make sure\n" |
|
403 "they are working correctly. The syntax is:\n" |
|
404 " %s <suite-name>\n" |
|
405 "...where <suite-name> is the name of the test you wish to\n" |
|
406 "run. To get a list of the tests, use '%s list'.\n\n" |
|
407 "The program exits with a status of zero if the test passes,\n" |
|
408 "or non-zero if it fails. Ordinarily, failure is accompanied\n" |
|
409 "by a diagnostic message to standard error. To suppress this\n" |
|
410 "add the keyword 'quiet' after the suite-name on the command\n" |
|
411 "line.\n\n", argv[0], argv[0]); |
|
412 return 0; |
|
413 } |
|
414 |
|
415 if ((which = find_name(argv[1])) < 0) { |
|
416 fprintf(stderr, "%s: test suite '%s' is not known\n", argv[0], argv[1]); |
|
417 return 2; |
|
418 } |
|
419 |
|
420 if((res = (g_tests[which])()) < 0) { |
|
421 fprintf(stderr, "%s: test suite not implemented yet\n", argv[0]); |
|
422 return 2; |
|
423 } else { |
|
424 return res; |
|
425 } |
|
426 |
|
427 } |
|
428 |
|
429 /*------------------------------------------------------------------------*/ |
|
430 |
|
431 int find_name(char *name) |
|
432 { |
|
433 int ix = 0; |
|
434 |
|
435 while(ix < g_count) { |
|
436 if (strcmp(name, g_names[ix]) == 0) |
|
437 return ix; |
|
438 |
|
439 ++ix; |
|
440 } |
|
441 |
|
442 return -1; |
|
443 } |
|
444 |
|
445 /*------------------------------------------------------------------------*/ |
|
446 |
|
447 int test_list(void) |
|
448 { |
|
449 int ix; |
|
450 |
|
451 fprintf(stderr, "There are currently %d test suites available\n", |
|
452 g_count); |
|
453 |
|
454 for(ix = 1; ix < g_count; ix++) |
|
455 fprintf(stdout, "%-20s %s\n", g_names[ix], g_descs[ix]); |
|
456 |
|
457 return 0; |
|
458 } |
|
459 |
|
460 /*------------------------------------------------------------------------*/ |
|
461 |
|
462 int test_copy(void) |
|
463 { |
|
464 mp_int a, b; |
|
465 int ix; |
|
466 |
|
467 mp_init(&a); mp_init(&b); |
|
468 |
|
469 mp_read_radix(&a, mp3, 16); |
|
470 mp_copy(&a, &b); |
|
471 |
|
472 if(SIGN(&a) != SIGN(&b) || USED(&a) != USED(&b)) { |
|
473 if(SIGN(&a) != SIGN(&b)) { |
|
474 reason("error: sign of original is %d, sign of copy is %d\n", |
|
475 SIGN(&a), SIGN(&b)); |
|
476 } else { |
|
477 reason("error: original precision is %d, copy precision is %d\n", |
|
478 USED(&a), USED(&b)); |
|
479 } |
|
480 mp_clear(&a); mp_clear(&b); |
|
481 return 1; |
|
482 } |
|
483 |
|
484 for(ix = 0; ix < USED(&b); ix++) { |
|
485 if(DIGIT(&a, ix) != DIGIT(&b, ix)) { |
|
486 reason("error: digit %d " DIGIT_FMT " != " DIGIT_FMT "\n", |
|
487 ix, DIGIT(&a, ix), DIGIT(&b, ix)); |
|
488 mp_clear(&a); mp_clear(&b); |
|
489 return 1; |
|
490 } |
|
491 } |
|
492 |
|
493 mp_clear(&a); mp_clear(&b); |
|
494 return 0; |
|
495 } |
|
496 |
|
497 /*------------------------------------------------------------------------*/ |
|
498 |
|
499 int test_exch(void) |
|
500 { |
|
501 mp_int a, b; |
|
502 |
|
503 mp_init(&a); mp_init(&b); |
|
504 mp_read_radix(&a, mp7, 16); mp_read_radix(&b, mp1, 16); |
|
505 |
|
506 mp_exch(&a, &b); |
|
507 mp_toradix(&a, g_intbuf, 16); |
|
508 |
|
509 mp_clear(&a); |
|
510 if(strcmp(g_intbuf, mp1) != 0) { |
|
511 mp_clear(&b); |
|
512 reason("error: exchange failed\n"); |
|
513 return 1; |
|
514 } |
|
515 |
|
516 mp_toradix(&b, g_intbuf, 16); |
|
517 |
|
518 mp_clear(&b); |
|
519 if(strcmp(g_intbuf, mp7) != 0) { |
|
520 reason("error: exchange failed\n"); |
|
521 return 1; |
|
522 } |
|
523 |
|
524 return 0; |
|
525 } |
|
526 |
|
527 /*------------------------------------------------------------------------*/ |
|
528 |
|
529 int test_zero(void) |
|
530 { |
|
531 mp_int a; |
|
532 |
|
533 mp_init(&a); mp_read_radix(&a, mp7, 16); |
|
534 mp_zero(&a); |
|
535 |
|
536 if(USED(&a) != 1 || DIGIT(&a, 1) != 0) { |
|
537 mp_toradix(&a, g_intbuf, 16); |
|
538 reason("error: result is %s\n", g_intbuf); |
|
539 mp_clear(&a); |
|
540 return 1; |
|
541 } |
|
542 |
|
543 mp_clear(&a); |
|
544 return 0; |
|
545 } |
|
546 |
|
547 /*------------------------------------------------------------------------*/ |
|
548 |
|
549 int test_set(void) |
|
550 { |
|
551 mp_int a; |
|
552 |
|
553 /* Test single digit set */ |
|
554 mp_init(&a); mp_set(&a, 5); |
|
555 if(DIGIT(&a, 0) != 5) { |
|
556 mp_toradix(&a, g_intbuf, 16); |
|
557 reason("error: result is %s, expected 5\n", g_intbuf); |
|
558 mp_clear(&a); |
|
559 return 1; |
|
560 } |
|
561 |
|
562 /* Test integer set */ |
|
563 mp_set_int(&a, -4938110); |
|
564 mp_toradix(&a, g_intbuf, 16); |
|
565 mp_clear(&a); |
|
566 if(strcmp(g_intbuf, mp5a) != 0) { |
|
567 reason("error: result is %s, expected %s\n", g_intbuf, mp5a); |
|
568 return 1; |
|
569 } |
|
570 |
|
571 return 0; |
|
572 } |
|
573 |
|
574 /*------------------------------------------------------------------------*/ |
|
575 |
|
576 int test_abs(void) |
|
577 { |
|
578 mp_int a; |
|
579 |
|
580 mp_init(&a); mp_read_radix(&a, mp4, 16); |
|
581 mp_abs(&a, &a); |
|
582 |
|
583 if(SIGN(&a) != ZPOS) { |
|
584 reason("error: sign of result is negative\n"); |
|
585 mp_clear(&a); |
|
586 return 1; |
|
587 } |
|
588 |
|
589 mp_clear(&a); |
|
590 return 0; |
|
591 } |
|
592 |
|
593 /*------------------------------------------------------------------------*/ |
|
594 |
|
595 int test_neg(void) |
|
596 { |
|
597 mp_int a; |
|
598 mp_sign s; |
|
599 |
|
600 mp_init(&a); mp_read_radix(&a, mp4, 16); |
|
601 |
|
602 s = SIGN(&a); |
|
603 mp_neg(&a, &a); |
|
604 if(SIGN(&a) == s) { |
|
605 reason("error: sign of result is same as sign of nonzero input\n"); |
|
606 mp_clear(&a); |
|
607 return 1; |
|
608 } |
|
609 |
|
610 mp_clear(&a); |
|
611 return 0; |
|
612 } |
|
613 |
|
614 /*------------------------------------------------------------------------*/ |
|
615 |
|
616 int test_add_d(void) |
|
617 { |
|
618 mp_int a; |
|
619 |
|
620 mp_init(&a); |
|
621 |
|
622 mp_read_radix(&a, mp5, 16); |
|
623 mp_add_d(&a, md4, &a); |
|
624 mp_toradix(&a, g_intbuf, 16); |
|
625 |
|
626 if(strcmp(g_intbuf, s_mp5d4) != 0) { |
|
627 reason("error: computed %s, expected %s\n", g_intbuf, s_mp5d4); |
|
628 mp_clear(&a); |
|
629 return 1; |
|
630 } |
|
631 |
|
632 mp_read_radix(&a, mp2, 16); |
|
633 mp_add_d(&a, md5, &a); |
|
634 mp_toradix(&a, g_intbuf, 16); |
|
635 |
|
636 if(strcmp(g_intbuf, s_mp2d5) != 0) { |
|
637 reason("error: computed %s, expected %s\n", g_intbuf, s_mp2d5); |
|
638 mp_clear(&a); |
|
639 return 1; |
|
640 } |
|
641 |
|
642 mp_clear(&a); |
|
643 return 0; |
|
644 } |
|
645 |
|
646 /*------------------------------------------------------------------------*/ |
|
647 |
|
648 int test_add(void) |
|
649 { |
|
650 mp_int a, b; |
|
651 int res = 0; |
|
652 |
|
653 mp_init(&a); mp_init(&b); |
|
654 |
|
655 mp_read_radix(&a, mp1, 16); mp_read_radix(&b, mp3, 16); |
|
656 mp_add(&a, &b, &a); |
|
657 mp_toradix(&a, g_intbuf, 16); |
|
658 |
|
659 if(strcmp(g_intbuf, s_mp13) != 0) { |
|
660 reason("error: computed %s, expected %s\n", g_intbuf, s_mp13); |
|
661 res = 1; goto CLEANUP; |
|
662 } |
|
663 |
|
664 mp_read_radix(&a, mp4, 16); |
|
665 mp_add(&a, &b, &a); |
|
666 mp_toradix(&a, g_intbuf, 16); |
|
667 |
|
668 if(strcmp(g_intbuf, s_mp34) != 0) { |
|
669 reason("error: computed %s, expected %s\n", g_intbuf, s_mp34); |
|
670 res = 1; goto CLEANUP; |
|
671 } |
|
672 |
|
673 mp_read_radix(&a, mp4, 16); mp_read_radix(&b, mp6, 16); |
|
674 mp_add(&a, &b, &a); |
|
675 mp_toradix(&a, g_intbuf, 16); |
|
676 |
|
677 if(strcmp(g_intbuf, s_mp46) != 0) { |
|
678 reason("error: computed %s, expected %s\n", g_intbuf, s_mp46); |
|
679 res = 1; goto CLEANUP; |
|
680 } |
|
681 |
|
682 mp_read_radix(&a, mp14, 16); mp_read_radix(&b, mp15, 16); |
|
683 mp_add(&a, &b, &a); |
|
684 mp_toradix(&a, g_intbuf, 16); |
|
685 |
|
686 if(strcmp(g_intbuf, s_mp1415) != 0) { |
|
687 reason("error: computed %s, expected %s\n", g_intbuf, s_mp1415); |
|
688 res = 1; |
|
689 } |
|
690 |
|
691 CLEANUP: |
|
692 mp_clear(&a); mp_clear(&b); |
|
693 return res; |
|
694 } |
|
695 |
|
696 /*------------------------------------------------------------------------*/ |
|
697 |
|
698 int test_sub_d(void) |
|
699 { |
|
700 mp_int a; |
|
701 |
|
702 mp_init(&a); |
|
703 mp_read_radix(&a, mp5, 16); |
|
704 |
|
705 mp_sub_d(&a, md4, &a); |
|
706 mp_toradix(&a, g_intbuf, 16); |
|
707 |
|
708 if(strcmp(g_intbuf, d_mp5d4) != 0) { |
|
709 reason("error: computed %s, expected %s\n", g_intbuf, d_mp5d4); |
|
710 mp_clear(&a); |
|
711 return 1; |
|
712 } |
|
713 |
|
714 mp_read_radix(&a, mp6, 16); |
|
715 |
|
716 mp_sub_d(&a, md2, &a); |
|
717 mp_toradix(&a, g_intbuf, 16); |
|
718 |
|
719 mp_clear(&a); |
|
720 if(strcmp(g_intbuf, d_mp6d2) != 0) { |
|
721 reason("error: computed %s, expected %s\n", g_intbuf, d_mp6d2); |
|
722 return 1; |
|
723 } |
|
724 |
|
725 return 0; |
|
726 } |
|
727 |
|
728 /*------------------------------------------------------------------------*/ |
|
729 |
|
730 int test_sub(void) |
|
731 { |
|
732 mp_int a, b; |
|
733 |
|
734 mp_init(&a); mp_init(&b); |
|
735 |
|
736 mp_read_radix(&a, mp1, 16); mp_read_radix(&b, mp2, 16); |
|
737 mp_sub(&a, &b, &a); |
|
738 mp_toradix(&a, g_intbuf, 16); |
|
739 |
|
740 if(strcmp(g_intbuf, d_mp12) != 0) { |
|
741 reason("error: computed %s, expected %s\n", g_intbuf, d_mp12); |
|
742 mp_clear(&a); mp_clear(&b); |
|
743 return 1; |
|
744 } |
|
745 |
|
746 mp_read_radix(&a, mp3, 16); mp_read_radix(&b, mp4, 16); |
|
747 mp_sub(&a, &b, &a); |
|
748 mp_toradix(&a, g_intbuf, 16); |
|
749 |
|
750 if(strcmp(g_intbuf, d_mp34) != 0) { |
|
751 reason("error: computed %s, expected %s\n", g_intbuf, d_mp34); |
|
752 mp_clear(&a); mp_clear(&b); |
|
753 return 1; |
|
754 } |
|
755 |
|
756 mp_clear(&a); mp_clear(&b); |
|
757 return 0; |
|
758 } |
|
759 |
|
760 /*------------------------------------------------------------------------*/ |
|
761 |
|
762 int test_mul_d(void) |
|
763 { |
|
764 mp_int a; |
|
765 |
|
766 mp_init(&a); |
|
767 mp_read_radix(&a, mp1, 16); |
|
768 |
|
769 IFOK( mp_mul_d(&a, md4, &a) ); |
|
770 mp_toradix(&a, g_intbuf, 16); |
|
771 |
|
772 if(strcmp(g_intbuf, p_mp1d4) != 0) { |
|
773 reason("error: computed %s, expected %s\n", g_intbuf, p_mp1d4); |
|
774 mp_clear(&a); |
|
775 return 1; |
|
776 } |
|
777 |
|
778 mp_read_radix(&a, mp8, 16); |
|
779 IFOK( mp_mul_d(&a, md6, &a) ); |
|
780 mp_toradix(&a, g_intbuf, 16); |
|
781 |
|
782 mp_clear(&a); |
|
783 if(strcmp(g_intbuf, p_mp8d6) != 0) { |
|
784 reason("error: computed %s, expected %s\n", g_intbuf, p_mp8d6); |
|
785 return 1; |
|
786 } |
|
787 |
|
788 return 0; |
|
789 } |
|
790 |
|
791 /*------------------------------------------------------------------------*/ |
|
792 |
|
793 int test_mul(void) |
|
794 { |
|
795 mp_int a, b; |
|
796 int res = 0; |
|
797 |
|
798 mp_init(&a); mp_init(&b); |
|
799 mp_read_radix(&a, mp1, 16); mp_read_radix(&b, mp2, 16); |
|
800 |
|
801 IFOK( mp_mul(&a, &b, &a) ); |
|
802 mp_toradix(&a, g_intbuf, 16); |
|
803 |
|
804 if(strcmp(g_intbuf, p_mp12) != 0) { |
|
805 reason("error: computed %s, expected %s\n", g_intbuf, p_mp12); |
|
806 res = 1; goto CLEANUP; |
|
807 } |
|
808 |
|
809 mp_read_radix(&a, mp3, 16); mp_read_radix(&b, mp4, 16); |
|
810 IFOK( mp_mul(&a, &b, &a) ); |
|
811 mp_toradix(&a, g_intbuf, 16); |
|
812 |
|
813 if(strcmp(g_intbuf, p_mp34) !=0) { |
|
814 reason("error: computed %s, expected %s\n", g_intbuf, p_mp34); |
|
815 res = 1; goto CLEANUP; |
|
816 } |
|
817 |
|
818 mp_read_radix(&a, mp5, 16); mp_read_radix(&b, mp7, 16); |
|
819 IFOK( mp_mul(&a, &b, &a) ); |
|
820 mp_toradix(&a, g_intbuf, 16); |
|
821 |
|
822 if(strcmp(g_intbuf, p_mp57) != 0) { |
|
823 reason("error: computed %s, expected %s\n", g_intbuf, p_mp57); |
|
824 res = 1; goto CLEANUP; |
|
825 } |
|
826 |
|
827 mp_read_radix(&a, mp11, 16); mp_read_radix(&b, mp13, 16); |
|
828 IFOK( mp_mul(&a, &b, &a) ); |
|
829 mp_toradix(&a, g_intbuf, 16); |
|
830 |
|
831 if(strcmp(g_intbuf, p_mp1113) != 0) { |
|
832 reason("error: computed %s, expected %s\n", g_intbuf, p_mp1113); |
|
833 res = 1; goto CLEANUP; |
|
834 } |
|
835 |
|
836 mp_read_radix(&a, mp14, 16); mp_read_radix(&b, mp15, 16); |
|
837 IFOK( mp_mul(&a, &b, &a) ); |
|
838 mp_toradix(&a, g_intbuf, 16); |
|
839 |
|
840 if(strcmp(g_intbuf, p_mp1415) != 0) { |
|
841 reason("error: computed %s, expected %s\n", g_intbuf, p_mp1415); |
|
842 res = 1; |
|
843 } |
|
844 mp_read_radix(&a, mp21, 10); mp_read_radix(&b, mp21, 10); |
|
845 |
|
846 IFOK( mp_mul(&a, &b, &a) ); |
|
847 mp_toradix(&a, g_intbuf, 10); |
|
848 |
|
849 if(strcmp(g_intbuf, p_mp2121) != 0) { |
|
850 reason("error: computed %s, expected %s\n", g_intbuf, p_mp2121); |
|
851 res = 1; goto CLEANUP; |
|
852 } |
|
853 |
|
854 CLEANUP: |
|
855 mp_clear(&a); mp_clear(&b); |
|
856 return res; |
|
857 |
|
858 } |
|
859 |
|
860 /*------------------------------------------------------------------------*/ |
|
861 |
|
862 int test_sqr(void) |
|
863 { |
|
864 mp_int a; |
|
865 |
|
866 mp_init(&a); mp_read_radix(&a, mp2, 16); |
|
867 |
|
868 mp_sqr(&a, &a); |
|
869 mp_toradix(&a, g_intbuf, 16); |
|
870 |
|
871 mp_clear(&a); |
|
872 if(strcmp(g_intbuf, p_mp22) != 0) { |
|
873 reason("error: computed %s, expected %s\n", g_intbuf, p_mp22); |
|
874 return 1; |
|
875 } |
|
876 |
|
877 return 0; |
|
878 } |
|
879 |
|
880 /*------------------------------------------------------------------------*/ |
|
881 |
|
882 int test_div_d(void) |
|
883 { |
|
884 mp_int a, q; |
|
885 mp_digit r; |
|
886 int err = 0; |
|
887 |
|
888 mp_init(&a); mp_init(&q); |
|
889 mp_read_radix(&a, mp3, 16); |
|
890 |
|
891 IFOK( mp_div_d(&a, md6, &q, &r) ); |
|
892 mp_toradix(&q, g_intbuf, 16); |
|
893 |
|
894 if(strcmp(g_intbuf, q_mp3d6) != 0) { |
|
895 reason("error: computed q = %s, expected %s\n", g_intbuf, q_mp3d6); |
|
896 ++err; |
|
897 } |
|
898 |
|
899 sprintf(g_intbuf, ZS_DIGIT_FMT, r); |
|
900 |
|
901 if(strcmp(g_intbuf, r_mp3d6) != 0) { |
|
902 reason("error: computed r = %s, expected %s\n", g_intbuf, r_mp3d6); |
|
903 ++err; |
|
904 } |
|
905 |
|
906 mp_read_radix(&a, mp9, 16); |
|
907 IFOK( mp_div_d(&a, 16, &q, &r) ); |
|
908 mp_toradix(&q, g_intbuf, 16); |
|
909 |
|
910 if(strcmp(g_intbuf, q_mp9c16) != 0) { |
|
911 reason("error: computed q = %s, expected %s\n", g_intbuf, q_mp9c16); |
|
912 ++err; |
|
913 } |
|
914 |
|
915 sprintf(g_intbuf, ZS_DIGIT_FMT, r); |
|
916 |
|
917 if(strcmp(g_intbuf, r_mp9c16) != 0) { |
|
918 reason("error: computed r = %s, expected %s\n", g_intbuf, r_mp9c16); |
|
919 ++err; |
|
920 } |
|
921 |
|
922 mp_clear(&a); mp_clear(&q); |
|
923 return err; |
|
924 } |
|
925 |
|
926 /*------------------------------------------------------------------------*/ |
|
927 |
|
928 int test_div_2(void) |
|
929 { |
|
930 mp_int a; |
|
931 |
|
932 mp_init(&a); mp_read_radix(&a, mp7, 16); |
|
933 IFOK( mp_div_2(&a, &a) ); |
|
934 mp_toradix(&a, g_intbuf, 16); |
|
935 |
|
936 mp_clear(&a); |
|
937 if(strcmp(g_intbuf, q_mp7c2) != 0) { |
|
938 reason("error: computed %s, expected %s\n", g_intbuf, q_mp7c2); |
|
939 return 1; |
|
940 } |
|
941 |
|
942 return 0; |
|
943 } |
|
944 |
|
945 /*------------------------------------------------------------------------*/ |
|
946 |
|
947 int test_div_2d(void) |
|
948 { |
|
949 mp_int a, q, r; |
|
950 |
|
951 mp_init(&q); mp_init(&r); |
|
952 mp_init(&a); mp_read_radix(&a, mp13, 16); |
|
953 |
|
954 IFOK( mp_div_2d(&a, 64, &q, &r) ); |
|
955 mp_clear(&a); |
|
956 |
|
957 mp_toradix(&q, g_intbuf, 16); |
|
958 |
|
959 if(strcmp(g_intbuf, q_mp13c) != 0) { |
|
960 reason("error: computed %s, expected %s\n", g_intbuf, q_mp13c); |
|
961 mp_clear(&q); mp_clear(&r); |
|
962 return 1; |
|
963 } |
|
964 |
|
965 mp_clear(&q); |
|
966 |
|
967 mp_toradix(&r, g_intbuf, 16); |
|
968 if(strcmp(g_intbuf, r_mp13c) != 0) { |
|
969 reason("error, computed %s, expected %s\n", g_intbuf, r_mp13c); |
|
970 mp_clear(&r); |
|
971 return 1; |
|
972 } |
|
973 |
|
974 mp_clear(&r); |
|
975 |
|
976 return 0; |
|
977 } |
|
978 |
|
979 /*------------------------------------------------------------------------*/ |
|
980 |
|
981 int test_div(void) |
|
982 { |
|
983 mp_int a, b, r; |
|
984 int err = 0; |
|
985 |
|
986 mp_init(&a); mp_init(&b); mp_init(&r); |
|
987 |
|
988 mp_read_radix(&a, mp4, 16); mp_read_radix(&b, mp2, 16); |
|
989 IFOK( mp_div(&a, &b, &a, &r) ); |
|
990 mp_toradix(&a, g_intbuf, 16); |
|
991 |
|
992 if(strcmp(g_intbuf, q_mp42) != 0) { |
|
993 reason("error: test 1 computed quot %s, expected %s\n", g_intbuf, q_mp42); |
|
994 ++err; |
|
995 } |
|
996 |
|
997 mp_toradix(&r, g_intbuf, 16); |
|
998 |
|
999 if(strcmp(g_intbuf, r_mp42) != 0) { |
|
1000 reason("error: test 1 computed rem %s, expected %s\n", g_intbuf, r_mp42); |
|
1001 ++err; |
|
1002 } |
|
1003 |
|
1004 mp_read_radix(&a, mp4, 16); mp_read_radix(&b, mp5a, 16); |
|
1005 IFOK( mp_div(&a, &b, &a, &r) ); |
|
1006 mp_toradix(&a, g_intbuf, 16); |
|
1007 |
|
1008 if(strcmp(g_intbuf, q_mp45a) != 0) { |
|
1009 reason("error: test 2 computed quot %s, expected %s\n", g_intbuf, q_mp45a); |
|
1010 ++err; |
|
1011 } |
|
1012 |
|
1013 mp_toradix(&r, g_intbuf, 16); |
|
1014 |
|
1015 if(strcmp(g_intbuf, r_mp45a) != 0) { |
|
1016 reason("error: test 2 computed rem %s, expected %s\n", g_intbuf, r_mp45a); |
|
1017 ++err; |
|
1018 } |
|
1019 |
|
1020 mp_read_radix(&a, mp14, 16); mp_read_radix(&b, mp4, 16); |
|
1021 IFOK( mp_div(&a, &b, &a, &r) ); |
|
1022 mp_toradix(&a, g_intbuf, 16); |
|
1023 |
|
1024 if(strcmp(g_intbuf, q_mp1404) != 0) { |
|
1025 reason("error: test 3 computed quot %s, expected %s\n", g_intbuf, q_mp1404); |
|
1026 ++err; |
|
1027 } |
|
1028 |
|
1029 mp_toradix(&r, g_intbuf, 16); |
|
1030 |
|
1031 if(strcmp(g_intbuf, r_mp1404) != 0) { |
|
1032 reason("error: test 3 computed rem %s, expected %s\n", g_intbuf, r_mp1404); |
|
1033 ++err; |
|
1034 } |
|
1035 |
|
1036 mp_clear(&a); mp_clear(&b); mp_clear(&r); |
|
1037 |
|
1038 return err; |
|
1039 } |
|
1040 |
|
1041 /*------------------------------------------------------------------------*/ |
|
1042 |
|
1043 int test_expt_d(void) |
|
1044 { |
|
1045 mp_int a; |
|
1046 |
|
1047 mp_init(&a); mp_read_radix(&a, mp5, 16); |
|
1048 mp_expt_d(&a, md9, &a); |
|
1049 mp_toradix(&a, g_intbuf, 16); |
|
1050 |
|
1051 mp_clear(&a); |
|
1052 if(strcmp(g_intbuf, e_mp5d9) != 0) { |
|
1053 reason("error: computed %s, expected %s\n", g_intbuf, e_mp5d9); |
|
1054 return 1; |
|
1055 } |
|
1056 |
|
1057 return 0; |
|
1058 } |
|
1059 |
|
1060 /*------------------------------------------------------------------------*/ |
|
1061 |
|
1062 int test_expt(void) |
|
1063 { |
|
1064 mp_int a, b; |
|
1065 |
|
1066 mp_init(&a); mp_init(&b); |
|
1067 mp_read_radix(&a, mp7, 16); mp_read_radix(&b, mp8, 16); |
|
1068 |
|
1069 mp_expt(&a, &b, &a); |
|
1070 mp_toradix(&a, g_intbuf, 16); |
|
1071 mp_clear(&a); mp_clear(&b); |
|
1072 |
|
1073 if(strcmp(g_intbuf, e_mp78) != 0) { |
|
1074 reason("error: computed %s, expected %s\n", g_intbuf, e_mp78); |
|
1075 return 1; |
|
1076 } |
|
1077 |
|
1078 return 0; |
|
1079 } |
|
1080 |
|
1081 /*------------------------------------------------------------------------*/ |
|
1082 |
|
1083 int test_2expt(void) |
|
1084 { |
|
1085 mp_int a; |
|
1086 |
|
1087 mp_init(&a); |
|
1088 mp_2expt(&a, md3); |
|
1089 mp_toradix(&a, g_intbuf, 16); |
|
1090 mp_clear(&a); |
|
1091 |
|
1092 if(strcmp(g_intbuf, e_mpc2d3) != 0) { |
|
1093 reason("error: computed %s, expected %s\n", g_intbuf, e_mpc2d3); |
|
1094 return 1; |
|
1095 } |
|
1096 |
|
1097 return 0; |
|
1098 } |
|
1099 |
|
1100 /*------------------------------------------------------------------------*/ |
|
1101 |
|
1102 int test_sqrt(void) |
|
1103 { |
|
1104 mp_int a; |
|
1105 int res = 0; |
|
1106 |
|
1107 mp_init(&a); mp_read_radix(&a, mp9, 16); |
|
1108 mp_sqrt(&a, &a); |
|
1109 mp_toradix(&a, g_intbuf, 16); |
|
1110 |
|
1111 if(strcmp(g_intbuf, t_mp9) != 0) { |
|
1112 reason("error: computed %s, expected %s\n", g_intbuf, t_mp9); |
|
1113 res = 1; goto CLEANUP; |
|
1114 } |
|
1115 |
|
1116 mp_read_radix(&a, mp15, 16); |
|
1117 mp_sqrt(&a, &a); |
|
1118 mp_toradix(&a, g_intbuf, 16); |
|
1119 |
|
1120 if(strcmp(g_intbuf, t_mp15) != 0) { |
|
1121 reason("error: computed %s, expected %s\n", g_intbuf, t_mp15); |
|
1122 res = 1; |
|
1123 } |
|
1124 |
|
1125 CLEANUP: |
|
1126 mp_clear(&a); |
|
1127 return res; |
|
1128 } |
|
1129 |
|
1130 /*------------------------------------------------------------------------*/ |
|
1131 |
|
1132 int test_mod_d(void) |
|
1133 { |
|
1134 mp_int a; |
|
1135 mp_digit r; |
|
1136 |
|
1137 mp_init(&a); mp_read_radix(&a, mp5, 16); |
|
1138 IFOK( mp_mod_d(&a, md5, &r) ); |
|
1139 sprintf(g_intbuf, ZS_DIGIT_FMT, r); |
|
1140 mp_clear(&a); |
|
1141 |
|
1142 if(strcmp(g_intbuf, r_mp5d5) != 0) { |
|
1143 reason("error: computed %s, expected %s\n", g_intbuf, r_mp5d5); |
|
1144 return 1; |
|
1145 } |
|
1146 |
|
1147 return 0; |
|
1148 } |
|
1149 |
|
1150 /*------------------------------------------------------------------------*/ |
|
1151 |
|
1152 int test_mod(void) |
|
1153 { |
|
1154 mp_int a, m; |
|
1155 |
|
1156 mp_init(&a); mp_init(&m); |
|
1157 mp_read_radix(&a, mp4, 16); mp_read_radix(&m, mp7, 16); |
|
1158 IFOK( mp_mod(&a, &m, &a) ); |
|
1159 mp_toradix(&a, g_intbuf, 16); |
|
1160 mp_clear(&a); mp_clear(&m); |
|
1161 |
|
1162 if(strcmp(g_intbuf, r_mp47) != 0) { |
|
1163 reason("error: computed %s, expected %s\n", g_intbuf, r_mp47); |
|
1164 return 1; |
|
1165 } |
|
1166 |
|
1167 return 0; |
|
1168 } |
|
1169 |
|
1170 /*------------------------------------------------------------------------*/ |
|
1171 |
|
1172 int test_addmod(void) |
|
1173 { |
|
1174 mp_int a, b, m; |
|
1175 |
|
1176 mp_init(&a); mp_init(&b); mp_init(&m); |
|
1177 mp_read_radix(&a, mp3, 16); mp_read_radix(&b, mp4, 16); |
|
1178 mp_read_radix(&m, mp5, 16); |
|
1179 |
|
1180 IFOK( mp_addmod(&a, &b, &m, &a) ); |
|
1181 mp_toradix(&a, g_intbuf, 16); |
|
1182 mp_clear(&a); mp_clear(&b); mp_clear(&m); |
|
1183 |
|
1184 if(strcmp(g_intbuf, ms_mp345) != 0) { |
|
1185 reason("error: computed %s, expected %s\n", g_intbuf, ms_mp345); |
|
1186 return 1; |
|
1187 } |
|
1188 |
|
1189 return 0; |
|
1190 } |
|
1191 |
|
1192 /*------------------------------------------------------------------------*/ |
|
1193 |
|
1194 int test_submod(void) |
|
1195 { |
|
1196 mp_int a, b, m; |
|
1197 |
|
1198 mp_init(&a); mp_init(&b); mp_init(&m); |
|
1199 mp_read_radix(&a, mp3, 16); mp_read_radix(&b, mp4, 16); |
|
1200 mp_read_radix(&m, mp5, 16); |
|
1201 |
|
1202 IFOK( mp_submod(&a, &b, &m, &a) ); |
|
1203 mp_toradix(&a, g_intbuf, 16); |
|
1204 mp_clear(&a); mp_clear(&b); mp_clear(&m); |
|
1205 |
|
1206 if(strcmp(g_intbuf, md_mp345) != 0) { |
|
1207 reason("error: computed %s, expected %s\n", g_intbuf, md_mp345); |
|
1208 return 1; |
|
1209 } |
|
1210 |
|
1211 return 0; |
|
1212 } |
|
1213 |
|
1214 /*------------------------------------------------------------------------*/ |
|
1215 |
|
1216 int test_mulmod(void) |
|
1217 { |
|
1218 mp_int a, b, m; |
|
1219 |
|
1220 mp_init(&a); mp_init(&b); mp_init(&m); |
|
1221 mp_read_radix(&a, mp3, 16); mp_read_radix(&b, mp4, 16); |
|
1222 mp_read_radix(&m, mp5, 16); |
|
1223 |
|
1224 IFOK( mp_mulmod(&a, &b, &m, &a) ); |
|
1225 mp_toradix(&a, g_intbuf, 16); |
|
1226 mp_clear(&a); mp_clear(&b); mp_clear(&m); |
|
1227 |
|
1228 if(strcmp(g_intbuf, mp_mp345) != 0) { |
|
1229 reason("error: computed %s, expected %s\n", g_intbuf, mp_mp345); |
|
1230 return 1; |
|
1231 } |
|
1232 |
|
1233 return 0; |
|
1234 } |
|
1235 |
|
1236 /*------------------------------------------------------------------------*/ |
|
1237 |
|
1238 int test_sqrmod(void) |
|
1239 { |
|
1240 mp_int a, m; |
|
1241 |
|
1242 mp_init(&a); mp_init(&m); |
|
1243 mp_read_radix(&a, mp3, 16); mp_read_radix(&m, mp5, 16); |
|
1244 |
|
1245 IFOK( mp_sqrmod(&a, &m, &a) ); |
|
1246 mp_toradix(&a, g_intbuf, 16); |
|
1247 mp_clear(&a); mp_clear(&m); |
|
1248 |
|
1249 if(strcmp(g_intbuf, mp_mp335) != 0) { |
|
1250 reason("error: computed %s, expected %s\n", g_intbuf, mp_mp335); |
|
1251 return 1; |
|
1252 } |
|
1253 |
|
1254 return 0; |
|
1255 } |
|
1256 |
|
1257 /*------------------------------------------------------------------------*/ |
|
1258 |
|
1259 int test_exptmod(void) |
|
1260 { |
|
1261 mp_int a, b, m; |
|
1262 int res = 0; |
|
1263 |
|
1264 mp_init(&a); mp_init(&b); mp_init(&m); |
|
1265 mp_read_radix(&a, mp8, 16); mp_read_radix(&b, mp1, 16); |
|
1266 mp_read_radix(&m, mp7, 16); |
|
1267 |
|
1268 IFOK( mp_exptmod(&a, &b, &m, &a) ); |
|
1269 mp_toradix(&a, g_intbuf, 16); |
|
1270 |
|
1271 if(strcmp(g_intbuf, me_mp817) != 0) { |
|
1272 reason("case 1: error: computed %s, expected %s\n", g_intbuf, me_mp817); |
|
1273 res = 1; goto CLEANUP; |
|
1274 } |
|
1275 |
|
1276 mp_read_radix(&a, mp1, 16); mp_read_radix(&b, mp5, 16); |
|
1277 mp_read_radix(&m, mp12, 16); |
|
1278 |
|
1279 IFOK( mp_exptmod(&a, &b, &m, &a) ); |
|
1280 mp_toradix(&a, g_intbuf, 16); |
|
1281 |
|
1282 if(strcmp(g_intbuf, me_mp1512) != 0) { |
|
1283 reason("case 2: error: computed %s, expected %s\n", g_intbuf, me_mp1512); |
|
1284 res = 1; goto CLEANUP; |
|
1285 } |
|
1286 |
|
1287 mp_read_radix(&a, mp5, 16); mp_read_radix(&b, mp1, 16); |
|
1288 mp_read_radix(&m, mp14, 16); |
|
1289 |
|
1290 IFOK( mp_exptmod(&a, &b, &m, &a) ); |
|
1291 mp_toradix(&a, g_intbuf, 16); |
|
1292 |
|
1293 if(strcmp(g_intbuf, me_mp5114) != 0) { |
|
1294 reason("case 3: error: computed %s, expected %s\n", g_intbuf, me_mp5114); |
|
1295 res = 1; |
|
1296 } |
|
1297 |
|
1298 mp_read_radix(&a, mp16, 16); mp_read_radix(&b, mp17, 16); |
|
1299 mp_read_radix(&m, mp18, 16); |
|
1300 |
|
1301 IFOK( mp_exptmod(&a, &b, &m, &a) ); |
|
1302 mp_toradix(&a, g_intbuf, 16); |
|
1303 |
|
1304 if(strcmp(g_intbuf, me_mp161718) != 0) { |
|
1305 reason("case 4: error: computed %s, expected %s\n", g_intbuf, me_mp161718); |
|
1306 res = 1; |
|
1307 } |
|
1308 |
|
1309 CLEANUP: |
|
1310 mp_clear(&a); mp_clear(&b); mp_clear(&m); |
|
1311 return res; |
|
1312 } |
|
1313 |
|
1314 /*------------------------------------------------------------------------*/ |
|
1315 |
|
1316 int test_exptmod_d(void) |
|
1317 { |
|
1318 mp_int a, m; |
|
1319 |
|
1320 mp_init(&a); mp_init(&m); |
|
1321 mp_read_radix(&a, mp5, 16); mp_read_radix(&m, mp7, 16); |
|
1322 |
|
1323 IFOK( mp_exptmod_d(&a, md4, &m, &a) ); |
|
1324 mp_toradix(&a, g_intbuf, 16); |
|
1325 mp_clear(&a); mp_clear(&m); |
|
1326 |
|
1327 if(strcmp(g_intbuf, me_mp5d47) != 0) { |
|
1328 reason("error: computed %s, expected %s\n", g_intbuf, me_mp5d47); |
|
1329 return 1; |
|
1330 } |
|
1331 |
|
1332 return 0; |
|
1333 } |
|
1334 |
|
1335 /*------------------------------------------------------------------------*/ |
|
1336 |
|
1337 int test_invmod(void) |
|
1338 { |
|
1339 mp_int a, m, c; |
|
1340 mp_int p1, p2, p3, p4, p5; |
|
1341 mp_int t1, t2, t3, t4; |
|
1342 mp_err res; |
|
1343 |
|
1344 /* 5 128-bit primes. */ |
|
1345 static const char ivp1[] = { "AAD8A5A2A2BEF644BAEE7DB0CA643719" }; |
|
1346 static const char ivp2[] = { "CB371AD2B79A90BCC88D0430663E40B9" }; |
|
1347 static const char ivp3[] = { "C6C818D4DF2618406CA09280C0400099" }; |
|
1348 static const char ivp4[] = { "CE949C04512E68918006B1F0D7E93F27" }; |
|
1349 static const char ivp5[] = { "F8EE999B6416645040687440E0B89F51" }; |
|
1350 |
|
1351 mp_init(&a); mp_init(&m); |
|
1352 mp_read_radix(&a, mp2, 16); mp_read_radix(&m, mp7, 16); |
|
1353 |
|
1354 IFOK( mp_invmod(&a, &m, &a) ); |
|
1355 |
|
1356 mp_toradix(&a, g_intbuf, 16); |
|
1357 mp_clear(&a); mp_clear(&m); |
|
1358 |
|
1359 if(strcmp(g_intbuf, i_mp27) != 0) { |
|
1360 reason("error: invmod test 1 computed %s, expected %s\n", g_intbuf, i_mp27); |
|
1361 return 1; |
|
1362 } |
|
1363 |
|
1364 mp_init(&a); mp_init(&m); |
|
1365 mp_read_radix(&a, mp20, 16); mp_read_radix(&m, mp19, 16); |
|
1366 |
|
1367 IFOK( mp_invmod(&a, &m, &a) ); |
|
1368 |
|
1369 mp_toradix(&a, g_intbuf, 16); |
|
1370 mp_clear(&a); mp_clear(&m); |
|
1371 |
|
1372 if(strcmp(g_intbuf, i_mp2019) != 0) { |
|
1373 reason("error: invmod test 2 computed %s, expected %s\n", g_intbuf, i_mp2019); |
|
1374 return 1; |
|
1375 } |
|
1376 |
|
1377 /* Need the following test cases: |
|
1378 Odd modulus |
|
1379 - a is odd, relatively prime to m |
|
1380 - a is odd, not relatively prime to m |
|
1381 - a is even, relatively prime to m |
|
1382 - a is even, not relatively prime to m |
|
1383 Even modulus |
|
1384 - a is even (should fail) |
|
1385 - a is odd, not relatively prime to m |
|
1386 - a is odd, relatively prime to m, |
|
1387 m is not a power of 2 |
|
1388 - m has factor 2**k, k < 32 |
|
1389 - m has factor 2**k, k > 32 |
|
1390 m is a power of 2, 2**k |
|
1391 - k < 32 |
|
1392 - k > 32 |
|
1393 */ |
|
1394 |
|
1395 mp_init(&a); mp_init(&m); mp_init(&c); |
|
1396 mp_init(&p1); mp_init(&p2); mp_init(&p3); mp_init(&p4); mp_init(&p5); |
|
1397 mp_init(&t1); mp_init(&t2); mp_init(&t3); mp_init(&t4); |
|
1398 |
|
1399 mp_read_radix(&p1, ivp1, 16); |
|
1400 mp_read_radix(&p2, ivp2, 16); |
|
1401 mp_read_radix(&p3, ivp3, 16); |
|
1402 mp_read_radix(&p4, ivp4, 16); |
|
1403 mp_read_radix(&p5, ivp5, 16); |
|
1404 |
|
1405 IFOK( mp_2expt(&t2, 68) ); /* t2 = 2**68 */ |
|
1406 IFOK( mp_2expt(&t3, 128) ); /* t3 = 2**128 */ |
|
1407 IFOK( mp_2expt(&t4, 31) ); /* t4 = 2**31 */ |
|
1408 |
|
1409 /* test 3: Odd modulus - a is odd, relatively prime to m */ |
|
1410 |
|
1411 IFOK( mp_mul(&p1, &p2, &a) ); |
|
1412 IFOK( mp_mul(&p3, &p4, &m) ); |
|
1413 IFOK( mp_invmod(&a, &m, &t1) ); |
|
1414 IFOK( mp_invmod_xgcd(&a, &m, &c) ); |
|
1415 |
|
1416 if (mp_cmp(&t1, &c) != 0) { |
|
1417 mp_toradix(&t1, g_intbuf, 16); |
|
1418 mp_toradix(&c, a_intbuf, 16); |
|
1419 reason("error: invmod test 3 computed %s, expected %s\n", |
|
1420 g_intbuf, a_intbuf); |
|
1421 return 1; |
|
1422 } |
|
1423 mp_clear(&a); mp_clear(&t1); mp_clear(&c); |
|
1424 mp_init(&a); mp_init(&t1); mp_init(&c); |
|
1425 |
|
1426 /* test 4: Odd modulus - a is odd, NOT relatively prime to m */ |
|
1427 |
|
1428 IFOK( mp_mul(&p1, &p3, &a) ); |
|
1429 /* reuse same m as before */ |
|
1430 |
|
1431 res = mp_invmod_xgcd(&a, &m, &c); |
|
1432 if (res != MP_UNDEF) |
|
1433 goto CLEANUP4; |
|
1434 |
|
1435 res = mp_invmod(&a, &m, &t1); /* we expect this to fail. */ |
|
1436 if (res != MP_UNDEF) { |
|
1437 CLEANUP4: |
|
1438 reason("error: invmod test 4 succeeded, should have failed.\n"); |
|
1439 return 1; |
|
1440 } |
|
1441 mp_clear(&a); mp_clear(&t1); mp_clear(&c); |
|
1442 mp_init(&a); mp_init(&t1); mp_init(&c); |
|
1443 |
|
1444 /* test 5: Odd modulus - a is even, relatively prime to m */ |
|
1445 |
|
1446 IFOK( mp_mul(&p1, &t2, &a) ); |
|
1447 /* reuse m */ |
|
1448 IFOK( mp_invmod(&a, &m, &t1) ); |
|
1449 IFOK( mp_invmod_xgcd(&a, &m, &c) ); |
|
1450 |
|
1451 if (mp_cmp(&t1, &c) != 0) { |
|
1452 mp_toradix(&t1, g_intbuf, 16); |
|
1453 mp_toradix(&c, a_intbuf, 16); |
|
1454 reason("error: invmod test 5 computed %s, expected %s\n", |
|
1455 g_intbuf, a_intbuf); |
|
1456 return 1; |
|
1457 } |
|
1458 mp_clear(&a); mp_clear(&t1); mp_clear(&c); |
|
1459 mp_init(&a); mp_init(&t1); mp_init(&c); |
|
1460 |
|
1461 /* test 6: Odd modulus - a is odd, NOT relatively prime to m */ |
|
1462 |
|
1463 /* reuse t2 */ |
|
1464 IFOK( mp_mul(&t2, &p3, &a) ); |
|
1465 /* reuse same m as before */ |
|
1466 |
|
1467 res = mp_invmod_xgcd(&a, &m, &c); |
|
1468 if (res != MP_UNDEF) |
|
1469 goto CLEANUP6; |
|
1470 |
|
1471 res = mp_invmod(&a, &m, &t1); /* we expect this to fail. */ |
|
1472 if (res != MP_UNDEF) { |
|
1473 CLEANUP6: |
|
1474 reason("error: invmod test 6 succeeded, should have failed.\n"); |
|
1475 return 1; |
|
1476 } |
|
1477 mp_clear(&a); mp_clear(&m); mp_clear(&c); mp_clear(&t1); |
|
1478 mp_init(&a); mp_init(&m); mp_init(&c); mp_init(&t1); |
|
1479 |
|
1480 /* test 7: Even modulus, even a, should fail */ |
|
1481 |
|
1482 IFOK( mp_mul(&p3, &t3, &m) ); /* even m */ |
|
1483 /* reuse t2 */ |
|
1484 IFOK( mp_mul(&p1, &t2, &a) ); /* even a */ |
|
1485 |
|
1486 res = mp_invmod_xgcd(&a, &m, &c); |
|
1487 if (res != MP_UNDEF) |
|
1488 goto CLEANUP7; |
|
1489 |
|
1490 res = mp_invmod(&a, &m, &t1); /* we expect this to fail. */ |
|
1491 if (res != MP_UNDEF) { |
|
1492 CLEANUP7: |
|
1493 reason("error: invmod test 7 succeeded, should have failed.\n"); |
|
1494 return 1; |
|
1495 } |
|
1496 mp_clear(&a); mp_clear(&c); mp_clear(&t1); |
|
1497 mp_init(&a); mp_init(&c); mp_init(&t1); |
|
1498 |
|
1499 /* test 8: Even modulus - a is odd, not relatively prime to m */ |
|
1500 |
|
1501 /* reuse m */ |
|
1502 IFOK( mp_mul(&p3, &p1, &a) ); /* even a */ |
|
1503 |
|
1504 res = mp_invmod_xgcd(&a, &m, &c); |
|
1505 if (res != MP_UNDEF) |
|
1506 goto CLEANUP8; |
|
1507 |
|
1508 res = mp_invmod(&a, &m, &t1); /* we expect this to fail. */ |
|
1509 if (res != MP_UNDEF) { |
|
1510 CLEANUP8: |
|
1511 reason("error: invmod test 8 succeeded, should have failed.\n"); |
|
1512 return 1; |
|
1513 } |
|
1514 mp_clear(&a); mp_clear(&m); mp_clear(&c); mp_clear(&t1); |
|
1515 mp_init(&a); mp_init(&m); mp_init(&c); mp_init(&t1); |
|
1516 |
|
1517 /* test 9: Even modulus - m has factor 2**k, k < 32 |
|
1518 * - a is odd, relatively prime to m, |
|
1519 */ |
|
1520 IFOK( mp_mul(&p3, &t4, &m) ); /* even m */ |
|
1521 IFOK( mp_mul(&p1, &p2, &a) ); |
|
1522 IFOK( mp_invmod(&a, &m, &t1) ); |
|
1523 IFOK( mp_invmod_xgcd(&a, &m, &c) ); |
|
1524 |
|
1525 if (mp_cmp(&t1, &c) != 0) { |
|
1526 mp_toradix(&t1, g_intbuf, 16); |
|
1527 mp_toradix(&c, a_intbuf, 16); |
|
1528 reason("error: invmod test 9 computed %s, expected %s\n", |
|
1529 g_intbuf, a_intbuf); |
|
1530 return 1; |
|
1531 } |
|
1532 mp_clear(&m); mp_clear(&t1); mp_clear(&c); |
|
1533 mp_init(&m); mp_init(&t1); mp_init(&c); |
|
1534 |
|
1535 /* test 10: Even modulus - m has factor 2**k, k > 32 |
|
1536 * - a is odd, relatively prime to m, |
|
1537 */ |
|
1538 IFOK( mp_mul(&p3, &t3, &m) ); /* even m */ |
|
1539 /* reuse a */ |
|
1540 IFOK( mp_invmod(&a, &m, &t1) ); |
|
1541 IFOK( mp_invmod_xgcd(&a, &m, &c) ); |
|
1542 |
|
1543 if (mp_cmp(&t1, &c) != 0) { |
|
1544 mp_toradix(&t1, g_intbuf, 16); |
|
1545 mp_toradix(&c, a_intbuf, 16); |
|
1546 reason("error: invmod test 10 computed %s, expected %s\n", |
|
1547 g_intbuf, a_intbuf); |
|
1548 return 1; |
|
1549 } |
|
1550 mp_clear(&t1); mp_clear(&c); |
|
1551 mp_init(&t1); mp_init(&c); |
|
1552 |
|
1553 /* test 11: Even modulus - m is a power of 2, 2**k | k < 32 |
|
1554 * - a is odd, relatively prime to m, |
|
1555 */ |
|
1556 IFOK( mp_invmod(&a, &t4, &t1) ); |
|
1557 IFOK( mp_invmod_xgcd(&a, &t4, &c) ); |
|
1558 |
|
1559 if (mp_cmp(&t1, &c) != 0) { |
|
1560 mp_toradix(&t1, g_intbuf, 16); |
|
1561 mp_toradix(&c, a_intbuf, 16); |
|
1562 reason("error: invmod test 11 computed %s, expected %s\n", |
|
1563 g_intbuf, a_intbuf); |
|
1564 return 1; |
|
1565 } |
|
1566 mp_clear(&t1); mp_clear(&c); |
|
1567 mp_init(&t1); mp_init(&c); |
|
1568 |
|
1569 /* test 12: Even modulus - m is a power of 2, 2**k | k > 32 |
|
1570 * - a is odd, relatively prime to m, |
|
1571 */ |
|
1572 IFOK( mp_invmod(&a, &t3, &t1) ); |
|
1573 IFOK( mp_invmod_xgcd(&a, &t3, &c) ); |
|
1574 |
|
1575 if (mp_cmp(&t1, &c) != 0) { |
|
1576 mp_toradix(&t1, g_intbuf, 16); |
|
1577 mp_toradix(&c, a_intbuf, 16); |
|
1578 reason("error: invmod test 12 computed %s, expected %s\n", |
|
1579 g_intbuf, a_intbuf); |
|
1580 return 1; |
|
1581 } |
|
1582 |
|
1583 mp_clear(&a); mp_clear(&m); mp_clear(&c); |
|
1584 mp_clear(&t1); mp_clear(&t2); mp_clear(&t3); mp_clear(&t4); |
|
1585 mp_clear(&p1); mp_clear(&p2); mp_clear(&p3); mp_clear(&p4); mp_clear(&p5); |
|
1586 |
|
1587 return 0; |
|
1588 } |
|
1589 |
|
1590 /*------------------------------------------------------------------------*/ |
|
1591 |
|
1592 int test_cmp_d(void) |
|
1593 { |
|
1594 mp_int a; |
|
1595 |
|
1596 mp_init(&a); mp_read_radix(&a, mp8, 16); |
|
1597 |
|
1598 if(mp_cmp_d(&a, md8) >= 0) { |
|
1599 reason("error: %s >= " DIGIT_FMT "\n", mp8, md8); |
|
1600 mp_clear(&a); |
|
1601 return 1; |
|
1602 } |
|
1603 |
|
1604 mp_read_radix(&a, mp5, 16); |
|
1605 |
|
1606 if(mp_cmp_d(&a, md8) <= 0) { |
|
1607 reason("error: %s <= " DIGIT_FMT "\n", mp5, md8); |
|
1608 mp_clear(&a); |
|
1609 return 1; |
|
1610 } |
|
1611 |
|
1612 mp_read_radix(&a, mp6, 16); |
|
1613 |
|
1614 if(mp_cmp_d(&a, md1) != 0) { |
|
1615 reason("error: %s != " DIGIT_FMT "\n", mp6, md1); |
|
1616 mp_clear(&a); |
|
1617 return 1; |
|
1618 } |
|
1619 |
|
1620 mp_clear(&a); |
|
1621 return 0; |
|
1622 |
|
1623 } |
|
1624 |
|
1625 /*------------------------------------------------------------------------*/ |
|
1626 |
|
1627 int test_cmp_z(void) |
|
1628 { |
|
1629 mp_int a; |
|
1630 |
|
1631 mp_init(&a); mp_read_radix(&a, mp6, 16); |
|
1632 |
|
1633 if(mp_cmp_z(&a) != 0) { |
|
1634 reason("error: someone thinks a zero value is non-zero\n"); |
|
1635 mp_clear(&a); |
|
1636 return 1; |
|
1637 } |
|
1638 |
|
1639 mp_read_radix(&a, mp1, 16); |
|
1640 |
|
1641 if(mp_cmp_z(&a) <= 0) { |
|
1642 reason("error: someone thinks a positive value is non-positive\n"); |
|
1643 mp_clear(&a); |
|
1644 return 1; |
|
1645 } |
|
1646 |
|
1647 mp_read_radix(&a, mp4, 16); |
|
1648 |
|
1649 if(mp_cmp_z(&a) >= 0) { |
|
1650 reason("error: someone thinks a negative value is non-negative\n"); |
|
1651 mp_clear(&a); |
|
1652 return 1; |
|
1653 } |
|
1654 |
|
1655 mp_clear(&a); |
|
1656 return 0; |
|
1657 } |
|
1658 |
|
1659 /*------------------------------------------------------------------------*/ |
|
1660 |
|
1661 int test_cmp(void) |
|
1662 { |
|
1663 mp_int a, b; |
|
1664 |
|
1665 mp_init(&a); mp_init(&b); |
|
1666 mp_read_radix(&a, mp3, 16); mp_read_radix(&b, mp4, 16); |
|
1667 |
|
1668 if(mp_cmp(&a, &b) <= 0) { |
|
1669 reason("error: %s <= %s\n", mp3, mp4); |
|
1670 mp_clear(&a); mp_clear(&b); |
|
1671 return 1; |
|
1672 } |
|
1673 |
|
1674 mp_read_radix(&b, mp3, 16); |
|
1675 if(mp_cmp(&a, &b) != 0) { |
|
1676 reason("error: %s != %s\n", mp3, mp3); |
|
1677 mp_clear(&a); mp_clear(&b); |
|
1678 return 1; |
|
1679 } |
|
1680 |
|
1681 mp_read_radix(&a, mp5, 16); |
|
1682 if(mp_cmp(&a, &b) >= 0) { |
|
1683 reason("error: %s >= %s\n", mp5, mp3); |
|
1684 mp_clear(&a); mp_clear(&b); |
|
1685 return 1; |
|
1686 } |
|
1687 |
|
1688 mp_read_radix(&a, mp5a, 16); |
|
1689 if(mp_cmp_int(&a, 1000000) >= 0 || |
|
1690 (mp_cmp_int(&a, -5000000) <= 0) || |
|
1691 (mp_cmp_int(&a, -4938110) != 0)) { |
|
1692 reason("error: long integer comparison failed (%s)", mp5a); |
|
1693 mp_clear(&a); mp_clear(&b); |
|
1694 return 1; |
|
1695 } |
|
1696 |
|
1697 mp_clear(&a); mp_clear(&b); |
|
1698 return 0; |
|
1699 } |
|
1700 |
|
1701 /*------------------------------------------------------------------------*/ |
|
1702 |
|
1703 int test_cmp_mag(void) |
|
1704 { |
|
1705 mp_int a, b; |
|
1706 |
|
1707 mp_init(&a); mp_init(&b); |
|
1708 mp_read_radix(&a, mp5, 16); mp_read_radix(&b, mp4, 16); |
|
1709 |
|
1710 if(mp_cmp_mag(&a, &b) >= 0) { |
|
1711 reason("error: %s >= %s\n", mp5, mp4); |
|
1712 mp_clear(&a); mp_clear(&b); |
|
1713 return 1; |
|
1714 } |
|
1715 |
|
1716 mp_read_radix(&b, mp5, 16); |
|
1717 if(mp_cmp_mag(&a, &b) != 0) { |
|
1718 reason("error: %s != %s\n", mp5, mp5); |
|
1719 mp_clear(&a); mp_clear(&b); |
|
1720 return 1; |
|
1721 } |
|
1722 |
|
1723 mp_read_radix(&a, mp1, 16); |
|
1724 if(mp_cmp_mag(&b, &a) >= 0) { |
|
1725 reason("error: %s >= %s\n", mp5, mp1); |
|
1726 mp_clear(&a); mp_clear(&b); |
|
1727 return 1; |
|
1728 } |
|
1729 |
|
1730 mp_clear(&a); mp_clear(&b); |
|
1731 return 0; |
|
1732 |
|
1733 } |
|
1734 |
|
1735 /*------------------------------------------------------------------------*/ |
|
1736 |
|
1737 int test_parity(void) |
|
1738 { |
|
1739 mp_int a; |
|
1740 |
|
1741 mp_init(&a); mp_read_radix(&a, mp1, 16); |
|
1742 |
|
1743 if(!mp_isodd(&a)) { |
|
1744 reason("error: expected operand to be odd, but it isn't\n"); |
|
1745 mp_clear(&a); |
|
1746 return 1; |
|
1747 } |
|
1748 |
|
1749 mp_read_radix(&a, mp6, 16); |
|
1750 |
|
1751 if(!mp_iseven(&a)) { |
|
1752 reason("error: expected operand to be even, but it isn't\n"); |
|
1753 mp_clear(&a); |
|
1754 return 1; |
|
1755 } |
|
1756 |
|
1757 mp_clear(&a); |
|
1758 return 0; |
|
1759 } |
|
1760 |
|
1761 /*------------------------------------------------------------------------*/ |
|
1762 |
|
1763 int test_gcd(void) |
|
1764 { |
|
1765 mp_int a, b; |
|
1766 int out = 0; |
|
1767 |
|
1768 mp_init(&a); mp_init(&b); |
|
1769 mp_read_radix(&a, mp7, 16); mp_read_radix(&b, mp1, 16); |
|
1770 |
|
1771 mp_gcd(&a, &b, &a); |
|
1772 mp_toradix(&a, g_intbuf, 16); |
|
1773 |
|
1774 if(strcmp(g_intbuf, g_mp71) != 0) { |
|
1775 reason("error: computed %s, expected %s\n", g_intbuf, g_mp71); |
|
1776 out = 1; |
|
1777 } |
|
1778 |
|
1779 mp_clear(&a); mp_clear(&b); |
|
1780 return out; |
|
1781 |
|
1782 } |
|
1783 |
|
1784 /*------------------------------------------------------------------------*/ |
|
1785 |
|
1786 int test_lcm(void) |
|
1787 { |
|
1788 mp_int a, b; |
|
1789 int out = 0; |
|
1790 |
|
1791 mp_init(&a); mp_init(&b); |
|
1792 mp_read_radix(&a, mp10, 16); mp_read_radix(&b, mp11, 16); |
|
1793 |
|
1794 mp_lcm(&a, &b, &a); |
|
1795 mp_toradix(&a, g_intbuf, 16); |
|
1796 |
|
1797 if(strcmp(g_intbuf, l_mp1011) != 0) { |
|
1798 reason("error: computed %s, expected%s\n", g_intbuf, l_mp1011); |
|
1799 out = 1; |
|
1800 } |
|
1801 |
|
1802 mp_clear(&a); mp_clear(&b); |
|
1803 |
|
1804 return out; |
|
1805 |
|
1806 } |
|
1807 |
|
1808 /*------------------------------------------------------------------------*/ |
|
1809 |
|
1810 int test_convert(void) |
|
1811 { |
|
1812 int ix; |
|
1813 mp_int a; |
|
1814 |
|
1815 mp_init(&a); mp_read_radix(&a, mp9, 16); |
|
1816 |
|
1817 for(ix = LOW_RADIX; ix <= HIGH_RADIX; ix++) { |
|
1818 mp_toradix(&a, g_intbuf, ix); |
|
1819 |
|
1820 if(strcmp(g_intbuf, v_mp9[ix - LOW_RADIX]) != 0) { |
|
1821 reason("error: radix %d, computed %s, expected %s\n", |
|
1822 ix, g_intbuf, v_mp9[ix - LOW_RADIX]); |
|
1823 mp_clear(&a); |
|
1824 return 1; |
|
1825 } |
|
1826 } |
|
1827 |
|
1828 mp_clear(&a); |
|
1829 return 0; |
|
1830 } |
|
1831 |
|
1832 /*------------------------------------------------------------------------*/ |
|
1833 |
|
1834 int test_raw(void) |
|
1835 { |
|
1836 int len, out = 0; |
|
1837 mp_int a; |
|
1838 char *buf; |
|
1839 |
|
1840 mp_init(&a); mp_read_radix(&a, mp4, 16); |
|
1841 |
|
1842 len = mp_raw_size(&a); |
|
1843 if(len != sizeof(b_mp4)) { |
|
1844 reason("error: test_raw: expected length %d, computed %d\n", sizeof(b_mp4), |
|
1845 len); |
|
1846 mp_clear(&a); |
|
1847 return 1; |
|
1848 } |
|
1849 |
|
1850 buf = calloc(len, sizeof(char)); |
|
1851 mp_toraw(&a, buf); |
|
1852 |
|
1853 if(memcmp(buf, b_mp4, sizeof(b_mp4)) != 0) { |
|
1854 reason("error: test_raw: binary output does not match test vector\n"); |
|
1855 out = 1; |
|
1856 } |
|
1857 |
|
1858 free(buf); |
|
1859 mp_clear(&a); |
|
1860 |
|
1861 return out; |
|
1862 |
|
1863 } |
|
1864 |
|
1865 /*------------------------------------------------------------------------*/ |
|
1866 |
|
1867 int test_pprime(void) |
|
1868 { |
|
1869 mp_int p; |
|
1870 int err = 0; |
|
1871 mp_err res; |
|
1872 |
|
1873 mp_init(&p); |
|
1874 mp_read_radix(&p, mp7, 16); |
|
1875 |
|
1876 if(mpp_pprime(&p, 5) != MP_YES) { |
|
1877 reason("error: %s failed Rabin-Miller test, but is prime\n", mp7); |
|
1878 err = 1; |
|
1879 } |
|
1880 |
|
1881 IFOK( mp_set_int(&p, 9) ); |
|
1882 res = mpp_pprime(&p, 50); |
|
1883 if (res == MP_YES) { |
|
1884 reason("error: 9 is composite but passed Rabin-Miller test\n"); |
|
1885 err = 1; |
|
1886 } else if (res != MP_NO) { |
|
1887 reason("test mpp_pprime(9, 50) failed: error %d\n", res); |
|
1888 err = 1; |
|
1889 } |
|
1890 |
|
1891 IFOK( mp_set_int(&p, 15) ); |
|
1892 res = mpp_pprime(&p, 50); |
|
1893 if (res == MP_YES) { |
|
1894 reason("error: 15 is composite but passed Rabin-Miller test\n"); |
|
1895 err = 1; |
|
1896 } else if (res != MP_NO) { |
|
1897 reason("test mpp_pprime(15, 50) failed: error %d\n", res); |
|
1898 err = 1; |
|
1899 } |
|
1900 |
|
1901 mp_clear(&p); |
|
1902 |
|
1903 return err; |
|
1904 |
|
1905 } |
|
1906 |
|
1907 /*------------------------------------------------------------------------*/ |
|
1908 |
|
1909 int test_fermat(void) |
|
1910 { |
|
1911 mp_int p; |
|
1912 mp_err res; |
|
1913 int err = 0; |
|
1914 |
|
1915 mp_init(&p); |
|
1916 mp_read_radix(&p, mp7, 16); |
|
1917 |
|
1918 if((res = mpp_fermat(&p, 2)) != MP_YES) { |
|
1919 reason("error: %s failed Fermat test on 2: %s\n", mp7, |
|
1920 mp_strerror(res)); |
|
1921 ++err; |
|
1922 } |
|
1923 |
|
1924 if((res = mpp_fermat(&p, 3)) != MP_YES) { |
|
1925 reason("error: %s failed Fermat test on 3: %s\n", mp7, |
|
1926 mp_strerror(res)); |
|
1927 ++err; |
|
1928 } |
|
1929 |
|
1930 mp_clear(&p); |
|
1931 |
|
1932 return err; |
|
1933 |
|
1934 } |
|
1935 |
|
1936 /*------------------------------------------------------------------------*/ |
|
1937 /* Like fprintf(), but only if we are behaving in a verbose manner */ |
|
1938 |
|
1939 void reason(char *fmt, ...) |
|
1940 { |
|
1941 va_list ap; |
|
1942 |
|
1943 if(!g_verbose) |
|
1944 return; |
|
1945 |
|
1946 va_start(ap, fmt); |
|
1947 vfprintf(stderr, fmt, ap); |
|
1948 va_end(ap); |
|
1949 } |
|
1950 |
|
1951 /*------------------------------------------------------------------------*/ |
|
1952 /* HERE THERE BE DRAGONS */ |