From 0ba963cf021f670ebb0d56130e7f000933edf923 Mon Sep 17 00:00:00 2001 From: Coline Date: Mon, 4 Jul 2022 12:40:14 +0200 Subject: [PATCH] feat: eip712 tests --- .../speculos/ethereum_client/ethereum_cmd.py | 25 ++- .../ethereum_client/ethereum_cmd_builder.py | 37 +++- tests/speculos/ethereum_client/transaction.py | 13 +- .../nanos/sign_eip_712_hashed_msg/00000.png | Bin 0 -> 414 bytes .../nanos/sign_eip_712_hashed_msg/00001.png | Bin 0 -> 503 bytes .../nanos/sign_eip_712_hashed_msg/00002.png | Bin 0 -> 497 bytes .../nanos/sign_eip_712_hashed_msg/00003.png | Bin 0 -> 485 bytes .../nanos/sign_eip_712_hashed_msg/00004.png | Bin 0 -> 486 bytes .../nanos/sign_eip_712_hashed_msg/00005.png | Bin 0 -> 540 bytes .../nanos/sign_eip_712_hashed_msg/00006.png | Bin 0 -> 520 bytes .../nanos/sign_eip_712_hashed_msg/00007.png | Bin 0 -> 517 bytes .../nanos/sign_eip_712_hashed_msg/00008.png | Bin 0 -> 501 bytes .../nanos/sign_eip_712_hashed_msg/00009.png | Bin 0 -> 407 bytes .../sign_eip_712_hashed_msg_reject/00000.png | Bin 0 -> 414 bytes .../sign_eip_712_hashed_msg_reject/00001.png | Bin 0 -> 503 bytes .../sign_eip_712_hashed_msg_reject/00002.png | Bin 0 -> 497 bytes .../sign_eip_712_hashed_msg_reject/00003.png | Bin 0 -> 485 bytes .../sign_eip_712_hashed_msg_reject/00004.png | Bin 0 -> 486 bytes .../sign_eip_712_hashed_msg_reject/00005.png | Bin 0 -> 540 bytes .../sign_eip_712_hashed_msg_reject/00006.png | Bin 0 -> 520 bytes .../sign_eip_712_hashed_msg_reject/00007.png | Bin 0 -> 517 bytes .../sign_eip_712_hashed_msg_reject/00008.png | Bin 0 -> 501 bytes .../sign_eip_712_hashed_msg_reject/00009.png | Bin 0 -> 407 bytes .../sign_eip_712_hashed_msg_reject/00010.png | Bin 0 -> 449 bytes .../nanox/sign_eip_712_hashed_msg/00000.png | Bin 0 -> 473 bytes .../nanox/sign_eip_712_hashed_msg/00001.png | Bin 0 -> 890 bytes .../nanox/sign_eip_712_hashed_msg/00002.png | Bin 0 -> 551 bytes .../nanox/sign_eip_712_hashed_msg/00003.png | Bin 0 -> 919 bytes .../nanox/sign_eip_712_hashed_msg/00004.png | Bin 0 -> 562 bytes .../nanox/sign_eip_712_hashed_msg/00005.png | Bin 0 -> 463 bytes .../sign_eip_712_hashed_msg_reject/00000.png | Bin 0 -> 473 bytes .../sign_eip_712_hashed_msg_reject/00001.png | Bin 0 -> 890 bytes .../sign_eip_712_hashed_msg_reject/00002.png | Bin 0 -> 551 bytes .../sign_eip_712_hashed_msg_reject/00003.png | Bin 0 -> 919 bytes .../sign_eip_712_hashed_msg_reject/00004.png | Bin 0 -> 562 bytes .../sign_eip_712_hashed_msg_reject/00005.png | Bin 0 -> 463 bytes .../sign_eip_712_hashed_msg_reject/00006.png | Bin 0 -> 499 bytes .../sign_eip_712_hashed_msg_reject/00009.png | Bin 0 -> 499 bytes tests/speculos/test_eip712.py | 179 ++++++++++++++++++ 39 files changed, 251 insertions(+), 3 deletions(-) create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00000.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00001.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00002.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00003.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00004.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00005.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00006.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00007.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00008.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00009.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00000.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00001.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00002.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00003.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00004.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00005.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00006.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00007.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00008.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00009.png create mode 100644 tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00010.png create mode 100644 tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00000.png create mode 100644 tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00001.png create mode 100644 tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00002.png create mode 100644 tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00003.png create mode 100644 tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00004.png create mode 100644 tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00005.png create mode 100644 tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00000.png create mode 100644 tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00001.png create mode 100644 tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00002.png create mode 100644 tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00003.png create mode 100644 tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00004.png create mode 100644 tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00005.png create mode 100644 tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00006.png create mode 100644 tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00009.png create mode 100644 tests/speculos/test_eip712.py diff --git a/tests/speculos/ethereum_client/ethereum_cmd.py b/tests/speculos/ethereum_client/ethereum_cmd.py index 5aa0eeb..0d05a3d 100644 --- a/tests/speculos/ethereum_client/ethereum_cmd.py +++ b/tests/speculos/ethereum_client/ethereum_cmd.py @@ -7,7 +7,7 @@ from speculos.client import SpeculosClient, ApduException from ethereum_client.ethereum_cmd_builder import EthereumCommandBuilder, InsType from ethereum_client.exception import DeviceException -from ethereum_client.transaction import PersonalTransaction, Transaction +from ethereum_client.transaction import EIP712, PersonalTransaction, Transaction from ethereum_client.plugin import ERC20_Information, Plugin from ethereum_client.utils import parse_sign_response @@ -173,6 +173,29 @@ class EthereumCommand: result.append(v) result.append(r) result.append(s) + + + @contextmanager + def sign_eip712(self, bip32_path: str, transaction: EIP712, result: List = list()) -> None: + try: + chunk: bytes = self.builder.sign_eip712(bip32_path=bip32_path, transaction=transaction) + + with self.client.apdu_exchange_nowait(cla=chunk[0], ins=chunk[1], + p1=chunk[2], p2=chunk[3], + data=chunk[5:]) as exchange: + yield exchange + response: bytes = exchange.receive() + + except ApduException as error: + raise DeviceException(error_code=error.sw, ins=InsType.INS_SIGN_EIP712) + + # response = V (1) || R (32) || S (32) + assert len(response) == 65 + v, r, s = parse_sign_response(response) + + result.append(v) + result.append(r) + result.append(s) @contextmanager diff --git a/tests/speculos/ethereum_client/ethereum_cmd_builder.py b/tests/speculos/ethereum_client/ethereum_cmd_builder.py index c5213d9..e6c0be3 100644 --- a/tests/speculos/ethereum_client/ethereum_cmd_builder.py +++ b/tests/speculos/ethereum_client/ethereum_cmd_builder.py @@ -3,7 +3,7 @@ import logging import struct from typing import List, Tuple, Union, Iterator, cast -from ethereum_client.transaction import PersonalTransaction, Transaction +from ethereum_client.transaction import EIP712, PersonalTransaction, Transaction from ethereum_client.plugin import ERC20_Information, Plugin from ethereum_client.utils import bip32_path_from_string @@ -320,6 +320,41 @@ class EthereumCommandBuilder: p2=0x00, cdata=cdata) + def sign_eip712(self, bip32_path: str, transaction: EIP712) -> bytes: + """Command builder for INS_SIGN_EIP712. + + Parameters + ---------- + bip32_path : str + String representation of BIP32 path. + transaction : EIP712 + Domain hash -> 32 bytes + Message hash -> 32 bytes + + Yields + ------- + bytes + APDU command chunk for INS_SIGN_EIP712. + + """ + bip32_paths: List[bytes] = bip32_path_from_string(bip32_path) + + cdata: bytes = b"".join([ + len(bip32_paths).to_bytes(1, byteorder="big"), + *bip32_paths + ]) + + + tx: bytes = transaction.serialize() + + cdata = cdata + tx + + return self.serialize(cla=self.CLA, + ins=InsType.INS_SIGN_EIP712, + p1=0x00, + p2=0x00, + cdata=cdata) + def simple_personal_sign_tx(self, bip32_path: str, transaction: PersonalTransaction) -> bytes: """Command builder for INS_SIGN_PERSONAL_TX. diff --git a/tests/speculos/ethereum_client/transaction.py b/tests/speculos/ethereum_client/transaction.py index 08ff529..178ffea 100644 --- a/tests/speculos/ethereum_client/transaction.py +++ b/tests/speculos/ethereum_client/transaction.py @@ -1,6 +1,6 @@ from typing import Union -from ethereum_client.utils import write_varint, UINT64_MAX +from ethereum_client.utils import apdu_as_string, write_varint, UINT64_MAX class TransactionError(Exception): @@ -83,3 +83,14 @@ class Transaction: self.chainID, ]) + +class EIP712: + def __init__(self, domain_hash: str, msg_hash: str) -> None: + self.domain_hash = apdu_as_string(domain_hash) + self.msg_hash = apdu_as_string(msg_hash) + + def serialize(self) -> bytes: + return b"".join([ + self.domain_hash, + self.msg_hash + ]) \ No newline at end of file diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00000.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..910bc4302f985d6662a4ac1db98ae5a445448805 GIT binary patch literal 414 zcmV;P0b%}$P)u4+VS)XAz z7Crj%499dp+qfp9k&{t8C`IMLs_o?&YT5+_fmV{1F#|D+T2QrB5CMGAAF~-IQrE`RCD6UAJkc(3Z3 z-4ZhCGcbmT=y+Wo%zxe_QB|1cQ8%H|&5Xqt4Zw)grqfn#CHJZcbiKsRR@s^})VX*3TB~*$~wY%QDK;dN- zm|s@B8#~!vir6#zGW(rx=>eT;E=^h-p#Zp?!QbP#eo%7M!c(*S%;3^LI$EY+@{4zX zdVcZ@##d-JP?a>ktE61vKyA|~!d8U>psprqlWf7a@VZZ)oYiLx01yBq;WQazRc84K tK0-}OofoRjSuUhIUKB-96h-mB_yOQsc3o##6a@eP002ovPDHLkV1i2B?dkvk literal 0 HcmV?d00001 diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00002.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..f6dba7ed9b6f8bdd30d46afd1677f219427da355 GIT binary patch literal 497 zcmVv+0TG6AYY)lMhid!P-X4C4AoNfrtNq0JIY)!P@gQGN2{aUNNG<_=Jo zgDbRD?&@Q-V6!s&*s^E*bFAJ0y{uh9RuIP)d);u@iO1IyPW!k%E9WM><(~s-1`*HR z$^|gDhEDH*J>(qlX~xF2YIMIshZ(2;3=?A)!t%kEg?%NxcuUF=N4qZhHk6P>X6jwxMfiwY*<~2Ak+IyU4>=x zi%D(E3-7=$VWyVLd}@-PqvBBF8@fKzeZXhae+MQ2lWibbf0CCa02DI$_YC=1vV>wpNNF9)?gao=mKB0WpP|-&G_9wh n+N!q4W5B{72!bF8f*_?o0MLRs4Y#xq00000NkvXXu0mjf4ir+MMJ=2hlYc?&PJGj%6gdK-9x5eCk|aqCJRcvQaOHtwrctezGL3Hu zcLmAtqeN%`d1UdC8GtSa zv61Q$SD&VrNmf3O;TEJZ#2%0646qWrf>3QOrA)wdbY={}-wLHRu6v|ygSPr}MVMQP z_>`Z{fIZY0M1{H6<5oKx0Q7`}XRK9~A8Jz;=hFuX-V`+E#Kic_vHl%6ZPyGJWPaKE zWlI1!u^;#TP7qh8_cxOpg>>^}liIkmrO<^VapvgoVeD{yq@DtAnR6!0 zTveGu&4w?`eEJru&ZDU#iA7CDY|ex?Ur>thv#e0F0qIQ`=F~uY`(5DzY7f*D13YEt zsFJlpl@tKDbHR80sCpqxSh)4;=_gDDtbHGfMbsf7)|Bif7;8aP82l(TqX%Zc=kkky zI!Hw{VpGof=haYCVG@P))4rqF*dc(dex|Tl1^z@;L zxoONX`84a5M|LNgjZ&AsubsV;s(M#cf-cG;bq7Sr{dS}vo)y+|gYAc(bcr#xJ^2W! zr5%q^Hy`6milH3N`WPR#?tnEMKJdHQlVaqhAwv#ePssj^jf$E_3dg2CrjwjjP6$)0 z&-BNT^5UitW5Cy1pH?|Q8}rT9UkqbvSbs6_!JQxq-O1U=8`B+4q&#Jr(%2WXnw(mi zNL&SptdzW8v}qYr-Yiu~{RFW94dTMYb z*EqoW0&G$-%$T%=wr1(l&;gYANJ1tjeROPKRZ>6_3YqWoPn*gIE~%=gv%_g900000 c03afwKVmX<>Pl4N%K!iX07*qoM6N<$f>`0`tqGtQt0v(i z`~V+iyIqP#Yv1C-&^^moV~mI^S3uj+&ZhR!=&Ngr!Ok$Bc$p${B>DpCx|0sEmYM|0 z2lhxP^GIcH*u8W&@#m9EKO}zFCd?A0o;SDG^oce$8c?f$%!Ww^p)EcLJpYOg<3Q$`I1hu(Gw-Gu#S9tWI;D~{k76ypLI%f-DL@*Njcp*FN@ zyMBjW0F2ze8e~sB%d@gwtHY{nZOLzL`I8CC>YgPi#H1BqFE4uw(O#z4qAh-&2r9Y< zlq%o@_kgxSsi1GF0l_HZ7z&X`Ou6=d^+v}~%NZ_q43*Pd`pGORKEouoAO8XA3MxsG eBuSDaY4`#8e3F_{{>Byn0000=e`v(y|E`A!W5~ zsLd`?QtqnPzSzCmxW-4*)T%Ffw)Z8@40dWfWPEwy$7jTT0%&P)?b-+6{CN|9&VU)( zgGYN$at>B<_bl{m{=Vdmd8`zhqyi2I(TTT^FF$%JX6;b>UR|l|qt}|)PIZa#ZLmWy zp@fB05n?5hkToS;+jT9HZZRiTm{QshCY^-41&Kt!b`oY!lCusCQj8bFELwCe5<5~6 z3{|(J6cj;o4?*U1YBuSDa59AjikFDtedUtdH0000< KMNUMnLSTaNM(3>n literal 0 HcmV?d00001 diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00007.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..61bcb2d482cdda0d8b70853675f5118dfd2c39cd GIT binary patch literal 517 zcmV+g0{Z=lP)T-;VkG-L=#_thd6qbg)M^+*!m1fDF}if2vD{)ZEM4FWH8ffm8ZF1 zys&L?hVA95W05b-d>Y< z2WN716}mT{gS-fjwFRPWC%Y$Y<;Qo$q90PxI6=|^Yo0arbrZ4M@i>+_+M*CYbs-kA zdookH#r0$%L~{-sFWm0k|d#cJ2cd_&Fqe7KZPCkIPr6qy- z=Wtk1=8=&{FIY==LviHh))JuY;}N|BAoYRuH{H-0y1rBmjDJHL$oP1KK7jsR#Jq%y zlCpXq8Pi2e$L?_VA(40aPibmZQ7@-nq9kNeBZxTlIG&!A0g{SUur6Hty@vL?G2rU% zeZdzbpTSBlorP}C@0+}V)AoB9wrjNEumrSQK!*yIY4T`O3|X{jj9RE45>V#2jS;(} z3tzB&C&xH7)KIc}O}1J_HqDB5^k-GNlhw{|MQB|k=;nGdTUfTL7z?jKQ}U*-D5hsS zlu~TB6V2q<6y!=ZECiuDV0IC8oe%Z6H|@ zz8wshkB{~MB4`H0-uM*3M1j}m%A!300N{kCpu~9KJs1LQ1E{7`qHO>OJQ#XfRy9Bv z^==(ieYk597RD@{OEdS6GT+Lmuf_h$vek1^KVM4p7nbmHWt7bot=9>X{;(33tDmYc z&D9U$Wf)T#sV`+WTVz^Qo=ISYs`0?ozXTD=g%{*$&h`n6Q%*!K%L9vjA?<}S_3O~y z51_40w#ON-)XL64x@JligSXK^F9>U5TpZCDR;l1-dd45KJ?)^knt8<|^tT^?&`+$? zRq8>0Bcb3GkI=CJNF3=@I3K*Rlqo0JRixhcTL&d5MMji-{W*PXyu+hM-x=UTI}_BI zGx^;Gypw%}(Vkv=s~wl1InZ7QJjtlNRl_ihQog8p&yJp0VZ8tV002ovPDHLkV1iJ- Bw$=au literal 0 HcmV?d00001 diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00000.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..910bc4302f985d6662a4ac1db98ae5a445448805 GIT binary patch literal 414 zcmV;P0b%}$P)u4+VS)XAz z7Crj%499dp+qfp9k&{t8C`IMLs_o?&YT5+_fmV{1F#|D+T2QrB5CMGAAF~-IQrE`RCD6UAJkc(3Z3 z-4ZhCGcbmT=y+Wo%zxe_QB|1cQ8%H|&5Xqt4Zw)grqfn#CHJZcbiKsRR@s^})VX*3TB~*$~wY%QDK;dN- zm|s@B8#~!vir6#zGW(rx=>eT;E=^h-p#Zp?!QbP#eo%7M!c(*S%;3^LI$EY+@{4zX zdVcZ@##d-JP?a>ktE61vKyA|~!d8U>psprqlWf7a@VZZ)oYiLx01yBq;WQazRc84K tK0-}OofoRjSuUhIUKB-96h-mB_yOQsc3o##6a@eP002ovPDHLkV1i2B?dkvk literal 0 HcmV?d00001 diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00002.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..f6dba7ed9b6f8bdd30d46afd1677f219427da355 GIT binary patch literal 497 zcmVv+0TG6AYY)lMhid!P-X4C4AoNfrtNq0JIY)!P@gQGN2{aUNNG<_=Jo zgDbRD?&@Q-V6!s&*s^E*bFAJ0y{uh9RuIP)d);u@iO1IyPW!k%E9WM><(~s-1`*HR z$^|gDhEDH*J>(qlX~xF2YIMIshZ(2;3=?A)!t%kEg?%NxcuUF=N4qZhHk6P>X6jwxMfiwY*<~2Ak+IyU4>=x zi%D(E3-7=$VWyVLd}@-PqvBBF8@fKzeZXhae+MQ2lWibbf0CCa02DI$_YC=1vV>wpNNF9)?gao=mKB0WpP|-&G_9wh n+N!q4W5B{72!bF8f*_?o0MLRs4Y#xq00000NkvXXu0mjf4ir+MMJ=2hlYc?&PJGj%6gdK-9x5eCk|aqCJRcvQaOHtwrctezGL3Hu zcLmAtqeN%`d1UdC8GtSa zv61Q$SD&VrNmf3O;TEJZ#2%0646qWrf>3QOrA)wdbY={}-wLHRu6v|ygSPr}MVMQP z_>`Z{fIZY0M1{H6<5oKx0Q7`}XRK9~A8Jz;=hFuX-V`+E#Kic_vHl%6ZPyGJWPaKE zWlI1!u^;#TP7qh8_cxOpg>>^}liIkmrO<^VapvgoVeD{yq@DtAnR6!0 zTveGu&4w?`eEJru&ZDU#iA7CDY|ex?Ur>thv#e0F0qIQ`=F~uY`(5DzY7f*D13YEt zsFJlpl@tKDbHR80sCpqxSh)4;=_gDDtbHGfMbsf7)|Bif7;8aP82l(TqX%Zc=kkky zI!Hw{VpGof=haYCVG@P))4rqF*dc(dex|Tl1^z@;L zxoONX`84a5M|LNgjZ&AsubsV;s(M#cf-cG;bq7Sr{dS}vo)y+|gYAc(bcr#xJ^2W! zr5%q^Hy`6milH3N`WPR#?tnEMKJdHQlVaqhAwv#ePssj^jf$E_3dg2CrjwjjP6$)0 z&-BNT^5UitW5Cy1pH?|Q8}rT9UkqbvSbs6_!JQxq-O1U=8`B+4q&#Jr(%2WXnw(mi zNL&SptdzW8v}qYr-Yiu~{RFW94dTMYb z*EqoW0&G$-%$T%=wr1(l&;gYANJ1tjeROPKRZ>6_3YqWoPn*gIE~%=gv%_g900000 c03afwKVmX<>Pl4N%K!iX07*qoM6N<$f>`0`tqGtQt0v(i z`~V+iyIqP#Yv1C-&^^moV~mI^S3uj+&ZhR!=&Ngr!Ok$Bc$p${B>DpCx|0sEmYM|0 z2lhxP^GIcH*u8W&@#m9EKO}zFCd?A0o;SDG^oce$8c?f$%!Ww^p)EcLJpYOg<3Q$`I1hu(Gw-Gu#S9tWI;D~{k76ypLI%f-DL@*Njcp*FN@ zyMBjW0F2ze8e~sB%d@gwtHY{nZOLzL`I8CC>YgPi#H1BqFE4uw(O#z4qAh-&2r9Y< zlq%o@_kgxSsi1GF0l_HZ7z&X`Ou6=d^+v}~%NZ_q43*Pd`pGORKEouoAO8XA3MxsG eBuSDaY4`#8e3F_{{>Byn0000=e`v(y|E`A!W5~ zsLd`?QtqnPzSzCmxW-4*)T%Ffw)Z8@40dWfWPEwy$7jTT0%&P)?b-+6{CN|9&VU)( zgGYN$at>B<_bl{m{=Vdmd8`zhqyi2I(TTT^FF$%JX6;b>UR|l|qt}|)PIZa#ZLmWy zp@fB05n?5hkToS;+jT9HZZRiTm{QshCY^-41&Kt!b`oY!lCusCQj8bFELwCe5<5~6 z3{|(J6cj;o4?*U1YBuSDa59AjikFDtedUtdH0000< KMNUMnLSTaNM(3>n literal 0 HcmV?d00001 diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00007.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..61bcb2d482cdda0d8b70853675f5118dfd2c39cd GIT binary patch literal 517 zcmV+g0{Z=lP)T-;VkG-L=#_thd6qbg)M^+*!m1fDF}if2vD{)ZEM4FWH8ffm8ZF1 zys&L?hVA95W05b-d>Y< z2WN716}mT{gS-fjwFRPWC%Y$Y<;Qo$q90PxI6=|^Yo0arbrZ4M@i>+_+M*CYbs-kA zdookH#r0$%L~{-sFWm0k|d#cJ2cd_&Fqe7KZPCkIPr6qy- z=Wtk1=8=&{FIY==LviHh))JuY;}N|BAoYRuH{H-0y1rBmjDJHL$oP1KK7jsR#Jq%y zlCpXq8Pi2e$L?_VA(40aPibmZQ7@-nq9kNeBZxTlIG&!A0g{SUur6Hty@vL?G2rU% zeZdzbpTSBlorP}C@0+}V)AoB9wrjNEumrSQK!*yIY4T`O3|X{jj9RE45>V#2jS;(} z3tzB&C&xH7)KIc}O}1J_HqDB5^k-GNlhw{|MQB|k=;nGdTUfTL7z?jKQ}U*-D5hsS zlu~TB6V2q<6y!=ZECiuDV0IC8oe%Z6H|@ zz8wshkB{~MB4`H0-uM*3M1j}m%A!300N{kCpu~9KJs1LQ1E{7`qHO>OJQ#XfRy9Bv z^==(ieYk597RD@{OEdS6GT+Lmuf_h$vek1^KVM4p7nbmHWt7bot=9>X{;(33tDmYc z&D9U$Wf)T#sV`+WTVz^Qo=ISYs`0?ozXTD=g%{*$&h`n6Q%*!K%L9vjA?<}S_3O~y z51_40w#ON-)XL64x@JligSXK^F9>U5TpZCDR;l1-dd45KJ?)^knt8<|^tT^?&`+$? zRq8>0Bcb3GkI=CJNF3=@I3K*Rlqo0JRixhcTL&d5MMji-{W*PXyu+hM-x=UTI}_BI zGx^;Gypw%}(Vkv=s~wl1InZ7QJjtlNRl_ihQog8p&yJp0VZ8tV002ovPDHLkV1iJ- Bw$=au literal 0 HcmV?d00001 diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00010.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..d55782f429e629a5ae929916914befa14613edba GIT binary patch literal 449 zcmV;y0Y3hTP)9Z)nZ zoKdfPKxBZtOD`O!Ud7)^nCSVm48R~fHVz_gJJ3!JB$;A z73W%!0pdWH0?92?e|oM4;Hw|T=q9}++yIP#$#j!m5^exS zz+}2fFX=r8JdElH5Z(1#dLzJ@d7d#T0RR9zkLvC@{o4-b#&d>V@Olw{Qhp=JC*hP* ze&(v$CdMdHq04bD8(yuPe6}+mUxbB+j@Sq&JG)G;>8tv_Of9IF`aC{V8pehyFamrk zsn2Y*0u8Xun9W@KS20j;W!56I20WGIe?vDCyM6$`aiZIsFI~S2dUn1pckwRBmM6XP%`s%YvTHqZ3lwXSA8(yvzTEo$z)$(N682X1xVDy4{PzgV-)>~P%m z(SxSeRT|*hab4YQn?v%8>M*os9$Wn$H1mutMdS&3k#ezJft*eqW4tHkAtS*5@x-oX zb|Lk%2&YUpGG7h%y~aaI0W0RR910Dz=F-WV#{$lGiw P00000NkvXXu0mjfFUZz( literal 0 HcmV?d00001 diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00001.png b/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd24f466fe52dfc942c6d5aca57bdad6509f6e9 GIT binary patch literal 890 zcmV-=1BLvFP)ds)(R(hY{{DZg>k-qO%^72WeehE92Xlo`<3n99tbg(x-N zjnG3J3}lG1iZsx*;zk3X+DYtL*EI`EZkOp9pb2gSnN3;c^~L4iFX>#yed@UtjA*~K zHX~=3hus;VTS6AW^5rY`x%13O{cJifm;tl&hznPI&!@TU6teGgcK~z}k3UEUYDe01 zwc~$!09tE$t-NMtVz)26B|V?*3naGmndFtocB_`V4`u(hsJ*d1k^KRvii8kC$PWin zLy@hO7D-Yi$5d>z{ggZzc=Ia8WK@VfcgBCE7%|?rItD!%Ly_8y``gwN3}8l=G~-Y(k1v5zGJd$?taD~j00e1 zEnRTlHo;w4)laYqb5R<4Va8n51+P{z>X&nuwTzG9=Q3=~iAs_K2og979})f}Hrh5>M$2eZW})IW~SE-N$DQKp?W>`x$Vv4vUYG@g64MaZM+L`+`>jvg3836MO zxS;{>K))QTZhgUJ{r|{`&6c}B2qAV!Z07*qoM6N<$f(GESasU7T literal 0 HcmV?d00001 diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00002.png b/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..542bf198f2d1726f2b6c25b14faaca2dd4abf9d4 GIT binary patch literal 551 zcmV+?0@(eDP)`RX{%FPwMEDN_@@!ElcMb(>p-oL_zD#_L1|=VF$}_Bgb{hz2&UvzE7tz z#O@A|(?l|0diwHpCVn$iRXh3j9rCpO}a&o#jo$wk~(K7q4qI-*z%b-nZmGk`flVvGwmrS%4Hv007{R zGtmvTP#Zz@?(ht0ot3PXq|=m@hj2Nmda|80KDQmTg<2Z>^>R1pHxd1jptkNptx_U3 zt8cN%C9Q~$J%fCpVF~T%U~4ycK6G-z@PCr!NmVo2qrR2O)|6)w+@8MJ^7ao7%Kn5k zojP)93d;FIW{unv1&m~3|%nD$&ZIo$yq_CCRV2e zJl+Y~3gKbxYnkeov&&`Zz`b;lZoqUh-oFjS)p-AASc4}a3q8re$*jSp;9dX#00000 p000000000000000004l?_yy@L2YBj25G()y002ovPDHLkV1mNa1PuTH literal 0 HcmV?d00001 diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00003.png b/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..ae1ff79c12d58646d82b061190f89175a0784760 GIT binary patch literal 919 zcmV;I18Dq-P)_`Nv1IZJX(CH0lU= ziy1B`Y{o!3*Q?m`>;=X|#c=ix=reEjT!b}RwlA9M-dF}Vp{p>?bz#siuNDIcxWnE7 zCfzkyAYsNl(?nQ{i7JQbC*hpB14fUg_idp0gWfG-Q47p&h$aA@b2IHMBu*_ zZ=WaR#toczracodlas?@nF%m^&fg85rsU;iPZ#Q!^p7LLC6cGL^kgt`p6OKb8F0voFMI|}N!E;!beKkNL(Rpax0w3g@8OPBI!toMb;E6_j$Fqn zS_CnhNo@aoFFVyK5t7XdSM<-r9poDQ+c1W@M*n7N4xXg4(31p%Tyt5z|!oNFWwy>TN!cT(&0~44h-17Qs+Kz?N2||r<>Qet5Zo{X1&ejdfOxbae z_o<5-YL!*?;cyvB^eX&Q;F0003~DFZ*#R<@%9x)-2C* z>A5GyeYce24!m_DhRfFWeM9#@p+++)QLeQ1vCY`NTFTENTck zZ=FQ;wD!mq=JM$dsM9WvywlWL@*io4d)vnDVtggyd~9rtOC5O(L-R#+2Z&U^#?Bbm znyV?^h5J@S)vViYOBtVp2%#O&x)WXJhNK6*TDnEuA&#Nz!a#E_rkyyES8lkSNI_bH z7P0e>O_!QMjy*unHSz)sWM<)2tPPTdO`H#vq9`w;H> zkN0cn-$f^My!Nv%?A!`{Y#)3y+VA~v)kb8;d7un^S8cOf?WZSUm*7z_c+f50|2I-| zOl|KoTuWSorX-?m0q({h+i1-U=Wd>fC|Qz%T&ad7!pa@6`{v-#5(}_!`LFy2OkEeh zh23iVGSr<(v0T$u#B3Sr7LLZ9{;@LD7;o}$n!Rgnz7#dcME@8i<1<)ust$A*~1i00000005j&Ypu2Jj^YWw zy90QoT&ZuaQvl6=DP?aYPf1pQ*$k63`;x8zO;>}w*_U($&=hOZQ)gd9es%|NhM$F! zW?$0X0Zo_gyxGq!-I5;w002`g?B41@dShn48j^qcKMg+SRb@~2kiDXt9?G(zZ_&4C zhfSe&Es>ja8l-41$VME{IyOzQ?Ue@1yRzZ^H{)W~!1tfC>juYNH#BJt?4%T&zcu@I zbg0WXI2uYRp~7D9ao)DXaZq_zsB{W|%4eW}Iz^4!e zUu_N6PY6z&;*%m4K>3kw6W0ds>@{hh*=q9}++yIP#$#j!m5^exS zz+}2fFX=r8JdElH5Z(1#dLzJ@d7d#T0RR9zkLvC@{o4-b#&d>V@Olw{Qhp=JC*hP* ze&(v$CdMdHq04bD8(yuPe6}+mUxbB+j@Sq&JG)G;>8tv_Of9IF`aC{V8pehyFamrk zsn2Y*0u8Xun9W@KS20j;W!56I20WGIe?vDCyM6$`aiZIsFI~S2dUn1pckwRBmM6XP%`s%YvTHqZ3lwXSA8(yvzTEo$z)$(N682X1xVDy4{PzgV-)>~P%m z(SxSeRT|*hab4YQn?v%8>M*os9$Wn$H1mutMdS&3k#ezJft*eqW4tHkAtS*5@x-oX zb|Lk%2&YUpGG7h%y~aaI0W0RR910Dz=F-WV#{$lGiw P00000NkvXXu0mjfFUZz( literal 0 HcmV?d00001 diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00001.png b/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd24f466fe52dfc942c6d5aca57bdad6509f6e9 GIT binary patch literal 890 zcmV-=1BLvFP)ds)(R(hY{{DZg>k-qO%^72WeehE92Xlo`<3n99tbg(x-N zjnG3J3}lG1iZsx*;zk3X+DYtL*EI`EZkOp9pb2gSnN3;c^~L4iFX>#yed@UtjA*~K zHX~=3hus;VTS6AW^5rY`x%13O{cJifm;tl&hznPI&!@TU6teGgcK~z}k3UEUYDe01 zwc~$!09tE$t-NMtVz)26B|V?*3naGmndFtocB_`V4`u(hsJ*d1k^KRvii8kC$PWin zLy@hO7D-Yi$5d>z{ggZzc=Ia8WK@VfcgBCE7%|?rItD!%Ly_8y``gwN3}8l=G~-Y(k1v5zGJd$?taD~j00e1 zEnRTlHo;w4)laYqb5R<4Va8n51+P{z>X&nuwTzG9=Q3=~iAs_K2og979})f}Hrh5>M$2eZW})IW~SE-N$DQKp?W>`x$Vv4vUYG@g64MaZM+L`+`>jvg3836MO zxS;{>K))QTZhgUJ{r|{`&6c}B2qAV!Z07*qoM6N<$f(GESasU7T literal 0 HcmV?d00001 diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00002.png b/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..542bf198f2d1726f2b6c25b14faaca2dd4abf9d4 GIT binary patch literal 551 zcmV+?0@(eDP)`RX{%FPwMEDN_@@!ElcMb(>p-oL_zD#_L1|=VF$}_Bgb{hz2&UvzE7tz z#O@A|(?l|0diwHpCVn$iRXh3j9rCpO}a&o#jo$wk~(K7q4qI-*z%b-nZmGk`flVvGwmrS%4Hv007{R zGtmvTP#Zz@?(ht0ot3PXq|=m@hj2Nmda|80KDQmTg<2Z>^>R1pHxd1jptkNptx_U3 zt8cN%C9Q~$J%fCpVF~T%U~4ycK6G-z@PCr!NmVo2qrR2O)|6)w+@8MJ^7ao7%Kn5k zojP)93d;FIW{unv1&m~3|%nD$&ZIo$yq_CCRV2e zJl+Y~3gKbxYnkeov&&`Zz`b;lZoqUh-oFjS)p-AASc4}a3q8re$*jSp;9dX#00000 p000000000000000004l?_yy@L2YBj25G()y002ovPDHLkV1mNa1PuTH literal 0 HcmV?d00001 diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00003.png b/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..ae1ff79c12d58646d82b061190f89175a0784760 GIT binary patch literal 919 zcmV;I18Dq-P)_`Nv1IZJX(CH0lU= ziy1B`Y{o!3*Q?m`>;=X|#c=ix=reEjT!b}RwlA9M-dF}Vp{p>?bz#siuNDIcxWnE7 zCfzkyAYsNl(?nQ{i7JQbC*hpB14fUg_idp0gWfG-Q47p&h$aA@b2IHMBu*_ zZ=WaR#toczracodlas?@nF%m^&fg85rsU;iPZ#Q!^p7LLC6cGL^kgt`p6OKb8F0voFMI|}N!E;!beKkNL(Rpax0w3g@8OPBI!toMb;E6_j$Fqn zS_CnhNo@aoFFVyK5t7XdSM<-r9poDQ+c1W@M*n7N4xXg4(31p%Tyt5z|!oNFWwy>TN!cT(&0~44h-17Qs+Kz?N2||r<>Qet5Zo{X1&ejdfOxbae z_o<5-YL!*?;cyvB^eX&Q;F0003~DFZ*#R<@%9x)-2C* z>A5GyeYce24!m_DhRfFWeM9#@p+++)QLeQ1vCY`NTFTENTck zZ=FQ;wD!mq=JM$dsM9WvywlWL@*io4d)vnDVtggyd~9rtOC5O(L-R#+2Z&U^#?Bbm znyV?^h5J@S)vViYOBtVp2%#O&x)WXJhNK6*TDnEuA&#Nz!a#E_rkyyES8lkSNI_bH z7P0e>O_!QMjy*unHSz)sWM<)2tPPTdO`H#vq9`w;H> zkN0cn-$f^My!Nv%?A!`{Y#)3y+VA~v)kb8;d7un^S8cOf?WZSUm*7z_c+f50|2I-| zOl|KoTuWSorX-?m0q({h+i1-U=Wd>fC|Qz%T&ad7!pa@6`{v-#5(}_!`LFy2OkEeh zh23iVGSr<(v0T$u#B3Sr7LLZ9{;@LD7;o}$n!Rgnz7#dcME@8i<1<)ust$A*~1i00000005j&Ypu2Jj^YWw zy90QoT&ZuaQvl6=DP?aYPf1pQ*$k63`;x8zO;>}w*_U($&=hOZQ)gd9es%|NhM$F! zW?$0X0Zo_gyxGq!-I5;w002`g?B41@dShn48j^qcKMg+SRb@~2kiDXt9?G(zZ_&4C zhfSe&Es>ja8l-41$VME{IyOzQ?Ue@1yRzZ^H{)W~!1tfC>juYNH#BJt?4%T&zcu@I zbg0WXI2uYRp~7D9ao)DXaZq_zsB{W|%4eW}Iz^4!e zUu_N6PY6z&;*%m4K>3kw6W0ds>@{hh*gX9g;)ZTl>^=ArgX9g;)ZTl>^=Ar