Skip to content

Commit dd45c61

Browse files
laanwj5tefan
authored andcommitted
Merge bitcoin#21573: Update libsecp256k1 subtree to latest master
5c7ee1b libsecp256k1 no longer has --with-bignum= configure option (Pieter Wuille) bdca9bc Squashed 'src/secp256k1/' changes from 3967d96..efad350 (Pieter Wuille) cabb566 Disable certain false positive warnings for libsecp256k1 msvc build (Pieter Wuille) Pull request description: This updates our src/secp256k1 subtree to the latest upstream master. The changes include: * The introduction of safegcd-based modular inverses, reducing ECDSA signing time by 25%-30% and ECDSA verification time by 15%-17%. * [Original paper](https://gcd.cr.yp.to/papers.html) by Daniel J. Bernstein and Bo-Yin Yang * [Implementation](bitcoin-core/secp256k1#767) by Peter Dettman; [final](bitcoin-core/secp256k1#831) version * [Explanation](https://github.com/bitcoin-core/secp256k1/blob/master/doc/safegcd_implementation.md) of the algorithm using Python snippets * [Analysis](https://github.com/sipa/safegcd-bounds) of the maximum number of iterations the algorithm needs * [Formal proof in Coq](https://medium.com/blockstream/a-formal-proof-of-safegcd-bounds-695e1735a348) by Russell O'Connor, for a high-level equivalent algorithm * Removal of libgmp as an (optional) dependency (which wasn't used in the Bitcoin Core build) * CI changes (Travis -> Cirrus) * Build system improvements ACKs for top commit: laanwj: Tested ACK 5c7ee1b Tree-SHA512: ad8ac3746264d279556a4aa7efdde3733e114fdba8856dd53218588521f04d83950366f5c1ea8fd56329b4c7fe08eedf8e206f8f26dbe3f0f81852e138655431
1 parent 9ddb793 commit dd45c61

File tree

95 files changed

+4866
-2457
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

95 files changed

+4866
-2457
lines changed

configure.ac

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1640,7 +1640,7 @@ if test x$need_bundled_univalue = xyes; then
16401640
AC_CONFIG_SUBDIRS([src/univalue])
16411641
fi
16421642

1643-
ac_configure_args="${ac_configure_args} --disable-shared --with-pic --enable-benchmark=no --with-bignum=no --enable-module-recovery"
1643+
ac_configure_args="${ac_configure_args} --disable-shared --with-pic --enable-benchmark=no --enable-module-recovery"
16441644
AC_CONFIG_SUBDIRS([src/secp256k1])
16451645

16461646
AC_OUTPUT

src/secp256k1/.cirrus.yml

Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
env:
2+
WIDEMUL: auto
3+
STATICPRECOMPUTATION: yes
4+
ECMULTGENPRECISION: auto
5+
ASM: no
6+
BUILD: check
7+
WITH_VALGRIND: yes
8+
RUN_VALGRIND: no
9+
EXTRAFLAGS:
10+
HOST:
11+
ECDH: no
12+
RECOVERY: no
13+
SCHNORRSIG: no
14+
EXPERIMENTAL: no
15+
CTIMETEST: yes
16+
BENCH: yes
17+
ITERS: 2
18+
MAKEFLAGS: -j2
19+
20+
cat_logs_snippet: &CAT_LOGS
21+
always:
22+
cat_tests_log_script:
23+
- cat tests.log || true
24+
cat_exhaustive_tests_log_script:
25+
- cat exhaustive_tests.log || true
26+
cat_valgrind_ctime_test_log_script:
27+
- cat valgrind_ctime_test.log || true
28+
cat_bench_log_script:
29+
- cat bench.log || true
30+
on_failure:
31+
cat_config_log_script:
32+
- cat config.log || true
33+
cat_test_env_script:
34+
- cat test_env.log || true
35+
cat_ci_env_script:
36+
- env
37+
38+
merge_base_script_snippet: &MERGE_BASE
39+
merge_base_script:
40+
- if [ "$CIRRUS_PR" = "" ]; then exit 0; fi
41+
- git fetch $CIRRUS_REPO_CLONE_URL $CIRRUS_BASE_BRANCH
42+
- git config --global user.email "[email protected]"
43+
- git config --global user.name "ci"
44+
- git merge FETCH_HEAD # Merge base to detect silent merge conflicts
45+
46+
task:
47+
name: "x86_64: Linux (Debian stable)"
48+
container:
49+
dockerfile: ci/linux-debian.Dockerfile
50+
# Reduce number of CPUs to be able to do more builds in parallel.
51+
cpu: 1
52+
# More than enough for our scripts.
53+
memory: 1G
54+
matrix: &ENV_MATRIX
55+
- env: {WIDEMUL: int64, RECOVERY: yes}
56+
- env: {WIDEMUL: int64, ECDH: yes, EXPERIMENTAL: yes, SCHNORRSIG: yes}
57+
- env: {WIDEMUL: int128}
58+
- env: {WIDEMUL: int128, RECOVERY: yes, EXPERIMENTAL: yes, SCHNORRSIG: yes}
59+
- env: {WIDEMUL: int128, ECDH: yes, EXPERIMENTAL: yes, SCHNORRSIG: yes}
60+
- env: {WIDEMUL: int128, ASM: x86_64}
61+
- env: { RECOVERY: yes, EXPERIMENTAL: yes, SCHNORRSIG: yes}
62+
- env: { STATICPRECOMPUTATION: no}
63+
- env: {BUILD: distcheck, WITH_VALGRIND: no, CTIMETEST: no, BENCH: no}
64+
- env: {CPPFLAGS: -DDETERMINISTIC}
65+
- env: {CFLAGS: -O0, CTIMETEST: no}
66+
- env:
67+
CFLAGS: "-fsanitize=undefined -fno-omit-frame-pointer"
68+
LDFLAGS: "-fsanitize=undefined -fno-omit-frame-pointer"
69+
UBSAN_OPTIONS: "print_stacktrace=1:halt_on_error=1"
70+
ASM: x86_64
71+
ECDH: yes
72+
RECOVERY: yes
73+
EXPERIMENTAL: yes
74+
SCHNORRSIG: yes
75+
CTIMETEST: no
76+
- env: { ECMULTGENPRECISION: 2 }
77+
- env: { ECMULTGENPRECISION: 8 }
78+
- env:
79+
RUN_VALGRIND: yes
80+
ASM: x86_64
81+
ECDH: yes
82+
RECOVERY: yes
83+
EXPERIMENTAL: yes
84+
SCHNORRSIG: yes
85+
EXTRAFLAGS: "--disable-openssl-tests"
86+
BUILD:
87+
matrix:
88+
- env:
89+
CC: gcc
90+
- env:
91+
CC: clang
92+
<< : *MERGE_BASE
93+
test_script:
94+
- ./ci/cirrus.sh
95+
<< : *CAT_LOGS
96+
97+
task:
98+
name: "i686: Linux (Debian stable)"
99+
container:
100+
dockerfile: ci/linux-debian.Dockerfile
101+
cpu: 1
102+
memory: 1G
103+
env:
104+
HOST: i686-linux-gnu
105+
ECDH: yes
106+
RECOVERY: yes
107+
EXPERIMENTAL: yes
108+
SCHNORRSIG: yes
109+
matrix:
110+
- env:
111+
CC: i686-linux-gnu-gcc
112+
- env:
113+
CC: clang --target=i686-pc-linux-gnu -isystem /usr/i686-linux-gnu/include
114+
test_script:
115+
- ./ci/cirrus.sh
116+
<< : *CAT_LOGS
117+
118+
task:
119+
name: "x86_64: macOS Catalina"
120+
macos_instance:
121+
image: catalina-base
122+
env:
123+
HOMEBREW_NO_AUTO_UPDATE: 1
124+
HOMEBREW_NO_INSTALL_CLEANUP: 1
125+
# Cirrus gives us a fixed number of 12 virtual CPUs. Not that we even have that many jobs at the moment...
126+
MAKEFLAGS: -j13
127+
matrix:
128+
<< : *ENV_MATRIX
129+
matrix:
130+
- env:
131+
CC: gcc-9
132+
- env:
133+
CC: clang
134+
# Update Command Line Tools
135+
# Uncomment this if the Command Line Tools on the CirrusCI macOS image are too old to brew valgrind.
136+
# See https://apple.stackexchange.com/a/195963 for the implementation.
137+
## update_clt_script:
138+
## - system_profiler SPSoftwareDataType
139+
## - touch /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress
140+
## - |-
141+
## PROD=$(softwareupdate -l | grep "*.*Command Line" | tail -n 1 | awk -F"*" '{print $2}' | sed -e 's/^ *//' | sed 's/Label: //g' | tr -d '\n')
142+
## # For debugging
143+
## - softwareupdate -l && echo "PROD: $PROD"
144+
## - softwareupdate -i "$PROD" --verbose
145+
## - rm /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress
146+
##
147+
brew_valgrind_pre_script:
148+
- brew config
149+
- brew tap --shallow LouisBrunner/valgrind
150+
# Fetch valgrind source but don't build it yet.
151+
- brew fetch --HEAD LouisBrunner/valgrind/valgrind
152+
brew_valgrind_cache:
153+
# This is $(brew --cellar valgrind) but command substition does not work here.
154+
folder: /usr/local/Cellar/valgrind
155+
# Rebuild cache if ...
156+
fingerprint_script:
157+
# ... macOS version changes:
158+
- sw_vers
159+
# ... brew changes:
160+
- brew config
161+
# ... valgrind changes:
162+
- git -C "$(brew --cache)/valgrind--git" rev-parse HEAD
163+
populate_script:
164+
# If there's no hit in the cache, build and install valgrind.
165+
- brew install --HEAD LouisBrunner/valgrind/valgrind
166+
brew_valgrind_post_script:
167+
# If we have restored valgrind from the cache, tell brew to create symlink to the PATH.
168+
# If we haven't restored from cached (and just run brew install), this is a no-op.
169+
- brew link valgrind
170+
brew_script:
171+
- brew install automake libtool gcc@9
172+
<< : *MERGE_BASE
173+
test_script:
174+
- ./ci/cirrus.sh
175+
<< : *CAT_LOGS
176+
177+
task:
178+
name: "s390x (big-endian): Linux (Debian stable, QEMU)"
179+
container:
180+
dockerfile: ci/linux-debian.Dockerfile
181+
cpu: 1
182+
memory: 1G
183+
env:
184+
QEMU_CMD: qemu-s390x
185+
HOST: s390x-linux-gnu
186+
BUILD:
187+
WITH_VALGRIND: no
188+
ECDH: yes
189+
RECOVERY: yes
190+
EXPERIMENTAL: yes
191+
SCHNORRSIG: yes
192+
CTIMETEST: no
193+
<< : *MERGE_BASE
194+
test_script:
195+
# https://sourceware.org/bugzilla/show_bug.cgi?id=27008
196+
- rm /etc/ld.so.cache
197+
- ./ci/cirrus.sh
198+
<< : *CAT_LOGS

src/secp256k1/.travis.yml

Lines changed: 0 additions & 108 deletions
This file was deleted.

src/secp256k1/Makefile.am

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ noinst_HEADERS += src/scalar_8x32_impl.h
1414
noinst_HEADERS += src/scalar_low_impl.h
1515
noinst_HEADERS += src/group.h
1616
noinst_HEADERS += src/group_impl.h
17-
noinst_HEADERS += src/num_gmp.h
18-
noinst_HEADERS += src/num_gmp_impl.h
1917
noinst_HEADERS += src/ecdsa.h
2018
noinst_HEADERS += src/ecdsa_impl.h
2119
noinst_HEADERS += src/eckey.h
@@ -26,14 +24,16 @@ noinst_HEADERS += src/ecmult_const.h
2624
noinst_HEADERS += src/ecmult_const_impl.h
2725
noinst_HEADERS += src/ecmult_gen.h
2826
noinst_HEADERS += src/ecmult_gen_impl.h
29-
noinst_HEADERS += src/num.h
30-
noinst_HEADERS += src/num_impl.h
3127
noinst_HEADERS += src/field_10x26.h
3228
noinst_HEADERS += src/field_10x26_impl.h
3329
noinst_HEADERS += src/field_5x52.h
3430
noinst_HEADERS += src/field_5x52_impl.h
3531
noinst_HEADERS += src/field_5x52_int128_impl.h
3632
noinst_HEADERS += src/field_5x52_asm_impl.h
33+
noinst_HEADERS += src/modinv32.h
34+
noinst_HEADERS += src/modinv32_impl.h
35+
noinst_HEADERS += src/modinv64.h
36+
noinst_HEADERS += src/modinv64_impl.h
3737
noinst_HEADERS += src/assumptions.h
3838
noinst_HEADERS += src/util.h
3939
noinst_HEADERS += src/scratch.h

src/secp256k1/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
libsecp256k1
22
============
33

4-
[![Build Status](https://travis-ci.org/bitcoin-core/secp256k1.svg?branch=master)](https://travis-ci.org/bitcoin-core/secp256k1)
4+
[![Build Status](https://api.cirrus-ci.com/github/bitcoin-core/secp256k1.svg?branch=master)](https://cirrus-ci.com/github/bitcoin-core/secp256k1)
55

66
Optimized C library for ECDSA signatures and secret/public key operations on curve secp256k1.
77

@@ -34,11 +34,11 @@ Implementation details
3434
* Optimized implementation of arithmetic modulo the curve's field size (2^256 - 0x1000003D1).
3535
* Using 5 52-bit limbs (including hand-optimized assembly for x86_64, by Diederik Huys).
3636
* Using 10 26-bit limbs (including hand-optimized assembly for 32-bit ARM, by Wladimir J. van der Laan).
37-
* Field inverses and square roots using a sliding window over blocks of 1s (by Peter Dettman).
3837
* Scalar operations
3938
* Optimized implementation without data-dependent branches of arithmetic modulo the curve's order.
4039
* Using 4 64-bit limbs (relying on __int128 support in the compiler).
4140
* Using 8 32-bit limbs.
41+
* Modular inverses (both field elements and scalars) based on [safegcd](https://gcd.cr.yp.to/index.html) with some modifications, and a variable-time variant (by Peter Dettman).
4242
* Group operations
4343
* Point addition formula specifically simplified for the curve equation (y^2 = x^3 + 7).
4444
* Use addition between points in Jacobian and affine coordinates where possible.

src/secp256k1/build-aux/m4/ax_prog_cc_for_build.m4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# ===========================================================================
2-
# http://www.gnu.org/software/autoconf-archive/ax_prog_cc_for_build.html
2+
# https://www.gnu.org/software/autoconf-archive/ax_prog_cc_for_build.html
33
# ===========================================================================
44
#
55
# SYNOPSIS

src/secp256k1/build-aux/m4/bitcoin_secp.m4

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,10 @@ if test x"$has_libcrypto" = x"yes" && test x"$has_openssl_ec" = x; then
7575
fi
7676
])
7777

78-
dnl
79-
AC_DEFUN([SECP_GMP_CHECK],[
80-
if test x"$has_gmp" != x"yes"; then
78+
AC_DEFUN([SECP_VALGRIND_CHECK],[
79+
if test x"$has_valgrind" != x"yes"; then
8180
CPPFLAGS_TEMP="$CPPFLAGS"
82-
CPPFLAGS="$GMP_CPPFLAGS $CPPFLAGS"
83-
LIBS_TEMP="$LIBS"
84-
LIBS="$GMP_LIBS $LIBS"
85-
AC_CHECK_HEADER(gmp.h,[AC_CHECK_LIB(gmp, __gmpz_init,[has_gmp=yes; GMP_LIBS="$GMP_LIBS -lgmp"; AC_DEFINE(HAVE_LIBGMP,1,[Define this symbol if libgmp is installed])])])
86-
CPPFLAGS="$CPPFLAGS_TEMP"
87-
LIBS="$LIBS_TEMP"
81+
CPPFLAGS="$VALGRIND_CPPFLAGS $CPPFLAGS"
82+
AC_CHECK_HEADER([valgrind/memcheck.h], [has_valgrind=yes; AC_DEFINE(HAVE_VALGRIND,1,[Define this symbol if valgrind is installed])])
8883
fi
8984
])

0 commit comments

Comments
 (0)