Merge bitcoin/bitcoin#33036: Update secp256k1 subtree to latest master
5600e6fc4bSquashed 'src/secp256k1/' changes from 4187a46649..b9313c6e1a (fanquake) Pull request description: Updates the subtree to https://github.com/bitcoin-core/secp256k1/commit/b9313c6e1a6082a66b4c75777e18ca4b176fcf9d. See https://github.com/bitcoin-core/secp256k1/blob/master/CHANGELOG.md#070---2025-07-21 for the most relevant changes. ACKs for top commit: theStack: ACK336b8be37bstickies-v: ACK336b8be37bTree-SHA512: 8494850b979e3d27c98d89f8bac75c8a1180184adf134b1f2ba009bd21877836855f50d074535f06e2e0e62636464eaa926db82f1fb4d5f252a8804d6ba70c87
This commit is contained in:
17 files changed
+281
-303
No files matched your search
@@ -1,104 +0,0 @@
|
|||||||
env:
|
|
||||||
### cirrus config
|
|
||||||
CIRRUS_CLONE_DEPTH: 1
|
|
||||||
### compiler options
|
|
||||||
HOST:
|
|
||||||
WRAPPER_CMD:
|
|
||||||
# Specific warnings can be disabled with -Wno-error=foo.
|
|
||||||
# -pedantic-errors is not equivalent to -Werror=pedantic and thus not implied by -Werror according to the GCC manual.
|
|
||||||
WERROR_CFLAGS: -Werror -pedantic-errors
|
|
||||||
MAKEFLAGS: -j4
|
|
||||||
BUILD: check
|
|
||||||
### secp256k1 config
|
|
||||||
ECMULTWINDOW: 15
|
|
||||||
ECMULTGENKB: 22
|
|
||||||
ASM: no
|
|
||||||
WIDEMUL: auto
|
|
||||||
WITH_VALGRIND: yes
|
|
||||||
EXTRAFLAGS:
|
|
||||||
### secp256k1 modules
|
|
||||||
EXPERIMENTAL: no
|
|
||||||
ECDH: no
|
|
||||||
RECOVERY: no
|
|
||||||
EXTRAKEYS: no
|
|
||||||
SCHNORRSIG: no
|
|
||||||
MUSIG: no
|
|
||||||
ELLSWIFT: no
|
|
||||||
### test options
|
|
||||||
SECP256K1_TEST_ITERS: 64
|
|
||||||
BENCH: yes
|
|
||||||
SECP256K1_BENCH_ITERS: 2
|
|
||||||
CTIMETESTS: yes
|
|
||||||
SYMBOL_CHECK: yes
|
|
||||||
VIRTUAL_ENV: /root/venv
|
|
||||||
# Compile and run the tests
|
|
||||||
EXAMPLES: yes
|
|
||||||
|
|
||||||
cat_logs_snippet: &CAT_LOGS
|
|
||||||
always:
|
|
||||||
cat_tests_log_script:
|
|
||||||
- cat tests.log || true
|
|
||||||
cat_noverify_tests_log_script:
|
|
||||||
- cat noverify_tests.log || true
|
|
||||||
cat_exhaustive_tests_log_script:
|
|
||||||
- cat exhaustive_tests.log || true
|
|
||||||
cat_ctime_tests_log_script:
|
|
||||||
- cat ctime_tests.log || true
|
|
||||||
cat_bench_log_script:
|
|
||||||
- cat bench.log || true
|
|
||||||
cat_config_log_script:
|
|
||||||
- cat config.log || true
|
|
||||||
cat_test_env_script:
|
|
||||||
- cat test_env.log || true
|
|
||||||
cat_ci_env_script:
|
|
||||||
- env
|
|
||||||
|
|
||||||
linux_arm64_container_snippet: &LINUX_ARM64_CONTAINER
|
|
||||||
env_script:
|
|
||||||
- export PATH="$VIRTUAL_ENV/bin:$PATH"
|
|
||||||
- env | tee /tmp/env
|
|
||||||
build_script:
|
|
||||||
- DOCKER_BUILDKIT=1 docker build --file "ci/linux-debian.Dockerfile" --tag="ci_secp256k1_arm"
|
|
||||||
- docker image prune --force # Cleanup stale layers
|
|
||||||
test_script:
|
|
||||||
- docker run --rm --mount "type=bind,src=./,dst=/ci_secp256k1" --env-file /tmp/env --replace --name "ci_secp256k1_arm" "ci_secp256k1_arm" bash -c "cd /ci_secp256k1/ && ./ci/ci.sh"
|
|
||||||
|
|
||||||
task:
|
|
||||||
name: "ARM64: Linux (Debian stable)"
|
|
||||||
persistent_worker:
|
|
||||||
labels:
|
|
||||||
type: arm64
|
|
||||||
env:
|
|
||||||
ECDH: yes
|
|
||||||
RECOVERY: yes
|
|
||||||
EXTRAKEYS: yes
|
|
||||||
SCHNORRSIG: yes
|
|
||||||
MUSIG: yes
|
|
||||||
ELLSWIFT: yes
|
|
||||||
matrix:
|
|
||||||
# Currently only gcc-snapshot, the other compilers are tested on GHA with QEMU
|
|
||||||
- env: { CC: 'gcc-snapshot' }
|
|
||||||
<< : *LINUX_ARM64_CONTAINER
|
|
||||||
<< : *CAT_LOGS
|
|
||||||
|
|
||||||
task:
|
|
||||||
name: "ARM64: Linux (Debian stable), Valgrind"
|
|
||||||
persistent_worker:
|
|
||||||
labels:
|
|
||||||
type: arm64
|
|
||||||
env:
|
|
||||||
ECDH: yes
|
|
||||||
RECOVERY: yes
|
|
||||||
EXTRAKEYS: yes
|
|
||||||
SCHNORRSIG: yes
|
|
||||||
MUSIG: yes
|
|
||||||
ELLSWIFT: yes
|
|
||||||
WRAPPER_CMD: 'valgrind --error-exitcode=42'
|
|
||||||
SECP256K1_TEST_ITERS: 2
|
|
||||||
matrix:
|
|
||||||
- env: { CC: 'gcc' }
|
|
||||||
- env: { CC: 'clang' }
|
|
||||||
- env: { CC: 'gcc-snapshot' }
|
|
||||||
- env: { CC: 'clang-snapshot' }
|
|
||||||
<< : *LINUX_ARM64_CONTAINER
|
|
||||||
<< : *CAT_LOGS
|
|
||||||
+70
-42
@@ -46,8 +46,18 @@ env:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
docker_cache:
|
docker_cache:
|
||||||
name: "Build Docker image"
|
name: "Build ${{ matrix.arch }} Docker image"
|
||||||
runs-on: ubuntu-latest
|
runs-on: ${{ matrix.runner }}
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- arch: x64
|
||||||
|
runner: ubuntu-latest
|
||||||
|
- arch: arm64
|
||||||
|
runner: ubuntu-24.04-arm
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
@@ -60,11 +70,11 @@ jobs:
|
|||||||
uses: docker/build-push-action@v5
|
uses: docker/build-push-action@v5
|
||||||
with:
|
with:
|
||||||
file: ./ci/linux-debian.Dockerfile
|
file: ./ci/linux-debian.Dockerfile
|
||||||
tags: linux-debian-image
|
tags: ${{ matrix.arch }}-debian-image
|
||||||
cache-from: type=gha
|
cache-from: type=gha
|
||||||
cache-to: type=gha,mode=min
|
cache-to: type=gha,mode=min
|
||||||
|
|
||||||
linux_debian:
|
x86_64-debian:
|
||||||
name: "x86_64: Linux (Debian stable)"
|
name: "x86_64: Linux (Debian stable)"
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: docker_cache
|
needs: docker_cache
|
||||||
@@ -106,7 +116,7 @@ jobs:
|
|||||||
uses: ./.github/actions/run-in-docker-action
|
uses: ./.github/actions/run-in-docker-action
|
||||||
with:
|
with:
|
||||||
dockerfile: ./ci/linux-debian.Dockerfile
|
dockerfile: ./ci/linux-debian.Dockerfile
|
||||||
tag: linux-debian-image
|
tag: x64-debian-image
|
||||||
|
|
||||||
- name: Print logs
|
- name: Print logs
|
||||||
uses: ./.github/actions/print-logs
|
uses: ./.github/actions/print-logs
|
||||||
@@ -142,7 +152,7 @@ jobs:
|
|||||||
uses: ./.github/actions/run-in-docker-action
|
uses: ./.github/actions/run-in-docker-action
|
||||||
with:
|
with:
|
||||||
dockerfile: ./ci/linux-debian.Dockerfile
|
dockerfile: ./ci/linux-debian.Dockerfile
|
||||||
tag: linux-debian-image
|
tag: x64-debian-image
|
||||||
|
|
||||||
- name: Print logs
|
- name: Print logs
|
||||||
uses: ./.github/actions/print-logs
|
uses: ./.github/actions/print-logs
|
||||||
@@ -174,7 +184,7 @@ jobs:
|
|||||||
uses: ./.github/actions/run-in-docker-action
|
uses: ./.github/actions/run-in-docker-action
|
||||||
with:
|
with:
|
||||||
dockerfile: ./ci/linux-debian.Dockerfile
|
dockerfile: ./ci/linux-debian.Dockerfile
|
||||||
tag: linux-debian-image
|
tag: x64-debian-image
|
||||||
|
|
||||||
- name: Print logs
|
- name: Print logs
|
||||||
uses: ./.github/actions/print-logs
|
uses: ./.github/actions/print-logs
|
||||||
@@ -215,21 +225,19 @@ jobs:
|
|||||||
uses: ./.github/actions/run-in-docker-action
|
uses: ./.github/actions/run-in-docker-action
|
||||||
with:
|
with:
|
||||||
dockerfile: ./ci/linux-debian.Dockerfile
|
dockerfile: ./ci/linux-debian.Dockerfile
|
||||||
tag: linux-debian-image
|
tag: x64-debian-image
|
||||||
|
|
||||||
- name: Print logs
|
- name: Print logs
|
||||||
uses: ./.github/actions/print-logs
|
uses: ./.github/actions/print-logs
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
|
|
||||||
arm64_debian:
|
arm64-debian:
|
||||||
name: "ARM64: Linux (Debian stable, QEMU)"
|
name: "arm64: Linux (Debian stable)"
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04-arm
|
||||||
needs: docker_cache
|
needs: docker_cache
|
||||||
|
|
||||||
env:
|
env:
|
||||||
WRAPPER_CMD: 'qemu-aarch64'
|
|
||||||
SECP256K1_TEST_ITERS: 16
|
SECP256K1_TEST_ITERS: 16
|
||||||
HOST: 'aarch64-linux-gnu'
|
|
||||||
WITH_VALGRIND: 'no'
|
WITH_VALGRIND: 'no'
|
||||||
ECDH: 'yes'
|
ECDH: 'yes'
|
||||||
RECOVERY: 'yes'
|
RECOVERY: 'yes'
|
||||||
@@ -238,27 +246,26 @@ jobs:
|
|||||||
MUSIG: 'yes'
|
MUSIG: 'yes'
|
||||||
ELLSWIFT: 'yes'
|
ELLSWIFT: 'yes'
|
||||||
CTIMETESTS: 'no'
|
CTIMETESTS: 'no'
|
||||||
|
CC: ${{ matrix.cc }}
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
configuration:
|
cc:
|
||||||
- env_vars: { } # gcc
|
- 'gcc'
|
||||||
- env_vars: # clang
|
- 'clang'
|
||||||
CC: 'clang --target=aarch64-linux-gnu'
|
- 'gcc-snapshot'
|
||||||
- env_vars: # clang-snapshot
|
- 'clang-snapshot'
|
||||||
CC: 'clang-snapshot --target=aarch64-linux-gnu'
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: CI script
|
- name: CI script
|
||||||
env: ${{ matrix.configuration.env_vars }}
|
|
||||||
uses: ./.github/actions/run-in-docker-action
|
uses: ./.github/actions/run-in-docker-action
|
||||||
with:
|
with:
|
||||||
dockerfile: ./ci/linux-debian.Dockerfile
|
dockerfile: ./ci/linux-debian.Dockerfile
|
||||||
tag: linux-debian-image
|
tag: arm64-debian-image
|
||||||
|
|
||||||
- name: Print logs
|
- name: Print logs
|
||||||
uses: ./.github/actions/print-logs
|
uses: ./.github/actions/print-logs
|
||||||
@@ -290,7 +297,7 @@ jobs:
|
|||||||
uses: ./.github/actions/run-in-docker-action
|
uses: ./.github/actions/run-in-docker-action
|
||||||
with:
|
with:
|
||||||
dockerfile: ./ci/linux-debian.Dockerfile
|
dockerfile: ./ci/linux-debian.Dockerfile
|
||||||
tag: linux-debian-image
|
tag: x64-debian-image
|
||||||
|
|
||||||
- name: Print logs
|
- name: Print logs
|
||||||
uses: ./.github/actions/print-logs
|
uses: ./.github/actions/print-logs
|
||||||
@@ -298,18 +305,38 @@ jobs:
|
|||||||
|
|
||||||
|
|
||||||
valgrind_debian:
|
valgrind_debian:
|
||||||
name: "Valgrind (memcheck)"
|
name: "Valgrind ${{ matrix.binary_arch }} (memcheck)"
|
||||||
runs-on: ubuntu-latest
|
runs-on: ${{ matrix.runner }}
|
||||||
needs: docker_cache
|
needs: docker_cache
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
configuration:
|
include:
|
||||||
- env_vars: { CC: 'clang', ASM: 'auto' }
|
- docker_arch: x64
|
||||||
- env_vars: { CC: 'i686-linux-gnu-gcc', HOST: 'i686-linux-gnu', ASM: 'auto' }
|
runner: ubuntu-latest
|
||||||
- env_vars: { CC: 'clang', ASM: 'no', ECMULTGENKB: 2, ECMULTWINDOW: 2 }
|
binary_arch: x64
|
||||||
- env_vars: { CC: 'i686-linux-gnu-gcc', HOST: 'i686-linux-gnu', ASM: 'no', ECMULTGENKB: 2, ECMULTWINDOW: 2 }
|
env_vars: { CC: 'clang', ASM: 'auto' }
|
||||||
|
- docker_arch: x64
|
||||||
|
runner: ubuntu-latest
|
||||||
|
binary_arch: i686
|
||||||
|
env_vars: { CC: 'i686-linux-gnu-gcc', HOST: 'i686-linux-gnu', ASM: 'auto' }
|
||||||
|
- docker_arch: arm64
|
||||||
|
runner: ubuntu-24.04-arm
|
||||||
|
binary_arch: arm64
|
||||||
|
env_vars: { CC: 'clang', ASM: 'auto' }
|
||||||
|
- docker_arch: x64
|
||||||
|
runner: ubuntu-latest
|
||||||
|
binary_arch: x64
|
||||||
|
env_vars: { CC: 'clang', ASM: 'no', ECMULTGENKB: 2, ECMULTWINDOW: 2 }
|
||||||
|
- docker_arch: x64
|
||||||
|
runner: ubuntu-latest
|
||||||
|
binary_arch: i686
|
||||||
|
env_vars: { CC: 'i686-linux-gnu-gcc', HOST: 'i686-linux-gnu', ASM: 'no', ECMULTGENKB: 2, ECMULTWINDOW: 2 }
|
||||||
|
- docker_arch: arm64
|
||||||
|
runner: ubuntu-24.04-arm
|
||||||
|
binary_arch: arm64
|
||||||
|
env_vars: { CC: 'clang', ASM: 'no', ECMULTGENKB: 2, ECMULTWINDOW: 2 }
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# The `--error-exitcode` is required to make the test fail if valgrind found errors,
|
# The `--error-exitcode` is required to make the test fail if valgrind found errors,
|
||||||
@@ -329,11 +356,11 @@ jobs:
|
|||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: CI script
|
- name: CI script
|
||||||
env: ${{ matrix.configuration.env_vars }}
|
env: ${{ matrix.env_vars }}
|
||||||
uses: ./.github/actions/run-in-docker-action
|
uses: ./.github/actions/run-in-docker-action
|
||||||
with:
|
with:
|
||||||
dockerfile: ./ci/linux-debian.Dockerfile
|
dockerfile: ./ci/linux-debian.Dockerfile
|
||||||
tag: linux-debian-image
|
tag: ${{ matrix.docker_arch }}-debian-image
|
||||||
|
|
||||||
- name: Print logs
|
- name: Print logs
|
||||||
uses: ./.github/actions/print-logs
|
uses: ./.github/actions/print-logs
|
||||||
@@ -377,7 +404,7 @@ jobs:
|
|||||||
uses: ./.github/actions/run-in-docker-action
|
uses: ./.github/actions/run-in-docker-action
|
||||||
with:
|
with:
|
||||||
dockerfile: ./ci/linux-debian.Dockerfile
|
dockerfile: ./ci/linux-debian.Dockerfile
|
||||||
tag: linux-debian-image
|
tag: x64-debian-image
|
||||||
|
|
||||||
- name: Print logs
|
- name: Print logs
|
||||||
uses: ./.github/actions/print-logs
|
uses: ./.github/actions/print-logs
|
||||||
@@ -428,7 +455,7 @@ jobs:
|
|||||||
uses: ./.github/actions/run-in-docker-action
|
uses: ./.github/actions/run-in-docker-action
|
||||||
with:
|
with:
|
||||||
dockerfile: ./ci/linux-debian.Dockerfile
|
dockerfile: ./ci/linux-debian.Dockerfile
|
||||||
tag: linux-debian-image
|
tag: x64-debian-image
|
||||||
|
|
||||||
- name: Print logs
|
- name: Print logs
|
||||||
uses: ./.github/actions/print-logs
|
uses: ./.github/actions/print-logs
|
||||||
@@ -471,7 +498,7 @@ jobs:
|
|||||||
uses: ./.github/actions/run-in-docker-action
|
uses: ./.github/actions/run-in-docker-action
|
||||||
with:
|
with:
|
||||||
dockerfile: ./ci/linux-debian.Dockerfile
|
dockerfile: ./ci/linux-debian.Dockerfile
|
||||||
tag: linux-debian-image
|
tag: x64-debian-image
|
||||||
|
|
||||||
- name: Print logs
|
- name: Print logs
|
||||||
uses: ./.github/actions/print-logs
|
uses: ./.github/actions/print-logs
|
||||||
@@ -546,13 +573,13 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
env_vars:
|
env_vars:
|
||||||
- { WIDEMUL: 'int64', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
|
- { WIDEMUL: 'int64', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', MUSIG: 'yes', ELLSWIFT: 'yes' }
|
||||||
- { WIDEMUL: 'int128_struct', ECMULTGENPRECISION: 2, ECMULTWINDOW: 4 }
|
- { WIDEMUL: 'int128_struct', ECMULTGENPRECISION: 2, ECMULTWINDOW: 4 }
|
||||||
- { WIDEMUL: 'int128', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
|
- { WIDEMUL: 'int128', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', MUSIG: 'yes', ELLSWIFT: 'yes' }
|
||||||
- { WIDEMUL: 'int128', RECOVERY: 'yes' }
|
- { WIDEMUL: 'int128', RECOVERY: 'yes' }
|
||||||
- { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes' }
|
- { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', MUSIG: 'yes', ELLSWIFT: 'yes' }
|
||||||
- { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CC: 'gcc' }
|
- { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', MUSIG: 'yes', ELLSWIFT: 'yes', CC: 'gcc' }
|
||||||
- { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', ELLSWIFT: 'yes', CPPFLAGS: '-DVERIFY' }
|
- { WIDEMUL: 'int128', RECOVERY: 'yes', ECDH: 'yes', EXTRAKEYS: 'yes', SCHNORRSIG: 'yes', MUSIG: 'yes', ELLSWIFT: 'yes', CPPFLAGS: '-DVERIFY' }
|
||||||
- BUILD: 'distcheck'
|
- BUILD: 'distcheck'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@@ -625,10 +652,11 @@ jobs:
|
|||||||
|
|
||||||
- name: Symbol check
|
- name: Symbol check
|
||||||
if: ${{ matrix.configuration.symbol_check }}
|
if: ${{ matrix.configuration.symbol_check }}
|
||||||
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
py -3 --version
|
py -3 --version
|
||||||
py -3 -m pip install lief
|
py -3 -m pip install lief
|
||||||
py -3 .\tools\symbol-check.py build\bin\RelWithDebInfo\libsecp256k1-5.dll
|
py -3 ./tools/symbol-check.py build/bin/RelWithDebInfo/libsecp256k1-*.dll
|
||||||
|
|
||||||
- name: Check
|
- name: Check
|
||||||
run: |
|
run: |
|
||||||
@@ -678,7 +706,7 @@ jobs:
|
|||||||
uses: ./.github/actions/run-in-docker-action
|
uses: ./.github/actions/run-in-docker-action
|
||||||
with:
|
with:
|
||||||
dockerfile: ./ci/linux-debian.Dockerfile
|
dockerfile: ./ci/linux-debian.Dockerfile
|
||||||
tag: linux-debian-image
|
tag: x64-debian-image
|
||||||
|
|
||||||
- name: Print logs
|
- name: Print logs
|
||||||
uses: ./.github/actions/print-logs
|
uses: ./.github/actions/print-logs
|
||||||
@@ -697,7 +725,7 @@ jobs:
|
|||||||
uses: ./.github/actions/run-in-docker-action
|
uses: ./.github/actions/run-in-docker-action
|
||||||
with:
|
with:
|
||||||
dockerfile: ./ci/linux-debian.Dockerfile
|
dockerfile: ./ci/linux-debian.Dockerfile
|
||||||
tag: linux-debian-image
|
tag: x64-debian-image
|
||||||
command: |
|
command: |
|
||||||
g++ -Werror include/*.h
|
g++ -Werror include/*.h
|
||||||
clang -Werror -x c++-header include/*.h
|
clang -Werror -x c++-header include/*.h
|
||||||
|
|||||||
@@ -7,11 +7,29 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.7.0] - 2025-07-21
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
- CMake: Added `secp256k1_objs` interface library to allow parent projects to embed libsecp256k1 object files into their own static libraries.
|
||||||
|
- build: Added `SECP256K1_NO_API_VISIBILITY_ATTRIBUTES` preprocessor flag (CMake option: `SECP256K1_ENABLE_API_VISIBILITY_ATTRIBUTES`) that disables explicit "visibility" attributes for API symbols. Defining this macro enables the user to control the visibility of the API symbols via `-fvisibility=<value>` when building libsecp256k1. (All non-API declarations will always have hidden visibility, even with `SECP256K1_ENABLE_API_VISIBILITY_ATTRIBUTES` defined.) For instance, `-fvisibility=hidden` can be useful even for the API symbols, e.g., when building a static libsecp256k1 which is linked into a shared library, and the latter should not re-export the libsecp256k1 API.
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
- The pointers `secp256k1_context_static` and `secp256k1_context_no_precomp` to the constant context objects are now `const`.
|
||||||
|
- Removed `SECP256K1_WARN_UNUSED_RESULT` attribute (defined as `__attribute__ ((__warn_unused_result__))`) from several API functions that always return 1. Compilers will no longer warn if the return value is unused.
|
||||||
|
- CMake: Building with CMake is no longer considered experimental.
|
||||||
|
- CMake: The minimum required CMake version was increased to 3.22.
|
||||||
|
- CMake: Shared libraries built with CMake on FreeBSD now create the full versioned filename and symlink chain, matching the behavior of autotools builds.
|
||||||
|
|
||||||
#### Removed
|
#### Removed
|
||||||
- Removed previously deprecated function aliases `secp256k1_ec_privkey_negate`, `secp256k1_ec_privkey_tweak_add` and
|
- Removed previously deprecated function aliases `secp256k1_ec_privkey_negate`, `secp256k1_ec_privkey_tweak_add` and
|
||||||
`secp256k1_ec_privkey_tweak_mul`. Use `secp256k1_ec_seckey_negate`, `secp256k1_ec_seckey_tweak_add` and
|
`secp256k1_ec_privkey_tweak_mul`. Use `secp256k1_ec_seckey_negate`, `secp256k1_ec_seckey_tweak_add` and
|
||||||
`secp256k1_ec_seckey_tweak_mul` instead.
|
`secp256k1_ec_seckey_tweak_mul` instead.
|
||||||
|
|
||||||
|
#### ABI Compatibility
|
||||||
|
The symbols `secp256k1_ec_privkey_negate`, `secp256k1_ec_privkey_tweak_add`, and `secp256k1_ec_privkey_tweak_mul` were removed.
|
||||||
|
The pointers `secp256k1_context_static` and `secp256k1_context_no_precomp` have been made `const`.
|
||||||
|
Otherwise, the library maintains backward compatibility with version 0.6.0.
|
||||||
|
|
||||||
## [0.6.0] - 2024-11-04
|
## [0.6.0] - 2024-11-04
|
||||||
|
|
||||||
#### Added
|
#### Added
|
||||||
@@ -115,7 +133,7 @@ We strongly recommend updating to 0.3.1 if you use or plan to use Clang >=14 to
|
|||||||
- Fix "constant-timeness" issue with Clang >=14 that could leave applications using libsecp256k1 vulnerable to a timing side-channel attack. The fix avoids secret-dependent control flow and secret-dependent memory accesses in conditional moves of memory objects when libsecp256k1 is compiled with Clang >=14.
|
- Fix "constant-timeness" issue with Clang >=14 that could leave applications using libsecp256k1 vulnerable to a timing side-channel attack. The fix avoids secret-dependent control flow and secret-dependent memory accesses in conditional moves of memory objects when libsecp256k1 is compiled with Clang >=14.
|
||||||
|
|
||||||
#### Added
|
#### Added
|
||||||
- Added tests against [Project Wycheproof's](https://github.com/google/wycheproof/) set of ECDSA test vectors (Bitcoin "low-S" variant), a fixed set of test cases designed to trigger various edge cases.
|
- Added tests against [Project Wycheproof's](https://github.com/C2SP/wycheproof/) set of ECDSA test vectors (Bitcoin "low-S" variant), a fixed set of test cases designed to trigger various edge cases.
|
||||||
|
|
||||||
#### Changed
|
#### Changed
|
||||||
- Increased minimum required CMake version to 3.13. CMake builds remain experimental.
|
- Increased minimum required CMake version to 3.13. CMake builds remain experimental.
|
||||||
@@ -169,7 +187,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).
|
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.
|
Therefore, this version number does not uniquely identify a set of source files.
|
||||||
|
|
||||||
[unreleased]: https://github.com/bitcoin-core/secp256k1/compare/v0.6.0...HEAD
|
[unreleased]: https://github.com/bitcoin-core/secp256k1/compare/v0.7.0...HEAD
|
||||||
|
[0.7.0]: https://github.com/bitcoin-core/secp256k1/compare/v0.6.0...v0.7.0
|
||||||
[0.6.0]: https://github.com/bitcoin-core/secp256k1/compare/v0.5.1...v0.6.0
|
[0.6.0]: https://github.com/bitcoin-core/secp256k1/compare/v0.5.1...v0.6.0
|
||||||
[0.5.1]: https://github.com/bitcoin-core/secp256k1/compare/v0.5.0...v0.5.1
|
[0.5.1]: https://github.com/bitcoin-core/secp256k1/compare/v0.5.0...v0.5.1
|
||||||
[0.5.0]: https://github.com/bitcoin-core/secp256k1/compare/v0.4.1...v0.5.0
|
[0.5.0]: https://github.com/bitcoin-core/secp256k1/compare/v0.4.1...v0.5.0
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
cmake_minimum_required(VERSION 3.16)
|
cmake_minimum_required(VERSION 3.22)
|
||||||
|
|
||||||
#=============================
|
#=============================
|
||||||
# Project / Package metadata
|
# Project / Package metadata
|
||||||
@@ -7,31 +7,21 @@ project(libsecp256k1
|
|||||||
# The package (a.k.a. release) version is based on semantic versioning 2.0.0 of
|
# 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
|
# the API. All changes in experimental modules are treated as
|
||||||
# backwards-compatible and therefore at most increase the minor version.
|
# backwards-compatible and therefore at most increase the minor version.
|
||||||
VERSION 0.6.1
|
VERSION 0.7.1
|
||||||
DESCRIPTION "Optimized C library for ECDSA signatures and secret/public key operations on curve secp256k1."
|
DESCRIPTION "Optimized C library for ECDSA signatures and secret/public key operations on curve secp256k1."
|
||||||
HOMEPAGE_URL "https://github.com/bitcoin-core/secp256k1"
|
HOMEPAGE_URL "https://github.com/bitcoin-core/secp256k1"
|
||||||
LANGUAGES C
|
LANGUAGES C
|
||||||
)
|
)
|
||||||
enable_testing()
|
enable_testing()
|
||||||
|
include(CTestUseLaunchers) # Allow users to set CTEST_USE_LAUNCHERS in custom `ctest -S` scripts.
|
||||||
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
|
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
|
||||||
|
|
||||||
if(CMAKE_VERSION VERSION_LESS 3.21)
|
|
||||||
# Emulates CMake 3.21+ behavior.
|
|
||||||
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
|
||||||
set(PROJECT_IS_TOP_LEVEL ON)
|
|
||||||
set(${PROJECT_NAME}_IS_TOP_LEVEL ON)
|
|
||||||
else()
|
|
||||||
set(PROJECT_IS_TOP_LEVEL OFF)
|
|
||||||
set(${PROJECT_NAME}_IS_TOP_LEVEL OFF)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# The library version is based on libtool versioning of the ABI. The set of
|
# The library version is based on libtool versioning of the ABI. The set of
|
||||||
# rules for updating the version can be found here:
|
# rules for updating the version can be found here:
|
||||||
# https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
|
# 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
|
# All changes in experimental modules are treated as if they don't affect the
|
||||||
# interface and therefore only increase the revision.
|
# interface and therefore only increase the revision.
|
||||||
set(${PROJECT_NAME}_LIB_VERSION_CURRENT 5)
|
set(${PROJECT_NAME}_LIB_VERSION_CURRENT 6)
|
||||||
set(${PROJECT_NAME}_LIB_VERSION_REVISION 1)
|
set(${PROJECT_NAME}_LIB_VERSION_REVISION 1)
|
||||||
set(${PROJECT_NAME}_LIB_VERSION_AGE 0)
|
set(${PROJECT_NAME}_LIB_VERSION_AGE 0)
|
||||||
|
|
||||||
@@ -52,6 +42,8 @@ endif()
|
|||||||
|
|
||||||
option(SECP256K1_INSTALL "Enable installation." ${PROJECT_IS_TOP_LEVEL})
|
option(SECP256K1_INSTALL "Enable installation." ${PROJECT_IS_TOP_LEVEL})
|
||||||
|
|
||||||
|
option(SECP256K1_ENABLE_API_VISIBILITY_ATTRIBUTES "Enable visibility attributes in the API." ON)
|
||||||
|
|
||||||
## Modules
|
## Modules
|
||||||
|
|
||||||
# We declare all options before processing them, to make sure we can express
|
# We declare all options before processing them, to make sure we can express
|
||||||
@@ -63,40 +55,6 @@ option(SECP256K1_ENABLE_MODULE_SCHNORRSIG "Enable schnorrsig module." ON)
|
|||||||
option(SECP256K1_ENABLE_MODULE_MUSIG "Enable musig module." ON)
|
option(SECP256K1_ENABLE_MODULE_MUSIG "Enable musig module." ON)
|
||||||
option(SECP256K1_ENABLE_MODULE_ELLSWIFT "Enable ElligatorSwift module." ON)
|
option(SECP256K1_ENABLE_MODULE_ELLSWIFT "Enable ElligatorSwift module." ON)
|
||||||
|
|
||||||
# Processing must be done in a topological sorting of the dependency graph
|
|
||||||
# (dependent module first).
|
|
||||||
if(SECP256K1_ENABLE_MODULE_ELLSWIFT)
|
|
||||||
add_compile_definitions(ENABLE_MODULE_ELLSWIFT=1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(SECP256K1_ENABLE_MODULE_MUSIG)
|
|
||||||
if(DEFINED SECP256K1_ENABLE_MODULE_SCHNORRSIG AND NOT SECP256K1_ENABLE_MODULE_SCHNORRSIG)
|
|
||||||
message(FATAL_ERROR "Module dependency error: You have disabled the schnorrsig module explicitly, but it is required by the musig module.")
|
|
||||||
endif()
|
|
||||||
set(SECP256K1_ENABLE_MODULE_SCHNORRSIG ON)
|
|
||||||
add_compile_definitions(ENABLE_MODULE_MUSIG=1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(SECP256K1_ENABLE_MODULE_SCHNORRSIG)
|
|
||||||
if(DEFINED SECP256K1_ENABLE_MODULE_EXTRAKEYS AND NOT SECP256K1_ENABLE_MODULE_EXTRAKEYS)
|
|
||||||
message(FATAL_ERROR "Module dependency error: You have disabled the extrakeys module explicitly, but it is required by the schnorrsig module.")
|
|
||||||
endif()
|
|
||||||
set(SECP256K1_ENABLE_MODULE_EXTRAKEYS ON)
|
|
||||||
add_compile_definitions(ENABLE_MODULE_SCHNORRSIG=1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(SECP256K1_ENABLE_MODULE_EXTRAKEYS)
|
|
||||||
add_compile_definitions(ENABLE_MODULE_EXTRAKEYS=1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(SECP256K1_ENABLE_MODULE_RECOVERY)
|
|
||||||
add_compile_definitions(ENABLE_MODULE_RECOVERY=1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(SECP256K1_ENABLE_MODULE_ECDH)
|
|
||||||
add_compile_definitions(ENABLE_MODULE_ECDH=1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
option(SECP256K1_USE_EXTERNAL_DEFAULT_CALLBACKS "Enable external default callback functions." OFF)
|
option(SECP256K1_USE_EXTERNAL_DEFAULT_CALLBACKS "Enable external default callback functions." OFF)
|
||||||
if(SECP256K1_USE_EXTERNAL_DEFAULT_CALLBACKS)
|
if(SECP256K1_USE_EXTERNAL_DEFAULT_CALLBACKS)
|
||||||
add_compile_definitions(USE_EXTERNAL_DEFAULT_CALLBACKS=1)
|
add_compile_definitions(USE_EXTERNAL_DEFAULT_CALLBACKS=1)
|
||||||
@@ -356,6 +314,7 @@ else()
|
|||||||
set(cross_status "FALSE")
|
set(cross_status "FALSE")
|
||||||
endif()
|
endif()
|
||||||
message("Cross compiling ....................... ${cross_status}")
|
message("Cross compiling ....................... ${cross_status}")
|
||||||
|
message("API visibility attributes ............. ${SECP256K1_ENABLE_API_VISIBILITY_ATTRIBUTES}")
|
||||||
message("Valgrind .............................. ${SECP256K1_VALGRIND}")
|
message("Valgrind .............................. ${SECP256K1_VALGRIND}")
|
||||||
get_directory_property(definitions COMPILE_DEFINITIONS)
|
get_directory_property(definitions COMPILE_DEFINITIONS)
|
||||||
string(REPLACE ";" " " definitions "${definitions}")
|
string(REPLACE ";" " " definitions "${definitions}")
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
{
|
{
|
||||||
"cmakeMinimumRequired": {"major": 3, "minor": 21, "patch": 0},
|
|
||||||
"version": 3,
|
"version": 3,
|
||||||
"configurePresets": [
|
"configurePresets": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -108,8 +108,8 @@ Building with Autotools
|
|||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Building with CMake (experimental)
|
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.
|
To maintain a pristine source tree, CMake encourages to perform an out-of-source build by using a separate dedicated build tree.
|
||||||
|
|
||||||
@@ -151,8 +151,9 @@ Usage examples can be found in the [examples](examples) directory. To compile th
|
|||||||
* [Schnorr signatures example](examples/schnorr.c)
|
* [Schnorr signatures example](examples/schnorr.c)
|
||||||
* [Deriving a shared secret (ECDH) example](examples/ecdh.c)
|
* [Deriving a shared secret (ECDH) example](examples/ecdh.c)
|
||||||
* [ElligatorSwift key exchange example](examples/ellswift.c)
|
* [ElligatorSwift key exchange example](examples/ellswift.c)
|
||||||
|
* [MuSig2 Schnorr multi-signatures example](examples/musig.c)
|
||||||
|
|
||||||
To compile the Schnorr signature and ECDH examples, you also need to configure with `--enable-module-schnorrsig` and `--enable-module-ecdh`.
|
To compile the examples, make sure the corresponding modules are enabled.
|
||||||
|
|
||||||
Benchmark
|
Benchmark
|
||||||
------------
|
------------
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ then
|
|||||||
case "$HOST" in
|
case "$HOST" in
|
||||||
*mingw*)
|
*mingw*)
|
||||||
ls -l .libs
|
ls -l .libs
|
||||||
python3 ./tools/symbol-check.py .libs/libsecp256k1-5.dll
|
python3 ./tools/symbol-check.py .libs/libsecp256k1-*.dll
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
python3 ./tools/symbol-check.py .libs/libsecp256k1.so
|
python3 ./tools/symbol-check.py .libs/libsecp256k1.so
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ RUN apt-get update && apt-get install --no-install-recommends -y \
|
|||||||
apt-get clean && rm -rf /var/lib/apt/lists/*
|
apt-get clean && rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
# Build and install gcc snapshot
|
# Build and install gcc snapshot
|
||||||
ARG GCC_SNAPSHOT_MAJOR=15
|
ARG GCC_SNAPSHOT_MAJOR=16
|
||||||
RUN apt-get update && apt-get install --no-install-recommends -y wget libgmp-dev libmpfr-dev libmpc-dev flex && \
|
RUN apt-get update && apt-get install --no-install-recommends -y wget libgmp-dev libmpfr-dev libmpc-dev flex && \
|
||||||
mkdir gcc && cd gcc && \
|
mkdir gcc && cd gcc && \
|
||||||
wget --progress=dot:giga --https-only --recursive --accept '*.tar.xz' --level 1 --no-directories "https://gcc.gnu.org/pub/gcc/snapshots/LATEST-${GCC_SNAPSHOT_MAJOR}" && \
|
wget --progress=dot:giga --https-only --recursive --accept '*.tar.xz' --level 1 --no-directories "https://gcc.gnu.org/pub/gcc/snapshots/LATEST-${GCC_SNAPSHOT_MAJOR}" && \
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ AC_PREREQ([2.60])
|
|||||||
# the API. All changes in experimental modules are treated as
|
# the API. All changes in experimental modules are treated as
|
||||||
# backwards-compatible and therefore at most increase the minor version.
|
# backwards-compatible and therefore at most increase the minor version.
|
||||||
define(_PKG_VERSION_MAJOR, 0)
|
define(_PKG_VERSION_MAJOR, 0)
|
||||||
define(_PKG_VERSION_MINOR, 6)
|
define(_PKG_VERSION_MINOR, 7)
|
||||||
define(_PKG_VERSION_PATCH, 1)
|
define(_PKG_VERSION_PATCH, 1)
|
||||||
define(_PKG_VERSION_IS_RELEASE, false)
|
define(_PKG_VERSION_IS_RELEASE, false)
|
||||||
|
|
||||||
@@ -13,7 +13,7 @@ define(_PKG_VERSION_IS_RELEASE, false)
|
|||||||
# https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
|
# 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
|
# All changes in experimental modules are treated as if they don't affect the
|
||||||
# interface and therefore only increase the revision.
|
# interface and therefore only increase the revision.
|
||||||
define(_LIB_VERSION_CURRENT, 5)
|
define(_LIB_VERSION_CURRENT, 6)
|
||||||
define(_LIB_VERSION_REVISION, 1)
|
define(_LIB_VERSION_REVISION, 1)
|
||||||
define(_LIB_VERSION_AGE, 0)
|
define(_LIB_VERSION_AGE, 0)
|
||||||
|
|
||||||
|
|||||||
@@ -121,45 +121,57 @@ typedef int (*secp256k1_nonce_function)(
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Symbol visibility. */
|
/* Symbol visibility. */
|
||||||
#if defined(_WIN32)
|
#if !defined(SECP256K1_API) && defined(SECP256K1_NO_API_VISIBILITY_ATTRIBUTES)
|
||||||
/* GCC for Windows (e.g., MinGW) accepts the __declspec syntax
|
/* The user has requested that we don't specify visibility attributes in
|
||||||
* for MSVC compatibility. A __declspec declaration implies (but is not
|
* the public API.
|
||||||
* exactly equivalent to) __attribute__ ((visibility("default"))), and so we
|
*
|
||||||
* actually want __declspec even on GCC, see "Microsoft Windows Function
|
* Since all our non-API declarations use the static qualifier, this means
|
||||||
* Attributes" in the GCC manual and the recommendations in
|
* that the user can use -fvisibility=<value> to set the visibility of the
|
||||||
* https://gcc.gnu.org/wiki/Visibility. */
|
* API symbols. For instance, -fvisibility=hidden can be useful *even for
|
||||||
# if defined(SECP256K1_BUILD)
|
* the API symbols*, e.g., when building a static library which is linked
|
||||||
# if defined(DLL_EXPORT) || defined(SECP256K1_DLL_EXPORT)
|
* into a shared library, and the latter should not re-export the
|
||||||
/* Building libsecp256k1 as a DLL.
|
* libsecp256k1 API.
|
||||||
* 1. If using Libtool, it defines DLL_EXPORT automatically.
|
*
|
||||||
* 2. In other cases, SECP256K1_DLL_EXPORT must be defined. */
|
* While visibility is a concept that applies only to shared libraries,
|
||||||
# define SECP256K1_API extern __declspec (dllexport)
|
* setting visibility will still make a difference when building a static
|
||||||
# else
|
* library: the visibility settings will be stored in the static library,
|
||||||
/* Building libsecp256k1 as a static library on Windows.
|
* solely for the potential case that the static library will be linked into
|
||||||
* No declspec is needed, and so we would want the non-Windows-specific
|
* a shared library. In that case, the stored visibility settings will
|
||||||
* logic below take care of this case. However, this may result in setting
|
* resurface and be honored for the shared library. */
|
||||||
* __attribute__ ((visibility("default"))), which is supposed to be a noop
|
# define SECP256K1_API extern
|
||||||
* on Windows but may trigger warnings when compiling with -flto due to a
|
|
||||||
* bug in GCC, see
|
|
||||||
* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116478 . */
|
|
||||||
# define SECP256K1_API extern
|
|
||||||
# endif
|
|
||||||
/* The user must define SECP256K1_STATIC when consuming libsecp256k1 as a static
|
|
||||||
* library on Windows. */
|
|
||||||
# elif !defined(SECP256K1_STATIC)
|
|
||||||
/* Consuming libsecp256k1 as a DLL. */
|
|
||||||
# define SECP256K1_API extern __declspec (dllimport)
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
#ifndef SECP256K1_API
|
#if !defined(SECP256K1_API)
|
||||||
/* All cases not captured by the Windows-specific logic. */
|
# if defined(SECP256K1_BUILD)
|
||||||
# if defined(__GNUC__) && (__GNUC__ >= 4) && defined(SECP256K1_BUILD)
|
/* On Windows, assume a shared library only if explicitly requested.
|
||||||
/* Building libsecp256k1 using GCC or compatible. */
|
* 1. If using Libtool, it defines DLL_EXPORT automatically.
|
||||||
# define SECP256K1_API extern __attribute__ ((visibility ("default")))
|
* 2. In other cases, SECP256K1_DLL_EXPORT must be defined. */
|
||||||
# else
|
# if defined(_WIN32) && (defined(SECP256K1_DLL_EXPORT) || defined(DLL_EXPORT))
|
||||||
/* Fall back to standard C's extern. */
|
/* GCC for Windows (e.g., MinGW) accepts the __declspec syntax for
|
||||||
# define SECP256K1_API extern
|
* MSVC compatibility. A __declspec declaration implies (but is not
|
||||||
# endif
|
* exactly equivalent to) __attribute__ ((visibility("default"))),
|
||||||
|
* and so we actually want __declspec even on GCC, see "Microsoft
|
||||||
|
* Windows Function Attributes" in the GCC manual and the
|
||||||
|
* recommendations in https://gcc.gnu.org/wiki/Visibility . */
|
||||||
|
# define SECP256K1_API extern __declspec(dllexport)
|
||||||
|
/* Avoid __attribute__ ((visibility("default"))) on Windows to get rid
|
||||||
|
* of warnings when compiling with -flto due to a bug in GCC, see
|
||||||
|
* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116478 . */
|
||||||
|
# elif !defined(_WIN32) && defined (__GNUC__) && (__GNUC__ >= 4)
|
||||||
|
# define SECP256K1_API extern __attribute__ ((visibility("default")))
|
||||||
|
# else
|
||||||
|
# define SECP256K1_API extern
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
/* On Windows, SECP256K1_STATIC must be defined when consuming
|
||||||
|
* libsecp256k1 as a static library. Note that SECP256K1_STATIC is a
|
||||||
|
* "consumer-only" macro, and it has no meaning when building
|
||||||
|
* libsecp256k1. */
|
||||||
|
# if defined(_WIN32) && !defined(SECP256K1_STATIC)
|
||||||
|
# define SECP256K1_API extern __declspec(dllimport)
|
||||||
|
# else
|
||||||
|
# define SECP256K1_API extern
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Warning attributes
|
/* Warning attributes
|
||||||
|
|||||||
@@ -1,5 +1,49 @@
|
|||||||
# Must be included before CMAKE_INSTALL_INCLUDEDIR is used.
|
add_library(secp256k1)
|
||||||
include(GNUInstallDirs)
|
|
||||||
|
set_property(TARGET secp256k1 PROPERTY PUBLIC_HEADER
|
||||||
|
${PROJECT_SOURCE_DIR}/include/secp256k1.h
|
||||||
|
${PROJECT_SOURCE_DIR}/include/secp256k1_preallocated.h
|
||||||
|
)
|
||||||
|
|
||||||
|
# Processing must be done in a topological sorting of the dependency graph
|
||||||
|
# (dependent module first).
|
||||||
|
if(SECP256K1_ENABLE_MODULE_ELLSWIFT)
|
||||||
|
add_compile_definitions(ENABLE_MODULE_ELLSWIFT=1)
|
||||||
|
set_property(TARGET secp256k1 APPEND PROPERTY PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include/secp256k1_ellswift.h)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(SECP256K1_ENABLE_MODULE_MUSIG)
|
||||||
|
if(DEFINED SECP256K1_ENABLE_MODULE_SCHNORRSIG AND NOT SECP256K1_ENABLE_MODULE_SCHNORRSIG)
|
||||||
|
message(FATAL_ERROR "Module dependency error: You have disabled the schnorrsig module explicitly, but it is required by the musig module.")
|
||||||
|
endif()
|
||||||
|
set(SECP256K1_ENABLE_MODULE_SCHNORRSIG ON)
|
||||||
|
add_compile_definitions(ENABLE_MODULE_MUSIG=1)
|
||||||
|
set_property(TARGET secp256k1 APPEND PROPERTY PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include/secp256k1_musig.h)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(SECP256K1_ENABLE_MODULE_SCHNORRSIG)
|
||||||
|
if(DEFINED SECP256K1_ENABLE_MODULE_EXTRAKEYS AND NOT SECP256K1_ENABLE_MODULE_EXTRAKEYS)
|
||||||
|
message(FATAL_ERROR "Module dependency error: You have disabled the extrakeys module explicitly, but it is required by the schnorrsig module.")
|
||||||
|
endif()
|
||||||
|
set(SECP256K1_ENABLE_MODULE_EXTRAKEYS ON)
|
||||||
|
add_compile_definitions(ENABLE_MODULE_SCHNORRSIG=1)
|
||||||
|
set_property(TARGET secp256k1 APPEND PROPERTY PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include/secp256k1_schnorrsig.h)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(SECP256K1_ENABLE_MODULE_EXTRAKEYS)
|
||||||
|
add_compile_definitions(ENABLE_MODULE_EXTRAKEYS=1)
|
||||||
|
set_property(TARGET secp256k1 APPEND PROPERTY PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include/secp256k1_extrakeys.h)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(SECP256K1_ENABLE_MODULE_RECOVERY)
|
||||||
|
add_compile_definitions(ENABLE_MODULE_RECOVERY=1)
|
||||||
|
set_property(TARGET secp256k1 APPEND PROPERTY PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include/secp256k1_recovery.h)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(SECP256K1_ENABLE_MODULE_ECDH)
|
||||||
|
add_compile_definitions(ENABLE_MODULE_ECDH=1)
|
||||||
|
set_property(TARGET secp256k1 APPEND PROPERTY PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include/secp256k1_ecdh.h)
|
||||||
|
endif()
|
||||||
|
|
||||||
add_library(secp256k1_precomputed OBJECT EXCLUDE_FROM_ALL
|
add_library(secp256k1_precomputed OBJECT EXCLUDE_FROM_ALL
|
||||||
precomputed_ecmult.c
|
precomputed_ecmult.c
|
||||||
@@ -8,7 +52,16 @@ add_library(secp256k1_precomputed OBJECT EXCLUDE_FROM_ALL
|
|||||||
|
|
||||||
# Add objects explicitly rather than linking to the object libs to keep them
|
# Add objects explicitly rather than linking to the object libs to keep them
|
||||||
# from being exported.
|
# from being exported.
|
||||||
add_library(secp256k1 secp256k1.c $<TARGET_OBJECTS:secp256k1_precomputed>)
|
target_sources(secp256k1 PRIVATE secp256k1.c $<TARGET_OBJECTS:secp256k1_precomputed>)
|
||||||
|
|
||||||
|
if(NOT SECP256K1_ENABLE_API_VISIBILITY_ATTRIBUTES)
|
||||||
|
target_compile_definitions(secp256k1 PRIVATE SECP256K1_NO_API_VISIBILITY_ATTRIBUTES)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Create a helper lib that parent projects can use to link secp256k1 into a
|
||||||
|
# static lib.
|
||||||
|
add_library(secp256k1_objs INTERFACE)
|
||||||
|
target_sources(secp256k1_objs INTERFACE $<TARGET_OBJECTS:secp256k1> $<TARGET_OBJECTS:secp256k1_precomputed>)
|
||||||
|
|
||||||
add_library(secp256k1_asm INTERFACE)
|
add_library(secp256k1_asm INTERFACE)
|
||||||
if(SECP256K1_ASM STREQUAL "arm32")
|
if(SECP256K1_ASM STREQUAL "arm32")
|
||||||
@@ -17,6 +70,7 @@ if(SECP256K1_ASM STREQUAL "arm32")
|
|||||||
asm/field_10x26_arm.s
|
asm/field_10x26_arm.s
|
||||||
)
|
)
|
||||||
target_sources(secp256k1 PRIVATE $<TARGET_OBJECTS:secp256k1_asm_arm>)
|
target_sources(secp256k1 PRIVATE $<TARGET_OBJECTS:secp256k1_asm_arm>)
|
||||||
|
target_sources(secp256k1_objs INTERFACE $<TARGET_OBJECTS:secp256k1_asm_arm>)
|
||||||
target_link_libraries(secp256k1_asm INTERFACE secp256k1_asm_arm)
|
target_link_libraries(secp256k1_asm INTERFACE secp256k1_asm_arm)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -31,10 +85,13 @@ endif()
|
|||||||
get_target_property(use_pic secp256k1 POSITION_INDEPENDENT_CODE)
|
get_target_property(use_pic secp256k1 POSITION_INDEPENDENT_CODE)
|
||||||
set_target_properties(secp256k1_precomputed PROPERTIES POSITION_INDEPENDENT_CODE ${use_pic})
|
set_target_properties(secp256k1_precomputed PROPERTIES POSITION_INDEPENDENT_CODE ${use_pic})
|
||||||
|
|
||||||
|
# Add the include path for parent projects so that they don't have to manually add it.
|
||||||
target_include_directories(secp256k1 INTERFACE
|
target_include_directories(secp256k1 INTERFACE
|
||||||
# Add the include path for parent projects so that they don't have to manually add it.
|
|
||||||
$<BUILD_INTERFACE:$<$<NOT:$<BOOL:${PROJECT_IS_TOP_LEVEL}>>:${PROJECT_SOURCE_DIR}/include>>
|
$<BUILD_INTERFACE:$<$<NOT:$<BOOL:${PROJECT_IS_TOP_LEVEL}>>:${PROJECT_SOURCE_DIR}/include>>
|
||||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
)
|
||||||
|
set_target_properties(secp256k1_objs PROPERTIES
|
||||||
|
INTERFACE_COMPILE_DEFINITIONS "$<TARGET_PROPERTY:secp256k1,INTERFACE_COMPILE_DEFINITIONS>"
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "$<TARGET_PROPERTY:secp256k1,INTERFACE_INCLUDE_DIRECTORIES>"
|
||||||
)
|
)
|
||||||
|
|
||||||
# This emulates Libtool to make sure Libtool and CMake agree on the ABI version,
|
# This emulates Libtool to make sure Libtool and CMake agree on the ABI version,
|
||||||
@@ -43,25 +100,17 @@ math(EXPR ${PROJECT_NAME}_soversion "${${PROJECT_NAME}_LIB_VERSION_CURRENT} - ${
|
|||||||
set_target_properties(secp256k1 PROPERTIES
|
set_target_properties(secp256k1 PROPERTIES
|
||||||
SOVERSION ${${PROJECT_NAME}_soversion}
|
SOVERSION ${${PROJECT_NAME}_soversion}
|
||||||
)
|
)
|
||||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
if(CMAKE_SYSTEM_NAME MATCHES "^(Linux|FreeBSD)$")
|
||||||
set_target_properties(secp256k1 PROPERTIES
|
set_target_properties(secp256k1 PROPERTIES
|
||||||
VERSION ${${PROJECT_NAME}_soversion}.${${PROJECT_NAME}_LIB_VERSION_AGE}.${${PROJECT_NAME}_LIB_VERSION_REVISION}
|
VERSION ${${PROJECT_NAME}_soversion}.${${PROJECT_NAME}_LIB_VERSION_AGE}.${${PROJECT_NAME}_LIB_VERSION_REVISION}
|
||||||
)
|
)
|
||||||
elseif(APPLE)
|
elseif(APPLE)
|
||||||
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.17)
|
math(EXPR ${PROJECT_NAME}_compatibility_version "${${PROJECT_NAME}_LIB_VERSION_CURRENT} + 1")
|
||||||
math(EXPR ${PROJECT_NAME}_compatibility_version "${${PROJECT_NAME}_LIB_VERSION_CURRENT} + 1")
|
set_target_properties(secp256k1 PROPERTIES
|
||||||
set_target_properties(secp256k1 PROPERTIES
|
MACHO_COMPATIBILITY_VERSION ${${PROJECT_NAME}_compatibility_version}
|
||||||
MACHO_COMPATIBILITY_VERSION ${${PROJECT_NAME}_compatibility_version}
|
MACHO_CURRENT_VERSION ${${PROJECT_NAME}_compatibility_version}.${${PROJECT_NAME}_LIB_VERSION_REVISION}
|
||||||
MACHO_CURRENT_VERSION ${${PROJECT_NAME}_compatibility_version}.${${PROJECT_NAME}_LIB_VERSION_REVISION}
|
)
|
||||||
)
|
unset(${PROJECT_NAME}_compatibility_version)
|
||||||
unset(${PROJECT_NAME}_compatibility_version)
|
|
||||||
elseif(BUILD_SHARED_LIBS)
|
|
||||||
message(WARNING
|
|
||||||
"The 'compatibility version' and 'current version' values of the DYLIB "
|
|
||||||
"will diverge from the values set by the GNU Libtool. To ensure "
|
|
||||||
"compatibility, it is recommended to upgrade CMake to at least version 3.17."
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||||
set(${PROJECT_NAME}_windows "secp256k1")
|
set(${PROJECT_NAME}_windows "secp256k1")
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
@@ -110,36 +159,16 @@ if(SECP256K1_BUILD_CTIME_TESTS)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(SECP256K1_INSTALL)
|
if(SECP256K1_INSTALL)
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
target_include_directories(secp256k1 INTERFACE
|
||||||
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||||
|
)
|
||||||
install(TARGETS secp256k1
|
install(TARGETS secp256k1
|
||||||
EXPORT ${PROJECT_NAME}-targets
|
EXPORT ${PROJECT_NAME}-targets
|
||||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
)
|
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||||
set(${PROJECT_NAME}_headers
|
|
||||||
"${PROJECT_SOURCE_DIR}/include/secp256k1.h"
|
|
||||||
"${PROJECT_SOURCE_DIR}/include/secp256k1_preallocated.h"
|
|
||||||
)
|
|
||||||
if(SECP256K1_ENABLE_MODULE_ECDH)
|
|
||||||
list(APPEND ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/include/secp256k1_ecdh.h")
|
|
||||||
endif()
|
|
||||||
if(SECP256K1_ENABLE_MODULE_RECOVERY)
|
|
||||||
list(APPEND ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/include/secp256k1_recovery.h")
|
|
||||||
endif()
|
|
||||||
if(SECP256K1_ENABLE_MODULE_EXTRAKEYS)
|
|
||||||
list(APPEND ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/include/secp256k1_extrakeys.h")
|
|
||||||
endif()
|
|
||||||
if(SECP256K1_ENABLE_MODULE_SCHNORRSIG)
|
|
||||||
list(APPEND ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/include/secp256k1_schnorrsig.h")
|
|
||||||
endif()
|
|
||||||
if(SECP256K1_ENABLE_MODULE_MUSIG)
|
|
||||||
list(APPEND ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/include/secp256k1_musig.h")
|
|
||||||
endif()
|
|
||||||
if(SECP256K1_ENABLE_MODULE_ELLSWIFT)
|
|
||||||
list(APPEND ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/include/secp256k1_ellswift.h")
|
|
||||||
endif()
|
|
||||||
install(FILES ${${PROJECT_NAME}_headers}
|
|
||||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
install(EXPORT ${PROJECT_NAME}-targets
|
install(EXPORT ${PROJECT_NAME}-targets
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ typedef struct {
|
|||||||
|
|
||||||
/* Benchmark output. */
|
/* Benchmark output. */
|
||||||
secp256k1_gej* output;
|
secp256k1_gej* output;
|
||||||
|
secp256k1_fe* output_xonly;
|
||||||
} bench_data;
|
} bench_data;
|
||||||
|
|
||||||
/* Hashes x into [0, POINTS) twice and store the result in offset1 and offset2. */
|
/* Hashes x into [0, POINTS) twice and store the result in offset1 and offset2. */
|
||||||
@@ -123,6 +124,32 @@ static void bench_ecmult_const_teardown(void* arg, int iters) {
|
|||||||
bench_ecmult_teardown_helper(data, &data->offset1, &data->offset2, NULL, iters);
|
bench_ecmult_teardown_helper(data, &data->offset1, &data->offset2, NULL, iters);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void bench_ecmult_const_xonly(void* arg, int iters) {
|
||||||
|
bench_data* data = (bench_data*)arg;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < iters; ++i) {
|
||||||
|
const secp256k1_ge* pubkey = &data->pubkeys[(data->offset1+i) % POINTS];
|
||||||
|
const secp256k1_scalar* scalar = &data->scalars[(data->offset2+i) % POINTS];
|
||||||
|
int known_on_curve = 1;
|
||||||
|
secp256k1_ecmult_const_xonly(&data->output_xonly[i], &pubkey->x, NULL, scalar, known_on_curve);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bench_ecmult_const_xonly_teardown(void* arg, int iters) {
|
||||||
|
bench_data* data = (bench_data*)arg;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* verify by comparing with x coordinate of regular ecmult result */
|
||||||
|
for (i = 0; i < iters; ++i) {
|
||||||
|
const secp256k1_gej* pubkey_gej = &data->pubkeys_gej[(data->offset1+i) % POINTS];
|
||||||
|
const secp256k1_scalar* scalar = &data->scalars[(data->offset2+i) % POINTS];
|
||||||
|
secp256k1_gej expected_gej;
|
||||||
|
secp256k1_ecmult(&expected_gej, pubkey_gej, scalar, NULL);
|
||||||
|
CHECK(secp256k1_gej_eq_x_var(&data->output_xonly[i], &expected_gej));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void bench_ecmult_1p(void* arg, int iters) {
|
static void bench_ecmult_1p(void* arg, int iters) {
|
||||||
bench_data* data = (bench_data*)arg;
|
bench_data* data = (bench_data*)arg;
|
||||||
int i;
|
int i;
|
||||||
@@ -171,6 +198,8 @@ static void run_ecmult_bench(bench_data* data, int iters) {
|
|||||||
run_benchmark(str, bench_ecmult_gen, bench_ecmult_setup, bench_ecmult_gen_teardown, data, 10, iters);
|
run_benchmark(str, bench_ecmult_gen, bench_ecmult_setup, bench_ecmult_gen_teardown, data, 10, iters);
|
||||||
sprintf(str, "ecmult_const");
|
sprintf(str, "ecmult_const");
|
||||||
run_benchmark(str, bench_ecmult_const, bench_ecmult_setup, bench_ecmult_const_teardown, data, 10, iters);
|
run_benchmark(str, bench_ecmult_const, bench_ecmult_setup, bench_ecmult_const_teardown, data, 10, iters);
|
||||||
|
sprintf(str, "ecmult_const_xonly");
|
||||||
|
run_benchmark(str, bench_ecmult_const_xonly, bench_ecmult_setup, bench_ecmult_const_xonly_teardown, data, 10, iters);
|
||||||
/* ecmult with non generator point */
|
/* ecmult with non generator point */
|
||||||
sprintf(str, "ecmult_1p");
|
sprintf(str, "ecmult_1p");
|
||||||
run_benchmark(str, bench_ecmult_1p, bench_ecmult_setup, bench_ecmult_1p_teardown, data, 10, iters);
|
run_benchmark(str, bench_ecmult_1p, bench_ecmult_setup, bench_ecmult_1p_teardown, data, 10, iters);
|
||||||
@@ -319,6 +348,7 @@ int main(int argc, char **argv) {
|
|||||||
data.pubkeys_gej = malloc(sizeof(secp256k1_gej) * POINTS);
|
data.pubkeys_gej = malloc(sizeof(secp256k1_gej) * POINTS);
|
||||||
data.expected_output = malloc(sizeof(secp256k1_gej) * (iters + 1));
|
data.expected_output = malloc(sizeof(secp256k1_gej) * (iters + 1));
|
||||||
data.output = malloc(sizeof(secp256k1_gej) * (iters + 1));
|
data.output = malloc(sizeof(secp256k1_gej) * (iters + 1));
|
||||||
|
data.output_xonly = malloc(sizeof(secp256k1_fe) * (iters + 1));
|
||||||
|
|
||||||
/* Generate a set of scalars, and private/public keypairs. */
|
/* Generate a set of scalars, and private/public keypairs. */
|
||||||
secp256k1_gej_set_ge(&data.pubkeys_gej[0], &secp256k1_ge_const_g);
|
secp256k1_gej_set_ge(&data.pubkeys_gej[0], &secp256k1_ge_const_g);
|
||||||
@@ -361,6 +391,7 @@ int main(int argc, char **argv) {
|
|||||||
free(data.pubkeys);
|
free(data.pubkeys);
|
||||||
free(data.pubkeys_gej);
|
free(data.pubkeys_gej);
|
||||||
free(data.seckeys);
|
free(data.seckeys);
|
||||||
|
free(data.output_xonly);
|
||||||
free(data.output);
|
free(data.output);
|
||||||
free(data.expected_output);
|
free(data.expected_output);
|
||||||
|
|
||||||
|
|||||||
@@ -373,6 +373,8 @@ static int secp256k1_ecmult_const_xonly(secp256k1_fe* r, const secp256k1_fe *n,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SECP256K1_FE_VERIFY_MAGNITUDE(&g, 2);
|
||||||
|
|
||||||
/* Compute base point P = (n*g, g^2), the effective affine version of (n*g, g^2, v), which has
|
/* Compute base point P = (n*g, g^2), the effective affine version of (n*g, g^2, v), which has
|
||||||
* corresponding affine X coordinate n/d. */
|
* corresponding affine X coordinate n/d. */
|
||||||
secp256k1_fe_mul(&p.x, &g, n);
|
secp256k1_fe_mul(&p.x, &g, n);
|
||||||
|
|||||||
@@ -910,12 +910,15 @@ static void musig_test_vectors_signverify(void) {
|
|||||||
* the signing key does not belong to any pubkey. */
|
* the signing key does not belong to any pubkey. */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
expected = c->error != MUSIG_PUBKEY;
|
expected = c->error != MUSIG_PUBKEY;
|
||||||
CHECK(expected == musig_vectors_keyagg_and_tweak(&error, &keyagg_cache, NULL, vector->pubkeys, NULL, c->key_indices_len, c->key_indices, 0, NULL, NULL));
|
CHECK(expected == musig_vectors_keyagg_and_tweak(&error, &keyagg_cache, NULL, vector->pubkeys, NULL, c->key_indices_len, c->key_indices, 0, NULL, NULL));
|
||||||
CHECK(expected || c->error == error);
|
CHECK(expected || c->error == error);
|
||||||
if (!expected) {
|
if (!expected) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, vector->pubkeys[0], sizeof(vector->pubkeys[0])));
|
||||||
|
CHECK(secp256k1_keypair_create(CTX, &keypair, vector->sk));
|
||||||
|
|
||||||
expected = c->error != MUSIG_AGGNONCE;
|
expected = c->error != MUSIG_AGGNONCE;
|
||||||
CHECK(expected == secp256k1_musig_aggnonce_parse(CTX, &aggnonce, vector->aggnonces[c->aggnonce_index]));
|
CHECK(expected == secp256k1_musig_aggnonce_parse(CTX, &aggnonce, vector->aggnonces[c->aggnonce_index]));
|
||||||
@@ -924,14 +927,10 @@ static void musig_test_vectors_signverify(void) {
|
|||||||
}
|
}
|
||||||
CHECK(secp256k1_musig_nonce_process(CTX, &session, &aggnonce, vector->msgs[c->msg_index], &keyagg_cache));
|
CHECK(secp256k1_musig_nonce_process(CTX, &session, &aggnonce, vector->msgs[c->msg_index], &keyagg_cache));
|
||||||
|
|
||||||
CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, vector->pubkeys[0], sizeof(vector->pubkeys[0])));
|
|
||||||
musig_test_set_secnonce(&secnonce, vector->secnonces[c->secnonce_index], &pubkey);
|
|
||||||
expected = c->error != MUSIG_SECNONCE;
|
expected = c->error != MUSIG_SECNONCE;
|
||||||
if (expected) {
|
CHECK(!expected);
|
||||||
CHECK(secp256k1_musig_partial_sign(CTX, &partial_sig, &secnonce, &keypair, &keyagg_cache, &session));
|
musig_test_set_secnonce(&secnonce, vector->secnonces[c->secnonce_index], &pubkey);
|
||||||
} else {
|
CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sign(CTX, &partial_sig, &secnonce, &keypair, &keyagg_cache, &session));
|
||||||
CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sign(CTX, &partial_sig, &secnonce, &keypair, &keyagg_cache, &session));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
for (i = 0; i < sizeof(vector->verify_fail_case)/sizeof(vector->verify_fail_case[0]); i++) {
|
for (i = 0; i < sizeof(vector->verify_fail_case)/sizeof(vector->verify_fail_case[0]); i++) {
|
||||||
const struct musig_verify_fail_error_case *c = &vector->verify_fail_case[i];
|
const struct musig_verify_fail_error_case *c = &vector->verify_fail_case[i];
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
* The file `ecdsa_secp256k1_sha256_bitcoin_test.json` in this directory
|
* The file `ecdsa_secp256k1_sha256_bitcoin_test.json` in this directory
|
||||||
comes from Google's project Wycheproof with git commit
|
comes from project Wycheproof with git commit
|
||||||
`b063b4aedae951c69df014cd25fa6d69ae9e8cb9`, see
|
`df4e933efef449fc88af0c06e028d425d84a9495`, see
|
||||||
https://github.com/google/wycheproof/blob/b063b4aedae951c69df014cd25fa6d69ae9e8cb9/testvectors_v1/ecdsa_secp256k1_sha256_bitcoin_test.json
|
https://github.com/C2SP/wycheproof/blob/df4e933efef449fc88af0c06e028d425d84a9495/testvectors_v1/ecdsa_secp256k1_sha256_bitcoin_test.json
|
||||||
|
|
||||||
* The file `ecdh_secp256k1_test.json` in this directory
|
* The file `ecdh_secp256k1_test.json` in this directory
|
||||||
comes from Google's project Wycheproof with git commit
|
comes from project Wycheproof with git commit
|
||||||
`d9f6ec7d8bd8c96da05368999094e4a75ba5cb3d`, see
|
`df4e933efef449fc88af0c06e028d425d84a9495`, see
|
||||||
https://github.com/google/wycheproof/blob/d9f6ec7d8bd8c96da05368999094e4a75ba5cb3d/testvectors_v1/ecdh_secp256k1_test.json
|
https://github.com/C2SP/wycheproof/blob/df4e933efef449fc88af0c06e028d425d84a9495/testvectors_v1/ecdh_secp256k1_test.json
|
||||||
|
|
||||||
* The file `ecdsa_secp256k1_sha256_bitcoin_test.h` is generated from
|
* The file `ecdsa_secp256k1_sha256_bitcoin_test.h` is generated from
|
||||||
`ecdsa_secp256k1_sha256_bitcoin_test.json` using the script
|
`ecdsa_secp256k1_sha256_bitcoin_test.json` using the script
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
{
|
{
|
||||||
"algorithm" : "ECDH",
|
"algorithm" : "ECDH",
|
||||||
"schema" : "ecdh_test_schema.json",
|
"schema" : "ecdh_test_schema.json",
|
||||||
"generatorVersion" : "0.9rc5",
|
|
||||||
"numberOfTests" : 752,
|
"numberOfTests" : 752,
|
||||||
"header" : [
|
"header" : [
|
||||||
"Test vectors of type EcdhTest are intended for",
|
"Test vectors of type EcdhTest are intended for",
|
||||||
@@ -124,6 +123,10 @@
|
|||||||
"testGroups" : [
|
"testGroups" : [
|
||||||
{
|
{
|
||||||
"type" : "EcdhTest",
|
"type" : "EcdhTest",
|
||||||
|
"source" : {
|
||||||
|
"name" : "google-wycheproof",
|
||||||
|
"version" : "0.9rc5"
|
||||||
|
},
|
||||||
"curve" : "secp256k1",
|
"curve" : "secp256k1",
|
||||||
"encoding" : "asn",
|
"encoding" : "asn",
|
||||||
"tests" : [
|
"tests" : [
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
"notes" : {
|
"notes" : {
|
||||||
"ArithmeticError" : {
|
"ArithmeticError" : {
|
||||||
"bugType" : "EDGE_CASE",
|
"bugType" : "EDGE_CASE",
|
||||||
"description" : "Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurences.",
|
"description" : "Some implementations of ECDSA have arithmetic errors that occur when intermediate results have extreme values. This test vector has been constructed to test such occurrences.",
|
||||||
"cves" : [
|
"cves" : [
|
||||||
"CVE-2017-18146"
|
"CVE-2017-18146"
|
||||||
]
|
]
|
||||||
@@ -95,7 +95,7 @@
|
|||||||
},
|
},
|
||||||
"SignatureMalleabilityBitcoin" : {
|
"SignatureMalleabilityBitcoin" : {
|
||||||
"bugType" : "SIGNATURE_MALLEABILITY",
|
"bugType" : "SIGNATURE_MALLEABILITY",
|
||||||
"description" : "\"BitCoins\"-curves are curves where signature malleability can be a serious issue. An implementation should only accept a signature s where s < n/2. If an implementation is not meant for uses cases that require signature malleability then this implemenation should be tested with another set of test vectors.",
|
"description" : "\"BitCoins\"-curves are curves where signature malleability can be a serious issue. An implementation should only accept a signature s where s < n/2. If an implementation is not meant for uses cases that require signature malleability then this implementation should be tested with another set of test vectors.",
|
||||||
"effect" : "In bitcoin exchanges, it may be used to make a double deposits or double withdrawals",
|
"effect" : "In bitcoin exchanges, it may be used to make a double deposits or double withdrawals",
|
||||||
"links" : [
|
"links" : [
|
||||||
"https://en.bitcoin.it/wiki/Transaction_malleability",
|
"https://en.bitcoin.it/wiki/Transaction_malleability",
|
||||||
|
|||||||
Reference in new issue
Block a user