bool COeruShield::IsMasterKey(CBitcoinAddress addr) const { std::string strAddr = addr.ToString(); std::vector<unsigned char> hash; hash.resize(CSHA256::OUTPUT_SIZE); CSHA256().Write((unsigned char*) &strAddr[0], strAddr.size()) .Finalize(&hash[0]); return IsMasterKey(hash); }
bool CNetAddr::SetInternal(const std::string &name) { if (name.empty()) { return false; } unsigned char hash[32] = {}; CSHA256().Write((const unsigned char*)name.data(), name.size()).Finalize(hash); memcpy(ip, g_internal_prefix, sizeof(g_internal_prefix)); memcpy(ip + sizeof(g_internal_prefix), hash, sizeof(ip) - sizeof(g_internal_prefix)); return true; }
CScript GetScriptForWitness(const CScript& redeemscript) { CScript ret; txnouttype typ; std::vector<std::vector<unsigned char> > vSolutions; if (Solver(redeemscript, typ, vSolutions)) { if (typ == TX_PUBKEY) { return GetScriptForDestination(WitnessV0KeyHash(Hash160(vSolutions[0].begin(), vSolutions[0].end()))); } else if (typ == TX_PUBKEYHASH) { return GetScriptForDestination(WitnessV0KeyHash(vSolutions[0])); } } uint256 hash; CSHA256().Write(&redeemscript[0], redeemscript.size()).Finalize(hash.begin()); return GetScriptForDestination(WitnessV0ScriptHash(hash)); }
CHMAC_SHA256::CHMAC_SHA256(const uint8_t *key, size_t keylen) { uint8_t rkey[64]; if (keylen <= 64) { memcpy(rkey, key, keylen); memset(rkey + keylen, 0, 64 - keylen); } else { CSHA256().Write(key, keylen).Finalize(rkey); memset(rkey + 32, 0, 32); } for (int n = 0; n < 64; n++) rkey[n] ^= 0x5c; outer.Write(rkey, 64); for (int n = 0; n < 64; n++) rkey[n] ^= 0x5c ^ 0x36; inner.Write(rkey, 64); }
CScript GetScriptForWitness(const CScript& redeemscript) { CScript ret; txnouttype typ; std::vector<std::vector<unsigned char> > vSolutions; if (Solver(redeemscript, typ, vSolutions)) { if (typ == TX_PUBKEY) { unsigned char h160[20]; CHash160().Write(&vSolutions[0][0], vSolutions[0].size()).Finalize(h160); ret << OP_0 << std::vector<unsigned char>(&h160[0], &h160[20]); return ret; } else if (typ == TX_PUBKEYHASH) { ret << OP_0 << vSolutions[0]; return ret; } } uint256 hash; CSHA256().Write(&redeemscript[0], redeemscript.size()).Finalize(hash.begin()); ret << OP_0 << ToByteVector(hash); return ret; }
void TestSHA256(const std::string &in, const std::string &hexout) { TestVector(CSHA256(), in, ParseHex(hexout));}
bool CMnemonic::Check(SecureString mnemonic) { if (mnemonic.empty()) { return false; } uint32_t nWordCount{}; for (size_t i = 0; i < mnemonic.size(); ++i) { if (mnemonic[i] == ' ') { nWordCount++; } } nWordCount++; // check number of words if (nWordCount != 12 && nWordCount != 18 && nWordCount != 24) { return false; } SecureString ssCurrentWord; SecureVector bits(32 + 1); uint32_t nWordIndex, ki, nBitsCount{}; for (size_t i = 0; i < mnemonic.size(); ++i) { ssCurrentWord = ""; while (i + ssCurrentWord.size() < mnemonic.size() && mnemonic[i + ssCurrentWord.size()] != ' ') { if (ssCurrentWord.size() >= 9) { return false; } ssCurrentWord += mnemonic[i + ssCurrentWord.size()]; } i += ssCurrentWord.size(); nWordIndex = 0; for (;;) { if (!wordlist[nWordIndex]) { // word not found return false; } if (ssCurrentWord == wordlist[nWordIndex]) { // word found on index nWordIndex for (ki = 0; ki < 11; ki++) { if (nWordIndex & (1 << (10 - ki))) { bits[nBitsCount / 8] |= 1 << (7 - (nBitsCount % 8)); } nBitsCount++; } break; } nWordIndex++; } } if (nBitsCount != nWordCount * 11) { return false; } bits[32] = bits[nWordCount * 4 / 3]; CSHA256().Write(&bits[0], nWordCount * 4 / 3).Finalize(&bits[0]); bool fResult = 0; if (nWordCount == 12) { fResult = (bits[0] & 0xF0) == (bits[32] & 0xF0); // compare first 4 bits } else if (nWordCount == 18) { fResult = (bits[0] & 0xFC) == (bits[32] & 0xFC); // compare first 6 bits } else if (nWordCount == 24) { fResult = bits[0] == bits[32]; // compare 8 bits } return fResult; }
WitnessV0ScriptHash::WitnessV0ScriptHash(const CScript& in) { CSHA256().Write(in.data(), in.size()).Finalize(begin()); }
static void AssembleBlock(benchmark::State& state) { const std::vector<unsigned char> op_true{OP_TRUE}; CScriptWitness witness; witness.stack.push_back(op_true); uint256 witness_program; CSHA256().Write(&op_true[0], op_true.size()).Finalize(witness_program.begin()); const CScript SCRIPT_PUB{CScript(OP_0) << std::vector<unsigned char>{witness_program.begin(), witness_program.end()}}; // Switch to regtest so we can mine faster // Also segwit is active, so we can include witness transactions SelectParams(CBaseChainParams::REGTEST); InitScriptExecutionCache(); boost::thread_group thread_group; CScheduler scheduler; { ::pblocktree.reset(new CBlockTreeDB(1 << 20, true)); ::pcoinsdbview.reset(new CCoinsViewDB(1 << 23, true)); ::pcoinsTip.reset(new CCoinsViewCache(pcoinsdbview.get())); const CChainParams& chainparams = Params(); thread_group.create_thread(boost::bind(&CScheduler::serviceQueue, &scheduler)); GetMainSignals().RegisterBackgroundSignalScheduler(scheduler); LoadGenesisBlock(chainparams); CValidationState state; ActivateBestChain(state, chainparams); assert(::chainActive.Tip() != nullptr); const bool witness_enabled{IsWitnessEnabled(::chainActive.Tip(), chainparams.GetConsensus())}; assert(witness_enabled); } // Collect some loose transactions that spend the coinbases of our mined blocks constexpr size_t NUM_BLOCKS{200}; std::array<CTransactionRef, NUM_BLOCKS - COINBASE_MATURITY + 1> txs; for (size_t b{0}; b < NUM_BLOCKS; ++b) { CMutableTransaction tx; tx.vin.push_back(MineBlock(SCRIPT_PUB)); tx.vin.back().scriptWitness = witness; tx.vout.emplace_back(1337, SCRIPT_PUB); if (NUM_BLOCKS - b >= COINBASE_MATURITY) txs.at(b) = MakeTransactionRef(tx); } { LOCK(::cs_main); // Required for ::AcceptToMemoryPool. for (const auto& txr : txs) { CValidationState state; bool ret{::AcceptToMemoryPool(::mempool, state, txr, nullptr /* pfMissingInputs */, nullptr /* plTxnReplaced */, false /* bypass_limits */, /* nAbsurdFee */ 0)}; assert(ret); } } while (state.KeepRunning()) { PrepareBlock(SCRIPT_PUB); } thread_group.interrupt_all(); thread_group.join_all(); GetMainSignals().FlushBackgroundCallbacks(); GetMainSignals().UnregisterBackgroundSignalScheduler(); }