Commit Graph

1295 Commits

Author SHA1 Message Date
Tim Ruffing 05d315affe
Merge #752: autoconf: Use ":" instead of "dnl" as a noop
5e8747ae2a autoconf: Use ":" instead of "dnl" as a noop (Tim Ruffing)

Pull request description:

  Fixes #424.

Top commit has no ACKs.

Tree-SHA512: a83664afbc6ca1254c4767161bfbec82f3489a8a248ba7a5a46ed9ec2a39232cf92f504accadd4dbb1a6ea4791dbf7f0e1f030e51f02f49eb9a38a2e509ee6c2
2020-05-22 13:31:45 +02:00
Elichai Turkel a39c2b09de
Fixed UB(arithmetics on uninit values) in cmovs 2020-05-22 13:25:26 +03:00
Jonas Nick 3a6fd7f636
Merge #750: Add macOS to the CI
71757da5cc Explictly pass SECP256K1_BENCH_ITERS to the benchmarks in travis.sh (Elichai Turkel)
99bd661d71 Replace travis_wait with a loop printing "\a" to stdout every minute (Elichai Turkel)
bc818b160c Bump travis Ubuntu from xenial(16.04) to bionic(18.04) (Elichai Turkel)
0c5ff9066e Add macOS support to travis (Elichai Turkel)
b6807d91d8 Move travis script into a standalone sh file (Elichai Turkel)

Pull request description:

ACKs for top commit:
  real-or-random:
    ACK 71757da5cc I inspected the diff
  jonasnick:
    ACK 71757da5cc

Tree-SHA512: e8fab725ef5ed98c795f39d7f26b5d967a6bd730d40eb7d9793986858bf34770b0350c1b7b1d14ae608dfff9375a0750ec67c8e6d0d4b562ab917f5e645aa67b
2020-05-18 19:38:47 +00:00
Tim Ruffing 5e8747ae2a autoconf: Use ":" instead of "dnl" as a noop
Fixes #424.
2020-05-18 12:30:01 +02:00
Elichai Turkel 71757da5cc
Explictly pass SECP256K1_BENCH_ITERS to the benchmarks in travis.sh 2020-05-18 12:01:07 +03:00
Elichai Turkel 99bd661d71
Replace travis_wait with a loop printing "\a" to stdout every minute 2020-05-11 16:02:25 +03:00
Elichai Turkel bc818b160c
Bump travis Ubuntu from xenial(16.04) to bionic(18.04) 2020-05-11 16:01:20 +03:00
Elichai Turkel 0c5ff9066e
Add macOS support to travis 2020-05-11 16:01:20 +03:00
Elichai Turkel b6807d91d8
Move travis script into a standalone sh file 2020-05-11 16:01:16 +03:00
Tim Ruffing f39f99be0e
Merge #701: Make ec_ arithmetic more consistent and add documentation
7e3952ae82 Clarify documentation of tweak functions. (Jonas Nick)
89853a0f2e Make tweak function documentation more consistent. (Jonas Nick)
41fc785602 Make ec_privkey functions aliases for ec_seckey_negate, ec_seckey_tweak_add and ec_seckey_mul (Jonas Nick)
22911ee6da Rename private key to secret key in public API (with the exception of function names) (Jonas Nick)
5a73f14d6c Mention that value is unspecified for In/Out parameters if the function returns 0 (Jonas Nick)
f03df0e6d7 Define valid ECDSA keys in the documentation of seckey_verify (Jonas Nick)
5894e1f1df Return 0 if the given seckey is invalid in privkey_negate, privkey_tweak_add and privkey_tweak_mul (Jonas Nick)
8f814cddb9 Add test for boundary conditions of scalar_set_b32 with respect to overflows (Jonas Nick)
3fec982608 Use scalar_set_b32_seckey in ecdsa_sign, pubkey_create and seckey_verify (Jonas Nick)
9ab2cbe0eb Add scalar_set_b32_seckey which does the same as scalar_set_b32 and also returns whether it's a valid secret key (Jonas Nick)

Pull request description:

  Fixes #671. Supersedes #668.

  This PR unifies handling of invalid secret keys by introducing a new function `scalar_set_b32_secret` which returns false if the b32 overflows or is 0. By using this in `privkey_{negate, tweak_add, tweak_mul}` these function will now return 0 if the secret key is invalid which matches the behavior of `ecdsa_sign` and `pubkey_create`.

  Instead of deciding whether to zeroize the secret key on failure, I only added documentation for now that the value is undefined on failure.

ACKs for top commit:
  real-or-random:
    ACK 7e3952ae82 I read the diff carefully and tested the changes
  apoelstra:
    ACK 7e3952ae82

Tree-SHA512: 8e9a66799cd3b6ec1c3acb731d6778035417e3dca9300d840e2437346ff0ac94f0c9be4de20aa2fac9bb4ae2f8a36d4e6a34795a640b9cfbfee8311decb102f0
2020-04-30 18:13:55 +02:00
Jonas Nick 37dba329c6 Remove unnecessary sign variable from wnaf_const 2020-04-29 12:38:23 +00:00
Jonas Nick 6bb0b77e15 Fix test_constant_wnaf for -1 and add a test for it.
Before, test_constant_wnaf used scalar_cadd_bit to correct for the skew. But
this function does not correctly deal with overflows which is why num = -1
couldn't be tested.

This commit also adds tests for 0, 1/2 and 1/2-1 as they are corner cases
in constant_wnaf.
2020-04-29 12:38:23 +00:00
Jonas Nick 39198a03ea
Merge #732: Retry if r is zero during signing
37ed51a7ea Make ecdsa_sig_sign constant-time again after reverting 25e3cfb (Tim Ruffing)
93d343bfc5 Revert "ecdsa_impl: replace scalar if-checks with VERIFY_CHECKs in ecdsa_sig_sign" (Tim Ruffing)

Pull request description:

ACKs for top commit:
  elichai:
    ACK 37ed51a7ea makes sense.
  jonasnick:
    ACK 37ed51a7ea

Tree-SHA512: 82b5b8e29f48e84fd7a0681b62923d3bd87d724b38ef18e8c7969b0dcc5a405ebb26c14b5c5f4c7ba0ccabd152d1531d217809d1daf40872fe0c1e079b55c64b
2020-04-18 12:23:05 +00:00
Tim Ruffing 59a8de8f64
Merge #742: Fix typo in ecmult_const_impl.h
4e284655d9 Fix typo in ecmult_const_impl.h (f-daniel)

Pull request description:

  Fix small typo in the reference given for the wNAF method ( `secp256k1_wnaf_const`)

ACKs for top commit:
  real-or-random:
    ACK 4e284655d9 trivial

Tree-SHA512: d6c3daa0384fc1bba36a46933641c97661b18e88c711343e2c8f91f39aa707eddd0ba77c8d5c43aaead883eeed7f4458ed1dec228d692d713572231aa6010fb0
2020-04-18 13:20:41 +02:00
f-daniel 4e284655d9
Fix typo in ecmult_const_impl.h
Fix small typo in the reference given for the wNAF method
2020-04-18 12:53:06 +02:00
Tim Ruffing f862b4ca13
Merge #740: Make recovery/main_impl.h non-executable
ffef45c98a Make recovery/main_impl.h non-executable (Elichai Turkel)

Pull request description:

  Opened it because of https://github.com/bitcoin/bitcoin/pull/18650

  I assume it doesn't matter?
  But because I'm not sure I preferred to open this then let the info go away in case someone thinks it does matter.

ACKs for top commit:
  real-or-random:
    ACK ffef45c98a

Tree-SHA512: 381aed7f99fd739f4059b2e526ba9cd75b55b4fa86c9cc040fbf6b93055ce8558cc69c4ccf5d8a422b17022ca376cc9a608cf5af8d5841d62c5953f40825f5ff
2020-04-15 22:38:03 +02:00
Elichai Turkel ffef45c98a
Make recovery/main_impl.h non-executable 2020-04-15 23:14:06 +03:00
Jonas Nick 2361b3719a
Merge #735: build: fix OpenSSL EC detection on macOS
3b7d26b23c build: add SECP_TEST_INCLUDES to bench_verify CPPFLAGS (fanquake)
84b5fc5bc3 build: fix OpenSSL EC detection on macOS (fanquake)

Pull request description:

ACKs for top commit:
  real-or-random:
    ACK 3b7d26b23c the diff looks good to me
  jonasnick:
    ACK 3b7d26b23c

Tree-SHA512: 381aed7f99fd739f4059b2e526ba9cd75b55b4fa86c9cc040fbf6b93055ce8558cc69c4ccf5d8a422b17022ca376cc9a608cf5af8d5841d62c5953f40825f5ff
2020-04-13 19:52:17 +00:00
fanquake 3b7d26b23c
build: add SECP_TEST_INCLUDES to bench_verify CPPFLAGS
This is needed so that bench_verify gets CRYPTO_CPPFLAGS, which would
otherwise not be included, at least on macOS.
2020-04-09 17:22:56 +08:00
fanquake 84b5fc5bc3
build: fix OpenSSL EC detection on macOS 2020-04-09 17:14:06 +08:00
Tim Ruffing 37ed51a7ea Make ecdsa_sig_sign constant-time again after reverting 25e3cfb 2020-03-31 15:03:58 +02:00
Tim Ruffing 93d343bfc5 Revert "ecdsa_impl: replace scalar if-checks with VERIFY_CHECKs in ecdsa_sig_sign"
This reverts commit 25e3cfbf9b. The reverted
commit was probably based on the assumption that this is about the touched
checks cover the secret nonce k instead of r, which is the x-coord of the public
nonce. A signature with a zero r is invalid by the spec, so we should return 0
to make the caller retry with a different nonce. Overflow is not an issue.

Fixes #720.
2020-03-31 14:58:58 +02:00
Jonas Nick 7e3952ae82 Clarify documentation of tweak functions.
In particular, mention that the functions return 0 if seckey or tweak are
invalid (as opposed to saying "should" or "must" be valid).
2020-03-30 20:51:47 +00:00
Jonas Nick 89853a0f2e Make tweak function documentation more consistent.
Do this by adding a newline after the first sentence and aligning the rest.
2020-03-30 20:51:47 +00:00
Jonas Nick 41fc785602 Make ec_privkey functions aliases for ec_seckey_negate, ec_seckey_tweak_add and ec_seckey_mul 2020-03-30 20:51:47 +00:00
Jonas Nick 22911ee6da Rename private key to secret key in public API (with the exception of function names) 2020-03-30 20:51:47 +00:00
Jonas Nick 5a73f14d6c Mention that value is unspecified for In/Out parameters if the function returns 0 2020-03-30 20:51:47 +00:00
Jonas Nick f03df0e6d7 Define valid ECDSA keys in the documentation of seckey_verify 2020-03-30 20:51:47 +00:00
Jonas Nick 5894e1f1df Return 0 if the given seckey is invalid in privkey_negate, privkey_tweak_add and privkey_tweak_mul 2020-03-30 20:51:47 +00:00
Jonas Nick 8f814cddb9 Add test for boundary conditions of scalar_set_b32 with respect to overflows 2020-03-30 20:51:47 +00:00
Jonas Nick 3fec982608 Use scalar_set_b32_seckey in ecdsa_sign, pubkey_create and seckey_verify 2020-03-30 20:51:47 +00:00
Jonas Nick 9ab2cbe0eb Add scalar_set_b32_seckey which does the same as scalar_set_b32 and also returns whether it's a valid secret key 2020-03-30 20:51:47 +00:00
Jonas Nick 4f27e344c6
Merge #728: Suppress a harmless variable-time optimization by clang in memczero
01993878bb Add test for memczero() (Tim Ruffing)
52a03512c1 Suppress a harmless variable-time optimization by clang in memczero (Tim Ruffing)

Pull request description:

ACKs for top commit:
  jonasnick:
    ACK 01993878bb

Tree-SHA512: ed385f6e3909299b9979254bd0208a9d0c68caa9f57039e392aa0d5424ed8002c13f8c037bfbd2697c2f6b54af5731209eba9725c5e88be3ee3077c159d134e2
2020-03-27 18:09:21 +00:00
Tim Ruffing 01993878bb Add test for memczero() 2020-03-27 11:07:10 +01:00
Tim Ruffing 52a03512c1 Suppress a harmless variable-time optimization by clang in memczero
This has been not been caught by the new constant-time tests because
valgrind currently gives us a zero exit code even if finds errors, see
https://github.com/bitcoin-core/secp256k1/pull/723#discussion_r388246806 .

This commit also simplifies the arithmetic in memczero.

Note that the timing leak here was the bit whether a secret key was
out of range. This leak is harmless and not exploitable. It is just
our overcautious practice to prefer constant-time code even here.
2020-03-27 10:23:45 +01:00
Jonas Nick 8f78e208ad
Merge #722: Context isn't freed in the ECDH benchmark
85b35afa76 Add running benchmarks regularly and under valgrind in travis (Elichai Turkel)
ca4906b02e Pass num of iters to benchmarks as variable, and define envvar (Elichai Turkel)
02dd5f1bbb free the ctx at the end of bench_ecdh (Elichai Turkel)

Pull request description:

ACKs for top commit:
  real-or-random:
    ACK 85b35afa76 I looked at the diff and tested the ecdh benchmark using valgrind
  jonasnick:
    ACK 85b35afa76

Tree-SHA512: 029456d2c8f6c2c45c689279683ae30b067872bbfaee76a657f7fc3a059e2dffcde09ed29e3610de3adb055405126b6c3656c7ab5f5aaa1f45af2b32d4693ec4
2020-03-24 15:54:03 +00:00
Tim Ruffing ed1b91171a
Merge #700: Allow overriding default flags
ca739cba23 Compile with optimization flag -O2 by default instead of -O3 (Jonas Nick)
83fb1bcef4 Remove -O2 from default CFLAGS because this would override the -O3 flag (see AC_PROG_CC in the Autoconf manual) (Jonas Nick)
ecba8138ec Append instead of Prepend user-CFLAGS to default CFLAGS allowing the user to override default variables (Jonas Nick)
613c34cd86 Remove test in configure.ac because it doesn't have an effect (Jonas Nick)

Pull request description:

  Right now, it's not easy to reduce the optimization level with `CFLAGS` because `configure` overwrites any optimization flag with `-O3`. The [automake documentation](https://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html) states that:

   > The reason ‘$(CPPFLAGS)’ appears after ‘$(AM_CPPFLAGS)’ or ‘$(mumble_CPPFLAGS)’ in the compile command is that users should always have the last say.

  and also that it's incorrect to redefine CFLAGS in the first place

  > You should never redefine a user variable such as CPPFLAGS in Makefile.am. [...] You should not add options to these user variables within configure either, for the same reason

  With this PR `CFLAGS` is still redefined, but user-provided flags appear after the default `CFLAGS` which means that they override the default flags (at least in clang and gcc). Otherwise, the default configuration is not changed. This also means that if CFLAGS are defined by the user, then -g is not added (which does not seem to make much sense). In order to keep the `-O3` despite the reordering we need to explicitly tell autoconf to not append `-O2` by setting the default to `-g` with `: ${CFLAGS="-g"}` as per [the manual](https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.69/autoconf.html#C-Compiler) (EDIT: link fix).

ACKs for top commit:
  real-or-random:
    ACK ca739cba23
  theuni:
    ACK ca739cba23.
  elichai:
    ACK ca739cba23

Tree-SHA512: be92589faa461d245203385d44b489c7d6917b0c68472b8d7576806c0250cf5ff61d5c99ce04eebb8ff5279b9987185d4e5d2da979683fb1c489fdf3e5b59630
2020-03-20 16:56:33 +01:00
Elichai Turkel 85b35afa76
Add running benchmarks regularly and under valgrind in travis 2020-03-18 16:17:27 +02:00
Elichai Turkel ca4906b02e
Pass num of iters to benchmarks as variable, and define envvar 2020-03-13 11:48:01 +02:00
Elichai Turkel 02dd5f1bbb
free the ctx at the end of bench_ecdh 2020-03-04 14:14:51 +02:00
Tim Ruffing e9fccd4de1
Merge #708: Constant-time behaviour test using valgrind memtest.
08fb6c4926 Run valgrind_ctime_test in travis (Jonas Nick)
3d2302257f Constant-time behaviour test using valgrind memtest. (Gregory Maxwell)

Pull request description:

  Valgrind does bit-level tracking of the "uninitialized" status of memory,
   property tracks memory which is tainted by any uninitialized memory, and
   warns if any branch or array access depends on an uninitialized bit.

  That is exactly the verification we need on secret data to test for
   constant-time behaviour. All we need to do is tell valgrind our
   secret key is actually uninitialized memory.

  This adds a valgrind_ctime_test which is compiled if valgrind is installed:

  Run it with libtool --mode=execute:
  $ libtool --mode=execute valgrind ./valgrind_ctime_test

ACKs for top commit:
  sipa:
    ACK 08fb6c4926
  real-or-random:
    ACK 08fb6c4926
  jonasnick:
    ACK 08fb6c4926

Tree-SHA512: d2eb829fb09f43ad1af70898e0eb9cf3f002c6bc418eca9e3e01a9c2c6e87c092aed23d6b0f311ddccbce1cce5f8ef39162cf9b2e68b83d160bc3d249e881493
2020-03-03 16:50:55 +01:00
Jonas Nick 08fb6c4926 Run valgrind_ctime_test in travis 2020-02-24 18:59:30 +00:00
Gregory Maxwell 3d2302257f Constant-time behaviour test using valgrind memtest.
Valgrind does bit-level tracking of the "uninitialized" status of memory,
 property tracks memory which is tainted by any uninitialized memory, and
 warns if any branch or array access depends on an uninitialized bit.

That is exactly the verification we need on secret data to test for
 constant-time behaviour. All we need to do is tell valgrind our
 secret key is actually uninitialized memory.

This adds a valgrind_ctime_test which is compiled if valgrind is installed:

Run it with libtool --mode=execute:
$ libtool --mode=execute valgrind ./valgrind_ctime_test
2020-02-24 18:59:30 +00:00
Tim Ruffing 96d8ccbd16
Merge #710: Eliminate harmless non-constant time operations on secret data.
7b50483ad7 Adds a declassify operation to aid constant-time analysis. (Gregory Maxwell)
34a67c773b Eliminate harmless non-constant time operations on secret data. (Gregory Maxwell)

Pull request description:

  There were several places where the code was non-constant time
   for invalid secret inputs.  These are harmless under sane use
   but get in the way of automatic const-time validation.

  (Nonce overflow in signing is not addressed, nor is s==0 in signing)

ACKs for top commit:
  sipa:
    utACK 7b50483ad7
  real-or-random:
    ACK 7b50483ad7 I read the code carefully and tested it
  jonasnick:
    reACK 7b50483ad7

Tree-SHA512: 0776c3a86e723d2f97b9b9cb31d0d0e59dfcf308093b3f46fbc859f73f9957f3fa977d03b57727232040368d058701ef107838f9b1ec98f925ec78ddad495c4e
2020-02-24 14:04:36 +01:00
Tim Ruffing 0585b8b2ee
Merge #718: Clarify that a secp256k1_ecdh_hash_function must return 0 or 1
eb45ef3384 Clarify that a secp256k1_ecdh_hash_function must return 0 or 1 (Tim Ruffing)

Pull request description:

  and improve style of the ECDH docs.

ACKs for top commit:
  sipa:
    utACK eb45ef3384
  jonasnick:
    ACK eb45ef3384
  elichai:
    ACK eb45ef3384
  apoelstra:
    utACK eb45ef3384

Tree-SHA512: fa1e34fbbe2fd53b633c48c70fbd9d6eec4be1303b660ff87945d49333264ef5c28a4db9407161907697f37ca657a1ee7b50e58861689de526ad4d685dedeae6
2020-02-23 09:24:43 +01:00
Gregory Maxwell 7b50483ad7 Adds a declassify operation to aid constant-time analysis.
ECDSA signing has a retry loop for the exceptionally unlikely case
 that S==0.  S is not a secret at this point and this case is so
 rare that it will never be observed but branching on it will trip
 up tools analysing if the code is constant time with respect to
 secrets.

Derandomized ECDSA can also loop on k being zero or overflowing,
 and while k is a secret these cases are too rare (1:2^255) to
 ever observe and are also of no concern.

This adds a function for marking memory as no-longer-secret and
 sets it up for use with the valgrind memcheck constant-time
 test.
2020-02-20 17:27:26 +00:00
Gregory Maxwell 34a67c773b Eliminate harmless non-constant time operations on secret data.
There were several places where the code was non-constant time
 for invalid secret inputs.  These are harmless under sane use
 but get in the way of automatic const-time validation.

(Nonce overflow in signing is not addressed, nor is s==0 in
 signing)
2020-02-20 17:27:03 +00:00
Jonas Nick ca739cba23 Compile with optimization flag -O2 by default instead of -O3 2020-02-19 14:07:54 +00:00
Tim Ruffing eb45ef3384 Clarify that a secp256k1_ecdh_hash_function must return 0 or 1
and improve style of the ECDH docs.
2020-02-14 16:18:00 +01:00
Tim Ruffing 856a01d6ad
Merge #714: doc: document the length requirements of output parameter.
4b48a43106 doc: document the length requirements of output parameter. (Rusty Russell)

Pull request description:

  It's subtle, since it is actually only touched by hashfp (though
  we assert it's non-NULL), but give explicit advice in the default
  case.

  Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

ACKs for top commit:
  jonasnick:
    ACK 4b48a43106
  real-or-random:
    ACK 4b48a43106 diff inspection

Tree-SHA512: d6bedb495e46b27ac9b558e77d814884d782ea78569a2296688eccf374bc880d13846546ad449c2a677865cf6ed56fcbc8be58c21f9daca5084831074e20d769
2020-02-10 12:07:21 +01:00