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,193.7 sigs/sec

🥈 ring

2,017.5 sigs/sec

🥉 graviola

1,193.8 sigs/sec

golang

1,102.7 sigs/sec

rustcrypto

899.86 sigs/sec
ECDSA-P256 signing

🥇 graviola

84,286 sigs/sec

🥈 aws-lc-rs

64,224 sigs/sec

🥉 ring

63,565 sigs/sec

golang

47,587 sigs/sec

rustcrypto

8,357.6 sigs/sec
ECDSA-P384 signing

🥇 aws-lc-rs

15,678 sigs/sec

🥈 graviola

8,645 sigs/sec

🥉 golang

6,827.9 sigs/sec

ring

3,408.2 sigs/sec

rustcrypto

2,205 sigs/sec

Signature verification

RSA2048 signature verification

🥇 aws-lc-rs

68,871 sigs/sec

🥈 ring

58,533 sigs/sec

🥉 graviola

46,875 sigs/sec

golang

35,772 sigs/sec

rustcrypto

7,596.6 sigs/sec
ECDSA-P256 signature verification

🥇 graviola

26,222 sigs/sec

🥈 aws-lc-rs

24,700 sigs/sec

🥉 ring

22,928 sigs/sec

golang

19,094 sigs/sec

rustcrypto

5,227.6 sigs/sec
ECDSA-P384 signature verification

🥇 aws-lc-rs

6,475 sigs/sec

🥈 graviola

4,831.1 sigs/sec

🥉 golang

2,298 sigs/sec

ring

1,902.2 sigs/sec

rustcrypto

1,227.7 sigs/sec

Key exchange

X25519 key agreement

🥇 graviola

41,990 kx/sec

🥈 aws-lc-rs

39,706 kx/sec

🥉 ring

25,834 kx/sec

dalek

23,418 kx/sec

golang

14,478 kx/sec
P256 key agreement

🥇 aws-lc-rs

23,774 kx/sec

🥈 graviola

23,014 kx/sec

🥉 ring

20,844 kx/sec

golang

19,885 kx/sec

rustcrypto

5,193.8 kx/sec
P384 key agreement

🥇 aws-lc-rs

6,735.2 kx/sec

🥈 graviola

4,522.6 kx/sec

🥉 golang

2,451.2 kx/sec

ring

1,841.4 kx/sec

rustcrypto

1,227.7 kx/sec
ML-KEM-768

🥇 graviola

40,255 KEM/sec

🥈 aws-lc-rs

30,850 KEM/sec

🥉 libcrux-ml-kem

21,567 KEM/sec

rustcrypto

10,098 KEM/sec

golang

9,500.8 KEM/sec

Bulk encryption

AES256-GCM encryption (8KB wide)

🥇 aws-lc-rs

6.47 GiB/sec

🥈 golang

5.75 GiB/sec

🥉 ring

5.43 GiB/sec

graviola

5.25 GiB/sec

rustcrypto

0.142 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.1
  • 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,276.3 sigs/sec

    🥈 ring

    2,370 sigs/sec

    🥉 graviola

    2,280.7 sigs/sec

    golang

    1,297.7 sigs/sec

    rustcrypto

    880.65 sigs/sec
    ECDSA-P256 signing

    🥇 graviola

    92,694 sigs/sec

    🥈 aws-lc-rs

    85,967 sigs/sec

    🥉 ring

    80,372 sigs/sec

    golang

    44,277 sigs/sec

    rustcrypto

    9,675.3 sigs/sec
    ECDSA-P384 signing

    🥇 aws-lc-rs

    16,385 sigs/sec

    🥈 graviola

    9,175.8 sigs/sec

    🥉 golang

    6,322.1 sigs/sec

    ring

    3,322 sigs/sec

    rustcrypto

    2,203.6 sigs/sec

    Signature verification

    RSA2048 signature verification

    🥇 graviola

    83,119 sigs/sec

    🥈 aws-lc-rs

    74,801 sigs/sec

    🥉 ring

    64,742 sigs/sec

    golang

    43,890 sigs/sec

    rustcrypto

    7,278.6 sigs/sec
    ECDSA-P256 signature verification

    🥇 aws-lc-rs

    26,519 sigs/sec

    🥈 graviola

    26,291 sigs/sec

    🥉 ring

    25,652 sigs/sec

    golang

    19,455 sigs/sec

    rustcrypto

    5,827.2 sigs/sec
    ECDSA-P384 signature verification

    🥇 aws-lc-rs

    6,889.2 sigs/sec

    🥈 graviola

    4,951.6 sigs/sec

    🥉 golang

    2,215.9 sigs/sec

    ring

    1,847.5 sigs/sec

    rustcrypto

    1,218.2 sigs/sec

    Key exchange

    X25519 key agreement

    🥇 graviola

    42,363 kx/sec

    🥈 aws-lc-rs

    42,038 kx/sec

    🥉 ring

    22,724 kx/sec

    dalek

    19,158 kx/sec

    golang

    14,522 kx/sec
    P256 key agreement

    🥇 aws-lc-rs

    25,061 kx/sec

    🥈 graviola

    24,347 kx/sec

    🥉 ring

    24,172 kx/sec

    golang

    20,417 kx/sec

    rustcrypto

    5,792.5 kx/sec
    P384 key agreement

    🥇 aws-lc-rs

    7,197 kx/sec

    🥈 graviola

    4,861.2 kx/sec

    🥉 golang

    2,432.9 kx/sec

    ring

    1,790.1 kx/sec

    rustcrypto

    1,231 kx/sec
    ML-KEM-768

    🥇 graviola

    33,520 KEM/sec

    🥈 aws-lc-rs

    31,044 KEM/sec

    🥉 libcrux-ml-kem

    20,913 KEM/sec

    rustcrypto

    8,913.6 KEM/sec

    golang

    7,614.1 KEM/sec

    Bulk encryption

    AES256-GCM encryption (8KB wide) ⓘ

    🥇 aws-lc-rs

    9.88 GiB/sec
    ⓘ

    🥈 ring

    9.13 GiB/sec
    ⓘ

    🥉 graviola

    8.79 GiB/sec

    golang

    6.12 GiB/sec

    rustcrypto

    1.78 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.1
  • 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