Skip to content

Commit 75784b3

Browse files
chore(client): convert bytearray to bytes at API boundaries for mypy
Many serialize() methods declared '-> bytes' but returned a bytearray they had built up incrementally. Python's mypy does not consider bytearray to be a bytes, so each return-value was flagged. SigningPartner from ragger.pki also accepts strictly bytes for sign(), but the codebase was passing the bytearray buffers directly. Convert at the API boundary: wrap returns with bytes(), wrap sign() args with bytes(). Widen the local _serialize() helper's cdata parameter to Union[bytes, bytearray] since it's an internal type and many callers pass the bytearray buffer they're building. No behavioral change.
1 parent 9b03e13 commit 75784b3

10 files changed

Lines changed: 53 additions & 53 deletions

File tree

client/src/ledger_app_clients/ethereum/client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def send_raw(self, cla: int, ins: int, p1: int, p2: int, payload: bytes):
7070
header.append(p1)
7171
header.append(p2)
7272
header.append(len(payload))
73-
return self._exchange(header + payload)
73+
return self._exchange(bytes(header + payload))
7474

7575
def send_raw_async(self, cla: int, ins: int, p1: int, p2: int, payload: bytes):
7676
header = bytearray()
@@ -79,7 +79,7 @@ def send_raw_async(self, cla: int, ins: int, p1: int, p2: int, payload: bytes):
7979
header.append(p1)
8080
header.append(p2)
8181
header.append(len(payload))
82-
return self._exchange_async(header + payload)
82+
return self._exchange_async(bytes(header + payload))
8383

8484
def get_app_configuration(self):
8585
return self._exchange(self._cmd_builder.get_app_configuration())

client/src/ledger_app_clients/ethereum/command_builder.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import struct
55
import math
66
from enum import IntEnum
7-
from typing import Optional
7+
from typing import Optional, Union
88
from ragger.bip import pack_derivation_path
99

1010
from .eip712.struct import EIP712FieldType, EIP712TypeDescOffset
@@ -89,15 +89,15 @@ def _serialize(self,
8989
ins: InsType,
9090
p1: int,
9191
p2: int,
92-
cdata: bytes = bytes()) -> bytes:
92+
cdata: Union[bytes, bytearray] = bytes()) -> bytes:
9393

9494
header = bytearray()
9595
header.append(self._CLA)
9696
header.append(ins)
9797
header.append(p1)
9898
header.append(p2)
9999
header.append(len(cdata))
100-
return header + cdata
100+
return bytes(header + cdata)
101101

102102
def eip712_send_struct_def_struct_name(self, name: str) -> bytes:
103103
return self._serialize(InsType.EIP712_SEND_STRUCT_DEF,
@@ -200,7 +200,7 @@ def _eip712_filtering_send_name(self, name: str, sig: bytes) -> bytes:
200200
data += name.encode()
201201
data.append(len(sig))
202202
data += sig
203-
return data
203+
return bytes(data)
204204

205205
def eip712_filtering_discarded_path(self, path: str) -> bytes:
206206
data = bytearray()
@@ -401,7 +401,7 @@ def sign(self,
401401
apdus: list[bytes] = []
402402
payload = bytearray()
403403
if bip32_path is not None:
404-
payload = pack_derivation_path(bip32_path)
404+
payload = bytearray(pack_derivation_path(bip32_path))
405405
if rlp_data is not None:
406406
payload += rlp_data
407407
p1 = P1Type.SIGN_FIRST_CHUNK

client/src/ledger_app_clients/ethereum/eip712/InputData.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ def send_filtering_message_info(display_name: str, filters_count: int):
355355
to_sign.append(filters_count)
356356
to_sign += display_name.encode()
357357

358-
sig = CAL_COIN_META_PARTNER.sign(to_sign)
358+
sig = CAL_COIN_META_PARTNER.sign(bytes(to_sign))
359359
with app_client.eip712_filtering_message_info(display_name, filters_count, sig):
360360
pass
361361
response = app_client.response()
@@ -368,7 +368,7 @@ def send_filtering_amount_join_token(path: str, join_id: int, discarded: bool):
368368
to_sign = start_signature_payload(sig_ctx, 11)
369369
to_sign += path.encode()
370370
to_sign.append(join_id)
371-
sig = CAL_COIN_META_PARTNER.sign(to_sign)
371+
sig = CAL_COIN_META_PARTNER.sign(bytes(to_sign))
372372
with app_client.eip712_filtering_amount_join_token(join_id, sig, discarded):
373373
pass
374374
response = app_client.response()
@@ -382,7 +382,7 @@ def send_filtering_amount_join_value(path: str, join_id: int, display_name: str,
382382
to_sign += path.encode()
383383
to_sign += display_name.encode()
384384
to_sign.append(join_id)
385-
sig = CAL_COIN_META_PARTNER.sign(to_sign)
385+
sig = CAL_COIN_META_PARTNER.sign(bytes(to_sign))
386386
with app_client.eip712_filtering_amount_join_value(join_id, display_name, sig, discarded):
387387
pass
388388
response = app_client.response()
@@ -395,7 +395,7 @@ def send_filtering_datetime(path: str, display_name: str, discarded: bool):
395395
to_sign = start_signature_payload(sig_ctx, 33)
396396
to_sign += path.encode()
397397
to_sign += display_name.encode()
398-
sig = CAL_COIN_META_PARTNER.sign(to_sign)
398+
sig = CAL_COIN_META_PARTNER.sign(bytes(to_sign))
399399
with app_client.eip712_filtering_datetime(display_name, sig, discarded):
400400
pass
401401
response = app_client.response()
@@ -416,7 +416,7 @@ def send_filtering_trusted_name(path: str,
416416
to_sign.append(t)
417417
for s in name_source:
418418
to_sign.append(s)
419-
sig = CAL_COIN_META_PARTNER.sign(to_sign)
419+
sig = CAL_COIN_META_PARTNER.sign(bytes(to_sign))
420420
with app_client.eip712_filtering_trusted_name(display_name, name_type, name_source, sig, discarded):
421421
pass
422422
response = app_client.response()
@@ -440,7 +440,7 @@ def send_filtering_calldata_info(index: int,
440440
to_sign.append(selector_filter_flag)
441441
to_sign.append(amount_filter_flag)
442442
to_sign.append(int(spender_filter_flag))
443-
sig = CAL_COIN_META_PARTNER.sign(to_sign)
443+
sig = CAL_COIN_META_PARTNER.sign(bytes(to_sign))
444444
response = app_client.eip712_filtering_calldata_info(index,
445445
value_filter_flag,
446446
callee_filter_flag,
@@ -457,7 +457,7 @@ def send_filtering_calldata_value(path: str, index: int, discarded: bool):
457457
to_sign = start_signature_payload(sig_ctx, 66)
458458
to_sign += path.encode()
459459
to_sign.append(index)
460-
sig = CAL_COIN_META_PARTNER.sign(to_sign)
460+
sig = CAL_COIN_META_PARTNER.sign(bytes(to_sign))
461461
response = app_client.eip712_filtering_calldata_value(index, sig, discarded)
462462
assert response.status == StatusWord.SWO_SUCCESS, \
463463
f"Error sending filtering calldata value for {path}: {response.status}"
@@ -467,7 +467,7 @@ def send_filtering_calldata_callee(path: str, index: int, discarded: bool):
467467
to_sign = start_signature_payload(sig_ctx, 77)
468468
to_sign += path.encode()
469469
to_sign.append(index)
470-
sig = CAL_COIN_META_PARTNER.sign(to_sign)
470+
sig = CAL_COIN_META_PARTNER.sign(bytes(to_sign))
471471
response = app_client.eip712_filtering_calldata_callee(index, sig, discarded)
472472
assert response.status == StatusWord.SWO_SUCCESS, \
473473
f"Error sending filtering calldata callee for {path}: {response.status}"
@@ -477,7 +477,7 @@ def send_filtering_calldata_chain_id(path: str, index: int, discarded: bool):
477477
to_sign = start_signature_payload(sig_ctx, 88)
478478
to_sign += path.encode()
479479
to_sign.append(index)
480-
sig = CAL_COIN_META_PARTNER.sign(to_sign)
480+
sig = CAL_COIN_META_PARTNER.sign(bytes(to_sign))
481481
response = app_client.eip712_filtering_calldata_chain_id(index, sig, discarded)
482482
assert response.status == StatusWord.SWO_SUCCESS, \
483483
f"Error sending filtering calldata callee for {path}: {response.status}"
@@ -487,7 +487,7 @@ def send_filtering_calldata_selector(path: str, index: int, discarded: bool):
487487
to_sign = start_signature_payload(sig_ctx, 99)
488488
to_sign += path.encode()
489489
to_sign.append(index)
490-
sig = CAL_COIN_META_PARTNER.sign(to_sign)
490+
sig = CAL_COIN_META_PARTNER.sign(bytes(to_sign))
491491
response = app_client.eip712_filtering_calldata_selector(index, sig, discarded)
492492
assert response.status == StatusWord.SWO_SUCCESS, \
493493
f"Error sending filtering calldata callee for {path}: {response.status}"
@@ -497,7 +497,7 @@ def send_filtering_calldata_amount(path: str, index: int, discarded: bool):
497497
to_sign = start_signature_payload(sig_ctx, 110)
498498
to_sign += path.encode()
499499
to_sign.append(index)
500-
sig = CAL_COIN_META_PARTNER.sign(to_sign)
500+
sig = CAL_COIN_META_PARTNER.sign(bytes(to_sign))
501501
response = app_client.eip712_filtering_calldata_amount(index, sig, discarded)
502502
assert response.status == StatusWord.SWO_SUCCESS, \
503503
f"Error sending filtering calldata callee for {path}: {response.status}"
@@ -507,7 +507,7 @@ def send_filtering_calldata_spender(path: str, index: int, discarded: bool):
507507
to_sign = start_signature_payload(sig_ctx, 121)
508508
to_sign += path.encode()
509509
to_sign.append(index)
510-
sig = CAL_COIN_META_PARTNER.sign(to_sign)
510+
sig = CAL_COIN_META_PARTNER.sign(bytes(to_sign))
511511
response = app_client.eip712_filtering_calldata_spender(index, sig, discarded)
512512
assert response.status == StatusWord.SWO_SUCCESS, \
513513
f"Error sending filtering calldata callee for {path}: {response.status}"
@@ -518,7 +518,7 @@ def send_filtering_raw(path: str, display_name: str, discarded: bool):
518518
to_sign = start_signature_payload(sig_ctx, 72)
519519
to_sign += path.encode()
520520
to_sign += display_name.encode()
521-
sig = CAL_COIN_META_PARTNER.sign(to_sign)
521+
sig = CAL_COIN_META_PARTNER.sign(bytes(to_sign))
522522
with app_client.eip712_filtering_raw(display_name, sig, discarded):
523523
pass
524524
response = app_client.response()

client/src/ledger_app_clients/ethereum/enum_value.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,6 @@ def serialize(self) -> bytes:
5454
payload += self.serialize_field(Tag.NAME, self.name)
5555
sig = self.signature
5656
if sig is None:
57-
sig = CALLDATA_PARTNER.sign(payload)
57+
sig = CALLDATA_PARTNER.sign(bytes(payload))
5858
payload += self.serialize_field(Tag.SIGNATURE, sig)
59-
return payload
59+
return bytes(payload)

client/src/ledger_app_clients/ethereum/gcs.py

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@ def serialize(self) -> bytes:
8282
payload += self.serialize_field(TxInfoTag.DEPLOY_DATE, self.deploy_date)
8383
signature = self.signature
8484
if signature is None:
85-
signature = CALLDATA_PARTNER.sign(payload)
85+
signature = CALLDATA_PARTNER.sign(bytes(payload))
8686
payload += self.serialize_field(TxInfoTag.SIGNATURE, signature)
87-
return payload
87+
return bytes(payload)
8888

8989

9090
class ParamType(IntEnum):
@@ -144,7 +144,7 @@ def serialize(self) -> bytes:
144144
payload += self.serialize_field(0x02, struct.pack(">h", self.start))
145145
if self.end is not None:
146146
payload += self.serialize_field(0x03, struct.pack(">h", self.end))
147-
return payload
147+
return bytes(payload)
148148

149149

150150
class PathRef(TlvSerializable):
@@ -186,7 +186,7 @@ def serialize(self) -> bytes:
186186
payload += self.serialize_field(0x01, struct.pack(">h", self.start))
187187
if self.end is not None:
188188
payload += self.serialize_field(0x02, struct.pack(">h", self.end))
189-
return payload
189+
return bytes(payload)
190190

191191

192192
class DataPath(TlvSerializable):
@@ -214,7 +214,7 @@ def serialize(self) -> bytes:
214214
else:
215215
assert False, f"Unknown path node type : {type(node)}"
216216
payload += self.serialize_field(tag, node.serialize())
217-
return payload
217+
return bytes(payload)
218218

219219

220220
class ContainerPath(IntEnum):
@@ -239,7 +239,7 @@ def serialize(self) -> bytes:
239239
payload += self.serialize_field(0x00, self.version)
240240
payload += self.serialize_field(0x01, self.id)
241241
payload += self.serialize_field(0x02, self.key.serialize())
242-
return payload
242+
return bytes(payload)
243243

244244

245245
class Value(TlvSerializable):
@@ -281,7 +281,7 @@ def serialize(self) -> bytes:
281281
payload += self.serialize_field(0x05, self.constant)
282282
if self.map_ref is not None:
283283
payload += self.serialize_field(0x06, self.map_ref.serialize())
284-
return payload
284+
return bytes(payload)
285285

286286

287287
class FieldParam(TlvSerializable):
@@ -301,7 +301,7 @@ def serialize(self) -> bytes:
301301
payload = bytearray()
302302
payload += self.serialize_field(0x00, self.version)
303303
payload += self.serialize_field(0x01, self.value.serialize())
304-
return payload
304+
return bytes(payload)
305305

306306

307307
class ParamAmount(FieldParam):
@@ -317,7 +317,7 @@ def serialize(self) -> bytes:
317317
payload = bytearray()
318318
payload += self.serialize_field(0x00, self.version)
319319
payload += self.serialize_field(0x01, self.value.serialize())
320-
return payload
320+
return bytes(payload)
321321

322322

323323
class ParamTokenAmount(FieldParam):
@@ -356,7 +356,7 @@ def serialize(self) -> bytes:
356356
payload += self.serialize_field(0x04, self.threshold)
357357
if self.above_threshold_msg is not None:
358358
payload += self.serialize_field(0x05, self.above_threshold_msg)
359-
return payload
359+
return bytes(payload)
360360

361361

362362
class ParamNFT(FieldParam):
@@ -375,7 +375,7 @@ def serialize(self) -> bytes:
375375
payload += self.serialize_field(0x00, self.version)
376376
payload += self.serialize_field(0x01, self.id.serialize())
377377
payload += self.serialize_field(0x02, self.collection.serialize())
378-
return payload
378+
return bytes(payload)
379379

380380

381381
class DatetimeType(IntEnum):
@@ -399,7 +399,7 @@ def serialize(self) -> bytes:
399399
payload += self.serialize_field(0x00, self.version)
400400
payload += self.serialize_field(0x01, self.value.serialize())
401401
payload += self.serialize_field(0x02, self.dt_type)
402-
return payload
402+
return bytes(payload)
403403

404404

405405
class ParamDuration(FieldParam):
@@ -415,7 +415,7 @@ def serialize(self) -> bytes:
415415
payload = bytearray()
416416
payload += self.serialize_field(0x00, self.version)
417417
payload += self.serialize_field(0x01, self.value.serialize())
418-
return payload
418+
return bytes(payload)
419419

420420

421421
class ParamUnit(FieldParam):
@@ -447,7 +447,7 @@ def serialize(self) -> bytes:
447447
payload += self.serialize_field(0x03, self.decimals)
448448
if self.prefix is not None:
449449
payload += self.serialize_field(0x04, self.prefix)
450-
return payload
450+
return bytes(payload)
451451

452452

453453
class TrustedNameValueType(IntEnum):
@@ -495,7 +495,7 @@ def serialize(self) -> bytes:
495495
payload += self.serialize_field(0x04, addr)
496496
if self.value_type is not None:
497497
payload += self.serialize_field(0x05, self.value_type)
498-
return payload
498+
return bytes(payload)
499499

500500

501501
class ParamEnum(FieldParam):
@@ -514,7 +514,7 @@ def serialize(self) -> bytes:
514514
payload += self.serialize_field(0x00, self.version)
515515
payload += self.serialize_field(0x01, self.id)
516516
payload += self.serialize_field(0x02, self.value.serialize())
517-
return payload
517+
return bytes(payload)
518518

519519

520520
class ParamCalldata(FieldParam):
@@ -556,7 +556,7 @@ def serialize(self) -> bytes:
556556
payload += self.serialize_field(0x05, self.amount.serialize())
557557
if self.spender is not None:
558558
payload += self.serialize_field(0x06, self.spender.serialize())
559-
return payload
559+
return bytes(payload)
560560

561561

562562
class ParamToken(FieldParam):
@@ -577,7 +577,7 @@ def serialize(self) -> bytes:
577577
if self.native_currency is not None:
578578
for nat_cur in self.native_currency:
579579
payload += self.serialize_field(0x02, nat_cur)
580-
return payload
580+
return bytes(payload)
581581

582582

583583
class ParamNetwork(FieldParam):
@@ -593,7 +593,7 @@ def serialize(self) -> bytes:
593593
payload = bytearray()
594594
payload += self.serialize_field(0x00, self.version)
595595
payload += self.serialize_field(0x01, self.value.serialize())
596-
return payload
596+
return bytes(payload)
597597

598598

599599
class FieldTag(IntEnum):
@@ -652,7 +652,7 @@ def serialize(self) -> bytes:
652652
payload += self.serialize_field(FieldTag.CONSTRAINT, constraint)
653653
if self.separator is not None:
654654
payload += self.serialize_field(FieldTag.SEPARATOR, self.separator)
655-
return payload
655+
return bytes(payload)
656656

657657

658658
class ParamGroup(FieldParam):
@@ -676,4 +676,4 @@ def serialize(self) -> bytes:
676676
payload += self.serialize_field(0x01, self.iteration_type)
677677
for field in self.fields:
678678
payload += self.serialize_field(0x02, field.serialize())
679-
return payload
679+
return bytes(payload)

client/src/ledger_app_clients/ethereum/map_entry.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,6 @@ def serialize(self) -> bytes:
5454
payload += self.serialize_field(Tag.VALUE, self.value)
5555
sig = self.signature
5656
if sig is None:
57-
sig = CALLDATA_PARTNER.sign(payload)
57+
sig = CALLDATA_PARTNER.sign(bytes(payload))
5858
payload += self.serialize_field(Tag.SIGNATURE, sig)
59-
return payload
59+
return bytes(payload)

client/src/ledger_app_clients/ethereum/proxy_info.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,6 @@ def serialize(self) -> bytes:
6060
payload += self.serialize_field(Tag.DELEGATION_TYPE, self.delegation_type)
6161
sig = self.signature
6262
if sig is None:
63-
sig = TRUSTED_NAME_PARTNER.sign(payload)
63+
sig = TRUSTED_NAME_PARTNER.sign(bytes(payload))
6464
payload += self.serialize_field(Tag.SIGNATURE, sig)
65-
return payload
65+
return bytes(payload)

client/src/ledger_app_clients/ethereum/tlv.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def serialize_field(tag: int, value: Union[int, str, bytes, bytearray]) -> bytes
5454
tlv += TlvSerializable.der_encode(tag)
5555
tlv += TlvSerializable.der_encode(len(value))
5656
tlv += value
57-
return tlv
57+
return bytes(tlv)
5858

5959

6060
def format_tlv(tag: int, value: Union[int, str, bytes, bytearray]) -> bytes:

0 commit comments

Comments
 (0)