@@ -103,6 +103,7 @@ int main( void )
103
103
104
104
#define DFL_SERVER_ADDR NULL
105
105
#define DFL_SERVER_PORT "4433"
106
+ #define DFL_RESPONSE_SIZE -1
106
107
#define DFL_DEBUG_LEVEL 0
107
108
#define DFL_NBIO 0
108
109
#define DFL_EVENT 0
@@ -177,7 +178,7 @@ int main( void )
177
178
* You will need to adapt the mbedtls_ssl_get_bytes_avail() test in ssl-opt.sh
178
179
* if you change this value to something outside the range <= 100 or > 500
179
180
*/
180
- #define IO_BUF_LEN 200
181
+ #define DFL_IO_BUF_LEN 200
181
182
182
183
#if defined(MBEDTLS_X509_CRT_PARSE_C )
183
184
#if defined(MBEDTLS_FS_IO )
@@ -356,6 +357,11 @@ int main( void )
356
357
" server_addr=%%s default: (all interfaces)\n" \
357
358
" server_port=%%d default: 4433\n" \
358
359
" debug_level=%%d default: 0 (disabled)\n" \
360
+ " buffer_size=%%d default: 200 \n" \
361
+ " (minimum: 1, max: 16385)\n" \
362
+ " response_size=%%d default: about 152 (basic response)\n" \
363
+ " (minimum: 0, max: 16384)\n" \
364
+ " increases buffer_size if bigger\n"\
359
365
" nbio=%%d default: 0 (blocking I/O)\n" \
360
366
" options: 1 (non-blocking), 2 (added delays)\n" \
361
367
" event=%%d default: 0 (loop)\n" \
@@ -431,6 +437,8 @@ struct options
431
437
int nbio ; /* should I/O be blocking? */
432
438
int event ; /* loop or event-driven IO? level or edge triggered? */
433
439
uint32_t read_timeout ; /* timeout on mbedtls_ssl_read() in milliseconds */
440
+ int response_size ; /* pad response with header to requested size */
441
+ uint16_t buffer_size ; /* IO buffer size */
434
442
const char * ca_file ; /* the file with the CA certificate(s) */
435
443
const char * ca_path ; /* the path with the CA certificate(s) reside */
436
444
const char * crt_file ; /* the file with the server certificate */
@@ -1166,7 +1174,7 @@ int main( int argc, char *argv[] )
1166
1174
{
1167
1175
int ret = 0 , len , written , frags , exchanges_left ;
1168
1176
int version_suites [4 ][2 ];
1169
- unsigned char buf [ IO_BUF_LEN ] ;
1177
+ unsigned char * buf = 0 ;
1170
1178
#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED )
1171
1179
unsigned char psk [MBEDTLS_PSK_MAX_LEN ];
1172
1180
size_t psk_len = 0 ;
@@ -1297,10 +1305,12 @@ int main( int argc, char *argv[] )
1297
1305
goto exit ;
1298
1306
}
1299
1307
1308
+ opt .buffer_size = DFL_IO_BUF_LEN ;
1300
1309
opt .server_addr = DFL_SERVER_ADDR ;
1301
1310
opt .server_port = DFL_SERVER_PORT ;
1302
1311
opt .debug_level = DFL_DEBUG_LEVEL ;
1303
1312
opt .event = DFL_EVENT ;
1313
+ opt .response_size = DFL_RESPONSE_SIZE ;
1304
1314
opt .nbio = DFL_NBIO ;
1305
1315
opt .read_timeout = DFL_READ_TIMEOUT ;
1306
1316
opt .ca_file = DFL_CA_FILE ;
@@ -1393,6 +1403,20 @@ int main( int argc, char *argv[] )
1393
1403
}
1394
1404
else if ( strcmp ( p , "read_timeout" ) == 0 )
1395
1405
opt .read_timeout = atoi ( q );
1406
+ else if ( strcmp ( p , "buffer_size" ) == 0 )
1407
+ {
1408
+ opt .buffer_size = atoi ( q );
1409
+ if ( opt .buffer_size < 1 || opt .buffer_size > MBEDTLS_SSL_MAX_CONTENT_LEN + 1 )
1410
+ goto usage ;
1411
+ }
1412
+ else if ( strcmp ( p , "response_size" ) == 0 )
1413
+ {
1414
+ opt .response_size = atoi ( q );
1415
+ if ( opt .response_size < 0 || opt .response_size > MBEDTLS_SSL_MAX_CONTENT_LEN )
1416
+ goto usage ;
1417
+ if ( opt .buffer_size < opt .response_size )
1418
+ opt .buffer_size = opt .response_size ;
1419
+ }
1396
1420
else if ( strcmp ( p , "ca_file" ) == 0 )
1397
1421
opt .ca_file = q ;
1398
1422
else if ( strcmp ( p , "ca_path" ) == 0 )
@@ -1729,6 +1753,13 @@ int main( int argc, char *argv[] )
1729
1753
#if defined(MBEDTLS_DEBUG_C )
1730
1754
mbedtls_debug_set_threshold ( opt .debug_level );
1731
1755
#endif
1756
+ buf = mbedtls_calloc ( 1 , opt .buffer_size + 1 );
1757
+ if ( buf == NULL )
1758
+ {
1759
+ mbedtls_printf ( "Could not allocate %u bytes\n" , opt .buffer_size );
1760
+ ret = 3 ;
1761
+ goto exit ;
1762
+ }
1732
1763
1733
1764
if ( opt .force_ciphersuite [0 ] > 0 )
1734
1765
{
@@ -2745,8 +2776,8 @@ int main( int argc, char *argv[] )
2745
2776
do
2746
2777
{
2747
2778
int terminated = 0 ;
2748
- len = sizeof ( buf ) - 1 ;
2749
- memset ( buf , 0 , sizeof ( buf ) );
2779
+ len = opt . buffer_size - 1 ;
2780
+ memset ( buf , 0 , opt . buffer_size );
2750
2781
ret = mbedtls_ssl_read ( & ssl , buf , len );
2751
2782
2752
2783
if ( mbedtls_status_is_ssl_in_progress ( ret ) )
@@ -2846,8 +2877,8 @@ int main( int argc, char *argv[] )
2846
2877
}
2847
2878
else /* Not stream, so datagram */
2848
2879
{
2849
- len = sizeof ( buf ) - 1 ;
2850
- memset ( buf , 0 , sizeof ( buf ) );
2880
+ len = opt . buffer_size - 1 ;
2881
+ memset ( buf , 0 , opt . buffer_size );
2851
2882
2852
2883
do
2853
2884
{
@@ -2945,6 +2976,25 @@ int main( int argc, char *argv[] )
2945
2976
len = sprintf ( (char * ) buf , HTTP_RESPONSE ,
2946
2977
mbedtls_ssl_get_ciphersuite ( & ssl ) );
2947
2978
2979
+ /* Add padding to the response to reach opt.response_size in length */
2980
+ if ( opt .response_size != DFL_RESPONSE_SIZE &&
2981
+ len < opt .response_size )
2982
+ {
2983
+ memset ( buf + len , 'B' , opt .response_size - len );
2984
+ len += opt .response_size - len ;
2985
+ }
2986
+
2987
+ /* Truncate if response size is smaller than the "natural" size */
2988
+ if ( opt .response_size != DFL_RESPONSE_SIZE &&
2989
+ len > opt .response_size )
2990
+ {
2991
+ len = opt .response_size ;
2992
+
2993
+ /* Still end with \r\n unless that's really not possible */
2994
+ if ( len >= 2 ) buf [len - 2 ] = '\r' ;
2995
+ if ( len >= 1 ) buf [len - 1 ] = '\n' ;
2996
+ }
2997
+
2948
2998
if ( opt .transport == MBEDTLS_SSL_TRANSPORT_STREAM )
2949
2999
{
2950
3000
for ( written = 0 , frags = 0 ; written < len ; written += ret , frags ++ )
@@ -3103,6 +3153,7 @@ int main( int argc, char *argv[] )
3103
3153
mbedtls_memory_buffer_alloc_free ();
3104
3154
#endif
3105
3155
3156
+ mbedtls_free ( buf );
3106
3157
mbedtls_printf ( " done.\n" );
3107
3158
3108
3159
#if defined(_WIN32 )
0 commit comments