From 310327f607475f6f618d4217784932ea83ea52ed Mon Sep 17 00:00:00 2001 From: aya015757881 <2581015450@qq.com> Date: Fri, 13 Dec 2024 17:07:38 +0800 Subject: [PATCH] feat: ed25519 sign --- Cargo.lock | 3 ++- crates/anychain-kms/Cargo.toml | 3 ++- crates/anychain-kms/src/lib.rs | 25 ++++++++++++++++++------- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1c816a5..3e1681e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -241,8 +241,9 @@ dependencies = [ [[package]] name = "anychain-kms" -version = "0.1.14" +version = "0.1.15" dependencies = [ + "anychain-core", "anyhow", "bs58 0.4.0", "curve25519-dalek 4.1.3", diff --git a/crates/anychain-kms/Cargo.toml b/crates/anychain-kms/Cargo.toml index 056f223..8d5ab60 100644 --- a/crates/anychain-kms/Cargo.toml +++ b/crates/anychain-kms/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "anychain-kms" description = "A Rust library providing Key Management Schema for AnyChain. Handles general security and signature algorithms." -version = "0.1.14" +version = "0.1.15" keywords = ["cryptography", "security", "signature", "algorithm"] categories = ["cryptography::cryptocurrencies"] @@ -32,6 +32,7 @@ ed25519-dalek = { workspace = true } curve25519-dalek = { workspace = true } group = "0.13.0" encoding = "0.2.33" +anychain-core = { version = "0.1.7", path = "../anychain-core" } [dev-dependencies] hex-literal = "0.4" diff --git a/crates/anychain-kms/src/lib.rs b/crates/anychain-kms/src/lib.rs index 88b1649..4695177 100644 --- a/crates/anychain-kms/src/lib.rs +++ b/crates/anychain-kms/src/lib.rs @@ -9,15 +9,26 @@ pub mod bip39; pub mod crypto; pub mod error; +use anychain_core::crypto::sha256; +use bip32::PrivateKey; +use curve25519_dalek::Scalar; +use ed25519_dalek::ExpandedSecretKey; use error::Error; -pub fn ecdsa_sign( - secret_key: &libsecp256k1::SecretKey, - bytes: &[u8], -) -> Result<(Vec, u8), Error> { - let message = libsecp256k1::Message::parse_slice(bytes)?; - let (signature, recid) = libsecp256k1::sign(&message, secret_key); - Ok((signature.serialize().to_vec(), recid.into())) +pub fn secp256k1_sign(sk: &libsecp256k1::SecretKey, msg: &[u8]) -> Result<(Vec, u8), Error> { + let msg = libsecp256k1::Message::parse_slice(msg)?; + let (sig, recid) = libsecp256k1::sign(&msg, sk); + Ok((sig.serialize().to_vec(), recid.into())) +} + +pub fn ed25519_sign(sk: &Scalar, msg: &[u8]) -> Result, Error> { + let sk_bytes = PrivateKey::to_bytes(sk); + let nonce = sha256(&sk_bytes).to_vec(); + let xsk = [sk_bytes, nonce].concat(); + let xsk = ExpandedSecretKey::from_bytes(&xsk).unwrap(); + let pk = PrivateKey::public_key(sk); + let sig = xsk.sign(msg, &pk).to_bytes().to_vec(); + Ok(sig) } #[cfg(test)]