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.
9
* ***** BEGIN LICENSE BLOCK *****
10
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
12
* The contents of this file are subject to the Mozilla Public License Version
13
* 1.1 (the "License"); you may not use this file except in compliance with
14
* the License. You may obtain a copy of the License at
15
* http://www.mozilla.org/MPL/
17
* Software distributed under the License is distributed on an "AS IS" basis,
18
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
19
* for the specific language governing rights and limitations under the
22
* The Original Code is the MPI Arbitrary Precision Integer Arithmetic library.
24
* The Initial Developer of the Original Code is
25
* Michael J. Fromberger.
26
* Portions created by the Initial Developer are Copyright (C) 1999
27
* the Initial Developer. All Rights Reserved.
30
* Netscape Communications Corporation
32
* Alternatively, the contents of this file may be used under the terms of
33
* either the GNU General Public License Version 2 or later (the "GPL"), or
34
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
35
* in which case the provisions of the GPL or the LGPL are applicable instead
36
* of those above. If you wish to allow use of your version of this file only
37
* under the terms of either the GPL or the LGPL, and not to allow others to
38
* use your version of this file under the terms of the MPL, indicate your
39
* decision by deleting the provisions above and replace them with the notice
40
* and other provisions required by the GPL or the LGPL. If you do not delete
41
* the provisions above, a recipient may use your version of this file under
42
* the terms of any one of the MPL, the GPL or the LGPL.
44
* ***** END LICENSE BLOCK ***** */
45
/* $Id: mpi-test.c,v 1.13 2005/02/25 04:30:11 julien.pierre.bugs%sun.com Exp $ */
57
#include "test-info.c"
59
/* ZS means Zero Suppressed (no leading zeros) */
61
#define ZS_DIGIT_FMT "%lX"
62
#elif MP_USE_LONG_LONG_DIGIT
63
#define ZS_DIGIT_FMT "%llX"
64
#elif MP_USE_UINT_DIGIT
65
#define ZS_DIGIT_FMT "%X"
67
#error "unknown type of digit"
73
If you intend to change any of these values, you must also recompute
74
the corresponding solutions below. Basically, these are just hex
75
strings (for the big integers) or integer values (for the digits).
77
The comparison tests think they know what relationships hold between
78
these values. If you change that, you may have to adjust the code
79
for the comparison tests accordingly. Most of the other tests
80
should be fine as long as you re-compute the solutions, though.
82
const char *mp1 = "639A868CDA0C569861B";
83
const char *mp2 = "AAFC0A3FE45E5E09DBE2C29";
84
const char *mp3 = "B55AA8DF8A7E83241F38AC7A9E479CAEF2E4D7C5";
85
const char *mp4 = "-63DBC2265B88268DC801C10EA68476B7BDE0090F";
86
const char *mp5 = "F595CB42";
87
const char *mp5a = "-4B597E";
88
const char *mp6 = "0";
89
const char *mp7 = "EBFA7121CD838CE6439CC59DDB4CBEF3";
90
const char *mp8 = "5";
91
const char *mp9 = "F74A2876A1432698923B0767DA19DCF3D71795EE";
92
const char *mp10 = "9184E72A000";
93
const char *mp11 = "54D79A3557E8";
94
const char *mp12 = "10000000000000000";
96
"34584F700C15A341E40BF7BFDD88A6630C8FF2B2067469372D391342BDAB6163963C"
97
"D5A5C79F708BDE26E0CCF2DB66CD6D6089E29A877C45F2B050D226E6DA88";
99
"AC3FA0EABAAC45724814D798942A1E28E14C81E0DE8055CED630E7689DA648683645DB6E"
100
"458D9F5338CC3D4E33A5D1C9BF42780133599E60DEE0049AFA8F9489501AE5C9AA2B8C13"
101
"FD21285A538B2CA87A626BB56E0A654C8707535E637FF4E39174157402BDE3AA30C9F134"
102
"0C1307BAA864B075A9CC828B6A5E2B2BF1AE406D920CC5E7657D7C0E697DEE5375773AF9"
103
"E200A1B8FAD7CD141F9EE47ABB55511FEB9A4D99EBA22F3A3FF6792FA7EE9E5DC0EE94F7"
104
"7A631EDF3D7DD7C2DAAAFDF234D60302AB63D5234CEAE941B9AF0ADDD9E6E3A940A94EE5"
105
"5DB45A7C66E61EDD0477419BBEFA44C325129601C4F45671C6A0E64665DF341D17FBC71F"
106
"77418BD9F4375DDB3B9D56126526D8E5E0F35A121FD4F347013DA880020A752324F31DDD"
107
"9BCDB13A3B86E207A2DE086825E6EEB87B3A64232CFD8205B799BC018634AAE193F19531"
108
"D6EBC19A75F27CFFAA03EB5974898F53FD569AA5CE60F431B53B0CDE715A5F382405C9C4"
109
"761A8E24888328F09F7BCE4E8D80C957DF177629C8421ACCD0C268C63C0DD47C3C0D954F"
110
"D79F7D7297C6788DF4B3E51381759864D880ACA246DF09533739B8BB6085EAF7AE8DC2D9"
111
"F224E6874926C8D24D34B457FD2C9A586C6B99582DC24F787A39E3942786CF1D494B6EB4"
112
"A513498CDA0B217C4E80BCE7DA1C704C35E071AC21E0DA9F57C27C3533F46A8D20B04137"
115
"39849CF7FD65AF2E3C4D87FE5526221103D90BA26A6642FFE3C3ECC0887BBBC57E011BF1"
116
"05D822A841653509C68F79EBE51C0099B8CBB04DEF31F36F5954208A3209AC122F0E11D8"
117
"4AE67A494D78336A2066D394D42E27EF6B03DDAF6D69F5112C93E714D27C94F82FC7EF77"
118
"445768C68EAE1C4A1407BE1B303243391D325090449764AE469CC53EC8012C4C02A72F37"
119
"07ED7275D2CC8D0A14B5BCC6BF264941520EBA97E3E6BAE4EE8BC87EE0DDA1F5611A6ECB"
120
"65F8AEF4F184E10CADBDFA5A2FEF828901D18C20785E5CC63473D638762DA80625003711"
121
"9E984AC43E707915B133543AF9D5522C3E7180DC58E1E5381C1FB7DC6A5F4198F3E88FA6"
122
"CBB6DFA8B2D1C763226B253E18BCCB79A29EE82D2DE735078C8AE3C3C86D476AAA08434C"
123
"09C274BDD40A1D8FDE38D6536C22F44E807EB73DE4FB36C9F51E0BC835DDBE3A8EFCF2FE"
124
"672B525769DC39230EE624D5EEDBD837C82A52E153F37378C3AD68A81A7ADBDF3345DBCE"
125
"8FA18CA1DE618EF94DF72EAD928D4F45B9E51632ACF158CF8332C51891D1D12C2A7E6684"
126
"360C4BF177C952579A9F442CFFEC8DAE4821A8E7A31C4861D8464CA9116C60866C5E72F7"
127
"434ADBED36D54ACDFDFF70A4EFB46E285131FE725F1C637D1C62115EDAD01C4189716327"
128
"BFAA79618B1656CBFA22C2C965687D0381CC2FE0245913C4D8D96108213680BD8E93E821"
130
const char *mp16 = "4A724340668DB150339A70";
131
const char *mp17 = "8ADB90F58";
132
const char *mp18 = "C64C230AB20E5";
134
"F1C9DACDA287F2E3C88DCE2393B8F53DAAAC1196DC36510962B6B59454CFE64B";
136
"D445662C8B6FE394107B867797750C326E0F4A967E135FC430F6CD7207913AC7";
137
const char* mp21 = "2";
139
const mp_digit md1 = 0;
140
const mp_digit md2 = 0x1;
141
const mp_digit md3 = 0x80;
142
const mp_digit md4 = 0x9C97;
143
const mp_digit md5 = 0xF5BF;
144
const mp_digit md6 = 0x14A0;
145
const mp_digit md7 = 0x03E8;
146
const mp_digit md8 = 0x0101;
147
const mp_digit md9 = 0xA;
150
Solutions of the form x_mpABC, where:
152
x = (p)roduct, (s)um, (d)ifference, (q)uotient, (r)emainder, (g)cd,
153
(i)nverse, (e)xponent, square roo(t), (g)cd, (l)cm. A
154
leading 'm' indicates a modular operation, e.g. ms_mp12 is the
155
modular sum of operands 1 and 2
157
ABC are the operand numbers involved in the computation. If a 'd'
158
precedes the number, it is a digit operand; if a 'c' precedes it,
159
it is a constant; otherwise, it is a full integer.
162
const char *p_mp12 = "4286AD72E095C9FE009938750743174ADDD7FD1E53";
163
const char *p_mp34 = "-46BDBD66CA108C94A8CF46C325F7B6E2F2BA82D35"
164
"A1BFD6934C441EE369B60CA29BADC26845E918B";
165
const char *p_mp57 = "E260C265A0A27C17AD5F4E59D6E0360217A2EBA6";
166
const char *p_mp22 = "7233B5C1097FFC77CCF55928FDC3A5D31B712FDE7A1E91";
167
const char *p_mp1d4 = "3CECEA2331F4220BEF68DED";
168
const char *p_mp8d6 = "6720";
169
const char *p_mp1113 =
170
"11590FC3831C8C3C51813142C88E566408DB04F9E27642F6471A1822E0100B12F7F1"
171
"5699A127C0FA9D26DCBFF458522661F30C6ADA4A07C8C90F9116893F6DBFBF24C3A2"
173
const char *p_mp1415 =
174
"26B36540DE8B3586699CCEAE218A2842C7D5A01590E70C4A26E789107FBCDB06AA2C"
175
"6DDC39E6FA18B16FCB2E934C9A5F844DAD60EE3B1EA82199EC5E9608F67F860FB965"
176
"736055DF0E8F2540EB28D07F47E309B5F5D7C94FF190AB9C83A6970160CA700B1081"
177
"F60518132AF28C6CEE6B7C473E461ABAC52C39CED50A08DD4E7EA8BA18DAD545126D"
178
"A388F6983C29B6BE3F9DCBC15766E8E6D626A92C5296A9C4653CAE5788350C0E2107"
179
"F57E5E8B6994C4847D727FF1A63A66A6CEF42B9C9E6BD04C92550B85D5527DE8A132"
180
"E6BE89341A9285C7CE7FB929D871BBCBD0ED2863B6B078B0DBB30FCA66D6C64284D6"
181
"57F394A0271E15B6EC7A9D530EBAC6CA262EF6F97E1A29FCE7749240E4AECA591ECF"
182
"272122BC587370F9371B67BB696B3CDC1BC8C5B64B6280994EBA00CDEB8EB0F5D06E"
183
"18F401D65FDCECF23DD7B9BB5B4C5458AEF2CCC09BA7F70EACB844750ACFD027521E"
184
"2E047DE8388B35F8512D3DA46FF1A12D4260213602BF7BFFDB6059439B1BD0676449"
185
"8D98C74F48FB3F548948D5BA0C8ECFCD054465132DC43466D6BBD59FBAF8D6D4E157"
186
"2D612B40A956C7D3E140F3B8562EF18568B24D335707D5BAC7495014DF2444172426"
187
"FD099DED560D30D1F945386604AFC85C64BD1E5F531F5C7840475FC0CF0F79810012"
188
"4572BAF5A9910CDBD02B27FFCC3C7E5E88EF59F3AE152476E33EDA696A4F751E0AE4"
189
"A3D2792DEA78E25B9110E12A19EFD09EA47FF9D6594DA445478BEB6901EAF8A35B2D"
190
"FD59BEE9BF7AA8535B7D326EFA5AA2121B5EBE04DD85827A3D43BD04F4AA6D7B62A2"
191
"B6D7A3077286A511A431E1EF75FCEBA3FAE9D5843A8ED17AA02BBB1B571F904699C5"
192
"A6073F87DDD012E2322AB3F41F2A61F428636FE86914148E19B8EF8314ED83332F2F"
193
"8C2ADE95071E792C0A68B903E060DD322A75FD0C2B992059FCCBB58AFA06B50D1634"
194
"BBD93F187FCE0566609FCC2BABB269C66CEB097598AA17957BB4FDA3E64A1B30402E"
195
"851CF9208E33D52E459A92C63FBB66435BB018E155E2C7F055E0B7AB82CD58FC4889"
196
"372ED9EEAC2A07E8E654AB445B9298D2830D6D4DFD117B9C8ABE3968927DC24B3633"
197
"BAD6E6466DB45DDAE87A0AB00336AC2CCCE176704F7214FCAB55743AB76C2B6CA231"
198
"7984610B27B5786DE55C184DDF556EDFEA79A3652831940DAD941E243F482DC17E50"
199
"284BC2FB1AD712A92542C573E55678878F02DFD9E3A863C7DF863227AEDE14B47AD3"
200
"957190124820ADC19F5353878EDB6BF7D0C77352A6E3BDB53EEB88F5AEF6226D6E68"
201
"756776A8FB49B77564147A641664C2A54F7E5B680CCC6A4D22D894E464DF20537094"
202
"548F1732452F9E7F810C0B4B430C073C0FBCE03F0D03F82630654BCE166AA772E1EE"
203
"DD0C08D3E3EBDF0AF54203B43AFDFC40D8FC79C97A4B0A4E1BEB14D8FCEFDDED8758"
205
const char *p_mp2121 = "4";
206
const char *mp_mp345 = "B9B6D3A3";
207
const char *mp_mp335 = "16609C2D";
209
const char *s_mp13 = "B55AA8DF8A7E83241F38B2B446B06A4FB84E5DE0";
210
const char *s_mp34 = "517EE6B92EF65C965736EB6BF7C325F73504CEB6";
211
const char *s_mp46 = "-63DBC2265B88268DC801C10EA68476B7BDE0090F";
212
const char *s_mp5d4 = "F59667D9";
213
const char *s_mp2d5 = "AAFC0A3FE45E5E09DBF21E8";
214
const char *s_mp1415 =
215
"E5C43DE2B811F4A084625F96E9504039E5258D8348E698CEB9F4D4292622042DB446"
216
"F75F4B65C1FB7A317257FA354BB5A45E789AEC254EAECE11F80A53E3B513822491DB"
217
"D9399DEC4807A2A3A10360129AC93F4A42388D3BF20B310DD0E9E9F4BE07FC88D53A"
218
"78A26091E0AB506A70813712CCBFBDD440A69A906E650EE090FDD6A42A95AC1A414D"
219
"317F1A9F781E6A30E9EE142ECDA45A1E3454A1417A7B9A613DA90831CF88EA1F2E82"
220
"41AE88CC4053220903C2E05BCDD42F02B8CF8868F84C64C5858BAD356143C5494607"
221
"EE22E11650148BAF65A985F6FC4CA540A55697F2B5AA95D6B8CF96EF638416DE1DD6"
222
"3BA9E2C09E22D03E75B60BE456C642F86B82A709253E5E087B507DE3A45F8392423F"
223
"4DBC284E8DC88C43CA77BC8DCEFB6129A59025F80F90FF978116DEBB9209E306FBB9"
224
"1B6111F8B8CFACB7C7C9BC12691C22EE88303E1713F1DFCEB622B8EA102F6365678B"
225
"C580ED87225467AA78E875868BD53B17574BA59305BC1AC666E4B7E9ED72FCFC200E"
226
"189D98FC8C5C7533739C53F52DDECDDFA5A8668BFBD40DABC9640F8FCAE58F532940"
227
"8162261320A25589E9FB51B50F80056471F24B7E1AEC35D1356FC2747FFC13A04B34"
228
"24FCECE10880BD9D97CA8CDEB2F5969BF4F30256EB5ED2BCD1DC64BDC2EE65217848"
229
"48A37FB13F84ED4FB7ACA18C4639EE64309BDD3D552AEB4AAF44295943DC1229A497"
232
const char *ms_mp345 = "1E71E292";
234
const char *d_mp12 = "-AAFBA6A55DD183FD854A60E";
235
const char *d_mp34 = "119366B05E606A9B1E73A6D8944CC1366B0C4E0D4";
236
const char *d_mp5d4 = "F5952EAB";
237
const char *d_mp6d2 = "-1";
238
const char *md_mp345 = "26596B86";
240
const char *q_mp42 = "-95825A1FFA1A155D5";
241
const char *r_mp42 = "-6312E99D7700A3DCB32ADF2";
242
const char *q_mp45a = "15344CDA3D841F661D2B61B6EDF7828CE36";
243
const char *r_mp45a = "-47C47B";
244
const char *q_mp7c2 = "75FD3890E6C1C67321CE62CEEDA65F79";
245
const char *q_mp3d6 = "8CAFD53C272BD6FE8B0847BDC3B539EFAB5C3";
246
const char *r_mp3d6 = "1E5";
247
const char *r_mp5d5 = "1257";
248
const char *r_mp47 = "B3A9018D970281A90FB729A181D95CB8";
249
const char *q_mp1404 =
250
"-1B994D869142D3EF6123A3CBBC3C0114FA071CFCEEF4B7D231D65591D32501AD80F"
251
"FF49AE4EC80514CC071EF6B42521C2508F4CB2FEAD69A2D2EF3934087DCAF88CC4C4"
252
"659F1CA8A7F4D36817D802F778F1392337FE36302D6865BF0D4645625DF8BB044E19"
253
"930635BE2609FAC8D99357D3A9F81F2578DE15A300964188292107DAC980E0A08CD7"
254
"E938A2135FAD45D50CB1D8C2D4C4E60C27AB98B9FBD7E4DBF752C57D2674520E4BB2"
255
"7E42324C0EFE84FB3E38CF6950E699E86FD45FE40D428400F2F94EDF7E94FAE10B45"
256
"89329E1BF61E5A378C7B31C9C6A234F8254D4C24823B84D0BF8D671D8BC9154DFAC9"
257
"49BD8ACABD6BD32DD4DC587F22C86153CB3954BDF7C2A890D623642492C482CF3E2C"
258
"776FC019C3BBC61688B485E6FD35D6376089C1E33F880E84C4E51E8ABEACE1B3FB70"
259
"3EAD0E28D2D44E7F1C0A859C840775E94F8C1369D985A3C5E8114B21D68B3CBB75D2"
260
"791C586153C85B90CAA483E57A40E2D97950AAB84920A4396C950C87C7FFFE748358"
261
"42A0BF65445B26D40F05BE164B822CA96321F41D85A289C5F5CD5F438A78704C9683"
262
"422299D21899A22F853B0C93081CC9925E350132A0717A611DD932A68A0ACC6E4C7F"
263
"7F685EF8C1F4910AEA5DC00BB5A36FCA07FFEAA490C547F6E14A08FE87041AB803E1"
264
"BD9E23E4D367A2C35762F209073DFF48F3";
265
const char *r_mp1404 = "12FF98621ABF63144BFFC3207AC8FC10D8D1A09";
267
const char *q_mp13c =
268
"34584F700C15A341E40BF7BFDD88A6630C8FF2B2067469372D391342"
269
"BDAB6163963CD5A5C79F708BDE26E0CCF2DB66CD6D6089E29A877C45";
270
const char *r_mp13c = "F2B050D226E6DA88";
271
const char *q_mp9c16 = "F74A2876A1432698923B0767DA19DCF3D71795E";
272
const char *r_mp9c16 = "E";
274
const char *e_mp5d9 = "A8FD7145E727A20E52E73D22990D35D158090307A"
275
"13A5215AAC4E9AB1E96BD34E531209E03310400";
276
const char *e_mp78 = "AA5F72C737DFFD8CCD108008BFE7C79ADC01A819B"
277
"32B75FB82EC0FB8CA83311DA36D4063F1E57857A2"
278
"1AB226563D84A15BB63CE975FF1453BD6750C58D9"
279
"D113175764F5D0B3C89B262D4702F4D9640A3";
280
const char *me_mp817 = "E504493ACB02F7F802B327AB13BF25";
281
const char *me_mp5d47 = "1D45ED0D78F2778157992C951DD2734C";
282
const char *me_mp1512 = "FB5B2A28D902B9D9";
283
const char *me_mp161718 = "423C6AC6DBD74";
284
const char *me_mp5114 =
285
"64F0F72807993578BBA3C7C36FFB184028F9EB9A810C92079E1498D8A80FC848E1F0"
286
"25F1DE43B7F6AC063F5CC29D8A7C2D7A66269D72BF5CDC327AF88AF8EF9E601DCB0A"
287
"3F35BFF3525FB1B61CE3A25182F17C0A0633B4089EA15BDC47664A43FEF639748AAC"
288
"19CF58E83D8FA32CD10661D2D4210CC84792937E6F36CB601851356622E63ADD4BD5"
289
"542412C2E0C4958E51FD2524AABDC7D60CFB5DB332EEC9DC84210F10FAE0BA2018F2"
290
"14C9D6867C9D6E49CF28C18D06CE009FD4D04BFC8837C3FAAA773F5CCF6DED1C22DE"
291
"181786AFE188540586F2D74BF312E595244E6936AE52E45742109BAA76C36F2692F5"
292
"CEF97AD462B138BE92721194B163254CBAAEE9B9864B21CCDD5375BCAD0D24132724"
293
"113D3374B4BCF9AA49BA5ACBC12288C0BCF46DCE6CB4A241A91BD559B130B6E9CD3D"
294
"D7A2C8B280C2A278BA9BF5D93244D563015C9484B86D9FEB602501DC16EEBC3EFF19"
295
"53D7999682BF1A1E3B2E7B21F4BDCA3C355039FEF55B9C0885F98DC355CA7A6D8ECF"
296
"5F7F1A6E11A764F2343C823B879B44616B56BF6AE3FA2ACF5483660E618882018E3F"
297
"C8459313BACFE1F93CECC37B2576A5C0B2714BD3EEDEEC22F0E7E3E77B11396B9B99"
298
"D683F2447A4004BBD4A57F6A616CDDFEC595C4FC19884CC2FC21CF5BF5B0B81E0F83"
299
"B9DDA0CF4DFF35BB8D31245912BF4497FD0BD95F0C604E26EA5A8EA4F5EAE870A5BD"
302
const char *e_mpc2d3 = "100000000000000000000000000000000";
304
const char *t_mp9 = "FB9B6E32FF0452A34746";
305
const char *i_mp27 = "B6AD8DCCDAF92B6FE57D062FFEE3A99";
306
const char *i_mp2019 =
307
"BDF3D88DC373A63EED92903115B03FC8501910AF68297B4C41870AED3EA9F839";
308
/* "15E3FE09E8AE5523AABA197BD2D16318D3CA148EDF4AE1C1C52FC96AFAF5680B"; */
312
"795853094E59B0008093BCA8DECF68587C64BDCA2F3F7F8963DABC12F1CFFFA9B8C4"
313
"365232FD4751870A0EF6CA619287C5D8B7F1747D95076AB19645EF309773E9EACEA0"
314
"975FA4AE16251A8DA5865349C3A903E3B8A2C0DEA3C0720B6020C7FED69AFF62BB72"
315
"10FAC443F9FFA2950776F949E819260C2AF8D94E8A1431A40F8C23C1973DE5D49AA2"
316
"0B3FF5DA5C1D5324E712A78FF33A9B1748F83FA529905924A31DF38643B3F693EF9B"
317
"58D846BB1AEAE4523ECC843FF551C1B300A130B65C1677402778F98C51C10813250E"
318
"2496882877B069E877B59740DC1226F18A5C0F66F64A5F59A9FAFC5E9FC45AEC0E7A"
319
"BEE244F7DD3AC268CF512A0E52E4F5BE5B94";
321
const char *g_mp71 = "1";
322
const char *g_mp25 = "7";
323
const char *l_mp1011 = "C589E3D7D64A6942A000";
325
/* mp9 in radices from 5 to 64 inclusive */
327
#define HIGH_RADIX 64
328
const char *v_mp9[] = {
329
"404041130042310320100141302000203430214122130002340212132414134210033",
330
"44515230120451152500101352430105520150025145320010504454125502",
331
"644641136612541136016610100564613624243140151310023515322",
332
"173512120732412062323044435407317550316717172705712756",
333
"265785018434285762514442046172754680368422060744852",
334
"1411774500397290569709059837552310354075408897518",
335
"184064268501499311A17746095910428222A241708032A",
336
"47706011B225950B02BB45602AA039893118A85950892",
337
"1A188C826B982353CB58422563AC602B783101671A86",
338
"105957B358B89B018958908A9114BC3DDC410B77982",
339
"CB7B3387E23452178846C55DD9D70C7CA9AEA78E8",
340
"F74A2876A1432698923B0767DA19DCF3D71795EE",
341
"17BF7C3673B76D7G7A5GA836277296F806E7453A",
342
"2EBG8HH3HFA6185D6H0596AH96G24C966DD3HG2",
343
"6G3HGBFEG8I3F25EAF61B904EIA40CFDH2124F",
344
"10AHC3D29EBHDF3HD97905CG0JA8061855C3FI",
345
"3BA5A55J5K699B2D09C38A4B237CH51IHA132",
346
"EDEA90DJ0B5CB3FGG1C8587FEB99D3C143CA",
347
"31M26JI1BBD56K3I028MML4EEDMAJK60LGLE",
348
"GGG5M3142FKKG82EJ28111D70EMHC241E4E",
349
"4446F4D5H10982023N297BF0DKBBHLLJB0I",
350
"12E9DEEOBMKAKEP0IM284MIP7FO1O521M46",
351
"85NN0HD48NN2FDDB1F5BMMKIB8CK20MDPK",
352
"2D882A7A0O0JPCJ4APDRIB77IABAKDGJP2",
353
"MFMCI0R7S27AAA3O3L2S8K44HKA7O02CN",
354
"7IGQS73FFSHC50NNH44B6PTTNLC3M6H78",
355
"2KLUB3U9850CSN6ANIDNIF1LB29MJ43LH",
356
"UT52GTL18CJ9H4HR0TJTK6ESUFBHF5FE",
357
"BTVL87QQBMUGF8PFWU4W3VU7U922QTMW",
358
"4OG10HW0MSWJBIDEE2PDH24GA7RIHIAA",
359
"1W8W9AX2DRUX48GXOLMK0PE42H0FEUWN",
360
"SVWI84VBH069WR15W1U2VTK06USY8Z2",
361
"CPTPNPDa5TYCPPNLALENT9IMX2GL0W2",
362
"5QU21UJMRaUYYYYYN6GHSMPOYOXEEUY",
363
"2O2Q7C6RPPB1SXJ9bR4035SPaQQ3H2W",
364
"18d994IbT4PHbD7cGIPCRP00bbQO0bc",
365
"NcDUEEWRO7XT76260WGeBHPVa72RdA",
366
"BbX2WCF9VfSB5LPdJAdeXKV1fd6LC2",
367
"60QDKW67P4JSQaTdQg7JE9ISafLaVU",
368
"33ba9XbDbRdNF4BeDB2XYMhAVDaBdA",
369
"1RIPZJA8gT5L5H7fTcaRhQ39geMMTc",
370
"d65j70fBATjcDiidPYXUGcaBVVLME",
371
"LKA9jhPabDG612TXWkhfT2gMXNIP2",
372
"BgNaYhjfT0G8PBcYRP8khJCR3C9QE",
373
"6Wk8RhJTAgDh10fYAiUVB1aM0HacG",
374
"3dOCjaf78kd5EQNViUZWj3AfFL90I",
375
"290VWkL3aiJoW4MBbHk0Z0bDo22Ni",
376
"1DbDZ1hpPZNUDBUp6UigcJllEdC26",
377
"dFSOLBUM7UZX8Vnc6qokGIOiFo1h",
378
"NcoUYJOg0HVmKI9fR2ag0S8R2hrK",
379
"EOpiJ5Te7oDe2pn8ZhAUKkhFHlZh",
380
"8nXK8rp8neV8LWta1WDgd1QnlWsU",
381
"5T3d6bcSBtHgrH9bCbu84tblaa7r",
382
"3PlUDIYUvMqOVCir7AtquK5dWanq",
383
"2A70gDPX2AtiicvIGGk9poiMtgvu",
384
"1MjiRxjk10J6SVAxFguv9kZiUnIc",
385
"rpre2vIDeb4h3sp50r1YBbtEx9L",
386
"ZHcoip0AglDAfibrsUcJ9M1C8fm",
387
"NHP18+eoe6uU54W49Kc6ZK7+bT2",
388
"FTAA7QXGoQOaZi7PzePtFFN5vNk"
391
const unsigned char b_mp4[] = {
393
#if MP_DIGIT_MAX > MP_32BIT_MAX
394
0x00, 0x00, 0x00, 0x00,
396
0x63, 0xDB, 0xC2, 0x26,
397
0x5B, 0x88, 0x26, 0x8D,
398
0xC8, 0x01, 0xC1, 0x0E,
399
0xA6, 0x84, 0x76, 0xB7,
400
0xBD, 0xE0, 0x09, 0x0F
403
/* Search for a test suite name in the names table */
404
int find_name(char *name);
405
void reason(char *fmt, ...);
407
/*------------------------------------------------------------------------*/
408
/*------------------------------------------------------------------------*/
410
char g_intbuf[4096]; /* buffer for integer comparison */
411
char a_intbuf[4096]; /* buffer for integer comparison */
412
int g_verbose = 1; /* print out reasons for failure? */
415
#define IFOK(x) { if (MP_OKAY > (res = (x))) { \
416
reason("test %s failed: error %d\n", #x, res); return 1; }}
418
int main(int argc, char *argv[])
422
srand((unsigned int)time(NULL));
425
fprintf(stderr, "Usage: %s <test-suite> | list\n"
426
"Type '%s help' for assistance\n", argv[0], argv[0]);
428
} else if(argc > 2) {
429
if(strcmp(argv[2], "quiet") == 0)
433
if(strcmp(argv[1], "help") == 0) {
434
fprintf(stderr, "Help for mpi-test\n\n"
435
"This program is a test driver for the MPI library, which\n"
436
"tests all the various functions in the library to make sure\n"
437
"they are working correctly. The syntax is:\n"
439
"...where <suite-name> is the name of the test you wish to\n"
440
"run. To get a list of the tests, use '%s list'.\n\n"
441
"The program exits with a status of zero if the test passes,\n"
442
"or non-zero if it fails. Ordinarily, failure is accompanied\n"
443
"by a diagnostic message to standard error. To suppress this\n"
444
"add the keyword 'quiet' after the suite-name on the command\n"
445
"line.\n\n", argv[0], argv[0]);
449
if ((which = find_name(argv[1])) < 0) {
450
fprintf(stderr, "%s: test suite '%s' is not known\n", argv[0], argv[1]);
454
if((res = (g_tests[which])()) < 0) {
455
fprintf(stderr, "%s: test suite not implemented yet\n", argv[0]);
463
/*------------------------------------------------------------------------*/
465
int find_name(char *name)
469
while(ix < g_count) {
470
if (strcmp(name, g_names[ix]) == 0)
479
/*------------------------------------------------------------------------*/
485
fprintf(stderr, "There are currently %d test suites available\n",
488
for(ix = 1; ix < g_count; ix++)
489
fprintf(stdout, "%-20s %s\n", g_names[ix], g_descs[ix]);
494
/*------------------------------------------------------------------------*/
501
mp_init(&a); mp_init(&b);
503
mp_read_radix(&a, mp3, 16);
506
if(SIGN(&a) != SIGN(&b) || USED(&a) != USED(&b)) {
507
if(SIGN(&a) != SIGN(&b)) {
508
reason("error: sign of original is %d, sign of copy is %d\n",
511
reason("error: original precision is %d, copy precision is %d\n",
514
mp_clear(&a); mp_clear(&b);
518
for(ix = 0; ix < USED(&b); ix++) {
519
if(DIGIT(&a, ix) != DIGIT(&b, ix)) {
520
reason("error: digit %d " DIGIT_FMT " != " DIGIT_FMT "\n",
521
ix, DIGIT(&a, ix), DIGIT(&b, ix));
522
mp_clear(&a); mp_clear(&b);
527
mp_clear(&a); mp_clear(&b);
531
/*------------------------------------------------------------------------*/
537
mp_init(&a); mp_init(&b);
538
mp_read_radix(&a, mp7, 16); mp_read_radix(&b, mp1, 16);
541
mp_toradix(&a, g_intbuf, 16);
544
if(strcmp(g_intbuf, mp1) != 0) {
546
reason("error: exchange failed\n");
550
mp_toradix(&b, g_intbuf, 16);
553
if(strcmp(g_intbuf, mp7) != 0) {
554
reason("error: exchange failed\n");
561
/*------------------------------------------------------------------------*/
567
mp_init(&a); mp_read_radix(&a, mp7, 16);
570
if(USED(&a) != 1 || DIGIT(&a, 1) != 0) {
571
mp_toradix(&a, g_intbuf, 16);
572
reason("error: result is %s\n", g_intbuf);
581
/*------------------------------------------------------------------------*/
587
/* Test single digit set */
588
mp_init(&a); mp_set(&a, 5);
589
if(DIGIT(&a, 0) != 5) {
590
mp_toradix(&a, g_intbuf, 16);
591
reason("error: result is %s, expected 5\n", g_intbuf);
596
/* Test integer set */
597
mp_set_int(&a, -4938110);
598
mp_toradix(&a, g_intbuf, 16);
600
if(strcmp(g_intbuf, mp5a) != 0) {
601
reason("error: result is %s, expected %s\n", g_intbuf, mp5a);
608
/*------------------------------------------------------------------------*/
614
mp_init(&a); mp_read_radix(&a, mp4, 16);
617
if(SIGN(&a) != ZPOS) {
618
reason("error: sign of result is negative\n");
627
/*------------------------------------------------------------------------*/
634
mp_init(&a); mp_read_radix(&a, mp4, 16);
639
reason("error: sign of result is same as sign of nonzero input\n");
648
/*------------------------------------------------------------------------*/
656
mp_read_radix(&a, mp5, 16);
657
mp_add_d(&a, md4, &a);
658
mp_toradix(&a, g_intbuf, 16);
660
if(strcmp(g_intbuf, s_mp5d4) != 0) {
661
reason("error: computed %s, expected %s\n", g_intbuf, s_mp5d4);
666
mp_read_radix(&a, mp2, 16);
667
mp_add_d(&a, md5, &a);
668
mp_toradix(&a, g_intbuf, 16);
670
if(strcmp(g_intbuf, s_mp2d5) != 0) {
671
reason("error: computed %s, expected %s\n", g_intbuf, s_mp2d5);
680
/*------------------------------------------------------------------------*/
687
mp_init(&a); mp_init(&b);
689
mp_read_radix(&a, mp1, 16); mp_read_radix(&b, mp3, 16);
691
mp_toradix(&a, g_intbuf, 16);
693
if(strcmp(g_intbuf, s_mp13) != 0) {
694
reason("error: computed %s, expected %s\n", g_intbuf, s_mp13);
695
res = 1; goto CLEANUP;
698
mp_read_radix(&a, mp4, 16);
700
mp_toradix(&a, g_intbuf, 16);
702
if(strcmp(g_intbuf, s_mp34) != 0) {
703
reason("error: computed %s, expected %s\n", g_intbuf, s_mp34);
704
res = 1; goto CLEANUP;
707
mp_read_radix(&a, mp4, 16); mp_read_radix(&b, mp6, 16);
709
mp_toradix(&a, g_intbuf, 16);
711
if(strcmp(g_intbuf, s_mp46) != 0) {
712
reason("error: computed %s, expected %s\n", g_intbuf, s_mp46);
713
res = 1; goto CLEANUP;
716
mp_read_radix(&a, mp14, 16); mp_read_radix(&b, mp15, 16);
718
mp_toradix(&a, g_intbuf, 16);
720
if(strcmp(g_intbuf, s_mp1415) != 0) {
721
reason("error: computed %s, expected %s\n", g_intbuf, s_mp1415);
726
mp_clear(&a); mp_clear(&b);
730
/*------------------------------------------------------------------------*/
737
mp_read_radix(&a, mp5, 16);
739
mp_sub_d(&a, md4, &a);
740
mp_toradix(&a, g_intbuf, 16);
742
if(strcmp(g_intbuf, d_mp5d4) != 0) {
743
reason("error: computed %s, expected %s\n", g_intbuf, d_mp5d4);
748
mp_read_radix(&a, mp6, 16);
750
mp_sub_d(&a, md2, &a);
751
mp_toradix(&a, g_intbuf, 16);
754
if(strcmp(g_intbuf, d_mp6d2) != 0) {
755
reason("error: computed %s, expected %s\n", g_intbuf, d_mp6d2);
762
/*------------------------------------------------------------------------*/
768
mp_init(&a); mp_init(&b);
770
mp_read_radix(&a, mp1, 16); mp_read_radix(&b, mp2, 16);
772
mp_toradix(&a, g_intbuf, 16);
774
if(strcmp(g_intbuf, d_mp12) != 0) {
775
reason("error: computed %s, expected %s\n", g_intbuf, d_mp12);
776
mp_clear(&a); mp_clear(&b);
780
mp_read_radix(&a, mp3, 16); mp_read_radix(&b, mp4, 16);
782
mp_toradix(&a, g_intbuf, 16);
784
if(strcmp(g_intbuf, d_mp34) != 0) {
785
reason("error: computed %s, expected %s\n", g_intbuf, d_mp34);
786
mp_clear(&a); mp_clear(&b);
790
mp_clear(&a); mp_clear(&b);
794
/*------------------------------------------------------------------------*/
801
mp_read_radix(&a, mp1, 16);
803
IFOK( mp_mul_d(&a, md4, &a) );
804
mp_toradix(&a, g_intbuf, 16);
806
if(strcmp(g_intbuf, p_mp1d4) != 0) {
807
reason("error: computed %s, expected %s\n", g_intbuf, p_mp1d4);
812
mp_read_radix(&a, mp8, 16);
813
IFOK( mp_mul_d(&a, md6, &a) );
814
mp_toradix(&a, g_intbuf, 16);
817
if(strcmp(g_intbuf, p_mp8d6) != 0) {
818
reason("error: computed %s, expected %s\n", g_intbuf, p_mp8d6);
825
/*------------------------------------------------------------------------*/
832
mp_init(&a); mp_init(&b);
833
mp_read_radix(&a, mp1, 16); mp_read_radix(&b, mp2, 16);
835
IFOK( mp_mul(&a, &b, &a) );
836
mp_toradix(&a, g_intbuf, 16);
838
if(strcmp(g_intbuf, p_mp12) != 0) {
839
reason("error: computed %s, expected %s\n", g_intbuf, p_mp12);
840
res = 1; goto CLEANUP;
843
mp_read_radix(&a, mp3, 16); mp_read_radix(&b, mp4, 16);
844
IFOK( mp_mul(&a, &b, &a) );
845
mp_toradix(&a, g_intbuf, 16);
847
if(strcmp(g_intbuf, p_mp34) !=0) {
848
reason("error: computed %s, expected %s\n", g_intbuf, p_mp34);
849
res = 1; goto CLEANUP;
852
mp_read_radix(&a, mp5, 16); mp_read_radix(&b, mp7, 16);
853
IFOK( mp_mul(&a, &b, &a) );
854
mp_toradix(&a, g_intbuf, 16);
856
if(strcmp(g_intbuf, p_mp57) != 0) {
857
reason("error: computed %s, expected %s\n", g_intbuf, p_mp57);
858
res = 1; goto CLEANUP;
861
mp_read_radix(&a, mp11, 16); mp_read_radix(&b, mp13, 16);
862
IFOK( mp_mul(&a, &b, &a) );
863
mp_toradix(&a, g_intbuf, 16);
865
if(strcmp(g_intbuf, p_mp1113) != 0) {
866
reason("error: computed %s, expected %s\n", g_intbuf, p_mp1113);
867
res = 1; goto CLEANUP;
870
mp_read_radix(&a, mp14, 16); mp_read_radix(&b, mp15, 16);
871
IFOK( mp_mul(&a, &b, &a) );
872
mp_toradix(&a, g_intbuf, 16);
874
if(strcmp(g_intbuf, p_mp1415) != 0) {
875
reason("error: computed %s, expected %s\n", g_intbuf, p_mp1415);
878
mp_read_radix(&a, mp21, 10); mp_read_radix(&b, mp21, 10);
880
IFOK( mp_mul(&a, &b, &a) );
881
mp_toradix(&a, g_intbuf, 10);
883
if(strcmp(g_intbuf, p_mp2121) != 0) {
884
reason("error: computed %s, expected %s\n", g_intbuf, p_mp2121);
885
res = 1; goto CLEANUP;
889
mp_clear(&a); mp_clear(&b);
894
/*------------------------------------------------------------------------*/
900
mp_init(&a); mp_read_radix(&a, mp2, 16);
903
mp_toradix(&a, g_intbuf, 16);
906
if(strcmp(g_intbuf, p_mp22) != 0) {
907
reason("error: computed %s, expected %s\n", g_intbuf, p_mp22);
914
/*------------------------------------------------------------------------*/
922
mp_init(&a); mp_init(&q);
923
mp_read_radix(&a, mp3, 16);
925
IFOK( mp_div_d(&a, md6, &q, &r) );
926
mp_toradix(&q, g_intbuf, 16);
928
if(strcmp(g_intbuf, q_mp3d6) != 0) {
929
reason("error: computed q = %s, expected %s\n", g_intbuf, q_mp3d6);
933
sprintf(g_intbuf, ZS_DIGIT_FMT, r);
935
if(strcmp(g_intbuf, r_mp3d6) != 0) {
936
reason("error: computed r = %s, expected %s\n", g_intbuf, r_mp3d6);
940
mp_read_radix(&a, mp9, 16);
941
IFOK( mp_div_d(&a, 16, &q, &r) );
942
mp_toradix(&q, g_intbuf, 16);
944
if(strcmp(g_intbuf, q_mp9c16) != 0) {
945
reason("error: computed q = %s, expected %s\n", g_intbuf, q_mp9c16);
949
sprintf(g_intbuf, ZS_DIGIT_FMT, r);
951
if(strcmp(g_intbuf, r_mp9c16) != 0) {
952
reason("error: computed r = %s, expected %s\n", g_intbuf, r_mp9c16);
956
mp_clear(&a); mp_clear(&q);
960
/*------------------------------------------------------------------------*/
966
mp_init(&a); mp_read_radix(&a, mp7, 16);
967
IFOK( mp_div_2(&a, &a) );
968
mp_toradix(&a, g_intbuf, 16);
971
if(strcmp(g_intbuf, q_mp7c2) != 0) {
972
reason("error: computed %s, expected %s\n", g_intbuf, q_mp7c2);
979
/*------------------------------------------------------------------------*/
981
int test_div_2d(void)
985
mp_init(&q); mp_init(&r);
986
mp_init(&a); mp_read_radix(&a, mp13, 16);
988
IFOK( mp_div_2d(&a, 64, &q, &r) );
991
mp_toradix(&q, g_intbuf, 16);
993
if(strcmp(g_intbuf, q_mp13c) != 0) {
994
reason("error: computed %s, expected %s\n", g_intbuf, q_mp13c);
995
mp_clear(&q); mp_clear(&r);
1001
mp_toradix(&r, g_intbuf, 16);
1002
if(strcmp(g_intbuf, r_mp13c) != 0) {
1003
reason("error, computed %s, expected %s\n", g_intbuf, r_mp13c);
1013
/*------------------------------------------------------------------------*/
1020
mp_init(&a); mp_init(&b); mp_init(&r);
1022
mp_read_radix(&a, mp4, 16); mp_read_radix(&b, mp2, 16);
1023
IFOK( mp_div(&a, &b, &a, &r) );
1024
mp_toradix(&a, g_intbuf, 16);
1026
if(strcmp(g_intbuf, q_mp42) != 0) {
1027
reason("error: test 1 computed quot %s, expected %s\n", g_intbuf, q_mp42);
1031
mp_toradix(&r, g_intbuf, 16);
1033
if(strcmp(g_intbuf, r_mp42) != 0) {
1034
reason("error: test 1 computed rem %s, expected %s\n", g_intbuf, r_mp42);
1038
mp_read_radix(&a, mp4, 16); mp_read_radix(&b, mp5a, 16);
1039
IFOK( mp_div(&a, &b, &a, &r) );
1040
mp_toradix(&a, g_intbuf, 16);
1042
if(strcmp(g_intbuf, q_mp45a) != 0) {
1043
reason("error: test 2 computed quot %s, expected %s\n", g_intbuf, q_mp45a);
1047
mp_toradix(&r, g_intbuf, 16);
1049
if(strcmp(g_intbuf, r_mp45a) != 0) {
1050
reason("error: test 2 computed rem %s, expected %s\n", g_intbuf, r_mp45a);
1054
mp_read_radix(&a, mp14, 16); mp_read_radix(&b, mp4, 16);
1055
IFOK( mp_div(&a, &b, &a, &r) );
1056
mp_toradix(&a, g_intbuf, 16);
1058
if(strcmp(g_intbuf, q_mp1404) != 0) {
1059
reason("error: test 3 computed quot %s, expected %s\n", g_intbuf, q_mp1404);
1063
mp_toradix(&r, g_intbuf, 16);
1065
if(strcmp(g_intbuf, r_mp1404) != 0) {
1066
reason("error: test 3 computed rem %s, expected %s\n", g_intbuf, r_mp1404);
1070
mp_clear(&a); mp_clear(&b); mp_clear(&r);
1075
/*------------------------------------------------------------------------*/
1077
int test_expt_d(void)
1081
mp_init(&a); mp_read_radix(&a, mp5, 16);
1082
mp_expt_d(&a, md9, &a);
1083
mp_toradix(&a, g_intbuf, 16);
1086
if(strcmp(g_intbuf, e_mp5d9) != 0) {
1087
reason("error: computed %s, expected %s\n", g_intbuf, e_mp5d9);
1094
/*------------------------------------------------------------------------*/
1100
mp_init(&a); mp_init(&b);
1101
mp_read_radix(&a, mp7, 16); mp_read_radix(&b, mp8, 16);
1103
mp_expt(&a, &b, &a);
1104
mp_toradix(&a, g_intbuf, 16);
1105
mp_clear(&a); mp_clear(&b);
1107
if(strcmp(g_intbuf, e_mp78) != 0) {
1108
reason("error: computed %s, expected %s\n", g_intbuf, e_mp78);
1115
/*------------------------------------------------------------------------*/
1117
int test_2expt(void)
1123
mp_toradix(&a, g_intbuf, 16);
1126
if(strcmp(g_intbuf, e_mpc2d3) != 0) {
1127
reason("error: computed %s, expected %s\n", g_intbuf, e_mpc2d3);
1134
/*------------------------------------------------------------------------*/
1141
mp_init(&a); mp_read_radix(&a, mp9, 16);
1143
mp_toradix(&a, g_intbuf, 16);
1145
if(strcmp(g_intbuf, t_mp9) != 0) {
1146
reason("error: computed %s, expected %s\n", g_intbuf, t_mp9);
1147
res = 1; goto CLEANUP;
1150
mp_read_radix(&a, mp15, 16);
1152
mp_toradix(&a, g_intbuf, 16);
1154
if(strcmp(g_intbuf, t_mp15) != 0) {
1155
reason("error: computed %s, expected %s\n", g_intbuf, t_mp15);
1164
/*------------------------------------------------------------------------*/
1166
int test_mod_d(void)
1171
mp_init(&a); mp_read_radix(&a, mp5, 16);
1172
IFOK( mp_mod_d(&a, md5, &r) );
1173
sprintf(g_intbuf, ZS_DIGIT_FMT, r);
1176
if(strcmp(g_intbuf, r_mp5d5) != 0) {
1177
reason("error: computed %s, expected %s\n", g_intbuf, r_mp5d5);
1184
/*------------------------------------------------------------------------*/
1190
mp_init(&a); mp_init(&m);
1191
mp_read_radix(&a, mp4, 16); mp_read_radix(&m, mp7, 16);
1192
IFOK( mp_mod(&a, &m, &a) );
1193
mp_toradix(&a, g_intbuf, 16);
1194
mp_clear(&a); mp_clear(&m);
1196
if(strcmp(g_intbuf, r_mp47) != 0) {
1197
reason("error: computed %s, expected %s\n", g_intbuf, r_mp47);
1204
/*------------------------------------------------------------------------*/
1206
int test_addmod(void)
1210
mp_init(&a); mp_init(&b); mp_init(&m);
1211
mp_read_radix(&a, mp3, 16); mp_read_radix(&b, mp4, 16);
1212
mp_read_radix(&m, mp5, 16);
1214
IFOK( mp_addmod(&a, &b, &m, &a) );
1215
mp_toradix(&a, g_intbuf, 16);
1216
mp_clear(&a); mp_clear(&b); mp_clear(&m);
1218
if(strcmp(g_intbuf, ms_mp345) != 0) {
1219
reason("error: computed %s, expected %s\n", g_intbuf, ms_mp345);
1226
/*------------------------------------------------------------------------*/
1228
int test_submod(void)
1232
mp_init(&a); mp_init(&b); mp_init(&m);
1233
mp_read_radix(&a, mp3, 16); mp_read_radix(&b, mp4, 16);
1234
mp_read_radix(&m, mp5, 16);
1236
IFOK( mp_submod(&a, &b, &m, &a) );
1237
mp_toradix(&a, g_intbuf, 16);
1238
mp_clear(&a); mp_clear(&b); mp_clear(&m);
1240
if(strcmp(g_intbuf, md_mp345) != 0) {
1241
reason("error: computed %s, expected %s\n", g_intbuf, md_mp345);
1248
/*------------------------------------------------------------------------*/
1250
int test_mulmod(void)
1254
mp_init(&a); mp_init(&b); mp_init(&m);
1255
mp_read_radix(&a, mp3, 16); mp_read_radix(&b, mp4, 16);
1256
mp_read_radix(&m, mp5, 16);
1258
IFOK( mp_mulmod(&a, &b, &m, &a) );
1259
mp_toradix(&a, g_intbuf, 16);
1260
mp_clear(&a); mp_clear(&b); mp_clear(&m);
1262
if(strcmp(g_intbuf, mp_mp345) != 0) {
1263
reason("error: computed %s, expected %s\n", g_intbuf, mp_mp345);
1270
/*------------------------------------------------------------------------*/
1272
int test_sqrmod(void)
1276
mp_init(&a); mp_init(&m);
1277
mp_read_radix(&a, mp3, 16); mp_read_radix(&m, mp5, 16);
1279
IFOK( mp_sqrmod(&a, &m, &a) );
1280
mp_toradix(&a, g_intbuf, 16);
1281
mp_clear(&a); mp_clear(&m);
1283
if(strcmp(g_intbuf, mp_mp335) != 0) {
1284
reason("error: computed %s, expected %s\n", g_intbuf, mp_mp335);
1291
/*------------------------------------------------------------------------*/
1293
int test_exptmod(void)
1298
mp_init(&a); mp_init(&b); mp_init(&m);
1299
mp_read_radix(&a, mp8, 16); mp_read_radix(&b, mp1, 16);
1300
mp_read_radix(&m, mp7, 16);
1302
IFOK( mp_exptmod(&a, &b, &m, &a) );
1303
mp_toradix(&a, g_intbuf, 16);
1305
if(strcmp(g_intbuf, me_mp817) != 0) {
1306
reason("case 1: error: computed %s, expected %s\n", g_intbuf, me_mp817);
1307
res = 1; goto CLEANUP;
1310
mp_read_radix(&a, mp1, 16); mp_read_radix(&b, mp5, 16);
1311
mp_read_radix(&m, mp12, 16);
1313
IFOK( mp_exptmod(&a, &b, &m, &a) );
1314
mp_toradix(&a, g_intbuf, 16);
1316
if(strcmp(g_intbuf, me_mp1512) != 0) {
1317
reason("case 2: error: computed %s, expected %s\n", g_intbuf, me_mp1512);
1318
res = 1; goto CLEANUP;
1321
mp_read_radix(&a, mp5, 16); mp_read_radix(&b, mp1, 16);
1322
mp_read_radix(&m, mp14, 16);
1324
IFOK( mp_exptmod(&a, &b, &m, &a) );
1325
mp_toradix(&a, g_intbuf, 16);
1327
if(strcmp(g_intbuf, me_mp5114) != 0) {
1328
reason("case 3: error: computed %s, expected %s\n", g_intbuf, me_mp5114);
1332
mp_read_radix(&a, mp16, 16); mp_read_radix(&b, mp17, 16);
1333
mp_read_radix(&m, mp18, 16);
1335
IFOK( mp_exptmod(&a, &b, &m, &a) );
1336
mp_toradix(&a, g_intbuf, 16);
1338
if(strcmp(g_intbuf, me_mp161718) != 0) {
1339
reason("case 4: error: computed %s, expected %s\n", g_intbuf, me_mp161718);
1344
mp_clear(&a); mp_clear(&b); mp_clear(&m);
1348
/*------------------------------------------------------------------------*/
1350
int test_exptmod_d(void)
1354
mp_init(&a); mp_init(&m);
1355
mp_read_radix(&a, mp5, 16); mp_read_radix(&m, mp7, 16);
1357
IFOK( mp_exptmod_d(&a, md4, &m, &a) );
1358
mp_toradix(&a, g_intbuf, 16);
1359
mp_clear(&a); mp_clear(&m);
1361
if(strcmp(g_intbuf, me_mp5d47) != 0) {
1362
reason("error: computed %s, expected %s\n", g_intbuf, me_mp5d47);
1369
/*------------------------------------------------------------------------*/
1371
int test_invmod(void)
1374
mp_int p1, p2, p3, p4, p5;
1375
mp_int t1, t2, t3, t4;
1378
/* 5 128-bit primes. */
1379
static const char ivp1[] = { "AAD8A5A2A2BEF644BAEE7DB0CA643719" };
1380
static const char ivp2[] = { "CB371AD2B79A90BCC88D0430663E40B9" };
1381
static const char ivp3[] = { "C6C818D4DF2618406CA09280C0400099" };
1382
static const char ivp4[] = { "CE949C04512E68918006B1F0D7E93F27" };
1383
static const char ivp5[] = { "F8EE999B6416645040687440E0B89F51" };
1385
mp_init(&a); mp_init(&m);
1386
mp_read_radix(&a, mp2, 16); mp_read_radix(&m, mp7, 16);
1388
IFOK( mp_invmod(&a, &m, &a) );
1390
mp_toradix(&a, g_intbuf, 16);
1391
mp_clear(&a); mp_clear(&m);
1393
if(strcmp(g_intbuf, i_mp27) != 0) {
1394
reason("error: invmod test 1 computed %s, expected %s\n", g_intbuf, i_mp27);
1398
mp_init(&a); mp_init(&m);
1399
mp_read_radix(&a, mp20, 16); mp_read_radix(&m, mp19, 16);
1401
IFOK( mp_invmod(&a, &m, &a) );
1403
mp_toradix(&a, g_intbuf, 16);
1404
mp_clear(&a); mp_clear(&m);
1406
if(strcmp(g_intbuf, i_mp2019) != 0) {
1407
reason("error: invmod test 2 computed %s, expected %s\n", g_intbuf, i_mp2019);
1411
/* Need the following test cases:
1413
- a is odd, relatively prime to m
1414
- a is odd, not relatively prime to m
1415
- a is even, relatively prime to m
1416
- a is even, not relatively prime to m
1418
- a is even (should fail)
1419
- a is odd, not relatively prime to m
1420
- a is odd, relatively prime to m,
1421
m is not a power of 2
1422
- m has factor 2**k, k < 32
1423
- m has factor 2**k, k > 32
1424
m is a power of 2, 2**k
1429
mp_init(&a); mp_init(&m); mp_init(&c);
1430
mp_init(&p1); mp_init(&p2); mp_init(&p3); mp_init(&p4); mp_init(&p5);
1431
mp_init(&t1); mp_init(&t2); mp_init(&t3); mp_init(&t4);
1433
mp_read_radix(&p1, ivp1, 16);
1434
mp_read_radix(&p2, ivp2, 16);
1435
mp_read_radix(&p3, ivp3, 16);
1436
mp_read_radix(&p4, ivp4, 16);
1437
mp_read_radix(&p5, ivp5, 16);
1439
IFOK( mp_2expt(&t2, 68) ); /* t2 = 2**68 */
1440
IFOK( mp_2expt(&t3, 128) ); /* t3 = 2**128 */
1441
IFOK( mp_2expt(&t4, 31) ); /* t4 = 2**31 */
1443
/* test 3: Odd modulus - a is odd, relatively prime to m */
1445
IFOK( mp_mul(&p1, &p2, &a) );
1446
IFOK( mp_mul(&p3, &p4, &m) );
1447
IFOK( mp_invmod(&a, &m, &t1) );
1448
IFOK( mp_invmod_xgcd(&a, &m, &c) );
1450
if (mp_cmp(&t1, &c) != 0) {
1451
mp_toradix(&t1, g_intbuf, 16);
1452
mp_toradix(&c, a_intbuf, 16);
1453
reason("error: invmod test 3 computed %s, expected %s\n",
1454
g_intbuf, a_intbuf);
1457
mp_clear(&a); mp_clear(&t1); mp_clear(&c);
1458
mp_init(&a); mp_init(&t1); mp_init(&c);
1460
/* test 4: Odd modulus - a is odd, NOT relatively prime to m */
1462
IFOK( mp_mul(&p1, &p3, &a) );
1463
/* reuse same m as before */
1465
res = mp_invmod_xgcd(&a, &m, &c);
1466
if (res != MP_UNDEF)
1469
res = mp_invmod(&a, &m, &t1); /* we expect this to fail. */
1470
if (res != MP_UNDEF) {
1472
reason("error: invmod test 4 succeeded, should have failed.\n");
1475
mp_clear(&a); mp_clear(&t1); mp_clear(&c);
1476
mp_init(&a); mp_init(&t1); mp_init(&c);
1478
/* test 5: Odd modulus - a is even, relatively prime to m */
1480
IFOK( mp_mul(&p1, &t2, &a) );
1482
IFOK( mp_invmod(&a, &m, &t1) );
1483
IFOK( mp_invmod_xgcd(&a, &m, &c) );
1485
if (mp_cmp(&t1, &c) != 0) {
1486
mp_toradix(&t1, g_intbuf, 16);
1487
mp_toradix(&c, a_intbuf, 16);
1488
reason("error: invmod test 5 computed %s, expected %s\n",
1489
g_intbuf, a_intbuf);
1492
mp_clear(&a); mp_clear(&t1); mp_clear(&c);
1493
mp_init(&a); mp_init(&t1); mp_init(&c);
1495
/* test 6: Odd modulus - a is odd, NOT relatively prime to m */
1498
IFOK( mp_mul(&t2, &p3, &a) );
1499
/* reuse same m as before */
1501
res = mp_invmod_xgcd(&a, &m, &c);
1502
if (res != MP_UNDEF)
1505
res = mp_invmod(&a, &m, &t1); /* we expect this to fail. */
1506
if (res != MP_UNDEF) {
1508
reason("error: invmod test 6 succeeded, should have failed.\n");
1511
mp_clear(&a); mp_clear(&m); mp_clear(&c); mp_clear(&t1);
1512
mp_init(&a); mp_init(&m); mp_init(&c); mp_init(&t1);
1514
/* test 7: Even modulus, even a, should fail */
1516
IFOK( mp_mul(&p3, &t3, &m) ); /* even m */
1518
IFOK( mp_mul(&p1, &t2, &a) ); /* even a */
1520
res = mp_invmod_xgcd(&a, &m, &c);
1521
if (res != MP_UNDEF)
1524
res = mp_invmod(&a, &m, &t1); /* we expect this to fail. */
1525
if (res != MP_UNDEF) {
1527
reason("error: invmod test 7 succeeded, should have failed.\n");
1530
mp_clear(&a); mp_clear(&c); mp_clear(&t1);
1531
mp_init(&a); mp_init(&c); mp_init(&t1);
1533
/* test 8: Even modulus - a is odd, not relatively prime to m */
1536
IFOK( mp_mul(&p3, &p1, &a) ); /* even a */
1538
res = mp_invmod_xgcd(&a, &m, &c);
1539
if (res != MP_UNDEF)
1542
res = mp_invmod(&a, &m, &t1); /* we expect this to fail. */
1543
if (res != MP_UNDEF) {
1545
reason("error: invmod test 8 succeeded, should have failed.\n");
1548
mp_clear(&a); mp_clear(&m); mp_clear(&c); mp_clear(&t1);
1549
mp_init(&a); mp_init(&m); mp_init(&c); mp_init(&t1);
1551
/* test 9: Even modulus - m has factor 2**k, k < 32
1552
* - a is odd, relatively prime to m,
1554
IFOK( mp_mul(&p3, &t4, &m) ); /* even m */
1555
IFOK( mp_mul(&p1, &p2, &a) );
1556
IFOK( mp_invmod(&a, &m, &t1) );
1557
IFOK( mp_invmod_xgcd(&a, &m, &c) );
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 9 computed %s, expected %s\n",
1563
g_intbuf, a_intbuf);
1566
mp_clear(&m); mp_clear(&t1); mp_clear(&c);
1567
mp_init(&m); mp_init(&t1); mp_init(&c);
1569
/* test 10: Even modulus - m has factor 2**k, k > 32
1570
* - a is odd, relatively prime to m,
1572
IFOK( mp_mul(&p3, &t3, &m) ); /* even m */
1574
IFOK( mp_invmod(&a, &m, &t1) );
1575
IFOK( mp_invmod_xgcd(&a, &m, &c) );
1577
if (mp_cmp(&t1, &c) != 0) {
1578
mp_toradix(&t1, g_intbuf, 16);
1579
mp_toradix(&c, a_intbuf, 16);
1580
reason("error: invmod test 10 computed %s, expected %s\n",
1581
g_intbuf, a_intbuf);
1584
mp_clear(&t1); mp_clear(&c);
1585
mp_init(&t1); mp_init(&c);
1587
/* test 11: Even modulus - m is a power of 2, 2**k | k < 32
1588
* - a is odd, relatively prime to m,
1590
IFOK( mp_invmod(&a, &t4, &t1) );
1591
IFOK( mp_invmod_xgcd(&a, &t4, &c) );
1593
if (mp_cmp(&t1, &c) != 0) {
1594
mp_toradix(&t1, g_intbuf, 16);
1595
mp_toradix(&c, a_intbuf, 16);
1596
reason("error: invmod test 11 computed %s, expected %s\n",
1597
g_intbuf, a_intbuf);
1600
mp_clear(&t1); mp_clear(&c);
1601
mp_init(&t1); mp_init(&c);
1603
/* test 12: Even modulus - m is a power of 2, 2**k | k > 32
1604
* - a is odd, relatively prime to m,
1606
IFOK( mp_invmod(&a, &t3, &t1) );
1607
IFOK( mp_invmod_xgcd(&a, &t3, &c) );
1609
if (mp_cmp(&t1, &c) != 0) {
1610
mp_toradix(&t1, g_intbuf, 16);
1611
mp_toradix(&c, a_intbuf, 16);
1612
reason("error: invmod test 12 computed %s, expected %s\n",
1613
g_intbuf, a_intbuf);
1617
mp_clear(&a); mp_clear(&m); mp_clear(&c);
1618
mp_clear(&t1); mp_clear(&t2); mp_clear(&t3); mp_clear(&t4);
1619
mp_clear(&p1); mp_clear(&p2); mp_clear(&p3); mp_clear(&p4); mp_clear(&p5);
1624
/*------------------------------------------------------------------------*/
1626
int test_cmp_d(void)
1630
mp_init(&a); mp_read_radix(&a, mp8, 16);
1632
if(mp_cmp_d(&a, md8) >= 0) {
1633
reason("error: %s >= " DIGIT_FMT "\n", mp8, md8);
1638
mp_read_radix(&a, mp5, 16);
1640
if(mp_cmp_d(&a, md8) <= 0) {
1641
reason("error: %s <= " DIGIT_FMT "\n", mp5, md8);
1646
mp_read_radix(&a, mp6, 16);
1648
if(mp_cmp_d(&a, md1) != 0) {
1649
reason("error: %s != " DIGIT_FMT "\n", mp6, md1);
1659
/*------------------------------------------------------------------------*/
1661
int test_cmp_z(void)
1665
mp_init(&a); mp_read_radix(&a, mp6, 16);
1667
if(mp_cmp_z(&a) != 0) {
1668
reason("error: someone thinks a zero value is non-zero\n");
1673
mp_read_radix(&a, mp1, 16);
1675
if(mp_cmp_z(&a) <= 0) {
1676
reason("error: someone thinks a positive value is non-positive\n");
1681
mp_read_radix(&a, mp4, 16);
1683
if(mp_cmp_z(&a) >= 0) {
1684
reason("error: someone thinks a negative value is non-negative\n");
1693
/*------------------------------------------------------------------------*/
1699
mp_init(&a); mp_init(&b);
1700
mp_read_radix(&a, mp3, 16); mp_read_radix(&b, mp4, 16);
1702
if(mp_cmp(&a, &b) <= 0) {
1703
reason("error: %s <= %s\n", mp3, mp4);
1704
mp_clear(&a); mp_clear(&b);
1708
mp_read_radix(&b, mp3, 16);
1709
if(mp_cmp(&a, &b) != 0) {
1710
reason("error: %s != %s\n", mp3, mp3);
1711
mp_clear(&a); mp_clear(&b);
1715
mp_read_radix(&a, mp5, 16);
1716
if(mp_cmp(&a, &b) >= 0) {
1717
reason("error: %s >= %s\n", mp5, mp3);
1718
mp_clear(&a); mp_clear(&b);
1722
mp_read_radix(&a, mp5a, 16);
1723
if(mp_cmp_int(&a, 1000000) >= 0 ||
1724
(mp_cmp_int(&a, -5000000) <= 0) ||
1725
(mp_cmp_int(&a, -4938110) != 0)) {
1726
reason("error: long integer comparison failed (%s)", mp5a);
1727
mp_clear(&a); mp_clear(&b);
1731
mp_clear(&a); mp_clear(&b);
1735
/*------------------------------------------------------------------------*/
1737
int test_cmp_mag(void)
1741
mp_init(&a); mp_init(&b);
1742
mp_read_radix(&a, mp5, 16); mp_read_radix(&b, mp4, 16);
1744
if(mp_cmp_mag(&a, &b) >= 0) {
1745
reason("error: %s >= %s\n", mp5, mp4);
1746
mp_clear(&a); mp_clear(&b);
1750
mp_read_radix(&b, mp5, 16);
1751
if(mp_cmp_mag(&a, &b) != 0) {
1752
reason("error: %s != %s\n", mp5, mp5);
1753
mp_clear(&a); mp_clear(&b);
1757
mp_read_radix(&a, mp1, 16);
1758
if(mp_cmp_mag(&b, &a) >= 0) {
1759
reason("error: %s >= %s\n", mp5, mp1);
1760
mp_clear(&a); mp_clear(&b);
1764
mp_clear(&a); mp_clear(&b);
1769
/*------------------------------------------------------------------------*/
1771
int test_parity(void)
1775
mp_init(&a); mp_read_radix(&a, mp1, 16);
1778
reason("error: expected operand to be odd, but it isn't\n");
1783
mp_read_radix(&a, mp6, 16);
1785
if(!mp_iseven(&a)) {
1786
reason("error: expected operand to be even, but it isn't\n");
1795
/*------------------------------------------------------------------------*/
1802
mp_init(&a); mp_init(&b);
1803
mp_read_radix(&a, mp7, 16); mp_read_radix(&b, mp1, 16);
1806
mp_toradix(&a, g_intbuf, 16);
1808
if(strcmp(g_intbuf, g_mp71) != 0) {
1809
reason("error: computed %s, expected %s\n", g_intbuf, g_mp71);
1813
mp_clear(&a); mp_clear(&b);
1818
/*------------------------------------------------------------------------*/
1825
mp_init(&a); mp_init(&b);
1826
mp_read_radix(&a, mp10, 16); mp_read_radix(&b, mp11, 16);
1829
mp_toradix(&a, g_intbuf, 16);
1831
if(strcmp(g_intbuf, l_mp1011) != 0) {
1832
reason("error: computed %s, expected%s\n", g_intbuf, l_mp1011);
1836
mp_clear(&a); mp_clear(&b);
1842
/*------------------------------------------------------------------------*/
1844
int test_convert(void)
1849
mp_init(&a); mp_read_radix(&a, mp9, 16);
1851
for(ix = LOW_RADIX; ix <= HIGH_RADIX; ix++) {
1852
mp_toradix(&a, g_intbuf, ix);
1854
if(strcmp(g_intbuf, v_mp9[ix - LOW_RADIX]) != 0) {
1855
reason("error: radix %d, computed %s, expected %s\n",
1856
ix, g_intbuf, v_mp9[ix - LOW_RADIX]);
1866
/*------------------------------------------------------------------------*/
1874
mp_init(&a); mp_read_radix(&a, mp4, 16);
1876
len = mp_raw_size(&a);
1877
if(len != sizeof(b_mp4)) {
1878
reason("error: test_raw: expected length %d, computed %d\n", sizeof(b_mp4),
1884
buf = calloc(len, sizeof(char));
1887
if(memcmp(buf, b_mp4, sizeof(b_mp4)) != 0) {
1888
reason("error: test_raw: binary output does not match test vector\n");
1899
/*------------------------------------------------------------------------*/
1901
int test_pprime(void)
1908
mp_read_radix(&p, mp7, 16);
1910
if(mpp_pprime(&p, 5) != MP_YES) {
1911
reason("error: %s failed Rabin-Miller test, but is prime\n", mp7);
1915
IFOK( mp_set_int(&p, 9) );
1916
res = mpp_pprime(&p, 50);
1917
if (res == MP_YES) {
1918
reason("error: 9 is composite but passed Rabin-Miller test\n");
1920
} else if (res != MP_NO) {
1921
reason("test mpp_pprime(9, 50) failed: error %d\n", res);
1925
IFOK( mp_set_int(&p, 15) );
1926
res = mpp_pprime(&p, 50);
1927
if (res == MP_YES) {
1928
reason("error: 15 is composite but passed Rabin-Miller test\n");
1930
} else if (res != MP_NO) {
1931
reason("test mpp_pprime(15, 50) failed: error %d\n", res);
1941
/*------------------------------------------------------------------------*/
1943
int test_fermat(void)
1950
mp_read_radix(&p, mp7, 16);
1952
if((res = mpp_fermat(&p, 2)) != MP_YES) {
1953
reason("error: %s failed Fermat test on 2: %s\n", mp7,
1958
if((res = mpp_fermat(&p, 3)) != MP_YES) {
1959
reason("error: %s failed Fermat test on 3: %s\n", mp7,
1970
/*------------------------------------------------------------------------*/
1971
/* Like fprintf(), but only if we are behaving in a verbose manner */
1973
void reason(char *fmt, ...)
1981
vfprintf(stderr, fmt, ap);
1985
/*------------------------------------------------------------------------*/
1986
/* HERE THERE BE DRAGONS */