mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-09-11 21:20:39 +02:00
Both are identical since C++17 and this refactor shouldn't change any behavior. The benefits are consistency and to be explicit, to avoid confusion with the C++11/14 constexpr. Co-Authored-By: l0rinc <pap.lorinc@gmail.com> -BEGIN VERIFY SCRIPT- sed -i --regexp-extended 's/^constexpr \S+ \w+(\[\])? ?[={]/inline &/' $( \ git grep -l '^constexpr ' -- \ '*.h' \ ':(exclude)src/minisketch' \ ) -END VERIFY SCRIPT-
71 lines
3.4 KiB
C++
71 lines
3.4 KiB
C++
// Copyright (c) 2024-present The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or https://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#ifndef BITCOIN_MUSIG_H
|
|
#define BITCOIN_MUSIG_H
|
|
|
|
#include <pubkey.h>
|
|
|
|
#include <optional>
|
|
#include <vector>
|
|
|
|
class CKey;
|
|
struct secp256k1_musig_keyagg_cache;
|
|
class MuSig2SecNonceImpl;
|
|
struct secp256k1_musig_secnonce;
|
|
|
|
inline constexpr size_t MUSIG2_PUBNONCE_SIZE{66};
|
|
|
|
//! Compute the full aggregate pubkey from the given participant pubkeys in their current order.
|
|
//! Outputs the secp256k1_musig_keyagg_cache and validates that the computed aggregate pubkey matches an expected aggregate pubkey.
|
|
//! This is necessary for most MuSig2 operations.
|
|
std::optional<CPubKey> MuSig2AggregatePubkeys(const std::vector<CPubKey>& pubkeys, secp256k1_musig_keyagg_cache& keyagg_cache, const std::optional<CPubKey>& expected_aggregate);
|
|
std::optional<CPubKey> MuSig2AggregatePubkeys(const std::vector<CPubKey>& pubkeys);
|
|
|
|
//! Construct the BIP 328 synthetic xpub for a pubkey
|
|
CExtPubKey CreateMuSig2SyntheticXpub(const CPubKey& pubkey);
|
|
|
|
/**
|
|
* MuSig2SecNonce encapsulates a secret nonce in use in a MuSig2 signing session.
|
|
* Since this nonce persists outside of libsecp256k1 signing code, we must handle
|
|
* its construction and destruction ourselves.
|
|
* The secret nonce must be kept a secret, otherwise the private key may be leaked.
|
|
* As such, it needs to be treated in the same way that CKeys are treated.
|
|
* So this class handles the secure allocation of the secp256k1_musig_secnonce object
|
|
* that libsecp256k1 uses, and only gives out references to this object to avoid
|
|
* any possibility of copies being made. Furthermore, objects of this class are not
|
|
* copyable to avoid nonce reuse.
|
|
*/
|
|
class MuSig2SecNonce
|
|
{
|
|
private:
|
|
std::unique_ptr<MuSig2SecNonceImpl> m_impl;
|
|
|
|
public:
|
|
MuSig2SecNonce();
|
|
MuSig2SecNonce(MuSig2SecNonce&&) noexcept;
|
|
MuSig2SecNonce& operator=(MuSig2SecNonce&&) noexcept;
|
|
~MuSig2SecNonce();
|
|
|
|
// Delete copy constructors
|
|
MuSig2SecNonce(const MuSig2SecNonce&) = delete;
|
|
MuSig2SecNonce& operator=(const MuSig2SecNonce&) = delete;
|
|
|
|
secp256k1_musig_secnonce* Get() const;
|
|
void Invalidate();
|
|
bool IsValid();
|
|
};
|
|
|
|
/**
|
|
* Computes an arbitrary unique session ID to identify ongoing signing sessions.
|
|
* It is the SHA256 of the signing (aggregate) pubkey, the participant pubkey, the sighash, and the pubnonce
|
|
*/
|
|
uint256 MuSig2SessionID(const CPubKey& script_pubkey, const CPubKey& part_pubkey, const uint256& sighash, const std::vector<uint8_t>& pubnonce);
|
|
|
|
std::vector<uint8_t> CreateMuSig2Nonce(MuSig2SecNonce& secnonce, const uint256& sighash, const CKey& our_seckey, const CPubKey& aggregate_pubkey, const std::vector<CPubKey>& pubkeys);
|
|
std::optional<uint256> CreateMuSig2PartialSig(const uint256& hash, const CKey& our_seckey, const CPubKey& aggregate_pubkey, const std::vector<CPubKey>& pubkeys, const std::map<CPubKey, std::vector<uint8_t>>& pubnonces, MuSig2SecNonce& secnonce, const std::vector<std::pair<uint256, bool>>& tweaks);
|
|
std::optional<std::vector<uint8_t>> CreateMuSig2AggregateSig(const std::vector<CPubKey>& participants, const CPubKey& aggregate_pubkey, const std::vector<std::pair<uint256, bool>>& tweaks, const uint256& sighash, const std::map<CPubKey, std::vector<uint8_t>>& pubnonces, const std::map<CPubKey, uint256>& partial_sigs);
|
|
|
|
#endif // BITCOIN_MUSIG_H
|