From 4a26870fcc886d36bca11e9137848a7e8a00e478 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 10 Oct 2018 13:40:55 +0200 Subject: [PATCH] src/trezor/crypto: refactor {blake256,sha256}_ripemd160_digest to trezor.crypto.scripts --- src/apps/common/coininfo.py | 4 ++++ src/apps/wallet/sign_tx/addresses.py | 22 ++++++---------------- src/apps/wallet/sign_tx/scripts.py | 13 ------------- src/trezor/crypto/scripts.py | 13 +++++++++++++ 4 files changed, 23 insertions(+), 29 deletions(-) create mode 100644 src/trezor/crypto/scripts.py diff --git a/src/apps/common/coininfo.py b/src/apps/common/coininfo.py index a60819337..3d7d5415c 100644 --- a/src/apps/common/coininfo.py +++ b/src/apps/common/coininfo.py @@ -1,6 +1,7 @@ # generated from coininfo.py.mako # do not edit manually! from trezor.crypto.base58 import blake256_32, groestl512d_32, sha256d_32 +from trezor.crypto.scripts import blake256_ripemd160_digest, sha256_ripemd160_digest class CoinInfo: @@ -48,12 +49,15 @@ class CoinInfo: if curve_name == "secp256k1-groestl": self.b58_hash = groestl512d_32 self.sign_hash_double = False + self.script_hash = sha256_ripemd160_digest elif curve_name == "secp256k1-decred": self.b58_hash = blake256_32 self.sign_hash_double = False + self.script_hash = blake256_ripemd160_digest else: self.b58_hash = sha256d_32 self.sign_hash_double = True + self.script_hash = sha256_ripemd160_digest # fmt: off diff --git a/src/apps/wallet/sign_tx/addresses.py b/src/apps/wallet/sign_tx/addresses.py index bb6eb6b69..677a5b21e 100644 --- a/src/apps/wallet/sign_tx/addresses.py +++ b/src/apps/wallet/sign_tx/addresses.py @@ -1,7 +1,7 @@ from micropython import const from trezor.crypto import base58, bech32, cashaddr -from trezor.crypto.hashlib import ripemd160, sha256 +from trezor.crypto.hashlib import sha256 from trezor.messages import FailureType, InputScriptType from trezor.utils import ensure @@ -9,10 +9,8 @@ from apps.common import address_type from apps.common.coininfo import CoinInfo from apps.wallet.sign_tx.multisig import multisig_get_pubkeys, multisig_pubkey_index from apps.wallet.sign_tx.scripts import ( - blake256_ripemd160_digest, output_script_multisig, output_script_native_p2wpkh_or_p2wsh, - sha256_ripemd160_digest, ) # supported witness version for bech32 addresses @@ -93,10 +91,7 @@ def address_multisig_p2sh(pubkeys: bytes, m: int, coin: CoinInfo): FailureType.ProcessError, "Multisig not enabled on this coin" ) redeem_script = output_script_multisig(pubkeys, m) - if coin.decred: - redeem_script_hash = blake256_ripemd160_digest(redeem_script) - else: - redeem_script_hash = sha256_ripemd160_digest(redeem_script) + redeem_script_hash = coin.script_hash(redeem_script) return address_p2sh(redeem_script_hash, coin) @@ -121,7 +116,7 @@ def address_multisig_p2wsh(pubkeys: bytes, m: int, hrp: str): def address_pkh(pubkey: bytes, coin: CoinInfo) -> str: - s = address_type.tobytes(coin.address_type) + sha256_ripemd160_digest(pubkey) + s = address_type.tobytes(coin.address_type) + coin.script_hash(pubkey) return base58.encode_check(bytes(s), coin.b58_hash) @@ -133,13 +128,13 @@ def address_p2sh(redeem_script_hash: bytes, coin: CoinInfo) -> str: def address_p2wpkh_in_p2sh(pubkey: bytes, coin: CoinInfo) -> str: pubkey_hash = ecdsa_hash_pubkey(pubkey, coin) redeem_script = output_script_native_p2wpkh_or_p2wsh(pubkey_hash) - redeem_script_hash = sha256_ripemd160_digest(redeem_script) + redeem_script_hash = coin.script_hash(redeem_script) return address_p2sh(redeem_script_hash, coin) def address_p2wsh_in_p2sh(witness_script_hash: bytes, coin: CoinInfo) -> str: redeem_script = output_script_native_p2wpkh_or_p2wsh(witness_script_hash) - redeem_script_hash = sha256_ripemd160_digest(redeem_script) + redeem_script_hash = coin.script_hash(redeem_script) return address_p2sh(redeem_script_hash, coin) @@ -185,12 +180,7 @@ def ecdsa_hash_pubkey(pubkey: bytes, coin: CoinInfo) -> bytes: else: ensure(len(pubkey) == 33) # compresssed format - if coin.decred: - return blake256_ripemd160_digest(pubkey) - - h = sha256(pubkey).digest() - h = ripemd160(h).digest() - return h + return coin.script_hash(pubkey) def address_short(coin: CoinInfo, address: str) -> str: diff --git a/src/apps/wallet/sign_tx/scripts.py b/src/apps/wallet/sign_tx/scripts.py index 0384e77ec..b5870d612 100644 --- a/src/apps/wallet/sign_tx/scripts.py +++ b/src/apps/wallet/sign_tx/scripts.py @@ -1,4 +1,3 @@ -from trezor.crypto.hashlib import blake256, ripemd160, sha256 from trezor.messages.MultisigRedeemScriptType import MultisigRedeemScriptType from apps.common.coininfo import CoinInfo @@ -265,15 +264,3 @@ def append_pubkey(w: bytearray, pubkey: bytes) -> bytearray: write_op_push(w, len(pubkey)) write_bytes(w, pubkey) return w - - -def sha256_ripemd160_digest(b: bytes) -> bytes: - h = sha256(b).digest() - h = ripemd160(h).digest() - return h - - -def blake256_ripemd160_digest(b: bytes) -> bytes: - h = blake256(b).digest() - h = ripemd160(h).digest() - return h diff --git a/src/trezor/crypto/scripts.py b/src/trezor/crypto/scripts.py new file mode 100644 index 000000000..4944bdab1 --- /dev/null +++ b/src/trezor/crypto/scripts.py @@ -0,0 +1,13 @@ +from trezor.crypto.hashlib import blake256, ripemd160, sha256 + + +def sha256_ripemd160_digest(b: bytes) -> bytes: + h = sha256(b).digest() + h = ripemd160(h).digest() + return h + + +def blake256_ripemd160_digest(b: bytes) -> bytes: + h = blake256(b).digest() + h = ripemd160(h).digest() + return h