Graviola Benchmarking Results

At the moment benchmarking is non-automated, and is run on two of my laptops. See below.

Headlines

These categories are chosen because they are typically used for TLS traffic on the web.

aarch64

Signing

RSA2048 signing

🥇 aws-lc-rs

2,221.3 sigs/sec

🥈 ring

2,043.7 sigs/sec

🥉 graviola

1,209.5 sigs/sec

golang

1,102.7 sigs/sec

rustcrypto

913.62 sigs/sec
ECDSA-P256 signing

🥇 graviola

85,498 sigs/sec

🥈 aws-lc-rs

65,020 sigs/sec

🥉 ring

64,163 sigs/sec

golang

47,587 sigs/sec

rustcrypto

8,431.8 sigs/sec
ECDSA-P384 signing

🥇 aws-lc-rs

15,894 sigs/sec

🥈 graviola

8,754.6 sigs/sec

🥉 golang

6,827.9 sigs/sec

ring

3,452 sigs/sec

rustcrypto

2,232.4 sigs/sec

Signature verification

RSA2048 signature verification

🥇 aws-lc-rs

69,946 sigs/sec

🥈 ring

59,294 sigs/sec

🥉 graviola

47,468 sigs/sec

golang

35,772 sigs/sec

rustcrypto

7,694.9 sigs/sec
ECDSA-P256 signature verification

🥇 graviola

26,460 sigs/sec

🥈 aws-lc-rs

25,015 sigs/sec

🥉 ring

23,218 sigs/sec

golang

19,094 sigs/sec

rustcrypto

5,291.4 sigs/sec
ECDSA-P384 signature verification

🥇 aws-lc-rs

6,578 sigs/sec

🥈 graviola

4,892.9 sigs/sec

🥉 golang

2,298 sigs/sec

ring

1,926.5 sigs/sec

rustcrypto

1,243.3 sigs/sec

Key exchange

X25519 key agreement

🥇 graviola

42,401 kx/sec

🥈 aws-lc-rs

40,210 kx/sec

🥉 ring

26,162 kx/sec

dalek

23,713 kx/sec

golang

14,478 kx/sec
P256 key agreement

🥇 aws-lc-rs

24,082 kx/sec

🥈 graviola

23,398 kx/sec

🥉 ring

21,094 kx/sec

golang

19,885 kx/sec

rustcrypto

5,264.1 kx/sec
P384 key agreement

🥇 aws-lc-rs

6,799.9 kx/sec

🥈 graviola

4,583.1 kx/sec

🥉 golang

2,451.2 kx/sec

ring

1,863.9 kx/sec

rustcrypto

1,243.3 kx/sec
ML-KEM-768

🥇 aws-lc-rs

31,192 KEM/sec

🥈 graviola

30,139 KEM/sec

🥉 libcrux-ml-kem

21,862 KEM/sec

rustcrypto

10,327 KEM/sec

golang

9,500.8 KEM/sec

Bulk encryption

AES256-GCM encryption (8KB wide)

🥇 aws-lc-rs

6.59 GiB/sec

🥈 golang

5.75 GiB/sec

🥉 ring

5.49 GiB/sec

graviola

5.32 GiB/sec

rustcrypto

0.144 GiB/sec

Versions tested

  • aws-lc-rs version: aws-lc-rs 1.17.0, aws-lc-sys 0.41.0
  • dalek version: curve25519-dalek 4.1.3, x25519-dalek 2.0.1
  • golang version: go version go1.26.4 darwin/arm64
  • graviola version: 0.4.0
  • libcrux-ml-kem version: libcrux-ml-kem 0.0.9
  • ring version: ring 0.17.14
  • rustcrypto version: aes-gcm 0.10.3, p256 0.13.2, p384 0.13.1, rsa 0.9.10, sha2 0.10.9
  • x86_64

    Signing

    RSA2048 signing ⓘ

    🥇 aws-lc-rs

    5,342.9 sigs/sec

    🥈 ring

    2,384.9 sigs/sec

    🥉 graviola

    2,190.1 sigs/sec

    golang

    1,297.7 sigs/sec

    rustcrypto

    881.68 sigs/sec
    ECDSA-P256 signing

    🥇 graviola

    92,614 sigs/sec

    🥈 aws-lc-rs

    86,517 sigs/sec

    🥉 ring

    80,798 sigs/sec

    golang

    44,277 sigs/sec

    rustcrypto

    9,677 sigs/sec
    ECDSA-P384 signing

    🥇 aws-lc-rs

    16,379 sigs/sec

    🥈 graviola

    9,065.4 sigs/sec

    🥉 golang

    6,322.1 sigs/sec

    ring

    3,368 sigs/sec

    rustcrypto

    2,224.4 sigs/sec

    Signature verification

    RSA2048 signature verification

    🥇 graviola

    83,438 sigs/sec

    🥈 aws-lc-rs

    76,006 sigs/sec

    🥉 ring

    65,211 sigs/sec

    golang

    43,890 sigs/sec

    rustcrypto

    7,309.1 sigs/sec
    ECDSA-P256 signature verification

    🥇 aws-lc-rs

    26,701 sigs/sec

    🥈 graviola

    26,285 sigs/sec

    🥉 ring

    25,711 sigs/sec

    golang

    19,455 sigs/sec

    rustcrypto

    5,812.3 sigs/sec
    ECDSA-P384 signature verification

    🥇 aws-lc-rs

    6,888.7 sigs/sec

    🥈 graviola

    5,056.9 sigs/sec

    🥉 golang

    2,215.9 sigs/sec

    ring

    1,862 sigs/sec

    rustcrypto

    1,231.3 sigs/sec

    Key exchange

    X25519 key agreement

    🥇 graviola

    42,611 kx/sec

    🥈 aws-lc-rs

    42,295 kx/sec

    🥉 ring

    22,631 kx/sec

    dalek

    19,356 kx/sec

    golang

    14,522 kx/sec
    P256 key agreement

    🥇 aws-lc-rs

    25,215 kx/sec

    🥈 graviola

    24,346 kx/sec

    🥉 ring

    24,124 kx/sec

    golang

    20,417 kx/sec

    rustcrypto

    5,791.1 kx/sec
    P384 key agreement

    🥇 aws-lc-rs

    7,175.6 kx/sec

    🥈 graviola

    4,884.3 kx/sec

    🥉 golang

    2,432.9 kx/sec

    ring

    1,805.8 kx/sec

    rustcrypto

    1,232.2 kx/sec
    ML-KEM-768

    🥇 aws-lc-rs

    30,724 KEM/sec

    🥈 graviola

    22,768 KEM/sec

    🥉 libcrux-ml-kem

    20,950 KEM/sec

    rustcrypto

    8,993.8 KEM/sec

    golang

    7,614.1 KEM/sec

    Bulk encryption

    AES256-GCM encryption (8KB wide) ⓘ

    🥇 aws-lc-rs

    9.77 GiB/sec
    ⓘ

    🥈 ring

    8.92 GiB/sec
    ⓘ

    🥉 graviola

    8.7 GiB/sec

    golang

    6.12 GiB/sec

    rustcrypto

    1.8 GiB/sec

    Versions tested

  • aws-lc-rs version: aws-lc-rs 1.17.0, aws-lc-sys 0.41.0
  • dalek version: curve25519-dalek 4.1.3, x25519-dalek 2.0.1
  • golang version: go version go1.26.4 linux/amd64
  • graviola version: 0.4.0
  • libcrux-ml-kem version: libcrux-ml-kem 0.0.9
  • ring version: ring 0.17.14
  • rustcrypto version: aes-gcm 0.10.3, p256 0.13.2, p384 0.13.1, rsa 0.9.10, sha2 0.10.9
  • Full reports