#![no_std]
#![cfg_attr(test, no_main)]
#![feature(custom_test_frameworks)]
#![reexport_test_harness_main = "test_main"]
#![test_runner(testing::sdk_test_runner)]
#![allow(incomplete_features)]
#![feature(generic_const_exprs)]
#![feature(cfg_version)]
#![feature(const_option_ops)]
#![feature(const_trait_impl)]
mod app_info;
pub mod ecc;
pub mod hash;
pub mod hmac;
pub(crate) mod io_callbacks;
pub(crate) mod io_legacy;
#[cfg(feature = "io_new")]
pub(crate) mod io_new;
pub mod io {
#[cfg(not(feature = "io_new"))]
pub use super::io_legacy::*;
#[cfg(feature = "io_new")]
pub use super::io_new::*;
}
#[cfg(not(feature = "io_new"))]
pub mod libcall;
pub mod log;
pub mod math;
pub mod nvm;
pub mod pki;
pub mod random;
pub mod screen;
pub mod seph;
pub mod testing;
pub mod tlv;
#[cfg(any(
target_os = "stax",
target_os = "flex",
target_os = "apex_p",
feature = "nano_nbgl"
))]
pub mod nbgl;
#[cfg(all(
any(target_os = "nanosplus", target_os = "nanox"),
not(feature = "nano_nbgl")
))]
pub mod ui;
pub mod uxapp;
use core::panic::PanicInfo;
#[inline]
pub fn exiting_panic(_info: &PanicInfo) -> ! {
let mut comm = io_legacy::Comm::new();
comm.reply(io_legacy::StatusWords::Panic);
ledger_secure_sdk_sys::exit_app(0);
}
pub use ledger_secure_sdk_sys::buttons;
pub use ledger_secure_sdk_sys::exit_app;
pub use include_gif::include_gif;
#[cfg(feature = "sys")]
pub use ledger_secure_sdk_sys as sys;
use ledger_secure_sdk_sys::{pic_rs, pic_rs_mut};
#[macro_export]
macro_rules! set_panic {
($f:expr) => {
use core::panic::PanicInfo;
#[panic_handler]
fn panic(info: &PanicInfo) -> ! {
$f(info)
}
};
}
extern "C" {
fn c_main();
}
#[link_section = ".boot"]
#[no_mangle]
pub extern "C" fn _start() -> ! {
unsafe { c_main() };
ledger_secure_sdk_sys::exit_app(1);
}
pub struct Pic<T> {
data: T,
}
impl<T> Pic<T> {
pub const fn new(data: T) -> Pic<T> {
Pic { data }
}
pub fn get_ref(&self) -> &T {
pic_rs(&self.data)
}
pub fn get_mut(&mut self) -> &mut T {
pic_rs_mut(&mut self.data)
}
}
extern "C" {
fn _nvm_data_start();
}
pub struct NVMData<T> {
data: T,
}
impl<T> NVMData<T> {
pub const fn new(data: T) -> NVMData<T> {
NVMData { data }
}
fn get_addr(&self) -> *mut T {
use core::arch::asm;
unsafe {
let addr = &self.data as *const T as u32;
let static_base: u32;
asm!( "mov {}, r9", out(reg) static_base);
let offset = (addr - static_base) as isize;
let data_addr = (_nvm_data_start as *const u8).offset(offset);
ledger_secure_sdk_sys::pic(data_addr as *mut core::ffi::c_void) as *mut T
}
}
pub fn get_mut(&mut self) -> &mut T {
unsafe {
let pic_addr = self.get_addr();
&mut *pic_addr.cast()
}
}
pub fn get_ref(&self) -> &T {
unsafe {
let pic_addr = self.get_addr();
&*pic_addr.cast()
}
}
}
#[cfg(test)]
#[no_mangle]
fn sample_main() {
test_main();
}