896 Commits

Author SHA1 Message Date
Jonas Nick
5f6ceafcfa schnorrsig: allow setting MSGLEN != 32 in benchmark 2021-06-27 20:26:15 +00:00
Jonas Nick
fdd06b7967 schnorrsig: add tests for sign_custom and varlen msg verification 2021-06-27 20:26:15 +00:00
Jonas Nick
d8d806aaf3 schnorrsig: add extra parameter struct for sign_custom
This simplifies the interface of sign_custom and allows adding more parameters
later in a backward compatible way.
2021-06-27 20:26:15 +00:00
Jonas Nick
a0c3fc177f schnorrsig: allow signing and verification of variable length msgs
Varlen message support for the default sign function comes from recommending
tagged_sha256. sign_custom on the other hand gets the ability to directly sign
message of any length. This also implies signing and verification support for
the empty message (NULL) with msglen 0.

Tests for variable lengths follow in a later commit.
2021-06-27 20:26:15 +00:00
Jonas Nick
5a8e4991ad Add secp256k1_tagged_sha256 as defined in BIP-340
Gives users the ability to hash messages to 32 byte before they are signed while
allowing efficient domain separation through the tag.
2021-06-27 20:26:15 +00:00
Jonas Nick
b6c0b72fb0 schnorrsig: remove noncefp args from sign; add sign_custom function
This makes the default sign function easier to use while allowing more granular
control through sign_custom.

Tests for sign_custom follow in a later commit.
2021-06-27 20:26:15 +00:00
Pieter Wuille
bdf19f105c Add random field multiply/square tests 2021-06-21 16:34:33 -07:00
Tim Ruffing
9be7b0f083 Avoid computing out-of-bounds pointer.
This is a pedantic case of UB.
2021-06-16 10:33:41 +02:00
Tim Ruffing
8ae56e33e7
Merge #879: Avoid passing out-of-bound pointers to 0-size memcpy
9570f674cc729cafcba65f4cce03552d9a6108f4 Avoid passing out-of-bound pointers to 0-size memcpy (Pieter Wuille)

Pull request description:

  Doing so could be considered UB in a pedantic interpretation of the standard. Avoid it.

  Closes #876.

ACKs for top commit:
  practicalswift:
    cr ACK 9570f674cc729cafcba65f4cce03552d9a6108f4: patch looks correct
  real-or-random:
    ACK 9570f674cc729cafcba65f4cce03552d9a6108f4

Tree-SHA512: f991462d72e39f14e609021b8427c2e6756009bc8cd21efca2da46ec9410250725a4fed662df20fcdcfd10a4dc59038f13e8c166362b2eadde4366586b9ca72b
2021-06-16 10:22:03 +02:00
Jonas Nick
8f879c2887 Fix array size in bench_ecmult 2021-05-31 20:46:04 +00:00
Jonas Nick
2fe1b50df1 Add ecmult_gen, ecmult_const and ecmult to benchmark 2021-05-31 20:46:04 +00:00
Jonas Nick
593e6bad9c Clean up ecmult_bench to make space for more benchmarks 2021-05-31 20:46:04 +00:00
Jonas Nick
442cee5baf schnorrsig: add algolen argument to nonce_function_hardened
This avoids having to remove trailing NUL bytes in the nonce function
2021-05-28 11:40:52 +00:00
Tim Ruffing
489ff5c20a tests: Treat empty SECP2561_TEST_ITERS as if it was unset 2021-05-21 20:46:48 +02:00
Jonas Nick
202a030f7d
Merge #850: add secp256k1_ec_pubkey_cmp method
6eceec6d566898a5c157630e47f95b260767026b add `secp256k1_xonly_pubkey_cmp` method (Andrew Poelstra)
0d9561ae879848191a14bcc67db87cbfd44fb69a add `secp256k1_ec_pubkey_cmp` method (Andrew Poelstra)

Pull request description:

ACKs for top commit:
  elichai:
    Code review ACK 6eceec6d566898a5c157630e47f95b260767026b
  jonasnick:
    ACK 6eceec6d566898a5c157630e47f95b260767026b
  real-or-random:
    ACK 6eceec6d566898a5c157630e47f95b260767026b

Tree-SHA512: f95cbf65f16c88a4adfa1ea7cc6ddabab14baa3b68fa069e78e6faad4852cdbfaea42ee72590d2e0b8f3159cf9b37969511550eb6b2d256b101e2147711cc817
2021-05-13 19:17:53 +00:00
Andrew Poelstra
6eceec6d56 add secp256k1_xonly_pubkey_cmp method 2021-05-06 18:36:44 +00:00
Andrew Poelstra
0d9561ae87 add secp256k1_ec_pubkey_cmp method 2021-05-06 18:36:41 +00:00
Tim Ruffing
6c52ae8724
Merge #937: Have ge_set_gej_var, gej_double_var and ge_set_all_gej_var initialize all fields of their outputs.
14c9739a1fb485bb56dbe3447132a37bcbef4e22 tests: Improve secp256k1_ge_set_all_gej_var for some infinity inputs (Tim Ruffing)
4a19668c37bc77d0165f4a1c0e626e321e9c4a09 tests: Test secp256k1_ge_set_all_gej_var for all infinity inputs (Tim Ruffing)
45b6468d7e3ed9849ed474c71e9a9479de1a77db Have secp256k1_ge_set_all_gej_var initialize all fields. Previous behaviour would not initialize r->y values in the case where infinity is passed in. Furthermore, the previous behaviour wouldn't initialize anything in the case where all inputs were infinity. (Russell O'Connor)
31c0f6de413e521731ad0e63424431b3dd49cec8 Have secp256k1_gej_double_var initialize all fields. Previous behaviour would not initialize r->x and r->y values in the case where infinity is passed in. (Russell O'Connor)
dd6c3de322740a3054cf6a1994a38dc8f201b473 Have secp256k1_ge_set_gej_var initialize all fields. Previous behaviour would not initialize r->x and r->y values in the case where infinity is passed in. (Russell O'Connor)

Pull request description:

  Previous behaviour would not initialize `r->x` and `r->y` values in the case where infinity is passed in.

ACKs for top commit:
  gmaxwell:
    ACK 14c9739a1fb485bb56dbe3447132a37bcbef4e22
  sipa:
    utACK 14c9739a1fb485bb56dbe3447132a37bcbef4e22
  real-or-random:
    ACK 14c9739a1fb485bb56dbe3447132a37bcbef4e22

Tree-SHA512: 2e779b767f02e348af4bbc62aa9871c3d1d29e61a6c643c879c49f2de27556a3588850acd2f7c7483790677597d01064025e14befdbf29e783f57996fe4430f9
2021-05-06 09:39:36 +02:00
Tim Ruffing
14c9739a1f tests: Improve secp256k1_ge_set_all_gej_var for some infinity inputs 2021-05-05 13:07:25 -04:00
Tim Ruffing
4a19668c37 tests: Test secp256k1_ge_set_all_gej_var for all infinity inputs 2021-05-05 13:07:25 -04:00
William Bright
3c90bdda95 change local lib headers to be relative for those pointing at "include/" dir
added relative paths to header files imported from src directory

added include guards for contrib/ files when referring to secp256k1.h
2021-05-05 09:24:05 -04:00
Russell O'Connor
45b6468d7e Have secp256k1_ge_set_all_gej_var initialize all fields.
Previous behaviour would not initialize r->y values in the case where infinity is passed in.
Furthermore, the previous behaviour wouldn't initialize anything in the case where all inputs were infinity.
2021-05-04 16:17:00 -04:00
Russell O'Connor
31c0f6de41 Have secp256k1_gej_double_var initialize all fields.
Previous behaviour would not initialize r->x and r->y values in the case where infinity is passed in.
2021-05-04 15:49:48 -04:00
Russell O'Connor
dd6c3de322 Have secp256k1_ge_set_gej_var initialize all fields.
Previous behaviour would not initialize r->x and r->y values in the case where infinity is passed in.
2021-05-04 14:59:47 -04:00
Tim Ruffing
99f47c20ec gen_context: Don't use external ASM because it complicates the build
Fixes #931.
2021-05-03 15:05:38 +02:00
Gregory Maxwell
99e2d5be0d Avoids a missing brace warning in schnorrsig/tests_impl.h on old compilers.
GCC 4.9.2, at least, emits "warning: missing braces around initializer"
 without this.
2021-05-02 20:02:12 +00:00
Jonas Nick
34388af6b6
Merge #922: Add mingw32-w64/wine CI build
ed5a199bed65bf084f34ce18d35807d31a1c75bb tests: fopen /dev/urandom in binary mode (Tim Ruffing)
4dc37bf81b55b9a3ffcf09f7a212436d25844710 Add mingw32-w64/wine CI build (Pieter Wuille)

Pull request description:

ACKs for top commit:
  real-or-random:
    ACK ed5a199bed65bf084f34ce18d35807d31a1c75bb
  jonasnick:
    utACK ed5a199bed65bf084f34ce18d35807d31a1c75bb

Tree-SHA512: 45afc394e3a200f7c020426a66f78df8d12827b9dc91bb04dc1708c3ad5cdc4e7d20554d6d5c046d288552f4e722d4fe8a0f3234b662e7351a4d27aaaeb0d5c0
2021-05-02 12:57:40 +00:00
Tim Ruffing
ed5a199bed tests: fopen /dev/urandom in binary mode
This makes a difference with mingw builds on Wine, where the subsequent
fread() may abort early in the default text mode.

The Microsoft C docs say:
"In text mode, CTRL+Z is interpreted as an EOF character on input."
2021-05-01 17:05:15 -07:00
Gregory Maxwell
ae9e648526 Define SECP256K1_BUILD in secp256k1.c directly.
This avoids building without it and makes it safer to use a custom
 building environment.  Test harnesses need to #include secp256k1.c
 first now.
2021-05-01 19:27:27 +00:00
Tim Ruffing
efad3506a8
Merge #906: Use modified divsteps with initial delta=1/2 for constant-time
be0609fd54af95a15b76cea150e6907d581318dd Add unit tests for edge cases with delta=1/2 variant of divsteps (Pieter Wuille)
cd393ce2283e0e7234ea39a15c4931715f4dde1e Optimization: only do 59 hddivsteps per iteration instead of 62 (Pieter Wuille)
277b224b6aba942efbac4a6aae1054035a68d8dd Use modified divsteps with initial delta=1/2 for constant-time (Pieter Wuille)
376ca366db0469f39b93af0af762090986ea75f2 Fix typo in explanation (Pieter Wuille)

Pull request description:

  This updates the divsteps-based modular inverse code to use the modified version which starts with delta=1/2. For variable time, the delta=1 variant is still used as it appears to be faster.

  See https://github.com/sipa/safegcd-bounds/tree/master/coq and https://medium.com/blockstream/a-formal-proof-of-safegcd-bounds-695e1735a348 for a proof of correctness of this variant.

  TODO:
  * [x] Update unit tests to include edge cases specific to this variant

  I'm still running the Coq proof verification for the 590 bound in non-native mode. It's unclear how long this will take.

ACKs for top commit:
  gmaxwell:
    ACK be0609fd54af95a15b76cea150e6907d581318dd
  sanket1729:
    crACK be0609fd54af95a15b76cea150e6907d581318dd
  real-or-random:
    ACK be0609fd54af95a15b76cea150e6907d581318dd careful code review and some testing

Tree-SHA512: 2f8f400ba3ac8dbd08622d564c3b3e5ff30768bd0eb559f2c4279c6c813e17cdde71b1c16f05742c5657b5238b4d592b48306f9f47d7dbdb57907e58dd99b47a
2021-04-22 20:18:52 +02:00
Aaron Voisine
07067967ee add ECMULT_GEN_PREC_BITS to basic_config.h
set ECMULT_GEN_PREC_BITS to the "auto" value of 4 in basic_config.h, so libsecp can be used without autoconf
2021-04-15 17:18:03 +02:00
Tim Ruffing
a3aa2628c7 gen_context: Don't include basic-config.h
Before this commit, gen_context.c both included libsecp256k1-config.h
and basic-config.h: The former only to obtain ECMULT_GEN_PREC_BITS
and the latter to obtain a basic working configuration to be able to
use the library.

This was inelegant and confusing: It meant that basic-config.h needs
to #undef all the macros defined in libsecp256k1-config.h. Moreover,
it meant that basic-config.h cannot define ECMULT_GEN_PREC_BITS,
essentially making this file specific for use in gen_context.c.

After this commit, gen_context.c include only libsecp256k1-config.h.
basic-config.h is not necessary anymore for the modules used in
gen_context.c because 79f1f7a made the preprocessor detect all the
relevant config options.

On the way, we remove an unused #define in basic-config.h.
2021-04-15 17:18:03 +02:00
Pieter Wuille
be0609fd54 Add unit tests for edge cases with delta=1/2 variant of divsteps 2021-04-13 11:59:14 -07:00
Pieter Wuille
cd393ce228 Optimization: only do 59 hddivsteps per iteration instead of 62 2021-04-13 11:59:14 -07:00
Pieter Wuille
277b224b6a Use modified divsteps with initial delta=1/2 for constant-time
Instead of using eta=-delta, use zeta=-(delta+1/2) to represent
delta. This variant only needs at most 590 iterations for 256-bit
inputs rather than 724 (by convex hull bounds analysis).
2021-04-13 11:59:11 -07:00
Jonas Nick
1e5d50fa93
Merge #889: fix uninitialized read in tests
99a1cfec1740a914aa416a87fd0acbde5426b969 print warnings for conditional-uninitialized (PiRK)
3d2cf6c5bd35b0d72716b47bdd7e3892388aafc4 initialize variable in tests (PiRK)

Pull request description:

ACKs for top commit:
  real-or-random:
    ACK 99a1cfec1740a914aa416a87fd0acbde5426b969 code inspection
  jonasnick:
    ACK 99a1cfec1740a914aa416a87fd0acbde5426b969

Tree-SHA512: 72f92f51c44210ab54f166920f540525db0e3d1f19a2fa56e4a6d157a38a582f9dc649d919cf3278482c9fd723021b07759284a8fccbc574b62a22aac0facf51
2021-04-07 12:53:09 +00:00
Jonas Nick
c083cc6e52
Merge #903: Make argument of fe_normalizes_to_zero{_var} const
23c3fb629b905deebc4bcc9914bcfff7b9aedacd Make argument of fe_normalizes_to_zero{_var} const (Pieter Wuille)

Pull request description:

ACKs for top commit:
  real-or-random:
    ACK 23c3fb629b905deebc4bcc9914bcfff7b9aedacd diff looks good
  jonasnick:
    ACK 23c3fb629b905deebc4bcc9914bcfff7b9aedacd

Tree-SHA512: a51894a9e59851dc4854e92e4200ef6d12a11f6785b903c23585cfff5ef8d369216f4121260fe8789d46d3e215f3c2baa42decae99ab9328e8081f5274e67fab
2021-03-26 14:57:01 +00:00
William Bright
4504472269 changed import to use brackets <> for openssl as they are not local to the project 2021-03-20 19:59:51 -04:00
Pieter Wuille
23c3fb629b Make argument of fe_normalizes_to_zero{_var} const 2021-03-15 16:01:57 -07:00
Pieter Wuille
24ad04fc06 Make scalar_inverse{,_var} benchmark scale with SECP256K1_BENCH_ITERS 2021-03-15 13:01:56 -07:00
Peter Dettman
ebc1af700f Optimization: track f,g limb count and pass to new variable-time update_fg_var
The magnitude of the f and g variables generally goes down as the algorithm
progresses. Make use of this by keeping tracking how many limbs are used, and
when the number becomes small enough, make use of this to reduce the complexity
of arithmetic on them.

Refactored by: Pieter Wuille <pieter@wuille.net>
2021-03-15 13:01:56 -07:00
Peter Dettman
b306935ac1 Optimization: use formulas instead of lookup tables for cancelling g bits
This only seems to be a win on 64-bit platforms, so only do it there.

Refactored by: Pieter Wuille <pieter@wuille.net>
2021-03-15 13:01:56 -07:00
Pieter Wuille
9164a1b658 Optimization: special-case zero modulus limbs in modinv64
Both the field and scalar modulus can be written in signed{30,62} notation
with one or more zero limbs. Make use of this in the update_de function to
avoid a few wide multiplications when that is the case.

This doesn't appear to be a win in the 32-bit implementation, so only
do it for the 64-bit one.
2021-03-15 13:01:56 -07:00
Pieter Wuille
1f233b3fa0 Remove num/gmp support
The whole "num" API and its libgmp-based implementation are now unused. Remove them.
2021-03-15 13:01:52 -07:00
Pieter Wuille
20448b8d09 Remove unused Jacobi symbol support
No exposed functions rely on Jacobi symbol computation anymore. Remove it; it can always
be brough back later if needed.
2021-03-12 10:06:18 -08:00
Pieter Wuille
5437e7bdfb Remove unused scalar_sqr 2021-03-12 10:06:18 -08:00
Pieter Wuille
aa9cc52180 Improve field/scalar inverse tests
Add a new run_inverse_tests that replaces all existing field/scalar inverse tests,
and tests a few identities for fixed inputs, small numbers (-999...999), random
inputs (structured and unstructured), as well as comparing with the output of
secp256k1_fe_inv_all_var.
2021-03-12 10:06:18 -08:00
Pieter Wuille
1e0e885c8a Make field/scalar code use the new modinv modules for inverses 2021-03-12 10:06:14 -08:00
Pieter Wuille
436281afdc Move secp256k1_fe_inverse{_var} to per-impl files
This temporarily duplicates the inversion code across the 5x52 and 10x26
implementations. Those implementations will be replaced in a next commit.
2021-03-11 10:25:26 -08:00
Pieter Wuille
aa404d53be Move secp256k1_scalar_{inverse{_var},is_even} to per-impl files
This temporarily duplicates the inversion code across the 4x64 and 8x32
implementations. Those implementations will be replaced in a later commit.
2021-03-11 10:25:26 -08:00