diff --git a/core/src/apps/eos/actions/__init__.py b/core/src/apps/eos/actions/__init__.py index 5400448c0..c47b827f4 100644 --- a/core/src/apps/eos/actions/__init__.py +++ b/core/src/apps/eos/actions/__init__.py @@ -67,8 +67,7 @@ async def process_action( await process_unknown_action(ctx, w, action) writers.write_action_common(sha, action.common) - writers.write_variant32(sha, len(w)) - writers.write_bytes_unchecked(sha, w) + writers.write_bytes_prefixed(sha, w) async def process_unknown_action( diff --git a/core/src/apps/eos/sign_tx.py b/core/src/apps/eos/sign_tx.py index d437e4c95..514e99a8f 100644 --- a/core/src/apps/eos/sign_tx.py +++ b/core/src/apps/eos/sign_tx.py @@ -32,7 +32,7 @@ async def sign_tx(ctx: wire.Context, msg: EosSignTx, keychain: Keychain) -> EosS await _init(ctx, sha, msg) await _actions(ctx, sha, msg.num_actions) writers.write_variant32(sha, 0) - writers.write_bytes_unchecked(sha, bytearray(32)) + writers.write_bytes_fixed(sha, bytearray(32), 32) digest = sha.get_digest() signature = secp256k1.sign( @@ -43,7 +43,7 @@ async def sign_tx(ctx: wire.Context, msg: EosSignTx, keychain: Keychain) -> EosS async def _init(ctx: wire.Context, sha: HashWriter, msg: EosSignTx) -> None: - writers.write_bytes_unchecked(sha, msg.chain_id) + writers.write_bytes_fixed(sha, msg.chain_id, 32) writers.write_header(sha, msg.header) writers.write_variant32(sha, 0) writers.write_variant32(sha, msg.num_actions) diff --git a/core/src/apps/eos/writers.py b/core/src/apps/eos/writers.py index fc6cf589a..aca117d7c 100644 --- a/core/src/apps/eos/writers.py +++ b/core/src/apps/eos/writers.py @@ -1,4 +1,7 @@ +from protobuf import dump_uvarint + from apps.common.writers import ( + write_bytes_fixed, write_bytes_unchecked, write_uint8, write_uint16_le, @@ -31,7 +34,7 @@ def write_auth(w: Writer, auth: EosAuthorization) -> None: write_variant32(w, len(auth.keys)) for key in auth.keys: write_variant32(w, key.type) - write_bytes_unchecked(w, key.key) + write_bytes_fixed(w, key.key, 33) write_uint16_le(w, key.weight) write_variant32(w, len(auth.accounts)) @@ -59,8 +62,7 @@ def write_action_transfer(w: Writer, msg: EosActionTransfer) -> None: write_uint64_le(w, msg.sender) write_uint64_le(w, msg.receiver) write_asset(w, msg.quantity) - write_variant32(w, len(msg.memo)) - write_bytes_unchecked(w, msg.memo) + write_bytes_prefixed(w, msg.memo) def write_action_buyram(w: Writer, msg: EosActionBuyRam) -> None: @@ -154,12 +156,9 @@ def write_asset(w: Writer, asset: EosAsset) -> None: def write_variant32(w: Writer, value: int) -> None: - variant = bytearray() - while True: - b = value & 0x7F - value >>= 7 - b |= (value > 0) << 7 - variant.append(b) - if value == 0: - break - write_bytes_unchecked(w, bytes(variant)) + dump_uvarint(w.extend, value) + + +def write_bytes_prefixed(w: Writer, data: bytes) -> None: + write_variant32(w, len(data)) + write_bytes_unchecked(w, data)