Skip to content
This repository was archived by the owner on Jun 1, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion crates/gem_algorand/src/signer/signing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ pub(crate) fn sign_transaction(transaction: &AlgorandTransaction, private_key: &
preimage.extend_from_slice(TX_TAG);
preimage.extend_from_slice(&encoded);

let signature = Signer::sign_digest(SignatureScheme::Ed25519, preimage, private_key.to_vec())?;
let signature = Signer::sign_digest(SignatureScheme::Ed25519, &preimage, private_key)?;
let signed = encode_signed_transaction(&encoded, &signature);
Ok(hex::encode(signed))
}
2 changes: 1 addition & 1 deletion crates/gem_bitcoin/src/signer/signature.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ pub fn sign_personal(data: &[u8], private_key: &[u8]) -> Result<BitcoinSignDataR
let message = BitcoinSignMessageData::from_bytes(data)?;
let hash = message.hash();

let signed = Signer::sign_digest(SignatureScheme::Secp256k1, hash, private_key.to_vec()).map_err(|e| SignerError::InvalidInput(e.to_string()))?;
let signed = Signer::sign_digest(SignatureScheme::Secp256k1, &hash, private_key).map_err(|e| SignerError::InvalidInput(e.to_string()))?;

// BIP137: [header(1), r(32), s(32)] from [r(32), s(32), recovery_id(1)]
let recovery_id = signed[RECOVERY_ID_INDEX];
Expand Down
2 changes: 1 addition & 1 deletion crates/gem_cosmos/src/signer/chain_signer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ impl CosmosChainSigner {
let sign_doc_bytes = params.encode_sign_doc(&params.body_bytes, &auth_info_bytes);

let digest = Self::sign_doc_digest(chain, &sign_doc_bytes);
let mut signature = Signer::sign_digest(SignatureScheme::Secp256k1, digest.to_vec(), private_key.to_vec())?;
let mut signature = Signer::sign_digest(SignatureScheme::Secp256k1, &digest, private_key)?;
if signature.len() < 64 {
return Err(SignerError::signing_error("secp256k1 signature too short"));
}
Expand Down
2 changes: 1 addition & 1 deletion crates/gem_tron/src/signer/transaction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ fn sign_contract(input: &SignerInput, contract: TronContract, fee_limit: u64, pr
}

fn sign_raw_hash(hash: &[u8], private_key: &[u8]) -> Result<String, SignerError> {
Ok(hex::encode(Signer::sign_digest(SignatureScheme::Secp256k1, hash.to_vec(), private_key.to_vec())?))
Ok(hex::encode(Signer::sign_digest(SignatureScheme::Secp256k1, hash, private_key)?))
}

fn encode_trc20_transfer(destination: &TronAddress, value: &str) -> Result<Vec<u8>, SignerError> {
Expand Down
2 changes: 1 addition & 1 deletion crates/gem_xrp/src/signer/transaction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ impl XrpTransaction {
preimage.extend_from_slice(&SIGNING_PREFIX);
preimage.extend_from_slice(&unsigned);
let digest = sha512_half(&preimage);
let mut signature = ::signer::Signer::sign_digest(::signer::SignatureScheme::Secp256k1, digest.to_vec(), private_key.to_vec())?;
let mut signature = ::signer::Signer::sign_digest(::signer::SignatureScheme::Secp256k1, &digest, private_key)?;
if signature.len() < 64 {
return Err(SignerError::signing_error("secp256k1 signature too short"));
}
Expand Down
12 changes: 4 additions & 8 deletions crates/signer/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ pub(crate) mod testkit {
pub const TEST_PRIVATE_KEY: &str = "1e9d38b5274152a78dff1a86fa464ceadc1f4238ca2c17060c3c507349424a34";
}

use zeroize::Zeroizing;

pub use crate::address::Base32Address;
pub use crate::ed25519::{ED25519_KEY_TYPE, Ed25519KeyPair};
pub use crate::error::InvalidInput;
Expand All @@ -34,18 +32,16 @@ pub enum SignatureScheme {
}

impl Signer {
pub fn sign_digest(scheme: SignatureScheme, digest: Vec<u8>, private_key: Vec<u8>) -> Result<Vec<u8>, SignerError> {
let private_key = Zeroizing::new(private_key);
pub fn sign_digest(scheme: SignatureScheme, digest: &[u8], private_key: &[u8]) -> Result<Vec<u8>, SignerError> {
match scheme {
SignatureScheme::Ed25519 => Ok(Ed25519KeyPair::from_private_key(&private_key)?.sign(&digest).to_vec()),
SignatureScheme::Secp256k1 => secp256k1::sign_digest_append_recovery(&digest, &private_key),
SignatureScheme::Ed25519 => Ok(Ed25519KeyPair::from_private_key(private_key)?.sign(digest).to_vec()),
SignatureScheme::Secp256k1 => secp256k1::sign_digest_append_recovery(digest, private_key),
}
}

/// Sign a secp256k1 digest returning [r(32), s(32), v(1)] where v ∈ {27, 28}.
pub fn sign_ethereum_digest(digest: &[u8], private_key: &[u8]) -> Result<Vec<u8>, SignerError> {
let private_key = Zeroizing::new(private_key.to_vec());
secp256k1::sign_ethereum_digest(digest, &private_key)
secp256k1::sign_ethereum_digest(digest, private_key)
}

pub fn sign_eip712(typed_data_json: &str, private_key: &[u8]) -> Result<String, SignerError> {
Expand Down
2 changes: 1 addition & 1 deletion gemstone/src/message/signer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ impl MessageSigner {
}
SignDigestType::Base58 => {
let hash = self.hash()?;
let signed = Signer::sign_digest(SignatureScheme::Ed25519, hash, private_key.to_vec())?;
let signed = Signer::sign_digest(SignatureScheme::Ed25519, &hash, private_key.as_slice())?;
Ok(self.get_result(&signed))
}
}
Expand Down
12 changes: 7 additions & 5 deletions gemstone/src/signer/chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ use gem_ton::signer::TonChainSigner;
use gem_tron::signer::TronChainSigner;
use gem_xrp::signer::XrpChainSigner;
use primitives::{Chain, ChainSigner, ChainType, EVMChain, SignerError, SignerInput};
use zeroize::Zeroizing;

#[derive(uniffi::Object)]
pub struct GemChainSigner {
Expand Down Expand Up @@ -97,7 +98,8 @@ impl GemChainSigner {
}

pub fn sign_message(&self, message: Vec<u8>, private_key: Vec<u8>) -> Result<String, GemstoneError> {
self.dispatch_message(message, private_key, "message", |signer, msg, key| signer.sign_message(msg, key))
let private_key = Zeroizing::new(private_key);
self.dispatch_message(&message, private_key.as_slice(), "message", |signer, msg, key| signer.sign_message(msg, key))
}
}

Expand All @@ -107,16 +109,16 @@ impl GemChainSigner {
F: Fn(&dyn ChainSigner, &SignerInput, &[u8]) -> Result<T, SignerError>,
{
let signer_input: SignerInput = input.into();
let key = private_key;
let private_key = Zeroizing::new(private_key);

method(self.signer.as_ref(), &signer_input, key.as_slice()).map_err(|err| map_signer_error(self.chain, action, err))
method(self.signer.as_ref(), &signer_input, private_key.as_slice()).map_err(|err| map_signer_error(self.chain, action, err))
}

fn dispatch_message<T, F>(&self, message: Vec<u8>, private_key: Vec<u8>, action: &'static str, method: F) -> Result<T, GemstoneError>
fn dispatch_message<T, F>(&self, message: &[u8], private_key: &[u8], action: &'static str, method: F) -> Result<T, GemstoneError>
where
F: Fn(&dyn ChainSigner, &[u8], &[u8]) -> Result<T, SignerError>,
{
method(self.signer.as_ref(), &message, &private_key).map_err(|err| map_signer_error(self.chain, action, err))
method(self.signer.as_ref(), message, private_key).map_err(|err| map_signer_error(self.chain, action, err))
}
}

Expand Down
3 changes: 2 additions & 1 deletion gemstone/src/signer/decode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ use zeroize::Zeroizing;

#[uniffi::export]
pub fn decode_private_key(chain: Chain, value: String) -> Result<Vec<u8>, GemstoneError> {
Ok(signer::decode_private_key(&chain, &value)?.to_vec())
let mut private_key = signer::decode_private_key(&chain, &value)?;
Ok(std::mem::take(&mut private_key))
Comment thread
0xh3rman marked this conversation as resolved.
Outdated
}

#[uniffi::export]
Expand Down
Loading