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 32` in the `lib25519-speed` output (`lib25519_dh_keypair` in the stable API). For s2n-bignum, this is `x25519-keygen` in the `s2n25519speed` output, measuring the cost of `curve25519_x25519base_byte_alt`, or `curve25519_x25519base_byte` on machines where that works and is faster. For OpenSSL, this is `x25519-keygen-main` in the `openssl25519speed` output, measuring the cost of `EVP_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 32` in the `lib25519-speed` output (`lib25519_dh` in the stable API). For s2n-bignum, this is `x25519-dh` in the `s2n25519speed` output, measuring the cost of `curve25519_x25519_byte_alt`, or `curve25519_x25519_byte` on machines where that works and is faster. For OpenSSL, this is `x25519-dh-main` in the `openssl25519speed` output, measuring the cost of `EVP_PKEY_derive` (as in OpenSSL's speed-testing utility). This does not include the cost of `EVP_PKEY_new_raw_public_key` to decode the public key (`x25519-dh-pkdecode`, 2868 cycles on Tiger Lake), `EVP_PKEY_CTX_new` and `EVP_PKEY_derive_init` and `EVP_PKEY_derive_set_peer` for initialization (together `x25519-dh-init`, 1914 cycles on Tiger Lake), and `EVP_PKEY_new_raw_private_key` to 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 16` in the `lib25519-speed` output _divided by 16_. * "Ed key": Generating an Ed25519 public key and secret key. This is `sign_ed25519_keypair selected 32` in the `lib25519-speed` output (`lib25519_sign_keypair` in the stable API). For OpenSSL, this is `ed25519-keygen-main` in the `openssl25519speed` output, measuring the cost of `EVP_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 59` in the `lib25519-speed` output (`lib25519_sign` in the stable API). For OpenSSL, this is `ed25519-sign-main` in the `openssl25519speed` output, measuring the cost of `EVP_DigestSign` (as in OpenSSL's speed-testing utility). This does not include the cost of `EVP_MD_CTX_new` and `EVP_DigestSignInit` (`ed25519-sign-init`, 2662 cycles on Tiger Lake), and `EVP_PKEY_new_raw_private_key` to 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 59` in the `lib25519-speed` output (`lib25519_sign_open` in the stable API). For OpenSSL, this is `ed25519-verify-main` in the `openssl25519speed` output, measuring the cost of `EVP_DigestVerify` (as in OpenSSL's speed-testing utility). This does not include the cost of `EVP_MD_CTX_new` and `EVP_DigestVerifyInit` (together `ed25519-verify-init`, 2234 cycles on Tiger Lake), and `EVP_PKEY_new_raw_public_key` to 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 16` in the `lib25519-speed` output _divided by 16_.