wolfSSL / wolfssl

The wolfSSL library is a small, fast, portable implementation of TLS/SSL for embedded devices to the cloud. wolfSSL supports up to TLS 1.3 and DTLS 1.3!
https://www.wolfssl.com
GNU General Public License v2.0
2.23k stars 799 forks source link

Dilithium/ML-DSA: Implementation of ML-DSA-44/65/87 #7622

Closed SparkiDev closed 3 weeks ago

SparkiDev commented 1 month ago

Description

Impemented FIPS 204 (Draft) Module-Lattice-Based Signature Standard. Implementation include making a key, signing and verification. Make key API added. Updated liboqs calls to use ML-DSA implementation instead of Dilithium.

Testing

./configure '--enable-experimental' '--enable-dilithium'

Checklist

dgarske commented 3 weeks ago

Testing results on STM32H7A3 Cortex M7 at 240MHz:

Testing with build options:

#define WOLFSSL_EXPERIMENTAL_SETTINGS
#define HAVE_DILITHIUM
#define WOLFSSL_WC_DILITHIUM
#define WOLFSSL_SHAKE128
#define WOLFSSL_SHAKE256
#define WOLFSSL_SHA3
SHA3-224                     1 MiB took 1.015 seconds,    1.131 MiB/s
SHA3-256                     1 MiB took 1.004 seconds,    1.070 MiB/s
SHA3-384                   850 KiB took 1.008 seconds,  843.254 KiB/s
SHA3-512                   600 KiB took 1.015 seconds,  591.133 KiB/s
SHAKE128                     1 MiB took 1.012 seconds,    1.303 MiB/s
SHAKE256                     1 MiB took 1.004 seconds,    1.070 MiB/s
HMAC-SHA256                  2 MiB took 1.007 seconds,    2.085 MiB/s
RSA     2048   public        88 ops took 1.000 sec, avg 11.364 ms, 88.000 ops/sec
RSA     2048  private         4 ops took 1.592 sec, avg 398.000 ms, 2.513 ops/sec
DH      2048  key gen         6 ops took 1.137 sec, avg 189.500 ms, 5.277 ops/sec
DH      2048    agree         6 ops took 1.141 sec, avg 190.167 ms, 5.259 ops/sec
ECC   [      SECP256R1]   256  key gen       218 ops took 1.004 sec, avg 4.606 ms, 217.131 ops/sec
ECDHE [      SECP256R1]   256    agree       110 ops took 1.000 sec, avg 9.091 ms, 110.000 ops/sec
ECDSA [      SECP256R1]   256     sign       100 ops took 1.012 sec, avg 10.120 ms, 98.814 ops/sec
ECDSA [      SECP256R1]   256   verify        64 ops took 1.003 sec, avg 15.672 ms, 63.809 ops/sec
ML-DSA    44  key gen        56 ops took 1.000 sec, avg 17.857 ms, 56.000 ops/sec
ML-DSA    44     sign        16 ops took 1.028 sec, avg 64.250 ms, 15.564 ops/sec
ML-DSA    44   verify        52 ops took 1.016 sec, avg 19.538 ms, 51.181 ops/sec
ML-DSA    65  key gen        34 ops took 1.035 sec, avg 30.441 ms, 32.850 ops/sec
ML-DSA    65     sign        12 ops took 1.075 sec, avg 89.583 ms, 11.163 ops/sec
ML-DSA    65   verify        32 ops took 1.016 sec, avg 31.750 ms, 31.496 ops/sec
ML-DSA    87  key gen        20 ops took 1.020 sec, avg 51.000 ms, 19.608 ops/sec
ML-DSA    87     sign         6 ops took 1.008 sec, avg 168.000 ms, 5.952 ops/sec
ML-DSA    87   verify        20 ops took 1.051 sec, avg 52.550 ms, 19.029 ops/sec

Results adding WOLFSSL_DILITHIUM_SMALL:

SHA3-224                     1 MiB took 1.012 seconds,    1.134 MiB/s
SHA3-256                     1 MiB took 1.000 seconds,    1.074 MiB/s
SHA3-384                   850 KiB took 1.004 seconds,  846.614 KiB/s
SHA3-512                   600 KiB took 1.016 seconds,  590.551 KiB/s
SHAKE128                     1 MiB took 1.007 seconds,    1.309 MiB/s
SHAKE256                     1 MiB took 1.004 seconds,    1.070 MiB/s
HMAC-SHA256                  1 MiB took 1.000 seconds,    1.270 MiB/s
RSA     2048   public        88 ops took 1.020 sec, avg 11.591 ms, 86.275 ops/sec
RSA     2048  private         4 ops took 1.522 sec, avg 380.500 ms, 2.628 ops/sec
DH      2048  key gen         6 ops took 1.121 sec, avg 186.833 ms, 5.352 ops/sec
DH      2048    agree         6 ops took 1.117 sec, avg 186.167 ms, 5.372 ops/sec
ECC   [      SECP256R1]   256  key gen       218 ops took 1.008 sec, avg 4.624 ms, 216.270 ops/sec
ECDHE [      SECP256R1]   256    agree       114 ops took 1.000 sec, avg 8.772 ms, 114.000 ops/sec
ECDSA [      SECP256R1]   256     sign       100 ops took 1.000 sec, avg 10.000 ms, 100.000 ops/sec
ECDSA [      SECP256R1]   256   verify        66 ops took 1.008 sec, avg 15.273 ms, 65.476 ops/sec
ML-DSA    44  key gen        54 ops took 1.008 sec, avg 18.667 ms, 53.571 ops/sec
ML-DSA    44     sign        18 ops took 1.090 sec, avg 60.556 ms, 16.514 ops/sec
ML-DSA    44   verify        48 ops took 1.039 sec, avg 21.646 ms, 46.198 ops/sec
ML-DSA    65  key gen        30 ops took 1.000 sec, avg 33.333 ms, 30.000 ops/sec
ML-DSA    65     sign         8 ops took 1.192 sec, avg 149.000 ms, 6.711 ops/sec
ML-DSA    65   verify        30 ops took 1.062 sec, avg 35.400 ms, 28.249 ops/sec
ML-DSA    87  key gen        20 ops took 1.094 sec, avg 54.700 ms, 18.282 ops/sec
ML-DSA    87     sign        10 ops took 1.255 sec, avg 125.500 ms, 7.968 ops/sec
ML-DSA    87   verify        18 ops took 1.059 sec, avg 58.833 ms, 16.997 ops/sec

Code size difference is 6520 bytes (.text: normal=237228, small=230708)