Commit graph

180 commits

Author SHA1 Message Date
ivanlele
e29ecdc7e4
Merge b38fb19b7e into merged_master (Bitcoin PR bitcoin/bitcoin#30051) 2026-03-11 14:39:26 +00:00
Tom Trevethan
e8a3a3de2e Merge 23b3dc2dd1 into merged_master (Bitcoin PR bitcoin/bitcoin#30218) 2026-02-25 22:07:13 +00:00
ivanlele
c38a7c5575
Merge 2cedb42a92 into merged_master (Bitcoin PR bitcoin/bitcoin#29252) 2026-02-20 11:47:18 +00:00
Byron Hambly
1c37230da9
Merge 514268170b into merged_master (Bitcoin PR bitcoin/bitcoin#29133) 2025-11-18 13:27:06 +02:00
Byron Hambly
e2aa52246d
Merge 265250687b into merged_master (Bitcoin PR bitcoin/bitcoin#28455) 2025-11-17 21:16:45 +02:00
Byron Hambly
c44264a9b6
Merge 0f9307c4cb into merged_master (Bitcoin PR bitcoin/bitcoin#28500) 2025-08-04 15:47:42 +02:00
Byron Hambly
2a1d79e0f0 Merge 679f825ba3 into merged_master (Bitcoin PR bitcoin/bitcoin#27479) 2025-06-28 09:46:07 +02:00
Byron Hambly
91316a17b7 Merge 8fc3bcf93d into merged_master (Bitcoin PR bitcoin/bitcoin#27010) 2025-04-05 10:18:32 +02:00
Byron Hambly
e9d7ca4858 Merge 07c54de550 into merged_master (Bitcoin PR bitcoin/bitcoin#26691) 2025-04-02 09:40:04 +02:00
Byron Hambly
b4405ba453 Merge e9262ea32a into merged_master (Bitcoin PR bitcoin/bitcoin#26750) 2025-03-31 16:37:52 +02:00
Byron Hambly
a6f8dc6a86
tidy: fixes for clang tidy ci job 2024-12-04 14:16:45 +02:00
Byron Hambly
5104b4635b Merge 93999a5fbe into merged_master (Bitcoin PR bitcoin/bitcoin#25642) 2024-11-01 13:41:41 +02:00
James Dorfman
ce93bea48c Merge 0cd1a2eff9 into merged_master (Bitcoin PR bitcoin/bitcoin#23595) 2024-08-13 17:56:07 +00:00
josibake
ec973dd197
refactor: remove un-tested early returns
Replace early returns in KeyPair::KeyPair() with asserts.

The if statements imply there is an error we are handling, but keypair_xonly_pub
and xonly_pubkey_serialize can only fail if the keypair object is malformed, i.e.,
it was created with a bad secret key. Since we check that the keypair was created
successfully before attempting to extract the public key, using asserts more
accurately documents what we expect here and removes untested branches from the code.
2024-08-04 08:52:22 +02:00
josibake
cebb08b121
refactor: move SignSchnorr to KeyPair
Move `SignSchnorr` to `KeyPair`. This makes `CKey::SignSchnorr` now
compute a `KeyPair` object and then call `KeyPair::SignSchorr`. The
notable changes are:

    * Move the merkle_root tweaking out of the sign function and into
      the KeyPair constructor
    * Remove the temporary secp256k1_keypair object and have the
      functions access m_keypair->data() directly
2024-08-04 08:51:36 +02:00
josibake
c39fd39ba8
crypto: add KeyPair wrapper class
Add a `KeyPair` class which wraps the `secp256k1_keypair`. This keeps
the secret data in secure memory and enables passing the
`KeyPair` object directly to libsecp256k1 functions expecting a
`secp256k1_keypair`.

Motivation: when passing `CKeys` for taproot outputs to libsecp256k1 functions,
the first step is to create a `secp256k1_keypair` data type and use that
instead. This is so the libsecp256k1 function can determine if the key
needs to be negated, e.g., when signing.

This is a bit clunky in that it creates an extra step when using a `CKey`
for a taproot output and also involves copying the secret data into a
temporary object, which the caller must then take care to cleanse. In
addition, the logic for applying the merkle_root tweak currently
only exists in the `SignSchnorr` function.

In a later commit, we will add the merkle_root tweaking logic to this
function, which will make the merkle_root logic reusable outside of
signing by using the `KeyPair` class directly.

Co-authored-by: Cory Fields <cory-nospam-@coryfields.com>
2024-08-03 15:16:03 +02:00
James Dorfman
f86857195f Merge 43bb106613 into merged_master (Bitcoin PR bitcoin/bitcoin#24213) 2024-08-01 20:20:30 +00:00
Sebastian Falbesoner
8801e319d5 refactor: remove unused CKey::Negate method
This method was introduced as a pre-requirement for the v2 transport
protocol back then (see PR #14047, commit 463921bb), when it was still
BIP151. With the replacement BIP324, this is not needed anymore, and
it's also unlikely that any other proposal would need to negate private
keys at this abstraction level.
(If there is really demand, it's trivial to reintroduce the method.)
2024-06-03 16:59:43 +02:00
TheCharlatan
96378fe734
Refactor: Remove ECC_Start and ECC_Stop from key header
They are unused outside of the key module now.
2024-05-09 15:56:10 +02:00
Ryan Ofsky
538fedde1d
common: Add ECC_Context RAII wrapper for ECC_Start/ECC_Stop 2024-05-09 15:55:55 +02:00
MarcoFalke
fa96d93711
refactor: Allow std::span construction from CKey 2024-01-16 15:29:18 +01:00
Sebastian Falbesoner
fa1d49542e refactor: share and use GenerateRandomKey helper
Making the `GenerateRandomKey` helper available to other modules via
key.{h.cpp} allows us to create random private keys directly at
instantiation of CKey, in contrast to the two-step process of creating
the instance and then having to call `MakeNewKey(...)`.
2023-12-23 13:26:00 +01:00
Pieter Wuille
6ef405ddb1 key: don't allocate secure mem for null (invalid) key
Instead of storing the key material as an std::vector (with secure allocator),
use a secure_unique_ptr to a 32-byte array, and use nullptr for invalid keys.
This means a smaller CKey type, and no secure/dynamic memory usage for invalid
keys.
2023-09-27 15:05:26 -04:00
Byron Hambly
3911e7e2b3
build: fix compilation warnings 2023-09-01 16:39:08 +02:00
Pieter Wuille
eff72a0dff Add ElligatorSwift key creation and ECDH logic
Co-authored-by: Dhruv Mehta <856960+dhruv@users.noreply.github.com>
2023-06-23 14:22:33 -04:00
Byron Hambly
47626b5a64 Merge 623745ca74 into merged_master (Bitcoin PR bitcoin/bitcoin#23912) 2023-06-14 15:44:11 +00:00
Byron Hambly
ab249ee428 Merge c06cda3e48 into merged_master (Bitcoin PR bitcoin/bitcoin#23383)
Kept what we already had since it's a newer version of secp256k1-zkp
2023-06-13 15:44:13 +00:00
Byron Hambly
1beaa601b4 Merge 5ccab7187b into merged_master (Bitcoin PR bitcoin/bitcoin#23394)
- commented out some script tests that need to be fixed
 - commented out feature_taproot.py since it needs significant updates
2023-05-26 09:14:20 +00:00
Byron Hambly
32f69113b5 Merge cb4adbd8ab into merged_master (Bitcoin PR bitcoin/bitcoin#22934) 2023-05-17 13:59:50 +00:00
Byron Hambly
120f8cad78 Merge aecc08f62e into merged_master (Bitcoin PR bitcoin/bitcoin#23409) 2023-05-17 12:01:23 +00:00
Byron Hambly
bedb85c8c6 Merge 829d3e0e71 into merged_master (Bitcoin PR bitcoin/bitcoin#23199) 2023-05-10 13:11:07 +00:00
Byron Hambly
3757afb0bd Merge 01fa1481f9 into merged_master (Bitcoin PR bitcoin/bitcoin#22836) 2023-04-13 11:25:45 +00:00
Byron Hambly
09333e2aca Merge 71797beec5 into merged_master (Bitcoin PR bitcoin/bitcoin#22448) 2023-04-05 13:40:55 +02:00
Sebastian Falbesoner
87f11ef47f refactor: use Hash helper for double-SHA256 calculations 2023-01-31 19:34:35 +01:00
fanquake
07c54de550
Merge bitcoin/bitcoin#26691: Update secp256k1 subtree to libsecp256k1 version 0.2.0
2022917223 Add secp256k1_selftest call (Pieter Wuille)
3bfca788b0 Remove explicit enabling of default modules (Pieter Wuille)
4462cb0498 Adapt to libsecp256k1 API changes (Pieter Wuille)
9d47e7b71b Squashed 'src/secp256k1/' changes from 44c2452fd3..21ffe4b22a (Pieter Wuille)

Pull request description:

  Now that libsecp256k1 has a release (https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2022-December/021271.html), update the subtree to match it.

  The changes themselves are not very impactful for Bitcoin Core, but include:
  * It's no longer needed to specify whether contexts are for signing or verification or both (all contexts support everything), so make use of that in this PR.
  * Verification operations can use the static context now, removing the need for some infrastructure in pubkey.cpp to make sure a context exists.
  * Most modules are now enabled by default, so we can drop explicit enabling for them.
  * CI improvements (in particular, MSVC and more recent MacOS)
  * Introduction of an internal int128 type, which has no effect for GCC/Clang builds, but enables 128-bit multiplication in MSVC, giving a ~20% speedup there (but still slower than GCC/Clang).
  * Release process changes (process documentation, changelog, ...).

ACKs for top commit:
  Sjors:
    ACK 2022917223, but 4462cb0498 could use more eyes on it.
  achow101:
    ACK 2022917223
  jonasnick:
    utACK 2022917223

Tree-SHA512: 8a9fe28852abe74abd6f96fef16a94d5a427b1d99bff4caab1699014d24698aab9b966a5364a46ed1001c07a7c1d825154ed4e6557c7decce952b77330a8616b
2023-01-13 09:40:57 +00:00
Hennadii Stepanov
306ccd4927
scripted-diff: Bump copyright headers
-BEGIN VERIFY SCRIPT-
./contrib/devtools/copyright_header.py update ./
-END VERIFY SCRIPT-

Commits of previous years:
- 2021: f47dda2c58
- 2020: fa0074e2d8
- 2019: aaaaad6ac9
2022-12-24 23:49:50 +00:00
Pieter Wuille
4462cb0498 Adapt to libsecp256k1 API changes
* Use SECP256K1_CONTEXT_NONE when creating signing context, as
  SECP256K1_CONTEXT_SIGN is deprecated and unnecessary.
* Use secp256k1_static_context where applicable.
2022-12-13 15:08:24 -05:00
Antoine Poinsot
fb9faffae3
extended keys: fail to derive too large depth instead of wrapping around
This issue was reported to me by Marco Falke, and found with the
descriptor_parse fuzz target.
2022-08-04 11:32:26 +02:00
Glenn Willen
0fe5e825ad ci: Update for libsecp256k1-zkp API changes 2022-05-25 16:12:00 -07:00
MarcoFalke
facd1fb911
refactor: Use Span of std::byte in CExtKey::SetSeed 2022-04-27 19:53:37 +02:00
laanwj
43bb106613
Merge bitcoin/bitcoin#24213: refactor: use Span in random.*
3ae7791bca refactor: use Span in random.* (pasta)

Pull request description:

  ~This PR does two things~
  1. use a Span<unsigned char> for GetRandBytes and GetStrongRandBytes

  ~2. make GetRand a template for which any integral type can be used, where the default behavior is to return a random integral up to the max of the integral unless a max is provided.
  This simplifies a lot of code from `GetRand(std::numeric_limits<uint64_t>::max()` -> `GetRand<uint64_t>()`~

  MarcoFalke this was inspired by your comment here: https://github.com/bitcoin/bitcoin/pull/24185#issuecomment-1025514263 about using Span, so hopefully I'll be able to get this PR done and merged 😂

  ~Also, if requested I could revert the `GetRand(std::numeric_limits<uint64_t>::max()` -> `GetRand<uint64_t>()` related changes if it ends up causing too many conflicts~

ACKs for top commit:
  laanwj:
    Thank you! Code review re-ACK 3ae7791bca

Tree-SHA512: 12375a83b68b288916ba0de81cfcab4aac14389a66a36811ae850427435eb67dd55e47df9ac3ec47db4e214f4330139e548bec815fff8a3f571484ea558dca79
2022-04-21 16:38:04 +02:00
fanquake
404c53062b
key: use secp256k1_schnorrsig_sign32 over deprecated secp256k1_schnorrsig_sign
The renaming occured in
https://github.com/bitcoin-core/secp256k1/pull/1089.
2022-04-07 22:24:44 +01:00
pasta
3ae7791bca refactor: use Span in random.* 2022-03-23 17:36:33 -05:00
Hennadii Stepanov
f47dda2c58
scripted-diff: Bump copyright headers
-BEGIN VERIFY SCRIPT-
./contrib/devtools/copyright_header.py update ./
-END VERIFY SCRIPT-

Commits of previous years:
* 2020: fa0074e2d8
* 2019: aaaaad6ac9
2021-12-30 19:36:57 +02:00
Pieter Wuille
314195c8be Remove unnecessary cast in CKey::SignSchnorr 2021-12-15 09:20:26 -05:00
Pieter Wuille
2478c6730a Make signing follow BIP340 exactly w.r.t. aux randomness
libsecp256k1's secp256k1_schnorrsig_sign only follows BIP340 exactly
if an aux_rand32 argument is passed. When no randomness is used
(as is the case in the current codebase here), there is no impact
on security between not providing aux_rand32 at all, or providing
an empty one. Yet, for repeatability/testability it is simpler
to always use an all-zero one.
2021-11-12 12:04:20 -05:00
W. J. van der Laan
cb4adbd8ab
Merge bitcoin/bitcoin#22934: Add verification to Sign, SignCompact and SignSchnorr
79fd28cacb Adds verification step to Schnorr and ECDSA signing (amadeuszpawlik)

Pull request description:

  As detailed in #22435, BIP340 defines that during Schnorr signing a verification should be done. This is so that potentially corrupt signage does not leak information about private keys used during the process. This is not followed today as no such verification step is being done. The same is valid for ECDSA signing functions `Sign` and `SignCompact`.
  This PR adds this missing verification step to `SignSchnorr`, `Sign` and `SignCompact`.

ACKs for top commit:
  sipa:
    utACK 79fd28cacb
  laanwj:
    Code review ACK 79fd28cacb
  theStack:
    re-ACK 79fd28cacb

Tree-SHA512: 8fefa26caea577ae8631cc16c4e2f4cc6cfa1c7cf51d45a4a34165636ee290950617a17a19b4237c6f7a841db0e40fd5c36ad12ef43da82507c0e9fb9375ab82
2021-11-09 14:12:41 +01:00
amadeuszpawlik
79fd28cacb Adds verification step to Schnorr and ECDSA signing
As defined in BIP340, a verification step should be executed after
`secp256k1_schnorrsig_sign` to ensure that a potentially corrupted
signature isn't used; using corrupted signatures could reveal
information about the private key used. This applies to ECSDA as
well.

Additionally clears schnorr signature if signing failed.
2021-11-02 17:18:40 +01:00
MarcoFalke
fa93ef5a8a
refactor: Take Span in SetSeed
This makes calling code less verbose and less fragile. Also, by adding
the CKey::data() member function, it is now possible to call HexStr()
with a CKey object.
2021-11-01 14:20:56 +01:00
Sebastian Falbesoner
7fc487afd1 refactor: use {Read,Write}BE32 helpers for BIP32 nChild (de)serialization 2021-10-05 23:53:33 +02:00