|
1 | | -import struct |
2 | 1 | from enum import IntEnum |
3 | 2 | from typing import Optional |
4 | 3 | import rlp |
|
11 | 10 | from .command_builder import CommandBuilder |
12 | 11 | from .eip712 import EIP712FieldType |
13 | 12 | from .keychain import sign_data, Key |
14 | | -from .tlv import format_tlv, FieldTag |
15 | 13 | from .response_parser import pk_addr |
16 | 14 | from .tx_simu import TxSimu |
17 | 15 | from .tx_auth_7702 import TxAuth7702 |
|
20 | 18 | from .dynamic_networks import DynamicNetwork |
21 | 19 | from .safe import SafeAccount, AccountType |
22 | 20 | from .gating import Gating |
23 | | - |
24 | | - |
25 | | -class TrustedNameType(IntEnum): |
26 | | - ACCOUNT = 0x01 |
27 | | - CONTRACT = 0x02 |
28 | | - NFT = 0x03 |
29 | | - TOKEN = 0x04 |
30 | | - WALLET = 0x05 |
31 | | - CONTEXT_ADDRESS = 0x06 |
32 | | - |
33 | | - |
34 | | -class TrustedNameSource(IntEnum): |
35 | | - LAB = 0x00 |
36 | | - CAL = 0x01 |
37 | | - ENS = 0x02 |
38 | | - UD = 0x03 |
39 | | - FN = 0x04 |
40 | | - DNS = 0x05 |
41 | | - DYN_RESOLVER = 0x06 |
42 | | - MULTISIG_ADDRESS_BOOK = 0x07 |
| 21 | +from .trusted_name import TrustedName, TrustedNameSource |
43 | 22 |
|
44 | 23 |
|
45 | 24 | class EIP712CalldataParamPresence(IntEnum): |
@@ -281,58 +260,15 @@ def perform_privacy_operation(self, |
281 | 260 | bip32_path, |
282 | 261 | pubkey)) |
283 | 262 |
|
284 | | - def _provide_trusted_name_common(self, payload: bytes, name_source: TrustedNameSource) -> RAPDU: |
285 | | - payload += format_tlv(FieldTag.STRUCT_TYPE, 3) # TrustedName |
286 | | - if name_source == TrustedNameSource.CAL: |
287 | | - key_id = 9 |
288 | | - key = Key.CAL |
289 | | - else: |
290 | | - key_id = 7 |
291 | | - key = Key.TRUSTED_NAME |
292 | | - |
293 | | - self.pki_client.send_certificate(PKIPubKeyUsage.PUBKEY_USAGE_TRUSTED_NAME, name_source == TrustedNameSource.CAL) |
| 263 | + def provide_trusted_name(self, trusted_name: TrustedName) -> RAPDU: |
| 264 | + self.pki_client.send_certificate(PKIPubKeyUsage.PUBKEY_USAGE_TRUSTED_NAME, |
| 265 | + trusted_name.tn_source == TrustedNameSource.CAL) |
294 | 266 |
|
295 | | - payload += format_tlv(FieldTag.SIGNER_KEY_ID, key_id) # test key |
296 | | - payload += format_tlv(FieldTag.SIGNER_ALGO, 1) # secp256k1 |
297 | | - payload += format_tlv(FieldTag.DER_SIGNATURE, |
298 | | - sign_data(key, payload)) |
299 | | - chunks = self._cmd_builder.provide_trusted_name(payload) |
| 267 | + chunks = self._cmd_builder.provide_trusted_name(trusted_name.serialize()) |
300 | 268 | for chunk in chunks[:-1]: |
301 | 269 | self._exchange(chunk) |
302 | 270 | return self._exchange(chunks[-1]) |
303 | 271 |
|
304 | | - def provide_trusted_name_v1(self, addr: bytes, name: str, challenge: int) -> RAPDU: |
305 | | - payload = format_tlv(FieldTag.STRUCT_VERSION, 1) |
306 | | - payload += format_tlv(FieldTag.CHALLENGE, challenge) |
307 | | - payload += format_tlv(FieldTag.COIN_TYPE, 0x3c) # ETH in slip-44 |
308 | | - payload += format_tlv(FieldTag.TRUSTED_NAME, name) |
309 | | - payload += format_tlv(FieldTag.ADDRESS, addr) |
310 | | - return self._provide_trusted_name_common(payload, TrustedNameSource.ENS) |
311 | | - |
312 | | - def provide_trusted_name_v2(self, |
313 | | - addr: bytes, |
314 | | - name: str, |
315 | | - name_type: TrustedNameType, |
316 | | - name_source: TrustedNameSource, |
317 | | - chain_id: int, |
318 | | - nft_id: Optional[int] = None, |
319 | | - challenge: Optional[int] = None, |
320 | | - not_valid_after: Optional[tuple[int, int, int]] = None) -> RAPDU: |
321 | | - payload = format_tlv(FieldTag.STRUCT_VERSION, 2) |
322 | | - payload += format_tlv(FieldTag.TRUSTED_NAME, name) |
323 | | - payload += format_tlv(FieldTag.ADDRESS, addr) |
324 | | - payload += format_tlv(FieldTag.TRUSTED_NAME_TYPE, name_type) |
325 | | - payload += format_tlv(FieldTag.TRUSTED_NAME_SOURCE, name_source) |
326 | | - payload += format_tlv(FieldTag.CHAIN_ID, chain_id) |
327 | | - if nft_id is not None: |
328 | | - payload += format_tlv(FieldTag.TRUSTED_NAME_NFT_ID, nft_id) |
329 | | - if challenge is not None: |
330 | | - payload += format_tlv(FieldTag.CHALLENGE, challenge) |
331 | | - if not_valid_after is not None: |
332 | | - assert len(not_valid_after) == 3 |
333 | | - payload += format_tlv(FieldTag.NOT_VALID_AFTER, struct.pack("BBB", *not_valid_after)) |
334 | | - return self._provide_trusted_name_common(payload, name_source) |
335 | | - |
336 | 272 | def set_plugin(self, |
337 | 273 | plugin_name: str, |
338 | 274 | contract_addr: bytes, |
|
0 commit comments