mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-18 12:28:09 +00:00
refactor(core/bitcoin): Change CoinInfo.script_hash to be a HashContext.
This commit is contained in:
parent
27e6f35f78
commit
2c003052f5
@ -1,7 +1,7 @@
|
|||||||
from micropython import const
|
from micropython import const
|
||||||
|
|
||||||
from trezor.crypto import bech32
|
from trezor.crypto import bech32
|
||||||
from trezor.crypto.scripts import sha256_ripemd160_digest
|
from trezor.crypto.scripts import sha256_ripemd160
|
||||||
from trezor.messages import (
|
from trezor.messages import (
|
||||||
BinanceCancelMsg,
|
BinanceCancelMsg,
|
||||||
BinanceInputOutput,
|
BinanceInputOutput,
|
||||||
@ -86,7 +86,7 @@ def address_from_public_key(pubkey: bytes, hrp: str) -> str:
|
|||||||
HRP - bnb for productions, tbnb for tests
|
HRP - bnb for productions, tbnb for tests
|
||||||
"""
|
"""
|
||||||
|
|
||||||
h = sha256_ripemd160_digest(pubkey)
|
h = sha256_ripemd160(pubkey).digest()
|
||||||
|
|
||||||
convertedbits = bech32.convertbits(h, 8, 5, False)
|
convertedbits = bech32.convertbits(h, 8, 5, False)
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ def address_multisig_p2wsh(pubkeys: list[bytes], m: int, hrp: str) -> str:
|
|||||||
|
|
||||||
|
|
||||||
def address_pkh(pubkey: bytes, coin: CoinInfo) -> str:
|
def address_pkh(pubkey: bytes, coin: CoinInfo) -> str:
|
||||||
s = address_type.tobytes(coin.address_type) + coin.script_hash(pubkey)
|
s = address_type.tobytes(coin.address_type) + coin.script_hash(pubkey).digest()
|
||||||
return base58.encode_check(bytes(s), coin.b58_hash)
|
return base58.encode_check(bytes(s), coin.b58_hash)
|
||||||
|
|
||||||
|
|
||||||
@ -109,13 +109,13 @@ def address_p2sh(redeem_script_hash: bytes, coin: CoinInfo) -> str:
|
|||||||
def address_p2wpkh_in_p2sh(pubkey: bytes, coin: CoinInfo) -> str:
|
def address_p2wpkh_in_p2sh(pubkey: bytes, coin: CoinInfo) -> str:
|
||||||
pubkey_hash = ecdsa_hash_pubkey(pubkey, coin)
|
pubkey_hash = ecdsa_hash_pubkey(pubkey, coin)
|
||||||
redeem_script = output_script_native_p2wpkh_or_p2wsh(pubkey_hash)
|
redeem_script = output_script_native_p2wpkh_or_p2wsh(pubkey_hash)
|
||||||
redeem_script_hash = coin.script_hash(redeem_script)
|
redeem_script_hash = coin.script_hash(redeem_script).digest()
|
||||||
return address_p2sh(redeem_script_hash, coin)
|
return address_p2sh(redeem_script_hash, coin)
|
||||||
|
|
||||||
|
|
||||||
def address_p2wsh_in_p2sh(witness_script_hash: bytes, coin: CoinInfo) -> str:
|
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 = output_script_native_p2wpkh_or_p2wsh(witness_script_hash)
|
||||||
redeem_script_hash = coin.script_hash(redeem_script)
|
redeem_script_hash = coin.script_hash(redeem_script).digest()
|
||||||
return address_p2sh(redeem_script_hash, coin)
|
return address_p2sh(redeem_script_hash, coin)
|
||||||
|
|
||||||
|
|
||||||
|
@ -73,7 +73,7 @@ def ecdsa_hash_pubkey(pubkey: bytes, coin: CoinInfo) -> bytes:
|
|||||||
else:
|
else:
|
||||||
ensure(len(pubkey) == 33) # compresssed format
|
ensure(len(pubkey) == 33) # compresssed format
|
||||||
|
|
||||||
return coin.script_hash(pubkey)
|
return coin.script_hash(pubkey).digest()
|
||||||
|
|
||||||
|
|
||||||
def encode_bech32_address(prefix: str, script: bytes) -> str:
|
def encode_bech32_address(prefix: str, script: bytes) -> str:
|
||||||
|
@ -60,7 +60,7 @@ class SignatureVerifier:
|
|||||||
write_input_script_p2wpkh_in_p2sh(w, pubkey_hash)
|
write_input_script_p2wpkh_in_p2sh(w, pubkey_hash)
|
||||||
if w != script_sig:
|
if w != script_sig:
|
||||||
raise wire.DataError("Invalid public key hash")
|
raise wire.DataError("Invalid public key hash")
|
||||||
script_hash = coin.script_hash(script_sig[1:])
|
script_hash = coin.script_hash(script_sig[1:]).digest()
|
||||||
if output_script_p2sh(script_hash) != script_pubkey:
|
if output_script_p2sh(script_hash) != script_pubkey:
|
||||||
raise wire.DataError("Invalid script hash")
|
raise wire.DataError("Invalid script hash")
|
||||||
self.public_keys = [public_key]
|
self.public_keys = [public_key]
|
||||||
@ -72,7 +72,7 @@ class SignatureVerifier:
|
|||||||
write_input_script_p2wsh_in_p2sh(w, script_hash)
|
write_input_script_p2wsh_in_p2sh(w, script_hash)
|
||||||
if w != script_sig:
|
if w != script_sig:
|
||||||
raise wire.DataError("Invalid script hash")
|
raise wire.DataError("Invalid script hash")
|
||||||
script_hash = coin.script_hash(script_sig[1:])
|
script_hash = coin.script_hash(script_sig[1:]).digest()
|
||||||
if output_script_p2sh(script_hash) != script_pubkey:
|
if output_script_p2sh(script_hash) != script_pubkey:
|
||||||
raise wire.DataError("Invalid script hash")
|
raise wire.DataError("Invalid script hash")
|
||||||
self.public_keys, self.threshold = parse_output_script_multisig(script)
|
self.public_keys, self.threshold = parse_output_script_multisig(script)
|
||||||
@ -88,7 +88,7 @@ class SignatureVerifier:
|
|||||||
self.signatures = [(signature, hash_type)]
|
self.signatures = [(signature, hash_type)]
|
||||||
elif len(script_pubkey) == 23: # P2SH
|
elif len(script_pubkey) == 23: # P2SH
|
||||||
script, self.signatures = parse_input_script_multisig(script_sig)
|
script, self.signatures = parse_input_script_multisig(script_sig)
|
||||||
script_hash = coin.script_hash(script)
|
script_hash = coin.script_hash(script).digest()
|
||||||
if output_script_p2sh(script_hash) != script_pubkey:
|
if output_script_p2sh(script_hash) != script_pubkey:
|
||||||
raise wire.DataError("Invalid script hash")
|
raise wire.DataError("Invalid script hash")
|
||||||
self.public_keys, self.threshold = parse_output_script_multisig(script)
|
self.public_keys, self.threshold = parse_output_script_multisig(script)
|
||||||
|
@ -2,10 +2,10 @@
|
|||||||
# do not edit manually!
|
# do not edit manually!
|
||||||
from trezor import utils
|
from trezor import utils
|
||||||
from trezor.crypto.base58 import blake256d_32, groestl512d_32, keccak_32, sha256d_32
|
from trezor.crypto.base58 import blake256d_32, groestl512d_32, keccak_32, sha256d_32
|
||||||
from trezor.crypto.scripts import blake256_ripemd160_digest, sha256_ripemd160_digest
|
from trezor.crypto.scripts import blake256_ripemd160, sha256_ripemd160
|
||||||
|
|
||||||
if False:
|
if False:
|
||||||
from typing import Any
|
from typing import Any, Type
|
||||||
|
|
||||||
# flake8: noqa
|
# flake8: noqa
|
||||||
|
|
||||||
@ -67,19 +67,19 @@ class CoinInfo:
|
|||||||
if curve_name == "secp256k1-groestl":
|
if curve_name == "secp256k1-groestl":
|
||||||
self.b58_hash = groestl512d_32
|
self.b58_hash = groestl512d_32
|
||||||
self.sign_hash_double = False
|
self.sign_hash_double = False
|
||||||
self.script_hash = sha256_ripemd160_digest
|
self.script_hash: Type[utils.HashContext] = sha256_ripemd160
|
||||||
elif curve_name == "secp256k1-decred":
|
elif curve_name == "secp256k1-decred":
|
||||||
self.b58_hash = blake256d_32
|
self.b58_hash = blake256d_32
|
||||||
self.sign_hash_double = False
|
self.sign_hash_double = False
|
||||||
self.script_hash = blake256_ripemd160_digest
|
self.script_hash = blake256_ripemd160
|
||||||
elif curve_name == "secp256k1-smart":
|
elif curve_name == "secp256k1-smart":
|
||||||
self.b58_hash = keccak_32
|
self.b58_hash = keccak_32
|
||||||
self.sign_hash_double = False
|
self.sign_hash_double = False
|
||||||
self.script_hash = sha256_ripemd160_digest
|
self.script_hash = sha256_ripemd160
|
||||||
else:
|
else:
|
||||||
self.b58_hash = sha256d_32
|
self.b58_hash = sha256d_32
|
||||||
self.sign_hash_double = True
|
self.sign_hash_double = True
|
||||||
self.script_hash = sha256_ripemd160_digest
|
self.script_hash = sha256_ripemd160
|
||||||
|
|
||||||
def __eq__(self, other: Any) -> bool:
|
def __eq__(self, other: Any) -> bool:
|
||||||
if not isinstance(other, CoinInfo):
|
if not isinstance(other, CoinInfo):
|
||||||
|
@ -2,10 +2,10 @@
|
|||||||
# do not edit manually!
|
# do not edit manually!
|
||||||
from trezor import utils
|
from trezor import utils
|
||||||
from trezor.crypto.base58 import blake256d_32, groestl512d_32, keccak_32, sha256d_32
|
from trezor.crypto.base58 import blake256d_32, groestl512d_32, keccak_32, sha256d_32
|
||||||
from trezor.crypto.scripts import blake256_ripemd160_digest, sha256_ripemd160_digest
|
from trezor.crypto.scripts import blake256_ripemd160, sha256_ripemd160
|
||||||
|
|
||||||
if False:
|
if False:
|
||||||
from typing import Any
|
from typing import Any, Type
|
||||||
|
|
||||||
# flake8: noqa
|
# flake8: noqa
|
||||||
|
|
||||||
@ -67,19 +67,19 @@ class CoinInfo:
|
|||||||
if curve_name == "secp256k1-groestl":
|
if curve_name == "secp256k1-groestl":
|
||||||
self.b58_hash = groestl512d_32
|
self.b58_hash = groestl512d_32
|
||||||
self.sign_hash_double = False
|
self.sign_hash_double = False
|
||||||
self.script_hash = sha256_ripemd160_digest
|
self.script_hash: Type[utils.HashContext] = sha256_ripemd160
|
||||||
elif curve_name == "secp256k1-decred":
|
elif curve_name == "secp256k1-decred":
|
||||||
self.b58_hash = blake256d_32
|
self.b58_hash = blake256d_32
|
||||||
self.sign_hash_double = False
|
self.sign_hash_double = False
|
||||||
self.script_hash = blake256_ripemd160_digest
|
self.script_hash = blake256_ripemd160
|
||||||
elif curve_name == "secp256k1-smart":
|
elif curve_name == "secp256k1-smart":
|
||||||
self.b58_hash = keccak_32
|
self.b58_hash = keccak_32
|
||||||
self.sign_hash_double = False
|
self.sign_hash_double = False
|
||||||
self.script_hash = sha256_ripemd160_digest
|
self.script_hash = sha256_ripemd160
|
||||||
else:
|
else:
|
||||||
self.b58_hash = sha256d_32
|
self.b58_hash = sha256d_32
|
||||||
self.sign_hash_double = True
|
self.sign_hash_double = True
|
||||||
self.script_hash = sha256_ripemd160_digest
|
self.script_hash = sha256_ripemd160
|
||||||
|
|
||||||
def __eq__(self, other: Any) -> bool:
|
def __eq__(self, other: Any) -> bool:
|
||||||
if not isinstance(other, CoinInfo):
|
if not isinstance(other, CoinInfo):
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
from trezor.crypto.hashlib import blake256, ripemd160, sha256
|
from trezor.crypto.hashlib import blake256, ripemd160, sha256
|
||||||
|
|
||||||
|
|
||||||
def sha256_ripemd160_digest(b: bytes) -> bytes:
|
class sha256_ripemd160(sha256):
|
||||||
h = sha256(b).digest()
|
def digest(self) -> bytes:
|
||||||
h = ripemd160(h).digest()
|
return ripemd160(super().digest()).digest()
|
||||||
return h
|
|
||||||
|
|
||||||
|
|
||||||
def blake256_ripemd160_digest(b: bytes) -> bytes:
|
class blake256_ripemd160(blake256):
|
||||||
h = blake256(b).digest()
|
def digest(self) -> bytes:
|
||||||
h = ripemd160(h).digest()
|
return ripemd160(super().digest()).digest()
|
||||||
return h
|
|
||||||
|
@ -146,6 +146,9 @@ def chunks_intersperse(
|
|||||||
if False:
|
if False:
|
||||||
|
|
||||||
class HashContext(Protocol):
|
class HashContext(Protocol):
|
||||||
|
def __init__(self, data: bytes = None) -> None:
|
||||||
|
...
|
||||||
|
|
||||||
def update(self, buf: bytes) -> None:
|
def update(self, buf: bytes) -> None:
|
||||||
...
|
...
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user