Skip to content

Commit da70349

Browse files
committed
feat: enable global secp256k1 context
1 parent cdd1c94 commit da70349

File tree

17 files changed

+77
-183
lines changed

17 files changed

+77
-183
lines changed

crypto/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ hmac = "0.7.1"
2222
memzero = "0.1.0"
2323
rand = "0.7.3"
2424
ring = "0.16.11"
25-
secp256k1 = "0.22.1"
25+
secp256k1 = { version = "0.22.1", features = ["global-context"] }
2626
serde = { version = "1.0.104", optional = true }
2727
sha2 = "0.8.1"
2828
tiny-bip39 = "0.7.0"

crypto/src/key.rs

Lines changed: 9 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use bech32::{FromBase32, ToBase32 as _};
1919
use byteorder::{BigEndian, ReadBytesExt as _};
2020
use failure::Fail;
2121
use hmac::{Hmac, Mac};
22-
use secp256k1::{PublicKey, Secp256k1, SecretKey, SignOnly, Signing, VerifyOnly};
22+
use secp256k1::{PublicKey, SecretKey};
2323
#[cfg(feature = "serde")]
2424
use serde::{Deserialize, Serialize};
2525

@@ -160,22 +160,6 @@ pub type SK = SecretKey;
160160
/// Public Key
161161
pub type PK = PublicKey;
162162

163-
/// The secp256k1 engine, used to execute all signature operations.
164-
///
165-
/// `Engine::new()`: all capabilities
166-
/// `Engine::signing_only()`: only be used for signing
167-
/// `Engine::verification_only()`: only be used for verification
168-
pub type Engine<C> = Secp256k1<C>;
169-
170-
/// Secp256k1 engine that can only be used for signing.
171-
pub type SignEngine = Secp256k1<SignOnly>;
172-
173-
/// Secp256k1 engine that can only be used for verifying.
174-
pub type VerifyEngine = Secp256k1<VerifyOnly>;
175-
176-
/// Secp256k1 engine that can be used for signing and for verifying.
177-
pub type CryptoEngine = Secp256k1<secp256k1::All>;
178-
179163
/// Extended Key is just a Key with a Chain Code
180164
#[derive(Clone, PartialEq, Eq, Debug)]
181165
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
@@ -292,25 +276,17 @@ impl ExtendedSK {
292276
}
293277

294278
/// Try to derive an extended private key from a given path
295-
pub fn derive<C: Signing>(
296-
&self,
297-
engine: &Engine<C>,
298-
path: &KeyPath,
299-
) -> Result<ExtendedSK, KeyDerivationError> {
279+
pub fn derive(&self, path: &KeyPath) -> Result<ExtendedSK, KeyDerivationError> {
300280
let mut extended_sk = self.clone();
301281
for index in path.iter() {
302-
extended_sk = extended_sk.child(engine, index)?
282+
extended_sk = extended_sk.child(index)?
303283
}
304284

305285
Ok(extended_sk)
306286
}
307287

308288
/// Try to get a private child key from parent
309-
pub fn child<C: Signing>(
310-
&self,
311-
engine: &Engine<C>,
312-
index: &KeyPathIndex,
313-
) -> Result<ExtendedSK, KeyDerivationError> {
289+
pub fn child(&self, index: &KeyPathIndex) -> Result<ExtendedSK, KeyDerivationError> {
314290
let mut hmac512: Hmac<sha2::Sha512> =
315291
Hmac::new_varkey(&self.chain_code).map_err(|_| KeyDerivationError::InvalidKeyLength)?;
316292
let index_bytes = index.as_ref().to_be_bytes();
@@ -319,7 +295,7 @@ impl ExtendedSK {
319295
hmac512.input(&[0]); // BIP-32 padding that makes key 33 bytes long
320296
hmac512.input(&self.secret_key[..]);
321297
} else {
322-
hmac512.input(&PublicKey::from_secret_key(engine, &self.secret_key).serialize());
298+
hmac512.input(&PublicKey::from_secret_key_global(&self.secret_key).serialize());
323299
}
324300

325301
let (chain_code, mut secret_key) = get_chain_code_and_secret(&index_bytes, hmac512)?;
@@ -355,12 +331,12 @@ pub struct ExtendedPK {
355331

356332
impl ExtendedPK {
357333
/// Derive the public key from a private key.
358-
pub fn from_secret_key<C: Signing>(engine: &Engine<C>, key: &ExtendedSK) -> Self {
334+
pub fn from_secret_key(key: &ExtendedSK) -> Self {
359335
let ExtendedSK {
360336
secret_key,
361337
chain_code,
362338
} = key;
363-
let key = PublicKey::from_secret_key(engine, secret_key);
339+
let key = PublicKey::from_secret_key_global(secret_key);
364340
Self {
365341
key,
366342
chain_code: chain_code.clone(),
@@ -577,8 +553,7 @@ mod tests {
577553
.hardened(0) // account: hardened 0
578554
.index(0) // change: 0
579555
.index(0); // address: 0
580-
let engine = SignEngine::signing_only();
581-
let account = extended_sk.derive(&engine, &path).unwrap();
556+
let account = extended_sk.derive(&path).unwrap();
582557

583558
let expected_account = [
584559
137, 174, 230, 121, 4, 190, 53, 238, 47, 181, 52, 226, 109, 68, 153, 170, 112, 150, 84,
@@ -598,10 +573,9 @@ mod tests {
598573
let mnemonic = bip39::Mnemonic::from_phrase(phrase.into()).unwrap();
599574
let seed = mnemonic.seed(&"".into());
600575
let master_key = MasterKeyGen::new(&seed).generate().unwrap();
601-
let engine = Secp256k1::signing_only();
602576

603577
for (expected, keypath) in slip32_vectors() {
604-
let key = master_key.derive(&engine, &keypath).unwrap();
578+
let key = master_key.derive(&keypath).unwrap();
605579
let xprv = key.to_slip32(&keypath).unwrap();
606580

607581
assert_eq!(expected, xprv);

crypto/src/signature.rs

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
//! Signature module
22
3-
use crate::key::CryptoEngine;
43
use secp256k1::{Error, Message, SecretKey};
54

65
/// Signature
@@ -12,46 +11,42 @@ pub type PublicKey = secp256k1::PublicKey;
1211
/// Sign `data` with provided secret key. `data` must be the 32-byte output of a cryptographically
1312
/// secure hash function, otherwise this function is not secure.
1413
/// - Returns an Error if data is not a 32-byte array
15-
pub fn sign(secp: &CryptoEngine, secret_key: SecretKey, data: &[u8]) -> Result<Signature, Error> {
14+
pub fn sign(secret_key: SecretKey, data: &[u8]) -> Result<Signature, Error> {
1615
let msg = Message::from_slice(data)?;
1716

18-
Ok(secp.sign_ecdsa(&msg, &secret_key))
17+
Ok(secret_key.sign_ecdsa(msg))
1918
}
2019
/// Verify signature with a provided public key.
2120
/// - Returns an Error if data is not a 32-byte array
22-
pub fn verify(
23-
secp: &CryptoEngine,
24-
public_key: &PublicKey,
25-
data: &[u8],
26-
sig: &Signature,
27-
) -> Result<(), Error> {
21+
pub fn verify(public_key: &PublicKey, data: &[u8], sig: &Signature) -> Result<(), Error> {
2822
let msg = Message::from_slice(data)?;
2923

30-
secp.verify_ecdsa(&msg, sig, public_key)
24+
sig.verify(&msg, public_key)
3125
}
3226

3327
#[cfg(test)]
3428
mod tests {
35-
use crate::hash::{calculate_sha256, Sha256};
36-
use crate::signature::{sign, verify};
37-
use secp256k1::{ecdsa::Signature, PublicKey, Secp256k1, SecretKey};
29+
use crate::{
30+
hash::{calculate_sha256, Sha256},
31+
signature::{sign, verify},
32+
};
33+
use secp256k1::{ecdsa::Signature, PublicKey, SecretKey};
3834

3935
#[test]
4036
fn test_sign_and_verify() {
4137
let data = [0xab; 32];
42-
let secp = &Secp256k1::new();
4338
let secret_key = SecretKey::from_slice(&[0xcd; 32]).expect("32 bytes, within curve order");
44-
let public_key = PublicKey::from_secret_key(secp, &secret_key);
39+
let public_key = PublicKey::from_secret_key_global(&secret_key);
4540

46-
let signature = sign(secp, secret_key, &data).unwrap();
41+
let signature = sign(secret_key, &data).unwrap();
4742
let signature_expected = "3044\
4843
0220\
4944
3dc4fa74655c21b7ffc0740e29bfd88647e8dfe2b68c507cf96264e4e7439c1f\
5045
0220\
5146
7aa61261b18eebdfdb704ca7bab4c7bcf7961ae0ade5309f6f1398e21aec0f9f";
5247
assert_eq!(signature_expected.to_string(), signature.to_string());
5348

54-
assert!(verify(secp, &public_key, &data, &signature).is_ok());
49+
assert!(verify(&public_key, &data, &signature).is_ok());
5550
}
5651

5752
#[test]
@@ -100,7 +95,6 @@ mod tests {
10095

10196
#[test]
10297
fn test_sign_and_verify_before_hash() {
103-
let secp = &Secp256k1::new();
10498
let secret_key = SecretKey::from_slice(&[0xcd; 32]).expect("32 bytes, within curve order");
10599

106100
let i = 9;
@@ -111,7 +105,7 @@ mod tests {
111105

112106
let Sha256(hashed_data) = calculate_sha256(message.as_bytes());
113107

114-
let signature = sign(secp, secret_key, &hashed_data).unwrap();
108+
let signature = sign(secret_key, &hashed_data).unwrap();
115109

116110
let r_s = signature.serialize_compact();
117111
let (r, s) = r_s.split_at(32);

data_structures/src/chain/mod.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4013,9 +4013,7 @@ pub fn block_example() -> Block {
40134013
mod tests {
40144014
use witnet_crypto::{
40154015
merkle::{merkle_tree_root, InclusionProof},
4016-
secp256k1::{
4017-
PublicKey as Secp256k1_PublicKey, Secp256k1, SecretKey as Secp256k1_SecretKey,
4018-
},
4016+
secp256k1::{PublicKey as Secp256k1_PublicKey, SecretKey as Secp256k1_SecretKey},
40194017
signature::sign,
40204018
};
40214019

@@ -6460,13 +6458,12 @@ mod tests {
64606458
fn sign_tx<H: Hashable>(mk: [u8; 32], tx: &H) -> KeyedSignature {
64616459
let Hash::SHA256(data) = tx.hash();
64626460

6463-
let secp = &Secp256k1::new();
64646461
let secret_key =
64656462
Secp256k1_SecretKey::from_slice(&mk).expect("32 bytes, within curve order");
6466-
let public_key = Secp256k1_PublicKey::from_secret_key(secp, &secret_key);
6463+
let public_key = Secp256k1_PublicKey::from_secret_key_global(&secret_key);
64676464
let public_key = PublicKey::from(public_key);
64686465

6469-
let signature = sign(secp, secret_key, &data).unwrap();
6466+
let signature = sign(secret_key, &data).unwrap();
64706467

64716468
KeyedSignature {
64726469
signature: Signature::from(signature),

node/src/actors/chain_manager/actor.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ use crate::{
1111
},
1212
config_mngr, signature_mngr, storage_mngr,
1313
};
14-
use witnet_crypto::key::CryptoEngine;
1514
use witnet_data_structures::{
1615
chain::{
1716
ChainInfo, ChainState, CheckpointBeacon, CheckpointVRF, GenesisBlockInfo, PublicKeyHash,
@@ -52,8 +51,6 @@ impl Actor for ChainManager {
5251
ctx.stop();
5352
})
5453
.ok();
55-
56-
self.secp = Some(CryptoEngine::new());
5754
}
5855
}
5956

node/src/actors/chain_manager/handlers.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,7 @@ impl Handler<EpochNotification<EveryEpochPayload>> for ChainManager {
147147
reputation_engine: Some(_),
148148
..
149149
} => {
150-
if self.epoch_constants.is_none()
151-
|| self.vrf_ctx.is_none()
152-
|| self.secp.is_none()
153-
{
150+
if self.epoch_constants.is_none() || self.vrf_ctx.is_none() {
154151
log::error!("{}", ChainManagerError::ChainNotReady);
155152
return;
156153
}

node/src/actors/chain_manager/mining.rs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,7 +1013,7 @@ mod tests {
10131013
use std::convert::TryInto;
10141014

10151015
use witnet_crypto::secp256k1::{
1016-
PublicKey as Secp256k1_PublicKey, Secp256k1, SecretKey as Secp256k1_SecretKey,
1016+
PublicKey as Secp256k1_PublicKey, SecretKey as Secp256k1_SecretKey,
10171017
};
10181018
use witnet_crypto::signature::{sign, verify};
10191019
use witnet_data_structures::{chain::*, transaction::*, vrf::VrfCtx};
@@ -1142,11 +1142,10 @@ mod tests {
11421142

11431143
// Create a KeyedSignature
11441144
let Hash::SHA256(data) = block_header.hash();
1145-
let secp = &Secp256k1::new();
11461145
let secret_key =
11471146
Secp256k1_SecretKey::from_slice(&[0xcd; 32]).expect("32 bytes, within curve order");
1148-
let public_key = Secp256k1_PublicKey::from_secret_key(secp, &secret_key);
1149-
let signature = sign(secp, secret_key, &data).unwrap();
1147+
let public_key = Secp256k1_PublicKey::from_secret_key_global(&secret_key);
1148+
let signature = sign(secret_key, &data).unwrap();
11501149
let witnet_pk = PublicKey::from(public_key);
11511150
let witnet_signature = Signature::from(signature);
11521151

@@ -1160,7 +1159,7 @@ mod tests {
11601159
);
11611160

11621161
// Check Signature
1163-
assert!(verify(secp, &public_key, &data, &signature).is_ok());
1162+
assert!(verify(&public_key, &data, &signature).is_ok());
11641163

11651164
// Check if block only contains the Mint Transaction
11661165
assert_eq!(block.txns.mint.len(), 1);
@@ -1173,7 +1172,7 @@ mod tests {
11731172
// Validate block signature
11741173
let mut signatures_to_verify = vec![];
11751174
assert!(validate_block_signature(&block, &mut signatures_to_verify).is_ok());
1176-
assert!(verify_signatures(signatures_to_verify, vrf, secp).is_ok());
1175+
assert!(verify_signatures(signatures_to_verify, vrf).is_ok());
11771176
}
11781177

11791178
static MILLION_TX_OUTPUT: &str =
@@ -1580,17 +1579,16 @@ mod tests {
15801579
};
15811580
let sk: Secp256k1_SecretKey = secret_key.into();
15821581

1583-
let secp = &Secp256k1::new();
1584-
let public_key = Secp256k1_PublicKey::from_secret_key(secp, &sk);
1582+
let public_key = Secp256k1_PublicKey::from_secret_key_global(&sk);
15851583

15861584
let data = [
15871585
0xca, 0x18, 0xf5, 0xad, 0xc2, 0x18, 0x45, 0x25, 0x0e, 0x88, 0x14, 0x18, 0x1f, 0xf7,
15881586
0x8c, 0x5b, 0x83, 0x68, 0x5c, 0x0c, 0xda, 0x55, 0x62, 0xda, 0x30, 0xc1, 0x95, 0x8d,
15891587
0x84, 0x9e, 0xc6, 0xb9,
15901588
];
15911589

1592-
let signature = sign(secp, sk, &data).unwrap();
1593-
assert!(verify(secp, &public_key, &data, &signature).is_ok());
1590+
let signature = sign(sk, &data).unwrap();
1591+
assert!(verify(&public_key, &data, &signature).is_ok());
15941592

15951593
// Conversion step
15961594
let witnet_signature = Signature::from(signature);
@@ -1602,6 +1600,6 @@ mod tests {
16021600
assert_eq!(signature, signature2);
16031601
assert_eq!(public_key, public_key2);
16041602

1605-
assert!(verify(secp, &public_key2, &data, &signature2).is_ok());
1603+
assert!(verify(&public_key2, &data, &signature2).is_ok());
16061604
}
16071605
}

0 commit comments

Comments
 (0)