bool CWalletDB::WriteKey(const CPubKey& vchPubKey, const CPrivKey& vchPrivKey, const CKeyMetadata& keyMeta) { if (!WriteIC(std::make_pair(std::string("keymeta"), vchPubKey), keyMeta, false)) { return false; } // hash pubkey/privkey to accelerate wallet load std::vector<unsigned char> vchKey; vchKey.reserve(vchPubKey.size() + vchPrivKey.size()); vchKey.insert(vchKey.end(), vchPubKey.begin(), vchPubKey.end()); vchKey.insert(vchKey.end(), vchPrivKey.begin(), vchPrivKey.end()); return WriteIC(std::make_pair(std::string("key"), vchPubKey), std::make_pair(vchPrivKey, Hash(vchKey.begin(), vchKey.end())), false); }
bool GenerateBeaconKeys(const std::string &cpid, std::string &sOutPubKey, std::string &sOutPrivKey) { // First Check the Index - if it already exists, use it sOutPrivKey = GetArgument("privatekey" + cpid + GetNetSuffix(), ""); sOutPubKey = GetArgument("publickey" + cpid + GetNetSuffix(), ""); // If current keypair is not empty, but is invalid, allow the new keys to be stored, otherwise return 1: (10-25-2016) if (!sOutPrivKey.empty() && !sOutPubKey.empty()) { uint256 hashBlock = GetRandHash(); std::string sSignature; std::string sError; bool fResult; fResult = SignBlockWithCPID(cpid, hashBlock.GetHex(), sSignature, sError, true); if (!fResult) LogPrintf("GenerateBeaconKeys::Failed to sign block with cpid with existing keys; generating new key pair -> %s", sError); else { fResult = VerifyCPIDSignature(cpid, hashBlock.GetHex(), sSignature); if (fResult) { LogPrintf("GenerateBeaconKeys::Current keypair is valid."); return true; } else LogPrintf("GenerateBeaconKeys::Signing block with CPID was successful; However Verifying CPID Sign was not; Key pair is not valid, generating new key pair"); } } // Generate the Keypair CKey key; key.MakeNewKey(false); CPrivKey vchPrivKey = key.GetPrivKey(); sOutPrivKey = HexStr<CPrivKey::iterator>(vchPrivKey.begin(), vchPrivKey.end()); sOutPubKey = HexStr(key.GetPubKey().Raw()); return true; }