From 152a332b3465e6546e4f959b8cc29c0765e8dcf5 Mon Sep 17 00:00:00 2001 From: Charles-Edouard de la Vergne Date: Wed, 10 Apr 2024 15:30:56 +0200 Subject: [PATCH] Rename 'test_get_pk2' to 'test_get_eth2_pk' and use rather ETH2 public address --- .../snapshots/nanos/get_pk_700/00000.png | Bin 360 -> 0 bytes .../snapshots/nanos/get_pk_700/00001.png | Bin 490 -> 0 bytes .../snapshots/nanos/get_pk_700/00002.png | Bin 502 -> 0 bytes .../snapshots/nanos/get_pk_700/00003.png | Bin 383 -> 0 bytes .../nanos/test_get_eth2_pk/00000.png | Bin 0 -> 441 bytes .../nanos/test_get_eth2_pk/00001.png | Bin 0 -> 474 bytes .../nanos/test_get_eth2_pk/00002.png | Bin 0 -> 509 bytes .../nanos/test_get_eth2_pk/00003.png | Bin 0 -> 490 bytes .../nanos/test_get_eth2_pk/00004.png | Bin 0 -> 455 bytes .../nanos/test_get_eth2_pk/00005.png | Bin 0 -> 493 bytes .../nanos/test_get_eth2_pk/00006.png | Bin 0 -> 442 bytes .../00004.png => test_get_eth2_pk/00007.png} | Bin .../00005.png => test_get_eth2_pk/00008.png} | Bin .../snapshots/nanosp/get_pk_700/00000.png | Bin 400 -> 0 bytes .../snapshots/nanosp/get_pk_700/00001.png | Bin 769 -> 0 bytes .../ragger/snapshots/nanosp/test_get_eth2_pk | 1 + .../snapshots/nanox/get_pk_700/00000.png | Bin 400 -> 0 bytes .../snapshots/nanox/get_pk_700/00001.png | Bin 769 -> 0 bytes .../snapshots/nanox/get_pk_700/00002.png | Bin 364 -> 0 bytes .../snapshots/nanox/get_pk_700/00003.png | Bin 381 -> 0 bytes .../nanox/test_get_eth2_pk/00000.png | Bin 0 -> 477 bytes .../nanox/test_get_eth2_pk/00001.png | Bin 0 -> 904 bytes .../nanox/test_get_eth2_pk/00002.png | Bin 0 -> 820 bytes .../test_get_eth2_pk/00003.png} | Bin .../test_get_eth2_pk/00004.png} | Bin .../snapshots/stax/get_pk_700/00000.png | Bin 8677 -> 0 bytes .../snapshots/stax/get_pk_700/00001.png | Bin 13728 -> 0 bytes .../snapshots/stax/test_get_eth2_pk/00000.png | Bin 0 -> 21558 bytes .../00002.png => test_get_eth2_pk/00001.png} | Bin .../key_handling/key_derivation/path.py | 40 +++++++++ .../key_handling/key_derivation/tree.py | 85 ++++++++++++++++++ tests/ragger/staking_deposit/utils/crypto.py | 55 ++++++++++++ tests/ragger/test_get_address.py | 48 ++++++---- 33 files changed, 212 insertions(+), 17 deletions(-) delete mode 100644 tests/ragger/snapshots/nanos/get_pk_700/00000.png delete mode 100644 tests/ragger/snapshots/nanos/get_pk_700/00001.png delete mode 100644 tests/ragger/snapshots/nanos/get_pk_700/00002.png delete mode 100644 tests/ragger/snapshots/nanos/get_pk_700/00003.png create mode 100644 tests/ragger/snapshots/nanos/test_get_eth2_pk/00000.png create mode 100644 tests/ragger/snapshots/nanos/test_get_eth2_pk/00001.png create mode 100644 tests/ragger/snapshots/nanos/test_get_eth2_pk/00002.png create mode 100644 tests/ragger/snapshots/nanos/test_get_eth2_pk/00003.png create mode 100644 tests/ragger/snapshots/nanos/test_get_eth2_pk/00004.png create mode 100644 tests/ragger/snapshots/nanos/test_get_eth2_pk/00005.png create mode 100644 tests/ragger/snapshots/nanos/test_get_eth2_pk/00006.png rename tests/ragger/snapshots/nanos/{get_pk_700/00004.png => test_get_eth2_pk/00007.png} (100%) rename tests/ragger/snapshots/nanos/{get_pk_700/00005.png => test_get_eth2_pk/00008.png} (100%) delete mode 100644 tests/ragger/snapshots/nanosp/get_pk_700/00000.png delete mode 100644 tests/ragger/snapshots/nanosp/get_pk_700/00001.png create mode 120000 tests/ragger/snapshots/nanosp/test_get_eth2_pk delete mode 100644 tests/ragger/snapshots/nanox/get_pk_700/00000.png delete mode 100644 tests/ragger/snapshots/nanox/get_pk_700/00001.png delete mode 100644 tests/ragger/snapshots/nanox/get_pk_700/00002.png delete mode 100644 tests/ragger/snapshots/nanox/get_pk_700/00003.png create mode 100644 tests/ragger/snapshots/nanox/test_get_eth2_pk/00000.png create mode 100644 tests/ragger/snapshots/nanox/test_get_eth2_pk/00001.png create mode 100644 tests/ragger/snapshots/nanox/test_get_eth2_pk/00002.png rename tests/ragger/snapshots/{nanosp/get_pk_700/00002.png => nanox/test_get_eth2_pk/00003.png} (100%) rename tests/ragger/snapshots/{nanosp/get_pk_700/00003.png => nanox/test_get_eth2_pk/00004.png} (100%) delete mode 100644 tests/ragger/snapshots/stax/get_pk_700/00000.png delete mode 100644 tests/ragger/snapshots/stax/get_pk_700/00001.png create mode 100644 tests/ragger/snapshots/stax/test_get_eth2_pk/00000.png rename tests/ragger/snapshots/stax/{get_pk_700/00002.png => test_get_eth2_pk/00001.png} (100%) create mode 100644 tests/ragger/staking_deposit/key_handling/key_derivation/path.py create mode 100644 tests/ragger/staking_deposit/key_handling/key_derivation/tree.py create mode 100644 tests/ragger/staking_deposit/utils/crypto.py diff --git a/tests/ragger/snapshots/nanos/get_pk_700/00000.png b/tests/ragger/snapshots/nanos/get_pk_700/00000.png deleted file mode 100644 index 63778c4169411ca4774809154a96dc72f5c42bae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 360 zcmV-u0hj)XP)HURZg zU#;!I6v}uC14u>Wzu%t~M|bV2960SMuqve?yps9TMsY)35@zlRZ#{(u_c+YW+skW+ zRW*^TdY7SAq%~6f8N`9)aj`tn3$qBo0APUMk}s(as$%#nVC88;7=_~UiasD8G*2TI zf_ diff --git a/tests/ragger/snapshots/nanos/get_pk_700/00001.png b/tests/ragger/snapshots/nanos/get_pk_700/00001.png deleted file mode 100644 index 63fe23c202995f73b294fdb8e11fa63c3a1400ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 490 zcmVU(N@idYi z6_cMp-k$Q*GuSCWQX<7;xD3Sa>;*)ee$OM@Ui~je8hA24c{vYAIs40)Xe!*e-KeW`672$~4IO3C`1#@e)%D-v4h~+Tq@szTlZN*Whpf$fuv*B9FxSKFn_IaP| z1e$90MUOCeNrp;%@|psWTLQ(6zfk6B4i~*r$u-baa}Ij^E(wFcsQBbf?gdFL8ojW> zX-ZK0g+Z2l6VCh%a5At`jb({2M*v{K;W!IUwn=iYR4=KLH9{vw(r@Oz)K7J4lV%1% g5ClOG1Vlvi2Qc$qiBrvOT>t<807*qoM6N<$f{-@j3IG5A diff --git a/tests/ragger/snapshots/nanos/get_pk_700/00002.png b/tests/ragger/snapshots/nanos/get_pk_700/00002.png deleted file mode 100644 index b79ecb43ccc204a0e147181d8d9bbd1db490c876..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 502 zcmVg?mw#u{rUBK^Z6C^r8(Ka)5{_QIaG{l8j~F+J>C#ugt!0$49+D zj>ekt7{xtj6cJuDz>+wl;}h^ZdIA$L?nSb!%|DX^xdYVi9YU5cd^0)5AUfmt8LFL# zXy1@|#o+PW#lY9qR97ENEBN^S5>MIYskxA4;rz4RYO^#THNoH7>I<;E*s2ohTJ{Uh8TqEI5!8(9dwPS3w6+)6_yo;R7nWm{oao&2 zg||*zHxv&_pJoSEe9!*3KBd7KRXtt4KlhJVAb450$BdRtv?su7_IBjI?*UK@Ko)XU sp}aueg(zYF>de>oPLd=^k|ddmKjvd-fU(=G!T z=-AJE4BLRg6dhD-B5aqQaQC8Gd!{Tw1IHuQ7G8Nc#-x1e8~YhR-?XxGipbfyDcni0 zHLsJACBkK_6+&U5?IWxktuY?$zd8StJ2z+^)NpSU3_jBPnoUY5(a73m7_Hc(^H&X zxd_2_w8R;n0wBo$i$bxF!EebSb>R#*0nlY(mZv0-0N;Sc7*|8*+{aNC}#p?jT&bFQe1 z=V}aVU?m*N7k%UGMC$nGwe_ z*re~e6p#uMYS)VWj~8XbXel}eR2PW`Q3_Ex6aB#tT47%piX#()1{!xe!Dmhv=OAl& zwSc8+J&4t^?JL>e06R#1acg~vQVg?zWfK6B+(W)r1;Bh{5d1K?f|S7#Z?oO!gN_s( z=YVXwW+tm_0BD`vC*jV29@Srv@ei{9(Mb!N5iL`f0S_m7AJ9;l^+h;q-7p9PT9a`c zL@(f^d6NR7NhfKZau6$oJ^@{C=X!qy77*Pt>7bJkPsv3cT=*>Far!3(|)I j7o-HH+cd*448{Ba5*hsjAJ}{x00000NkvXXu0mjfJ*>L> literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanos/test_get_eth2_pk/00001.png b/tests/ragger/snapshots/nanos/test_get_eth2_pk/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..e3a34c775d4189ddf5fbfaedbf0b8fcfcb2d9abc GIT binary patch literal 474 zcmV<00VV#4P)sLZ7_5gjSRiXpqE6K__u!vC?)+@B6%8tScf?4{I>q44Q|M@kd?*o5cb*bJ2 ztzh2rzrW_B7_ZiJ^u}ZkuH=uZ(1M(UyfdHKyQRK4(}UV+kb}`|+%Z(r=$27?r!|Wy zs-dPNJ8j1t%cCRJ=uf-4hJCq{dNmECTk|>A)WXqz6CU?0zU&Ejq+<~`VR~0IV!Yzo zEyD$F?92LKxlRXZ+7qB$&Efpn3P??D>PnIxlPy%eLcSH5B4&HR5s|>)^RTy|`Sqll zBuiv_a822@2cT!Kq=VWDuvAi?#%or!V};()Eo{Hajw5>0v;W8nOIpNYsD|NKV?f27N0CRbN{Y1o?@rtn5gPX zEuUEL&qGTtOw>X{xx=~I(+o&}aCaOq5NCEIYeM8n?ahD$jE=jo1%p*fzZqT2lrvx` zpB(UB9^dPtzs)-X_(@B~pU2k{OY6WREI!em=p~g-lq5VbVM|^WPGOCxVuEuswRuTVM*u~lVGtDNT~%XAW8`!i(O{|+8de@{{>_8%xH@K)>sXN^+I@!OV!}K zv3OgxfMCsFx9wmHf*=TjAh;#}R7RcWUX=N=00000NkvXXu0mjf08VHDWyOl5C{Z(@OmDfrlc^~rQQ^lEpUW6 z0o!sXLGKqi0Q!Z@?hrgK+jkAX&CwPME-FH<=*6~2J(7hhm8EyC7n++$IoRCb%|k=B zL%(tY@KE)O<=xBBflRL2o9@^iI0I~^Qjt%U**rJ_69O>X@6}q+S-*o*YQR+NF_33z zqAY_682}+yTERP|e>t(72O8l@h0>rYwF~6Ix#7ItRY54@z6MRYw|aWjRJ{nK1M`x5 zf6X5SSglF)!iX4r6Mu9HEr?GiZ(tg}Ez3*Tp-n1wsSYJMYfvkpSLh%UrA-52cz>z< z*?rB?H)j$ldYWF1JSEEyGSRd-yLzI%BvVSBFX8jAu-tM=CbQY5(`~DByi|$P)v7BYmWU~J^y+{?1h$68y0001>fcNY8xspcXkh&|Ja6oja zf3Mu25}edb5V5w z79;Kh(%a0y^j&A11WN*7pS1SuxMF(@BEm$)aF}c?63B_6nvmws#5l%hm>pMq(C#}_ zV;831rj+}w{mZ_Q;Miq-y(@^pnf#Y5bWOe|c@w((V(Spp8+q|3mV>;K`*K9r9ku3~ zioA;};ram$Iq$Z`A+*002ovPDHLkV1g|-)j$9M literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanos/test_get_eth2_pk/00005.png b/tests/ragger/snapshots/nanos/test_get_eth2_pk/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..f032e45c1c72f9554a5a1b7fd7f8bb195bafd5ca GIT binary patch literal 493 zcmV8icMQgKs(?hEWh!KfBjwDHvB#Gho@%mIHL1WYKsxa1I z`78xS%q_wn7rX#|L*3!P8bEL80^9<1nOLg=_KIKZyq7H`Y(3FC@$*UJ6gwG5qN$5o zp0PgfZ!KI{{w!Q7)bd`gc9;nZfF~1(8iu`RmKv<@VaXXV zmFF7Z-nfhr&Z;v2pR^!4Jie9~?E{Z+F+{o{w-lWy{!kW=|{Tea$R(9{Y zRWAZcn3sI^_negC)t-)Cm|TNT@{h96hP(&)RJzp{KY2Lw6I&Gq8hDpl3#u*BF0kTJ zh~1V})PbN;>Tf7>@V#bnzNz2w?XJhJr5yO?xx7?8tco=S#1a#9y$O$3tKU`ZI=$_h z6nqo5Hlydtu!CZot1aOQyWO6C=h&2CT2qkIuE*k}6y(W-SpHytPS{zu@h+&yhU?#) z*VJi&^Q!4-TmVll^3XljDqsTX_N{B6?+kF7$BpD1T@my4YSpM-Qp#$tsSK^U4FX!o jsFO;PBuSDaNeun~{j!zA2o2o?00000NkvXXu0mjfN(=3H literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanos/test_get_eth2_pk/00006.png b/tests/ragger/snapshots/nanos/test_get_eth2_pk/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..4118dbf8a7a2cd514f9390e54c03dc24d5d23e27 GIT binary patch literal 442 zcmV;r0Y(0aP)5(`~DBS7u$=@xD@c07&Ij1o8Cn51S)7tNs=T<5+DA4|9@RgP`ImlSJ~2n z95WpZm5z0{2)kXd1MD3Qn*+B1q^=HlIJVWK}uPSmsI7}ijKt3nVnbLNjp|{ ziE7E)*4y)=geuEVHYC<8mC|MpGr<9PGLEQ*7+dDlZAG|;NnM%XfZ29ueW}K}4ohOd zRNg+oQoj?!omDXaM_OPVYTuSx-3JzBR)uz9Ynt6~v}Ea*;ElR9dx z;&;D0EzOaSi^k{1;fl2cY-`ZM@#k(E*S`sOiJe$4xe0goo#jmMt!QD%tKzB8(G@vE z_1-U!0&w(q0k7F$4BpIlfY<1O8wTiFe-&R41Jp)@L)~fpXRCI7!~g&QfPa@`!PrJQ5_gtexv+u#;<7n?ZA>=8WP3sS)E3>Z zE!xY!9dS=7B}gQ@x;^0FVDIF?`GpenfZ9e>)xCO*lgBykAKe#*G9mk>o6EkWtAGi$ zGexMpHiozruqDn$Y{#w$*~F;G!$#0S7$x##_JEJys@+nJ)BK}UfHaSYH}BKlb~|vz<*qUayO&UL-bn@O u0WKrm9KB3jyJN~A3;+NC0000$MC1WGrw>UKISsS`00001mdRvL_`%2qAiN3%p5X<9QaG=EyJ=YkO}s7wU!)~cPjI1A?9o3u6DW_^3V=*G!3 zF;07CUSG#BO%2E5iesi^VtN9)H!=W1fA>5?M9ot9wCRP$G&MX2k+^$~nV6#jx_7S} zEk+`q$f8xU_KI1`C1ULvmGs6O05Wl>n#(he$pO$YH8&g$xZxC=y05a><1N**maG-y z`QM!TrekKOo;9y#6vo}=;45*1%;-Oc5o$*NVK@dW;V!h2MvyrMx1z(_Rzrg`D53=g zs$}oeb6sd^lVcj{u<{z8GLaK}geeo6o;4dH;^J6I{S~-^d(9$Wf$FKCaTE3?eo*4+ zi+8{MAue&kv98{yNS^h01a`Wmh*$;eO(B5=WKW1+=kjF1tRAzNrkcuYyxk!xUYaGw zjiqjIAid=UikhGsffkEQuP*hpW||s0SFO~R1H|SVYr;r$knnl=wwEp5j=o5T+VzMV zT_e#w06NhP^eUQkB>+&J6|Q=fbp_oDG2*GGgb+dqA;e_mUz7@_xHurDBCX64@<)A} z#XrnyzJx9QruxZjBt;C|9>pD1Uy|`_^C~tP073JaiB1Mty|Sl2?8YtwpyiZO?v=a) z=77a)aSTn)Q>uh5h2BHw=2?LdLI@#*klXnMFhL`qAQdp500000NkvXXu0mjf$HQfg diff --git a/tests/ragger/snapshots/nanosp/test_get_eth2_pk b/tests/ragger/snapshots/nanosp/test_get_eth2_pk new file mode 120000 index 0000000..dc7c371 --- /dev/null +++ b/tests/ragger/snapshots/nanosp/test_get_eth2_pk @@ -0,0 +1 @@ +../nanox/test_get_eth2_pk \ No newline at end of file diff --git a/tests/ragger/snapshots/nanox/get_pk_700/00000.png b/tests/ragger/snapshots/nanox/get_pk_700/00000.png deleted file mode 100644 index a487005a859c0e4cfa0212a67f75a4794d81978c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 400 zcmV;B0dM|^P)CI7!~g&QfPa@`!PrJQ5_gtexv+u#;<7n?ZA>=8WP3sS)E3>Z zE!xY!9dS=7B}gQ@x;^0FVDIF?`GpenfZ9e>)xCO*lgBykAKe#*G9mk>o6EkWtAGi$ zGexMpHiozruqDn$Y{#w$*~F;G!$#0S7$x##_JEJys@+nJ)BK}UfHaSYH}BKlb~|vz<*qUayO&UL-bn@O u0WKrm9KB3jyJN~A3;+NC0000$MC1WGrw>UKISsS`00001mdRvL_`%2qAiN3%p5X<9QaG=EyJ=YkO}s7wU!)~cPjI1A?9o3u6DW_^3V=*G!3 zF;07CUSG#BO%2E5iesi^VtN9)H!=W1fA>5?M9ot9wCRP$G&MX2k+^$~nV6#jx_7S} zEk+`q$f8xU_KI1`C1ULvmGs6O05Wl>n#(he$pO$YH8&g$xZxC=y05a><1N**maG-y z`QM!TrekKOo;9y#6vo}=;45*1%;-Oc5o$*NVK@dW;V!h2MvyrMx1z(_Rzrg`D53=g zs$}oeb6sd^lVcj{u<{z8GLaK}geeo6o;4dH;^J6I{S~-^d(9$Wf$FKCaTE3?eo*4+ zi+8{MAue&kv98{yNS^h01a`Wmh*$;eO(B5=WKW1+=kjF1tRAzNrkcuYyxk!xUYaGw zjiqjIAid=UikhGsffkEQuP*hpW||s0SFO~R1H|SVYr;r$knnl=wwEp5j=o5T+VzMV zT_e#w06NhP^eUQkB>+&J6|Q=fbp_oDG2*GGgb+dqA;e_mUz7@_xHurDBCX64@<)A} z#XrnyzJx9QruxZjBt;C|9>pD1Uy|`_^C~tP073JaiB1Mty|Sl2?8YtwpyiZO?v=a) z=77a)aSTn)Q>uh5h2BHw=2?LdLI@#*klXnMFhL`qAQdp500000NkvXXu0mjf$HQfg diff --git a/tests/ragger/snapshots/nanox/get_pk_700/00002.png b/tests/ragger/snapshots/nanox/get_pk_700/00002.png deleted file mode 100644 index 53ae65195fbea5b281a1bc1a80351dbf1cd79ff8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=-%ba4!+nDh2#AYZeBfa}G~ z%X2sUSKTFSd4J{-YHcY(QO5;J{<~e9q=7F?O4)!WO}6UUdH! zS+Hz=(4})vCM2-VD4nt3W%LdvkyzeG%km#`1t_mu*zR}#jNB{EKZnW}g5-=Bym-_% z`=7%C>zxJL|9msNSMXnbQRayy^)nr>EU7olTHqoc^vG(B%bo(Id*|kR{84!`z2x6n zZ`;PkbrPvd6U}A>Y0chs_tyHmLi6kw6c{>JvYiQ=+MTFTx8d*9^V|R0+_75oZt9or zLetinU!`YMvFyLCb8XxElhO0{v2rTkNR$jMW7~4}*8a52+MC^J%KMbxPN-JRb2RNP zEsp0ebAPS3=e2G53#Z$XZAI6Yd=YU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ diff --git a/tests/ragger/snapshots/nanox/test_get_eth2_pk/00000.png b/tests/ragger/snapshots/nanox/test_get_eth2_pk/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..bb3289d6bce137120f459344465baa35f7c87d99 GIT binary patch literal 477 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 G;XeS84)QAi diff --git a/tests/ragger/snapshots/stax/get_pk_700/00001.png b/tests/ragger/snapshots/stax/get_pk_700/00001.png deleted file mode 100644 index aa683fab0ac729098678b1344f3cbd3354b1aabb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13728 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 diff --git a/tests/ragger/snapshots/stax/test_get_eth2_pk/00000.png b/tests/ragger/snapshots/stax/test_get_eth2_pk/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..832d70e18f19948e333fdb90bda8b1366cd44907 GIT binary patch literal 21558 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 fux)qX!&|}u>t List[int]: + """ + Maps from a path string to a list of indices where each index represents the corresponding level in the path. + """ + path = path.replace(' ', '') + if not set(path).issubset(set('m1234567890/')): + raise ValueError(f"Invalid path {path}") + + indices = path.split('/') + + if indices[0] != 'm': + raise ValueError(f"The first character of path should be `m`. Got {indices[0]}.") + indices.pop(0) + + return [int(index) for index in indices] + + +def mnemonic_and_path_to_key(mnemonic: str, path: str) -> int: + """ + Return the SK at position `path`, derived from `mnemonic`. The password is to be + compliant with BIP39 mnemonics that use passwords, but is not used by this CLI outside of tests. + """ + #seed = get_seed(mnemonic) + seed = Bip39SeedGenerator(Mnemonic.FromString(mnemonic)).Generate() + + sk = derive_master_SK(seed) + for node in path_to_nodes(path): + sk = derive_child_SK(parent_SK=sk, index=node) + return sk diff --git a/tests/ragger/staking_deposit/key_handling/key_derivation/tree.py b/tests/ragger/staking_deposit/key_handling/key_derivation/tree.py new file mode 100644 index 0000000..53fcd0e --- /dev/null +++ b/tests/ragger/staking_deposit/key_handling/key_derivation/tree.py @@ -0,0 +1,85 @@ +from staking_deposit.utils.crypto import ( + HKDF, + SHA256, +) +from py_ecc.optimized_bls12_381 import curve_order as bls_curve_order +from typing import List + + +def _flip_bits_256(input: int) -> int: + """ + Flips 256 bits worth of `input`. + """ + return input ^ (2**256 - 1) + + +def _IKM_to_lamport_SK(*, IKM: bytes, salt: bytes) -> List[bytes]: + """ + Derives the lamport SK for a given `IKM` and `salt`. + + Ref: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2333.md#ikm_to_lamport_sk + """ + OKM = HKDF(salt=salt, IKM=IKM, L=8160) + lamport_SK = [OKM[i: i + 32] for i in range(0, 8160, 32)] + return lamport_SK + + +def _parent_SK_to_lamport_PK(*, parent_SK: int, index: int) -> bytes: + """ + Derives the `index`th child's lamport PK from the `parent_SK`. + + Ref: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2333.md#parent_sk_to_lamport_pk + """ + salt = index.to_bytes(4, byteorder='big') + IKM = parent_SK.to_bytes(32, byteorder='big') + lamport_0 = _IKM_to_lamport_SK(IKM=IKM, salt=salt) + not_IKM = _flip_bits_256(parent_SK).to_bytes(32, byteorder='big') + lamport_1 = _IKM_to_lamport_SK(IKM=not_IKM, salt=salt) + lamport_SKs = lamport_0 + lamport_1 + lamport_PKs = [SHA256(sk) for sk in lamport_SKs] + compressed_PK = SHA256(b''.join(lamport_PKs)) + return compressed_PK + + +def _HKDF_mod_r(*, IKM: bytes, key_info: bytes=b'') -> int: + """ + Hashes the IKM using HKDF and returns the answer as an int modulo r, the BLS field order. + + Ref: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2333.md#hkdf_mod_r + """ + L = 48 # `ceil((3 * ceil(log2(r))) / 16)`, where `r` is the order of the BLS 12-381 curve + salt = b'BLS-SIG-KEYGEN-SALT-' + SK = 0 + while SK == 0: + salt = SHA256(salt) + okm = HKDF( + salt=salt, + IKM=IKM + b'\x00', # add postfix `I2OSP(0, 1)` + L=L, + info=key_info + L.to_bytes(2, 'big'), + ) + SK = int.from_bytes(okm, byteorder='big') % bls_curve_order + return SK + + +def derive_child_SK(*, parent_SK: int, index: int) -> int: + """ + Given a parent SK `parent_SK`, return the child SK at the supplied `index`. + + Ref: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2333.md#derive_child_sk + """ + if index < 0 or index >= 2**32: + raise IndexError(f"`index` should be greater than or equal to 0 and less than 2**32. Got index={index}.") + lamport_PK = _parent_SK_to_lamport_PK(parent_SK=parent_SK, index=index) + return _HKDF_mod_r(IKM=lamport_PK) + + +def derive_master_SK(seed: bytes) -> int: + """ + Given a seed, derive the master SK. + + Ref: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2333.md#derive_master_sk + """ + if len(seed) < 32: + raise ValueError(f"`len(seed)` should be greater than or equal to 32. Got {len(seed)}.") + return _HKDF_mod_r(IKM=seed) diff --git a/tests/ragger/staking_deposit/utils/crypto.py b/tests/ragger/staking_deposit/utils/crypto.py new file mode 100644 index 0000000..48a9d76 --- /dev/null +++ b/tests/ragger/staking_deposit/utils/crypto.py @@ -0,0 +1,55 @@ +from typing import Any + +from Crypto.Hash import ( + SHA256 as _sha256, + SHA512 as _sha512, +) +from Crypto.Protocol.KDF import ( + scrypt as _scrypt, + HKDF as _HKDF, + PBKDF2 as _PBKDF2, +) +from Crypto.Cipher import ( + AES as _AES +) + + +def SHA256(x: bytes) -> bytes: + return _sha256.new(x).digest() + + +def scrypt(*, password: str, salt: str, n: int, r: int, p: int, dklen: int) -> bytes: + if n * r * p < 2**20: # 128 MB memory usage + raise ValueError("The Scrypt parameters chosen are not secure.") + if n >= 2**(128 * r / 8): + raise ValueError("The given `n` should be less than `2**(128 * r / 8)`." + f"\tGot `n={n}`, r={r}, 2**(128 * r / 8)={2**(128 * r / 8)}") + res = _scrypt(password=password, salt=salt, key_len=dklen, N=n, r=r, p=p) + return res if isinstance(res, bytes) else res[0] # PyCryptodome can return Tuple[bytes] + + +def PBKDF2(*, password: bytes, salt: bytes, dklen: int, c: int, prf: str) -> bytes: + if 'sha' not in prf: + raise ValueError(f"String 'sha' is not in `prf`({prf})") + if 'sha256' in prf and c < 2**18: + ''' + Verify the number of rounds of SHA256-PBKDF2. SHA512 not checked as use in BIP39 + does not require, and therefore doesn't use, safe parameters (c=2048). + + Ref: https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki#from-mnemonic-to-seed + ''' + raise ValueError("The PBKDF2 parameters chosen are not secure.") + _hash = _sha256 if 'sha256' in prf else _sha512 + res = _PBKDF2(password=password, salt=salt, dkLen=dklen, count=c, hmac_hash_module=_hash) # type: ignore + return res if isinstance(res, bytes) else res[0] # PyCryptodome can return Tuple[bytes] + + +def HKDF(*, salt: bytes, IKM: bytes, L: int, info: bytes=b'') -> bytes: + res = _HKDF(master=IKM, key_len=L, salt=salt, hashmod=_sha256, context=info) + return res if isinstance(res, bytes) else res[0] # PyCryptodome can return Tuple[bytes] + + +def AES_128_CTR(*, key: bytes, iv: bytes) -> Any: + if len(key) != 16: + raise ValueError(f"The key length should be 16. Got {len(key)}.") + return _AES.new(key=key, mode=_AES.MODE_CTR, initial_value=iv, nonce=b'') diff --git a/tests/ragger/test_get_address.py b/tests/ragger/test_get_address.py index 2d51ee9..0d102aa 100644 --- a/tests/ragger/test_get_address.py +++ b/tests/ragger/test_get_address.py @@ -1,9 +1,11 @@ -from typing import Optional, Tuple +from typing import Optional import pytest -from client.client import EthAppClient, StatusWord -import client.response_parser as ResponseParser +from py_ecc.bls import G2ProofOfPossession as bls +from staking_deposit.key_handling.key_derivation.path import mnemonic_and_path_to_key + +from ragger.bip.seed import SPECULOS_MNEMONIC from ragger.error import ExceptionRAPDU from ragger.firmware import Firmware from ragger.backend import BackendInterface @@ -12,6 +14,9 @@ from ragger.bip import calculate_public_key_and_chaincode, CurveChoice from constants import ROOT_SNAPSHOT_PATH +from client.client import EthAppClient, StatusWord +import client.response_parser as ResponseParser + @pytest.fixture(name="with_chaincode", params=[True, False]) def with_chaincode_fixture(request) -> bool: @@ -25,7 +30,8 @@ def chain_fixture(request) -> Optional[int]: def get_moves(firmware: Firmware, chain: Optional[int] = None, - reject: bool = False): + reject: bool = False, + pk_eth2: bool = False): moves = [] if firmware.is_nano: @@ -36,9 +42,14 @@ def get_moves(firmware: Firmware, moves += [NavInsID.RIGHT_CLICK] if reject: moves += [NavInsID.RIGHT_CLICK] + if pk_eth2: + if firmware.device == "nanos": + moves += [NavInsID.RIGHT_CLICK] * 2 + moves += [NavInsID.RIGHT_CLICK] moves += [NavInsID.BOTH_CLICK] else: - moves += [NavInsID.USE_CASE_REVIEW_TAP] + if not pk_eth2: + moves += [NavInsID.USE_CASE_REVIEW_TAP] if chain is not None and chain > 1: moves += [NavInsID.USE_CASE_ADDRESS_CONFIRMATION_TAP] if reject: @@ -90,18 +101,21 @@ def test_get_pk(firmware: Firmware, assert chaincode.hex() == ref_chaincode -def test_get_pk2(firmware: Firmware, - backend: BackendInterface, - navigator: Navigator): +def test_get_eth2_pk(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + test_name: str): app_client = EthAppClient(backend) - path="m/44'/700'/1'/0/0" - with app_client.get_public_addr(bip32_path=path, chaincode=True): + path="m/12381/3600/0/0" + with app_client.get_eth2_public_addr(bip32_path=path): navigator.navigate_and_compare(ROOT_SNAPSHOT_PATH, - "get_pk_700", - get_moves(firmware)) - pk, _, chaincode = ResponseParser.pk_addr(app_client.response().data, True) - ref_pk, ref_chaincode = calculate_public_key_and_chaincode(curve=CurveChoice.Secp256k1, - path=path) - assert pk.hex() == ref_pk - assert chaincode.hex() == ref_chaincode + test_name, + get_moves(firmware, pk_eth2=True)) + + pk = app_client.response().data + ref_pk = bls.SkToPk(mnemonic_and_path_to_key(SPECULOS_MNEMONIC, path)) + if firmware.name == "stax": + pk = pk[1:49] + + assert pk == ref_pk