Commit Graph
56 Commits
Author SHA1 Message Date
MarcoFalke 16d132215c refactor: Use (int)&(int) in boolean context to avoid compiler warning
This fixes a compiler warning:

./src/ecdsa_impl.h:312:12: warning: use of bitwise '&' with boolean operands [-Wbitwise-instead-of-logical]
    return !secp256k1_scalar_is_zero(sigr) & !secp256k1_scalar_is_zero(sigs);
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2021-11-09 11:34:48 +01:00
Tim Ruffing 920a0e5fa6 Merge bitcoin-core/secp256k1#952: Avoid computing out-of-bounds pointer.
9be7b0f083 Avoid computing out-of-bounds pointer. (Tim Ruffing)

Pull request description:

  This is a pedantic case of UB.

  Spotted in #879.

ACKs for top commit:
  elichai:
    ACK 9be7b0f083
  practicalswift:
    cr ACK 9be7b0f083
  sipa:
    ACK 9be7b0f083

Tree-SHA512: a9d028c4cdb37ad0d5fcf0d2f678eef732a653d37155a69a20272c6b283c28e083172485d7a37dc4a7c6100b22a6f5b6a92e729239031be228cc511842ee35e8
2021-10-17 11:55:31 +02:00
Russell O'Connor 6815761cf5 Remove ecmult_context.
These tables stored in this context are now statically available from the generated ecmult_static_pre_g.h file.
2021-08-20 11:11:26 -04: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
Pieter Wuille 9570f674cc Avoid passing out-of-bound pointers to 0-size memcpy
Doing so could be considered UB in a strict reading of the standard.
Avoid it.
2021-01-23 21:56:43 -08:00
Dimitris Apostolou 07aa4c70ff Fix insecure links 2020-12-18 00:24:22 +02: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
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
Tim Ruffing 14c7dbd444 Simplify control flow in DER parsing 2019-05-23 15:22:29 +02:00
Tim Ruffing ec8f20babd Avoid out-of-bound pointers and integer overflows in size comparisons
This changes pointer calculations in size comparions to a form that
ensures that no out-of-bound pointers are computed, because even their
computation yields undefined behavior.
Also, this changes size comparions to a form that ensures that neither
the left-hand side nor the right-hand side can overflow.
2019-05-23 15:22:29 +02:00
Tim Ruffing 01ee1b3b3c Parse DER-enconded length into a size_t instead of an int
This avoids a possibly implementation-defined signed (int) to unsigned
(size_t) conversion portably.
2019-05-23 15:22:29 +02:00
Tim Ruffing 3cb057f842 Fix possible integer overflow in DER parsing
If we’re in the last loop iteration, then `lenleft == 1` and it could
be the case that `ret == MAX_SIZE`, and so `ret +  lenleft` will
overflow to 0 and the sanity check will not catch it. Then we will
return `(int) MAX_SIZE`, which should be avoided because this value is
implementation-defined. (However, this is harmless because
`(int) MAX_SIZE == -1` on all supported platforms.)
2018-12-14 11:43:47 +01:00
Dan Raviv abe2d3e84b Fix header guards using reserved identifiers
Identifiers starting with an underscore and followed immediately by a capital letter are reserved by the C++ standard.

The only header guards not fixed are those in the headers auto-generated from java.
2017-08-26 18:44:21 +03:00
Dag Robole 2e1ccdca0d Remove redundant conditional expression 2017-07-13 18:00:03 +02:00
Andrew Poelstra 678b0e5466 exhaustive tests: remove erroneous comment from ecdsa_sig_sign
Mathematically, we always overflow when using the exhaustive tests (because our
scalar order is 13 and our field order is on the order of 2^256), but the
`overflow` variable returned when parsing a b32 as a scalar is always set
to 0, to prevent infinite (or practically infinite) loops searching for
non-overflowing scalars.
2016-11-28 19:46:18 +00:00
Andrew Poelstra 25e3cfbf9b ecdsa_impl: replace scalar if-checks with VERIFY_CHECKs in ecdsa_sig_sign
Whenever ecdsa_sig_sign is called, in the case that r == 0 or r overflows,
we want to retry with a different nonce rather than fail signing entirely.
Because of this, we always check the nonce conditions before calling
sig_sign, so these checks should always pass (and in particular, they
are inaccessible through the API and appear as uncovered code in test
coverage).
2016-11-26 20:14:19 +00:00
Andrew Poelstra b4ceedf14f Add exhaustive test for verification 2016-11-26 00:35:02 +00:00
Gregory Maxwell 269d422703 Comment copyediting. 2015-10-31 08:31:15 +00:00
Gregory Maxwell 1b3efc1147 Move secp256k1_ecdsa_sig_recover into the recovery module. 2015-10-22 22:57:33 +00:00
Gregory Maxwell e3cd679634 Eliminate all side-effects from VERIFY_CHECK() usage.
The side-effects make review somewhat harder because 99.9% of the
 time the macro usage has no sideeffects, so they're easily ignored.

The main motivation for avoiding the side effects is so that the
 macro can be completely stubbed out for branch coverage analysis
 otherwise all the unreachable verify code gets counted against
 coverage.
2015-10-22 22:57:33 +00:00
Gregory Maxwell 6c476a8a9b Minor comment improvements. 2015-10-22 22:57:33 +00:00
Pieter Wuille fea19e7bb7 Add contrib/lax_der_parsing.h
This shows a snippet of code to do lax DER parsing, without obeying to any
particular standard.
2015-10-21 16:14:35 +02:00
Pieter Wuille 3bb9c44719 Rewrite ECDSA signature parsing code
There are now 2 encoding formats supported: 64-byte "compact" and DER.
The latter is strict: the data has to be exact DER, though the values
inside don't need to be valid.
2015-10-21 16:13:37 +02:00
Pieter Wuille dd891e0ed5 Get rid of _t as it is POSIX reserved 2015-09-21 21:03:37 +02:00
Luke Dashjr 788038d323 Use size_t for lengths (at least in external API) 2015-09-19 19:33:21 +00:00
Pieter Wuille 18c329c506 Remove the internal secp256k1_ecdsa_sig_t type 2015-07-26 16:52:17 +02:00
Pieter Wuille 74a2acdb8a Add a secp256k1_ecdsa_signature_t type 2015-07-26 16:02:20 +02:00
Pieter Wuille a9b6595ef8 [API BREAK] Introduce explicit contexts 2015-04-11 01:01:10 -07:00
Gregory Maxwell 2632019713 Brace all the if/for/while.
Unbraced statements spanning multiple lines has been shown in many
 projects to contribute to the introduction of bugs and a failure
 to catch them in review, especially for maintenance on infrequently
 modified code.

Most, but not all, of the existing practice in the codebase were not
 cases that I would have expected to eventually result in bugs but
 applying it as a rule makes it easier for other people to safely
 contribute.

I'm not aware of any such evidence for the case with the statement
 on a single line, but some people strongly prefer to never do that
 and the opposite rule of "_always_ use a single line for single
 statement blocks" isn't a reasonable rule for formatting reasons.
 Might as well brace all these too, since that's more universally
 acceptable.

[In any case, I seem to have introduced the vast majority of the
 single-line form (as they're my preference where they fit).]

This also removes a broken test which is no longer needed.
2015-03-27 23:24:32 +00:00
Gregory Maxwell 6efd6e7777 Some comments explaining some of the constants in the code. 2015-02-07 00:22:13 +00:00
Gregory Maxwell 792bcdb015 Covert several more files to C89. 2015-01-24 23:34:09 +00:00
Gregory Maxwell 3627437d80 C89 nits and dead code removal. 2015-01-23 04:17:12 +00:00
Pieter Wuille 4732d26069 Convert the field/group/ecdsa constant initialization to static consts 2015-01-22 22:44:52 -05:00
Gregory Maxwell d26e26f2f4 Avoid constructing an invalid signature with probability 1:2^256. 2014-12-28 19:40:40 -08:00
Pieter Wuille 13278f642c Add explanation about how inversion can be avoided 2014-12-16 22:52:07 +01:00
Pieter Wuille ce7eb6fb3d Optimize verification: avoid field inverse
Suggested by Greg Maxwell.
2014-12-16 22:38:17 +01:00
Pieter Wuille 6a9901e15b Merge pull request #137
39bd94d Variable time normalize (Pieter Wuille)
2014-12-07 14:35:23 +01:00
Pieter Wuille a5759c572e Check return value of malloc 2014-12-07 02:58:24 +01:00
Pieter Wuille 39bd94d86d Variable time normalize 2014-12-06 18:18:28 +01:00
Gregory Maxwell ee3eb4be9e Fix a memory leak and add a number of small tests.
This fixes a simple copy and paste induced memory leak for the ecdsa init.

The tests are mostly just improving coverage and aren't interesting.
2014-12-04 07:17:08 -08:00
Pieter Wuille 659b554d7b Make constant initializers independent from num 2014-12-01 12:38:38 +01:00
Pieter Wuille f24041d6aa Switch all EC/ECDSA logic from num to scalar 2014-11-30 23:38:01 +01:00
Pieter Wuille d907ebc0e3 Add bounds checking to field element setters 2014-11-26 15:21:31 +01:00
Pieter Wuille 4861f83686 Test whether recovered public keys are not infinity
Fixes a bug discovered by Sergio Demian Lerner.
2014-11-18 12:37:39 +01:00
Gregory Maxwell 71712b27e5 Switch to C89 comments in prep for making the whole codebase C89 compatible.
This should be whitespace/comment only changes and should produce the same
object code.
2014-11-15 07:33:07 -08:00
Gregory Maxwell a4a43d7543 Reorder static to comply with C99 and switch to the inline macro. 2014-11-12 13:07:55 -08:00
Pieter Wuille da55986fdf Label variable-time functions correctly and don't use those in sign 2014-11-04 02:50:06 -08:00
Pieter Wuille 501d58f098 Get rid of {num,scalar,ecdsa_sig}_{init,free} 2014-11-03 01:31:04 -08:00
Pieter Wuille eca6cdb123 Switch scalar to use get/set 32-byte arrays 2014-10-29 00:40:56 -07:00