Improvements for AES GCM on STM32. Cleanups for STM32 example.

This commit is contained in:
David Garske
2022-10-26 09:43:22 -07:00
parent 0c79ca1de1
commit e26d4f84fc
5 changed files with 130 additions and 76 deletions

View File

@@ -46,6 +46,16 @@
* Configuration
****************************************************************************/
#if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) && \
!defined(WOLFCRYPT_ONLY) && !defined(SINGLE_THREADED)
#define ENABLE_TLS_BENCH
#endif
#if !defined(WOLFCRYPT_ONLY) && defined(WOLFSSL_TLS13) && !defined(NO_TLS_UART_TEST)
#define ENABLE_TLS_UART
#endif
/* Defaults for configuration parameters */
#define BENCH_DEFAULT_HOST "localhost"
#define BENCH_DEFAULT_PORT 11112
@@ -124,17 +134,21 @@ typedef struct func_args {
const char menu1[] = "\n"
"\tt. wolfCrypt Test\n"
"\tb. wolfCrypt Benchmark\n"
#ifdef ENABLE_TLS_BENCH
"\tl. wolfSSL TLS Bench\n"
#endif
"\te. Show Cipher List\n"
#ifdef ENABLE_TLS_UART
"\ts. Run TLS 1.3 Server over UART\n"
"\tc. Run TLS 1.3 Client over UART\n";
"\tc. Run TLS 1.3 Client over UART\n"
#endif
;
static void PrintMemStats(void);
double current_time(void);
#if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) && \
!defined(WOLFCRYPT_ONLY) && !defined(SINGLE_THREADED)
#ifdef ENABLE_TLS_BENCH
static const char* kShutdown = "shutdown";
@@ -350,8 +364,10 @@ static void PrintTlsStats(stats_t* wcStat, const char* desc, const char* cipher,
wcStat->connTime * 1000,
wcStat->connTime * 1000 / wcStat->connCount);
}
#endif /* ENABLE_TLS_BENCH */
#if defined(ENABLE_TLS_BENCH) || defined(ENABLE_TLS_UART)
#if defined(KEEP_PEER_CERT) || defined(KEEP_OUR_CERT)
static const char* client_showx509_msg[] = {
"issuer",
@@ -426,7 +442,7 @@ static void ShowX509(WOLFSSL_X509* x509, const char* hdr)
}
#endif /* OPENSSL_EXTRA */
}
#endif
#endif /* KEEP_PEER_CERT || KEEP_OUR_CERT */
static const char* client_showpeer_msg[] = {
@@ -484,8 +500,9 @@ static void ShowPeer(WOLFSSL* ssl)
(void)ssl;
}
#endif /* ENABLE_TLS_BENCH || ENABLE_TLS_UART */
#ifdef ENABLE_TLS_BENCH
/* server send callback */
static int ServerMemSend(info_t* info, char* buf, int sz)
@@ -722,7 +739,7 @@ static int bench_tls_client(info_t* info)
#ifdef WOLFSSL_TLS13
if (tls13) {
#ifdef WOLFSSL_STATIC_MEMORY
ret = wolfSSL_CTX_load_static_memory(&cli_ctx, wolfTLSv1_3_client_method_ex,
ret = wolfSSL_CTX_load_static_memory(&cli_ctx, wolfTLSv1_3_client_method_ex,
gWolfCTXCli, sizeof(gWolfCTXCli), WOLFMEM_GENERAL , 10);
#else
cli_ctx = wolfSSL_CTX_new(wolfTLSv1_3_client_method());
@@ -732,14 +749,14 @@ static int bench_tls_client(info_t* info)
if (!tls13) {
#if !defined(WOLFSSL_TLS13)
#ifdef WOLFSSL_STATIC_MEMORY
ret = wolfSSL_CTX_load_static_memory(&cli_ctx, wolfSSLv23_client_method_ex,
ret = wolfSSL_CTX_load_static_memory(&cli_ctx, wolfSSLv23_client_method_ex,
gWolfCTXCli, sizeof(gWolfCTXCli), WOLFMEM_GENERAL , 10);
#else
cli_ctx = wolfSSL_CTX_new(wolfSSLv23_client_method());
#endif
#elif !defined(WOLFSSL_NO_TLS12)
#ifdef WOLFSSL_STATIC_MEMORY
ret = wolfSSL_CTX_load_static_memory(&cli_ctx, wolfTLSv1_2_client_method_ex,
ret = wolfSSL_CTX_load_static_memory(&cli_ctx, wolfTLSv1_2_client_method_ex,
gWolfCTXCli, sizeof(gWolfCTXCli), WOLFMEM_GENERAL , 10);
#else
cli_ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method());
@@ -753,7 +770,7 @@ static int bench_tls_client(info_t* info)
}
#ifdef WOLFSSL_STATIC_MEMORY
ret = wolfSSL_CTX_load_static_memory(&cli_ctx, 0, gWolfIOCli, sizeof(gWolfIOCli),
ret = wolfSSL_CTX_load_static_memory(&cli_ctx, 0, gWolfIOCli, sizeof(gWolfIOCli),
WOLFMEM_IO_POOL, 10 );
#endif
@@ -998,7 +1015,7 @@ static int bench_tls_server(info_t* info)
#ifdef WOLFSSL_TLS13
if (tls13) {
#ifdef WOLFSSL_STATIC_MEMORY
ret = wolfSSL_CTX_load_static_memory(&srv_ctx, wolfTLSv1_3_server_method_ex,
ret = wolfSSL_CTX_load_static_memory(&srv_ctx, wolfTLSv1_3_server_method_ex,
gWolfCTXSrv, sizeof(gWolfCTXSrv), WOLFMEM_GENERAL , 10);
#else
srv_ctx = wolfSSL_CTX_new(wolfTLSv1_3_server_method());
@@ -1008,14 +1025,14 @@ static int bench_tls_server(info_t* info)
if (!tls13) {
#if !defined(WOLFSSL_TLS13)
#ifdef WOLFSSL_STATIC_MEMORY
ret = wolfSSL_CTX_load_static_memory(&srv_ctx, wolfSSLv23_server_method_ex,
ret = wolfSSL_CTX_load_static_memory(&srv_ctx, wolfSSLv23_server_method_ex,
gWolfCTXSrv, sizeof(gWolfCTXSrv), WOLFMEM_GENERAL , 10);
#else
srv_ctx = wolfSSL_CTX_new(wolfSSLv23_server_method());
#endif
#elif !defined(WOLFSSL_NO_TLS12)
#ifdef WOLFSSL_STATIC_MEMORY
ret = wolfSSL_CTX_load_static_memory(&srv_ctx, wolfTLSv1_2_server_method_ex,
ret = wolfSSL_CTX_load_static_memory(&srv_ctx, wolfTLSv1_2_server_method_ex,
gWolfCTXSrv, sizeof(gWolfCTXSrv), WOLFMEM_GENERAL , 10);
#else
srv_ctx = wolfSSL_CTX_new(wolfTLSv1_2_server_method());
@@ -1029,7 +1046,7 @@ static int bench_tls_server(info_t* info)
}
#ifdef WOLFSSL_STATIC_MEMORY
ret = wolfSSL_CTX_load_static_memory(&srv_ctx, 0, gWolfIOSrv, sizeof(gWolfIOSrv),
ret = wolfSSL_CTX_load_static_memory(&srv_ctx, 0, gWolfIOSrv, sizeof(gWolfIOSrv),
WOLFMEM_IO_POOL, 10 );
#endif
@@ -1444,7 +1461,8 @@ exit:
return ret;
}
#endif /* (!NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER) && !WOLFCRYPT_ONLY && !SINGLE_THREADED */
#endif /* ENABLE_TLS_BENCH */
#ifndef WOLFCRYPT_ONLY
static void ShowCiphers(void)
@@ -1471,7 +1489,9 @@ static void PrintMemStats(void)
#endif
}
#if !defined(WOLFCRYPT_ONLY) && defined(WOLFSSL_TLS13) && !defined(NO_TLS_UART_TEST)
#ifdef ENABLE_TLS_UART
/* UART DMA IO Routines */
#ifndef B115200
#define B115200 115200
@@ -1493,6 +1513,8 @@ typedef struct {
#ifndef TLS_UART
#define TLS_UART huart2
#endif
/* If you get an undefined error here you can optionally disable the TLS
* over UART test using NO_TLS_UART_TEST */
extern UART_HandleTypeDef TLS_UART;
static int msg_length = 0;
@@ -1524,11 +1546,15 @@ static int uartIORx(WOLFSSL *ssl, char *buf, int sz, void *ctx)
msg_length = 0;
XMEMSET(tb, 0, sizeof(*tb));
/* Now setup the DMA RX. */
/* Now setup the DMA RX */
/* This requires enabling the UART RX DMA in the STM32Cube tool
* Under Connectivity click on your TLS UART (USART2) and goto DMA Settings
* and Add one for USART2_RX with default options */
status = HAL_UARTEx_ReceiveToIdle_DMA(&TLS_UART, (uint8_t *)tb->buf, MAX_RECORD_SIZE);
if (status != HAL_OK) {
return WOLFSSL_CBIO_ERR_WANT_READ;
} else {
}
else {
/* We now go into an infinite loop waiting for msg_length to be set to a
* value other than 0. This will be done when the other side writes to
* UART and then idles. That will trigger HAL_UARTEx_RxEventCallback()
@@ -1536,7 +1562,7 @@ static int uartIORx(WOLFSSL *ssl, char *buf, int sz, void *ctx)
*
* If you mistakenly get stuck here, please simply reset the board.
*/
while(msg_length == 0) {
while (msg_length == 0) {
HAL_Delay(10);
}
#ifdef DEBUG_UART_IO
@@ -1578,6 +1604,11 @@ static int uartIOTx(WOLFSSL *ssl, char *buf, int sz, void *ctx)
return ret;
}
static void uartReset(void)
{
HAL_UART_Abort_IT(&TLS_UART);
}
/* UART TLS 1.3 client and server */
#ifndef NO_WOLFSSL_SERVER
static int tls13_uart_server(void)
@@ -1587,8 +1618,8 @@ static int tls13_uart_server(void)
WOLFSSL* ssl = NULL;
byte echoBuffer[100];
#ifdef WOLFSSL_SMALL_STACK
tls13_buf *tbuf = (tls13_buf *) XMALLOC(sizeof(*tbuf), NULL,
DYNAMIC_TYPE_TMP_BUFFER);
tls13_buf* tbuf = (tls13_buf*)XMALLOC(sizeof(*tbuf), NULL,
DYNAMIC_TYPE_TMP_BUFFER);
if (tbuf == NULL) {
printf("Memory allocation error\n");
goto done;
@@ -1597,7 +1628,7 @@ static int tls13_uart_server(void)
tls13_buf tbuf[1];
#endif
XMEMSET(tbuf, 0, sizeof(*tbuf));
XMEMSET(tbuf, 0, sizeof(tls13_buf));
ctx = wolfSSL_CTX_new(wolfTLSv1_3_server_method());
if (ctx == NULL) {
@@ -1606,6 +1637,7 @@ static int tls13_uart_server(void)
}
/* Register wolfSSL send/recv callbacks */
uartReset();
wolfSSL_CTX_SetIOSend(ctx, uartIOTx);
wolfSSL_CTX_SetIORecv(ctx, uartIORx);
@@ -1677,7 +1709,7 @@ done:
}
#endif
#ifndef NO_WOLFSSL_CLIENT
#ifdef ENABLE_TLS_UART
static int tls13_uart_client(void)
{
int ret = -1, err;
@@ -1686,7 +1718,7 @@ static int tls13_uart_client(void)
const char testStr[] = "Testing 1, 2 and 3\r\n";
byte readBuf[100];
#ifdef WOLFSSL_SMALL_STACK
tls13_buf *tbuf = (tls13_buf *) XMALLOC(sizeof(*tbuf), NULL,
tls13_buf* tbuf = (tls13_buf*)XMALLOC(sizeof(*tbuf), NULL,
DYNAMIC_TYPE_TMP_BUFFER);
if (tbuf == NULL) {
printf("Memory allocation error\n");
@@ -1696,7 +1728,7 @@ static int tls13_uart_client(void)
tls13_buf tbuf[1];
#endif
XMEMSET(tbuf, 0, sizeof(*tbuf));
XMEMSET(tbuf, 0, sizeof(tls13_buf));
ctx = wolfSSL_CTX_new(wolfTLSv1_3_client_method());
if (ctx == NULL) {
@@ -1705,6 +1737,7 @@ static int tls13_uart_client(void)
}
/* Register wolfSSL send/recv callbacks */
uartReset();
wolfSSL_CTX_SetIOSend(ctx, uartIOTx);
wolfSSL_CTX_SetIORecv(ctx, uartIORx);
@@ -1734,6 +1767,8 @@ static int tls13_uart_client(void)
goto done;
}
ShowPeer(ssl);
printf("TLS Connect handshake done\n");
printf("Sending test string\n");
do {
@@ -1768,7 +1803,9 @@ done:
return ret;
}
#endif
#endif /* !WOLFCRYPT_ONLY && WOLFSSL_TLS13 && !NO_TLS_UART_TEST */
#endif /* ENABLE_TLS_UART */
/*****************************************************************************
* Public functions
****************************************************************************/
@@ -1806,7 +1843,7 @@ void wolfCryptDemo(const void* argument)
uint8_t buffer[2];
func_args args;
#ifdef DEBUG_WOLFSSL
#if 0
wolfSSL_Debugging_ON();
#endif
@@ -1818,7 +1855,7 @@ void wolfCryptDemo(const void* argument)
#endif
#ifdef WOLFSSL_STATIC_MEMORY
if (wc_LoadStaticMemory(&HEAP_HINT, gWolfMem, sizeof(gWolfMem),
if (wc_LoadStaticMemory(&HEAP_HINT, gWolfMem, sizeof(gWolfMem),
WOLFMEM_GENERAL, 10) != 0) {
printf("unable to load static memory");
}
@@ -1863,7 +1900,7 @@ void wolfCryptDemo(const void* argument)
case 'l':
printf("Running TLS Benchmarks...\n");
#if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) && !defined(WOLFCRYPT_ONLY) && !defined(SINGLE_THREADED)
#ifdef ENABLE_TLS_BENCH
bench_tls(&args);
#else
args.return_code = NOT_COMPILED_IN;
@@ -1878,9 +1915,9 @@ void wolfCryptDemo(const void* argument)
printf("Not compiled in\n");
#endif
break;
#if !defined(WOLFCRYPT_ONLY) && defined(WOLFSSL_TLS13) && !defined(NO_TLS_UART_TEST)
#ifdef ENABLE_TLS_UART
case 's':
#if !defined(NO_WOLFSSL_SERVER)
#ifndef NO_WOLFSSL_SERVER
printf("Running TLS 1.3 server...\n");
args.return_code = tls13_uart_server();
#else
@@ -1890,7 +1927,7 @@ void wolfCryptDemo(const void* argument)
break;
case 'c':
#if !defined(NO_WOLFSSL_CLIENT)
#ifndef NO_WOLFSSL_CLIENT
printf("Running TLS 1.3 client...\n");
args.return_code = tls13_uart_client();
#else
@@ -1898,8 +1935,8 @@ void wolfCryptDemo(const void* argument)
#endif
printf("TLS 1.3 Client: Return code %d\n", args.return_code);
break;
#endif
// All other cases go here
#endif /* ENABLE_TLS_UART */
/* All other cases go here */
default:
printf("\nSelection out of range\n");
break;