1 /*-
2 * Copyright (c) 2006, Simon L. Nielsen <simon@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 */
27 #include <sys/cdefs.h>
28 #include <mp.h>
29 #include <stdio.h>
30 #include <string.h>
31 #include <sysexits.h>
32
33 MINT *c0, *c1, *c2, *c3, *c5, *c6, *c8, *c10, *c14, *c15, *c25, \
34 *c42,*c43, *c44, *c45, *t0, *t1;
35 static int tnr = 0;
36
37 static void
testmcmp(const MINT * mp1,const MINT * mp2,const char * tname)38 testmcmp(const MINT *mp1, const MINT *mp2, const char *tname)
39 {
40
41 if (mp_mcmp(mp1, mp2) == 0)
42 printf("ok %d - %s\n", ++tnr, tname);
43 else
44 printf("not ok - %d %s\n", ++tnr, tname);
45 }
46
47 static void
testsimpel(void)48 testsimpel(void)
49 {
50 const char str42[] = "2a";
51 MINT *t2;
52 char *s;
53
54 mp_madd(c42, c1, t0);
55 testmcmp(c43, t0, "madd0");
56 mp_madd(t0, c1, t0);
57 testmcmp(c44, t0, "madd1");
58 mp_msub(t0, c1, t0);
59 testmcmp(c43, t0, "msub0");
60 mp_msub(t0, c1, t0);
61 testmcmp(c42, t0, "msub1");
62 mp_move(c42, t0);
63 testmcmp(c42, t0, "move0");
64
65 t2 = mp_xtom(str42);
66 testmcmp(c42, t2, "xtom");
67 s = mp_mtox(t2);
68 if (strcmp(str42, s) == 0)
69 printf("ok %d - %s\n", ++tnr, "mtox0");
70 else
71 printf("not ok %d - %s\n", ++tnr, "mtox0");
72 mp_mfree(t2);
73 }
74
75 static void
testgcd(void)76 testgcd(void)
77 {
78
79 mp_gcd(c10, c15, t0);
80 testmcmp(t0, c5, "gcd0");
81 }
82
83 static void
testmsqrt(void)84 testmsqrt(void)
85 {
86
87 mp_msqrt(c25, t0, t1);
88 testmcmp(t0, c5, "msqrt0");
89 testmcmp(t1, c0, "msqrt1");
90 mp_msqrt(c42, t0, t1);
91 testmcmp(t0, c6, "msqrt2");
92 testmcmp(t1, c6, "msqrt3");
93 }
94
95 static void
testdiv(void)96 testdiv(void)
97 {
98 short ro;
99 MINT *t2;
100
101 mp_mdiv(c42, c5, t0, t1);
102 testmcmp(t0, c8, "mdiv0");
103 testmcmp(t1, c2, "mdiv1");
104
105 mp_mdiv(c10, c8, t0, t1);
106 testmcmp(t0, c1, "mdiv2");
107 testmcmp(t1, c2, "mdiv3");
108
109 mp_sdiv(c42, 5, t0, &ro);
110 testmcmp(t0, c8, "sdiv0");
111 t2 = mp_itom(ro); // Simpler to use common testmcmp()
112 testmcmp(t2, c2, "sdiv1");
113 mp_mfree(t2);
114
115 mp_sdiv(c10, 8, t0, &ro);
116 testmcmp(t0, c1, "sdiv2");
117 t2 = mp_itom(ro); // Simpler to use common testmcmp()
118 testmcmp(t2, c2, "sdiv3");
119 mp_mfree(t2);
120 }
121
122 static void
testmult(void)123 testmult(void)
124 {
125
126 mp_mult(c5, c2, t0);
127 testmcmp(t0, c10, "mmult0");
128 mp_mult(c3, c14, t0);
129 testmcmp(t0, c42, "mmult1");
130 }
131
132 static void
testpow(void)133 testpow(void)
134 {
135
136 mp_pow(c2, c3, c10, t0);
137 testmcmp(t0, c8, "pow0");
138 mp_pow(c2, c3, c3, t0);
139 testmcmp(t0, c2, "pow1");
140 mp_rpow(c2, 3, t0);
141 testmcmp(t0, c8, "rpow0");
142 }
143
144 /*
145 * This program performs some very basic tests of libmp(3). It is by
146 * no means expected to perform a complete test of the library for
147 * correctness, but is meant to test the API to make sure libmp (or
148 * libcrypto) updates don't totally break the library.
149 */
150 int
main(int argc,char * argv[])151 main(int argc, char *argv[])
152 {
153
154 printf("1..25\n");
155
156 /*
157 * Init "constants" variables - done in this somewhat
158 * cumbersome way to in theory be able to check for memory
159 * leaks.
160 */
161 c0 = mp_itom(0);
162 c1 = mp_itom(1);
163 c2 = mp_itom(2);
164 c3 = mp_itom(3);
165 c5 = mp_itom(5);
166 c6 = mp_itom(6);
167 c8 = mp_itom(8);
168 c10 = mp_itom(10);
169 c14 = mp_itom(14);
170 c15 = mp_itom(15);
171 c25 = mp_itom(25);
172 c42 = mp_itom(42);
173 c43 = mp_itom(43);
174 c44 = mp_itom(44);
175 c45 = mp_itom(45);
176
177 // Init temp variables
178 t0 = mp_itom(0);
179 t1 = mp_itom(0);
180
181 // Run tests
182 testsimpel();
183 testgcd();
184 testdiv();
185 testmult();
186 testpow();
187 testmsqrt();
188
189 // Cleanup
190 mp_mfree(c0);
191 mp_mfree(c1);
192 mp_mfree(c2);
193 mp_mfree(c3);
194 mp_mfree(c5);
195 mp_mfree(c6);
196 mp_mfree(c8);
197 mp_mfree(c10);
198 mp_mfree(c14);
199 mp_mfree(c15);
200 mp_mfree(c25);
201 mp_mfree(c42);
202 mp_mfree(c43);
203 mp_mfree(c44);
204 mp_mfree(c45);
205 mp_mfree(t0);
206 mp_mfree(t1);
207
208 return (EX_OK);
209 }
210