Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upstream PRs 1268, 1276, 1267, 1265, 1230, 1279, 1273, 1263, 1231, 1285, 1283, 1205, 1286, 1275, 1234, 1239, 1240, 1284, 1277, 1289, 1270, 1296, 1301, 1299, 1066, 1300, 1292, 1305, 1303, 1133, 1306, 1207, 1304, 1307, 1311, 1309, 1312 #256

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
141 commits
Select commit Hold shift + click to select a range
d93f62e
field: Verify field element even after secp256k1_fe_set_b32 fails
real-or-random Feb 1, 2023
ca92a35
field: Simplify code in secp256k1_fe_set_b32
real-or-random Feb 1, 2023
7744589
Remove `SECP256K1_INLINE` usage from examples
hebasto Mar 9, 2023
8e142ca
Move `SECP256K1_INLINE` macro definition out from `include/secp256k1.h`
hebasto Mar 9, 2023
36b0adf
build: remove warning until it's reproducible
theuni Mar 10, 2023
a575339
Remove bits argument from secp256k1_wnaf_const (always 256)
sipa Dec 29, 2022
1b6fb55
doc: clarify process for patch releases
jonasnick Apr 10, 2023
656c6ea
release cleanup: bump version after 0.3.1
jonasnick Apr 10, 2023
3bab71c
Merge bitcoin-core/secp256k1#1268: release cleanup: bump version afte…
jonasnick Apr 10, 2023
1ecb94e
build: Make `SECP_VALGRIND_CHECK` preserve `CPPFLAGS`
hebasto Apr 11, 2023
dc0657c
build: Fix C4005 "macro redefinition" MSVC warnings in examples
hebasto Apr 13, 2023
06c67de
autotools: Don't regenerate Wycheproof header automatically
real-or-random Apr 14, 2023
529b54d
autotools: Move Wycheproof header from EXTRA_DIST to noinst_HEADERS
real-or-random Apr 14, 2023
4258c54
Merge bitcoin-core/secp256k1#1276: autotools: Don't regenerate Wychep…
real-or-random Apr 14, 2023
35ada3b
tests: lint wycheproof's python script
RandomLattice Apr 14, 2023
ef49a11
build: allow static or shared but not both
theuni Mar 14, 2023
566faa1
Merge bitcoin-core/secp256k1#1267: doc: clarify process for patch rel…
jonasnick Apr 18, 2023
9ce9984
Merge bitcoin-core/secp256k1#1265: Remove bits argument from secp256k…
real-or-random Apr 18, 2023
04bf3f6
Merge bitcoin-core/secp256k1#1230: Build: allow static or shared but …
real-or-random Apr 18, 2023
08f4b16
autotools: Move code around to tidy Makefile
real-or-random Apr 14, 2023
5be353d
Merge bitcoin-core/secp256k1#1279: tests: lint wycheproof's python sc…
real-or-random Apr 19, 2023
2e035af
Merge bitcoin-core/secp256k1#1273: build: Make `SECP_VALGRIND_CHECK` …
real-or-random Apr 20, 2023
47ac3d6
cmake: Make installation optional
CyberTailor Apr 9, 2023
5b0444a
Merge bitcoin-core/secp256k1#1263: cmake: Make installation optional
real-or-random Apr 20, 2023
8a8b653
cmake: Use `SameMinorVersion` compatibility mode
hebasto Mar 12, 2023
04d4cc0
cmake: Add `DESCRIPTION` and `HOMEPAGE_URL` options to `project` command
hebasto Mar 26, 2023
8c20170
cmake: Use recommended `add_compile_definitions` command
hebasto Mar 26, 2023
9f8703e
cmake: Use dedicated `CMAKE_HOST_APPLE` variable
hebasto Mar 26, 2023
2445808
cmake: Use dedicated `GENERATOR_IS_MULTI_CONFIG` property
hebasto Mar 26, 2023
6a58b48
cmake: Use `if(... IN_LIST ...)` command
hebasto Mar 26, 2023
a273d74
cmake: Improve version comparison
hebasto Apr 20, 2023
a6f4bcf
Merge bitcoin-core/secp256k1#1231: Move `SECP256K1_INLINE` macro defi…
real-or-random Apr 20, 2023
0a446a3
cmake: Add dev-mode CMake preset
real-or-random Mar 10, 2023
ce5ba9e
gitignore: Add CMakeUserPresets.json
real-or-random Mar 16, 2023
69e1ec0
Get rid of secp256k1_fe_const_b
sipa Apr 20, 2023
162608c
cmake: Emulate `PROJECT_IS_TOP_LEVEL` for CMake<3.21
hebasto Apr 20, 2023
68b16a1
bench: Make sys/time.h a system include
real-or-random Apr 21, 2023
5ec1333
Merge bitcoin-core/secp256k1#1285: bench: Make sys/time.h a system in…
real-or-random Apr 21, 2023
5431b9d
cmake: Make `SECP256K1_INSTALL` default depend on `PROJECT_IS_TOP_LEVEL`
hebasto Apr 21, 2023
f6bef03
Merge bitcoin-core/secp256k1#1283: Get rid of secp256k1_fe_const_b
real-or-random Apr 21, 2023
e9fd3df
field: Improve docs and tests of secp256k1_fe_set_b32
real-or-random Feb 1, 2023
162da73
tests: Add debug helper for printing buffers
real-or-random Feb 1, 2023
1f33bb2
Merge bitcoin-core/secp256k1#1205: field: Improve docs +tests of secp…
jonasnick Apr 21, 2023
3858bad
tests: remove extra semicolon in macro
jonasnick Apr 21, 2023
e1b9ce8
autotools: Use same conventions for all pregenerated files
real-or-random Apr 14, 2023
8764034
autotools: Make all "pregenerated" targets .PHONY
real-or-random Apr 14, 2023
2418d32
autotools: Create src/wycheproof dir before creating file in it
real-or-random Apr 14, 2023
7e977b3
autotools: Take VPATH builds into account when generating testvectors
real-or-random Apr 25, 2023
c4062d6
debug: move helper for printing buffers into util.h
jonasnick Apr 25, 2023
1c89536
Merge bitcoin-core/secp256k1#1286: tests: remove extra semicolon in m…
real-or-random Apr 25, 2023
6b7e5b7
Merge bitcoin-core/secp256k1#1275: build: Fix C4005 "macro redefiniti…
real-or-random Apr 26, 2023
596b336
Merge bitcoin-core/secp256k1#1234: cmake: Add dev-mode
real-or-random Apr 27, 2023
4b84f4b
Merge bitcoin-core/secp256k1#1239: cmake: Bugfix and other improvemen…
real-or-random Apr 27, 2023
19516ed
cmake: Use `add_compile_options()` in `try_add_compile_option()`
hebasto Apr 27, 2023
6ece150
cmake, refactor: Rename `try_add_compile_option` to `try_append_cflags`
hebasto Mar 22, 2023
a8d059f
cmake, doc: Document compiler flags
hebasto Mar 22, 2023
024a409
Merge bitcoin-core/secp256k1#1240: cmake: Improve and document compil…
real-or-random Apr 27, 2023
71f746c
cmake: Include `include` directory for subtree builds
hebasto Apr 21, 2023
222ecaf
Merge bitcoin-core/secp256k1#1284: cmake: Some improvements using `PR…
real-or-random Apr 27, 2023
4b0f711
Merge bitcoin-core/secp256k1#1277: autotools: Clean up after adding W…
real-or-random Apr 27, 2023
bef448f
cmake: Fix library ABI versioning
hebasto Apr 28, 2023
755629b
cmake: Use full signature of `add_test()` command
hebasto Apr 29, 2023
3c81838
Merge bitcoin-core/secp256k1#1289: cmake: Use full signature of `add_…
real-or-random Apr 29, 2023
b2e29e4
ci: Treat all compiler warnings as errors in "Windows (VS 2022)" task
hebasto Apr 30, 2023
d1e48e5
refactor: Make 64-bit shift explicit
hebasto Apr 30, 2023
f30c748
Merge bitcoin-core/secp256k1#1270: cmake: Fix library ABI versioning
real-or-random May 3, 2023
149c41c
docs: complete interface description for `secp256k1_schnorrsig_sign_c…
theStack May 8, 2023
1cf15eb
Merge bitcoin-core/secp256k1#1296: docs: complete interface descripti…
jonasnick May 9, 2023
2e65f1f
Avoid using bench_verify_data as bench_sign_data; merge them
sipa May 9, 2023
24c768a
Merge bitcoin-core/secp256k1#1301: Avoid using bench_verify_data as b…
real-or-random May 10, 2023
a0e696f
Make secp256k1_ecmult_const handle infinity
gmaxwell Aug 8, 2020
3086cb9
Expose secp256k1_fe_verify to other modules
sipa Sep 1, 2020
a18821d
Always initialize output coordinates in secp256k1_ge_set_gej
sipa Sep 2, 2020
f202667
Add invariant checking to group elements
sipa Sep 2, 2020
0a2e0b2
Make secp256k1_{fe,ge,gej}_verify work as no-op if non-VERIFY
sipa May 9, 2023
bbc8344
Avoid secp256k1_ge_set_gej_zinv with uninitialized z
sipa May 9, 2023
341cc19
Merge bitcoin-core/secp256k1#1299: Infinity handling: ecmult_const(in…
real-or-random May 10, 2023
97c63b9
Avoid normalize conditional on VERIFY
sipa May 9, 2023
b29566c
Merge magnitude/normalized fields, move/improve comments
sipa Jan 28, 2022
e5cf4bf
build: Rename `arm` to `arm32`
hebasto May 11, 2023
7fa5195
Bugfix: correct SECP256K1_FE_CONST mag/norm fields
sipa Feb 1, 2022
b6b6f9c
Abstract out verify logic for fe_normalize
sipa Jan 28, 2022
e28b51f
Abstract out verify logic for fe_normalize_weak
sipa Jan 28, 2022
6c31371
Abstract out verify logic for fe_normalize_var
sipa Jan 28, 2022
864f9db
Abstract out verify logic for fe_normalizes_to_zero{,_var}
sipa Jan 31, 2022
19a2bfe
Abstract out verify logic for fe_set_int
sipa Jan 28, 2022
c701d9a
Abstract out verify logic for fe_clear
sipa Jan 31, 2022
d3f3fe8
Abstract out verify logic for fe_is_zero
sipa Jan 28, 2022
c5e788d
Abstract out verify logic for fe_is_odd
sipa Jan 28, 2022
7d7d43c
Improve comments/check for fe_equal{,_var}
sipa Jan 31, 2022
ce4d209
Abstract out verify logic for fe_cmp_var
sipa Jan 28, 2022
f7a7666
Abstract out verify logic for fe_set_b32
sipa Jan 28, 2022
1446708
Abstract out verify logic for fe_get_b32
sipa Jan 28, 2022
65d82a3
Abstract out verify logic for fe_negate
sipa Jan 28, 2022
7e7ad7f
Abstract out verify logic for fe_mul_int
sipa Jan 28, 2022
e179e65
Abstract out verify logic for fe_add
sipa Jan 28, 2022
4c25f6e
Abstract out verify logic for fe_mul
sipa Jan 28, 2022
6ab3508
Abstract out verify logic for fe_sqr
sipa Jan 28, 2022
be82bd8
Improve comments/checks for fe_sqrt
sipa Jan 31, 2022
1e6894b
Abstract out verify logic for fe_cmov
sipa Jan 28, 2022
76d31e5
Abstract out verify logic for fe_to_storage
sipa Jan 28, 2022
3167646
Abstract out verify logic for fe_from_storage
sipa Jan 29, 2022
d5aa2f0
Abstract out verify logic for fe_inv{,_var}
sipa Jan 29, 2022
283cd80
Abstract out verify logic for fe_get_bounds
sipa Jun 8, 2022
89e324c
Abstract out verify logic for fe_half
sipa Nov 17, 2022
4371f98
Abstract out verify logic for fe_add_int
sipa May 11, 2023
4e176ad
Abstract out verify logic for fe_is_square_var
sipa May 11, 2023
7fc642f
Simplify secp256k1_fe_{impl_,}verify
sipa May 11, 2023
c63ec88
Merge bitcoin-core/secp256k1#1066: Abstract out and merge all the mag…
sipa May 11, 2023
54d34b6
Merge bitcoin-core/secp256k1#1300: Avoid normalize conditional on VERIFY
sipa May 11, 2023
712e7f8
Remove unused scratch space from API
jonasnick May 11, 2023
5fb336f
ct: Use volatile trick in scalar_cond_negate
real-or-random May 10, 2023
17fa217
ct: Be cautious and use volatile trick in more "conditional" paths
real-or-random May 10, 2023
073d98a
Merge bitcoin-core/secp256k1#1292: refactor: Make 64-bit shift explicit
jonasnick May 11, 2023
9eb6934
Merge bitcoin-core/secp256k1#1305: Remove unused scratch space from API
real-or-random May 11, 2023
ab5a917
Merge bitcoin-core/secp256k1#1303: ct: Use more volatile
jonasnick May 11, 2023
97a98be
schnorrsig: Refactor test vector code to allow varlen messages
real-or-random Aug 11, 2022
28687b0
schnorrsig: Add BIP340 varlen test vectors
real-or-random Aug 11, 2022
cd54ac7
schnorrsig: Improve docs of schnorrsig_sign_custom
real-or-random Aug 11, 2022
fb3a806
Merge bitcoin-core/secp256k1#1133: schnorrsig: Add test vectors for v…
jonasnick May 11, 2023
1907f0f
build: Make tests work with external default callbacks
real-or-random May 11, 2023
006ddc1
Merge bitcoin-core/secp256k1#1306: build: Make tests work with extern…
jonasnick May 11, 2023
5b32602
Split fe_set_b32 into reducing and normalizing variants
sipa Feb 5, 2023
3353d3c
Merge bitcoin-core/secp256k1#1207: Split fe_set_b32 into reducing and…
sipa May 11, 2023
0c729ba
Bugfix: mark outputs as early clobber in scalar x86_64 asm
sipa May 12, 2023
350b4bd
Mark stack variables as early clobber for technical correctness
sipa May 12, 2023
ed4ba23
cmake: Add `check_arm32_assembly` function
hebasto May 12, 2023
0324645
autotools: Add `SECP_ARM32_ASM_CHECK` macro
hebasto May 11, 2023
8c9ae37
Add release note
sipa May 12, 2023
c6bb29b
build: Rename `64bit` to `x86_64`
hebasto May 12, 2023
b54a067
Merge bitcoin-core/secp256k1#1304: build: Rename arm to arm32 and che…
real-or-random May 12, 2023
7d4f86d
Merge bitcoin-core/secp256k1#1307: Mark more assembly outputs as earl…
jonasnick May 12, 2023
76b43f3
changelog: Add entry for #1303
real-or-random May 12, 2023
3ad1027
Revert "Remove unused scratch space from API"
jonasnick May 12, 2023
697e1cc
changelog: Catch up
real-or-random May 12, 2023
e8295d0
Merge bitcoin-core/secp256k1#1311: Revert "Remove unused scratch spac…
sipa May 12, 2023
3e3d125
Merge bitcoin-core/secp256k1#1309: changelog: Catch up
real-or-random May 12, 2023
d490ca2
release: Prepare for 0.3.2
real-or-random May 12, 2023
acf5c55
Merge bitcoin-core/secp256k1#1312: release: Prepare for 0.3.2
real-or-random May 13, 2023
7a07f3d
Merge commits '3bab71cf 4258c54f 566faa17 9ce9984f 04bf3f67 5be353d6 …
jonasnick Jul 24, 2023
e593ed5
musig: ensure point_load output is normalized
jonasnick Jul 25, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 3 additions & 3 deletions .cirrus.yml
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ task:
CTIMETESTS: no
matrix:
- env: {}
- env: {EXPERIMENTAL: yes, ASM: arm}
- env: {EXPERIMENTAL: yes, ASM: arm32}
<< : *MERGE_BASE
test_script:
- ./ci/cirrus.sh
Expand Down Expand Up @@ -446,13 +446,13 @@ task:
- PowerShell -NoLogo -Command if ($env:CIRRUS_PR -ne $null) { git fetch $env:CIRRUS_REPO_CLONE_URL pull/$env:CIRRUS_PR/merge; git reset --hard FETCH_HEAD; }
configure_script:
- '%x64_NATIVE_TOOLS%'
- cmake -G "Visual Studio 17 2022" -A x64 -S . -B build -DSECP256K1_ENABLE_MODULE_RECOVERY=ON -DSECP256K1_BUILD_EXAMPLES=ON
- cmake -E env CFLAGS="/WX" cmake -G "Visual Studio 17 2022" -A x64 -S . -B build -DSECP256K1_ENABLE_MODULE_RECOVERY=ON -DSECP256K1_BUILD_EXAMPLES=ON
build_script:
- '%x64_NATIVE_TOOLS%'
- cmake --build build --config RelWithDebInfo -- -property:UseMultiToolTask=true;CL_MPcount=5
check_script:
- '%x64_NATIVE_TOOLS%'
- ctest --test-dir build -j 5
- ctest -C RelWithDebInfo --test-dir build -j 5
- build\src\RelWithDebInfo\bench_ecmult.exe
- build\src\RelWithDebInfo\bench_internal.exe
- build\src\RelWithDebInfo\bench.exe
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -67,5 +67,7 @@ contrib/gh-pr-create.sh

musig_example

### CMake
/CMakeUserPresets.json
# Default CMake build directory.
/build
22 changes: 21 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,25 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.3.2] - 2023-05-13
We strongly recommend updating to 0.3.2 if you use or plan to use GCC >=13 to compile libsecp256k1. When in doubt, check the GCC version using `gcc -v`.

#### Security
- Module `ecdh`: Fix "constant-timeness" issue with GCC 13.1 (and potentially future versions of GCC) that could leave applications using libsecp256k1's ECDH module vulnerable to a timing side-channel attack. The fix avoids secret-dependent control flow during ECDH computations when libsecp256k1 is compiled with GCC 13.1.

#### Fixed
- Fixed an old bug that permitted compilers to potentially output bad assembly code on x86_64. In theory, it could lead to a crash or a read of unrelated memory, but this has never been observed on any compilers so far.

#### Changed
- Various improvements and changes to CMake builds. CMake builds remain experimental.
- Made API versioning consistent with GNU Autotools builds.
- Switched to `BUILD_SHARED_LIBS` variable for controlling whether to build a static or a shared library.
- Added `SECP256K1_INSTALL` variable for the controlling whether to install the build artefacts.
- Renamed asm build option `arm` to `arm32`. Use `--with-asm=arm32` instead of `--with-asm=arm` (GNU Autotools), and `-DSECP256K1_ASM=arm32` instead of `-DSECP256K1_ASM=arm` (CMake).

#### ABI Compatibility
The ABI is compatible with versions 0.3.0 and 0.3.1.

## [0.3.1] - 2023-04-10
We strongly recommend updating to 0.3.1 if you use or plan to use Clang >=14 to compile libsecp256k1, e.g., Xcode >=14 on macOS has Clang >=14. When in doubt, check the Clang version using `clang -v`.

Expand Down Expand Up @@ -69,7 +88,8 @@ This version was in fact never released.
The number was given by the build system since the introduction of autotools in Jan 2014 (ea0fe5a5bf0c04f9cc955b2966b614f5f378c6f6).
Therefore, this version number does not uniquely identify a set of source files.

[unreleased]: https://github.com/bitcoin-core/secp256k1/compare/v0.3.0...HEAD
[unreleased]: https://github.com/bitcoin-core/secp256k1/compare/v0.3.2...HEAD
[0.3.2]: https://github.com/bitcoin-core/secp256k1/compare/v0.3.1...v0.3.2
[0.3.1]: https://github.com/bitcoin-core/secp256k1/compare/v0.3.0...v0.3.1
[0.3.0]: https://github.com/bitcoin-core/secp256k1/compare/v0.2.0...v0.3.0
[0.2.0]: https://github.com/bitcoin-core/secp256k1/compare/423b6d19d373f1224fd671a982584d7e7900bc93..v0.2.0
Expand Down
162 changes: 98 additions & 64 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,61 +1,79 @@
cmake_minimum_required(VERSION 3.13)

if(CMAKE_VERSION VERSION_GREATER 3.14)
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.15)
# MSVC runtime library flags are selected by the CMAKE_MSVC_RUNTIME_LIBRARY abstraction.
cmake_policy(SET CMP0091 NEW)
# MSVC warning flags are not in CMAKE_<LANG>_FLAGS by default.
cmake_policy(SET CMP0092 NEW)
endif()

# The package (a.k.a. release) version is based on semantic versioning 2.0.0 of
# the API. All changes in experimental modules are treated as
# backwards-compatible and therefore at most increase the minor version.
project(libsecp256k1 VERSION 0.3.1 LANGUAGES C)
project(libsecp256k1
# The package (a.k.a. release) version is based on semantic versioning 2.0.0 of
# the API. All changes in experimental modules are treated as
# backwards-compatible and therefore at most increase the minor version.
VERSION 0.3.2
DESCRIPTION "Optimized C library for ECDSA signatures and secret/public key operations on curve secp256k1."
HOMEPAGE_URL "https://github.com/bitcoin-core/secp256k1"
LANGUAGES C
)

if(CMAKE_VERSION VERSION_LESS 3.21)
get_directory_property(parent_directory PARENT_DIRECTORY)
if(parent_directory)
set(PROJECT_IS_TOP_LEVEL OFF CACHE INTERNAL "Emulates CMake 3.21+ behavior.")
set(${PROJECT_NAME}_IS_TOP_LEVEL OFF CACHE INTERNAL "Emulates CMake 3.21+ behavior.")
else()
set(PROJECT_IS_TOP_LEVEL ON CACHE INTERNAL "Emulates CMake 3.21+ behavior.")
set(${PROJECT_NAME}_IS_TOP_LEVEL ON CACHE INTERNAL "Emulates CMake 3.21+ behavior.")
endif()
unset(parent_directory)
endif()

# The library version is based on libtool versioning of the ABI. The set of
# rules for updating the version can be found here:
# https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
# All changes in experimental modules are treated as if they don't affect the
# interface and therefore only increase the revision.
set(${PROJECT_NAME}_LIB_VERSION_CURRENT 2)
set(${PROJECT_NAME}_LIB_VERSION_REVISION 1)
set(${PROJECT_NAME}_LIB_VERSION_REVISION 2)
set(${PROJECT_NAME}_LIB_VERSION_AGE 0)

set(CMAKE_C_STANDARD 90)
set(CMAKE_C_EXTENSIONS OFF)

list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

# We do not use CMake's BUILD_SHARED_LIBS option.
option(SECP256K1_BUILD_SHARED "Build shared library." ON)
option(SECP256K1_BUILD_STATIC "Build static library." ON)
if(NOT SECP256K1_BUILD_SHARED AND NOT SECP256K1_BUILD_STATIC)
message(FATAL_ERROR "At least one of SECP256K1_BUILD_SHARED and SECP256K1_BUILD_STATIC must be enabled.")
option(BUILD_SHARED_LIBS "Build shared libraries." ON)
option(SECP256K1_DISABLE_SHARED "Disable shared library. Overrides BUILD_SHARED_LIBS." OFF)
if(SECP256K1_DISABLE_SHARED)
set(BUILD_SHARED_LIBS OFF)
endif()

option(SECP256K1_INSTALL "Enable installation." ${PROJECT_IS_TOP_LEVEL})

option(SECP256K1_ENABLE_MODULE_ECDH "Enable ECDH module." ON)
if(SECP256K1_ENABLE_MODULE_ECDH)
add_definitions(-DENABLE_MODULE_ECDH=1)
add_compile_definitions(ENABLE_MODULE_ECDH=1)
endif()

option(SECP256K1_ENABLE_MODULE_RECOVERY "Enable ECDSA pubkey recovery module." OFF)
if(SECP256K1_ENABLE_MODULE_RECOVERY)
add_definitions(-DENABLE_MODULE_RECOVERY=1)
add_compile_definitions(ENABLE_MODULE_RECOVERY=1)
endif()

option(SECP256K1_ENABLE_MODULE_EXTRAKEYS "Enable extrakeys module." ON)
option(SECP256K1_ENABLE_MODULE_SCHNORRSIG "Enable schnorrsig module." ON)
if(SECP256K1_ENABLE_MODULE_SCHNORRSIG)
set(SECP256K1_ENABLE_MODULE_EXTRAKEYS ON)
add_definitions(-DENABLE_MODULE_SCHNORRSIG=1)
add_compile_definitions(ENABLE_MODULE_SCHNORRSIG=1)
endif()
if(SECP256K1_ENABLE_MODULE_EXTRAKEYS)
add_definitions(-DENABLE_MODULE_EXTRAKEYS=1)
add_compile_definitions(ENABLE_MODULE_EXTRAKEYS=1)
endif()

option(SECP256K1_USE_EXTERNAL_DEFAULT_CALLBACKS "Enable external default callback functions." OFF)
if(SECP256K1_USE_EXTERNAL_DEFAULT_CALLBACKS)
add_definitions(-DUSE_EXTERNAL_DEFAULT_CALLBACKS=1)
add_compile_definitions(USE_EXTERNAL_DEFAULT_CALLBACKS=1)
endif()

set(SECP256K1_ECMULT_WINDOW_SIZE "AUTO" CACHE STRING "Window size for ecmult precomputation for verification, specified as integer in range [2..24]. \"AUTO\" is a reasonable setting for desktop machines (currently 15). [default=AUTO]")
Expand All @@ -65,37 +83,43 @@ check_string_option_value(SECP256K1_ECMULT_WINDOW_SIZE)
if(SECP256K1_ECMULT_WINDOW_SIZE STREQUAL "AUTO")
set(SECP256K1_ECMULT_WINDOW_SIZE 15)
endif()
add_definitions(-DECMULT_WINDOW_SIZE=${SECP256K1_ECMULT_WINDOW_SIZE})
add_compile_definitions(ECMULT_WINDOW_SIZE=${SECP256K1_ECMULT_WINDOW_SIZE})

set(SECP256K1_ECMULT_GEN_PREC_BITS "AUTO" CACHE STRING "Precision bits to tune the precomputed table size for signing, specified as integer 2, 4 or 8. \"AUTO\" is a reasonable setting for desktop machines (currently 4). [default=AUTO]")
set_property(CACHE SECP256K1_ECMULT_GEN_PREC_BITS PROPERTY STRINGS "AUTO" 2 4 8)
check_string_option_value(SECP256K1_ECMULT_GEN_PREC_BITS)
if(SECP256K1_ECMULT_GEN_PREC_BITS STREQUAL "AUTO")
set(SECP256K1_ECMULT_GEN_PREC_BITS 4)
endif()
add_definitions(-DECMULT_GEN_PREC_BITS=${SECP256K1_ECMULT_GEN_PREC_BITS})
add_compile_definitions(ECMULT_GEN_PREC_BITS=${SECP256K1_ECMULT_GEN_PREC_BITS})

set(SECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY "OFF" CACHE STRING "Test-only override of the (autodetected by the C code) \"widemul\" setting. Legal values are: \"OFF\", \"int128_struct\", \"int128\" or \"int64\". [default=OFF]")
set_property(CACHE SECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY PROPERTY STRINGS "OFF" "int128_struct" "int128" "int64")
check_string_option_value(SECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY)
if(SECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY)
string(TOUPPER "${SECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY}" widemul_upper_value)
add_definitions(-DUSE_FORCE_WIDEMUL_${widemul_upper_value}=1)
add_compile_definitions(USE_FORCE_WIDEMUL_${widemul_upper_value}=1)
endif()
mark_as_advanced(FORCE SECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY)

set(SECP256K1_ASM "AUTO" CACHE STRING "Assembly optimizations to use: \"AUTO\", \"OFF\", \"x86_64\" or \"arm\" (experimental). [default=AUTO]")
set_property(CACHE SECP256K1_ASM PROPERTY STRINGS "AUTO" "OFF" "x86_64" "arm")
set(SECP256K1_ASM "AUTO" CACHE STRING "Assembly optimizations to use: \"AUTO\", \"OFF\", \"x86_64\" or \"arm32\" (experimental). [default=AUTO]")
set_property(CACHE SECP256K1_ASM PROPERTY STRINGS "AUTO" "OFF" "x86_64" "arm32")
check_string_option_value(SECP256K1_ASM)
if(SECP256K1_ASM STREQUAL "arm")
if(SECP256K1_ASM STREQUAL "arm32")
enable_language(ASM)
add_definitions(-DUSE_EXTERNAL_ASM=1)
include(CheckArm32Assembly)
check_arm32_assembly()
if(HAVE_ARM32_ASM)
add_compile_definitions(USE_EXTERNAL_ASM=1)
else()
message(FATAL_ERROR "ARM32 assembly optimization requested but not available.")
endif()
elseif(SECP256K1_ASM)
include(Check64bitAssembly)
check_64bit_assembly()
if(HAS_64BIT_ASM)
include(CheckX86_64Assembly)
check_x86_64_assembly()
if(HAVE_X86_64_ASM)
set(SECP256K1_ASM "x86_64")
add_definitions(-DUSE_ASM_X86_64=1)
add_compile_definitions(USE_ASM_X86_64=1)
elseif(SECP256K1_ASM STREQUAL "AUTO")
set(SECP256K1_ASM "OFF")
else()
Expand All @@ -105,8 +129,8 @@ endif()

option(SECP256K1_EXPERIMENTAL "Allow experimental configuration options." OFF)
if(NOT SECP256K1_EXPERIMENTAL)
if(SECP256K1_ASM STREQUAL "arm")
message(FATAL_ERROR "ARM assembly optimization is experimental. Use -DSECP256K1_EXPERIMENTAL=ON to allow.")
if(SECP256K1_ASM STREQUAL "arm32")
message(FATAL_ERROR "ARM32 assembly optimization is experimental. Use -DSECP256K1_EXPERIMENTAL=ON to allow.")
endif()
endif()

Expand All @@ -118,7 +142,7 @@ if(SECP256K1_VALGRIND)
if(Valgrind_FOUND)
set(SECP256K1_VALGRIND ON)
include_directories(${Valgrind_INCLUDE_DIR})
add_definitions(-DVALGRIND)
add_compile_definitions(VALGRIND)
elseif(SECP256K1_VALGRIND STREQUAL "AUTO")
set(SECP256K1_VALGRIND OFF)
else()
Expand Down Expand Up @@ -165,42 +189,47 @@ mark_as_advanced(
CMAKE_SHARED_LINKER_FLAGS_COVERAGE
)

if(CMAKE_CONFIGURATION_TYPES)
set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo" "Release" "Debug" "MinSizeRel" "Coverage")
endif()

get_property(cached_cmake_build_type CACHE CMAKE_BUILD_TYPE PROPERTY TYPE)
if(cached_cmake_build_type)
get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
set(default_build_type "RelWithDebInfo")
if(is_multi_config)
set(CMAKE_CONFIGURATION_TYPES "${default_build_type}" "Release" "Debug" "MinSizeRel" "Coverage" CACHE STRING
"Supported configuration types."
FORCE
)
else()
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY
STRINGS "RelWithDebInfo" "Release" "Debug" "MinSizeRel" "Coverage"
STRINGS "${default_build_type}" "Release" "Debug" "MinSizeRel" "Coverage"
)
if(NOT CMAKE_BUILD_TYPE)
message(STATUS "Setting build type to \"${default_build_type}\" as none was specified")
set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING
"Choose the type of build."
FORCE
)
endif()
endif()

set(default_build_type "RelWithDebInfo")
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
message(STATUS "Setting build type to \"${default_build_type}\" as none was specified")
set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING "Choose the type of build." FORCE)
endif()

include(TryAddCompileOption)
include(TryAppendCFlags)
if(MSVC)
try_add_compile_option(/W2)
try_add_compile_option(/wd4146)
# Keep the following commands ordered lexicographically.
try_append_c_flags(/W2) # Moderate warning level.
try_append_c_flags(/wd4146) # Disable warning C4146 "unary minus operator applied to unsigned type, result still unsigned".
else()
try_add_compile_option(-pedantic)
try_add_compile_option(-Wall)
try_add_compile_option(-Wcast-align)
try_add_compile_option(-Wcast-align=strict)
try_add_compile_option(-Wconditional-uninitialized)
try_add_compile_option(-Wextra)
try_add_compile_option(-Wnested-externs)
try_add_compile_option(-Wno-long-long)
try_add_compile_option(-Wno-overlength-strings)
try_add_compile_option(-Wno-unused-function)
try_add_compile_option(-Wreserved-identifier)
try_add_compile_option(-Wshadow)
try_add_compile_option(-Wstrict-prototypes)
try_add_compile_option(-Wundef)
# Keep the following commands ordered lexicographically.
try_append_c_flags(-pedantic)
try_append_c_flags(-Wall) # GCC >= 2.95 and probably many other compilers.
try_append_c_flags(-Wcast-align) # GCC >= 2.95.
try_append_c_flags(-Wcast-align=strict) # GCC >= 8.0.
try_append_c_flags(-Wconditional-uninitialized) # Clang >= 3.0 only.
try_append_c_flags(-Wextra) # GCC >= 3.4, this is the newer name of -W, which we don't use because older GCCs will warn about unused functions.
try_append_c_flags(-Wnested-externs)
try_append_c_flags(-Wno-long-long) # GCC >= 3.0, -Wlong-long is implied by -pedantic.
try_append_c_flags(-Wno-overlength-strings) # GCC >= 4.2, -Woverlength-strings is implied by -pedantic.
try_append_c_flags(-Wno-unused-function) # GCC >= 3.0, -Wunused-function is implied by -Wall.
try_append_c_flags(-Wreserved-identifier) # Clang >= 13.0 only.
try_append_c_flags(-Wshadow)
try_append_c_flags(-Wstrict-prototypes)
try_append_c_flags(-Wundef)
endif()

set(CMAKE_C_VISIBILITY_PRESET hidden)
Expand All @@ -225,8 +254,13 @@ message("\n")
message("secp256k1 configure summary")
message("===========================")
message("Build artifacts:")
message(" shared library ...................... ${SECP256K1_BUILD_SHARED}")
message(" static library ...................... ${SECP256K1_BUILD_STATIC}")
if(BUILD_SHARED_LIBS)
set(library_type "Shared")
else()
set(library_type "Static")
endif()

message(" library type ........................ ${library_type}")
message("Optional modules:")
message(" ECDH ................................ ${SECP256K1_ENABLE_MODULE_ECDH}")
message(" ECDSA pubkey recovery ............... ${SECP256K1_ENABLE_MODULE_RECOVERY}")
Expand Down Expand Up @@ -268,15 +302,15 @@ message("CFLAGS ................................ ${CMAKE_C_FLAGS}")
get_directory_property(compile_options COMPILE_OPTIONS)
string(REPLACE ";" " " compile_options "${compile_options}")
message("Compile options ....................... " ${compile_options})
if(DEFINED CMAKE_BUILD_TYPE)
if(NOT is_multi_config)
message("Build type:")
message(" - CMAKE_BUILD_TYPE ................... ${CMAKE_BUILD_TYPE}")
string(TOUPPER "${CMAKE_BUILD_TYPE}" build_type)
message(" - CFLAGS ............................. ${CMAKE_C_FLAGS_${build_type}}")
message(" - LDFLAGS for executables ............ ${CMAKE_EXE_LINKER_FLAGS_${build_type}}")
message(" - LDFLAGS for shared libraries ....... ${CMAKE_SHARED_LINKER_FLAGS_${build_type}}")
else()
message("Available configurations .............. ${CMAKE_CONFIGURATION_TYPES}")
message("Supported configurations .............. ${CMAKE_CONFIGURATION_TYPES}")
message("RelWithDebInfo configuration:")
message(" - CFLAGS ............................. ${CMAKE_C_FLAGS_RELWITHDEBINFO}")
message(" - LDFLAGS for executables ............ ${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}")
Expand Down
19 changes: 19 additions & 0 deletions CMakePresets.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"cmakeMinimumRequired": {"major": 3, "minor": 21, "patch": 0},
"version": 3,
"configurePresets": [
{
"name": "dev-mode",
"displayName": "Development mode (intended only for developers of the library)",
"cacheVariables": {
"SECP256K1_EXPERIMENTAL": "ON",
"SECP256K1_ENABLE_MODULE_RECOVERY": "ON",
"SECP256K1_BUILD_EXAMPLES": "ON"
},
"warnings": {
"dev": true,
"uninitialized": true
}
}
]
}