merge-script 7a5f153d71 Merge BlockstreamResearch/secp256k1-zkp#333: Upstream PRs 1794, 1775, 1814, 1816, 1813, 1804, 1818, 1817, 1815, 1819, 1823, 1821, 1760, 1828, 1829, 1825, 1832, 1811
48cbd78dfc modules: Port bitcoin-core/secp256k1#1825 to zkp-specific code (mllwchrry)
126501f58b modules: Port bitcoin-core/secp256k1#1815 to zkp-specific code (mllwchrry)
c49c9be504 bench: Update help functions in bench and bench_internal (kevkevinpal)
8d0eda07e9 testrand: Remove testrand_finish (Tim Ruffing)
f48b1bfa5d hash: add midstate initializer and use it for tagged hashes (w0xlt)
79e9f25237 ci: Fix leftover use of old ECMULTGENPRECISION (Tim Ruffing)
76e92cfeea Revert "ci, docker: Fix LLVM repository signature failure" (Hennadii Stepanov)
8354618e02 cmake: Set `LABELS` property for tests (Hennadii Stepanov)
29f26ec3cf cmake: Integrate DiscoverTests and normalize test names (Hennadii Stepanov)
f95b263f23 cmake: Add DiscoverTests module (Hennadii Stepanov)
4ac651144b cmake, refactor: Deduplicate test-related code (Hennadii Stepanov)
b99a94c382 Add tests for bad scalar inputs in ellswift XDH (gzJx0DuTRHytnHe7P5RmMbPf3wKy2BztweVGXTf)
307b49f1b9 ellswift: fix overflow flag handling in secp256k1_ellswift_xdh (gzJx0DuTRHytnHe7P5RmMbPf3wKy2BztweVGXTf)
ed02466d3f ci: Load Docker image by ID from builder step (Hennadii Stepanov)
f47bbc07f0 test: add unit tests for secp256k1_scalar_check_overflow (Rohit Yadav)
97b3c47849 refactor: remove unnecessary `malloc` result casts (Sebastian Falbesoner)
3ae72e7867 ci: Disable Docker build summary generation (Hennadii Stepanov)
4fb7ccf5d4 ci: Enforce base-10 evaluation (Hennadii Stepanov)
1bc74a22f8 test: show both Autotools and CMake usage for ctime_tests (8144225309)
86cae58d2f build: Add `-Wleading-whitespace=spaces` compiler flag (Hennadii Stepanov)
fb229e7602 build: Add `-Wtrailing-whitespace=any` compiler flag (Hennadii Stepanov)
13e3bee504 refactor: Remove trailing whitespace (Hennadii Stepanov)
2ccff6eb73 ci: Add weekly schedule (Hennadii Stepanov)
2f18567d24 ci: Rotate Docker cache keys every 4 weeks (Hennadii Stepanov)
0ffb1749a5 ci, docker: Fix LLVM repository signature failure (Hennadii Stepanov)
0267b65512 release process: mention the `[Unreleased]` link clearly (Jonas Nick)
748c0fdd67 Add CMake build directory patterns to `.gitignore` (Hennadii Stepanov)
7eb86bdb01 autotools: Rename `build-aux` to `autotools-aux` (Hennadii Stepanov)
47eb70959a ecmult: Use size_t for array indices in _odd_multiplies_table (Tim Ruffing)
bb1d199de5 ecmult: Use size_t for array indices into tables (Tim Ruffing)

Pull request description:

  Merge bitcoin-core/secp256k1#1794: ecmult: Use size_t for array indices
  Merge bitcoin-core/secp256k1#1775: Add CMake build directory patterns to `.gitignore`
  Merge bitcoin-core/secp256k1#1814: release process: mention the `[Unreleased]` link clearly
  Merge bitcoin-core/secp256k1#1816: ci: Rotate Docker cache keys
  Merge bitcoin-core/secp256k1#1813: Remove trailing spaces and introduce `-Wtrailing-whitespace=any` compiler flag
  Merge bitcoin-core/secp256k1#1804: test: show both CMake and Autotools usage for ctime_tests
  Merge bitcoin-core/secp256k1#1818: ci: Enforce base-10 evaluation
  Merge bitcoin-core/secp256k1#1817: ci: Disable Docker build summary generation
  Merge bitcoin-core/secp256k1#1815: refactor: remove unnecessary `malloc` result casts
  Merge bitcoin-core/secp256k1#1819: tests: Improve secp256k1_scalar_check_overflow tests (Issue #1812)
  Merge bitcoin-core/secp256k1#1823: ci: Load Docker image by ID from builder step
  Merge bitcoin-core/secp256k1#1821: ellswift: fix overflow flag handling in secp256k1_ellswift_xdh
  Merge bitcoin-core/secp256k1#1760: cmake: Add dynamic test discovery to improve parallelism
  Merge bitcoin-core/secp256k1#1828: Revert "ci, docker: Fix LLVM repository signature failure"
  Merge bitcoin-core/secp256k1#1829: ci: Fix leftover use of old ECMULTGENPRECISION
  Merge bitcoin-core/secp256k1#1825: hash: remove redundant `secp256k1_sha256_initialize` in tagged hash midstate functions
  Merge bitcoin-core/secp256k1#1832: testrand: Remove testrand_finish
  Merge bitcoin-core/secp256k1#1811: bench: Update help functions in bench and bench_internal

  This PR can be recreated with `./contrib/sync-upstream.sh -b master range c0a2aba0`.

  Tips:
   * Use `git show --remerge-diff <pr-branch>` to show the conflict resolution in the merge commit.
   * Use `git read-tree --reset -u <pr-branch>` to replay these resolutions during the conflict resolution stage when recreating the PR branch locally.
     Be aware that this may discard your index as well as the uncommitted changes and untracked files in your worktree.

ACKs for top commit:
  real-or-random:
    ACK 48cbd78dfc

Tree-SHA512: 1ea96bf3b7458c02bb472ca7423eb21defe6640ea58a993ac24603d6a8d44ac9bbeab7e2ca5f993918fa1388b9e69b308dcc67277afffd55cb833ecf07051c75
2026-03-04 12:09:01 +01:00
2026-01-13 16:19:05 +00:00
2013-05-09 15:24:32 +02:00

libsecp256k1-zkp

Dependencies: None

A fork of libsecp256k1 with support for advanced and experimental features

Added features:

  • Experimental module for ECDSA adaptor signatures.
  • Experimental module for ECDSA sign-to-contract.
  • Experimental module for Confidential Assets (Pedersen commitments, range proofs, and surjection proofs).
  • Experimental module for Bulletproofs++ range proofs.
  • Experimental module for address whitelisting.

Experimental features are made available for testing and review by the community. The APIs of these features should not be considered stable.

Build steps

Obtaining and verifying

The git tag for each release (e.g. v0.6.0) is GPG-signed by one of the maintainers. For a fully verified build of this project, it is recommended to obtain this repository via git, obtain the GPG keys of the signing maintainer(s), and then verify the release tag's signature using git.

This can be done with the following steps:

  1. Obtain the GPG keys listed in SECURITY.md.
  2. If possible, cross-reference these key IDs with another source controlled by its owner (e.g. social media, personal website). This is to mitigate the unlikely case that incorrect content is being presented by this repository.
  3. Clone the repository:
    git clone https://github.com/bitcoin-core/secp256k1
    
  4. Check out the latest release tag, e.g.
    git checkout v0.6.0
    
  5. Use git to verify the GPG signature:
    % git tag -v v0.6.0 | grep -C 3 'Good signature'
    
    gpg: Signature made Mon 04 Nov 2024 12:14:44 PM EST
    gpg:                using RSA key 4BBB845A6F5A65A69DFAEC234861DBF262123605
    gpg: Good signature from "Jonas Nick <jonas@n-ck.net>" [unknown]
    gpg:                 aka "Jonas Nick <jonasd.nick@gmail.com>" [unknown]
    gpg: WARNING: This key is not certified with a trusted signature!
    gpg:          There is no indication that the signature belongs to the owner.
    Primary key fingerprint: 36C7 1A37 C9D9 88BD E825  08D9 B1A7 0E4F 8DCD 0366
         Subkey fingerprint: 4BBB 845A 6F5A 65A6 9DFA  EC23 4861 DBF2 6212 3605
    

Building with Autotools

$ ./autogen.sh       # Generate a ./configure script
$ ./configure        # Generate a build system
$ make               # Run the actual build process
$ make check         # Run the test suite
$ sudo make install  # Install the library into the system (optional)

To compile optional modules (such as Schnorr signatures), you need to run ./configure with additional flags (such as --enable-module-schnorrsig). Run ./configure --help to see the full list of available flags. For experimental modules, you will also need --enable-experimental as well as a flag for each individual module, e.g. --enable-module-rangeproof.

Building with CMake

To maintain a pristine source tree, CMake encourages to perform an out-of-source build by using a separate dedicated build tree.

Building on POSIX systems

$ cmake -B build              # Generate a build system in subdirectory "build"
$ cmake --build build         # Run the actual build process
$ ctest --test-dir build      # Run the test suite
$ sudo cmake --install build  # Install the library into the system (optional)

To compile optional modules (such as Schnorr signatures), you need to run cmake with additional flags (such as -DSECP256K1_ENABLE_MODULE_SCHNORRSIG=ON). Run cmake -B build -LH or ccmake -B build to see the full list of available flags.

Cross compiling

To alleviate issues with cross compiling, preconfigured toolchain files are available in the cmake directory. For example, to cross compile for Windows:

$ cmake -B build -DCMAKE_TOOLCHAIN_FILE=cmake/x86_64-w64-mingw32.toolchain.cmake

To cross compile for Android with NDK (using NDK's toolchain file, and assuming the ANDROID_NDK_ROOT environment variable has been set):

$ cmake -B build -DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK_ROOT}/build/cmake/android.toolchain.cmake" -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=28

Building on Windows

The following example assumes Visual Studio 2022. Using clang-cl is recommended.

In "Developer Command Prompt for VS 2022":

>cmake -B build -T ClangCL
>cmake --build build --config RelWithDebInfo

Usage examples

Usage examples can be found in the examples directory. To compile them you need to configure with --enable-examples.

To compile the examples, make sure the corresponding modules are enabled.

Benchmark

If configured with --enable-benchmark (which is the default), binaries for benchmarking the libsecp256k1-zkp functions will be present in the root directory after the build.

To print the benchmark result to the command line:

$ ./bench_name

To create a CSV file for the benchmark result :

$ ./bench_name | sed '2d;s/ \{1,\}//g' > bench_name.csv

Reporting a vulnerability

See SECURITY.md

Contributing to libsecp256k1

See CONTRIBUTING.md

Description
Experimental fork of libsecp256k1 with support for pedersen commitments and range proofs.
Readme 15 MiB
Languages
C 94.5%
Python 2%
CMake 0.9%
Sage 0.8%
M4 0.7%
Other 1%