diff --git a/programs/test/benchmark.c b/programs/test/benchmark.c index 93c17291f265..7d5f731405ea 100644 --- a/programs/test/benchmark.c +++ b/programs/test/benchmark.c @@ -46,6 +46,8 @@ int main(void) #include "mbedtls/ecdsa.h" #include "mbedtls/ecdh.h" +#include "mbedtls/lms.h" + #include "mbedtls/error.h" /* *INDENT-OFF* */ @@ -113,7 +115,7 @@ static unsigned long mbedtls_timing_hardclock(void); "aes_cbc, aes_cfb128, aes_cfb8, aes_gcm, aes_ccm, aes_xts, chachapoly\n" \ "aes_cmac, des3_cmac, poly1305\n" \ "ctr_drbg, hmac_drbg\n" \ - "rsa, dhm, ecdsa, ecdh.\n" + "rsa, dhm, ecdsa, ecdh, lms.\n" #if defined(MBEDTLS_ERROR_C) #define PRINT_ERROR \ @@ -510,7 +512,8 @@ typedef struct { aria, camellia, chacha20, poly1305, ctr_drbg, hmac_drbg, - rsa, dhm, ecdsa, ecdh; + rsa, dhm, ecdsa, ecdh, + lms; } todo_list; @@ -603,6 +606,8 @@ int main(int argc, char *argv[]) todo.ecdsa = 1; } else if (strcmp(argv[i], "ecdh") == 0) { todo.ecdh = 1; + } else if (strcmp(argv[i], "lms") == 0) { + todo.lms = 1; } #if defined(MBEDTLS_ECP_C) else if (set_ecp_curve(argv[i], single_curve)) { @@ -1259,6 +1264,50 @@ int main(int argc, char *argv[]) } #endif +#if defined(MBEDTLS_LMS_C) && defined(MBEDTLS_LMS_PRIVATE) + if (todo.lms) { + mbedtls_lms_public_t pub_ctx; + mbedtls_lms_private_t priv_ctx; + unsigned char sig[MBEDTLS_LMS_SIG_LEN(MBEDTLS_LMS_SHA256_M32_H10, + MBEDTLS_LMOTS_SHA256_N32_W8)]; + + mbedtls_snprintf(title, sizeof(title), "LMS"); + + mbedtls_lms_public_init(&pub_ctx); + mbedtls_lms_private_init(&priv_ctx); + + if (mbedtls_lms_generate_private_key(&priv_ctx, MBEDTLS_LMS_SHA256_M32_H10, + MBEDTLS_LMOTS_SHA256_N32_W8, + myrand, NULL, + buf, BUFSIZE) != 0) { + mbedtls_exit(1); + } + + if (mbedtls_lms_calculate_public_key(&pub_ctx, &priv_ctx)) { + mbedtls_exit(1); + } + + /* *INDENT-OFF* */ + TIME_PUBLIC(title, "sign", + ret = + mbedtls_lms_sign(&priv_ctx, myrand, NULL, buf, BUFSIZE, sig, sizeof(sig), + NULL); + if (ret == MBEDTLS_ERR_LMS_OUT_OF_PRIVATE_KEYS) { + ret = 0; + break; + } + ); + /* *INDENT-ON* */ + + TIME_PUBLIC(title, "verify", + ret = mbedtls_lms_verify(&pub_ctx, buf, BUFSIZE, sig, sizeof(sig)); + ); + + mbedtls_lms_public_free(&pub_ctx); + mbedtls_lms_private_free(&priv_ctx); + } +#endif + mbedtls_printf("\n"); #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)