xref: /freebsd/contrib/bearssl/test/test_speed.c (revision 2aaf9152a852aba9eb2036b95f4948ee77988826)
1*0957b409SSimon J. Gerraty /*
2*0957b409SSimon J. Gerraty  * Copyright (c) 2016 Thomas Pornin <pornin@bolet.org>
3*0957b409SSimon J. Gerraty  *
4*0957b409SSimon J. Gerraty  * Permission is hereby granted, free of charge, to any person obtaining
5*0957b409SSimon J. Gerraty  * a copy of this software and associated documentation files (the
6*0957b409SSimon J. Gerraty  * "Software"), to deal in the Software without restriction, including
7*0957b409SSimon J. Gerraty  * without limitation the rights to use, copy, modify, merge, publish,
8*0957b409SSimon J. Gerraty  * distribute, sublicense, and/or sell copies of the Software, and to
9*0957b409SSimon J. Gerraty  * permit persons to whom the Software is furnished to do so, subject to
10*0957b409SSimon J. Gerraty  * the following conditions:
11*0957b409SSimon J. Gerraty  *
12*0957b409SSimon J. Gerraty  * The above copyright notice and this permission notice shall be
13*0957b409SSimon J. Gerraty  * included in all copies or substantial portions of the Software.
14*0957b409SSimon J. Gerraty  *
15*0957b409SSimon J. Gerraty  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16*0957b409SSimon J. Gerraty  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*0957b409SSimon J. Gerraty  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18*0957b409SSimon J. Gerraty  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19*0957b409SSimon J. Gerraty  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20*0957b409SSimon J. Gerraty  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21*0957b409SSimon J. Gerraty  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22*0957b409SSimon J. Gerraty  * SOFTWARE.
23*0957b409SSimon J. Gerraty  */
24*0957b409SSimon J. Gerraty 
25*0957b409SSimon J. Gerraty #include <stdio.h>
26*0957b409SSimon J. Gerraty #include <stdlib.h>
27*0957b409SSimon J. Gerraty #include <string.h>
28*0957b409SSimon J. Gerraty #include <time.h>
29*0957b409SSimon J. Gerraty #include "inner.h"
30*0957b409SSimon J. Gerraty 
31*0957b409SSimon J. Gerraty #define HASH_SIZE(cname)   br_ ## cname ## _SIZE
32*0957b409SSimon J. Gerraty 
33*0957b409SSimon J. Gerraty #define SPEED_HASH(Name, cname) \
34*0957b409SSimon J. Gerraty static void \
35*0957b409SSimon J. Gerraty test_speed_ ## cname(void) \
36*0957b409SSimon J. Gerraty { \
37*0957b409SSimon J. Gerraty 	unsigned char buf[8192]; \
38*0957b409SSimon J. Gerraty 	unsigned char tmp[HASH_SIZE(cname)]; \
39*0957b409SSimon J. Gerraty 	br_ ## cname ## _context mc; \
40*0957b409SSimon J. Gerraty 	int i; \
41*0957b409SSimon J. Gerraty 	long num; \
42*0957b409SSimon J. Gerraty  \
43*0957b409SSimon J. Gerraty 	memset(buf, 'T', sizeof buf); \
44*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) { \
45*0957b409SSimon J. Gerraty 		br_ ## cname ## _init(&mc); \
46*0957b409SSimon J. Gerraty 		br_ ## cname ## _update(&mc, buf, sizeof buf); \
47*0957b409SSimon J. Gerraty 		br_ ## cname ## _out(&mc, tmp); \
48*0957b409SSimon J. Gerraty 	} \
49*0957b409SSimon J. Gerraty 	num = 10; \
50*0957b409SSimon J. Gerraty 	for (;;) { \
51*0957b409SSimon J. Gerraty 		clock_t begin, end; \
52*0957b409SSimon J. Gerraty 		double tt; \
53*0957b409SSimon J. Gerraty 		long k; \
54*0957b409SSimon J. Gerraty  \
55*0957b409SSimon J. Gerraty 		br_ ## cname ## _init(&mc); \
56*0957b409SSimon J. Gerraty 		begin = clock(); \
57*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) { \
58*0957b409SSimon J. Gerraty 			br_ ## cname ## _update(&mc, buf, sizeof buf); \
59*0957b409SSimon J. Gerraty 		} \
60*0957b409SSimon J. Gerraty 		end = clock(); \
61*0957b409SSimon J. Gerraty 		br_ ## cname ## _out(&mc, tmp); \
62*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC; \
63*0957b409SSimon J. Gerraty 		if (tt >= 2.0) { \
64*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f MB/s\n", #Name, \
65*0957b409SSimon J. Gerraty 				((double)sizeof buf) * (double)num \
66*0957b409SSimon J. Gerraty 				/ (tt * 1000000.0)); \
67*0957b409SSimon J. Gerraty 			fflush(stdout); \
68*0957b409SSimon J. Gerraty 			return; \
69*0957b409SSimon J. Gerraty 		} \
70*0957b409SSimon J. Gerraty 		num <<= 1; \
71*0957b409SSimon J. Gerraty 	} \
72*0957b409SSimon J. Gerraty }
73*0957b409SSimon J. Gerraty 
74*0957b409SSimon J. Gerraty #define BLOCK_SIZE(cname)   br_ ## cname ## _BLOCK_SIZE
75*0957b409SSimon J. Gerraty 
76*0957b409SSimon J. Gerraty #define SPEED_BLOCKCIPHER_CBC(Name, fname, cname, klen, dir) \
77*0957b409SSimon J. Gerraty static void \
78*0957b409SSimon J. Gerraty test_speed_ ## fname(void) \
79*0957b409SSimon J. Gerraty { \
80*0957b409SSimon J. Gerraty 	unsigned char key[klen]; \
81*0957b409SSimon J. Gerraty 	unsigned char buf[8192 - (8192 % BLOCK_SIZE(cname))]; \
82*0957b409SSimon J. Gerraty 	unsigned char iv[BLOCK_SIZE(cname)]; \
83*0957b409SSimon J. Gerraty 	const br_block_cbc ## dir ## _class *vt; \
84*0957b409SSimon J. Gerraty 	br_ ## cname ## _cbc ## dir ## _keys ec; \
85*0957b409SSimon J. Gerraty 	int i; \
86*0957b409SSimon J. Gerraty 	long num; \
87*0957b409SSimon J. Gerraty  \
88*0957b409SSimon J. Gerraty 	memset(key, 'T', sizeof key); \
89*0957b409SSimon J. Gerraty 	memset(buf, 'P', sizeof buf); \
90*0957b409SSimon J. Gerraty 	memset(iv, 'X', sizeof iv); \
91*0957b409SSimon J. Gerraty 	vt = br_ ## cname ## _cbc ## dir ## _get_vtable(); \
92*0957b409SSimon J. Gerraty 	if (vt == NULL) { \
93*0957b409SSimon J. Gerraty 		printf("%-30s UNAVAILABLE\n", #Name); \
94*0957b409SSimon J. Gerraty 		fflush(stdout); \
95*0957b409SSimon J. Gerraty 		return; \
96*0957b409SSimon J. Gerraty 	} \
97*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) { \
98*0957b409SSimon J. Gerraty 		vt->init(&ec.vtable, key, sizeof key); \
99*0957b409SSimon J. Gerraty 		vt->run(&ec.vtable, iv, buf, sizeof buf); \
100*0957b409SSimon J. Gerraty 	} \
101*0957b409SSimon J. Gerraty 	num = 10; \
102*0957b409SSimon J. Gerraty 	for (;;) { \
103*0957b409SSimon J. Gerraty 		clock_t begin, end; \
104*0957b409SSimon J. Gerraty 		double tt; \
105*0957b409SSimon J. Gerraty 		long k; \
106*0957b409SSimon J. Gerraty  \
107*0957b409SSimon J. Gerraty 		vt->init(&ec.vtable, key, sizeof key); \
108*0957b409SSimon J. Gerraty 		begin = clock(); \
109*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) { \
110*0957b409SSimon J. Gerraty 			vt->run(&ec.vtable, iv, buf, sizeof buf); \
111*0957b409SSimon J. Gerraty 		} \
112*0957b409SSimon J. Gerraty 		end = clock(); \
113*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC; \
114*0957b409SSimon J. Gerraty 		if (tt >= 2.0) { \
115*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f MB/s\n", #Name, \
116*0957b409SSimon J. Gerraty 				((double)sizeof buf) * (double)num \
117*0957b409SSimon J. Gerraty 				/ (tt * 1000000.0)); \
118*0957b409SSimon J. Gerraty 			fflush(stdout); \
119*0957b409SSimon J. Gerraty 			return; \
120*0957b409SSimon J. Gerraty 		} \
121*0957b409SSimon J. Gerraty 		num <<= 1; \
122*0957b409SSimon J. Gerraty 	} \
123*0957b409SSimon J. Gerraty }
124*0957b409SSimon J. Gerraty 
125*0957b409SSimon J. Gerraty #define SPEED_BLOCKCIPHER_CTR(Name, fname, cname, klen) \
126*0957b409SSimon J. Gerraty static void \
127*0957b409SSimon J. Gerraty test_speed_ ## fname(void) \
128*0957b409SSimon J. Gerraty { \
129*0957b409SSimon J. Gerraty 	unsigned char key[klen]; \
130*0957b409SSimon J. Gerraty 	unsigned char buf[8192 - (8192 % BLOCK_SIZE(cname))]; \
131*0957b409SSimon J. Gerraty 	unsigned char iv[BLOCK_SIZE(cname) - 4]; \
132*0957b409SSimon J. Gerraty 	const br_block_ctr_class *vt; \
133*0957b409SSimon J. Gerraty 	br_ ## cname ## _ctr_keys ec; \
134*0957b409SSimon J. Gerraty 	int i; \
135*0957b409SSimon J. Gerraty 	long num; \
136*0957b409SSimon J. Gerraty  \
137*0957b409SSimon J. Gerraty 	memset(key, 'T', sizeof key); \
138*0957b409SSimon J. Gerraty 	memset(buf, 'P', sizeof buf); \
139*0957b409SSimon J. Gerraty 	memset(iv, 'X', sizeof iv); \
140*0957b409SSimon J. Gerraty 	vt = br_ ## cname ## _ctr_get_vtable(); \
141*0957b409SSimon J. Gerraty 	if (vt == NULL) { \
142*0957b409SSimon J. Gerraty 		printf("%-30s UNAVAILABLE\n", #Name); \
143*0957b409SSimon J. Gerraty 		fflush(stdout); \
144*0957b409SSimon J. Gerraty 		return; \
145*0957b409SSimon J. Gerraty 	} \
146*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) { \
147*0957b409SSimon J. Gerraty 		vt->init(&ec.vtable, key, sizeof key); \
148*0957b409SSimon J. Gerraty 		vt->run(&ec.vtable, iv, 1, buf, sizeof buf); \
149*0957b409SSimon J. Gerraty 	} \
150*0957b409SSimon J. Gerraty 	num = 10; \
151*0957b409SSimon J. Gerraty 	for (;;) { \
152*0957b409SSimon J. Gerraty 		clock_t begin, end; \
153*0957b409SSimon J. Gerraty 		double tt; \
154*0957b409SSimon J. Gerraty 		long k; \
155*0957b409SSimon J. Gerraty  \
156*0957b409SSimon J. Gerraty 		vt->init(&ec.vtable, key, sizeof key); \
157*0957b409SSimon J. Gerraty 		begin = clock(); \
158*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) { \
159*0957b409SSimon J. Gerraty 			vt->run(&ec.vtable, iv, 1, buf, sizeof buf); \
160*0957b409SSimon J. Gerraty 		} \
161*0957b409SSimon J. Gerraty 		end = clock(); \
162*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC; \
163*0957b409SSimon J. Gerraty 		if (tt >= 2.0) { \
164*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f MB/s\n", #Name, \
165*0957b409SSimon J. Gerraty 				((double)sizeof buf) * (double)num \
166*0957b409SSimon J. Gerraty 				/ (tt * 1000000.0)); \
167*0957b409SSimon J. Gerraty 			fflush(stdout); \
168*0957b409SSimon J. Gerraty 			return; \
169*0957b409SSimon J. Gerraty 		} \
170*0957b409SSimon J. Gerraty 		num <<= 1; \
171*0957b409SSimon J. Gerraty 	} \
172*0957b409SSimon J. Gerraty }
173*0957b409SSimon J. Gerraty 
174*0957b409SSimon J. Gerraty #define SPEED_CHACHA20(Name, fname) \
175*0957b409SSimon J. Gerraty static void \
176*0957b409SSimon J. Gerraty test_speed_ ## fname(void) \
177*0957b409SSimon J. Gerraty { \
178*0957b409SSimon J. Gerraty 	br_chacha20_run bc; \
179*0957b409SSimon J. Gerraty 	unsigned char key[32]; \
180*0957b409SSimon J. Gerraty 	unsigned char buf[8192]; \
181*0957b409SSimon J. Gerraty 	unsigned char iv[12]; \
182*0957b409SSimon J. Gerraty 	int i; \
183*0957b409SSimon J. Gerraty 	long num; \
184*0957b409SSimon J. Gerraty  \
185*0957b409SSimon J. Gerraty 	bc = br_ ## fname ## _get(); \
186*0957b409SSimon J. Gerraty 	if (bc == 0) { \
187*0957b409SSimon J. Gerraty 		printf("%-30s UNAVAILABLE\n", #Name); \
188*0957b409SSimon J. Gerraty 		fflush(stdout); \
189*0957b409SSimon J. Gerraty 		return; \
190*0957b409SSimon J. Gerraty 	} \
191*0957b409SSimon J. Gerraty 	memset(key, 'T', sizeof key); \
192*0957b409SSimon J. Gerraty 	memset(buf, 'P', sizeof buf); \
193*0957b409SSimon J. Gerraty 	memset(iv, 'X', sizeof iv); \
194*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) { \
195*0957b409SSimon J. Gerraty 		bc(key, iv, i, buf, sizeof buf); \
196*0957b409SSimon J. Gerraty 	} \
197*0957b409SSimon J. Gerraty 	num = 10; \
198*0957b409SSimon J. Gerraty 	for (;;) { \
199*0957b409SSimon J. Gerraty 		clock_t begin, end; \
200*0957b409SSimon J. Gerraty 		double tt; \
201*0957b409SSimon J. Gerraty 		long k; \
202*0957b409SSimon J. Gerraty  \
203*0957b409SSimon J. Gerraty 		begin = clock(); \
204*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) { \
205*0957b409SSimon J. Gerraty 			bc(key, iv, (uint32_t)k, buf, sizeof buf); \
206*0957b409SSimon J. Gerraty 		} \
207*0957b409SSimon J. Gerraty 		end = clock(); \
208*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC; \
209*0957b409SSimon J. Gerraty 		if (tt >= 2.0) { \
210*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f MB/s\n", #Name, \
211*0957b409SSimon J. Gerraty 				((double)sizeof buf) * (double)num \
212*0957b409SSimon J. Gerraty 				/ (tt * 1000000.0)); \
213*0957b409SSimon J. Gerraty 			fflush(stdout); \
214*0957b409SSimon J. Gerraty 			return; \
215*0957b409SSimon J. Gerraty 		} \
216*0957b409SSimon J. Gerraty 		num <<= 1; \
217*0957b409SSimon J. Gerraty 	} \
218*0957b409SSimon J. Gerraty }
219*0957b409SSimon J. Gerraty 
SPEED_HASH(MD5,md5)220*0957b409SSimon J. Gerraty SPEED_HASH(MD5, md5)
221*0957b409SSimon J. Gerraty SPEED_HASH(SHA-1, sha1)
222*0957b409SSimon J. Gerraty SPEED_HASH(SHA-256, sha256)
223*0957b409SSimon J. Gerraty SPEED_HASH(SHA-512, sha512)
224*0957b409SSimon J. Gerraty 
225*0957b409SSimon J. Gerraty /*
226*0957b409SSimon J. Gerraty  * There are no vtable selection functions for the portable implementations,
227*0957b409SSimon J. Gerraty  * so we define some custom macros.
228*0957b409SSimon J. Gerraty  */
229*0957b409SSimon J. Gerraty #define br_aes_big_cbcenc_get_vtable()     (&br_aes_big_cbcenc_vtable)
230*0957b409SSimon J. Gerraty #define br_aes_big_cbcdec_get_vtable()     (&br_aes_big_cbcdec_vtable)
231*0957b409SSimon J. Gerraty #define br_aes_big_ctr_get_vtable()        (&br_aes_big_ctr_vtable)
232*0957b409SSimon J. Gerraty #define br_aes_big_ctrcbc_get_vtable()     (&br_aes_big_ctrcbc_vtable)
233*0957b409SSimon J. Gerraty #define br_aes_small_cbcenc_get_vtable()   (&br_aes_small_cbcenc_vtable)
234*0957b409SSimon J. Gerraty #define br_aes_small_cbcdec_get_vtable()   (&br_aes_small_cbcdec_vtable)
235*0957b409SSimon J. Gerraty #define br_aes_small_ctr_get_vtable()      (&br_aes_small_ctr_vtable)
236*0957b409SSimon J. Gerraty #define br_aes_small_ctrcbc_get_vtable()   (&br_aes_small_ctrcbc_vtable)
237*0957b409SSimon J. Gerraty #define br_aes_ct_cbcenc_get_vtable()      (&br_aes_ct_cbcenc_vtable)
238*0957b409SSimon J. Gerraty #define br_aes_ct_cbcdec_get_vtable()      (&br_aes_ct_cbcdec_vtable)
239*0957b409SSimon J. Gerraty #define br_aes_ct_ctr_get_vtable()         (&br_aes_ct_ctr_vtable)
240*0957b409SSimon J. Gerraty #define br_aes_ct_ctrcbc_get_vtable()      (&br_aes_ct_ctrcbc_vtable)
241*0957b409SSimon J. Gerraty #define br_aes_ct64_cbcenc_get_vtable()    (&br_aes_ct64_cbcenc_vtable)
242*0957b409SSimon J. Gerraty #define br_aes_ct64_cbcdec_get_vtable()    (&br_aes_ct64_cbcdec_vtable)
243*0957b409SSimon J. Gerraty #define br_aes_ct64_ctr_get_vtable()       (&br_aes_ct64_ctr_vtable)
244*0957b409SSimon J. Gerraty #define br_aes_ct64_ctrcbc_get_vtable()    (&br_aes_ct64_ctrcbc_vtable)
245*0957b409SSimon J. Gerraty #define br_chacha20_ct_get()               (&br_chacha20_ct_run)
246*0957b409SSimon J. Gerraty 
247*0957b409SSimon J. Gerraty #define SPEED_AES(iname) \
248*0957b409SSimon J. Gerraty SPEED_BLOCKCIPHER_CBC(AES-128 CBC encrypt (iname), aes128_ ## iname ## _cbcenc, aes_ ## iname, 16, enc) \
249*0957b409SSimon J. Gerraty SPEED_BLOCKCIPHER_CBC(AES-128 CBC decrypt (iname), aes128_ ## iname ## _cbcdec, aes_ ## iname, 16, dec) \
250*0957b409SSimon J. Gerraty SPEED_BLOCKCIPHER_CBC(AES-192 CBC encrypt (iname), aes192_ ## iname ## _cbcenc, aes_ ## iname, 24, enc) \
251*0957b409SSimon J. Gerraty SPEED_BLOCKCIPHER_CBC(AES-192 CBC decrypt (iname), aes192_ ## iname ## _cbcdec, aes_ ## iname, 24, dec) \
252*0957b409SSimon J. Gerraty SPEED_BLOCKCIPHER_CBC(AES-256 CBC encrypt (iname), aes256_ ## iname ## _cbcenc, aes_ ## iname, 32, enc) \
253*0957b409SSimon J. Gerraty SPEED_BLOCKCIPHER_CBC(AES-256 CBC decrypt (iname), aes256_ ## iname ## _cbcdec, aes_ ## iname, 32, dec) \
254*0957b409SSimon J. Gerraty SPEED_BLOCKCIPHER_CTR(AES-128 CTR (iname), aes128_ ## iname ## _ctr, aes_ ## iname, 16) \
255*0957b409SSimon J. Gerraty SPEED_BLOCKCIPHER_CTR(AES-192 CTR (iname), aes192_ ## iname ## _ctr, aes_ ## iname, 24) \
256*0957b409SSimon J. Gerraty SPEED_BLOCKCIPHER_CTR(AES-256 CTR (iname), aes256_ ## iname ## _ctr, aes_ ## iname, 32)
257*0957b409SSimon J. Gerraty 
258*0957b409SSimon J. Gerraty SPEED_AES(big)
259*0957b409SSimon J. Gerraty SPEED_AES(small)
260*0957b409SSimon J. Gerraty SPEED_AES(ct)
261*0957b409SSimon J. Gerraty SPEED_AES(ct64)
262*0957b409SSimon J. Gerraty SPEED_AES(x86ni)
263*0957b409SSimon J. Gerraty SPEED_AES(pwr8)
264*0957b409SSimon J. Gerraty 
265*0957b409SSimon J. Gerraty #define br_des_tab_cbcenc_get_vtable()     (&br_des_tab_cbcenc_vtable)
266*0957b409SSimon J. Gerraty #define br_des_tab_cbcdec_get_vtable()     (&br_des_tab_cbcdec_vtable)
267*0957b409SSimon J. Gerraty #define br_des_ct_cbcenc_get_vtable()      (&br_des_ct_cbcenc_vtable)
268*0957b409SSimon J. Gerraty #define br_des_ct_cbcdec_get_vtable()      (&br_des_ct_cbcdec_vtable)
269*0957b409SSimon J. Gerraty 
270*0957b409SSimon J. Gerraty #define SPEED_DES(iname) \
271*0957b409SSimon J. Gerraty SPEED_BLOCKCIPHER_CBC(DES CBC encrypt (iname), des_ ## iname ## _cbcenc, des_ ## iname, 8, enc) \
272*0957b409SSimon J. Gerraty SPEED_BLOCKCIPHER_CBC(DES CBC decrypt (iname), des_ ## iname ## _cbcdec, des_ ## iname, 8, dec) \
273*0957b409SSimon J. Gerraty SPEED_BLOCKCIPHER_CBC(3DES CBC encrypt (iname), 3des_ ## iname ## _cbcenc, des_ ## iname, 24, enc) \
274*0957b409SSimon J. Gerraty SPEED_BLOCKCIPHER_CBC(3DES CBC decrypt (iname), 3des_ ## iname ## _cbcdec, des_ ## iname, 24, dec)
275*0957b409SSimon J. Gerraty 
276*0957b409SSimon J. Gerraty SPEED_DES(tab)
277*0957b409SSimon J. Gerraty SPEED_DES(ct)
278*0957b409SSimon J. Gerraty 
279*0957b409SSimon J. Gerraty SPEED_CHACHA20(ChaCha20 (ct), chacha20_ct)
280*0957b409SSimon J. Gerraty SPEED_CHACHA20(ChaCha20 (sse2), chacha20_sse2)
281*0957b409SSimon J. Gerraty 
282*0957b409SSimon J. Gerraty static void
283*0957b409SSimon J. Gerraty test_speed_ghash_inner(char *name, br_ghash gh)
284*0957b409SSimon J. Gerraty {
285*0957b409SSimon J. Gerraty 	unsigned char buf[8192], h[16], y[16];
286*0957b409SSimon J. Gerraty 	int i;
287*0957b409SSimon J. Gerraty 	long num;
288*0957b409SSimon J. Gerraty 
289*0957b409SSimon J. Gerraty 	memset(buf, 'T', sizeof buf);
290*0957b409SSimon J. Gerraty 	memset(h, 'P', sizeof h);
291*0957b409SSimon J. Gerraty 	memset(y, 0, sizeof y);
292*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) {
293*0957b409SSimon J. Gerraty 		gh(y, h, buf, sizeof buf);
294*0957b409SSimon J. Gerraty 	}
295*0957b409SSimon J. Gerraty 	num = 10;
296*0957b409SSimon J. Gerraty 	for (;;) {
297*0957b409SSimon J. Gerraty 		clock_t begin, end;
298*0957b409SSimon J. Gerraty 		double tt;
299*0957b409SSimon J. Gerraty 		long k;
300*0957b409SSimon J. Gerraty 
301*0957b409SSimon J. Gerraty 		begin = clock();
302*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) {
303*0957b409SSimon J. Gerraty 			gh(y, h, buf, sizeof buf);
304*0957b409SSimon J. Gerraty 		}
305*0957b409SSimon J. Gerraty 		end = clock();
306*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC;
307*0957b409SSimon J. Gerraty 		if (tt >= 2.0) {
308*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f MB/s\n", name,
309*0957b409SSimon J. Gerraty 				((double)sizeof buf) * (double)num
310*0957b409SSimon J. Gerraty 				/ (tt * 1000000.0));
311*0957b409SSimon J. Gerraty 			fflush(stdout);
312*0957b409SSimon J. Gerraty 			return;
313*0957b409SSimon J. Gerraty 		}
314*0957b409SSimon J. Gerraty 		num <<= 1;
315*0957b409SSimon J. Gerraty 	}
316*0957b409SSimon J. Gerraty }
317*0957b409SSimon J. Gerraty 
318*0957b409SSimon J. Gerraty static void
test_speed_ghash_ctmul(void)319*0957b409SSimon J. Gerraty test_speed_ghash_ctmul(void)
320*0957b409SSimon J. Gerraty {
321*0957b409SSimon J. Gerraty 	test_speed_ghash_inner("GHASH (ctmul)", &br_ghash_ctmul);
322*0957b409SSimon J. Gerraty }
323*0957b409SSimon J. Gerraty 
324*0957b409SSimon J. Gerraty static void
test_speed_ghash_ctmul32(void)325*0957b409SSimon J. Gerraty test_speed_ghash_ctmul32(void)
326*0957b409SSimon J. Gerraty {
327*0957b409SSimon J. Gerraty 	test_speed_ghash_inner("GHASH (ctmul32)", &br_ghash_ctmul32);
328*0957b409SSimon J. Gerraty }
329*0957b409SSimon J. Gerraty 
330*0957b409SSimon J. Gerraty static void
test_speed_ghash_ctmul64(void)331*0957b409SSimon J. Gerraty test_speed_ghash_ctmul64(void)
332*0957b409SSimon J. Gerraty {
333*0957b409SSimon J. Gerraty 	test_speed_ghash_inner("GHASH (ctmul64)", &br_ghash_ctmul64);
334*0957b409SSimon J. Gerraty }
335*0957b409SSimon J. Gerraty 
336*0957b409SSimon J. Gerraty static void
test_speed_ghash_pclmul(void)337*0957b409SSimon J. Gerraty test_speed_ghash_pclmul(void)
338*0957b409SSimon J. Gerraty {
339*0957b409SSimon J. Gerraty 	br_ghash gh;
340*0957b409SSimon J. Gerraty 
341*0957b409SSimon J. Gerraty 	gh = br_ghash_pclmul_get();
342*0957b409SSimon J. Gerraty 	if (gh == 0) {
343*0957b409SSimon J. Gerraty 		printf("%-30s UNAVAILABLE\n", "GHASH (pclmul)");
344*0957b409SSimon J. Gerraty 		fflush(stdout);
345*0957b409SSimon J. Gerraty 	} else {
346*0957b409SSimon J. Gerraty 		test_speed_ghash_inner("GHASH (pclmul)", gh);
347*0957b409SSimon J. Gerraty 	}
348*0957b409SSimon J. Gerraty }
349*0957b409SSimon J. Gerraty 
350*0957b409SSimon J. Gerraty static void
test_speed_ghash_pwr8(void)351*0957b409SSimon J. Gerraty test_speed_ghash_pwr8(void)
352*0957b409SSimon J. Gerraty {
353*0957b409SSimon J. Gerraty 	br_ghash gh;
354*0957b409SSimon J. Gerraty 
355*0957b409SSimon J. Gerraty 	gh = br_ghash_pwr8_get();
356*0957b409SSimon J. Gerraty 	if (gh == 0) {
357*0957b409SSimon J. Gerraty 		printf("%-30s UNAVAILABLE\n", "GHASH (pwr8)");
358*0957b409SSimon J. Gerraty 		fflush(stdout);
359*0957b409SSimon J. Gerraty 	} else {
360*0957b409SSimon J. Gerraty 		test_speed_ghash_inner("GHASH (pwr8)", gh);
361*0957b409SSimon J. Gerraty 	}
362*0957b409SSimon J. Gerraty }
363*0957b409SSimon J. Gerraty 
364*0957b409SSimon J. Gerraty static uint32_t
fake_chacha20(const void * key,const void * iv,uint32_t cc,void * data,size_t len)365*0957b409SSimon J. Gerraty fake_chacha20(const void *key, const void *iv,
366*0957b409SSimon J. Gerraty 	uint32_t cc, void *data, size_t len)
367*0957b409SSimon J. Gerraty {
368*0957b409SSimon J. Gerraty 	(void)key;
369*0957b409SSimon J. Gerraty 	(void)iv;
370*0957b409SSimon J. Gerraty 	(void)data;
371*0957b409SSimon J. Gerraty 	(void)len;
372*0957b409SSimon J. Gerraty 	return cc + (uint32_t)((len + 63) >> 6);
373*0957b409SSimon J. Gerraty }
374*0957b409SSimon J. Gerraty 
375*0957b409SSimon J. Gerraty /*
376*0957b409SSimon J. Gerraty  * To speed-test Poly1305, we run it with a do-nothing stub instead of
377*0957b409SSimon J. Gerraty  * ChaCha20.
378*0957b409SSimon J. Gerraty  */
379*0957b409SSimon J. Gerraty static void
test_speed_poly1305_inner(char * name,br_poly1305_run pl)380*0957b409SSimon J. Gerraty test_speed_poly1305_inner(char *name, br_poly1305_run pl)
381*0957b409SSimon J. Gerraty {
382*0957b409SSimon J. Gerraty 	unsigned char buf[8192], key[32], iv[12], aad[13], tag[16];
383*0957b409SSimon J. Gerraty 	int i;
384*0957b409SSimon J. Gerraty 	long num;
385*0957b409SSimon J. Gerraty 
386*0957b409SSimon J. Gerraty 	memset(key, 'K', sizeof key);
387*0957b409SSimon J. Gerraty 	memset(iv, 'I', sizeof iv);
388*0957b409SSimon J. Gerraty 	memset(aad, 'A', sizeof aad);
389*0957b409SSimon J. Gerraty 	memset(buf, 'T', sizeof buf);
390*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) {
391*0957b409SSimon J. Gerraty 		pl(key, iv, buf, sizeof buf,
392*0957b409SSimon J. Gerraty 			aad, sizeof aad, tag, &fake_chacha20, 0);
393*0957b409SSimon J. Gerraty 	}
394*0957b409SSimon J. Gerraty 	num = 10;
395*0957b409SSimon J. Gerraty 	for (;;) {
396*0957b409SSimon J. Gerraty 		clock_t begin, end;
397*0957b409SSimon J. Gerraty 		double tt;
398*0957b409SSimon J. Gerraty 		long k;
399*0957b409SSimon J. Gerraty 
400*0957b409SSimon J. Gerraty 		begin = clock();
401*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) {
402*0957b409SSimon J. Gerraty 			pl(key, iv, buf, sizeof buf,
403*0957b409SSimon J. Gerraty 				aad, sizeof aad, tag, &fake_chacha20, 0);
404*0957b409SSimon J. Gerraty 		}
405*0957b409SSimon J. Gerraty 		end = clock();
406*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC;
407*0957b409SSimon J. Gerraty 		if (tt >= 2.0) {
408*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f MB/s\n", name,
409*0957b409SSimon J. Gerraty 				((double)sizeof buf) * (double)num
410*0957b409SSimon J. Gerraty 				/ (tt * 1000000.0));
411*0957b409SSimon J. Gerraty 			fflush(stdout);
412*0957b409SSimon J. Gerraty 			return;
413*0957b409SSimon J. Gerraty 		}
414*0957b409SSimon J. Gerraty 		num <<= 1;
415*0957b409SSimon J. Gerraty 	}
416*0957b409SSimon J. Gerraty }
417*0957b409SSimon J. Gerraty 
418*0957b409SSimon J. Gerraty static void
test_speed_poly1305_ctmul(void)419*0957b409SSimon J. Gerraty test_speed_poly1305_ctmul(void)
420*0957b409SSimon J. Gerraty {
421*0957b409SSimon J. Gerraty 	test_speed_poly1305_inner("Poly1305 (ctmul)", &br_poly1305_ctmul_run);
422*0957b409SSimon J. Gerraty }
423*0957b409SSimon J. Gerraty 
424*0957b409SSimon J. Gerraty static void
test_speed_poly1305_ctmul32(void)425*0957b409SSimon J. Gerraty test_speed_poly1305_ctmul32(void)
426*0957b409SSimon J. Gerraty {
427*0957b409SSimon J. Gerraty 	test_speed_poly1305_inner("Poly1305 (ctmul32)",
428*0957b409SSimon J. Gerraty 		&br_poly1305_ctmul32_run);
429*0957b409SSimon J. Gerraty }
430*0957b409SSimon J. Gerraty 
431*0957b409SSimon J. Gerraty static void
test_speed_poly1305_ctmulq(void)432*0957b409SSimon J. Gerraty test_speed_poly1305_ctmulq(void)
433*0957b409SSimon J. Gerraty {
434*0957b409SSimon J. Gerraty 	br_poly1305_run bp;
435*0957b409SSimon J. Gerraty 
436*0957b409SSimon J. Gerraty 	bp = br_poly1305_ctmulq_get();
437*0957b409SSimon J. Gerraty 	if (bp == 0) {
438*0957b409SSimon J. Gerraty 		printf("%-30s UNAVAILABLE\n", "Poly1305 (ctmulq)");
439*0957b409SSimon J. Gerraty 	} else {
440*0957b409SSimon J. Gerraty 		test_speed_poly1305_inner("Poly1305 (ctmulq)", bp);
441*0957b409SSimon J. Gerraty 	}
442*0957b409SSimon J. Gerraty }
443*0957b409SSimon J. Gerraty 
444*0957b409SSimon J. Gerraty static void
test_speed_poly1305_i15(void)445*0957b409SSimon J. Gerraty test_speed_poly1305_i15(void)
446*0957b409SSimon J. Gerraty {
447*0957b409SSimon J. Gerraty 	test_speed_poly1305_inner("Poly1305 (i15)", &br_poly1305_i15_run);
448*0957b409SSimon J. Gerraty }
449*0957b409SSimon J. Gerraty 
450*0957b409SSimon J. Gerraty static void
test_speed_eax_inner(char * name,const br_block_ctrcbc_class * vt,size_t key_len)451*0957b409SSimon J. Gerraty test_speed_eax_inner(char *name,
452*0957b409SSimon J. Gerraty 	const br_block_ctrcbc_class *vt, size_t key_len)
453*0957b409SSimon J. Gerraty {
454*0957b409SSimon J. Gerraty 	unsigned char buf[8192], key[32], nonce[16], aad[16], tag[16];
455*0957b409SSimon J. Gerraty 	int i;
456*0957b409SSimon J. Gerraty 	long num;
457*0957b409SSimon J. Gerraty 	br_aes_gen_ctrcbc_keys ac;
458*0957b409SSimon J. Gerraty 	br_eax_context ec;
459*0957b409SSimon J. Gerraty 
460*0957b409SSimon J. Gerraty 	if (vt == NULL) {
461*0957b409SSimon J. Gerraty 		printf("%-30s UNAVAILABLE\n", name);
462*0957b409SSimon J. Gerraty 		fflush(stdout);
463*0957b409SSimon J. Gerraty 		return;
464*0957b409SSimon J. Gerraty 	}
465*0957b409SSimon J. Gerraty 	memset(key, 'K', key_len);
466*0957b409SSimon J. Gerraty 	memset(nonce, 'N', sizeof nonce);
467*0957b409SSimon J. Gerraty 	memset(aad, 'A', sizeof aad);
468*0957b409SSimon J. Gerraty 	memset(buf, 'T', sizeof buf);
469*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) {
470*0957b409SSimon J. Gerraty 		vt->init(&ac.vtable, key, key_len);
471*0957b409SSimon J. Gerraty 		br_eax_init(&ec, &ac.vtable);
472*0957b409SSimon J. Gerraty 		br_eax_reset(&ec, nonce, sizeof nonce);
473*0957b409SSimon J. Gerraty 		br_eax_aad_inject(&ec, aad, sizeof aad);
474*0957b409SSimon J. Gerraty 		br_eax_flip(&ec);
475*0957b409SSimon J. Gerraty 		br_eax_run(&ec, 1, buf, sizeof buf);
476*0957b409SSimon J. Gerraty 		br_eax_get_tag(&ec, tag);
477*0957b409SSimon J. Gerraty 	}
478*0957b409SSimon J. Gerraty 	num = 10;
479*0957b409SSimon J. Gerraty 	for (;;) {
480*0957b409SSimon J. Gerraty 		clock_t begin, end;
481*0957b409SSimon J. Gerraty 		double tt;
482*0957b409SSimon J. Gerraty 		long k;
483*0957b409SSimon J. Gerraty 
484*0957b409SSimon J. Gerraty 		begin = clock();
485*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) {
486*0957b409SSimon J. Gerraty 			vt->init(&ac.vtable, key, key_len);
487*0957b409SSimon J. Gerraty 			br_eax_init(&ec, &ac.vtable);
488*0957b409SSimon J. Gerraty 			br_eax_reset(&ec, nonce, sizeof nonce);
489*0957b409SSimon J. Gerraty 			br_eax_aad_inject(&ec, aad, sizeof aad);
490*0957b409SSimon J. Gerraty 			br_eax_flip(&ec);
491*0957b409SSimon J. Gerraty 			br_eax_run(&ec, 1, buf, sizeof buf);
492*0957b409SSimon J. Gerraty 			br_eax_get_tag(&ec, tag);
493*0957b409SSimon J. Gerraty 		}
494*0957b409SSimon J. Gerraty 		end = clock();
495*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC;
496*0957b409SSimon J. Gerraty 		if (tt >= 2.0) {
497*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f MB/s\n", name,
498*0957b409SSimon J. Gerraty 				((double)sizeof buf) * (double)num
499*0957b409SSimon J. Gerraty 				/ (tt * 1000000.0));
500*0957b409SSimon J. Gerraty 			fflush(stdout);
501*0957b409SSimon J. Gerraty 			return;
502*0957b409SSimon J. Gerraty 		}
503*0957b409SSimon J. Gerraty 		num <<= 1;
504*0957b409SSimon J. Gerraty 	}
505*0957b409SSimon J. Gerraty }
506*0957b409SSimon J. Gerraty 
507*0957b409SSimon J. Gerraty #define SPEED_EAX(Algo, algo, keysize, impl) \
508*0957b409SSimon J. Gerraty static void \
509*0957b409SSimon J. Gerraty test_speed_eax_ ## algo ## keysize ## _ ## impl(void) \
510*0957b409SSimon J. Gerraty { \
511*0957b409SSimon J. Gerraty 	test_speed_eax_inner("EAX " #Algo "-" #keysize "(" #impl ")", \
512*0957b409SSimon J. Gerraty 		br_ ## algo ## _ ## impl ##  _ctrcbc_get_vtable() \
513*0957b409SSimon J. Gerraty 		, (keysize) >> 3); \
514*0957b409SSimon J. Gerraty }
515*0957b409SSimon J. Gerraty 
516*0957b409SSimon J. Gerraty SPEED_EAX(AES, aes, 128, big)
517*0957b409SSimon J. Gerraty SPEED_EAX(AES, aes, 128, small)
518*0957b409SSimon J. Gerraty SPEED_EAX(AES, aes, 128, ct)
519*0957b409SSimon J. Gerraty SPEED_EAX(AES, aes, 128, ct64)
520*0957b409SSimon J. Gerraty SPEED_EAX(AES, aes, 128, x86ni)
521*0957b409SSimon J. Gerraty SPEED_EAX(AES, aes, 128, pwr8)
522*0957b409SSimon J. Gerraty SPEED_EAX(AES, aes, 192, big)
523*0957b409SSimon J. Gerraty SPEED_EAX(AES, aes, 192, small)
524*0957b409SSimon J. Gerraty SPEED_EAX(AES, aes, 192, ct)
525*0957b409SSimon J. Gerraty SPEED_EAX(AES, aes, 192, ct64)
526*0957b409SSimon J. Gerraty SPEED_EAX(AES, aes, 192, x86ni)
527*0957b409SSimon J. Gerraty SPEED_EAX(AES, aes, 192, pwr8)
528*0957b409SSimon J. Gerraty SPEED_EAX(AES, aes, 256, big)
529*0957b409SSimon J. Gerraty SPEED_EAX(AES, aes, 256, small)
530*0957b409SSimon J. Gerraty SPEED_EAX(AES, aes, 256, ct)
531*0957b409SSimon J. Gerraty SPEED_EAX(AES, aes, 256, ct64)
532*0957b409SSimon J. Gerraty SPEED_EAX(AES, aes, 256, x86ni)
533*0957b409SSimon J. Gerraty SPEED_EAX(AES, aes, 256, pwr8)
534*0957b409SSimon J. Gerraty 
535*0957b409SSimon J. Gerraty static void
test_speed_shake_inner(int security_level)536*0957b409SSimon J. Gerraty test_speed_shake_inner(int security_level)
537*0957b409SSimon J. Gerraty {
538*0957b409SSimon J. Gerraty 	unsigned char buf[8192];
539*0957b409SSimon J. Gerraty 	br_shake_context sc;
540*0957b409SSimon J. Gerraty 	int i;
541*0957b409SSimon J. Gerraty 	long num;
542*0957b409SSimon J. Gerraty 
543*0957b409SSimon J. Gerraty 	memset(buf, 'D', sizeof buf);
544*0957b409SSimon J. Gerraty 	br_shake_init(&sc, security_level);
545*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) {
546*0957b409SSimon J. Gerraty 		br_shake_inject(&sc, buf, sizeof buf);
547*0957b409SSimon J. Gerraty 	}
548*0957b409SSimon J. Gerraty 	num = 10;
549*0957b409SSimon J. Gerraty 	for (;;) {
550*0957b409SSimon J. Gerraty 		clock_t begin, end;
551*0957b409SSimon J. Gerraty 		double tt;
552*0957b409SSimon J. Gerraty 		long k;
553*0957b409SSimon J. Gerraty 
554*0957b409SSimon J. Gerraty 		begin = clock();
555*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) {
556*0957b409SSimon J. Gerraty 			br_shake_inject(&sc, buf, sizeof buf);
557*0957b409SSimon J. Gerraty 		}
558*0957b409SSimon J. Gerraty 		end = clock();
559*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC;
560*0957b409SSimon J. Gerraty 		if (tt >= 2.0) {
561*0957b409SSimon J. Gerraty 			printf("SHAKE%-3d (inject)              %8.2f MB/s\n",
562*0957b409SSimon J. Gerraty 				security_level,
563*0957b409SSimon J. Gerraty 				((double)sizeof buf) * (double)num
564*0957b409SSimon J. Gerraty 				/ (tt * 1000000.0));
565*0957b409SSimon J. Gerraty 			fflush(stdout);
566*0957b409SSimon J. Gerraty 			break;
567*0957b409SSimon J. Gerraty 		}
568*0957b409SSimon J. Gerraty 		num <<= 1;
569*0957b409SSimon J. Gerraty 	}
570*0957b409SSimon J. Gerraty 
571*0957b409SSimon J. Gerraty 	br_shake_flip(&sc);
572*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) {
573*0957b409SSimon J. Gerraty 		br_shake_produce(&sc, buf, sizeof buf);
574*0957b409SSimon J. Gerraty 	}
575*0957b409SSimon J. Gerraty 
576*0957b409SSimon J. Gerraty 	num = 10;
577*0957b409SSimon J. Gerraty 	for (;;) {
578*0957b409SSimon J. Gerraty 		clock_t begin, end;
579*0957b409SSimon J. Gerraty 		double tt;
580*0957b409SSimon J. Gerraty 		long k;
581*0957b409SSimon J. Gerraty 
582*0957b409SSimon J. Gerraty 		begin = clock();
583*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) {
584*0957b409SSimon J. Gerraty 			br_shake_produce(&sc, buf, sizeof buf);
585*0957b409SSimon J. Gerraty 		}
586*0957b409SSimon J. Gerraty 		end = clock();
587*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC;
588*0957b409SSimon J. Gerraty 		if (tt >= 2.0) {
589*0957b409SSimon J. Gerraty 			printf("SHAKE%-3d (produce)             %8.2f MB/s\n",
590*0957b409SSimon J. Gerraty 				security_level,
591*0957b409SSimon J. Gerraty 				((double)sizeof buf) * (double)num
592*0957b409SSimon J. Gerraty 				/ (tt * 1000000.0));
593*0957b409SSimon J. Gerraty 			fflush(stdout);
594*0957b409SSimon J. Gerraty 			break;
595*0957b409SSimon J. Gerraty 		}
596*0957b409SSimon J. Gerraty 		num <<= 1;
597*0957b409SSimon J. Gerraty 	}
598*0957b409SSimon J. Gerraty }
599*0957b409SSimon J. Gerraty 
600*0957b409SSimon J. Gerraty static void
test_speed_shake128(void)601*0957b409SSimon J. Gerraty test_speed_shake128(void)
602*0957b409SSimon J. Gerraty {
603*0957b409SSimon J. Gerraty 	test_speed_shake_inner(128);
604*0957b409SSimon J. Gerraty }
605*0957b409SSimon J. Gerraty 
606*0957b409SSimon J. Gerraty static void
test_speed_shake256(void)607*0957b409SSimon J. Gerraty test_speed_shake256(void)
608*0957b409SSimon J. Gerraty {
609*0957b409SSimon J. Gerraty 	test_speed_shake_inner(256);
610*0957b409SSimon J. Gerraty }
611*0957b409SSimon J. Gerraty 
612*0957b409SSimon J. Gerraty static const unsigned char RSA_N[] = {
613*0957b409SSimon J. Gerraty 	0xE9, 0xF2, 0x4A, 0x2F, 0x96, 0xDF, 0x0A, 0x23,
614*0957b409SSimon J. Gerraty 	0x01, 0x85, 0xF1, 0x2C, 0xB2, 0xA8, 0xEF, 0x23,
615*0957b409SSimon J. Gerraty 	0xCE, 0x2E, 0xB0, 0x4E, 0x18, 0x31, 0x95, 0x5B,
616*0957b409SSimon J. Gerraty 	0x98, 0x2D, 0x9B, 0x8C, 0xE3, 0x1A, 0x2B, 0x96,
617*0957b409SSimon J. Gerraty 	0xB5, 0xC7, 0xEE, 0xED, 0x72, 0x43, 0x2D, 0xFE,
618*0957b409SSimon J. Gerraty 	0x7F, 0x61, 0x33, 0xEA, 0x14, 0xFC, 0xDE, 0x80,
619*0957b409SSimon J. Gerraty 	0x17, 0x42, 0xF0, 0xF3, 0xC3, 0xC7, 0x89, 0x47,
620*0957b409SSimon J. Gerraty 	0x76, 0x5B, 0xFA, 0x33, 0xC4, 0x8C, 0x94, 0xDE,
621*0957b409SSimon J. Gerraty 	0x6A, 0x75, 0xD8, 0x1A, 0xF4, 0x49, 0xBC, 0xF3,
622*0957b409SSimon J. Gerraty 	0xB7, 0x9E, 0x2C, 0x8D, 0xEC, 0x5A, 0xEE, 0xBF,
623*0957b409SSimon J. Gerraty 	0x4B, 0x5A, 0x7F, 0xEF, 0x21, 0x39, 0xDB, 0x1D,
624*0957b409SSimon J. Gerraty 	0x83, 0x5E, 0x7E, 0x2F, 0xAA, 0x5E, 0xBA, 0x28,
625*0957b409SSimon J. Gerraty 	0xC3, 0xA2, 0x53, 0x19, 0xFB, 0x2F, 0x78, 0x6B,
626*0957b409SSimon J. Gerraty 	0x14, 0x60, 0x49, 0x3C, 0xCC, 0x1B, 0xE9, 0x1E,
627*0957b409SSimon J. Gerraty 	0x3D, 0x10, 0xA4, 0xEB, 0x7F, 0x66, 0x98, 0xF6,
628*0957b409SSimon J. Gerraty 	0xC3, 0xAC, 0x35, 0xF5, 0x01, 0x84, 0xFF, 0x7D,
629*0957b409SSimon J. Gerraty 	0x1F, 0x72, 0xBE, 0xB4, 0xD1, 0x89, 0xC8, 0xDD,
630*0957b409SSimon J. Gerraty 	0x44, 0xE7, 0xB5, 0x2E, 0x2C, 0xE1, 0x85, 0xF5,
631*0957b409SSimon J. Gerraty 	0x15, 0x50, 0xA9, 0x08, 0xC7, 0x67, 0xD9, 0x2B,
632*0957b409SSimon J. Gerraty 	0x6C, 0x11, 0xB3, 0xEB, 0x28, 0x8D, 0xF4, 0xCC,
633*0957b409SSimon J. Gerraty 	0xE3, 0xC3, 0xC5, 0x04, 0x0E, 0x7C, 0x8D, 0xDB,
634*0957b409SSimon J. Gerraty 	0x39, 0x06, 0x6A, 0x74, 0x75, 0xDF, 0xA8, 0x0F,
635*0957b409SSimon J. Gerraty 	0xDA, 0x67, 0x5A, 0x73, 0x1E, 0xFD, 0x8E, 0x4C,
636*0957b409SSimon J. Gerraty 	0xEE, 0x17, 0xEE, 0x1E, 0x67, 0xDB, 0x98, 0x70,
637*0957b409SSimon J. Gerraty 	0x60, 0xF7, 0xB9, 0xB5, 0x1F, 0x19, 0x93, 0xD6,
638*0957b409SSimon J. Gerraty 	0x3F, 0x2F, 0x1F, 0xB6, 0x5B, 0x59, 0xAA, 0x85,
639*0957b409SSimon J. Gerraty 	0xBB, 0x25, 0xE4, 0x13, 0xEF, 0xE7, 0xB9, 0x87,
640*0957b409SSimon J. Gerraty 	0x9C, 0x3F, 0x5E, 0xE4, 0x08, 0xA3, 0x51, 0xCF,
641*0957b409SSimon J. Gerraty 	0x8B, 0xAD, 0xF4, 0xE6, 0x1A, 0x5F, 0x51, 0xDD,
642*0957b409SSimon J. Gerraty 	0xA8, 0xBE, 0xE8, 0xD1, 0x20, 0x19, 0x61, 0x6C,
643*0957b409SSimon J. Gerraty 	0x18, 0xAB, 0xCA, 0x0A, 0xD9, 0x82, 0xA6, 0x94,
644*0957b409SSimon J. Gerraty 	0xD5, 0x69, 0x2A, 0xF6, 0x43, 0x66, 0x31, 0x09
645*0957b409SSimon J. Gerraty };
646*0957b409SSimon J. Gerraty 
647*0957b409SSimon J. Gerraty static const unsigned char RSA_E[] = {
648*0957b409SSimon J. Gerraty 	0x01, 0x00, 0x01
649*0957b409SSimon J. Gerraty };
650*0957b409SSimon J. Gerraty 
651*0957b409SSimon J. Gerraty static const unsigned char RSA_P[] = {
652*0957b409SSimon J. Gerraty 	0xFD, 0x39, 0x40, 0x56, 0x20, 0x80, 0xC5, 0x81,
653*0957b409SSimon J. Gerraty 	0x4C, 0x5F, 0x0C, 0x1A, 0x52, 0x84, 0x03, 0x2F,
654*0957b409SSimon J. Gerraty 	0xCE, 0x82, 0xB0, 0xD8, 0x30, 0x23, 0x7F, 0x77,
655*0957b409SSimon J. Gerraty 	0x45, 0xC2, 0x01, 0xC4, 0x68, 0x96, 0x0D, 0xA7,
656*0957b409SSimon J. Gerraty 	0x22, 0xA9, 0x6C, 0xA9, 0x1A, 0x33, 0xE5, 0x2F,
657*0957b409SSimon J. Gerraty 	0xB5, 0x07, 0x9A, 0xF9, 0xEA, 0x33, 0xA5, 0xC8,
658*0957b409SSimon J. Gerraty 	0x96, 0x60, 0x6A, 0xCA, 0xEB, 0xE5, 0x6E, 0x09,
659*0957b409SSimon J. Gerraty 	0x46, 0x7E, 0x2D, 0xEF, 0x93, 0x7D, 0x56, 0xED,
660*0957b409SSimon J. Gerraty 	0x75, 0x70, 0x3B, 0x96, 0xC4, 0xD5, 0xDB, 0x0B,
661*0957b409SSimon J. Gerraty 	0x3F, 0x69, 0xDF, 0x06, 0x18, 0x76, 0xF4, 0xCF,
662*0957b409SSimon J. Gerraty 	0xF8, 0x84, 0x22, 0xDF, 0xBD, 0x71, 0x62, 0x7B,
663*0957b409SSimon J. Gerraty 	0x67, 0x99, 0xBC, 0x09, 0x95, 0x54, 0xA4, 0x98,
664*0957b409SSimon J. Gerraty 	0x83, 0xF5, 0xA9, 0xCF, 0x09, 0xA5, 0x1F, 0x61,
665*0957b409SSimon J. Gerraty 	0x25, 0xB4, 0x70, 0x6C, 0x91, 0xB8, 0xB3, 0xD0,
666*0957b409SSimon J. Gerraty 	0xCE, 0x9C, 0x45, 0x65, 0x9B, 0xEF, 0xD4, 0x70,
667*0957b409SSimon J. Gerraty 	0xBE, 0x86, 0xD2, 0x98, 0x5D, 0xEB, 0xE3, 0xFF
668*0957b409SSimon J. Gerraty };
669*0957b409SSimon J. Gerraty 
670*0957b409SSimon J. Gerraty static const unsigned char RSA_Q[] = {
671*0957b409SSimon J. Gerraty 	0xEC, 0x82, 0xEE, 0x63, 0x5F, 0x40, 0x52, 0xDB,
672*0957b409SSimon J. Gerraty 	0x38, 0x7A, 0x37, 0x6A, 0x54, 0x5B, 0xD9, 0xA0,
673*0957b409SSimon J. Gerraty 	0x73, 0xB4, 0xBB, 0x52, 0xB2, 0x84, 0x07, 0xD0,
674*0957b409SSimon J. Gerraty 	0xCC, 0x82, 0x0D, 0x20, 0xB3, 0xFA, 0xD5, 0xB6,
675*0957b409SSimon J. Gerraty 	0x25, 0x92, 0x35, 0x4D, 0xB4, 0xC7, 0x36, 0x48,
676*0957b409SSimon J. Gerraty 	0xCE, 0x5E, 0x21, 0x4A, 0xA6, 0x74, 0x65, 0xF4,
677*0957b409SSimon J. Gerraty 	0x7D, 0x1D, 0xBC, 0x3B, 0xE2, 0xF4, 0x3E, 0x11,
678*0957b409SSimon J. Gerraty 	0x58, 0x10, 0x6C, 0x04, 0x46, 0x9E, 0x8D, 0x57,
679*0957b409SSimon J. Gerraty 	0xE0, 0x04, 0xE2, 0xEC, 0x47, 0xCF, 0xB3, 0x2A,
680*0957b409SSimon J. Gerraty 	0xFD, 0x4C, 0x55, 0x18, 0xDB, 0xDE, 0x3B, 0xDC,
681*0957b409SSimon J. Gerraty 	0xF4, 0x5B, 0xDA, 0xF3, 0x1A, 0xC8, 0x41, 0x6F,
682*0957b409SSimon J. Gerraty 	0x73, 0x3B, 0xFE, 0x3C, 0xA0, 0xDB, 0xBA, 0x6E,
683*0957b409SSimon J. Gerraty 	0x65, 0xA5, 0xE8, 0x02, 0xA5, 0x6C, 0xEA, 0x03,
684*0957b409SSimon J. Gerraty 	0xF6, 0x99, 0xF7, 0xCB, 0x4B, 0xB7, 0x11, 0x51,
685*0957b409SSimon J. Gerraty 	0x93, 0x88, 0x3F, 0xF9, 0x06, 0x85, 0xA9, 0x1E,
686*0957b409SSimon J. Gerraty 	0xCA, 0x64, 0xF8, 0x11, 0xA5, 0x1A, 0xCA, 0xF7
687*0957b409SSimon J. Gerraty };
688*0957b409SSimon J. Gerraty 
689*0957b409SSimon J. Gerraty static const unsigned char RSA_DP[] = {
690*0957b409SSimon J. Gerraty 	0x77, 0x95, 0xE0, 0x02, 0x4C, 0x9B, 0x43, 0xAA,
691*0957b409SSimon J. Gerraty 	0xCA, 0x4C, 0x60, 0xC4, 0xD5, 0x8F, 0x2E, 0x8A,
692*0957b409SSimon J. Gerraty 	0x17, 0x36, 0xB5, 0x19, 0x83, 0xB2, 0x5F, 0xF2,
693*0957b409SSimon J. Gerraty 	0x0D, 0xE9, 0x8F, 0x38, 0x18, 0x44, 0x34, 0xF2,
694*0957b409SSimon J. Gerraty 	0x67, 0x76, 0x27, 0xB0, 0xBC, 0x85, 0x21, 0x89,
695*0957b409SSimon J. Gerraty 	0x24, 0x2F, 0x11, 0x4B, 0x51, 0x05, 0x4F, 0x17,
696*0957b409SSimon J. Gerraty 	0xA9, 0x9C, 0xA3, 0x12, 0x6D, 0xD1, 0x0D, 0xE4,
697*0957b409SSimon J. Gerraty 	0x27, 0x7C, 0x53, 0x69, 0x3E, 0xF8, 0x04, 0x63,
698*0957b409SSimon J. Gerraty 	0x64, 0x00, 0xBA, 0xC3, 0x7A, 0xF5, 0x9B, 0xDA,
699*0957b409SSimon J. Gerraty 	0x75, 0xFA, 0x23, 0xAF, 0x17, 0x42, 0xA6, 0x5E,
700*0957b409SSimon J. Gerraty 	0xC8, 0xF8, 0x6E, 0x17, 0xC7, 0xB9, 0x92, 0x4E,
701*0957b409SSimon J. Gerraty 	0xC1, 0x20, 0x63, 0x23, 0x0B, 0x78, 0xCB, 0xBA,
702*0957b409SSimon J. Gerraty 	0x93, 0x27, 0x23, 0x28, 0x79, 0x5F, 0x97, 0xB0,
703*0957b409SSimon J. Gerraty 	0x23, 0x44, 0x51, 0x8B, 0x94, 0x4D, 0xEB, 0xED,
704*0957b409SSimon J. Gerraty 	0x82, 0x85, 0x5E, 0x68, 0x9B, 0xF9, 0xE9, 0x13,
705*0957b409SSimon J. Gerraty 	0xCD, 0x86, 0x92, 0x52, 0x0E, 0x98, 0xE6, 0x35
706*0957b409SSimon J. Gerraty };
707*0957b409SSimon J. Gerraty 
708*0957b409SSimon J. Gerraty static const unsigned char RSA_DQ[] = {
709*0957b409SSimon J. Gerraty 	0xD8, 0xDD, 0x71, 0xB3, 0x62, 0xBA, 0xBB, 0x7E,
710*0957b409SSimon J. Gerraty 	0xD1, 0xF9, 0x96, 0xE8, 0x83, 0xB3, 0xB9, 0x08,
711*0957b409SSimon J. Gerraty 	0x9C, 0x30, 0x03, 0x77, 0xDF, 0xC2, 0x9A, 0xDC,
712*0957b409SSimon J. Gerraty 	0x05, 0x39, 0xD6, 0xC9, 0xBE, 0xDE, 0x68, 0xA9,
713*0957b409SSimon J. Gerraty 	0xDD, 0x27, 0x84, 0x82, 0xDD, 0x19, 0xB1, 0x97,
714*0957b409SSimon J. Gerraty 	0xEE, 0xCA, 0x77, 0x22, 0x59, 0x20, 0xEF, 0xFF,
715*0957b409SSimon J. Gerraty 	0xCF, 0xDD, 0xBD, 0x24, 0xF8, 0x84, 0xD6, 0x88,
716*0957b409SSimon J. Gerraty 	0xD6, 0xC4, 0x30, 0x17, 0x77, 0x9D, 0x98, 0xA3,
717*0957b409SSimon J. Gerraty 	0x14, 0x01, 0xC7, 0x05, 0xBB, 0x0F, 0x23, 0x0D,
718*0957b409SSimon J. Gerraty 	0x6F, 0x37, 0x57, 0xEC, 0x34, 0x67, 0x41, 0x62,
719*0957b409SSimon J. Gerraty 	0xE8, 0x19, 0x75, 0xD9, 0x66, 0x1C, 0x6B, 0x8B,
720*0957b409SSimon J. Gerraty 	0xC3, 0x11, 0x26, 0x9C, 0xF7, 0x2E, 0xA3, 0x72,
721*0957b409SSimon J. Gerraty 	0xE8, 0xF7, 0xC8, 0x96, 0xEC, 0x92, 0xC2, 0xBD,
722*0957b409SSimon J. Gerraty 	0xA1, 0x98, 0x2A, 0x93, 0x99, 0xB8, 0xA2, 0x43,
723*0957b409SSimon J. Gerraty 	0xB7, 0xD0, 0xBE, 0x40, 0x1C, 0x8F, 0xE0, 0xB4,
724*0957b409SSimon J. Gerraty 	0x20, 0x07, 0x97, 0x43, 0xAE, 0xAD, 0xB3, 0x9F
725*0957b409SSimon J. Gerraty };
726*0957b409SSimon J. Gerraty 
727*0957b409SSimon J. Gerraty static const unsigned char RSA_IQ[] = {
728*0957b409SSimon J. Gerraty 	0xB7, 0xE2, 0x60, 0xA9, 0x62, 0xEC, 0xEC, 0x0B,
729*0957b409SSimon J. Gerraty 	0x57, 0x02, 0x96, 0xF9, 0x36, 0x35, 0x2C, 0x37,
730*0957b409SSimon J. Gerraty 	0xAF, 0xC2, 0xEE, 0x71, 0x49, 0x26, 0x8E, 0x0F,
731*0957b409SSimon J. Gerraty 	0x27, 0xB1, 0xFA, 0x0F, 0xEA, 0xDC, 0xF0, 0x8B,
732*0957b409SSimon J. Gerraty 	0x53, 0x6C, 0xB2, 0x46, 0x27, 0xCD, 0x29, 0xA2,
733*0957b409SSimon J. Gerraty 	0x35, 0x0F, 0x5D, 0x8A, 0x3F, 0x20, 0x8C, 0x13,
734*0957b409SSimon J. Gerraty 	0x3D, 0xA1, 0xFF, 0x85, 0x91, 0x99, 0xE8, 0x50,
735*0957b409SSimon J. Gerraty 	0xED, 0xF1, 0x29, 0x00, 0xEE, 0x24, 0x90, 0xB5,
736*0957b409SSimon J. Gerraty 	0x5F, 0x3A, 0x74, 0x26, 0xD7, 0xA2, 0x24, 0x8D,
737*0957b409SSimon J. Gerraty 	0x89, 0x88, 0xD8, 0x35, 0x22, 0x22, 0x8A, 0x66,
738*0957b409SSimon J. Gerraty 	0x5D, 0x5C, 0xDE, 0x83, 0x8C, 0xFA, 0x27, 0xE6,
739*0957b409SSimon J. Gerraty 	0xB9, 0xEB, 0x72, 0x08, 0xCD, 0x53, 0x4B, 0x93,
740*0957b409SSimon J. Gerraty 	0x0F, 0xAD, 0xC3, 0xF8, 0x7C, 0xFE, 0x84, 0xD7,
741*0957b409SSimon J. Gerraty 	0x08, 0xF3, 0xBE, 0x3D, 0x60, 0x1E, 0x95, 0x8D,
742*0957b409SSimon J. Gerraty 	0x44, 0x5B, 0x65, 0x7E, 0xC1, 0x30, 0xC3, 0x84,
743*0957b409SSimon J. Gerraty 	0xC0, 0xB0, 0xFE, 0xBF, 0x28, 0x54, 0x1E, 0xC4
744*0957b409SSimon J. Gerraty };
745*0957b409SSimon J. Gerraty 
746*0957b409SSimon J. Gerraty static const br_rsa_public_key RSA_PK = {
747*0957b409SSimon J. Gerraty 	(void *)RSA_N, sizeof RSA_N,
748*0957b409SSimon J. Gerraty 	(void *)RSA_E, sizeof RSA_E
749*0957b409SSimon J. Gerraty };
750*0957b409SSimon J. Gerraty 
751*0957b409SSimon J. Gerraty static const br_rsa_private_key RSA_SK = {
752*0957b409SSimon J. Gerraty 	2048,
753*0957b409SSimon J. Gerraty 	(void *)RSA_P, sizeof RSA_P,
754*0957b409SSimon J. Gerraty 	(void *)RSA_Q, sizeof RSA_Q,
755*0957b409SSimon J. Gerraty 	(void *)RSA_DP, sizeof RSA_DP,
756*0957b409SSimon J. Gerraty 	(void *)RSA_DQ, sizeof RSA_DQ,
757*0957b409SSimon J. Gerraty 	(void *)RSA_IQ, sizeof RSA_IQ
758*0957b409SSimon J. Gerraty };
759*0957b409SSimon J. Gerraty 
760*0957b409SSimon J. Gerraty static void
test_speed_rsa_inner(char * name,br_rsa_public fpub,br_rsa_private fpriv,br_rsa_keygen kgen)761*0957b409SSimon J. Gerraty test_speed_rsa_inner(char *name,
762*0957b409SSimon J. Gerraty 	br_rsa_public fpub, br_rsa_private fpriv, br_rsa_keygen kgen)
763*0957b409SSimon J. Gerraty {
764*0957b409SSimon J. Gerraty 	unsigned char tmp[sizeof RSA_N];
765*0957b409SSimon J. Gerraty 	int i;
766*0957b409SSimon J. Gerraty 	long num;
767*0957b409SSimon J. Gerraty 	/*
768*0957b409SSimon J. Gerraty 	br_hmac_drbg_context rng;
769*0957b409SSimon J. Gerraty 	*/
770*0957b409SSimon J. Gerraty 	br_aesctr_drbg_context rng;
771*0957b409SSimon J. Gerraty 	const br_block_ctr_class *ictr;
772*0957b409SSimon J. Gerraty 
773*0957b409SSimon J. Gerraty 	memset(tmp, 'R', sizeof tmp);
774*0957b409SSimon J. Gerraty 	tmp[0] = 0;
775*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) {
776*0957b409SSimon J. Gerraty 		if (!fpriv(tmp, &RSA_SK)) {
777*0957b409SSimon J. Gerraty 			abort();
778*0957b409SSimon J. Gerraty 		}
779*0957b409SSimon J. Gerraty 	}
780*0957b409SSimon J. Gerraty 	num = 10;
781*0957b409SSimon J. Gerraty 	for (;;) {
782*0957b409SSimon J. Gerraty 		clock_t begin, end;
783*0957b409SSimon J. Gerraty 		double tt;
784*0957b409SSimon J. Gerraty 		long k;
785*0957b409SSimon J. Gerraty 
786*0957b409SSimon J. Gerraty 		begin = clock();
787*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) {
788*0957b409SSimon J. Gerraty 			fpriv(tmp, &RSA_SK);
789*0957b409SSimon J. Gerraty 		}
790*0957b409SSimon J. Gerraty 		end = clock();
791*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC;
792*0957b409SSimon J. Gerraty 		if (tt >= 2.0) {
793*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f priv/s\n", name,
794*0957b409SSimon J. Gerraty 				(double)num / tt);
795*0957b409SSimon J. Gerraty 			fflush(stdout);
796*0957b409SSimon J. Gerraty 			break;
797*0957b409SSimon J. Gerraty 		}
798*0957b409SSimon J. Gerraty 		num <<= 1;
799*0957b409SSimon J. Gerraty 	}
800*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) {
801*0957b409SSimon J. Gerraty 		if (!fpub(tmp, sizeof tmp, &RSA_PK)) {
802*0957b409SSimon J. Gerraty 			abort();
803*0957b409SSimon J. Gerraty 		}
804*0957b409SSimon J. Gerraty 	}
805*0957b409SSimon J. Gerraty 	num = 10;
806*0957b409SSimon J. Gerraty 	for (;;) {
807*0957b409SSimon J. Gerraty 		clock_t begin, end;
808*0957b409SSimon J. Gerraty 		double tt;
809*0957b409SSimon J. Gerraty 		long k;
810*0957b409SSimon J. Gerraty 
811*0957b409SSimon J. Gerraty 		begin = clock();
812*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) {
813*0957b409SSimon J. Gerraty 			fpub(tmp, sizeof tmp, &RSA_PK);
814*0957b409SSimon J. Gerraty 		}
815*0957b409SSimon J. Gerraty 		end = clock();
816*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC;
817*0957b409SSimon J. Gerraty 		if (tt >= 2.0) {
818*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f pub/s\n", name,
819*0957b409SSimon J. Gerraty 				(double)num / tt);
820*0957b409SSimon J. Gerraty 			fflush(stdout);
821*0957b409SSimon J. Gerraty 			break;
822*0957b409SSimon J. Gerraty 		}
823*0957b409SSimon J. Gerraty 		num <<= 1;
824*0957b409SSimon J. Gerraty 	}
825*0957b409SSimon J. Gerraty 
826*0957b409SSimon J. Gerraty 	if (kgen == 0) {
827*0957b409SSimon J. Gerraty 		printf("%-30s KEYGEN UNAVAILABLE\n", name);
828*0957b409SSimon J. Gerraty 		fflush(stdout);
829*0957b409SSimon J. Gerraty 		return;
830*0957b409SSimon J. Gerraty 	}
831*0957b409SSimon J. Gerraty 	/*
832*0957b409SSimon J. Gerraty 	br_hmac_drbg_init(&rng, &br_sha256_vtable, "RSA keygen seed", 15);
833*0957b409SSimon J. Gerraty 	*/
834*0957b409SSimon J. Gerraty 	ictr = br_aes_x86ni_ctr_get_vtable();
835*0957b409SSimon J. Gerraty 	if (ictr == NULL) {
836*0957b409SSimon J. Gerraty 		ictr = br_aes_pwr8_ctr_get_vtable();
837*0957b409SSimon J. Gerraty 		if (ictr == NULL) {
838*0957b409SSimon J. Gerraty #if BR_64
839*0957b409SSimon J. Gerraty 			ictr = &br_aes_ct64_ctr_vtable;
840*0957b409SSimon J. Gerraty #else
841*0957b409SSimon J. Gerraty 			ictr = &br_aes_ct_ctr_vtable;
842*0957b409SSimon J. Gerraty #endif
843*0957b409SSimon J. Gerraty 		}
844*0957b409SSimon J. Gerraty 	}
845*0957b409SSimon J. Gerraty 	br_aesctr_drbg_init(&rng, ictr, "RSA keygen seed", 15);
846*0957b409SSimon J. Gerraty 
847*0957b409SSimon J. Gerraty 	num = 10;
848*0957b409SSimon J. Gerraty 	for (;;) {
849*0957b409SSimon J. Gerraty 		clock_t begin, end;
850*0957b409SSimon J. Gerraty 		double tt;
851*0957b409SSimon J. Gerraty 		long k;
852*0957b409SSimon J. Gerraty 
853*0957b409SSimon J. Gerraty 		begin = clock();
854*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) {
855*0957b409SSimon J. Gerraty 			br_rsa_private_key sk;
856*0957b409SSimon J. Gerraty 			unsigned char kbuf[BR_RSA_KBUF_PRIV_SIZE(1024)];
857*0957b409SSimon J. Gerraty 
858*0957b409SSimon J. Gerraty 			kgen(&rng.vtable, &sk, kbuf, NULL, NULL, 1024, 0);
859*0957b409SSimon J. Gerraty 		}
860*0957b409SSimon J. Gerraty 		end = clock();
861*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC;
862*0957b409SSimon J. Gerraty 		if (tt >= 10.0) {
863*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f kgen[1024]/s\n", name,
864*0957b409SSimon J. Gerraty 				(double)num / tt);
865*0957b409SSimon J. Gerraty 			fflush(stdout);
866*0957b409SSimon J. Gerraty 			break;
867*0957b409SSimon J. Gerraty 		}
868*0957b409SSimon J. Gerraty 		num <<= 1;
869*0957b409SSimon J. Gerraty 	}
870*0957b409SSimon J. Gerraty 
871*0957b409SSimon J. Gerraty 	num = 10;
872*0957b409SSimon J. Gerraty 	for (;;) {
873*0957b409SSimon J. Gerraty 		clock_t begin, end;
874*0957b409SSimon J. Gerraty 		double tt;
875*0957b409SSimon J. Gerraty 		long k;
876*0957b409SSimon J. Gerraty 
877*0957b409SSimon J. Gerraty 		begin = clock();
878*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) {
879*0957b409SSimon J. Gerraty 			br_rsa_private_key sk;
880*0957b409SSimon J. Gerraty 			unsigned char kbuf[BR_RSA_KBUF_PRIV_SIZE(2048)];
881*0957b409SSimon J. Gerraty 
882*0957b409SSimon J. Gerraty 			kgen(&rng.vtable, &sk, kbuf, NULL, NULL, 2048, 0);
883*0957b409SSimon J. Gerraty 		}
884*0957b409SSimon J. Gerraty 		end = clock();
885*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC;
886*0957b409SSimon J. Gerraty 		if (tt >= 10.0) {
887*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f kgen[2048]/s\n", name,
888*0957b409SSimon J. Gerraty 				(double)num / tt);
889*0957b409SSimon J. Gerraty 			fflush(stdout);
890*0957b409SSimon J. Gerraty 			break;
891*0957b409SSimon J. Gerraty 		}
892*0957b409SSimon J. Gerraty 		num <<= 1;
893*0957b409SSimon J. Gerraty 	}
894*0957b409SSimon J. Gerraty }
895*0957b409SSimon J. Gerraty 
896*0957b409SSimon J. Gerraty static void
test_speed_rsa_i15(void)897*0957b409SSimon J. Gerraty test_speed_rsa_i15(void)
898*0957b409SSimon J. Gerraty {
899*0957b409SSimon J. Gerraty 	test_speed_rsa_inner("RSA i15",
900*0957b409SSimon J. Gerraty 		&br_rsa_i15_public, &br_rsa_i15_private, &br_rsa_i15_keygen);
901*0957b409SSimon J. Gerraty }
902*0957b409SSimon J. Gerraty 
903*0957b409SSimon J. Gerraty static void
test_speed_rsa_i31(void)904*0957b409SSimon J. Gerraty test_speed_rsa_i31(void)
905*0957b409SSimon J. Gerraty {
906*0957b409SSimon J. Gerraty 	test_speed_rsa_inner("RSA i31",
907*0957b409SSimon J. Gerraty 		&br_rsa_i31_public, &br_rsa_i31_private, &br_rsa_i31_keygen);
908*0957b409SSimon J. Gerraty }
909*0957b409SSimon J. Gerraty 
910*0957b409SSimon J. Gerraty static void
test_speed_rsa_i32(void)911*0957b409SSimon J. Gerraty test_speed_rsa_i32(void)
912*0957b409SSimon J. Gerraty {
913*0957b409SSimon J. Gerraty 	test_speed_rsa_inner("RSA i32",
914*0957b409SSimon J. Gerraty 		&br_rsa_i32_public, &br_rsa_i32_private, 0);
915*0957b409SSimon J. Gerraty }
916*0957b409SSimon J. Gerraty 
917*0957b409SSimon J. Gerraty static void
test_speed_rsa_i62(void)918*0957b409SSimon J. Gerraty test_speed_rsa_i62(void)
919*0957b409SSimon J. Gerraty {
920*0957b409SSimon J. Gerraty 	br_rsa_public pub;
921*0957b409SSimon J. Gerraty 	br_rsa_private priv;
922*0957b409SSimon J. Gerraty 	br_rsa_keygen kgen;
923*0957b409SSimon J. Gerraty 
924*0957b409SSimon J. Gerraty 	pub = br_rsa_i62_public_get();
925*0957b409SSimon J. Gerraty 	priv = br_rsa_i62_private_get();
926*0957b409SSimon J. Gerraty 	kgen = br_rsa_i62_keygen_get();
927*0957b409SSimon J. Gerraty 	if (pub) {
928*0957b409SSimon J. Gerraty 		test_speed_rsa_inner("RSA i62", pub, priv, kgen);
929*0957b409SSimon J. Gerraty 	} else {
930*0957b409SSimon J. Gerraty 		printf("%-30s UNAVAILABLE\n", "RSA i62");
931*0957b409SSimon J. Gerraty 	}
932*0957b409SSimon J. Gerraty }
933*0957b409SSimon J. Gerraty 
934*0957b409SSimon J. Gerraty static void
test_speed_ec_inner_1(const char * name,const br_ec_impl * impl,const br_ec_curve_def * cd)935*0957b409SSimon J. Gerraty test_speed_ec_inner_1(const char *name,
936*0957b409SSimon J. Gerraty 	const br_ec_impl *impl, const br_ec_curve_def *cd)
937*0957b409SSimon J. Gerraty {
938*0957b409SSimon J. Gerraty 	unsigned char bx[80], U[160];
939*0957b409SSimon J. Gerraty 	uint32_t x[22], n[22];
940*0957b409SSimon J. Gerraty 	size_t nlen, ulen;
941*0957b409SSimon J. Gerraty 	int i;
942*0957b409SSimon J. Gerraty 	long num;
943*0957b409SSimon J. Gerraty 
944*0957b409SSimon J. Gerraty 	nlen = cd->order_len;
945*0957b409SSimon J. Gerraty 	br_i31_decode(n, cd->order, nlen);
946*0957b409SSimon J. Gerraty 	memset(bx, 'T', sizeof bx);
947*0957b409SSimon J. Gerraty 	br_i31_decode_reduce(x, bx, sizeof bx, n);
948*0957b409SSimon J. Gerraty 	br_i31_encode(bx, nlen, x);
949*0957b409SSimon J. Gerraty 	ulen = cd->generator_len;
950*0957b409SSimon J. Gerraty 	memcpy(U, cd->generator, ulen);
951*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) {
952*0957b409SSimon J. Gerraty 		impl->mul(U, ulen, bx, nlen, cd->curve);
953*0957b409SSimon J. Gerraty 	}
954*0957b409SSimon J. Gerraty 	num = 10;
955*0957b409SSimon J. Gerraty 	for (;;) {
956*0957b409SSimon J. Gerraty 		clock_t begin, end;
957*0957b409SSimon J. Gerraty 		double tt;
958*0957b409SSimon J. Gerraty 		long k;
959*0957b409SSimon J. Gerraty 
960*0957b409SSimon J. Gerraty 		begin = clock();
961*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) {
962*0957b409SSimon J. Gerraty 			impl->mul(U, ulen, bx, nlen, cd->curve);
963*0957b409SSimon J. Gerraty 		}
964*0957b409SSimon J. Gerraty 		end = clock();
965*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC;
966*0957b409SSimon J. Gerraty 		if (tt >= 2.0) {
967*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f mul/s\n", name,
968*0957b409SSimon J. Gerraty 				(double)num / tt);
969*0957b409SSimon J. Gerraty 			fflush(stdout);
970*0957b409SSimon J. Gerraty 			break;
971*0957b409SSimon J. Gerraty 		}
972*0957b409SSimon J. Gerraty 		num <<= 1;
973*0957b409SSimon J. Gerraty 	}
974*0957b409SSimon J. Gerraty }
975*0957b409SSimon J. Gerraty 
976*0957b409SSimon J. Gerraty static void
test_speed_ec_inner_2(const char * name,const br_ec_impl * impl,const br_ec_curve_def * cd)977*0957b409SSimon J. Gerraty test_speed_ec_inner_2(const char *name,
978*0957b409SSimon J. Gerraty 	const br_ec_impl *impl, const br_ec_curve_def *cd)
979*0957b409SSimon J. Gerraty {
980*0957b409SSimon J. Gerraty 	unsigned char bx[80], U[160];
981*0957b409SSimon J. Gerraty 	uint32_t x[22], n[22];
982*0957b409SSimon J. Gerraty 	size_t nlen;
983*0957b409SSimon J. Gerraty 	int i;
984*0957b409SSimon J. Gerraty 	long num;
985*0957b409SSimon J. Gerraty 
986*0957b409SSimon J. Gerraty 	nlen = cd->order_len;
987*0957b409SSimon J. Gerraty 	br_i31_decode(n, cd->order, nlen);
988*0957b409SSimon J. Gerraty 	memset(bx, 'T', sizeof bx);
989*0957b409SSimon J. Gerraty 	br_i31_decode_reduce(x, bx, sizeof bx, n);
990*0957b409SSimon J. Gerraty 	br_i31_encode(bx, nlen, x);
991*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) {
992*0957b409SSimon J. Gerraty 		impl->mulgen(U, bx, nlen, cd->curve);
993*0957b409SSimon J. Gerraty 	}
994*0957b409SSimon J. Gerraty 	num = 10;
995*0957b409SSimon J. Gerraty 	for (;;) {
996*0957b409SSimon J. Gerraty 		clock_t begin, end;
997*0957b409SSimon J. Gerraty 		double tt;
998*0957b409SSimon J. Gerraty 		long k;
999*0957b409SSimon J. Gerraty 
1000*0957b409SSimon J. Gerraty 		begin = clock();
1001*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) {
1002*0957b409SSimon J. Gerraty 			impl->mulgen(U, bx, nlen, cd->curve);
1003*0957b409SSimon J. Gerraty 		}
1004*0957b409SSimon J. Gerraty 		end = clock();
1005*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC;
1006*0957b409SSimon J. Gerraty 		if (tt >= 2.0) {
1007*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f mul/s\n", name,
1008*0957b409SSimon J. Gerraty 				(double)num / tt);
1009*0957b409SSimon J. Gerraty 			fflush(stdout);
1010*0957b409SSimon J. Gerraty 			break;
1011*0957b409SSimon J. Gerraty 		}
1012*0957b409SSimon J. Gerraty 		num <<= 1;
1013*0957b409SSimon J. Gerraty 	}
1014*0957b409SSimon J. Gerraty }
1015*0957b409SSimon J. Gerraty 
1016*0957b409SSimon J. Gerraty static void
test_speed_ec_inner(const char * name,const br_ec_impl * impl,const br_ec_curve_def * cd)1017*0957b409SSimon J. Gerraty test_speed_ec_inner(const char *name,
1018*0957b409SSimon J. Gerraty 	const br_ec_impl *impl, const br_ec_curve_def *cd)
1019*0957b409SSimon J. Gerraty {
1020*0957b409SSimon J. Gerraty 	char tmp[50];
1021*0957b409SSimon J. Gerraty 
1022*0957b409SSimon J. Gerraty 	test_speed_ec_inner_1(name, impl, cd);
1023*0957b409SSimon J. Gerraty 	sprintf(tmp, "%s (FP)", name);
1024*0957b409SSimon J. Gerraty 	test_speed_ec_inner_2(tmp, impl, cd);
1025*0957b409SSimon J. Gerraty }
1026*0957b409SSimon J. Gerraty 
1027*0957b409SSimon J. Gerraty static void
test_speed_ec_p256_m15(void)1028*0957b409SSimon J. Gerraty test_speed_ec_p256_m15(void)
1029*0957b409SSimon J. Gerraty {
1030*0957b409SSimon J. Gerraty 	test_speed_ec_inner("EC p256_m15",
1031*0957b409SSimon J. Gerraty 		&br_ec_p256_m15, &br_secp256r1);
1032*0957b409SSimon J. Gerraty }
1033*0957b409SSimon J. Gerraty 
1034*0957b409SSimon J. Gerraty static void
test_speed_ec_p256_m31(void)1035*0957b409SSimon J. Gerraty test_speed_ec_p256_m31(void)
1036*0957b409SSimon J. Gerraty {
1037*0957b409SSimon J. Gerraty 	test_speed_ec_inner("EC p256_m31",
1038*0957b409SSimon J. Gerraty 		&br_ec_p256_m31, &br_secp256r1);
1039*0957b409SSimon J. Gerraty }
1040*0957b409SSimon J. Gerraty 
1041*0957b409SSimon J. Gerraty static void
test_speed_ec_p256_m62(void)1042*0957b409SSimon J. Gerraty test_speed_ec_p256_m62(void)
1043*0957b409SSimon J. Gerraty {
1044*0957b409SSimon J. Gerraty 	const br_ec_impl *ec;
1045*0957b409SSimon J. Gerraty 
1046*0957b409SSimon J. Gerraty 	ec = br_ec_p256_m62_get();
1047*0957b409SSimon J. Gerraty 	if (ec != NULL) {
1048*0957b409SSimon J. Gerraty 		test_speed_ec_inner("EC p256_m62", ec, &br_secp256r1);
1049*0957b409SSimon J. Gerraty 	} else {
1050*0957b409SSimon J. Gerraty 		printf("%-30s UNAVAILABLE\n", "EC p256_m62");
1051*0957b409SSimon J. Gerraty 	}
1052*0957b409SSimon J. Gerraty }
1053*0957b409SSimon J. Gerraty 
1054*0957b409SSimon J. Gerraty static void
test_speed_ec_p256_m64(void)1055*0957b409SSimon J. Gerraty test_speed_ec_p256_m64(void)
1056*0957b409SSimon J. Gerraty {
1057*0957b409SSimon J. Gerraty 	const br_ec_impl *ec;
1058*0957b409SSimon J. Gerraty 
1059*0957b409SSimon J. Gerraty 	ec = br_ec_p256_m64_get();
1060*0957b409SSimon J. Gerraty 	if (ec != NULL) {
1061*0957b409SSimon J. Gerraty 		test_speed_ec_inner("EC p256_m64", ec, &br_secp256r1);
1062*0957b409SSimon J. Gerraty 	} else {
1063*0957b409SSimon J. Gerraty 		printf("%-30s UNAVAILABLE\n", "EC p256_m64");
1064*0957b409SSimon J. Gerraty 	}
1065*0957b409SSimon J. Gerraty }
1066*0957b409SSimon J. Gerraty 
1067*0957b409SSimon J. Gerraty static void
test_speed_ec_prime_i15(void)1068*0957b409SSimon J. Gerraty test_speed_ec_prime_i15(void)
1069*0957b409SSimon J. Gerraty {
1070*0957b409SSimon J. Gerraty 	test_speed_ec_inner("EC prime_i15 P-256",
1071*0957b409SSimon J. Gerraty 		&br_ec_prime_i15, &br_secp256r1);
1072*0957b409SSimon J. Gerraty 	test_speed_ec_inner("EC prime_i15 P-384",
1073*0957b409SSimon J. Gerraty 		&br_ec_prime_i15, &br_secp384r1);
1074*0957b409SSimon J. Gerraty 	test_speed_ec_inner("EC prime_i15 P-521",
1075*0957b409SSimon J. Gerraty 		&br_ec_prime_i15, &br_secp521r1);
1076*0957b409SSimon J. Gerraty }
1077*0957b409SSimon J. Gerraty 
1078*0957b409SSimon J. Gerraty static void
test_speed_ec_prime_i31(void)1079*0957b409SSimon J. Gerraty test_speed_ec_prime_i31(void)
1080*0957b409SSimon J. Gerraty {
1081*0957b409SSimon J. Gerraty 	test_speed_ec_inner("EC prime_i31 P-256",
1082*0957b409SSimon J. Gerraty 		&br_ec_prime_i31, &br_secp256r1);
1083*0957b409SSimon J. Gerraty 	test_speed_ec_inner("EC prime_i31 P-384",
1084*0957b409SSimon J. Gerraty 		&br_ec_prime_i31, &br_secp384r1);
1085*0957b409SSimon J. Gerraty 	test_speed_ec_inner("EC prime_i31 P-521",
1086*0957b409SSimon J. Gerraty 		&br_ec_prime_i31, &br_secp521r1);
1087*0957b409SSimon J. Gerraty }
1088*0957b409SSimon J. Gerraty 
1089*0957b409SSimon J. Gerraty static void
test_speed_ec_c25519_i15(void)1090*0957b409SSimon J. Gerraty test_speed_ec_c25519_i15(void)
1091*0957b409SSimon J. Gerraty {
1092*0957b409SSimon J. Gerraty 	test_speed_ec_inner("EC c25519_i15",
1093*0957b409SSimon J. Gerraty 		&br_ec_c25519_i15, &br_curve25519);
1094*0957b409SSimon J. Gerraty }
1095*0957b409SSimon J. Gerraty 
1096*0957b409SSimon J. Gerraty static void
test_speed_ec_c25519_i31(void)1097*0957b409SSimon J. Gerraty test_speed_ec_c25519_i31(void)
1098*0957b409SSimon J. Gerraty {
1099*0957b409SSimon J. Gerraty 	test_speed_ec_inner("EC c25519_i31",
1100*0957b409SSimon J. Gerraty 		&br_ec_c25519_i31, &br_curve25519);
1101*0957b409SSimon J. Gerraty }
1102*0957b409SSimon J. Gerraty 
1103*0957b409SSimon J. Gerraty static void
test_speed_ec_c25519_m15(void)1104*0957b409SSimon J. Gerraty test_speed_ec_c25519_m15(void)
1105*0957b409SSimon J. Gerraty {
1106*0957b409SSimon J. Gerraty 	test_speed_ec_inner("EC c25519_m15",
1107*0957b409SSimon J. Gerraty 		&br_ec_c25519_m15, &br_curve25519);
1108*0957b409SSimon J. Gerraty }
1109*0957b409SSimon J. Gerraty 
1110*0957b409SSimon J. Gerraty static void
test_speed_ec_c25519_m31(void)1111*0957b409SSimon J. Gerraty test_speed_ec_c25519_m31(void)
1112*0957b409SSimon J. Gerraty {
1113*0957b409SSimon J. Gerraty 	test_speed_ec_inner("EC c25519_m31",
1114*0957b409SSimon J. Gerraty 		&br_ec_c25519_m31, &br_curve25519);
1115*0957b409SSimon J. Gerraty }
1116*0957b409SSimon J. Gerraty 
1117*0957b409SSimon J. Gerraty static void
test_speed_ec_c25519_m62(void)1118*0957b409SSimon J. Gerraty test_speed_ec_c25519_m62(void)
1119*0957b409SSimon J. Gerraty {
1120*0957b409SSimon J. Gerraty 	const br_ec_impl *ec;
1121*0957b409SSimon J. Gerraty 
1122*0957b409SSimon J. Gerraty 	ec = br_ec_c25519_m62_get();
1123*0957b409SSimon J. Gerraty 	if (ec != NULL) {
1124*0957b409SSimon J. Gerraty 		test_speed_ec_inner("EC c25519_m62", ec, &br_curve25519);
1125*0957b409SSimon J. Gerraty 	} else {
1126*0957b409SSimon J. Gerraty 		printf("%-30s UNAVAILABLE\n", "EC c25519_m62");
1127*0957b409SSimon J. Gerraty 	}
1128*0957b409SSimon J. Gerraty }
1129*0957b409SSimon J. Gerraty 
1130*0957b409SSimon J. Gerraty static void
test_speed_ec_c25519_m64(void)1131*0957b409SSimon J. Gerraty test_speed_ec_c25519_m64(void)
1132*0957b409SSimon J. Gerraty {
1133*0957b409SSimon J. Gerraty 	const br_ec_impl *ec;
1134*0957b409SSimon J. Gerraty 
1135*0957b409SSimon J. Gerraty 	ec = br_ec_c25519_m64_get();
1136*0957b409SSimon J. Gerraty 	if (ec != NULL) {
1137*0957b409SSimon J. Gerraty 		test_speed_ec_inner("EC c25519_m64", ec, &br_curve25519);
1138*0957b409SSimon J. Gerraty 	} else {
1139*0957b409SSimon J. Gerraty 		printf("%-30s UNAVAILABLE\n", "EC c25519_m64");
1140*0957b409SSimon J. Gerraty 	}
1141*0957b409SSimon J. Gerraty }
1142*0957b409SSimon J. Gerraty 
1143*0957b409SSimon J. Gerraty static void
test_speed_ecdsa_inner(const char * name,const br_ec_impl * impl,const br_ec_curve_def * cd,br_ecdsa_sign sign,br_ecdsa_vrfy vrfy)1144*0957b409SSimon J. Gerraty test_speed_ecdsa_inner(const char *name,
1145*0957b409SSimon J. Gerraty 	const br_ec_impl *impl, const br_ec_curve_def *cd,
1146*0957b409SSimon J. Gerraty 	br_ecdsa_sign sign, br_ecdsa_vrfy vrfy)
1147*0957b409SSimon J. Gerraty {
1148*0957b409SSimon J. Gerraty 	unsigned char bx[80], U[160], hv[32], sig[160];
1149*0957b409SSimon J. Gerraty 	uint32_t x[22], n[22];
1150*0957b409SSimon J. Gerraty 	size_t nlen, ulen, sig_len;
1151*0957b409SSimon J. Gerraty 	int i;
1152*0957b409SSimon J. Gerraty 	long num;
1153*0957b409SSimon J. Gerraty 	br_ec_private_key sk;
1154*0957b409SSimon J. Gerraty 	br_ec_public_key pk;
1155*0957b409SSimon J. Gerraty 
1156*0957b409SSimon J. Gerraty 	nlen = cd->order_len;
1157*0957b409SSimon J. Gerraty 	br_i31_decode(n, cd->order, nlen);
1158*0957b409SSimon J. Gerraty 	memset(bx, 'T', sizeof bx);
1159*0957b409SSimon J. Gerraty 	br_i31_decode_reduce(x, bx, sizeof bx, n);
1160*0957b409SSimon J. Gerraty 	br_i31_encode(bx, nlen, x);
1161*0957b409SSimon J. Gerraty 	ulen = cd->generator_len;
1162*0957b409SSimon J. Gerraty 	memcpy(U, cd->generator, ulen);
1163*0957b409SSimon J. Gerraty 	impl->mul(U, ulen, bx, nlen, cd->curve);
1164*0957b409SSimon J. Gerraty 	sk.curve = cd->curve;
1165*0957b409SSimon J. Gerraty 	sk.x = bx;
1166*0957b409SSimon J. Gerraty 	sk.xlen = nlen;
1167*0957b409SSimon J. Gerraty 	pk.curve = cd->curve;
1168*0957b409SSimon J. Gerraty 	pk.q = U;
1169*0957b409SSimon J. Gerraty 	pk.qlen = ulen;
1170*0957b409SSimon J. Gerraty 
1171*0957b409SSimon J. Gerraty 	memset(hv, 'H', sizeof hv);
1172*0957b409SSimon J. Gerraty 	sig_len = sign(impl, &br_sha256_vtable, hv, &sk, sig);
1173*0957b409SSimon J. Gerraty 	if (vrfy(impl, hv, sizeof hv, &pk, sig, sig_len) != 1) {
1174*0957b409SSimon J. Gerraty 		fprintf(stderr, "self-test sign/verify failed\n");
1175*0957b409SSimon J. Gerraty 		exit(EXIT_FAILURE);
1176*0957b409SSimon J. Gerraty 	}
1177*0957b409SSimon J. Gerraty 
1178*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) {
1179*0957b409SSimon J. Gerraty 		hv[1] ++;
1180*0957b409SSimon J. Gerraty 		sign(impl, &br_sha256_vtable, hv, &sk, sig);
1181*0957b409SSimon J. Gerraty 		vrfy(impl, hv, sizeof hv, &pk, sig, sig_len);
1182*0957b409SSimon J. Gerraty 	}
1183*0957b409SSimon J. Gerraty 
1184*0957b409SSimon J. Gerraty 	num = 10;
1185*0957b409SSimon J. Gerraty 	for (;;) {
1186*0957b409SSimon J. Gerraty 		clock_t begin, end;
1187*0957b409SSimon J. Gerraty 		double tt;
1188*0957b409SSimon J. Gerraty 		long k;
1189*0957b409SSimon J. Gerraty 
1190*0957b409SSimon J. Gerraty 		begin = clock();
1191*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) {
1192*0957b409SSimon J. Gerraty 			hv[1] ++;
1193*0957b409SSimon J. Gerraty 			sig_len = sign(impl, &br_sha256_vtable, hv, &sk, sig);
1194*0957b409SSimon J. Gerraty 		}
1195*0957b409SSimon J. Gerraty 		end = clock();
1196*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC;
1197*0957b409SSimon J. Gerraty 		if (tt >= 2.0) {
1198*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f sign/s\n", name,
1199*0957b409SSimon J. Gerraty 				(double)num / tt);
1200*0957b409SSimon J. Gerraty 			fflush(stdout);
1201*0957b409SSimon J. Gerraty 			break;
1202*0957b409SSimon J. Gerraty 		}
1203*0957b409SSimon J. Gerraty 		num <<= 1;
1204*0957b409SSimon J. Gerraty 	}
1205*0957b409SSimon J. Gerraty 
1206*0957b409SSimon J. Gerraty 	num = 10;
1207*0957b409SSimon J. Gerraty 	for (;;) {
1208*0957b409SSimon J. Gerraty 		clock_t begin, end;
1209*0957b409SSimon J. Gerraty 		double tt;
1210*0957b409SSimon J. Gerraty 		long k;
1211*0957b409SSimon J. Gerraty 
1212*0957b409SSimon J. Gerraty 		begin = clock();
1213*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) {
1214*0957b409SSimon J. Gerraty 			vrfy(impl, hv, sizeof hv, &pk, sig, sig_len);
1215*0957b409SSimon J. Gerraty 		}
1216*0957b409SSimon J. Gerraty 		end = clock();
1217*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC;
1218*0957b409SSimon J. Gerraty 		if (tt >= 2.0) {
1219*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f verify/s\n", name,
1220*0957b409SSimon J. Gerraty 				(double)num / tt);
1221*0957b409SSimon J. Gerraty 			fflush(stdout);
1222*0957b409SSimon J. Gerraty 			break;
1223*0957b409SSimon J. Gerraty 		}
1224*0957b409SSimon J. Gerraty 		num <<= 1;
1225*0957b409SSimon J. Gerraty 	}
1226*0957b409SSimon J. Gerraty }
1227*0957b409SSimon J. Gerraty 
1228*0957b409SSimon J. Gerraty static void
test_speed_ecdsa_p256_m15(void)1229*0957b409SSimon J. Gerraty test_speed_ecdsa_p256_m15(void)
1230*0957b409SSimon J. Gerraty {
1231*0957b409SSimon J. Gerraty 	test_speed_ecdsa_inner("ECDSA m15 P-256",
1232*0957b409SSimon J. Gerraty 		&br_ec_p256_m15, &br_secp256r1,
1233*0957b409SSimon J. Gerraty 		&br_ecdsa_i15_sign_asn1,
1234*0957b409SSimon J. Gerraty 		&br_ecdsa_i15_vrfy_asn1);
1235*0957b409SSimon J. Gerraty }
1236*0957b409SSimon J. Gerraty 
1237*0957b409SSimon J. Gerraty static void
test_speed_ecdsa_p256_m31(void)1238*0957b409SSimon J. Gerraty test_speed_ecdsa_p256_m31(void)
1239*0957b409SSimon J. Gerraty {
1240*0957b409SSimon J. Gerraty 	test_speed_ecdsa_inner("ECDSA m31 P-256",
1241*0957b409SSimon J. Gerraty 		&br_ec_p256_m31, &br_secp256r1,
1242*0957b409SSimon J. Gerraty 		&br_ecdsa_i31_sign_asn1,
1243*0957b409SSimon J. Gerraty 		&br_ecdsa_i31_vrfy_asn1);
1244*0957b409SSimon J. Gerraty }
1245*0957b409SSimon J. Gerraty 
1246*0957b409SSimon J. Gerraty static void
test_speed_ecdsa_p256_m62(void)1247*0957b409SSimon J. Gerraty test_speed_ecdsa_p256_m62(void)
1248*0957b409SSimon J. Gerraty {
1249*0957b409SSimon J. Gerraty 	const br_ec_impl *ec;
1250*0957b409SSimon J. Gerraty 
1251*0957b409SSimon J. Gerraty 	ec = br_ec_p256_m62_get();
1252*0957b409SSimon J. Gerraty 	if (ec != NULL) {
1253*0957b409SSimon J. Gerraty 		test_speed_ecdsa_inner("ECDSA m62 P-256",
1254*0957b409SSimon J. Gerraty 			ec, &br_secp256r1,
1255*0957b409SSimon J. Gerraty 			&br_ecdsa_i31_sign_asn1,
1256*0957b409SSimon J. Gerraty 			&br_ecdsa_i31_vrfy_asn1);
1257*0957b409SSimon J. Gerraty 	} else {
1258*0957b409SSimon J. Gerraty 		printf("%-30s UNAVAILABLE\n", "ECDSA m62 P-256");
1259*0957b409SSimon J. Gerraty 	}
1260*0957b409SSimon J. Gerraty }
1261*0957b409SSimon J. Gerraty 
1262*0957b409SSimon J. Gerraty static void
test_speed_ecdsa_p256_m64(void)1263*0957b409SSimon J. Gerraty test_speed_ecdsa_p256_m64(void)
1264*0957b409SSimon J. Gerraty {
1265*0957b409SSimon J. Gerraty 	const br_ec_impl *ec;
1266*0957b409SSimon J. Gerraty 
1267*0957b409SSimon J. Gerraty 	ec = br_ec_p256_m64_get();
1268*0957b409SSimon J. Gerraty 	if (ec != NULL) {
1269*0957b409SSimon J. Gerraty 		test_speed_ecdsa_inner("ECDSA m64 P-256",
1270*0957b409SSimon J. Gerraty 			ec, &br_secp256r1,
1271*0957b409SSimon J. Gerraty 			&br_ecdsa_i31_sign_asn1,
1272*0957b409SSimon J. Gerraty 			&br_ecdsa_i31_vrfy_asn1);
1273*0957b409SSimon J. Gerraty 	} else {
1274*0957b409SSimon J. Gerraty 		printf("%-30s UNAVAILABLE\n", "ECDSA m64 P-256");
1275*0957b409SSimon J. Gerraty 	}
1276*0957b409SSimon J. Gerraty }
1277*0957b409SSimon J. Gerraty 
1278*0957b409SSimon J. Gerraty static void
test_speed_ecdsa_i15(void)1279*0957b409SSimon J. Gerraty test_speed_ecdsa_i15(void)
1280*0957b409SSimon J. Gerraty {
1281*0957b409SSimon J. Gerraty 	test_speed_ecdsa_inner("ECDSA i15 P-256",
1282*0957b409SSimon J. Gerraty 		&br_ec_prime_i15, &br_secp256r1,
1283*0957b409SSimon J. Gerraty 		&br_ecdsa_i15_sign_asn1,
1284*0957b409SSimon J. Gerraty 		&br_ecdsa_i15_vrfy_asn1);
1285*0957b409SSimon J. Gerraty 	test_speed_ecdsa_inner("ECDSA i15 P-384",
1286*0957b409SSimon J. Gerraty 		&br_ec_prime_i15, &br_secp384r1,
1287*0957b409SSimon J. Gerraty 		&br_ecdsa_i15_sign_asn1,
1288*0957b409SSimon J. Gerraty 		&br_ecdsa_i15_vrfy_asn1);
1289*0957b409SSimon J. Gerraty 	test_speed_ecdsa_inner("ECDSA i15 P-521",
1290*0957b409SSimon J. Gerraty 		&br_ec_prime_i15, &br_secp521r1,
1291*0957b409SSimon J. Gerraty 		&br_ecdsa_i15_sign_asn1,
1292*0957b409SSimon J. Gerraty 		&br_ecdsa_i15_vrfy_asn1);
1293*0957b409SSimon J. Gerraty }
1294*0957b409SSimon J. Gerraty 
1295*0957b409SSimon J. Gerraty static void
test_speed_ecdsa_i31(void)1296*0957b409SSimon J. Gerraty test_speed_ecdsa_i31(void)
1297*0957b409SSimon J. Gerraty {
1298*0957b409SSimon J. Gerraty 	test_speed_ecdsa_inner("ECDSA i31 P-256",
1299*0957b409SSimon J. Gerraty 		&br_ec_prime_i31, &br_secp256r1,
1300*0957b409SSimon J. Gerraty 		&br_ecdsa_i31_sign_asn1,
1301*0957b409SSimon J. Gerraty 		&br_ecdsa_i31_vrfy_asn1);
1302*0957b409SSimon J. Gerraty 	test_speed_ecdsa_inner("ECDSA i31 P-384",
1303*0957b409SSimon J. Gerraty 		&br_ec_prime_i31, &br_secp384r1,
1304*0957b409SSimon J. Gerraty 		&br_ecdsa_i31_sign_asn1,
1305*0957b409SSimon J. Gerraty 		&br_ecdsa_i31_vrfy_asn1);
1306*0957b409SSimon J. Gerraty 	test_speed_ecdsa_inner("ECDSA i31 P-521",
1307*0957b409SSimon J. Gerraty 		&br_ec_prime_i31, &br_secp521r1,
1308*0957b409SSimon J. Gerraty 		&br_ecdsa_i31_sign_asn1,
1309*0957b409SSimon J. Gerraty 		&br_ecdsa_i31_vrfy_asn1);
1310*0957b409SSimon J. Gerraty }
1311*0957b409SSimon J. Gerraty 
1312*0957b409SSimon J. Gerraty static void
test_speed_i31(void)1313*0957b409SSimon J. Gerraty test_speed_i31(void)
1314*0957b409SSimon J. Gerraty {
1315*0957b409SSimon J. Gerraty 	static const unsigned char bp[] = {
1316*0957b409SSimon J. Gerraty 		/* A 521-bit prime integer (order of the P-521 curve). */
1317*0957b409SSimon J. Gerraty 		0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1318*0957b409SSimon J. Gerraty 		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1319*0957b409SSimon J. Gerraty 		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1320*0957b409SSimon J. Gerraty 		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1321*0957b409SSimon J. Gerraty 		0xFF, 0xFA, 0x51, 0x86, 0x87, 0x83, 0xBF, 0x2F,
1322*0957b409SSimon J. Gerraty 		0x96, 0x6B, 0x7F, 0xCC, 0x01, 0x48, 0xF7, 0x09,
1323*0957b409SSimon J. Gerraty 		0xA5, 0xD0, 0x3B, 0xB5, 0xC9, 0xB8, 0x89, 0x9C,
1324*0957b409SSimon J. Gerraty 		0x47, 0xAE, 0xBB, 0x6F, 0xB7, 0x1E, 0x91, 0x38,
1325*0957b409SSimon J. Gerraty 		0x64, 0x09
1326*0957b409SSimon J. Gerraty 	};
1327*0957b409SSimon J. Gerraty 
1328*0957b409SSimon J. Gerraty 	unsigned char tmp[60 + sizeof bp];
1329*0957b409SSimon J. Gerraty 	uint32_t p[20], x[20], y[20], z[20], uu[60], p0i;
1330*0957b409SSimon J. Gerraty 	int i;
1331*0957b409SSimon J. Gerraty 	long num;
1332*0957b409SSimon J. Gerraty 
1333*0957b409SSimon J. Gerraty 	br_i31_decode(p, bp, sizeof bp);
1334*0957b409SSimon J. Gerraty 	p0i = br_i31_ninv31(p[1]);
1335*0957b409SSimon J. Gerraty 	memset(tmp, 'T', sizeof tmp);
1336*0957b409SSimon J. Gerraty 	br_i31_decode_reduce(x, tmp, sizeof tmp, p);
1337*0957b409SSimon J. Gerraty 	memset(tmp, 'U', sizeof tmp);
1338*0957b409SSimon J. Gerraty 	br_i31_decode_reduce(y, tmp, sizeof tmp, p);
1339*0957b409SSimon J. Gerraty 
1340*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) {
1341*0957b409SSimon J. Gerraty 		br_i31_to_monty(x, p);
1342*0957b409SSimon J. Gerraty 	}
1343*0957b409SSimon J. Gerraty 	num = 10;
1344*0957b409SSimon J. Gerraty 	for (;;) {
1345*0957b409SSimon J. Gerraty 		clock_t begin, end;
1346*0957b409SSimon J. Gerraty 		double tt;
1347*0957b409SSimon J. Gerraty 		long k;
1348*0957b409SSimon J. Gerraty 
1349*0957b409SSimon J. Gerraty 		begin = clock();
1350*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) {
1351*0957b409SSimon J. Gerraty 			br_i31_to_monty(x, p);
1352*0957b409SSimon J. Gerraty 		}
1353*0957b409SSimon J. Gerraty 		end = clock();
1354*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC;
1355*0957b409SSimon J. Gerraty 		if (tt >= 2.0) {
1356*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f ops/s\n", "i31 to_monty",
1357*0957b409SSimon J. Gerraty 				(double)num / tt);
1358*0957b409SSimon J. Gerraty 			fflush(stdout);
1359*0957b409SSimon J. Gerraty 			break;
1360*0957b409SSimon J. Gerraty 		}
1361*0957b409SSimon J. Gerraty 		num <<= 1;
1362*0957b409SSimon J. Gerraty 	}
1363*0957b409SSimon J. Gerraty 
1364*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) {
1365*0957b409SSimon J. Gerraty 		br_i31_from_monty(x, p, p0i);
1366*0957b409SSimon J. Gerraty 	}
1367*0957b409SSimon J. Gerraty 	num = 10;
1368*0957b409SSimon J. Gerraty 	for (;;) {
1369*0957b409SSimon J. Gerraty 		clock_t begin, end;
1370*0957b409SSimon J. Gerraty 		double tt;
1371*0957b409SSimon J. Gerraty 		long k;
1372*0957b409SSimon J. Gerraty 
1373*0957b409SSimon J. Gerraty 		begin = clock();
1374*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) {
1375*0957b409SSimon J. Gerraty 			br_i31_from_monty(x, p, p0i);
1376*0957b409SSimon J. Gerraty 		}
1377*0957b409SSimon J. Gerraty 		end = clock();
1378*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC;
1379*0957b409SSimon J. Gerraty 		if (tt >= 2.0) {
1380*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f ops/s\n", "i31 from_monty",
1381*0957b409SSimon J. Gerraty 				(double)num / tt);
1382*0957b409SSimon J. Gerraty 			fflush(stdout);
1383*0957b409SSimon J. Gerraty 			break;
1384*0957b409SSimon J. Gerraty 		}
1385*0957b409SSimon J. Gerraty 		num <<= 1;
1386*0957b409SSimon J. Gerraty 	}
1387*0957b409SSimon J. Gerraty 
1388*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) {
1389*0957b409SSimon J. Gerraty 		br_i31_montymul(z, x, y, p, p0i);
1390*0957b409SSimon J. Gerraty 	}
1391*0957b409SSimon J. Gerraty 	num = 10;
1392*0957b409SSimon J. Gerraty 	for (;;) {
1393*0957b409SSimon J. Gerraty 		clock_t begin, end;
1394*0957b409SSimon J. Gerraty 		double tt;
1395*0957b409SSimon J. Gerraty 		long k;
1396*0957b409SSimon J. Gerraty 
1397*0957b409SSimon J. Gerraty 		begin = clock();
1398*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) {
1399*0957b409SSimon J. Gerraty 			br_i31_montymul(z, x, y, p, p0i);
1400*0957b409SSimon J. Gerraty 		}
1401*0957b409SSimon J. Gerraty 		end = clock();
1402*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC;
1403*0957b409SSimon J. Gerraty 		if (tt >= 2.0) {
1404*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f ops/s\n", "i31 montymul",
1405*0957b409SSimon J. Gerraty 				(double)num / tt);
1406*0957b409SSimon J. Gerraty 			fflush(stdout);
1407*0957b409SSimon J. Gerraty 			break;
1408*0957b409SSimon J. Gerraty 		}
1409*0957b409SSimon J. Gerraty 		num <<= 1;
1410*0957b409SSimon J. Gerraty 	}
1411*0957b409SSimon J. Gerraty 
1412*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) {
1413*0957b409SSimon J. Gerraty 		br_i31_moddiv(x, y, p, p0i, uu);
1414*0957b409SSimon J. Gerraty 	}
1415*0957b409SSimon J. Gerraty 	num = 10;
1416*0957b409SSimon J. Gerraty 	for (;;) {
1417*0957b409SSimon J. Gerraty 		clock_t begin, end;
1418*0957b409SSimon J. Gerraty 		double tt;
1419*0957b409SSimon J. Gerraty 		long k;
1420*0957b409SSimon J. Gerraty 
1421*0957b409SSimon J. Gerraty 		begin = clock();
1422*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) {
1423*0957b409SSimon J. Gerraty 			br_i31_moddiv(x, y, p, p0i, uu);
1424*0957b409SSimon J. Gerraty 		}
1425*0957b409SSimon J. Gerraty 		end = clock();
1426*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC;
1427*0957b409SSimon J. Gerraty 		if (tt >= 2.0) {
1428*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f ops/s\n", "i31 moddiv",
1429*0957b409SSimon J. Gerraty 				(double)num / tt);
1430*0957b409SSimon J. Gerraty 			fflush(stdout);
1431*0957b409SSimon J. Gerraty 			break;
1432*0957b409SSimon J. Gerraty 		}
1433*0957b409SSimon J. Gerraty 		num <<= 1;
1434*0957b409SSimon J. Gerraty 	}
1435*0957b409SSimon J. Gerraty }
1436*0957b409SSimon J. Gerraty 
1437*0957b409SSimon J. Gerraty #if 0
1438*0957b409SSimon J. Gerraty 
1439*0957b409SSimon J. Gerraty static unsigned char P2048[] = {
1440*0957b409SSimon J. Gerraty 	0xFD, 0xB6, 0xE0, 0x3E, 0x00, 0x49, 0x4C, 0xF0, 0x69, 0x3A, 0xDD, 0x7D,
1441*0957b409SSimon J. Gerraty 	0xF8, 0xA2, 0x41, 0xB0, 0x6C, 0x67, 0xC5, 0xBA, 0xB8, 0x46, 0x80, 0xF5,
1442*0957b409SSimon J. Gerraty 	0xBF, 0xAB, 0x98, 0xFC, 0x84, 0x73, 0xA5, 0x63, 0xC9, 0x52, 0x12, 0xDA,
1443*0957b409SSimon J. Gerraty 	0x4C, 0xC1, 0x5B, 0x9D, 0x8D, 0xDF, 0xCD, 0xFE, 0xC5, 0xAD, 0x5A, 0x6F,
1444*0957b409SSimon J. Gerraty 	0xDD, 0x02, 0xD9, 0xEC, 0x71, 0xEF, 0xEB, 0xB6, 0x95, 0xED, 0x94, 0x25,
1445*0957b409SSimon J. Gerraty 	0x0E, 0x63, 0xDD, 0x6A, 0x52, 0xC7, 0x93, 0xAF, 0x85, 0x9D, 0x2C, 0xBE,
1446*0957b409SSimon J. Gerraty 	0x5C, 0xBE, 0x35, 0xD8, 0xDD, 0x39, 0xEF, 0x1B, 0xB1, 0x49, 0x67, 0xB2,
1447*0957b409SSimon J. Gerraty 	0x33, 0xC9, 0x7C, 0xE1, 0x51, 0x79, 0x51, 0x59, 0xCA, 0x6E, 0x2A, 0xDF,
1448*0957b409SSimon J. Gerraty 	0x0D, 0x76, 0x1C, 0xE7, 0xA5, 0xC0, 0x1E, 0x6C, 0x56, 0x3A, 0x32, 0xE5,
1449*0957b409SSimon J. Gerraty 	0xB5, 0xC5, 0xD4, 0xDB, 0xFE, 0xFF, 0xF8, 0xF2, 0x96, 0xA9, 0xC9, 0x65,
1450*0957b409SSimon J. Gerraty 	0x59, 0x9E, 0x01, 0x79, 0x9D, 0x38, 0x68, 0x0F, 0xAD, 0x43, 0x3A, 0xD6,
1451*0957b409SSimon J. Gerraty 	0x84, 0x0A, 0xE2, 0xEF, 0x96, 0xC1, 0x6D, 0x89, 0x74, 0x19, 0x63, 0x82,
1452*0957b409SSimon J. Gerraty 	0x3B, 0xA0, 0x9C, 0xBA, 0x78, 0xDE, 0xDC, 0xC2, 0xE7, 0xD4, 0xFA, 0xD6,
1453*0957b409SSimon J. Gerraty 	0x19, 0x21, 0x29, 0xAE, 0x5E, 0xF4, 0x38, 0x81, 0xC6, 0x9E, 0x0E, 0x3C,
1454*0957b409SSimon J. Gerraty 	0xCD, 0xC0, 0xDC, 0x93, 0x5D, 0xFD, 0x9A, 0x5C, 0xAB, 0x54, 0x1F, 0xFF,
1455*0957b409SSimon J. Gerraty 	0x9C, 0x12, 0x1B, 0x4C, 0xDF, 0x2D, 0x9C, 0x85, 0xF9, 0x68, 0x15, 0x89,
1456*0957b409SSimon J. Gerraty 	0x42, 0x9B, 0x6C, 0x45, 0x89, 0x3A, 0xBC, 0xE9, 0x19, 0x91, 0xBE, 0x0C,
1457*0957b409SSimon J. Gerraty 	0xEF, 0x90, 0xCC, 0xF6, 0xD6, 0xF0, 0x3D, 0x5C, 0xF5, 0xE5, 0x0F, 0x2F,
1458*0957b409SSimon J. Gerraty 	0x02, 0x8A, 0x83, 0x4B, 0x93, 0x2F, 0x14, 0x12, 0x1F, 0x56, 0x9A, 0x12,
1459*0957b409SSimon J. Gerraty 	0x58, 0x88, 0xAE, 0x60, 0xB8, 0x5A, 0xE4, 0xA1, 0xBF, 0x4A, 0x81, 0x84,
1460*0957b409SSimon J. Gerraty 	0xAB, 0xBB, 0xE4, 0xD0, 0x1D, 0x41, 0xD9, 0x0A, 0xAB, 0x1E, 0x47, 0x5B,
1461*0957b409SSimon J. Gerraty 	0x31, 0xAC, 0x2B, 0x73
1462*0957b409SSimon J. Gerraty };
1463*0957b409SSimon J. Gerraty 
1464*0957b409SSimon J. Gerraty static unsigned char G2048[] = {
1465*0957b409SSimon J. Gerraty 	0x02
1466*0957b409SSimon J. Gerraty };
1467*0957b409SSimon J. Gerraty 
1468*0957b409SSimon J. Gerraty static void
1469*0957b409SSimon J. Gerraty test_speed_modpow(void)
1470*0957b409SSimon J. Gerraty {
1471*0957b409SSimon J. Gerraty 	uint32_t mx[65], mp[65], me[65], t1[65], t2[65], len;
1472*0957b409SSimon J. Gerraty 	unsigned char e[64];
1473*0957b409SSimon J. Gerraty 	int i;
1474*0957b409SSimon J. Gerraty 	long num;
1475*0957b409SSimon J. Gerraty 
1476*0957b409SSimon J. Gerraty 	len = br_int_decode(mp, sizeof mp / sizeof mp[0],
1477*0957b409SSimon J. Gerraty 		P2048, sizeof P2048);
1478*0957b409SSimon J. Gerraty 	if (len != 65) {
1479*0957b409SSimon J. Gerraty 		abort();
1480*0957b409SSimon J. Gerraty 	}
1481*0957b409SSimon J. Gerraty 	memset(e, 'P', sizeof e);
1482*0957b409SSimon J. Gerraty 	if (!br_int_decode(me, sizeof me / sizeof me[0], e, sizeof e)) {
1483*0957b409SSimon J. Gerraty 		abort();
1484*0957b409SSimon J. Gerraty 	}
1485*0957b409SSimon J. Gerraty 	if (!br_modint_decode(mx, mp, G2048, sizeof G2048)) {
1486*0957b409SSimon J. Gerraty 		abort();
1487*0957b409SSimon J. Gerraty 	}
1488*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) {
1489*0957b409SSimon J. Gerraty 		br_modint_to_monty(mx, mp);
1490*0957b409SSimon J. Gerraty 		br_modint_montypow(mx, me, mp, t1, t2);
1491*0957b409SSimon J. Gerraty 		br_modint_from_monty(mx, mp);
1492*0957b409SSimon J. Gerraty 	}
1493*0957b409SSimon J. Gerraty 	num = 10;
1494*0957b409SSimon J. Gerraty 	for (;;) {
1495*0957b409SSimon J. Gerraty 		clock_t begin, end;
1496*0957b409SSimon J. Gerraty 		double tt;
1497*0957b409SSimon J. Gerraty 		long k;
1498*0957b409SSimon J. Gerraty 
1499*0957b409SSimon J. Gerraty 		begin = clock();
1500*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) {
1501*0957b409SSimon J. Gerraty 			br_modint_to_monty(mx, mp);
1502*0957b409SSimon J. Gerraty 			br_modint_montypow(mx, me, mp, t1, t2);
1503*0957b409SSimon J. Gerraty 			br_modint_from_monty(mx, mp);
1504*0957b409SSimon J. Gerraty 		}
1505*0957b409SSimon J. Gerraty 		end = clock();
1506*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC;
1507*0957b409SSimon J. Gerraty 		if (tt >= 2.0) {
1508*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f exp/s\n", "pow[2048:256]",
1509*0957b409SSimon J. Gerraty 				(double)num / tt);
1510*0957b409SSimon J. Gerraty 			fflush(stdout);
1511*0957b409SSimon J. Gerraty 			return;
1512*0957b409SSimon J. Gerraty 		}
1513*0957b409SSimon J. Gerraty 		num <<= 1;
1514*0957b409SSimon J. Gerraty 	}
1515*0957b409SSimon J. Gerraty }
1516*0957b409SSimon J. Gerraty 
1517*0957b409SSimon J. Gerraty static void
1518*0957b409SSimon J. Gerraty test_speed_moddiv(void)
1519*0957b409SSimon J. Gerraty {
1520*0957b409SSimon J. Gerraty 	uint32_t mx[65], my[65], mp[65], t1[65], t2[65], t3[65], len;
1521*0957b409SSimon J. Gerraty 	unsigned char x[255], y[255];
1522*0957b409SSimon J. Gerraty 	int i;
1523*0957b409SSimon J. Gerraty 	long num;
1524*0957b409SSimon J. Gerraty 
1525*0957b409SSimon J. Gerraty 	len = br_int_decode(mp, sizeof mp / sizeof mp[0],
1526*0957b409SSimon J. Gerraty 		P2048, sizeof P2048);
1527*0957b409SSimon J. Gerraty 	if (len != 65) {
1528*0957b409SSimon J. Gerraty 		abort();
1529*0957b409SSimon J. Gerraty 	}
1530*0957b409SSimon J. Gerraty 	memset(x, 'T', sizeof x);
1531*0957b409SSimon J. Gerraty 	memset(y, 'P', sizeof y);
1532*0957b409SSimon J. Gerraty 	if (!br_modint_decode(mx, mp, x, sizeof x)) {
1533*0957b409SSimon J. Gerraty 		abort();
1534*0957b409SSimon J. Gerraty 	}
1535*0957b409SSimon J. Gerraty 	if (!br_modint_decode(my, mp, y, sizeof y)) {
1536*0957b409SSimon J. Gerraty 		abort();
1537*0957b409SSimon J. Gerraty 	}
1538*0957b409SSimon J. Gerraty 	for (i = 0; i < 10; i ++) {
1539*0957b409SSimon J. Gerraty 		br_modint_div(mx, my, mp, t1, t2, t3);
1540*0957b409SSimon J. Gerraty 	}
1541*0957b409SSimon J. Gerraty 	num = 10;
1542*0957b409SSimon J. Gerraty 	for (;;) {
1543*0957b409SSimon J. Gerraty 		clock_t begin, end;
1544*0957b409SSimon J. Gerraty 		double tt;
1545*0957b409SSimon J. Gerraty 		long k;
1546*0957b409SSimon J. Gerraty 
1547*0957b409SSimon J. Gerraty 		begin = clock();
1548*0957b409SSimon J. Gerraty 		for (k = num; k > 0; k --) {
1549*0957b409SSimon J. Gerraty 			br_modint_div(mx, my, mp, t1, t2, t3);
1550*0957b409SSimon J. Gerraty 		}
1551*0957b409SSimon J. Gerraty 		end = clock();
1552*0957b409SSimon J. Gerraty 		tt = (double)(end - begin) / CLOCKS_PER_SEC;
1553*0957b409SSimon J. Gerraty 		if (tt >= 2.0) {
1554*0957b409SSimon J. Gerraty 			printf("%-30s %8.2f div/s\n", "div[2048]",
1555*0957b409SSimon J. Gerraty 				(double)num / tt);
1556*0957b409SSimon J. Gerraty 			fflush(stdout);
1557*0957b409SSimon J. Gerraty 			return;
1558*0957b409SSimon J. Gerraty 		}
1559*0957b409SSimon J. Gerraty 		num <<= 1;
1560*0957b409SSimon J. Gerraty 	}
1561*0957b409SSimon J. Gerraty }
1562*0957b409SSimon J. Gerraty #endif
1563*0957b409SSimon J. Gerraty 
1564*0957b409SSimon J. Gerraty #define STU(x)   { test_speed_ ## x, #x }
1565*0957b409SSimon J. Gerraty 
1566*0957b409SSimon J. Gerraty static const struct {
1567*0957b409SSimon J. Gerraty 	void (*fn)(void);
1568*0957b409SSimon J. Gerraty 	char *name;
1569*0957b409SSimon J. Gerraty } tfns[] = {
1570*0957b409SSimon J. Gerraty 	STU(md5),
1571*0957b409SSimon J. Gerraty 	STU(sha1),
1572*0957b409SSimon J. Gerraty 	STU(sha256),
1573*0957b409SSimon J. Gerraty 	STU(sha512),
1574*0957b409SSimon J. Gerraty 
1575*0957b409SSimon J. Gerraty 	STU(aes128_big_cbcenc),
1576*0957b409SSimon J. Gerraty 	STU(aes128_big_cbcdec),
1577*0957b409SSimon J. Gerraty 	STU(aes192_big_cbcenc),
1578*0957b409SSimon J. Gerraty 	STU(aes192_big_cbcdec),
1579*0957b409SSimon J. Gerraty 	STU(aes256_big_cbcenc),
1580*0957b409SSimon J. Gerraty 	STU(aes256_big_cbcdec),
1581*0957b409SSimon J. Gerraty 	STU(aes128_big_ctr),
1582*0957b409SSimon J. Gerraty 	STU(aes192_big_ctr),
1583*0957b409SSimon J. Gerraty 	STU(aes256_big_ctr),
1584*0957b409SSimon J. Gerraty 
1585*0957b409SSimon J. Gerraty 	STU(aes128_small_cbcenc),
1586*0957b409SSimon J. Gerraty 	STU(aes128_small_cbcdec),
1587*0957b409SSimon J. Gerraty 	STU(aes192_small_cbcenc),
1588*0957b409SSimon J. Gerraty 	STU(aes192_small_cbcdec),
1589*0957b409SSimon J. Gerraty 	STU(aes256_small_cbcenc),
1590*0957b409SSimon J. Gerraty 	STU(aes256_small_cbcdec),
1591*0957b409SSimon J. Gerraty 	STU(aes128_small_ctr),
1592*0957b409SSimon J. Gerraty 	STU(aes192_small_ctr),
1593*0957b409SSimon J. Gerraty 	STU(aes256_small_ctr),
1594*0957b409SSimon J. Gerraty 
1595*0957b409SSimon J. Gerraty 	STU(aes128_ct_cbcenc),
1596*0957b409SSimon J. Gerraty 	STU(aes128_ct_cbcdec),
1597*0957b409SSimon J. Gerraty 	STU(aes192_ct_cbcenc),
1598*0957b409SSimon J. Gerraty 	STU(aes192_ct_cbcdec),
1599*0957b409SSimon J. Gerraty 	STU(aes256_ct_cbcenc),
1600*0957b409SSimon J. Gerraty 	STU(aes256_ct_cbcdec),
1601*0957b409SSimon J. Gerraty 	STU(aes128_ct_ctr),
1602*0957b409SSimon J. Gerraty 	STU(aes192_ct_ctr),
1603*0957b409SSimon J. Gerraty 	STU(aes256_ct_ctr),
1604*0957b409SSimon J. Gerraty 
1605*0957b409SSimon J. Gerraty 	STU(aes128_ct64_cbcenc),
1606*0957b409SSimon J. Gerraty 	STU(aes128_ct64_cbcdec),
1607*0957b409SSimon J. Gerraty 	STU(aes192_ct64_cbcenc),
1608*0957b409SSimon J. Gerraty 	STU(aes192_ct64_cbcdec),
1609*0957b409SSimon J. Gerraty 	STU(aes256_ct64_cbcenc),
1610*0957b409SSimon J. Gerraty 	STU(aes256_ct64_cbcdec),
1611*0957b409SSimon J. Gerraty 	STU(aes128_ct64_ctr),
1612*0957b409SSimon J. Gerraty 	STU(aes192_ct64_ctr),
1613*0957b409SSimon J. Gerraty 	STU(aes256_ct64_ctr),
1614*0957b409SSimon J. Gerraty 
1615*0957b409SSimon J. Gerraty 	STU(aes128_x86ni_cbcenc),
1616*0957b409SSimon J. Gerraty 	STU(aes128_x86ni_cbcdec),
1617*0957b409SSimon J. Gerraty 	STU(aes192_x86ni_cbcenc),
1618*0957b409SSimon J. Gerraty 	STU(aes192_x86ni_cbcdec),
1619*0957b409SSimon J. Gerraty 	STU(aes256_x86ni_cbcenc),
1620*0957b409SSimon J. Gerraty 	STU(aes256_x86ni_cbcdec),
1621*0957b409SSimon J. Gerraty 	STU(aes128_x86ni_ctr),
1622*0957b409SSimon J. Gerraty 	STU(aes192_x86ni_ctr),
1623*0957b409SSimon J. Gerraty 	STU(aes256_x86ni_ctr),
1624*0957b409SSimon J. Gerraty 
1625*0957b409SSimon J. Gerraty 	STU(aes128_pwr8_cbcenc),
1626*0957b409SSimon J. Gerraty 	STU(aes128_pwr8_cbcdec),
1627*0957b409SSimon J. Gerraty 	STU(aes192_pwr8_cbcenc),
1628*0957b409SSimon J. Gerraty 	STU(aes192_pwr8_cbcdec),
1629*0957b409SSimon J. Gerraty 	STU(aes256_pwr8_cbcenc),
1630*0957b409SSimon J. Gerraty 	STU(aes256_pwr8_cbcdec),
1631*0957b409SSimon J. Gerraty 	STU(aes128_pwr8_ctr),
1632*0957b409SSimon J. Gerraty 	STU(aes192_pwr8_ctr),
1633*0957b409SSimon J. Gerraty 	STU(aes256_pwr8_ctr),
1634*0957b409SSimon J. Gerraty 
1635*0957b409SSimon J. Gerraty 	STU(des_tab_cbcenc),
1636*0957b409SSimon J. Gerraty 	STU(des_tab_cbcdec),
1637*0957b409SSimon J. Gerraty 	STU(3des_tab_cbcenc),
1638*0957b409SSimon J. Gerraty 	STU(3des_tab_cbcdec),
1639*0957b409SSimon J. Gerraty 
1640*0957b409SSimon J. Gerraty 	STU(des_ct_cbcenc),
1641*0957b409SSimon J. Gerraty 	STU(des_ct_cbcdec),
1642*0957b409SSimon J. Gerraty 	STU(3des_ct_cbcenc),
1643*0957b409SSimon J. Gerraty 	STU(3des_ct_cbcdec),
1644*0957b409SSimon J. Gerraty 
1645*0957b409SSimon J. Gerraty 	STU(chacha20_ct),
1646*0957b409SSimon J. Gerraty 	STU(chacha20_sse2),
1647*0957b409SSimon J. Gerraty 
1648*0957b409SSimon J. Gerraty 	STU(ghash_ctmul),
1649*0957b409SSimon J. Gerraty 	STU(ghash_ctmul32),
1650*0957b409SSimon J. Gerraty 	STU(ghash_ctmul64),
1651*0957b409SSimon J. Gerraty 	STU(ghash_pclmul),
1652*0957b409SSimon J. Gerraty 	STU(ghash_pwr8),
1653*0957b409SSimon J. Gerraty 
1654*0957b409SSimon J. Gerraty 	STU(poly1305_ctmul),
1655*0957b409SSimon J. Gerraty 	STU(poly1305_ctmul32),
1656*0957b409SSimon J. Gerraty 	STU(poly1305_ctmulq),
1657*0957b409SSimon J. Gerraty 	STU(poly1305_i15),
1658*0957b409SSimon J. Gerraty 
1659*0957b409SSimon J. Gerraty 	STU(eax_aes128_big),
1660*0957b409SSimon J. Gerraty 	STU(eax_aes192_big),
1661*0957b409SSimon J. Gerraty 	STU(eax_aes256_big),
1662*0957b409SSimon J. Gerraty 	STU(eax_aes128_small),
1663*0957b409SSimon J. Gerraty 	STU(eax_aes192_small),
1664*0957b409SSimon J. Gerraty 	STU(eax_aes256_small),
1665*0957b409SSimon J. Gerraty 	STU(eax_aes128_ct),
1666*0957b409SSimon J. Gerraty 	STU(eax_aes192_ct),
1667*0957b409SSimon J. Gerraty 	STU(eax_aes256_ct),
1668*0957b409SSimon J. Gerraty 	STU(eax_aes128_ct64),
1669*0957b409SSimon J. Gerraty 	STU(eax_aes192_ct64),
1670*0957b409SSimon J. Gerraty 	STU(eax_aes256_ct64),
1671*0957b409SSimon J. Gerraty 	STU(eax_aes128_x86ni),
1672*0957b409SSimon J. Gerraty 	STU(eax_aes192_x86ni),
1673*0957b409SSimon J. Gerraty 	STU(eax_aes256_x86ni),
1674*0957b409SSimon J. Gerraty 	STU(eax_aes128_pwr8),
1675*0957b409SSimon J. Gerraty 	STU(eax_aes192_pwr8),
1676*0957b409SSimon J. Gerraty 	STU(eax_aes256_pwr8),
1677*0957b409SSimon J. Gerraty 
1678*0957b409SSimon J. Gerraty 	STU(shake128),
1679*0957b409SSimon J. Gerraty 	STU(shake256),
1680*0957b409SSimon J. Gerraty 
1681*0957b409SSimon J. Gerraty 	STU(rsa_i15),
1682*0957b409SSimon J. Gerraty 	STU(rsa_i31),
1683*0957b409SSimon J. Gerraty 	STU(rsa_i32),
1684*0957b409SSimon J. Gerraty 	STU(rsa_i62),
1685*0957b409SSimon J. Gerraty 	STU(ec_prime_i15),
1686*0957b409SSimon J. Gerraty 	STU(ec_prime_i31),
1687*0957b409SSimon J. Gerraty 	STU(ec_p256_m15),
1688*0957b409SSimon J. Gerraty 	STU(ec_p256_m31),
1689*0957b409SSimon J. Gerraty 	STU(ec_p256_m62),
1690*0957b409SSimon J. Gerraty 	STU(ec_p256_m64),
1691*0957b409SSimon J. Gerraty 	STU(ec_c25519_i15),
1692*0957b409SSimon J. Gerraty 	STU(ec_c25519_i31),
1693*0957b409SSimon J. Gerraty 	STU(ec_c25519_m15),
1694*0957b409SSimon J. Gerraty 	STU(ec_c25519_m31),
1695*0957b409SSimon J. Gerraty 	STU(ec_c25519_m62),
1696*0957b409SSimon J. Gerraty 	STU(ec_c25519_m64),
1697*0957b409SSimon J. Gerraty 	STU(ecdsa_p256_m15),
1698*0957b409SSimon J. Gerraty 	STU(ecdsa_p256_m31),
1699*0957b409SSimon J. Gerraty 	STU(ecdsa_p256_m62),
1700*0957b409SSimon J. Gerraty 	STU(ecdsa_p256_m64),
1701*0957b409SSimon J. Gerraty 	STU(ecdsa_i15),
1702*0957b409SSimon J. Gerraty 	STU(ecdsa_i31),
1703*0957b409SSimon J. Gerraty 
1704*0957b409SSimon J. Gerraty 	STU(i31)
1705*0957b409SSimon J. Gerraty };
1706*0957b409SSimon J. Gerraty 
1707*0957b409SSimon J. Gerraty static int
eq_name(const char * s1,const char * s2)1708*0957b409SSimon J. Gerraty eq_name(const char *s1, const char *s2)
1709*0957b409SSimon J. Gerraty {
1710*0957b409SSimon J. Gerraty 	for (;;) {
1711*0957b409SSimon J. Gerraty 		int c1, c2;
1712*0957b409SSimon J. Gerraty 
1713*0957b409SSimon J. Gerraty 		for (;;) {
1714*0957b409SSimon J. Gerraty 			c1 = *s1 ++;
1715*0957b409SSimon J. Gerraty 			if (c1 >= 'A' && c1 <= 'Z') {
1716*0957b409SSimon J. Gerraty 				c1 += 'a' - 'A';
1717*0957b409SSimon J. Gerraty 			} else {
1718*0957b409SSimon J. Gerraty 				switch (c1) {
1719*0957b409SSimon J. Gerraty 				case '-': case '_': case '.': case ' ':
1720*0957b409SSimon J. Gerraty 					continue;
1721*0957b409SSimon J. Gerraty 				}
1722*0957b409SSimon J. Gerraty 			}
1723*0957b409SSimon J. Gerraty 			break;
1724*0957b409SSimon J. Gerraty 		}
1725*0957b409SSimon J. Gerraty 		for (;;) {
1726*0957b409SSimon J. Gerraty 			c2 = *s2 ++;
1727*0957b409SSimon J. Gerraty 			if (c2 >= 'A' && c2 <= 'Z') {
1728*0957b409SSimon J. Gerraty 				c2 += 'a' - 'A';
1729*0957b409SSimon J. Gerraty 			} else {
1730*0957b409SSimon J. Gerraty 				switch (c2) {
1731*0957b409SSimon J. Gerraty 				case '-': case '_': case '.': case ' ':
1732*0957b409SSimon J. Gerraty 					continue;
1733*0957b409SSimon J. Gerraty 				}
1734*0957b409SSimon J. Gerraty 			}
1735*0957b409SSimon J. Gerraty 			break;
1736*0957b409SSimon J. Gerraty 		}
1737*0957b409SSimon J. Gerraty 		if (c1 != c2) {
1738*0957b409SSimon J. Gerraty 			return 0;
1739*0957b409SSimon J. Gerraty 		}
1740*0957b409SSimon J. Gerraty 		if (c1 == 0) {
1741*0957b409SSimon J. Gerraty 			return 1;
1742*0957b409SSimon J. Gerraty 		}
1743*0957b409SSimon J. Gerraty 	}
1744*0957b409SSimon J. Gerraty }
1745*0957b409SSimon J. Gerraty 
1746*0957b409SSimon J. Gerraty int
main(int argc,char * argv[])1747*0957b409SSimon J. Gerraty main(int argc, char *argv[])
1748*0957b409SSimon J. Gerraty {
1749*0957b409SSimon J. Gerraty 	size_t u;
1750*0957b409SSimon J. Gerraty 
1751*0957b409SSimon J. Gerraty 	if (argc <= 1) {
1752*0957b409SSimon J. Gerraty 		printf("usage: testspeed all | name...\n");
1753*0957b409SSimon J. Gerraty 		printf("individual test names:\n");
1754*0957b409SSimon J. Gerraty 		for (u = 0; u < (sizeof tfns) / (sizeof tfns[0]); u ++) {
1755*0957b409SSimon J. Gerraty 			printf("   %s\n", tfns[u].name);
1756*0957b409SSimon J. Gerraty 		}
1757*0957b409SSimon J. Gerraty 	} else {
1758*0957b409SSimon J. Gerraty 		for (u = 0; u < (sizeof tfns) / (sizeof tfns[0]); u ++) {
1759*0957b409SSimon J. Gerraty 			int i;
1760*0957b409SSimon J. Gerraty 
1761*0957b409SSimon J. Gerraty 			for (i = 1; i < argc; i ++) {
1762*0957b409SSimon J. Gerraty 				if (eq_name(argv[i], tfns[u].name)
1763*0957b409SSimon J. Gerraty 					|| eq_name(argv[i], "all"))
1764*0957b409SSimon J. Gerraty 				{
1765*0957b409SSimon J. Gerraty 					tfns[u].fn();
1766*0957b409SSimon J. Gerraty 					break;
1767*0957b409SSimon J. Gerraty 				}
1768*0957b409SSimon J. Gerraty 			}
1769*0957b409SSimon J. Gerraty 		}
1770*0957b409SSimon J. Gerraty 	}
1771*0957b409SSimon J. Gerraty 	return 0;
1772*0957b409SSimon J. Gerraty }
1773