blob: 923111876aea9c8e35b154efd700430ff15a4bd8 [file] [log] [blame]
Manuel Pégourié-Gonnard52a422f2012-11-08 14:56:25 +01001/*
2 * Temporary mini-benchmark for ECP multiplication
3 * (and comparision with GF(p) exponentation if any argument is given)
4 */
5
6#include <string.h>
7#include <stdlib.h>
8#include <stdio.h>
9
10#include "polarssl/config.h"
11
12#include "polarssl/dhm.h"
13#include "polarssl/ecp.h"
14#include "polarssl/timing.h"
15#include "polarssl/error.h"
16
17#if !defined(POLARSSL_TIMING_C) || !defined(POLARSSL_BIGNUM_C) || \
18 !defined(POLARSSL_DHM_C) || !defined(POLARSSL_ECP_C)
19
20int main( int argc, char *argv[] )
21{
22 ((void) argc);
23 ((void) argv);
24
25 printf("POLARSSL_{TIMING,BIGNUM,DHM,ECP}_C not defined.\n");
26 return( 0 );
27}
28
29#else
30
Manuel Pégourié-Gonnard337b29c2013-09-07 11:52:27 +020031static int myrand( void *rng_state, unsigned char *output, size_t len )
32{
33 size_t use_len;
34 int rnd;
35
36 if( rng_state != NULL )
37 rng_state = NULL;
38
39 while( len > 0 )
40 {
41 use_len = len;
42 if( use_len > sizeof(int) )
43 use_len = sizeof(int);
44
45 rnd = rand();
46 memcpy( output, &rnd, use_len );
47 output += use_len;
48 len -= use_len;
49 }
50
51 return( 0 );
52}
53
Paul Bakker3c5ef712013-06-25 16:37:45 +020054static void dhm_bench_case( const char *s, const char *p,
55 const char *g, const char *x )
Manuel Pégourié-Gonnard52a422f2012-11-08 14:56:25 +010056{
57 unsigned long i;
58 mpi P, G, X, R, C;
59
60 mpi_init( &P ); mpi_init( &G ); mpi_init( &X ); mpi_init( &R );
61 mpi_init( &C );
62
63 mpi_read_string( &P, 16, p );
64 mpi_read_string( &G, 16, g );
65 mpi_read_string( &X, 16, x );
66
67 printf( " MODP-%s : ", s );
68 fflush( stdout );
69 set_alarm( 3 );
70
71 for( i = 1; ! alarmed; i++ )
72 mpi_exp_mod( &R, &G, &X, &P, &C );
73
74 printf( "%9lu exp/s\n", i / 3 );
75
76 mpi_free( &P ); mpi_free( &G ); mpi_free( &X ); mpi_free( &R );
77 mpi_free( &C );
78}
79
80#define MODP_1024_G \
81 "205BE4D89282CE6A9488626CA9BCC1264E7C9525903F049D" \
82 "D6A77315AA12B01467EB1EA21B25569BECEC276623859A8C" \
83 "518D445DF43DCBA1B75D23B6BB6B96084FA3C10CA8DC1A96" \
84 "77E26332152233E13F4E6BF3C5D48514BC264A35AF385463" \
85 "8B8AE5E363BD6AE0B5D44875BB60A73A5E4075FB2037B833" \
86 "DC382EA6DD458EAE"
87
88#define MODP_1024_X \
89 "262F6727B2E44AF61981AAAB2AA749F64FD79AD18A1FC999" \
90 "2E71795130CB69F89BCFB70DB2A0F2A49A825A0AAA50715D" \
91 "5D9AE98198F0522AECBF8A0A2D331AB0296110617FC685FF" \
92 "7338F4201329ABDFDEAEC779E4D56CC46A0A38B18DC18DFE" \
93 "640865426A7360BCCD4E4F82B3686B4804071D4B9F5582ED" \
94 "E4758F170C3A1415"
95
96#define MODP_2048_G \
97 "717892E6698EB3CD62113AAE793EA6690791F89290FD83C3" \
98 "A059F328C5FBD10AB25C1E8F96245836600FC7772AFB42ED" \
99 "F7A809FC3D38F7794574CAC8A318D41C917EE34C81EA8838" \
100 "BA6068E81ED3C7F039A83914D044AB2379B3C5C24F0FFD4E" \
101 "B6642F26F1EDF015AB7829E9EDC8DCD8A4013C76682338E8" \
102 "3D44B0F4E870CF3134874EAA3AC0803DA2CE30922E251B02" \
103 "BDDD94137F9DFD41627AE20B7E4137BA94496A4B2AEB0354" \
104 "8E1C4126A87240B43E23BB574D354EF1AD01FED5627F240C" \
105 "2F4F5521D2F51DFE0702D18EED6DDF022D93554E7AB67D81" \
106 "AD4C5256A6AC00DE1AD0751FDCC17F8C7136C194F48A39F5" \
107 "957B831081C9058CA0C3A03C7C41F1C9"
108
109#define MODP_2048_X \
110 "AFA7186FC7A0370DE6E3DD95473C9D10C916BD186E41FB48" \
111 "195D123E5CFE8D237A2A640DCE19B3DD7028C6168084A61D" \
112 "4E4E218A1D98E0C2C93E2E1516F97E596B50C811CE93417B" \
113 "905DA6833D1CE41838AEAA9CA6CE36E2430A244A6696E99B" \
114 "54B6AAC75D4F6FF6F0568145BDBBC83F5F603D698198A8EE" \
115 "2098F5DCABDD458C465E795520EDD46C3B992EAFACF24A56" \
116 "263850C9A07165A0CE52B7DC71489CA67AC4A6E6176B547B" \
117 "A1C233E3C7898C283E82B3E74B9056F84F7B4A10B5CE10FF" \
118 "7D43107B68F2381E64C77C61474DE8CA70EA8DF935D43CD2" \
119 "CE208D9F7E468F07A93A74676ED1A3C77CB1CD59E96DCA77" \
120 "125DE5B672798FC943048FDBB24167B1"
121
122#define MODP_3072_G \
123 "38B2B12253661411B63E62F3FAC5BE7CF6A416F249E4A039" \
124 "0884765C18F2EDF93FCC2646B888ED64B783765D576887B1" \
125 "74ABB76123ECA6537DDC1F95757645F3C870CBFF2D40E40D" \
126 "C2556A14115C37BE299BDCB0F07AB7AAE0D8FA6CF44A0C22" \
127 "ED5368922EF028EC2B5B0AB42F858D5D780828A508C252A7" \
128 "96F8CE7AA9C83D1E820F6991771AAA2286A7754FCCB3AA16" \
129 "51D840EC788C5DDEAFAAC0C82EAC84EBFF5EB52699BE4020" \
130 "F62607937EB168766BCC1F786F4FCDDBB66C0BCEA983AE87" \
131 "5C2DD6C201FBF5C178308E64831D14F12399F21761D13BC1" \
132 "20B2377FBAD73613FA7B7E443BEE3879E7EEFB0A625A0EBA" \
133 "2D379E8F5EA62C91BC58A6FCDD5D7435B0E747B7B65A47BE" \
134 "0CA769DE340E611A98A6DDED72E89486875F02DAE24715E8" \
135 "3787A5DB53AA28D3F838E7F11EE80F0310C8597B585D6B1A" \
136 "3991FBD7459ED277C34C9A4AE0AE6DC7EE5C99B14F366129" \
137 "C3747617B724A2BED48F5BF3106B40E60CC3677780F1A39D" \
138 "430154C2B460CC676AACC7B34F792621D743D1AC59EDBAC6"
139
140#define MODP_3072_X \
141 "4391157AD824806F07421C1545AA795E26B120A5CEE427F0" \
142 "6725BB247E6B2F4C4BE052E4B240B2DD6194B37F3423FA3F" \
143 "00C3DF9F4C2165662FCCC9B8DE52C19001E8D54E9053A605" \
144 "24BCA6AB0698632EB5D62451987E89AF0FA63479D344E2A7" \
145 "58ED8DB5D287600C85A8DD08D9E2E5587177AB6A25A76C71" \
146 "5BCAA737FB7DC45E371F4DEC13B40CA9D461A99A98847E1B" \
147 "D9CD1BA02DCC331B5B2256887B7F0139A9E7BEA8A6CDA318" \
148 "B95E12A1CEE6A26EC070C34C270067C79DBC906295C3C9DF" \
149 "2FA6D6B637B7CE81B535DB2D6E196F46ED2F92F3EE8EACE1" \
150 "002349D035550A44B75E76B7A77A6A670EC13E334201B543" \
151 "B1708295F33B777BD4555A032313C3388DBD5ABC5FB0FEFD" \
152 "A9A98C0CC4C7E919927BDC8D46B5347A1266A4C8331C2EB0" \
153 "C93DB67244BD6CE2757BA61A063DDD0DF0561A97786D1299" \
154 "EBE3EAC838F420D1A0DC9D633B2F16CCE91E436C0413CE6A" \
155 "F98E0273FC5C08A4EA70D6DC09A1855AFB402E02BD9F261E" \
156 "863717A552F4A83D4DD5060CB70E2D4D7FFAEE912C2C4408"
157
Paul Bakker3c5ef712013-06-25 16:37:45 +0200158static void dhm_bench( void )
Manuel Pégourié-Gonnard52a422f2012-11-08 14:56:25 +0100159{
160 dhm_bench_case( "1024", POLARSSL_DHM_RFC5114_MODP_1024_P,
161 MODP_1024_G, MODP_1024_X );
162
163 dhm_bench_case( "2048", POLARSSL_DHM_RFC3526_MODP_2048_P,
164 MODP_2048_G, MODP_2048_X );
165
166 dhm_bench_case( "3072", POLARSSL_DHM_RFC3526_MODP_3072_P,
167 MODP_3072_G, MODP_3072_X );
168}
169
Paul Bakker3c5ef712013-06-25 16:37:45 +0200170static void ecp_bench_case( size_t dp, const char *s, const char *m )
Manuel Pégourié-Gonnard52a422f2012-11-08 14:56:25 +0100171{
172 unsigned long i;
173 ecp_group grp;
174 ecp_point R;
175 mpi M;
176
177 ecp_group_init( &grp ); ecp_point_init( &R ); mpi_init( &M );
178
179 ecp_use_known_dp( &grp, dp );
180 mpi_read_string( &M, 16, m );
181
182 printf( " ECP-%s : ", s );
183 fflush( stdout );
184 set_alarm( 3 );
185
186 for( i = 1; ! alarmed; i++ )
Manuel Pégourié-Gonnard337b29c2013-09-07 11:52:27 +0200187 ecp_mul( &grp, &R, &M, &grp.G, myrand, NULL );
Manuel Pégourié-Gonnard52a422f2012-11-08 14:56:25 +0100188
189 printf( "%9lu mul/s\n", i / 3 );
190
191 ecp_group_free( &grp ); ecp_point_free( &R ); mpi_free( &M );
192}
193
194#define ECP_192_M \
195 "FE61330B02915F25970C2AF8575CBB227E6B6394774E6EC8"
196#define ECP_224_M \
197 "EAC63628087E32F61A383DCAED57E4348081FF3637D95B904C2FD487"
198#define ECP_256_M \
199 "83C4106612BDDB781DD446CF2A873D78AA0620B9003789244A18F83B39B3EA63"
200#define ECP_384_M \
201 "3E45569675A7E2E0E2E663A11E4226FBEF0F99A96CD6E547" \
202 "9ABDDF36DD9AB7278BCD8B96A0775847A6431D2AF7476CD9"
203#define ECP_521_M \
204 "017F540D09F24EC6B102E8E4A9F14B850442D98C68FB29A6B09B9B9D40E2A750" \
205 "7F3D2D6C5B6536B607EF2BCEA4797BB3A68F0D745410EB5CFFC7FF7FB17381544E"
206
Paul Bakker3c5ef712013-06-25 16:37:45 +0200207static void ecp_bench( void )
Manuel Pégourié-Gonnard52a422f2012-11-08 14:56:25 +0100208{
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200209#if defined(POLARSSL_ECP_DP_SECP192R1_ENABLED)
210 ecp_bench_case( POLARSSL_ECP_DP_SECP192R1, "192", ECP_192_M );
211#endif
212#if defined(POLARSSL_ECP_DP_SECP224R1_ENABLED)
213 ecp_bench_case( POLARSSL_ECP_DP_SECP224R1, "224", ECP_224_M );
214#endif
215#if defined(POLARSSL_ECP_DP_SECP256R1_ENABLED)
216 ecp_bench_case( POLARSSL_ECP_DP_SECP256R1, "256", ECP_256_M );
217#endif
218#if defined(POLARSSL_ECP_DP_SECP384R1_ENABLED)
219 ecp_bench_case( POLARSSL_ECP_DP_SECP384R1, "384", ECP_384_M );
220#endif
221#if defined(POLARSSL_ECP_DP_SECP521R1_ENABLED)
222 ecp_bench_case( POLARSSL_ECP_DP_SECP521R1, "521", ECP_521_M );
223#endif
Manuel Pégourié-Gonnard52a422f2012-11-08 14:56:25 +0100224}
225
226int main( int argc, char *argv[] )
227{
228 ((void) argv);
229 if( argc > 1 )
230 {
231 dhm_bench();
232 }
233
234 ecp_bench();
235
236 return( 0 );
237}
238#endif