elements/src/crypto
Ava Chow b0869648aa
Merge bitcoin/bitcoin#21590: Safegcd-based modular inverses in MuHash3072
f5883286e3 Add a fuzz test for Num3072 multiplication and inversion (Pieter Wuille)
a26ce62894 Safegcd based modular inverse for Num3072 (Pieter Wuille)
91ce8cef2d Add benchmark for MuHash finalization (Pieter Wuille)

Pull request description:

  This implements a safegcd-based modular inverse for MuHash3072. It is a fairly straightforward translation of [the libsecp256k1 implementation](https://github.com/bitcoin-core/secp256k1/pull/831), with the following changes:
  * Generic for 32-bit and 64-bit
  * Specialized for the specific MuHash3072 modulus (2^3072 - 1103717).
  * A bit more C++ish
  * Far fewer sanity checks

  A benchmark is also included for MuHash3072::Finalize. The new implementation is around 100x faster on x86_64 for me (from 5.8 ms to 57 μs); for 32-bit code the factor is likely even larger.

  For more information:
    * [Original paper](https://gcd.cr.yp.to/papers.html) by Daniel J. Bernstein and Bo-Yin Yang
    * [Implementation](https://github.com/bitcoin-core/secp256k1/pull/767) for libsecp256k1 by Peter Dettman; and the [final](https://github.com/bitcoin-core/secp256k1/pull/831) version
    * [Explanation](https://github.com/bitcoin-core/secp256k1/blob/master/doc/safegcd_implementation.md) of the algorithm using Python snippets
    * [Analysis](https://github.com/sipa/safegcd-bounds) of the maximum number of iterations the algorithm needs
     * [Formal proof in Coq](https://medium.com/blockstream/a-formal-proof-of-safegcd-bounds-695e1735a348) by Russell O'Connor (for the 256-bit version of the algorithm; here we use a 3072-bit one).

ACKs for top commit:
  achow101:
    ACK f5883286e3
  TheCharlatan:
    Re-ACK f5883286e3
  dergoegge:
    tACK f5883286e3

Tree-SHA512: 275872c61d30817a82901dee93fc7153afca55c32b72a95b8768f3fd464da1b09b36f952f30e70225e766b580751cfb9b874b2feaeb73ffaa6943c8062aee19a
2025-01-27 16:50:16 -05:00
..
ctaes Update ctaes 2016-12-08 17:09:07 -08:00
aes.cpp scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
aes.h scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
chacha20.cpp refactor: Drop unused UCharCast 2025-01-14 19:01:53 +01:00
chacha20.h crypto: make ChaCha20::SetKey wipe buffer 2023-08-17 15:37:41 -04:00
chacha20poly1305.cpp refactor: Drop unused UCharCast 2025-01-14 19:01:53 +01:00
chacha20poly1305.h refactor: add missing headers for BIP324 ciphersuite 2023-08-15 07:30:48 +05:30
CMakeLists.txt cmake: Build bitcoin_crypto library 2024-08-16 19:27:38 +01:00
common.h refactor: Allow std::byte in Read(LE/BE) 2024-12-18 10:59:25 +01:00
hex_base.cpp util: move HexStr and HexDigit from util to crypto 2024-05-16 17:16:08 +02:00
hex_base.h util: move HexStr and HexDigit from util to crypto 2024-05-16 17:16:08 +02:00
hkdf_sha256_32.cpp scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
hkdf_sha256_32.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
hmac_sha256.cpp Update copyright headers to 2018 2018-07-27 07:15:02 -04:00
hmac_sha256.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
hmac_sha512.cpp Update copyright headers to 2018 2018-07-27 07:15:02 -04:00
hmac_sha512.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
muhash.cpp Safegcd based modular inverse for Num3072 2025-01-09 10:04:36 -05:00
muhash.h Safegcd based modular inverse for Num3072 2025-01-09 10:04:36 -05:00
poly1305.cpp Switch all callers from poly1305_auth to Poly1305 class 2023-07-12 22:43:55 -04:00
poly1305.h Switch all callers from poly1305_auth to Poly1305 class 2023-07-12 22:43:55 -04:00
ripemd160.cpp clang-tidy: Fix modernize-use-default-member-init in headers 2023-01-31 11:50:10 +00:00
ripemd160.h clang-tidy: Fix modernize-use-default-member-init in headers 2023-01-31 11:50:10 +00:00
sha1.cpp clang-tidy: Fix modernize-use-default-member-init in headers 2023-01-31 11:50:10 +00:00
sha1.h clang-tidy: Fix modernize-use-default-member-init in headers 2023-01-31 11:50:10 +00:00
sha3.cpp refactor: Avoid UB in SHA3_256::Write 2025-01-14 19:09:30 +01:00
sha3.h tidy: modernize-use-equals-default 2024-07-08 11:12:01 +02:00
sha256.cpp scripted-diff: drop config/ subdir for bitcoin-config.h, rename to bitcoin-build-config.h 2024-10-10 12:22:12 +02:00
sha256.h Add ability to specify SHA256 implementation for benchmark purposes 2023-09-20 21:11:55 +01:00
sha256_arm_shani.cpp doc: Fix typos 2022-02-17 03:42:08 +09:00
sha256_avx2.cpp scripted-diff: Use platform-agnostic ALWAYS_INLINE macro 2023-05-04 20:58:01 +01:00
sha256_sse4.cpp crypto: disable asan for sha256_sse4 with clang and -O0 2024-05-15 13:50:25 +00:00
sha256_sse41.cpp scripted-diff: Use platform-agnostic ALWAYS_INLINE macro 2023-05-04 20:58:01 +01:00
sha256_x86_shani.cpp crypto: Guard code with ENABLE_SSE41 macro 2024-03-05 11:36:46 +00:00
sha512.cpp clang-tidy: Fix modernize-use-default-member-init in headers 2023-01-31 11:50:10 +00:00
sha512.h clang-tidy: Fix modernize-use-default-member-init in headers 2023-01-31 11:50:10 +00:00
siphash.cpp crypto, hash: replace custom rotl32 with std::rotl 2024-01-05 17:12:38 +01:00
siphash.h refactor: use Span for SipHash::Write 2023-07-17 13:27:46 +02:00