Building Secure Embedded Systems with wolfSSL and IAR

In the aerospace and defense (A&D) sectors, security, performance, and deterministic assurance are mission-critical. And as various industries prepare for the Post-Quantum Cryptography transition, embedded developers need development tools and security libraries that don’t compromise on constrained system resources. wolfSSL and IAR provide a proven complementary solution that combines an optimized embedded toolchain with lightweight, high-performance security.

IAR, part of Qt Group, provides highly performant compilation, functional safety certification (including ISO 26262 and IEC 61508 standards), and code-size minimization. Meanwhile, wolfSSL delivers lightweight, high-performance security protocols including TLS 1.3, DTLS 1.3, and support for the latest NIST-standardized post-quantum algorithms. Engineers building mission-critical A&D systems can readily pair wolfSSL’s FIPS 140-3 validated cryptographic module with IAR’s hardened toolchain to meet strict compliance and security mandates.

To evaluate this combination, wolfSSL benchmarked wolfCrypt on an STM32H753 (ARM Cortex-M7) using both IAR Embedded Workbench and Arm GCC with identical build settings, including wolfSSL’s in-line assembly acceleration for the THUMB2 architecture. Testing focused on cryptographic performance commonly required in secure embedded communications.

Benchmark Results

wolfCrypt with arm-none-eabi-gcc -Ofast and ARM ASM acceleration

wolfCrypt Benchmark (block bytes 1024, min 1.0 sec each)
RNG                          4 MiB took 1.004 seconds,    4.474 MiB/s
AES-128-GCM-enc              7 MiB took 1.000 seconds,    7.056 MiB/s
AES-128-GCM-dec              7 MiB took 1.000 seconds,    7.080 MiB/s
AES-192-GCM-enc              6 MiB took 1.000 seconds,    6.494 MiB/s
AES-192-GCM-dec              6 MiB took 1.000 seconds,    6.470 MiB/s
AES-256-GCM-enc              6 MiB took 1.000 seconds,    6.006 MiB/s
AES-256-GCM-dec              6 MiB took 1.000 seconds,    5.981 MiB/s
AES-128-GCM-enc-no_AAD       7 MiB took 1.000 seconds,    7.153 MiB/s
AES-128-GCM-dec-no_AAD       7 MiB took 1.000 seconds,    7.129 MiB/s
AES-192-GCM-enc-no_AAD       7 MiB took 1.000 seconds,    6.543 MiB/s
AES-192-GCM-dec-no_AAD       7 MiB took 1.000 seconds,    6.543 MiB/s
AES-256-GCM-enc-no_AAD       6 MiB took 1.000 seconds,    6.030 MiB/s
AES-256-GCM-dec-no_AAD       6 MiB took 1.000 seconds,    6.030 MiB/s
GMAC ARM ASM                14 MiB took 1.000 seconds,   13.989 MiB/s
CHACHA                      37 MiB took 1.000 seconds,   36.816 MiB/s
CHA-POLY                    22 MiB took 1.000 seconds,   21.924 MiB/s
POLY1305                   112 MiB took 1.000 seconds,  111.865 MiB/s
SHA-256                     15 MiB took 1.000 seconds,   15.015 MiB/s
SHA3-224                     6 MiB took 1.000 seconds,    6.470 MiB/s
SHA3-256                     6 MiB took 1.004 seconds,    6.128 MiB/s
SHA3-384                     5 MiB took 1.000 seconds,    4.712 MiB/s
SHA3-512                     3 MiB took 1.004 seconds,    3.283 MiB/s
SHAKE128                     7 MiB took 1.000 seconds,    7.495 MiB/s
SHAKE256                     6 MiB took 1.000 seconds,    6.128 MiB/s
HMAC-SHA256                 15 MiB took 1.000 seconds,   14.868 MiB/s
RSA     2048   public       422 ops took 1.000 sec, avg 2.370 ms,   422.000 ops/sec
RSA     2048  private        12 ops took 1.051 sec, avg 87.583 ms,    11.418 ops/sec
DH      2048  key gen        25 ops took 1.012 sec, avg 40.480 ms,    24.704 ops/sec
DH      2048    agree        26 ops took 1.055 sec, avg 40.577 ms,    24.645 ops/sec
ML-KEM 512    128  key gen      1420 ops took 1.000 sec, avg 0.704 ms,  1420.000 ops/sec
ML-KEM 512    128    encap      1428 ops took 1.000 sec, avg 0.700 ms,  1428.000 ops/sec
ML-KEM 512    128    decap      1056 ops took 1.000 sec, avg 0.947 ms,  1056.000 ops/sec
ML-KEM 768    192  key gen       890 ops took 1.000 sec, avg 1.124 ms,   890.000 ops/sec
ML-KEM 768    192    encap       862 ops took 1.000 sec, avg 1.160 ms,   862.000 ops/sec
ML-KEM 768    192    decap       666 ops took 1.000 sec, avg 1.502 ms,   666.000 ops/sec
ML-KEM 1024   256  key gen       552 ops took 1.000 sec, avg 1.812 ms,   552.000 ops/sec
ML-KEM 1024   256    encap       536 ops took 1.000 sec, avg 1.866 ms,   536.000 ops/sec
ML-KEM 1024   256    decap       438 ops took 1.000 sec, avg 2.283 ms,   438.000 ops/sec
ECC   [      SECP256R1]   256  key gen       812 ops took 1.000 sec, avg 1.232 ms,   812.000 ops/sec
ECDHE [      SECP256R1]   256    agree       370 ops took 1.004 sec, avg 2.714 ms,   368.526 ops/sec
ECDSA [      SECP256R1]   256     sign       436 ops took 1.000 sec, avg 2.294 ms,   436.000 ops/sec
ECDSA [      SECP256R1]   256   verify       240 ops took 1.004 sec, avg 4.183 ms,   239.044 ops/sec
Benchmark complete

wolfCrypt with IAR CC (speed) and ARM ASM acceleration

wolfCrypt Benchmark (block bytes 1024, min 1.0 sec each)
RNG                          5 MiB took 1.000 seconds,    5.005 MiB/s
AES-128-GCM-enc              7 MiB took 1.000 seconds,    7.031 MiB/s
AES-128-GCM-dec              7 MiB took 1.000 seconds,    7.031 MiB/s
AES-192-GCM-enc              6 MiB took 1.000 seconds,    6.445 MiB/s
AES-192-GCM-dec              6 MiB took 1.000 seconds,    6.445 MiB/s
AES-256-GCM-enc              6 MiB took 1.000 seconds,    5.981 MiB/s
AES-256-GCM-dec              6 MiB took 1.000 seconds,    5.957 MiB/s
AES-128-GCM-enc-no_AAD       7 MiB took 1.000 seconds,    7.080 MiB/s
AES-128-GCM-dec-no_AAD       7 MiB took 1.000 seconds,    7.080 MiB/s
AES-192-GCM-enc-no_AAD       6 MiB took 1.000 seconds,    6.494 MiB/s
AES-192-GCM-dec-no_AAD       7 MiB took 1.000 seconds,    6.519 MiB/s
AES-256-GCM-enc-no_AAD       6 MiB took 1.000 seconds,    6.030 MiB/s
AES-256-GCM-dec-no_AAD       6 MiB took 1.000 seconds,    6.030 MiB/s
GMAC ARM ASM                14 MiB took 1.000 seconds,   13.989 MiB/s
CHACHA                      37 MiB took 1.000 seconds,   36.865 MiB/s
CHA-POLY                    24 MiB took 1.000 seconds,   23.682 MiB/s
POLY1305                   112 MiB took 1.000 seconds,  111.865 MiB/s
SHA-256                     15 MiB took 1.004 seconds,   15.003 MiB/s
SHA3-224                     6 MiB took 1.000 seconds,    6.445 MiB/s
SHA3-256                     6 MiB took 1.000 seconds,    6.079 MiB/s
SHA3-384                     5 MiB took 1.000 seconds,    4.688 MiB/s
SHA3-512                     3 MiB took 1.000 seconds,    3.271 MiB/s
SHAKE128                     7 MiB took 1.000 seconds,    7.471 MiB/s
SHAKE256                     6 MiB took 1.000 seconds,    6.079 MiB/s
HMAC-SHA256                 15 MiB took 1.000 seconds,   14.771 MiB/s
RSA     2048   public       426 ops took 1.000 sec, avg 2.347 ms,   426.000 ops/sec
RSA     2048  private        12 ops took 1.051 sec, avg 87.583 ms,    11.418 ops/sec
DH      2048  key gen        25 ops took 1.012 sec, avg 40.480 ms,    24.704 ops/sec
DH      2048    agree        26 ops took 1.051 sec, avg 40.423 ms,    24.738 ops/sec
ML-KEM 512    128  key gen      1626 ops took 1.000 sec, avg 0.615 ms,  1626.000 ops/sec
ML-KEM 512    128    encap      1532 ops took 1.000 sec, avg 0.653 ms,  1532.000 ops/sec
ML-KEM 512    128    decap      1122 ops took 1.000 sec, avg 0.891 ms,  1122.000 ops/sec
ML-KEM 768    192  key gen      1010 ops took 1.000 sec, avg 0.990 ms,  1010.000 ops/sec
ML-KEM 768    192    encap       922 ops took 1.000 sec, avg 1.085 ms,   922.000 ops/sec
ML-KEM 768    192    decap       704 ops took 1.000 sec, avg 1.420 ms,   704.000 ops/sec
ML-KEM 1024   256  key gen       614 ops took 1.000 sec, avg 1.629 ms,   614.000 ops/sec
ML-KEM 1024   256    encap       574 ops took 1.000 sec, avg 1.742 ms,   574.000 ops/sec
ML-KEM 1024   256    decap       462 ops took 1.003 sec, avg 2.171 ms,   460.618 ops/sec
ECC   [      SECP256R1]   256  key gen       816 ops took 1.000 sec, avg 1.225 ms,   816.000 ops/sec
ECDHE [      SECP256R1]   256    agree       386 ops took 1.004 sec, avg 2.601 ms,   384.462 ops/sec
ECDSA [      SECP256R1]   256     sign       438 ops took 1.000 sec, avg 2.283 ms,   438.000 ops/sec
ECDSA [      SECP256R1]   256   verify       242 ops took 1.004 sec, avg 4.149 ms,   241.036 ops/sec
Benchmark complete

One of the most notable findings was the performance of ML-KEM, the first post-quantum cryptography algorithm standardized by NIST in FIPS 203. Across all tested security levels, IAR outperformed Arm GCC during ML-KEM key generation.

Additional performance gains were observed in the wolfCrypt random number generator and ChaCha20-Poly1305 operations.

As organizations prepare for the transition to post-quantum cryptography, performance remains a key consideration for resource-constrained embedded systems. These results demonstrate that developers can achieve measurable gains in post-quantum workloads while maintaining the security and portability required for embedded deployments.

The results demonstrate how wolfSSL and IAR can work together to build embedded applications with cutting edge security, while maximizing performance and minimizing resource usage. This combination is particularly well suited for aerospace and defense systems where secure communications, compliance requirements, and efficient resource utilization are critical.

Ready to evaluate the results yourself?

Access the wolfSSL source code on GitHub to explore wolfCrypt’s lightweight cryptographic implementations and benchmarking capabilities.

You can also download a free evaluation version of IAR Embedded Workbench for Arm, part of the IAR Platform, to explore the optimization technology used in these benchmarks, including compiler, debugger, runtime analysis, and code quality tools.

If you have questions about any of the above, please contact us at facts@wolfssl.com or call us at +1 425 245 8247.

Download wolfSSL Now