From 0e3c0f9263e9339e454fff5d1d9698f743c85344 Mon Sep 17 00:00:00 2001 From: BTChip github Date: Sat, 18 Jan 2020 12:47:53 +0100 Subject: [PATCH] * Add Artis, Dexon, EWC, Thundercore, Volta, Webchain * Switch to Flow API for Nano S 1.6.0 * Add extra U2F timeout guards for Windows * Review application flow and parameters checks * Refactor signature padding --- Makefile | 81 +++++-- artis_sigma1.png | Bin 0 -> 6103 bytes artis_tau1.png | Bin 0 -> 5369 bytes blue_app_artis_sigma1.gif | Bin 0 -> 671 bytes blue_app_artis_tau1.gif | Bin 0 -> 663 bytes blue_app_dexon.gif | Bin 0 -> 1684 bytes blue_app_ewc.gif | Bin 0 -> 1773 bytes blue_app_thundercore.gif | Bin 0 -> 557 bytes blue_app_volta.gif | Bin 0 -> 1773 bytes blue_app_webchain.gif | Bin 0 -> 1554 bytes blue_badge_thundercore.gif | Bin 0 -> 271 bytes dexon.png | Bin 0 -> 1723 bytes ewc.png | Bin 0 -> 2923 bytes glyphs/blue_badge_dexon.gif | Bin 0 -> 823 bytes glyphs/blue_badge_thundercore.gif | Bin 0 -> 271 bytes glyphs/blue_badge_webchain.gif | Bin 0 -> 791 bytes glyphs/icon_back_x.gif | Bin 0 -> 1123 bytes glyphs/icon_dashboard_x.gif | Bin 0 -> 1126 bytes glyphs/nanos_badge_artis_sigma1.gif | Bin 0 -> 118 bytes glyphs/nanos_badge_artis_tau1.gif | Bin 0 -> 117 bytes glyphs/nanos_badge_dexon.gif | Bin 0 -> 1217 bytes glyphs/nanos_badge_thundercore.gif | Bin 0 -> 87 bytes glyphs/nanos_badge_webchain.gif | Bin 0 -> 68 bytes nanos_app_artis_sigma1.gif | Bin 0 -> 73 bytes nanos_app_artis_tau1.gif | Bin 0 -> 71 bytes nanos_app_dexon.gif | Bin 0 -> 75 bytes nanos_app_ewc.gif | Bin 0 -> 1131 bytes nanos_app_thundercore.gif | Bin 0 -> 87 bytes nanos_app_volta.gif | Bin 0 -> 1131 bytes nanos_app_webchain.gif | Bin 0 -> 61 bytes nanox_app_artis_sigma1.gif | Bin 0 -> 71 bytes nanox_app_artis_tau1.gif | Bin 0 -> 69 bytes nanox_app_dexon.gif | Bin 0 -> 72 bytes nanox_app_ewc.gif | Bin 0 -> 61 bytes nanox_app_thundercore.gif | Bin 0 -> 92 bytes nanox_app_volta.gif | Bin 0 -> 61 bytes nanox_app_webchain.gif | Bin 0 -> 58 bytes src/chainConfig.h | 9 +- src/main.c | 331 ++++++++++++++++++++++------ src/tokens.c | 14 ++ src/tokens.h | 16 +- thundercore.png | Bin 0 -> 2504 bytes volta.png | Bin 0 -> 2923 bytes webchain.png | Bin 0 -> 4239 bytes 44 files changed, 363 insertions(+), 88 deletions(-) create mode 100644 artis_sigma1.png create mode 100644 artis_tau1.png create mode 100644 blue_app_artis_sigma1.gif create mode 100644 blue_app_artis_tau1.gif create mode 100644 blue_app_dexon.gif create mode 100644 blue_app_ewc.gif create mode 100644 blue_app_thundercore.gif create mode 100644 blue_app_volta.gif create mode 100644 blue_app_webchain.gif create mode 100644 blue_badge_thundercore.gif create mode 100644 dexon.png create mode 100644 ewc.png create mode 100644 glyphs/blue_badge_dexon.gif create mode 100644 glyphs/blue_badge_thundercore.gif create mode 100644 glyphs/blue_badge_webchain.gif create mode 100644 glyphs/icon_back_x.gif create mode 100644 glyphs/icon_dashboard_x.gif create mode 100644 glyphs/nanos_badge_artis_sigma1.gif create mode 100644 glyphs/nanos_badge_artis_tau1.gif create mode 100644 glyphs/nanos_badge_dexon.gif create mode 100644 glyphs/nanos_badge_thundercore.gif create mode 100644 glyphs/nanos_badge_webchain.gif create mode 100644 nanos_app_artis_sigma1.gif create mode 100644 nanos_app_artis_tau1.gif create mode 100644 nanos_app_dexon.gif create mode 100644 nanos_app_ewc.gif create mode 100644 nanos_app_thundercore.gif create mode 100644 nanos_app_volta.gif create mode 100644 nanos_app_webchain.gif create mode 100644 nanox_app_artis_sigma1.gif create mode 100644 nanox_app_artis_tau1.gif create mode 100644 nanox_app_dexon.gif create mode 100644 nanox_app_ewc.gif create mode 100644 nanox_app_thundercore.gif create mode 100644 nanox_app_volta.gif create mode 100644 nanox_app_webchain.gif create mode 100644 thundercore.png create mode 100644 volta.png create mode 100644 webchain.png diff --git a/Makefile b/Makefile index 765e685..10112a2 100755 --- a/Makefile +++ b/Makefile @@ -24,10 +24,12 @@ DEFINES_LIB = USE_LIB_ETHEREUM APP_LOAD_PARAMS= --curve secp256k1 $(COMMON_LOAD_PARAMS) # Allow the app to use path 45 for multi-sig (see BIP45). APP_LOAD_PARAMS += --path "45'" +# Samsung temporary implementation for wallet ID on 0xda7aba5e/0xc1a551c5 +APP_LOAD_PARAMS += --path "1517992542'/1101353413'" APPVERSION_M=1 APPVERSION_N=2 -APPVERSION_P=3 +APPVERSION_P=13 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) APP_LOAD_FLAGS= --appFlags 0x240 --dep Ethereum:$(APPVERSION) @@ -71,6 +73,14 @@ else ifeq ($(CHAIN),poa) APP_LOAD_PARAMS += --path "44'/60'" DEFINES += CHAINID_UPCASE=\"POA\" CHAINID_COINNAME=\"POA\" CHAIN_KIND=CHAIN_KIND_POA CHAIN_ID=99 APPNAME = "POA" +else ifeq ($(CHAIN),artis_sigma1) +APP_LOAD_PARAMS += --path "44'/246529'" +DEFINES += CHAINID_UPCASE=\"ARTISSIGMA1\" CHAINID_COINNAME=\"ATS\" CHAIN_KIND=CHAIN_KIND_ARTIS_SIGMA1 CHAIN_ID=246529 +APPNAME = "ARTIS sigma1" +else ifeq ($(CHAIN),artis_tau1) +APP_LOAD_PARAMS += --path "44'/246785'" +DEFINES += CHAINID_UPCASE=\"ARTISTAU1\" CHAINID_COINNAME=\"ATS\" CHAIN_KIND=CHAIN_KIND_ARTIS_TAU1 CHAIN_ID=246785 +APPNAME = "ARTIS tau1" else ifeq ($(CHAIN),rsk) APP_LOAD_PARAMS += --path "44'/137'" --path "44'/00'" DEFINES += CHAINID_UPCASE=\"RSK\" CHAINID_COINNAME=\"RBTC\" CHAIN_KIND=CHAIN_KIND_RSK CHAIN_ID=30 @@ -135,9 +145,29 @@ else ifeq ($(CHAIN),tobalaba) APP_LOAD_PARAMS += --path "44'/401697'" DEFINES += CHAINID_UPCASE=\"TOBALABA\" CHAINID_COINNAME=\"TOBALABA\" CHAIN_KIND=CHAIN_KIND_TOBALABA CHAIN_ID=401697 APPNAME = "Tobalaba" +else ifeq ($(CHAIN),webchain) +APP_LOAD_PARAMS += --path "44'/227'" +DEFINES += CHAINID_UPCASE=\"WEBCHAIN\" CHAINID_COINNAME=\"WEB\" CHAIN_KIND=CHAIN_KIND_WEBCHAIN CHAIN_ID=24484 +APPNAME = "Webchain" +else ifeq ($(CHAIN),dexon) +APP_LOAD_PARAMS += --path "44'/237'" +DEFINES += CHAINID_UPCASE=\"DEXON\" CHAINID_COINNAME=\"DXN\" CHAIN_KIND=CHAIN_KIND_DEXON CHAIN_ID=237 +APPNAME = "DEXON" +else ifeq ($(CHAIN),volta) +APP_LOAD_PARAMS += --path "44'/73799'" --path "44'/60'" +DEFINES += CHAINID_UPCASE=\"VOLTA\" CHAINID_COINNAME=\"VOLTA\" CHAIN_KIND=CHAIN_KIND_VOLTA CHAIN_ID=73799 +APPNAME = "Volta" +else ifeq ($(CHAIN),ewc) +APP_LOAD_PARAMS += --path "44'/246'" --path "44'/60'" +DEFINES += CHAINID_UPCASE=\"EWC\" CHAINID_COINNAME=\"EWC\" CHAIN_KIND=CHAIN_KIND_EWC CHAIN_ID=246 +APPNAME = "EnergyWebChain" +else ifeq ($(CHAIN),thundercore) +APP_LOAD_PARAMS += --path "44'/1001'" +DEFINES += CHAINID_UPCASE=\"THUNDERCORE\" CHAINID_COINNAME=\"TT\" CHAIN_KIND=CHAIN_KIND_THUNDERCORE CHAIN_ID=108 +APPNAME = "ThunderCore" else ifeq ($(filter clean,$(MAKECMDGOALS)),) -$(error Unsupported CHAIN - use ethereum, ethereum_classic, expanse, poa, rsk, rsk_testnet, ubiq, wanchain, kusd, musicoin, pirl, akroma, atheios, callisto, ethersocial, ellaism, ether1, ethergem, gochain, mix, reosc, hpb, tomochain, tobalaba) +$(error Unsupported CHAIN - use ethereum, ethereum_classic, expanse, poa, artis_sigma1, artis_tau1, rsk, rsk_testnet, ubiq, wanchain, kusd, musicoin, pirl, akroma, atheios, callisto, ethersocial, ellaism, ether1, ethergem, gochain, mix, reosc, hpb, tomochain, tobalaba, dexon, volta, ewc, webchain, thundercore) endif endif @@ -164,10 +194,8 @@ all: default # Platform # ############ -DEFINES += OS_IO_SEPROXYHAL IO_SEPROXYHAL_BUFFER_SIZE_B=128 +DEFINES += OS_IO_SEPROXYHAL DEFINES += HAVE_BAGL HAVE_SPRINTF -#DEFINES += HAVE_PRINTF PRINTF=screen_printf -DEFINES += PRINTF\(...\)= DEFINES += HAVE_IO_USB HAVE_L4_USBLIB IO_USB_MAX_ENDPOINTS=6 IO_HID_EP_LENGTH=64 HAVE_USB_APDU DEFINES += LEDGER_MAJOR_VERSION=$(APPVERSION_M) LEDGER_MINOR_VERSION=$(APPVERSION_N) LEDGER_PATCH_VERSION=$(APPVERSION_P) @@ -176,32 +204,47 @@ DEFINES += HAVE_U2F HAVE_IO_U2F DEFINES += U2F_PROXY_MAGIC=\"w0w\" DEFINES += USB_SEGMENT_SIZE=64 DEFINES += BLE_SEGMENT_SIZE=32 #max MTU, min 20 - -WEBUSB_URL = www.ledgerwallet.com -DEFINES += HAVE_WEBUSB WEBUSB_URL_SIZE_B=$(shell echo -n $(WEBUSB_URL) | wc -c) WEBUSB_URL=$(shell echo -n $(WEBUSB_URL) | sed -e "s/./\\\'\0\\\',/g") - DEFINES += UNUSED\(x\)=\(void\)x DEFINES += APPVERSION=\"$(APPVERSION)\" -DEFINES += CX_COMPLIANCE_141 +#WEBUSB_URL = www.ledgerwallet.com +#DEFINES += HAVE_WEBUSB WEBUSB_URL_SIZE_B=$(shell echo -n $(WEBUSB_URL) | wc -c) WEBUSB_URL=$(shell echo -n $(WEBUSB_URL) | sed -e "s/./\\\'\0\\\',/g") + +DEFINES += HAVE_WEBUSB WEBUSB_URL_SIZE_B=0 WEBUSB_URL="" ifeq ($(TARGET_NAME),TARGET_NANOX) +DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=300 DEFINES += HAVE_BLE BLE_COMMAND_TIMEOUT_MS=2000 DEFINES += HAVE_BLE_APDU # basic ledger apdu transport over BLE -DEFINES += HAVE_GLO096 HAVE_UX_LEGACY +DEFINES += HAVE_GLO096 DEFINES += HAVE_BAGL BAGL_WIDTH=128 BAGL_HEIGHT=64 DEFINES += HAVE_BAGL_ELLIPSIS # long label truncation feature DEFINES += HAVE_BAGL_FONT_OPEN_SANS_REGULAR_11PX DEFINES += HAVE_BAGL_FONT_OPEN_SANS_EXTRABOLD_11PX DEFINES += HAVE_BAGL_FONT_OPEN_SANS_LIGHT_16PX +DEFINES += HAVE_UX_FLOW +else +DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=128 +endif + +# Enabling debug PRINTF +DEBUG = 0 +ifneq ($(DEBUG),0) +ifeq ($(TARGET_NAME),TARGET_NANOX) +DEFINES += HAVE_PRINTF PRINTF=mcu_usb_printf +else +DEFINES += HAVE_PRINTF PRINTF=screen_printf +endif +else +DEFINES += PRINTF\(...\)= endif ifneq ($(NOCONSENT),) DEFINES += NO_CONSENT endif -DEFINES += HAVE_TOKENS_LIST # Do not activate external ERC-20 support yet +#DEFINES += HAVE_TOKENS_LIST # Do not activate external ERC-20 support yet ############## # Compiler # @@ -242,6 +285,18 @@ SDK_SOURCE_PATH += lib_blewbxx lib_blewbxx_impl SDK_SOURCE_PATH += lib_ux endif +# If the SDK supports Flow for Nano S, build for it + +ifeq ($(TARGET_NAME),TARGET_NANOS) + + ifneq "$(wildcard $(BOLOS_SDK)/lib_ux/src/ux_flow_engine.c)" "" + SDK_SOURCE_PATH += lib_ux + DEFINES += HAVE_UX_FLOW + DEFINES += HAVE_WALLET_ID_SDK + endif + +endif + load: all python -m ledgerblue.loadApp $(APP_LOAD_PARAMS) @@ -255,4 +310,4 @@ include $(BOLOS_SDK)/Makefile.rules dep/%.d: %.c Makefile listvariants: - @echo VARIANTS CHAIN ethereum ethereum_classic expanse poa rsk rsk_testnet ubiq wanchain kusd pirl akroma atheios callisto ethersocial ether1 gochain musicoin ethergem mix ellaism reosc hpb tomochain tobalaba + @echo VARIANTS CHAIN ethereum ethereum_classic expanse poa artis_sigma1 artis_tau1 rsk rsk_testnet ubiq wanchain kusd pirl akroma atheios callisto ethersocial ether1 gochain musicoin ethergem mix ellaism reosc hpb tomochain tobalaba dexon volta ewc webchain thundercore diff --git a/artis_sigma1.png b/artis_sigma1.png new file mode 100644 index 0000000000000000000000000000000000000000..f6b47b129dc3584859e9dd56768d275710eab8c4 GIT binary patch literal 6103 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 VNAn&gkE2iTM*60D<+`rqe*ocal!E{O literal 0 HcmV?d00001 diff --git a/artis_tau1.png b/artis_tau1.png new file mode 100644 index 0000000000000000000000000000000000000000..388009a32d42982f0f02677609b0dbc300be0fcf GIT binary patch literal 5369 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 literal 0 HcmV?d00001 diff --git a/blue_app_artis_sigma1.gif b/blue_app_artis_sigma1.gif new file mode 100644 index 0000000000000000000000000000000000000000..8c47bf3a5f35ab5715398014cd9fe1dd8924feb4 GIT binary patch literal 671 zcmV;Q0$}||Nk%w1VKM+R0J8u9Q=)PI|Nr#)_TTR0UZ{HN^X;C?uYS3eX|98*(YTbw zro!IMbF+-p=-jl{!HK_}A^8LV00000EC2ui05SkF000F4Fvv;6aO!}~yZ49U3{`0c zg@Jr*%OXZ`mV)8lcxMQ+G!VHUjzBssgh<@NG)OvK#fbp;tab>ziOt$!91e*D6=#?f zlHNyn(TGxxL0Mqyao#lgAEUaOVBkf3Vh8t_1#d^ z(*gx|%{1Hl!Q?<~1r}uSVW75U39DI%$Psa3K}HM`xJmwiK%~$cMg;L_FMw761QaMQ zaoz)o#vcTaL_pw+fdqCMET;gUL#Med6ody%WeqHlz)&pkq0}xF3}RpcUpObkLI4JM zKz~*ACKeY@>_i!dR!n9dh)&GH5O^eVa8M65r0Bv914@trhE>3DSd2bkP#O{;jDSZ3 F06Pi}3$FkG literal 0 HcmV?d00001 diff --git a/blue_app_artis_tau1.gif b/blue_app_artis_tau1.gif new file mode 100644 index 0000000000000000000000000000000000000000..3dfdf062922c427f49839229332de7541357eb9a GIT binary patch literal 663 zcmV;I0%-k5Nk%w1VKM+R0J8u9|MvO$exLsC^8V%Q`NV1>NRyZ1!F3{`15 z0&;w8%N~eumH^`3c!vP9Gz7UIEo%LYZUhVzhfF`mO9(xfT@y3JPHvU|9+U6B;-N7D^IRECg}_j9HR67dMU$ zJO&;M3XysZ6AC#PHwF$01QLD+OA=xpWdb}5I2kTj4jQ8k0R~wKexaU)H4|cO z11kUvkSs|M5aE>sSt#h@u!PPi0b@8xC?LaO2U8~hCT>s!XF~uPC2<_&F+khM1{x%^ z=wt$43tv7mvXI$g#y}Q)Ea=?nzy;5dD00YQ806>&r`&M#OPRx|hog!zx#;J>SW^cJ z48-ejbY2ivk!sxlDIp=*q7V8FZDB8x%?|;VfO`seA(E4x}Gk-`83updk?%|b+ug9#Ng3hRb=F2;qf&PXy&jc3k9u x(*&$l_=FqfY3Rf(Oi<{dNgUFU--tTUH$w^#J^_Oq`|*cCfH{OP0v-_n06XHY5gN(z}N zwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRu#Dgxv3?I3Kh9IdBs*0wn~X9 z`AMl(KsHENUr7P1q$Jx`$q^)>0J76LzbI9~RL@K|+0evP!Q4{M(9GDx(o#pk$iUD- z-@roO&{)^d%*w>T%E(9o3Y37h6{VzE1-ZCE?E>;_l`=|73as??%gf94%8m8%i_-NC zEiEne4UF`SjC6r2bc-wVN)jt{^NN*WCb*;)Cl_TFlw{`TDS%8&Ov*1Uu~h=P6yk;4 z0=Thx#d=`x=q2ap>Q^Kd=o{)8fV>1#=KlDb#X~hD#E>34K5C;EJ)Q4N-fSW zElN%WDpv+sRbb^@l$uzQUlfv`p92fUfQ? zg4-?5IQ8lS9itD5UZm)T2?5g(hzU=;Kn^_lr{)3Ed=W5lGyebg_s{QNKYx7x_Vvr> zPai+LfA{vy>sK#dJb(7|$>T>4AKbrp_s;EGH*Z|OcJ<2TOBXMkKX>-b=~E|996xsS z$l*f=5A5H!chBx!J9li~wsp(qO&d3?U$=J6>QyUOEMK;C$>K!|7tEhGch2ltGiOYn zHg(G6NfRgZ_x1L4cXf8Ox3#u3H#IiY*VWckS5;P&mz9V~xOjJZzNKk;EkC%s=i<5($jg^I&i4j;r{A2-^ z6Tp%MM1V>e2A2ODPFl{*KC~ue-v5LbjGRseVGe88s4C3SI3LfbSm8G#Vr|8-udf6iZ{a!cfN}n-AIX8GEl(?6NuOVC zeW9j;m4}xzij}#5lTDF}D~Xw@z?G|BA+}AKoqe(kS5G7ZyEubf9g{qpSVJIZdB7?$ zW`5QxzJ3O)B@36X-6h63Rg8}(_3-9E*15*94q`luc{LpDFB~`-xtw7eAKT8uWy?=z zHH$@X?&4X>ahOG}s=tx{4c|Mt%O@BPCvu9-X}r%h^Vdf0YxCHdbs7#$-Y~np=(v!; z76JW)^%j3SzAjQ{aBU9!`oHAQ?DT_iG8M{`?l7opifMGLKf*EDWwqjhG~NvzyC!5h zZY^|`+BZi`?V86F{(Y7^G>$FO6!&zr5_#^pLZ(XXq2!(o4J+6?`S=WEnLle=ByB87 zU3%mA(Ftui%iqp=Y$kANt^?b;su!jLyEZIUxW$~^nPOWRDr$G5>!_Ie@{V$|00mKw zy~$yVdzKbfhHg&edLqQkwa7tDV{4n}pF literal 0 HcmV?d00001 diff --git a/blue_app_ewc.gif b/blue_app_ewc.gif new file mode 100644 index 0000000000000000000000000000000000000000..d1c438fce85bcf3a2917dcd73082c83ce3c5005a GIT binary patch literal 1773 zcmZ?wbhEHbG-5Df*v!DNd&0Zle}11?|Eb6R;f*6-pIrO#`q9r0%Lnrko~^BXwKVI+ z)W9bnU;p~~^XLEn|NERCDgNh<@C{IKNi0bO(l+)L1&PVosU-?Ysp*+{wo31J?^jaD zOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&Psj#ZZEyztRNmQuF&B-gas<2f` zOvz75wF0t1!um=IU?nBlwn~m52?day&iO^D3Z{Byy2*wnrV8ekdWL4kCYF{u3PuKo z7WxJj`i923hGteK23AH!3Q(W~w5=#5%__*n4QdyVXRDM^Qc_^0uU}qXu2*iXmtT~w zZ)j<0sc&GUZ)BtkRH0j3nOBlnp_^B%3^TzcwK%ybv!En1KTiQIIg#cFVINM%8)eo$(0 zerZv1Dp0vH$f^P>=c3falKi5O{QMkPCaQbEHvF*!32B&Z42 z0+w{G)FHpGsVi;#njlz+|13;#mw2z(ACn($kN%_$<55%+0D(+ z$<-L9*Cju>G&eP`1g19yuGicEr(RHk$SnZc?2=lPS(cjOR+OKs0QR_5CT_R5;4}}a zHwC9#%v^Em)dxC89~8Yv(G3#RVB%){|L^ag-@ktT`2Owd zm(QO*et7@x?VH!HUcPw#?CF!oj~+g_fA8*{+qZ7sxPI;GmCKhdUO0d5?3vT2PM$b^ z?C6ohhYlXtzi;oJ-Me<~*uHJ+md%?sZdku=?V8oAR<2mSZ0VB4ixw`JKX2}w*|TQO zm_BXll*yAOPU!FJ?dk67>}YRmZE0?5Y^blRt*Nf6tSB!lEh#Q4EXdEx&B@Nn%t%j5 zO-W8lOo)$*jfswmj0g`44G9hk4Dk2!_3`%d^l*1`b#Zobbg;LxwXwFcv@ka_H8D0a zG|<=6)zQ|{)KFJbRZ&(_RFIdGm64W`ln@sa6%iH^6yWFM<>BVye~G8|c5Q5GREZwkW>tGwn@t?&E<%5K}Uvn>8z zwc&j^JA;1~dqcZ?VQqbfiK}OGP+PA@s;r_J4=>l`DJBd&37#x$+&%N;XY#Ss&0q*_ zcU`W?&Lqy!6XjGM$t_!I#LgwQNP(GytI>yzhs|m8TDH}5P4|@@*ANq1b73pr(t5M& z+?O1fZkD8QYVDX&c8{;5@)GY`rQBwsv@4pK8I6Er%`zO)V7tPFP1dO@4S4XWJ#rq=(U7xSI!-N{qEH*^J4c)mp1yJSv}A#LJ@cVuORDa6|tj4F!iEzMt~he$Co+@RpOY@2wXl%&gyh zo9^Ax>rnc1udGHvcW0Hg_iM){85WQ4w=1NXH9mMXFsW>wCRmse5+Ua0BH_~_SQI*$ z$@lO`) zK89=Gol(kCBjCWBASPRAg2+~2fodF+P!MtQ_(iWB!A?@cegdnYA?5uP9M&K)Tm}dd zj4rakc(?+BynfHuG0=R0X&e?VQ#@1(h!hJS7cByH4wICW6bS+j5|x||C2|}XEp!Ad z0dRFI2oec4V}lzREpRLaI|v#B6R;i&4W>#AtyzkH0~|yLHj&Cm1Pp8d2NMV#(+t0^ z497^TM*~C++#8WxHw$)24~+n0n@{8jI}QiD009iuNV;+as5D<-Oi&OF0I4La9yD0M z5FHgz90s7O)6gN51f43)8^>WXR`Q%=3SPAyn$`gd vT#E@Oz`q=tU?e$*B|O|FAF>FbT0gY0$!;Ssdj$jq1Q}5dZ)?h0Eg3 literal 0 HcmV?d00001 diff --git a/blue_app_volta.gif b/blue_app_volta.gif new file mode 100644 index 0000000000000000000000000000000000000000..d1c438fce85bcf3a2917dcd73082c83ce3c5005a GIT binary patch literal 1773 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 J;}=c_YXH;4WQPC% literal 0 HcmV?d00001 diff --git a/dexon.png b/dexon.png new file mode 100644 index 0000000000000000000000000000000000000000..c6a934a8fe591a7224476c5f1b3a763658f74878 GIT binary patch literal 1723 zcmV;s21NOZP)(iCiT3ySks%n%{3#C+T{hepd z&OfEpUMbZXZ{gos>*LkRB`1`ss-V!9#-Fl1IL$r{psm(=pYy@&P^zk$83=2o)L+(z z@!0|37(gBS(*O#Gn@|Kl1j2y6Bi|{d8m@9Xl^uD4zcB6z1m-Ol9BLr1ci1w<94g?f zI4DLr?H>$=?NAYy#XvEw<56L_zN2V0Q((+YTzzy9u7f&TWQStHRVM(v4&iK-4T=Hs zXq|bgCxH8w_(pLC#> zmyo9s-z7sa{Rm6O*6X#l4QhHyI?yugf&_yWn35K>4%>FS9Tybvbt)8=egp~ zI;Iw+P6X`BQ!3y9hyJCGg2EZLpbxGy)eXAo)`!Jz9g7!#{;n+=+~1tHExo^0i3Yu~y}VO{_&SO608%3d?i~CO5HA;C8sKg2I#=7VELT%LVKzH(&qb z0*;mK5q`XYVmf&8he0iN&8LbmMP+~2g*K#$hQ2%YoR~Zj`_hHN61rjv5^Gg`4aN#* zX#6l#88GEG^c%2N#UzopE)??3bD{l&?Y>x_5=OAF`SS8|@!8n)4i+}2PJDX2bD@xK zf*6vUV~(jJ*Frj6OkjL}f0N~DNVZS#+VD7SGbK$tMw*5IwJm1$7E@3u1)EVKuX-p; z%7jDY=9ps&s<+rdoDXnpp0IG7GP6D6n;r`3C_Yqfj`_#O$3-E$y}d=JgNcN%udk%e z8WRb`o&ITb|Hp(c5^I`9JwHF6CAHaXRM+tz>BwR0_4@27^ZESZvx&Co|2x^%Q>vO& zV)*JkW#Ti&`|w4w!blZ!OYG=vr|2_B90u~!6QWcnB}(FuJQB`}H6&1|bbN_}M<4Li zaaa~8lq22}r&)ZSGGmbqO6>fW&r6(;%=Ozzp~TkUm>*ce)cu&p%z|fwLbcvd;v!e5 zhprc8fkL%1SK@N;)cjA}U6}@jTLNEu;{?TTm>`kUpiu4hNL6l}TZ~c_6yefwJQS>R zOWhZhx~j*y8IN*mC{gspL&+t9V}Yg?Y=IIv4oZmJ4E3qaoqK~fRX9$FB5_bcbG*Ox|SCZ{8%wBAh5v5t2#=0Rfm?B+LZZH8}2YBuYXE}!a4mSFG`yRMP4aL z<8-eSwE7o$`Q|jId-x^vVDw&@0%WtQs%BA)z0p$;2UEddHH`heBkWMl9#&Pg0R;Y( z?ZIjGX+ji$*mFF1%Lwx*e(NMH@_*R{sTUGhLc4m RuZ92s002ovPDHLkV1inBB&YxY literal 0 HcmV?d00001 diff --git a/ewc.png b/ewc.png new file mode 100644 index 0000000000000000000000000000000000000000..5bda6b7969883d400277bcec1abe1cada2f23629 GIT binary patch literal 2923 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 J;}=c_YXH;4WQPC% literal 0 HcmV?d00001 diff --git a/glyphs/blue_badge_webchain.gif b/glyphs/blue_badge_webchain.gif new file mode 100644 index 0000000000000000000000000000000000000000..24edd1c2ab57855dfd71299d0baf6db56228145e GIT binary patch literal 791 zcmZ?wbhEHb)Me0RXc1sId-m*w3l}b5zI^@q_1m{^-@AA3;lqcIA3uKn{Q2wGuiw3U z_wnP$uV26Z`0?ZS@8AFb|7Rc(DE?$&42$$-K^*ji=e1hb@!6)0D${O21oOCWjkm#>`o> z+2gBCxwYA*E;i+x#GIqT%No(QHk!waHCdUshQ*My`v0DM;I<|J6|v;>4QU@U_rNwbw}K`2S;X1VL4mw>mI_Q@cF(g z8|$GqQw0-|&8xyL)||9b>OCcQU+l|_-OY^M{gT-+vDwM24DMDe7b+yaJ>;6m$Z_Mw z=`U`xY^O8yd}K51?JwfHqZju3a+^&%gW97l-d_%$l-?h=W6#3mhQmuNN~hH^UJPQ8 zkW>6vJmbefd;flU3DZNLZZ)*2meeeXdZ#tp`=H(J8y)K$_en2RQ2Sw&ru9rtJXeLs zz&ZA$+`&!ON(BluBA3Cf4e9Ac)i%~xSD zad}{<(CaeYNAzN76z`FeHXmJ<4XRE|+$|c9bd|b(ObXqt@ZCX+iEA;3&Za30TnvkL zcz9?su^bUrGjj|+m9@m+(L%L}K9`c^IT(!GwOeZ%Iphm!5)VwOxiit-aaPGjW{IQ; ziEL6?M}Bw+d7FH65#jL(JSrNwVudGP_<_&`)>#>e$?_U29yoCuoG5t0p~%2s4FGc0 BIs5h+i z#(Mch>H3D2mX`VkM*2oZxP`3=Lf^oD9vKom`v^ z4IGV}EX^$3V0vBhlS^|`^GaZPQxJOHaOwpmh};68%`T}$nPsUdZbkXI3Sf_0W#V>= zGfwlMdQ)(_#RaEceV}9XLD7p8-7q0w8Uiuli5JL$C;!wuV45!iCT_<6|Nj2@{p;tC z@87({PcxqRv3h4bgmo;iK$ z#u35cm<%;FYmM&SmXyJnS^XAT( zJ!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3 zjP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|LV6Zqk*xT9KSX)_In46iJ z7#kTH=@}C@U!{$jiyfNJ~jdh>MAe2nz`c@bmHVaC32Tu(PqUFf%a% wONgH=z;c3tK?g*D$_@r5iJtzIs~KwUGz+zPEiKD<-x8T<*15Dbij~0{0O2}{jsO4v literal 0 HcmV?d00001 diff --git a/glyphs/icon_dashboard_x.gif b/glyphs/icon_dashboard_x.gif new file mode 100644 index 0000000000000000000000000000000000000000..33d9b0a74a263937a8cbb3b7c4ccfd4bd4fd2a3b GIT binary patch literal 1126 zcmZ?wbhEHbh+i z#(Mch>H3D2mX`VkM*2oZx= z5l-`({PcxqRv3h4bgmo;iK$ z#u35cm<%;FYmM&SmXyJnS^XAT( zJ!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3 zjP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|L7iT9&2YWkP8*3{|3v)A5 z6JsMo1ARSR9c?X54RtkD6=fww1$jAH8EGj=32`w|5n&-g0e(JS9&Rp94t6$H7G@?! zUN=+)!5rZxXLd=q=)yrMSIm QWp_qliepi;AuEG50IDu15dZ)H literal 0 HcmV?d00001 diff --git a/glyphs/nanos_badge_artis_tau1.gif b/glyphs/nanos_badge_artis_tau1.gif new file mode 100644 index 0000000000000000000000000000000000000000..9e741b54e50405a36420a3d849ae483f19b1ad6e GIT binary patch literal 117 zcmZ?wbhEHbN=+)ejGla-Hl#4J0x^zpK} QOQ%H{FrA$e%fMg_0GW>|j{pDw literal 0 HcmV?d00001 diff --git a/glyphs/nanos_badge_dexon.gif b/glyphs/nanos_badge_dexon.gif new file mode 100644 index 0000000000000000000000000000000000000000..65021cc8cc2a55d786005d87af31c513214abb6d GIT binary patch literal 1217 zcmbVMcYM@T91j&oMXD(76;i;W&3MV>E-&<`*SjkeIa=EyxP6zr>%}(1B<0e&aNt11 z1&D$S_ud;7Cv|Te;6}xbTX3B(<*xciKm1|-czNUd`+a|VVpF36Q5981&7!Dcu}D$W zsN%30nHD;Qd_?|r^?`%5PVCcJ++kR8X5-3L3~lIfX1bgaGENfbjY+*OZtI=euJv|m zP-p5V&~Gike+mboaafrw1U zAP1sS1j1Tc6oA4D3J)X}MAe9(iXvV57{cc2Ikh#_SmGk5IFt8%N9FlKp}-X+&UQO^ z03qZBkrzdlAXu-*@=?HAUUgYR3VWJsIKE+9bf^(!?QTEL5KFhXU^WV-*D`Y(x+RHY+HQMF7f*mK8*qw?Vi|vazkos!10k-*($=yQ^FUEqU9w zy}a$v$z+&yNY`YLW?13nxG+&${7zxln2Gg9*EZ??NUO#mRwxp}F$^?T1TrQO067*) zD9Xxm4vAT)Bz;?KfY4_2m~EKL6~~^`CtF(T5+r|K7T_@4oZ)TWj8Yn%6mbmI-z zUw7>_SFc#UZ0S`?7GHVAqRSU9n19)&mt1_&ybI@EFz5X9&OK-L*=L=3#;ns%JN1;4 zdwYVy%x>RvPjYO_?CLzx$amzhu4T~)#~*j>F-ISDjEB+I7E=o--Nlj5G&n(GMaQE~LV9)_cf|M~ZDfaZQ mJpGn&QAyD}DPKQ{jQu(C%1#S{rg>Bq>3+5Qdo3$FV?231qt0!cpJ#TU=09*Bo+7o literal 0 HcmV?d00001 diff --git a/nanos_app_artis_sigma1.gif b/nanos_app_artis_sigma1.gif new file mode 100644 index 0000000000000000000000000000000000000000..518d127cc11512592170859dd32804c2c908e218 GIT binary patch literal 73 zcmZ?wbhEHb6krfwXkY+=|Ns9h{$v3&bwDIYhJi_;r+?+?y9|xopRR;1-04}A*Q!)h TE8%Js`E7|Gi{B?3aRzGuwu}{^ literal 0 HcmV?d00001 diff --git a/nanos_app_artis_tau1.gif b/nanos_app_artis_tau1.gif new file mode 100644 index 0000000000000000000000000000000000000000..e9525ae9115e6bffe659b46a866338db6094abed GIT binary patch literal 71 zcmZ?wbhEHb6krfwXkY+=|Ns9h{$v3&bwDIYhJi`0r+?+?y9|xopRSbZPM(;|s}w%1 R@o}2nqbt7exRqHMtO1K$6*>R_ literal 0 HcmV?d00001 diff --git a/nanos_app_dexon.gif b/nanos_app_dexon.gif new file mode 100644 index 0000000000000000000000000000000000000000..e028a0f685050287bdcac2fbd5491b9d6f2255cc GIT binary patch literal 75 zcmZ?wbhEHb6krfw_`t{j1poj4SNzEWVln7|2#^c|lTuIr%F|~B7+P}ANu76v-9O7C~? zS5nAKu~iB;^)>JzK!Rz^k&P@n{~ttchUD#*nRY8Q}atCUevQedU8UtV6WS8lAA zUzDzIXlZGwZ(yWvWTXpJp<7&;SCUwvn^&w1Gr=XbIJqdZpd>RtPXT0NVp4u-iLDaQ zr4TRV7Ql_oE7k*hM=v=)SHB{$K;KZ$0OTc@LSJ9}N^^7Js*6j4QW5UOYH)E#WkITb zP-=00X;E@2P`NV5ssbzLqSVBa{GyQj{2W*)24v)yucqiS6q^qmz?V9Vygr+M=vuo#md>m)Y!?~+}O~?%-PV;)zZnx(%IR`&CJ}{ z&CSrs)flGNB|o_|H#M&WrZ)wl*950tP=d%U0NU)5T9jFqn&MWJpQ`}&xK$=@w;19y z52`l>w_A*G>eUB2MjsTtNYM=w0;VAl6P|d19C-3i%>$zB`;K7M%r?(Lh`uU@`*{_N?K$B!O9xPR~No!hr=-nf44>XplvE?zi)?(CVz2)%Hf~tIZta@Yt5&X9zHI4|#fug$m_KjsoY}Kx z&X_)J>XgZoCQj(@>+R|8>g;H5Yi((6YHX;ltF5W7s;nq4D=jH5DlEv)%gxEo%FIYl zOHD~mN=%54i;annii`*k3k?Yl3Jmb~^Y!ue^7L?bb9Hfca&)k_v$e6dva~QaGc_?b zGBnWF)78<|($r8_Q&mw`QdE$ala-N{l9Uh^6BQ8_5)|O)jEB+I7E=o--Nlj5G&n(GMaQE~LV9)_cf|M~ZDfaZQ mJpGn&QAyD}DPKQ{jQu(C%1#S{rg>Bq>3+5Q6v-9O7C~? zS5nAKu~iB;^)>JzK!Rz^k&P@n{~ttchUD#*nRY8Q}atCUevQedU8UtV6WS8lAA zUzDzIXlZGwZ(yWvWTXpJp<7&;SCUwvn^&w1Gr=XbIJqdZpd>RtPXT0NVp4u-iLDaQ zr4TRV7Ql_oE7k*hM=v=)SHB{$K;KZ$0OTc@LSJ9}N^^7Js*6j4QW5UOYH)E#WkITb zP-=00X;E@2P`NV5ssbzLqSVBa{GyQj{2W*)24v)yucqiS6q^qmz?V9Vygr+M=vuo#md>m)Y!?~+}O~?%-PV;)zZnx(%IR`&CJ}{ z&CSrs)flGNB|o_|H#M&WrZ)wl*950tP=d%U0NU)5T9jFqn&MWJpQ`}&xK$=@w;19y z52`l>w_A*G>eUB2MjsTtNYM=w0;VAl6P|d19C-3i%>$zB`;K7M%r?(Lh`uU@`*{_N?K$B!O9xPR~No!hr=-nf44>XplvE?zi)?(CVz2)%Hf~tIZta@Yt5&X9zHI4|#fug$m_KjsoY}Kx z&X_)J>XgZoCQj(@>+R|8>g;H5Yi((6YHX;ltF5W7s;nq4D=jH5DlEv)%gxEo%FIYl zOHD~mN=%54i;annii`*k3k?Yl3Jmb~^Y!ue^7L?bb9Hfca&)k_v$e6dva~QaGc_?b zGBnWF)78<|($r8_Q&mw`QdE$ala-N{l9Uh^6BQ8_5)|O)j>wsvG2m_N$Pyfo(Z}S@_bt}y-NU{2&%(&3G_sO>@ M7fx-i( literal 0 HcmV?d00001 diff --git a/nanox_app_ewc.gif b/nanox_app_ewc.gif new file mode 100644 index 0000000000000000000000000000000000000000..b0e43f0f80e3819f4f7569fe8b5ce8bede1687f3 GIT binary patch literal 61 zcmZ?wbh9u|j>wsvG2m_N$OaIE#Vsr0t35BS9F8PyjyYznO#EIfb MH(9rOGcs5M0Q*oAR{#J2 literal 0 HcmV?d00001 diff --git a/nanox_app_thundercore.gif b/nanox_app_thundercore.gif new file mode 100644 index 0000000000000000000000000000000000000000..537e5407385c47713e84d05112b937b72d6b482e GIT binary patch literal 92 zcmZ?wbhEHbj>wsvG2m_N$OaIE#Vsr0t35BS9F8PyjyYznO#EIfb MH(9rOGcs5M0Q*oAR{#J2 literal 0 HcmV?d00001 diff --git a/nanox_app_webchain.gif b/nanox_app_webchain.gif new file mode 100644 index 0000000000000000000000000000000000000000..4d1027c5f2b7ea37e392a501762485ad4d9e7954 GIT binary patch literal 58 zcmZ?wbh9u|kind) { @@ -1868,8 +1952,14 @@ tokenDefinition_t* getKnownToken() { currentToken = (tokenDefinition_t *)PIC(&TOKENS_PIRL[i]); break; case CHAIN_KIND_POA: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_POA[i]); - break; + currentToken = (tokenDefinition_t *)PIC(&TOKENS_POA[i]); + break; + case CHAIN_KIND_ARTIS_SIGMA1: + currentToken = (tokenDefinition_t *)PIC(&TOKENS_ARTIS_SIGMA1[i]); + break; + case CHAIN_KIND_ARTIS_TAU1: + currentToken = (tokenDefinition_t *)PIC(&TOKENS_ARTIS_TAU1[i]); + break; case CHAIN_KIND_RSK: currentToken = (tokenDefinition_t *)PIC(&TOKENS_RSK[i]); break; @@ -1924,6 +2014,21 @@ tokenDefinition_t* getKnownToken() { case CHAIN_KIND_TOBALABA: currentToken = (tokenDefinition_t *)PIC(&TOKENS_TOBALABA[i]); break; + case CHAIN_KIND_DEXON: + currentToken = (tokenDefinition_t *)PIC(&TOKENS_DEXON[i]); + break; + case CHAIN_KIND_VOLTA: + currentToken = (tokenDefinition_t *)PIC(&TOKENS_VOLTA[i]); + break; + case CHAIN_KIND_EWC: + currentToken = (tokenDefinition_t *)PIC(&TOKENS_EWC[i]); + break; + case CHAIN_KIND_WEBCHAIN: + currentToken = (tokenDefinition_t *)PIC(&TOKENS_WEBCHAIN[i]); + break; + case CHAIN_KIND_THUNDERCORE: + currentToken = (tokenDefinition_t *)PIC(&TOKENS_THUNDERCORE[i]); + break } if (os_memcmp(currentToken->address, tmpContent.txContent.destination, 20) == 0) { return currentToken; @@ -2028,12 +2133,12 @@ customStatus_e customProcessor(txContext_t *context) { array_hexstr(strings.tmp.tmp, dataContext.rawDataContext.data, 4); #if defined(TARGET_BLUE) UX_DISPLAY(ui_data_selector_blue, ui_data_selector_blue_prepro); +#elif defined(HAVE_UX_FLOW) + ux_flow_init(0, ux_confirm_selector_flow, NULL); #elif defined(TARGET_NANOS) ux_step = 0; ux_step_count = 2; UX_DISPLAY(ui_data_selector_nanos, ui_data_selector_prepro); -#elif defined(TARGET_NANOX) - ux_flow_init(0, ux_confirm_selector_flow, NULL); #endif // #if TARGET_ID } else { @@ -2048,12 +2153,12 @@ customStatus_e customProcessor(txContext_t *context) { } #if defined(TARGET_BLUE) UX_DISPLAY(ui_data_parameter_blue, ui_data_parameter_blue_prepro); +#elif defined(HAVE_UX_FLOW) + ux_flow_init(0, ux_confirm_parameter_flow, NULL); #elif defined(TARGET_NANOS) ux_step = 0; ux_step_count = 2; UX_DISPLAY(ui_data_parameter_nanos, ui_data_parameter_prepro); -#elif defined(TARGET_NANOX) - ux_flow_init(0, ux_confirm_parameter_flow, NULL); #endif // #if TARGET_ID } } @@ -2067,6 +2172,31 @@ customStatus_e customProcessor(txContext_t *context) { return CUSTOM_NOT_HANDLED; } +unsigned int const U_os_perso_seed_cookie[] = { + 0xda7aba5e, + 0xc1a551c5, +}; + +#ifndef HAVE_WALLET_ID_SDK + +void handleGetWalletId(volatile unsigned int *tx) { + unsigned char t[64]; + cx_ecfp_256_private_key_t priv; + cx_ecfp_256_public_key_t pub; + // seed => priv key + os_perso_derive_node_bip32(CX_CURVE_256K1, U_os_perso_seed_cookie, 2, t, NULL); + // priv key => pubkey + cx_ecdsa_init_private_key(CX_CURVE_256K1, t, 32, &priv); + cx_ecfp_generate_pair(CX_CURVE_256K1, &pub, &priv, 1); + // pubkey -> sha512 + cx_hash_sha512(pub.W, sizeof(pub.W), t, sizeof(t)); + // ! cookie ! + os_memmove(G_io_apdu_buffer, t, 64); + *tx = 64; + THROW(0x9000); +} + +#endif void handleGetPublicKey(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, volatile unsigned int *flags, volatile unsigned int *tx) { UNUSED(dataLength); @@ -2075,7 +2205,7 @@ void handleGetPublicKey(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t da uint32_t i; uint8_t bip32PathLength = *(dataBuffer++); cx_ecfp_private_key_t privateKey; - + reset_app_context(); if ((bip32PathLength < 0x01) || (bip32PathLength > MAX_BIP32_PATH)) { PRINTF("Invalid path\n"); @@ -2092,11 +2222,14 @@ void handleGetPublicKey(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t da dataBuffer += 4; } tmpCtx.publicKeyContext.getChaincode = (p2 == P2_CHAINCODE); + io_seproxyhal_io_heartbeat(); os_perso_derive_node_bip32(CX_CURVE_256K1, bip32Path, bip32PathLength, privateKeyData, (tmpCtx.publicKeyContext.getChaincode ? tmpCtx.publicKeyContext.chainCode : NULL)); cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, &privateKey); + io_seproxyhal_io_heartbeat(); cx_ecfp_generate_pair(CX_CURVE_256K1, &tmpCtx.publicKeyContext.publicKey, &privateKey, 1); os_memset(&privateKey, 0, sizeof(privateKey)); os_memset(privateKeyData, 0, sizeof(privateKeyData)); + io_seproxyhal_io_heartbeat(); getEthAddressStringFromKey(&tmpCtx.publicKeyContext.publicKey, tmpCtx.publicKeyContext.address, &sha3); #ifndef NO_CONSENT if (p1 == P1_NON_CONFIRM) @@ -2121,14 +2254,14 @@ void handleGetPublicKey(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t da #if defined(TARGET_BLUE) snprintf(strings.common.fullAddress, sizeof(strings.common.fullAddress), "0x%.*s", 40, tmpCtx.publicKeyContext.address); UX_DISPLAY(ui_address_blue, ui_address_blue_prepro); +#elif defined(HAVE_UX_FLOW) + snprintf(strings.common.fullAddress, sizeof(strings.common.fullAddress), "0x%.*s", 40, tmpCtx.publicKeyContext.address); + ux_flow_init(0, ux_display_public_flow, NULL); #elif defined(TARGET_NANOS) snprintf(strings.common.fullAddress, sizeof(strings.common.fullAddress), "0x%.*s", 40, tmpCtx.publicKeyContext.address); ux_step = 0; ux_step_count = 2; UX_DISPLAY(ui_address_nanos, ui_address_prepro); -#elif defined(TARGET_NANOX) - snprintf(strings.common.fullAddress, sizeof(strings.common.fullAddress), "0x%.*s", 40, tmpCtx.publicKeyContext.address); - ux_flow_init(0, ux_display_public_flow, NULL); #endif // #if TARGET_ID *flags |= IO_ASYNCH_REPLY; @@ -2149,6 +2282,7 @@ void finalizeParsing(bool direct) { if (chainConfig->chainId != 0) { uint32_t v = getV(&tmpContent.txContent); if (chainConfig->chainId != v) { + reset_app_context(); PRINTF("Invalid chainId %d expected %d\n", v, chainConfig->chainId); if (direct) { THROW(0x6A80); @@ -2161,7 +2295,7 @@ void finalizeParsing(bool direct) { } } // Store the hash - cx_hash((cx_hash_t *)&sha3, CX_LAST, tmpCtx.transactionContext.hash, 0, tmpCtx.transactionContext.hash); + cx_hash((cx_hash_t *)&sha3, CX_LAST, tmpCtx.transactionContext.hash, 0, tmpCtx.transactionContext.hash, 32); // If there is a token to process, check if it is well known if (tokenProvisioned) { tokenDefinition_t *currentToken = getKnownToken(); @@ -2177,6 +2311,7 @@ void finalizeParsing(bool direct) { } else { if (dataPresent && !N_storage.dataAllowed) { + reset_app_context(); PRINTF("Data field forbidden\n"); if (direct) { THROW(0x6A80); @@ -2257,14 +2392,14 @@ void finalizeParsing(bool direct) { #else // NO_CONSENT #if defined(TARGET_BLUE) ui_approval_transaction_blue_init(); +#elif defined(HAVE_UX_FLOW) + ux_flow_init(0, + ((dataPresent && !N_storage.contractDetails) ? ux_approval_tx_data_warning_flow : ux_approval_tx_flow), + NULL); #elif defined(TARGET_NANOS) ux_step = 0; ux_step_count = 5; UX_DISPLAY(ui_approval_nanos, ui_approval_prepro); -#elif defined(TARGET_NANOX) - ux_flow_init(0, - ((dataPresent && !N_storage.contractDetails) ? ux_approval_tx_data_warning_flow : ux_approval_tx_flow), - NULL); #endif // #if TARGET_ID #endif // NO_CONSENT } @@ -2289,10 +2424,10 @@ void handleProvideErc20TokenInformation(uint8_t p1, uint8_t p2, uint8_t *workBuf if (dataLength < tickerLength + 20 + 4 + 4) { THROW(0x6A80); } - cx_hash_sha256(workBuffer + offset, tickerLength + 20 + 4 + 4, hash); + cx_hash_sha256(workBuffer + offset, tickerLength + 20 + 4 + 4, hash, 32); os_memmove(tmpCtx.transactionContext.currentToken.ticker, workBuffer + offset, tickerLength); tmpCtx.transactionContext.currentToken.ticker[tickerLength] = ' '; - tmpCtx.transactionContext.currentToken.ticker[tickerLength + 1] = '\0'; + tmpCtx.transactionContext.currentToken.ticker[tickerLength + 1] = '\0'; offset += tickerLength; dataLength -= tickerLength; os_memmove(tmpCtx.transactionContext.currentToken.address, workBuffer + offset, 20); @@ -2322,6 +2457,14 @@ void handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength parserStatus_e txResult; uint32_t i; if (p1 == P1_FIRST) { + if (dataLength < 1) { + PRINTF("Invalid data\n"); + THROW(0x6a80); + } + if (appState != APP_STATE_IDLE) { + reset_app_context(); + } + appState = APP_STATE_SIGNING_TX; tmpCtx.transactionContext.pathLength = workBuffer[0]; if ((tmpCtx.transactionContext.pathLength < 0x01) || (tmpCtx.transactionContext.pathLength > MAX_BIP32_PATH)) { @@ -2331,6 +2474,10 @@ void handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength workBuffer++; dataLength--; for (i = 0; i < tmpCtx.transactionContext.pathLength; i++) { + if (dataLength < 4) { + PRINTF("Invalid data\n"); + THROW(0x6a80); + } tmpCtx.transactionContext.bip32Path[i] = U4BE(workBuffer, 0); workBuffer += 4; dataLength -= 4; @@ -2346,6 +2493,10 @@ void handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength if (p2 != 0) { THROW(0x6B00); } + if ((p1 == P1_MORE) && (appState != APP_STATE_SIGNING_TX)) { + PRINTF("Signature not initialized\n"); + THROW(0x6985); + } if (txContext.currentField == TX_RLP_NONE) { PRINTF("Parser not initialized\n"); THROW(0x6985); @@ -2398,6 +2549,14 @@ void handleSignPersonalMessage(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint uint32_t base = 10; uint8_t pos = 0; uint32_t i; + if (dataLength < 1) { + PRINTF("Invalid data\n"); + THROW(0x6a80); + } + if (appState != APP_STATE_IDLE) { + reset_app_context(); + } + appState = APP_STATE_SIGNING_MESSAGE; tmpCtx.messageSigningContext.pathLength = workBuffer[0]; if ((tmpCtx.messageSigningContext.pathLength < 0x01) || (tmpCtx.messageSigningContext.pathLength > MAX_BIP32_PATH)) { @@ -2407,16 +2566,24 @@ void handleSignPersonalMessage(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint workBuffer++; dataLength--; for (i = 0; i < tmpCtx.messageSigningContext.pathLength; i++) { + if (dataLength < 4) { + PRINTF("Invalid data\n"); + THROW(0x6a80); + } tmpCtx.messageSigningContext.bip32Path[i] = U4BE(workBuffer, 0); workBuffer += 4; dataLength -= 4; } + if (dataLength < 4) { + PRINTF("Invalid data\n"); + THROW(0x6a80); + } tmpCtx.messageSigningContext.remainingLength = U4BE(workBuffer, 0); workBuffer += 4; dataLength -= 4; // Initialize message header + length cx_keccak_init(&sha3, 256); - cx_hash((cx_hash_t *)&sha3, 0, SIGN_MAGIC, sizeof(SIGN_MAGIC) - 1, NULL); + cx_hash((cx_hash_t *)&sha3, 0, (uint8_t*)SIGN_MAGIC, sizeof(SIGN_MAGIC) - 1, NULL, 0); for (index = 1; (((index * base) <= tmpCtx.messageSigningContext.remainingLength) && (((index * base) / base) == index)); index *= base); @@ -2424,7 +2591,7 @@ void handleSignPersonalMessage(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint tmp[pos++] = '0' + ((tmpCtx.messageSigningContext.remainingLength / index) % base); } tmp[pos] = '\0'; - cx_hash((cx_hash_t *)&sha3, 0, tmp, pos, NULL); + cx_hash((cx_hash_t *)&sha3, 0, (uint8_t*)tmp, pos, NULL, 0); cx_sha256_init(&tmpContent.sha2); } else if (p1 != P1_MORE) { @@ -2433,15 +2600,19 @@ void handleSignPersonalMessage(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint if (p2 != 0) { THROW(0x6B00); } + if ((p1 == P1_MORE) && (appState != APP_STATE_SIGNING_MESSAGE)) { + PRINTF("Signature not initialized\n"); + THROW(0x6985); + } if (dataLength > tmpCtx.messageSigningContext.remainingLength) { THROW(0x6A80); } - cx_hash((cx_hash_t *)&sha3, 0, workBuffer, dataLength, NULL); - cx_hash((cx_hash_t *)&tmpContent.sha2, 0, workBuffer, dataLength, NULL); + cx_hash((cx_hash_t *)&sha3, 0, workBuffer, dataLength, NULL, 0); + cx_hash((cx_hash_t *)&tmpContent.sha2, 0, workBuffer, dataLength, NULL, 0); tmpCtx.messageSigningContext.remainingLength -= dataLength; if (tmpCtx.messageSigningContext.remainingLength == 0) { - cx_hash((cx_hash_t *)&sha3, CX_LAST, workBuffer, 0, tmpCtx.messageSigningContext.hash); - cx_hash((cx_hash_t *)&tmpContent.sha2, CX_LAST, workBuffer, 0, hashMessage); + cx_hash((cx_hash_t *)&sha3, CX_LAST, workBuffer, 0, tmpCtx.messageSigningContext.hash, 32); + cx_hash((cx_hash_t *)&tmpContent.sha2, CX_LAST, workBuffer, 0, hashMessage, 32); #define HASH_LENGTH 4 array_hexstr(strings.common.fullAddress, hashMessage, HASH_LENGTH / 2); @@ -2455,13 +2626,13 @@ void handleSignPersonalMessage(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint #else NO_CONSENT #if defined(TARGET_BLUE) ui_approval_message_sign_blue_init(); +#elif defined(HAVE_UX_FLOW) + ux_flow_init(0, ux_sign_flow, NULL); #elif defined(TARGET_NANOS) ux_step = 0; ux_step_count = 2; UX_DISPLAY(ui_approval_signMessage_nanos, ui_approval_signMessage_prepro); -#elif defined(TARGET_NANOX) - ux_flow_init(0, ux_sign_flow, NULL); #endif // #if TARGET_ID #endif // NO_CONSENT @@ -2477,6 +2648,16 @@ void handleApdu(volatile unsigned int *flags, volatile unsigned int *tx) { BEGIN_TRY { TRY { + +#ifndef HAVE_WALLET_ID_SDK + + if ((G_io_apdu_buffer[OFFSET_CLA] == COMMON_CLA) && (G_io_apdu_buffer[OFFSET_INS] == COMMON_INS_GET_WALLET_ID)) { + handleGetWalletId(tx); + return; + } + +#endif + if (G_io_apdu_buffer[OFFSET_CLA] != CLA) { THROW(0x6E00); } @@ -2523,7 +2704,7 @@ void handleApdu(volatile unsigned int *flags, volatile unsigned int *tx) { case 0x6000: // Wipe the transaction context and report the exception sw = e; - os_memset(&txContext, 0, sizeof(txContext)); + reset_app_context(); break; case 0x9000: // All is well @@ -2532,6 +2713,7 @@ void handleApdu(volatile unsigned int *flags, volatile unsigned int *tx) { default: // Internal error sw = 0x6800 | (e & 0x7FF); + reset_app_context(); break; } // Unexpected exception => report @@ -2573,6 +2755,8 @@ void sample_main(void) { THROW(0x6982); } + PRINTF("New APDU received:\n%.*H\n", rx, G_io_apdu_buffer); + handleApdu(&flags, &tx); } CATCH(EXCEPTION_IO_RESET) { @@ -2583,7 +2767,7 @@ void sample_main(void) { case 0x6000: // Wipe the transaction context and report the exception sw = e; - os_memset(&txContext, 0, sizeof(txContext)); + reset_app_context(); break; case 0x9000: // All is well @@ -2592,6 +2776,7 @@ void sample_main(void) { default: // Internal error sw = 0x6800 | (e & 0x7FF); + reset_app_context(); break; } if (e != 0x9000) { @@ -2647,7 +2832,7 @@ unsigned char io_event(unsigned char channel) { case SEPROXYHAL_TAG_TICKER_EVENT: UX_TICKER_EVENT(G_io_seproxyhal_spi_buffer, { - #ifndef TARGET_NANOX + #ifndef HAVE_UX_FLOW if (UX_ALLOWED) { if (ux_step_count) { // prepare next screen @@ -2656,7 +2841,7 @@ unsigned char io_event(unsigned char channel) { UX_REDISPLAY(); } } - #endif // TARGET_NANOX + #endif // HAVE_UX_FLOW }); break; } @@ -2736,7 +2921,7 @@ __attribute__((section(".boot"))) int main(int arg0) { chainConfig = (chain_config_t *)PIC(&C_chain_config); } - os_memset(&txContext, 0, sizeof(txContext)); + reset_app_context(); // ensure exception will work as planned os_boot(); diff --git a/src/tokens.c b/src/tokens.c index 5b458f6..39387bd 100644 --- a/src/tokens.c +++ b/src/tokens.c @@ -1182,4 +1182,18 @@ const tokenDefinition_t const TOKENS_TOMOCHAIN[NUM_TOKENS_TOMOCHAIN] = {}; const tokenDefinition_t const TOKENS_TOBALABA[NUM_TOKENS_TOBALABA] = {}; +const tokenDefinition_t const TOKENS_DEXON[NUM_TOKENS_DEXON] = {}; + +const tokenDefinition_t const TOKENS_VOLTA[NUM_TOKENS_VOLTA] = {}; + +const tokenDefinition_t const TOKENS_EWC[NUM_TOKENS_EWC] = {}; + +const tokenDefinition_t const TOKENS_ARTIS_SIGMA1[NUM_TOKENS_ARTIS_SIGMA1] = {}; + +const tokenDefinition_t const TOKENS_ARTIS_TAU1[NUM_TOKENS_ARTIS_TAU1] = {}; + +const tokenDefinition_t const TOKENS_WEBCHAIN[NUM_TOKENS_WEBCHAIN] = {}; + +const tokenDefinition_t const TOKENS_THUNDERCORE[NUM_TOKENS_THUNDERCORE] = {}; + #endif diff --git a/src/tokens.h b/src/tokens.h index 488302d..e54a82c 100644 --- a/src/tokens.h +++ b/src/tokens.h @@ -51,6 +51,13 @@ typedef struct tokenDefinition_t { #define NUM_TOKENS_HPB 0 #define NUM_TOKENS_TOMOCHAIN 0 #define NUM_TOKENS_TOBALABA 0 +#define NUM_TOKENS_DEXON 0 +#define NUM_TOKENS_VOLTA 0 +#define NUM_TOKENS_EWC 0 +#define NUM_TOKENS_ARTIS_SIGMA1 0 +#define NUM_TOKENS_ARTIS_TAU1 0 +#define NUM_TOKENS_WEBCHAIN 0 +#define NUM_TOKENS_THUNDERCORE 0 extern tokenDefinition_t const TOKENS_AKROMA[NUM_TOKENS_AKROMA]; extern tokenDefinition_t const TOKENS_ELLAISM[NUM_TOKENS_ELLAISM]; @@ -75,7 +82,14 @@ extern tokenDefinition_t const TOKENS_REOSC[NUM_TOKENS_REOSC]; extern tokenDefinition_t const TOKENS_HPB[NUM_TOKENS_HPB]; extern tokenDefinition_t const TOKENS_TOMOCHAIN[NUM_TOKENS_TOMOCHAIN]; extern tokenDefinition_t const TOKENS_TOBALABA[NUM_TOKENS_TOBALABA]; +extern tokenDefinition_t const TOKENS_DEXON[NUM_TOKENS_DEXON]; +extern tokenDefinition_t const TOKENS_VOLTA[NUM_TOKENS_VOLTA]; +extern tokenDefinition_t const TOKENS_EWC[NUM_TOKENS_EWC]; +extern tokenDefinition_t const TOKENS_ARTIS_SIGMA1[NUM_TOKENS_ARTIS_SIGMA1]; +extern tokenDefinition_t const TOKENS_ARTIS_TAU1[NUM_TOKENS_ARTIS_TAU1]; +extern tokenDefinition_t const TOKENS_WEBCHAIN[NUM_TOKENS_WEBCHAIN]; +extern tokenDefinition_t const TOKENS_THUNDERCORE[NUM_TOKENS_THUNDERCORE]; -#endif +#endif /* HAVE_TOKENS_LIST */ #endif /* _TOKENS_H_ */ diff --git a/thundercore.png b/thundercore.png new file mode 100644 index 0000000000000000000000000000000000000000..49758acfcb54f801e5d8b286f5e8194fec72760a GIT binary patch literal 2504 zcmV;(2{-nMP)4j&hffkZVvP5vBCe09}k5M3qR1 zghZ1>f`S6cO(aB>3XoD@iGm^&NrQw)B)dX1;B<%vyF?&irQq^`a}F^i4)HE}v$J=* z^JZqhW_I`P_9vYs@80d+&41^;H*enVIKJ;gS$MtnJOCW$uPy+z_-n4TFQI200JivR z4FERq<#zh3+D{q8njl`Ujg3CfU)>rtdS2GKNGQ&#+v#uEIEhg~xCmzf;NlnvkOT^J z9RQY1iep3&Zi*HG;0)P08LR-nk_ppRNDwZ>6#zI*c1|X@u|0|ilS>e8nwBQGMU^Amq3uDkv%v(9Fux}or>J_!QX_^{4)Qi85J7l4WO4?5GYe!>Nu1$r z9fJtMb5j$6bLSIL-m^9)C)9m&j?cmrM)iUaa!l zm4Vy23jllBnSB2-!1mRuztUoKd@_i#cx3eldHcA~x(4q4^RXY}_1bm$aVNrvD{8XN zlDCZmGYjB$9#Ao!RO&lK25lehA#39{DtBJ|4xBx2knI3F;PsA?trfEFcKTfi1+i_e zuwlx^+4DO7m7dlA?rD-=Q$cPTcJ}Y@vt#k*A!Q2b=dwsH20AT)ZlvPL#zqn z?0buBE0^->&H{3uk7*DJ(j~hMfw6uSU`Xpd{zPfEY~gzk@*bIK5SlDI&b*?u1QTNW zDjWQjjo<$u?-`i}&hDQr>?%K!-3D-8`V}1a=&+%R#Qhk)9{xr$mL1~n{s#X2*VzB! zxubZS=K!AlK(^-r(=SmgP;hMX<}|OfwSwawi8fdMAFT{uhsX9d&kq}UWK5l`6Nb z=zQJ7w=`n-tXHHH<1X12L+G)EVFTWXN#6b4*rCk}l4M)i{KP|z^9{xd?21e2gnj=R z**3&sb0N$m9=l^Cd*HOcjGy0NC~e$iC5>E@9XIga@oDC$NH;nckB?V%-iEYguE0hQ zi8nUY8ch(UE`0Ak*%vtqxCcHCd{Krg+P`;-T>!ysAU${V_!w4WuVLp9dbJkOT;)$D zN-^6*n3KLW_&1tcQW2y@)RRd8J3-i*HBw3uG(^FRgbiRd=OOtygLyG9El7Hkk(Zpp zq#F6>Lm5Hl#Hh)NClhV3m-RptJ}cN$hvv)-29k*c!#+f3b_|}yJsLz!S?B5{r9ee6 zkW3`Vhqif`S+G((pbd|orZ-(ObIMZj-X?i(YAh7lSsAIDLTC5W1Plym3SXE%sS)OS zhy|Rf6N-cS>BLZ&C>yC1Q`A}z)z@QJcLFjK6|h6L)Cu`7t^X zPFPAV7Drys^_)!C#^94%DlriM@5-y)wWz;&#mMqqY|2)FE&zy;(7URpo`Oj7S2|Or zGf{EmQvr3NmL^L~Z=)lYnyM5gDvG~b|Jz?`*+aw>jBM&QPj1TJ`iN|+8};iULV8=4 zd%_vQBr&8}1BJ<}6SWg0UgWkDFCJjCjs3)QI-74HX_fl>52%~T3X1C@y(40(lFLaU zD4y#D=FT}3f24@-JtXh0BlQtv_HxV&MXL;>ch0I{lS}tb4fZKVK<6Subjn zT#T0S3`&258Auh(&j@uGP_i>0| zNE;nrBops-{?qR*`~rKFZn6TClIFCEkXDBzZExtljnXJr5a}&vKB?!@g|s@H)@PDq zj}|U}40b7qcgHf{@Pv-U^N0bGDwR?5AMB|>e7z;>ki;SP4eoyNFnbO1z1GG+`Qqf>?L#6m#ZkO#BDaAZ(S@ zGS>;bqSzW#Ua!5} zEU8*LD{iMh7z2nihSGJB8mtm)^Ozuf+3DL&`#WEY!Y6`o7Wv|b4R&~>TJK9L2p^!*ukDz@eazSM-oslYb6ltm24Q~k~(gl;o<)Uv`CuvbP?Dl(ZY5x&y#m5EqkIvtn? zydoQcr=^e}AzYZn2~OQ(k60=qM2HbVLiiG{nA^WN0b`eSKGV0X8g=Kvs31|eIP?6~ z9Rq>Zd8rQef>o0uM6o7_3~t(v^H-NIx74bUSlH+|R=^iFJ~sM>2~(5`0Qes%525Ud SqHxOq0000cn^ literal 0 HcmV?d00001 diff --git a/volta.png b/volta.png new file mode 100644 index 0000000000000000000000000000000000000000..5bda6b7969883d400277bcec1abe1cada2f23629 GIT binary patch literal 2923 zcmV-x3zYPUP)|h&=FI)YGGuxf{&g{<2Ib+85{G^rTncbP)??30e&6%03L?S_}MQ`UwI}tUC zSDc8-#jADIzC?P4iD+89t`gB0UOj^?7t(%8BY_Fh+c^TGw~JRiL`L_^un-C2T<95W z84F@3S_KgzbP>_Xbs#_{AkgoKs9&czS_BcUsGEomvy~fz0U|o1!?h_1B7`_iL#JJ#z{QWMu6I|f|Wo%`H4rb8blhr9sBjijZ zMxc}l8#CAl5$%w_vUf%V!3*{_i)@6PW=kT1g4x<4h!`DFqj2>&AZ(t*K0>D7g4N&*Ks~b+TL(k zk-Kuw(_bj2j&D^_S#^%_nKyp>0X_Otj*d+mZp$1Y?QC@fWB;*AdgTXOl45|W-MQ?2 zJ~1?i1o6Q1M?NNs1o|)TA^!b;peb>CA7+rsVmJ;`}l(v1T@9t1c z%(IPf$>hHm3{g^n+sckF>o8$s&RP_ttR|Nlb{9~2&EpIQ!FF+My_WwQ`eWouS zt6=YitHb+sXJE_!h|%>=XAD)LD-Ty|jGb8k*s!~hrj zri|q>oP<@ScB0s_g*}x|5q(yz9^t<@B(xpjK^(P)lhH|tb>qD`wj4perdip)Gw$Ey z#xJN>tJXs)2;zopbe#Y79k$HQxi=?RN=m|Y>1IaK{VmH=>ud2}9RhF?$j(Rqd|>4N znSd+1@@GElU$#wEWN|60fgcQB2&EvX$nD6C?8KG+du$CxoNl)@J;}4X>Ky*vy%0J< zU^JP#lC`~^z$n3pvLh2(1)0lAl&Ten{Fgsr%!XkqGUH}qe3*ZxOtNiN?C}bzuL|KC zA=|iHnUMJEOdun(QyW00W#5mH`YI4QLGmR1r-fPXf%4%jPf6DT{MSEWf;fszWTP)^ zgu0hyGJb8IE%SpcSqK|zLXd{tg=|@vQEB^!P7r&KN++^FugcsCuSHaTL+AvNRll-8 z?*~~+MU|V2dQTUJZ-mV8?8r}`Uu$m8WKE0^KiN@P4L{Z6r=H1#YGrOGe1b^)JhCIN zRko~eC2Mu4Vz10q-C`(%y6lv!mp&A-9NDOH(=Ap-c0hR{lxgqyFt0nj2(o=2Z?)sd zmAOL|V*8hjS&Le?$(Dow*^%t!e1`13vTdr8C{9pGuGN*wnwnnFCJ4^*VWNQ!ZoJ1^ z?T8~XL)(G7+P<%dE%(yCcgvO<-r1F1L*fNxK_JApf8S)xpK55;bG`v_M0RdG=LMb; z%f62cnaHXXH)XRes3s0PH}t?aeznySJkw3{^a_q>`;lJ1GoL=(Hc!i=&JzjRj%;Sj zAZ`#HfaiDd*(|EAQE7z8G8tLA=?B@>N;ub0de}MdN8nGr{?8Pf_wna% zFG)YI%GQH;rn6uC%y*vAaW^2Oz;IE;o2{)2{NKE%i2gNnpOzlU zD{L>!-CL%qTZ^>wKneR4_VsLg2`w!q=;IH0;pUZwQ@Qk&S8AxKnD6T^zr0POf9Hj< zB7cA&jk<2{2P42BIh(A_KN#w{m&%RxGm8$>?2j^5dO%Z`RZYaFxNCr2M;G!$G<{f+{|_%a?> z#&S_e%ydURRNI_S%Zmxe?WBS;fQPI4jrfSwK* z^v2~mKSawG6lJ+`vwATL~#QQ`Oa&%(w+~8kl0s{lc|Fi11WFM zU`yOQtgf=vir@$Iy>?5Qrg{NK{_zai6U2J^)JK8%bsP{Fr2&gUrUs@UfjsLKLG|rZ z((t+RpId3XvB0+xFDT3B*Vc_n@kvZ({p;_ zan~9ndbMtXX2XadWSiuGXCwWby)^*v!)51Ef&xc6UWV)GTeaPKA^BXY)WfqslwWmY zkhFbL5OH_@fsJmNC%{1Jv#9LRRr*|{h(NK}+#-m09@0=`|5alsdInXvV76w02*sjU z5KnXJ{<)SqM%qg%T`3Fa#q+@3VYJ0 zoz-lqYygri5+@u-NDA$$Q-vZ7hTY6v$S6q9V9RtQiZX^6!j@^t=(17~4`+{_vF;7T z4A*lOJWZGq8-6uPiCqC3z3N2_@-w$rWC-!7cudQHc!0fQHsypTmt{vh>G*W?gy|&c z1D=*u;BHY8#6$>#Lh>+MxiP?qIHMwji55Xj#JTw{G4XD_*Dk~2OkclK)$IqZf}|qE zX&0~fIuK}BOx3|CxS&&nR00!3hH!0-;uRN!3n7cA^oMAVqqcU^kqbGbkbtm_;VhZ@ zIS5{MrGz4^Bk3PL`iAU`y>H}u(hvds$d zSrQYh(M%ktK$@-Rx*0}>A+Pj4Y`kpCNh(`}1Hv}M6ZNw%0Bo|UY3_-RQXKKth4hXM zm}(Y!(t;JDTNafJ21WRm3}Kyw3P7f}Ux@eEfT?1kC(Mg~gy9u{X1U!VTLPkTQ7Q40#~f z>7@@bkC{!?(jpT0EQtwLYbI_0SgJ_l+!vM-vftd^cvkEnBXJT@YbHK|M;S`M5K4~+ zEnoMd=s~eceT3n40NIK*%e@JmWSQTJ9T4;(0bv`%DWRTDTww^XMyn5Q9ygnsXV(kf z5LPwy0RSJTwakqnl)N7tY~Va=jzavG8Fql;uydQ`)`U-L@y6^5jzUV6 zP|!=hmZDW5`Y=N@p)}n!t#WGuCcQO(XDQ6QAu7BIg+jU>=7xa&1D-$oX@#s<;RWgm zGP#fy{t;0-f#(X*u`lER(7Uur?hYYG0LvRf$pM!(#setD0RV&mfIh;|0gs!+HCtfH!;DkbKm^ue|PNW1d$9tS37cz zsVNqPC8DvGdGYn}LF(RJj@({$4rcGS>%5M~ov5w9<>>7fGmv5aaq@JT-RB<8&2aSg zvZ3?y#hzX9cAcAFdJof?eV}4y z!Y<1qmg2+rer7GF?cEI@pT!s&8g{f94wI3(7urQLVW7KTJ;0l93C)mZkp{p2&4*Z| z(OB#3wGw>PkReN*Wm)7GpTYOPcf?v}SR0A=kNrke{^<9=hgB<<0RX(bw8%(J!k^`y!TF0<1ag^a$sA=oe$s`Sx|_1JfdQbIS84(9%~txpB)sr~c(O`< z(HTzpaE|NEmd?)?yLsm76tA5Yax?aE$^|9mvY0DCI?2IiYU^*I{ZWUt?CtG^)TBgF z*}Ot-zF1OX0s{P9>q^T`PvQLPZ@09erR|I#bOPIea{n?fk1$S>kH zOlri^e5Va}TJKuR8nqfZ>H9=woyCDnuDQyWc*uKq?|`50Ow_g8)FYd@0%TMO0Gv8q z$|zQVXOfe#k7KTyZnvWK?pFdijarSgWbXf`K&H`^1z8mW z2<_=13A1(op%FJ4W-?$HhCyyds;I2ecQ3Pb+Wcac7>ee znXTkKJ30Rejx5h?9d?1)3JmZ^VglD(Np;c(c*EktlCzkalFwWL3Mi!Mb}MIevPh#r z`o1Jl+0P3~IQBPobF_7S;w-ZFr$DWqnYcDI-9g*E`vN(QT8;hu(N&3jqbm!tD+CaB zh*D;&v#T4`HQZO8Z$6afK=#7S)$U#K@Yn0CuVEwsPvE%oV?XD=IxFySV}sQb^mq`)Iz?W-V*fYGmyfU&3BcT#m_S&#Yy` zx=5^zT%$y@1mt9-a?I7uM(!xlf<~=IMk?3r$~hUFjUoyGgq^$8B=Ko)A1++vu3wQd zadIP=3>Jw$i%?WnfoIQT z*-1lyVhXwc(1@Fj&4^wf1prW~7-XfVh=w?e$|~^wJ8#3wOA7#4xjX`!HbimeDHa9> z2JzO9k3yxg{pDV@ayef6@!J4^tn?JlHEuLCp7VoeJhlX(O{6$WkRN%^y(M@LBUTDh0^t zh09m%y8l8@R3UkVr5yK2{I<=K?vax`5AdPvbTEu~^Xwh}2l(rexN|!~f`bshZHu*j z+A%6_u5vQD=BoHirDEm^P|#!nz@v^QsJ+pE*qDs~rrjes>HF}jkN+T$Evu-)@bCy0 zFP`2yW$BBdh>ML8eH%`fp2K@T`$vw#KFcdaXSYcp8^3ik;$ma0<%3yiSh+lcW3K9N zHQ}MLLvXH2#ULv!g;S@*WNA|TNZ@?(_URMg^Z4lp`^SL-#M6Ntvj5PE~=2O zZWF3&>NuTp)9qFq`}OYxvWW?CDERCnYdJG58Ih}3ab%>-RYF`Wf`bCA<-UHiU_>Z4 zikd87I+8fsJ+gIkG$O*p6D9eR#N5m@&OBi@d@n0Mif7?sbq%^^y*YZFAGU6Zww5WS zC@2>9*z$+P#b+uxb0#HFTp^uZ-MChJ!&)YU2x1BrDyuG`x3Aw?4hr95W?2?RWzyS>@FSfT7=}S++Fnkb(&h?qfM5m?={tPiRY`f}oawT1;S_~*n|g5hD%aJJBN2@H^2#;N z!}Im=LCUOI{A~Ey9$Pm@BW&psfgH=SI9)2-^QETlCX5}A1@#QW2z+l+!(zE{ib4Rf zNus#fVp&$uVN02<$4|O&y>2FblMo{5RuMBzQV%&UHU>*VXXZ--gF~otg1G{msF1?a zvz!Ul2E$rJu3052%TE(ZPuXLgpYY*#v{D0x>Y6&vn>Vd^30FJs8f9nCV|-#lR90@B zrjVz-eFB$*)Wf@8C(QAZiaPRhYWcrz3;Z|l>h*d&e$pk76MM_%8WhNl(-Z;-(}ccr zAX8M1QYsjkNd>Mt9(SVlMuWA?FbuNOB}QAbOqA5uf*8c zj0sq|JOUdGYei*GoZ>D~*cHD`w8I93(LSjGLrvXHUE*njSr0-xYcyqT2`qTWJ&n8#MrWF1IG(JIy#1ms!Iz#UoKptkkWJKF)}jq zp_=6pVTjpi5S7g_TmzhlvhHp z^Ar5}>vc$on~8x32KeLSKm18>&3^L$GE?^=G-P_sJi`$5JncodsYmp>mcOlAHsNpn z^3Sc;866$N(VzSaCMT5*Mu|c65r%dE5zfA`R;xu@eU;>bp843GoGZHI>_*!VcgD=*l6zJm;@38gL6MLR84R$apFmNs~M+rHPoMx(}>RV#4! zs|SK(pPb0YU(f0jY~jnx*Ic-X0cj=rh^X%ZM0DG056*=GpE4?yO1M>l2bVx7z2e#8 z?`s4@=z0bKC~)4zZSg?S-P_*WJncFmG~dO|aeD}m4}dZNU}i>6!$tEE56>a=_khK@ z_~5}9AvodE2Dvv6`i#vNfmz;OI)(p*BbzUJZ~%G?&!4?jA^jaqH$gG)clJEU&Qta1 z)UPcCPCSHBk$0Tm9=GR%o}QLLOM$caV$|Gi^wxzM0EkD6JjjhvGlnB0BPMHFq#$Cb zVy2D)7;tK{+!RXjy2;cuG`mi)JZZ$-GvuWY83W*))%$J=C8We`Yq zr3;Ax@RH&!b5FV!sgN#w}hpH{R`8BrcSYgl36DMkD7W} z;AH>;EqZVOLS8qw--tVc8n@#t% zy3jTPyUwBj; zL&!;Zf>{e?f)e_gxxM*U3q8T+^akIhkwJ_~bDVhQDf7|Ju*@sH9St^x$ZhTuCI+95 zj1QPT)%t}F6M_VIKJ(3o0yqwpCb!Rc>+ZbLJRC{@3Ji}9o5HhqL2zV#X}6%267s6K zz0vMWJ6STa^bzY437DT!z%^S_yBI>yLV$0ZE`Gp&{F$6yV!67#o zjZG1tf+h4Lb9?jW0A$%SR*{^=(9n&GCp7Fq5H_2FBmoev!2D)13Xn?xTc*a;r#;3N z;l3OW;*2Cx;vc?#0}C3*5E@A-SxX64lj%<_`C|H`WM7}ph7$~eVhF$xD2$ZQRzgS% lSf;+;YqT17?<(rG_