libsecp256k1

Build Status

Optimized C library for cryptographic operations on curve secp256k1.

This library is used for consensus critical cryptographic operations on the eCash network. It is maintained within the Bitcoin ABC repository, and is mirrored as a separate repository for ease of reuse in other eCash projects. Developers who want to contribute may do so at reviews.bitcoinabc.org. Use at your own risk.

This library is intended to be the highest quality publicly available library for cryptography on the secp256k1 curve. However, the primary focus of its development has been for usage in the eCash system and usage unlike Bitcoin’s may be less well tested, verified, or suffer from a less well thought out interface. Correct usage requires some care and consideration that the library is fit for your application’s purpose.

Features:

Experimental features have not received enough scrutiny to satisfy the standard of quality of this library but are made available for testing and review by the community. The APIs of these features should not be considered stable.

Implementation details

Build steps

libsecp256k1 can be built using autotools:

./autogen.sh
mkdir build
cd build
../configure
make
make check
sudo make install  # optional

Or using CMake:

mkdir build
cd build
cmake -GNinja ..
ninja
ninja check-secp256k1
sudo ninja install  # optional

Exhaustive tests

$ ./exhaustive_tests

With valgrind, you might need to increase the max stack size:

$ valgrind --max-stackframe=2500000 ./exhaustive_tests

Test coverage

This library aims to have full coverage of the reachable lines and branches.

To create a test coverage report with autotools:

Configure with --enable-coverage (use of GCC is necessary):

$ ./configure --enable-coverage

Run the tests:

$ make check

To create a report, gcovr is recommended, as it includes branch coverage reporting:

$ gcovr --exclude 'src/bench*' --print-summary

To create a HTML report with coloured and annotated source code:

$ gcovr --exclude 'src/bench*' --html --html-details -o coverage.html

To create a test coverage report with CMake:

Make sure you installed the dependencies first, and they are in your PATH: c++filt, gcov, genhtml, lcov and python3.

Then run the build, tests and generate the coverage report with:

mkdir coverage
cd coverage
cmake -GNinja .. \
  -DCMAKE_C_COMPILER=gcc \
  -DSECP256K1_ENABLE_COVERAGE=ON \
  -DSECP256K1_ENABLE_BRANCH_COVERAGE=ON # optional
ninja coverage-check-secp256k1

The coverage report will be available by opening the file check-secp256k1.coverage/index.html with a web browser.

Reporting a vulnerability

See SECURITY.md