// Copyright (c) 2014-2022 The Dash Core developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include #include #include // For MESSAGE_MAGIC #include #include #include bool CMessageSigner::GetKeysFromSecret(const std::string& strSecret, CKey& keyRet, CPubKey& pubkeyRet) { keyRet = DecodeSecret(strSecret); if (!keyRet.IsValid()) { return false; } pubkeyRet = keyRet.GetPubKey(); return true; } bool CMessageSigner::SignMessage(const std::string& strMessage, std::vector& vchSigRet, const CKey& key) { CHashWriter ss(SER_GETHASH, 0); ss << MESSAGE_MAGIC; ss << strMessage; return CHashSigner::SignHash(ss.GetHash(), key, vchSigRet); } bool CMessageSigner::VerifyMessage(const CPubKey& pubkey, const std::vector& vchSig, const std::string& strMessage, std::string& strErrorRet) { return VerifyMessage(pubkey.GetID(), vchSig, strMessage, strErrorRet); } bool CMessageSigner::VerifyMessage(const CKeyID& keyID, const std::vector& vchSig, const std::string& strMessage, std::string& strErrorRet) { CHashWriter ss(SER_GETHASH, 0); ss << MESSAGE_MAGIC; ss << strMessage; return CHashSigner::VerifyHash(ss.GetHash(), keyID, vchSig, strErrorRet); } bool CHashSigner::SignHash(const uint256& hash, const CKey& key, std::vector& vchSigRet) { return key.SignCompact(hash, vchSigRet); } bool CHashSigner::VerifyHash(const uint256& hash, const CPubKey& pubkey, const std::vector& vchSig, std::string& strErrorRet) { return VerifyHash(hash, pubkey.GetID(), vchSig, strErrorRet); } bool CHashSigner::VerifyHash(const uint256& hash, const CKeyID& keyID, const std::vector& vchSig, std::string& strErrorRet) { CPubKey pubkeyFromSig; if(!pubkeyFromSig.RecoverCompact(hash, vchSig)) { strErrorRet = "Error recovering public key."; return false; } if(pubkeyFromSig.GetID() != keyID) { strErrorRet = strprintf("Keys don't match: pubkey=%s, pubkeyFromSig=%s, hash=%s, vchSig=%s", keyID.ToString(), pubkeyFromSig.GetID().ToString(), hash.ToString(), EncodeBase64(vchSig)); return false; } return true; }