Przeglądaj źródła

sdk/crypto: Use deterministic nonces for Schnorr signatures

parazyd 2 lat temu
rodzic
commit
e33fb55faf

+ 1 - 1
bin/darkfid/src/task/miner.rs

@@ -263,7 +263,7 @@ fn generate_transaction(
     let mut tx_builder =
     let mut tx_builder =
         TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![])?;
         TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![])?;
     let mut tx = tx_builder.build()?;
     let mut tx = tx_builder.build()?;
-    let sigs = tx.create_sigs(&mut OsRng, &[*secret])?;
+    let sigs = tx.create_sigs(&[*secret])?;
     tx.signatures = vec![sigs];
     tx.signatures = vec![sigs];
 
 
     Ok(tx)
     Ok(tx)

+ 1 - 2
bin/darkfid/src/tests/harness.rs

@@ -39,7 +39,6 @@ use darkfi_sdk::{
 };
 };
 use darkfi_serial::Encodable;
 use darkfi_serial::Encodable;
 use num_bigint::BigUint;
 use num_bigint::BigUint;
-use rand::rngs::OsRng;
 use url::Url;
 use url::Url;
 
 
 use crate::{
 use crate::{
@@ -216,7 +215,7 @@ impl Harness {
         let mut tx_builder =
         let mut tx_builder =
             TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![])?;
             TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let mut tx = tx_builder.build()?;
-        let sigs = tx.create_sigs(&mut OsRng, &[keypair.secret])?;
+        let sigs = tx.create_sigs(&[keypair.secret])?;
         tx.signatures = vec![sigs];
         tx.signatures = vec![sigs];
 
 
         // We increment timestamp so we don't have to use sleep
         // We increment timestamp so we don't have to use sleep

+ 3 - 3
bin/drk/src/dao.rs

@@ -1378,7 +1378,7 @@ impl Drk {
         let call = ContractCall { contract_id: *DAO_CONTRACT_ID, data };
         let call = ContractCall { contract_id: *DAO_CONTRACT_ID, data };
         let mut tx_builder = TransactionBuilder::new(ContractCallLeaf { call, proofs }, vec![])?;
         let mut tx_builder = TransactionBuilder::new(ContractCallLeaf { call, proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let mut tx = tx_builder.build()?;
-        let sigs = tx.create_sigs(&mut OsRng, &[dao.secret_key])?;
+        let sigs = tx.create_sigs(&[dao.secret_key])?;
         tx.signatures = vec![sigs];
         tx.signatures = vec![sigs];
 
 
         Ok(tx)
         Ok(tx)
@@ -1582,7 +1582,7 @@ impl Drk {
         let call = ContractCall { contract_id: *DAO_CONTRACT_ID, data };
         let call = ContractCall { contract_id: *DAO_CONTRACT_ID, data };
         let mut tx_builder = TransactionBuilder::new(ContractCallLeaf { call, proofs }, vec![])?;
         let mut tx_builder = TransactionBuilder::new(ContractCallLeaf { call, proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let mut tx = tx_builder.build()?;
-        let sigs = tx.create_sigs(&mut OsRng, &[signature_secret])?;
+        let sigs = tx.create_sigs(&[signature_secret])?;
         tx.signatures = vec![sigs];
         tx.signatures = vec![sigs];
 
 
         Ok(tx)
         Ok(tx)
@@ -1722,7 +1722,7 @@ impl Drk {
         let call = ContractCall { contract_id: *DAO_CONTRACT_ID, data };
         let call = ContractCall { contract_id: *DAO_CONTRACT_ID, data };
         let mut tx_builder = TransactionBuilder::new(ContractCallLeaf { call, proofs }, vec![])?;
         let mut tx_builder = TransactionBuilder::new(ContractCallLeaf { call, proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let mut tx = tx_builder.build()?;
-        let sigs = tx.create_sigs(&mut OsRng, &input_secrets)?;
+        let sigs = tx.create_sigs(&input_secrets)?;
         tx.signatures = vec![sigs];
         tx.signatures = vec![sigs];
 
 
         Ok(tx)
         Ok(tx)

+ 2 - 2
bin/drk/src/swap.rs

@@ -263,7 +263,7 @@ impl Drk {
             TransactionBuilder::new(ContractCallLeaf { call, proofs: full_proofs }, vec![])?;
             TransactionBuilder::new(ContractCallLeaf { call, proofs: full_proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let mut tx = tx_builder.build()?;
         eprintln!("Signing swap transaction");
         eprintln!("Signing swap transaction");
-        let sigs = tx.create_sigs(&mut OsRng, &[debris.signature_secret])?;
+        let sigs = tx.create_sigs(&[debris.signature_secret])?;
         tx.signatures = vec![sigs];
         tx.signatures = vec![sigs];
 
 
         Ok(tx)
         Ok(tx)
@@ -454,7 +454,7 @@ impl Drk {
         };
         };
 
 
         eprintln!("Signing swap transaction");
         eprintln!("Signing swap transaction");
-        let sigs = tx.create_sigs(&mut OsRng, &[skey])?;
+        let sigs = tx.create_sigs(&[skey])?;
         tx.signatures[0].insert(0, sigs[0]);
         tx.signatures[0].insert(0, sigs[0]);
 
 
         Ok(())
         Ok(())

+ 3 - 3
bin/drk/src/token.rs

@@ -258,8 +258,8 @@ impl Drk {
             proofs: vec![mint_debris.proofs, auth_debris.proofs],
             proofs: vec![mint_debris.proofs, auth_debris.proofs],
             signatures: vec![],
             signatures: vec![],
         };
         };
-        let mint_sigs = tx.create_sigs(&mut OsRng, &[])?;
-        let auth_sigs = tx.create_sigs(&mut OsRng, &[mint_authority.secret])?;
+        let mint_sigs = tx.create_sigs(&[])?;
+        let auth_sigs = tx.create_sigs(&[mint_authority.secret])?;
         tx.signatures = vec![mint_sigs, auth_sigs];
         tx.signatures = vec![mint_sigs, auth_sigs];
 
 
         Ok(tx)
         Ok(tx)
@@ -314,7 +314,7 @@ impl Drk {
         let mut tx_builder =
         let mut tx_builder =
             TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![])?;
             TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let mut tx = tx_builder.build()?;
-        let sigs = tx.create_sigs(&mut OsRng, &[mint_authority.secret])?;
+        let sigs = tx.create_sigs(&[mint_authority.secret])?;
         tx.signatures = vec![sigs];
         tx.signatures = vec![sigs];
 
 
         Ok(tx)
         Ok(tx)

+ 1 - 3
bin/drk/src/transfer.rs

@@ -16,8 +16,6 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
  */
 
 
-use rand::rngs::OsRng;
-
 use darkfi::{
 use darkfi::{
     tx::{ContractCallLeaf, Transaction, TransactionBuilder},
     tx::{ContractCallLeaf, Transaction, TransactionBuilder},
     util::parse::{decode_base10, encode_base10},
     util::parse::{decode_base10, encode_base10},
@@ -117,7 +115,7 @@ impl Drk {
         let mut tx_builder =
         let mut tx_builder =
             TransactionBuilder::new(ContractCallLeaf { call, proofs: secrets.proofs }, vec![])?;
             TransactionBuilder::new(ContractCallLeaf { call, proofs: secrets.proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let mut tx = tx_builder.build()?;
-        let sigs = tx.create_sigs(&mut OsRng, &secrets.signature_secrets)?;
+        let sigs = tx.create_sigs(&secrets.signature_secrets)?;
         tx.signatures = vec![sigs];
         tx.signatures = vec![sigs];
 
 
         // We need to mark the coins we've spent in our wallet
         // We need to mark the coins we've spent in our wallet

+ 1 - 2
src/blockchain/block_store.rs

@@ -28,7 +28,6 @@ use darkfi_serial::async_trait;
 
 
 use darkfi_serial::{deserialize, serialize, Encodable, SerialDecodable, SerialEncodable};
 use darkfi_serial::{deserialize, serialize, Encodable, SerialDecodable, SerialEncodable};
 use num_bigint::BigUint;
 use num_bigint::BigUint;
-use rand::rngs::OsRng;
 
 
 use crate::{tx::Transaction, Error, Result};
 use crate::{tx::Transaction, Error, Result};
 
 
@@ -138,7 +137,7 @@ impl BlockInfo {
     /// Sign block header using provided secret key
     /// Sign block header using provided secret key
     // TODO: sign more stuff?
     // TODO: sign more stuff?
     pub fn sign(&mut self, secret_key: &SecretKey) -> Result<()> {
     pub fn sign(&mut self, secret_key: &SecretKey) -> Result<()> {
-        self.signature = secret_key.sign(&mut OsRng, &self.hash()?.as_bytes()[..]);
+        self.signature = secret_key.sign(&self.hash()?.as_bytes()[..]);
 
 
         Ok(())
         Ok(())
     }
     }

+ 3 - 4
src/contract/test-harness/src/contract_deploy.rs

@@ -34,7 +34,6 @@ use darkfi_sdk::{
 };
 };
 use darkfi_serial::AsyncEncodable;
 use darkfi_serial::AsyncEncodable;
 use log::debug;
 use log::debug;
-use rand::rngs::OsRng;
 
 
 use super::{Holder, TestHarness};
 use super::{Holder, TestHarness};
 
 
@@ -76,7 +75,7 @@ impl TestHarness {
         let mut fee_signature_secrets = None;
         let mut fee_signature_secrets = None;
         if self.verify_fees {
         if self.verify_fees {
             let mut tx = tx_builder.build()?;
             let mut tx = tx_builder.build()?;
-            let sigs = tx.create_sigs(&mut OsRng, &[deploy_keypair.secret])?;
+            let sigs = tx.create_sigs(&[deploy_keypair.secret])?;
             tx.signatures = vec![sigs];
             tx.signatures = vec![sigs];
 
 
             let (fee_call, fee_proofs, fee_secrets, _spent_fee_coins, fee_call_params) =
             let (fee_call, fee_proofs, fee_secrets, _spent_fee_coins, fee_call_params) =
@@ -90,10 +89,10 @@ impl TestHarness {
 
 
         // Now build the actual transaction and sign it with necessary keys.
         // Now build the actual transaction and sign it with necessary keys.
         let mut tx = tx_builder.build()?;
         let mut tx = tx_builder.build()?;
-        let sigs = tx.create_sigs(&mut OsRng, &[deploy_keypair.secret])?;
+        let sigs = tx.create_sigs(&[deploy_keypair.secret])?;
         tx.signatures = vec![sigs];
         tx.signatures = vec![sigs];
         if let Some(fee_signature_secrets) = fee_signature_secrets {
         if let Some(fee_signature_secrets) = fee_signature_secrets {
-            let sigs = tx.create_sigs(&mut OsRng, &fee_signature_secrets)?;
+            let sigs = tx.create_sigs(&fee_signature_secrets)?;
             tx.signatures.push(sigs);
             tx.signatures.push(sigs);
         }
         }
 
 

+ 5 - 5
src/contract/test-harness/src/dao_exec.rs

@@ -225,8 +225,8 @@ impl TestHarness {
         if self.verify_fees {
         if self.verify_fees {
             let mut tx = tx_builder.build()?;
             let mut tx = tx_builder.build()?;
             let auth_xfer_sigs = vec![];
             let auth_xfer_sigs = vec![];
-            let xfer_sigs = tx.create_sigs(&mut OsRng, &xfer_secrets.signature_secrets)?;
-            let exec_sigs = tx.create_sigs(&mut OsRng, &[exec_signature_secret])?;
+            let xfer_sigs = tx.create_sigs(&xfer_secrets.signature_secrets)?;
+            let exec_sigs = tx.create_sigs(&[exec_signature_secret])?;
             tx.signatures = vec![auth_xfer_sigs, xfer_sigs, exec_sigs];
             tx.signatures = vec![auth_xfer_sigs, xfer_sigs, exec_sigs];
 
 
             let (fee_call, fee_proofs, fee_secrets, _spent_fee_coins, fee_call_params) =
             let (fee_call, fee_proofs, fee_secrets, _spent_fee_coins, fee_call_params) =
@@ -241,12 +241,12 @@ impl TestHarness {
         // Now build the actual transaction and sign it with necessary keys.
         // Now build the actual transaction and sign it with necessary keys.
         let mut tx = tx_builder.build()?;
         let mut tx = tx_builder.build()?;
         let auth_xfer_sigs = vec![];
         let auth_xfer_sigs = vec![];
-        let xfer_sigs = tx.create_sigs(&mut OsRng, &xfer_secrets.signature_secrets)?;
-        let exec_sigs = tx.create_sigs(&mut OsRng, &[exec_signature_secret])?;
+        let xfer_sigs = tx.create_sigs(&xfer_secrets.signature_secrets)?;
+        let exec_sigs = tx.create_sigs(&[exec_signature_secret])?;
         tx.signatures = vec![auth_xfer_sigs, xfer_sigs, exec_sigs];
         tx.signatures = vec![auth_xfer_sigs, xfer_sigs, exec_sigs];
 
 
         if let Some(fee_signature_secrets) = fee_signature_secrets {
         if let Some(fee_signature_secrets) = fee_signature_secrets {
-            let sigs = tx.create_sigs(&mut OsRng, &fee_signature_secrets)?;
+            let sigs = tx.create_sigs(&fee_signature_secrets)?;
             tx.signatures.push(sigs);
             tx.signatures.push(sigs);
         }
         }
 
 

+ 3 - 4
src/contract/test-harness/src/dao_mint.rs

@@ -35,7 +35,6 @@ use darkfi_sdk::{
 };
 };
 use darkfi_serial::AsyncEncodable;
 use darkfi_serial::AsyncEncodable;
 use log::debug;
 use log::debug;
-use rand::rngs::OsRng;
 
 
 use super::{Holder, TestHarness};
 use super::{Holder, TestHarness};
 
 
@@ -69,7 +68,7 @@ impl TestHarness {
         let mut fee_signature_secrets = None;
         let mut fee_signature_secrets = None;
         if self.verify_fees {
         if self.verify_fees {
             let mut tx = tx_builder.build()?;
             let mut tx = tx_builder.build()?;
-            let sigs = tx.create_sigs(&mut OsRng, &[dao_kp.secret])?;
+            let sigs = tx.create_sigs(&[dao_kp.secret])?;
             tx.signatures = vec![sigs];
             tx.signatures = vec![sigs];
 
 
             let (fee_call, fee_proofs, fee_secrets, _spent_fee_coins, fee_call_params) =
             let (fee_call, fee_proofs, fee_secrets, _spent_fee_coins, fee_call_params) =
@@ -83,10 +82,10 @@ impl TestHarness {
 
 
         // Now build the actual transaction and sign it with necessary keys.
         // Now build the actual transaction and sign it with necessary keys.
         let mut tx = tx_builder.build()?;
         let mut tx = tx_builder.build()?;
-        let sigs = tx.create_sigs(&mut OsRng, &[dao_kp.secret])?;
+        let sigs = tx.create_sigs(&[dao_kp.secret])?;
         tx.signatures = vec![sigs];
         tx.signatures = vec![sigs];
         if let Some(fee_signature_secrets) = fee_signature_secrets {
         if let Some(fee_signature_secrets) = fee_signature_secrets {
-            let sigs = tx.create_sigs(&mut OsRng, &fee_signature_secrets)?;
+            let sigs = tx.create_sigs(&fee_signature_secrets)?;
             tx.signatures.push(sigs);
             tx.signatures.push(sigs);
         }
         }
 
 

+ 3 - 3
src/contract/test-harness/src/dao_propose.rs

@@ -146,7 +146,7 @@ impl TestHarness {
         let mut fee_signature_secrets = None;
         let mut fee_signature_secrets = None;
         if self.verify_fees {
         if self.verify_fees {
             let mut tx = tx_builder.build()?;
             let mut tx = tx_builder.build()?;
-            let sigs = tx.create_sigs(&mut OsRng, &[signature_secret])?;
+            let sigs = tx.create_sigs(&[signature_secret])?;
             tx.signatures = vec![sigs];
             tx.signatures = vec![sigs];
 
 
             let (fee_call, fee_proofs, fee_secrets, _spent_fee_coins, fee_call_params) =
             let (fee_call, fee_proofs, fee_secrets, _spent_fee_coins, fee_call_params) =
@@ -160,10 +160,10 @@ impl TestHarness {
 
 
         // Now build the actual transaction and sign it with necessary keys.
         // Now build the actual transaction and sign it with necessary keys.
         let mut tx = tx_builder.build()?;
         let mut tx = tx_builder.build()?;
-        let sigs = tx.create_sigs(&mut OsRng, &[signature_secret])?;
+        let sigs = tx.create_sigs(&[signature_secret])?;
         tx.signatures = vec![sigs];
         tx.signatures = vec![sigs];
         if let Some(fee_signature_secrets) = fee_signature_secrets {
         if let Some(fee_signature_secrets) = fee_signature_secrets {
-            let sigs = tx.create_sigs(&mut OsRng, &fee_signature_secrets)?;
+            let sigs = tx.create_sigs(&fee_signature_secrets)?;
             tx.signatures.push(sigs);
             tx.signatures.push(sigs);
         }
         }
 
 

+ 3 - 3
src/contract/test-harness/src/dao_vote.rs

@@ -109,7 +109,7 @@ impl TestHarness {
         let mut fee_signature_secrets = None;
         let mut fee_signature_secrets = None;
         if self.verify_fees {
         if self.verify_fees {
             let mut tx = tx_builder.build()?;
             let mut tx = tx_builder.build()?;
-            let sigs = tx.create_sigs(&mut OsRng, &[signature_secret])?;
+            let sigs = tx.create_sigs(&[signature_secret])?;
             tx.signatures = vec![sigs];
             tx.signatures = vec![sigs];
 
 
             let (fee_call, fee_proofs, fee_secrets, _spent_fee_coins, fee_call_params) =
             let (fee_call, fee_proofs, fee_secrets, _spent_fee_coins, fee_call_params) =
@@ -123,10 +123,10 @@ impl TestHarness {
 
 
         // Now build the actual transaction and sign it with necessary keys.
         // Now build the actual transaction and sign it with necessary keys.
         let mut tx = tx_builder.build()?;
         let mut tx = tx_builder.build()?;
-        let sigs = tx.create_sigs(&mut OsRng, &[signature_secret])?;
+        let sigs = tx.create_sigs(&[signature_secret])?;
         tx.signatures = vec![sigs];
         tx.signatures = vec![sigs];
         if let Some(fee_signature_secrets) = fee_signature_secrets {
         if let Some(fee_signature_secrets) = fee_signature_secrets {
-            let sigs = tx.create_sigs(&mut OsRng, &fee_signature_secrets)?;
+            let sigs = tx.create_sigs(&fee_signature_secrets)?;
             tx.signatures.push(sigs);
             tx.signatures.push(sigs);
         }
         }
 
 

+ 1 - 1
src/contract/test-harness/src/money_fee.rs

@@ -148,7 +148,7 @@ impl TestHarness {
         let mut tx_builder =
         let mut tx_builder =
             TransactionBuilder::new(ContractCallLeaf { call, proofs: vec![proof] }, vec![])?;
             TransactionBuilder::new(ContractCallLeaf { call, proofs: vec![proof] }, vec![])?;
         let mut tx = tx_builder.build()?;
         let mut tx = tx_builder.build()?;
-        let sigs = tx.create_sigs(&mut OsRng, &[signature_secret])?;
+        let sigs = tx.create_sigs(&[signature_secret])?;
         tx.signatures = vec![sigs];
         tx.signatures = vec![sigs];
 
 
         Ok((tx, params))
         Ok((tx, params))

+ 1 - 2
src/contract/test-harness/src/money_genesis_mint.rs

@@ -33,7 +33,6 @@ use darkfi_sdk::{
 };
 };
 use darkfi_serial::AsyncEncodable;
 use darkfi_serial::AsyncEncodable;
 use log::debug;
 use log::debug;
-use rand::rngs::OsRng;
 
 
 use super::{Holder, TestHarness};
 use super::{Holder, TestHarness};
 
 
@@ -72,7 +71,7 @@ impl TestHarness {
         let mut tx_builder =
         let mut tx_builder =
             TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![])?;
             TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let mut tx = tx_builder.build()?;
-        let sigs = tx.create_sigs(&mut OsRng, &[wallet.keypair.secret])?;
+        let sigs = tx.create_sigs(&[wallet.keypair.secret])?;
         tx.signatures = vec![sigs];
         tx.signatures = vec![sigs];
 
 
         Ok((tx, debris.params))
         Ok((tx, debris.params))

+ 5 - 5
src/contract/test-harness/src/money_otc_swap.rs

@@ -142,11 +142,11 @@ impl TestHarness {
         let mut fee_signature_secrets = None;
         let mut fee_signature_secrets = None;
         if self.verify_fees {
         if self.verify_fees {
             let mut tx = tx_builder.build()?;
             let mut tx = tx_builder.build()?;
-            let sigs = tx.create_sigs(&mut OsRng, &[debris1.signature_secret])?;
+            let sigs = tx.create_sigs(&[debris1.signature_secret])?;
             tx.signatures = vec![sigs];
             tx.signatures = vec![sigs];
 
 
             // First holder gets the partially signed transaction and adds their signature
             // First holder gets the partially signed transaction and adds their signature
-            let sigs = tx.create_sigs(&mut OsRng, &[debris0.signature_secret])?;
+            let sigs = tx.create_sigs(&[debris0.signature_secret])?;
             tx.signatures[0].insert(0, sigs[0]);
             tx.signatures[0].insert(0, sigs[0]);
 
 
             let (fee_call, fee_proofs, fee_secrets, _spent_fee_coins, fee_call_params) =
             let (fee_call, fee_proofs, fee_secrets, _spent_fee_coins, fee_call_params) =
@@ -160,14 +160,14 @@ impl TestHarness {
 
 
         // Now build the actual transaction and sign it with necessary keys.
         // Now build the actual transaction and sign it with necessary keys.
         let mut tx = tx_builder.build()?;
         let mut tx = tx_builder.build()?;
-        let sigs = tx.create_sigs(&mut OsRng, &[debris1.signature_secret])?;
+        let sigs = tx.create_sigs(&[debris1.signature_secret])?;
         tx.signatures = vec![sigs];
         tx.signatures = vec![sigs];
         // First holder gets the partially signed transaction and adds their signature
         // First holder gets the partially signed transaction and adds their signature
-        let sigs = tx.create_sigs(&mut OsRng, &[debris0.signature_secret])?;
+        let sigs = tx.create_sigs(&[debris0.signature_secret])?;
         tx.signatures[0].insert(0, sigs[0]);
         tx.signatures[0].insert(0, sigs[0]);
 
 
         if let Some(fee_signature_secrets) = fee_signature_secrets {
         if let Some(fee_signature_secrets) = fee_signature_secrets {
-            let sigs = tx.create_sigs(&mut OsRng, &fee_signature_secrets)?;
+            let sigs = tx.create_sigs(&fee_signature_secrets)?;
             tx.signatures.push(sigs);
             tx.signatures.push(sigs);
         }
         }
 
 

+ 1 - 2
src/contract/test-harness/src/money_pow_reward.rs

@@ -34,7 +34,6 @@ use darkfi_sdk::{
 };
 };
 use darkfi_serial::AsyncEncodable;
 use darkfi_serial::AsyncEncodable;
 use log::info;
 use log::info;
-use rand::rngs::OsRng;
 
 
 use super::{Holder, TestHarness};
 use super::{Holder, TestHarness};
 
 
@@ -89,7 +88,7 @@ impl TestHarness {
         let mut tx_builder =
         let mut tx_builder =
             TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![])?;
             TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let mut tx = tx_builder.build()?;
-        let sigs = tx.create_sigs(&mut OsRng, &[wallet.keypair.secret])?;
+        let sigs = tx.create_sigs(&[wallet.keypair.secret])?;
         tx.signatures = vec![sigs];
         tx.signatures = vec![sigs];
 
 
         Ok((tx, debris.params))
         Ok((tx, debris.params))

+ 8 - 8
src/contract/test-harness/src/money_token.rs

@@ -140,8 +140,8 @@ impl TestHarness {
         let mut fee_signature_secrets = None;
         let mut fee_signature_secrets = None;
         if self.verify_fees {
         if self.verify_fees {
             let mut tx = tx_builder.build()?;
             let mut tx = tx_builder.build()?;
-            let mint_sigs = tx.create_sigs(&mut OsRng, &[])?;
-            let auth_sigs = tx.create_sigs(&mut OsRng, &[mint_authority.secret])?;
+            let mint_sigs = tx.create_sigs(&[])?;
+            let auth_sigs = tx.create_sigs(&[mint_authority.secret])?;
             tx.signatures = vec![mint_sigs, auth_sigs];
             tx.signatures = vec![mint_sigs, auth_sigs];
 
 
             let (fee_call, fee_proofs, fee_secrets, _spent_fee_coins, fee_call_params) =
             let (fee_call, fee_proofs, fee_secrets, _spent_fee_coins, fee_call_params) =
@@ -155,11 +155,11 @@ impl TestHarness {
 
 
         // Now build the actual transaction and sign it with necessary keys.
         // Now build the actual transaction and sign it with necessary keys.
         let mut tx = tx_builder.build()?;
         let mut tx = tx_builder.build()?;
-        let mint_sigs = tx.create_sigs(&mut OsRng, &[])?;
-        let auth_sigs = tx.create_sigs(&mut OsRng, &[mint_authority.secret])?;
+        let mint_sigs = tx.create_sigs(&[])?;
+        let auth_sigs = tx.create_sigs(&[mint_authority.secret])?;
         tx.signatures = vec![mint_sigs, auth_sigs];
         tx.signatures = vec![mint_sigs, auth_sigs];
         if let Some(fee_signature_secrets) = fee_signature_secrets {
         if let Some(fee_signature_secrets) = fee_signature_secrets {
-            let sigs = tx.create_sigs(&mut OsRng, &fee_signature_secrets)?;
+            let sigs = tx.create_sigs(&fee_signature_secrets)?;
             tx.signatures.push(sigs);
             tx.signatures.push(sigs);
         }
         }
 
 
@@ -296,7 +296,7 @@ impl TestHarness {
         let mut fee_signature_secrets = None;
         let mut fee_signature_secrets = None;
         if self.verify_fees {
         if self.verify_fees {
             let mut tx = tx_builder.build()?;
             let mut tx = tx_builder.build()?;
-            let freeze_sigs = tx.create_sigs(&mut OsRng, &[mint_authority.secret])?;
+            let freeze_sigs = tx.create_sigs(&[mint_authority.secret])?;
             tx.signatures = vec![freeze_sigs];
             tx.signatures = vec![freeze_sigs];
 
 
             let (fee_call, fee_proofs, fee_secrets, _spent_fee_coins, fee_call_params) =
             let (fee_call, fee_proofs, fee_secrets, _spent_fee_coins, fee_call_params) =
@@ -310,10 +310,10 @@ impl TestHarness {
 
 
         // Now build the actual transaction and sign it with necessary keys.
         // Now build the actual transaction and sign it with necessary keys.
         let mut tx = tx_builder.build()?;
         let mut tx = tx_builder.build()?;
-        let freeze_sigs = tx.create_sigs(&mut OsRng, &[mint_authority.secret])?;
+        let freeze_sigs = tx.create_sigs(&[mint_authority.secret])?;
         tx.signatures = vec![freeze_sigs];
         tx.signatures = vec![freeze_sigs];
         if let Some(fee_signature_secrets) = fee_signature_secrets {
         if let Some(fee_signature_secrets) = fee_signature_secrets {
-            let sigs = tx.create_sigs(&mut OsRng, &fee_signature_secrets)?;
+            let sigs = tx.create_sigs(&fee_signature_secrets)?;
             tx.signatures.push(sigs);
             tx.signatures.push(sigs);
         }
         }
 
 

+ 3 - 4
src/contract/test-harness/src/money_transfer.rs

@@ -31,7 +31,6 @@ use darkfi_sdk::{
 };
 };
 use darkfi_serial::AsyncEncodable;
 use darkfi_serial::AsyncEncodable;
 use log::debug;
 use log::debug;
-use rand::rngs::OsRng;
 
 
 use super::{Holder, TestHarness};
 use super::{Holder, TestHarness};
 
 
@@ -90,7 +89,7 @@ impl TestHarness {
         let mut fee_signature_secrets = None;
         let mut fee_signature_secrets = None;
         if self.verify_fees {
         if self.verify_fees {
             let mut tx = tx_builder.build()?;
             let mut tx = tx_builder.build()?;
-            let sigs = tx.create_sigs(&mut OsRng, &secrets.signature_secrets)?;
+            let sigs = tx.create_sigs(&secrets.signature_secrets)?;
             tx.signatures = vec![sigs];
             tx.signatures = vec![sigs];
 
 
             let (fee_call, fee_proofs, fee_secrets, spent_fee_coins, fee_call_params) =
             let (fee_call, fee_proofs, fee_secrets, spent_fee_coins, fee_call_params) =
@@ -105,10 +104,10 @@ impl TestHarness {
 
 
         // Now build the actual transaction and sign it with all necessary keys.
         // Now build the actual transaction and sign it with all necessary keys.
         let mut tx = tx_builder.build()?;
         let mut tx = tx_builder.build()?;
-        let sigs = tx.create_sigs(&mut OsRng, &secrets.signature_secrets)?;
+        let sigs = tx.create_sigs(&secrets.signature_secrets)?;
         tx.signatures = vec![sigs];
         tx.signatures = vec![sigs];
         if let Some(fee_signature_secrets) = fee_signature_secrets {
         if let Some(fee_signature_secrets) = fee_signature_secrets {
-            let sigs = tx.create_sigs(&mut OsRng, &fee_signature_secrets)?;
+            let sigs = tx.create_sigs(&fee_signature_secrets)?;
             tx.signatures.push(sigs);
             tx.signatures.push(sigs);
         }
         }
 
 

+ 8 - 7
src/sdk/src/crypto/schnorr.rs

@@ -21,10 +21,9 @@ use darkfi_serial::async_trait;
 use darkfi_serial::{SerialDecodable, SerialEncodable};
 use darkfi_serial::{SerialDecodable, SerialEncodable};
 use halo2_gadgets::ecc::chip::FixedPoint;
 use halo2_gadgets::ecc::chip::FixedPoint;
 use pasta_curves::{
 use pasta_curves::{
-    group::{ff::Field, Group, GroupEncoding},
+    group::{ff::PrimeField, Group, GroupEncoding},
     pallas,
     pallas,
 };
 };
-use rand_core::{CryptoRng, RngCore};
 
 
 use super::{
 use super::{
     constants::{NullifierK, DRK_SCHNORR_DOMAIN},
     constants::{NullifierK, DRK_SCHNORR_DOMAIN},
@@ -48,8 +47,8 @@ impl Signature {
 
 
 /// Trait for secret keys that implements a signature creation
 /// Trait for secret keys that implements a signature creation
 pub trait SchnorrSecret {
 pub trait SchnorrSecret {
-    /// Sign a given message, using `rng` as source of randomness.
-    fn sign(&self, rng: &mut (impl CryptoRng + RngCore), message: &[u8]) -> Signature;
+    /// Sign a given message
+    fn sign(&self, message: &[u8]) -> Signature;
 }
 }
 
 
 /// Trait for public keys that implements a signature verification
 /// Trait for public keys that implements a signature verification
@@ -60,8 +59,10 @@ pub trait SchnorrPublic {
 
 
 /// Schnorr signature trait implementations for the stuff in `keypair.rs`
 /// Schnorr signature trait implementations for the stuff in `keypair.rs`
 impl SchnorrSecret for SecretKey {
 impl SchnorrSecret for SecretKey {
-    fn sign(&self, rng: &mut (impl CryptoRng + RngCore), message: &[u8]) -> Signature {
-        let mask = pallas::Scalar::random(rng);
+    fn sign(&self, message: &[u8]) -> Signature {
+        // Derive a deterministic nonce
+        let mask = hash_to_scalar(DRK_SCHNORR_DOMAIN, &[&self.inner().to_repr(), message]);
+
         let commit = NullifierK.generator() * mask;
         let commit = NullifierK.generator() * mask;
 
 
         let commit_bytes = commit.to_bytes();
         let commit_bytes = commit.to_bytes();
@@ -96,7 +97,7 @@ mod tests {
     fn test_schnorr_signature() {
     fn test_schnorr_signature() {
         let secret = SecretKey::random(&mut OsRng);
         let secret = SecretKey::random(&mut OsRng);
         let message: &[u8] = b"aaaahhhh i'm signiiinngg";
         let message: &[u8] = b"aaaahhhh i'm signiiinngg";
-        let signature = secret.sign(&mut OsRng, message);
+        let signature = secret.sign(message);
         let public = PublicKey::from_secret(secret);
         let public = PublicKey::from_secret(secret);
         assert!(public.verify(message, &signature));
         assert!(public.verify(message, &signature));
 
 

+ 2 - 7
src/tx/mod.rs

@@ -34,7 +34,6 @@ use darkfi_serial::async_trait;
 
 
 use darkfi_serial::{Encodable, SerialDecodable, SerialEncodable};
 use darkfi_serial::{Encodable, SerialDecodable, SerialEncodable};
 use log::{debug, error};
 use log::{debug, error};
-use rand::{CryptoRng, RngCore};
 
 
 use crate::{
 use crate::{
     error::TxVerifyFailed,
     error::TxVerifyFailed,
@@ -158,11 +157,7 @@ impl Transaction {
     }
     }
 
 
     /// Create Schnorr signatures for the entire transaction.
     /// Create Schnorr signatures for the entire transaction.
-    pub fn create_sigs(
-        &self,
-        rng: &mut (impl CryptoRng + RngCore),
-        secret_keys: &[SecretKey],
-    ) -> Result<Vec<Signature>> {
+    pub fn create_sigs(&self, secret_keys: &[SecretKey]) -> Result<Vec<Signature>> {
         // Hash the transaction without the signatures
         // Hash the transaction without the signatures
         let mut hasher = blake3::Hasher::new();
         let mut hasher = blake3::Hasher::new();
         self.calls.encode(&mut hasher)?;
         self.calls.encode(&mut hasher)?;
@@ -180,7 +175,7 @@ impl Transaction {
                 target: "tx::create_sigs",
                 target: "tx::create_sigs",
                 "[TX] Creating signature with public key: {}", PublicKey::from_secret(*secret),
                 "[TX] Creating signature with public key: {}", PublicKey::from_secret(*secret),
             );
             );
-            let signature = secret.sign(rng, &data_hash.as_bytes()[..]);
+            let signature = secret.sign(&data_hash.as_bytes()[..]);
             sigs.push(signature);
             sigs.push(signature);
         }
         }