Browse Source

Fixes for benchmark with small stack (RSA was being skipped). Added Thumb2 benchmarks for STM32H753.

David Garske 2 months ago
parent
commit
cd0301fc66
2 changed files with 203 additions and 31 deletions
  1. 75 0
      IDE/STM32Cube/STM32_Benchmarks.md
  2. 128 31
      wolfcrypt/benchmark/benchmark.c

+ 75 - 0
IDE/STM32Cube/STM32_Benchmarks.md

@@ -59,6 +59,81 @@ Benchmark complete
 Benchmark Test: Return code 0
 ```
 
+### STM32H753ZI (-O2, Thumb2 ARM ASM, SP-ASM Cortex M small)
+
+Enable CPU I-Cache and D-Cache by calling:
+
+```c
+SCB_EnableICache();
+SCB_EnableDCache();
+```
+
+Build options for ARM ASM:
+
+```c
+#define WOLFSSL_ARMASM
+#define WOLFSSL_ARMASM_INLINE
+#define WOLFSSL_ARMASM_NO_HW_CRYPTO
+#define WOLFSSL_ARMASM_NO_NEON
+#define WOLFSSL_ARM_ARCH 7
+```
+
+```
+------------------------------------------------------------------------------
+ wolfSSL version 5.6.6
+------------------------------------------------------------------------------
+wolfCrypt Benchmark (block bytes 1024, min 1.0 sec each)
+RNG                          6 MiB took 1.000 seconds,    6.079 MiB/s
+AES-128-CBC-enc             17 MiB took 1.000 seconds,   17.261 MiB/s
+AES-128-CBC-dec             17 MiB took 1.000 seconds,   16.748 MiB/s
+AES-192-CBC-enc             15 MiB took 1.000 seconds,   14.575 MiB/s
+AES-192-CBC-dec             14 MiB took 1.000 seconds,   14.209 MiB/s
+AES-256-CBC-enc             13 MiB took 1.000 seconds,   12.622 MiB/s
+AES-256-CBC-dec             12 MiB took 1.000 seconds,   12.378 MiB/s
+AES-128-GCM-enc              8 MiB took 1.000 seconds,    8.374 MiB/s
+AES-128-GCM-dec              8 MiB took 1.000 seconds,    8.374 MiB/s
+AES-192-GCM-enc              8 MiB took 1.000 seconds,    7.690 MiB/s
+AES-192-GCM-dec              8 MiB took 1.000 seconds,    7.690 MiB/s
+AES-256-GCM-enc              7 MiB took 1.000 seconds,    7.129 MiB/s
+AES-256-GCM-dec              7 MiB took 1.000 seconds,    7.104 MiB/s
+AES-128-GCM-enc-no_AAD       8 MiB took 1.000 seconds,    8.472 MiB/s
+AES-128-GCM-dec-no_AAD       8 MiB took 1.000 seconds,    8.472 MiB/s
+AES-192-GCM-enc-no_AAD       8 MiB took 1.000 seconds,    7.764 MiB/s
+AES-192-GCM-dec-no_AAD       8 MiB took 1.000 seconds,    7.715 MiB/s
+AES-256-GCM-enc-no_AAD       7 MiB took 1.000 seconds,    7.153 MiB/s
+AES-256-GCM-dec-no_AAD       7 MiB took 1.000 seconds,    7.153 MiB/s
+GMAC Table 4-bit            17 MiB took 1.000 seconds,   16.617 MiB/s
+CHACHA                      29 MiB took 1.000 seconds,   28.662 MiB/s
+CHA-POLY                    19 MiB took 1.000 seconds,   18.848 MiB/s
+POLY1305                    90 MiB took 1.000 seconds,   89.771 MiB/s
+SHA-224                     18 MiB took 1.000 seconds,   18.042 MiB/s
+SHA-256                     18 MiB took 1.000 seconds,   18.042 MiB/s
+SHA-384                      8 MiB took 1.000 seconds,    7.544 MiB/s
+SHA-512                      8 MiB took 1.000 seconds,    7.568 MiB/s
+SHA-512/224                  8 MiB took 1.000 seconds,    7.544 MiB/s
+SHA-512/256                  8 MiB took 1.000 seconds,    7.520 MiB/s
+HMAC-SHA224                 18 MiB took 1.000 seconds,   17.896 MiB/s
+HMAC-SHA256                 18 MiB took 1.000 seconds,   17.896 MiB/s
+HMAC-SHA384                  7 MiB took 1.000 seconds,    7.373 MiB/s
+HMAC-SHA512                  7 MiB took 1.000 seconds,    7.397 MiB/s
+RSA     2048   public       508 ops took 1.000 sec, avg 1.969 ms, 508.000 ops/sec
+RSA     2048  private        14 ops took 1.020 sec, avg 72.857 ms, 13.725 ops/sec
+DH      2048  key gen        30 ops took 1.012 sec, avg 33.733 ms, 29.644 ops/sec
+DH      2048    agree        30 ops took 1.012 sec, avg 33.733 ms, 29.644 ops/sec
+ECC   [      SECP256R1]   256  key gen       982 ops took 1.000 sec, avg 1.018 ms, 982.000 ops/sec
+ECDHE [      SECP256R1]   256    agree       456 ops took 1.000 sec, avg 2.193 ms, 456.000 ops/sec
+ECDSA [      SECP256R1]   256     sign       520 ops took 1.000 sec, avg 1.923 ms, 520.000 ops/sec
+ECDSA [      SECP256R1]   256   verify       288 ops took 1.004 sec, avg 3.486 ms, 286.853 ops/sec
+CURVE  25519  key gen      1112 ops took 1.000 sec, avg 0.899 ms, 1112.000 ops/sec
+CURVE  25519    agree      1144 ops took 1.000 sec, avg 0.874 ms, 1144.000 ops/sec
+ED     25519  key gen      2358 ops took 1.000 sec, avg 0.424 ms, 2358.000 ops/sec
+ED     25519     sign      1716 ops took 1.000 sec, avg 0.583 ms, 1716.000 ops/sec
+ED     25519   verify       862 ops took 1.000 sec, avg 1.160 ms, 862.000 ops/sec
+Benchmark complete
+Benchmark Test: Return code 0
+```
+
+
 ### STM32H753ZI (No HW Crypto, -Os, FastMath)
 
 ```

+ 128 - 31
wolfcrypt/benchmark/benchmark.c

@@ -4251,6 +4251,7 @@ static void bench_aesgcm_internal(int useDeviceID,
 
     WC_ALLOC_VAR(bench_additional, byte, AES_AUTH_ADD_SZ, HEAP_HINT);
     WC_ALLOC_VAR(bench_tag, byte, AES_AUTH_TAG_SZ, HEAP_HINT);
+
     WC_CALLOC_ARRAY(enc, Aes, BENCH_MAX_PENDING,
                   sizeof(Aes), HEAP_HINT);
 #ifdef HAVE_AES_DECRYPT
@@ -4258,14 +4259,19 @@ static void bench_aesgcm_internal(int useDeviceID,
                   sizeof(Aes), HEAP_HINT);
 #endif
 
-#ifdef WOLFSSL_ASYNC_CRYPT
-    if (bench_additional)
-#endif
-        XMEMSET(bench_additional, 0, AES_AUTH_ADD_SZ);
-#ifdef WOLFSSL_ASYNC_CRYPT
-    if (bench_tag)
+#ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC
+    if (bench_additional == NULL || bench_tag == NULL || enc == NULL
+    #ifdef HAVE_AES_DECRYPT
+         || dec == NULL
+    #endif
+    ) {
+        ret = MEMORY_E;
+        goto exit;
+    }
 #endif
-        XMEMSET(bench_tag, 0, AES_AUTH_TAG_SZ);
+
+    XMEMSET(bench_additional, 0, AES_AUTH_ADD_SZ);
+    XMEMSET(bench_tag, 0, AES_AUTH_TAG_SZ);
 
     /* init keys */
     for (i = 0; i < BENCH_MAX_PENDING; i++) {
@@ -4427,14 +4433,19 @@ static void bench_aesgcm_stream_internal(int useDeviceID,
                   sizeof(Aes), HEAP_HINT);
 #endif
 
-#ifdef WOLFSSL_ASYNC_CRYPT
-    if (bench_additional)
-#endif
-        XMEMSET(bench_additional, 0, AES_AUTH_ADD_SZ);
-#ifdef WOLFSSL_ASYNC_CRYPT
-    if (bench_tag)
+#ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC
+    if (bench_additional == NULL || bench_tag == NULL || enc == NULL
+    #ifdef HAVE_AES_DECRYPT
+         || dec == NULL
+    #endif
+    ) {
+        ret = MEMORY_E;
+        goto exit;
+    }
 #endif
-        XMEMSET(bench_tag, 0, AES_AUTH_TAG_SZ);
+
+    XMEMSET(bench_additional, 0, AES_AUTH_ADD_SZ);
+    XMEMSET(bench_tag, 0, AES_AUTH_TAG_SZ);
 
     /* init keys */
     for (i = 0; i < BENCH_MAX_PENDING; i++) {
@@ -4992,6 +5003,13 @@ void bench_aesxts(void)
 
     WC_ALLOC_VAR(aes, XtsAes, 1, HEAP_HINT);
 
+#ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC
+    if (aes == NULL){
+        ret = MEMORY_E;
+        goto exit;
+    }
+#endif
+
     ret = wc_AesXtsSetKey(aes, k1, sizeof(k1), AES_ENCRYPTION,
             HEAP_HINT, devId);
     if (ret != 0) {
@@ -5137,6 +5155,13 @@ void bench_aesccm(int useDeviceID)
     WC_ALLOC_VAR(bench_additional, byte, AES_AUTH_ADD_SZ, HEAP_HINT);
     WC_ALLOC_VAR(bench_tag, byte, AES_AUTH_TAG_SZ, HEAP_HINT);
 
+#ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC
+    if (bench_additional == NULL || bench_tag == NULL) {
+        ret = MEMORY_E;
+        goto exit;
+    }
+#endif
+
     XMEMSET(bench_tag, 0, AES_AUTH_TAG_SZ);
     XMEMSET(bench_additional, 0, AES_AUTH_ADD_SZ);
 
@@ -5476,6 +5501,9 @@ void bench_sm4_gcm(void)
 
     WC_DECLARE_VAR(bench_additional, byte, AES_AUTH_ADD_SZ, HEAP_HINT);
     WC_DECLARE_VAR(bench_tag, byte, AES_AUTH_TAG_SZ, HEAP_HINT);
+
+    WC_ALLOC_VAR(bench_additional, byte, AES_AUTH_ADD_SZ, HEAP_HINT);
+    WC_ALLOC_VAR(bench_tag, byte, AES_AUTH_TAG_SZ, HEAP_HINT);
 #ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC
     if (bench_additional == NULL || bench_tag == NULL) {
         printf("bench_aesgcm_internal malloc failed\n");
@@ -8457,34 +8485,35 @@ static void bench_rsa_helper(int useDeviceID,
     WC_DECLARE_HEAP_ARRAY(enc, byte, BENCH_MAX_PENDING,
                                  rsaKeySz, HEAP_HINT);
 
-    #if (  !defined(WOLFSSL_RSA_VERIFY_INLINE) \
-        && !defined(WOLFSSL_RSA_PUBLIC_ONLY)   )
-        WC_DECLARE_HEAP_ARRAY(out, byte, BENCH_MAX_PENDING,
-                                     rsaKeySz, HEAP_HINT);
-    #else
-        byte* out[BENCH_MAX_PENDING];
-    #endif
+#if (!defined(WOLFSSL_RSA_VERIFY_INLINE) && \
+     !defined(WOLFSSL_RSA_PUBLIC_ONLY))
+    WC_DECLARE_HEAP_ARRAY(out, byte, BENCH_MAX_PENDING,
+                                    rsaKeySz, HEAP_HINT);
+#else
+    byte* out[BENCH_MAX_PENDING];
+#endif
 
     XMEMSET(out, 0, sizeof(out));
 
     WC_ALLOC_HEAP_ARRAY(enc, byte, BENCH_MAX_PENDING,
                                  rsaKeySz, HEAP_HINT);
 
-    #if (  !defined(WOLFSSL_RSA_VERIFY_INLINE) \
-        && !defined(WOLFSSL_RSA_PUBLIC_ONLY)   )
-        WC_ALLOC_HEAP_ARRAY(out, byte, BENCH_MAX_PENDING,
-                                     rsaKeySz, HEAP_HINT);
-        if (out[0] == NULL) {
-            ret = MEMORY_E;
-            goto exit;
-        }
-    #endif
+#if (!defined(WOLFSSL_RSA_VERIFY_INLINE) && \
+        !defined(WOLFSSL_RSA_PUBLIC_ONLY))
+    WC_ALLOC_HEAP_ARRAY(out, byte, BENCH_MAX_PENDING,
+                                    rsaKeySz, HEAP_HINT);
+    if (out[0] == NULL) {
+        ret = MEMORY_E;
+        goto exit;
+    }
+#endif
     if (enc[0] == NULL) {
         ret = MEMORY_E;
         goto exit;
     }
 
 #ifndef WOLFSSL_RSA_VERIFY_ONLY
+    WC_ALLOC_VAR(message, byte, TEST_STRING_SZ, HEAP_HINT);
     #ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC
     if (message == NULL) {
         ret = MEMORY_E;
@@ -8955,7 +8984,12 @@ void bench_dh(int useDeviceID)
 
     WC_ALLOC_VAR(pub2, byte, BENCH_DH_KEY_SIZE, HEAP_HINT);
     WC_ALLOC_VAR(priv2, byte, BENCH_DH_PRIV_SIZE, HEAP_HINT);
-
+#ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC
+    if (pub2 == NULL || priv2 == NULL) {
+        ret = MEMORY_E;
+        goto exit;
+    }
+#endif
 
     (void)tmp;
 
@@ -11491,6 +11525,13 @@ void bench_ed448KeySign(void)
 
     WC_ALLOC_VAR(genKey, ed448_key, 1, HEAP_HINT);
 
+#ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC
+    if (genKey == NULL) {
+        ret = MEMORY_E;
+        goto exit;
+    }
+#endif
+
     wc_ed448_init(genKey);
 
     ret = wc_ed448_make_key(&gRng, ED448_KEY_SIZE, genKey);
@@ -11577,6 +11618,13 @@ void bench_eccsiKeyGen(void)
 
     WC_ALLOC_VAR(genKey, EccsiKey, 1, HEAP_HINT);
 
+#ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC
+    if (genKey == NULL) {
+        ret = MEMORY_E;
+        goto exit;
+    }
+#endif
+
     /* Key Gen */
     bench_stats_start(&count, &start);
     do {
@@ -11622,6 +11670,13 @@ void bench_eccsiPairGen(void)
     WC_ALLOC_VAR(genKey, EccsiKey, 1, HEAP_HINT);
     WC_ALLOC_VAR(ssk, mp_int, 1, HEAP_HINT);
 
+#ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC
+    if (genKey == NULL || ssk == NULL) {
+        ret = MEMORY_E;
+        goto exit;
+    }
+#endif
+
     (void)mp_init(ssk);
     pvt = wc_ecc_new_point();
     wc_InitEccsiKey(genKey, NULL, INVALID_DEVID);
@@ -11679,6 +11734,13 @@ void bench_eccsiValidate(void)
     WC_ALLOC_VAR(genKey, EccsiKey, 1, HEAP_HINT);
     WC_ALLOC_VAR(ssk, mp_int, 1, HEAP_HINT);
 
+#ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC
+    if (genKey == NULL || ssk == NULL) {
+        ret = MEMORY_E;
+        goto exit;
+    }
+#endif
+
     (void)mp_init(ssk);
     pvt = wc_ecc_new_point();
     wc_InitEccsiKey(genKey, NULL, INVALID_DEVID);
@@ -11742,6 +11804,13 @@ void bench_eccsi(void)
     WC_ALLOC_VAR(genKey, EccsiKey, 1, HEAP_HINT);
     WC_ALLOC_VAR(ssk, mp_int, 1, HEAP_HINT);
 
+#ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC
+    if (genKey == NULL || ssk == NULL) {
+        ret = MEMORY_E;
+        goto exit;
+    }
+#endif
+
     (void)mp_init(ssk);
     pvt = wc_ecc_new_point();
     (void)wc_InitEccsiKey(genKey, NULL, INVALID_DEVID);
@@ -11829,6 +11898,13 @@ void bench_sakkeKeyGen(void)
 
     WC_ALLOC_VAR(genKey, SakkeKey, 1, HEAP_HINT);
 
+#ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC
+    if (genKey == NULL) {
+        ret = MEMORY_E;
+        goto exit;
+    }
+#endif
+
     /* Key Gen */
     bench_stats_start(&count, &start);
     do {
@@ -11872,6 +11948,13 @@ void bench_sakkeRskGen(void)
 
     WC_ALLOC_VAR(genKey, SakkeKey, 1, HEAP_HINT);
 
+#ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC
+    if (genKey == NULL) {
+        ret = MEMORY_E;
+        goto exit;
+    }
+#endif
+
     rsk = wc_ecc_new_point();
     wc_InitSakkeKey_ex(genKey, 128, ECC_SAKKE_1, NULL, INVALID_DEVID);
     (void)wc_MakeSakkeKey(genKey, &gRng);
@@ -11923,6 +12006,13 @@ void bench_sakkeValidate(void)
 
     WC_ALLOC_VAR(genKey, SakkeKey, 1, HEAP_HINT);
 
+#ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC
+    if (genKey == NULL) {
+        ret = MEMORY_E;
+        goto exit;
+    }
+#endif
+
     rsk = wc_ecc_new_point();
     (void)wc_InitSakkeKey_ex(genKey, 128, ECC_SAKKE_1, NULL, INVALID_DEVID);
     (void)wc_MakeSakkeKey(genKey, &gRng);
@@ -11983,6 +12073,13 @@ void bench_sakke(void)
 
     WC_ALLOC_VAR(genKey, SakkeKey, 1, HEAP_HINT);
 
+#ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC
+    if (genKey == NULL) {
+        ret = MEMORY_E;
+        goto exit;
+    }
+#endif
+
     XMEMCPY(ssv, ssv_init, sizeof ssv);
 
     rsk = wc_ecc_new_point();