blob: ddf2c7892d2987a53d5e5408dabfeadb92eed73d [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * Benchmark demonstration program
3 *
Paul Bakkerd2681d82013-06-30 14:49:12 +02004 * Copyright (C) 2006-2013, Brainspark B.V.
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
6 * This file is part of PolarSSL (http://www.polarssl.org)
Paul Bakker84f12b72010-07-18 10:13:04 +00007 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
Paul Bakkerb96f1542010-07-18 20:36:00 +00008 *
Paul Bakker77b385e2009-07-28 17:23:11 +00009 * All rights reserved.
Paul Bakkere0ccd0a2009-01-04 16:27:10 +000010 *
Paul Bakker5121ce52009-01-03 21:22:43 +000011 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25
Manuel Pégourié-Gonnardabd6e022013-09-20 13:30:43 +020026#include "polarssl/config.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000027
28#include <string.h>
29#include <stdlib.h>
30#include <stdio.h>
31
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +020032#include "polarssl/timing.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000033
Paul Bakker40e46942009-01-03 21:51:57 +000034#include "polarssl/md4.h"
35#include "polarssl/md5.h"
Paul Bakker61b699e2014-01-22 13:35:29 +010036#include "polarssl/ripemd160.h"
Paul Bakker40e46942009-01-03 21:51:57 +000037#include "polarssl/sha1.h"
Paul Bakkerd2681d82013-06-30 14:49:12 +020038#include "polarssl/sha256.h"
39#include "polarssl/sha512.h"
Paul Bakker40e46942009-01-03 21:51:57 +000040#include "polarssl/arc4.h"
41#include "polarssl/des.h"
42#include "polarssl/aes.h"
Paul Bakker3d58fe82012-07-04 17:15:31 +000043#include "polarssl/blowfish.h"
Paul Bakker38119b12009-01-10 23:31:23 +000044#include "polarssl/camellia.h"
Paul Bakker89e80c92012-03-20 13:50:09 +000045#include "polarssl/gcm.h"
Manuel Pégourié-Gonnardcc34f952013-09-17 16:04:08 +020046#include "polarssl/havege.h"
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +020047#include "polarssl/ctr_drbg.h"
Manuel Pégourié-Gonnardfef0f8f2014-01-30 20:59:00 +010048#include "polarssl/hmac_drbg.h"
Paul Bakker40e46942009-01-03 21:51:57 +000049#include "polarssl/rsa.h"
Manuel Pégourié-Gonnarde870c0a2012-11-08 11:31:48 +010050#include "polarssl/dhm.h"
Manuel Pégourié-Gonnardcc34f952013-09-17 16:04:08 +020051#include "polarssl/ecdsa.h"
52#include "polarssl/ecdh.h"
Gergely Budaia5d336b2014-01-27 23:27:06 +010053#include "polarssl/error.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000054
Manuel Pégourié-Gonnard2f77ce32013-10-03 11:59:57 +020055#if defined _MSC_VER && !defined snprintf
56#define snprintf _snprintf
57#endif
58
Paul Bakker02faf452011-11-29 11:23:58 +000059#define BUFSIZE 1024
Manuel Pégourié-Gonnardfef0f8f2014-01-30 20:59:00 +010060#define HEADER_FORMAT " %-24s : "
Gergely Budaia5d336b2014-01-27 23:27:06 +010061#define TITLE_LEN 25
Paul Bakker5121ce52009-01-03 21:22:43 +000062
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +020063#if !defined(POLARSSL_TIMING_C)
64int main( int argc, char *argv[] )
65{
66 ((void) argc);
67 ((void) argv);
68
69 printf("POLARSSL_TIMING_C not defined.\n");
70 return( 0 );
71}
72#else
73
Paul Bakkera3d195c2011-11-27 21:07:34 +000074static int myrand( void *rng_state, unsigned char *output, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +000075{
Paul Bakkera3d195c2011-11-27 21:07:34 +000076 size_t use_len;
77 int rnd;
78
Paul Bakker5121ce52009-01-03 21:22:43 +000079 if( rng_state != NULL )
80 rng_state = NULL;
81
Paul Bakkera3d195c2011-11-27 21:07:34 +000082 while( len > 0 )
83 {
84 use_len = len;
85 if( use_len > sizeof(int) )
86 use_len = sizeof(int);
87
88 rnd = rand();
89 memcpy( output, &rnd, use_len );
90 output += use_len;
91 len -= use_len;
92 }
93
94 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +000095}
96
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +020097#define TIME_AND_TSC( TITLE, CODE ) \
98do { \
99 unsigned long i, j, tsc; \
100 \
101 printf( HEADER_FORMAT, TITLE ); \
102 fflush( stdout ); \
103 \
104 set_alarm( 1 ); \
105 for( i = 1; ! alarmed; i++ ) \
106 { \
107 CODE; \
108 } \
109 \
110 tsc = hardclock(); \
111 for( j = 0; j < 1024; j++ ) \
112 { \
113 CODE; \
114 } \
115 \
116 printf( "%9lu Kb/s, %9lu cycles/byte\n", i * BUFSIZE / 1024, \
117 ( hardclock() - tsc ) / ( j * BUFSIZE ) ); \
118} while( 0 )
119
120#define TIME_PUBLIC( TITLE, TYPE, CODE ) \
121do { \
122 unsigned long i; \
123 int ret; \
124 \
125 printf( HEADER_FORMAT, TITLE ); \
126 fflush( stdout ); \
127 set_alarm( 3 ); \
128 \
129 ret = 0; \
130 for( i = 1; ! alarmed && ! ret ; i++ ) \
131 { \
132 CODE; \
133 } \
134 \
135 if( ret != 0 ) \
Gergely Budaia5d336b2014-01-27 23:27:06 +0100136 { \
137 polarssl_strerror( ret, ( char * )tmp, sizeof( tmp ) ); \
138 printf( "FAILED: %s\n", tmp ); \
139 } \
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200140 else \
Manuel Pégourié-Gonnard01b0b382014-01-17 14:29:46 +0100141 printf( "%9lu " TYPE "/s\n", i / 3 ); \
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200142} while( 0 )
143
Paul Bakker5121ce52009-01-03 21:22:43 +0000144unsigned char buf[BUFSIZE];
145
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200146typedef struct {
Paul Bakker61b699e2014-01-22 13:35:29 +0100147 char md4, md5, ripemd160, sha1, sha256, sha512,
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200148 arc4, des3, des, aes_cbc, aes_gcm, camellia, blowfish,
Manuel Pégourié-Gonnardfef0f8f2014-01-30 20:59:00 +0100149 havege, ctr_drbg, hmac_drbg,
Manuel Pégourié-Gonnardcc34f952013-09-17 16:04:08 +0200150 rsa, dhm, ecdsa, ecdh;
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200151} todo_list;
152
153#define OPTIONS \
Paul Bakker61b699e2014-01-22 13:35:29 +0100154 "md4, md5, ripemd160, sha1, sha256, sha512,\n" \
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200155 "arc4, des3, des, aes_cbc, aes_gcm, camellia, blowfish,\n" \
Manuel Pégourié-Gonnardfef0f8f2014-01-30 20:59:00 +0100156 "havege, ctr_drbg, hmac_drbg\n" \
Manuel Pégourié-Gonnardcc34f952013-09-17 16:04:08 +0200157 "rsa, dhm, ecdsa, ecdh.\n"
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200158
Paul Bakkercce9d772011-11-18 14:26:47 +0000159int main( int argc, char *argv[] )
Paul Bakker5690efc2011-05-26 13:16:06 +0000160{
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200161 int keysize, i;
Manuel Pégourié-Gonnardcc34f952013-09-17 16:04:08 +0200162 unsigned char tmp[200];
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200163 char title[TITLE_LEN];
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200164 todo_list todo;
Paul Bakkercce9d772011-11-18 14:26:47 +0000165
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200166 if( argc == 1 )
167 memset( &todo, 1, sizeof( todo ) );
168 else
169 {
170 memset( &todo, 0, sizeof( todo ) );
171
172 for( i = 1; i < argc; i++ )
173 {
174 if( strcmp( argv[i], "md4" ) == 0 )
175 todo.md4 = 1;
176 else if( strcmp( argv[i], "md5" ) == 0 )
177 todo.md5 = 1;
Paul Bakker61b699e2014-01-22 13:35:29 +0100178 else if( strcmp( argv[i], "ripemd160" ) == 0 )
179 todo.ripemd160 = 1;
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200180 else if( strcmp( argv[i], "sha1" ) == 0 )
181 todo.sha1 = 1;
182 else if( strcmp( argv[i], "sha256" ) == 0 )
183 todo.sha256 = 1;
184 else if( strcmp( argv[i], "sha512" ) == 0 )
185 todo.sha512 = 1;
186 else if( strcmp( argv[i], "arc4" ) == 0 )
187 todo.arc4 = 1;
188 else if( strcmp( argv[i], "des3" ) == 0 )
189 todo.des3 = 1;
190 else if( strcmp( argv[i], "des" ) == 0 )
191 todo.des = 1;
192 else if( strcmp( argv[i], "aes_cbc" ) == 0 )
193 todo.aes_cbc = 1;
194 else if( strcmp( argv[i], "aes_gcm" ) == 0 )
195 todo.aes_gcm = 1;
196 else if( strcmp( argv[i], "camellia" ) == 0 )
197 todo.camellia = 1;
198 else if( strcmp( argv[i], "blowfish" ) == 0 )
199 todo.blowfish = 1;
200 else if( strcmp( argv[i], "havege" ) == 0 )
201 todo.havege = 1;
202 else if( strcmp( argv[i], "ctr_drbg" ) == 0 )
203 todo.ctr_drbg = 1;
Manuel Pégourié-Gonnardfef0f8f2014-01-30 20:59:00 +0100204 else if( strcmp( argv[i], "hmac_drbg" ) == 0 )
205 todo.hmac_drbg = 1;
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200206 else if( strcmp( argv[i], "rsa" ) == 0 )
207 todo.rsa = 1;
208 else if( strcmp( argv[i], "dhm" ) == 0 )
209 todo.dhm = 1;
Manuel Pégourié-Gonnardcc34f952013-09-17 16:04:08 +0200210 else if( strcmp( argv[i], "ecdsa" ) == 0 )
211 todo.ecdsa = 1;
212 else if( strcmp( argv[i], "ecdh" ) == 0 )
213 todo.ecdh = 1;
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200214 else
215 {
216 printf( "Unrecognized option: %s\n", argv[i] );
217 printf( "Available options:" OPTIONS );
218 }
219 }
220 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000221
222 printf( "\n" );
223
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200224 memset( buf, 0xAA, sizeof( buf ) );
225
Paul Bakker40e46942009-01-03 21:51:57 +0000226#if defined(POLARSSL_MD4_C)
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200227 if( todo.md4 )
228 TIME_AND_TSC( "MD4", md4( buf, BUFSIZE, tmp ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000229#endif
230
Paul Bakker40e46942009-01-03 21:51:57 +0000231#if defined(POLARSSL_MD5_C)
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200232 if( todo.md5 )
233 TIME_AND_TSC( "MD5", md5( buf, BUFSIZE, tmp ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000234#endif
235
Paul Bakker61b699e2014-01-22 13:35:29 +0100236#if defined(POLARSSL_RIPEMD160_C)
237 if( todo.ripemd160 )
238 TIME_AND_TSC( "RIPEMD160", ripemd160( buf, BUFSIZE, tmp ) );
Manuel Pégourié-Gonnard01b0b382014-01-17 14:29:46 +0100239#endif
240
Paul Bakker40e46942009-01-03 21:51:57 +0000241#if defined(POLARSSL_SHA1_C)
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200242 if( todo.sha1 )
243 TIME_AND_TSC( "SHA-1", sha1( buf, BUFSIZE, tmp ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000244#endif
245
Paul Bakker9e36f042013-06-30 14:34:05 +0200246#if defined(POLARSSL_SHA256_C)
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200247 if( todo.sha256 )
248 TIME_AND_TSC( "SHA-256", sha256( buf, BUFSIZE, tmp, 0 ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000249#endif
250
Paul Bakker9e36f042013-06-30 14:34:05 +0200251#if defined(POLARSSL_SHA512_C)
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200252 if( todo.sha512 )
253 TIME_AND_TSC( "SHA-512", sha512( buf, BUFSIZE, tmp, 0 ) );
Paul Bakker3a3c3c22009-02-09 22:33:30 +0000254#endif
255
Paul Bakker40e46942009-01-03 21:51:57 +0000256#if defined(POLARSSL_ARC4_C)
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200257 if( todo.arc4 )
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200258 {
259 arc4_context arc4;
260 arc4_setup( &arc4, tmp, 32 );
261 TIME_AND_TSC( "ARC4", arc4_crypt( &arc4, BUFSIZE, buf, buf ) );
262 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000263#endif
264
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200265#if defined(POLARSSL_DES_C) && defined(POLARSSL_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200266 if( todo.des3 )
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200267 {
268 des3_context des3;
269 des3_set3key_enc( &des3, tmp );
270 TIME_AND_TSC( "3DES",
271 des3_crypt_cbc( &des3, DES_ENCRYPT, BUFSIZE, tmp, buf, buf ) );
272 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000273
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200274 if( todo.des )
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200275 {
276 des_context des;
277 des_setkey_enc( &des, tmp );
278 TIME_AND_TSC( "DES",
279 des_crypt_cbc( &des, DES_ENCRYPT, BUFSIZE, tmp, buf, buf ) );
280 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000281#endif
282
Paul Bakker40e46942009-01-03 21:51:57 +0000283#if defined(POLARSSL_AES_C)
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200284#if defined(POLARSSL_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200285 if( todo.aes_cbc )
Paul Bakker5121ce52009-01-03 21:22:43 +0000286 {
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200287 aes_context aes;
288 for( keysize = 128; keysize <= 256; keysize += 64 )
289 {
290 snprintf( title, sizeof( title ), "AES-CBC-%d", keysize );
Paul Bakker5121ce52009-01-03 21:22:43 +0000291
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200292 memset( buf, 0, sizeof( buf ) );
293 memset( tmp, 0, sizeof( tmp ) );
294 aes_setkey_enc( &aes, tmp, keysize );
Paul Bakker5121ce52009-01-03 21:22:43 +0000295
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200296 TIME_AND_TSC( title,
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200297 aes_crypt_cbc( &aes, AES_ENCRYPT, BUFSIZE, tmp, buf, buf ) );
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200298 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000299 }
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200300#endif
Paul Bakker89e80c92012-03-20 13:50:09 +0000301#if defined(POLARSSL_GCM_C)
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200302 if( todo.aes_gcm )
Paul Bakker89e80c92012-03-20 13:50:09 +0000303 {
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200304 gcm_context gcm;
305 for( keysize = 128; keysize <= 256; keysize += 64 )
306 {
307 snprintf( title, sizeof( title ), "AES-GCM-%d", keysize );
Paul Bakker89e80c92012-03-20 13:50:09 +0000308
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200309 memset( buf, 0, sizeof( buf ) );
310 memset( tmp, 0, sizeof( tmp ) );
311 gcm_init( &gcm, POLARSSL_CIPHER_ID_AES, tmp, keysize );
Paul Bakker89e80c92012-03-20 13:50:09 +0000312
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200313 TIME_AND_TSC( title,
314 gcm_crypt_and_tag( &gcm, GCM_ENCRYPT, BUFSIZE, tmp,
315 12, NULL, 0, buf, buf, 16, tmp ) );
Paul Bakkerf70fe812013-12-16 16:43:10 +0100316
317 gcm_free( &gcm );
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200318 }
Paul Bakker89e80c92012-03-20 13:50:09 +0000319 }
320#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000321#endif
322
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200323#if defined(POLARSSL_CAMELLIA_C) && defined(POLARSSL_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200324 if( todo.camellia )
Paul Bakker38119b12009-01-10 23:31:23 +0000325 {
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200326 camellia_context camellia;
327 for( keysize = 128; keysize <= 256; keysize += 64 )
328 {
329 snprintf( title, sizeof( title ), "CAMELLIA-CBC-%d", keysize );
Paul Bakker38119b12009-01-10 23:31:23 +0000330
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200331 memset( buf, 0, sizeof( buf ) );
332 memset( tmp, 0, sizeof( tmp ) );
333 camellia_setkey_enc( &camellia, tmp, keysize );
Paul Bakker38119b12009-01-10 23:31:23 +0000334
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200335 TIME_AND_TSC( title,
336 camellia_crypt_cbc( &camellia, CAMELLIA_ENCRYPT,
337 BUFSIZE, tmp, buf, buf ) );
338 }
Paul Bakker38119b12009-01-10 23:31:23 +0000339 }
340#endif
341
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200342#if defined(POLARSSL_BLOWFISH_C) && defined(POLARSSL_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200343 if( todo.blowfish )
Paul Bakker3d58fe82012-07-04 17:15:31 +0000344 {
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200345 blowfish_context blowfish;
346 for( keysize = 128; keysize <= 256; keysize += 64 )
347 {
348 snprintf( title, sizeof( title ), "BLOWFISH-CBC-%d", keysize );
Paul Bakker3d58fe82012-07-04 17:15:31 +0000349
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200350 memset( buf, 0, sizeof( buf ) );
351 memset( tmp, 0, sizeof( tmp ) );
352 blowfish_setkey( &blowfish, tmp, keysize );
Paul Bakker3d58fe82012-07-04 17:15:31 +0000353
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200354 TIME_AND_TSC( title,
355 blowfish_crypt_cbc( &blowfish, BLOWFISH_ENCRYPT, BUFSIZE,
356 tmp, buf, buf ) );
357 }
Paul Bakker3d58fe82012-07-04 17:15:31 +0000358 }
359#endif
360
Paul Bakker02faf452011-11-29 11:23:58 +0000361#if defined(POLARSSL_HAVEGE_C)
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200362 if( todo.havege )
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200363 {
364 havege_state hs;
365 havege_init( &hs );
366 TIME_AND_TSC( "HAVEGE", havege_random( &hs, buf, BUFSIZE ) );
367 }
Paul Bakker02faf452011-11-29 11:23:58 +0000368#endif
369
370#if defined(POLARSSL_CTR_DRBG_C)
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200371 if( todo.ctr_drbg )
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200372 {
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200373 ctr_drbg_context ctr_drbg;
Paul Bakker02faf452011-11-29 11:23:58 +0000374
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200375 if( ctr_drbg_init( &ctr_drbg, myrand, NULL, NULL, 0 ) != 0 )
Paul Bakker02faf452011-11-29 11:23:58 +0000376 exit(1);
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200377 TIME_AND_TSC( "CTR_DRBG (NOPR)",
378 if( ctr_drbg_random( &ctr_drbg, buf, BUFSIZE ) != 0 )
379 exit(1) );
Paul Bakker02faf452011-11-29 11:23:58 +0000380
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200381 if( ctr_drbg_init( &ctr_drbg, myrand, NULL, NULL, 0 ) != 0 )
Paul Bakker02faf452011-11-29 11:23:58 +0000382 exit(1);
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200383 ctr_drbg_set_prediction_resistance( &ctr_drbg, CTR_DRBG_PR_ON );
384 TIME_AND_TSC( "CTR_DRBG (PR)",
385 if( ctr_drbg_random( &ctr_drbg, buf, BUFSIZE ) != 0 )
386 exit(1) );
387 }
Paul Bakker02faf452011-11-29 11:23:58 +0000388#endif
389
Manuel Pégourié-Gonnardfef0f8f2014-01-30 20:59:00 +0100390#if defined(POLARSSL_HMAC_DRBG_C)
391 if( todo.hmac_drbg )
392 {
393 hmac_drbg_context hmac_drbg;
394 const md_info_t *md_info;
395
396#if defined(POLARSSL_SHA1_C)
397 if( ( md_info = md_info_from_type( POLARSSL_MD_SHA1 ) ) == NULL )
398 exit(1);
399
400 if( hmac_drbg_init( &hmac_drbg, md_info, myrand, NULL, NULL, 0 ) != 0 )
401 exit(1);
402 TIME_AND_TSC( "HMAC_DRBG SHA-1 (NOPR)",
403 if( hmac_drbg_random( &hmac_drbg, buf, BUFSIZE ) != 0 )
404 exit(1) );
405 hmac_drbg_free( &hmac_drbg );
406
407 if( hmac_drbg_init( &hmac_drbg, md_info, myrand, NULL, NULL, 0 ) != 0 )
408 exit(1);
409 hmac_drbg_set_prediction_resistance( &hmac_drbg,
410 POLARSSL_HMAC_DRBG_PR_ON );
411 TIME_AND_TSC( "HMAC_DRBG SHA-1 (PR)",
412 if( hmac_drbg_random( &hmac_drbg, buf, BUFSIZE ) != 0 )
413 exit(1) );
414 hmac_drbg_free( &hmac_drbg );
415#endif
416
417#if defined(POLARSSL_SHA256_C)
418 if( ( md_info = md_info_from_type( POLARSSL_MD_SHA256 ) ) == NULL )
419 exit(1);
420
421 if( hmac_drbg_init( &hmac_drbg, md_info, myrand, NULL, NULL, 0 ) != 0 )
422 exit(1);
423 TIME_AND_TSC( "HMAC_DRBG SHA-256 (NOPR)",
424 if( hmac_drbg_random( &hmac_drbg, buf, BUFSIZE ) != 0 )
425 exit(1) );
426 hmac_drbg_free( &hmac_drbg );
427
428 if( hmac_drbg_init( &hmac_drbg, md_info, myrand, NULL, NULL, 0 ) != 0 )
429 exit(1);
430 hmac_drbg_set_prediction_resistance( &hmac_drbg,
431 POLARSSL_HMAC_DRBG_PR_ON );
432 TIME_AND_TSC( "HMAC_DRBG SHA-256 (PR)",
433 if( hmac_drbg_random( &hmac_drbg, buf, BUFSIZE ) != 0 )
434 exit(1) );
435 hmac_drbg_free( &hmac_drbg );
436#endif
437 }
438#endif
439
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200440#if defined(POLARSSL_RSA_C) && defined(POLARSSL_GENPRIME)
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200441 if( todo.rsa )
Paul Bakker5121ce52009-01-03 21:22:43 +0000442 {
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200443 rsa_context rsa;
444 for( keysize = 1024; keysize <= 4096; keysize *= 2 )
445 {
446 snprintf( title, sizeof( title ), "RSA-%d", keysize );
447
448 rsa_init( &rsa, RSA_PKCS_V15, 0 );
449 rsa_gen_key( &rsa, myrand, NULL, keysize, 65537 );
450
451 TIME_PUBLIC( title, " public",
452 buf[0] = 0;
453 ret = rsa_public( &rsa, buf, buf ) );
454
455 TIME_PUBLIC( title, "private",
456 buf[0] = 0;
457 ret = rsa_private( &rsa, myrand, NULL, buf, buf ) );
458
459 rsa_free( &rsa );
460 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000461 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000462#endif
463
Manuel Pégourié-Gonnarde870c0a2012-11-08 11:31:48 +0100464#if defined(POLARSSL_DHM_C) && defined(POLARSSL_BIGNUM_C)
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200465 if( todo.dhm )
Manuel Pégourié-Gonnarde870c0a2012-11-08 11:31:48 +0100466 {
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200467#define DHM_SIZES 3
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200468 int dhm_sizes[DHM_SIZES] = { 1024, 2048, 3072 };
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200469 const char *dhm_P[DHM_SIZES] = {
470 POLARSSL_DHM_RFC5114_MODP_1024_P,
471 POLARSSL_DHM_RFC3526_MODP_2048_P,
472 POLARSSL_DHM_RFC3526_MODP_3072_P,
473 };
474 const char *dhm_G[DHM_SIZES] = {
475 POLARSSL_DHM_RFC5114_MODP_1024_G,
476 POLARSSL_DHM_RFC3526_MODP_2048_G,
477 POLARSSL_DHM_RFC3526_MODP_3072_G,
478 };
479
480 dhm_context dhm;
481 size_t olen;
Manuel Pégourié-Gonnarded7cbe92013-09-17 15:30:51 +0200482 for( i = 0; i < DHM_SIZES; i++ )
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200483 {
484 memset( &dhm, 0, sizeof( dhm_context ) );
485
Paul Bakkercbe3d0d2014-04-17 16:00:59 +0200486 if( mpi_read_string( &dhm.P, 16, dhm_P[i] ) != 0 ||
487 mpi_read_string( &dhm.G, 16, dhm_G[i] ) != 0 )
488 {
489 exit( 1 );
490 }
491
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200492 dhm.len = mpi_size( &dhm.P );
Paul Bakker840ab202013-11-30 15:14:38 +0100493 dhm_make_public( &dhm, (int) dhm.len, buf, dhm.len, myrand, NULL );
Paul Bakkercbe3d0d2014-04-17 16:00:59 +0200494 if( mpi_copy( &dhm.GY, &dhm.GX ) != 0 )
495 exit( 1 );
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200496
Manuel Pégourié-Gonnardcc34f952013-09-17 16:04:08 +0200497 snprintf( title, sizeof( title ), "DHE-%d", dhm_sizes[i] );
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200498 TIME_PUBLIC( title, "handshake",
499 olen = sizeof( buf );
Paul Bakker840ab202013-11-30 15:14:38 +0100500 ret |= dhm_make_public( &dhm, (int) dhm.len, buf, dhm.len,
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200501 myrand, NULL );
502 ret |= dhm_calc_secret( &dhm, buf, &olen, myrand, NULL ) );
503
Manuel Pégourié-Gonnardcc34f952013-09-17 16:04:08 +0200504 snprintf( title, sizeof( title ), "DH-%d", dhm_sizes[i] );
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200505 TIME_PUBLIC( title, "handshake",
506 olen = sizeof( buf );
507 ret |= dhm_calc_secret( &dhm, buf, &olen, myrand, NULL ) );
508
509 dhm_free( &dhm );
510 }
Manuel Pégourié-Gonnarde870c0a2012-11-08 11:31:48 +0100511 }
Manuel Pégourié-Gonnarde870c0a2012-11-08 11:31:48 +0100512#endif
513
Manuel Pégourié-Gonnardcc34f952013-09-17 16:04:08 +0200514#if defined(POLARSSL_ECDSA_C)
515 if( todo.ecdsa )
516 {
517 ecdsa_context ecdsa;
518 const ecp_curve_info *curve_info;
519 size_t sig_len;
520
521 memset( buf, 0x2A, sizeof( buf ) );
522
Manuel Pégourié-Gonnardda179e42013-09-18 15:31:24 +0200523 for( curve_info = ecp_curve_list();
Manuel Pégourié-Gonnardcc34f952013-09-17 16:04:08 +0200524 curve_info->grp_id != POLARSSL_ECP_DP_NONE;
525 curve_info++ )
526 {
527 ecdsa_init( &ecdsa );
528
529 if( ecdsa_genkey( &ecdsa, curve_info->grp_id, myrand, NULL ) != 0 )
530 exit( 1 );
531
Manuel Pégourié-Gonnard56cd3192013-09-17 17:23:07 +0200532 snprintf( title, sizeof( title ), "ECDSA-%s",
533 curve_info->name );
Manuel Pégourié-Gonnardcc34f952013-09-17 16:04:08 +0200534 TIME_PUBLIC( title, "sign",
535 ret = ecdsa_write_signature( &ecdsa, buf, curve_info->size,
Manuel Pégourié-Gonnard56cd3192013-09-17 17:23:07 +0200536 tmp, &sig_len, myrand, NULL ) );
537
538 TIME_PUBLIC( title, "verify",
539 ret = ecdsa_read_signature( &ecdsa, buf, curve_info->size,
540 tmp, sig_len ) );
Manuel Pégourié-Gonnardcc34f952013-09-17 16:04:08 +0200541
542 ecdsa_free( &ecdsa );
543 }
544 }
545#endif
546
547#if defined(POLARSSL_ECDH_C)
548 if( todo.ecdh )
549 {
550 ecdh_context ecdh;
551 const ecp_curve_info *curve_info;
552 size_t olen;
553
Manuel Pégourié-Gonnardda179e42013-09-18 15:31:24 +0200554 for( curve_info = ecp_curve_list();
Manuel Pégourié-Gonnardcc34f952013-09-17 16:04:08 +0200555 curve_info->grp_id != POLARSSL_ECP_DP_NONE;
556 curve_info++ )
557 {
558 ecdh_init( &ecdh );
559
560 if( ecp_use_known_dp( &ecdh.grp, curve_info->grp_id ) != 0 ||
561 ecdh_make_public( &ecdh, &olen, buf, sizeof( buf),
562 myrand, NULL ) != 0 ||
563 ecp_copy( &ecdh.Qp, &ecdh.Q ) != 0 )
564 {
565 exit( 1 );
566 }
567
Manuel Pégourié-Gonnard56cd3192013-09-17 17:23:07 +0200568 snprintf( title, sizeof( title ), "ECDHE-%s",
569 curve_info->name );
Manuel Pégourié-Gonnardcc34f952013-09-17 16:04:08 +0200570 TIME_PUBLIC( title, "handshake",
571 ret |= ecdh_make_public( &ecdh, &olen, buf, sizeof( buf),
572 myrand, NULL );
573 ret |= ecdh_calc_secret( &ecdh, &olen, buf, sizeof( buf ),
574 myrand, NULL ) );
575
Manuel Pégourié-Gonnard56cd3192013-09-17 17:23:07 +0200576 snprintf( title, sizeof( title ), "ECDH-%s",
577 curve_info->name );
Manuel Pégourié-Gonnardcc34f952013-09-17 16:04:08 +0200578 TIME_PUBLIC( title, "handshake",
579 ret |= ecdh_calc_secret( &ecdh, &olen, buf, sizeof( buf ),
580 myrand, NULL ) );
581 ecdh_free( &ecdh );
582 }
583 }
584#endif
Paul Bakker1d4da2e2009-10-25 12:36:53 +0000585 printf( "\n" );
586
Paul Bakkercce9d772011-11-18 14:26:47 +0000587#if defined(_WIN32)
Paul Bakker5121ce52009-01-03 21:22:43 +0000588 printf( " Press Enter to exit this program.\n" );
589 fflush( stdout ); getchar();
590#endif
591
592 return( 0 );
593}
Manuel Pégourié-Gonnard8271f2f2013-09-17 14:57:55 +0200594
Paul Bakker5690efc2011-05-26 13:16:06 +0000595#endif /* POLARSSL_TIMING_C */