1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/nss/lib/freebl/mpi/mpi-test.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,1952 @@ 1.4 +/* 1.5 + * mpi-test.c 1.6 + * 1.7 + * This is a general test suite for the MPI library, which tests 1.8 + * all the functions in the library with known values. The program 1.9 + * exits with a zero (successful) status if the tests pass, or a 1.10 + * nonzero status if the tests fail. 1.11 + * 1.12 + * This Source Code Form is subject to the terms of the Mozilla Public 1.13 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.14 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.15 + 1.16 +#include <stdio.h> 1.17 +#include <stdlib.h> 1.18 +#include <string.h> 1.19 +#include <stdarg.h> 1.20 +#include <limits.h> 1.21 +#include <time.h> 1.22 + 1.23 +#include "mpi.h" 1.24 +#include "mpprime.h" 1.25 + 1.26 +#include "test-info.c" 1.27 + 1.28 +/* ZS means Zero Suppressed (no leading zeros) */ 1.29 +#if MP_USE_LONG_DIGIT 1.30 +#define ZS_DIGIT_FMT "%lX" 1.31 +#elif MP_USE_LONG_LONG_DIGIT 1.32 +#define ZS_DIGIT_FMT "%llX" 1.33 +#elif MP_USE_UINT_DIGIT 1.34 +#define ZS_DIGIT_FMT "%X" 1.35 +#else 1.36 +#error "unknown type of digit" 1.37 +#endif 1.38 + 1.39 +/* 1.40 + Test vectors 1.41 + 1.42 + If you intend to change any of these values, you must also recompute 1.43 + the corresponding solutions below. Basically, these are just hex 1.44 + strings (for the big integers) or integer values (for the digits). 1.45 + 1.46 + The comparison tests think they know what relationships hold between 1.47 + these values. If you change that, you may have to adjust the code 1.48 + for the comparison tests accordingly. Most of the other tests 1.49 + should be fine as long as you re-compute the solutions, though. 1.50 + */ 1.51 +const char *mp1 = "639A868CDA0C569861B"; 1.52 +const char *mp2 = "AAFC0A3FE45E5E09DBE2C29"; 1.53 +const char *mp3 = "B55AA8DF8A7E83241F38AC7A9E479CAEF2E4D7C5"; 1.54 +const char *mp4 = "-63DBC2265B88268DC801C10EA68476B7BDE0090F"; 1.55 +const char *mp5 = "F595CB42"; 1.56 +const char *mp5a = "-4B597E"; 1.57 +const char *mp6 = "0"; 1.58 +const char *mp7 = "EBFA7121CD838CE6439CC59DDB4CBEF3"; 1.59 +const char *mp8 = "5"; 1.60 +const char *mp9 = "F74A2876A1432698923B0767DA19DCF3D71795EE"; 1.61 +const char *mp10 = "9184E72A000"; 1.62 +const char *mp11 = "54D79A3557E8"; 1.63 +const char *mp12 = "10000000000000000"; 1.64 +const char *mp13 = 1.65 +"34584F700C15A341E40BF7BFDD88A6630C8FF2B2067469372D391342BDAB6163963C" 1.66 +"D5A5C79F708BDE26E0CCF2DB66CD6D6089E29A877C45F2B050D226E6DA88"; 1.67 +const char *mp14 = 1.68 +"AC3FA0EABAAC45724814D798942A1E28E14C81E0DE8055CED630E7689DA648683645DB6E" 1.69 +"458D9F5338CC3D4E33A5D1C9BF42780133599E60DEE0049AFA8F9489501AE5C9AA2B8C13" 1.70 +"FD21285A538B2CA87A626BB56E0A654C8707535E637FF4E39174157402BDE3AA30C9F134" 1.71 +"0C1307BAA864B075A9CC828B6A5E2B2BF1AE406D920CC5E7657D7C0E697DEE5375773AF9" 1.72 +"E200A1B8FAD7CD141F9EE47ABB55511FEB9A4D99EBA22F3A3FF6792FA7EE9E5DC0EE94F7" 1.73 +"7A631EDF3D7DD7C2DAAAFDF234D60302AB63D5234CEAE941B9AF0ADDD9E6E3A940A94EE5" 1.74 +"5DB45A7C66E61EDD0477419BBEFA44C325129601C4F45671C6A0E64665DF341D17FBC71F" 1.75 +"77418BD9F4375DDB3B9D56126526D8E5E0F35A121FD4F347013DA880020A752324F31DDD" 1.76 +"9BCDB13A3B86E207A2DE086825E6EEB87B3A64232CFD8205B799BC018634AAE193F19531" 1.77 +"D6EBC19A75F27CFFAA03EB5974898F53FD569AA5CE60F431B53B0CDE715A5F382405C9C4" 1.78 +"761A8E24888328F09F7BCE4E8D80C957DF177629C8421ACCD0C268C63C0DD47C3C0D954F" 1.79 +"D79F7D7297C6788DF4B3E51381759864D880ACA246DF09533739B8BB6085EAF7AE8DC2D9" 1.80 +"F224E6874926C8D24D34B457FD2C9A586C6B99582DC24F787A39E3942786CF1D494B6EB4" 1.81 +"A513498CDA0B217C4E80BCE7DA1C704C35E071AC21E0DA9F57C27C3533F46A8D20B04137" 1.82 +"C1B1384BE4B2EB46"; 1.83 +const char *mp15 = 1.84 +"39849CF7FD65AF2E3C4D87FE5526221103D90BA26A6642FFE3C3ECC0887BBBC57E011BF1" 1.85 +"05D822A841653509C68F79EBE51C0099B8CBB04DEF31F36F5954208A3209AC122F0E11D8" 1.86 +"4AE67A494D78336A2066D394D42E27EF6B03DDAF6D69F5112C93E714D27C94F82FC7EF77" 1.87 +"445768C68EAE1C4A1407BE1B303243391D325090449764AE469CC53EC8012C4C02A72F37" 1.88 +"07ED7275D2CC8D0A14B5BCC6BF264941520EBA97E3E6BAE4EE8BC87EE0DDA1F5611A6ECB" 1.89 +"65F8AEF4F184E10CADBDFA5A2FEF828901D18C20785E5CC63473D638762DA80625003711" 1.90 +"9E984AC43E707915B133543AF9D5522C3E7180DC58E1E5381C1FB7DC6A5F4198F3E88FA6" 1.91 +"CBB6DFA8B2D1C763226B253E18BCCB79A29EE82D2DE735078C8AE3C3C86D476AAA08434C" 1.92 +"09C274BDD40A1D8FDE38D6536C22F44E807EB73DE4FB36C9F51E0BC835DDBE3A8EFCF2FE" 1.93 +"672B525769DC39230EE624D5EEDBD837C82A52E153F37378C3AD68A81A7ADBDF3345DBCE" 1.94 +"8FA18CA1DE618EF94DF72EAD928D4F45B9E51632ACF158CF8332C51891D1D12C2A7E6684" 1.95 +"360C4BF177C952579A9F442CFFEC8DAE4821A8E7A31C4861D8464CA9116C60866C5E72F7" 1.96 +"434ADBED36D54ACDFDFF70A4EFB46E285131FE725F1C637D1C62115EDAD01C4189716327" 1.97 +"BFAA79618B1656CBFA22C2C965687D0381CC2FE0245913C4D8D96108213680BD8E93E821" 1.98 +"822AD9DDBFE4BD04"; 1.99 +const char *mp16 = "4A724340668DB150339A70"; 1.100 +const char *mp17 = "8ADB90F58"; 1.101 +const char *mp18 = "C64C230AB20E5"; 1.102 +const char *mp19 = 1.103 +"F1C9DACDA287F2E3C88DCE2393B8F53DAAAC1196DC36510962B6B59454CFE64B"; 1.104 +const char *mp20 = 1.105 +"D445662C8B6FE394107B867797750C326E0F4A967E135FC430F6CD7207913AC7"; 1.106 +const char* mp21 = "2"; 1.107 + 1.108 +const mp_digit md1 = 0; 1.109 +const mp_digit md2 = 0x1; 1.110 +const mp_digit md3 = 0x80; 1.111 +const mp_digit md4 = 0x9C97; 1.112 +const mp_digit md5 = 0xF5BF; 1.113 +const mp_digit md6 = 0x14A0; 1.114 +const mp_digit md7 = 0x03E8; 1.115 +const mp_digit md8 = 0x0101; 1.116 +const mp_digit md9 = 0xA; 1.117 + 1.118 +/* 1.119 + Solutions of the form x_mpABC, where: 1.120 + 1.121 + x = (p)roduct, (s)um, (d)ifference, (q)uotient, (r)emainder, (g)cd, 1.122 + (i)nverse, (e)xponent, square roo(t), (g)cd, (l)cm. A 1.123 + leading 'm' indicates a modular operation, e.g. ms_mp12 is the 1.124 + modular sum of operands 1 and 2 1.125 + 1.126 + ABC are the operand numbers involved in the computation. If a 'd' 1.127 + precedes the number, it is a digit operand; if a 'c' precedes it, 1.128 + it is a constant; otherwise, it is a full integer. 1.129 + */ 1.130 + 1.131 +const char *p_mp12 = "4286AD72E095C9FE009938750743174ADDD7FD1E53"; 1.132 +const char *p_mp34 = "-46BDBD66CA108C94A8CF46C325F7B6E2F2BA82D35" 1.133 + "A1BFD6934C441EE369B60CA29BADC26845E918B"; 1.134 +const char *p_mp57 = "E260C265A0A27C17AD5F4E59D6E0360217A2EBA6"; 1.135 +const char *p_mp22 = "7233B5C1097FFC77CCF55928FDC3A5D31B712FDE7A1E91"; 1.136 +const char *p_mp1d4 = "3CECEA2331F4220BEF68DED"; 1.137 +const char *p_mp8d6 = "6720"; 1.138 +const char *p_mp1113 = 1.139 +"11590FC3831C8C3C51813142C88E566408DB04F9E27642F6471A1822E0100B12F7F1" 1.140 +"5699A127C0FA9D26DCBFF458522661F30C6ADA4A07C8C90F9116893F6DBFBF24C3A2" 1.141 +"4340"; 1.142 +const char *p_mp1415 = 1.143 +"26B36540DE8B3586699CCEAE218A2842C7D5A01590E70C4A26E789107FBCDB06AA2C" 1.144 +"6DDC39E6FA18B16FCB2E934C9A5F844DAD60EE3B1EA82199EC5E9608F67F860FB965" 1.145 +"736055DF0E8F2540EB28D07F47E309B5F5D7C94FF190AB9C83A6970160CA700B1081" 1.146 +"F60518132AF28C6CEE6B7C473E461ABAC52C39CED50A08DD4E7EA8BA18DAD545126D" 1.147 +"A388F6983C29B6BE3F9DCBC15766E8E6D626A92C5296A9C4653CAE5788350C0E2107" 1.148 +"F57E5E8B6994C4847D727FF1A63A66A6CEF42B9C9E6BD04C92550B85D5527DE8A132" 1.149 +"E6BE89341A9285C7CE7FB929D871BBCBD0ED2863B6B078B0DBB30FCA66D6C64284D6" 1.150 +"57F394A0271E15B6EC7A9D530EBAC6CA262EF6F97E1A29FCE7749240E4AECA591ECF" 1.151 +"272122BC587370F9371B67BB696B3CDC1BC8C5B64B6280994EBA00CDEB8EB0F5D06E" 1.152 +"18F401D65FDCECF23DD7B9BB5B4C5458AEF2CCC09BA7F70EACB844750ACFD027521E" 1.153 +"2E047DE8388B35F8512D3DA46FF1A12D4260213602BF7BFFDB6059439B1BD0676449" 1.154 +"8D98C74F48FB3F548948D5BA0C8ECFCD054465132DC43466D6BBD59FBAF8D6D4E157" 1.155 +"2D612B40A956C7D3E140F3B8562EF18568B24D335707D5BAC7495014DF2444172426" 1.156 +"FD099DED560D30D1F945386604AFC85C64BD1E5F531F5C7840475FC0CF0F79810012" 1.157 +"4572BAF5A9910CDBD02B27FFCC3C7E5E88EF59F3AE152476E33EDA696A4F751E0AE4" 1.158 +"A3D2792DEA78E25B9110E12A19EFD09EA47FF9D6594DA445478BEB6901EAF8A35B2D" 1.159 +"FD59BEE9BF7AA8535B7D326EFA5AA2121B5EBE04DD85827A3D43BD04F4AA6D7B62A2" 1.160 +"B6D7A3077286A511A431E1EF75FCEBA3FAE9D5843A8ED17AA02BBB1B571F904699C5" 1.161 +"A6073F87DDD012E2322AB3F41F2A61F428636FE86914148E19B8EF8314ED83332F2F" 1.162 +"8C2ADE95071E792C0A68B903E060DD322A75FD0C2B992059FCCBB58AFA06B50D1634" 1.163 +"BBD93F187FCE0566609FCC2BABB269C66CEB097598AA17957BB4FDA3E64A1B30402E" 1.164 +"851CF9208E33D52E459A92C63FBB66435BB018E155E2C7F055E0B7AB82CD58FC4889" 1.165 +"372ED9EEAC2A07E8E654AB445B9298D2830D6D4DFD117B9C8ABE3968927DC24B3633" 1.166 +"BAD6E6466DB45DDAE87A0AB00336AC2CCCE176704F7214FCAB55743AB76C2B6CA231" 1.167 +"7984610B27B5786DE55C184DDF556EDFEA79A3652831940DAD941E243F482DC17E50" 1.168 +"284BC2FB1AD712A92542C573E55678878F02DFD9E3A863C7DF863227AEDE14B47AD3" 1.169 +"957190124820ADC19F5353878EDB6BF7D0C77352A6E3BDB53EEB88F5AEF6226D6E68" 1.170 +"756776A8FB49B77564147A641664C2A54F7E5B680CCC6A4D22D894E464DF20537094" 1.171 +"548F1732452F9E7F810C0B4B430C073C0FBCE03F0D03F82630654BCE166AA772E1EE" 1.172 +"DD0C08D3E3EBDF0AF54203B43AFDFC40D8FC79C97A4B0A4E1BEB14D8FCEFDDED8758" 1.173 +"6ED65B18"; 1.174 +const char *p_mp2121 = "4"; 1.175 +const char *mp_mp345 = "B9B6D3A3"; 1.176 +const char *mp_mp335 = "16609C2D"; 1.177 + 1.178 +const char *s_mp13 = "B55AA8DF8A7E83241F38B2B446B06A4FB84E5DE0"; 1.179 +const char *s_mp34 = "517EE6B92EF65C965736EB6BF7C325F73504CEB6"; 1.180 +const char *s_mp46 = "-63DBC2265B88268DC801C10EA68476B7BDE0090F"; 1.181 +const char *s_mp5d4 = "F59667D9"; 1.182 +const char *s_mp2d5 = "AAFC0A3FE45E5E09DBF21E8"; 1.183 +const char *s_mp1415 = 1.184 +"E5C43DE2B811F4A084625F96E9504039E5258D8348E698CEB9F4D4292622042DB446" 1.185 +"F75F4B65C1FB7A317257FA354BB5A45E789AEC254EAECE11F80A53E3B513822491DB" 1.186 +"D9399DEC4807A2A3A10360129AC93F4A42388D3BF20B310DD0E9E9F4BE07FC88D53A" 1.187 +"78A26091E0AB506A70813712CCBFBDD440A69A906E650EE090FDD6A42A95AC1A414D" 1.188 +"317F1A9F781E6A30E9EE142ECDA45A1E3454A1417A7B9A613DA90831CF88EA1F2E82" 1.189 +"41AE88CC4053220903C2E05BCDD42F02B8CF8868F84C64C5858BAD356143C5494607" 1.190 +"EE22E11650148BAF65A985F6FC4CA540A55697F2B5AA95D6B8CF96EF638416DE1DD6" 1.191 +"3BA9E2C09E22D03E75B60BE456C642F86B82A709253E5E087B507DE3A45F8392423F" 1.192 +"4DBC284E8DC88C43CA77BC8DCEFB6129A59025F80F90FF978116DEBB9209E306FBB9" 1.193 +"1B6111F8B8CFACB7C7C9BC12691C22EE88303E1713F1DFCEB622B8EA102F6365678B" 1.194 +"C580ED87225467AA78E875868BD53B17574BA59305BC1AC666E4B7E9ED72FCFC200E" 1.195 +"189D98FC8C5C7533739C53F52DDECDDFA5A8668BFBD40DABC9640F8FCAE58F532940" 1.196 +"8162261320A25589E9FB51B50F80056471F24B7E1AEC35D1356FC2747FFC13A04B34" 1.197 +"24FCECE10880BD9D97CA8CDEB2F5969BF4F30256EB5ED2BCD1DC64BDC2EE65217848" 1.198 +"48A37FB13F84ED4FB7ACA18C4639EE64309BDD3D552AEB4AAF44295943DC1229A497" 1.199 +"A84A"; 1.200 + 1.201 +const char *ms_mp345 = "1E71E292"; 1.202 + 1.203 +const char *d_mp12 = "-AAFBA6A55DD183FD854A60E"; 1.204 +const char *d_mp34 = "119366B05E606A9B1E73A6D8944CC1366B0C4E0D4"; 1.205 +const char *d_mp5d4 = "F5952EAB"; 1.206 +const char *d_mp6d2 = "-1"; 1.207 +const char *md_mp345 = "26596B86"; 1.208 + 1.209 +const char *q_mp42 = "-95825A1FFA1A155D5"; 1.210 +const char *r_mp42 = "-6312E99D7700A3DCB32ADF2"; 1.211 +const char *q_mp45a = "15344CDA3D841F661D2B61B6EDF7828CE36"; 1.212 +const char *r_mp45a = "-47C47B"; 1.213 +const char *q_mp7c2 = "75FD3890E6C1C67321CE62CEEDA65F79"; 1.214 +const char *q_mp3d6 = "8CAFD53C272BD6FE8B0847BDC3B539EFAB5C3"; 1.215 +const char *r_mp3d6 = "1E5"; 1.216 +const char *r_mp5d5 = "1257"; 1.217 +const char *r_mp47 = "B3A9018D970281A90FB729A181D95CB8"; 1.218 +const char *q_mp1404 = 1.219 +"-1B994D869142D3EF6123A3CBBC3C0114FA071CFCEEF4B7D231D65591D32501AD80F" 1.220 +"FF49AE4EC80514CC071EF6B42521C2508F4CB2FEAD69A2D2EF3934087DCAF88CC4C4" 1.221 +"659F1CA8A7F4D36817D802F778F1392337FE36302D6865BF0D4645625DF8BB044E19" 1.222 +"930635BE2609FAC8D99357D3A9F81F2578DE15A300964188292107DAC980E0A08CD7" 1.223 +"E938A2135FAD45D50CB1D8C2D4C4E60C27AB98B9FBD7E4DBF752C57D2674520E4BB2" 1.224 +"7E42324C0EFE84FB3E38CF6950E699E86FD45FE40D428400F2F94EDF7E94FAE10B45" 1.225 +"89329E1BF61E5A378C7B31C9C6A234F8254D4C24823B84D0BF8D671D8BC9154DFAC9" 1.226 +"49BD8ACABD6BD32DD4DC587F22C86153CB3954BDF7C2A890D623642492C482CF3E2C" 1.227 +"776FC019C3BBC61688B485E6FD35D6376089C1E33F880E84C4E51E8ABEACE1B3FB70" 1.228 +"3EAD0E28D2D44E7F1C0A859C840775E94F8C1369D985A3C5E8114B21D68B3CBB75D2" 1.229 +"791C586153C85B90CAA483E57A40E2D97950AAB84920A4396C950C87C7FFFE748358" 1.230 +"42A0BF65445B26D40F05BE164B822CA96321F41D85A289C5F5CD5F438A78704C9683" 1.231 +"422299D21899A22F853B0C93081CC9925E350132A0717A611DD932A68A0ACC6E4C7F" 1.232 +"7F685EF8C1F4910AEA5DC00BB5A36FCA07FFEAA490C547F6E14A08FE87041AB803E1" 1.233 +"BD9E23E4D367A2C35762F209073DFF48F3"; 1.234 +const char *r_mp1404 = "12FF98621ABF63144BFFC3207AC8FC10D8D1A09"; 1.235 + 1.236 +const char *q_mp13c = 1.237 + "34584F700C15A341E40BF7BFDD88A6630C8FF2B2067469372D391342" 1.238 + "BDAB6163963CD5A5C79F708BDE26E0CCF2DB66CD6D6089E29A877C45"; 1.239 +const char *r_mp13c = "F2B050D226E6DA88"; 1.240 +const char *q_mp9c16 = "F74A2876A1432698923B0767DA19DCF3D71795E"; 1.241 +const char *r_mp9c16 = "E"; 1.242 + 1.243 +const char *e_mp5d9 = "A8FD7145E727A20E52E73D22990D35D158090307A" 1.244 + "13A5215AAC4E9AB1E96BD34E531209E03310400"; 1.245 +const char *e_mp78 = "AA5F72C737DFFD8CCD108008BFE7C79ADC01A819B" 1.246 + "32B75FB82EC0FB8CA83311DA36D4063F1E57857A2" 1.247 + "1AB226563D84A15BB63CE975FF1453BD6750C58D9" 1.248 + "D113175764F5D0B3C89B262D4702F4D9640A3"; 1.249 +const char *me_mp817 = "E504493ACB02F7F802B327AB13BF25"; 1.250 +const char *me_mp5d47 = "1D45ED0D78F2778157992C951DD2734C"; 1.251 +const char *me_mp1512 = "FB5B2A28D902B9D9"; 1.252 +const char *me_mp161718 = "423C6AC6DBD74"; 1.253 +const char *me_mp5114 = 1.254 +"64F0F72807993578BBA3C7C36FFB184028F9EB9A810C92079E1498D8A80FC848E1F0" 1.255 +"25F1DE43B7F6AC063F5CC29D8A7C2D7A66269D72BF5CDC327AF88AF8EF9E601DCB0A" 1.256 +"3F35BFF3525FB1B61CE3A25182F17C0A0633B4089EA15BDC47664A43FEF639748AAC" 1.257 +"19CF58E83D8FA32CD10661D2D4210CC84792937E6F36CB601851356622E63ADD4BD5" 1.258 +"542412C2E0C4958E51FD2524AABDC7D60CFB5DB332EEC9DC84210F10FAE0BA2018F2" 1.259 +"14C9D6867C9D6E49CF28C18D06CE009FD4D04BFC8837C3FAAA773F5CCF6DED1C22DE" 1.260 +"181786AFE188540586F2D74BF312E595244E6936AE52E45742109BAA76C36F2692F5" 1.261 +"CEF97AD462B138BE92721194B163254CBAAEE9B9864B21CCDD5375BCAD0D24132724" 1.262 +"113D3374B4BCF9AA49BA5ACBC12288C0BCF46DCE6CB4A241A91BD559B130B6E9CD3D" 1.263 +"D7A2C8B280C2A278BA9BF5D93244D563015C9484B86D9FEB602501DC16EEBC3EFF19" 1.264 +"53D7999682BF1A1E3B2E7B21F4BDCA3C355039FEF55B9C0885F98DC355CA7A6D8ECF" 1.265 +"5F7F1A6E11A764F2343C823B879B44616B56BF6AE3FA2ACF5483660E618882018E3F" 1.266 +"C8459313BACFE1F93CECC37B2576A5C0B2714BD3EEDEEC22F0E7E3E77B11396B9B99" 1.267 +"D683F2447A4004BBD4A57F6A616CDDFEC595C4FC19884CC2FC21CF5BF5B0B81E0F83" 1.268 +"B9DDA0CF4DFF35BB8D31245912BF4497FD0BD95F0C604E26EA5A8EA4F5EAE870A5BD" 1.269 +"FE8C"; 1.270 + 1.271 +const char *e_mpc2d3 = "100000000000000000000000000000000"; 1.272 + 1.273 +const char *t_mp9 = "FB9B6E32FF0452A34746"; 1.274 +const char *i_mp27 = "B6AD8DCCDAF92B6FE57D062FFEE3A99"; 1.275 +const char *i_mp2019 = 1.276 +"BDF3D88DC373A63EED92903115B03FC8501910AF68297B4C41870AED3EA9F839"; 1.277 +/* "15E3FE09E8AE5523AABA197BD2D16318D3CA148EDF4AE1C1C52FC96AFAF5680B"; */ 1.278 + 1.279 + 1.280 +const char *t_mp15 = 1.281 +"795853094E59B0008093BCA8DECF68587C64BDCA2F3F7F8963DABC12F1CFFFA9B8C4" 1.282 +"365232FD4751870A0EF6CA619287C5D8B7F1747D95076AB19645EF309773E9EACEA0" 1.283 +"975FA4AE16251A8DA5865349C3A903E3B8A2C0DEA3C0720B6020C7FED69AFF62BB72" 1.284 +"10FAC443F9FFA2950776F949E819260C2AF8D94E8A1431A40F8C23C1973DE5D49AA2" 1.285 +"0B3FF5DA5C1D5324E712A78FF33A9B1748F83FA529905924A31DF38643B3F693EF9B" 1.286 +"58D846BB1AEAE4523ECC843FF551C1B300A130B65C1677402778F98C51C10813250E" 1.287 +"2496882877B069E877B59740DC1226F18A5C0F66F64A5F59A9FAFC5E9FC45AEC0E7A" 1.288 +"BEE244F7DD3AC268CF512A0E52E4F5BE5B94"; 1.289 + 1.290 +const char *g_mp71 = "1"; 1.291 +const char *g_mp25 = "7"; 1.292 +const char *l_mp1011 = "C589E3D7D64A6942A000"; 1.293 + 1.294 +/* mp9 in radices from 5 to 64 inclusive */ 1.295 +#define LOW_RADIX 5 1.296 +#define HIGH_RADIX 64 1.297 +const char *v_mp9[] = { 1.298 + "404041130042310320100141302000203430214122130002340212132414134210033", 1.299 + "44515230120451152500101352430105520150025145320010504454125502", 1.300 + "644641136612541136016610100564613624243140151310023515322", 1.301 + "173512120732412062323044435407317550316717172705712756", 1.302 + "265785018434285762514442046172754680368422060744852", 1.303 + "1411774500397290569709059837552310354075408897518", 1.304 + "184064268501499311A17746095910428222A241708032A", 1.305 + "47706011B225950B02BB45602AA039893118A85950892", 1.306 + "1A188C826B982353CB58422563AC602B783101671A86", 1.307 + "105957B358B89B018958908A9114BC3DDC410B77982", 1.308 + "CB7B3387E23452178846C55DD9D70C7CA9AEA78E8", 1.309 + "F74A2876A1432698923B0767DA19DCF3D71795EE", 1.310 + "17BF7C3673B76D7G7A5GA836277296F806E7453A", 1.311 + "2EBG8HH3HFA6185D6H0596AH96G24C966DD3HG2", 1.312 + "6G3HGBFEG8I3F25EAF61B904EIA40CFDH2124F", 1.313 + "10AHC3D29EBHDF3HD97905CG0JA8061855C3FI", 1.314 + "3BA5A55J5K699B2D09C38A4B237CH51IHA132", 1.315 + "EDEA90DJ0B5CB3FGG1C8587FEB99D3C143CA", 1.316 + "31M26JI1BBD56K3I028MML4EEDMAJK60LGLE", 1.317 + "GGG5M3142FKKG82EJ28111D70EMHC241E4E", 1.318 + "4446F4D5H10982023N297BF0DKBBHLLJB0I", 1.319 + "12E9DEEOBMKAKEP0IM284MIP7FO1O521M46", 1.320 + "85NN0HD48NN2FDDB1F5BMMKIB8CK20MDPK", 1.321 + "2D882A7A0O0JPCJ4APDRIB77IABAKDGJP2", 1.322 + "MFMCI0R7S27AAA3O3L2S8K44HKA7O02CN", 1.323 + "7IGQS73FFSHC50NNH44B6PTTNLC3M6H78", 1.324 + "2KLUB3U9850CSN6ANIDNIF1LB29MJ43LH", 1.325 + "UT52GTL18CJ9H4HR0TJTK6ESUFBHF5FE", 1.326 + "BTVL87QQBMUGF8PFWU4W3VU7U922QTMW", 1.327 + "4OG10HW0MSWJBIDEE2PDH24GA7RIHIAA", 1.328 + "1W8W9AX2DRUX48GXOLMK0PE42H0FEUWN", 1.329 + "SVWI84VBH069WR15W1U2VTK06USY8Z2", 1.330 + "CPTPNPDa5TYCPPNLALENT9IMX2GL0W2", 1.331 + "5QU21UJMRaUYYYYYN6GHSMPOYOXEEUY", 1.332 + "2O2Q7C6RPPB1SXJ9bR4035SPaQQ3H2W", 1.333 + "18d994IbT4PHbD7cGIPCRP00bbQO0bc", 1.334 + "NcDUEEWRO7XT76260WGeBHPVa72RdA", 1.335 + "BbX2WCF9VfSB5LPdJAdeXKV1fd6LC2", 1.336 + "60QDKW67P4JSQaTdQg7JE9ISafLaVU", 1.337 + "33ba9XbDbRdNF4BeDB2XYMhAVDaBdA", 1.338 + "1RIPZJA8gT5L5H7fTcaRhQ39geMMTc", 1.339 + "d65j70fBATjcDiidPYXUGcaBVVLME", 1.340 + "LKA9jhPabDG612TXWkhfT2gMXNIP2", 1.341 + "BgNaYhjfT0G8PBcYRP8khJCR3C9QE", 1.342 + "6Wk8RhJTAgDh10fYAiUVB1aM0HacG", 1.343 + "3dOCjaf78kd5EQNViUZWj3AfFL90I", 1.344 + "290VWkL3aiJoW4MBbHk0Z0bDo22Ni", 1.345 + "1DbDZ1hpPZNUDBUp6UigcJllEdC26", 1.346 + "dFSOLBUM7UZX8Vnc6qokGIOiFo1h", 1.347 + "NcoUYJOg0HVmKI9fR2ag0S8R2hrK", 1.348 + "EOpiJ5Te7oDe2pn8ZhAUKkhFHlZh", 1.349 + "8nXK8rp8neV8LWta1WDgd1QnlWsU", 1.350 + "5T3d6bcSBtHgrH9bCbu84tblaa7r", 1.351 + "3PlUDIYUvMqOVCir7AtquK5dWanq", 1.352 + "2A70gDPX2AtiicvIGGk9poiMtgvu", 1.353 + "1MjiRxjk10J6SVAxFguv9kZiUnIc", 1.354 + "rpre2vIDeb4h3sp50r1YBbtEx9L", 1.355 + "ZHcoip0AglDAfibrsUcJ9M1C8fm", 1.356 + "NHP18+eoe6uU54W49Kc6ZK7+bT2", 1.357 + "FTAA7QXGoQOaZi7PzePtFFN5vNk" 1.358 +}; 1.359 + 1.360 +const unsigned char b_mp4[] = { 1.361 + 0x01, 1.362 +#if MP_DIGIT_MAX > MP_32BIT_MAX 1.363 + 0x00, 0x00, 0x00, 0x00, 1.364 +#endif 1.365 + 0x63, 0xDB, 0xC2, 0x26, 1.366 + 0x5B, 0x88, 0x26, 0x8D, 1.367 + 0xC8, 0x01, 0xC1, 0x0E, 1.368 + 0xA6, 0x84, 0x76, 0xB7, 1.369 + 0xBD, 0xE0, 0x09, 0x0F 1.370 +}; 1.371 + 1.372 +/* Search for a test suite name in the names table */ 1.373 +int find_name(char *name); 1.374 +void reason(char *fmt, ...); 1.375 + 1.376 +/*------------------------------------------------------------------------*/ 1.377 +/*------------------------------------------------------------------------*/ 1.378 + 1.379 +char g_intbuf[4096]; /* buffer for integer comparison */ 1.380 +char a_intbuf[4096]; /* buffer for integer comparison */ 1.381 +int g_verbose = 1; /* print out reasons for failure? */ 1.382 +int res; 1.383 + 1.384 +#define IFOK(x) { if (MP_OKAY > (res = (x))) { \ 1.385 + reason("test %s failed: error %d\n", #x, res); return 1; }} 1.386 + 1.387 +int main(int argc, char *argv[]) 1.388 +{ 1.389 + int which, res; 1.390 + 1.391 + srand((unsigned int)time(NULL)); 1.392 + 1.393 + if (argc < 2) { 1.394 + fprintf(stderr, "Usage: %s <test-suite> | list\n" 1.395 + "Type '%s help' for assistance\n", argv[0], argv[0]); 1.396 + return 2; 1.397 + } else if(argc > 2) { 1.398 + if(strcmp(argv[2], "quiet") == 0) 1.399 + g_verbose = 0; 1.400 + } 1.401 + 1.402 + if(strcmp(argv[1], "help") == 0) { 1.403 + fprintf(stderr, "Help for mpi-test\n\n" 1.404 + "This program is a test driver for the MPI library, which\n" 1.405 + "tests all the various functions in the library to make sure\n" 1.406 + "they are working correctly. The syntax is:\n" 1.407 + " %s <suite-name>\n" 1.408 + "...where <suite-name> is the name of the test you wish to\n" 1.409 + "run. To get a list of the tests, use '%s list'.\n\n" 1.410 + "The program exits with a status of zero if the test passes,\n" 1.411 + "or non-zero if it fails. Ordinarily, failure is accompanied\n" 1.412 + "by a diagnostic message to standard error. To suppress this\n" 1.413 + "add the keyword 'quiet' after the suite-name on the command\n" 1.414 + "line.\n\n", argv[0], argv[0]); 1.415 + return 0; 1.416 + } 1.417 + 1.418 + if ((which = find_name(argv[1])) < 0) { 1.419 + fprintf(stderr, "%s: test suite '%s' is not known\n", argv[0], argv[1]); 1.420 + return 2; 1.421 + } 1.422 + 1.423 + if((res = (g_tests[which])()) < 0) { 1.424 + fprintf(stderr, "%s: test suite not implemented yet\n", argv[0]); 1.425 + return 2; 1.426 + } else { 1.427 + return res; 1.428 + } 1.429 + 1.430 +} 1.431 + 1.432 +/*------------------------------------------------------------------------*/ 1.433 + 1.434 +int find_name(char *name) 1.435 +{ 1.436 + int ix = 0; 1.437 + 1.438 + while(ix < g_count) { 1.439 + if (strcmp(name, g_names[ix]) == 0) 1.440 + return ix; 1.441 + 1.442 + ++ix; 1.443 + } 1.444 + 1.445 + return -1; 1.446 +} 1.447 + 1.448 +/*------------------------------------------------------------------------*/ 1.449 + 1.450 +int test_list(void) 1.451 +{ 1.452 + int ix; 1.453 + 1.454 + fprintf(stderr, "There are currently %d test suites available\n", 1.455 + g_count); 1.456 + 1.457 + for(ix = 1; ix < g_count; ix++) 1.458 + fprintf(stdout, "%-20s %s\n", g_names[ix], g_descs[ix]); 1.459 + 1.460 + return 0; 1.461 +} 1.462 + 1.463 +/*------------------------------------------------------------------------*/ 1.464 + 1.465 +int test_copy(void) 1.466 +{ 1.467 + mp_int a, b; 1.468 + int ix; 1.469 + 1.470 + mp_init(&a); mp_init(&b); 1.471 + 1.472 + mp_read_radix(&a, mp3, 16); 1.473 + mp_copy(&a, &b); 1.474 + 1.475 + if(SIGN(&a) != SIGN(&b) || USED(&a) != USED(&b)) { 1.476 + if(SIGN(&a) != SIGN(&b)) { 1.477 + reason("error: sign of original is %d, sign of copy is %d\n", 1.478 + SIGN(&a), SIGN(&b)); 1.479 + } else { 1.480 + reason("error: original precision is %d, copy precision is %d\n", 1.481 + USED(&a), USED(&b)); 1.482 + } 1.483 + mp_clear(&a); mp_clear(&b); 1.484 + return 1; 1.485 + } 1.486 + 1.487 + for(ix = 0; ix < USED(&b); ix++) { 1.488 + if(DIGIT(&a, ix) != DIGIT(&b, ix)) { 1.489 + reason("error: digit %d " DIGIT_FMT " != " DIGIT_FMT "\n", 1.490 + ix, DIGIT(&a, ix), DIGIT(&b, ix)); 1.491 + mp_clear(&a); mp_clear(&b); 1.492 + return 1; 1.493 + } 1.494 + } 1.495 + 1.496 + mp_clear(&a); mp_clear(&b); 1.497 + return 0; 1.498 +} 1.499 + 1.500 +/*------------------------------------------------------------------------*/ 1.501 + 1.502 +int test_exch(void) 1.503 +{ 1.504 + mp_int a, b; 1.505 + 1.506 + mp_init(&a); mp_init(&b); 1.507 + mp_read_radix(&a, mp7, 16); mp_read_radix(&b, mp1, 16); 1.508 + 1.509 + mp_exch(&a, &b); 1.510 + mp_toradix(&a, g_intbuf, 16); 1.511 + 1.512 + mp_clear(&a); 1.513 + if(strcmp(g_intbuf, mp1) != 0) { 1.514 + mp_clear(&b); 1.515 + reason("error: exchange failed\n"); 1.516 + return 1; 1.517 + } 1.518 + 1.519 + mp_toradix(&b, g_intbuf, 16); 1.520 + 1.521 + mp_clear(&b); 1.522 + if(strcmp(g_intbuf, mp7) != 0) { 1.523 + reason("error: exchange failed\n"); 1.524 + return 1; 1.525 + } 1.526 + 1.527 + return 0; 1.528 +} 1.529 + 1.530 +/*------------------------------------------------------------------------*/ 1.531 + 1.532 +int test_zero(void) 1.533 +{ 1.534 + mp_int a; 1.535 + 1.536 + mp_init(&a); mp_read_radix(&a, mp7, 16); 1.537 + mp_zero(&a); 1.538 + 1.539 + if(USED(&a) != 1 || DIGIT(&a, 1) != 0) { 1.540 + mp_toradix(&a, g_intbuf, 16); 1.541 + reason("error: result is %s\n", g_intbuf); 1.542 + mp_clear(&a); 1.543 + return 1; 1.544 + } 1.545 + 1.546 + mp_clear(&a); 1.547 + return 0; 1.548 +} 1.549 + 1.550 +/*------------------------------------------------------------------------*/ 1.551 + 1.552 +int test_set(void) 1.553 +{ 1.554 + mp_int a; 1.555 + 1.556 + /* Test single digit set */ 1.557 + mp_init(&a); mp_set(&a, 5); 1.558 + if(DIGIT(&a, 0) != 5) { 1.559 + mp_toradix(&a, g_intbuf, 16); 1.560 + reason("error: result is %s, expected 5\n", g_intbuf); 1.561 + mp_clear(&a); 1.562 + return 1; 1.563 + } 1.564 + 1.565 + /* Test integer set */ 1.566 + mp_set_int(&a, -4938110); 1.567 + mp_toradix(&a, g_intbuf, 16); 1.568 + mp_clear(&a); 1.569 + if(strcmp(g_intbuf, mp5a) != 0) { 1.570 + reason("error: result is %s, expected %s\n", g_intbuf, mp5a); 1.571 + return 1; 1.572 + } 1.573 + 1.574 + return 0; 1.575 +} 1.576 + 1.577 +/*------------------------------------------------------------------------*/ 1.578 + 1.579 +int test_abs(void) 1.580 +{ 1.581 + mp_int a; 1.582 + 1.583 + mp_init(&a); mp_read_radix(&a, mp4, 16); 1.584 + mp_abs(&a, &a); 1.585 + 1.586 + if(SIGN(&a) != ZPOS) { 1.587 + reason("error: sign of result is negative\n"); 1.588 + mp_clear(&a); 1.589 + return 1; 1.590 + } 1.591 + 1.592 + mp_clear(&a); 1.593 + return 0; 1.594 +} 1.595 + 1.596 +/*------------------------------------------------------------------------*/ 1.597 + 1.598 +int test_neg(void) 1.599 +{ 1.600 + mp_int a; 1.601 + mp_sign s; 1.602 + 1.603 + mp_init(&a); mp_read_radix(&a, mp4, 16); 1.604 + 1.605 + s = SIGN(&a); 1.606 + mp_neg(&a, &a); 1.607 + if(SIGN(&a) == s) { 1.608 + reason("error: sign of result is same as sign of nonzero input\n"); 1.609 + mp_clear(&a); 1.610 + return 1; 1.611 + } 1.612 + 1.613 + mp_clear(&a); 1.614 + return 0; 1.615 +} 1.616 + 1.617 +/*------------------------------------------------------------------------*/ 1.618 + 1.619 +int test_add_d(void) 1.620 +{ 1.621 + mp_int a; 1.622 + 1.623 + mp_init(&a); 1.624 + 1.625 + mp_read_radix(&a, mp5, 16); 1.626 + mp_add_d(&a, md4, &a); 1.627 + mp_toradix(&a, g_intbuf, 16); 1.628 + 1.629 + if(strcmp(g_intbuf, s_mp5d4) != 0) { 1.630 + reason("error: computed %s, expected %s\n", g_intbuf, s_mp5d4); 1.631 + mp_clear(&a); 1.632 + return 1; 1.633 + } 1.634 + 1.635 + mp_read_radix(&a, mp2, 16); 1.636 + mp_add_d(&a, md5, &a); 1.637 + mp_toradix(&a, g_intbuf, 16); 1.638 + 1.639 + if(strcmp(g_intbuf, s_mp2d5) != 0) { 1.640 + reason("error: computed %s, expected %s\n", g_intbuf, s_mp2d5); 1.641 + mp_clear(&a); 1.642 + return 1; 1.643 + } 1.644 + 1.645 + mp_clear(&a); 1.646 + return 0; 1.647 +} 1.648 + 1.649 +/*------------------------------------------------------------------------*/ 1.650 + 1.651 +int test_add(void) 1.652 +{ 1.653 + mp_int a, b; 1.654 + int res = 0; 1.655 + 1.656 + mp_init(&a); mp_init(&b); 1.657 + 1.658 + mp_read_radix(&a, mp1, 16); mp_read_radix(&b, mp3, 16); 1.659 + mp_add(&a, &b, &a); 1.660 + mp_toradix(&a, g_intbuf, 16); 1.661 + 1.662 + if(strcmp(g_intbuf, s_mp13) != 0) { 1.663 + reason("error: computed %s, expected %s\n", g_intbuf, s_mp13); 1.664 + res = 1; goto CLEANUP; 1.665 + } 1.666 + 1.667 + mp_read_radix(&a, mp4, 16); 1.668 + mp_add(&a, &b, &a); 1.669 + mp_toradix(&a, g_intbuf, 16); 1.670 + 1.671 + if(strcmp(g_intbuf, s_mp34) != 0) { 1.672 + reason("error: computed %s, expected %s\n", g_intbuf, s_mp34); 1.673 + res = 1; goto CLEANUP; 1.674 + } 1.675 + 1.676 + mp_read_radix(&a, mp4, 16); mp_read_radix(&b, mp6, 16); 1.677 + mp_add(&a, &b, &a); 1.678 + mp_toradix(&a, g_intbuf, 16); 1.679 + 1.680 + if(strcmp(g_intbuf, s_mp46) != 0) { 1.681 + reason("error: computed %s, expected %s\n", g_intbuf, s_mp46); 1.682 + res = 1; goto CLEANUP; 1.683 + } 1.684 + 1.685 + mp_read_radix(&a, mp14, 16); mp_read_radix(&b, mp15, 16); 1.686 + mp_add(&a, &b, &a); 1.687 + mp_toradix(&a, g_intbuf, 16); 1.688 + 1.689 + if(strcmp(g_intbuf, s_mp1415) != 0) { 1.690 + reason("error: computed %s, expected %s\n", g_intbuf, s_mp1415); 1.691 + res = 1; 1.692 + } 1.693 + 1.694 + CLEANUP: 1.695 + mp_clear(&a); mp_clear(&b); 1.696 + return res; 1.697 +} 1.698 + 1.699 +/*------------------------------------------------------------------------*/ 1.700 + 1.701 +int test_sub_d(void) 1.702 +{ 1.703 + mp_int a; 1.704 + 1.705 + mp_init(&a); 1.706 + mp_read_radix(&a, mp5, 16); 1.707 + 1.708 + mp_sub_d(&a, md4, &a); 1.709 + mp_toradix(&a, g_intbuf, 16); 1.710 + 1.711 + if(strcmp(g_intbuf, d_mp5d4) != 0) { 1.712 + reason("error: computed %s, expected %s\n", g_intbuf, d_mp5d4); 1.713 + mp_clear(&a); 1.714 + return 1; 1.715 + } 1.716 + 1.717 + mp_read_radix(&a, mp6, 16); 1.718 + 1.719 + mp_sub_d(&a, md2, &a); 1.720 + mp_toradix(&a, g_intbuf, 16); 1.721 + 1.722 + mp_clear(&a); 1.723 + if(strcmp(g_intbuf, d_mp6d2) != 0) { 1.724 + reason("error: computed %s, expected %s\n", g_intbuf, d_mp6d2); 1.725 + return 1; 1.726 + } 1.727 + 1.728 + return 0; 1.729 +} 1.730 + 1.731 +/*------------------------------------------------------------------------*/ 1.732 + 1.733 +int test_sub(void) 1.734 +{ 1.735 + mp_int a, b; 1.736 + 1.737 + mp_init(&a); mp_init(&b); 1.738 + 1.739 + mp_read_radix(&a, mp1, 16); mp_read_radix(&b, mp2, 16); 1.740 + mp_sub(&a, &b, &a); 1.741 + mp_toradix(&a, g_intbuf, 16); 1.742 + 1.743 + if(strcmp(g_intbuf, d_mp12) != 0) { 1.744 + reason("error: computed %s, expected %s\n", g_intbuf, d_mp12); 1.745 + mp_clear(&a); mp_clear(&b); 1.746 + return 1; 1.747 + } 1.748 + 1.749 + mp_read_radix(&a, mp3, 16); mp_read_radix(&b, mp4, 16); 1.750 + mp_sub(&a, &b, &a); 1.751 + mp_toradix(&a, g_intbuf, 16); 1.752 + 1.753 + if(strcmp(g_intbuf, d_mp34) != 0) { 1.754 + reason("error: computed %s, expected %s\n", g_intbuf, d_mp34); 1.755 + mp_clear(&a); mp_clear(&b); 1.756 + return 1; 1.757 + } 1.758 + 1.759 + mp_clear(&a); mp_clear(&b); 1.760 + return 0; 1.761 +} 1.762 + 1.763 +/*------------------------------------------------------------------------*/ 1.764 + 1.765 +int test_mul_d(void) 1.766 +{ 1.767 + mp_int a; 1.768 + 1.769 + mp_init(&a); 1.770 + mp_read_radix(&a, mp1, 16); 1.771 + 1.772 + IFOK( mp_mul_d(&a, md4, &a) ); 1.773 + mp_toradix(&a, g_intbuf, 16); 1.774 + 1.775 + if(strcmp(g_intbuf, p_mp1d4) != 0) { 1.776 + reason("error: computed %s, expected %s\n", g_intbuf, p_mp1d4); 1.777 + mp_clear(&a); 1.778 + return 1; 1.779 + } 1.780 + 1.781 + mp_read_radix(&a, mp8, 16); 1.782 + IFOK( mp_mul_d(&a, md6, &a) ); 1.783 + mp_toradix(&a, g_intbuf, 16); 1.784 + 1.785 + mp_clear(&a); 1.786 + if(strcmp(g_intbuf, p_mp8d6) != 0) { 1.787 + reason("error: computed %s, expected %s\n", g_intbuf, p_mp8d6); 1.788 + return 1; 1.789 + } 1.790 + 1.791 + return 0; 1.792 +} 1.793 + 1.794 +/*------------------------------------------------------------------------*/ 1.795 + 1.796 +int test_mul(void) 1.797 +{ 1.798 + mp_int a, b; 1.799 + int res = 0; 1.800 + 1.801 + mp_init(&a); mp_init(&b); 1.802 + mp_read_radix(&a, mp1, 16); mp_read_radix(&b, mp2, 16); 1.803 + 1.804 + IFOK( mp_mul(&a, &b, &a) ); 1.805 + mp_toradix(&a, g_intbuf, 16); 1.806 + 1.807 + if(strcmp(g_intbuf, p_mp12) != 0) { 1.808 + reason("error: computed %s, expected %s\n", g_intbuf, p_mp12); 1.809 + res = 1; goto CLEANUP; 1.810 + } 1.811 + 1.812 + mp_read_radix(&a, mp3, 16); mp_read_radix(&b, mp4, 16); 1.813 + IFOK( mp_mul(&a, &b, &a) ); 1.814 + mp_toradix(&a, g_intbuf, 16); 1.815 + 1.816 + if(strcmp(g_intbuf, p_mp34) !=0) { 1.817 + reason("error: computed %s, expected %s\n", g_intbuf, p_mp34); 1.818 + res = 1; goto CLEANUP; 1.819 + } 1.820 + 1.821 + mp_read_radix(&a, mp5, 16); mp_read_radix(&b, mp7, 16); 1.822 + IFOK( mp_mul(&a, &b, &a) ); 1.823 + mp_toradix(&a, g_intbuf, 16); 1.824 + 1.825 + if(strcmp(g_intbuf, p_mp57) != 0) { 1.826 + reason("error: computed %s, expected %s\n", g_intbuf, p_mp57); 1.827 + res = 1; goto CLEANUP; 1.828 + } 1.829 + 1.830 + mp_read_radix(&a, mp11, 16); mp_read_radix(&b, mp13, 16); 1.831 + IFOK( mp_mul(&a, &b, &a) ); 1.832 + mp_toradix(&a, g_intbuf, 16); 1.833 + 1.834 + if(strcmp(g_intbuf, p_mp1113) != 0) { 1.835 + reason("error: computed %s, expected %s\n", g_intbuf, p_mp1113); 1.836 + res = 1; goto CLEANUP; 1.837 + } 1.838 + 1.839 + mp_read_radix(&a, mp14, 16); mp_read_radix(&b, mp15, 16); 1.840 + IFOK( mp_mul(&a, &b, &a) ); 1.841 + mp_toradix(&a, g_intbuf, 16); 1.842 + 1.843 + if(strcmp(g_intbuf, p_mp1415) != 0) { 1.844 + reason("error: computed %s, expected %s\n", g_intbuf, p_mp1415); 1.845 + res = 1; 1.846 + } 1.847 + mp_read_radix(&a, mp21, 10); mp_read_radix(&b, mp21, 10); 1.848 + 1.849 + IFOK( mp_mul(&a, &b, &a) ); 1.850 + mp_toradix(&a, g_intbuf, 10); 1.851 + 1.852 + if(strcmp(g_intbuf, p_mp2121) != 0) { 1.853 + reason("error: computed %s, expected %s\n", g_intbuf, p_mp2121); 1.854 + res = 1; goto CLEANUP; 1.855 + } 1.856 + 1.857 + CLEANUP: 1.858 + mp_clear(&a); mp_clear(&b); 1.859 + return res; 1.860 + 1.861 +} 1.862 + 1.863 +/*------------------------------------------------------------------------*/ 1.864 + 1.865 +int test_sqr(void) 1.866 +{ 1.867 + mp_int a; 1.868 + 1.869 + mp_init(&a); mp_read_radix(&a, mp2, 16); 1.870 + 1.871 + mp_sqr(&a, &a); 1.872 + mp_toradix(&a, g_intbuf, 16); 1.873 + 1.874 + mp_clear(&a); 1.875 + if(strcmp(g_intbuf, p_mp22) != 0) { 1.876 + reason("error: computed %s, expected %s\n", g_intbuf, p_mp22); 1.877 + return 1; 1.878 + } 1.879 + 1.880 + return 0; 1.881 +} 1.882 + 1.883 +/*------------------------------------------------------------------------*/ 1.884 + 1.885 +int test_div_d(void) 1.886 +{ 1.887 + mp_int a, q; 1.888 + mp_digit r; 1.889 + int err = 0; 1.890 + 1.891 + mp_init(&a); mp_init(&q); 1.892 + mp_read_radix(&a, mp3, 16); 1.893 + 1.894 + IFOK( mp_div_d(&a, md6, &q, &r) ); 1.895 + mp_toradix(&q, g_intbuf, 16); 1.896 + 1.897 + if(strcmp(g_intbuf, q_mp3d6) != 0) { 1.898 + reason("error: computed q = %s, expected %s\n", g_intbuf, q_mp3d6); 1.899 + ++err; 1.900 + } 1.901 + 1.902 + sprintf(g_intbuf, ZS_DIGIT_FMT, r); 1.903 + 1.904 + if(strcmp(g_intbuf, r_mp3d6) != 0) { 1.905 + reason("error: computed r = %s, expected %s\n", g_intbuf, r_mp3d6); 1.906 + ++err; 1.907 + } 1.908 + 1.909 + mp_read_radix(&a, mp9, 16); 1.910 + IFOK( mp_div_d(&a, 16, &q, &r) ); 1.911 + mp_toradix(&q, g_intbuf, 16); 1.912 + 1.913 + if(strcmp(g_intbuf, q_mp9c16) != 0) { 1.914 + reason("error: computed q = %s, expected %s\n", g_intbuf, q_mp9c16); 1.915 + ++err; 1.916 + } 1.917 + 1.918 + sprintf(g_intbuf, ZS_DIGIT_FMT, r); 1.919 + 1.920 + if(strcmp(g_intbuf, r_mp9c16) != 0) { 1.921 + reason("error: computed r = %s, expected %s\n", g_intbuf, r_mp9c16); 1.922 + ++err; 1.923 + } 1.924 + 1.925 + mp_clear(&a); mp_clear(&q); 1.926 + return err; 1.927 +} 1.928 + 1.929 +/*------------------------------------------------------------------------*/ 1.930 + 1.931 +int test_div_2(void) 1.932 +{ 1.933 + mp_int a; 1.934 + 1.935 + mp_init(&a); mp_read_radix(&a, mp7, 16); 1.936 + IFOK( mp_div_2(&a, &a) ); 1.937 + mp_toradix(&a, g_intbuf, 16); 1.938 + 1.939 + mp_clear(&a); 1.940 + if(strcmp(g_intbuf, q_mp7c2) != 0) { 1.941 + reason("error: computed %s, expected %s\n", g_intbuf, q_mp7c2); 1.942 + return 1; 1.943 + } 1.944 + 1.945 + return 0; 1.946 +} 1.947 + 1.948 +/*------------------------------------------------------------------------*/ 1.949 + 1.950 +int test_div_2d(void) 1.951 +{ 1.952 + mp_int a, q, r; 1.953 + 1.954 + mp_init(&q); mp_init(&r); 1.955 + mp_init(&a); mp_read_radix(&a, mp13, 16); 1.956 + 1.957 + IFOK( mp_div_2d(&a, 64, &q, &r) ); 1.958 + mp_clear(&a); 1.959 + 1.960 + mp_toradix(&q, g_intbuf, 16); 1.961 + 1.962 + if(strcmp(g_intbuf, q_mp13c) != 0) { 1.963 + reason("error: computed %s, expected %s\n", g_intbuf, q_mp13c); 1.964 + mp_clear(&q); mp_clear(&r); 1.965 + return 1; 1.966 + } 1.967 + 1.968 + mp_clear(&q); 1.969 + 1.970 + mp_toradix(&r, g_intbuf, 16); 1.971 + if(strcmp(g_intbuf, r_mp13c) != 0) { 1.972 + reason("error, computed %s, expected %s\n", g_intbuf, r_mp13c); 1.973 + mp_clear(&r); 1.974 + return 1; 1.975 + } 1.976 + 1.977 + mp_clear(&r); 1.978 + 1.979 + return 0; 1.980 +} 1.981 + 1.982 +/*------------------------------------------------------------------------*/ 1.983 + 1.984 +int test_div(void) 1.985 +{ 1.986 + mp_int a, b, r; 1.987 + int err = 0; 1.988 + 1.989 + mp_init(&a); mp_init(&b); mp_init(&r); 1.990 + 1.991 + mp_read_radix(&a, mp4, 16); mp_read_radix(&b, mp2, 16); 1.992 + IFOK( mp_div(&a, &b, &a, &r) ); 1.993 + mp_toradix(&a, g_intbuf, 16); 1.994 + 1.995 + if(strcmp(g_intbuf, q_mp42) != 0) { 1.996 + reason("error: test 1 computed quot %s, expected %s\n", g_intbuf, q_mp42); 1.997 + ++err; 1.998 + } 1.999 + 1.1000 + mp_toradix(&r, g_intbuf, 16); 1.1001 + 1.1002 + if(strcmp(g_intbuf, r_mp42) != 0) { 1.1003 + reason("error: test 1 computed rem %s, expected %s\n", g_intbuf, r_mp42); 1.1004 + ++err; 1.1005 + } 1.1006 + 1.1007 + mp_read_radix(&a, mp4, 16); mp_read_radix(&b, mp5a, 16); 1.1008 + IFOK( mp_div(&a, &b, &a, &r) ); 1.1009 + mp_toradix(&a, g_intbuf, 16); 1.1010 + 1.1011 + if(strcmp(g_intbuf, q_mp45a) != 0) { 1.1012 + reason("error: test 2 computed quot %s, expected %s\n", g_intbuf, q_mp45a); 1.1013 + ++err; 1.1014 + } 1.1015 + 1.1016 + mp_toradix(&r, g_intbuf, 16); 1.1017 + 1.1018 + if(strcmp(g_intbuf, r_mp45a) != 0) { 1.1019 + reason("error: test 2 computed rem %s, expected %s\n", g_intbuf, r_mp45a); 1.1020 + ++err; 1.1021 + } 1.1022 + 1.1023 + mp_read_radix(&a, mp14, 16); mp_read_radix(&b, mp4, 16); 1.1024 + IFOK( mp_div(&a, &b, &a, &r) ); 1.1025 + mp_toradix(&a, g_intbuf, 16); 1.1026 + 1.1027 + if(strcmp(g_intbuf, q_mp1404) != 0) { 1.1028 + reason("error: test 3 computed quot %s, expected %s\n", g_intbuf, q_mp1404); 1.1029 + ++err; 1.1030 + } 1.1031 + 1.1032 + mp_toradix(&r, g_intbuf, 16); 1.1033 + 1.1034 + if(strcmp(g_intbuf, r_mp1404) != 0) { 1.1035 + reason("error: test 3 computed rem %s, expected %s\n", g_intbuf, r_mp1404); 1.1036 + ++err; 1.1037 + } 1.1038 + 1.1039 + mp_clear(&a); mp_clear(&b); mp_clear(&r); 1.1040 + 1.1041 + return err; 1.1042 +} 1.1043 + 1.1044 +/*------------------------------------------------------------------------*/ 1.1045 + 1.1046 +int test_expt_d(void) 1.1047 +{ 1.1048 + mp_int a; 1.1049 + 1.1050 + mp_init(&a); mp_read_radix(&a, mp5, 16); 1.1051 + mp_expt_d(&a, md9, &a); 1.1052 + mp_toradix(&a, g_intbuf, 16); 1.1053 + 1.1054 + mp_clear(&a); 1.1055 + if(strcmp(g_intbuf, e_mp5d9) != 0) { 1.1056 + reason("error: computed %s, expected %s\n", g_intbuf, e_mp5d9); 1.1057 + return 1; 1.1058 + } 1.1059 + 1.1060 + return 0; 1.1061 +} 1.1062 + 1.1063 +/*------------------------------------------------------------------------*/ 1.1064 + 1.1065 +int test_expt(void) 1.1066 +{ 1.1067 + mp_int a, b; 1.1068 + 1.1069 + mp_init(&a); mp_init(&b); 1.1070 + mp_read_radix(&a, mp7, 16); mp_read_radix(&b, mp8, 16); 1.1071 + 1.1072 + mp_expt(&a, &b, &a); 1.1073 + mp_toradix(&a, g_intbuf, 16); 1.1074 + mp_clear(&a); mp_clear(&b); 1.1075 + 1.1076 + if(strcmp(g_intbuf, e_mp78) != 0) { 1.1077 + reason("error: computed %s, expected %s\n", g_intbuf, e_mp78); 1.1078 + return 1; 1.1079 + } 1.1080 + 1.1081 + return 0; 1.1082 +} 1.1083 + 1.1084 +/*------------------------------------------------------------------------*/ 1.1085 + 1.1086 +int test_2expt(void) 1.1087 +{ 1.1088 + mp_int a; 1.1089 + 1.1090 + mp_init(&a); 1.1091 + mp_2expt(&a, md3); 1.1092 + mp_toradix(&a, g_intbuf, 16); 1.1093 + mp_clear(&a); 1.1094 + 1.1095 + if(strcmp(g_intbuf, e_mpc2d3) != 0) { 1.1096 + reason("error: computed %s, expected %s\n", g_intbuf, e_mpc2d3); 1.1097 + return 1; 1.1098 + } 1.1099 + 1.1100 + return 0; 1.1101 +} 1.1102 + 1.1103 +/*------------------------------------------------------------------------*/ 1.1104 + 1.1105 +int test_sqrt(void) 1.1106 +{ 1.1107 + mp_int a; 1.1108 + int res = 0; 1.1109 + 1.1110 + mp_init(&a); mp_read_radix(&a, mp9, 16); 1.1111 + mp_sqrt(&a, &a); 1.1112 + mp_toradix(&a, g_intbuf, 16); 1.1113 + 1.1114 + if(strcmp(g_intbuf, t_mp9) != 0) { 1.1115 + reason("error: computed %s, expected %s\n", g_intbuf, t_mp9); 1.1116 + res = 1; goto CLEANUP; 1.1117 + } 1.1118 + 1.1119 + mp_read_radix(&a, mp15, 16); 1.1120 + mp_sqrt(&a, &a); 1.1121 + mp_toradix(&a, g_intbuf, 16); 1.1122 + 1.1123 + if(strcmp(g_intbuf, t_mp15) != 0) { 1.1124 + reason("error: computed %s, expected %s\n", g_intbuf, t_mp15); 1.1125 + res = 1; 1.1126 + } 1.1127 + 1.1128 + CLEANUP: 1.1129 + mp_clear(&a); 1.1130 + return res; 1.1131 +} 1.1132 + 1.1133 +/*------------------------------------------------------------------------*/ 1.1134 + 1.1135 +int test_mod_d(void) 1.1136 +{ 1.1137 + mp_int a; 1.1138 + mp_digit r; 1.1139 + 1.1140 + mp_init(&a); mp_read_radix(&a, mp5, 16); 1.1141 + IFOK( mp_mod_d(&a, md5, &r) ); 1.1142 + sprintf(g_intbuf, ZS_DIGIT_FMT, r); 1.1143 + mp_clear(&a); 1.1144 + 1.1145 + if(strcmp(g_intbuf, r_mp5d5) != 0) { 1.1146 + reason("error: computed %s, expected %s\n", g_intbuf, r_mp5d5); 1.1147 + return 1; 1.1148 + } 1.1149 + 1.1150 + return 0; 1.1151 +} 1.1152 + 1.1153 +/*------------------------------------------------------------------------*/ 1.1154 + 1.1155 +int test_mod(void) 1.1156 +{ 1.1157 + mp_int a, m; 1.1158 + 1.1159 + mp_init(&a); mp_init(&m); 1.1160 + mp_read_radix(&a, mp4, 16); mp_read_radix(&m, mp7, 16); 1.1161 + IFOK( mp_mod(&a, &m, &a) ); 1.1162 + mp_toradix(&a, g_intbuf, 16); 1.1163 + mp_clear(&a); mp_clear(&m); 1.1164 + 1.1165 + if(strcmp(g_intbuf, r_mp47) != 0) { 1.1166 + reason("error: computed %s, expected %s\n", g_intbuf, r_mp47); 1.1167 + return 1; 1.1168 + } 1.1169 + 1.1170 + return 0; 1.1171 +} 1.1172 + 1.1173 +/*------------------------------------------------------------------------*/ 1.1174 + 1.1175 +int test_addmod(void) 1.1176 +{ 1.1177 + mp_int a, b, m; 1.1178 + 1.1179 + mp_init(&a); mp_init(&b); mp_init(&m); 1.1180 + mp_read_radix(&a, mp3, 16); mp_read_radix(&b, mp4, 16); 1.1181 + mp_read_radix(&m, mp5, 16); 1.1182 + 1.1183 + IFOK( mp_addmod(&a, &b, &m, &a) ); 1.1184 + mp_toradix(&a, g_intbuf, 16); 1.1185 + mp_clear(&a); mp_clear(&b); mp_clear(&m); 1.1186 + 1.1187 + if(strcmp(g_intbuf, ms_mp345) != 0) { 1.1188 + reason("error: computed %s, expected %s\n", g_intbuf, ms_mp345); 1.1189 + return 1; 1.1190 + } 1.1191 + 1.1192 + return 0; 1.1193 +} 1.1194 + 1.1195 +/*------------------------------------------------------------------------*/ 1.1196 + 1.1197 +int test_submod(void) 1.1198 +{ 1.1199 + mp_int a, b, m; 1.1200 + 1.1201 + mp_init(&a); mp_init(&b); mp_init(&m); 1.1202 + mp_read_radix(&a, mp3, 16); mp_read_radix(&b, mp4, 16); 1.1203 + mp_read_radix(&m, mp5, 16); 1.1204 + 1.1205 + IFOK( mp_submod(&a, &b, &m, &a) ); 1.1206 + mp_toradix(&a, g_intbuf, 16); 1.1207 + mp_clear(&a); mp_clear(&b); mp_clear(&m); 1.1208 + 1.1209 + if(strcmp(g_intbuf, md_mp345) != 0) { 1.1210 + reason("error: computed %s, expected %s\n", g_intbuf, md_mp345); 1.1211 + return 1; 1.1212 + } 1.1213 + 1.1214 + return 0; 1.1215 +} 1.1216 + 1.1217 +/*------------------------------------------------------------------------*/ 1.1218 + 1.1219 +int test_mulmod(void) 1.1220 +{ 1.1221 + mp_int a, b, m; 1.1222 + 1.1223 + mp_init(&a); mp_init(&b); mp_init(&m); 1.1224 + mp_read_radix(&a, mp3, 16); mp_read_radix(&b, mp4, 16); 1.1225 + mp_read_radix(&m, mp5, 16); 1.1226 + 1.1227 + IFOK( mp_mulmod(&a, &b, &m, &a) ); 1.1228 + mp_toradix(&a, g_intbuf, 16); 1.1229 + mp_clear(&a); mp_clear(&b); mp_clear(&m); 1.1230 + 1.1231 + if(strcmp(g_intbuf, mp_mp345) != 0) { 1.1232 + reason("error: computed %s, expected %s\n", g_intbuf, mp_mp345); 1.1233 + return 1; 1.1234 + } 1.1235 + 1.1236 + return 0; 1.1237 +} 1.1238 + 1.1239 +/*------------------------------------------------------------------------*/ 1.1240 + 1.1241 +int test_sqrmod(void) 1.1242 +{ 1.1243 + mp_int a, m; 1.1244 + 1.1245 + mp_init(&a); mp_init(&m); 1.1246 + mp_read_radix(&a, mp3, 16); mp_read_radix(&m, mp5, 16); 1.1247 + 1.1248 + IFOK( mp_sqrmod(&a, &m, &a) ); 1.1249 + mp_toradix(&a, g_intbuf, 16); 1.1250 + mp_clear(&a); mp_clear(&m); 1.1251 + 1.1252 + if(strcmp(g_intbuf, mp_mp335) != 0) { 1.1253 + reason("error: computed %s, expected %s\n", g_intbuf, mp_mp335); 1.1254 + return 1; 1.1255 + } 1.1256 + 1.1257 + return 0; 1.1258 +} 1.1259 + 1.1260 +/*------------------------------------------------------------------------*/ 1.1261 + 1.1262 +int test_exptmod(void) 1.1263 +{ 1.1264 + mp_int a, b, m; 1.1265 + int res = 0; 1.1266 + 1.1267 + mp_init(&a); mp_init(&b); mp_init(&m); 1.1268 + mp_read_radix(&a, mp8, 16); mp_read_radix(&b, mp1, 16); 1.1269 + mp_read_radix(&m, mp7, 16); 1.1270 + 1.1271 + IFOK( mp_exptmod(&a, &b, &m, &a) ); 1.1272 + mp_toradix(&a, g_intbuf, 16); 1.1273 + 1.1274 + if(strcmp(g_intbuf, me_mp817) != 0) { 1.1275 + reason("case 1: error: computed %s, expected %s\n", g_intbuf, me_mp817); 1.1276 + res = 1; goto CLEANUP; 1.1277 + } 1.1278 + 1.1279 + mp_read_radix(&a, mp1, 16); mp_read_radix(&b, mp5, 16); 1.1280 + mp_read_radix(&m, mp12, 16); 1.1281 + 1.1282 + IFOK( mp_exptmod(&a, &b, &m, &a) ); 1.1283 + mp_toradix(&a, g_intbuf, 16); 1.1284 + 1.1285 + if(strcmp(g_intbuf, me_mp1512) != 0) { 1.1286 + reason("case 2: error: computed %s, expected %s\n", g_intbuf, me_mp1512); 1.1287 + res = 1; goto CLEANUP; 1.1288 + } 1.1289 + 1.1290 + mp_read_radix(&a, mp5, 16); mp_read_radix(&b, mp1, 16); 1.1291 + mp_read_radix(&m, mp14, 16); 1.1292 + 1.1293 + IFOK( mp_exptmod(&a, &b, &m, &a) ); 1.1294 + mp_toradix(&a, g_intbuf, 16); 1.1295 + 1.1296 + if(strcmp(g_intbuf, me_mp5114) != 0) { 1.1297 + reason("case 3: error: computed %s, expected %s\n", g_intbuf, me_mp5114); 1.1298 + res = 1; 1.1299 + } 1.1300 + 1.1301 + mp_read_radix(&a, mp16, 16); mp_read_radix(&b, mp17, 16); 1.1302 + mp_read_radix(&m, mp18, 16); 1.1303 + 1.1304 + IFOK( mp_exptmod(&a, &b, &m, &a) ); 1.1305 + mp_toradix(&a, g_intbuf, 16); 1.1306 + 1.1307 + if(strcmp(g_intbuf, me_mp161718) != 0) { 1.1308 + reason("case 4: error: computed %s, expected %s\n", g_intbuf, me_mp161718); 1.1309 + res = 1; 1.1310 + } 1.1311 + 1.1312 + CLEANUP: 1.1313 + mp_clear(&a); mp_clear(&b); mp_clear(&m); 1.1314 + return res; 1.1315 +} 1.1316 + 1.1317 +/*------------------------------------------------------------------------*/ 1.1318 + 1.1319 +int test_exptmod_d(void) 1.1320 +{ 1.1321 + mp_int a, m; 1.1322 + 1.1323 + mp_init(&a); mp_init(&m); 1.1324 + mp_read_radix(&a, mp5, 16); mp_read_radix(&m, mp7, 16); 1.1325 + 1.1326 + IFOK( mp_exptmod_d(&a, md4, &m, &a) ); 1.1327 + mp_toradix(&a, g_intbuf, 16); 1.1328 + mp_clear(&a); mp_clear(&m); 1.1329 + 1.1330 + if(strcmp(g_intbuf, me_mp5d47) != 0) { 1.1331 + reason("error: computed %s, expected %s\n", g_intbuf, me_mp5d47); 1.1332 + return 1; 1.1333 + } 1.1334 + 1.1335 + return 0; 1.1336 +} 1.1337 + 1.1338 +/*------------------------------------------------------------------------*/ 1.1339 + 1.1340 +int test_invmod(void) 1.1341 +{ 1.1342 + mp_int a, m, c; 1.1343 + mp_int p1, p2, p3, p4, p5; 1.1344 + mp_int t1, t2, t3, t4; 1.1345 + mp_err res; 1.1346 + 1.1347 + /* 5 128-bit primes. */ 1.1348 + static const char ivp1[] = { "AAD8A5A2A2BEF644BAEE7DB0CA643719" }; 1.1349 + static const char ivp2[] = { "CB371AD2B79A90BCC88D0430663E40B9" }; 1.1350 + static const char ivp3[] = { "C6C818D4DF2618406CA09280C0400099" }; 1.1351 + static const char ivp4[] = { "CE949C04512E68918006B1F0D7E93F27" }; 1.1352 + static const char ivp5[] = { "F8EE999B6416645040687440E0B89F51" }; 1.1353 + 1.1354 + mp_init(&a); mp_init(&m); 1.1355 + mp_read_radix(&a, mp2, 16); mp_read_radix(&m, mp7, 16); 1.1356 + 1.1357 + IFOK( mp_invmod(&a, &m, &a) ); 1.1358 + 1.1359 + mp_toradix(&a, g_intbuf, 16); 1.1360 + mp_clear(&a); mp_clear(&m); 1.1361 + 1.1362 + if(strcmp(g_intbuf, i_mp27) != 0) { 1.1363 + reason("error: invmod test 1 computed %s, expected %s\n", g_intbuf, i_mp27); 1.1364 + return 1; 1.1365 + } 1.1366 + 1.1367 + mp_init(&a); mp_init(&m); 1.1368 + mp_read_radix(&a, mp20, 16); mp_read_radix(&m, mp19, 16); 1.1369 + 1.1370 + IFOK( mp_invmod(&a, &m, &a) ); 1.1371 + 1.1372 + mp_toradix(&a, g_intbuf, 16); 1.1373 + mp_clear(&a); mp_clear(&m); 1.1374 + 1.1375 + if(strcmp(g_intbuf, i_mp2019) != 0) { 1.1376 + reason("error: invmod test 2 computed %s, expected %s\n", g_intbuf, i_mp2019); 1.1377 + return 1; 1.1378 + } 1.1379 + 1.1380 +/* Need the following test cases: 1.1381 + Odd modulus 1.1382 + - a is odd, relatively prime to m 1.1383 + - a is odd, not relatively prime to m 1.1384 + - a is even, relatively prime to m 1.1385 + - a is even, not relatively prime to m 1.1386 + Even modulus 1.1387 + - a is even (should fail) 1.1388 + - a is odd, not relatively prime to m 1.1389 + - a is odd, relatively prime to m, 1.1390 + m is not a power of 2 1.1391 + - m has factor 2**k, k < 32 1.1392 + - m has factor 2**k, k > 32 1.1393 + m is a power of 2, 2**k 1.1394 + - k < 32 1.1395 + - k > 32 1.1396 +*/ 1.1397 + 1.1398 + mp_init(&a); mp_init(&m); mp_init(&c); 1.1399 + mp_init(&p1); mp_init(&p2); mp_init(&p3); mp_init(&p4); mp_init(&p5); 1.1400 + mp_init(&t1); mp_init(&t2); mp_init(&t3); mp_init(&t4); 1.1401 + 1.1402 + mp_read_radix(&p1, ivp1, 16); 1.1403 + mp_read_radix(&p2, ivp2, 16); 1.1404 + mp_read_radix(&p3, ivp3, 16); 1.1405 + mp_read_radix(&p4, ivp4, 16); 1.1406 + mp_read_radix(&p5, ivp5, 16); 1.1407 + 1.1408 + IFOK( mp_2expt(&t2, 68) ); /* t2 = 2**68 */ 1.1409 + IFOK( mp_2expt(&t3, 128) ); /* t3 = 2**128 */ 1.1410 + IFOK( mp_2expt(&t4, 31) ); /* t4 = 2**31 */ 1.1411 + 1.1412 +/* test 3: Odd modulus - a is odd, relatively prime to m */ 1.1413 + 1.1414 + IFOK( mp_mul(&p1, &p2, &a) ); 1.1415 + IFOK( mp_mul(&p3, &p4, &m) ); 1.1416 + IFOK( mp_invmod(&a, &m, &t1) ); 1.1417 + IFOK( mp_invmod_xgcd(&a, &m, &c) ); 1.1418 + 1.1419 + if (mp_cmp(&t1, &c) != 0) { 1.1420 + mp_toradix(&t1, g_intbuf, 16); 1.1421 + mp_toradix(&c, a_intbuf, 16); 1.1422 + reason("error: invmod test 3 computed %s, expected %s\n", 1.1423 + g_intbuf, a_intbuf); 1.1424 + return 1; 1.1425 + } 1.1426 + mp_clear(&a); mp_clear(&t1); mp_clear(&c); 1.1427 + mp_init(&a); mp_init(&t1); mp_init(&c); 1.1428 + 1.1429 +/* test 4: Odd modulus - a is odd, NOT relatively prime to m */ 1.1430 + 1.1431 + IFOK( mp_mul(&p1, &p3, &a) ); 1.1432 + /* reuse same m as before */ 1.1433 + 1.1434 + res = mp_invmod_xgcd(&a, &m, &c); 1.1435 + if (res != MP_UNDEF) 1.1436 + goto CLEANUP4; 1.1437 + 1.1438 + res = mp_invmod(&a, &m, &t1); /* we expect this to fail. */ 1.1439 + if (res != MP_UNDEF) { 1.1440 +CLEANUP4: 1.1441 + reason("error: invmod test 4 succeeded, should have failed.\n"); 1.1442 + return 1; 1.1443 + } 1.1444 + mp_clear(&a); mp_clear(&t1); mp_clear(&c); 1.1445 + mp_init(&a); mp_init(&t1); mp_init(&c); 1.1446 + 1.1447 +/* test 5: Odd modulus - a is even, relatively prime to m */ 1.1448 + 1.1449 + IFOK( mp_mul(&p1, &t2, &a) ); 1.1450 + /* reuse m */ 1.1451 + IFOK( mp_invmod(&a, &m, &t1) ); 1.1452 + IFOK( mp_invmod_xgcd(&a, &m, &c) ); 1.1453 + 1.1454 + if (mp_cmp(&t1, &c) != 0) { 1.1455 + mp_toradix(&t1, g_intbuf, 16); 1.1456 + mp_toradix(&c, a_intbuf, 16); 1.1457 + reason("error: invmod test 5 computed %s, expected %s\n", 1.1458 + g_intbuf, a_intbuf); 1.1459 + return 1; 1.1460 + } 1.1461 + mp_clear(&a); mp_clear(&t1); mp_clear(&c); 1.1462 + mp_init(&a); mp_init(&t1); mp_init(&c); 1.1463 + 1.1464 +/* test 6: Odd modulus - a is odd, NOT relatively prime to m */ 1.1465 + 1.1466 + /* reuse t2 */ 1.1467 + IFOK( mp_mul(&t2, &p3, &a) ); 1.1468 + /* reuse same m as before */ 1.1469 + 1.1470 + res = mp_invmod_xgcd(&a, &m, &c); 1.1471 + if (res != MP_UNDEF) 1.1472 + goto CLEANUP6; 1.1473 + 1.1474 + res = mp_invmod(&a, &m, &t1); /* we expect this to fail. */ 1.1475 + if (res != MP_UNDEF) { 1.1476 +CLEANUP6: 1.1477 + reason("error: invmod test 6 succeeded, should have failed.\n"); 1.1478 + return 1; 1.1479 + } 1.1480 + mp_clear(&a); mp_clear(&m); mp_clear(&c); mp_clear(&t1); 1.1481 + mp_init(&a); mp_init(&m); mp_init(&c); mp_init(&t1); 1.1482 + 1.1483 +/* test 7: Even modulus, even a, should fail */ 1.1484 + 1.1485 + IFOK( mp_mul(&p3, &t3, &m) ); /* even m */ 1.1486 + /* reuse t2 */ 1.1487 + IFOK( mp_mul(&p1, &t2, &a) ); /* even a */ 1.1488 + 1.1489 + res = mp_invmod_xgcd(&a, &m, &c); 1.1490 + if (res != MP_UNDEF) 1.1491 + goto CLEANUP7; 1.1492 + 1.1493 + res = mp_invmod(&a, &m, &t1); /* we expect this to fail. */ 1.1494 + if (res != MP_UNDEF) { 1.1495 +CLEANUP7: 1.1496 + reason("error: invmod test 7 succeeded, should have failed.\n"); 1.1497 + return 1; 1.1498 + } 1.1499 + mp_clear(&a); mp_clear(&c); mp_clear(&t1); 1.1500 + mp_init(&a); mp_init(&c); mp_init(&t1); 1.1501 + 1.1502 +/* test 8: Even modulus - a is odd, not relatively prime to m */ 1.1503 + 1.1504 + /* reuse m */ 1.1505 + IFOK( mp_mul(&p3, &p1, &a) ); /* even a */ 1.1506 + 1.1507 + res = mp_invmod_xgcd(&a, &m, &c); 1.1508 + if (res != MP_UNDEF) 1.1509 + goto CLEANUP8; 1.1510 + 1.1511 + res = mp_invmod(&a, &m, &t1); /* we expect this to fail. */ 1.1512 + if (res != MP_UNDEF) { 1.1513 +CLEANUP8: 1.1514 + reason("error: invmod test 8 succeeded, should have failed.\n"); 1.1515 + return 1; 1.1516 + } 1.1517 + mp_clear(&a); mp_clear(&m); mp_clear(&c); mp_clear(&t1); 1.1518 + mp_init(&a); mp_init(&m); mp_init(&c); mp_init(&t1); 1.1519 + 1.1520 +/* test 9: Even modulus - m has factor 2**k, k < 32 1.1521 + * - a is odd, relatively prime to m, 1.1522 + */ 1.1523 + IFOK( mp_mul(&p3, &t4, &m) ); /* even m */ 1.1524 + IFOK( mp_mul(&p1, &p2, &a) ); 1.1525 + IFOK( mp_invmod(&a, &m, &t1) ); 1.1526 + IFOK( mp_invmod_xgcd(&a, &m, &c) ); 1.1527 + 1.1528 + if (mp_cmp(&t1, &c) != 0) { 1.1529 + mp_toradix(&t1, g_intbuf, 16); 1.1530 + mp_toradix(&c, a_intbuf, 16); 1.1531 + reason("error: invmod test 9 computed %s, expected %s\n", 1.1532 + g_intbuf, a_intbuf); 1.1533 + return 1; 1.1534 + } 1.1535 + mp_clear(&m); mp_clear(&t1); mp_clear(&c); 1.1536 + mp_init(&m); mp_init(&t1); mp_init(&c); 1.1537 + 1.1538 +/* test 10: Even modulus - m has factor 2**k, k > 32 1.1539 + * - a is odd, relatively prime to m, 1.1540 + */ 1.1541 + IFOK( mp_mul(&p3, &t3, &m) ); /* even m */ 1.1542 + /* reuse a */ 1.1543 + IFOK( mp_invmod(&a, &m, &t1) ); 1.1544 + IFOK( mp_invmod_xgcd(&a, &m, &c) ); 1.1545 + 1.1546 + if (mp_cmp(&t1, &c) != 0) { 1.1547 + mp_toradix(&t1, g_intbuf, 16); 1.1548 + mp_toradix(&c, a_intbuf, 16); 1.1549 + reason("error: invmod test 10 computed %s, expected %s\n", 1.1550 + g_intbuf, a_intbuf); 1.1551 + return 1; 1.1552 + } 1.1553 + mp_clear(&t1); mp_clear(&c); 1.1554 + mp_init(&t1); mp_init(&c); 1.1555 + 1.1556 +/* test 11: Even modulus - m is a power of 2, 2**k | k < 32 1.1557 + * - a is odd, relatively prime to m, 1.1558 + */ 1.1559 + IFOK( mp_invmod(&a, &t4, &t1) ); 1.1560 + IFOK( mp_invmod_xgcd(&a, &t4, &c) ); 1.1561 + 1.1562 + if (mp_cmp(&t1, &c) != 0) { 1.1563 + mp_toradix(&t1, g_intbuf, 16); 1.1564 + mp_toradix(&c, a_intbuf, 16); 1.1565 + reason("error: invmod test 11 computed %s, expected %s\n", 1.1566 + g_intbuf, a_intbuf); 1.1567 + return 1; 1.1568 + } 1.1569 + mp_clear(&t1); mp_clear(&c); 1.1570 + mp_init(&t1); mp_init(&c); 1.1571 + 1.1572 +/* test 12: Even modulus - m is a power of 2, 2**k | k > 32 1.1573 + * - a is odd, relatively prime to m, 1.1574 + */ 1.1575 + IFOK( mp_invmod(&a, &t3, &t1) ); 1.1576 + IFOK( mp_invmod_xgcd(&a, &t3, &c) ); 1.1577 + 1.1578 + if (mp_cmp(&t1, &c) != 0) { 1.1579 + mp_toradix(&t1, g_intbuf, 16); 1.1580 + mp_toradix(&c, a_intbuf, 16); 1.1581 + reason("error: invmod test 12 computed %s, expected %s\n", 1.1582 + g_intbuf, a_intbuf); 1.1583 + return 1; 1.1584 + } 1.1585 + 1.1586 + mp_clear(&a); mp_clear(&m); mp_clear(&c); 1.1587 + mp_clear(&t1); mp_clear(&t2); mp_clear(&t3); mp_clear(&t4); 1.1588 + mp_clear(&p1); mp_clear(&p2); mp_clear(&p3); mp_clear(&p4); mp_clear(&p5); 1.1589 + 1.1590 + return 0; 1.1591 +} 1.1592 + 1.1593 +/*------------------------------------------------------------------------*/ 1.1594 + 1.1595 +int test_cmp_d(void) 1.1596 +{ 1.1597 + mp_int a; 1.1598 + 1.1599 + mp_init(&a); mp_read_radix(&a, mp8, 16); 1.1600 + 1.1601 + if(mp_cmp_d(&a, md8) >= 0) { 1.1602 + reason("error: %s >= " DIGIT_FMT "\n", mp8, md8); 1.1603 + mp_clear(&a); 1.1604 + return 1; 1.1605 + } 1.1606 + 1.1607 + mp_read_radix(&a, mp5, 16); 1.1608 + 1.1609 + if(mp_cmp_d(&a, md8) <= 0) { 1.1610 + reason("error: %s <= " DIGIT_FMT "\n", mp5, md8); 1.1611 + mp_clear(&a); 1.1612 + return 1; 1.1613 + } 1.1614 + 1.1615 + mp_read_radix(&a, mp6, 16); 1.1616 + 1.1617 + if(mp_cmp_d(&a, md1) != 0) { 1.1618 + reason("error: %s != " DIGIT_FMT "\n", mp6, md1); 1.1619 + mp_clear(&a); 1.1620 + return 1; 1.1621 + } 1.1622 + 1.1623 + mp_clear(&a); 1.1624 + return 0; 1.1625 + 1.1626 +} 1.1627 + 1.1628 +/*------------------------------------------------------------------------*/ 1.1629 + 1.1630 +int test_cmp_z(void) 1.1631 +{ 1.1632 + mp_int a; 1.1633 + 1.1634 + mp_init(&a); mp_read_radix(&a, mp6, 16); 1.1635 + 1.1636 + if(mp_cmp_z(&a) != 0) { 1.1637 + reason("error: someone thinks a zero value is non-zero\n"); 1.1638 + mp_clear(&a); 1.1639 + return 1; 1.1640 + } 1.1641 + 1.1642 + mp_read_radix(&a, mp1, 16); 1.1643 + 1.1644 + if(mp_cmp_z(&a) <= 0) { 1.1645 + reason("error: someone thinks a positive value is non-positive\n"); 1.1646 + mp_clear(&a); 1.1647 + return 1; 1.1648 + } 1.1649 + 1.1650 + mp_read_radix(&a, mp4, 16); 1.1651 + 1.1652 + if(mp_cmp_z(&a) >= 0) { 1.1653 + reason("error: someone thinks a negative value is non-negative\n"); 1.1654 + mp_clear(&a); 1.1655 + return 1; 1.1656 + } 1.1657 + 1.1658 + mp_clear(&a); 1.1659 + return 0; 1.1660 +} 1.1661 + 1.1662 +/*------------------------------------------------------------------------*/ 1.1663 + 1.1664 +int test_cmp(void) 1.1665 +{ 1.1666 + mp_int a, b; 1.1667 + 1.1668 + mp_init(&a); mp_init(&b); 1.1669 + mp_read_radix(&a, mp3, 16); mp_read_radix(&b, mp4, 16); 1.1670 + 1.1671 + if(mp_cmp(&a, &b) <= 0) { 1.1672 + reason("error: %s <= %s\n", mp3, mp4); 1.1673 + mp_clear(&a); mp_clear(&b); 1.1674 + return 1; 1.1675 + } 1.1676 + 1.1677 + mp_read_radix(&b, mp3, 16); 1.1678 + if(mp_cmp(&a, &b) != 0) { 1.1679 + reason("error: %s != %s\n", mp3, mp3); 1.1680 + mp_clear(&a); mp_clear(&b); 1.1681 + return 1; 1.1682 + } 1.1683 + 1.1684 + mp_read_radix(&a, mp5, 16); 1.1685 + if(mp_cmp(&a, &b) >= 0) { 1.1686 + reason("error: %s >= %s\n", mp5, mp3); 1.1687 + mp_clear(&a); mp_clear(&b); 1.1688 + return 1; 1.1689 + } 1.1690 + 1.1691 + mp_read_radix(&a, mp5a, 16); 1.1692 + if(mp_cmp_int(&a, 1000000) >= 0 || 1.1693 + (mp_cmp_int(&a, -5000000) <= 0) || 1.1694 + (mp_cmp_int(&a, -4938110) != 0)) { 1.1695 + reason("error: long integer comparison failed (%s)", mp5a); 1.1696 + mp_clear(&a); mp_clear(&b); 1.1697 + return 1; 1.1698 + } 1.1699 + 1.1700 + mp_clear(&a); mp_clear(&b); 1.1701 + return 0; 1.1702 +} 1.1703 + 1.1704 +/*------------------------------------------------------------------------*/ 1.1705 + 1.1706 +int test_cmp_mag(void) 1.1707 +{ 1.1708 + mp_int a, b; 1.1709 + 1.1710 + mp_init(&a); mp_init(&b); 1.1711 + mp_read_radix(&a, mp5, 16); mp_read_radix(&b, mp4, 16); 1.1712 + 1.1713 + if(mp_cmp_mag(&a, &b) >= 0) { 1.1714 + reason("error: %s >= %s\n", mp5, mp4); 1.1715 + mp_clear(&a); mp_clear(&b); 1.1716 + return 1; 1.1717 + } 1.1718 + 1.1719 + mp_read_radix(&b, mp5, 16); 1.1720 + if(mp_cmp_mag(&a, &b) != 0) { 1.1721 + reason("error: %s != %s\n", mp5, mp5); 1.1722 + mp_clear(&a); mp_clear(&b); 1.1723 + return 1; 1.1724 + } 1.1725 + 1.1726 + mp_read_radix(&a, mp1, 16); 1.1727 + if(mp_cmp_mag(&b, &a) >= 0) { 1.1728 + reason("error: %s >= %s\n", mp5, mp1); 1.1729 + mp_clear(&a); mp_clear(&b); 1.1730 + return 1; 1.1731 + } 1.1732 + 1.1733 + mp_clear(&a); mp_clear(&b); 1.1734 + return 0; 1.1735 + 1.1736 +} 1.1737 + 1.1738 +/*------------------------------------------------------------------------*/ 1.1739 + 1.1740 +int test_parity(void) 1.1741 +{ 1.1742 + mp_int a; 1.1743 + 1.1744 + mp_init(&a); mp_read_radix(&a, mp1, 16); 1.1745 + 1.1746 + if(!mp_isodd(&a)) { 1.1747 + reason("error: expected operand to be odd, but it isn't\n"); 1.1748 + mp_clear(&a); 1.1749 + return 1; 1.1750 + } 1.1751 + 1.1752 + mp_read_radix(&a, mp6, 16); 1.1753 + 1.1754 + if(!mp_iseven(&a)) { 1.1755 + reason("error: expected operand to be even, but it isn't\n"); 1.1756 + mp_clear(&a); 1.1757 + return 1; 1.1758 + } 1.1759 + 1.1760 + mp_clear(&a); 1.1761 + return 0; 1.1762 +} 1.1763 + 1.1764 +/*------------------------------------------------------------------------*/ 1.1765 + 1.1766 +int test_gcd(void) 1.1767 +{ 1.1768 + mp_int a, b; 1.1769 + int out = 0; 1.1770 + 1.1771 + mp_init(&a); mp_init(&b); 1.1772 + mp_read_radix(&a, mp7, 16); mp_read_radix(&b, mp1, 16); 1.1773 + 1.1774 + mp_gcd(&a, &b, &a); 1.1775 + mp_toradix(&a, g_intbuf, 16); 1.1776 + 1.1777 + if(strcmp(g_intbuf, g_mp71) != 0) { 1.1778 + reason("error: computed %s, expected %s\n", g_intbuf, g_mp71); 1.1779 + out = 1; 1.1780 + } 1.1781 + 1.1782 + mp_clear(&a); mp_clear(&b); 1.1783 + return out; 1.1784 + 1.1785 +} 1.1786 + 1.1787 +/*------------------------------------------------------------------------*/ 1.1788 + 1.1789 +int test_lcm(void) 1.1790 +{ 1.1791 + mp_int a, b; 1.1792 + int out = 0; 1.1793 + 1.1794 + mp_init(&a); mp_init(&b); 1.1795 + mp_read_radix(&a, mp10, 16); mp_read_radix(&b, mp11, 16); 1.1796 + 1.1797 + mp_lcm(&a, &b, &a); 1.1798 + mp_toradix(&a, g_intbuf, 16); 1.1799 + 1.1800 + if(strcmp(g_intbuf, l_mp1011) != 0) { 1.1801 + reason("error: computed %s, expected%s\n", g_intbuf, l_mp1011); 1.1802 + out = 1; 1.1803 + } 1.1804 + 1.1805 + mp_clear(&a); mp_clear(&b); 1.1806 + 1.1807 + return out; 1.1808 + 1.1809 +} 1.1810 + 1.1811 +/*------------------------------------------------------------------------*/ 1.1812 + 1.1813 +int test_convert(void) 1.1814 +{ 1.1815 + int ix; 1.1816 + mp_int a; 1.1817 + 1.1818 + mp_init(&a); mp_read_radix(&a, mp9, 16); 1.1819 + 1.1820 + for(ix = LOW_RADIX; ix <= HIGH_RADIX; ix++) { 1.1821 + mp_toradix(&a, g_intbuf, ix); 1.1822 + 1.1823 + if(strcmp(g_intbuf, v_mp9[ix - LOW_RADIX]) != 0) { 1.1824 + reason("error: radix %d, computed %s, expected %s\n", 1.1825 + ix, g_intbuf, v_mp9[ix - LOW_RADIX]); 1.1826 + mp_clear(&a); 1.1827 + return 1; 1.1828 + } 1.1829 + } 1.1830 + 1.1831 + mp_clear(&a); 1.1832 + return 0; 1.1833 +} 1.1834 + 1.1835 +/*------------------------------------------------------------------------*/ 1.1836 + 1.1837 +int test_raw(void) 1.1838 +{ 1.1839 + int len, out = 0; 1.1840 + mp_int a; 1.1841 + char *buf; 1.1842 + 1.1843 + mp_init(&a); mp_read_radix(&a, mp4, 16); 1.1844 + 1.1845 + len = mp_raw_size(&a); 1.1846 + if(len != sizeof(b_mp4)) { 1.1847 + reason("error: test_raw: expected length %d, computed %d\n", sizeof(b_mp4), 1.1848 + len); 1.1849 + mp_clear(&a); 1.1850 + return 1; 1.1851 + } 1.1852 + 1.1853 + buf = calloc(len, sizeof(char)); 1.1854 + mp_toraw(&a, buf); 1.1855 + 1.1856 + if(memcmp(buf, b_mp4, sizeof(b_mp4)) != 0) { 1.1857 + reason("error: test_raw: binary output does not match test vector\n"); 1.1858 + out = 1; 1.1859 + } 1.1860 + 1.1861 + free(buf); 1.1862 + mp_clear(&a); 1.1863 + 1.1864 + return out; 1.1865 + 1.1866 +} 1.1867 + 1.1868 +/*------------------------------------------------------------------------*/ 1.1869 + 1.1870 +int test_pprime(void) 1.1871 +{ 1.1872 + mp_int p; 1.1873 + int err = 0; 1.1874 + mp_err res; 1.1875 + 1.1876 + mp_init(&p); 1.1877 + mp_read_radix(&p, mp7, 16); 1.1878 + 1.1879 + if(mpp_pprime(&p, 5) != MP_YES) { 1.1880 + reason("error: %s failed Rabin-Miller test, but is prime\n", mp7); 1.1881 + err = 1; 1.1882 + } 1.1883 + 1.1884 + IFOK( mp_set_int(&p, 9) ); 1.1885 + res = mpp_pprime(&p, 50); 1.1886 + if (res == MP_YES) { 1.1887 + reason("error: 9 is composite but passed Rabin-Miller test\n"); 1.1888 + err = 1; 1.1889 + } else if (res != MP_NO) { 1.1890 + reason("test mpp_pprime(9, 50) failed: error %d\n", res); 1.1891 + err = 1; 1.1892 + } 1.1893 + 1.1894 + IFOK( mp_set_int(&p, 15) ); 1.1895 + res = mpp_pprime(&p, 50); 1.1896 + if (res == MP_YES) { 1.1897 + reason("error: 15 is composite but passed Rabin-Miller test\n"); 1.1898 + err = 1; 1.1899 + } else if (res != MP_NO) { 1.1900 + reason("test mpp_pprime(15, 50) failed: error %d\n", res); 1.1901 + err = 1; 1.1902 + } 1.1903 + 1.1904 + mp_clear(&p); 1.1905 + 1.1906 + return err; 1.1907 + 1.1908 +} 1.1909 + 1.1910 +/*------------------------------------------------------------------------*/ 1.1911 + 1.1912 +int test_fermat(void) 1.1913 +{ 1.1914 + mp_int p; 1.1915 + mp_err res; 1.1916 + int err = 0; 1.1917 + 1.1918 + mp_init(&p); 1.1919 + mp_read_radix(&p, mp7, 16); 1.1920 + 1.1921 + if((res = mpp_fermat(&p, 2)) != MP_YES) { 1.1922 + reason("error: %s failed Fermat test on 2: %s\n", mp7, 1.1923 + mp_strerror(res)); 1.1924 + ++err; 1.1925 + } 1.1926 + 1.1927 + if((res = mpp_fermat(&p, 3)) != MP_YES) { 1.1928 + reason("error: %s failed Fermat test on 3: %s\n", mp7, 1.1929 + mp_strerror(res)); 1.1930 + ++err; 1.1931 + } 1.1932 + 1.1933 + mp_clear(&p); 1.1934 + 1.1935 + return err; 1.1936 + 1.1937 +} 1.1938 + 1.1939 +/*------------------------------------------------------------------------*/ 1.1940 +/* Like fprintf(), but only if we are behaving in a verbose manner */ 1.1941 + 1.1942 +void reason(char *fmt, ...) 1.1943 +{ 1.1944 + va_list ap; 1.1945 + 1.1946 + if(!g_verbose) 1.1947 + return; 1.1948 + 1.1949 + va_start(ap, fmt); 1.1950 + vfprintf(stderr, fmt, ap); 1.1951 + va_end(ap); 1.1952 +} 1.1953 + 1.1954 +/*------------------------------------------------------------------------*/ 1.1955 +/* HERE THERE BE DRAGONS */