EIP712 Filtering count checking

This commit is contained in:
Alexandre Paillier
2022-08-19 18:31:00 +02:00
parent 93b0bb08f7
commit ed479128fd
12 changed files with 139 additions and 67 deletions

View File

@@ -192,7 +192,7 @@ def send_struct_impl_field(value, field):
if filtering_paths:
path = ".".join(current_path)
if path in filtering_paths.keys():
send_filtering_field_name(filtering_paths[path])
send_filtering_show_field(filtering_paths[path])
app_client.eip712_send_struct_impl_struct_field(data)
@@ -242,37 +242,38 @@ def send_struct_impl(structs, data, structname):
return True
# ledgerjs doesn't actually sign anything, and instead uses already pre-computed signatures
def send_filtering_contract_name(display_name: str):
def send_filtering_message_info(display_name: str, filters_count: int):
global sig_ctx
msg = bytearray()
msg.append(183)
msg += sig_ctx["chainid"]
msg += sig_ctx["caddr"]
msg += sig_ctx["schema_hash"]
to_sign = bytearray()
to_sign.append(183)
to_sign += sig_ctx["chainid"]
to_sign += sig_ctx["caddr"]
to_sign += sig_ctx["schema_hash"]
to_sign.append(filters_count)
for char in display_name:
msg.append(ord(char))
to_sign.append(ord(char))
sig = sig_ctx["key"].sign_deterministic(msg, sigencode=sigencode_der)
app_client.eip712_filtering_send_contract_name(display_name, sig)
sig = sig_ctx["key"].sign_deterministic(to_sign, sigencode=sigencode_der)
app_client.eip712_filtering_message_info(display_name, filters_count, sig)
# ledgerjs doesn't actually sign anything, and instead uses already pre-computed signatures
def send_filtering_field_name(display_name):
def send_filtering_show_field(display_name):
global sig_ctx
path_str = ".".join(current_path)
msg = bytearray()
msg.append(72)
msg += sig_ctx["chainid"]
msg += sig_ctx["caddr"]
msg += sig_ctx["schema_hash"]
to_sign = bytearray()
to_sign.append(72)
to_sign += sig_ctx["chainid"]
to_sign += sig_ctx["caddr"]
to_sign += sig_ctx["schema_hash"]
for char in path_str:
msg.append(ord(char))
to_sign.append(ord(char))
for char in display_name:
msg.append(ord(char))
sig = sig_ctx["key"].sign_deterministic(msg, sigencode=sigencode_der)
app_client.eip712_filtering_send_field_name(display_name, sig)
to_sign.append(ord(char))
sig = sig_ctx["key"].sign_deterministic(to_sign, sigencode=sigencode_der)
app_client.eip712_filtering_show_field(display_name, sig)
def read_filtering_file(domain, message, filtering_file_path):
data_json = None
@@ -349,9 +350,9 @@ def process_file(aclient: EthereumClient, input_file_path: str, filtering_file_p
if filtering_file_path:
if filtr and "name" in filtr:
send_filtering_contract_name(filtr["name"])
send_filtering_message_info(filtr["name"], len(filtering_paths))
else:
send_filtering_contract_name(domain["name"])
send_filtering_message_info(domain["name"], len(filtering_paths))
# send message implementation
app_client.eip712_send_struct_impl_root_struct(message_typename)

View File

@@ -144,13 +144,13 @@ class EthereumClient:
self._eip712_filtering = True
assert self._recv().status == 0x9000
def eip712_filtering_send_contract_name(self, name: str, sig: bytes):
with self._send(self._cmd_builder.eip712_filtering_send_contract_name(name, sig)):
def eip712_filtering_message_info(self, name: str, filters_count: int, sig: bytes):
with self._send(self._cmd_builder.eip712_filtering_message_info(name, filters_count, sig)):
self._enable_click_until_response()
self._disable_click_until_response()
assert self._recv().status == 0x9000
def eip712_filtering_send_field_name(self, name: str, sig: bytes):
with self._send(self._cmd_builder.eip712_filtering_send_field_name(name, sig)):
def eip712_filtering_show_field(self, name: str, sig: bytes):
with self._send(self._cmd_builder.eip712_filtering_show_field(name, sig)):
pass
assert self._recv().status == 0x9000

View File

@@ -151,13 +151,19 @@ class EthereumCmdBuilder:
data += sig
return data
def eip712_filtering_send_contract_name(self, name: str, sig: bytes) -> bytes:
def eip712_filtering_message_info(self, name: str, filters_count: int, sig: bytes) -> bytes:
data = bytearray()
data.append(len(name))
data += self._string_to_bytes(name)
data.append(filters_count)
data.append(len(sig))
data += sig
return self._serialize(InsType.EIP712_SEND_FILTERING,
P1Type.COMPLETE_SEND,
P2Type.FILTERING_CONTRACT_NAME,
self._eip712_filtering_send_name(name, sig))
data)
def eip712_filtering_send_field_name(self, name: str, sig: bytes) -> bytes:
def eip712_filtering_show_field(self, name: str, sig: bytes) -> bytes:
return self._serialize(InsType.EIP712_SEND_FILTERING,
P1Type.COMPLETE_SEND,
P2Type.FILTERING_FIELD_NAME,