From a8885ecf83aabb539c76397dfc88d9578d0f2224 Mon Sep 17 00:00:00 2001 From: Georges Palauqui Date: Fri, 7 Feb 2025 17:41:37 +0100 Subject: [PATCH] `key-utils`: make it no_std with a `std` default feature --- roles/Cargo.lock | 8 +++++--- utils/Cargo.lock | 8 ++++++++ utils/key-utils/Cargo.toml | 10 ++++++++-- utils/key-utils/src/lib.rs | 39 ++++++++++++++++++++++++++++++------- utils/key-utils/src/main.rs | 7 +++++++ 5 files changed, 60 insertions(+), 12 deletions(-) diff --git a/roles/Cargo.lock b/roles/Cargo.lock index 0f5041472a..aa614065cb 100644 --- a/roles/Cargo.lock +++ b/roles/Cargo.lock @@ -923,7 +923,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1526,6 +1526,8 @@ name = "key-utils" version = "1.1.0" dependencies = [ "bs58", + "rand", + "rustversion", "secp256k1 0.28.2", "serde", ] @@ -2182,7 +2184,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2508,7 +2510,7 @@ dependencies = [ "getrandom 0.3.1", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/utils/Cargo.lock b/utils/Cargo.lock index fd961328f6..e6e459c874 100644 --- a/utils/Cargo.lock +++ b/utils/Cargo.lock @@ -449,6 +449,8 @@ name = "key-utils" version = "1.1.0" dependencies = [ "bs58", + "rand", + "rustversion", "secp256k1 0.28.2", "serde", "toml", @@ -648,6 +650,12 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + [[package]] name = "ryu" version = "1.0.18" diff --git a/utils/key-utils/Cargo.toml b/utils/key-utils/Cargo.toml index 428f700c14..c1e3bba22d 100644 --- a/utils/key-utils/Cargo.toml +++ b/utils/key-utils/Cargo.toml @@ -23,9 +23,15 @@ name = "key-utils-bin" path = "src/main.rs" [dependencies] -bs58 = { version ="0.4.0", features = ["check"] } -secp256k1 = { version = "0.28.2", default-features = false, features =["alloc","rand","rand-std"] } +bs58 = { version ="0.4.0", default-features = false, features = ["check", "alloc"] } +secp256k1 = { version = "0.28.2", default-features = false, features =["alloc","rand"] } serde = { version = "1.0.89", features = ["derive","alloc"], default-features = false } +rand = {version = "0.8.5", default-features = false } +rustversion = "1.0" [dev-dependencies] toml = { version = "0.5.6", git = "https://github.com/diondokter/toml-rs", default-features = false, rev = "c4161aa" } + +[features] +default = ["std"] +std = ["bs58/std","secp256k1/rand-std", "rand/std", "rand/std_rng"] diff --git a/utils/key-utils/src/lib.rs b/utils/key-utils/src/lib.rs index 9643b060bd..bc02fe4b3b 100644 --- a/utils/key-utils/src/lib.rs +++ b/utils/key-utils/src/lib.rs @@ -1,11 +1,18 @@ +#![cfg_attr(not(feature = "std"), no_std)] + +extern crate alloc; + +use alloc::{ + string::{String, ToString}, + vec::Vec, +}; use bs58::{decode, decode::Error as Bs58DecodeError}; -use core::convert::TryFrom; +use core::{convert::TryFrom, fmt::Display, str::FromStr}; use secp256k1::{ schnorr::Signature, Keypair, Message as SecpMessage, Secp256k1, SecretKey, SignOnly, VerifyOnly, XOnlyPublicKey, }; use serde::{Deserialize, Serialize}; -use std::{fmt::Display, str::FromStr}; #[derive(Debug)] pub enum Error { @@ -17,7 +24,7 @@ pub enum Error { } impl Display for Error { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { match self { Self::Bs58Decode(error) => write!(f, "Base58 code error: {error}"), Self::Secp256k1(error) => write!(f, "Secp256k1 error: {error}"), @@ -30,7 +37,11 @@ impl Display for Error { } } +#[cfg(feature = "std")] impl std::error::Error for Error {} +#[cfg(not(feature = "std"))] +#[rustversion::since(1.81)] +impl core::error::Error for Error {} impl From for Error { fn from(e: Bs58DecodeError) -> Self { @@ -73,7 +84,7 @@ impl From for String { } impl Display for Secp256k1SecretKey { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { let bytes = self.0.secret_bytes(); f.write_str(&bs58::encode(bytes).with_check().into_string()) } @@ -116,7 +127,7 @@ impl From for String { } impl Display for Secp256k1PublicKey { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { let mut output = [0_u8; 34]; output[0] = 1; let bytes = self.0.serialize(); @@ -157,12 +168,26 @@ impl SignatureService { } } + #[cfg(feature = "std")] pub fn sign(&self, message: Vec, private_key: SecretKey) -> Signature { + self.sign_with_rng(message, private_key, &mut rand::thread_rng()) + } + + #[inline] + pub fn sign_with_rng( + &self, + message: Vec, + private_key: SecretKey, + rng: &mut R, + ) -> Signature { let secret_key = private_key; let kp = Keypair::from_secret_key(&self.secp_sign, &secret_key); - self.secp_sign - .sign_schnorr(&SecpMessage::from_digest_slice(&message).unwrap(), &kp) + self.secp_sign.sign_schnorr_with_rng( + &SecpMessage::from_digest_slice(&message).unwrap(), + &kp, + rng, + ) } pub fn verify( diff --git a/utils/key-utils/src/main.rs b/utils/key-utils/src/main.rs index ffdc121c76..c15fa21836 100644 --- a/utils/key-utils/src/main.rs +++ b/utils/key-utils/src/main.rs @@ -1,6 +1,9 @@ +#[cfg(feature = "std")] use ::key_utils::{Secp256k1PublicKey, Secp256k1SecretKey}; +#[cfg(feature = "std")] use secp256k1::{rand, Keypair, Secp256k1}; +#[cfg(feature = "std")] fn generate_key() -> (Secp256k1SecretKey, Secp256k1PublicKey) { let secp = Secp256k1::new(); let (secret_key, _) = secp.generate_keypair(&mut rand::thread_rng()); @@ -15,6 +18,7 @@ fn generate_key() -> (Secp256k1SecretKey, Secp256k1PublicKey) { } } +#[cfg(feature = "std")] fn main() { let (secret, public) = generate_key(); let secret: String = secret.into(); @@ -22,3 +26,6 @@ fn main() { println!("Secret Key: {}", secret); println!("Public Key: {}", public); } + +#[cfg(not(feature = "std"))] +fn main() {}