pubkey: introduce a GetEvenCorrespondingCPubKey helper

We'll need to get a compressed key out of an x-only one in other places.
Avoid duplicating the code.
This commit is contained in:
Antoine Poinsot 2023-02-14 10:31:32 +01:00
parent ce8845f5dd
commit fcb6f13f44
No known key found for this signature in database
GPG Key ID: E13FC145CD3F4304
3 changed files with 10 additions and 3 deletions

View File

@ -204,6 +204,13 @@ std::vector<CKeyID> XOnlyPubKey::GetKeyIDs() const
return out;
}
CPubKey XOnlyPubKey::GetEvenCorrespondingCPubKey() const
{
unsigned char full_key[CPubKey::COMPRESSED_SIZE] = {0x02};
std::copy(begin(), end(), full_key + 1);
return CPubKey{full_key};
}
bool XOnlyPubKey::IsFullyValid() const
{
secp256k1_xonly_pubkey pubkey;

View File

@ -282,6 +282,8 @@ public:
*/
std::vector<CKeyID> GetKeyIDs() const;
CPubKey GetEvenCorrespondingCPubKey() const;
const unsigned char& operator[](int pos) const { return *(m_keydata.begin() + pos); }
const unsigned char* data() const { return m_keydata.begin(); }
static constexpr size_t size() { return decltype(m_keydata)::size(); }

View File

@ -1401,9 +1401,7 @@ std::unique_ptr<PubkeyProvider> InferPubkey(const CPubKey& pubkey, ParseScriptCo
std::unique_ptr<PubkeyProvider> InferXOnlyPubkey(const XOnlyPubKey& xkey, ParseScriptContext ctx, const SigningProvider& provider)
{
unsigned char full_key[CPubKey::COMPRESSED_SIZE] = {0x02};
std::copy(xkey.begin(), xkey.end(), full_key + 1);
CPubKey pubkey(full_key);
CPubKey pubkey{xkey.GetEvenCorrespondingCPubKey()};
std::unique_ptr<PubkeyProvider> key_provider = std::make_unique<ConstPubkeyProvider>(0, pubkey, true);
KeyOriginInfo info;
if (provider.GetKeyOriginByXOnly(xkey, info)) {