From c4654045bbffd9e74a70ca8cd67f3cda2e858901 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 14 Nov 2024 13:35:05 +0100 Subject: [PATCH 1/2] Ensure temporary pointers allocated in G_io_apdu_buffer are memory aligned Memory access of pointers to data types larger than one byte need to be aligned to 32bit words (or 16bit for shorts), as required by Ledger Nano S's hardware, and for other devices by the compiler flags (presumably, as other devices do in fact support non-aligned memory access, however without memory alignment the app froze on the unaligned memset in review_entries_launch_use_case_review since building with the SDK's Makefile.standard_app as of 5542f4b6, but not before that change. I did not further investigate, which exact flag introduced the issue, or whether maybe the accessed pointer was 32bit aligned before that change by coincidence). Note that speculos does not enforce memory alignment, which is why the issue did not show on the emulator. Two instances of unaligned memory access existed: - in review_entries_launch_use_case_review for a nbgl_contentTagValueList_t * pointer on NBGL devices Flex and Stax, which caused these devices to freeze as of 5542f4b6 on memset and memcpy to the unaligned pointers. - in on_transaction_approved for a cx_ecfp_256_public_key_t * pointer on all devices, which was not harmful though as only uint8_t data was accessed, which does not need to be aligned. --- src/main.c | 8 ++------ src/nimiq_ux_nbgl.c | 14 +++++--------- src/utility_macros.h | 37 ++++++++++++++++++++++++++++++++++++- 3 files changed, 43 insertions(+), 16 deletions(-) diff --git a/src/main.c b/src/main.c index 7fc8715..b0e9501 100644 --- a/src/main.c +++ b/src/main.c @@ -179,12 +179,8 @@ void on_transaction_approved() { created_staker_signature = true; // Similarly, overwrite the public key in the signature proof with the ledger account public key as staker, with - // G_io_apdu_buffer as temporary buffer again. Check with a compile time assertion that it can fit the temp data - _Static_assert( - sizeof(cx_ecfp_256_public_key_t) <= sizeof(G_io_apdu_buffer), - "G_io_apdu_buffer does not fit public key\n" - ); - cx_ecfp_256_public_key_t *temporary_public_key_pointer = (cx_ecfp_256_public_key_t*) G_io_apdu_buffer; + // G_io_apdu_buffer as temporary buffer again. + DECLARE_TEMPORARY_G_IO_APDU_BUFFER_POINTER(cx_ecfp_256_public_key_t *, temporary_public_key_pointer); GOTO_ON_ERROR( cx_ecfp_generate_pair_no_throw( /* curve */ CX_CURVE_Ed25519, diff --git a/src/nimiq_ux_nbgl.c b/src/nimiq_ux_nbgl.c index 2ea4ecf..a497b3e 100644 --- a/src/nimiq_ux_nbgl.c +++ b/src/nimiq_ux_nbgl.c @@ -141,15 +141,11 @@ static void review_entries_launch_use_case_review( bool use_small_font ) { // The tagValueList gets copied in nbgl_useCaseReview, therefore it's sufficient to initialize it only in temporary - // memory. We use G_io_apdu buffer as temporary buffer, to save some stack space, and check that it can fit the data - // with a compile time assertion. Note that the entries are not copied, and we therefore have them in global memory. - _Static_assert( - sizeof(nbgl_contentTagValueList_t) <= sizeof(G_io_apdu_buffer), - "G_io_apdu_buffer can't fit review list\n" - ); - nbgl_contentTagValueList_t *temporary_tag_value_list_pointer = (nbgl_contentTagValueList_t*) G_io_apdu_buffer; + // memory. We use G_io_apdu buffer as temporary buffer, to save some stack space. Note that the review entries are + // not copied, and we therefore have them in global memory. + DECLARE_TEMPORARY_G_IO_APDU_BUFFER_POINTER(nbgl_contentTagValueList_t *, temporary_tag_value_list_pointer); // Initialize list with zeroes, including .nbMaxLinesForValue (no limit of lines to display). - memset(temporary_tag_value_list_pointer, 0, sizeof(nbgl_contentTagValueList_t)); + memset(temporary_tag_value_list_pointer, 0, sizeof(*temporary_tag_value_list_pointer)); temporary_tag_value_list_pointer->wrapping = true; // Prefer wrapping on spaces, e.g. for nicer address formatting. temporary_tag_value_list_pointer->smallCaseForValue = use_small_font; temporary_tag_value_list_pointer->pairs = review_entries.entries; @@ -170,7 +166,7 @@ static void review_entries_launch_use_case_review( // static variable in nbgl_use_case.c and there's also no non-static method that exposes pointers to it. Instead, we // reset the temporary buffer, to make it immediately noticeable via Ragger end-to-end tests if the data was not // copied. Use explicit_bzero instead of memset to avoid this being optimized away. - explicit_bzero(temporary_tag_value_list_pointer, sizeof(nbgl_contentTagValueList_t)); + explicit_bzero(temporary_tag_value_list_pointer, sizeof(*temporary_tag_value_list_pointer)); } ////////////////////////////////////////////////////////////////////// diff --git a/src/utility_macros.h b/src/utility_macros.h index a2b0e1e..48790d2 100644 --- a/src/utility_macros.h +++ b/src/utility_macros.h @@ -56,7 +56,7 @@ #define STRING_LENGTH_WITH_SUFFIX(length_a, suffix) (length_a - /* string terminator of string a */ 1 + sizeof(suffix)) -#define STRUCT_MEMBER_SIZE(struct_type, member) (sizeof(((struct_type *) 0)->member)) +#define STRUCT_MEMBER_SIZE(struct_type, member) (sizeof(((struct_type *) NULL)->member)) /** * Copy data of fixed size to a destination of fixed size. This macro performs a static assertion at compile time, that @@ -73,4 +73,39 @@ memcpy(destination, source, sizeof(source)); \ }) +#define POINTER_SIZE (sizeof(void *)) +/** + * Get the offset of a pointer from 32bit based memory alignment. Memory access of pointers to data types larger than + * one byte need to be aligned to 32bit words / POINTER_SIZE (or 16bit for shorts, which we don't handle separately here + * and always use 32bit alignment), as required by Ledger Nano S's hardware, and for other devices by the compiler flags + * (presumably, as other devices do in fact support non-aligned memory access, however without memory alignment, the app + * froze on the unaligned memset in review_entries_launch_use_case_review since using the SDK's Makefile.standard_app + * for building as of 5542f4b6, but not before that change. I did not further investigate, which exact flag introduced + * the issue, or whether maybe the accessed pointer was 32bit aligned before that change by coincidence). Note that the + * speculos emulator does not enforce any memory alignment, which is why related issues do not show there. + * In any case, it's a good idea to conform to memory alignment. + */ +#define POINTER_MEMORY_ALIGNMENT_OFFSET(pointer) (((uintptr_t) pointer) % POINTER_SIZE) + +/** + * Declare a pointer of given type within G_io_apdu_buffer for temporary use, while G_io_apdu_buffer is not otherwise + * used or accessed. The pointer is ensured to be memory aligned, see POINTER_MEMORY_ALIGNMENT_OFFSET, and its type is + * checked to fit G_io_apdu_buffer. + */ +#define DECLARE_TEMPORARY_G_IO_APDU_BUFFER_POINTER(pointer_type, variable_name) \ + _Static_assert( \ + /* The memory alignment offset can not be statically computed at compile time, therefore we assume for the */ \ + /* static assertion that the largest padding POINTER_SIZE - 1 has to be applied. */ \ + sizeof(*((pointer_type) NULL)) <= sizeof(G_io_apdu_buffer) - (POINTER_SIZE - 1), \ + "Pointer type does not fit G_io_apdu_buffer\n" \ + ); \ + pointer_type variable_name = (pointer_type) ( \ + G_io_apdu_buffer + \ + ( \ + POINTER_MEMORY_ALIGNMENT_OFFSET(G_io_apdu_buffer) \ + ? POINTER_SIZE - POINTER_MEMORY_ALIGNMENT_OFFSET(G_io_apdu_buffer) \ + : 0 \ + ) \ + ); + #endif // _NIMIQ_UTILITY_MACROS_H_ From 3d61e8219faef493856695571262a39d09586193 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 14 Nov 2024 19:13:23 +0100 Subject: [PATCH 2/2] Update app version to 2.0.1 Fix unaligned memory access in NBGL UIs on Flex and Stax. --- Makefile | 2 +- .../flex/test_app_mainmenu/00001.png | Bin 7155 -> 7180 bytes .../nanos/test_app_mainmenu/00001.png | Bin 312 -> 321 bytes .../nanosp/test_app_mainmenu/00001.png | Bin 341 -> 348 bytes .../nanox/test_app_mainmenu/00001.png | Bin 341 -> 348 bytes .../stax/test_app_mainmenu/00001.png | Bin 6607 -> 6682 bytes tests/test_get_name_and_version.py | 2 +- 7 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index a2d5a9c..99ec500 100755 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ APPNAME = Nimiq # Application version APPVERSION_M = 2 APPVERSION_N = 0 -APPVERSION_P = 0 +APPVERSION_P = 1 APPVERSION = "$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)" # Setting to allow building variant applications. For now, there are no variants, only the main Nimiq app. diff --git a/tests/snapshots/flex/test_app_mainmenu/00001.png b/tests/snapshots/flex/test_app_mainmenu/00001.png index f39b025dc7c1b03a67768e615a723e4e8124c1e3..375e3bf683802d59b755c4cb7d24237b7ee0e8bf 100644 GIT binary patch literal 7180 zcmeHMX;hMF-zO_+Ri|;Z)UsVG(rU?*8!+)CwFk;jnZD4!K`Ee>JsoiN!~adD50|gb}Q2 zemz*4?V)q*?J?)=mo8-v*n7$$yX;|3Bi<%wecyP%sZH0`0`~l!_X*!Ljd%6 zT`uMcgWnLf19V4*&CmvA4{b3xXquzB?c177clJbP*Zjx3C$H6{kXe*Gkd8}@vrprY zD77QVTs|E$xNJW6YgZzg%r4Sef<+7k<1!FDW8A8Ay9Tk zG&A_bjWW;UQAZ29rtTk^tf*IG=&c=31EN#ljQOsm#iFt8a0o8gBb1Y}?;J`b3pJ>j=EHa2F8q^(K9!APrb1AHtRqT(>e zTmwqF8xLD_pkmde-tZw5JfOsDNJ6NmJJVa=>$^|zS?foCe|AS*eo8%3<=~zQF&Zp- za;=H0Ph>77llT8%t)yHx)63;*soqtMV-g&m2`~;WqiHTwrdLEi@HVaOcdV4#bzhdZFU0p3V43@*VikN8vf+p|DV4#r9;OcFSv?do{BdxqY z;+bvQ+S=HCXFBMoHL4gSHCe^-xwx`PXXIwfC!tiSNOHnzHxPxxR$l0|@zAsGDMvqq zKg;ZE8a~-OY5}%e`rQ~w4THgeqo(*JcIL4T_scS;r{7JKemVDcgumL^`3(alq||ah zO-#+4_Y@QH>b-l-Vt28T<*qfPG97J?DeQM8VeQnLL}u0%p_9YceWkw@nT&bwN$?>4 zcAlp`nS=m!sqrq7#9`Ii>x`ng9}-UsEWRL#Le_18nr%&!TiM$ryraYRRDV{hXNhRXumSq6W& zTAq2KdE{>9rEZLek}^{goBqq?x_uC;?}lJytBA+rDGcg+!;3LHIZGpc@sU=Wv84Bc ziu&iJwWbY2^PQcYsSfDW)YSC!gs;HFq&)hfRe2C5W0K+~GA`~pighC*E6{P1=@csG z#X4`CXBSy`oak>>dpZd~iQ#DL7vhKk%c~2yB&1daW zi%P_GQ@adV9siiwl%cvNRLJL480+##GrL5$6zVYZI{4)|DMl~Pb#rBs+F9SN(3>XS zJ%LE>vz`mOUKDJm=l$!K0qw*6h^thlBVh{C#t|wXg6DqppStvM-@$udMS}MHo#?a> z;j3HGJIn3_h0Fm>uc7gby`WtIQ=q>OApZ{%Q-Qp>#av_8fmElVv<(oPu_WD)AmI#s zn^>j|>M0KRQB!XF&9w_eq88)fWHQA8ooyjm$}y)WI2>q<Q(U=d& z5~98LjwYO)kyg`iG?_JvwE}ULy3;8iHp{&Z95^s|;S~vXUzA#DkOeV1{3H%EK0qX# zmoBuU(P#mUy_9TX@>V8)L$Z^edJShh2s>v`2wXGyf!0T3W$H{ll8MH`U=PC5(n9J6 z9+}a(yX95&Nb_Az$l~C6gi)dEyi2w^juK4EqIFLGd>>NgdEeHbz=+E2x*4C4%l)Cy zwXU?ZbZ7TiEP#SGS@spZgW=4jwa_ocNX?AE=4*cU7uJ2OIem0Gee(8R#YB%<4+y|I zXBvevBYwwC5kKYw;~l^{Z%l`-OT1*C<)ww5^;s;q+qG_hM1ezb^xvVFj-k%1R9k(8&_orqc#ECplIeO z&uggjnOo&cij!_s>i={LmS{^(Djr4^oBp-Wq$o3U`3gHZcy&^2-PUeZiwkB9xrYL4O`E5(MDneld2A9&(oXvTS}Qsj~^J7prx zR2-50+>Xy+gk;l(SsGOW|DHJbIqH{3;f}1frJ^GMfOiMZdIyWH!C>EpGEnrH6_H5P zU1VHTROI)@Za;q-mLlVuxS#t{Os?-b9Du>scWYn8g9@HEWx9owQETPX#uoMpr9e7*T16h-{xO&T+EK{(B)^t%D zfXfCyq}o+^Hx6}ocPnBh<9c~wQK~{BN$TiSSWdj2w#ArsCy?G_aEP}8n!tE(g7PIO zffzhx`oZ(0#d|9Tf0fJq-d7jNbaHS2Sh+Fr*=T)7FqNMk0p=S_y+``J5{()d$h1BLXk>kjIRLV&~FTRV2 z4|0l1lWjkgE1D*+yggczf<+kE|Atkqi4?^>(*QY4EB7}IFC>`yl=p_4V8d+<3gvEz zLC=aCqO|fldkkUTRIO!m+w>5%{sI;Z*L6{E;q?h`(>PMUo0;Kx^CyPQnIP)B{UbHd zdHT-vV?0sPzV!qt0Jsyx|F{%g;4NvBMq|d>kjyq5kc3wmt9dEUIYJ;N7^tv-YcT6F zPbbT#cz!Y&?yHM}mxjs8;F~gYR@0Tqr}(RKNM=|7aN<(I!s_a3=%`=QaQB-wf3rdF z;NW1VwlA|SlF0ic;m^|2(-#WHt-N3`fHTD$K=86+Io1yVUY={mo94IU-RgW9C?&pO zD9Tq?SpF>$X!@Shyw}pm35zwt4Og_xt zvWz@<$FS;XCV;i4I<7Zs#vzH!T2uLnWoz;RqpG0Rzxi6-K;+XV^!6}PQ1G)RR;(?y zub}o3Uw)eJXA<$Rei8?Ockpb7 ze#vhe#P@YMP*#>kRctdmmgpDUG2mf{@V_bG?1`N4Ny+={I#h371E5F#5UZUx|30n`FycvUG1!bJbJ5Sgy)s)LRo*#yJ7HC}!Uk!`TY?Gd zIq)!GYY^*;PYy1Zk~-s7RoBfwfmGMxOCcatyvA;wU!6B^Io1z4zun6D^54=`n&sbo zHu{&M0-Ci^J+lI9yNY*^1s+%isELF_Z18))0hiO+BFr91#ffP{+dv$pq*zFAp$+ zDZ&=eMZoC!l_^%+klkDnsY@pt)7!im&R9JpUR!Hp#q!&|4ILaEQScP5@1`wDb=Gq` z7XW7j7~qDX*rE9(N-%ajmBs<`0tLq;i>60ON;C)K3mfhkDk`;oF{|Sj&9vFie~lk} z?QMr>XD*GkEg|+5x|S9t%w!Mw4tC#AgM(o()u!!RT7wB3D#9)Z&fvB6&{yPgyVMj) zuyJFwl>w!rql51+d;Au?L!I-@XV>*A`njFcI}&`qI!Zek1u@e6u^9&_zG}sn8=tcO zGMQc+z-ATOg9YZ7Ys3NKkgKH@%X?!g`@ls-zpMZjI8QtNTz_eb^|q-HKi({@yHNE$ z+u|qi-6NN45D3IjIAA*{)p=wb4)FBB1pNXRc59}2<{?R1qh3K5u=r5F4F9gRvNxQ+ znr>4ubL)ic(F*+GCP1bF+kY3OBINh&f~Y?qP_bGAba4B*WHCOHe##vh=mzUE}34UD|Xc?Q$UODwdOmqV1^~pY!PK!p>)Gs#l z#{Ar4+*f27AMo22S|eW%<|En9wT-5NYAih2eUu7e^qDcXh>SH_o>A}2hFlnblyDy1 z)g_Y0p!3a;0lF^NvAu-4xpwocDvJs9qE4w>pstJjXNc@w54@_Q{IFN;hKIEibb=GC zr?KUWQ~k>4VJ^P)!`YH=nQhSf4h{}R>KGB{*4SW`#r#?76s=kD=@8yX{ZfSS6NK7{ z^*5X`2`{USG%)$jIR|vt*1PDML}LAxMrUKhHbu`jMjm84{Z|tCD%kPBOMR`qcNbN* zxT7*J_KAKN>>;KROU?*eK0;}TDxrscmJ4mjKp1R?WMb6S*y+!fKbjJEE0M1(_$Ctw zNXWrf(;Pv2tP@s>;7QwNN>3XT7J~Z;36k^UF*a#B;0@XGq5BWvC^&;NR!U<6(&%hT zLJveezJOWS3Ep*4@8-QaBoh!c5~Ne7*QR$q(qnLjBNQr?+8GONmH_cv{~iuWk>-3; z$%OgpDiw~Uw1l%y02P(%a<2_J^e2>t7Bp$@`XPCPzBpL?OB-`3opPXlVg2ya%-4_? zI5YJqH@CXOp1W={r)_kYBc3Rq${eXQ=FiL=qo61409G9u9wHD3vWxb#YN6%k`EZGpdh86BGt)tyHQCN&wQF`46W?Y zm8X^~*qe4*Deei3=2V#zKr~iEw1HGJA~5f}*3n5lSfOuayHH@6_ZIu~e+bt*C={T8 zR9wL7-VE{PO&kUyJt6iJL)*V*(nrEg{R;9T=^GZQ+cD4XV)}Pt5`ST=&5KwvO=AN( z3bFoJXn01)?N|CDJ|)+1lDe#8%pNA2-$+h8sCaN8C>;Fq>wg+(xp<^TeKsuM0EeM< zd7FgwAgoNi!!P^KJ>Y*g{(mgg0QCQ7JC;miwQ`;ynTjqz*76yInFQJX?>9!OHfN5f zQ_ve|pf&^@kAB|XF%xNZGXLh;vU)#2Jjt=A=__>bTC+WP{ii^Sc%WGIYH^+DTIUOc zx%gUniD$U7&)0a<$24A6^T6zFR6CRoJ5 znu-rK^wvtxAZXyl{;z|W@nINZuFpC#Z@q}2jq(dTqYSO5b>1^#3f9(zQa z-TqYkN>gbAcvHk-VLKl2Xr8upU61JC{t0`RUv~|_IsCIUbhAQT2trb znaHfMgtKM4R2g9Vb3`#a`nkbX0Q3N^AC87W2-`BB*_*`!HI-V^u{J>eV>y8g6kwN- z%n=~3Q0l2nCkz^0?cE4u1yEk3p?a%%Vp)=%*A-zy6b={7Tmy`hxKneT!tAR7JidHi zq^~Zp-A`vSBKlo?KccFFGqbXKBZdH>ac?bT1)ac~w+bJ!>Ly5sqAepQ0$Duo*FB+w zdF%7@kNNF=i$EO#sDDyV)6ZrBPtvYx=d`NV%K3`Vg*r!xSQ%<%(0r}Q=l;G4gB0>` z2ANe7Hi}|_@pEqy?g`Ueoqp1nL z>-9UE70X?T^Cgl*{iqjBTVLd4IGH`h^HnDcWSIwU4@_K;_txYXz7P*B>J_-aU~ooZ zH+SRyQ3fII(V5$b6s@Fy66II>HF{v7BCB>w zI}TT@zn|klJIiicN_F@EwFFAP2_%WcenJzNHO(K5(c?|thQU?~fuaU*S~RpWJvDV* z#05Os6TaQYi0#Wn03>QnNBF49p83$TX=!Qm47)+GOGQJE&(DS`?T7Vst@W0PusO9=#Y>7NGZoq@y+;J0ELMsH&0_RsAj z`piw7-hY4I{y&Ov^_gjYZ+N2c2I!0gXf{L%9Cv~KVHOYid!^&Q=(hiM{~pEu-+lfM d?z37uWRcpKed=W{@Rbkb?&5tBe<9?~{{pZcRT=;Q literal 7155 zcmeHMYgkfQ+s3TS8nY?0sT7;+;3VoanVO2(l$n!7wOaMv%(vs1>P1cImG>b((jzIsC2wPzQRBYa&!x*kcUFT%@h}uzz`jZ6+qbnsm~__4U^wc7d3N)x zRaJC}IBEV@oS9c4Mt@f<4=6Ad&NbO>MCuKnaAb`T_;UVZn;f>ZNvO;%*FN@KmT0H_ zSjJ7R%g^=|y_F(pjobO>%)C;qrW6=dhBkly>Pz_LYkq9s8n)tt5-A<7>WjMHNC5jX z1!~`)+*#S-USa8z{n}8Tyd}ECoyBa7weqRS`j9T*@5$1kr*XI1w=S|rv^9z;+^rh+ z7j4%l+)u1VMICMpOzYE{_xTg}I zN4c_eV?Kir5gc3`5uB2Il*rsct7MP)Z`W zQp7h#9OTl+k00^IuWHGdBT$`G_k?OtGZv^dLFzPd*7YKp5Lll(r2SI;@jz|x#`b))q6iL znEP=nLIb}|-mpt23_C#&igR$tQ2*5Pd|+H{R%jG(=P28H6+hmkDKCEc8t=xgIK;JJ zr-!}-D1O<&uFWCvB0l{WqqszfdF~u_Sezs!`hCut?T%#YM-<*iQ$2iA;n&_@MSds* zQ;nYV&CT_^TvzT^HAegv8=qd8jq$1NoBPCJ07FyU(eij98jDJK3U6ueVv{$q^Ksu? z#)Ko?>Yh5R5mL&UaBy%adi$qX9N~(0&AsW3>WEI+;dcR@K1PAfm{Pd)^n9|+b%}mE zFc1n4TTCP*gPTsWn=d^nk3*afZ05$IF0@;0G+Hh{STI*dBEj&tX<-fQ`M&txW4_2x zYO4CwGrdZ7L3cd3*nD8I7N)Ng@MkM{%Y#wn&!m5BfzE#mM_Yn$?#p2oJ4_OWW)1Ns zJMj8$=j%tghcspMe#~4<^GB~Eg;l3bmX3*QptF$t$D$dDDb&;UwYhhB56Gw9)9~kY z{}eK22gqnaB^zRz$Axv0+;dPG?i+>Ox{{xAgxk?Q(^eEc=1yS5U#N4co z&hPquL7e8^o|F*E`SqsPSu?L0N)i1S+p(dcL0%8QfNI`wq_4opl{NeJ+C9wt%uJ$q zbUve9sN@k->7lngtqQv49?q!M`+8rza=)7Uy;Erw@f3iO;RdW^evueIaVG0(cLQVByQvB<5kWv!p!H%-*S*{ zk!Q`)3E{-|QI79sGtxZWPPu+~_b2bPTw{qgCJb8)~m)p79vV|w_ae9XKg*SCaCX4FtFzWb;8?#?Y5tD7x zQ`imD`_X60j(T{|Wbei({3;pn97?|k>A|)Fm8$(ox>psOK_?m=2YOC_6qPlJk~p-* zXoVXWpMkeY24fz4)x?u8%xZ}HLV z6Lo`=2`*D9bVXRkrOxp6h}58Tf`fT3iDaJZm1&YpNj}4WLCsJy|<**O5#y-9tVa`PNWmowwg)e$Av;6TclJf`8D?4 zB)5UF1c`@=E<80FF!S6Kds!fsDBy_iH8ZRf)8z$WrW5qN-&g`vfF6V|&$8AoEUbeO z<@tveE2V@NFq~l&bS}&SN4_W}Ao|?=cH`$0)C2hny{G2JM~cy-%mfdj1CB{)Xe&oA zPVebdSi`)*?Uim-)zKb@w~sO=qqF=k)FT{1w}%miV33!E2BCUg1?nF4Fw>Q%Uz z>)4HI!(?VIsbn0POqTb|Ux`%L(-k5Z>~O|lRU!Zi#|`<=J{P<>9`mNh&JNDV9;q=W z$hV=|j0(EG-wB)&YDvs@bHzhj&3>^fk#-=R6qm+8gS1wsNl=&dSpb z_y*Mt#xxJdQ@cco3}NcF9w0Sb@nPw7$GX!?OK~p^FtWZZMNk@@pMqmUVv1ljM{ zy@JB|Wz;VX(33EyE^`k_G3Vj0%zNaP;%9jMi z6T515w8QIJfCLd4?d>THyTvEsq$3Y~tJ%_o7Yf*m2c2+DwS`PY(~(lF=}W)0U3nwl zVkkk)nR};PIh!6)6&yGyll@Q}fedA|w%(86RwvW>)vaNSNgC|g#meScAkMK)Km5Q` zcrT}TJmJT4dPtU)_`pyOKQLXB^V#(P^q;p6_`usPn{}#04I{0)brTV{tQhpRvvp|x zd~cp+{JFkLta7_G_knHs&aUYCP_n-7y!2bgV{|@*a2rs}g`x~vX3`eLkMp}k zDfGCKeXQAXn@9>bbzh3G57Z8HzXI=HNe5W7g4G}0h4K`l<>b=RQY;rB9^3vJq8LxK zl>n)O_oqOZvjB}Ox0$5HU#Ks7dyUG=jQIi}GyRT!#Sx;JG{+r>{n#516Im39Zfac9 zUSTlO^?gt;P{(p!cO*q{E)F;A&d6+Pgz)+R&`PKs6BSqhVFH^0*n_O5~V6y>}imgg*2gmXYd6sBuToRn(=j{Y5^y zHT2@Y*@1t=AS^Ara>&mwywQW^M07@H*ReIZs#wU9}%v2zC$|@0Mlt8 z5gYJ+pPpbl%71;A`h^r&HlQgM>jWC4@EqjPQ-jx^rsf)sn(qH6CEdSEbs#*r7|>xW zjH#W`2(e{;%ycUxEvA%hMFs zt}j;_twF7Hh8CL~Zfwg%2>8%LWt|M=L8KmqJC$-{)g$wuWuMPmTqbE@_Beo11A2g) zZ1Cf_ahAO+t$>3BlGi@&4rnnNY$*X$>!enz1$u~R#>MhWynktR`gA>L6{;6Jw-qRT zcQBB@bIrUAj|S4@)Js6ekY&};!|-h^j9aQZm}iw!?xItPREF{CxjP4uc!BKQndtBL zXNJ>+N*OKQYJ1*Ej!^u&aZRd^Rkj?ScGiq~e_MyS*E4`F>GLz=I_P|W zL{){`o99w)8U}2$>E#C|!-F^h(-O;(P}7aVz2XL&90x|H$}`-GwC%Ov3~q?=>LeD{ zap8mE>rZV~FiiTC8(R!k-l5y%48{Zo0$q5rrJioyzIh?O258DS;rKUY^yA|6_KOe_ z3FsR9w)={D+VLvmKLEIm9m+*&;9G?c6Ew@YD;5A8L_ixsgTRYi1mqt2|hIqi&c6cQ);J(L|-c_EB>K+dO#+u<6+>T#nZ3XBXUl= z*3-{V#ckIRT@%RZLa1tDGc6-P*qk55^{vR%UFz=%6Q4lM#yQpfwYiD#+tOYwtf;`x-|Q!1tC7|n&+T{*)r7T&OHp6Ryc@s z!t;%Ip4j9Lg~h66^Q={T+o|c7G8B$lxw^*FG+?#Flk#Q5Fk`rPh&ku-G>ON^imh^c@13s!HED7c{s=haGdoDpCF=fm1x0?d&6?g5 zzdiLRb@&25vBUG)U-ba6IX}h}IpN%OTDWGfAG@`!t(oI$n(ZfwrSk6oW-H`pj@j9p zJctOUW0aE~Nlx`}IK0j8E{)9YV4(FQZTmjCrPi{i`tkPwQ4tu}cHSglmCXJ#H0%K~ z+%1Dmxd8jb;ikSL1mUf~pBo81oGO$hxKwsEJTh7_Y`E+d>U%pylhLm9egEK#Y50u9 zGyH;C=d`^AzbPU(s91dU*+n43(n4t;%c;g_^$Af!o0molC<+49?Y#1M?M{Uty;p83 zKa9B$splGRa9rHEW<5f=n?@GMtx+i4h7_cOJ}(*j zYM!#iJWA_~N-E-t>f~YVcHv;7SGkhZ#VKx#D}` zQ%v`N=?hctDFT#K^e{ExV%eBb!b#ZX@*HuDU&VuFqjC{7A5KpU0_AUSC)Lm1=@QMn ztHZ>1cv_tGr_lL^_P6Mwkc{-&0DQ;PxTiK?ePW3v==i_QJC%}mQ(y2F5K*CSp8I+O za1-eoV#1nJv5BDnZ=Vlp(~AsM0_qO4%(LdbnxrW_Tps%B^*W^rwX`K!*Z0z(oeU5s zBK0C_GjbU1P`q@u6ZCI`ZN z*VwAdz#tN?E48v2_z}E6o2EKh!~S)}6T@EhIO^&G@c*&X9io}%m+g=0NLD7bu7(Cs z#2Wm>e5_MQ14pJpIh8h}H&9)`1;NEzz548;LjkH+aI!-EQeD^S&H|Ky=4o{_KL?UEbMTZqoxkvUqP=B&zV6k7?fF@thm$ zUvsWOC4B>cmQE=*Ns68xilj&b0o>DQG~JO!^I@NAuLQgwuLb!ElBOFuA;{nY8u*Ph2u4)JDtO1DySZu|Dh+uQCvm6yb;59WS)98ZmW7v$0 zCfi;J6Q~sB8y2|?;9dn?(wD$oiWr*iUQ@5aPQcnoX#X9;Owy*&>sxND#SA2q_dM#3 zjQg>M9nE$WZYSB~@Z)iqhZE^57J~moIMus_(JFRlND;&Ny<|;MUsMw}w*3g~dWgIH zTO}}dBAx9R?ov@gpYlaBpG{zr;!2L9S(^a%re7+f@3eeek{0n5b;Nn=Xeq%; z0%1Cp`q877^uejAh3$r|bMh)rL(@&WdxMLc_d5Vi$GTjJy8k7F*`uJnUi@Z@R(W@` z1UO3qVi6+mNekr^y{*(ee0JHMBWtD$4NN!f1>UqX&vkLmw#_MzTXCw>)8}xT51AW*?*7|y=ib!k09J-tNL=&WI&0&wV=!v7tr54 t@87qh|9<&zN|pZx_Wu;v+T{&rhw^4_3Ob#EKl4C7Uj8S@Uw?Pwe*iU@kBR^Q diff --git a/tests/snapshots/nanos/test_app_mainmenu/00001.png b/tests/snapshots/nanos/test_app_mainmenu/00001.png index 625b9d3a8aa6fb067b124689c7af89aa48caa443..4d558cb4bd4d1d3a00f10940ad307611452188f8 100644 GIT binary patch delta 295 zcmV+?0oeYy0>J{1BYy!1Nkl`)?rTRKYjc40hJ;cYPvVwY3rSk>QKahvUhE}R50MV>PrCw9<6=_ tv<&UmJg(MsWgt(5Du@t52qEM@`2c#glSx?;o}&N&002ovPDHLkV1hx`gO&gQ delta 286 zcmV+(0pb3^0=NQ@BYyz@NklNtj@)uc+bZk5jelUeD*y&`=u1{v1*z{4 z$PzR!rB{EBlc@G!7@+D@gHoEj&eBFb#l0vl+4|^Y4CJNy7vPFa^)I6#HPycudJqY# zP$bE|!!w=e*-#*WN1CO1yYN8>42&PKKZXVblf;0ucWpy57;scsWAEv@2^0BP?%v7qzW01Ov*8nM zD-%@)1lXVLdjTM+%l zfuD7Ew0}Z$Z;<-zd#i)46uX6IxJ{M%lYZ^~hW*U-rzTxlT_jZgYFh5*SMJPvpT^x3 zPe_uB4Az?e^WCQ(99D8qU;MmmzDw6XnqhKojPG*G3DeI8?kb=1W5xATetRC8T@>VX zR{MK8$Hn)T_+qwc6z>Td+ezdxHIcl_-B+dgG8@0l%lm|GV+qr7#;Y}O1+Gyi(^Q|oVPaug$^n3xCWNo;rtyR^z9M5vhczSQCmH4RqqqqV_bDvUW{vmJ0fiHm6OZ9uM+t>>!R$e$fa!mBfrXhyWdd1N%iZxIY;L1%Dw&O*F~57o#EeD zXUuTFHsw_MzSTB%P21cptNwkNn|J!M*nuY!;g>U|K5eq_?(Y+l?~RJ=G{2*0wJ7n# zlKL5~D?I-vTsa`*uju`UFZ$Kvy))M&@BUdm`=sXO+l(fAj&A3+Zrk(mhyRZtjfRa9 ztR27C<%Tve&9N~4`(!`Eb3c2Az$|~`RrY;t2tP6$xN5^Fa^*xe%Wh>}kg%t#pUXO@ GgeCxYJ&^nW diff --git a/tests/snapshots/nanox/test_app_mainmenu/00001.png b/tests/snapshots/nanox/test_app_mainmenu/00001.png index 472505b938dbae4f6971fe0d94fed42ad5730bb4..841995a3bbed029e979aa4a08017a4cdf2f15af0 100644 GIT binary patch delta 321 zcmcc0bcbnzO1-kDi(^Q|oVPa;`I;4Y+7h?DQM>csWAEv@2^0BP?%v7qzW01Ov*8nM zD-%@)1lXVLdjTM+%l zfuD7Ew0}Z$Z;<-zd#i)46uX6IxJ{M%lYZ^~hW*U-rzTxlT_jZgYFh5*SMJPvpT^x3 zPe_uB4Az?e^WCQ(99D8qU;MmmzDw6XnqhKojPG*G3DeI8?kb=1W5xATetRC8T@>VX zR{MK8$Hn)T_+qwc6z>Td+ezdxHIcl_-B+dgG8@0l%lm|GV+qr7#;Y}O1+Gyi(^Q|oVPaug$^n3xCWNo;rtyR^z9M5vhczSQCmH4RqqqqV_bDvUW{vmJ0fiHm6OZ9uM+t>>!R$e$fa!mBfrXhyWdd1N%iZxIY;L1%Dw&O*F~57o#EeD zXUuTFHsw_MzSTB%P21cptNwkNn|J!M*nuY!;g>U|K5eq_?(Y+l?~RJ=G{2*0wJ7n# zlKL5~D?I-vTsa`*uju`UFZ$Kvy))M&@BUdm`=sXO+l(fAj&A3+Zrk(mhyRZtjfRa9 ztR27C<%Tve&9N~4`(!`Eb3c2Az$|~`RrY;t2tP6$xN5^Fa^*xe%Wh>}kg%t#pUXO@ GgeCxYJ&^nW diff --git a/tests/snapshots/stax/test_app_mainmenu/00001.png b/tests/snapshots/stax/test_app_mainmenu/00001.png index 679095ffb072f3e0ae235b79070a29a643376d39..c68903ef5c27354f716092ee0ac301010c4fde2f 100644 GIT binary patch literal 6682 zcmeI1X;hQvw#N}CJRn$$mI8v7qPB!V$}B^xRjN!PG6`X*GLwKx!b}{BoI*8P3J3uy zAW}m}kZ6De5{82y0U{v85JE&iNCHU+gdqdmhpzkatoz}v+q3S6zWMOJdDqH2>}T)) z|F?I3zToM)_aD0dP*G9Yd+vwtFRG|)d!VAC`n#GcIOE{eQmdl!`Q*9pzq^!Dy1hRMB-P2ktzkf2yd-rvBo(Q3Q6KPreg!c0F)$6rH z?$jei`$lG){agOAI5yIuY#@@TwF;qMr*XL}^IP|-r=aWK@@FxOS%17GkBk?P)q_f& z#*}S#gBL8*tL}(bo2Jz0@A$JObW7jg zVQg-yCzG^5r@Nu%iNR*GOY6~Ae3z(svQR3Ob`Fk%$fl<9v~Xjj%&e>p$;@JRlYjl& zuX9IY3pQfS2-lk+zA?`Oz|AHTAK7@;3`^6T4AB0yBk?x$DZ+Y2*5m~!^WNF2S?Yf#dzP=oO zwD#7OyQi+ng7og4tsUX3yUuNzT=ezT#mxlPyzr8}m*7%0{ZJBPj zjIzU|zhO28w}3o}>Cf0yCU#CHf)x0CF(D%&lq!m2kFILC3K4GaP?jlHyBTO}O#e{8 zn%-uEButS6pTIaIcH2YxbLUE!bK}06qt}}qFTb0S=g2+Daej84lj3wtLFmr1gLzL! z!k5;^<%|oC@4u>u%>Jg>ow}MD9OD0QluK)AajzL}IbKd<85LSb``K~j6S)YeVQXPM zJ}zPP2XF1Ia_v@h&U86s_-(+?30lrpd0)QO5&*ehSRg4%8Sn6(f;iVg=nat8{dw~h zCLAw}w1>ET&`DNpuZ)~2>QW7!`Xu3D#+TM{6i(V)XH+$cKmO&$O9NY;rWn%_w0+;* zux;UL2mi|5E7}=v98(~oYTQICgS5{;ncU3JRSa*qsr}Wm^FIk23R+Lb$CZ4f5LDN4 zQ3;6ONw7vXOqSwkKxhXh%Mc!}8}kB&E!&maKT2=3kVVo(ao*vasC5aC%OnnbSG=1Sn2k z*N3^rH?+ITEL2iIrvD=y1#h#4>*KNt?mJ6E=w{iqh$|aVLHfQMGJIjl!#g4_>P&j6xZAeO)XH8A0WjP~n^PW_; zc%FSLy?H@RP?sD!YS=aXkQrt%CsIr}jlmn;*tJ-PF``}aQh}EPrvE<4>uA0r-O&j; zaj`IBQ=OrCK+Xitz<_V|86FVZH-_>aAG;&FQ>DldM`MqRzQOd%z!kuDJa;%oip84Y z?4V{v%CE#AVwiq2NJWp96S_M))3BT_&CS2NnU?$AX%KtQELh_(F57LqHku899Ha0PBjf5aMcZ%kyhSm zf8W~fedB{ql)I0Aa|DcyX9{>pCB2C7;#2nrv+dK{ZySCnRCgr;U42?U-1aqBE2If= zxz0~yYTWwZS1J~}BF`MQVlR+lN*s|v1g6Ju%POP+LVsIDf_d!@EGMhHpAhcHH9%^y z=S?iYa%4*@V;U94G!)-)-B-ISt<@8Km`z$B3*-0Qs4sbHPrg~|xOLNz1oM3MZ=xP7 z)$yCeVmouB}0 zH;1^_UbtLAtYlfB_{)gYGv4k;^EvS38H|I*t~=l$?Ex7N%4>%89E$~M%VO?dDMG7q zh2@}fOcOj1evc1rmZb{0_CI8)icLjX+k=rsH9v(S^JlNoZaly^KHDLjCdj>x-)!2U zu6DZqro~^ho8qSHzYvgTuCuH>ytN|&M-fopktnSO4nPYaPZ5EjVkZ;VSVmSJ`S@^0 z1Jp{~t@7xXms>e+BZ*(pC36tqLO#3g_Xhj=mOFG@wLBMUr=#I4&2B>@rh+=2#)O1~ zjFHORk5V{r8kgW#+W-OS5N$=49A+>W9>bS>U$Wv?Fg`ey=Zwn`~aJ0olyC)}@@J6{<4Scn;eSH23zRIZlGUOm{wIDZ8C%oNo z`jrtdTg;DxT<{ot@<4fOd}~OJ#UYqi&`^|lG#mLR=CR@!3ru{+O<6hFhw9|KPcthFPs*(E3$t6 z^I5b_v6^d+@U8~aQ2!4i`U!G zM_?BBM=Jfl3b8wd%4rWvw9|)6^mb60rrb8drnYEaJzAFh&xpXMI%QPK#8t~@*jR_M zkIC7@{3mK`l{Bbe5mo>F_C^iA zVJiZGAj(AA>4Rnii-o7W;=Ta6yOW794G=Fm2@4Y`9A_67^CEgq*(YnA6ai3$fMjpENek}I82e4xpwzQ)EzM-7}nHdhZMD%#IvuO1pn zchy06gLcO7w+0Bn1D;_=jaj^9F|gIrIwA@yUQLOvmoNaQ^y$gF>@ADkC2)HrrvE9b zj}?#9Ei*x{hXBfeI&&Uw6ws8m0Z}5e7LZDFm!QI{Hkj%%`63@JcTNvaoqc_E z$i-YyW}u4$&tDY=)tQ>U`ovWE{M^JsqFpJxW#duQYM&lD>$COb@4jK!}iKm!`OSp_a z$ER*v3~@6f7Y7=dDn@(Q15~lsYPNbUwpaB;k5KxX7^ko!tZ|nJ!8wD`NiS|}@I16Q zxs@P@!#t}@U)dhUp1JN1KHZK5g`wKB2CqjDPUQ@_{A$g~**B#hr84z&(HE1VX2?N-!XV*97|OpPymBCiJyL z`c5a>xsL$sun%w*d~`|gGqMlx7}n2B)f8GA{VRh~q9wt6w#zYkD6=^jWOEG~z^y^} z%;=Nm3Mw!d0ExnF#9-ig#iHG4$s+5D!Rs13nMA>_{4lQe9LC7Dkl=K<5%ywH%G ztyX(Ld3Oax^ACBKZM-J7rTEtmfCkj{WtvN-cakRFkx-j;M{os}Hdw2*Lc zBVG$SDy~RZ%x!!;;Uc$7u+Rx!H+I-rKI2lM(y@jxBkyTWa?G>WwRpsOoM=|wfdSCU-FUn=jO*uT-vVc(iQtMjZ(I}Nh$)|2Bhpr znQcO``_ULWypi(SdR%d{O>0r)^u;^U!u4i-bT@O}vDlrA*VEVqTK(yHTbIM)(_03{ zCsRizA3uIPM)EKOl{}D&sSOmt%m$Qs$Rk~fVr?)6 z{mVFO6WiqFv0HN&;;d@ci}b$m1tjGyj*Lem?aDgGM5|q>n%1F0ELJn;H0qZ^G%|?@ z6jN4X=M*;K40@H&CRY5=0HCD1D7Ch-@d!||UQy4m{Elr)*`STuc%^V0R8v3IG}SS$V2B& zoR{=O0}hr=6SdC_mghUXbcbj>H122csEV=U?2W2*m17A!^e?keOd|daIu;CL~#f zQ0hNfD>hjCFw1Q|(NaM??U+}8_`&YhpwrY7841s3q1Bjn;-^b7Y3gc|-);TSNg|hg z+R1%*6gzNVL`{CPJEM1MLd(R|b*=D|Q6K;{k3DOY3&XtSApGvNk{s$SF1#^)nkNIL z>8-uAuHf-v96(1mTvJoCo&m2ux#K#a=wqq1j>f^fu0}_*KL>3zDiyrOdd6cLxQ(9I zo+A(RXsvw=CIU*{+xN{P08}tW+S`7!e7?d6SKg*4|1Nmr(|;V+XjkpnhpXJ2&}#Eq zVfKd~0`#-#8Pw(lpz=R3ZCFh3)&}z|iuv~US2hox@n%YsLwB`xkMCFgi)SqV7K{Eq o`5!0IzeE0a$p4qaRE3K)*QFt0P^b_7^HDi>#`Ampsj%Ds1zNQujQ{`u literal 6607 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 diff --git a/tests/test_get_name_and_version.py b/tests/test_get_name_and_version.py index c0da2b1..4746ab6 100644 --- a/tests/test_get_name_and_version.py +++ b/tests/test_get_name_and_version.py @@ -26,4 +26,4 @@ def test_get_app_and_version(backend): app_name, version = app_name_raw.decode("ascii"), version_raw.decode("ascii") assert app_name == "Nimiq" - assert version == "2.0.0" + assert version == "2.0.1"