Skip to content
This repository was archived by the owner on Feb 26, 2020. It is now read-only.

Commit 7c1d855

Browse files
committed
Merge remote-tracking branch 'origin/master' into na-bump-rand
2 parents 104b5b6 + 72c93ab commit 7c1d855

Some content is hidden

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

61 files changed

+3407
-963
lines changed

.gitlab-ci.yml

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# .gitlab-ci.yml
2+
# rust-secp256k1
3+
4+
5+
stages:
6+
- test
7+
- build
8+
9+
10+
11+
image: parity/rust-builder:latest
12+
13+
variables:
14+
GIT_STRATEGY: fetch
15+
CARGO_HOME: "/ci-cache/${CI_PROJECT_NAME}/cargo/${CI_JOB_NAME}"
16+
SCCACHE_DIR: "/ci-cache/${CI_PROJECT_NAME}/sccache"
17+
CI_SERVER_NAME: "GitLab CI"
18+
DOCKER_OS: "debian:stretch"
19+
ARCH: "x86_64"
20+
21+
22+
23+
.docker-env: &docker-env
24+
tags:
25+
- linux-docker
26+
27+
.compiler_info: &compiler_info
28+
before_script:
29+
- rustup show
30+
- cargo --version
31+
- sccache -s
32+
33+
.build-refs: &build-refs
34+
only:
35+
- master
36+
- schedules
37+
- web
38+
- /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1
39+
40+
.test-refs: &test-refs
41+
only:
42+
- master
43+
- schedules
44+
- web
45+
- /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1
46+
- /^[0-9]+$/
47+
48+
49+
50+
51+
52+
test-linux-stable: &test
53+
stage: test
54+
<<: *test-refs
55+
<<: *docker-env
56+
<<: *compiler_info
57+
variables:
58+
RUST_TOOLCHAIN: stable
59+
RUSTFLAGS: -Cdebug-assertions=y
60+
TARGET: native
61+
script:
62+
- time cargo test --all --release --verbose
63+
- sccache -s
64+
65+
66+
67+
68+
build-linux-release: &build
69+
stage: build
70+
<<: *build-refs
71+
<<: *docker-env
72+
<<: *compiler_info
73+
script:
74+
- time cargo build --release --verbose
75+
- sccache -s
76+
77+
78+

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,5 @@ clippy = {version = "0.0", optional = true}
3131
rand = "0.7"
3232

3333
[dev-dependencies]
34-
hex = "0.3.1"
34+
hex-literal = "0.2"
35+
rand_core = "0.4.2"

build.rs

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -79,30 +79,62 @@ fn setup_android(config: &mut cc::Build) {
7979
}
8080

8181
fn main() {
82+
// Check whether we can use 64-bit compilation
83+
let use_64bit_compilation = if env::var("CARGO_CFG_TARGET_POINTER_WIDTH").unwrap() == "64" {
84+
let check = cc::Build::new().file("depend/check_uint128_t.c")
85+
.cargo_metadata(false)
86+
.try_compile("check_uint128_t")
87+
.is_ok();
88+
if !check {
89+
println!("cargo:warning=Compiling in 32-bit mode on a 64-bit architecture due to lack of uint128_t support.");
90+
}
91+
check
92+
} else {
93+
false
94+
};
95+
8296
let mut base_config = cc::Build::new();
8397
base_config.include("depend/secp256k1/")
8498
.include("depend/secp256k1/include")
85-
.include("depend/secp256k1/src");
86-
87-
let target = env::var("TARGET").expect("TARGET env variable is set by cargo; qed");
88-
if target.contains("android") {
89-
setup_android(&mut base_config);
90-
}
91-
92-
base_config.flag("-g")
99+
.include("depend/secp256k1/src")
100+
.debug(true)
101+
.flag_if_supported("-Wno-unused-function") // some ecmult stuff is defined but not used upstream
102+
.define("SECP256K1_BUILD", Some("1"))
103+
// Allowed values are 2..24, there is a tradeoff between
104+
// memory and cpu time (tuned for best ratio)
105+
.define("ECMULT_WINDOW_SIZE", Some("8"))
106+
// Allowed values are: 2, 4, and 8 (tuned for best perf)
107+
.define("ECMULT_GEN_PREC_BITS", Some("4"))
93108
// TODO these three should be changed to use libgmp, at least until secp PR 290 is merged
94109
.define("USE_NUM_NONE", Some("1"))
95110
.define("USE_FIELD_INV_BUILTIN", Some("1"))
96111
.define("USE_SCALAR_INV_BUILTIN", Some("1"))
97-
// TODO these should use 64-bit variants on 64-bit systems
98-
.define("USE_FIELD_10X26", Some("1"))
99-
.define("USE_SCALAR_8X32", Some("1"))
100112
.define("USE_ENDOMORPHISM", Some("1"))
101-
// These all are OK.
102113
.define("ENABLE_MODULE_ECDH", Some("1"))
103-
.define("ENABLE_MODULE_SCHNORR", Some("1"))
114+
// SCHNORR support was removed in the upstream
115+
// .define("ENABLE_MODULE_SCHNORR", Some("1"))
104116
.define("ENABLE_MODULE_RECOVERY", Some("1"));
105117

118+
let target = env::var("TARGET").expect("TARGET env variable is set by cargo; qed");
119+
if target.contains("android") {
120+
setup_android(&mut base_config);
121+
}
122+
123+
if let Ok(target_endian) = env::var("CARGO_CFG_TARGET_ENDIAN") {
124+
if target_endian == "big" {
125+
base_config.define("WORDS_BIGENDIAN", Some("1"));
126+
}
127+
}
128+
129+
if use_64bit_compilation {
130+
base_config.define("USE_FIELD_5X52", Some("1"))
131+
.define("USE_SCALAR_4X64", Some("1"))
132+
.define("HAVE___INT128", Some("1"));
133+
} else {
134+
base_config.define("USE_FIELD_10X26", Some("1"))
135+
.define("USE_SCALAR_8X32", Some("1"));
136+
}
137+
106138
// secp256k1
107139
base_config.file("depend/secp256k1/contrib/lax_der_parsing.c")
108140
.file("depend/secp256k1/src/ext.c")

depend/check_uint128_t.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#include <stdint.h>
2+
3+
int main(void) {
4+
__uint128_t var_128;
5+
uint64_t var_64;
6+
7+
/* Try to shut up "unused variable" warnings */
8+
var_64 = 100;
9+
var_128 = 100;
10+
if (var_64 == var_128) {
11+
var_64 = 20;
12+
}
13+
return 0;
14+
}

depend/secp256k1/Makefile.am

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ else
88
JNI_LIB =
99
endif
1010
include_HEADERS = include/secp256k1.h
11+
include_HEADERS += include/secp256k1_preallocated.h
1112
noinst_HEADERS =
1213
noinst_HEADERS += src/scalar.h
1314
noinst_HEADERS += src/scalar_4x64.h
@@ -42,6 +43,8 @@ noinst_HEADERS += src/field_5x52_asm_impl.h
4243
noinst_HEADERS += src/java/org_bitcoin_NativeSecp256k1.h
4344
noinst_HEADERS += src/java/org_bitcoin_Secp256k1Context.h
4445
noinst_HEADERS += src/util.h
46+
noinst_HEADERS += src/scratch.h
47+
noinst_HEADERS += src/scratch_impl.h
4548
noinst_HEADERS += src/testrand.h
4649
noinst_HEADERS += src/testrand_impl.h
4750
noinst_HEADERS += src/hash.h
@@ -79,14 +82,17 @@ libsecp256k1_jni_la_CPPFLAGS = -DSECP256K1_BUILD $(JNI_INCLUDES)
7982

8083
noinst_PROGRAMS =
8184
if USE_BENCHMARK
82-
noinst_PROGRAMS += bench_verify bench_sign bench_internal
85+
noinst_PROGRAMS += bench_verify bench_sign bench_internal bench_ecmult
8386
bench_verify_SOURCES = src/bench_verify.c
8487
bench_verify_LDADD = libsecp256k1.la $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB)
8588
bench_sign_SOURCES = src/bench_sign.c
8689
bench_sign_LDADD = libsecp256k1.la $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB)
8790
bench_internal_SOURCES = src/bench_internal.c
8891
bench_internal_LDADD = $(SECP_LIBS) $(COMMON_LIB)
8992
bench_internal_CPPFLAGS = -DSECP256K1_BUILD $(SECP_INCLUDES)
93+
bench_ecmult_SOURCES = src/bench_ecmult.c
94+
bench_ecmult_LDADD = $(SECP_LIBS) $(COMMON_LIB)
95+
bench_ecmult_CPPFLAGS = -DSECP256K1_BUILD $(SECP_INCLUDES)
9096
endif
9197

9298
TESTS =
@@ -109,7 +115,7 @@ exhaustive_tests_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/src $(SECP_INCLUDE
109115
if !ENABLE_COVERAGE
110116
exhaustive_tests_CPPFLAGS += -DVERIFY
111117
endif
112-
exhaustive_tests_LDADD = $(SECP_LIBS)
118+
exhaustive_tests_LDADD = $(SECP_LIBS) $(COMMON_LIB)
113119
exhaustive_tests_LDFLAGS = -static
114120
TESTS += exhaustive_tests
115121
endif
@@ -145,20 +151,20 @@ endif
145151
endif
146152

147153
if USE_ECMULT_STATIC_PRECOMPUTATION
148-
CPPFLAGS_FOR_BUILD +=-I$(top_srcdir)
149-
CFLAGS_FOR_BUILD += -Wall -Wextra -Wno-unused-function
154+
CPPFLAGS_FOR_BUILD +=-I$(top_srcdir) -I$(builddir)/src
150155

151156
gen_context_OBJECTS = gen_context.o
152157
gen_context_BIN = gen_context$(BUILD_EXEEXT)
153-
gen_%.o: src/gen_%.c
158+
gen_%.o: src/gen_%.c src/libsecp256k1-config.h
154159
$(CC_FOR_BUILD) $(CPPFLAGS_FOR_BUILD) $(CFLAGS_FOR_BUILD) -c $< -o $@
155160

156161
$(gen_context_BIN): $(gen_context_OBJECTS)
157-
$(CC_FOR_BUILD) $^ -o $@
162+
$(CC_FOR_BUILD) $(CFLAGS_FOR_BUILD) $(LDFLAGS_FOR_BUILD) $^ -o $@
158163

159164
$(libsecp256k1_la_OBJECTS): src/ecmult_static_context.h
160165
$(tests_OBJECTS): src/ecmult_static_context.h
161166
$(bench_internal_OBJECTS): src/ecmult_static_context.h
167+
$(bench_ecmult_OBJECTS): src/ecmult_static_context.h
162168

163169
src/ecmult_static_context.h: $(gen_context_BIN)
164170
./$(gen_context_BIN)
@@ -172,10 +178,6 @@ if ENABLE_MODULE_ECDH
172178
include src/modules/ecdh/Makefile.am.include
173179
endif
174180

175-
if ENABLE_MODULE_SCHNORR
176-
include src/modules/schnorr/Makefile.am.include
177-
endif
178-
179181
if ENABLE_MODULE_RECOVERY
180182
include src/modules/recovery/Makefile.am.include
181183
endif

depend/secp256k1/README.md

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,10 @@ Implementation details
4545
* Optionally (off by default) use secp256k1's efficiently-computable endomorphism to split the P multiplicand into 2 half-sized ones.
4646
* Point multiplication for signing
4747
* Use a precomputed table of multiples of powers of 16 multiplied with the generator, so general multiplication becomes a series of additions.
48-
* Access the table with branch-free conditional moves so memory access is uniform.
49-
* No data-dependent branches
48+
* Intended to be completely free of timing sidechannels for secret-key operations (on reasonable hardware/toolchains)
49+
* Access the table with branch-free conditional moves so memory access is uniform.
50+
* No data-dependent branches
51+
* Optional runtime blinding which attempts to frustrate differential power analysis.
5052
* The precomputed tables add and eventually subtract points for which no known scalar (private key) is known, preventing even an attacker with control over the private key used to control the data internally.
5153

5254
Build steps
@@ -57,5 +59,14 @@ libsecp256k1 is built using autotools:
5759
$ ./autogen.sh
5860
$ ./configure
5961
$ make
60-
$ ./tests
62+
$ make check
6163
$ sudo make install # optional
64+
65+
Exhaustive tests
66+
-----------
67+
68+
$ ./exhaustive_tests
69+
70+
With valgrind, you might need to increase the max stack size:
71+
72+
$ valgrind --max-stackframe=2500000 ./exhaustive_tests

depend/secp256k1/build-aux/m4/ax_jni_include_dir.m4

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# ===========================================================================
2-
# http://www.gnu.org/software/autoconf-archive/ax_jni_include_dir.html
2+
# https://www.gnu.org/software/autoconf-archive/ax_jni_include_dir.html
33
# ===========================================================================
44
#
55
# SYNOPSIS
@@ -44,7 +44,7 @@
4444
# and this notice are preserved. This file is offered as-is, without any
4545
# warranty.
4646

47-
#serial 10
47+
#serial 14
4848

4949
AU_ALIAS([AC_JNI_INCLUDE_DIR], [AX_JNI_INCLUDE_DIR])
5050
AC_DEFUN([AX_JNI_INCLUDE_DIR],[
@@ -66,40 +66,45 @@ else
6666
fi
6767
6868
case "$host_os" in
69-
darwin*) _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'`
70-
_JINC="$_JTOPDIR/Headers";;
71-
*) _JINC="$_JTOPDIR/include";;
69+
darwin*) # Apple Java headers are inside the Xcode bundle.
70+
macos_version=$(sw_vers -productVersion | sed -n -e 's/^@<:@0-9@:>@*.\(@<:@0-9@:>@*\).@<:@0-9@:>@*/\1/p')
71+
if @<:@ "$macos_version" -gt "7" @:>@; then
72+
_JTOPDIR="$(xcrun --show-sdk-path)/System/Library/Frameworks/JavaVM.framework"
73+
_JINC="$_JTOPDIR/Headers"
74+
else
75+
_JTOPDIR="/System/Library/Frameworks/JavaVM.framework"
76+
_JINC="$_JTOPDIR/Headers"
77+
fi
78+
;;
79+
*) _JINC="$_JTOPDIR/include";;
7280
esac
7381
_AS_ECHO_LOG([_JTOPDIR=$_JTOPDIR])
7482
_AS_ECHO_LOG([_JINC=$_JINC])
7583
7684
# On Mac OS X 10.6.4, jni.h is a symlink:
7785
# /System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/jni.h
7886
# -> ../../CurrentJDK/Headers/jni.h.
79-
8087
AC_CACHE_CHECK(jni headers, ac_cv_jni_header_path,
8188
[
82-
if test -f "$_JINC/jni.h"; then
83-
ac_cv_jni_header_path="$_JINC"
84-
JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path"
85-
else
86-
_JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'`
87-
if test -f "$_JTOPDIR/include/jni.h"; then
88-
ac_cv_jni_header_path="$_JTOPDIR/include"
89+
if test -f "$_JINC/jni.h"; then
90+
ac_cv_jni_header_path="$_JINC"
8991
JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path"
9092
else
91-
ac_cv_jni_header_path=none
93+
_JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'`
94+
if test -f "$_JTOPDIR/include/jni.h"; then
95+
ac_cv_jni_header_path="$_JTOPDIR/include"
96+
JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path"
97+
else
98+
ac_cv_jni_header_path=none
99+
fi
92100
fi
93-
fi
94101
])
95102
96-
97-
98103
# get the likely subdirectories for system specific java includes
99104
case "$host_os" in
100105
bsdi*) _JNI_INC_SUBDIRS="bsdos";;
101-
darwin*) _JNI_INC_SUBDIRS="darwin";;
102106
freebsd*) _JNI_INC_SUBDIRS="freebsd";;
107+
darwin*) _JNI_INC_SUBDIRS="darwin";;
103108
linux*) _JNI_INC_SUBDIRS="linux genunix";;
104109
osf*) _JNI_INC_SUBDIRS="alpha";;
105110
solaris*) _JNI_INC_SUBDIRS="solaris";;
@@ -112,9 +117,9 @@ if test "x$ac_cv_jni_header_path" != "xnone"; then
112117
# add any subdirectories that are present
113118
for JINCSUBDIR in $_JNI_INC_SUBDIRS
114119
do
115-
if test -d "$_JTOPDIR/include/$JINCSUBDIR"; then
116-
JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JTOPDIR/include/$JINCSUBDIR"
117-
fi
120+
if test -d "$_JTOPDIR/include/$JINCSUBDIR"; then
121+
JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JTOPDIR/include/$JINCSUBDIR"
122+
fi
118123
done
119124
fi
120125
])

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ if test x"$has_libcrypto" = x"yes" && test x"$has_openssl_ec" = x; then
4848
EC_KEY_free(eckey);
4949
ECDSA_SIG *sig_openssl;
5050
sig_openssl = ECDSA_SIG_new();
51-
(void)sig_openssl->r;
5251
ECDSA_SIG_free(sig_openssl);
5352
]])],[has_openssl_ec=yes],[has_openssl_ec=no])
5453
AC_MSG_RESULT([$has_openssl_ec])

0 commit comments

Comments
 (0)