Skip to content

Commit 6879be6

Browse files
committed
refactor: Extract RIPEMD160
To directly return a CRIPEMD160 hash from data. Incidentally, decoding this acronym: * RIPEMD -> RIPE Message Digest * RIPE -> RACE Integrity Primitives Evaluation * RACE -> Research and Development in Advanced Communications Technologies in Europe
1 parent 7386da7 commit 6879be6

File tree

8 files changed

+27
-20
lines changed

8 files changed

+27
-20
lines changed

src/bench/crypto_hash.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
/* Number of bytes to hash per iteration */
1919
static const uint64_t BUFFER_SIZE = 1000*1000;
2020

21-
static void RIPEMD160(benchmark::Bench& bench)
21+
static void BenchRIPEMD160(benchmark::Bench& bench)
2222
{
2323
uint8_t hash[CRIPEMD160::OUTPUT_SIZE];
2424
std::vector<uint8_t> in(BUFFER_SIZE,0);
@@ -150,7 +150,7 @@ static void MuHashPrecompute(benchmark::Bench& bench)
150150
});
151151
}
152152

153-
BENCHMARK(RIPEMD160, benchmark::PriorityLevel::HIGH);
153+
BENCHMARK(BenchRIPEMD160, benchmark::PriorityLevel::HIGH);
154154
BENCHMARK(SHA1, benchmark::PriorityLevel::HIGH);
155155
BENCHMARK(SHA256, benchmark::PriorityLevel::HIGH);
156156
BENCHMARK(SHA512, benchmark::PriorityLevel::HIGH);

src/hash.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <crypto/sha256.h>
1212
#include <prevector.h>
1313
#include <serialize.h>
14+
#include <span.h>
1415
#include <uint256.h>
1516
#include <version.h>
1617

@@ -223,4 +224,12 @@ void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char he
223224
*/
224225
HashWriter TaggedHash(const std::string& tag);
225226

227+
/** Compute the 160-bit RIPEMD-160 hash of an array. */
228+
inline uint160 RIPEMD160(Span<const unsigned char> data)
229+
{
230+
uint160 result;
231+
CRIPEMD160().Write(data.data(), data.size()).Finalize(result.begin());
232+
return result;
233+
}
234+
226235
#endif // BITCOIN_HASH_H

src/script/descriptor.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44

55
#include <script/descriptor.h>
66

7+
#include <hash.h>
78
#include <key_io.h>
89
#include <pubkey.h>
910
#include <script/miniscript.h>
1011
#include <script/script.h>
1112
#include <script/standard.h>
13+
#include <uint256.h>
1214

1315
#include <span.h>
1416
#include <util/bip32.h>
@@ -1618,8 +1620,7 @@ std::unique_ptr<DescriptorImpl> InferScript(const CScript& script, ParseScriptCo
16181620
}
16191621
}
16201622
if (txntype == TxoutType::WITNESS_V0_SCRIPTHASH && (ctx == ParseScriptContext::TOP || ctx == ParseScriptContext::P2SH)) {
1621-
CScriptID scriptid;
1622-
CRIPEMD160().Write(data[0].data(), data[0].size()).Finalize(scriptid.begin());
1623+
CScriptID scriptid{RIPEMD160(data[0])};
16231624
CScript subscript;
16241625
if (provider.GetCScript(scriptid, subscript)) {
16251626
auto sub = InferScript(subscript, ParseScriptContext::P2WSH, provider);

src/script/sign.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,6 @@ static bool SignStep(const SigningProvider& provider, const BaseSignatureCreator
285285
std::vector<valtype>& ret, TxoutType& whichTypeRet, SigVersion sigversion, SignatureData& sigdata)
286286
{
287287
CScript scriptRet;
288-
uint160 h160;
289288
ret.clear();
290289
std::vector<unsigned char> sig;
291290

@@ -314,16 +313,16 @@ static bool SignStep(const SigningProvider& provider, const BaseSignatureCreator
314313
ret.push_back(ToByteVector(pubkey));
315314
return true;
316315
}
317-
case TxoutType::SCRIPTHASH:
318-
h160 = uint160(vSolutions[0]);
316+
case TxoutType::SCRIPTHASH: {
317+
uint160 h160{vSolutions[0]};
319318
if (GetCScript(provider, sigdata, CScriptID{h160}, scriptRet)) {
320319
ret.push_back(std::vector<unsigned char>(scriptRet.begin(), scriptRet.end()));
321320
return true;
322321
}
323322
// Could not find redeemScript, add to missing
324323
sigdata.missing_redeem_script = h160;
325324
return false;
326-
325+
}
327326
case TxoutType::MULTISIG: {
328327
size_t required = vSolutions.front()[0];
329328
ret.push_back(valtype()); // workaround CHECKMULTISIG bug
@@ -349,8 +348,7 @@ static bool SignStep(const SigningProvider& provider, const BaseSignatureCreator
349348
return true;
350349

351350
case TxoutType::WITNESS_V0_SCRIPTHASH:
352-
CRIPEMD160().Write(vSolutions[0].data(), vSolutions[0].size()).Finalize(h160.begin());
353-
if (GetCScript(provider, sigdata, CScriptID{h160}, scriptRet)) {
351+
if (GetCScript(provider, sigdata, CScriptID{RIPEMD160(vSolutions[0])}, scriptRet)) {
354352
ret.push_back(std::vector<unsigned char>(scriptRet.begin(), scriptRet.end()));
355353
return true;
356354
}

src/script/sign.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <script/interpreter.h>
1414
#include <script/keyorigin.h>
1515
#include <script/standard.h>
16+
#include <uint256.h>
1617

1718
class CKey;
1819
class CKeyID;

src/wallet/rpc/backup.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <clientversion.h>
77
#include <core_io.h>
88
#include <fs.h>
9+
#include <hash.h>
910
#include <interfaces/chain.h>
1011
#include <key_io.h>
1112
#include <merkleblock.h>
@@ -14,6 +15,7 @@
1415
#include <script/script.h>
1516
#include <script/standard.h>
1617
#include <sync.h>
18+
#include <uint256.h>
1719
#include <util/bip32.h>
1820
#include <util/system.h>
1921
#include <util/time.h>
@@ -885,9 +887,7 @@ static std::string RecurseImportData(const CScript& script, ImportData& import_d
885887
}
886888
case TxoutType::WITNESS_V0_SCRIPTHASH: {
887889
if (script_ctx == ScriptContext::WITNESS_V0) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Trying to nest P2WSH inside another P2WSH");
888-
uint256 fullid(solverdata[0]);
889-
CScriptID id;
890-
CRIPEMD160().Write(fullid.begin(), fullid.size()).Finalize(id.begin());
890+
CScriptID id{RIPEMD160(solverdata[0])};
891891
auto subscript = std::move(import_data.witnessscript); // Remove redeemscript from import_data to check for superfluous script later.
892892
if (!subscript) return "missing witnessscript";
893893
if (CScriptID(*subscript) != id) return "witnessScript does not match the scriptPubKey or redeemScript";

src/wallet/rpc/coins.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
44

55
#include <core_io.h>
6+
#include <hash.h>
67
#include <key_io.h>
78
#include <rpc/util.h>
89
#include <util/moneystr.h>
@@ -679,8 +680,7 @@ RPCHelpMan listunspent()
679680
CHECK_NONFATAL(extracted);
680681
// Also return the witness script
681682
const WitnessV0ScriptHash& whash = std::get<WitnessV0ScriptHash>(witness_destination);
682-
CScriptID id;
683-
CRIPEMD160().Write(whash.begin(), whash.size()).Finalize(id.begin());
683+
CScriptID id{RIPEMD160(whash)};
684684
CScript witnessScript;
685685
if (provider->GetCScript(id, witnessScript)) {
686686
entry.pushKV("witnessScript", HexStr(witnessScript));
@@ -689,8 +689,7 @@ RPCHelpMan listunspent()
689689
}
690690
} else if (scriptPubKey.IsPayToWitnessScriptHash()) {
691691
const WitnessV0ScriptHash& whash = std::get<WitnessV0ScriptHash>(address);
692-
CScriptID id;
693-
CRIPEMD160().Write(whash.begin(), whash.size()).Finalize(id.begin());
692+
CScriptID id{RIPEMD160(whash)};
694693
CScript witnessScript;
695694
if (provider->GetCScript(id, witnessScript)) {
696695
entry.pushKV("witnessScript", HexStr(witnessScript));

src/wallet/scriptpubkeyman.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Distributed under the MIT software license, see the accompanying
33
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
44

5+
#include <hash.h>
56
#include <key_io.h>
67
#include <logging.h>
78
#include <outputtype.h>
@@ -166,9 +167,7 @@ IsMineResult IsMineInner(const LegacyScriptPubKeyMan& keystore, const CScript& s
166167
if (sigversion == IsMineSigVersion::TOP && !keystore.HaveCScript(CScriptID(CScript() << OP_0 << vSolutions[0]))) {
167168
break;
168169
}
169-
uint160 hash;
170-
CRIPEMD160().Write(vSolutions[0].data(), vSolutions[0].size()).Finalize(hash.begin());
171-
CScriptID scriptID = CScriptID(hash);
170+
CScriptID scriptID{RIPEMD160(vSolutions[0])};
172171
CScript subscript;
173172
if (keystore.GetCScript(scriptID, subscript)) {
174173
ret = std::max(ret, recurse_scripthash ? IsMineInner(keystore, subscript, IsMineSigVersion::WITNESS_V0) : IsMineResult::SPENDABLE);

0 commit comments

Comments
 (0)