Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions client/src/ledger_app_clients/ethereum/command_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from typing import Optional
from ragger.bip import pack_derivation_path

from .eip712 import EIP712FieldType
from .eip712.struct import EIP712FieldType, EIP712TypeDescOffset


class InsType(IntEnum):
Expand Down Expand Up @@ -70,6 +70,9 @@ class P2Type(IntEnum):
FILTERING_RAW = 0xff
NETWORK_CONFIG = 0x00
NETWORK_ICON = 0x01
SIGN_PROCESS_START = 0x00
SIGN_STORE = 0x01
SIGN_START = 0x02


class CommandBuilder:
Expand Down Expand Up @@ -113,9 +116,9 @@ def eip712_send_struct_def_struct_field(self,
key_name: str) -> bytes:
data = bytearray()
typedesc = 0
typedesc |= (len(array_levels) > 0) << 7
typedesc |= (type_size is not None) << 6
typedesc |= field_type
typedesc |= (len(array_levels) > 0) << EIP712TypeDescOffset.ARRAY
typedesc |= (type_size is not None) << EIP712TypeDescOffset.SIZE
typedesc |= field_type << EIP712TypeDescOffset.TYPE
data.append(typedesc)
if field_type == EIP712FieldType.CUSTOM:
data.append(len(type_name))
Expand Down
12 changes: 12 additions & 0 deletions client/src/ledger_app_clients/ethereum/eip712/struct.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,18 @@
from enum import IntEnum, auto


class EIP712TypeDescOffset(IntEnum):
ARRAY = 7
SIZE = 6
TYPE = 0


class EIP712TypeDescMask(IntEnum):
ARRAY = (0b1 << EIP712TypeDescOffset.ARRAY)
SIZE = (0b1 << EIP712TypeDescOffset.SIZE)
TYPE = (0b1111 << EIP712TypeDescOffset.TYPE)


class EIP712FieldType(IntEnum):
CUSTOM = 0
INT = auto()
Expand Down
53 changes: 37 additions & 16 deletions client/src/ledger_app_clients/ethereum/gcs.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,20 @@
from .client import TrustedNameType, TrustedNameSource


class TxInfoTag(IntEnum):
VERSION = 0x00
CHAIN_ID = 0x01
CONTRACT_ADDR = 0x02
SELECTOR = 0x03
FIELDS_HASH = 0x04
OPERATION_TYPE = 0x05
CREATOR_NAME = 0x06
CREATOR_LEGAL_NAME = 0x07
CREATOR_URL = 0x08
CONTRACT_NAME = 0x09
DEPLOY_DATE = 0x0a
SIGNATURE = 0xff

class TxInfo(TlvSerializable):
version: int
chain_id: int
Expand Down Expand Up @@ -49,26 +63,26 @@ def __init__(self,

def serialize(self) -> bytes:
payload = bytearray()
payload += self.serialize_field(0x00, self.version)
payload += self.serialize_field(0x01, self.chain_id)
payload += self.serialize_field(0x02, self.contract_addr)
payload += self.serialize_field(0x03, self.selector)
payload += self.serialize_field(0x04, self.fields_hash)
payload += self.serialize_field(0x05, self.operation_type)
payload += self.serialize_field(TxInfoTag.VERSION, self.version)
payload += self.serialize_field(TxInfoTag.CHAIN_ID, self.chain_id)
payload += self.serialize_field(TxInfoTag.CONTRACT_ADDR, self.contract_addr)
payload += self.serialize_field(TxInfoTag.SELECTOR, self.selector)
payload += self.serialize_field(TxInfoTag.FIELDS_HASH, self.fields_hash)
payload += self.serialize_field(TxInfoTag.OPERATION_TYPE, self.operation_type)
if self.creator_name is not None:
payload += self.serialize_field(0x06, self.creator_name)
payload += self.serialize_field(TxInfoTag.CREATOR_NAME, self.creator_name)
if self.creator_legal_name is not None:
payload += self.serialize_field(0x07, self.creator_legal_name)
payload += self.serialize_field(TxInfoTag.CREATOR_LEGAL_NAME, self.creator_legal_name)
if self.creator_url is not None:
payload += self.serialize_field(0x08, self.creator_url)
payload += self.serialize_field(TxInfoTag.CREATOR_URL, self.creator_url)
if self.contract_name is not None:
payload += self.serialize_field(0x09, self.contract_name)
payload += self.serialize_field(TxInfoTag.CONTRACT_NAME, self.contract_name)
if self.deploy_date is not None:
payload += self.serialize_field(0x0a, self.deploy_date)
payload += self.serialize_field(TxInfoTag.DEPLOY_DATE, self.deploy_date)
signature = self.signature
if signature is None:
signature = sign_data(Key.CALLDATA, payload)
payload += self.serialize_field(0xff, signature)
payload += self.serialize_field(TxInfoTag.SIGNATURE, signature)
return payload


Expand Down Expand Up @@ -529,6 +543,13 @@ def serialize(self) -> bytes:
return payload


class FieldTag(IntEnum):
VERSION = 0x00
NAME = 0x01
PARAM_TYPE = 0x02
PARAM = 0x03


class Field(TlvSerializable):
version: int
name: str
Expand All @@ -541,8 +562,8 @@ def __init__(self, version: int, name: str, param: FieldParam):

def serialize(self) -> bytes:
payload = bytearray()
payload += self.serialize_field(0x00, self.version)
payload += self.serialize_field(0x01, self.name)
payload += self.serialize_field(0x02, self.param.type)
payload += self.serialize_field(0x03, self.param.serialize())
payload += self.serialize_field(FieldTag.VERSION, self.version)
payload += self.serialize_field(FieldTag.NAME, self.name)
payload += self.serialize_field(FieldTag.PARAM_TYPE, self.param.type)
payload += self.serialize_field(FieldTag.PARAM, self.param.serialize())
return payload
3 changes: 3 additions & 0 deletions client/src/ledger_app_clients/ethereum/tlv.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ class FieldTag(IntEnum):
TICKER = 0x24
TX_HASH = 0x27
DOMAIN_HASH = 0x28
SELECTOR = 0x41
IMPL_ADDRESS = 0x42
DELEGATION_TYPE = 0x43
BLOCKCHAIN_FAMILY = 0x51
NETWORK_NAME = 0x52
NETWORK_ICON_HASH = 0x53
Expand Down
Loading
Loading