mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-06-06 03:02:37 +02:00
signingprovider: Add musig2 secnonces
Adds GetMuSig2SecNonces which returns secp256k1_musig_secnonce*, and DeleteMuSig2Session which removes the MuSig2 secnonce from wherever it was retrieved. FlatSigningProvider stores it as a pointer to a map of session id to secnonce so that deletion will actually delete from the object that actually owns the secnonces. The session id is just a unique identifier for the caller to determine what secnonces have been created.
This commit is contained in:
@@ -58,6 +58,21 @@ std::vector<CPubKey> HidingSigningProvider::GetMuSig2ParticipantPubkeys(const CP
|
|||||||
return m_provider->GetMuSig2ParticipantPubkeys(pubkey);
|
return m_provider->GetMuSig2ParticipantPubkeys(pubkey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HidingSigningProvider::SetMuSig2SecNonce(const uint256& id, MuSig2SecNonce&& nonce) const
|
||||||
|
{
|
||||||
|
m_provider->SetMuSig2SecNonce(id, std::move(nonce));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<std::reference_wrapper<MuSig2SecNonce>> HidingSigningProvider::GetMuSig2SecNonce(const uint256& session_id) const
|
||||||
|
{
|
||||||
|
return m_provider->GetMuSig2SecNonce(session_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HidingSigningProvider::DeleteMuSig2Session(const uint256& session_id) const
|
||||||
|
{
|
||||||
|
m_provider->DeleteMuSig2Session(session_id);
|
||||||
|
}
|
||||||
|
|
||||||
bool FlatSigningProvider::GetCScript(const CScriptID& scriptid, CScript& script) const { return LookupHelper(scripts, scriptid, script); }
|
bool FlatSigningProvider::GetCScript(const CScriptID& scriptid, CScript& script) const { return LookupHelper(scripts, scriptid, script); }
|
||||||
bool FlatSigningProvider::GetPubKey(const CKeyID& keyid, CPubKey& pubkey) const { return LookupHelper(pubkeys, keyid, pubkey); }
|
bool FlatSigningProvider::GetPubKey(const CKeyID& keyid, CPubKey& pubkey) const { return LookupHelper(pubkeys, keyid, pubkey); }
|
||||||
bool FlatSigningProvider::GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const
|
bool FlatSigningProvider::GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const
|
||||||
@@ -94,6 +109,26 @@ std::vector<CPubKey> FlatSigningProvider::GetMuSig2ParticipantPubkeys(const CPub
|
|||||||
return participant_pubkeys;
|
return participant_pubkeys;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FlatSigningProvider::SetMuSig2SecNonce(const uint256& session_id, MuSig2SecNonce&& nonce) const
|
||||||
|
{
|
||||||
|
if (!Assume(musig2_secnonces)) return;
|
||||||
|
musig2_secnonces->emplace(session_id, std::move(nonce));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<std::reference_wrapper<MuSig2SecNonce>> FlatSigningProvider::GetMuSig2SecNonce(const uint256& session_id) const
|
||||||
|
{
|
||||||
|
if (!Assume(musig2_secnonces)) return std::nullopt;
|
||||||
|
const auto& it = musig2_secnonces->find(session_id);
|
||||||
|
if (it == musig2_secnonces->end()) return std::nullopt;
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FlatSigningProvider::DeleteMuSig2Session(const uint256& session_id) const
|
||||||
|
{
|
||||||
|
if (!Assume(musig2_secnonces)) return;
|
||||||
|
musig2_secnonces->erase(session_id);
|
||||||
|
}
|
||||||
|
|
||||||
FlatSigningProvider& FlatSigningProvider::Merge(FlatSigningProvider&& b)
|
FlatSigningProvider& FlatSigningProvider::Merge(FlatSigningProvider&& b)
|
||||||
{
|
{
|
||||||
scripts.merge(b.scripts);
|
scripts.merge(b.scripts);
|
||||||
@@ -102,6 +137,8 @@ FlatSigningProvider& FlatSigningProvider::Merge(FlatSigningProvider&& b)
|
|||||||
origins.merge(b.origins);
|
origins.merge(b.origins);
|
||||||
tr_trees.merge(b.tr_trees);
|
tr_trees.merge(b.tr_trees);
|
||||||
aggregate_pubkeys.merge(b.aggregate_pubkeys);
|
aggregate_pubkeys.merge(b.aggregate_pubkeys);
|
||||||
|
// We shouldn't be merging 2 different sessions, just overwrite with b's sessions.
|
||||||
|
if (!musig2_secnonces) musig2_secnonces = b.musig2_secnonces;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,11 +9,15 @@
|
|||||||
#include <addresstype.h>
|
#include <addresstype.h>
|
||||||
#include <attributes.h>
|
#include <attributes.h>
|
||||||
#include <key.h>
|
#include <key.h>
|
||||||
|
#include <musig.h>
|
||||||
#include <pubkey.h>
|
#include <pubkey.h>
|
||||||
#include <script/keyorigin.h>
|
#include <script/keyorigin.h>
|
||||||
#include <script/script.h>
|
#include <script/script.h>
|
||||||
#include <sync.h>
|
#include <sync.h>
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
struct ShortestVectorFirstComparator
|
struct ShortestVectorFirstComparator
|
||||||
{
|
{
|
||||||
bool operator()(const std::vector<unsigned char>& a, const std::vector<unsigned char>& b) const
|
bool operator()(const std::vector<unsigned char>& a, const std::vector<unsigned char>& b) const
|
||||||
@@ -162,6 +166,9 @@ public:
|
|||||||
virtual bool GetTaprootSpendData(const XOnlyPubKey& output_key, TaprootSpendData& spenddata) const { return false; }
|
virtual bool GetTaprootSpendData(const XOnlyPubKey& output_key, TaprootSpendData& spenddata) const { return false; }
|
||||||
virtual bool GetTaprootBuilder(const XOnlyPubKey& output_key, TaprootBuilder& builder) const { return false; }
|
virtual bool GetTaprootBuilder(const XOnlyPubKey& output_key, TaprootBuilder& builder) const { return false; }
|
||||||
virtual std::vector<CPubKey> GetMuSig2ParticipantPubkeys(const CPubKey& pubkey) const { return {}; }
|
virtual std::vector<CPubKey> GetMuSig2ParticipantPubkeys(const CPubKey& pubkey) const { return {}; }
|
||||||
|
virtual void SetMuSig2SecNonce(const uint256& id, MuSig2SecNonce&& nonce) const {}
|
||||||
|
virtual std::optional<std::reference_wrapper<MuSig2SecNonce>> GetMuSig2SecNonce(const uint256& session_id) const { return std::nullopt; }
|
||||||
|
virtual void DeleteMuSig2Session(const uint256& session_id) const {}
|
||||||
|
|
||||||
bool GetKeyByXOnly(const XOnlyPubKey& pubkey, CKey& key) const
|
bool GetKeyByXOnly(const XOnlyPubKey& pubkey, CKey& key) const
|
||||||
{
|
{
|
||||||
@@ -206,6 +213,9 @@ public:
|
|||||||
bool GetTaprootSpendData(const XOnlyPubKey& output_key, TaprootSpendData& spenddata) const override;
|
bool GetTaprootSpendData(const XOnlyPubKey& output_key, TaprootSpendData& spenddata) const override;
|
||||||
bool GetTaprootBuilder(const XOnlyPubKey& output_key, TaprootBuilder& builder) const override;
|
bool GetTaprootBuilder(const XOnlyPubKey& output_key, TaprootBuilder& builder) const override;
|
||||||
std::vector<CPubKey> GetMuSig2ParticipantPubkeys(const CPubKey& pubkey) const override;
|
std::vector<CPubKey> GetMuSig2ParticipantPubkeys(const CPubKey& pubkey) const override;
|
||||||
|
void SetMuSig2SecNonce(const uint256& id, MuSig2SecNonce&& nonce) const override;
|
||||||
|
std::optional<std::reference_wrapper<MuSig2SecNonce>> GetMuSig2SecNonce(const uint256& session_id) const override;
|
||||||
|
void DeleteMuSig2Session(const uint256& session_id) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FlatSigningProvider final : public SigningProvider
|
struct FlatSigningProvider final : public SigningProvider
|
||||||
@@ -216,6 +226,7 @@ struct FlatSigningProvider final : public SigningProvider
|
|||||||
std::map<CKeyID, CKey> keys;
|
std::map<CKeyID, CKey> keys;
|
||||||
std::map<XOnlyPubKey, TaprootBuilder> tr_trees; /** Map from output key to Taproot tree (which can then make the TaprootSpendData */
|
std::map<XOnlyPubKey, TaprootBuilder> tr_trees; /** Map from output key to Taproot tree (which can then make the TaprootSpendData */
|
||||||
std::map<CPubKey, std::vector<CPubKey>> aggregate_pubkeys; /** MuSig2 aggregate pubkeys */
|
std::map<CPubKey, std::vector<CPubKey>> aggregate_pubkeys; /** MuSig2 aggregate pubkeys */
|
||||||
|
std::map<uint256, MuSig2SecNonce>* musig2_secnonces{nullptr};
|
||||||
|
|
||||||
bool GetCScript(const CScriptID& scriptid, CScript& script) const override;
|
bool GetCScript(const CScriptID& scriptid, CScript& script) const override;
|
||||||
bool GetPubKey(const CKeyID& keyid, CPubKey& pubkey) const override;
|
bool GetPubKey(const CKeyID& keyid, CPubKey& pubkey) const override;
|
||||||
@@ -225,6 +236,9 @@ struct FlatSigningProvider final : public SigningProvider
|
|||||||
bool GetTaprootSpendData(const XOnlyPubKey& output_key, TaprootSpendData& spenddata) const override;
|
bool GetTaprootSpendData(const XOnlyPubKey& output_key, TaprootSpendData& spenddata) const override;
|
||||||
bool GetTaprootBuilder(const XOnlyPubKey& output_key, TaprootBuilder& builder) const override;
|
bool GetTaprootBuilder(const XOnlyPubKey& output_key, TaprootBuilder& builder) const override;
|
||||||
std::vector<CPubKey> GetMuSig2ParticipantPubkeys(const CPubKey& pubkey) const override;
|
std::vector<CPubKey> GetMuSig2ParticipantPubkeys(const CPubKey& pubkey) const override;
|
||||||
|
void SetMuSig2SecNonce(const uint256& id, MuSig2SecNonce&& nonce) const override;
|
||||||
|
std::optional<std::reference_wrapper<MuSig2SecNonce>> GetMuSig2SecNonce(const uint256& session_id) const override;
|
||||||
|
void DeleteMuSig2Session(const uint256& session_id) const override;
|
||||||
|
|
||||||
FlatSigningProvider& Merge(FlatSigningProvider&& b) LIFETIMEBOUND;
|
FlatSigningProvider& Merge(FlatSigningProvider&& b) LIFETIMEBOUND;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user