From 6136cd1e4baea11a7d172bfd320b88659a96ef08 Mon Sep 17 00:00:00 2001 From: GroM Date: Wed, 5 Feb 2025 17:00:27 +0100 Subject: [PATCH 01/29] Move custom target files into cargo-ledger crate --- cargo-ledger/custom_targets/flex.json | 29 ++++++++++++++++++++ cargo-ledger/custom_targets/nanos.json | 32 ++++++++++++++++++++++ cargo-ledger/custom_targets/nanosplus.json | 29 ++++++++++++++++++++ cargo-ledger/custom_targets/nanox.json | 29 ++++++++++++++++++++ cargo-ledger/custom_targets/stax.json | 29 ++++++++++++++++++++ cargo-ledger/src/setup.rs | 2 +- 6 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 cargo-ledger/custom_targets/flex.json create mode 100644 cargo-ledger/custom_targets/nanos.json create mode 100644 cargo-ledger/custom_targets/nanosplus.json create mode 100644 cargo-ledger/custom_targets/nanox.json create mode 100644 cargo-ledger/custom_targets/stax.json diff --git a/cargo-ledger/custom_targets/flex.json b/cargo-ledger/custom_targets/flex.json new file mode 100644 index 00000000..af01a46e --- /dev/null +++ b/cargo-ledger/custom_targets/flex.json @@ -0,0 +1,29 @@ +{ + "abi": "eabi", + "arch": "arm", + "c-enum-min-bits": 8, + "data-layout": "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64", + "emit-debug-gdb-scripts": false, + "executables": true, + "frame-pointer": "always", + "linker": "link_wrap.sh", + "linker-flavor": "ld.lld", + "llvm-target": "thumbv8m.main-none-eabi", + "max-atomic-width": 32, + "panic-strategy": "abort", + "pre-link-args": { + "ld.lld": [ + "-Tstax_flex_layout.ld", + "-Tlink.ld" + ], + "ld": [ + "-Tstax_flex_layout.ld", + "-Tlink.ld" + ] + }, + "relocation-model": "ropi-rwpi", + "singlethread": true, + "target-pointer-width": "32", + "os": "flex", + "target-family": [ "bolos" ] +} diff --git a/cargo-ledger/custom_targets/nanos.json b/cargo-ledger/custom_targets/nanos.json new file mode 100644 index 00000000..4d893faf --- /dev/null +++ b/cargo-ledger/custom_targets/nanos.json @@ -0,0 +1,32 @@ +{ + "abi": "eabi", + "arch": "arm", + "atomic-cas": false, + "c-enum-min-bits": 8, + "data-layout": "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64", + "emit-debug-gdb-scripts": false, + "executables": true, + "features": "+strict-align", + "frame-pointer": "always", + "linker": "link_wrap.sh", + "linker-flavor": "ld.lld", + "llvm-target": "thumbv6m-none-eabi", + "panic-strategy": "abort", + "pre-link-args": { + "ld.lld": [ + "-Tnanos_layout.ld", + "-Tlink.ld", + "--emit-relocs" + ], + "ld": [ + "-Tnanos_layout.ld", + "-Tlink.ld", + "--emit-relocs" + ] + }, + "relocation-model": "ropi", + "singlethread": true, + "target-pointer-width": "32", + "os": "nanos", + "target-family": [ "bolos" ] +} diff --git a/cargo-ledger/custom_targets/nanosplus.json b/cargo-ledger/custom_targets/nanosplus.json new file mode 100644 index 00000000..5f3d2030 --- /dev/null +++ b/cargo-ledger/custom_targets/nanosplus.json @@ -0,0 +1,29 @@ +{ + "abi": "eabi", + "arch": "arm", + "c-enum-min-bits": 8, + "data-layout": "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64", + "emit-debug-gdb-scripts": false, + "executables": true, + "frame-pointer": "always", + "linker": "link_wrap.sh", + "linker-flavor": "ld.lld", + "llvm-target": "thumbv8m.main-none-eabi", + "max-atomic-width": 32, + "panic-strategy": "abort", + "pre-link-args": { + "ld.lld": [ + "-Tnanosplus_layout.ld", + "-Tlink.ld" + ], + "ld": [ + "-Tnanosplus_layout.ld", + "-Tlink.ld" + ] + }, + "relocation-model": "ropi-rwpi", + "singlethread": true, + "target-pointer-width": "32", + "os": "nanosplus", + "target-family": [ "bolos" ] +} diff --git a/cargo-ledger/custom_targets/nanox.json b/cargo-ledger/custom_targets/nanox.json new file mode 100644 index 00000000..245672ec --- /dev/null +++ b/cargo-ledger/custom_targets/nanox.json @@ -0,0 +1,29 @@ +{ + "abi": "eabi", + "arch": "arm", + "atomic-cas": false, + "c-enum-min-bits": 8, + "data-layout": "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64", + "emit-debug-gdb-scripts": false, + "executables": true, + "frame-pointer": "always", + "linker": "link_wrap.sh", + "linker-flavor": "ld.lld", + "llvm-target": "thumbv6m-none-eabi", + "panic-strategy": "abort", + "pre-link-args": { + "ld.lld": [ + "-Tnanox_layout.ld", + "-Tlink.ld" + ], + "ld": [ + "-Tnanox_layout.ld", + "-Tlink.ld" + ] + }, + "relocation-model": "ropi-rwpi", + "singlethread": true, + "target-pointer-width": "32", + "os": "nanox", + "target-family": [ "bolos" ] +} diff --git a/cargo-ledger/custom_targets/stax.json b/cargo-ledger/custom_targets/stax.json new file mode 100644 index 00000000..c39cd3d0 --- /dev/null +++ b/cargo-ledger/custom_targets/stax.json @@ -0,0 +1,29 @@ +{ + "abi": "eabi", + "arch": "arm", + "c-enum-min-bits": 8, + "data-layout": "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64", + "emit-debug-gdb-scripts": false, + "executables": true, + "frame-pointer": "always", + "linker": "link_wrap.sh", + "linker-flavor": "ld.lld", + "llvm-target": "thumbv8m.main-none-eabi", + "max-atomic-width": 32, + "panic-strategy": "abort", + "pre-link-args": { + "ld.lld": [ + "-Tstax_flex_layout.ld", + "-Tlink.ld" + ], + "ld": [ + "-Tstax_flex_layout.ld", + "-Tlink.ld" + ] + }, + "relocation-model": "ropi-rwpi", + "singlethread": true, + "target-pointer-width": "32", + "os": "stax", + "target-family": [ "bolos" ] +} diff --git a/cargo-ledger/src/setup.rs b/cargo-ledger/src/setup.rs index 822f26d4..68254db0 100644 --- a/cargo-ledger/src/setup.rs +++ b/cargo-ledger/src/setup.rs @@ -13,7 +13,7 @@ pub fn install_targets() { let sysroot_cmd = std::str::from_utf8(&sysroot_cmd).unwrap().trim(); let target_files_url = Path::new( - "https://raw.githubusercontent.com/LedgerHQ/ledger-device-rust-sdk/a7fb841160df34b8de268b136704c8b2ed8f9973/ledger_device_sdk/" + "https://raw.githubusercontent.com/LedgerHQ/ledger-device-rust-sdk/y333/nbgl_support_for_nanos/cargo-ledger/" ); let sysroot = Path::new(sysroot_cmd).join("lib").join("rustlib"); From 2dfc857e7aa9fc4ef1bac08fd634b96e739abbe8 Mon Sep 17 00:00:00 2001 From: GroM Date: Wed, 5 Feb 2025 18:36:31 +0100 Subject: [PATCH 02/29] Update cargo ledger setup --- .../flex.json | 0 .../custom_files}/link_wrap.sh | 0 .../nanos.json | 0 .../nanosplus.json | 0 .../nanox.json | 0 .../stax.json | 0 cargo-ledger/src/setup.rs | 2 +- ledger_device_sdk/flex.json | 29 ----------------- ledger_device_sdk/nanos.json | 32 ------------------- ledger_device_sdk/nanosplus.json | 29 ----------------- ledger_device_sdk/nanox.json | 29 ----------------- ledger_device_sdk/stax.json | 29 ----------------- 12 files changed, 1 insertion(+), 149 deletions(-) rename cargo-ledger/{custom_targets => custom_files}/flex.json (100%) rename {ledger_device_sdk => cargo-ledger/custom_files}/link_wrap.sh (100%) rename cargo-ledger/{custom_targets => custom_files}/nanos.json (100%) rename cargo-ledger/{custom_targets => custom_files}/nanosplus.json (100%) rename cargo-ledger/{custom_targets => custom_files}/nanox.json (100%) rename cargo-ledger/{custom_targets => custom_files}/stax.json (100%) delete mode 100644 ledger_device_sdk/flex.json delete mode 100644 ledger_device_sdk/nanos.json delete mode 100644 ledger_device_sdk/nanosplus.json delete mode 100644 ledger_device_sdk/nanox.json delete mode 100644 ledger_device_sdk/stax.json diff --git a/cargo-ledger/custom_targets/flex.json b/cargo-ledger/custom_files/flex.json similarity index 100% rename from cargo-ledger/custom_targets/flex.json rename to cargo-ledger/custom_files/flex.json diff --git a/ledger_device_sdk/link_wrap.sh b/cargo-ledger/custom_files/link_wrap.sh similarity index 100% rename from ledger_device_sdk/link_wrap.sh rename to cargo-ledger/custom_files/link_wrap.sh diff --git a/cargo-ledger/custom_targets/nanos.json b/cargo-ledger/custom_files/nanos.json similarity index 100% rename from cargo-ledger/custom_targets/nanos.json rename to cargo-ledger/custom_files/nanos.json diff --git a/cargo-ledger/custom_targets/nanosplus.json b/cargo-ledger/custom_files/nanosplus.json similarity index 100% rename from cargo-ledger/custom_targets/nanosplus.json rename to cargo-ledger/custom_files/nanosplus.json diff --git a/cargo-ledger/custom_targets/nanox.json b/cargo-ledger/custom_files/nanox.json similarity index 100% rename from cargo-ledger/custom_targets/nanox.json rename to cargo-ledger/custom_files/nanox.json diff --git a/cargo-ledger/custom_targets/stax.json b/cargo-ledger/custom_files/stax.json similarity index 100% rename from cargo-ledger/custom_targets/stax.json rename to cargo-ledger/custom_files/stax.json diff --git a/cargo-ledger/src/setup.rs b/cargo-ledger/src/setup.rs index 68254db0..416dd707 100644 --- a/cargo-ledger/src/setup.rs +++ b/cargo-ledger/src/setup.rs @@ -13,7 +13,7 @@ pub fn install_targets() { let sysroot_cmd = std::str::from_utf8(&sysroot_cmd).unwrap().trim(); let target_files_url = Path::new( - "https://raw.githubusercontent.com/LedgerHQ/ledger-device-rust-sdk/y333/nbgl_support_for_nanos/cargo-ledger/" + "https://raw.githubusercontent.com/LedgerHQ/ledger-device-rust-sdk/y333/nbgl_support_for_nanos/cargo-ledger/custom_files" ); let sysroot = Path::new(sysroot_cmd).join("lib").join("rustlib"); diff --git a/ledger_device_sdk/flex.json b/ledger_device_sdk/flex.json deleted file mode 100644 index af01a46e..00000000 --- a/ledger_device_sdk/flex.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "abi": "eabi", - "arch": "arm", - "c-enum-min-bits": 8, - "data-layout": "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64", - "emit-debug-gdb-scripts": false, - "executables": true, - "frame-pointer": "always", - "linker": "link_wrap.sh", - "linker-flavor": "ld.lld", - "llvm-target": "thumbv8m.main-none-eabi", - "max-atomic-width": 32, - "panic-strategy": "abort", - "pre-link-args": { - "ld.lld": [ - "-Tstax_flex_layout.ld", - "-Tlink.ld" - ], - "ld": [ - "-Tstax_flex_layout.ld", - "-Tlink.ld" - ] - }, - "relocation-model": "ropi-rwpi", - "singlethread": true, - "target-pointer-width": "32", - "os": "flex", - "target-family": [ "bolos" ] -} diff --git a/ledger_device_sdk/nanos.json b/ledger_device_sdk/nanos.json deleted file mode 100644 index 4d893faf..00000000 --- a/ledger_device_sdk/nanos.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "abi": "eabi", - "arch": "arm", - "atomic-cas": false, - "c-enum-min-bits": 8, - "data-layout": "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64", - "emit-debug-gdb-scripts": false, - "executables": true, - "features": "+strict-align", - "frame-pointer": "always", - "linker": "link_wrap.sh", - "linker-flavor": "ld.lld", - "llvm-target": "thumbv6m-none-eabi", - "panic-strategy": "abort", - "pre-link-args": { - "ld.lld": [ - "-Tnanos_layout.ld", - "-Tlink.ld", - "--emit-relocs" - ], - "ld": [ - "-Tnanos_layout.ld", - "-Tlink.ld", - "--emit-relocs" - ] - }, - "relocation-model": "ropi", - "singlethread": true, - "target-pointer-width": "32", - "os": "nanos", - "target-family": [ "bolos" ] -} diff --git a/ledger_device_sdk/nanosplus.json b/ledger_device_sdk/nanosplus.json deleted file mode 100644 index 5f3d2030..00000000 --- a/ledger_device_sdk/nanosplus.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "abi": "eabi", - "arch": "arm", - "c-enum-min-bits": 8, - "data-layout": "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64", - "emit-debug-gdb-scripts": false, - "executables": true, - "frame-pointer": "always", - "linker": "link_wrap.sh", - "linker-flavor": "ld.lld", - "llvm-target": "thumbv8m.main-none-eabi", - "max-atomic-width": 32, - "panic-strategy": "abort", - "pre-link-args": { - "ld.lld": [ - "-Tnanosplus_layout.ld", - "-Tlink.ld" - ], - "ld": [ - "-Tnanosplus_layout.ld", - "-Tlink.ld" - ] - }, - "relocation-model": "ropi-rwpi", - "singlethread": true, - "target-pointer-width": "32", - "os": "nanosplus", - "target-family": [ "bolos" ] -} diff --git a/ledger_device_sdk/nanox.json b/ledger_device_sdk/nanox.json deleted file mode 100644 index 245672ec..00000000 --- a/ledger_device_sdk/nanox.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "abi": "eabi", - "arch": "arm", - "atomic-cas": false, - "c-enum-min-bits": 8, - "data-layout": "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64", - "emit-debug-gdb-scripts": false, - "executables": true, - "frame-pointer": "always", - "linker": "link_wrap.sh", - "linker-flavor": "ld.lld", - "llvm-target": "thumbv6m-none-eabi", - "panic-strategy": "abort", - "pre-link-args": { - "ld.lld": [ - "-Tnanox_layout.ld", - "-Tlink.ld" - ], - "ld": [ - "-Tnanox_layout.ld", - "-Tlink.ld" - ] - }, - "relocation-model": "ropi-rwpi", - "singlethread": true, - "target-pointer-width": "32", - "os": "nanox", - "target-family": [ "bolos" ] -} diff --git a/ledger_device_sdk/stax.json b/ledger_device_sdk/stax.json deleted file mode 100644 index c39cd3d0..00000000 --- a/ledger_device_sdk/stax.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "abi": "eabi", - "arch": "arm", - "c-enum-min-bits": 8, - "data-layout": "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64", - "emit-debug-gdb-scripts": false, - "executables": true, - "frame-pointer": "always", - "linker": "link_wrap.sh", - "linker-flavor": "ld.lld", - "llvm-target": "thumbv8m.main-none-eabi", - "max-atomic-width": 32, - "panic-strategy": "abort", - "pre-link-args": { - "ld.lld": [ - "-Tstax_flex_layout.ld", - "-Tlink.ld" - ], - "ld": [ - "-Tstax_flex_layout.ld", - "-Tlink.ld" - ] - }, - "relocation-model": "ropi-rwpi", - "singlethread": true, - "target-pointer-width": "32", - "os": "stax", - "target-family": [ "bolos" ] -} From 4b01fd87a580cee6f55cb318828cd5f7bfc26f9f Mon Sep 17 00:00:00 2001 From: GroM Date: Thu, 6 Feb 2025 10:07:50 +0100 Subject: [PATCH 03/29] Manage unknown device --- ledger_secure_sdk_sys/build.rs | 85 ++++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 34 deletions(-) diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index 18f3d23e..fc9ee054 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -51,6 +51,20 @@ enum Device { NanoX, Stax, Flex, + Unknown, +} + +impl From<&str> for Device { + fn from(s: &str) -> Self { + match s { + "nanos" => Device::NanoS, + "nanosplus" => Device::NanoSPlus, + "nanox" => Device::NanoX, + "stax" => Device::Stax, + "flex" => Device::Flex, + _s => Device::Unknown, + } + } } impl std::fmt::Display for Device { @@ -61,13 +75,13 @@ impl std::fmt::Display for Device { Device::NanoX => write!(f, "nanox"), Device::Stax => write!(f, "stax"), Device::Flex => write!(f, "flex"), + Device::Unknown => write!(f, "unknown"), } } } #[derive(Default)] -struct SDKInfo { - pub bolos_sdk: PathBuf, +struct CSDKInfo { pub api_level: Option, pub target_id: String, pub target_name: String, @@ -76,20 +90,18 @@ struct SDKInfo { pub c_sdk_version: String, } -impl SDKInfo { +impl CSDKInfo { pub fn new() -> Self { - SDKInfo::default() + CSDKInfo::default() } } -fn retrieve_sdk_info(device: &Device, path: &Path) -> Result { - let mut sdk_info = SDKInfo::new(); - sdk_info.bolos_sdk = path.to_path_buf(); - (sdk_info.api_level, sdk_info.c_sdk_name) = retrieve_makefile_infos(&sdk_info.bolos_sdk)?; - (sdk_info.target_id, sdk_info.target_name) = - retrieve_target_file_infos(device, &sdk_info.bolos_sdk)?; - (sdk_info.c_sdk_hash, sdk_info.c_sdk_version) = retrieve_sdk_git_info(&sdk_info.bolos_sdk); - Ok(sdk_info) +fn retrieve_sdk_info(device: &Device, path: &PathBuf) -> Result { + let mut csdk_info = CSDKInfo::new(); + (csdk_info.api_level, csdk_info.c_sdk_name) = retrieve_makefile_infos(path)?; + (csdk_info.target_id, csdk_info.target_name) = retrieve_target_file_infos(device, path)?; + (csdk_info.c_sdk_hash, csdk_info.c_sdk_version) = retrieve_sdk_git_info(path); + Ok(csdk_info) } fn retrieve_sdk_git_info(bolos_sdk: &Path) -> (String, String) { @@ -230,6 +242,7 @@ fn clone_sdk(device: &Device) -> PathBuf { Path::new("https://github.com/LedgerHQ/ledger-secure-sdk"), "API_LEVEL_22", ), + Device::Unknown => panic!("Unknown device"), }; let out_dir = env::var("OUT_DIR").unwrap(); @@ -249,6 +262,7 @@ fn clone_sdk(device: &Device) -> PathBuf { #[derive(Debug)] enum SDKBuildError { + UnknownDevice, InvalidAPILevel, MissingSDKName, TargetFileNotFound, @@ -306,7 +320,7 @@ impl SDKBuilder { } } - pub fn gcc_toolchain(&mut self) { + pub fn gcc_toolchain(&mut self) -> Result<(), SDKBuildError> { // Find out where the arm toolchain is located let output = Command::new("arm-none-eabi-gcc") .arg("-print-sysroot") @@ -325,36 +339,35 @@ impl SDKBuilder { format!("{sysroot}") }; self.gcc_toolchain = PathBuf::from(gcc_toolchain); + Ok(()) } - pub fn device(&mut self) { + pub fn device(&mut self) -> Result<(), SDKBuildError> { // determine device - let device = match env::var_os("CARGO_CFG_TARGET_OS").unwrap().to_str().unwrap() { - "nanos" => Device::NanoS, - "nanosplus" => Device::NanoSPlus, - "nanox" => Device::NanoX, - "stax" => Device::Stax, - "flex" => Device::Flex, - target_name => panic!( - "invalid target `{target_name}`, expected one of `nanos`, `nanox`, `nanosplus`. Run with `-Z build-std=core --target=./.json`" - ), - }; - self.device = device; - // export TARGET into env for 'infos.rs' - println!("cargo:rustc-env=TARGET={}", self.device); - println!("cargo:warning=Device is {:?}", self.device); + self.device = env::var_os("CARGO_CFG_TARGET_OS") + .unwrap() + .to_str() + .unwrap() + .into(); + + if self.device == Device::Unknown { + return Err(SDKBuildError::UnknownDevice); + } else { + // export TARGET into env for 'infos.rs' + println!("cargo:rustc-env=TARGET={}", self.device); + println!("cargo:warning=Device is {:?}", self.device); + Ok(()) + } } pub fn bolos_sdk(&mut self) -> Result<(), SDKBuildError> { println!("cargo:rerun-if-env-changed=LEDGER_SDK_PATH"); - let sdk_path = match env::var("LEDGER_SDK_PATH") { + self.bolos_sdk = match env::var("LEDGER_SDK_PATH") { Err(_) => clone_sdk(&self.device), Ok(path) => PathBuf::from(path), }; - let sdk_info = retrieve_sdk_info(&self.device, &sdk_path)?; - - self.bolos_sdk = sdk_info.bolos_sdk; + let sdk_info = retrieve_sdk_info(&self.device, &self.bolos_sdk)?; match sdk_info.api_level { Some(api_level) => { @@ -415,6 +428,7 @@ impl SDKBuilder { Device::NanoSPlus => out_path.join("glyphs_nanosplus"), Device::NanoX => out_path.join("glyphs_nanox"), Device::NanoS => panic!("Nano S does not support glyphs"), + Device::Unknown => panic!("Unknown device"), }; if !dest_path.exists() { fs::create_dir_all(&dest_path).ok(); @@ -508,6 +522,7 @@ impl SDKBuilder { Device::NanoSPlus => finalize_nanosplus_configuration(&mut command, &self.bolos_sdk), Device::Stax => finalize_stax_configuration(&mut command, &self.bolos_sdk), Device::Flex => finalize_flex_configuration(&mut command, &self.bolos_sdk), + Device::Unknown => panic!("Unknown device"), }; // Add the defines found in the Makefile.conf.cx to our build command. @@ -578,6 +593,7 @@ impl SDKBuilder { Device::NanoSPlus => ("nanos2", "sdk_nanosp.h"), Device::Stax => ("stax", "sdk_stax.h"), Device::Flex => ("flex", "sdk_flex.h"), + Device::Unknown => panic!("Unknown device"), }; bindings = bindings.clang_arg(format!("-I{bsdk}/target/{include_path}/include/")); bindings = bindings.header(header); @@ -677,11 +693,12 @@ impl SDKBuilder { fn main() { let mut sdk_builder = SDKBuilder::new(); - sdk_builder.gcc_toolchain(); - sdk_builder.device(); + sdk_builder.gcc_toolchain().unwrap(); + sdk_builder.device().unwrap(); sdk_builder.bolos_sdk().unwrap(); sdk_builder.cxdefines(); sdk_builder.generate_glyphs(); + sdk_builder.build_c_sdk(); sdk_builder.generate_bindings(); sdk_builder.generate_heap_size(); From 7c47bb9cdbec19e0b3d0a4742bb833a36cab6431 Mon Sep 17 00:00:00 2001 From: GroM Date: Thu, 6 Feb 2025 18:37:34 +0100 Subject: [PATCH 04/29] Move custom targets and link files into sys crate --- {cargo-ledger/custom_files => ledger_secure_sdk_sys}/flex.json | 0 {cargo-ledger/custom_files => ledger_secure_sdk_sys}/link_wrap.sh | 0 {cargo-ledger/custom_files => ledger_secure_sdk_sys}/nanos.json | 0 .../custom_files => ledger_secure_sdk_sys}/nanosplus.json | 0 {cargo-ledger/custom_files => ledger_secure_sdk_sys}/nanox.json | 0 {cargo-ledger/custom_files => ledger_secure_sdk_sys}/stax.json | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename {cargo-ledger/custom_files => ledger_secure_sdk_sys}/flex.json (100%) rename {cargo-ledger/custom_files => ledger_secure_sdk_sys}/link_wrap.sh (100%) rename {cargo-ledger/custom_files => ledger_secure_sdk_sys}/nanos.json (100%) rename {cargo-ledger/custom_files => ledger_secure_sdk_sys}/nanosplus.json (100%) rename {cargo-ledger/custom_files => ledger_secure_sdk_sys}/nanox.json (100%) rename {cargo-ledger/custom_files => ledger_secure_sdk_sys}/stax.json (100%) diff --git a/cargo-ledger/custom_files/flex.json b/ledger_secure_sdk_sys/flex.json similarity index 100% rename from cargo-ledger/custom_files/flex.json rename to ledger_secure_sdk_sys/flex.json diff --git a/cargo-ledger/custom_files/link_wrap.sh b/ledger_secure_sdk_sys/link_wrap.sh similarity index 100% rename from cargo-ledger/custom_files/link_wrap.sh rename to ledger_secure_sdk_sys/link_wrap.sh diff --git a/cargo-ledger/custom_files/nanos.json b/ledger_secure_sdk_sys/nanos.json similarity index 100% rename from cargo-ledger/custom_files/nanos.json rename to ledger_secure_sdk_sys/nanos.json diff --git a/cargo-ledger/custom_files/nanosplus.json b/ledger_secure_sdk_sys/nanosplus.json similarity index 100% rename from cargo-ledger/custom_files/nanosplus.json rename to ledger_secure_sdk_sys/nanosplus.json diff --git a/cargo-ledger/custom_files/nanox.json b/ledger_secure_sdk_sys/nanox.json similarity index 100% rename from cargo-ledger/custom_files/nanox.json rename to ledger_secure_sdk_sys/nanox.json diff --git a/cargo-ledger/custom_files/stax.json b/ledger_secure_sdk_sys/stax.json similarity index 100% rename from cargo-ledger/custom_files/stax.json rename to ledger_secure_sdk_sys/stax.json From 19bf4b168134b6fe34ceb1201b04cebd23d3272c Mon Sep 17 00:00:00 2001 From: GroM Date: Thu, 6 Feb 2025 18:49:26 +0100 Subject: [PATCH 05/29] Use RUST_NIGHTLY env variable for setup target files --- cargo-ledger/src/setup.rs | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/cargo-ledger/src/setup.rs b/cargo-ledger/src/setup.rs index 416dd707..d6705b9b 100644 --- a/cargo-ledger/src/setup.rs +++ b/cargo-ledger/src/setup.rs @@ -1,19 +1,39 @@ use std::path::Path; use std::process::Command; +use std::str::from_utf8; pub fn install_targets() { - println!("[ ] Checking for installed custom targets..."); + println!("[ ] Install custom targets..."); // Check if target files are installed + let mut args: Vec = vec![]; + match std::env::var("RUST_NIGHTLY") { + Ok(version) => { + println!( + "Install custom targets for nightly toolchain: {}", + version + ); + args.push(format!("+{}", version)); + } + Err(_) => { + let rustup_cmd = + Command::new("rustup").arg("default").output().unwrap(); + println!( + "Install custom targets for default toolchain {}", + from_utf8(rustup_cmd.stdout.as_slice()).unwrap() + ); + } + } + args.push(String::from("--print")); + args.push(String::from("sysroot")); let sysroot_cmd = Command::new("rustc") - .arg("--print") - .arg("sysroot") + .args(&args) .output() .expect("failed to call rustc") .stdout; let sysroot_cmd = std::str::from_utf8(&sysroot_cmd).unwrap().trim(); let target_files_url = Path::new( - "https://raw.githubusercontent.com/LedgerHQ/ledger-device-rust-sdk/y333/nbgl_support_for_nanos/cargo-ledger/custom_files" + "https://raw.githubusercontent.com/LedgerHQ/ledger-device-rust-sdk/y333/nbgl_support_for_nanos/ledger_secure_sdk_sys" ); let sysroot = Path::new(sysroot_cmd).join("lib").join("rustlib"); From b1e46a140e85674c265bd19b1dfafde3161a3b59 Mon Sep 17 00:00:00 2001 From: GroM Date: Fri, 7 Feb 2025 11:39:04 +0100 Subject: [PATCH 06/29] Fix C SDK info --- ledger_secure_sdk_sys/build.rs | 89 +++++++++++++++++----------------- 1 file changed, 44 insertions(+), 45 deletions(-) diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index fc9ee054..78fadb79 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -51,20 +51,6 @@ enum Device { NanoX, Stax, Flex, - Unknown, -} - -impl From<&str> for Device { - fn from(s: &str) -> Self { - match s { - "nanos" => Device::NanoS, - "nanosplus" => Device::NanoSPlus, - "nanox" => Device::NanoX, - "stax" => Device::Stax, - "flex" => Device::Flex, - _s => Device::Unknown, - } - } } impl std::fmt::Display for Device { @@ -75,7 +61,6 @@ impl std::fmt::Display for Device { Device::NanoX => write!(f, "nanox"), Device::Stax => write!(f, "stax"), Device::Flex => write!(f, "flex"), - Device::Unknown => write!(f, "unknown"), } } } @@ -96,15 +81,15 @@ impl CSDKInfo { } } -fn retrieve_sdk_info(device: &Device, path: &PathBuf) -> Result { +fn retrieve_csdk_info(device: &Device, path: &PathBuf) -> Result { let mut csdk_info = CSDKInfo::new(); (csdk_info.api_level, csdk_info.c_sdk_name) = retrieve_makefile_infos(path)?; (csdk_info.target_id, csdk_info.target_name) = retrieve_target_file_infos(device, path)?; - (csdk_info.c_sdk_hash, csdk_info.c_sdk_version) = retrieve_sdk_git_info(path); + (csdk_info.c_sdk_hash, csdk_info.c_sdk_version) = retrieve_csdk_git_info(path); Ok(csdk_info) } -fn retrieve_sdk_git_info(bolos_sdk: &Path) -> (String, String) { +fn retrieve_csdk_git_info(bolos_sdk: &Path) -> (String, String) { let c_sdk_hash = match Command::new("git") .arg("-C") .arg(bolos_sdk) @@ -132,7 +117,6 @@ fn retrieve_sdk_git_info(bolos_sdk: &Path) -> (String, String) { .arg(bolos_sdk) .arg("describe") .arg("--tags") - .arg("--exact-match") .arg("--match") .arg("v[0-9]*") .arg("--dirty") @@ -140,10 +124,10 @@ fn retrieve_sdk_git_info(bolos_sdk: &Path) -> (String, String) { .ok() { Some(output) => { - if output.stdout.is_empty() { - "None".to_string() - } else { + if output.status.success() { String::from_utf8(output.stdout).unwrap_or("None".to_string()) + } else { + String::from_utf8(output.stderr).unwrap_or("None".to_string()) } } None => "None".to_string(), @@ -152,24 +136,35 @@ fn retrieve_sdk_git_info(bolos_sdk: &Path) -> (String, String) { } fn retrieve_makefile_infos(bolos_sdk: &Path) -> Result<(Option, String), SDKBuildError> { - let makefile_defines = + let makefile = File::open(bolos_sdk.join("Makefile.defines")).expect("Could not find Makefile.defines"); let mut api_level: Option = None; - let mut sdk_name: Option = None; - for line in BufReader::new(makefile_defines).lines().flatten() { + for line in BufReader::new(makefile).lines().flatten() { if let Some(value) = line.split(":=").nth(1).map(str::trim) { if line.contains("API_LEVEL") && api_level.is_none() { api_level = Some(value.parse().map_err(|_| SDKBuildError::InvalidAPILevel)?); - } else if line.contains("SDK_NAME") && sdk_name.is_none() { + } + } + if api_level.is_some() { + // Key found, break out of the loop + break; + } + } + let makefile = + File::open(bolos_sdk.join("Makefile.target")).expect("Could not find Makefile.defines"); + let mut sdk_name: Option = None; + for line in BufReader::new(makefile).lines().flatten() { + if let Some(value) = line.split(":=").nth(1).map(str::trim) { + if line.contains("SDK_NAME") && sdk_name.is_none() { sdk_name = Some(value.to_string().replace('\"', "")); } } - - if api_level.is_some() && sdk_name.is_some() { - // Both keys found, break out of the loop + if sdk_name.is_some() { + // Key found, break out of the loop break; } } + let sdk_name = sdk_name.ok_or(SDKBuildError::MissingSDKName)?; Ok((api_level, sdk_name)) } @@ -198,7 +193,10 @@ fn retrieve_target_file_infos( .map_err(|_| SDKBuildError::MissingTargetId)? .to_string(), ); - } else if target_name.is_none() && line.contains("TARGET_") { + } else if target_name.is_none() + && line.contains("#define TARGET_") + && !line.contains("#define TARGET_ID") + { target_name = Some( line.split_whitespace() .nth(1) @@ -242,7 +240,6 @@ fn clone_sdk(device: &Device) -> PathBuf { Path::new("https://github.com/LedgerHQ/ledger-secure-sdk"), "API_LEVEL_22", ), - Device::Unknown => panic!("Unknown device"), }; let out_dir = env::var("OUT_DIR").unwrap(); @@ -344,20 +341,25 @@ impl SDKBuilder { pub fn device(&mut self) -> Result<(), SDKBuildError> { // determine device - self.device = env::var_os("CARGO_CFG_TARGET_OS") + self.device = match env::var_os("CARGO_CFG_TARGET_OS") .unwrap() .to_str() .unwrap() - .into(); + { + "nanos" => Device::NanoS, + "nanosplus" => Device::NanoSPlus, + "nanox" => Device::NanoX, + "stax" => Device::Stax, + "flex" => Device::Flex, + _ => { + return Err(SDKBuildError::UnknownDevice); + } + }; - if self.device == Device::Unknown { - return Err(SDKBuildError::UnknownDevice); - } else { - // export TARGET into env for 'infos.rs' - println!("cargo:rustc-env=TARGET={}", self.device); - println!("cargo:warning=Device is {:?}", self.device); - Ok(()) - } + // export TARGET into env for 'infos.rs' + println!("cargo:rustc-env=TARGET={}", self.device); + println!("cargo:warning=Device is {:?}", self.device); + Ok(()) } pub fn bolos_sdk(&mut self) -> Result<(), SDKBuildError> { @@ -367,7 +369,7 @@ impl SDKBuilder { Ok(path) => PathBuf::from(path), }; - let sdk_info = retrieve_sdk_info(&self.device, &self.bolos_sdk)?; + let sdk_info = retrieve_csdk_info(&self.device, &self.bolos_sdk)?; match sdk_info.api_level { Some(api_level) => { @@ -428,7 +430,6 @@ impl SDKBuilder { Device::NanoSPlus => out_path.join("glyphs_nanosplus"), Device::NanoX => out_path.join("glyphs_nanox"), Device::NanoS => panic!("Nano S does not support glyphs"), - Device::Unknown => panic!("Unknown device"), }; if !dest_path.exists() { fs::create_dir_all(&dest_path).ok(); @@ -522,7 +523,6 @@ impl SDKBuilder { Device::NanoSPlus => finalize_nanosplus_configuration(&mut command, &self.bolos_sdk), Device::Stax => finalize_stax_configuration(&mut command, &self.bolos_sdk), Device::Flex => finalize_flex_configuration(&mut command, &self.bolos_sdk), - Device::Unknown => panic!("Unknown device"), }; // Add the defines found in the Makefile.conf.cx to our build command. @@ -593,7 +593,6 @@ impl SDKBuilder { Device::NanoSPlus => ("nanos2", "sdk_nanosp.h"), Device::Stax => ("stax", "sdk_stax.h"), Device::Flex => ("flex", "sdk_flex.h"), - Device::Unknown => panic!("Unknown device"), }; bindings = bindings.clang_arg(format!("-I{bsdk}/target/{include_path}/include/")); bindings = bindings.header(header); From 28ef844dc0e883b91863860d844779694f9bf236 Mon Sep 17 00:00:00 2001 From: GroM Date: Mon, 10 Feb 2025 10:31:05 +0100 Subject: [PATCH 07/29] Use single file for glyphs --- ledger_secure_sdk_sys/build.rs | 84 +++++++++++++++++----------------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index 78fadb79..237aa0a0 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -259,7 +259,7 @@ fn clone_sdk(device: &Device) -> PathBuf { #[derive(Debug)] enum SDKBuildError { - UnknownDevice, + UnsupportedDevice, InvalidAPILevel, MissingSDKName, TargetFileNotFound, @@ -303,6 +303,7 @@ struct SDKBuilder { api_level: u32, gcc_toolchain: PathBuf, device: Device, + glyphs_folders: Vec, cxdefines: Vec, } @@ -313,6 +314,7 @@ impl SDKBuilder { api_level: 0, gcc_toolchain: PathBuf::new(), device: Device::NanoS, + glyphs_folders: Vec::new(), cxdefines: Vec::new(), } } @@ -352,7 +354,7 @@ impl SDKBuilder { "stax" => Device::Stax, "flex" => Device::Flex, _ => { - return Err(SDKBuildError::UnknownDevice); + return Err(SDKBuildError::UnsupportedDevice); } }; @@ -370,7 +372,6 @@ impl SDKBuilder { }; let sdk_info = retrieve_csdk_info(&self.device, &self.bolos_sdk)?; - match sdk_info.api_level { Some(api_level) => { self.api_level = api_level; @@ -384,6 +385,31 @@ impl SDKBuilder { } } } + + // set glyphs folders + match self.device { + Device::Flex => { + self.glyphs_folders + .push(self.bolos_sdk.join("lib_nbgl/glyphs/wallet")); + self.glyphs_folders + .push(self.bolos_sdk.join("lib_nbgl/glyphs/64px")); + self.glyphs_folders + .push(self.bolos_sdk.join("lib_nbgl/glyphs/40px")); + } + Device::Stax => { + self.glyphs_folders + .push(self.bolos_sdk.join("lib_nbgl/glyphs/wallet")); + self.glyphs_folders + .push(self.bolos_sdk.join("lib_nbgl/glyphs/64px")); + self.glyphs_folders + .push(self.bolos_sdk.join("lib_nbgl/glyphs/32px")); + } + _ => { + self.glyphs_folders + .push(self.bolos_sdk.join("lib_nbgl/glyphs/nano")); + } + } + // Export other SDK infos into env for 'infos.rs' println!("cargo:rustc-env=TARGET_ID={}", sdk_info.target_id); println!("cargo:warning=TARGET_ID is {}", sdk_info.target_id); @@ -398,7 +424,7 @@ impl SDKBuilder { Ok(()) } - fn cxdefines(&mut self) { + fn cxdefines(&mut self) -> Result<(), SDKBuildError> { let mut makefile = File::open(self.bolos_sdk.join("Makefile.conf.cx")) .expect("Could not find Makefile.conf.cx"); let mut content = String::new(); @@ -414,51 +440,29 @@ impl SDKBuilder { cxdefines.push("NATIVE_LITTLE_ENDIAN".to_string()); self.cxdefines = cxdefines; + Ok(()) } - pub fn generate_glyphs(&self) { + pub fn generate_glyphs(&self) -> Result<(), SDKBuildError> { if self.device == Device::NanoS { - return; + return Err(SDKBuildError::UnsupportedDevice); } let icon2glyph = self.bolos_sdk.join("lib_nbgl/tools/icon2glyph.py"); let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); - let dest_path = match self.device { - Device::Flex => out_path.join("glyphs_flex"), - Device::Stax => out_path.join("glyphs_stax"), - Device::NanoSPlus => out_path.join("glyphs_nanosplus"), - Device::NanoX => out_path.join("glyphs_nanox"), - Device::NanoS => panic!("Nano S does not support glyphs"), - }; + let dest_path = out_path.join("glyphs"); if !dest_path.exists() { fs::create_dir_all(&dest_path).ok(); } - let mut glyph_folders: Vec = Vec::new(); - match self.device { - Device::Flex => { - glyph_folders.push(self.bolos_sdk.join("lib_nbgl/glyphs/wallet")); - glyph_folders.push(self.bolos_sdk.join("lib_nbgl/glyphs/64px")); - glyph_folders.push(self.bolos_sdk.join("lib_nbgl/glyphs/40px")); - } - Device::Stax => { - glyph_folders.push(self.bolos_sdk.join("lib_nbgl/glyphs/wallet")); - glyph_folders.push(self.bolos_sdk.join("lib_nbgl/glyphs/64px")); - glyph_folders.push(self.bolos_sdk.join("lib_nbgl/glyphs/32px")); - } - _ => { - glyph_folders.push(self.bolos_sdk.join("lib_nbgl/glyphs/nano")); - } - } - let mut cmd = Command::new(icon2glyph.as_os_str()); cmd.arg("--glyphcheader") .arg(dest_path.join("glyphs.h").as_os_str()) .arg("--glyphcfile") .arg(dest_path.join("glyphs.c").as_os_str()); - for folder in glyph_folders.iter() { + for folder in self.glyphs_folders.iter() { for file in std::fs::read_dir(folder).unwrap() { let path = file.unwrap().path(); let path_str = path.to_str().unwrap().to_string(); @@ -467,6 +471,7 @@ impl SDKBuilder { } let _ = cmd.output(); + Ok(()) } pub fn build_c_sdk(&self) { @@ -617,11 +622,7 @@ impl SDKBuilder { Device::Stax | Device::Flex => { let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); let mut include_path = "-I".to_string(); - let glyphs = match self.device { - Device::Stax => out_path.join("glyphs_stax"), - Device::Flex => out_path.join("glyphs_flex"), - _ => panic!("Invalid device"), - }; + let glyphs = out_path.join("glyphs"); include_path += glyphs.to_str().unwrap(); bindings = bindings.clang_args([include_path.as_str()]); @@ -695,9 +696,8 @@ fn main() { sdk_builder.gcc_toolchain().unwrap(); sdk_builder.device().unwrap(); sdk_builder.bolos_sdk().unwrap(); - sdk_builder.cxdefines(); - sdk_builder.generate_glyphs(); - + sdk_builder.cxdefines().unwrap(); + sdk_builder.generate_glyphs().unwrap(); sdk_builder.build_c_sdk(); sdk_builder.generate_bindings(); sdk_builder.generate_heap_size(); @@ -768,7 +768,9 @@ fn finalize_nanosplus_configuration(command: &mut cc::Build, bolos_sdk: &Path) { } fn configure_lib_bagl(command: &mut cc::Build, bolos_sdk: &Path) { + println!("cargo:warning=TEST if LIB_BAGL is built"); if env::var_os("CARGO_FEATURE_LIB_BAGL").is_some() { + println!("cargo:warning=LIB_BAGL is built"); command .define("HAVE_BAGL", None) // Just include all the fonts for now; we can shrink the X and S+ images later. @@ -801,7 +803,7 @@ fn finalize_stax_configuration(command: &mut cc::Build, bolos_sdk: &Path) { command.define(define.as_str(), value.as_deref()); } - let glyphs_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("glyphs_stax"); + let glyphs_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("glyphs"); command .target("thumbv8m.main-none-eabi") .file(bolos_sdk.join("src/ledger_protocol.c")) @@ -831,7 +833,7 @@ fn finalize_flex_configuration(command: &mut cc::Build, bolos_sdk: &Path) { command.define(define.as_str(), value.as_deref()); } - let glyphs_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("glyphs_flex"); + let glyphs_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("glyphs"); command .target("thumbv8m.main-none-eabi") .file(bolos_sdk.join("src/ledger_protocol.c")) From 4386359ebfd904e7f5746d15a755240b04c78184 Mon Sep 17 00:00:00 2001 From: GroM Date: Mon, 10 Feb 2025 17:26:29 +0100 Subject: [PATCH 08/29] Enable NBGL for Nano S+ and Nano X --- ledger_secure_sdk_sys/Cargo.toml | 1 + ledger_secure_sdk_sys/build.rs | 151 ++++++++++++++--------------- ledger_secure_sdk_sys/sdk_flex.h | 43 ++++++-- ledger_secure_sdk_sys/sdk_nanosp.h | 43 +++++--- ledger_secure_sdk_sys/sdk_nanox.h | 46 +++++++-- ledger_secure_sdk_sys/sdk_stax.h | 44 +++++++-- 6 files changed, 209 insertions(+), 119 deletions(-) diff --git a/ledger_secure_sdk_sys/Cargo.toml b/ledger_secure_sdk_sys/Cargo.toml index b4f5c604..ba09348c 100644 --- a/ledger_secure_sdk_sys/Cargo.toml +++ b/ledger_secure_sdk_sys/Cargo.toml @@ -19,6 +19,7 @@ critical-section = { version = "1.1.2", optional = true } [features] heap = ["dep:embedded-alloc", "dep:critical-section"] ccid = [] +nbgl = [] [lints.rust.unexpected_cfgs] level = "warn" diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index 237aa0a0..b13a86b6 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -504,13 +504,20 @@ impl SDKBuilder { .debug(true) .flag("-Oz") .flag("-fomit-frame-pointer") + .flag("-momit-leaf-frame-pointer") .flag("-fno-common") + .flag("-mlittle-endian") + .flag("-std=gnu99") .flag("-fdata-sections") .flag("-ffunction-sections") - .flag("-mthumb") - .flag("-fno-jump-tables") + .flag("-funsigned-char") .flag("-fshort-enums") .flag("-mno-unaligned-access") + .flag("-fropi") + .flag("-mthumb") + .flag("-fno-jump-tables") + .flag("-nostdlib") + .flag("-nodefaultlibs") .flag("-Wno-unused-command-line-argument") .clone(); @@ -607,11 +614,47 @@ impl SDKBuilder { bindings = bindings.header(header); } + // BAGL or NBGL bindings match self.device { Device::NanoS => { bindings = bindings.header(self.bolos_sdk.join("include/bagl.h").to_str().unwrap()) } - Device::NanoX => { + Device::NanoSPlus | Device::NanoX | Device::Stax | Device::Flex => { + if ((self.device == Device::NanoX || self.device == Device::NanoSPlus) + && env::var_os("CARGO_FEATURE_NBGL").is_some()) + || self.device == Device::Stax + || self.device == Device::Flex + { + let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); + let mut include_path = "-I".to_string(); + let glyphs = out_path.join("glyphs"); + include_path += glyphs.to_str().unwrap(); + bindings = bindings.clang_args([include_path.as_str()]); + + bindings = bindings.clang_args([ + format!("-I{bsdk}/lib_nbgl/include/").as_str(), + format!("-I{bsdk}/lib_ux_nbgl/").as_str(), + ]); + bindings = bindings + .header( + self.bolos_sdk + .join("lib_nbgl/include/nbgl_use_case.h") + .to_str() + .unwrap(), + ) + .header( + self.bolos_sdk + .join("lib_ux_nbgl/ux_nbgl.h") + .to_str() + .unwrap(), + ); + } + } + } + + // BLE bindings + match self.device { + Device::NanoX | Device::Flex | Device::Stax => { bindings = bindings.header( self.bolos_sdk .join("lib_blewbxx_impl/include/ledger_ble.h") @@ -619,37 +662,6 @@ impl SDKBuilder { .unwrap(), ) } - Device::Stax | Device::Flex => { - let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); - let mut include_path = "-I".to_string(); - let glyphs = out_path.join("glyphs"); - include_path += glyphs.to_str().unwrap(); - bindings = bindings.clang_args([include_path.as_str()]); - - bindings = bindings.clang_args([ - format!("-I{bsdk}/lib_nbgl/include/").as_str(), - format!("-I{bsdk}/lib_ux_nbgl/").as_str(), - ]); - bindings = bindings - .header( - self.bolos_sdk - .join("lib_nbgl/include/nbgl_use_case.h") - .to_str() - .unwrap(), - ) - .header( - self.bolos_sdk - .join("lib_ux_nbgl/ux_nbgl.h") - .to_str() - .unwrap(), - ) - .header( - self.bolos_sdk - .join("lib_blewbxx_impl/include/ledger_ble.h") - .to_str() - .unwrap(), - ) - } _ => (), } @@ -712,8 +724,6 @@ fn finalize_nanos_configuration(command: &mut cc::Build, bolos_sdk: &Path) { command .target("thumbv6m-none-eabi") .define("ST31", None) - .define("BAGL_HEIGHT", Some("32")) - .define("BAGL_WIDTH", Some("128")) .include(bolos_sdk.join("target/nanos/include")) .flag("-fropi"); } @@ -727,8 +737,6 @@ fn finalize_nanox_configuration(command: &mut cc::Build, bolos_sdk: &Path) { command .target("thumbv6m-none-eabi") .define("ST33", None) - .define("BAGL_HEIGHT", Some("64")) - .define("BAGL_WIDTH", Some("128")) .file(bolos_sdk.join("src/ledger_protocol.c")) .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_gap_aci.c")) .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_gatt_aci.c")) @@ -747,7 +755,17 @@ fn finalize_nanox_configuration(command: &mut cc::Build, bolos_sdk: &Path) { .flag("-ffixed-r9") .flag("-fropi") .flag("-frwpi"); - configure_lib_bagl(command, bolos_sdk); + + if env::var_os("CARGO_FEATURE_NBGL").is_some() { + println!("cargo:warning=NBGL is built"); + command.define("HAVE_NBGL", None); + command.define("NBGL_STEP", None); + command.define("NBGL_USE_CASE", None); + configure_lib_nbgl(command, bolos_sdk); + } else { + println!("cargo:warning=BAGL is built"); + command.define("HAVE_BAGL", None); + } } fn finalize_nanosplus_configuration(command: &mut cc::Build, bolos_sdk: &Path) { @@ -759,41 +777,19 @@ fn finalize_nanosplus_configuration(command: &mut cc::Build, bolos_sdk: &Path) { command .target("thumbv8m.main-none-eabi") .define("ST33K1M5", None) - .define("BAGL_HEIGHT", Some("64")) - .define("BAGL_WIDTH", Some("128")) .include(bolos_sdk.join("target/nanos2/include")) .flag("-fropi") .flag("-frwpi"); - configure_lib_bagl(command, bolos_sdk); -} -fn configure_lib_bagl(command: &mut cc::Build, bolos_sdk: &Path) { - println!("cargo:warning=TEST if LIB_BAGL is built"); - if env::var_os("CARGO_FEATURE_LIB_BAGL").is_some() { - println!("cargo:warning=LIB_BAGL is built"); - command - .define("HAVE_BAGL", None) - // Just include all the fonts for now; we can shrink the X and S+ images later. - .define("HAVE_BAGL_FONT_LUCIDA_CONSOLE_8PX", None) - .define("HAVE_BAGL_FONT_OPEN_SANS_LIGHT_16_22PX", None) - .define("HAVE_BAGL_FONT_OPEN_SANS_REGULAR_8_11PX", None) - .define("HAVE_BAGL_FONT_OPEN_SANS_REGULAR_10_13PX", None) - .define("HAVE_BAGL_FONT_OPEN_SANS_REGULAR_11_14PX", None) - .define("HAVE_BAGL_FONT_OPEN_SANS_REGULAR_13_18PX", None) - .define("HAVE_BAGL_FONT_OPEN_SANS_REGULAR_22_30PX", None) - .define("HAVE_BAGL_FONT_OPEN_SANS_SEMIBOLD_8_11PX", None) - .define("HAVE_BAGL_FONT_OPEN_SANS_EXTRABOLD_11PX", None) - .define("HAVE_BAGL_FONT_OPEN_SANS_LIGHT_16PX", None) - .define("HAVE_BAGL_FONT_OPEN_SANS_REGULAR_11PX", None) - .define("HAVE_BAGL_FONT_OPEN_SANS_SEMIBOLD_10_13PX", None) - .define("HAVE_BAGL_FONT_OPEN_SANS_SEMIBOLD_11_16PX", None) - .define("HAVE_BAGL_FONT_OPEN_SANS_SEMIBOLD_13_18PX", None) - .define("HAVE_BAGL_FONT_SYMBOLS_0", None) - .define("HAVE_BAGL_FONT_SYMBOLS_1", None) - .include(bolos_sdk.join("lib_bagl/src/")) - .file(bolos_sdk.join("lib_bagl/src/bagl.c")) - .file(bolos_sdk.join("lib_bagl/src/bagl_fonts.c")) - .file(bolos_sdk.join("lib_bagl/src/bagl_glyphs.c")); + if env::var_os("CARGO_FEATURE_NBGL").is_some() { + println!("cargo:warning=NBGL is built"); + command.define("HAVE_NBGL", None); + command.define("NBGL_STEP", None); + command.define("NBGL_USE_CASE", None); + configure_lib_nbgl(command, bolos_sdk); + } else { + println!("cargo:warning=BAGL is built"); + command.define("HAVE_BAGL", None); } } @@ -803,7 +799,6 @@ fn finalize_stax_configuration(command: &mut cc::Build, bolos_sdk: &Path) { command.define(define.as_str(), value.as_deref()); } - let glyphs_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("glyphs"); command .target("thumbv8m.main-none-eabi") .file(bolos_sdk.join("src/ledger_protocol.c")) @@ -821,9 +816,7 @@ fn finalize_stax_configuration(command: &mut cc::Build, bolos_sdk: &Path) { .include(bolos_sdk.join("lib_blewbxx_impl/include")) .include(bolos_sdk.join("target/stax/include/")) .flag("-fropi") - .flag("-frwpi") - .include(&glyphs_path) - .file(glyphs_path.join("glyphs.c")); + .flag("-frwpi"); configure_lib_nbgl(command, bolos_sdk); } @@ -833,7 +826,6 @@ fn finalize_flex_configuration(command: &mut cc::Build, bolos_sdk: &Path) { command.define(define.as_str(), value.as_deref()); } - let glyphs_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("glyphs"); command .target("thumbv8m.main-none-eabi") .file(bolos_sdk.join("src/ledger_protocol.c")) @@ -851,13 +843,12 @@ fn finalize_flex_configuration(command: &mut cc::Build, bolos_sdk: &Path) { .include(bolos_sdk.join("lib_blewbxx_impl/include")) .include(bolos_sdk.join("target/flex/include/")) .flag("-fropi") - .flag("-frwpi") - .include(&glyphs_path) - .file(glyphs_path.join("glyphs.c")); + .flag("-frwpi"); configure_lib_nbgl(command, bolos_sdk); } fn configure_lib_nbgl(command: &mut cc::Build, bolos_sdk: &Path) { + let glyphs_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("glyphs"); command .flag("-Wno-microsoft-anon-tag") .flag("-fms-extensions") @@ -875,5 +866,7 @@ fn configure_lib_nbgl(command: &mut cc::Build, bolos_sdk: &Path) { .unwrap() .map(|x| x.unwrap()) .collect::>(), - ); + ) + .include(&glyphs_path) + .file(glyphs_path.join("glyphs.c")); } diff --git a/ledger_secure_sdk_sys/sdk_flex.h b/ledger_secure_sdk_sys/sdk_flex.h index b3350ab9..7b4d1556 100644 --- a/ledger_secure_sdk_sys/sdk_flex.h +++ b/ledger_secure_sdk_sys/sdk_flex.h @@ -1,19 +1,19 @@ -#define HAVE_SPRINTF -#define HAVE_LOCAL_APDU_BUFFER +// Standard Defines #define IO_HID_EP_LENGTH 64 -#define USB_SEGMENT_SIZE 64 -#define OS_IO_SEPROXYHAL +#define HAVE_SPRINTF +#define HAVE_SNPRINTF_FORMAT_U #define HAVE_IO_USB #define HAVE_L4_USBLIB +#define IO_USB_MAX_ENDPOINTS 4 #define HAVE_USB_APDU -#define __IO volatile -#define IO_USB_MAX_ENDPOINTS 6 +#define USB_SEGMENT_SIZE 64 +#define OS_IO_SEPROXYHAL +#define HAVE_LOCAL_APDU_BUFFER #define IO_SEPROXYHAL_BUFFER_SIZE_B 300 +#define __IO volatile #define main _start -#define NBGL_QRCODE - -// from Makefile.defines +// NBGL #define HAVE_BAGL_FONT_INTER_REGULAR_28PX #define HAVE_BAGL_FONT_INTER_SEMIBOLD_28PX #define HAVE_BAGL_FONT_INTER_MEDIUM_36PX @@ -27,7 +27,30 @@ #define SCREEN_SIZE_WALLET #define HAVE_FAST_HOLD_TO_APPROVE +// WEB USB +//#define HAVE_WEBUSB +//#define WEBUSB_URL_SIZE_B +//#define WEBUSB_URL + +// BLE SUPPORT #define HAVE_BLE #define HAVE_BLE_APDU #define BLE_COMMAND_TIMEOUT_MS 2000 -#define BLE_SEGMENT_SIZE 32 \ No newline at end of file +#define BLE_SEGMENT_SIZE 32 +#define HAVE_INAPP_BLE_PAIRING + +// NFC SUPPORT +//#define HAVE_NFC +//#define HAVE_NFC_READER + +// APP STORAGE +//#define HAVE_APP_STORAGE + +// NBGL QRCODE +#define NBGL_QRCODE + +// NBGL KEYBOARD +//#define NBGL_KEYBOARD + +// NBGL KEYPAD +//#define NBGL_KEYPAD diff --git a/ledger_secure_sdk_sys/sdk_nanosp.h b/ledger_secure_sdk_sys/sdk_nanosp.h index ce099221..29792604 100644 --- a/ledger_secure_sdk_sys/sdk_nanosp.h +++ b/ledger_secure_sdk_sys/sdk_nanosp.h @@ -1,19 +1,40 @@ -#define HAVE_LOCAL_APDU_BUFFER +// Standard Defines #define IO_HID_EP_LENGTH 64 -#define USB_SEGMENT_SIZE 64 -#define OS_IO_SEPROXYHAL +#define HAVE_SPRINTF +#define HAVE_SNPRINTF_FORMAT_U #define HAVE_IO_USB #define HAVE_L4_USBLIB +#define IO_USB_MAX_ENDPOINTS 4 #define HAVE_USB_APDU +#define USB_SEGMENT_SIZE 64 +#define OS_IO_SEPROXYHAL +#define HAVE_LOCAL_APDU_BUFFER +#define IO_SEPROXYHAL_BUFFER_SIZE_B 300 #define __IO volatile -#define IO_USB_MAX_ENDPOINTS 6 -#define IO_SEPROXYHAL_BUFFER_SIZE_B 128 #define main _start -#define HAVE_SEPROXYHAL_MCU -#define HAVE_MCU_PROTECT -#define HAVE_MCU_SEPROXYHAL -#define HAVE_MCU_SERIAL_STORAGE #define HAVE_SE_BUTTON -#define HAVE_BAGL -#define HAVE_SE_SCREEN \ No newline at end of file +#define HAVE_SE_SCREEN +#define HAVE_FONTS + +#define BAGL_HEIGHT 64 +#define BAGL_WIDTH 128 +#define HAVE_BAGL_ELLIPSIS +#define HAVE_BAGL_FONT_OPEN_SANS_REGULAR_11PX +#define HAVE_BAGL_FONT_OPEN_SANS_EXTRABOLD_11PX +#define HAVE_BAGL_FONT_OPEN_SANS_LIGHT_16PX +#define SCREEN_SIZE_NANO + +// WEB USB +//#define HAVE_WEBUSB +//#define WEBUSB_URL_SIZE_B +//#define WEBUSB_URL + +// APP STORAGE +//#define HAVE_APP_STORAGE + +// NBGL KEYBOARD +//#define NBGL_KEYBOARD + +// NBGL KEYPAD +//#define NBGL_KEYPAD \ No newline at end of file diff --git a/ledger_secure_sdk_sys/sdk_nanox.h b/ledger_secure_sdk_sys/sdk_nanox.h index aa4c956a..7c04b35e 100644 --- a/ledger_secure_sdk_sys/sdk_nanox.h +++ b/ledger_secure_sdk_sys/sdk_nanox.h @@ -1,22 +1,50 @@ -#define HAVE_LOCAL_APDU_BUFFER +// Standard Defines #define IO_HID_EP_LENGTH 64 -#define USB_SEGMENT_SIZE 64 -#define OS_IO_SEPROXYHAL +#define HAVE_SPRINTF +#define HAVE_SNPRINTF_FORMAT_U #define HAVE_IO_USB #define HAVE_L4_USBLIB +#define IO_USB_MAX_ENDPOINTS 4 #define HAVE_USB_APDU +#define USB_SEGMENT_SIZE 64 +#define OS_IO_SEPROXYHAL +#define HAVE_LOCAL_APDU_BUFFER +#define IO_SEPROXYHAL_BUFFER_SIZE_B 300 #define __IO volatile -#define IO_USB_MAX_ENDPOINTS 6 -#define IO_SEPROXYHAL_BUFFER_SIZE_B 128 #define main _start #define HAVE_SEPROXYHAL_MCU #define HAVE_MCU_PROTECT -#define HAVE_MCU_SEPROXYHAL -#define HAVE_MCU_SERIAL_STORAGE + #define HAVE_SE_BUTTON -#define HAVE_BAGL #define HAVE_SE_SCREEN +#define HAVE_FONTS + +#define BAGL_HEIGHT 64 +#define BAGL_WIDTH 128 +#define HAVE_BAGL_ELLIPSIS +#define HAVE_BAGL_FONT_OPEN_SANS_REGULAR_11PX +#define HAVE_BAGL_FONT_OPEN_SANS_EXTRABOLD_11PX +#define HAVE_BAGL_FONT_OPEN_SANS_LIGHT_16PX +#define SCREEN_SIZE_NANO + +// WEB USB +//#define HAVE_WEBUSB +//#define WEBUSB_URL_SIZE_B +//#define WEBUSB_URL +// BLE SUPPORT #define HAVE_BLE -#define HAVE_BLE_APDU \ No newline at end of file +#define HAVE_BLE_APDU +#define BLE_COMMAND_TIMEOUT_MS 2000 +#define BLE_SEGMENT_SIZE 32 +#define HAVE_INAPP_BLE_PAIRING + +// APP STORAGE +//#define HAVE_APP_STORAGE + +// NBGL KEYBOARD +//#define NBGL_KEYBOARD + +// NBGL KEYPAD +//#define NBGL_KEYPAD \ No newline at end of file diff --git a/ledger_secure_sdk_sys/sdk_stax.h b/ledger_secure_sdk_sys/sdk_stax.h index ace4a4b5..40cb016b 100644 --- a/ledger_secure_sdk_sys/sdk_stax.h +++ b/ledger_secure_sdk_sys/sdk_stax.h @@ -1,19 +1,19 @@ -#define HAVE_SPRINTF -#define HAVE_LOCAL_APDU_BUFFER +// Standard Defines #define IO_HID_EP_LENGTH 64 -#define USB_SEGMENT_SIZE 64 -#define OS_IO_SEPROXYHAL +#define HAVE_SPRINTF +#define HAVE_SNPRINTF_FORMAT_U #define HAVE_IO_USB #define HAVE_L4_USBLIB +#define IO_USB_MAX_ENDPOINTS 4 #define HAVE_USB_APDU -#define __IO volatile -#define IO_USB_MAX_ENDPOINTS 6 +#define USB_SEGMENT_SIZE 64 +#define OS_IO_SEPROXYHAL +#define HAVE_LOCAL_APDU_BUFFER #define IO_SEPROXYHAL_BUFFER_SIZE_B 300 +#define __IO volatile #define main _start -#define NBGL_QRCODE - -// from Makefile.defines +// NBGL #define HAVE_BAGL_FONT_INTER_REGULAR_24PX #define HAVE_BAGL_FONT_INTER_SEMIBOLD_24PX #define HAVE_BAGL_FONT_INTER_MEDIUM_32PX @@ -26,7 +26,31 @@ #define NBGL_USE_CASE #define SCREEN_SIZE_WALLET +// WEB USB +//#define HAVE_WEBUSB +//#define WEBUSB_URL_SIZE_B +//#define WEBUSB_URL + +// BLE SUPPORT #define HAVE_BLE #define HAVE_BLE_APDU #define BLE_COMMAND_TIMEOUT_MS 2000 -#define BLE_SEGMENT_SIZE 32 \ No newline at end of file +#define BLE_SEGMENT_SIZE 32 +#define HAVE_INAPP_BLE_PAIRING + +// NFC SUPPORT +//#define HAVE_NFC +//#define HAVE_NFC_READER + +// APP STORAGE +//#define HAVE_APP_STORAGE + +// NBGL QRCODE +#define NBGL_QRCODE + +// NBGL KEYBOARD +//#define NBGL_KEYBOARD + +// NBGL KEYPAD +//#define NBGL_KEYPAD + From 4524cbb24994369fea4a20772693e9febe26f04a Mon Sep 17 00:00:00 2001 From: GroM Date: Tue, 11 Feb 2025 11:59:37 +0100 Subject: [PATCH 09/29] Cleanup header files --- ledger_secure_sdk_sys/build.rs | 3 --- ledger_secure_sdk_sys/sdk_flex.h | 22 +++++++++++----------- ledger_secure_sdk_sys/sdk_nanosp.h | 8 ++++---- ledger_secure_sdk_sys/sdk_nanox.h | 20 ++++++++++---------- ledger_secure_sdk_sys/sdk_stax.h | 23 +++++++++++------------ 5 files changed, 36 insertions(+), 40 deletions(-) diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index b13a86b6..dc1e6e04 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -574,7 +574,6 @@ impl SDKBuilder { format!("-I{bsdk}/lib_stusb/STM32_USB_Device_Library/Core/Inc/"), format!("-I{bsdk}/lib_stusb/"), ]; - let headers = str2path( &self.bolos_sdk, &[ @@ -736,7 +735,6 @@ fn finalize_nanox_configuration(command: &mut cc::Build, bolos_sdk: &Path) { command .target("thumbv6m-none-eabi") - .define("ST33", None) .file(bolos_sdk.join("src/ledger_protocol.c")) .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_gap_aci.c")) .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_gatt_aci.c")) @@ -776,7 +774,6 @@ fn finalize_nanosplus_configuration(command: &mut cc::Build, bolos_sdk: &Path) { command .target("thumbv8m.main-none-eabi") - .define("ST33K1M5", None) .include(bolos_sdk.join("target/nanos2/include")) .flag("-fropi") .flag("-frwpi"); diff --git a/ledger_secure_sdk_sys/sdk_flex.h b/ledger_secure_sdk_sys/sdk_flex.h index 7b4d1556..5ab7def1 100644 --- a/ledger_secure_sdk_sys/sdk_flex.h +++ b/ledger_secure_sdk_sys/sdk_flex.h @@ -27,11 +27,6 @@ #define SCREEN_SIZE_WALLET #define HAVE_FAST_HOLD_TO_APPROVE -// WEB USB -//#define HAVE_WEBUSB -//#define WEBUSB_URL_SIZE_B -//#define WEBUSB_URL - // BLE SUPPORT #define HAVE_BLE #define HAVE_BLE_APDU @@ -39,18 +34,23 @@ #define BLE_SEGMENT_SIZE 32 #define HAVE_INAPP_BLE_PAIRING -// NFC SUPPORT +// WEB USB (not supported in Rust SDK) +//#define HAVE_WEBUSB +//#define WEBUSB_URL_SIZE_B +//#define WEBUSB_URL + +// NFC SUPPORT (feature dependent) //#define HAVE_NFC //#define HAVE_NFC_READER -// APP STORAGE +// APP STORAGE (feature dependent) //#define HAVE_APP_STORAGE -// NBGL QRCODE -#define NBGL_QRCODE +// NBGL QRCODE (feature dependent) +#define NBGL_QRCODE -// NBGL KEYBOARD +// NBGL KEYBOARD (feature dependent) //#define NBGL_KEYBOARD -// NBGL KEYPAD +// NBGL KEYPAD (feature dependent) //#define NBGL_KEYPAD diff --git a/ledger_secure_sdk_sys/sdk_nanosp.h b/ledger_secure_sdk_sys/sdk_nanosp.h index 29792604..9fa00a00 100644 --- a/ledger_secure_sdk_sys/sdk_nanosp.h +++ b/ledger_secure_sdk_sys/sdk_nanosp.h @@ -25,16 +25,16 @@ #define HAVE_BAGL_FONT_OPEN_SANS_LIGHT_16PX #define SCREEN_SIZE_NANO -// WEB USB +// WEB USB (not supported in Rust SDK) //#define HAVE_WEBUSB //#define WEBUSB_URL_SIZE_B //#define WEBUSB_URL -// APP STORAGE +// APP STORAGE (feature dependent) //#define HAVE_APP_STORAGE -// NBGL KEYBOARD +// NBGL KEYBOARD (feature dependent) //#define NBGL_KEYBOARD -// NBGL KEYPAD +// NBGL KEYPAD (feature dependent) //#define NBGL_KEYPAD \ No newline at end of file diff --git a/ledger_secure_sdk_sys/sdk_nanox.h b/ledger_secure_sdk_sys/sdk_nanox.h index 7c04b35e..48cea500 100644 --- a/ledger_secure_sdk_sys/sdk_nanox.h +++ b/ledger_secure_sdk_sys/sdk_nanox.h @@ -13,9 +13,6 @@ #define __IO volatile #define main _start -#define HAVE_SEPROXYHAL_MCU -#define HAVE_MCU_PROTECT - #define HAVE_SE_BUTTON #define HAVE_SE_SCREEN #define HAVE_FONTS @@ -28,10 +25,8 @@ #define HAVE_BAGL_FONT_OPEN_SANS_LIGHT_16PX #define SCREEN_SIZE_NANO -// WEB USB -//#define HAVE_WEBUSB -//#define WEBUSB_URL_SIZE_B -//#define WEBUSB_URL +#define HAVE_SEPROXYHAL_MCU +#define HAVE_MCU_PROTECT // BLE SUPPORT #define HAVE_BLE @@ -40,11 +35,16 @@ #define BLE_SEGMENT_SIZE 32 #define HAVE_INAPP_BLE_PAIRING -// APP STORAGE +// WEB USB (not supported in Rust SDK) +//#define HAVE_WEBUSB +//#define WEBUSB_URL_SIZE_B +//#define WEBUSB_URL + +// APP STORAGE (feature dependent) //#define HAVE_APP_STORAGE -// NBGL KEYBOARD +// NBGL KEYBOARD (feature dependent) //#define NBGL_KEYBOARD -// NBGL KEYPAD +// NBGL KEYPAD (feature dependent) //#define NBGL_KEYPAD \ No newline at end of file diff --git a/ledger_secure_sdk_sys/sdk_stax.h b/ledger_secure_sdk_sys/sdk_stax.h index 40cb016b..7b4277b1 100644 --- a/ledger_secure_sdk_sys/sdk_stax.h +++ b/ledger_secure_sdk_sys/sdk_stax.h @@ -26,31 +26,30 @@ #define NBGL_USE_CASE #define SCREEN_SIZE_WALLET -// WEB USB -//#define HAVE_WEBUSB -//#define WEBUSB_URL_SIZE_B -//#define WEBUSB_URL - -// BLE SUPPORT +// BLE SUPPORT #define HAVE_BLE #define HAVE_BLE_APDU #define BLE_COMMAND_TIMEOUT_MS 2000 #define BLE_SEGMENT_SIZE 32 #define HAVE_INAPP_BLE_PAIRING -// NFC SUPPORT +// WEB USB (not supported in Rust SDK) +//#define HAVE_WEBUSB +//#define WEBUSB_URL_SIZE_B +//#define WEBUSB_URL + +// NFC SUPPORT (feature dependent) //#define HAVE_NFC //#define HAVE_NFC_READER -// APP STORAGE +// APP STORAGE (feature dependent) //#define HAVE_APP_STORAGE -// NBGL QRCODE +// NBGL QRCODE (feature dependent) #define NBGL_QRCODE -// NBGL KEYBOARD +// NBGL KEYBOARD (feature dependent) //#define NBGL_KEYBOARD -// NBGL KEYPAD +// NBGL KEYPAD (feature dependent) //#define NBGL_KEYPAD - From 49105be758055bd2148fd75958ee4f5f62a3fd7b Mon Sep 17 00:00:00 2001 From: GroM Date: Tue, 11 Feb 2025 15:03:10 +0100 Subject: [PATCH 10/29] Update header for each target --- ledger_secure_sdk_sys/build.rs | 1 + ledger_secure_sdk_sys/sdk_flex.h | 68 ++++++++++++++++-------------- ledger_secure_sdk_sys/sdk_nanos.h | 3 +- ledger_secure_sdk_sys/sdk_nanosp.h | 48 ++++++++++++--------- ledger_secure_sdk_sys/sdk_nanox.h | 63 +++++++++++++++------------ ledger_secure_sdk_sys/sdk_stax.h | 67 +++++++++++++++-------------- 6 files changed, 137 insertions(+), 113 deletions(-) diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index dc1e6e04..16f8e202 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -519,6 +519,7 @@ impl SDKBuilder { .flag("-nostdlib") .flag("-nodefaultlibs") .flag("-Wno-unused-command-line-argument") + .define("main", "_start") .clone(); // #[cfg(feature = "ccid")] diff --git a/ledger_secure_sdk_sys/sdk_flex.h b/ledger_secure_sdk_sys/sdk_flex.h index 5ab7def1..7c64a534 100644 --- a/ledger_secure_sdk_sys/sdk_flex.h +++ b/ledger_secure_sdk_sys/sdk_flex.h @@ -1,4 +1,25 @@ -// Standard Defines +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Makefile.standard_app +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// BLUETOOTH +#define HAVE_BLE +#define HAVE_BLE_APDU +#define BLE_COMMAND_TIMEOUT_MS 2000 +#define BLE_SEGMENT_SIZE 32 +// NFC SUPPORT (feature dependent) +//#define HAVE_NFC +//#define HAVE_NFC_READER +// APP STORAGE (feature dependent) +//#define HAVE_APP_STORAGE +// IO SEPROXY BUFFER SIZE +#define IO_SEPROXYHAL_BUFFER_SIZE_B 300 +// NBGL QRCODE (feature dependent) +#define NBGL_QRCODE +// NBGL KEYBOARD (feature dependent) +//#define NBGL_KEYBOARD +// NBGL KEYPAD (feature dependent) +//#define NBGL_KEYPAD +// STANDARD DEFINES #define IO_HID_EP_LENGTH 64 #define HAVE_SPRINTF #define HAVE_SNPRINTF_FORMAT_U @@ -7,13 +28,16 @@ #define IO_USB_MAX_ENDPOINTS 4 #define HAVE_USB_APDU #define USB_SEGMENT_SIZE 64 +//#define HAVE_WEBUSB +//#define WEBUSB_URL_SIZE_B +//#define WEBUSB_URL #define OS_IO_SEPROXYHAL -#define HAVE_LOCAL_APDU_BUFFER -#define IO_SEPROXYHAL_BUFFER_SIZE_B 300 +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Makefile.defines +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#define gcc #define __IO volatile -#define main _start - -// NBGL +// Flex #define HAVE_BAGL_FONT_INTER_REGULAR_28PX #define HAVE_BAGL_FONT_INTER_SEMIBOLD_28PX #define HAVE_BAGL_FONT_INTER_MEDIUM_36PX @@ -22,35 +46,15 @@ #define HAVE_PIEZO_SOUND #define HAVE_SE_TOUCH #define HAVE_SE_EINK_DISPLAY +//#define HAVE_HW_TOUCH_SWIPE #define NBGL_PAGE #define NBGL_USE_CASE #define SCREEN_SIZE_WALLET #define HAVE_FAST_HOLD_TO_APPROVE -// BLE SUPPORT -#define HAVE_BLE -#define HAVE_BLE_APDU -#define BLE_COMMAND_TIMEOUT_MS 2000 -#define BLE_SEGMENT_SIZE 32 -#define HAVE_INAPP_BLE_PAIRING - -// WEB USB (not supported in Rust SDK) -//#define HAVE_WEBUSB -//#define WEBUSB_URL_SIZE_B -//#define WEBUSB_URL - -// NFC SUPPORT (feature dependent) -//#define HAVE_NFC -//#define HAVE_NFC_READER +#define HAVE_LEDGER_PKI -// APP STORAGE (feature dependent) -//#define HAVE_APP_STORAGE - -// NBGL QRCODE (feature dependent) -#define NBGL_QRCODE - -// NBGL KEYBOARD (feature dependent) -//#define NBGL_KEYBOARD - -// NBGL KEYPAD (feature dependent) -//#define NBGL_KEYPAD +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Misc +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#define HAVE_LOCAL_APDU_BUFFER \ No newline at end of file diff --git a/ledger_secure_sdk_sys/sdk_nanos.h b/ledger_secure_sdk_sys/sdk_nanos.h index 7d665ec9..2d5e6937 100644 --- a/ledger_secure_sdk_sys/sdk_nanos.h +++ b/ledger_secure_sdk_sys/sdk_nanos.h @@ -7,5 +7,4 @@ #define HAVE_USB_APDU #define __IO volatile #define IO_USB_MAX_ENDPOINTS 6 -#define IO_SEPROXYHAL_BUFFER_SIZE_B 128 -#define main _start \ No newline at end of file +#define IO_SEPROXYHAL_BUFFER_SIZE_B 128 \ No newline at end of file diff --git a/ledger_secure_sdk_sys/sdk_nanosp.h b/ledger_secure_sdk_sys/sdk_nanosp.h index 9fa00a00..c4c20033 100644 --- a/ledger_secure_sdk_sys/sdk_nanosp.h +++ b/ledger_secure_sdk_sys/sdk_nanosp.h @@ -1,4 +1,15 @@ -// Standard Defines +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Makefile.standard_app +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// APP STORAGE (feature dependent) +//#define HAVE_APP_STORAGE +// IO SEPROXY BUFFER SIZE +#define IO_SEPROXYHAL_BUFFER_SIZE_B 300 +// NBGL KEYBOARD (feature dependent) +//#define NBGL_KEYBOARD +// NBGL KEYPAD (feature dependent) +//#define NBGL_KEYPAD +// STANDARD DEFINES #define IO_HID_EP_LENGTH 64 #define HAVE_SPRINTF #define HAVE_SNPRINTF_FORMAT_U @@ -7,15 +18,15 @@ #define IO_USB_MAX_ENDPOINTS 4 #define HAVE_USB_APDU #define USB_SEGMENT_SIZE 64 +//#define HAVE_WEBUSB +//#define WEBUSB_URL_SIZE_B +//#define WEBUSB_URL #define OS_IO_SEPROXYHAL -#define HAVE_LOCAL_APDU_BUFFER -#define IO_SEPROXYHAL_BUFFER_SIZE_B 300 +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Makefile.defines +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#define gcc #define __IO volatile -#define main _start - -#define HAVE_SE_BUTTON -#define HAVE_SE_SCREEN -#define HAVE_FONTS #define BAGL_HEIGHT 64 #define BAGL_WIDTH 128 @@ -25,16 +36,15 @@ #define HAVE_BAGL_FONT_OPEN_SANS_LIGHT_16PX #define SCREEN_SIZE_NANO -// WEB USB (not supported in Rust SDK) -//#define HAVE_WEBUSB -//#define WEBUSB_URL_SIZE_B -//#define WEBUSB_URL - -// APP STORAGE (feature dependent) -//#define HAVE_APP_STORAGE +#define HAVE_SE_BUTTON +#define HAVE_SE_SCREEN +#define HAVE_FONTS +#define HAVE_INAPP_BLE_PAIRING +#define HAVE_BATTERY -// NBGL KEYBOARD (feature dependent) -//#define NBGL_KEYBOARD +#define HAVE_LEDGER_PKI -// NBGL KEYPAD (feature dependent) -//#define NBGL_KEYPAD \ No newline at end of file +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Misc +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#define HAVE_LOCAL_APDU_BUFFER \ No newline at end of file diff --git a/ledger_secure_sdk_sys/sdk_nanox.h b/ledger_secure_sdk_sys/sdk_nanox.h index 48cea500..67d758c3 100644 --- a/ledger_secure_sdk_sys/sdk_nanox.h +++ b/ledger_secure_sdk_sys/sdk_nanox.h @@ -1,4 +1,20 @@ -// Standard Defines +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Makefile.standard_app +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// BLUETOOTH +#define HAVE_BLE +#define HAVE_BLE_APDU +#define BLE_COMMAND_TIMEOUT_MS 2000 +#define BLE_SEGMENT_SIZE 32 +// APP STORAGE (feature dependent) +//#define HAVE_APP_STORAGE +// IO SEPROXY BUFFER SIZE +#define IO_SEPROXYHAL_BUFFER_SIZE_B 300 +// NBGL KEYBOARD (feature dependent) +//#define NBGL_KEYBOARD +// NBGL KEYPAD (feature dependent) +//#define NBGL_KEYPAD +// STANDARD DEFINES #define IO_HID_EP_LENGTH 64 #define HAVE_SPRINTF #define HAVE_SNPRINTF_FORMAT_U @@ -7,15 +23,15 @@ #define IO_USB_MAX_ENDPOINTS 4 #define HAVE_USB_APDU #define USB_SEGMENT_SIZE 64 +//#define HAVE_WEBUSB +//#define WEBUSB_URL_SIZE_B +//#define WEBUSB_URL #define OS_IO_SEPROXYHAL -#define HAVE_LOCAL_APDU_BUFFER -#define IO_SEPROXYHAL_BUFFER_SIZE_B 300 +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Makefile.defines +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#define gcc #define __IO volatile -#define main _start - -#define HAVE_SE_BUTTON -#define HAVE_SE_SCREEN -#define HAVE_FONTS #define BAGL_HEIGHT 64 #define BAGL_WIDTH 128 @@ -25,26 +41,17 @@ #define HAVE_BAGL_FONT_OPEN_SANS_LIGHT_16PX #define SCREEN_SIZE_NANO -#define HAVE_SEPROXYHAL_MCU -#define HAVE_MCU_PROTECT - -// BLE SUPPORT -#define HAVE_BLE -#define HAVE_BLE_APDU -#define BLE_COMMAND_TIMEOUT_MS 2000 -#define BLE_SEGMENT_SIZE 32 +#define HAVE_SE_BUTTON +#define HAVE_SE_SCREEN +#define HAVE_FONTS #define HAVE_INAPP_BLE_PAIRING +#define HAVE_BATTERY -// WEB USB (not supported in Rust SDK) -//#define HAVE_WEBUSB -//#define WEBUSB_URL_SIZE_B -//#define WEBUSB_URL - -// APP STORAGE (feature dependent) -//#define HAVE_APP_STORAGE - -// NBGL KEYBOARD (feature dependent) -//#define NBGL_KEYBOARD +#define HAVE_LEDGER_PKI -// NBGL KEYPAD (feature dependent) -//#define NBGL_KEYPAD \ No newline at end of file +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Misc +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#define HAVE_LOCAL_APDU_BUFFER +#define HAVE_SEPROXYHAL_MCU +#define HAVE_MCU_PROTECT \ No newline at end of file diff --git a/ledger_secure_sdk_sys/sdk_stax.h b/ledger_secure_sdk_sys/sdk_stax.h index 7b4277b1..85b27aa9 100644 --- a/ledger_secure_sdk_sys/sdk_stax.h +++ b/ledger_secure_sdk_sys/sdk_stax.h @@ -1,4 +1,25 @@ -// Standard Defines +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Makefile.standard_app +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// BLUETOOTH +#define HAVE_BLE +#define HAVE_BLE_APDU +#define BLE_COMMAND_TIMEOUT_MS 2000 +#define BLE_SEGMENT_SIZE 32 +// NFC SUPPORT (feature dependent) +//#define HAVE_NFC +//#define HAVE_NFC_READER +// APP STORAGE (feature dependent) +//#define HAVE_APP_STORAGE +// IO SEPROXY BUFFER SIZE +#define IO_SEPROXYHAL_BUFFER_SIZE_B 300 +// NBGL QRCODE (feature dependent) +#define NBGL_QRCODE +// NBGL KEYBOARD (feature dependent) +//#define NBGL_KEYBOARD +// NBGL KEYPAD (feature dependent) +//#define NBGL_KEYPAD +// STANDARD DEFINES #define IO_HID_EP_LENGTH 64 #define HAVE_SPRINTF #define HAVE_SNPRINTF_FORMAT_U @@ -7,13 +28,16 @@ #define IO_USB_MAX_ENDPOINTS 4 #define HAVE_USB_APDU #define USB_SEGMENT_SIZE 64 +//#define HAVE_WEBUSB +//#define WEBUSB_URL_SIZE_B +//#define WEBUSB_URL #define OS_IO_SEPROXYHAL -#define HAVE_LOCAL_APDU_BUFFER -#define IO_SEPROXYHAL_BUFFER_SIZE_B 300 +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Makefile.defines +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#define gcc #define __IO volatile -#define main _start - -// NBGL +// Stax #define HAVE_BAGL_FONT_INTER_REGULAR_24PX #define HAVE_BAGL_FONT_INTER_SEMIBOLD_24PX #define HAVE_BAGL_FONT_INTER_MEDIUM_32PX @@ -26,30 +50,9 @@ #define NBGL_USE_CASE #define SCREEN_SIZE_WALLET -// BLE SUPPORT -#define HAVE_BLE -#define HAVE_BLE_APDU -#define BLE_COMMAND_TIMEOUT_MS 2000 -#define BLE_SEGMENT_SIZE 32 -#define HAVE_INAPP_BLE_PAIRING - -// WEB USB (not supported in Rust SDK) -//#define HAVE_WEBUSB -//#define WEBUSB_URL_SIZE_B -//#define WEBUSB_URL - -// NFC SUPPORT (feature dependent) -//#define HAVE_NFC -//#define HAVE_NFC_READER +#define HAVE_LEDGER_PKI -// APP STORAGE (feature dependent) -//#define HAVE_APP_STORAGE - -// NBGL QRCODE (feature dependent) -#define NBGL_QRCODE - -// NBGL KEYBOARD (feature dependent) -//#define NBGL_KEYBOARD - -// NBGL KEYPAD (feature dependent) -//#define NBGL_KEYPAD +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Misc +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#define HAVE_LOCAL_APDU_BUFFER \ No newline at end of file From a8fd1261bfda31fddb0482583597fb6f749993e8 Mon Sep 17 00:00:00 2001 From: GroM Date: Tue, 11 Feb 2025 15:54:17 +0100 Subject: [PATCH 11/29] Add build.rs time monitoring --- ledger_secure_sdk_sys/build.rs | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index 16f8e202..6ff2c769 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -3,6 +3,7 @@ use glob::glob; use std::fs; use std::path::{Path, PathBuf}; use std::process::Command; +use std::time::Instant; use std::{env, fs::File, io::BufRead, io::BufReader, io::Read}; #[cfg(feature = "ccid")] @@ -474,7 +475,7 @@ impl SDKBuilder { Ok(()) } - pub fn build_c_sdk(&self) { + pub fn build_c_sdk(&self) -> Result<(), SDKBuildError> { let mut command = cc::Build::new(); if env::var_os("CC").is_none() { command.compiler("clang"); @@ -561,9 +562,10 @@ impl SDKBuilder { }; println!("cargo:rustc-link-lib=c"); println!("cargo:rustc-link-search={path}"); + Ok(()) } - fn generate_bindings(&self) { + fn generate_bindings(&self) -> Result<(), SDKBuildError> { let bsdk = self.bolos_sdk.display().to_string(); let gcc_tc = self.gcc_toolchain.display().to_string(); let args = [ @@ -679,9 +681,11 @@ impl SDKBuilder { bindings .write_to_file(out_path.join("bindings.rs")) .expect("Couldn't write bindings"); + + Ok(()) } - fn generate_heap_size(&self) { + fn generate_heap_size(&self) -> Result<(), SDKBuildError> { // Read the HEAP_SIZE environment variable, default to 8192 if not set let heap_size = env::var("HEAP_SIZE").unwrap_or_else(|_| "8192".to_string()); @@ -700,19 +704,26 @@ impl SDKBuilder { format!("pub const HEAP_SIZE: usize = {};", heap_size), ) .expect("Unable to write file"); + Ok(()) } } fn main() { + let start = Instant::now(); let mut sdk_builder = SDKBuilder::new(); sdk_builder.gcc_toolchain().unwrap(); sdk_builder.device().unwrap(); sdk_builder.bolos_sdk().unwrap(); sdk_builder.cxdefines().unwrap(); sdk_builder.generate_glyphs().unwrap(); - sdk_builder.build_c_sdk(); - sdk_builder.generate_bindings(); - sdk_builder.generate_heap_size(); + sdk_builder.build_c_sdk().unwrap(); + sdk_builder.generate_bindings().unwrap(); + sdk_builder.generate_heap_size().unwrap(); + let end = start.elapsed(); + println!( + "cargo:warning=Total build.rs time: {} seconds", + end.as_secs() + ); } fn finalize_nanos_configuration(command: &mut cc::Build, bolos_sdk: &Path) { From 963d75d16366cd7825c42ce973e4d4818cabc3f6 Mon Sep 17 00:00:00 2001 From: GroM Date: Wed, 12 Feb 2025 17:50:33 +0100 Subject: [PATCH 12/29] Update CFLAGS (same as C SDK) --- ledger_secure_sdk_sys/build.rs | 322 ++++++++++-------- ledger_secure_sdk_sys/c_sdk_build_flex.cflags | 34 ++ .../c_sdk_build_nanosplus.cflags | 34 ++ .../c_sdk_build_nanox.cflags | 34 ++ ledger_secure_sdk_sys/c_sdk_build_stax.cflags | 34 ++ 5 files changed, 314 insertions(+), 144 deletions(-) create mode 100644 ledger_secure_sdk_sys/c_sdk_build_flex.cflags create mode 100644 ledger_secure_sdk_sys/c_sdk_build_nanosplus.cflags create mode 100644 ledger_secure_sdk_sys/c_sdk_build_nanox.cflags create mode 100644 ledger_secure_sdk_sys/c_sdk_build_stax.cflags diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index 6ff2c769..fe985b51 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -45,23 +45,95 @@ const CCID_FILES: [&str; 9] = [ "lib_stusb/STM32_USB_Device_Library/Class/CCID/src/usbd_ccid_if.c", ]; -#[derive(Debug, PartialEq)] -enum Device { +const CFLAGS_NANOS: [&str; 11] = [ + "-Oz", + "-fomit-frame-pointer", + "-fno-common", + "-fdata-sections", + "-ffunction-sections", + "-mthumb", + "-fno-jump-tables", + "-fshort-enums", + "-mno-unaligned-access", + "-fropi", + "-Wno-unused-command-line-argument", +]; + +const CFLAGS_NANOSPLUS: [&str; 22] = [ + "-Oz", + "-g0", + "-fomit-frame-pointer", + "-momit-leaf-frame-pointer", + "-fno-common", + "-mlittle-endian", + "-std=gnu99", + "-fdata-sections", + "-ffunction-sections", + "-funsigned-char", + "-fshort-enums", + "-mno-unaligned-access", + "-fropi", + "-fno-jump-tables", + "-nostdlib", + "-nodefaultlibs", + "-frwpi", + "--target=armv8m-none-eabi", + "-mcpu=cortex-m35p+nodsp", + "-mthumb", + "-msoft-float", + "-Wno-unused-command-line-argument", +]; +const CFLAGS_STAX: [&str; 22] = CFLAGS_NANOSPLUS; +const CFLAGS_FLEX: [&str; 22] = CFLAGS_NANOSPLUS; +const CFLAGS_NANOX: [&str; 21] = [ + "-Oz", + "-g0", + "-fomit-frame-pointer", + "-momit-leaf-frame-pointer", + "-fno-common", + "-mlittle-endian", + "-std=gnu99", + "-fdata-sections", + "-ffunction-sections", + "-funsigned-char", + "-fshort-enums", + "-mno-unaligned-access", + "-fropi", + "-fno-jump-tables", + "-nostdlib", + "-nodefaultlibs", + "-frwpi", + "-mthumb", + "--target=armv6m-none-eabi", + "-mcpu=cortex-m0plus", + "-Wno-unused-command-line-argument", +]; + +#[derive(Debug, Default, PartialEq)] +enum DeviceName { NanoS, + #[default] NanoSPlus, NanoX, Stax, Flex, } -impl std::fmt::Display for Device { +#[derive(Debug, Default)] +struct Device<'a> { + pub name: DeviceName, + pub defines: Vec<(String, Option)>, + pub cflags: Vec<&'a str>, +} + +impl std::fmt::Display for DeviceName { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - Device::NanoS => write!(f, "nanos"), - Device::NanoSPlus => write!(f, "nanos2"), - Device::NanoX => write!(f, "nanox"), - Device::Stax => write!(f, "stax"), - Device::Flex => write!(f, "flex"), + DeviceName::NanoS => write!(f, "nanos"), + DeviceName::NanoSPlus => write!(f, "nanos2"), + DeviceName::NanoX => write!(f, "nanox"), + DeviceName::Stax => write!(f, "stax"), + DeviceName::Flex => write!(f, "flex"), } } } @@ -174,10 +246,10 @@ fn retrieve_target_file_infos( device: &Device, bolos_sdk: &Path, ) -> Result<(String, String), SDKBuildError> { - let prefix = if *device == Device::NanoS { + let prefix = if device.name == DeviceName::NanoS { "".to_string() } else { - format!("target/{}/", device) + format!("target/{}/", device.name) }; let target_file_path = bolos_sdk.join(format!("{}include/bolos_target.h", prefix)); let target_file = @@ -220,24 +292,24 @@ fn retrieve_target_file_infos( /// Fetch the appropriate C SDK to build fn clone_sdk(device: &Device) -> PathBuf { - let (repo_url, sdk_branch) = match device { - Device::NanoS => ( + let (repo_url, sdk_branch) = match device.name { + DeviceName::NanoS => ( Path::new("https://github.com/LedgerHQ/ledger-secure-sdk"), "API_LEVEL_LNS", ), - Device::NanoX => ( + DeviceName::NanoX => ( Path::new("https://github.com/LedgerHQ/ledger-secure-sdk"), "API_LEVEL_22", ), - Device::NanoSPlus => ( + DeviceName::NanoSPlus => ( Path::new("https://github.com/LedgerHQ/ledger-secure-sdk"), "API_LEVEL_22", ), - Device::Stax => ( + DeviceName::Stax => ( Path::new("https://github.com/LedgerHQ/ledger-secure-sdk"), "API_LEVEL_22", ), - Device::Flex => ( + DeviceName::Flex => ( Path::new("https://github.com/LedgerHQ/ledger-secure-sdk"), "API_LEVEL_22", ), @@ -299,22 +371,22 @@ fn header2define(headername: &str) -> Vec<(String, Option)> { .collect() } -struct SDKBuilder { +struct SDKBuilder<'a> { bolos_sdk: PathBuf, api_level: u32, gcc_toolchain: PathBuf, - device: Device, + device: Device<'a>, glyphs_folders: Vec, cxdefines: Vec, } -impl SDKBuilder { +impl SDKBuilder<'_> { pub fn new() -> Self { SDKBuilder { bolos_sdk: PathBuf::new(), api_level: 0, gcc_toolchain: PathBuf::new(), - device: Device::NanoS, + device: Device::default(), glyphs_folders: Vec::new(), cxdefines: Vec::new(), } @@ -349,19 +421,39 @@ impl SDKBuilder { .to_str() .unwrap() { - "nanos" => Device::NanoS, - "nanosplus" => Device::NanoSPlus, - "nanox" => Device::NanoX, - "stax" => Device::Stax, - "flex" => Device::Flex, + "nanos" => Device { + name: DeviceName::NanoS, + defines: header2define("sdk_nanos.h"), + cflags: Vec::from(CFLAGS_NANOS), + }, + "nanosplus" => Device { + name: DeviceName::NanoSPlus, + defines: header2define("sdk_nanosp.h"), + cflags: Vec::from(CFLAGS_NANOSPLUS), + }, + "nanox" => Device { + name: DeviceName::NanoX, + defines: header2define("sdk_nanox.h"), + cflags: Vec::from(CFLAGS_NANOX), + }, + "stax" => Device { + name: DeviceName::Stax, + defines: header2define("sdk_stax.h"), + cflags: Vec::from(CFLAGS_STAX), + }, + "flex" => Device { + name: DeviceName::Flex, + defines: header2define("sdk_flex.h"), + cflags: Vec::from(CFLAGS_FLEX), + }, _ => { return Err(SDKBuildError::UnsupportedDevice); } }; // export TARGET into env for 'infos.rs' - println!("cargo:rustc-env=TARGET={}", self.device); - println!("cargo:warning=Device is {:?}", self.device); + println!("cargo:rustc-env=TARGET={}", self.device.name); + println!("cargo:warning=Device is {:?}", self.device.name); Ok(()) } @@ -381,15 +473,15 @@ impl SDKBuilder { println!("cargo:warning=API_LEVEL is {}", self.api_level); } None => { - if self.device != Device::NanoS { + if self.device.name != DeviceName::NanoS { return Err(SDKBuildError::InvalidAPILevel); } } } // set glyphs folders - match self.device { - Device::Flex => { + match self.device.name { + DeviceName::Flex => { self.glyphs_folders .push(self.bolos_sdk.join("lib_nbgl/glyphs/wallet")); self.glyphs_folders @@ -397,7 +489,7 @@ impl SDKBuilder { self.glyphs_folders .push(self.bolos_sdk.join("lib_nbgl/glyphs/40px")); } - Device::Stax => { + DeviceName::Stax => { self.glyphs_folders .push(self.bolos_sdk.join("lib_nbgl/glyphs/wallet")); self.glyphs_folders @@ -445,7 +537,7 @@ impl SDKBuilder { } pub fn generate_glyphs(&self) -> Result<(), SDKBuildError> { - if self.device == Device::NanoS { + if self.device.name == DeviceName::NanoS { return Err(SDKBuildError::UnsupportedDevice); } @@ -503,23 +595,6 @@ impl SDKBuilder { .join("lib_stusb/STM32_USB_Device_Library/Class/HID/Inc"), ) .debug(true) - .flag("-Oz") - .flag("-fomit-frame-pointer") - .flag("-momit-leaf-frame-pointer") - .flag("-fno-common") - .flag("-mlittle-endian") - .flag("-std=gnu99") - .flag("-fdata-sections") - .flag("-ffunction-sections") - .flag("-funsigned-char") - .flag("-fshort-enums") - .flag("-mno-unaligned-access") - .flag("-fropi") - .flag("-mthumb") - .flag("-fno-jump-tables") - .flag("-nostdlib") - .flag("-nodefaultlibs") - .flag("-Wno-unused-command-line-argument") .define("main", "_start") .clone(); @@ -531,12 +606,24 @@ impl SDKBuilder { // command.files(str2path(&self.bolos_sdk, &CCID_FILES)); // } - match self.device { - Device::NanoS => finalize_nanos_configuration(&mut command, &self.bolos_sdk), - Device::NanoX => finalize_nanox_configuration(&mut command, &self.bolos_sdk), - Device::NanoSPlus => finalize_nanosplus_configuration(&mut command, &self.bolos_sdk), - Device::Stax => finalize_stax_configuration(&mut command, &self.bolos_sdk), - Device::Flex => finalize_flex_configuration(&mut command, &self.bolos_sdk), + // Set the #defines + for (define, value) in &self.device.defines { + command.define(define.as_str(), value.as_deref()); + } + + // Set the CFLAGS + for cflag in &self.device.cflags { + command.flag(cflag); + } + + match self.device.name { + DeviceName::NanoS => finalize_nanos_configuration(&mut command, &self.bolos_sdk), + DeviceName::NanoX => finalize_nanox_configuration(&mut command, &self.bolos_sdk), + DeviceName::NanoSPlus => { + finalize_nanosplus_configuration(&mut command, &self.bolos_sdk) + } + DeviceName::Stax => finalize_stax_configuration(&mut command, &self.bolos_sdk), + DeviceName::Flex => finalize_flex_configuration(&mut command, &self.bolos_sdk), }; // Add the defines found in the Makefile.conf.cx to our build command. @@ -548,15 +635,15 @@ impl SDKBuilder { /* Link with libc for unresolved symbols */ let mut path = self.bolos_sdk.display().to_string(); - match self.device { - Device::NanoS => { + match self.device.name { + DeviceName::NanoS => { path = self.gcc_toolchain.display().to_string(); path.push_str("/lib"); } - Device::NanoX => { + DeviceName::NanoX => { path.push_str("/arch/st33/lib"); } - Device::NanoSPlus | Device::Flex | Device::Stax => { + DeviceName::NanoSPlus | DeviceName::Flex | DeviceName::Stax => { path.push_str("/arch/st33k1/lib"); } }; @@ -601,12 +688,12 @@ impl SDKBuilder { .use_core(); // Target specific files - let (include_path, header) = match self.device { - Device::NanoS => ("nanos", "sdk_nanos.h"), - Device::NanoX => ("nanox", "sdk_nanox.h"), - Device::NanoSPlus => ("nanos2", "sdk_nanosp.h"), - Device::Stax => ("stax", "sdk_stax.h"), - Device::Flex => ("flex", "sdk_flex.h"), + let (include_path, header) = match self.device.name { + DeviceName::NanoS => ("nanos", "sdk_nanos.h"), + DeviceName::NanoX => ("nanox", "sdk_nanox.h"), + DeviceName::NanoSPlus => ("nanos2", "sdk_nanosp.h"), + DeviceName::Stax => ("stax", "sdk_stax.h"), + DeviceName::Flex => ("flex", "sdk_flex.h"), }; bindings = bindings.clang_arg(format!("-I{bsdk}/target/{include_path}/include/")); bindings = bindings.header(header); @@ -617,15 +704,16 @@ impl SDKBuilder { } // BAGL or NBGL bindings - match self.device { - Device::NanoS => { + match self.device.name { + DeviceName::NanoS => { bindings = bindings.header(self.bolos_sdk.join("include/bagl.h").to_str().unwrap()) } - Device::NanoSPlus | Device::NanoX | Device::Stax | Device::Flex => { - if ((self.device == Device::NanoX || self.device == Device::NanoSPlus) + DeviceName::NanoSPlus | DeviceName::NanoX | DeviceName::Stax | DeviceName::Flex => { + if ((self.device.name == DeviceName::NanoX + || self.device.name == DeviceName::NanoSPlus) && env::var_os("CARGO_FEATURE_NBGL").is_some()) - || self.device == Device::Stax - || self.device == Device::Flex + || self.device.name == DeviceName::Stax + || self.device.name == DeviceName::Flex { let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); let mut include_path = "-I".to_string(); @@ -655,8 +743,8 @@ impl SDKBuilder { } // BLE bindings - match self.device { - Device::NanoX | Device::Flex | Device::Stax => { + match self.device.name { + DeviceName::NanoX | DeviceName::Flex | DeviceName::Stax => { bindings = bindings.header( self.bolos_sdk .join("lib_blewbxx_impl/include/ledger_ble.h") @@ -727,44 +815,18 @@ fn main() { } fn finalize_nanos_configuration(command: &mut cc::Build, bolos_sdk: &Path) { - let defines = header2define("sdk_nanos.h"); - for (define, value) in defines { - command.define(define.as_str(), value.as_deref()); - } - command .target("thumbv6m-none-eabi") .define("ST31", None) - .include(bolos_sdk.join("target/nanos/include")) - .flag("-fropi"); + .include(bolos_sdk.join("target/nanos/include")); } fn finalize_nanox_configuration(command: &mut cc::Build, bolos_sdk: &Path) { - let defines = header2define("sdk_nanox.h"); - for (define, value) in defines { - command.define(define.as_str(), value.as_deref()); - } - command .target("thumbv6m-none-eabi") - .file(bolos_sdk.join("src/ledger_protocol.c")) - .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_gap_aci.c")) - .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_gatt_aci.c")) - .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_hal_aci.c")) - .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_hci_le.c")) - .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_l2cap_aci.c")) - .file(bolos_sdk.join("lib_blewbxx/core/template/osal.c")) - .file(bolos_sdk.join("lib_blewbxx_impl/src/ledger_ble.c")) - .include(bolos_sdk.join("lib_blewbxx/include")) - .include(bolos_sdk.join("lib_blewbxx/core")) - .include(bolos_sdk.join("lib_blewbxx/core/auto")) - .include(bolos_sdk.join("lib_blewbxx/core/template")) - .include(bolos_sdk.join("lib_blewbxx_impl/include")) - .include(bolos_sdk.join("target/nanox/include")) - .flag("-mno-movt") - .flag("-ffixed-r9") - .flag("-fropi") - .flag("-frwpi"); + .include(bolos_sdk.join("target/nanox/include")); + + configure_lib_ble(command, bolos_sdk); if env::var_os("CARGO_FEATURE_NBGL").is_some() { println!("cargo:warning=NBGL is built"); @@ -779,16 +841,9 @@ fn finalize_nanox_configuration(command: &mut cc::Build, bolos_sdk: &Path) { } fn finalize_nanosplus_configuration(command: &mut cc::Build, bolos_sdk: &Path) { - let defines = header2define("sdk_nanosp.h"); - for (define, value) in defines { - command.define(define.as_str(), value.as_deref()); - } - command .target("thumbv8m.main-none-eabi") - .include(bolos_sdk.join("target/nanos2/include")) - .flag("-fropi") - .flag("-frwpi"); + .include(bolos_sdk.join("target/nanos2/include")); if env::var_os("CARGO_FEATURE_NBGL").is_some() { println!("cargo:warning=NBGL is built"); @@ -803,40 +858,25 @@ fn finalize_nanosplus_configuration(command: &mut cc::Build, bolos_sdk: &Path) { } fn finalize_stax_configuration(command: &mut cc::Build, bolos_sdk: &Path) { - let defines = header2define("sdk_stax.h"); - for (define, value) in defines { - command.define(define.as_str(), value.as_deref()); - } - command .target("thumbv8m.main-none-eabi") - .file(bolos_sdk.join("src/ledger_protocol.c")) - .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_gap_aci.c")) - .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_gatt_aci.c")) - .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_hal_aci.c")) - .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_hci_le.c")) - .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_l2cap_aci.c")) - .file(bolos_sdk.join("lib_blewbxx/core/template/osal.c")) - .file(bolos_sdk.join("lib_blewbxx_impl/src/ledger_ble.c")) - .include(bolos_sdk.join("lib_blewbxx/include")) - .include(bolos_sdk.join("lib_blewbxx/core")) - .include(bolos_sdk.join("lib_blewbxx/core/auto")) - .include(bolos_sdk.join("lib_blewbxx/core/template")) - .include(bolos_sdk.join("lib_blewbxx_impl/include")) - .include(bolos_sdk.join("target/stax/include/")) - .flag("-fropi") - .flag("-frwpi"); + .include(bolos_sdk.join("target/stax/include/")); + + configure_lib_ble(command, bolos_sdk); configure_lib_nbgl(command, bolos_sdk); } fn finalize_flex_configuration(command: &mut cc::Build, bolos_sdk: &Path) { - let defines = header2define("sdk_flex.h"); - for (define, value) in defines { - command.define(define.as_str(), value.as_deref()); - } - command .target("thumbv8m.main-none-eabi") + .include(bolos_sdk.join("target/flex/include/")); + + configure_lib_ble(command, bolos_sdk); + configure_lib_nbgl(command, bolos_sdk); +} + +fn configure_lib_ble(command: &mut cc::Build, bolos_sdk: &Path) { + command .file(bolos_sdk.join("src/ledger_protocol.c")) .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_gap_aci.c")) .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_gatt_aci.c")) @@ -849,18 +889,12 @@ fn finalize_flex_configuration(command: &mut cc::Build, bolos_sdk: &Path) { .include(bolos_sdk.join("lib_blewbxx/core")) .include(bolos_sdk.join("lib_blewbxx/core/auto")) .include(bolos_sdk.join("lib_blewbxx/core/template")) - .include(bolos_sdk.join("lib_blewbxx_impl/include")) - .include(bolos_sdk.join("target/flex/include/")) - .flag("-fropi") - .flag("-frwpi"); - configure_lib_nbgl(command, bolos_sdk); + .include(bolos_sdk.join("lib_blewbxx_impl/include")); } fn configure_lib_nbgl(command: &mut cc::Build, bolos_sdk: &Path) { let glyphs_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("glyphs"); command - .flag("-Wno-microsoft-anon-tag") - .flag("-fms-extensions") .include(bolos_sdk.join("lib_nbgl/include/")) .include(bolos_sdk.join("lib_nbgl/include/fonts/")) .include(bolos_sdk.join("lib_ux_nbgl/")) diff --git a/ledger_secure_sdk_sys/c_sdk_build_flex.cflags b/ledger_secure_sdk_sys/c_sdk_build_flex.cflags new file mode 100644 index 00000000..519cb514 --- /dev/null +++ b/ledger_secure_sdk_sys/c_sdk_build_flex.cflags @@ -0,0 +1,34 @@ +--sysroot="/usr/arm-none-eabi" +-Oz +-g0 +-fomit-frame-pointer +-momit-leaf-frame-pointer +-fno-common +-mlittle-endian +-std=gnu99 +-Wall +-Wextra +-Wno-main +-Werror=int-to-pointer-cast +-Wno-error=int-conversion +-Wimplicit-fallthrough +-Wvla +-Wundef +-Wshadow +-Wformat=2 +-Wformat-security +-Wwrite-strings +-fdata-sections +-ffunction-sections +-funsigned-char +-fshort-enums +-mno-unaligned-access +-fropi +-fno-jump-tables +-nostdlib +-nodefaultlibs +-frwpi +-mthumb +--target=armv8m-none-eabi +-mcpu=cortex-m35p+nodsp +-msoft-float \ No newline at end of file diff --git a/ledger_secure_sdk_sys/c_sdk_build_nanosplus.cflags b/ledger_secure_sdk_sys/c_sdk_build_nanosplus.cflags new file mode 100644 index 00000000..519cb514 --- /dev/null +++ b/ledger_secure_sdk_sys/c_sdk_build_nanosplus.cflags @@ -0,0 +1,34 @@ +--sysroot="/usr/arm-none-eabi" +-Oz +-g0 +-fomit-frame-pointer +-momit-leaf-frame-pointer +-fno-common +-mlittle-endian +-std=gnu99 +-Wall +-Wextra +-Wno-main +-Werror=int-to-pointer-cast +-Wno-error=int-conversion +-Wimplicit-fallthrough +-Wvla +-Wundef +-Wshadow +-Wformat=2 +-Wformat-security +-Wwrite-strings +-fdata-sections +-ffunction-sections +-funsigned-char +-fshort-enums +-mno-unaligned-access +-fropi +-fno-jump-tables +-nostdlib +-nodefaultlibs +-frwpi +-mthumb +--target=armv8m-none-eabi +-mcpu=cortex-m35p+nodsp +-msoft-float \ No newline at end of file diff --git a/ledger_secure_sdk_sys/c_sdk_build_nanox.cflags b/ledger_secure_sdk_sys/c_sdk_build_nanox.cflags new file mode 100644 index 00000000..db9a2818 --- /dev/null +++ b/ledger_secure_sdk_sys/c_sdk_build_nanox.cflags @@ -0,0 +1,34 @@ +--sysroot="/usr/arm-none-eabi" +-Oz +-g0 +-fomit-frame-pointer +-momit-leaf-frame-pointer +-fno-common +-mlittle-endian +-std=gnu99 +-Wall +-Wextra +-Wno-main +-Werror=int-to-pointer-cast +-Wno-error=int-conversion +-Wimplicit-fallthrough +-Wvla +-Wundef +-Wshadow +-Wformat=2 +-Wformat-security +-Wwrite-strings +-fdata-sections +-ffunction-sections +-funsigned-char +-fshort-enums +-mno-unaligned-access +-fropi +-fno-jump-tables +-nostdlib +-nodefaultlibs +-frwpi +-mthumb +--target=armv6m-none-eabi +-mcpu=cortex-m0plus + diff --git a/ledger_secure_sdk_sys/c_sdk_build_stax.cflags b/ledger_secure_sdk_sys/c_sdk_build_stax.cflags new file mode 100644 index 00000000..519cb514 --- /dev/null +++ b/ledger_secure_sdk_sys/c_sdk_build_stax.cflags @@ -0,0 +1,34 @@ +--sysroot="/usr/arm-none-eabi" +-Oz +-g0 +-fomit-frame-pointer +-momit-leaf-frame-pointer +-fno-common +-mlittle-endian +-std=gnu99 +-Wall +-Wextra +-Wno-main +-Werror=int-to-pointer-cast +-Wno-error=int-conversion +-Wimplicit-fallthrough +-Wvla +-Wundef +-Wshadow +-Wformat=2 +-Wformat-security +-Wwrite-strings +-fdata-sections +-ffunction-sections +-funsigned-char +-fshort-enums +-mno-unaligned-access +-fropi +-fno-jump-tables +-nostdlib +-nodefaultlibs +-frwpi +-mthumb +--target=armv8m-none-eabi +-mcpu=cortex-m35p+nodsp +-msoft-float \ No newline at end of file From 5d507facecfa0b5afa0a235a75aece4f85374095 Mon Sep 17 00:00:00 2001 From: GroM Date: Wed, 12 Feb 2025 17:53:29 +0100 Subject: [PATCH 13/29] Remove CCID feature --- ledger_secure_sdk_sys/Cargo.toml | 1 - ledger_secure_sdk_sys/build.rs | 25 ------------------------- 2 files changed, 26 deletions(-) diff --git a/ledger_secure_sdk_sys/Cargo.toml b/ledger_secure_sdk_sys/Cargo.toml index ba09348c..5ea5adaa 100644 --- a/ledger_secure_sdk_sys/Cargo.toml +++ b/ledger_secure_sdk_sys/Cargo.toml @@ -18,7 +18,6 @@ critical-section = { version = "1.1.2", optional = true } [features] heap = ["dep:embedded-alloc", "dep:critical-section"] -ccid = [] nbgl = [] [lints.rust.unexpected_cfgs] diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index fe985b51..d01be119 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -6,10 +6,6 @@ use std::process::Command; use std::time::Instant; use std::{env, fs::File, io::BufRead, io::BufReader, io::Read}; -#[cfg(feature = "ccid")] -const DEFINES_CCID: [(&str, Option<&str>); 2] = - [("HAVE_USB_CLASS_CCID", None), ("HAVE_CCID", None)]; - const AUX_C_FILES: [&str; 2] = ["./src/c/src.c", "./src/c/sjlj.s"]; const SDK_C_FILES: [&str; 8] = [ @@ -32,19 +28,6 @@ const SDK_USB_FILES: [&str; 6] = [ "lib_stusb/STM32_USB_Device_Library/Class/HID/Src/usbd_hid.c", ]; -#[cfg(feature = "ccid")] -const CCID_FILES: [&str; 9] = [ - "lib_stusb/STM32_USB_Device_Library/Class/CCID/src/usbd_ccid_cmd.c", - "lib_stusb/STM32_USB_Device_Library/Class/CCID/src/usbd_ccid_core.c", - "lib_stusb/STM32_USB_Device_Library/Class/CCID/src/usbd_ccid_if.c", - "lib_stusb/STM32_USB_Device_Library/Class/CCID/src/usbd_ccid_cmd.c", - "lib_stusb/STM32_USB_Device_Library/Class/CCID/src/usbd_ccid_core.c", - "lib_stusb/STM32_USB_Device_Library/Class/CCID/src/usbd_ccid_if.c", - "lib_stusb/STM32_USB_Device_Library/Class/CCID/src/usbd_ccid_cmd.c", - "lib_stusb/STM32_USB_Device_Library/Class/CCID/src/usbd_ccid_core.c", - "lib_stusb/STM32_USB_Device_Library/Class/CCID/src/usbd_ccid_if.c", -]; - const CFLAGS_NANOS: [&str; 11] = [ "-Oz", "-fomit-frame-pointer", @@ -598,14 +581,6 @@ impl SDKBuilder<'_> { .define("main", "_start") .clone(); - // #[cfg(feature = "ccid")] - // { - // for (define, value) in DEFINES_CCID { - // command.define(define, value); - // } - // command.files(str2path(&self.bolos_sdk, &CCID_FILES)); - // } - // Set the #defines for (define, value) in &self.device.defines { command.define(define.as_str(), value.as_deref()); From d5c29edae0c72f3c5a81a818ca8ac9ae516beb2a Mon Sep 17 00:00:00 2001 From: GroM Date: Wed, 12 Feb 2025 18:03:24 +0100 Subject: [PATCH 14/29] Remove CCID feature bis --- ledger_device_sdk/Cargo.toml | 1 - ledger_device_sdk/src/ccid.rs | 11 ----------- ledger_device_sdk/src/io.rs | 6 ------ ledger_device_sdk/src/lib.rs | 2 -- ledger_secure_sdk_sys/src/c/src.c | 8 -------- 5 files changed, 28 deletions(-) delete mode 100644 ledger_device_sdk/src/ccid.rs diff --git a/ledger_device_sdk/Cargo.toml b/ledger_device_sdk/Cargo.toml index f0d9a880..e81fe816 100644 --- a/ledger_device_sdk/Cargo.toml +++ b/ledger_device_sdk/Cargo.toml @@ -26,7 +26,6 @@ ledger_secure_sdk_sys = { path = "../ledger_secure_sdk_sys", version = "1.6.7" } [features] debug = [] speculos = [] -ccid = [] heap = [ "ledger_secure_sdk_sys/heap" ] default = [ "heap" ] diff --git a/ledger_device_sdk/src/ccid.rs b/ledger_device_sdk/src/ccid.rs deleted file mode 100644 index 0b40b2c6..00000000 --- a/ledger_device_sdk/src/ccid.rs +++ /dev/null @@ -1,11 +0,0 @@ -extern "C" { - pub static mut G_io_apdu_buffer: [u8; 260]; - pub fn io_usb_ccid_reply_bare(length: u16); -} - -pub fn send(buf: &[u8]) { - unsafe { - G_io_apdu_buffer[..buf.len()].copy_from_slice(buf); - io_usb_ccid_reply_bare(buf.len() as u16); - } -} diff --git a/ledger_device_sdk/src/io.rs b/ledger_device_sdk/src/io.rs index f689a7b4..812c62f1 100644 --- a/ledger_device_sdk/src/io.rs +++ b/ledger_device_sdk/src/io.rs @@ -5,8 +5,6 @@ use ledger_secure_sdk_sys::buttons::{get_button_event, ButtonEvent, ButtonsState use ledger_secure_sdk_sys::seph as sys_seph; use ledger_secure_sdk_sys::*; -#[cfg(feature = "ccid")] -use crate::ccid; use crate::seph; use core::convert::{Infallible, TryFrom}; use core::ops::{Index, IndexMut}; @@ -193,10 +191,6 @@ impl Comm { sys_seph::seph_send(&[sys_seph::SephTags::RawAPDU as u8, len[0], len[1]]); sys_seph::seph_send(&self.apdu_buffer[..self.tx]); } - #[cfg(feature = "ccid")] - APDU_USB_CCID => { - ccid::send(&self.apdu_buffer[..self.tx]); - } #[cfg(any(target_os = "nanox", target_os = "stax", target_os = "flex"))] APDU_BLE => { ble::send(&self.apdu_buffer[..self.tx]); diff --git a/ledger_device_sdk/src/lib.rs b/ledger_device_sdk/src/lib.rs index 523a220c..380512f1 100644 --- a/ledger_device_sdk/src/lib.rs +++ b/ledger_device_sdk/src/lib.rs @@ -10,8 +10,6 @@ #[cfg(any(target_os = "nanox", target_os = "stax", target_os = "flex"))] pub mod ble; -#[cfg(feature = "ccid")] -pub mod ccid; pub mod ecc; pub mod hash; pub mod hmac; diff --git a/ledger_secure_sdk_sys/src/c/src.c b/ledger_secure_sdk_sys/src/c/src.c index 74cbadab..93697eae 100644 --- a/ledger_secure_sdk_sys/src/c/src.c +++ b/ledger_secure_sdk_sys/src/c/src.c @@ -253,11 +253,6 @@ void link_pass_nvram( nvm_write(nvram_prev_val_ptr, &nvram_current, sizeof(void*)); } -#ifdef HAVE_CCID - #include "usbd_ccid_if.h" -uint8_t G_io_apdu_buffer[260]; -#endif - void c_reset_bss() { size_t bss_len; SYMBOL_ABSOLUTE_VALUE(bss_len, _bss_len); @@ -312,9 +307,6 @@ void c_boot_std() { USB_power(0); USB_power(1); -#ifdef HAVE_CCID - io_usb_ccid_set_card_inserted(1); -#endif #ifdef HAVE_BLE memset(&G_io_asynch_ux_callback, 0, sizeof(G_io_asynch_ux_callback)); From 327e86eb2ab461396dadb0db09a23c166e852dda Mon Sep 17 00:00:00 2001 From: GroM Date: Thu, 13 Feb 2025 12:38:57 +0100 Subject: [PATCH 15/29] remove device match in bindings --- ledger_secure_sdk_sys/build.rs | 14 +++++--------- .../{sdk_nanosp.h => sdk_nanos2.h} | 0 2 files changed, 5 insertions(+), 9 deletions(-) rename ledger_secure_sdk_sys/{sdk_nanosp.h => sdk_nanos2.h} (100%) diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index d01be119..faa384d8 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -411,7 +411,7 @@ impl SDKBuilder<'_> { }, "nanosplus" => Device { name: DeviceName::NanoSPlus, - defines: header2define("sdk_nanosp.h"), + defines: header2define("sdk_nanos2.h"), cflags: Vec::from(CFLAGS_NANOSPLUS), }, "nanox" => Device { @@ -663,14 +663,10 @@ impl SDKBuilder<'_> { .use_core(); // Target specific files - let (include_path, header) = match self.device.name { - DeviceName::NanoS => ("nanos", "sdk_nanos.h"), - DeviceName::NanoX => ("nanox", "sdk_nanox.h"), - DeviceName::NanoSPlus => ("nanos2", "sdk_nanosp.h"), - DeviceName::Stax => ("stax", "sdk_stax.h"), - DeviceName::Flex => ("flex", "sdk_flex.h"), - }; - bindings = bindings.clang_arg(format!("-I{bsdk}/target/{include_path}/include/")); + let csdk_target_name = self.device.name.to_string(); + let header = format!("sdk_{csdk_target_name}.h"); + + bindings = bindings.clang_arg(format!("-I{bsdk}/target/{csdk_target_name}/include/")); bindings = bindings.header(header); // SDK headers to bind against diff --git a/ledger_secure_sdk_sys/sdk_nanosp.h b/ledger_secure_sdk_sys/sdk_nanos2.h similarity index 100% rename from ledger_secure_sdk_sys/sdk_nanosp.h rename to ledger_secure_sdk_sys/sdk_nanos2.h From 754ff65df6bdc62c756c75674264ed010a085dd9 Mon Sep 17 00:00:00 2001 From: GroM Date: Thu, 13 Feb 2025 15:37:12 +0100 Subject: [PATCH 16/29] Cleanup --- ledger_secure_sdk_sys/build.rs | 116 ++++++++++++------------------ ledger_secure_sdk_sys/sdk_nanos.h | 3 +- 2 files changed, 47 insertions(+), 72 deletions(-) diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index faa384d8..b50bafc5 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -105,6 +105,7 @@ enum DeviceName { #[derive(Debug, Default)] struct Device<'a> { pub name: DeviceName, + pub target: &'a str, pub defines: Vec<(String, Option)>, pub cflags: Vec<&'a str>, } @@ -406,26 +407,55 @@ impl SDKBuilder<'_> { { "nanos" => Device { name: DeviceName::NanoS, + target: "thumbv6m-none-eabi", defines: header2define("sdk_nanos.h"), cflags: Vec::from(CFLAGS_NANOS), }, "nanosplus" => Device { name: DeviceName::NanoSPlus, - defines: header2define("sdk_nanos2.h"), + target: "thumbv8m.main-none-eabi", + defines: { + let mut v = header2define("sdk_nanos2.h"); + if env::var_os("CARGO_FEATURE_NBGL").is_some() { + println!("cargo:warning=NBGL is built"); + v.push((String::from("HAVE_NBGL"), None)); + v.push((String::from("NBGL_STEP"), None)); + v.push((String::from("NBGL_USE_CASE"), None)); + } else { + println!("cargo:warning=BAGL is built"); + v.push((String::from("HAVE_BAGL"), None)); + } + v + }, cflags: Vec::from(CFLAGS_NANOSPLUS), }, "nanox" => Device { name: DeviceName::NanoX, - defines: header2define("sdk_nanox.h"), + target: "thumbv6m-none-eabi", + defines: { + let mut v = header2define("sdk_nanox.h"); + if env::var_os("CARGO_FEATURE_NBGL").is_some() { + println!("cargo:warning=NBGL is built"); + v.push((String::from("HAVE_NBGL"), None)); + v.push((String::from("NBGL_STEP"), None)); + v.push((String::from("NBGL_USE_CASE"), None)); + } else { + println!("cargo:warning=BAGL is built"); + v.push((String::from("HAVE_BAGL"), None)); + } + v + }, cflags: Vec::from(CFLAGS_NANOX), }, "stax" => Device { name: DeviceName::Stax, + target: "thumbv8m.main-none-eabi", defines: header2define("sdk_stax.h"), cflags: Vec::from(CFLAGS_STAX), }, "flex" => Device { name: DeviceName::Flex, + target: "thumbv8m.main-none-eabi", defines: header2define("sdk_flex.h"), cflags: Vec::from(CFLAGS_FLEX), }, @@ -591,15 +621,20 @@ impl SDKBuilder<'_> { command.flag(cflag); } - match self.device.name { - DeviceName::NanoS => finalize_nanos_configuration(&mut command, &self.bolos_sdk), - DeviceName::NanoX => finalize_nanox_configuration(&mut command, &self.bolos_sdk), - DeviceName::NanoSPlus => { - finalize_nanosplus_configuration(&mut command, &self.bolos_sdk) + command.target(self.device.target).include( + self.bolos_sdk + .join(format!("target/{}/include", self.device.name)), + ); + + // Configure BLE and NBGL + for s in self.device.defines.iter() { + if s.0 == "HAVE_BLE" { + configure_lib_ble(&mut command, &self.bolos_sdk); } - DeviceName::Stax => finalize_stax_configuration(&mut command, &self.bolos_sdk), - DeviceName::Flex => finalize_flex_configuration(&mut command, &self.bolos_sdk), - }; + if s.0 == "HAVE_NBGL" { + configure_lib_nbgl(&mut command, &self.bolos_sdk); + } + } // Add the defines found in the Makefile.conf.cx to our build command. for define in self.cxdefines.iter() { @@ -785,67 +820,6 @@ fn main() { ); } -fn finalize_nanos_configuration(command: &mut cc::Build, bolos_sdk: &Path) { - command - .target("thumbv6m-none-eabi") - .define("ST31", None) - .include(bolos_sdk.join("target/nanos/include")); -} - -fn finalize_nanox_configuration(command: &mut cc::Build, bolos_sdk: &Path) { - command - .target("thumbv6m-none-eabi") - .include(bolos_sdk.join("target/nanox/include")); - - configure_lib_ble(command, bolos_sdk); - - if env::var_os("CARGO_FEATURE_NBGL").is_some() { - println!("cargo:warning=NBGL is built"); - command.define("HAVE_NBGL", None); - command.define("NBGL_STEP", None); - command.define("NBGL_USE_CASE", None); - configure_lib_nbgl(command, bolos_sdk); - } else { - println!("cargo:warning=BAGL is built"); - command.define("HAVE_BAGL", None); - } -} - -fn finalize_nanosplus_configuration(command: &mut cc::Build, bolos_sdk: &Path) { - command - .target("thumbv8m.main-none-eabi") - .include(bolos_sdk.join("target/nanos2/include")); - - if env::var_os("CARGO_FEATURE_NBGL").is_some() { - println!("cargo:warning=NBGL is built"); - command.define("HAVE_NBGL", None); - command.define("NBGL_STEP", None); - command.define("NBGL_USE_CASE", None); - configure_lib_nbgl(command, bolos_sdk); - } else { - println!("cargo:warning=BAGL is built"); - command.define("HAVE_BAGL", None); - } -} - -fn finalize_stax_configuration(command: &mut cc::Build, bolos_sdk: &Path) { - command - .target("thumbv8m.main-none-eabi") - .include(bolos_sdk.join("target/stax/include/")); - - configure_lib_ble(command, bolos_sdk); - configure_lib_nbgl(command, bolos_sdk); -} - -fn finalize_flex_configuration(command: &mut cc::Build, bolos_sdk: &Path) { - command - .target("thumbv8m.main-none-eabi") - .include(bolos_sdk.join("target/flex/include/")); - - configure_lib_ble(command, bolos_sdk); - configure_lib_nbgl(command, bolos_sdk); -} - fn configure_lib_ble(command: &mut cc::Build, bolos_sdk: &Path) { command .file(bolos_sdk.join("src/ledger_protocol.c")) diff --git a/ledger_secure_sdk_sys/sdk_nanos.h b/ledger_secure_sdk_sys/sdk_nanos.h index 2d5e6937..157b0b37 100644 --- a/ledger_secure_sdk_sys/sdk_nanos.h +++ b/ledger_secure_sdk_sys/sdk_nanos.h @@ -7,4 +7,5 @@ #define HAVE_USB_APDU #define __IO volatile #define IO_USB_MAX_ENDPOINTS 6 -#define IO_SEPROXYHAL_BUFFER_SIZE_B 128 \ No newline at end of file +#define IO_SEPROXYHAL_BUFFER_SIZE_B 128 +#define ST31 \ No newline at end of file From be9b7c2395db52c6009f031945c77964765b3c6f Mon Sep 17 00:00:00 2001 From: GroM Date: Fri, 14 Feb 2025 11:41:31 +0100 Subject: [PATCH 17/29] Add libm.a and libgcc.a for linking + os_printf.c shall be built for all targets --- ledger_secure_sdk_sys/build.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index b50bafc5..b622286b 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -8,7 +8,7 @@ use std::{env, fs::File, io::BufRead, io::BufReader, io::Read}; const AUX_C_FILES: [&str; 2] = ["./src/c/src.c", "./src/c/sjlj.s"]; -const SDK_C_FILES: [&str; 8] = [ +const SDK_C_FILES: [&str; 9] = [ "src/os_io_usb.c", "src/pic.c", "src/checks.c", @@ -17,6 +17,7 @@ const SDK_C_FILES: [&str; 8] = [ "src/svc_call.s", "src/svc_cx_call.s", "src/syscalls.c", + "src/os_printf.c", ]; const SDK_USB_FILES: [&str; 6] = [ @@ -658,6 +659,8 @@ impl SDKBuilder<'_> { } }; println!("cargo:rustc-link-lib=c"); + println!("cargo:rustc-link-lib=m"); + println!("cargo:rustc-link-lib=gcc"); println!("cargo:rustc-link-search={path}"); Ok(()) } @@ -846,8 +849,6 @@ fn configure_lib_nbgl(command: &mut cc::Build, bolos_sdk: &Path) { .include(bolos_sdk.join("qrcode/include/")) .include(bolos_sdk.join("lib_bagl/include/")) .file(bolos_sdk.join("lib_ux_nbgl/ux.c")) - .file(bolos_sdk.join("lib_bagl/src/bagl_fonts.c")) - .file(bolos_sdk.join("src/os_printf.c")) .file(bolos_sdk.join("qrcode/src/qrcodegen.c")) .files( glob(bolos_sdk.join("lib_nbgl/src/*.c").to_str().unwrap()) From 348a1627019d22bdfe3e2107ac2d12201b9c6e5d Mon Sep 17 00:00:00 2001 From: GroM Date: Fri, 14 Feb 2025 11:42:04 +0100 Subject: [PATCH 18/29] Add nbgl feature --- ledger_device_sdk/Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/ledger_device_sdk/Cargo.toml b/ledger_device_sdk/Cargo.toml index e81fe816..3de4c95a 100644 --- a/ledger_device_sdk/Cargo.toml +++ b/ledger_device_sdk/Cargo.toml @@ -27,6 +27,7 @@ ledger_secure_sdk_sys = { path = "../ledger_secure_sdk_sys", version = "1.6.7" } debug = [] speculos = [] heap = [ "ledger_secure_sdk_sys/heap" ] +nbgl = [ "ledger_secure_sdk_sys/nbgl" ] default = [ "heap" ] From 17e3a8bb658d46385e05407727761dd20aecd33b Mon Sep 17 00:00:00 2001 From: GroM Date: Fri, 14 Feb 2025 14:13:32 +0100 Subject: [PATCH 19/29] Rename header files --- ledger_secure_sdk_sys/build.rs | 12 ++++++------ ledger_secure_sdk_sys/{sdk_flex.h => csdk_flex.h} | 0 ledger_secure_sdk_sys/{sdk_nanos.h => csdk_nanos.h} | 0 .../{sdk_nanos2.h => csdk_nanos2.h} | 0 ledger_secure_sdk_sys/{sdk_nanox.h => csdk_nanox.h} | 0 ledger_secure_sdk_sys/{sdk_stax.h => csdk_stax.h} | 0 6 files changed, 6 insertions(+), 6 deletions(-) rename ledger_secure_sdk_sys/{sdk_flex.h => csdk_flex.h} (100%) rename ledger_secure_sdk_sys/{sdk_nanos.h => csdk_nanos.h} (100%) rename ledger_secure_sdk_sys/{sdk_nanos2.h => csdk_nanos2.h} (100%) rename ledger_secure_sdk_sys/{sdk_nanox.h => csdk_nanox.h} (100%) rename ledger_secure_sdk_sys/{sdk_stax.h => csdk_stax.h} (100%) diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index b622286b..d35e5256 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -409,14 +409,14 @@ impl SDKBuilder<'_> { "nanos" => Device { name: DeviceName::NanoS, target: "thumbv6m-none-eabi", - defines: header2define("sdk_nanos.h"), + defines: header2define("csdk_nanos.h"), cflags: Vec::from(CFLAGS_NANOS), }, "nanosplus" => Device { name: DeviceName::NanoSPlus, target: "thumbv8m.main-none-eabi", defines: { - let mut v = header2define("sdk_nanos2.h"); + let mut v = header2define("csdk_nanos2.h"); if env::var_os("CARGO_FEATURE_NBGL").is_some() { println!("cargo:warning=NBGL is built"); v.push((String::from("HAVE_NBGL"), None)); @@ -434,7 +434,7 @@ impl SDKBuilder<'_> { name: DeviceName::NanoX, target: "thumbv6m-none-eabi", defines: { - let mut v = header2define("sdk_nanox.h"); + let mut v = header2define("csdk_nanox.h"); if env::var_os("CARGO_FEATURE_NBGL").is_some() { println!("cargo:warning=NBGL is built"); v.push((String::from("HAVE_NBGL"), None)); @@ -451,13 +451,13 @@ impl SDKBuilder<'_> { "stax" => Device { name: DeviceName::Stax, target: "thumbv8m.main-none-eabi", - defines: header2define("sdk_stax.h"), + defines: header2define("csdk_stax.h"), cflags: Vec::from(CFLAGS_STAX), }, "flex" => Device { name: DeviceName::Flex, target: "thumbv8m.main-none-eabi", - defines: header2define("sdk_flex.h"), + defines: header2define("csdk_flex.h"), cflags: Vec::from(CFLAGS_FLEX), }, _ => { @@ -702,7 +702,7 @@ impl SDKBuilder<'_> { // Target specific files let csdk_target_name = self.device.name.to_string(); - let header = format!("sdk_{csdk_target_name}.h"); + let header = format!("csdk_{csdk_target_name}.h"); bindings = bindings.clang_arg(format!("-I{bsdk}/target/{csdk_target_name}/include/")); bindings = bindings.header(header); diff --git a/ledger_secure_sdk_sys/sdk_flex.h b/ledger_secure_sdk_sys/csdk_flex.h similarity index 100% rename from ledger_secure_sdk_sys/sdk_flex.h rename to ledger_secure_sdk_sys/csdk_flex.h diff --git a/ledger_secure_sdk_sys/sdk_nanos.h b/ledger_secure_sdk_sys/csdk_nanos.h similarity index 100% rename from ledger_secure_sdk_sys/sdk_nanos.h rename to ledger_secure_sdk_sys/csdk_nanos.h diff --git a/ledger_secure_sdk_sys/sdk_nanos2.h b/ledger_secure_sdk_sys/csdk_nanos2.h similarity index 100% rename from ledger_secure_sdk_sys/sdk_nanos2.h rename to ledger_secure_sdk_sys/csdk_nanos2.h diff --git a/ledger_secure_sdk_sys/sdk_nanox.h b/ledger_secure_sdk_sys/csdk_nanox.h similarity index 100% rename from ledger_secure_sdk_sys/sdk_nanox.h rename to ledger_secure_sdk_sys/csdk_nanox.h diff --git a/ledger_secure_sdk_sys/sdk_stax.h b/ledger_secure_sdk_sys/csdk_stax.h similarity index 100% rename from ledger_secure_sdk_sys/sdk_stax.h rename to ledger_secure_sdk_sys/csdk_stax.h From b5fd671cc13be0cb776d27f797543b32e8535ce8 Mon Sep 17 00:00:00 2001 From: GroM Date: Fri, 14 Feb 2025 14:39:01 +0100 Subject: [PATCH 20/29] Move linker files from sdk crate to sys crate --- ledger_device_sdk/build.rs | 43 ------------------- ledger_secure_sdk_sys/build.rs | 18 ++++++++ .../link.ld | 0 .../nanos_layout.ld | 0 .../nanosplus_layout.ld | 0 .../nanox_layout.ld | 0 .../stax_flex_layout.ld | 0 7 files changed, 18 insertions(+), 43 deletions(-) delete mode 100644 ledger_device_sdk/build.rs rename {ledger_device_sdk => ledger_secure_sdk_sys}/link.ld (100%) rename {ledger_device_sdk => ledger_secure_sdk_sys}/nanos_layout.ld (100%) rename {ledger_device_sdk => ledger_secure_sdk_sys}/nanosplus_layout.ld (100%) rename {ledger_device_sdk => ledger_secure_sdk_sys}/nanox_layout.ld (100%) rename {ledger_device_sdk => ledger_secure_sdk_sys}/stax_flex_layout.ld (100%) diff --git a/ledger_device_sdk/build.rs b/ledger_device_sdk/build.rs deleted file mode 100644 index 1c4d50d4..00000000 --- a/ledger_device_sdk/build.rs +++ /dev/null @@ -1,43 +0,0 @@ -use std::path::PathBuf; -use std::{env, error::Error}; - -fn main() -> Result<(), Box> { - enum Device { - NanoS, - NanoSPlus, - NanoX, - Stax, - Flex, - } - use Device::*; - - // determine device - let device = match env::var_os("CARGO_CFG_TARGET_OS").unwrap().to_str().unwrap() { - "nanos" => NanoS, - "nanosplus" => NanoSPlus, - "nanox" => NanoX, - "stax" => Stax, - "flex" => Flex, - target_name => panic!( - "invalid target `{target_name}`, expected one of `nanos`, `nanox`, `nanosplus`, `stax` or `flex`. Run with `-Z build-std=core --target=./.json`" - ), - }; - - // Copy this crate's linker script into the working directory of - // the application so that it can be used there for the layout. - // Trick taken from https://docs.rust-embedded.org/embedonomicon/main.html - let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap()); - - // extend the library search path - println!("cargo:rustc-link-search={}", out_dir.display()); - // copy - let linkerscript = match device { - NanoS => "nanos_layout.ld", - NanoX => "nanox_layout.ld", - NanoSPlus => "nanosplus_layout.ld", - Stax | Flex => "stax_flex_layout.ld", - }; - std::fs::copy(linkerscript, out_dir.join(linkerscript))?; - std::fs::copy("link.ld", out_dir.join("link.ld"))?; - Ok(()) -} diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index d35e5256..d2eb6258 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -803,6 +803,23 @@ impl SDKBuilder<'_> { .expect("Unable to write file"); Ok(()) } + + fn copy_linker_script(&self) -> Result<(), SDKBuildError> { + let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap()); + // extend the library search path + println!("cargo:rustc-link-search={}", out_dir.display()); + // copy + let linkerscript = match self.device.name { + DeviceName::NanoS => "nanos_layout.ld", + DeviceName::NanoX => "nanox_layout.ld", + DeviceName::NanoSPlus => "nanosplus_layout.ld", + DeviceName::Stax => "stax_flex_layout.ld", + DeviceName::Flex => "stax_flex_layout.ld", + }; + std::fs::copy(linkerscript, out_dir.join(linkerscript)).unwrap(); + std::fs::copy("link.ld", out_dir.join("link.ld")).unwrap(); + Ok(()) + } } fn main() { @@ -816,6 +833,7 @@ fn main() { sdk_builder.build_c_sdk().unwrap(); sdk_builder.generate_bindings().unwrap(); sdk_builder.generate_heap_size().unwrap(); + sdk_builder.copy_linker_script().unwrap(); let end = start.elapsed(); println!( "cargo:warning=Total build.rs time: {} seconds", diff --git a/ledger_device_sdk/link.ld b/ledger_secure_sdk_sys/link.ld similarity index 100% rename from ledger_device_sdk/link.ld rename to ledger_secure_sdk_sys/link.ld diff --git a/ledger_device_sdk/nanos_layout.ld b/ledger_secure_sdk_sys/nanos_layout.ld similarity index 100% rename from ledger_device_sdk/nanos_layout.ld rename to ledger_secure_sdk_sys/nanos_layout.ld diff --git a/ledger_device_sdk/nanosplus_layout.ld b/ledger_secure_sdk_sys/nanosplus_layout.ld similarity index 100% rename from ledger_device_sdk/nanosplus_layout.ld rename to ledger_secure_sdk_sys/nanosplus_layout.ld diff --git a/ledger_device_sdk/nanox_layout.ld b/ledger_secure_sdk_sys/nanox_layout.ld similarity index 100% rename from ledger_device_sdk/nanox_layout.ld rename to ledger_secure_sdk_sys/nanox_layout.ld diff --git a/ledger_device_sdk/stax_flex_layout.ld b/ledger_secure_sdk_sys/stax_flex_layout.ld similarity index 100% rename from ledger_device_sdk/stax_flex_layout.ld rename to ledger_secure_sdk_sys/stax_flex_layout.ld From 74756bb6fbc1457115805bae026f513c4def202c Mon Sep 17 00:00:00 2001 From: GroM Date: Fri, 14 Feb 2025 15:26:11 +0100 Subject: [PATCH 21/29] Set the C SDK path in Device --- ledger_secure_sdk_sys/build.rs | 91 +++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 39 deletions(-) diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index d2eb6258..7ff88a76 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -106,6 +106,7 @@ enum DeviceName { #[derive(Debug, Default)] struct Device<'a> { pub name: DeviceName, + pub c_sdk: PathBuf, pub target: &'a str, pub defines: Vec<(String, Option)>, pub cflags: Vec<&'a str>, @@ -276,8 +277,8 @@ fn retrieve_target_file_infos( } /// Fetch the appropriate C SDK to build -fn clone_sdk(device: &Device) -> PathBuf { - let (repo_url, sdk_branch) = match device.name { +fn clone_sdk(devicename: &DeviceName) -> PathBuf { + let (repo_url, sdk_branch) = match devicename { DeviceName::NanoS => ( Path::new("https://github.com/LedgerHQ/ledger-secure-sdk"), "API_LEVEL_LNS", @@ -357,7 +358,6 @@ fn header2define(headername: &str) -> Vec<(String, Option)> { } struct SDKBuilder<'a> { - bolos_sdk: PathBuf, api_level: u32, gcc_toolchain: PathBuf, device: Device<'a>, @@ -368,7 +368,6 @@ struct SDKBuilder<'a> { impl SDKBuilder<'_> { pub fn new() -> Self { SDKBuilder { - bolos_sdk: PathBuf::new(), api_level: 0, gcc_toolchain: PathBuf::new(), device: Device::default(), @@ -400,6 +399,7 @@ impl SDKBuilder<'_> { } pub fn device(&mut self) -> Result<(), SDKBuildError> { + println!("cargo:rerun-if-env-changed=LEDGER_SDK_PATH"); // determine device self.device = match env::var_os("CARGO_CFG_TARGET_OS") .unwrap() @@ -408,12 +408,14 @@ impl SDKBuilder<'_> { { "nanos" => Device { name: DeviceName::NanoS, + c_sdk: Default::default(), target: "thumbv6m-none-eabi", defines: header2define("csdk_nanos.h"), cflags: Vec::from(CFLAGS_NANOS), }, "nanosplus" => Device { name: DeviceName::NanoSPlus, + c_sdk: Default::default(), target: "thumbv8m.main-none-eabi", defines: { let mut v = header2define("csdk_nanos2.h"); @@ -432,6 +434,7 @@ impl SDKBuilder<'_> { }, "nanox" => Device { name: DeviceName::NanoX, + c_sdk: Default::default(), target: "thumbv6m-none-eabi", defines: { let mut v = header2define("csdk_nanox.h"); @@ -450,12 +453,14 @@ impl SDKBuilder<'_> { }, "stax" => Device { name: DeviceName::Stax, + c_sdk: Default::default(), target: "thumbv8m.main-none-eabi", defines: header2define("csdk_stax.h"), cflags: Vec::from(CFLAGS_STAX), }, "flex" => Device { name: DeviceName::Flex, + c_sdk: Default::default(), target: "thumbv8m.main-none-eabi", defines: header2define("csdk_flex.h"), cflags: Vec::from(CFLAGS_FLEX), @@ -465,6 +470,12 @@ impl SDKBuilder<'_> { } }; + // set the C SDK path + self.device.c_sdk = match env::var("LEDGER_SDK_PATH") { + Err(_) => clone_sdk(&self.device.name), + Ok(path) => PathBuf::from(path), + }; + // export TARGET into env for 'infos.rs' println!("cargo:rustc-env=TARGET={}", self.device.name); println!("cargo:warning=Device is {:?}", self.device.name); @@ -472,13 +483,8 @@ impl SDKBuilder<'_> { } pub fn bolos_sdk(&mut self) -> Result<(), SDKBuildError> { - println!("cargo:rerun-if-env-changed=LEDGER_SDK_PATH"); - self.bolos_sdk = match env::var("LEDGER_SDK_PATH") { - Err(_) => clone_sdk(&self.device), - Ok(path) => PathBuf::from(path), - }; - - let sdk_info = retrieve_csdk_info(&self.device, &self.bolos_sdk)?; + // Retrieve the C SDK infos + let sdk_info = retrieve_csdk_info(&self.device, &self.device.c_sdk)?; match sdk_info.api_level { Some(api_level) => { self.api_level = api_level; @@ -497,23 +503,23 @@ impl SDKBuilder<'_> { match self.device.name { DeviceName::Flex => { self.glyphs_folders - .push(self.bolos_sdk.join("lib_nbgl/glyphs/wallet")); + .push(self.device.c_sdk.join("lib_nbgl/glyphs/wallet")); self.glyphs_folders - .push(self.bolos_sdk.join("lib_nbgl/glyphs/64px")); + .push(self.device.c_sdk.join("lib_nbgl/glyphs/64px")); self.glyphs_folders - .push(self.bolos_sdk.join("lib_nbgl/glyphs/40px")); + .push(self.device.c_sdk.join("lib_nbgl/glyphs/40px")); } DeviceName::Stax => { self.glyphs_folders - .push(self.bolos_sdk.join("lib_nbgl/glyphs/wallet")); + .push(self.device.c_sdk.join("lib_nbgl/glyphs/wallet")); self.glyphs_folders - .push(self.bolos_sdk.join("lib_nbgl/glyphs/64px")); + .push(self.device.c_sdk.join("lib_nbgl/glyphs/64px")); self.glyphs_folders - .push(self.bolos_sdk.join("lib_nbgl/glyphs/32px")); + .push(self.device.c_sdk.join("lib_nbgl/glyphs/32px")); } _ => { self.glyphs_folders - .push(self.bolos_sdk.join("lib_nbgl/glyphs/nano")); + .push(self.device.c_sdk.join("lib_nbgl/glyphs/nano")); } } @@ -532,7 +538,7 @@ impl SDKBuilder<'_> { } fn cxdefines(&mut self) -> Result<(), SDKBuildError> { - let mut makefile = File::open(self.bolos_sdk.join("Makefile.conf.cx")) + let mut makefile = File::open(self.device.c_sdk.join("Makefile.conf.cx")) .expect("Could not find Makefile.conf.cx"); let mut content = String::new(); makefile.read_to_string(&mut content).unwrap(); @@ -555,7 +561,7 @@ impl SDKBuilder<'_> { return Err(SDKBuildError::UnsupportedDevice); } - let icon2glyph = self.bolos_sdk.join("lib_nbgl/tools/icon2glyph.py"); + let icon2glyph = self.device.c_sdk.join("lib_nbgl/tools/icon2glyph.py"); let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); let dest_path = out_path.join("glyphs"); @@ -591,21 +597,23 @@ impl SDKBuilder<'_> { command .files(&AUX_C_FILES) - .files(str2path(&self.bolos_sdk, &SDK_C_FILES)) - .files(str2path(&self.bolos_sdk, &SDK_USB_FILES)); + .files(str2path(&self.device.c_sdk, &SDK_C_FILES)) + .files(str2path(&self.device.c_sdk, &SDK_USB_FILES)); command = command .include(self.gcc_toolchain.join("include")) - .include(self.bolos_sdk.join("include")) - .include(self.bolos_sdk.join("lib_cxng/include")) - .include(self.bolos_sdk.join("lib_stusb")) - .include(self.bolos_sdk.join("lib_stusb_impl")) + .include(self.device.c_sdk.join("include")) + .include(self.device.c_sdk.join("lib_cxng/include")) + .include(self.device.c_sdk.join("lib_stusb")) + .include(self.device.c_sdk.join("lib_stusb_impl")) .include( - self.bolos_sdk + self.device + .c_sdk .join("lib_stusb/STM32_USB_Device_Library/Core/Inc"), ) .include( - self.bolos_sdk + self.device + .c_sdk .join("lib_stusb/STM32_USB_Device_Library/Class/HID/Inc"), ) .debug(true) @@ -623,17 +631,18 @@ impl SDKBuilder<'_> { } command.target(self.device.target).include( - self.bolos_sdk + self.device + .c_sdk .join(format!("target/{}/include", self.device.name)), ); // Configure BLE and NBGL for s in self.device.defines.iter() { if s.0 == "HAVE_BLE" { - configure_lib_ble(&mut command, &self.bolos_sdk); + configure_lib_ble(&mut command, &self.device.c_sdk); } if s.0 == "HAVE_NBGL" { - configure_lib_nbgl(&mut command, &self.bolos_sdk); + configure_lib_nbgl(&mut command, &self.device.c_sdk); } } @@ -644,8 +653,8 @@ impl SDKBuilder<'_> { command.compile("ledger-secure-sdk"); - /* Link with libc for unresolved symbols */ - let mut path = self.bolos_sdk.display().to_string(); + /* Link with libc, libm and libgcc */ + let mut path = self.device.c_sdk.display().to_string(); match self.device.name { DeviceName::NanoS => { path = self.gcc_toolchain.display().to_string(); @@ -666,7 +675,7 @@ impl SDKBuilder<'_> { } fn generate_bindings(&self) -> Result<(), SDKBuildError> { - let bsdk = self.bolos_sdk.display().to_string(); + let bsdk = self.device.c_sdk.display().to_string(); let gcc_tc = self.gcc_toolchain.display().to_string(); let args = [ "--target=thumbv6m-none-eabi".to_string(), // exact target is irrelevant for bindings @@ -678,7 +687,7 @@ impl SDKBuilder<'_> { format!("-I{bsdk}/lib_stusb/"), ]; let headers = str2path( - &self.bolos_sdk, + &self.device.c_sdk, &[ "lib_cxng/include/libcxng.h", /* cxlib */ "include/os.h", /* syscalls */ @@ -715,7 +724,8 @@ impl SDKBuilder<'_> { // BAGL or NBGL bindings match self.device.name { DeviceName::NanoS => { - bindings = bindings.header(self.bolos_sdk.join("include/bagl.h").to_str().unwrap()) + bindings = + bindings.header(self.device.c_sdk.join("include/bagl.h").to_str().unwrap()) } DeviceName::NanoSPlus | DeviceName::NanoX | DeviceName::Stax | DeviceName::Flex => { if ((self.device.name == DeviceName::NanoX @@ -736,13 +746,15 @@ impl SDKBuilder<'_> { ]); bindings = bindings .header( - self.bolos_sdk + self.device + .c_sdk .join("lib_nbgl/include/nbgl_use_case.h") .to_str() .unwrap(), ) .header( - self.bolos_sdk + self.device + .c_sdk .join("lib_ux_nbgl/ux_nbgl.h") .to_str() .unwrap(), @@ -755,7 +767,8 @@ impl SDKBuilder<'_> { match self.device.name { DeviceName::NanoX | DeviceName::Flex | DeviceName::Stax => { bindings = bindings.header( - self.bolos_sdk + self.device + .c_sdk .join("lib_blewbxx_impl/include/ledger_ble.h") .to_str() .unwrap(), From 4a47de627bb73cb11546b2c0e76029f85e0b00a7 Mon Sep 17 00:00:00 2001 From: GroM Date: Mon, 17 Feb 2025 14:47:45 +0100 Subject: [PATCH 22/29] rename bolos_sdk as c_sdk --- ledger_secure_sdk_sys/build.rs | 82 +++++++++++++++++----------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index 7ff88a76..a8c921fe 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -148,10 +148,10 @@ fn retrieve_csdk_info(device: &Device, path: &PathBuf) -> Result (String, String) { +fn retrieve_csdk_git_info(c_sdk: &Path) -> (String, String) { let c_sdk_hash = match Command::new("git") .arg("-C") - .arg(bolos_sdk) + .arg(c_sdk) .arg("describe") .arg("--always") .arg("--dirty") @@ -173,7 +173,7 @@ fn retrieve_csdk_git_info(bolos_sdk: &Path) -> (String, String) { let c_sdk_version = match Command::new("git") .arg("-C") - .arg(bolos_sdk) + .arg(c_sdk) .arg("describe") .arg("--tags") .arg("--match") @@ -194,9 +194,9 @@ fn retrieve_csdk_git_info(bolos_sdk: &Path) -> (String, String) { (c_sdk_hash, c_sdk_version) } -fn retrieve_makefile_infos(bolos_sdk: &Path) -> Result<(Option, String), SDKBuildError> { +fn retrieve_makefile_infos(c_sdk: &Path) -> Result<(Option, String), SDKBuildError> { let makefile = - File::open(bolos_sdk.join("Makefile.defines")).expect("Could not find Makefile.defines"); + File::open(c_sdk.join("Makefile.defines")).expect("Could not find Makefile.defines"); let mut api_level: Option = None; for line in BufReader::new(makefile).lines().flatten() { if let Some(value) = line.split(":=").nth(1).map(str::trim) { @@ -210,7 +210,7 @@ fn retrieve_makefile_infos(bolos_sdk: &Path) -> Result<(Option, String), SD } } let makefile = - File::open(bolos_sdk.join("Makefile.target")).expect("Could not find Makefile.defines"); + File::open(c_sdk.join("Makefile.target")).expect("Could not find Makefile.defines"); let mut sdk_name: Option = None; for line in BufReader::new(makefile).lines().flatten() { if let Some(value) = line.split(":=").nth(1).map(str::trim) { @@ -230,14 +230,14 @@ fn retrieve_makefile_infos(bolos_sdk: &Path) -> Result<(Option, String), SD fn retrieve_target_file_infos( device: &Device, - bolos_sdk: &Path, + c_sdk: &Path, ) -> Result<(String, String), SDKBuildError> { let prefix = if device.name == DeviceName::NanoS { "".to_string() } else { format!("target/{}/", device.name) }; - let target_file_path = bolos_sdk.join(format!("{}include/bolos_target.h", prefix)); + let target_file_path = c_sdk.join(format!("{}include/bolos_target.h", prefix)); let target_file = File::open(target_file_path).map_err(|_| SDKBuildError::TargetFileNotFound)?; let mut target_id: Option = None; @@ -302,18 +302,18 @@ fn clone_sdk(devicename: &DeviceName) -> PathBuf { }; let out_dir = env::var("OUT_DIR").unwrap(); - let bolos_sdk = Path::new(out_dir.as_str()).join("ledger-secure-sdk"); - if !bolos_sdk.exists() { + let c_sdk = Path::new(out_dir.as_str()).join("ledger-secure-sdk"); + if !c_sdk.exists() { Command::new("git") .arg("clone") .arg(repo_url.to_str().unwrap()) .arg("-b") .arg(sdk_branch) - .arg(bolos_sdk.as_path()) + .arg(c_sdk.as_path()) .output() .ok(); } - bolos_sdk + c_sdk } #[derive(Debug)] @@ -326,11 +326,11 @@ enum SDKBuildError { MissingTargetName, } -/// Helper function to concatenate all paths in pathlist to bolos_sdk's path -fn str2path(bolos_sdk: &Path, pathlist: &[&str]) -> Vec { +/// Helper function to concatenate all paths in pathlist to c_sdk's path +fn str2path(c_sdk: &Path, pathlist: &[&str]) -> Vec { pathlist .iter() - .map(|p| bolos_sdk.join(p)) + .map(|p| c_sdk.join(p)) .collect::>() } @@ -482,8 +482,8 @@ impl SDKBuilder<'_> { Ok(()) } - pub fn bolos_sdk(&mut self) -> Result<(), SDKBuildError> { - // Retrieve the C SDK infos + pub fn get_info(&mut self) -> Result<(), SDKBuildError> { + // Retrieve the C SDK information let sdk_info = retrieve_csdk_info(&self.device, &self.device.c_sdk)?; match sdk_info.api_level { Some(api_level) => { @@ -840,7 +840,7 @@ fn main() { let mut sdk_builder = SDKBuilder::new(); sdk_builder.gcc_toolchain().unwrap(); sdk_builder.device().unwrap(); - sdk_builder.bolos_sdk().unwrap(); + sdk_builder.get_info().unwrap(); sdk_builder.cxdefines().unwrap(); sdk_builder.generate_glyphs().unwrap(); sdk_builder.build_c_sdk().unwrap(); @@ -854,35 +854,35 @@ fn main() { ); } -fn configure_lib_ble(command: &mut cc::Build, bolos_sdk: &Path) { +fn configure_lib_ble(command: &mut cc::Build, c_sdk: &Path) { command - .file(bolos_sdk.join("src/ledger_protocol.c")) - .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_gap_aci.c")) - .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_gatt_aci.c")) - .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_hal_aci.c")) - .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_hci_le.c")) - .file(bolos_sdk.join("lib_blewbxx/core/auto/ble_l2cap_aci.c")) - .file(bolos_sdk.join("lib_blewbxx/core/template/osal.c")) - .file(bolos_sdk.join("lib_blewbxx_impl/src/ledger_ble.c")) - .include(bolos_sdk.join("lib_blewbxx/include")) - .include(bolos_sdk.join("lib_blewbxx/core")) - .include(bolos_sdk.join("lib_blewbxx/core/auto")) - .include(bolos_sdk.join("lib_blewbxx/core/template")) - .include(bolos_sdk.join("lib_blewbxx_impl/include")); + .file(c_sdk.join("src/ledger_protocol.c")) + .file(c_sdk.join("lib_blewbxx/core/auto/ble_gap_aci.c")) + .file(c_sdk.join("lib_blewbxx/core/auto/ble_gatt_aci.c")) + .file(c_sdk.join("lib_blewbxx/core/auto/ble_hal_aci.c")) + .file(c_sdk.join("lib_blewbxx/core/auto/ble_hci_le.c")) + .file(c_sdk.join("lib_blewbxx/core/auto/ble_l2cap_aci.c")) + .file(c_sdk.join("lib_blewbxx/core/template/osal.c")) + .file(c_sdk.join("lib_blewbxx_impl/src/ledger_ble.c")) + .include(c_sdk.join("lib_blewbxx/include")) + .include(c_sdk.join("lib_blewbxx/core")) + .include(c_sdk.join("lib_blewbxx/core/auto")) + .include(c_sdk.join("lib_blewbxx/core/template")) + .include(c_sdk.join("lib_blewbxx_impl/include")); } -fn configure_lib_nbgl(command: &mut cc::Build, bolos_sdk: &Path) { +fn configure_lib_nbgl(command: &mut cc::Build, c_sdk: &Path) { let glyphs_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("glyphs"); command - .include(bolos_sdk.join("lib_nbgl/include/")) - .include(bolos_sdk.join("lib_nbgl/include/fonts/")) - .include(bolos_sdk.join("lib_ux_nbgl/")) - .include(bolos_sdk.join("qrcode/include/")) - .include(bolos_sdk.join("lib_bagl/include/")) - .file(bolos_sdk.join("lib_ux_nbgl/ux.c")) - .file(bolos_sdk.join("qrcode/src/qrcodegen.c")) + .include(c_sdk.join("lib_nbgl/include/")) + .include(c_sdk.join("lib_nbgl/include/fonts/")) + .include(c_sdk.join("lib_ux_nbgl/")) + .include(c_sdk.join("qrcode/include/")) + .include(c_sdk.join("lib_bagl/include/")) + .file(c_sdk.join("lib_ux_nbgl/ux.c")) + .file(c_sdk.join("qrcode/src/qrcodegen.c")) .files( - glob(bolos_sdk.join("lib_nbgl/src/*.c").to_str().unwrap()) + glob(c_sdk.join("lib_nbgl/src/*.c").to_str().unwrap()) .unwrap() .map(|x| x.unwrap()) .collect::>(), From 6320ef201f3fb851dee7893e835b64650f27f40f Mon Sep 17 00:00:00 2001 From: GroM Date: Mon, 17 Feb 2025 15:14:02 +0100 Subject: [PATCH 23/29] Move glyphs_folders into Device --- ledger_secure_sdk_sys/build.rs | 123 ++++++++++++++++++--------------- 1 file changed, 66 insertions(+), 57 deletions(-) diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index a8c921fe..5849b972 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -110,6 +110,7 @@ struct Device<'a> { pub target: &'a str, pub defines: Vec<(String, Option)>, pub cflags: Vec<&'a str>, + pub glyphs_folders: Vec, } impl std::fmt::Display for DeviceName { @@ -316,6 +317,31 @@ fn clone_sdk(devicename: &DeviceName) -> PathBuf { c_sdk } +pub fn generate_glyphs(c_sdk: &PathBuf, glyphs_folders: &[PathBuf]) { + let icon2glyph = c_sdk.join("lib_nbgl/tools/icon2glyph.py"); + + let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); + let dest_path = out_path.join("glyphs"); + if !dest_path.exists() { + fs::create_dir_all(&dest_path).ok(); + } + + let mut cmd = Command::new(icon2glyph.as_os_str()); + cmd.arg("--glyphcheader") + .arg(dest_path.join("glyphs.h").as_os_str()) + .arg("--glyphcfile") + .arg(dest_path.join("glyphs.c").as_os_str()); + + for folder in glyphs_folders.iter() { + for file in std::fs::read_dir(folder).unwrap() { + let path = file.unwrap().path(); + let path_str = path.to_str().unwrap().to_string(); + cmd.arg(path_str); + } + } + let _ = cmd.output(); +} + #[derive(Debug)] enum SDKBuildError { UnsupportedDevice, @@ -361,7 +387,6 @@ struct SDKBuilder<'a> { api_level: u32, gcc_toolchain: PathBuf, device: Device<'a>, - glyphs_folders: Vec, cxdefines: Vec, } @@ -371,7 +396,6 @@ impl SDKBuilder<'_> { api_level: 0, gcc_toolchain: PathBuf::new(), device: Device::default(), - glyphs_folders: Vec::new(), cxdefines: Vec::new(), } } @@ -412,6 +436,7 @@ impl SDKBuilder<'_> { target: "thumbv6m-none-eabi", defines: header2define("csdk_nanos.h"), cflags: Vec::from(CFLAGS_NANOS), + glyphs_folders: Vec::new(), }, "nanosplus" => Device { name: DeviceName::NanoSPlus, @@ -431,6 +456,7 @@ impl SDKBuilder<'_> { v }, cflags: Vec::from(CFLAGS_NANOSPLUS), + glyphs_folders: Vec::new(), }, "nanox" => Device { name: DeviceName::NanoX, @@ -450,6 +476,7 @@ impl SDKBuilder<'_> { v }, cflags: Vec::from(CFLAGS_NANOX), + glyphs_folders: Vec::new(), }, "stax" => Device { name: DeviceName::Stax, @@ -457,6 +484,7 @@ impl SDKBuilder<'_> { target: "thumbv8m.main-none-eabi", defines: header2define("csdk_stax.h"), cflags: Vec::from(CFLAGS_STAX), + glyphs_folders: Vec::new(), }, "flex" => Device { name: DeviceName::Flex, @@ -464,6 +492,7 @@ impl SDKBuilder<'_> { target: "thumbv8m.main-none-eabi", defines: header2define("csdk_flex.h"), cflags: Vec::from(CFLAGS_FLEX), + glyphs_folders: Vec::new(), }, _ => { return Err(SDKBuildError::UnsupportedDevice); @@ -476,6 +505,37 @@ impl SDKBuilder<'_> { Ok(path) => PathBuf::from(path), }; + // set glyphs folders + match self.device.name { + DeviceName::Flex => { + self.device + .glyphs_folders + .push(self.device.c_sdk.join("lib_nbgl/glyphs/wallet")); + self.device + .glyphs_folders + .push(self.device.c_sdk.join("lib_nbgl/glyphs/64px")); + self.device + .glyphs_folders + .push(self.device.c_sdk.join("lib_nbgl/glyphs/40px")); + } + DeviceName::Stax => { + self.device + .glyphs_folders + .push(self.device.c_sdk.join("lib_nbgl/glyphs/wallet")); + self.device + .glyphs_folders + .push(self.device.c_sdk.join("lib_nbgl/glyphs/64px")); + self.device + .glyphs_folders + .push(self.device.c_sdk.join("lib_nbgl/glyphs/32px")); + } + _ => { + self.device + .glyphs_folders + .push(self.device.c_sdk.join("lib_nbgl/glyphs/nano")); + } + } + // export TARGET into env for 'infos.rs' println!("cargo:rustc-env=TARGET={}", self.device.name); println!("cargo:warning=Device is {:?}", self.device.name); @@ -499,30 +559,6 @@ impl SDKBuilder<'_> { } } - // set glyphs folders - match self.device.name { - DeviceName::Flex => { - self.glyphs_folders - .push(self.device.c_sdk.join("lib_nbgl/glyphs/wallet")); - self.glyphs_folders - .push(self.device.c_sdk.join("lib_nbgl/glyphs/64px")); - self.glyphs_folders - .push(self.device.c_sdk.join("lib_nbgl/glyphs/40px")); - } - DeviceName::Stax => { - self.glyphs_folders - .push(self.device.c_sdk.join("lib_nbgl/glyphs/wallet")); - self.glyphs_folders - .push(self.device.c_sdk.join("lib_nbgl/glyphs/64px")); - self.glyphs_folders - .push(self.device.c_sdk.join("lib_nbgl/glyphs/32px")); - } - _ => { - self.glyphs_folders - .push(self.device.c_sdk.join("lib_nbgl/glyphs/nano")); - } - } - // Export other SDK infos into env for 'infos.rs' println!("cargo:rustc-env=TARGET_ID={}", sdk_info.target_id); println!("cargo:warning=TARGET_ID is {}", sdk_info.target_id); @@ -556,38 +592,12 @@ impl SDKBuilder<'_> { Ok(()) } - pub fn generate_glyphs(&self) -> Result<(), SDKBuildError> { - if self.device.name == DeviceName::NanoS { - return Err(SDKBuildError::UnsupportedDevice); - } - - let icon2glyph = self.device.c_sdk.join("lib_nbgl/tools/icon2glyph.py"); - - let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); - let dest_path = out_path.join("glyphs"); - if !dest_path.exists() { - fs::create_dir_all(&dest_path).ok(); - } - - let mut cmd = Command::new(icon2glyph.as_os_str()); - cmd.arg("--glyphcheader") - .arg(dest_path.join("glyphs.h").as_os_str()) - .arg("--glyphcfile") - .arg(dest_path.join("glyphs.c").as_os_str()); - - for folder in self.glyphs_folders.iter() { - for file in std::fs::read_dir(folder).unwrap() { - let path = file.unwrap().path(); - let path_str = path.to_str().unwrap().to_string(); - cmd.arg(path_str); - } + pub fn build_c_sdk(&self) -> Result<(), SDKBuildError> { + // Generate glyphs + if self.device.name != DeviceName::NanoS { + generate_glyphs(&self.device.c_sdk, &self.device.glyphs_folders); } - let _ = cmd.output(); - Ok(()) - } - - pub fn build_c_sdk(&self) -> Result<(), SDKBuildError> { let mut command = cc::Build::new(); if env::var_os("CC").is_none() { command.compiler("clang"); @@ -842,7 +852,6 @@ fn main() { sdk_builder.device().unwrap(); sdk_builder.get_info().unwrap(); sdk_builder.cxdefines().unwrap(); - sdk_builder.generate_glyphs().unwrap(); sdk_builder.build_c_sdk().unwrap(); sdk_builder.generate_bindings().unwrap(); sdk_builder.generate_heap_size().unwrap(); From 33c5b7ac864b2423c7953148f48b4f34ace283ad Mon Sep 17 00:00:00 2001 From: GroM Date: Mon, 17 Feb 2025 15:45:27 +0100 Subject: [PATCH 24/29] Set arm libs path in Device --- ledger_secure_sdk_sys/build.rs | 39 ++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index 5849b972..8967b906 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -111,6 +111,7 @@ struct Device<'a> { pub defines: Vec<(String, Option)>, pub cflags: Vec<&'a str>, pub glyphs_folders: Vec, + pub arm_libs: String, } impl std::fmt::Display for DeviceName { @@ -437,6 +438,7 @@ impl SDKBuilder<'_> { defines: header2define("csdk_nanos.h"), cflags: Vec::from(CFLAGS_NANOS), glyphs_folders: Vec::new(), + arm_libs: Default::default(), }, "nanosplus" => Device { name: DeviceName::NanoSPlus, @@ -457,6 +459,7 @@ impl SDKBuilder<'_> { }, cflags: Vec::from(CFLAGS_NANOSPLUS), glyphs_folders: Vec::new(), + arm_libs: Default::default(), }, "nanox" => Device { name: DeviceName::NanoX, @@ -477,6 +480,7 @@ impl SDKBuilder<'_> { }, cflags: Vec::from(CFLAGS_NANOX), glyphs_folders: Vec::new(), + arm_libs: Default::default(), }, "stax" => Device { name: DeviceName::Stax, @@ -485,6 +489,7 @@ impl SDKBuilder<'_> { defines: header2define("csdk_stax.h"), cflags: Vec::from(CFLAGS_STAX), glyphs_folders: Vec::new(), + arm_libs: Default::default(), }, "flex" => Device { name: DeviceName::Flex, @@ -493,6 +498,7 @@ impl SDKBuilder<'_> { defines: header2define("csdk_flex.h"), cflags: Vec::from(CFLAGS_FLEX), glyphs_folders: Vec::new(), + arm_libs: Default::default(), }, _ => { return Err(SDKBuildError::UnsupportedDevice); @@ -536,6 +542,25 @@ impl SDKBuilder<'_> { } } + // Set ARM pre-compiled libraries path + self.device.arm_libs = match self.device.name { + DeviceName::NanoS => { + let mut path = self.gcc_toolchain.display().to_string(); + path.push_str("/lib"); + path + } + DeviceName::NanoX => { + let mut path = self.device.c_sdk.display().to_string(); + path.push_str("/arch/st33/lib"); + path + } + DeviceName::NanoSPlus | DeviceName::Flex | DeviceName::Stax => { + let mut path = self.device.c_sdk.display().to_string(); + path.push_str("/arch/st33k1/lib"); + path + } + }; + // export TARGET into env for 'infos.rs' println!("cargo:rustc-env=TARGET={}", self.device.name); println!("cargo:warning=Device is {:?}", self.device.name); @@ -664,19 +689,7 @@ impl SDKBuilder<'_> { command.compile("ledger-secure-sdk"); /* Link with libc, libm and libgcc */ - let mut path = self.device.c_sdk.display().to_string(); - match self.device.name { - DeviceName::NanoS => { - path = self.gcc_toolchain.display().to_string(); - path.push_str("/lib"); - } - DeviceName::NanoX => { - path.push_str("/arch/st33/lib"); - } - DeviceName::NanoSPlus | DeviceName::Flex | DeviceName::Stax => { - path.push_str("/arch/st33k1/lib"); - } - }; + let path = self.device.arm_libs.clone(); println!("cargo:rustc-link-lib=c"); println!("cargo:rustc-link-lib=m"); println!("cargo:rustc-link-lib=gcc"); From 30f43b3f423e3f0f62247e8c7455dc1c9b96c994 Mon Sep 17 00:00:00 2001 From: GroM Date: Mon, 17 Feb 2025 15:54:16 +0100 Subject: [PATCH 25/29] Move local functions --- ledger_secure_sdk_sys/build.rs | 468 +++++++++++++++++---------------- 1 file changed, 236 insertions(+), 232 deletions(-) diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index 8967b906..84a6a09a 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -142,207 +142,6 @@ impl CSDKInfo { } } -fn retrieve_csdk_info(device: &Device, path: &PathBuf) -> Result { - let mut csdk_info = CSDKInfo::new(); - (csdk_info.api_level, csdk_info.c_sdk_name) = retrieve_makefile_infos(path)?; - (csdk_info.target_id, csdk_info.target_name) = retrieve_target_file_infos(device, path)?; - (csdk_info.c_sdk_hash, csdk_info.c_sdk_version) = retrieve_csdk_git_info(path); - Ok(csdk_info) -} - -fn retrieve_csdk_git_info(c_sdk: &Path) -> (String, String) { - let c_sdk_hash = match Command::new("git") - .arg("-C") - .arg(c_sdk) - .arg("describe") - .arg("--always") - .arg("--dirty") - .arg("--exclude") - .arg("*") - .arg("--abbrev=40") - .output() - .ok() - { - Some(output) => { - if output.stdout.is_empty() { - "None".to_string() - } else { - String::from_utf8(output.stdout).unwrap_or("None".to_string()) - } - } - None => "None".to_string(), - }; - - let c_sdk_version = match Command::new("git") - .arg("-C") - .arg(c_sdk) - .arg("describe") - .arg("--tags") - .arg("--match") - .arg("v[0-9]*") - .arg("--dirty") - .output() - .ok() - { - Some(output) => { - if output.status.success() { - String::from_utf8(output.stdout).unwrap_or("None".to_string()) - } else { - String::from_utf8(output.stderr).unwrap_or("None".to_string()) - } - } - None => "None".to_string(), - }; - (c_sdk_hash, c_sdk_version) -} - -fn retrieve_makefile_infos(c_sdk: &Path) -> Result<(Option, String), SDKBuildError> { - let makefile = - File::open(c_sdk.join("Makefile.defines")).expect("Could not find Makefile.defines"); - let mut api_level: Option = None; - for line in BufReader::new(makefile).lines().flatten() { - if let Some(value) = line.split(":=").nth(1).map(str::trim) { - if line.contains("API_LEVEL") && api_level.is_none() { - api_level = Some(value.parse().map_err(|_| SDKBuildError::InvalidAPILevel)?); - } - } - if api_level.is_some() { - // Key found, break out of the loop - break; - } - } - let makefile = - File::open(c_sdk.join("Makefile.target")).expect("Could not find Makefile.defines"); - let mut sdk_name: Option = None; - for line in BufReader::new(makefile).lines().flatten() { - if let Some(value) = line.split(":=").nth(1).map(str::trim) { - if line.contains("SDK_NAME") && sdk_name.is_none() { - sdk_name = Some(value.to_string().replace('\"', "")); - } - } - if sdk_name.is_some() { - // Key found, break out of the loop - break; - } - } - - let sdk_name = sdk_name.ok_or(SDKBuildError::MissingSDKName)?; - Ok((api_level, sdk_name)) -} - -fn retrieve_target_file_infos( - device: &Device, - c_sdk: &Path, -) -> Result<(String, String), SDKBuildError> { - let prefix = if device.name == DeviceName::NanoS { - "".to_string() - } else { - format!("target/{}/", device.name) - }; - let target_file_path = c_sdk.join(format!("{}include/bolos_target.h", prefix)); - let target_file = - File::open(target_file_path).map_err(|_| SDKBuildError::TargetFileNotFound)?; - let mut target_id: Option = None; - let mut target_name: Option = None; - - for line in BufReader::new(target_file).lines().flatten() { - if target_id.is_none() && line.contains("#define TARGET_ID") { - target_id = Some( - line.split_whitespace() - .nth(2) - .ok_or("err") - .map_err(|_| SDKBuildError::MissingTargetId)? - .to_string(), - ); - } else if target_name.is_none() - && line.contains("#define TARGET_") - && !line.contains("#define TARGET_ID") - { - target_name = Some( - line.split_whitespace() - .nth(1) - .ok_or("err") - .map_err(|_| SDKBuildError::MissingTargetName)? - .to_string(), - ); - } - - if target_id.is_some() && target_name.is_some() { - // Both tokens found, break out of the loop - break; - } - } - - let target_id = target_id.ok_or(SDKBuildError::MissingTargetId)?; - let target_name = target_name.ok_or(SDKBuildError::MissingTargetName)?; - Ok((target_id, target_name)) -} - -/// Fetch the appropriate C SDK to build -fn clone_sdk(devicename: &DeviceName) -> PathBuf { - let (repo_url, sdk_branch) = match devicename { - DeviceName::NanoS => ( - Path::new("https://github.com/LedgerHQ/ledger-secure-sdk"), - "API_LEVEL_LNS", - ), - DeviceName::NanoX => ( - Path::new("https://github.com/LedgerHQ/ledger-secure-sdk"), - "API_LEVEL_22", - ), - DeviceName::NanoSPlus => ( - Path::new("https://github.com/LedgerHQ/ledger-secure-sdk"), - "API_LEVEL_22", - ), - DeviceName::Stax => ( - Path::new("https://github.com/LedgerHQ/ledger-secure-sdk"), - "API_LEVEL_22", - ), - DeviceName::Flex => ( - Path::new("https://github.com/LedgerHQ/ledger-secure-sdk"), - "API_LEVEL_22", - ), - }; - - let out_dir = env::var("OUT_DIR").unwrap(); - let c_sdk = Path::new(out_dir.as_str()).join("ledger-secure-sdk"); - if !c_sdk.exists() { - Command::new("git") - .arg("clone") - .arg(repo_url.to_str().unwrap()) - .arg("-b") - .arg(sdk_branch) - .arg(c_sdk.as_path()) - .output() - .ok(); - } - c_sdk -} - -pub fn generate_glyphs(c_sdk: &PathBuf, glyphs_folders: &[PathBuf]) { - let icon2glyph = c_sdk.join("lib_nbgl/tools/icon2glyph.py"); - - let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); - let dest_path = out_path.join("glyphs"); - if !dest_path.exists() { - fs::create_dir_all(&dest_path).ok(); - } - - let mut cmd = Command::new(icon2glyph.as_os_str()); - cmd.arg("--glyphcheader") - .arg(dest_path.join("glyphs.h").as_os_str()) - .arg("--glyphcfile") - .arg(dest_path.join("glyphs.c").as_os_str()); - - for folder in glyphs_folders.iter() { - for file in std::fs::read_dir(folder).unwrap() { - let path = file.unwrap().path(); - let path_str = path.to_str().unwrap().to_string(); - cmd.arg(path_str); - } - } - let _ = cmd.output(); -} - #[derive(Debug)] enum SDKBuildError { UnsupportedDevice, @@ -353,37 +152,6 @@ enum SDKBuildError { MissingTargetName, } -/// Helper function to concatenate all paths in pathlist to c_sdk's path -fn str2path(c_sdk: &Path, pathlist: &[&str]) -> Vec { - pathlist - .iter() - .map(|p| c_sdk.join(p)) - .collect::>() -} - -/// Get all #define from a header file -fn header2define(headername: &str) -> Vec<(String, Option)> { - let mut headerfile = File::open(headername).unwrap(); - let mut header = String::new(); - headerfile.read_to_string(&mut header).unwrap(); - - header - .lines() - .filter_map(|line| { - if line.trim_start().starts_with("#define") { - let parts: Vec<&str> = line.split_whitespace().collect(); - match parts.len() { - 2 => Some((parts[1].to_string(), None)), - 3 => Some((parts[1].to_string(), Some(parts[2].to_string()))), - _ => None, - } - } else { - None - } - }) - .collect() -} - struct SDKBuilder<'a> { api_level: u32, gcc_toolchain: PathBuf, @@ -876,6 +644,10 @@ fn main() { ); } +// -------------------------------------------------- +// Helper functions +// -------------------------------------------------- + fn configure_lib_ble(command: &mut cc::Build, c_sdk: &Path) { command .file(c_sdk.join("src/ledger_protocol.c")) @@ -912,3 +684,235 @@ fn configure_lib_nbgl(command: &mut cc::Build, c_sdk: &Path) { .include(&glyphs_path) .file(glyphs_path.join("glyphs.c")); } + +fn retrieve_csdk_info(device: &Device, path: &PathBuf) -> Result { + let mut csdk_info = CSDKInfo::new(); + (csdk_info.api_level, csdk_info.c_sdk_name) = retrieve_makefile_infos(path)?; + (csdk_info.target_id, csdk_info.target_name) = retrieve_target_file_infos(device, path)?; + (csdk_info.c_sdk_hash, csdk_info.c_sdk_version) = retrieve_csdk_git_info(path); + Ok(csdk_info) +} + +fn retrieve_csdk_git_info(c_sdk: &Path) -> (String, String) { + let c_sdk_hash = match Command::new("git") + .arg("-C") + .arg(c_sdk) + .arg("describe") + .arg("--always") + .arg("--dirty") + .arg("--exclude") + .arg("*") + .arg("--abbrev=40") + .output() + .ok() + { + Some(output) => { + if output.stdout.is_empty() { + "None".to_string() + } else { + String::from_utf8(output.stdout).unwrap_or("None".to_string()) + } + } + None => "None".to_string(), + }; + + let c_sdk_version = match Command::new("git") + .arg("-C") + .arg(c_sdk) + .arg("describe") + .arg("--tags") + .arg("--match") + .arg("v[0-9]*") + .arg("--dirty") + .output() + .ok() + { + Some(output) => { + if output.status.success() { + String::from_utf8(output.stdout).unwrap_or("None".to_string()) + } else { + String::from_utf8(output.stderr).unwrap_or("None".to_string()) + } + } + None => "None".to_string(), + }; + (c_sdk_hash, c_sdk_version) +} + +fn retrieve_makefile_infos(c_sdk: &Path) -> Result<(Option, String), SDKBuildError> { + let makefile = + File::open(c_sdk.join("Makefile.defines")).expect("Could not find Makefile.defines"); + let mut api_level: Option = None; + for line in BufReader::new(makefile).lines().flatten() { + if let Some(value) = line.split(":=").nth(1).map(str::trim) { + if line.contains("API_LEVEL") && api_level.is_none() { + api_level = Some(value.parse().map_err(|_| SDKBuildError::InvalidAPILevel)?); + } + } + if api_level.is_some() { + // Key found, break out of the loop + break; + } + } + let makefile = + File::open(c_sdk.join("Makefile.target")).expect("Could not find Makefile.defines"); + let mut sdk_name: Option = None; + for line in BufReader::new(makefile).lines().flatten() { + if let Some(value) = line.split(":=").nth(1).map(str::trim) { + if line.contains("SDK_NAME") && sdk_name.is_none() { + sdk_name = Some(value.to_string().replace('\"', "")); + } + } + if sdk_name.is_some() { + // Key found, break out of the loop + break; + } + } + + let sdk_name = sdk_name.ok_or(SDKBuildError::MissingSDKName)?; + Ok((api_level, sdk_name)) +} + +fn retrieve_target_file_infos( + device: &Device, + c_sdk: &Path, +) -> Result<(String, String), SDKBuildError> { + let prefix = if device.name == DeviceName::NanoS { + "".to_string() + } else { + format!("target/{}/", device.name) + }; + let target_file_path = c_sdk.join(format!("{}include/bolos_target.h", prefix)); + let target_file = + File::open(target_file_path).map_err(|_| SDKBuildError::TargetFileNotFound)?; + let mut target_id: Option = None; + let mut target_name: Option = None; + + for line in BufReader::new(target_file).lines().flatten() { + if target_id.is_none() && line.contains("#define TARGET_ID") { + target_id = Some( + line.split_whitespace() + .nth(2) + .ok_or("err") + .map_err(|_| SDKBuildError::MissingTargetId)? + .to_string(), + ); + } else if target_name.is_none() + && line.contains("#define TARGET_") + && !line.contains("#define TARGET_ID") + { + target_name = Some( + line.split_whitespace() + .nth(1) + .ok_or("err") + .map_err(|_| SDKBuildError::MissingTargetName)? + .to_string(), + ); + } + + if target_id.is_some() && target_name.is_some() { + // Both tokens found, break out of the loop + break; + } + } + + let target_id = target_id.ok_or(SDKBuildError::MissingTargetId)?; + let target_name = target_name.ok_or(SDKBuildError::MissingTargetName)?; + Ok((target_id, target_name)) +} + +/// Fetch the appropriate C SDK to build +fn clone_sdk(devicename: &DeviceName) -> PathBuf { + let (repo_url, sdk_branch) = match devicename { + DeviceName::NanoS => ( + Path::new("https://github.com/LedgerHQ/ledger-secure-sdk"), + "API_LEVEL_LNS", + ), + DeviceName::NanoX => ( + Path::new("https://github.com/LedgerHQ/ledger-secure-sdk"), + "API_LEVEL_22", + ), + DeviceName::NanoSPlus => ( + Path::new("https://github.com/LedgerHQ/ledger-secure-sdk"), + "API_LEVEL_22", + ), + DeviceName::Stax => ( + Path::new("https://github.com/LedgerHQ/ledger-secure-sdk"), + "API_LEVEL_22", + ), + DeviceName::Flex => ( + Path::new("https://github.com/LedgerHQ/ledger-secure-sdk"), + "API_LEVEL_22", + ), + }; + + let out_dir = env::var("OUT_DIR").unwrap(); + let c_sdk = Path::new(out_dir.as_str()).join("ledger-secure-sdk"); + if !c_sdk.exists() { + Command::new("git") + .arg("clone") + .arg(repo_url.to_str().unwrap()) + .arg("-b") + .arg(sdk_branch) + .arg(c_sdk.as_path()) + .output() + .ok(); + } + c_sdk +} + +pub fn generate_glyphs(c_sdk: &PathBuf, glyphs_folders: &[PathBuf]) { + let icon2glyph = c_sdk.join("lib_nbgl/tools/icon2glyph.py"); + + let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); + let dest_path = out_path.join("glyphs"); + if !dest_path.exists() { + fs::create_dir_all(&dest_path).ok(); + } + + let mut cmd = Command::new(icon2glyph.as_os_str()); + cmd.arg("--glyphcheader") + .arg(dest_path.join("glyphs.h").as_os_str()) + .arg("--glyphcfile") + .arg(dest_path.join("glyphs.c").as_os_str()); + + for folder in glyphs_folders.iter() { + for file in std::fs::read_dir(folder).unwrap() { + let path = file.unwrap().path(); + let path_str = path.to_str().unwrap().to_string(); + cmd.arg(path_str); + } + } + let _ = cmd.output(); +} + +/// Helper function to concatenate all paths in pathlist to c_sdk's path +fn str2path(c_sdk: &Path, pathlist: &[&str]) -> Vec { + pathlist + .iter() + .map(|p| c_sdk.join(p)) + .collect::>() +} + +/// Get all #define from a header file +fn header2define(headername: &str) -> Vec<(String, Option)> { + let mut headerfile = File::open(headername).unwrap(); + let mut header = String::new(); + headerfile.read_to_string(&mut header).unwrap(); + + header + .lines() + .filter_map(|line| { + if line.trim_start().starts_with("#define") { + let parts: Vec<&str> = line.split_whitespace().collect(); + match parts.len() { + 2 => Some((parts[1].to_string(), None)), + 3 => Some((parts[1].to_string(), Some(parts[2].to_string()))), + _ => None, + } + } else { + None + } + }) + .collect() +} From 80a8e2e53f5bd3bb963f663d9c38648171e88aed Mon Sep 17 00:00:00 2001 From: GroM Date: Mon, 17 Feb 2025 16:04:25 +0100 Subject: [PATCH 26/29] Update linker script name in custom targets for Stax and Flex --- ledger_secure_sdk_sys/flex.json | 4 ++-- ledger_secure_sdk_sys/stax.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ledger_secure_sdk_sys/flex.json b/ledger_secure_sdk_sys/flex.json index af01a46e..e4039ab9 100644 --- a/ledger_secure_sdk_sys/flex.json +++ b/ledger_secure_sdk_sys/flex.json @@ -13,11 +13,11 @@ "panic-strategy": "abort", "pre-link-args": { "ld.lld": [ - "-Tstax_flex_layout.ld", + "-Tflex_layout.ld", "-Tlink.ld" ], "ld": [ - "-Tstax_flex_layout.ld", + "-Tflex_layout.ld", "-Tlink.ld" ] }, diff --git a/ledger_secure_sdk_sys/stax.json b/ledger_secure_sdk_sys/stax.json index c39cd3d0..035c1e11 100644 --- a/ledger_secure_sdk_sys/stax.json +++ b/ledger_secure_sdk_sys/stax.json @@ -13,11 +13,11 @@ "panic-strategy": "abort", "pre-link-args": { "ld.lld": [ - "-Tstax_flex_layout.ld", + "-Tstax_layout.ld", "-Tlink.ld" ], "ld": [ - "-Tstax_flex_layout.ld", + "-Tstax_layout.ld", "-Tlink.ld" ] }, From f0a2b823f1410360314bfcd1cf55e2f00c9bf347 Mon Sep 17 00:00:00 2001 From: GroM Date: Mon, 17 Feb 2025 16:17:30 +0100 Subject: [PATCH 27/29] Move linker script in Device --- ledger_secure_sdk_sys/build.rs | 19 +++++++++++-------- .../{stax_flex_layout.ld => flex_layout.ld} | 0 ledger_secure_sdk_sys/stax_layout.ld | 10 ++++++++++ 3 files changed, 21 insertions(+), 8 deletions(-) rename ledger_secure_sdk_sys/{stax_flex_layout.ld => flex_layout.ld} (100%) create mode 100644 ledger_secure_sdk_sys/stax_layout.ld diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index 84a6a09a..7f7ff8a4 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -112,6 +112,7 @@ struct Device<'a> { pub cflags: Vec<&'a str>, pub glyphs_folders: Vec, pub arm_libs: String, + pub linker_script: &'a str, } impl std::fmt::Display for DeviceName { @@ -207,6 +208,7 @@ impl SDKBuilder<'_> { cflags: Vec::from(CFLAGS_NANOS), glyphs_folders: Vec::new(), arm_libs: Default::default(), + linker_script: "nanos_layout.ld", }, "nanosplus" => Device { name: DeviceName::NanoSPlus, @@ -228,6 +230,7 @@ impl SDKBuilder<'_> { cflags: Vec::from(CFLAGS_NANOSPLUS), glyphs_folders: Vec::new(), arm_libs: Default::default(), + linker_script: "nanosplus_layout.ld", }, "nanox" => Device { name: DeviceName::NanoX, @@ -249,6 +252,7 @@ impl SDKBuilder<'_> { cflags: Vec::from(CFLAGS_NANOX), glyphs_folders: Vec::new(), arm_libs: Default::default(), + linker_script: "nanox_layout.ld", }, "stax" => Device { name: DeviceName::Stax, @@ -258,6 +262,7 @@ impl SDKBuilder<'_> { cflags: Vec::from(CFLAGS_STAX), glyphs_folders: Vec::new(), arm_libs: Default::default(), + linker_script: "stax_layout.ld", }, "flex" => Device { name: DeviceName::Flex, @@ -267,6 +272,7 @@ impl SDKBuilder<'_> { cflags: Vec::from(CFLAGS_FLEX), glyphs_folders: Vec::new(), arm_libs: Default::default(), + linker_script: "flex_layout.ld", }, _ => { return Err(SDKBuildError::UnsupportedDevice); @@ -613,14 +619,11 @@ impl SDKBuilder<'_> { // extend the library search path println!("cargo:rustc-link-search={}", out_dir.display()); // copy - let linkerscript = match self.device.name { - DeviceName::NanoS => "nanos_layout.ld", - DeviceName::NanoX => "nanox_layout.ld", - DeviceName::NanoSPlus => "nanosplus_layout.ld", - DeviceName::Stax => "stax_flex_layout.ld", - DeviceName::Flex => "stax_flex_layout.ld", - }; - std::fs::copy(linkerscript, out_dir.join(linkerscript)).unwrap(); + std::fs::copy( + self.device.linker_script, + out_dir.join(self.device.linker_script), + ) + .unwrap(); std::fs::copy("link.ld", out_dir.join("link.ld")).unwrap(); Ok(()) } diff --git a/ledger_secure_sdk_sys/stax_flex_layout.ld b/ledger_secure_sdk_sys/flex_layout.ld similarity index 100% rename from ledger_secure_sdk_sys/stax_flex_layout.ld rename to ledger_secure_sdk_sys/flex_layout.ld diff --git a/ledger_secure_sdk_sys/stax_layout.ld b/ledger_secure_sdk_sys/stax_layout.ld new file mode 100644 index 00000000..9418ef65 --- /dev/null +++ b/ledger_secure_sdk_sys/stax_layout.ld @@ -0,0 +1,10 @@ +MEMORY +{ + FLASH (rx) : ORIGIN = 0xc0de0000, LENGTH = 400K + DATA (r) : ORIGIN = 0xc0de0000, LENGTH = 400K + SRAM (rwx) : ORIGIN = 0xda7a0000, LENGTH = 44K +} + +PAGE_SIZE = 512; +STACK_SIZE = 1500; +END_STACK = ORIGIN(SRAM) + LENGTH(SRAM); \ No newline at end of file From e226641a79358c3f5e51e13590dcc78be33ab07d Mon Sep 17 00:00:00 2001 From: GroM Date: Tue, 18 Feb 2025 16:04:23 +0100 Subject: [PATCH 28/29] Enable NBGL build for all Nano* devices --- ledger_device_sdk/src/io.rs | 4 ++++ ledger_device_sdk/src/lib.rs | 4 ++-- ledger_device_sdk/src/nbgl.rs | 4 ++++ .../src/nbgl/nbgl_home_and_settings.rs | 10 ++++++++-- ledger_secure_sdk_sys/build.rs | 16 ++++++++++++---- ledger_secure_sdk_sys/csdk_flex.h | 8 +++++++- ledger_secure_sdk_sys/csdk_nanos2.h | 8 +++++++- ledger_secure_sdk_sys/csdk_nanox.h | 8 +++++++- ledger_secure_sdk_sys/csdk_stax.h | 8 +++++++- ledger_secure_sdk_sys/link.ld | 1 + ledger_secure_sdk_sys/src/c/src.c | 14 +++++++++++++- ledger_secure_sdk_sys/src/infos.rs | 5 +++++ 12 files changed, 77 insertions(+), 13 deletions(-) diff --git a/ledger_device_sdk/src/io.rs b/ledger_device_sdk/src/io.rs index 812c62f1..2f4558f1 100644 --- a/ledger_device_sdk/src/io.rs +++ b/ledger_device_sdk/src/io.rs @@ -372,6 +372,10 @@ impl Comm { match seph::Events::from(tag) { #[cfg(not(any(target_os = "stax", target_os = "flex")))] seph::Events::ButtonPush => { + #[cfg(feature = "nbgl")] + unsafe { + ux_process_button_event(spi_buffer.as_mut_ptr()); + } let button_info = spi_buffer[3] >> 1; if let Some(btn_evt) = get_button_event(&mut self.buttons, button_info) { return Some(Event::Button(btn_evt)); diff --git a/ledger_device_sdk/src/lib.rs b/ledger_device_sdk/src/lib.rs index 380512f1..5ed408bd 100644 --- a/ledger_device_sdk/src/lib.rs +++ b/ledger_device_sdk/src/lib.rs @@ -22,9 +22,9 @@ pub mod seph; pub mod testing; -#[cfg(any(target_os = "stax", target_os = "flex"))] +#[cfg(any(target_os = "stax", target_os = "flex", feature = "nbgl"))] pub mod nbgl; -#[cfg(not(any(target_os = "stax", target_os = "flex")))] +#[cfg(not(any(target_os = "stax", target_os = "flex", feature = "nbgl")))] pub mod ui; pub mod uxapp; diff --git a/ledger_device_sdk/src/nbgl.rs b/ledger_device_sdk/src/nbgl.rs index 2ad72609..dcb86907 100644 --- a/ledger_device_sdk/src/nbgl.rs +++ b/ledger_device_sdk/src/nbgl.rs @@ -10,6 +10,7 @@ use ledger_secure_sdk_sys::*; pub mod nbgl_address_review; pub mod nbgl_choice; +#[cfg(any(target_os = "stax", target_os = "flex"))] pub mod nbgl_generic_review; pub mod nbgl_home_and_settings; pub mod nbgl_review; @@ -20,6 +21,7 @@ pub mod nbgl_streaming_review; pub use nbgl_address_review::*; pub use nbgl_choice::*; +#[cfg(any(target_os = "stax", target_os = "flex"))] pub use nbgl_generic_review::*; pub use nbgl_home_and_settings::*; pub use nbgl_review::*; @@ -105,6 +107,7 @@ unsafe extern "C" fn quit_callback() { G_ENDED = true; } +#[cfg(any(target_os = "stax", target_os = "flex"))] unsafe extern "C" fn rejected_callback() { G_RET = SyncNbgl::UxSyncRetRejected.into(); G_ENDED = true; @@ -274,6 +277,7 @@ pub enum TuneIndex { // Direct translation of the C original. This was done to // avoid compiling `os_io_seproxyhal.c` which includes many other things #[no_mangle] +#[cfg(any(target_os = "stax", target_os = "flex"))] extern "C" fn io_seproxyhal_play_tune(tune_index: u8) { let mut buffer = [0u8; 4]; let mut spi_buffer = [0u8; 128]; diff --git a/ledger_device_sdk/src/nbgl/nbgl_home_and_settings.rs b/ledger_device_sdk/src/nbgl/nbgl_home_and_settings.rs index af9eb714..cd250672 100644 --- a/ledger_device_sdk/src/nbgl/nbgl_home_and_settings.rs +++ b/ledger_device_sdk/src/nbgl/nbgl_home_and_settings.rs @@ -173,7 +173,10 @@ impl<'a> NbglHomeAndSettings { }; SWITCH_ARRAY[i].initState = state; SWITCH_ARRAY[i].token = (FIRST_USER_TOKEN + i as u32) as u8; - SWITCH_ARRAY[i].tuneId = TuneIndex::TapCasual as u8; + #[cfg(any(target_os = "stax", target_os = "flex"))] + { + SWITCH_ARRAY[i].tuneId = TuneIndex::TapCasual as u8; + } } self.content = nbgl_content_t { @@ -257,7 +260,10 @@ impl<'a> NbglHomeAndSettings { }; SWITCH_ARRAY[i].initState = state; SWITCH_ARRAY[i].token = (FIRST_USER_TOKEN + i as u32) as u8; - SWITCH_ARRAY[i].tuneId = TuneIndex::TapCasual as u8; + #[cfg(any(target_os = "stax", target_os = "flex"))] + { + SWITCH_ARRAY[i].tuneId = TuneIndex::TapCasual as u8; + } } self.content = nbgl_content_t { diff --git a/ledger_secure_sdk_sys/build.rs b/ledger_secure_sdk_sys/build.rs index 7f7ff8a4..0239f2a7 100644 --- a/ledger_secure_sdk_sys/build.rs +++ b/ledger_secure_sdk_sys/build.rs @@ -223,6 +223,7 @@ impl SDKBuilder<'_> { v.push((String::from("NBGL_USE_CASE"), None)); } else { println!("cargo:warning=BAGL is built"); + println!("cargo:rustc-env=C_SDK_GRAPHICS={}", "bagl"); v.push((String::from("HAVE_BAGL"), None)); } v @@ -245,6 +246,7 @@ impl SDKBuilder<'_> { v.push((String::from("NBGL_USE_CASE"), None)); } else { println!("cargo:warning=BAGL is built"); + println!("cargo:rustc-env=C_SDK_GRAPHICS={}", "bagl"); v.push((String::from("HAVE_BAGL"), None)); } v @@ -394,7 +396,7 @@ impl SDKBuilder<'_> { pub fn build_c_sdk(&self) -> Result<(), SDKBuildError> { // Generate glyphs if self.device.name != DeviceName::NanoS { - generate_glyphs(&self.device.c_sdk, &self.device.glyphs_folders); + generate_glyphs(&self.device); } let mut command = cc::Build::new(); @@ -669,6 +671,8 @@ fn configure_lib_ble(command: &mut cc::Build, c_sdk: &Path) { } fn configure_lib_nbgl(command: &mut cc::Build, c_sdk: &Path) { + println!("cargo:rustc-env=C_SDK_GRAPHICS={}", "nbgl"); + let glyphs_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("glyphs"); command .include(c_sdk.join("lib_nbgl/include/")) @@ -864,8 +868,8 @@ fn clone_sdk(devicename: &DeviceName) -> PathBuf { c_sdk } -pub fn generate_glyphs(c_sdk: &PathBuf, glyphs_folders: &[PathBuf]) { - let icon2glyph = c_sdk.join("lib_nbgl/tools/icon2glyph.py"); +fn generate_glyphs(device: &Device) { + let icon2glyph = device.c_sdk.join("lib_nbgl/tools/icon2glyph.py"); let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); let dest_path = out_path.join("glyphs"); @@ -879,7 +883,11 @@ pub fn generate_glyphs(c_sdk: &PathBuf, glyphs_folders: &[PathBuf]) { .arg("--glyphcfile") .arg(dest_path.join("glyphs.c").as_os_str()); - for folder in glyphs_folders.iter() { + if device.name == DeviceName::NanoSPlus || device.name == DeviceName::NanoX { + cmd.arg("--reverse"); + } + + for folder in device.glyphs_folders.iter() { for file in std::fs::read_dir(folder).unwrap() { let path = file.unwrap().path(); let path_str = path.to_str().unwrap().to_string(); diff --git a/ledger_secure_sdk_sys/csdk_flex.h b/ledger_secure_sdk_sys/csdk_flex.h index 7c64a534..b878a6ab 100644 --- a/ledger_secure_sdk_sys/csdk_flex.h +++ b/ledger_secure_sdk_sys/csdk_flex.h @@ -57,4 +57,10 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Misc //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#define HAVE_LOCAL_APDU_BUFFER \ No newline at end of file +#define HAVE_LOCAL_APDU_BUFFER + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// DEBUG C SDK +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//#define HAVE_PRINTF +//#define PRINTF mcu_usb_printf \ No newline at end of file diff --git a/ledger_secure_sdk_sys/csdk_nanos2.h b/ledger_secure_sdk_sys/csdk_nanos2.h index c4c20033..126ba21f 100644 --- a/ledger_secure_sdk_sys/csdk_nanos2.h +++ b/ledger_secure_sdk_sys/csdk_nanos2.h @@ -47,4 +47,10 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Misc //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#define HAVE_LOCAL_APDU_BUFFER \ No newline at end of file +#define HAVE_LOCAL_APDU_BUFFER + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// DEBUG C SDK +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//#define HAVE_PRINTF +//#define PRINTF mcu_usb_printf diff --git a/ledger_secure_sdk_sys/csdk_nanox.h b/ledger_secure_sdk_sys/csdk_nanox.h index 67d758c3..c6f69c1d 100644 --- a/ledger_secure_sdk_sys/csdk_nanox.h +++ b/ledger_secure_sdk_sys/csdk_nanox.h @@ -54,4 +54,10 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #define HAVE_LOCAL_APDU_BUFFER #define HAVE_SEPROXYHAL_MCU -#define HAVE_MCU_PROTECT \ No newline at end of file +#define HAVE_MCU_PROTECT + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// DEBUG C SDK +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//#define HAVE_PRINTF +//#define PRINTF mcu_usb_printf \ No newline at end of file diff --git a/ledger_secure_sdk_sys/csdk_stax.h b/ledger_secure_sdk_sys/csdk_stax.h index 85b27aa9..bfb3d7fa 100644 --- a/ledger_secure_sdk_sys/csdk_stax.h +++ b/ledger_secure_sdk_sys/csdk_stax.h @@ -55,4 +55,10 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Misc //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#define HAVE_LOCAL_APDU_BUFFER \ No newline at end of file +#define HAVE_LOCAL_APDU_BUFFER + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// DEBUG C SDK +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//#define HAVE_PRINTF +//#define PRINTF mcu_usb_printf \ No newline at end of file diff --git a/ledger_secure_sdk_sys/link.ld b/ledger_secure_sdk_sys/link.ld index 4d5fd241..5736654c 100644 --- a/ledger_secure_sdk_sys/link.ld +++ b/ledger_secure_sdk_sys/link.ld @@ -141,6 +141,7 @@ SECTIONS ledger.rust_sdk_name (INFO): { KEEP(*(ledger.rust_sdk_name)) } ledger.sdk_name (INFO): { KEEP(*(ledger.sdk_name)) } ledger.sdk_hash (INFO): { KEEP(*(ledger.sdk_hash)) } + ledger.sdk_graphics (INFO): { KEEP(*(ledger.sdk_graphics)) } } PROVIDE(_nvram = ABSOLUTE(_nvram_start)); diff --git a/ledger_secure_sdk_sys/src/c/src.c b/ledger_secure_sdk_sys/src/c/src.c index 93697eae..cef9464b 100644 --- a/ledger_secure_sdk_sys/src/c/src.c +++ b/ledger_secure_sdk_sys/src/c/src.c @@ -369,4 +369,16 @@ int c_main(int arg0) { END_TRY; } return 0; -} \ No newline at end of file +} + +#ifdef HAVE_PRINTF +void mcu_usb_prints(const char *str, unsigned int charcount) +{ + unsigned char buf[4]; + buf[0] = SEPROXYHAL_TAG_PRINTF; + buf[1] = charcount >> 8; + buf[2] = charcount; + io_seproxyhal_spi_send(buf, 3); + io_seproxyhal_spi_send((const uint8_t *) str, charcount); +} +#endif \ No newline at end of file diff --git a/ledger_secure_sdk_sys/src/infos.rs b/ledger_secure_sdk_sys/src/infos.rs index 70013478..f0550a9b 100644 --- a/ledger_secure_sdk_sys/src/infos.rs +++ b/ledger_secure_sdk_sys/src/infos.rs @@ -59,3 +59,8 @@ const_cstr!( "ledger.sdk_version", env!("C_SDK_VERSION") ); +const_cstr!( + ELF_C_SDK_GRAPHICS, + "ledger.sdk_graphics", + env!("C_SDK_GRAPHICS") +); From 9076acc6dd133e45a55ba50c1edab41f2a20ac14 Mon Sep 17 00:00:00 2001 From: GroM Date: Tue, 18 Feb 2025 17:59:54 +0100 Subject: [PATCH 29/29] Bump versions --- Cargo.lock | 6 +++--- cargo-ledger/Cargo.toml | 2 +- cargo-ledger/src/setup.rs | 2 +- ledger_device_sdk/Cargo.toml | 4 ++-- ledger_secure_sdk_sys/Cargo.toml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1f58c2f1..1c640445 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -127,7 +127,7 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cargo-ledger" -version = "1.6.0" +version = "1.7.0" dependencies = [ "cargo_metadata", "clap", @@ -474,7 +474,7 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "ledger_device_sdk" -version = "1.20.4" +version = "1.21.0" dependencies = [ "const-zero", "include_gif", @@ -489,7 +489,7 @@ dependencies = [ [[package]] name = "ledger_secure_sdk_sys" -version = "1.6.7" +version = "1.7.0" dependencies = [ "bindgen", "cc", diff --git a/cargo-ledger/Cargo.toml b/cargo-ledger/Cargo.toml index 60634adb..f05aed9a 100644 --- a/cargo-ledger/Cargo.toml +++ b/cargo-ledger/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cargo-ledger" -version = "1.6.0" +version = "1.7.0" authors = ["yhql", "agrojean-ledger", "y333"] description = "Build and sideload Ledger devices apps" categories = ["development-tools::cargo-plugins"] diff --git a/cargo-ledger/src/setup.rs b/cargo-ledger/src/setup.rs index d6705b9b..3a7f3807 100644 --- a/cargo-ledger/src/setup.rs +++ b/cargo-ledger/src/setup.rs @@ -33,7 +33,7 @@ pub fn install_targets() { let sysroot_cmd = std::str::from_utf8(&sysroot_cmd).unwrap().trim(); let target_files_url = Path::new( - "https://raw.githubusercontent.com/LedgerHQ/ledger-device-rust-sdk/y333/nbgl_support_for_nanos/ledger_secure_sdk_sys" + "https://raw.githubusercontent.com/LedgerHQ/ledger-device-rust-sdk/refs/tags/ledger_secure_sdk_sys%401.7.0/ledger_secure_sdk_sys" ); let sysroot = Path::new(sysroot_cmd).join("lib").join("rustlib"); diff --git a/ledger_device_sdk/Cargo.toml b/ledger_device_sdk/Cargo.toml index 3de4c95a..4884a199 100644 --- a/ledger_device_sdk/Cargo.toml +++ b/ledger_device_sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ledger_device_sdk" -version = "1.20.4" +version = "1.21.0" authors = ["yhql", "yogh333", "agrojean-ledger", "kingofpayne"] edition = "2021" license.workspace = true @@ -21,7 +21,7 @@ rand_core = { version = "0.6.3", default-features = false } zeroize = { version = "1.6.0", default-features = false } numtoa = "0.2.4" const-zero = "0.1.1" -ledger_secure_sdk_sys = { path = "../ledger_secure_sdk_sys", version = "1.6.7" } +ledger_secure_sdk_sys = { path = "../ledger_secure_sdk_sys", version = "1.7.0" } [features] debug = [] diff --git a/ledger_secure_sdk_sys/Cargo.toml b/ledger_secure_sdk_sys/Cargo.toml index 5ea5adaa..10570a10 100644 --- a/ledger_secure_sdk_sys/Cargo.toml +++ b/ledger_secure_sdk_sys/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ledger_secure_sdk_sys" -version = "1.6.7" +version = "1.7.0" authors = ["yhql", "agrojean-ledger", "yogh333"] edition = "2021" license.workspace = true