mpi-test.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:53k
源码类别:

CA认证

开发平台:

WINDOWS

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