security/nss/lib/freebl/mpi/mpi-test.c

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     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/. */
    13 #include <stdio.h>
    14 #include <stdlib.h>
    15 #include <string.h>
    16 #include <stdarg.h>
    17 #include <limits.h>
    18 #include <time.h>
    20 #include "mpi.h"
    21 #include "mpprime.h"
    23 #include "test-info.c"
    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
    36 /*
    37   Test vectors
    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).
    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";
   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;
   115 /* 
   116    Solutions of the form x_mpABC, where:
   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
   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  */
   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";
   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";
   198 const char *ms_mp345 = "1E71E292";
   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";
   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";
   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";
   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";
   268 const char *e_mpc2d3 = "100000000000000000000000000000000";
   270 const char *t_mp9    = "FB9B6E32FF0452A34746";
   271 const char *i_mp27   = "B6AD8DCCDAF92B6FE57D062FFEE3A99";
   272 const char *i_mp2019 = 
   273 "BDF3D88DC373A63EED92903115B03FC8501910AF68297B4C41870AED3EA9F839";
   274 /* "15E3FE09E8AE5523AABA197BD2D16318D3CA148EDF4AE1C1C52FC96AFAF5680B"; */
   277 const char *t_mp15 =
   278 "795853094E59B0008093BCA8DECF68587C64BDCA2F3F7F8963DABC12F1CFFFA9B8C4"
   279 "365232FD4751870A0EF6CA619287C5D8B7F1747D95076AB19645EF309773E9EACEA0"
   280 "975FA4AE16251A8DA5865349C3A903E3B8A2C0DEA3C0720B6020C7FED69AFF62BB72"
   281 "10FAC443F9FFA2950776F949E819260C2AF8D94E8A1431A40F8C23C1973DE5D49AA2"
   282 "0B3FF5DA5C1D5324E712A78FF33A9B1748F83FA529905924A31DF38643B3F693EF9B"
   283 "58D846BB1AEAE4523ECC843FF551C1B300A130B65C1677402778F98C51C10813250E"
   284 "2496882877B069E877B59740DC1226F18A5C0F66F64A5F59A9FAFC5E9FC45AEC0E7A"
   285 "BEE244F7DD3AC268CF512A0E52E4F5BE5B94";
   287 const char *g_mp71   = "1";
   288 const char *g_mp25   = "7";
   289 const char *l_mp1011 = "C589E3D7D64A6942A000";
   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 };
   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 };
   369 /* Search for a test suite name in the names table  */
   370 int  find_name(char *name);
   371 void reason(char *fmt, ...);
   373 /*------------------------------------------------------------------------*/
   374 /*------------------------------------------------------------------------*/
   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;
   381 #define IFOK(x) { if (MP_OKAY > (res = (x))) { \
   382   reason("test %s failed: error %d\n", #x, res); return 1; }}
   384 int main(int argc, char *argv[])
   385 {
   386   int which, res;
   388   srand((unsigned int)time(NULL));
   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   }
   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   }
   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   }
   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   }
   427 }
   429 /*------------------------------------------------------------------------*/
   431 int find_name(char *name)
   432 {
   433   int ix = 0;
   435   while(ix < g_count) {
   436     if (strcmp(name, g_names[ix]) == 0)
   437       return ix;
   439     ++ix;
   440   }
   442   return -1;
   443 }
   445 /*------------------------------------------------------------------------*/
   447 int test_list(void)
   448 {
   449   int ix;
   451   fprintf(stderr, "There are currently %d test suites available\n",
   452 	  g_count);
   454   for(ix = 1; ix < g_count; ix++)
   455     fprintf(stdout, "%-20s %s\n", g_names[ix], g_descs[ix]);
   457   return 0;
   458 }
   460 /*------------------------------------------------------------------------*/
   462 int test_copy(void)
   463 {
   464   mp_int  a, b;
   465   int     ix;
   467   mp_init(&a); mp_init(&b);
   469   mp_read_radix(&a, mp3, 16);
   470   mp_copy(&a, &b);
   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   }
   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   }
   493   mp_clear(&a); mp_clear(&b);
   494   return 0;
   495 }
   497 /*------------------------------------------------------------------------*/
   499 int test_exch(void)
   500 {
   501   mp_int  a, b;
   503   mp_init(&a); mp_init(&b);
   504   mp_read_radix(&a, mp7, 16); mp_read_radix(&b, mp1, 16);
   506   mp_exch(&a, &b);
   507   mp_toradix(&a, g_intbuf, 16);
   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   }
   516   mp_toradix(&b, g_intbuf, 16);
   518   mp_clear(&b);
   519   if(strcmp(g_intbuf, mp7) != 0) {
   520     reason("error: exchange failed\n");
   521     return 1;
   522   }
   524   return 0;
   525 }
   527 /*------------------------------------------------------------------------*/
   529 int test_zero(void)
   530 {
   531   mp_int   a;
   533   mp_init(&a); mp_read_radix(&a, mp7, 16);
   534   mp_zero(&a);
   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   }
   543   mp_clear(&a);
   544   return 0;
   545 }
   547 /*------------------------------------------------------------------------*/
   549 int test_set(void)
   550 {
   551   mp_int   a;
   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   }
   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   }
   571   return 0;
   572 }
   574 /*------------------------------------------------------------------------*/
   576 int test_abs(void)
   577 {
   578   mp_int  a;
   580   mp_init(&a); mp_read_radix(&a, mp4, 16);
   581   mp_abs(&a, &a);
   583   if(SIGN(&a) != ZPOS) {
   584     reason("error: sign of result is negative\n");
   585     mp_clear(&a);
   586     return 1;
   587   }
   589   mp_clear(&a);
   590   return 0;
   591 }
   593 /*------------------------------------------------------------------------*/
   595 int test_neg(void)
   596 {
   597   mp_int  a;
   598   mp_sign s;
   600   mp_init(&a); mp_read_radix(&a, mp4, 16);
   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   }
   610   mp_clear(&a);
   611   return 0;
   612 }
   614 /*------------------------------------------------------------------------*/
   616 int test_add_d(void)
   617 {
   618   mp_int  a;
   620   mp_init(&a);
   622   mp_read_radix(&a, mp5, 16);
   623   mp_add_d(&a, md4, &a);
   624   mp_toradix(&a, g_intbuf, 16);
   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   }
   632   mp_read_radix(&a, mp2, 16);
   633   mp_add_d(&a, md5, &a);
   634   mp_toradix(&a, g_intbuf, 16);
   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   }
   642   mp_clear(&a);
   643   return 0;
   644 }
   646 /*------------------------------------------------------------------------*/
   648 int test_add(void)
   649 {
   650   mp_int  a, b;
   651   int     res = 0;
   653   mp_init(&a); mp_init(&b);
   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);
   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   }
   664   mp_read_radix(&a, mp4, 16);
   665   mp_add(&a, &b, &a);
   666   mp_toradix(&a, g_intbuf, 16);
   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   }
   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);
   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   }
   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);
   686   if(strcmp(g_intbuf, s_mp1415) != 0) {
   687     reason("error: computed %s, expected %s\n", g_intbuf, s_mp1415);
   688     res = 1;
   689   }
   691  CLEANUP:
   692   mp_clear(&a); mp_clear(&b);
   693   return res;
   694 }
   696 /*------------------------------------------------------------------------*/
   698 int test_sub_d(void)
   699 {
   700   mp_int   a;
   702   mp_init(&a);
   703   mp_read_radix(&a, mp5, 16);
   705   mp_sub_d(&a, md4, &a);
   706   mp_toradix(&a, g_intbuf, 16);
   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   }
   714   mp_read_radix(&a, mp6, 16);
   716   mp_sub_d(&a, md2, &a);
   717   mp_toradix(&a, g_intbuf, 16);
   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   }
   725   return 0;
   726 }
   728 /*------------------------------------------------------------------------*/
   730 int test_sub(void)
   731 {
   732   mp_int  a, b;
   734   mp_init(&a); mp_init(&b);
   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);
   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   }
   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);
   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   }
   756   mp_clear(&a); mp_clear(&b);
   757   return 0;
   758 }
   760 /*------------------------------------------------------------------------*/
   762 int test_mul_d(void)
   763 {
   764   mp_int   a;
   766   mp_init(&a);
   767   mp_read_radix(&a, mp1, 16);
   769   IFOK( mp_mul_d(&a, md4, &a) );
   770   mp_toradix(&a, g_intbuf, 16);
   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   }
   778   mp_read_radix(&a, mp8, 16);
   779   IFOK( mp_mul_d(&a, md6, &a) );
   780   mp_toradix(&a, g_intbuf, 16);
   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   }
   788   return 0;
   789 }
   791 /*------------------------------------------------------------------------*/
   793 int test_mul(void)
   794 {
   795   mp_int   a, b;
   796   int      res = 0;
   798   mp_init(&a); mp_init(&b);
   799   mp_read_radix(&a, mp1, 16); mp_read_radix(&b, mp2, 16);
   801   IFOK( mp_mul(&a, &b, &a) );
   802   mp_toradix(&a, g_intbuf, 16);
   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   }
   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);
   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   }
   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);
   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   }
   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);
   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   }
   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);
   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);
   846   IFOK( mp_mul(&a, &b, &a) );
   847   mp_toradix(&a, g_intbuf, 10);
   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   }
   854  CLEANUP:
   855   mp_clear(&a); mp_clear(&b);
   856   return res;
   858 }
   860 /*------------------------------------------------------------------------*/
   862 int test_sqr(void)
   863 {
   864   mp_int  a;
   866   mp_init(&a); mp_read_radix(&a, mp2, 16);
   868   mp_sqr(&a, &a);
   869   mp_toradix(&a, g_intbuf, 16);
   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   }
   877   return 0;
   878 }
   880 /*------------------------------------------------------------------------*/
   882 int test_div_d(void)
   883 {
   884   mp_int    a, q;
   885   mp_digit  r;
   886   int       err = 0;
   888   mp_init(&a); mp_init(&q);
   889   mp_read_radix(&a, mp3, 16);
   891   IFOK( mp_div_d(&a, md6, &q, &r) );
   892   mp_toradix(&q, g_intbuf, 16);
   894   if(strcmp(g_intbuf, q_mp3d6) != 0) {
   895     reason("error: computed q = %s, expected %s\n", g_intbuf, q_mp3d6);
   896     ++err;
   897   }
   899   sprintf(g_intbuf, ZS_DIGIT_FMT, r);
   901   if(strcmp(g_intbuf, r_mp3d6) != 0) {
   902     reason("error: computed r = %s, expected %s\n", g_intbuf, r_mp3d6);
   903     ++err;
   904   }
   906   mp_read_radix(&a, mp9, 16);
   907   IFOK( mp_div_d(&a, 16, &q, &r) );
   908   mp_toradix(&q, g_intbuf, 16);
   910   if(strcmp(g_intbuf, q_mp9c16) != 0) {
   911     reason("error: computed q = %s, expected %s\n", g_intbuf, q_mp9c16);
   912     ++err;
   913   }
   915   sprintf(g_intbuf, ZS_DIGIT_FMT, r);
   917   if(strcmp(g_intbuf, r_mp9c16) != 0) {
   918     reason("error: computed r = %s, expected %s\n", g_intbuf, r_mp9c16);
   919     ++err;
   920   }
   922   mp_clear(&a); mp_clear(&q);
   923   return err;
   924 }
   926 /*------------------------------------------------------------------------*/
   928 int test_div_2(void)
   929 {
   930   mp_int  a;
   932   mp_init(&a); mp_read_radix(&a, mp7, 16);
   933   IFOK( mp_div_2(&a, &a) );
   934   mp_toradix(&a, g_intbuf, 16);
   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   }
   942   return 0;
   943 }
   945 /*------------------------------------------------------------------------*/
   947 int test_div_2d(void)
   948 {
   949   mp_int  a, q, r;
   951   mp_init(&q); mp_init(&r);
   952   mp_init(&a); mp_read_radix(&a, mp13, 16);
   954   IFOK( mp_div_2d(&a, 64, &q, &r) );
   955   mp_clear(&a);
   957   mp_toradix(&q, g_intbuf, 16);
   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   }
   965   mp_clear(&q);
   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   }
   974   mp_clear(&r);
   976   return 0;
   977 }
   979 /*------------------------------------------------------------------------*/
   981 int test_div(void)
   982 {
   983   mp_int  a, b, r;
   984   int     err = 0;
   986   mp_init(&a); mp_init(&b); mp_init(&r);
   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);
   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   }
   997   mp_toradix(&r, g_intbuf, 16);
   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;
  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);
  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;
  1013   mp_toradix(&r, g_intbuf, 16);
  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;
  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);
  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;
  1029   mp_toradix(&r, g_intbuf, 16);
  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;
  1036   mp_clear(&a); mp_clear(&b); mp_clear(&r);
  1038   return err;
  1041 /*------------------------------------------------------------------------*/
  1043 int test_expt_d(void)
  1045   mp_int   a;
  1047   mp_init(&a); mp_read_radix(&a, mp5, 16);
  1048   mp_expt_d(&a, md9, &a);
  1049   mp_toradix(&a, g_intbuf, 16);
  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;
  1057   return 0;
  1060 /*------------------------------------------------------------------------*/
  1062 int test_expt(void)
  1064   mp_int   a, b;
  1066   mp_init(&a); mp_init(&b);
  1067   mp_read_radix(&a, mp7, 16); mp_read_radix(&b, mp8, 16);
  1069   mp_expt(&a, &b, &a);
  1070   mp_toradix(&a, g_intbuf, 16);
  1071   mp_clear(&a); mp_clear(&b);
  1073   if(strcmp(g_intbuf, e_mp78) != 0) {
  1074     reason("error: computed %s, expected %s\n", g_intbuf, e_mp78);
  1075     return 1;
  1078   return 0;
  1081 /*------------------------------------------------------------------------*/
  1083 int test_2expt(void)
  1085   mp_int   a;
  1087   mp_init(&a);
  1088   mp_2expt(&a, md3);
  1089   mp_toradix(&a, g_intbuf, 16);
  1090   mp_clear(&a);
  1092   if(strcmp(g_intbuf, e_mpc2d3) != 0) {
  1093     reason("error: computed %s, expected %s\n", g_intbuf, e_mpc2d3);
  1094     return 1;
  1097   return 0;
  1100 /*------------------------------------------------------------------------*/
  1102 int test_sqrt(void)
  1104   mp_int  a;
  1105   int     res = 0;
  1107   mp_init(&a); mp_read_radix(&a, mp9, 16);
  1108   mp_sqrt(&a, &a);
  1109   mp_toradix(&a, g_intbuf, 16);
  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;
  1116   mp_read_radix(&a, mp15, 16);
  1117   mp_sqrt(&a, &a);
  1118   mp_toradix(&a, g_intbuf, 16);
  1120   if(strcmp(g_intbuf, t_mp15) != 0) {
  1121     reason("error: computed %s, expected %s\n", g_intbuf, t_mp15);
  1122     res = 1;
  1125  CLEANUP:
  1126   mp_clear(&a);
  1127   return res;
  1130 /*------------------------------------------------------------------------*/
  1132 int test_mod_d(void)
  1134   mp_int     a;
  1135   mp_digit   r;
  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);
  1142   if(strcmp(g_intbuf, r_mp5d5) != 0) {
  1143     reason("error: computed %s, expected %s\n", g_intbuf, r_mp5d5);
  1144     return 1;
  1147   return 0;
  1150 /*------------------------------------------------------------------------*/
  1152 int test_mod(void)
  1154   mp_int  a, m;
  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);
  1162   if(strcmp(g_intbuf, r_mp47) != 0) {
  1163     reason("error: computed %s, expected %s\n", g_intbuf, r_mp47);
  1164     return 1;
  1167   return 0;
  1170 /*------------------------------------------------------------------------*/
  1172 int test_addmod(void)
  1174   mp_int a, b, m;
  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);
  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);
  1184   if(strcmp(g_intbuf, ms_mp345) != 0) {
  1185     reason("error: computed %s, expected %s\n", g_intbuf, ms_mp345);
  1186     return 1;
  1189   return 0;
  1192 /*------------------------------------------------------------------------*/
  1194 int test_submod(void)
  1196   mp_int a, b, m;
  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);
  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);
  1206   if(strcmp(g_intbuf, md_mp345) != 0) {
  1207     reason("error: computed %s, expected %s\n", g_intbuf, md_mp345);
  1208     return 1;
  1211   return 0;
  1214 /*------------------------------------------------------------------------*/
  1216 int test_mulmod(void)
  1218   mp_int a, b, m;
  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);
  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);
  1228   if(strcmp(g_intbuf, mp_mp345) != 0) {
  1229     reason("error: computed %s, expected %s\n", g_intbuf, mp_mp345);
  1230     return 1;
  1233   return 0;
  1236 /*------------------------------------------------------------------------*/
  1238 int test_sqrmod(void)
  1240   mp_int a, m;
  1242   mp_init(&a); mp_init(&m);
  1243   mp_read_radix(&a, mp3, 16); mp_read_radix(&m, mp5, 16);
  1245   IFOK( mp_sqrmod(&a, &m, &a) );
  1246   mp_toradix(&a, g_intbuf, 16);
  1247   mp_clear(&a); mp_clear(&m);
  1249   if(strcmp(g_intbuf, mp_mp335) != 0) {
  1250     reason("error: computed %s, expected %s\n", g_intbuf, mp_mp335);
  1251     return 1;
  1254   return 0;
  1257 /*------------------------------------------------------------------------*/
  1259 int test_exptmod(void)
  1261   mp_int  a, b, m;
  1262   int     res = 0;
  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);
  1268   IFOK( mp_exptmod(&a, &b, &m, &a) );
  1269   mp_toradix(&a, g_intbuf, 16);
  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;
  1276   mp_read_radix(&a, mp1, 16); mp_read_radix(&b, mp5, 16);
  1277   mp_read_radix(&m, mp12, 16);
  1279   IFOK( mp_exptmod(&a, &b, &m, &a) );
  1280   mp_toradix(&a, g_intbuf, 16);
  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;
  1287   mp_read_radix(&a, mp5, 16); mp_read_radix(&b, mp1, 16);
  1288   mp_read_radix(&m, mp14, 16);
  1290   IFOK( mp_exptmod(&a, &b, &m, &a) );
  1291   mp_toradix(&a, g_intbuf, 16);
  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;
  1298   mp_read_radix(&a, mp16, 16); mp_read_radix(&b, mp17, 16);
  1299   mp_read_radix(&m, mp18, 16);
  1301   IFOK( mp_exptmod(&a, &b, &m, &a) );
  1302   mp_toradix(&a, g_intbuf, 16);
  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;
  1309  CLEANUP:
  1310   mp_clear(&a); mp_clear(&b); mp_clear(&m);
  1311   return res;
  1314 /*------------------------------------------------------------------------*/
  1316 int test_exptmod_d(void)
  1318   mp_int  a, m;
  1320   mp_init(&a); mp_init(&m);
  1321   mp_read_radix(&a, mp5, 16); mp_read_radix(&m, mp7, 16);
  1323   IFOK( mp_exptmod_d(&a, md4, &m, &a) );
  1324   mp_toradix(&a, g_intbuf, 16);
  1325   mp_clear(&a); mp_clear(&m);
  1327   if(strcmp(g_intbuf, me_mp5d47) != 0) {
  1328     reason("error: computed %s, expected %s\n", g_intbuf, me_mp5d47);
  1329     return 1;
  1332   return 0;
  1335 /*------------------------------------------------------------------------*/
  1337 int test_invmod(void)
  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;
  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" };
  1351   mp_init(&a); mp_init(&m);
  1352   mp_read_radix(&a, mp2, 16); mp_read_radix(&m, mp7, 16);
  1354   IFOK( mp_invmod(&a, &m, &a) );
  1356   mp_toradix(&a, g_intbuf, 16);
  1357   mp_clear(&a); mp_clear(&m);
  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;
  1364   mp_init(&a); mp_init(&m);
  1365   mp_read_radix(&a, mp20, 16); mp_read_radix(&m, mp19, 16);
  1367   IFOK( mp_invmod(&a, &m, &a) );
  1369   mp_toradix(&a, g_intbuf, 16);
  1370   mp_clear(&a); mp_clear(&m);
  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;
  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 */
  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); 
  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);
  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 */
  1409 /* test 3: Odd modulus - a is odd, relatively prime to m */
  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) );
  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;
  1423   mp_clear(&a);  mp_clear(&t1); mp_clear(&c);  
  1424   mp_init(&a);   mp_init(&t1);  mp_init(&c);   
  1426 /* test 4: Odd modulus - a is odd, NOT relatively prime to m */
  1428   IFOK( mp_mul(&p1, &p3, &a) );
  1429   /* reuse same m as before */
  1431   res = mp_invmod_xgcd(&a, &m, &c);
  1432   if (res != MP_UNDEF) 
  1433     goto CLEANUP4;
  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;
  1441   mp_clear(&a);  mp_clear(&t1); mp_clear(&c);  
  1442   mp_init(&a);   mp_init(&t1);  mp_init(&c);   
  1444 /* test 5: Odd modulus - a is even, relatively prime to m */
  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) );
  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;
  1458   mp_clear(&a);  mp_clear(&t1); mp_clear(&c);  
  1459   mp_init(&a);   mp_init(&t1);  mp_init(&c);   
  1461 /* test 6: Odd modulus - a is odd, NOT relatively prime to m */
  1463   /* reuse t2 */
  1464   IFOK( mp_mul(&t2, &p3, &a) );
  1465   /* reuse same m as before */
  1467   res = mp_invmod_xgcd(&a, &m, &c);
  1468   if (res != MP_UNDEF) 
  1469     goto CLEANUP6;
  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;
  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); 
  1480 /* test 7: Even modulus, even a, should fail */
  1482   IFOK( mp_mul(&p3, &t3, &m) ); /* even m */
  1483   /* reuse t2 */
  1484   IFOK( mp_mul(&p1, &t2, &a) ); /* even a */
  1486   res = mp_invmod_xgcd(&a, &m, &c);
  1487   if (res != MP_UNDEF) 
  1488     goto CLEANUP7;
  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;
  1496   mp_clear(&a);  mp_clear(&c);  mp_clear(&t1); 
  1497   mp_init(&a);   mp_init(&c);   mp_init(&t1); 
  1499 /* test 8: Even modulus    - a is odd,  not relatively prime to m */
  1501   /* reuse m */
  1502   IFOK( mp_mul(&p3, &p1, &a) ); /* even a */
  1504   res = mp_invmod_xgcd(&a, &m, &c);
  1505   if (res != MP_UNDEF) 
  1506     goto CLEANUP8;
  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;
  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); 
  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) );
  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;
  1532   mp_clear(&m);  mp_clear(&t1); mp_clear(&c);  
  1533   mp_init(&m);   mp_init(&t1);  mp_init(&c);   
  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) );
  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;
  1550   mp_clear(&t1); mp_clear(&c);  
  1551   mp_init(&t1);  mp_init(&c);   
  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) );
  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;
  1566   mp_clear(&t1); mp_clear(&c);  
  1567   mp_init(&t1);  mp_init(&c);   
  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) );
  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;
  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); 
  1587   return 0;
  1590 /*------------------------------------------------------------------------*/
  1592 int test_cmp_d(void)
  1594   mp_int  a;
  1596   mp_init(&a); mp_read_radix(&a, mp8, 16);
  1598   if(mp_cmp_d(&a, md8) >= 0) {
  1599     reason("error: %s >= " DIGIT_FMT "\n", mp8, md8);
  1600     mp_clear(&a);
  1601     return 1;
  1604   mp_read_radix(&a, mp5, 16);
  1606   if(mp_cmp_d(&a, md8) <= 0) {
  1607     reason("error: %s <= " DIGIT_FMT "\n", mp5, md8);
  1608     mp_clear(&a);
  1609     return 1;
  1612   mp_read_radix(&a, mp6, 16);
  1614   if(mp_cmp_d(&a, md1) != 0) {
  1615     reason("error: %s != " DIGIT_FMT "\n", mp6, md1);
  1616     mp_clear(&a);
  1617     return 1;
  1620   mp_clear(&a);
  1621   return 0;
  1625 /*------------------------------------------------------------------------*/
  1627 int test_cmp_z(void)
  1629   mp_int  a;
  1631   mp_init(&a); mp_read_radix(&a, mp6, 16);
  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;
  1639   mp_read_radix(&a, mp1, 16);
  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;
  1647   mp_read_radix(&a, mp4, 16);
  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;
  1655   mp_clear(&a);
  1656   return 0;
  1659 /*------------------------------------------------------------------------*/
  1661 int test_cmp(void)
  1663   mp_int  a, b;
  1665   mp_init(&a); mp_init(&b);
  1666   mp_read_radix(&a, mp3, 16); mp_read_radix(&b, mp4, 16);
  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;
  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;
  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;
  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;
  1697   mp_clear(&a); mp_clear(&b);
  1698   return 0;
  1701 /*------------------------------------------------------------------------*/
  1703 int test_cmp_mag(void)
  1705   mp_int  a, b;
  1707   mp_init(&a); mp_init(&b);
  1708   mp_read_radix(&a, mp5, 16); mp_read_radix(&b, mp4, 16);
  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;
  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;
  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;
  1730   mp_clear(&a); mp_clear(&b);
  1731   return 0;
  1735 /*------------------------------------------------------------------------*/
  1737 int test_parity(void)
  1739   mp_int  a;
  1741   mp_init(&a); mp_read_radix(&a, mp1, 16);
  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;
  1749   mp_read_radix(&a, mp6, 16);
  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;
  1757   mp_clear(&a);
  1758   return 0;
  1761 /*------------------------------------------------------------------------*/
  1763 int test_gcd(void)
  1765   mp_int  a, b;
  1766   int     out = 0;
  1768   mp_init(&a); mp_init(&b);
  1769   mp_read_radix(&a, mp7, 16); mp_read_radix(&b, mp1, 16);
  1771   mp_gcd(&a, &b, &a);
  1772   mp_toradix(&a, g_intbuf, 16);
  1774   if(strcmp(g_intbuf, g_mp71) != 0) {
  1775     reason("error: computed %s, expected %s\n", g_intbuf, g_mp71);
  1776     out = 1;
  1779   mp_clear(&a); mp_clear(&b);
  1780   return out;
  1784 /*------------------------------------------------------------------------*/
  1786 int test_lcm(void)
  1788   mp_int  a, b;
  1789   int     out = 0;
  1791   mp_init(&a); mp_init(&b);
  1792   mp_read_radix(&a, mp10, 16); mp_read_radix(&b, mp11, 16);
  1794   mp_lcm(&a, &b, &a);
  1795   mp_toradix(&a, g_intbuf, 16);
  1797   if(strcmp(g_intbuf, l_mp1011) != 0) {
  1798     reason("error: computed %s, expected%s\n", g_intbuf, l_mp1011);
  1799     out = 1;
  1802   mp_clear(&a); mp_clear(&b);
  1804   return out;
  1808 /*------------------------------------------------------------------------*/
  1810 int test_convert(void)
  1812   int    ix;
  1813   mp_int a;
  1815   mp_init(&a); mp_read_radix(&a, mp9, 16);
  1817   for(ix = LOW_RADIX; ix <= HIGH_RADIX; ix++) {
  1818     mp_toradix(&a, g_intbuf, ix);
  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;
  1828   mp_clear(&a);
  1829   return 0;
  1832 /*------------------------------------------------------------------------*/
  1834 int test_raw(void)
  1836   int    len, out = 0;
  1837   mp_int a;
  1838   char   *buf;
  1840   mp_init(&a); mp_read_radix(&a, mp4, 16);
  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;
  1850   buf = calloc(len, sizeof(char));
  1851   mp_toraw(&a, buf);
  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;
  1858   free(buf);
  1859   mp_clear(&a);
  1861   return out;
  1865 /*------------------------------------------------------------------------*/
  1867 int test_pprime(void)
  1869   mp_int   p;
  1870   int      err = 0;
  1871   mp_err   res;
  1873   mp_init(&p);
  1874   mp_read_radix(&p, mp7, 16);
  1876   if(mpp_pprime(&p, 5) != MP_YES) {
  1877     reason("error: %s failed Rabin-Miller test, but is prime\n", mp7);
  1878     err = 1;
  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;
  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;
  1901   mp_clear(&p);
  1903   return err;
  1907 /*------------------------------------------------------------------------*/
  1909 int test_fermat(void)
  1911   mp_int p;
  1912   mp_err res;
  1913   int    err = 0;
  1915   mp_init(&p);
  1916   mp_read_radix(&p, mp7, 16);
  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;
  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;
  1930   mp_clear(&p);
  1932   return err;
  1936 /*------------------------------------------------------------------------*/
  1937 /* Like fprintf(), but only if we are behaving in a verbose manner        */
  1939 void reason(char *fmt, ...)
  1941   va_list    ap;
  1943   if(!g_verbose)
  1944     return;
  1946   va_start(ap, fmt);
  1947   vfprintf(stderr, fmt, ap);
  1948   va_end(ap);
  1951 /*------------------------------------------------------------------------*/
  1952 /* HERE THERE BE DRAGONS                                                  */

mercurial