Skip to content
This repository was archived by the owner on Jun 1, 2026. It is now read-only.

Commit 3cf1150

Browse files
authored
Avoid extra to_vec for key copy (#1160)
1 parent d35225c commit 3cf1150

9 files changed

Lines changed: 19 additions & 20 deletions

File tree

crates/gem_algorand/src/signer/signing.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pub(crate) fn sign_transaction(transaction: &AlgorandTransaction, private_key: &
1212
preimage.extend_from_slice(TX_TAG);
1313
preimage.extend_from_slice(&encoded);
1414

15-
let signature = Signer::sign_digest(SignatureScheme::Ed25519, preimage, private_key.to_vec())?;
15+
let signature = Signer::sign_digest(SignatureScheme::Ed25519, &preimage, private_key)?;
1616
let signed = encode_signed_transaction(&encoded, &signature);
1717
Ok(hex::encode(signed))
1818
}

crates/gem_bitcoin/src/signer/signature.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ pub fn sign_personal(data: &[u8], private_key: &[u8]) -> Result<BitcoinSignDataR
99
let message = BitcoinSignMessageData::from_bytes(data)?;
1010
let hash = message.hash();
1111

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

1414
// BIP137: [header(1), r(32), s(32)] from [r(32), s(32), recovery_id(1)]
1515
let recovery_id = signed[RECOVERY_ID_INDEX];

crates/gem_cosmos/src/signer/chain_signer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ impl CosmosChainSigner {
152152
let sign_doc_bytes = params.encode_sign_doc(&params.body_bytes, &auth_info_bytes);
153153

154154
let digest = Self::sign_doc_digest(chain, &sign_doc_bytes);
155-
let mut signature = Signer::sign_digest(SignatureScheme::Secp256k1, digest.to_vec(), private_key.to_vec())?;
155+
let mut signature = Signer::sign_digest(SignatureScheme::Secp256k1, &digest, private_key)?;
156156
if signature.len() < 64 {
157157
return Err(SignerError::signing_error("secp256k1 signature too short"));
158158
}

crates/gem_tron/src/signer/transaction.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ fn sign_contract(input: &SignerInput, contract: TronContract, fee_limit: u64, pr
125125
}
126126

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

131131
fn encode_trc20_transfer(destination: &TronAddress, value: &str) -> Result<Vec<u8>, SignerError> {

crates/gem_xrp/src/signer/transaction.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ impl XrpTransaction {
9797
preimage.extend_from_slice(&SIGNING_PREFIX);
9898
preimage.extend_from_slice(&unsigned);
9999
let digest = sha512_half(&preimage);
100-
let mut signature = ::signer::Signer::sign_digest(::signer::SignatureScheme::Secp256k1, digest.to_vec(), private_key.to_vec())?;
100+
let mut signature = ::signer::Signer::sign_digest(::signer::SignatureScheme::Secp256k1, &digest, private_key)?;
101101
if signature.len() < 64 {
102102
return Err(SignerError::signing_error("secp256k1 signature too short"));
103103
}

crates/signer/src/lib.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ pub(crate) mod testkit {
1010
pub const TEST_PRIVATE_KEY: &str = "1e9d38b5274152a78dff1a86fa464ceadc1f4238ca2c17060c3c507349424a34";
1111
}
1212

13-
use zeroize::Zeroizing;
14-
1513
pub use crate::address::Base32Address;
1614
pub use crate::ed25519::{ED25519_KEY_TYPE, Ed25519KeyPair};
1715
pub use crate::error::InvalidInput;
@@ -34,18 +32,16 @@ pub enum SignatureScheme {
3432
}
3533

3634
impl Signer {
37-
pub fn sign_digest(scheme: SignatureScheme, digest: Vec<u8>, private_key: Vec<u8>) -> Result<Vec<u8>, SignerError> {
38-
let private_key = Zeroizing::new(private_key);
35+
pub fn sign_digest(scheme: SignatureScheme, digest: &[u8], private_key: &[u8]) -> Result<Vec<u8>, SignerError> {
3936
match scheme {
40-
SignatureScheme::Ed25519 => Ok(Ed25519KeyPair::from_private_key(&private_key)?.sign(&digest).to_vec()),
41-
SignatureScheme::Secp256k1 => secp256k1::sign_digest_append_recovery(&digest, &private_key),
37+
SignatureScheme::Ed25519 => Ok(Ed25519KeyPair::from_private_key(private_key)?.sign(digest).to_vec()),
38+
SignatureScheme::Secp256k1 => secp256k1::sign_digest_append_recovery(digest, private_key),
4239
}
4340
}
4441

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

5147
pub fn sign_eip712(typed_data_json: &str, private_key: &[u8]) -> Result<String, SignerError> {

gemstone/src/message/signer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ impl MessageSigner {
173173
}
174174
SignDigestType::Base58 => {
175175
let hash = self.hash()?;
176-
let signed = Signer::sign_digest(SignatureScheme::Ed25519, hash, private_key.to_vec())?;
176+
let signed = Signer::sign_digest(SignatureScheme::Ed25519, &hash, private_key.as_slice())?;
177177
Ok(self.get_result(&signed))
178178
}
179179
}

gemstone/src/signer/chain.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use gem_ton::signer::TonChainSigner;
1414
use gem_tron::signer::TronChainSigner;
1515
use gem_xrp::signer::XrpChainSigner;
1616
use primitives::{Chain, ChainSigner, ChainType, EVMChain, SignerError, SignerInput};
17+
use zeroize::Zeroizing;
1718

1819
#[derive(uniffi::Object)]
1920
pub struct GemChainSigner {
@@ -97,7 +98,8 @@ impl GemChainSigner {
9798
}
9899

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

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

112-
method(self.signer.as_ref(), &signer_input, key.as_slice()).map_err(|err| map_signer_error(self.chain, action, err))
114+
method(self.signer.as_ref(), &signer_input, private_key.as_slice()).map_err(|err| map_signer_error(self.chain, action, err))
113115
}
114116

115-
fn dispatch_message<T, F>(&self, message: Vec<u8>, private_key: Vec<u8>, action: &'static str, method: F) -> Result<T, GemstoneError>
117+
fn dispatch_message<T, F>(&self, message: &[u8], private_key: &[u8], action: &'static str, method: F) -> Result<T, GemstoneError>
116118
where
117119
F: Fn(&dyn ChainSigner, &[u8], &[u8]) -> Result<T, SignerError>,
118120
{
119-
method(self.signer.as_ref(), &message, &private_key).map_err(|err| map_signer_error(self.chain, action, err))
121+
method(self.signer.as_ref(), message, private_key).map_err(|err| map_signer_error(self.chain, action, err))
120122
}
121123
}
122124

gemstone/src/signer/decode.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ use zeroize::Zeroizing;
44

55
#[uniffi::export]
66
pub fn decode_private_key(chain: Chain, value: String) -> Result<Vec<u8>, GemstoneError> {
7-
Ok(signer::decode_private_key(&chain, &value)?.to_vec())
7+
let mut private_key = signer::decode_private_key(&chain, &value)?;
8+
Ok(std::mem::take(private_key.as_mut()))
89
}
910

1011
#[uniffi::export]

0 commit comments

Comments
 (0)