Commit Graph

3223 Commits

Author SHA1 Message Date
mllwchrry
f5e9804e34 Merge remote-tracking branch 'zkp/master' into temp-merge-1488 2026-02-06 13:02:03 +02:00
merge-script
e34dc81278 Merge BlockstreamResearch/secp256k1-zkp#315: ci: Backport LLVM apt signature fix
040673bd44 ci, docker: Fix LLVM repository signature failure (Hennadii Stepanov)

Pull request description:

  Cherry-pick of bitcoin-core/secp256k1@0ffb1749a5

  Fixes Docker build CI failure caused by Debian's Sequoia PGP policy rejecting SHA-1 signatures from the LLVM apt repository.

ACKs for top commit:
  real-or-random:
    utACK 040673bd44

Tree-SHA512: d524472a3e74abd787007d453e62e2ae28458e37fa2eaf28ee3f1379634e9f34419a5e06fe52d627ea010f634dcbeb6264ff73b60005cb4622b81c69ffd22e28
2026-02-06 11:56:24 +01:00
Hennadii Stepanov
040673bd44 ci, docker: Fix LLVM repository signature failure
The LLVM apt repository uses legacy SHA1 signatures which are now
rejected by the stricter Sequoia PGP policy.

This change extends the 'sha1.second_preimage_resistance' cutoff date to
9999-01-01 in the default Sequoia config. This effectively whitelists
the legacy signature algorithm, preventing "OpenPGP signature
verification failed" errors during `apt-get update`.

See https://github.com/llvm/llvm-project/issues/153385.
2026-02-06 12:01:29 +02:00
mllwchrry
c946b0978a Merge commits 'e3a885d4 d7f6613d 7d0bc087 7712a530 4155e62f 06bff6de 1791f6fc 4b8d5eea bedffd53 ' into temp-merge-1488 2026-02-06 10:42:44 +02:00
Jonas Nick
1cdc3e0fe3 Merge elementsproject/secp256k1-zkp#311: sync-upstream: Extend git usage tips
41cead8a0b sync-upstream: Extend git usage tips (Tim Ruffing)

Pull request description:

ACKs for top commit:
  jonasnick:
    ACK 41cead8a0b

Tree-SHA512: ce484d8235a6079be34257bfe859786d2fa666c2f373db7742030210118b8186f8b975517a24be60ee566682d2cdc217f6f10a36ae9c96c9f592dc3c2f5b4331
2026-02-06 08:36:23 +00:00
merge-script
d176205dd7 Merge BlockstreamResearch/secp256k1-zkp#313: Upstream PR 1518
2cb2e312e9 extrakeys: Migrate to bitcoin-core/secp256k1#1518 secp256k1_ec_pubkey_sort (DarkWindman)
7d2591ce12 Add secp256k1_pubkey_sort (Jonas Nick)

Pull request description:

  Merge bitcoin-core/secp256k1#1518: Add secp256k1_pubkey_sort

  This PR can be recreated with `./contrib/sync-upstream.sh -b master range bb528cf`.
  Tip: Use `git show --remerge-diff` to show the changes manually added to the merge commit.

ACKs for top commit:
  real-or-random:
    ACK 2cb2e312e9

Tree-SHA512: dbdb6c5df2195d2ece9574367e0f684a651ea199806a80232c85b0ffd0ba6b930b108bd97385d9fab656754a85fa6de223a93b945046b043aab20ad7bb3d1bff
2026-02-05 22:59:07 +01:00
merge-script
ca68d08872 Merge BlockstreamResearch/secp256k1-zkp#312: scalar: Add SECP256K1_SCALAR_VERIFY to zkp-specific function
96a415b1c0 scalar: Port bitcoin-core/secp256k1#1393 to zkp-specific code (mllwchrry)

Pull request description:

  Add the `SECP256K1_SCALAR_VERIFY` macro to the zkp-specific `secp256k1_scalar_set_u64` function.

  This was missed when upstream PRs bitcoin-core/secp256k1#1373 and bitcoin-core/secp256k1#1393 were merged.

ACKs for top commit:
  real-or-random:
    ACK 96a415b1c0

Tree-SHA512: 4c3c6209e4c27bec7afc07398c9fc50aef7d44850fbbf5969ff4b57991279960c9645c8daeee5d78bee54dac7fe85bc3d9a01ba4b9deb761d574ae6221ef41c1
2026-02-05 21:44:16 +01:00
DarkWindman
2cb2e312e9 extrakeys: Migrate to bitcoin-core/secp256k1#1518 secp256k1_ec_pubkey_sort 2026-02-05 19:02:49 +02:00
DarkWindman
3291b021bf Merge commits 'bb528cf ' into temp-merge-1518 2026-02-05 18:50:53 +02:00
mllwchrry
96a415b1c0 scalar: Port bitcoin-core/secp256k1#1393 to zkp-specific code 2026-02-05 17:29:53 +02:00
Tim Ruffing
41cead8a0b sync-upstream: Extend git usage tips 2026-02-05 16:01:30 +01:00
merge-script
36a7b87449 Merge BlockstreamResearch/secp256k1-zkp#310: Upstream PRs 1058
4c341f89ab Add changelog entry for SDMC (Pieter Wuille)
a043940253 Permit COMB_BITS < 256 for exhaustive tests (Pieter Wuille)
39b2f2a321 Add test case for ecmult_gen recoded = {-1,0,1} (Pieter Wuille)
644e86de9a Reintroduce projective blinding (Pieter Wuille)
07810d9abb Reduce side channels from single-bit reads (Peter Dettman)
a0d32b597d Optimization: use Nx32 representation for recoded bits (Peter Dettman)
e03dcc44b5 Make secp256k1_scalar_get_bits support 32-bit reads (Pieter Wuille)
5005abee60 Rename scalar_get_bits -> scalar_get_bits_limb32; return uint32_t (Pieter Wuille)
6247f485b6 Optimization: avoid unnecessary doublings in precomputation (Peter Dettman)
15d0cca2a6 Optimization: first table lookup needs no point addition (Pieter Wuille)
7a33db35cd Optimization: move (2^COMB_BITS-1)/2 term into ctx->scalar_offset (Pieter Wuille)
ed2a056f3d Provide 3 configurations accessible through ./configure (Pieter Wuille)
5f7be9f6a5 Always generate tables for current (blocks,teeth) config (Pieter Wuille)
fde1dfcd8d Signed-digit multi-comb ecmult_gen algorithm (Peter Dettman)
486518b350 Make exhaustive tests's scalar_inverse(&x,&x) work (Pieter Wuille)
ab45c3e089 Initial gej blinding -> final ge blinding (Pieter Wuille)
aa00a6b892 Introduce CEIL_DIV macro and use it (Tim Ruffing)

Pull request description:

  [bitcoin-core/secp256k1#1058]: Signed-digit multi-comb ecmult_gen algorithm

  This PR can be recreated with `./contrib/sync-upstream.sh -b master range da51507`.
  Tip: Use `git show --remerge-diff` to show the changes manually added to the merge commit.

ACKs for top commit:
  mllwchrry:
    ACK 9a57e3c
  real-or-random:
    ACK 9a57e3c650

Tree-SHA512: 6de5961697ed1f23ce60a6437b622cdf1289273cf9e22f7abfeced08c1f279e30b1a807148f3405c723ad5d3c712eecf0499f994dfce8a1c687b4521b0ef60dd
2026-02-05 15:47:28 +01:00
Jonas Nick
9a57e3c650 Merge commits 'da515074 ' into temp-merge-1058 2026-01-30 21:18:06 +00:00
merge-script
7e460db4ca Merge BlockstreamResearch/secp256k1-zkp#307: Upstream PRs 1484, 1483, 1486, 1496, 1489, 1490, 1507, 1512, 1515
f9cf003d9b scalar: Port bitcoin-core/secp256k1#1512 to zkp-specific code (mllwchrry)
a85e2233e7 ci: Note affected clangs in comment on ASLR quirk (Tim Ruffing)
f7f0184ba1 msan: notate more variable assignments from assembly code (Cory Fields)
a61339149f change inconsistent array param to pointer (Cory Fields)
a5e8ab2484 ci: Add sanitizer env variables to debug output (Tim Ruffing)
84a93de4d2 ci: Add workaround for ASLR bug in sanitizers (Tim Ruffing)
2028069df2 doc: clarify input requirements for secp256k1_fe_mul (Sebastian Falbesoner)
11420a7a28 tests: improve fe_sqr test (Sebastian Falbesoner)
e7bdddd9c9 refactor: rename `check_fe_equal` -> `fe_equal` (Sebastian Falbesoner)
00111c9c56 tests: add missing fe comparison checks for inverse field test cases (Sebastian Falbesoner)
31ba404944 msan: notate variable assignments from assembly code (Cory Fields)
e7ea32e30a msan: Add SECP256K1_CHECKMEM_MSAN_DEFINE which applies to memory sanitizer and not valgrind (Cory Fields)
94a14d5290 ci: Update cache action (Hennadii Stepanov)
3777e3f36a cmake: Recommend native CMake commands in README (Tim Ruffing)
51df2d9ab3 tests: Drop redundant _scalar_check_overflow calls (Tim Ruffing)

Pull request description:

  Merge bitcoin-core/secp256k1#1484: tests: Drop redundant _scalar_check_overflow calls
  Merge bitcoin-core/secp256k1#1483: cmake: Recommend native CMake commands in README
  Merge bitcoin-core/secp256k1#1486: ci: Update cache action
  Merge bitcoin-core/secp256k1#1496: msan: notate variable assignments from assembly code
  Merge bitcoin-core/secp256k1#1489: tests: add missing fe comparison checks for inverse field test cases
  Merge bitcoin-core/secp256k1#1490: tests: improve fe_sqr test (issue #1472)
  Merge bitcoin-core/secp256k1#1507: ci: Add workaround for ASLR bug in sanitizers
  Merge bitcoin-core/secp256k1#1512: msan: notate more variable assignments from assembly code
  Merge bitcoin-core/secp256k1#1515: ci: Note affected clangs in comment on ASLR quirk

  This PR can be recreated with `./contrib/sync-upstream.sh -b master range d831168`.
  Tip: Use `git show --remerge-diff` to show the changes manually added to the merge commit.

ACKs for top commit:
  real-or-random:
    ACK f9cf003d9b

Tree-SHA512: c1720b50abb452ebea28f48239411863ac5ab2a7dcc2f34b8ebf05eb11b2657d35ea63a261624d33a82b89eb93db41eea166d5565b3e5d080a0181370d3d9b72
2026-01-29 16:26:31 +01:00
mllwchrry
f9cf003d9b scalar: Port bitcoin-core/secp256k1#1512 to zkp-specific code 2026-01-29 12:51:33 +02:00
merge-script
c7a52400d6 Merge bitcoin-core/secp256k1#1809: release cleanup: bump version after 0.7.1
ae7eb729c0 release cleanup: bump version after 0.7.1 (Jonas Nick)

Pull request description:

ACKs for top commit:
  real-or-random:
    ACK ae7eb729c0
  sipa:
    ACK ae7eb729c0

Tree-SHA512: 7319e1aa8fbdc53f95b9673fe6cf8fb2cbdf48b47c5576344ff3cc73fcf7f7f6594f26d020f418943f15008a0780bb582fa46f027991a41d0bd75eb004384ee0
2026-01-26 17:44:15 -05:00
Jonas Nick
ae7eb729c0 release cleanup: bump version after 0.7.1 2026-01-26 20:57:38 +00:00
merge-script
1a53f4961f Merge bitcoin-core/secp256k1#1808: Prepare for 0.7.1
20a209f11c release: prepare for 0.7.1 (Jonas Nick)
c4b6a81a60 changelog: update in preparation for the v0.7.1 release (Jonas Nick)

Pull request description:

ACKs for top commit:
  sipa:
    ACK 20a209f11c
  real-or-random:
    ACK 20a209f11c

Tree-SHA512: 4d65218c9cc0cb0d968a972c2d199b2eaee12879a9a98dbea9476c10ae0d24f531dbb839989dfdcc01b3e3420c9a6e14a1fa9e2724c788bfafd33174675598e3
2026-01-26 14:41:38 -05:00
Jonas Nick
20a209f11c release: prepare for 0.7.1 2026-01-26 16:39:20 +00:00
Jonas Nick
c4b6a81a60 changelog: update in preparation for the v0.7.1 release 2026-01-26 16:26:39 +00:00
mllwchrry
8c72644a0e Merge commits '5ad3aa3 2483627 0653a25 d926510 cdc9a62 427e86b 05bfab6 4b77fec d831168 ' into temp-merge-1515 2026-01-23 19:51:09 +02:00
merge-script
ebb35882da Merge bitcoin-core/secp256k1#1796: bench: fail early if user inputs invalid value for SECP256K1_BENCH_ITERS
c09215f7af bench: fail early if user inputs invalid value for SECP256K1_BENCH_ITERS (kevkevinpal)

Pull request description:

  ### Description
  Motivated by https://github.com/bitcoin-core/secp256k1/pull/1793#issuecomment-3719488071

  In this change, the `get_iters` function was updated to print an error message and then return 0.

  In the functions that use `get_iters` they print the help text and then EXIT_FAILURE

  ### Before
  ```
  secp256k1 $ SECP256K1_BENCH_ITERS=abc ./build/bin/bench

  Benchmark                     ,    Min(us)    ,    Avg(us)    ,    Max(us)

  Floating point exception (core dumped)
  ```
  ### After
  ```
  secp256k1 $ SECP256K1_BENCH_ITERS=abc ./build/bin/bench

  Invalid value for SECP256K1_BENCH_ITERS must be a positive integer: abc

  Benchmarks the following algorithms:
      - ECDSA signing/verification
      - ECDH key exchange (optional module)
      - Schnorr signatures (optional module)
      - ElligatorSwift (optional module)

  The default number of iterations for each benchmark is 20000. This can be
  customized using the SECP256K1_BENCH_ITERS environment variable.

  Usage: ./bench [args]
  By default, all benchmarks will be run.
  args:
      help              : display this help and exit
      ecdsa             : all ECDSA algorithms--sign, verify, recovery (if enabled)
      ecdsa_sign        : ECDSA siging algorithm
      ecdsa_verify      : ECDSA verification algorithm
      ec                : all EC public key algorithms (keygen)
      ec_keygen         : EC public key generation
      ecdh              : ECDH key exchange algorithm
      schnorrsig        : all Schnorr signature algorithms (sign, verify)
      schnorrsig_sign   : Schnorr sigining algorithm
      schnorrsig_verify : Schnorr verification algorithm
      ellswift          : all ElligatorSwift benchmarks (encode, decode, keygen, ecdh)
      ellswift_encode   : ElligatorSwift encoding
      ellswift_decode   : ElligatorSwift decoding
      ellswift_keygen   : ElligatorSwift key generation
      ellswift_ecdh     : ECDH on ElligatorSwift keys
  ```

ACKs for top commit:
  hebasto:
    re-ACK c09215f7af.
  real-or-random:
    utACK c09215f7af

Tree-SHA512: 356df69e356db0b201339d40a6ffbcf29e4b7cc1e6aa82c00e1e7a2a7d11c47dd9c51baabcc63cabcff2ab42e2746a3cab659205f871a85122edda4a599d56c8
2026-01-23 15:38:38 +01:00
kevkevinpal
c09215f7af bench: fail early if user inputs invalid value for SECP256K1_BENCH_ITERS
In this change the get_iters function was updated to print an error
message and then return 0. In the functions that use get_iters they
print the help text and then EXIT_FAILURE
2026-01-23 08:07:22 -05:00
Jonas Nick
797e2ed61a Merge elementsproject/secp256k1-zkp#306: sync-upstream: improve help text
db8750de46 sync-upstream: improve help text (Jonas Nick)

Pull request description:

ACKs for top commit:
  real-or-random:
    utACK db8750de46

Tree-SHA512: 06f28c5ebd74437c3c2ef5ae460bec66ff9f15c4bae3b76c74b1323e2ef24d8ec456b72d58df9d68a3d41fcd44d6dfbefe8115900ccb10b8f028a7b0952b6df1
2026-01-22 11:07:36 +00:00
Jonas Nick
db8750de46 sync-upstream: improve help text 2026-01-22 09:09:27 +00:00
merge-script
471e3a130d Merge bitcoin-core/secp256k1#1800: sage: verify Eisenstein integer connection for GLV constants
29ac4d8491 sage: verify Eisenstein integer connection for GLV constants (Justsomebuddy)

Pull request description:

  ## Summary

  Add assertions to `gen_split_lambda_constants.sage` to verify that the GLV decomposition constants arise from the Eisenstein integer factorization of the group order N.

  Specifically:
  - `N = a^2 + a*b + b^2` (norm equation in Z[ω])
  - `λ = b/a mod N` (eigenvalue from Z[ω]/(π) ≅ Z/NZ isomorphism)

  This addresses the suggestion in #1798 to document/verify the algebraic origin of these constants in the sage script rather than C comments.

  ## Details

  The group order N factors as N = π·π̄ in the Eisenstein integers Z[ω], where:
  - ω = (-1 + √-3)/2 is a primitive cube root of unity
  - π = a - b·ω is an Eisenstein prime with norm N(π) = a² + ab + b²

  The GLV constants (A1, B1) correspond to the Eisenstein factors (b, -a), and the endomorphism eigenvalue λ arises naturally as the image of ω under the quotient map Z[ω] → Z[ω]/(π) ≅ Z/NZ.

  Closes #1798

ACKs for top commit:
  real-or-random:
    utACK 29ac4d8491

Tree-SHA512: 6c36dacac00baf513db447a14f49c91d434c80ed79f9282d080938e3e53d39f0b68d07d62900da648d817eba3777505e9ef9306bc129f4521f524b4c64bcda49
2026-01-21 11:14:45 +01:00
Justsomebuddy
29ac4d8491 sage: verify Eisenstein integer connection for GLV constants
Add assertions to verify that the GLV decomposition constants arise
from the Eisenstein integer factorization of the group order N.

The group order factors as N = pi * conj(pi) in Z[w], where pi = A - B*w
is an Eisenstein prime. The GLV eigenvalue LAMBDA = B/A mod N, which is
the image of w^2 under the isomorphism Z[w]/(pi) -> Z/NZ.
2026-01-14 15:48:50 +00:00
Jonas Nick
4721e077b4 Merge bitcoin-core/secp256k1#1793: doc/bench: added help text for SECP256K1_BENCH_ITERS env var for bench_ecmult
bd5ced1fe1 doc/bench: added help text for SECP256K1_BENCH_ITERS env var for bench_ecmult (kevkevinpal)

Pull request description:

ACKs for top commit:
  real-or-random:
    utACK bd5ced1fe1
  hebasto:
    ACK bd5ced1fe1, I have reviewed the code and it looks OK. Tested on Ubuntu 25.10.
  jonasnick:
    ACK bd5ced1fe1

Tree-SHA512: 7cfc1a8915717bdfe2901f20f578e23368ece9937a40f36805a0a5b741f97a0502a085c973f6912b96c2bca921ef1654908cfe2c90c0601a7ffa92de4415dc62
2026-01-11 20:45:00 +00:00
kevkevinpal
bd5ced1fe1 doc/bench: added help text for SECP256K1_BENCH_ITERS env var for bench_ecmult
In addition a print message saying some tests were skipped was added
2026-01-07 13:02:06 -05:00
merge-script
2d9137ce9d Merge bitcoin-core/secp256k1#1764: group: Avoid using infinity field directly in other modules
2f73e5281d group: Avoid using infinity field directly in other modules (Tim Ruffing)

Pull request description:

  Minor refactoring to make the abstraction cleaner

ACKs for top commit:
  hebasto:
    ACK 2f73e5281d, I have reviewed the code and it looks OK.
  theStack:
    ACK 2f73e5281d

Tree-SHA512: eae5ad1ce81f491adb48ab1cbf04211f8d43e41255abcacc958fa3dcb1de5021707d56ed1b009a6f3f6c45cd8f20c1f2677891690a3c0a467fc7e064af2512a8
2026-01-06 10:12:53 +01:00
merge-script
f9a944ff2d Merge bitcoin-core/secp256k1#1790: doc: include arg -DSECP256K1_USE_EXTERNAL_DEFAULT_CALLBACKS=ON for cmake
0406cfc4d1 doc: include arg -DUSE_EXTERNAL_DEFAULT_CALLBACKS=1 for cmake (kevkevinpal)

Pull request description:

  ### Motivation
  This is motivated by this comment https://github.com/bitcoin-core/secp256k1/pull/1778#pullrequestreview-3578687144

  ### Rationale
  It makes sense to add documentation on how to configure for CMake. I can reword if other wording is preferred

ACKs for top commit:
  hebasto:
    ACK 0406cfc4d1.
  real-or-random:
    ACK 0406cfc4d1

Tree-SHA512: 06b8cc84fc2c080045eb1c16af6b236b5d7472696d2488821c64a07b55a12c32e77c65c001a7223e92edeb6150bf15b7a7367dd254307c7cb91debdb924574f0
2025-12-19 20:50:54 +01:00
kevkevinpal
0406cfc4d1 doc: include arg -DUSE_EXTERNAL_DEFAULT_CALLBACKS=1 for cmake 2025-12-19 09:51:39 -05:00
merge-script
8d445730ec Merge bitcoin-core/secp256k1#1783: Add VERIFY_CHECKs and documentation that flags must be 0 or 1
ae00c552df Add VERIFY_CHECKs that flags are 0 or 1 (John Moffett)

Pull request description:

  Flags for constant-time masking rely on the values being exactly `0` or `1` rather than `0` or true (any nonzero). One function, `secp256k1_fe_cmov` [documents](e7f7083b53/src/field.h (L315)) and [`VERIFY_CHECK`s](e7f7083b53/src/field_impl.h (L365)) this, but most don't.

  This updates the documentation and adds `VERIFY_CHECK`s enforcing `flag == 0 || flag == 1` for:

  `secp256k1_fe_storage_cmov`
  `secp256k1_gej_cmov`
  `secp256k1_ge_storage_cmov`
  `secp256k1_scalar_cadd_bit`
  `secp256k1_scalar_cond_negate`
  `secp256k1_scalar_cmov`
  `secp256k1_int_cmov`

ACKs for top commit:
  furszy:
    ACK ae00c55
  hebasto:
    re-ACK ae00c552df.

Tree-SHA512: c9d358929d39d93b0aea602d318429f7e82af96bf601f048a1cdeb0621b8adc6d1204648d352aa2060cb0f63db6dcf0da863854375ed313cea44dfad61c19a18
2025-12-15 20:43:58 +01:00
merge-script
aa2a39c1a7 Merge bitcoin-core/secp256k1#1778: doc/bench: Added cmake build options to bench error messages
3b5b03f301 doc/bench: Added cmake build options to bench error messages (kevkevinpal)

Pull request description:

  ## Motivation
  I wanted to try and run the benchmarking scripts and I noticed the recovery benchmark in `bench.c`. I wanted to run but I was using `cmake` and the error message telling me to use `./configure -enable-module-recovery` wasn't sufficient.

  I figure rather than forcing users to look into the `CMakeLists.txt` file or anywhere else we should add this to the output

  ## Solution
  I appended to the message to include the `-DSECP256K1_ENABLE_MODULE_...=ON` in the message.

ACKs for top commit:
  real-or-random:
    utACK 3b5b03f301
  hebasto:
    ACK 3b5b03f301, I have reviewed the code and it looks OK.

Tree-SHA512: 3a6c966b65ab3f0d6dda81e5dd95529087db3f2901f2686af68c16079ec5b323568f3c9acb155d92a6d50b4102faf0844d0d87216df001adbf69cab4ce86dabc
2025-12-15 20:42:15 +01:00
merge-script
540fec8ae9 Merge bitcoin-core/secp256k1#1788: test: split monolithic ellswift test into independent cases
d822b29021 test: split monolithic ellswift test into independent cases (furszy)

Pull request description:

  No behavior changes.

  Refactors the previously monolithic ElligatorSwift test into isolated,
  independent test cases. Doing so allows the test suite to execute
  these cases in parallel rather than sequentially.

  Overall, I'm seeing 35-40% tests time reduction locally.

  This is quite useful for Debug builds with no optimizations,
  which are noticeably slow.

  ####  Local Debug-build Results (7 jobs):

  - master: 138.0 seconds.
  - this PR: 89.3 seconds.
     (~1.55× speedup, ~35% reduction)

  ####  Local Release-build Results (7 jobs):

  - master: 9.5 seconds.
  - this PR: 5.9 seconds.
     (~1.61× speedup, ~38% reduction)

  ####  rp5 Release-build results (5 jobs):
  - master: 39 seconds.
  - this PR: 24 seconds.
    (~1.62× speedup, ~38% reduction)

ACKs for top commit:
  hebasto:
    re-ACK d822b29021.
  theStack:
    ACK d822b29021

Tree-SHA512: b3d93f183c5eb5856a146c38719a8ca7ac42ac2a521b3cae3da6950881eb1745a047df9790db2b60dd56501c5ba40fc78e89d0c9b4db777f32520ed3c27ab9d1
2025-12-15 20:39:16 +01:00
furszy
d822b29021 test: split monolithic ellswift test into independent cases
No behavior changes.

Refactors the previously monolithic ElligatorSwift test into isolated,
independent test cases. Doing so allows the test suite to execute
these cases in parallel rather than sequentially.

Overall, seen 35-40% tests time reduction locally.

This is quite useful for the Debug build with no optimizations,
which is noticeably slow.

#### Local Debug-build Results (7 jobs):

- master: 138.0 seconds.
- this PR: 89.3 seconds.
   (~1.55× speedup, ~35% reduction)

#### Local Release-build Results (7 jobs):

- master: 9.5 seconds.
- this PR: 5.9 seconds.
   (~1.61× speedup, ~38% reduction)
2025-12-15 09:28:28 -05:00
John Moffett
ae00c552df Add VERIFY_CHECKs that flags are 0 or 1
Flags for constant-time masking rely
on the values being exactly 0 or 1 rather
than 0 or true. Add VERIFY_CHECKs to enforce
in VERIFY builds as a preventative
measure and add documentation where relevant.
2025-12-15 09:07:42 -05:00
merge-script
5c75183344 Merge bitcoin-core/secp256k1#1784: refactor: remove ret from secp256k1_ec_pubkey_serialize
3daab83a60 refactor: remove ret from secp256k1_ec_pubkey_serialize (kevkevinpal)

Pull request description:

  This is a follow-up to https://github.com/bitcoin-core/secp256k1/pull/1774#discussion_r2539737079

  It is pretty straightforward to remove `ret` and to just return either `0` or `1`

ACKs for top commit:
  real-or-random:
    utACK 3daab83a60
  theStack:
    ACK 3daab83a60

Tree-SHA512: ce598d917455a2d25297436bf2b900a9e88a638617cb79ca22e467135035c334b6815911fe4429ff44dbd877e6d10a346d0b37f2e5a7459e5b35854023832d27
2025-12-10 16:13:24 +01:00
merge-script
be5e4f02fd Merge bitcoin-core/secp256k1#1779: Add ARG_CHECKs to ensure "array of pointers" elements are non-NULL
8bcda186d2 test: Add non-NULL checks for "pointer of array" API functions (Sebastian Falbesoner)
5a08c1bcdc Add ARG_CHECKs to ensure "array of pointers" elements are non-NULL (Sebastian Falbesoner)

Pull request description:

  We currently have five public API functions that take an "array of pointers" as input parameter:
  * `secp256k1_ec_pubkey_combine` (`ins`: array of pointers to public keys to add)
  * `secp256k1_ec_pubkey_sort` (`pubkeys`: array of pointers to public keys to sort)
  * `secp256k1_musig_pubkey_agg` (`pubkeys`: array of pointers to public keys to aggregate)
  * `secp256k1_musig_nonce_agg` (`pubnonces`: array of pointers to public nonces to aggregate)
  * `secp256k1_musig_partial_sig_agg` (`partial_sigs`: array of pointers to partial signatures to aggregate)

  Out of these, only `_ec_pubkey_combine` verifies that the individual pointer elements in the array are non-NULL each:
  e7f7083b53/src/secp256k1.c (L774-L775)

  This PR adds corresponding `ARG_CHECKS` for the other API functions as well, in order to avoid running into potential UB due to NULL pointer dereference. It seems to me that the tiny run-time overhead is worth it doing this for consistency and to help users in case the arrays are set up incorrectly (I'm thinking e.g. of language binding writers where getting this right might be a bit more involved).

  Looking into this was motivated by a [review of furszy](https://github.com/bitcoin-core/secp256k1/pull/1765#discussion_r2590644412) (thanks!), who pointed out that the non-NULL checks are missing in at least one API function in the silentpayments module PR as well. Happy to add some `CHECK_ILLEGAL` tests if there is conceptual support for this PR.

ACKs for top commit:
  kevkevinpal:
    utACK [8bcda18](8bcda186d2)
  john-moffett:
    utACK 8bcda186d2
  real-or-random:
    utACK 8bcda186d2
  w0xlt:
    ACK 8bcda186d2

Tree-SHA512: 24acd6606526e3acb994e3361fde15771aa6706a6f3e7a6ae70b9a9ddb81ac1eedaac2025a027b890cecf98dab20dc378b94edde6c726888c44b9d35b7581ee1
2025-12-10 09:27:47 +01:00
kevkevinpal
3daab83a60 refactor: remove ret from secp256k1_ec_pubkey_serialize 2025-12-09 16:08:35 -05:00
Sebastian Falbesoner
8bcda186d2 test: Add non-NULL checks for "pointer of array" API functions 2025-12-09 01:38:48 +01:00
Sebastian Falbesoner
5a08c1bcdc Add ARG_CHECKs to ensure "array of pointers" elements are non-NULL 2025-12-06 01:13:58 +01:00
kevkevinpal
3b5b03f301 doc/bench: Added cmake build options to bench error messages 2025-12-05 09:25:23 -05:00
merge-script
e7f7083b53 Merge bitcoin-core/secp256k1#1774: refactor: split up internal pubkey serialization function into compressed/uncompressed variants
f5e815f430 remove secp256k1_eckey_pubkey_serialize function (Sebastian Falbesoner)
0d3659c547 use new `_eckey_pubkey_serialize{33,65}` functions in modules (ellswift,musig) (Sebastian Falbesoner)
adb76f82ea use new `_eckey_pubkey_serialize{33,65}` functions in public API (Sebastian Falbesoner)
fc7458ca3e introduce `secp256k1_eckey_pubkey_serialize{33,65}` functions (Sebastian Falbesoner)

Pull request description:

  This PR splits up the pubkey serialization function `secp256k1_eckey_pubkey_serialize` into two variants for the compressed (33 bytes) and uncompressed (65 bytes) public key output format each, where only non-infinity group elements as input are allowed. The motivation is to simplify call-sites significantly, as they currently need to introduce two variables and a VERIFY_CHECKs on the return value and the in/out size parameter within a pre-processor block, typically leading to 8 lines of code. By using the new functions, the code is reduced to a single line of code that just calls the function (see #1773). This is helpful for already existing modules on master (ellswift, musig) and upcoming ones (silentpayments, see #1765).

  One drawback is that the public API function `secp256k1_ec_pubkey_serialize` is now slightly more complex (we now call one of two functions instead of a single one, depending on whether the compressed flag is set or not), but that should hopefully not be a problem.

  The commits are intentionally kept small to ease review, happy to squash them if that is preferred.

  (Kudos to w0xlt for the initial idea (https://github.com/bitcoin-core/secp256k1/pull/1765#pullrequestreview-3462461331) and to real-or-random for the suggestion to split the already existing function (https://github.com/bitcoin-core/secp256k1/issues/1773#issuecomment-3540461718).)

ACKs for top commit:
  real-or-random:
    utACK f5e815f430
  w0xlt:
    ACK f5e815f430

Tree-SHA512: da576bbeae477f31ba76c0001f8df08b51fe5e31d67b422a238348ead3341bf37f0c1509ad9d0a93b63e6d61c152707c85beabd02f4eac3b3bdcff129e0ea750
2025-11-27 17:27:08 +01:00
merge-script
b6c2a3cd77 Merge bitcoin-core/secp256k1#1761: ecmult_multi: reduce strauss memory usage by 30%
26166c4f5f ecmult_multi: reduce strauss memory usage by 30% (Jonas Nick)

Pull request description:

  This is a draft because I'm not sure about the cleanest way to implement it.

ACKs for top commit:
  real-or-random:
    ACK 26166c4f5f benchmarks show no significant difference (only tried low point counts)
  siv2r:
    tACK 26166c4
  hebasto:
    ACK 26166c4f5f, I have reviewed the code and it looks OK.

Tree-SHA512: f289daee0b0b51451331eefdd99200a78bd83539365d38465c038dc0e6ad940daf821119f7161b08a2390cf046e3859a8f950f2fe881a427aba16353031def7d
2025-11-18 09:36:40 +01:00
Sebastian Falbesoner
f5e815f430 remove secp256k1_eckey_pubkey_serialize function 2025-11-17 18:35:32 +01:00
Sebastian Falbesoner
0d3659c547 use new _eckey_pubkey_serialize{33,65} functions in modules (ellswift,musig) 2025-11-17 18:13:56 +01:00
Sebastian Falbesoner
adb76f82ea use new _eckey_pubkey_serialize{33,65} functions in public API 2025-11-17 17:19:57 +01:00
Sebastian Falbesoner
fc7458ca3e introduce secp256k1_eckey_pubkey_serialize{33,65} functions 2025-11-17 17:12:20 +01:00
merge-script
c8206b1ce6 Merge bitcoin-core/secp256k1#1771: ci: Use Python virtual environment in "x86_64-macos-native" job
f252da7e6e ci: Use Python virtual environment in "x86_64-macos-native" job (Hennadii Stepanov)

Pull request description:

  Fixes https://github.com/bitcoin-core/secp256k1/issues/1768.

  This PR explicitly sets up a virtual environment instead of using `uv`, as suggested [here](https://github.com/bitcoin-core/secp256k1/issues/1768#issue-3599176194), for the following reasons:
  1. It does not require granting a third-party action access to the repository.
  2. This approach is already used in other parts of the CI framework (it’s unclear why it was missed in https://github.com/bitcoin-core/secp256k1/pull/1359 in the first place).

ACKs for top commit:
  real-or-random:
    ACK f252da7e6e

Tree-SHA512: df167db9b69ea4a055565c64ea0daa8c0d7b6a12510c35c22309f00a192a8cc4fbbdb0920bacd25547ea8c8f6a7853c2603be35234bd2bac88f610ea848f6120
2025-11-07 20:21:41 +01:00