From 547b1170ddc07b274deaba79049e44be5e93a181 Mon Sep 17 00:00:00 2001 From: neithanmo Date: Wed, 13 Mar 2024 10:47:31 -0600 Subject: [PATCH] wip: bls signature in rust --- app/.gitignore | 9 +- app/Makefile | 19 +- app/rust/.cargo/config | 13 ++ app/rust/Cargo.lock | 375 +++++++++++++++++++++++++++++++++++++++ app/rust/Cargo.toml | 41 +++++ app/rust/clippy.toml | 3 + app/rust/include/rslib.h | 10 ++ app/rust/src/lib.rs | 31 ++++ app/rust/toolchain.toml | 2 + 9 files changed, 495 insertions(+), 8 deletions(-) create mode 100644 app/rust/.cargo/config create mode 100644 app/rust/Cargo.lock create mode 100644 app/rust/Cargo.toml create mode 100644 app/rust/clippy.toml create mode 100644 app/rust/include/rslib.h create mode 100644 app/rust/src/lib.rs create mode 100644 app/rust/toolchain.toml diff --git a/app/.gitignore b/app/.gitignore index 338ec878..e9b2eef7 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -38,7 +38,14 @@ cmake-build-debug/ \.idea/workspace\.xml \.idea/ - +src/ledger/bin/ +src/ledger/debug/ +src/ledger/obj/ +obj/app\.elf +debug/app\.map +debug/app\.asm +bin/app\.hex +bin/app\.elf glyphs/glyphs\.h glyphs/glyphs\.c obj/ diff --git a/app/Makefile b/app/Makefile index eacf62e5..723ac345 100755 --- a/app/Makefile +++ b/app/Makefile @@ -58,6 +58,7 @@ APP_LOAD_PARAMS = --curve secp256k1 $(COMMON_LOAD_PARAMS) --path $(APPPATH) APP_STACK_MIN_SIZE := 3000 include $(CURDIR)/../deps/ledger-zxlib/makefiles/Makefile.devices +RUST_TARGET := thumbv6m-none-eabi $(info TARGET_NAME = [$(TARGET_NAME)]) $(info ICONNAME = [$(ICONNAME)]) @@ -70,19 +71,19 @@ include $(CURDIR)/../deps/ledger-zxlib/makefiles/Makefile.platform CFLAGS += -Wvla -Wno-implicit-fallthrough CFLAGS += -I$(MY_DIR)/../deps/tinycbor/src APP_SOURCE_PATH += $(MY_DIR)/../deps/tinycbor-ledger +LDFLAGS += -z muldefs +LDLIBS += -Lrust/target/$(RUST_TARGET)/release -lrslib +APP_SOURCE_PATH += $(MY_DIR)/rust/include + +APP_CUSTOM_LINK_DEPENDENCIES = rust .PHONY: rust rust: - @echo "No rust code" -# cd rust && CARGO_HOME="$(CURDIR)/rust/.cargo" cargo build --target thumbv6m-none-eabi --release - -# Before linking, we need to be sure rust lib is there -bin/app.elf: rust + cd rust && RUSTC_BOOTSTRAP=1 CARGO_HOME="$(CURDIR)/rust/.cargo" cargo build --target $(RUST_TARGET) --release .PHONY: rust_clean rust_clean: - @echo "No rust code" -# cd rust && CARGO_HOME="$(CURDIR)/rust/.cargo" cargo clean + cd rust && CARGO_HOME="$(CURDIR)/rust/.cargo" cargo clean clean: rust_clean @@ -101,3 +102,7 @@ listvariants: .PHONY: version version: @echo "v$(APPVERSION)" > app.version + +.PHONY: rust_tests +rust_tests: + cd rust && CARGO_HOME="$(CURDIR)/rust/.cargo" cargo test diff --git a/app/rust/.cargo/config b/app/rust/.cargo/config new file mode 100644 index 00000000..3cd360aa --- /dev/null +++ b/app/rust/.cargo/config @@ -0,0 +1,13 @@ +[build] + +[target.'cfg(all(target_arch = "arm", target_os = "none"))'] +rustflags = [ + "--emit", "asm", + "-C", "relocation-model=ropi", + "-C", "link-arg=-nostartfiles", + "-C", "link-arg=-Tlink.ld", + "-C", "inline-threshold=0" +] +[unstable] +build-std=["core"] +build-std-features=["panic_immediate_abort"] diff --git a/app/rust/Cargo.lock b/app/rust/Cargo.lock new file mode 100644 index 00000000..de3e40ed --- /dev/null +++ b/app/rust/Cargo.lock @@ -0,0 +1,375 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bls12_381" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3c196a77437e7cc2fb515ce413a6401291578b5afc8ecb29a3c7ab957f05941" +dependencies = [ + "digest", + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "critical-section" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version", + "spin", + "stable_deref_trait", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "ic-verify-bls-signature" +version = "0.2.0" +source = "git+https://github.com/Zondax/verify-bls-signatures.git?branch=feat/ledger#6f8a4cab8e5973d9f7acff9c3cdaa0b195e762a2" +dependencies = [ + "bls12_381", + "pairing", + "rand", + "sha2", +] + +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "no-std-compat" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "pairing" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135590d8bdba2b31346f9cd1fb2a912329f5135e832a4f422942eb6ead8b6b3b" +dependencies = [ + "group", +] + +[[package]] +name = "proc-macro2" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "rslib" +version = "0.1.0" +dependencies = [ + "base64", + "hex", + "ic-verify-bls-signature", + "no-std-compat", + "serde", + "serde-json-core", + "serde_json", + "sha2", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "ryu" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" + +[[package]] +name = "serde" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-json-core" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8014aeea272bca0f0779778d43253f2f3375b414185b30e6ecc4d3e4a9994781" +dependencies = [ + "heapless", + "ryu", + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer", + "cfg-if", + "cpufeatures", + "digest", + "opaque-debug", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[package]] +name = "syn" +version = "2.0.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" diff --git a/app/rust/Cargo.toml b/app/rust/Cargo.toml new file mode 100644 index 00000000..bdb79ae5 --- /dev/null +++ b/app/rust/Cargo.toml @@ -0,0 +1,41 @@ +[package] +authors = ["Zondax GmbH "] +name = "rslib" +version = "0.1.0" +edition = "2021" +readme = "README.md" +resolver = "2" + + +[lib] +name = "rslib" +crate-type = ["staticlib"] + +[dependencies] +no-std-compat = { version = "0.4.1" } +# bls_signature = { path = "../../../verify-bls-signatures", default-features = false, package = "ic-verify-bls-signature" } +# bls_signature = { path = "../verify-bls-signatures", default-features = false, package = "ic-verify-bls-signature" } +bls_signature = { git = "https://github.com/Zondax/verify-bls-signatures.git", branch = "feat/ledger", package = "ic-verify-bls-signature", default-features = false } + +[dev-dependencies] +no-std-compat = { version = "0.4.1", features = ["std"] } +serde_json = "1.0.56" +hex = { version = "0.4" } +serde-json-core = { version = "0.4.0", features = ["std"] } +serde = { version = "1.0", default-features = false, features = ["derive"] } +sha2 = { version = "0.9.1" } +base64 = { version = "0.13.0" } + + +[target.'cfg(fuzzing)'.dependencies] +sha2 = { version = "0.9.1" } +no-std-compat = { version = "0.4.1", features = ["std"] } + +[profile.release] +lto = false +codegen-units = 1 +debug = false +opt-level = "z" + +[profile.dev] +panic = "abort" diff --git a/app/rust/clippy.toml b/app/rust/clippy.toml new file mode 100644 index 00000000..bebe7344 --- /dev/null +++ b/app/rust/clippy.toml @@ -0,0 +1,3 @@ + + +#enum-variant-size-threshold = 544 diff --git a/app/rust/include/rslib.h b/app/rust/include/rslib.h new file mode 100644 index 00000000..fae087cc --- /dev/null +++ b/app/rust/include/rslib.h @@ -0,0 +1,10 @@ +#pragma once + +#include +#include "parser_common.h" +#include "parser_txdef.h" + + +uint16_t bls_sign(const uint8_t *msg, uint16_t msg_len, const uint8_t *sk, uint8_t *sig); + + diff --git a/app/rust/src/lib.rs b/app/rust/src/lib.rs new file mode 100644 index 00000000..7d2477a3 --- /dev/null +++ b/app/rust/src/lib.rs @@ -0,0 +1,31 @@ +#![no_std] +#![no_builtins] +#![macro_use] +#![allow(dead_code)] +#![deny(unused_crate_dependencies)] + +extern crate no_std_compat as std; + +use bls_signature::PublicKey; + +fn debug(_msg: &str) {} + +#[cfg(not(any(test, fuzzing)))] +use core::panic::PanicInfo; + +#[cfg(not(any(test, fuzzing)))] +#[panic_handler] +fn panic(_info: &PanicInfo) -> ! { + loop {} +} + +// uint16_t bls_sign(const uint8_t *msg, uint16_t msg_len, const uint8_t *sk, uint8_t *sig); +#[no_mangle] +pub unsafe extern "C" fn bls_sign( + msg: *const u8, + msg_len: u16, + sk: *const u8, + sig: *const u8, +) -> u16 { + PublicKey::BYTES as u16 +} diff --git a/app/rust/toolchain.toml b/app/rust/toolchain.toml new file mode 100644 index 00000000..20fe888c --- /dev/null +++ b/app/rust/toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +components = ["rust-src"]