refactor(core): move empty_bytearray to trezor.utils

pull/1610/head
matejcik 3 years ago committed by matejcik
parent b0116d0bdc
commit ea505b592c

@ -3,12 +3,7 @@ from trezor.crypto import bip32, hashlib, hmac
from apps.common.keychain import Keychain from apps.common.keychain import Keychain
from apps.common.readers import read_bitcoin_varint from apps.common.readers import read_bitcoin_varint
from apps.common.writers import ( from apps.common.writers import write_bitcoin_varint, write_bytes_fixed, write_uint8
empty_bytearray,
write_bitcoin_varint,
write_bytes_fixed,
write_uint8,
)
from . import common from . import common
from .scripts import read_bip322_signature_proof, write_bip322_signature_proof from .scripts import read_bip322_signature_proof, write_bip322_signature_proof
@ -43,7 +38,7 @@ def generate_proof(
if user_confirmed: if user_confirmed:
flags |= _FLAG_USER_CONFIRMED flags |= _FLAG_USER_CONFIRMED
proof = empty_bytearray(4 + 1 + 1 + len(ownership_ids) * _OWNERSHIP_ID_LEN) proof = utils.empty_bytearray(4 + 1 + 1 + len(ownership_ids) * _OWNERSHIP_ID_LEN)
write_bytes_fixed(proof, _VERSION_MAGIC, 4) write_bytes_fixed(proof, _VERSION_MAGIC, 4)
write_uint8(proof, flags) write_uint8(proof, flags)

@ -5,7 +5,7 @@ from trezor.messages import InputScriptType
from apps.common import address_type from apps.common import address_type
from apps.common.readers import read_bitcoin_varint from apps.common.readers import read_bitcoin_varint
from apps.common.writers import empty_bytearray, write_bitcoin_varint from apps.common.writers import write_bitcoin_varint
from . import common from . import common
from .multisig import ( from .multisig import (
@ -141,7 +141,7 @@ def bip143_derive_script_code(
def input_script_p2pkh_or_p2sh( def input_script_p2pkh_or_p2sh(
pubkey: bytes, signature: bytes, hash_type: int pubkey: bytes, signature: bytes, hash_type: int
) -> bytearray: ) -> bytearray:
w = empty_bytearray(5 + len(signature) + 1 + 5 + len(pubkey)) w = utils.empty_bytearray(5 + len(signature) + 1 + 5 + len(pubkey))
append_signature(w, signature, hash_type) append_signature(w, signature, hash_type)
append_pubkey(w, pubkey) append_pubkey(w, pubkey)
return w return w
@ -211,7 +211,7 @@ def output_script_native_p2wpkh_or_p2wsh(witprog: bytes) -> bytearray:
length = len(witprog) length = len(witprog)
utils.ensure(length == 20 or length == 32) utils.ensure(length == 20 or length == 32)
w = empty_bytearray(3 + length) w = utils.empty_bytearray(3 + length)
w.append(0x00) # witness version byte w.append(0x00) # witness version byte
w.append(length) # pub key hash length is 20 (P2WPKH) or 32 (P2WSH) bytes w.append(length) # pub key hash length is 20 (P2WPKH) or 32 (P2WSH) bytes
write_bytes_fixed(w, witprog, length) # pub key hash write_bytes_fixed(w, witprog, length) # pub key hash
@ -231,7 +231,7 @@ def input_script_p2wpkh_in_p2sh(pubkeyhash: bytes) -> bytearray:
# Signature is moved to the witness. # Signature is moved to the witness.
utils.ensure(len(pubkeyhash) == 20) utils.ensure(len(pubkeyhash) == 20)
w = empty_bytearray(3 + len(pubkeyhash)) w = utils.empty_bytearray(3 + len(pubkeyhash))
w.append(0x16) # length of the data w.append(0x16) # length of the data
w.append(0x00) # witness version byte w.append(0x00) # witness version byte
w.append(0x14) # P2WPKH witness program (pub key hash length) w.append(0x14) # P2WPKH witness program (pub key hash length)
@ -254,7 +254,7 @@ def input_script_p2wsh_in_p2sh(script_hash: bytes) -> bytearray:
if len(script_hash) != 32: if len(script_hash) != 32:
raise wire.DataError("Redeem script hash should be 32 bytes long") raise wire.DataError("Redeem script hash should be 32 bytes long")
w = empty_bytearray(3 + len(script_hash)) w = utils.empty_bytearray(3 + len(script_hash))
w.append(0x22) # length of the data w.append(0x22) # length of the data
w.append(0x00) # witness version byte w.append(0x00) # witness version byte
w.append(0x20) # P2WSH witness program (redeem script hash length) w.append(0x20) # P2WSH witness program (redeem script hash length)
@ -267,7 +267,7 @@ def input_script_p2wsh_in_p2sh(script_hash: bytes) -> bytearray:
def witness_p2wpkh(signature: bytes, pubkey: bytes, hash_type: int) -> bytearray: def witness_p2wpkh(signature: bytes, pubkey: bytes, hash_type: int) -> bytearray:
w = empty_bytearray(1 + 5 + len(signature) + 1 + 5 + len(pubkey)) w = utils.empty_bytearray(1 + 5 + len(signature) + 1 + 5 + len(pubkey))
write_bitcoin_varint(w, 0x02) # num of segwit items, in P2WPKH it's always 2 write_bitcoin_varint(w, 0x02) # num of segwit items, in P2WPKH it's always 2
write_signature_prefixed(w, signature, hash_type) write_signature_prefixed(w, signature, hash_type)
write_bytes_prefixed(w, pubkey) write_bytes_prefixed(w, pubkey)
@ -326,7 +326,7 @@ def witness_multisig(
total_length += 1 + len(s) + 1 # length, signature, hash_type total_length += 1 + len(s) + 1 # length, signature, hash_type
total_length += 1 + redeem_script_length # length, script total_length += 1 + redeem_script_length # length, script
w = empty_bytearray(total_length) w = utils.empty_bytearray(total_length)
write_bitcoin_varint(w, num_of_witness_items) write_bitcoin_varint(w, num_of_witness_items)
# Starts with OP_FALSE because of an old OP_CHECKMULTISIG bug, which # Starts with OP_FALSE because of an old OP_CHECKMULTISIG bug, which
@ -399,7 +399,7 @@ def input_script_multisig(
total_length += 1 + len(s) + 1 # length, signature, hash_type total_length += 1 + len(s) + 1 # length, signature, hash_type
total_length += 1 + redeem_script_length # length, script total_length += 1 + redeem_script_length # length, script
w = empty_bytearray(total_length) w = utils.empty_bytearray(total_length)
# Starts with OP_FALSE because of an old OP_CHECKMULTISIG bug, which # Starts with OP_FALSE because of an old OP_CHECKMULTISIG bug, which
# consumes one additional item on the stack: # consumes one additional item on the stack:
@ -445,7 +445,7 @@ def parse_input_script_multisig(
def output_script_multisig(pubkeys: list[bytes], m: int) -> bytearray: def output_script_multisig(pubkeys: list[bytes], m: int) -> bytearray:
w = empty_bytearray(output_script_multisig_length(pubkeys, m)) w = utils.empty_bytearray(output_script_multisig_length(pubkeys, m))
write_output_script_multisig(w, pubkeys, m) write_output_script_multisig(w, pubkeys, m)
return w return w
@ -507,7 +507,7 @@ def parse_output_script_multisig(script: bytes) -> tuple[list[bytes], int]:
def output_script_paytoopreturn(data: bytes) -> bytearray: def output_script_paytoopreturn(data: bytes) -> bytearray:
w = empty_bytearray(1 + 5 + len(data)) w = utils.empty_bytearray(1 + 5 + len(data))
w.append(0x6A) # OP_RETURN w.append(0x6A) # OP_RETURN
write_op_push(w, len(data)) write_op_push(w, len(data))
w.extend(data) w.extend(data)

@ -3,7 +3,7 @@ from trezor.crypto import base58
from trezor.crypto.base58 import blake256d_32 from trezor.crypto.base58 import blake256d_32
from trezor.messages import InputScriptType from trezor.messages import InputScriptType
from apps.common.writers import empty_bytearray, write_bytes_fixed, write_uint64_le from apps.common.writers import write_bytes_fixed, write_uint64_le
from . import scripts from . import scripts
from .multisig import multisig_get_pubkeys, multisig_pubkey_index from .multisig import multisig_get_pubkeys, multisig_pubkey_index
@ -65,7 +65,7 @@ def input_script_multisig(
total_length += 1 + len(s) + 1 # length, signature, hash_type total_length += 1 + len(s) + 1 # length, signature, hash_type
total_length += 1 + redeem_script_length # length, script total_length += 1 + redeem_script_length # length, script
w = empty_bytearray(total_length) w = utils.empty_bytearray(total_length)
for s in signatures: for s in signatures:
if len(s): if len(s):
@ -85,7 +85,7 @@ def output_script_sstxsubmissionpkh(addr: str) -> bytearray:
except ValueError: except ValueError:
raise wire.DataError("Invalid address") raise wire.DataError("Invalid address")
w = empty_bytearray(26) w = utils.empty_bytearray(26)
w.append(0xBA) # OP_SSTX w.append(0xBA) # OP_SSTX
w.append(0x76) # OP_DUP w.append(0x76) # OP_DUP
w.append(0xA9) # OP_HASH160 w.append(0xA9) # OP_HASH160
@ -103,7 +103,7 @@ def output_script_sstxchange(addr: str) -> bytearray:
except ValueError: except ValueError:
raise wire.DataError("Invalid address") raise wire.DataError("Invalid address")
w = empty_bytearray(26) w = utils.empty_bytearray(26)
w.append(0xBD) # OP_SSTXCHANGE w.append(0xBD) # OP_SSTXCHANGE
w.append(0x76) # OP_DUP w.append(0x76) # OP_DUP
w.append(0xA9) # OP_HASH160 w.append(0xA9) # OP_HASH160
@ -144,7 +144,7 @@ def output_script_ssgen(pkh: bytes) -> bytearray:
# Retrieve pkh bytes from a stake commitment OPRETURN. # Retrieve pkh bytes from a stake commitment OPRETURN.
def sstxcommitment_pkh(pkh: bytes, amount: int) -> bytes: def sstxcommitment_pkh(pkh: bytes, amount: int) -> bytes:
w = empty_bytearray(30) w = utils.empty_bytearray(30)
write_bytes_fixed(w, pkh, 20) write_bytes_fixed(w, pkh, 20)
write_uint64_le(w, amount) write_uint64_le(w, amount)
write_bytes_fixed(w, b"\x00\x58", 2) # standard fee limits write_bytes_fixed(w, b"\x00\x58", 2) # standard fee limits

@ -6,7 +6,7 @@ from trezor.messages import InputScriptType, OutputScriptType
from trezor.messages.TxRequest import TxRequest from trezor.messages.TxRequest import TxRequest
from trezor.messages.TxRequestDetailsType import TxRequestDetailsType from trezor.messages.TxRequestDetailsType import TxRequestDetailsType
from trezor.messages.TxRequestSerializedType import TxRequestSerializedType from trezor.messages.TxRequestSerializedType import TxRequestSerializedType
from trezor.utils import HashWriter, ensure from trezor.utils import HashWriter, empty_bytearray, ensure
from apps.common.writers import write_bitcoin_varint from apps.common.writers import write_bitcoin_varint
@ -93,7 +93,7 @@ class Bitcoin:
self.external: set[int] = set() self.external: set[int] = set()
# transaction and signature serialization # transaction and signature serialization
self.serialized_tx = writers.empty_bytearray(_MAX_SERIALIZED_CHUNK_SIZE) self.serialized_tx = empty_bytearray(_MAX_SERIALIZED_CHUNK_SIZE)
self.tx_req = TxRequest() self.tx_req = TxRequest()
self.tx_req.details = TxRequestDetailsType() self.tx_req.details = TxRequestDetailsType()
self.tx_req.serialized = TxRequestSerializedType() self.tx_req.serialized = TxRequestSerializedType()

@ -4,7 +4,6 @@ from trezor.crypto.hashlib import sha256
from trezor.utils import ensure from trezor.utils import ensure
from apps.common.writers import ( # noqa: F401 from apps.common.writers import ( # noqa: F401
empty_bytearray,
write_bitcoin_varint, write_bitcoin_varint,
write_bytes_fixed, write_bytes_fixed,
write_bytes_reversed, write_bytes_reversed,

@ -7,7 +7,7 @@ from micropython import const
from trezor import log, utils from trezor import log, utils
from . import readers, writers from . import readers
if False: if False:
from typing import Any, Union, Iterator, Tuple from typing import Any, Union, Iterator, Tuple
@ -250,7 +250,7 @@ def encode_chunked(value: Value, max_chunk_size: int) -> Iterator[bytes]:
chunks = encode_streamed(value) chunks = encode_streamed(value)
chunk_buffer = writers.empty_bytearray(max_chunk_size) chunk_buffer = utils.empty_bytearray(max_chunk_size)
try: try:
current_chunk_view = utils.BufferReader(next(chunks)) current_chunk_view = utils.BufferReader(next(chunks))
while True: while True:

@ -4,16 +4,6 @@ if False:
from trezor.utils import Writer from trezor.utils import Writer
def empty_bytearray(preallocate: int) -> bytearray:
"""
Returns bytearray that won't allocate for at least `preallocate` bytes.
Useful in case you want to avoid allocating too often.
"""
b = bytearray(preallocate)
b[:] = bytes()
return b
def write_uint8(w: Writer, n: int) -> int: def write_uint8(w: Writer, n: int) -> int:
ensure(0 <= n <= 0xFF) ensure(0 <= n <= 0xFF)
w.append(n) w.append(n)

@ -268,3 +268,13 @@ def is_empty_iterator(i: Iterator) -> bool:
return True return True
else: else:
return False return False
def empty_bytearray(preallocate: int) -> bytearray:
"""
Returns bytearray that won't allocate for at least `preallocate` bytes.
Useful in case you want to avoid allocating too often.
"""
b = bytearray(preallocate)
b[:] = bytes()
return b

Loading…
Cancel
Save