In the following speed table, smaller numbers are better. The numbers are interquartile means of single-core cycle counts on various microarchitectures. Overclocking is disabled.
The table reports cycle counts from lib25519 and, for comparison,
OpenSSL and s2n-bignum.
For comparability to OpenSSL's speed-testing utility,
the OpenSSL cycle counts omit various OpenSSL overheads; see below for details.
The s2n-bignum and lib25519 cycle counts include all overheads.
There is also a lib25519+s2n line showing separate measurements of lib25519
after an optional pre-configuration ./use-s2n-bignum step
(which is a supported option for lib25519);
a lib25519+exp line showing separate measurements of lib25519
after an experimental pre-configuration mv skipcompilers/* compilers step
(which is unsupported: it uses instructions not supported by valgrind);
and a lib25519+s2n+exp line.
| μarch | software | X key | X dh | X batch | Ed key | Ed sign | Ed verif | Ed MSM |
|---|---|---|---|---|---|---|---|---|
| Intel Redwood Cove (2023) | OpenSSL | 102655 | 103510 | 106608 | 103247 | 341443 | ||
| lib25519 | 23202 | 94878 | 63162 | 24481 | 27407 | 96199 | 30320 | |
| lib25519+exp | 23345 | 67631 | 62627 | 24132 | 27683 | 93290 | 29890 | |
| lib25519+s2n+exp | 23642 | 67570 | 62662 | 24103 | 27934 | 93889 | 29463 | |
| lib25519+s2n | 24140 | 94798 | 63032 | 24287 | 27932 | 94654 | 30479 | |
| s2n-bignum | 24669 | 75760 | ||||||
| AMD Zen 4 (2022) | OpenSSL | 111574 | 109143 | 114875 | 110739 | 378734 | ||
| lib25519 | 27981 | 70915 | 45918 | 28641 | 31993 | 123236 | 38862 | |
| lib25519+exp | 22731 | 53572 | 22362 | 23522 | 26680 | 111059 | 34695 | |
| lib25519+s2n+exp | 22697 | 53535 | 22478 | 23463 | 26706 | 113579 | 34551 | |
| lib25519+s2n | 27990 | 71140 | 45752 | 28720 | 31793 | 124290 | 38900 | |
| s2n-bignum | 26471 | 87905 | ||||||
| Intel Golden Cove (2021) | OpenSSL | 98110 | 104590 | 99827 | 98099 | 331861 | ||
| lib25519 | 25446 | 83586 | 50346 | 24993 | 28114 | 96327 | 31080 | |
| lib25519+exp | 23828 | 69036 | 49930 | 24981 | 29277 | 95024 | 30688 | |
| lib25519+s2n+exp | 23926 | 67997 | 49888 | 25053 | 28602 | 96265 | 30279 | |
| lib25519+s2n | 24968 | 83546 | 50257 | 25311 | 28601 | 95184 | 31114 | |
| s2n-bignum | 24124 | 75653 | ||||||
| AMD Zen 3 (2020) | OpenSSL | 112079 | 117092 | 114230 | 111564 | 369827 | ||
| lib25519 | 28736 | 73082 | 71153 | 29047 | 32447 | 127996 | 40558 | |
| lib25519+exp | 25731 | 73020 | 47919 | 26596 | 29986 | 112251 | 35542 | |
| lib25519+s2n+exp | 25682 | 73039 | 47832 | 26555 | 29972 | 112717 | 35462 | |
| lib25519+s2n | 28242 | 73092 | 50367 | 29084 | 32402 | 126450 | 40762 | |
| s2n-bignum | 26507 | 88942 | ||||||
| Intel Tiger Lake (2020) | OpenSSL | 116185 | 122224 | 118890 | 117272 | 390023 | ||
| lib25519 | 29203 | 85377 | 61558 | 30114 | 33707 | 114388 | 34988 | |
| lib25519+exp | 27477 | 64604 | 21678 | 28300 | 31917 | 108489 | 32574 | |
| lib25519+s2n+exp | 27493 | 64623 | 21666 | 28302 | 31967 | 106086 | 32869 | |
| lib25519+s2n | 29493 | 85129 | 62324 | 30348 | 33880 | 113989 | 35743 | |
| s2n-bignum | 27351 | 83661 | ||||||
| AMD Zen 2 (2019) | OpenSSL | 123476 | 118444 | 125486 | 120168 | 398495 | ||
| lib25519 | 27763 | 112800 | 74459 | 28647 | 31844 | 129584 | 37850 | |
| lib25519+exp | 27715 | 101021 | 74033 | 28425 | 31667 | 127971 | 38011 | |
| lib25519+s2n+exp | 26759 | 95144 | 73685 | 27720 | 30967 | 127160 | 37956 | |
| lib25519+s2n | 27820 | 112841 | 74279 | 28529 | 31682 | 129086 | 38009 | |
| s2n-bignum | 26478 | 93099 | ||||||
| ARM Neoverse N1 (2019) | OpenSSL | 99997 | 392328 | 103377 | 99389 | 328870 | ||
| lib25519 | 50101 | 115215 | 115058 | 51010 | 55528 | 244068 | 72660 | |
| lib25519+exp | 50219 | 115190 | 115062 | 51170 | 55601 | 244691 | 72905 | |
| lib25519+s2n+exp | 49968 | 111647 | 111537 | 50974 | 55481 | 242377 | 73082 | |
| lib25519+s2n | 50130 | 111624 | 111534 | 50982 | 55603 | 241601 | 72922 | |
| s2n-bignum | 53028 | 111822 | ||||||
| ARM Cortex-A76 (2018) | OpenSSL | 98208 | 392220 | 100316 | 98058 | 328523 | ||
| lib25519 | 49290 | 115105 | 115061 | 50211 | 54872 | 242570 | 72591 | |
| lib25519+exp | 49221 | 115111 | 115050 | 50182 | 54746 | 245004 | 72870 | |
| lib25519+s2n+exp | 49223 | 111516 | 111522 | 50131 | 54766 | 242067 | 72938 | |
| lib25519+s2n | 49165 | 111529 | 111522 | 50259 | 54687 | 243189 | 72746 | |
| s2n-bignum | 49949 | 111541 | ||||||
| Intel Goldmont Plus (2017) | OpenSSL | 216237 | 252134 | 222984 | 214318 | 711629 | ||
| lib25519 | 84907 | 267290 | 265772 | 87040 | 95621 | 315405 | 88459 | |
| lib25519+exp | 84047 | 267123 | 267303 | 86232 | 94734 | 314777 | 88729 | |
| lib25519+s2n+exp | 68275 | 245750 | 245746 | 70395 | 78853 | 298975 | 87383 | |
| lib25519+s2n | 69205 | 245752 | 245760 | 71299 | 79804 | 298539 | 87279 | |
| s2n-bignum | 69563 | 245712 | ||||||
| ARM Cortex-A72 (2016) | OpenSSL | 138448 | 423947 | 145529 | 129518 | 398640 | ||
| lib25519 | 60844 | 129860 | 129863 | 62310 | 68159 | 288050 | 87706 | |
| lib25519+exp | 60788 | 129858 | 129872 | 62275 | 68103 | 286528 | 88048 | |
| lib25519+s2n+exp | 58798 | 128022 | 128019 | 60297 | 66010 | 284735 | 88262 | |
| lib25519+s2n | 58670 | 128021 | 128013 | 60174 | 65913 | 282192 | 87552 | |
| s2n-bignum | 60466 | 136537 | ||||||
| Intel Skylake (2015) | OpenSSL | 123177 | 118572 | 125842 | 120298 | 392874 | ||
| lib25519 | 33440 | 88172 | 62840 | 34288 | 37708 | 116074 | 37912 | |
| lib25519+exp | 31381 | 83219 | 62875 | 32131 | 35645 | 103958 | 33935 | |
| lib25519+s2n+exp | 31427 | 82614 | 62531 | 32282 | 35716 | 105701 | 33653 | |
| lib25519+s2n | 33451 | 89870 | 62812 | 34328 | 37793 | 116623 | 37975 | |
| s2n-bignum | 32049 | 83749 | ||||||
| Intel Airmont (2015) | OpenSSL | 279700 | 618989 | 292772 | 277593 | 853353 | ||
| lib25519 | 143379 | 449706 | 449742 | 147171 | 162917 | 539417 | 155486 | |
| lib25519+exp | 143392 | 449634 | 449710 | 147073 | 162557 | 542105 | 155918 | |
| lib25519+s2n+exp | 114744 | 421146 | 421219 | 118791 | 133576 | 503872 | 153471 | |
| lib25519+s2n | 114866 | 421207 | 421231 | 118408 | 134106 | 512588 | 153505 | |
| s2n-bignum | 115717 | 432248 | ||||||
| Intel Broadwell (2014) | OpenSSL | 119594 | 121170 | 122805 | 119864 | 389886 | ||
| lib25519 | 31437 | 93464 | 72452 | 32323 | 35905 | 122790 | 39757 | |
| lib25519+exp | 28935 | 84915 | 74513 | 29754 | 33537 | 107474 | 33817 | |
| lib25519+s2n+exp | 28994 | 84789 | 72117 | 29740 | 33541 | 106800 | 34289 | |
| lib25519+s2n | 31479 | 93366 | 72458 | 32244 | 36909 | 121430 | 39834 | |
| s2n-bignum | 30752 | 87489 | ||||||
| Intel Haswell (2013) | OpenSSL | 125107 | 163247 | 128058 | 125087 | 407784 | ||
| lib25519 | 45541 | 118265 | 76486 | 46374 | 50255 | 150229 | 50290 | |
| lib25519+exp | 43488 | 115141 | 76684 | 44240 | 48268 | 152291 | 49855 | |
| lib25519+s2n+exp | 43325 | 118224 | 76022 | 44084 | 47646 | 150462 | 50317 | |
| lib25519+s2n | 44780 | 119746 | 76395 | 45812 | 49606 | 152249 | 50732 | |
| s2n-bignum | 47493 | 154648 | ||||||
| ARM Cortex-A53 (2012) | OpenSSL | 207910 | 508113 | 215419 | 198326 | 550366 | ||
| lib25519 | 76118 | 141986 | 142046 | 77677 | 86313 | 313318 | 90121 | |
| lib25519+exp | 75696 | 142140 | 142085 | 77510 | 86592 | 321606 | 90248 | |
| lib25519+s2n+exp | 70959 | 137691 | 137752 | 72956 | 81821 | 318447 | 90308 | |
| lib25519+s2n | 71063 | 137686 | 137765 | 73198 | 81939 | 315368 | 90476 | |
| s2n-bignum | 111524 | 162789 | ||||||
| Intel Core 2 (2006) | OpenSSL | 244742 | 340071 | 251269 | 238104 | 723314 | ||
| lib25519 | 99033 | 321976 | 320969 | 101551 | 109521 | 369918 | 106251 | |
| lib25519+exp | 99172 | 316731 | 316774 | 101260 | 109474 | 370317 | 105846 | |
| lib25519+s2n+exp | 77185 | 262935 | 263006 | 79237 | 87534 | 348480 | 105398 | |
| lib25519+s2n | 77151 | 262935 | 263009 | 79189 | 87219 | 349249 | 105126 | |
| s2n-bignum | 71164 | 262728 |
Microarchitectures are listed in reverse chronological order of when they were introduced. Each library is assigned one foreground color in the table.
In the lib25519 distribution,
command/lib25519-speed.c measures lib25519;
benchmarks/*-* is the output of lib25519-speed on various machines;
speedcomparison/openssl/* has code to measure OpenSSL, and measurements from various machines;
speedcomparison/s2n/* has code to measure s2n-bignum, and measurements from various machines;
and autogen/md-speed extracts the table from those measurements.
OpenSSL benchmarks use version 4.0.1 (2026.06.09);
s2n-bignum benchmarks use commit fce78c7c17baee6a60511efe821930d4d049a6c0 (2026.06.12).
The table reports only interquartile means of cycle counts, not the full distribution of cycle counts. See the full output files for differences between multiple measurements and the interquartile mean. The table reports the following major operations:
-
"X key": Generating an X25519 public key and secret key. This is
dh_x25519_keypair selected 32in thelib25519-speedoutput (lib25519_dh_keypairin the stable API).For s2n-bignum, this is
x25519-keygenin thes2n25519speedoutput, measuring the cost ofcurve25519_x25519base_byte_alt, orcurve25519_x25519base_byteon machines where that works and is faster.For OpenSSL, this is
x25519-keygen-mainin theopenssl25519speedoutput, measuring the cost ofEVP_PKEY_Q_keygen(0,0,"X25519"). This does not include small OpenSSL overheads for converting the public key and secret key to storage format. -
"X dh": Generating an X25519 shared secret. This is
dh_x25519 selected 32in thelib25519-speedoutput (lib25519_dhin the stable API).For s2n-bignum, this is
x25519-dhin thes2n25519speedoutput, measuring the cost ofcurve25519_x25519_byte_alt, orcurve25519_x25519_byteon machines where that works and is faster.For OpenSSL, this is
x25519-dh-mainin theopenssl25519speedoutput, measuring the cost ofEVP_PKEY_derive(as in OpenSSL's speed-testing utility). This does not include the cost ofEVP_PKEY_new_raw_public_keyto decode the public key (x25519-dh-pkdecode, 2868 cycles on Tiger Lake),EVP_PKEY_CTX_newandEVP_PKEY_derive_initandEVP_PKEY_derive_set_peerfor initialization (togetherx25519-dh-init, 1914 cycles on Tiger Lake), andEVP_PKEY_new_raw_private_keyto decode the secret key if it is not decoded already (x25519-dh-skdecode, 113904 cycles on Tiger Lake). -
"X batch": Cost per secret of generating 16 separate shared secrets. This is
nPbatch_montgomery25519 selected 16in thelib25519-speedoutput divided by 16. -
"Ed key": Generating an Ed25519 public key and secret key. This is
sign_ed25519_keypair selected 32in thelib25519-speedoutput (lib25519_sign_keypairin the stable API).For OpenSSL, this is
ed25519-keygen-mainin theopenssl25519speedoutput, measuring the cost ofEVP_PKEY_Q_keygen(0,0,"ED25519"). This does not include small OpenSSL overheads for converting the public key and secret key to storage format. -
"Ed sign": Generating an Ed25519 signature of a 59-byte message. This is
sign_ed25519 selected 59in thelib25519-speedoutput (lib25519_signin the stable API).For OpenSSL, this is
ed25519-sign-mainin theopenssl25519speedoutput, measuring the cost ofEVP_DigestSign(as in OpenSSL's speed-testing utility). This does not include the cost ofEVP_MD_CTX_newandEVP_DigestSignInit(ed25519-sign-init, 2662 cycles on Tiger Lake), andEVP_PKEY_new_raw_private_keyto decode the secret key if it is not decoded already (ed25519-sign-skdecode, 116227 cycles on Tiger Lake). -
"Ed verif": Verifying an Ed25519 signature and recovering a 59-byte message. This is
sign_ed25519_open selected 59in thelib25519-speedoutput (lib25519_sign_openin the stable API).For OpenSSL, this is
ed25519-verify-mainin theopenssl25519speedoutput, measuring the cost ofEVP_DigestVerify(as in OpenSSL's speed-testing utility). This does not include the cost ofEVP_MD_CTX_newandEVP_DigestVerifyInit(togethered25519-verify-init, 2234 cycles on Tiger Lake), andEVP_PKEY_new_raw_public_keyto decode the public key being used for verification (ed25519-verify-pkdecode, 3102 cycles on Tiger Lake). -
"Ed MSM": Cost per point of multi-scalar multiplication with 16 points and 16 full-size scalars. This is
multiscalar_ed25519 selected 16in thelib25519-speedoutput divided by 16.
Version: This is version 2026.06.14 of the "Speed" web page.