From 00f92702c059f3256f9cee1535611abae654ba34 Mon Sep 17 00:00:00 2001 From: Charles-Edouard de la Vergne Date: Thu, 2 Nov 2023 16:56:54 +0100 Subject: [PATCH 1/5] Fix duplicate base64_encode --- CMakeLists.txt | 2 +- app/src/base64.c | 76 --------------------------------------- app/src/base64.h | 32 ----------------- app/src/parser.c | 18 +++++----- app/src/parser_encoding.c | 2 +- 5 files changed, 11 insertions(+), 119 deletions(-) delete mode 100644 app/src/base64.c delete mode 100644 app/src/base64.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 47b0dd51..4c054b97 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -105,6 +105,7 @@ add_definitions( # static libs file(GLOB_RECURSE LIB_SRC ${CMAKE_CURRENT_SOURCE_DIR}/deps/ledger-zxlib/src/app_mode.c + ${CMAKE_CURRENT_SOURCE_DIR}/deps/ledger-zxlib/src/base64.c ${CMAKE_CURRENT_SOURCE_DIR}/deps/ledger-zxlib/src/base58.c ${CMAKE_CURRENT_SOURCE_DIR}/deps/ledger-zxlib/src/bignum.c ${CMAKE_CURRENT_SOURCE_DIR}/deps/ledger-zxlib/src/hexutils.c @@ -115,7 +116,6 @@ file(GLOB_RECURSE LIB_SRC ${CMAKE_CURRENT_SOURCE_DIR}/app/src/parser_impl.c ${CMAKE_CURRENT_SOURCE_DIR}/app/src/parser_encoding.c ${CMAKE_CURRENT_SOURCE_DIR}/app/src/algo_asa.c - ${CMAKE_CURRENT_SOURCE_DIR}/app/src/base64.c ${CMAKE_CURRENT_SOURCE_DIR}/deps/sha512/sha512.c ${CMAKE_CURRENT_SOURCE_DIR}/app/src/base32.c ${CMAKE_CURRENT_SOURCE_DIR}/deps/picohash/ diff --git a/app/src/base64.c b/app/src/base64.c deleted file mode 100644 index f8807b78..00000000 --- a/app/src/base64.c +++ /dev/null @@ -1,76 +0,0 @@ -/* base64.c -- Encode binary data using printable characters. - Copyright (C) 1999, 2000, 2001, 2004, 2005, 2006 Free Software - Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ - -/* Written by Simon Josefsson. Partially adapted from GNU MailUtils - * (mailbox/filter_trans.c, as of 2004-11-28). Improved by review - * from Paul Eggert, Bruno Haible, and Stepan Kasal. - * - * See also RFC 3548 . - */ - -/* Get prototype. */ -#include "base64.h" - -/* C89 compliant way to cast 'char' to 'unsigned char'. */ -static inline unsigned char -to_uchar (char ch) -{ - return ch; -} - -/* Base64 encode IN array of size INLEN into OUT array of size OUTLEN. - If OUTLEN is less than BASE64_LENGTH(INLEN), write as many bytes as - possible. If OUTLEN is larger than BASE64_LENGTH(INLEN), also zero - terminate the output buffer. */ -void -base64_encode (const char *restrict in, size_t inlen, - char *restrict out, size_t outlen) -{ - static const char b64str[64] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - - while (inlen && outlen) - { - *out++ = b64str[(to_uchar (in[0]) >> 2) & 0x3f]; - if (!--outlen) - break; - *out++ = b64str[((to_uchar (in[0]) << 4) - + (--inlen ? to_uchar (in[1]) >> 4 : 0)) - & 0x3f]; - if (!--outlen) - break; - *out++ = - (inlen - ? b64str[((to_uchar (in[1]) << 2) - + (--inlen ? to_uchar (in[2]) >> 6 : 0)) - & 0x3f] - : '='); - if (!--outlen) - break; - *out++ = inlen ? b64str[to_uchar (in[2]) & 0x3f] : '='; - if (!--outlen) - break; - if (inlen) - inlen--; - if (inlen) - in += 3; - } - - if (outlen) - *out = '\0'; -} diff --git a/app/src/base64.h b/app/src/base64.h deleted file mode 100644 index 00ee685a..00000000 --- a/app/src/base64.h +++ /dev/null @@ -1,32 +0,0 @@ -/* base64.h -- Encode binary data using printable characters. - Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. - Written by Simon Josefsson. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ - -#ifndef __BASE64_H__ -# define __BASE64_H__ - -/* Get size_t. */ -# include - -/* This uses that the expression (n+(k-1))/k means the smallest - integer >= n/k, i.e., the ceiling of n/k. */ -# define BASE64_LENGTH(inlen) ((((inlen) + 2) / 3) * 4) - -extern void base64_encode (const char *restrict in, size_t inlen, - char *restrict out, size_t outlen); - -#endif /* BASE64_H */ diff --git a/app/src/parser.c b/app/src/parser.c index 53dd7642..565c65ec 100644 --- a/app/src/parser.c +++ b/app/src/parser.c @@ -145,11 +145,11 @@ static parser_error_t parser_printBoxes(char *outKey, uint16_t outKeyLen, char * pageStringExt(outVal, outValLen, (const char*) application->boxes[tmpIdx].n, application->boxes[tmpIdx].n_len, pageIdx, pageCount); } else { - base64_encode((char*) application->boxes[tmpIdx].n, application->boxes[tmpIdx].n_len, outVal, outValLen); + base64_encode(outVal, outValLen, (const uint8_t*) application->boxes[tmpIdx].n, application->boxes[tmpIdx].n_len); } } else { char null_box[8] = {0}; - base64_encode(null_box, sizeof(null_box), outVal, outValLen); + base64_encode(outVal, outValLen, (const uint8_t*) null_box, sizeof(null_box)); } return parser_ok; @@ -196,19 +196,19 @@ static parser_error_t parser_printCommonParams(const parser_tx_t *parser_tx_obj, case IDX_COMMON_LEASE: snprintf(outKey, outKeyLen, "Lease"); - base64_encode((const char*) parser_tx_obj->lease, sizeof(parser_tx_obj->lease), buff, sizeof(buff)); + base64_encode(buff, sizeof(buff), (const uint8_t*) parser_tx_obj->lease, sizeof(parser_tx_obj->lease)); pageString(outVal, outValLen, buff, pageIdx, pageCount); return parser_ok; case IDX_COMMON_GEN_HASH: snprintf(outKey, outKeyLen, "Genesis hash"); - base64_encode((const char*) parser_tx_obj->genesisHash, sizeof(parser_tx_obj->genesisHash), buff, sizeof(buff)); + base64_encode(buff, sizeof(buff), (const uint8_t*) parser_tx_obj->genesisHash, sizeof(parser_tx_obj->genesisHash)); pageString(outVal, outValLen, buff, pageIdx, pageCount); return parser_ok; case IDX_COMMON_GROUP_ID: snprintf(outKey, outKeyLen, "Group ID"); - base64_encode((const char*) parser_tx_obj->groupID, sizeof(parser_tx_obj->groupID), buff, sizeof(buff)); + base64_encode(buff, sizeof(buff), (const uint8_t*) parser_tx_obj->groupID, sizeof(parser_tx_obj->groupID)); pageString(outVal, outValLen, buff, pageIdx, pageCount); return parser_ok; @@ -289,20 +289,20 @@ static parser_error_t parser_printTxKeyreg(const txn_keyreg *keyreg, switch (displayIdx) { case IDX_KEYREG_VOTE_PK: snprintf(outKey, outKeyLen, "Vote PK"); - base64_encode((const char*) keyreg->votepk, sizeof(keyreg->votepk), buff, sizeof(buff)); + base64_encode(buff, sizeof(buff), (const uint8_t*) keyreg->votepk, sizeof(keyreg->votepk)); pageString(outVal, outValLen, buff, pageIdx, pageCount); return parser_ok; case IDX_KEYREG_VRF_PK: snprintf(outKey, outKeyLen, "VRF PK"); - base64_encode((const char*) keyreg->vrfpk, sizeof(keyreg->vrfpk), buff, sizeof(buff)); + base64_encode(buff, sizeof(buff), (const uint8_t*) keyreg->vrfpk, sizeof(keyreg->vrfpk)); pageString(outVal, outValLen, buff, pageIdx, pageCount); return parser_ok; case IDX_KEYREG_SPRF_PK: { snprintf(outKey, outKeyLen, "SPRF PK"); char tmpBuff[90]; - base64_encode((const char*) keyreg->sprfkey, sizeof(keyreg->sprfkey), tmpBuff, sizeof(tmpBuff)); + base64_encode(tmpBuff, sizeof(tmpBuff), (const uint8_t*) keyreg->sprfkey, sizeof(keyreg->sprfkey)); pageString(outVal, outValLen, tmpBuff, pageIdx, pageCount); return parser_ok; } @@ -519,7 +519,7 @@ static parser_error_t parser_printTxAssetConfig(const txn_asset_config *asset_co case IDX_CONFIG_METADATA_HASH: snprintf(outKey, outKeyLen, "Metadata hash"); - base64_encode((const char*) asset_config->params.metadata_hash, sizeof(asset_config->params.metadata_hash), buff, sizeof(buff)); + base64_encode(buff, sizeof(buff), (const uint8_t*) asset_config->params.metadata_hash, sizeof(asset_config->params.metadata_hash)); pageString(outVal, outValLen, buff, pageIdx, pageCount); return parser_ok; diff --git a/app/src/parser_encoding.c b/app/src/parser_encoding.c index 3f70182a..39098231 100644 --- a/app/src/parser_encoding.c +++ b/app/src/parser_encoding.c @@ -60,7 +60,7 @@ parser_error_t b64hash_data(unsigned char *data, size_t data_len, char *b64hash, picohash_update(&ctx, data, data_len); picohash_final(&ctx, hash); #endif - base64_encode((const char *)hash, sizeof(hash), b64hash, b64hashLen); + base64_encode(b64hash, b64hashLen, (const uint8_t *)hash, sizeof(hash)); return parser_ok; } From a38b6c2dc6be88101c69159c4cb9ae8c70094f46 Mon Sep 17 00:00:00 2001 From: ftheirs Date: Fri, 1 Dec 2023 09:03:15 -0300 Subject: [PATCH 2/5] update deps --- cmake/cmake-modules | 2 +- deps/ledger-zxlib | 2 +- deps/nanos-secure-sdk | 2 +- deps/nanosplus-secure-sdk | 2 +- deps/nanox-secure-sdk | 2 +- deps/stax-secure-sdk | 2 +- js/package.json | 16 ++++++++-------- tests_zemu/package.json | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/cmake/cmake-modules b/cmake/cmake-modules index 877bab9d..fb7d2a3f 160000 --- a/cmake/cmake-modules +++ b/cmake/cmake-modules @@ -1 +1 @@ -Subproject commit 877bab9dd1b17468c5d939cacaa2ad7ba99d1977 +Subproject commit fb7d2a3f9c060b6ce42aa6f8c796b4ba5b0b9dd3 diff --git a/deps/ledger-zxlib b/deps/ledger-zxlib index 489da6a3..7f80d18a 160000 --- a/deps/ledger-zxlib +++ b/deps/ledger-zxlib @@ -1 +1 @@ -Subproject commit 489da6a3304911fb46375cd36bd2cbbca732f97c +Subproject commit 7f80d18afcf509f5028d226e36bc206624601229 diff --git a/deps/nanos-secure-sdk b/deps/nanos-secure-sdk index 12e5f6f8..30189cfd 160000 --- a/deps/nanos-secure-sdk +++ b/deps/nanos-secure-sdk @@ -1 +1 @@ -Subproject commit 12e5f6f875bf5deb9464b944f50079aaca1a3b98 +Subproject commit 30189cfd070040e5c144d4dab103d549302dcfff diff --git a/deps/nanosplus-secure-sdk b/deps/nanosplus-secure-sdk index b2ca981e..37866733 160000 --- a/deps/nanosplus-secure-sdk +++ b/deps/nanosplus-secure-sdk @@ -1 +1 @@ -Subproject commit b2ca981e7c88155fed9596f03086e4409d153b8e +Subproject commit 37866733de557d34b332c1d285566ad7c2f82750 diff --git a/deps/nanox-secure-sdk b/deps/nanox-secure-sdk index b2ca981e..37866733 160000 --- a/deps/nanox-secure-sdk +++ b/deps/nanox-secure-sdk @@ -1 +1 @@ -Subproject commit b2ca981e7c88155fed9596f03086e4409d153b8e +Subproject commit 37866733de557d34b332c1d285566ad7c2f82750 diff --git a/deps/stax-secure-sdk b/deps/stax-secure-sdk index b2ca981e..37866733 160000 --- a/deps/stax-secure-sdk +++ b/deps/stax-secure-sdk @@ -1 +1 @@ -Subproject commit b2ca981e7c88155fed9596f03086e4409d153b8e +Subproject commit 37866733de557d34b332c1d285566ad7c2f82750 diff --git a/js/package.json b/js/package.json index a54c59bc..48bdc9a5 100644 --- a/js/package.json +++ b/js/package.json @@ -29,21 +29,21 @@ }, "devDependencies": { "@types/ledgerhq__hw-transport": "^4.21.4", - "@typescript-eslint/eslint-plugin": "^5.52.0", - "@typescript-eslint/parser": "^5.52.0", - "bip32": "^3.1.0", + "@typescript-eslint/eslint-plugin": "^6.13.1", + "@typescript-eslint/parser": "^6.13.1", + "bip32": "^4.0.0", "bip39": "^3.0.4", "core-js": "^3.28.0", - "crypto-js": "4.1.1", + "crypto-js": "4.2.0", "eslint": "^8.34.0", - "eslint-config-prettier": "^8.6.0", + "eslint-config-prettier": "^9.0.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.2.1", - "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-prettier": "^5.0.1", "jest": "^29.4.2", - "prettier": "^2.8.4", + "prettier": "^3.1.0", "secp256k1": "^5.0.0", - "typescript": "^4.9.5" + "typescript": "^5.3.2" }, "moduleDirectories": [ "node_modules", diff --git a/tests_zemu/package.json b/tests_zemu/package.json index 34b1ef22..6b1eca98 100644 --- a/tests_zemu/package.json +++ b/tests_zemu/package.json @@ -19,7 +19,7 @@ }, "dependencies": { "@zondax/ledger-algorand": "../js", - "@zondax/zemu": "^0.44.2" + "@zondax/zemu": "^0.45.0" }, "devDependencies": { "@types/jest": "^29.4.0", @@ -27,7 +27,7 @@ "@typescript-eslint/eslint-plugin": "^6.7.2", "@typescript-eslint/parser": "^6.7.2", "blakejs": "^1.1.1", - "crypto-js": "4.1.1", + "crypto-js": "4.2.0", "ed25519-supercop": "^2.0.1", "eslint": "^8.34.0", "eslint-config-prettier": "^9.0.0", From b4c34957eb774e624c2eb5ac27bec443a4ab76fb Mon Sep 17 00:00:00 2001 From: ftheirs Date: Fri, 1 Dec 2023 09:17:41 -0300 Subject: [PATCH 3/5] bump version & update snapshots --- app/Makefile.version | 2 +- tests_zemu/snapshots/s-mainmenu/00005.png | Bin 433 -> 428 bytes tests_zemu/snapshots/s-mainmenu/00011.png | Bin 433 -> 428 bytes tests_zemu/snapshots/sp-mainmenu/00005.png | Bin 369 -> 363 bytes tests_zemu/snapshots/sp-mainmenu/00011.png | Bin 369 -> 363 bytes tests_zemu/snapshots/st-mainmenu/00001.png | Bin 13803 -> 13628 bytes tests_zemu/snapshots/x-mainmenu/00005.png | Bin 369 -> 363 bytes tests_zemu/snapshots/x-mainmenu/00011.png | Bin 369 -> 363 bytes 8 files changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Makefile.version b/app/Makefile.version index bacca3fb..73d3f23c 100644 --- a/app/Makefile.version +++ b/app/Makefile.version @@ -3,4 +3,4 @@ APPVERSION_M=2 # This is the `spec_version` field of `Runtime` APPVERSION_N=1 # This is the patch version of this release -APPVERSION_P=10 +APPVERSION_P=11 diff --git a/tests_zemu/snapshots/s-mainmenu/00005.png b/tests_zemu/snapshots/s-mainmenu/00005.png index 0f2d2dfd0d289ed61d021d11fab958e96c5e7ae4..704e387100b80504dd1ab9f4929420e29b4fc69f 100644 GIT binary patch delta 402 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 NAYjYO6_?x||1X#;iSYmc literal 13803 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

J_oI~%T{nZN(GjumwBv2RrCxZnSV7U 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 diff --git a/tests_zemu/snapshots/x-mainmenu/00005.png b/tests_zemu/snapshots/x-mainmenu/00005.png index 82806cf66096e50ab3d505a89465769fadbb0b09..37790ad7bee585228d65cdc6b77c209ab825c0f1 100644 GIT binary patch delta 336 zcmey!^qOgcO1+V%i(^Q|oVPb4`3@`axCTa*s=ulCyytBnF!A(*k{;e&&$X2T7N$>{ zq@v1z02?#~1tU+S*mIbMeF}? zCu~s8_7XL|?<|<_xZd4z_x~@wiKj1%9Y~c9znsbUB+(@^e?macTs6DIA z=ht#c7vEp%i`nMw;I4dBeZ+O_u|_A}R?nsjCLr4H-T)7v7yZWdnrH14PP zfduz!Q?%0dwJX^*opZOW{`aLf@$_Y}15ZuYExRmp;_wHZyVl+{*IqwWxc4+}QMd{3 z%rF1b1WaH4mo)uwB>05z{=@TrRp{$|wm5%pyWu^f-|I5gFX@(ir^j=gDspb~4Z6|9{ zq@v1z02?#~1tU+S*mIbMeF}? zCu~s8_7XL|?<|<_xZd4z_x~@wiKj1%9Y~c9znsbUB+(@^e?macTs6DIA z=ht#c7vEp%i`nMw;I4dBeZ+O_u|_A}R?nsjCLr4H-T)7v7yZWdnrH14PP zfduz!Q?%0dwJX^*opZOW{`aLf@$_Y}15ZuYExRmp;_wHZyVl+{*IqwWxc4+}QMd{3 z%rF1b1WaH4mo)uwB>05z{=@TrRp{$|wm5%pyWu^f-|I5gFX@(ir^j=gDspb~4Z6|9 Date: Fri, 1 Dec 2023 09:25:42 -0300 Subject: [PATCH 4/5] remove custom linker scripts --- app/script_s2.ld | 170 --------------------------------------------- app/script_x.ld | 175 ----------------------------------------------- 2 files changed, 345 deletions(-) delete mode 100644 app/script_s2.ld delete mode 100644 app/script_x.ld diff --git a/app/script_s2.ld b/app/script_s2.ld deleted file mode 100644 index db3150b3..00000000 --- a/app/script_s2.ld +++ /dev/null @@ -1,170 +0,0 @@ -/******************************************************************************* -* Ledger Blue - Secure firmware -* (c) 2016, 2017, 2018, 2019 Ledger -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ - -/** - * Global chip memory layout and constants - * - */ - -MEMORY -{ - DISCARD (rwx) : ORIGIN = 0xd0000000, LENGTH = 1M - - FLASH (rx) : ORIGIN = 0xc0de0000, LENGTH = 400K - DATA (r) : ORIGIN = 0xc0de0000, LENGTH = 400K - SRAM (rwx) : ORIGIN = 0xda7a0000, LENGTH = 30K -} - -PAGE_SIZE = 512; -STACK_SIZE = 8192; -END_STACK = ORIGIN(SRAM) + LENGTH(SRAM); - -ENTRY(main); - -SECTIONS -{ - /****************************************************************/ - /* This section locates the code in FLASH */ - /****************************************************************/ - - /** put text in Flash memory, VMA will be equal to LMA */ - .text : - { - /* provide start code symbol, shall be zero */ - _text = .; - _nvram_start = .; - - /* ensure main is always @ 0xC0D00000 */ - *(.boot*) - - /* place the other code and rodata defined BUT nvram variables that are displaced in a r/w area */ - *(.text*) - *(.rodata) - *(.rodata.[^N]*) /*.data.rel.ro* not here to detect invalid PIC usage */ - *(.rodata.N[^_]*) - - . = ALIGN(4); - - /* all code placed */ - _etext = .; - - . = ALIGN(PAGE_SIZE); - - _nvram_data = .; - - /* NVM data (ex-filesystem) */ - *(.bss.N_* .rodata.N_*) - - . = ALIGN(PAGE_SIZE); - _envram_data = .; - - _install_parameters = .; - _nvram_end = .; - } > FLASH = 0x00 - - .data (NOLOAD): - { - . = ALIGN(4); - - /** - * Place RAM initialized variables - */ - _data = .; - - *(vtable) - *(.data*) - - _edata = .; - - } > DISCARD /*> SRAM AT>FLASH = 0x00 */ - - .bss : - { - /** - * Place RAM uninitialized variables - */ - _bss = .; - *(.bss*) - _ebss = .; - - - /** - * Reserve stack size - */ - . = ALIGN(4); - app_stack_canary = .; - PROVIDE(app_stack_canary = .); - . += 4; - _stack_validation = .; - . = _stack_validation + STACK_SIZE; - _stack = ABSOLUTE(END_STACK) - STACK_SIZE; - PROVIDE( _stack = ABSOLUTE(END_STACK) - STACK_SIZE); - _estack = ABSOLUTE(END_STACK); - PROVIDE( _estack = ABSOLUTE(END_STACK) ); - - } > SRAM = 0x00 - - /****************************************************************/ - /* DEBUG */ - /****************************************************************/ - - /* remove the debugging information from the standard libraries */ - DEBUG (NOLOAD) : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - } > DISCARD - - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } - /* DWARF debug sections. - Symbols in the DWARF debugging sections are relative to the beginning - of the section so we begin them at 0. */ - /* DWARF 1 */ - .debug 0 : { *(.debug) } - .line 0 : { *(.line) } - /* GNU DWARF 1 extensions */ - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_sfnames 0 : { *(.debug_sfnames) } - /* DWARF 1.1 and DWARF 2 */ - .debug_aranges 0 : { *(.debug_aranges) } - .debug_pubnames 0 : { *(.debug_pubnames) } - /* DWARF 2 */ - .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_line 0 : { *(.debug_line) } - .debug_frame 0 : { *(.debug_frame) } - .debug_str 0 : { *(.debug_str) } - .debug_loc 0 : { *(.debug_loc) } - .debug_macinfo 0 : { *(.debug_macinfo) } - /* SGI/MIPS DWARF 2 extensions */ - .debug_weaknames 0 : { *(.debug_weaknames) } - .debug_funcnames 0 : { *(.debug_funcnames) } - .debug_typenames 0 : { *(.debug_typenames) } - .debug_varnames 0 : { *(.debug_varnames) } -} - -PROVIDE(_nvram = ABSOLUTE(_nvram_start)); -PROVIDE(_envram = ABSOLUTE(_nvram_end)); \ No newline at end of file diff --git a/app/script_x.ld b/app/script_x.ld deleted file mode 100644 index 0d174c46..00000000 --- a/app/script_x.ld +++ /dev/null @@ -1,175 +0,0 @@ -/******************************************************************************* -* Ledger Blue - Secure firmware -* (c) 2016, 2017, 2018, 2019 Ledger -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ - -/** - * Global chip memory layout and constants - * - */ - -MEMORY -{ - DISCARD (rwx) : ORIGIN = 0xd0000000, LENGTH = 1M - - FLASH (rx) : ORIGIN = 0xc0de0000, LENGTH = 400K - DATA (r) : ORIGIN = 0xc0de0000, LENGTH = 400K - SRAM (rwx) : ORIGIN = 0xda7a0000, LENGTH = 30K -} - -PAGE_SIZE = 256; -STACK_SIZE = 8192; -END_STACK = ORIGIN(SRAM) + LENGTH(SRAM); - -ENTRY(main) - -SECTIONS -{ - - /****************************************************************/ - /* This section locates the code in FLASH */ - /****************************************************************/ - - /** put text in Flash memory, VMA will be equal to LMA */ - .text : - { - /* provide start code symbol, shall be zero */ - _text = .; - _nvram = .; - PROVIDE(_nvram = . + ORIGIN(FLASH)); - - PROVIDE(_setjmp = setjmp); /*thanks clang*/ - - /* ensure main is always @ 0xC0D00000 */ - *(.boot*) - - /* place the other code and rodata defined BUT nvram variables that are displaced in a r/w area */ - *(.text*) - *(.rodata) - *(.rodata.[^N]*) /*.data.rel.ro* not here to detect invalid PIC usage */ - *(.rodata.N[^_]*) - - . = ALIGN(4); - - /* all code placed */ - _etext = .; - - . = ALIGN(PAGE_SIZE); - - _nvram_data = .; - - /* NVM data (ex-filesystem) */ - *(.bss.N_* .rodata.N_*) - - . = ALIGN(PAGE_SIZE); - _envram_data = .; - /* _nvram_data_size = _envram_data - _nvram_data; */ - _install_parameters = .; - PROVIDE(N_install_parameters = .); - _envram = .; - PROVIDE(_envram = . + ORIGIN(FLASH)); - - } > FLASH = 0x00 - - .data (NOLOAD): - { - . = ALIGN(4); - - /** - * Place RAM initialized variables - */ - _data = .; - - *(vtable) - *(.data*) - - _edata = .; - - } > DISCARD /*> SRAM AT>FLASH = 0x00 */ - - .bss : - { - /** - * Place RAM uninitialized variables - */ - _bss = .; - *(.bss*) - _ebss = .; - - - /** - * Reserve stack size - */ - . = ALIGN(4); - app_stack_canary = .; - PROVIDE(app_stack_canary = .); - . += 4; - _stack_validation = .; - . = _stack_validation + STACK_SIZE; - _stack = ABSOLUTE(END_STACK) - STACK_SIZE; - PROVIDE( _stack = ABSOLUTE(END_STACK) - STACK_SIZE); - _estack = ABSOLUTE(END_STACK); - PROVIDE( _estack = ABSOLUTE(END_STACK) ); - - } > SRAM = 0x00 - - /****************************************************************/ - /* DEBUG */ - /****************************************************************/ - - /* remove the debugging information from the standard libraries */ - DEBUG (NOLOAD) : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - } > DISCARD - - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } - /* DWARF debug sections. - Symbols in the DWARF debugging sections are relative to the beginning - of the section so we begin them at 0. */ - /* DWARF 1 */ - .debug 0 : { *(.debug) } - .line 0 : { *(.line) } - /* GNU DWARF 1 extensions */ - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_sfnames 0 : { *(.debug_sfnames) } - /* DWARF 1.1 and DWARF 2 */ - .debug_aranges 0 : { *(.debug_aranges) } - .debug_pubnames 0 : { *(.debug_pubnames) } - /* DWARF 2 */ - .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_line 0 : { *(.debug_line) } - .debug_frame 0 : { *(.debug_frame) } - .debug_str 0 : { *(.debug_str) } - .debug_loc 0 : { *(.debug_loc) } - .debug_macinfo 0 : { *(.debug_macinfo) } - /* SGI/MIPS DWARF 2 extensions */ - .debug_weaknames 0 : { *(.debug_weaknames) } - .debug_funcnames 0 : { *(.debug_funcnames) } - .debug_typenames 0 : { *(.debug_typenames) } - .debug_varnames 0 : { *(.debug_varnames) } - -} From cdeb034cf7b06dac5baed28c94e97bc3deb454ee Mon Sep 17 00:00:00 2001 From: ftheirs Date: Fri, 1 Dec 2023 09:37:58 -0300 Subject: [PATCH 5/5] update Ledger guidelines enforcer --- .github/workflows/guidelines_enforcer.yml | 2 -- ledger_app.toml | 7 +++++++ 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 ledger_app.toml diff --git a/.github/workflows/guidelines_enforcer.yml b/.github/workflows/guidelines_enforcer.yml index 0b958e52..fdaf9f27 100644 --- a/.github/workflows/guidelines_enforcer.yml +++ b/.github/workflows/guidelines_enforcer.yml @@ -21,5 +21,3 @@ jobs: guidelines_enforcer: name: Call Ledger guidelines_enforcer uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_guidelines_enforcer.yml@v1 - with: - relative_app_directory: 'app' diff --git a/ledger_app.toml b/ledger_app.toml new file mode 100644 index 00000000..3e4cbb1f --- /dev/null +++ b/ledger_app.toml @@ -0,0 +1,7 @@ +[app] +build_directory = "./app/" +sdk = "C" +devices = ["nanos", "nanox", "nanos+", "stax"] + +[tests] +unit_directory = "./tests/"