From 0a5ea32ce605984094c5552877cb99bc81654f2c Mon Sep 17 00:00:00 2001 From: Ben Woosley Date: Tue, 14 Jan 2020 22:37:16 -0800 Subject: Prefer explicit uint160 conversion --- src/script/standard.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/script/standard.cpp') diff --git a/src/script/standard.cpp b/src/script/standard.cpp index d199a84ce..b6ee6117d 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -307,7 +307,7 @@ CScript GetScriptForWitness(const CScript& redeemscript) if (typ == TX_PUBKEY) { return GetScriptForDestination(WitnessV0KeyHash(Hash160(vSolutions[0].begin(), vSolutions[0].end()))); } else if (typ == TX_PUBKEYHASH) { - return GetScriptForDestination(WitnessV0KeyHash(vSolutions[0])); + return GetScriptForDestination(WitnessV0KeyHash(uint160{vSolutions[0]})); } return GetScriptForDestination(WitnessV0ScriptHash(redeemscript)); } -- cgit v1.2.3 From a9e451f144480d7b170e49087df162989d31cd20 Mon Sep 17 00:00:00 2001 From: Ben Woosley Date: Tue, 14 Jan 2020 23:46:14 -0800 Subject: Convert CPubKey to WitnessV0KeyHash directly The round-tripping through PKHash has no effect, and is potentially misleading as such. --- src/script/standard.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/script/standard.cpp') diff --git a/src/script/standard.cpp b/src/script/standard.cpp index b6ee6117d..3e0a9e230 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -21,6 +21,7 @@ CScriptID::CScriptID(const CScript& in) : uint160(Hash160(in.begin(), in.end())) ScriptHash::ScriptHash(const CScript& in) : uint160(Hash160(in.begin(), in.end())) {} PKHash::PKHash(const CPubKey& pubkey) : uint160(pubkey.GetID()) {} +WitnessV0KeyHash::WitnessV0KeyHash(const CPubKey& pubkey) : uint160(pubkey.GetID()) {} WitnessV0ScriptHash::WitnessV0ScriptHash(const CScript& in) { -- cgit v1.2.3 From 2c54217f913967703b404747133be67cf2f4feac Mon Sep 17 00:00:00 2001 From: Ben Woosley Date: Wed, 15 Jan 2020 13:40:14 -0800 Subject: Use explicit conversion from PKHash -> CKeyID These types are equivalent, in data etc, so they need only their data cast across. Note a function is used rather than a casting operator as CKeyID is defined at a lower level than script/standard --- src/script/standard.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/script/standard.cpp') diff --git a/src/script/standard.cpp b/src/script/standard.cpp index 3e0a9e230..4b408d82e 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -23,6 +23,11 @@ ScriptHash::ScriptHash(const CScript& in) : uint160(Hash160(in.begin(), in.end() PKHash::PKHash(const CPubKey& pubkey) : uint160(pubkey.GetID()) {} WitnessV0KeyHash::WitnessV0KeyHash(const CPubKey& pubkey) : uint160(pubkey.GetID()) {} +CKeyID ToKeyID(const PKHash& key_hash) +{ + return CKeyID{static_cast(key_hash)}; +} + WitnessV0ScriptHash::WitnessV0ScriptHash(const CScript& in) { CSHA256().Write(in.data(), in.size()).Finalize(begin()); -- cgit v1.2.3 From f32c1e07fd6c174ff3f6406a619550d2f6c19360 Mon Sep 17 00:00:00 2001 From: Ben Woosley Date: Wed, 15 Jan 2020 13:41:25 -0800 Subject: Use explicit conversion from WitnessV0KeyHash -> CKeyID These types are equivalent, in data etc, so they need only their data cast across. --- src/script/standard.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/script/standard.cpp') diff --git a/src/script/standard.cpp b/src/script/standard.cpp index 4b408d82e..a47ccef84 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -28,6 +28,11 @@ CKeyID ToKeyID(const PKHash& key_hash) return CKeyID{static_cast(key_hash)}; } +CKeyID ToKeyID(const WitnessV0KeyHash& key_hash) +{ + return CKeyID{static_cast(key_hash)}; +} + WitnessV0ScriptHash::WitnessV0ScriptHash(const CScript& in) { CSHA256().Write(in.data(), in.size()).Finalize(begin()); -- cgit v1.2.3 From 966a22d859db37b1775e2180e5be032fc4fdf483 Mon Sep 17 00:00:00 2001 From: Ben Woosley Date: Wed, 15 Jan 2020 21:48:59 +0000 Subject: Explicitly support conversion between equivalent hash types ScriptHash <-> CScriptID CKeyID -> PKHash PKHash -> WitnessV0KeyHash --- src/script/standard.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/script/standard.cpp') diff --git a/src/script/standard.cpp b/src/script/standard.cpp index a47ccef84..f8bfc3b69 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -17,11 +17,16 @@ bool fAcceptDatacarrier = DEFAULT_ACCEPT_DATACARRIER; unsigned nMaxDatacarrierBytes = MAX_OP_RETURN_RELAY; CScriptID::CScriptID(const CScript& in) : uint160(Hash160(in.begin(), in.end())) {} +CScriptID::CScriptID(const ScriptHash& in) : uint160(static_cast(in)) {} ScriptHash::ScriptHash(const CScript& in) : uint160(Hash160(in.begin(), in.end())) {} +ScriptHash::ScriptHash(const CScriptID& in) : uint160(static_cast(in)) {} PKHash::PKHash(const CPubKey& pubkey) : uint160(pubkey.GetID()) {} +PKHash::PKHash(const CKeyID& pubkey_id) : uint160(pubkey_id) {} + WitnessV0KeyHash::WitnessV0KeyHash(const CPubKey& pubkey) : uint160(pubkey.GetID()) {} +WitnessV0KeyHash::WitnessV0KeyHash(const PKHash& pubkey_hash) : uint160(static_cast(pubkey_hash)) {} CKeyID ToKeyID(const PKHash& key_hash) { -- cgit v1.2.3 From 4d7369125a82214ea42b808a32b71b315a5c3c72 Mon Sep 17 00:00:00 2001 From: Ben Woosley Date: Wed, 15 Jan 2020 14:03:57 -0800 Subject: Disallow automatic conversion between hash types A templated BaseHash does not allow for automatic conversion, thus conversions much be explicitly allowed / whitelisted, which will reduce the risk of unintended conversions. --- src/script/standard.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src/script/standard.cpp') diff --git a/src/script/standard.cpp b/src/script/standard.cpp index f8bfc3b69..2adf6ce56 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -16,17 +16,17 @@ typedef std::vector valtype; bool fAcceptDatacarrier = DEFAULT_ACCEPT_DATACARRIER; unsigned nMaxDatacarrierBytes = MAX_OP_RETURN_RELAY; -CScriptID::CScriptID(const CScript& in) : uint160(Hash160(in.begin(), in.end())) {} -CScriptID::CScriptID(const ScriptHash& in) : uint160(static_cast(in)) {} +CScriptID::CScriptID(const CScript& in) : BaseHash(Hash160(in.begin(), in.end())) {} +CScriptID::CScriptID(const ScriptHash& in) : BaseHash(static_cast(in)) {} -ScriptHash::ScriptHash(const CScript& in) : uint160(Hash160(in.begin(), in.end())) {} -ScriptHash::ScriptHash(const CScriptID& in) : uint160(static_cast(in)) {} +ScriptHash::ScriptHash(const CScript& in) : BaseHash(Hash160(in.begin(), in.end())) {} +ScriptHash::ScriptHash(const CScriptID& in) : BaseHash(static_cast(in)) {} -PKHash::PKHash(const CPubKey& pubkey) : uint160(pubkey.GetID()) {} -PKHash::PKHash(const CKeyID& pubkey_id) : uint160(pubkey_id) {} +PKHash::PKHash(const CPubKey& pubkey) : BaseHash(pubkey.GetID()) {} +PKHash::PKHash(const CKeyID& pubkey_id) : BaseHash(pubkey_id) {} -WitnessV0KeyHash::WitnessV0KeyHash(const CPubKey& pubkey) : uint160(pubkey.GetID()) {} -WitnessV0KeyHash::WitnessV0KeyHash(const PKHash& pubkey_hash) : uint160(static_cast(pubkey_hash)) {} +WitnessV0KeyHash::WitnessV0KeyHash(const CPubKey& pubkey) : BaseHash(pubkey.GetID()) {} +WitnessV0KeyHash::WitnessV0KeyHash(const PKHash& pubkey_hash) : BaseHash(static_cast(pubkey_hash)) {} CKeyID ToKeyID(const PKHash& key_hash) { -- cgit v1.2.3