From 85a16a2f04c35929ced1052da89d9c781cc209c1 Mon Sep 17 00:00:00 2001 From: Oleksandr Pravdyvyi Date: Wed, 17 Sep 2025 08:59:14 +0300 Subject: [PATCH] fix: revers of scalar dep --- .../src/key_management/ephemeral_key_holder.rs | 6 ++---- key_protocol/src/key_management/mod.rs | 7 ++++--- key_protocol/src/key_management/secret_holders.rs | 15 ++++++--------- nssa/core/src/encryption/mod.rs | 2 ++ nssa/core/src/encryption/shared_key_derivation.rs | 7 ++++--- .../src/privacy_preserving_transaction/circuit.rs | 7 +++---- .../src/privacy_preserving_transaction/message.rs | 5 ++--- nssa/src/state.rs | 15 +++++++-------- 8 files changed, 30 insertions(+), 34 deletions(-) diff --git a/key_protocol/src/key_management/ephemeral_key_holder.rs b/key_protocol/src/key_management/ephemeral_key_holder.rs index e62d9b6..b4835ff 100644 --- a/key_protocol/src/key_management/ephemeral_key_holder.rs +++ b/key_protocol/src/key_management/ephemeral_key_holder.rs @@ -1,5 +1,3 @@ -use elliptic_curve::PrimeField; -use k256::Scalar; use log::info; use nssa_core::{ NullifierPublicKey, SharedSecretKey, @@ -29,11 +27,11 @@ impl EphemeralKeyHolder { let hash_recepient = hasher.finalize(); let mut hasher = sha2::Sha256::new(); - hasher.update(sender_outgoing_viewing_secret_key.to_bytes()); + hasher.update(sender_outgoing_viewing_secret_key); hasher.update(hash_recepient); Self { - ephemeral_secret_key: Scalar::from_repr(hasher.finalize()).unwrap(), + ephemeral_secret_key: hasher.finalize().into(), } } diff --git a/key_protocol/src/key_management/mod.rs b/key_protocol/src/key_management/mod.rs index bcd3796..5f5f2aa 100644 --- a/key_protocol/src/key_management/mod.rs +++ b/key_protocol/src/key_management/mod.rs @@ -98,8 +98,8 @@ impl KeyChain { #[cfg(test)] mod tests { use aes_gcm::aead::OsRng; - use elliptic_curve::ff::Field; - use k256::{AffinePoint, Scalar}; + use k256::AffinePoint; + use rand::RngCore; use super::*; @@ -117,7 +117,8 @@ mod tests { let address_key_holder = KeyChain::new_os_random(); // Generate a random ephemeral public key sender - let scalar = Scalar::random(&mut OsRng); + let mut scalar = [0; 32]; + OsRng.fill_bytes(&mut scalar); let ephemeral_public_key_sender = EphemeralPublicKey::from_scalar(scalar); // Calculate shared secret diff --git a/key_protocol/src/key_management/secret_holders.rs b/key_protocol/src/key_management/secret_holders.rs index eb59b40..80ec1b0 100644 --- a/key_protocol/src/key_management/secret_holders.rs +++ b/key_protocol/src/key_management/secret_holders.rs @@ -1,8 +1,9 @@ use bip39::Mnemonic; use common::TreeHashType; -use elliptic_curve::PrimeField; -use k256::Scalar; -use nssa_core::{NullifierPublicKey, NullifierSecretKey, encryption::IncomingViewingPublicKey}; +use nssa_core::{ + NullifierPublicKey, NullifierSecretKey, + encryption::{IncomingViewingPublicKey, Scalar}, +}; use rand::{RngCore, rngs::OsRng}; use serde::{Deserialize, Serialize}; use sha2::{Digest, digest::FixedOutput}; @@ -79,9 +80,7 @@ impl SecretSpendingKey { hasher.update([2u8]); hasher.update([0u8; 22]); - let hash = ::from(hasher.finalize_fixed()); - - IncomingViewingSecretKey::from_repr(hash.into()).unwrap() + ::from(hasher.finalize_fixed()) } pub fn generate_outgoing_viewing_secret_key(&self) -> OutgoingViewingSecretKey { @@ -92,9 +91,7 @@ impl SecretSpendingKey { hasher.update([3u8]); hasher.update([0u8; 22]); - let hash = ::from(hasher.finalize_fixed()); - - OutgoingViewingSecretKey::from_repr(hash.into()).unwrap() + ::from(hasher.finalize_fixed()) } pub fn produce_private_key_holder(&self) -> PrivateKeyHolder { diff --git a/nssa/core/src/encryption/mod.rs b/nssa/core/src/encryption/mod.rs index b79e75c..7b8d51f 100644 --- a/nssa/core/src/encryption/mod.rs +++ b/nssa/core/src/encryption/mod.rs @@ -13,6 +13,8 @@ pub use shared_key_derivation::{EphemeralPublicKey, EphemeralSecretKey, Incoming use crate::{Commitment, account::Account}; +pub type Scalar = [u8; 32]; + #[derive(Serialize, Deserialize, Clone)] pub struct SharedSecretKey([u8; 32]); diff --git a/nssa/core/src/encryption/shared_key_derivation.rs b/nssa/core/src/encryption/shared_key_derivation.rs index 6392d6a..a889123 100644 --- a/nssa/core/src/encryption/shared_key_derivation.rs +++ b/nssa/core/src/encryption/shared_key_derivation.rs @@ -1,14 +1,14 @@ use serde::{Deserialize, Serialize}; use k256::{ - AffinePoint, EncodedPoint, FieldBytes, ProjectivePoint, Scalar, + AffinePoint, EncodedPoint, FieldBytes, ProjectivePoint, elliptic_curve::{ PrimeField, sec1::{FromEncodedPoint, ToEncodedPoint}, }, }; -use crate::SharedSecretKey; +use crate::{SharedSecretKey, encryption::Scalar}; #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] pub struct Secp256k1Point(pub(crate) Vec); @@ -16,7 +16,7 @@ pub struct Secp256k1Point(pub(crate) Vec); impl Secp256k1Point { pub fn from_scalar(value: Scalar) -> Secp256k1Point { let x_bytes: FieldBytes = value.into(); - let x = Scalar::from_repr(x_bytes).unwrap(); + let x = k256::Scalar::from_repr(x_bytes).unwrap(); let p = ProjectivePoint::GENERATOR * x; let q = AffinePoint::from(p); @@ -37,6 +37,7 @@ impl From<&EphemeralSecretKey> for EphemeralPublicKey { impl SharedSecretKey { pub fn new(scalar: &Scalar, point: &Secp256k1Point) -> Self { + let scalar = k256::Scalar::from_repr((*scalar).into()).unwrap(); let point: [u8; 33] = point.0.clone().try_into().unwrap(); let encoded = EncodedPoint::from_bytes(point).unwrap(); diff --git a/nssa/src/privacy_preserving_transaction/circuit.rs b/nssa/src/privacy_preserving_transaction/circuit.rs index f350ccf..fef44bc 100644 --- a/nssa/src/privacy_preserving_transaction/circuit.rs +++ b/nssa/src/privacy_preserving_transaction/circuit.rs @@ -88,7 +88,6 @@ impl Proof { #[cfg(test)] mod tests { - use k256::{Scalar, elliptic_curve::PrimeField}; use nssa_core::{ Commitment, EncryptionScheme, Nullifier, account::{Account, AccountWithMetadata}, @@ -140,7 +139,7 @@ mod tests { let expected_sender_pre = sender.clone(); let recipient_keys = test_private_account_keys_1(); - let esk = Scalar::from_repr([3; 32].into()).unwrap(); + let esk = [3; 32]; let shared_secret = SharedSecretKey::new(&esk, &recipient_keys.ivk()); let (output, proof) = execute_and_prove( @@ -221,10 +220,10 @@ mod tests { Commitment::new(&recipient_keys.npk(), &expected_private_account_2), ]; - let esk_1 = Scalar::from_repr([3; 32].into()).unwrap(); + let esk_1 = [3; 32].into(); let shared_secret_1 = SharedSecretKey::new(&esk_1, &sender_keys.ivk()); - let esk_2 = Scalar::from_repr([5; 32].into()).unwrap(); + let esk_2 = [5; 32]; let shared_secret_2 = SharedSecretKey::new(&esk_2, &recipient_keys.ivk()); let (output, proof) = execute_and_prove( diff --git a/nssa/src/privacy_preserving_transaction/message.rs b/nssa/src/privacy_preserving_transaction/message.rs index 9023e52..a769c72 100644 --- a/nssa/src/privacy_preserving_transaction/message.rs +++ b/nssa/src/privacy_preserving_transaction/message.rs @@ -90,7 +90,6 @@ impl Message { #[cfg(test)] pub mod tests { - use k256::{Scalar, elliptic_curve::PrimeField}; use std::io::Cursor; use nssa_core::{ @@ -152,10 +151,10 @@ pub mod tests { #[test] fn test_encrypted_account_data_constructor() { let npk = NullifierPublicKey::from(&[1; 32]); - let ivk = IncomingViewingPublicKey::from(&Scalar::from_repr([2; 32].into()).unwrap()); + let ivk = IncomingViewingPublicKey::from_scalar([2; 32]); let account = Account::default(); let commitment = Commitment::new(&npk, &account); - let esk = Scalar::from_repr([3; 32].into()).unwrap(); + let esk = [3; 32]; let shared_secret = SharedSecretKey::new(&esk, &ivk); let epk = EphemeralPublicKey::from_scalar(esk); let ciphertext = EncryptionScheme::encrypt(&account, &shared_secret, &commitment, 2); diff --git a/nssa/src/state.rs b/nssa/src/state.rs index 71e5f5e..7922bad 100644 --- a/nssa/src/state.rs +++ b/nssa/src/state.rs @@ -227,11 +227,10 @@ pub mod tests { signature::PrivateKey, }; - use k256::{Scalar, elliptic_curve::PrimeField}; use nssa_core::{ Commitment, Nullifier, NullifierPublicKey, NullifierSecretKey, SharedSecretKey, account::{Account, AccountWithMetadata, Nonce}, - encryption::{EphemeralPublicKey, IncomingViewingPublicKey}, + encryption::{EphemeralPublicKey, IncomingViewingPublicKey, Scalar}, }; fn transfer_transaction( @@ -760,14 +759,14 @@ pub mod tests { pub fn test_private_account_keys_1() -> TestPrivateKeys { TestPrivateKeys { nsk: [13; 32], - isk: Scalar::from_repr([31; 32].into()).unwrap(), + isk: [31; 32], } } pub fn test_private_account_keys_2() -> TestPrivateKeys { TestPrivateKeys { nsk: [38; 32], - isk: Scalar::from_repr([83; 32].into()).unwrap(), + isk: [83; 32], } } @@ -789,7 +788,7 @@ pub mod tests { is_authorized: false, }; - let esk = Scalar::from_repr([3; 32].into()).unwrap(); + let esk = [3; 32]; let shared_secret = SharedSecretKey::new(&esk, &recipient_keys.ivk()); let epk = EphemeralPublicKey::from_scalar(esk); @@ -835,11 +834,11 @@ pub mod tests { is_authorized: false, }; - let esk_1 = Scalar::from_repr([3; 32].into()).unwrap(); + let esk_1 = [3; 32]; let shared_secret_1 = SharedSecretKey::new(&esk_1, &sender_keys.ivk()); let epk_1 = EphemeralPublicKey::from_scalar(esk_1); - let esk_2 = Scalar::from_repr([3; 32].into()).unwrap(); + let esk_2 = [3; 32]; let shared_secret_2 = SharedSecretKey::new(&esk_2, &recipient_keys.ivk()); let epk_2 = EphemeralPublicKey::from_scalar(esk_2); @@ -895,7 +894,7 @@ pub mod tests { is_authorized: false, }; - let esk = Scalar::from_repr([3; 32].into()).unwrap(); + let esk = [3; 32]; let shared_secret = SharedSecretKey::new(&esk, &sender_keys.ivk()); let epk = EphemeralPublicKey::from_scalar(esk);