Skip to content

Commit b05e3f2

Browse files
committed
Add tests checking that trezor_signer and software_signer produce the same signatures.
1 parent a292e8b commit b05e3f2

File tree

25 files changed

+518
-210
lines changed

25 files changed

+518
-210
lines changed

blockprod/src/detail/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ impl BlockProduction {
242242
block_timestamp,
243243
block_height,
244244
make_ancestor_getter(cs),
245-
randomness::make_true_rng(),
245+
&mut randomness::make_true_rng(),
246246
)?;
247247
let consensus_data = ConsensusData::PoS(Box::new(consensus_data));
248248

@@ -591,6 +591,7 @@ impl BlockProduction {
591591
max_block_timestamp_for_pos,
592592
stop_flag,
593593
finalize_block_data,
594+
&mut randomness::make_true_rng(),
594595
)
595596
.map_err(BlockProductionError::FailedConsensusInitialization);
596597

common/src/chain/transaction/signature/inputsig/arbitrary_message/mod.rs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
const MESSAGE_MAGIC_PREFIX: &str = "===MINTLAYER MESSAGE BEGIN===\n";
1717
const MESSAGE_MAGIC_SUFFIX: &str = "\n===MINTLAYER MESSAGE END===";
1818

19-
use randomness::{CryptoRng, Rng};
2019
use thiserror::Error;
2120

21+
use crypto::key::SigAuxDataProvider;
2222
use serialization::Encode;
2323

2424
use crate::{
@@ -99,21 +99,21 @@ impl ArbitraryMessageSignature {
9999
self.as_ref().verify_signature(chain_config, destination, challenge)
100100
}
101101

102-
pub fn produce_uniparty_signature<R: Rng + CryptoRng>(
102+
pub fn produce_uniparty_signature<AuxP: SigAuxDataProvider + ?Sized>(
103103
private_key: &crypto::key::PrivateKey,
104104
destination: &Destination,
105105
message: &[u8],
106-
rng: R,
106+
sig_aux_data_provider: &mut AuxP,
107107
) -> Result<Self, SignArbitraryMessageError> {
108108
let challenge = produce_message_challenge(message);
109109
let signature =
110110
match destination {
111111
Destination::PublicKeyHash(pubkeyhash) => {
112-
let sig = sign_public_key_hash_spending(private_key, pubkeyhash, &challenge, rng)?;
112+
let sig = sign_public_key_hash_spending(private_key, pubkeyhash, &challenge, sig_aux_data_provider)?;
113113
sig.encode()
114114
}
115115
Destination::PublicKey(pubkey) => {
116-
let sig = sign_public_key_spending(private_key, pubkey, &challenge, rng)?;
116+
let sig = sign_public_key_spending(private_key, pubkey, &challenge, sig_aux_data_provider)?;
117117
sig.encode()
118118
}
119119
Destination::ScriptHash(_) => return Err(SignArbitraryMessageError::Unsupported),
@@ -132,13 +132,19 @@ impl ArbitraryMessageSignature {
132132
})
133133
}
134134

135-
pub fn produce_uniparty_signature_as_pub_key_hash_spending<R: Rng + CryptoRng>(
135+
pub fn produce_uniparty_signature_as_pub_key_hash_spending<
136+
AuxP: SigAuxDataProvider + ?Sized,
137+
>(
136138
private_key: &crypto::key::PrivateKey,
137139
message: &[u8],
138-
rng: R,
140+
sig_aux_data_provider: &mut AuxP,
139141
) -> Result<Self, SignArbitraryMessageError> {
140142
let challenge = produce_message_challenge(message);
141-
let signature = sign_public_key_hash_spending_unchecked(private_key, &challenge, rng)?;
143+
let signature = sign_public_key_hash_spending_unchecked(
144+
private_key,
145+
&challenge,
146+
sig_aux_data_provider,
147+
)?;
142148
let signature = signature.encode();
143149

144150
Ok(Self {

common/src/chain/transaction/signature/inputsig/arbitrary_message/tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ fn produce_uniparty_signature_as_pub_key_hash_spending_matches_produce_uniparty_
9292
&private_key,
9393
&destination_addr,
9494
&message,
95-
test_utils::random::make_seedable_rng(signer_rng_seed),
95+
&mut test_utils::random::make_seedable_rng(signer_rng_seed),
9696
)
9797
.unwrap();
9898
sig1.verify_signature(&chain_config, &destination_addr, &message_challenge)
@@ -101,7 +101,7 @@ fn produce_uniparty_signature_as_pub_key_hash_spending_matches_produce_uniparty_
101101
let sig2 = ArbitraryMessageSignature::produce_uniparty_signature_as_pub_key_hash_spending(
102102
&private_key,
103103
&message,
104-
test_utils::random::make_seedable_rng(signer_rng_seed),
104+
&mut test_utils::random::make_seedable_rng(signer_rng_seed),
105105
)
106106
.unwrap();
107107

common/src/chain/transaction/signature/inputsig/authorize_pubkey_spend.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@
1313
// See the License for the specific language governing permissions and
1414
// limitations under the License.
1515

16-
use crypto::key::Signature;
17-
use randomness::{CryptoRng, Rng};
16+
use crypto::key::{SigAuxDataProvider, Signature};
1817
use serialization::{Decode, DecodeAll, Encode};
1918

2019
use crate::{chain::signature::DestinationSigError, primitives::H256};
@@ -48,19 +47,19 @@ pub fn verify_public_key_spending(
4847
Ok(())
4948
}
5049

51-
pub fn sign_public_key_spending<R: Rng + CryptoRng>(
50+
pub fn sign_public_key_spending<AuxP: SigAuxDataProvider + ?Sized>(
5251
private_key: &crypto::key::PrivateKey,
5352
spendee_pubkey: &crypto::key::PublicKey,
5453
sighash: &H256,
55-
rng: R,
54+
sig_aux_data_provider: &mut AuxP,
5655
) -> Result<AuthorizedPublicKeySpend, DestinationSigError> {
5756
let calculated_public_key = crypto::key::PublicKey::from_private_key(private_key);
5857
if *spendee_pubkey != calculated_public_key {
5958
return Err(DestinationSigError::SpendeePrivatePublicKeyMismatch);
6059
}
6160
let msg = sighash.encode();
6261
let signature = private_key
63-
.sign_message(&msg, rng)
62+
.sign_message(&msg, sig_aux_data_provider)
6463
.map_err(DestinationSigError::ProducingSignatureFailed)?;
6564

6665
Ok(AuthorizedPublicKeySpend::new(signature))

common/src/chain/transaction/signature/inputsig/authorize_pubkeyhash_spend.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@
1313
// See the License for the specific language governing permissions and
1414
// limitations under the License.
1515

16-
use crypto::key::{PrivateKey, PublicKey, Signature};
17-
use randomness::{CryptoRng, Rng};
16+
use crypto::key::{PrivateKey, PublicKey, SigAuxDataProvider, Signature};
1817
use serialization::{Decode, DecodeAll, Encode};
1918

2019
use crate::{
@@ -58,40 +57,40 @@ pub fn verify_public_key_hash_spending(
5857
Ok(())
5958
}
6059

61-
pub fn sign_public_key_hash_spending<R: Rng + CryptoRng>(
60+
pub fn sign_public_key_hash_spending<AuxP: SigAuxDataProvider + ?Sized>(
6261
private_key: &PrivateKey,
6362
spendee_addr: &PublicKeyHash,
6463
sighash: &H256,
65-
rng: R,
64+
sig_aux_data_provider: &mut AuxP,
6665
) -> Result<AuthorizedPublicKeyHashSpend, DestinationSigError> {
6766
let public_key = PublicKey::from_private_key(private_key);
6867
let calculated_addr = PublicKeyHash::from(&public_key);
6968
if calculated_addr != *spendee_addr {
7069
return Err(DestinationSigError::PublicKeyToHashMismatch);
7170
}
72-
sign_public_key_hash_spending_impl(private_key, public_key, sighash, rng)
71+
sign_public_key_hash_spending_impl(private_key, public_key, sighash, sig_aux_data_provider)
7372
}
7473

75-
pub fn sign_public_key_hash_spending_unchecked<R: Rng + CryptoRng>(
74+
pub fn sign_public_key_hash_spending_unchecked<AuxP: SigAuxDataProvider + ?Sized>(
7675
private_key: &PrivateKey,
7776
sighash: &H256,
78-
rng: R,
77+
sig_aux_data_provider: &mut AuxP,
7978
) -> Result<AuthorizedPublicKeyHashSpend, DestinationSigError> {
8079
let public_key = PublicKey::from_private_key(private_key);
81-
sign_public_key_hash_spending_impl(private_key, public_key, sighash, rng)
80+
sign_public_key_hash_spending_impl(private_key, public_key, sighash, sig_aux_data_provider)
8281
}
8382

84-
fn sign_public_key_hash_spending_impl<R: Rng + CryptoRng>(
83+
fn sign_public_key_hash_spending_impl<AuxP: SigAuxDataProvider + ?Sized>(
8584
private_key: &PrivateKey,
8685
public_key: PublicKey,
8786
sighash: &H256,
88-
rng: R,
87+
sig_aux_data_provider: &mut AuxP,
8988
) -> Result<AuthorizedPublicKeyHashSpend, DestinationSigError> {
9089
debug_assert_eq!(public_key, PublicKey::from_private_key(private_key));
9190

9291
let msg = sighash.encode();
9392
let signature = private_key
94-
.sign_message(&msg, rng)
93+
.sign_message(&msg, sig_aux_data_provider)
9594
.map_err(DestinationSigError::ProducingSignatureFailed)?;
9695

9796
Ok(AuthorizedPublicKeyHashSpend::new(public_key, signature))

common/src/chain/transaction/signature/inputsig/classical_multisig/authorize_classical_multisig.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@
1515

1616
use std::collections::BTreeMap;
1717

18-
use crypto::key::Signature;
19-
use randomness::{CryptoRng, Rng};
18+
use crypto::key::{SigAuxDataProvider, Signature};
2019
use serialization::{Decode, DecodeAll, Encode};
2120

2221
use crate::{
@@ -176,14 +175,14 @@ pub enum ClassicalMultisigSigningError {
176175
/// A signature cannot be added more than once. Also, in every iteration, all the signatures must be valid,
177176
/// and obviously the challenge must be valid too, since there is no point in adding signatures to anything
178177
/// that is considered invalid.
179-
pub fn sign_classical_multisig_spending(
178+
pub fn sign_classical_multisig_spending<AuxP: SigAuxDataProvider + ?Sized>(
180179
chain_config: &ChainConfig,
181180
key_index: u8,
182181
private_key: &crypto::key::PrivateKey,
183182
challenge: &ClassicMultisigChallenge,
184183
sighash: &H256,
185184
current_signatures: AuthorizedClassicalMultisigSpend,
186-
rng: &mut (impl Rng + CryptoRng),
185+
sig_aux_data_provider: &mut AuxP,
187186
) -> Result<ClassicalMultisigCompletionStatus, ClassicalMultisigSigningError> {
188187
// ensure the challenge is valid before signing it
189188
if let Err(ch_err) = challenge.is_valid(chain_config) {
@@ -240,7 +239,7 @@ pub fn sign_classical_multisig_spending(
240239
return Err(ClassicalMultisigSigningError::SpendeePrivateChallengePublicKeyMismatch);
241240
}
242241
let signature = private_key
243-
.sign_message(&msg, rng)
242+
.sign_message(&msg, sig_aux_data_provider)
244243
.map_err(ClassicalMultisigSigningError::ProducingSignatureFailed)?;
245244

246245
let mut current_signatures = current_signatures;
@@ -687,7 +686,7 @@ mod tests {
687686
signatures.insert(
688687
*tampered_with_key_index,
689688
new_random_private_key
690-
.sign_message(&sighash.encode(), randomness::make_true_rng())
689+
.sign_message(&sighash.encode(), &mut randomness::make_true_rng())
691690
.unwrap(),
692691
);
693692

@@ -920,7 +919,7 @@ mod tests {
920919
let (new_random_private_key, _) =
921920
PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr);
922921
let sig = new_random_private_key
923-
.sign_message(&sighash.encode(), randomness::make_true_rng())
922+
.sign_message(&sighash.encode(), &mut randomness::make_true_rng())
924923
.unwrap();
925924
let new_sigs = BTreeMap::from([(key_index, sig)]);
926925
let tampered_with_signatures = AuthorizedClassicalMultisigSpend::new(

common/src/chain/transaction/signature/inputsig/classical_multisig/multisig_partial_signature.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ mod tests {
313313
let tampered_signature = priv_keys[tampered_index as usize]
314314
.sign_message(
315315
&H256::random_using(rng).encode(),
316-
randomness::make_true_rng(),
316+
&mut randomness::make_true_rng(),
317317
)
318318
.unwrap();
319319
// replace the signatures with a tampered one
@@ -368,7 +368,7 @@ mod tests {
368368
.0
369369
.sign_message(
370370
&H256::random_using(rng).encode(),
371-
randomness::make_true_rng(),
371+
&mut randomness::make_true_rng(),
372372
)
373373
.unwrap();
374374
// replace the signatures with a tampered one

common/src/chain/transaction/signature/inputsig/htlc.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
// See the License for the specific language governing permissions and
1414
// limitations under the License.
1515

16-
use randomness::{CryptoRng, Rng};
16+
use crypto::key::SigAuxDataProvider;
1717
use serialization::Encode;
1818

1919
use standard_signature::StandardInputSignature;
@@ -28,15 +28,15 @@ use super::{
2828
};
2929

3030
#[allow(clippy::too_many_arguments)]
31-
pub fn produce_uniparty_signature_for_htlc_input<T: Signable, R: Rng + CryptoRng>(
31+
pub fn produce_uniparty_signature_for_htlc_input<T: Signable, AuxP: SigAuxDataProvider + ?Sized>(
3232
private_key: &crypto::key::PrivateKey,
3333
sighash_type: SigHashType,
3434
outpoint_destination: Destination,
3535
tx: &T,
3636
inputs_utxos: &[Option<&TxOutput>],
3737
input_num: usize,
3838
htlc_secret: HtlcSecret,
39-
rng: R,
39+
sig_aux_data_provider: &mut AuxP,
4040
) -> Result<StandardInputSignature, DestinationSigError> {
4141
let sig = StandardInputSignature::produce_uniparty_signature_for_input(
4242
private_key,
@@ -45,7 +45,7 @@ pub fn produce_uniparty_signature_for_htlc_input<T: Signable, R: Rng + CryptoRng
4545
tx,
4646
inputs_utxos,
4747
input_num,
48-
rng,
48+
sig_aux_data_provider,
4949
)?;
5050

5151
let sig_with_secret =

common/src/chain/transaction/signature/inputsig/standard_signature.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
use std::io::BufWriter;
1717

18-
use randomness::{CryptoRng, Rng};
18+
use crypto::key::SigAuxDataProvider;
1919
use serialization::{Decode, DecodeAll, Encode};
2020

2121
use crate::{
@@ -100,23 +100,23 @@ impl StandardInputSignature {
100100
Ok(())
101101
}
102102

103-
pub fn produce_uniparty_signature_for_input<T: Signable, R: Rng + CryptoRng>(
103+
pub fn produce_uniparty_signature_for_input<T: Signable, AuxP: SigAuxDataProvider + ?Sized>(
104104
private_key: &crypto::key::PrivateKey,
105105
sighash_type: SigHashType,
106106
outpoint_destination: Destination,
107107
tx: &T,
108108
inputs_utxos: &[Option<&TxOutput>],
109109
input_num: usize,
110-
rng: R,
110+
sig_aux_data_provider: &mut AuxP,
111111
) -> Result<Self, DestinationSigError> {
112112
let sighash = signature_hash(sighash_type, tx, inputs_utxos, input_num)?;
113113
let serialized_sig = match outpoint_destination {
114114
Destination::PublicKeyHash(ref addr) => {
115-
let sig = sign_public_key_hash_spending(private_key, addr, &sighash, rng)?;
115+
let sig = sign_public_key_hash_spending(private_key, addr, &sighash, sig_aux_data_provider)?;
116116
sig.encode()
117117
}
118118
Destination::PublicKey(ref pubkey) => {
119-
let sig = sign_public_key_spending(private_key, pubkey, &sighash, rng)?;
119+
let sig = sign_public_key_spending(private_key, pubkey, &sighash, sig_aux_data_provider)?;
120120
sig.encode()
121121
}
122122
Destination::ScriptHash(_) => return Err(DestinationSigError::Unsupported),

0 commit comments

Comments
 (0)