From 4bdd2c6d9fa53b485369f4d0a11176a830edaee0 Mon Sep 17 00:00:00 2001 From: Sergio Chouhy Date: Wed, 13 Aug 2025 01:49:17 -0300 Subject: [PATCH] add try_new test --- nssa/src/signature/bip340_test_vectors.rs | 34 ++++++++++----------- nssa/src/signature/encoding.rs | 2 +- nssa/src/signature/private_key.rs | 1 - nssa/src/signature/public_key.rs | 36 +++++++++++++++++++++-- 4 files changed, 51 insertions(+), 22 deletions(-) diff --git a/nssa/src/signature/bip340_test_vectors.rs b/nssa/src/signature/bip340_test_vectors.rs index 4ee008c..0e91bcb 100644 --- a/nssa/src/signature/bip340_test_vectors.rs +++ b/nssa/src/signature/bip340_test_vectors.rs @@ -22,7 +22,7 @@ pub fn test_vectors() -> Vec { seckey: Some(PrivateKey::try_new(hex_to_bytes( "0000000000000000000000000000000000000000000000000000000000000003", )).unwrap()), - pubkey: PublicKey::new(hex_to_bytes( + pubkey: PublicKey::try_new(hex_to_bytes( "F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9", )).unwrap(), aux_rand: Some(hex_to_bytes::<32>( @@ -43,7 +43,7 @@ pub fn test_vectors() -> Vec { seckey: Some(PrivateKey::try_new(hex_to_bytes( "B7E151628AED2A6ABF7158809CF4F3C762E7160F38B4DA56A784D9045190CFEF", )).unwrap()), - pubkey: PublicKey::new(hex_to_bytes( + pubkey: PublicKey::try_new(hex_to_bytes( "DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", )).unwrap(), aux_rand: Some(hex_to_bytes::<32>( @@ -64,7 +64,7 @@ pub fn test_vectors() -> Vec { seckey: Some(PrivateKey::try_new(hex_to_bytes( "C90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B14E5C9", )).unwrap()), - pubkey: PublicKey::new(hex_to_bytes( + pubkey: PublicKey::try_new(hex_to_bytes( "DD308AFEC5777E13121FA72B9CC1B7CC0139715309B086C960E18FD969774EB8", )).unwrap(), aux_rand: Some(hex_to_bytes::<32>( @@ -85,7 +85,7 @@ pub fn test_vectors() -> Vec { seckey: Some(PrivateKey::try_new(hex_to_bytes( "0B432B2677937381AEF05BB02A66ECD012773062CF3FA2549E44F58ED2401710", )).unwrap()), - pubkey: PublicKey::new(hex_to_bytes( + pubkey: PublicKey::try_new(hex_to_bytes( "25D1DFF95105F5253C4022F628A996AD3A0D95FBF21D468A1B33F8C160D8F517", )).unwrap(), aux_rand: Some(hex_to_bytes::<32>( @@ -104,7 +104,7 @@ pub fn test_vectors() -> Vec { }, TestVector { seckey: None, - pubkey: PublicKey::new(hex_to_bytes( + pubkey: PublicKey::try_new(hex_to_bytes( "D69C3509BB99E412E68B0FE8544E72837DFA30746D8BE2AA65975F29D22DC7B9", )).unwrap(), aux_rand: None, @@ -138,7 +138,7 @@ pub fn test_vectors() -> Vec { // }, TestVector { seckey: None, - pubkey: PublicKey::new(hex_to_bytes( + pubkey: PublicKey::try_new(hex_to_bytes( "DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", )).unwrap(), aux_rand: None, @@ -155,7 +155,7 @@ pub fn test_vectors() -> Vec { }, TestVector { seckey: None, - pubkey: PublicKey::new(hex_to_bytes( + pubkey: PublicKey::try_new(hex_to_bytes( "DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", )).unwrap(), aux_rand: None, @@ -172,7 +172,7 @@ pub fn test_vectors() -> Vec { }, TestVector { seckey: None, - pubkey: PublicKey::new(hex_to_bytes( + pubkey: PublicKey::try_new(hex_to_bytes( "DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", )).unwrap(), aux_rand: None, @@ -189,7 +189,7 @@ pub fn test_vectors() -> Vec { }, TestVector { seckey: None, - pubkey: PublicKey::new(hex_to_bytes( + pubkey: PublicKey::try_new(hex_to_bytes( "DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", )).unwrap(), aux_rand: None, @@ -206,7 +206,7 @@ pub fn test_vectors() -> Vec { }, TestVector { seckey: None, - pubkey: PublicKey::new(hex_to_bytes( + pubkey: PublicKey::try_new(hex_to_bytes( "DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", )).unwrap(), aux_rand: None, @@ -223,7 +223,7 @@ pub fn test_vectors() -> Vec { }, TestVector { seckey: None, - pubkey: PublicKey::new(hex_to_bytes( + pubkey: PublicKey::try_new(hex_to_bytes( "DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", )).unwrap(), aux_rand: None, @@ -240,7 +240,7 @@ pub fn test_vectors() -> Vec { }, TestVector { seckey: None, - pubkey: PublicKey::new(hex_to_bytes( + pubkey: PublicKey::try_new(hex_to_bytes( "DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", )).unwrap(), aux_rand: None, @@ -257,7 +257,7 @@ pub fn test_vectors() -> Vec { }, TestVector { seckey: None, - pubkey: PublicKey::new(hex_to_bytes( + pubkey: PublicKey::try_new(hex_to_bytes( "DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", )).unwrap(), aux_rand: None, @@ -293,7 +293,7 @@ pub fn test_vectors() -> Vec { seckey: Some(PrivateKey::try_new(hex_to_bytes( "0340034003400340034003400340034003400340034003400340034003400340", )).unwrap()), - pubkey: PublicKey::new(hex_to_bytes( + pubkey: PublicKey::try_new(hex_to_bytes( "778CAA53B4393AC467774D09497A87224BF9FAB6F6E68B23086497324D6FD117", )).unwrap(), aux_rand: Some(hex_to_bytes::<32>( @@ -311,7 +311,7 @@ pub fn test_vectors() -> Vec { seckey: Some(PrivateKey::try_new(hex_to_bytes( "0340034003400340034003400340034003400340034003400340034003400340", )).unwrap()), - pubkey: PublicKey::new(hex_to_bytes( + pubkey: PublicKey::try_new(hex_to_bytes( "778CAA53B4393AC467774D09497A87224BF9FAB6F6E68B23086497324D6FD117", )).unwrap(), aux_rand: Some(hex_to_bytes::<32>( @@ -329,7 +329,7 @@ pub fn test_vectors() -> Vec { seckey: Some(PrivateKey::try_new(hex_to_bytes( "0340034003400340034003400340034003400340034003400340034003400340", )).unwrap()), - pubkey: PublicKey::new(hex_to_bytes( + pubkey: PublicKey::try_new(hex_to_bytes( "778CAA53B4393AC467774D09497A87224BF9FAB6F6E68B23086497324D6FD117", )).unwrap(), aux_rand: Some(hex_to_bytes::<32>( @@ -347,7 +347,7 @@ pub fn test_vectors() -> Vec { seckey: Some(PrivateKey::try_new(hex_to_bytes( "0340034003400340034003400340034003400340034003400340034003400340", )).unwrap()), - pubkey: PublicKey::new(hex_to_bytes( + pubkey: PublicKey::try_new(hex_to_bytes( "778CAA53B4393AC467774D09497A87224BF9FAB6F6E68B23086497324D6FD117", )).unwrap(), aux_rand: Some(hex_to_bytes::<32>( diff --git a/nssa/src/signature/encoding.rs b/nssa/src/signature/encoding.rs index db5d67e..a3544be 100644 --- a/nssa/src/signature/encoding.rs +++ b/nssa/src/signature/encoding.rs @@ -6,7 +6,7 @@ impl PublicKey { pub(crate) fn from_cursor(cursor: &mut Cursor<&[u8]>) -> Result { let mut value = [0u8; 32]; cursor.read_exact(&mut value)?; - Ok(Self::new(value)?) + Ok(Self::try_new(value)?) } pub(crate) fn to_bytes(&self) -> &[u8] { diff --git a/nssa/src/signature/private_key.rs b/nssa/src/signature/private_key.rs index fb5a11c..a0a7c0c 100644 --- a/nssa/src/signature/private_key.rs +++ b/nssa/src/signature/private_key.rs @@ -2,7 +2,6 @@ use serde::{Deserialize, Serialize}; use crate::error::NssaError; -// TODO: Dummy impl. Replace by actual private key. // TODO: Remove Debug, Clone, Serialize, Deserialize, PartialEq and Eq for security reasons // TODO: Implement Zeroize #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] diff --git a/nssa/src/signature/public_key.rs b/nssa/src/signature/public_key.rs index 55f6a00..d83af30 100644 --- a/nssa/src/signature/public_key.rs +++ b/nssa/src/signature/public_key.rs @@ -1,6 +1,5 @@ use crate::{PrivateKey, error::NssaError}; -// TODO: Dummy impl. Replace by actual public key. #[derive(Debug, Clone, PartialEq, Eq)] pub struct PublicKey([u8; 32]); @@ -16,7 +15,7 @@ impl PublicKey { Self(value) } - pub fn new(value: [u8; 32]) -> Result { + pub fn try_new(value: [u8; 32]) -> Result { // Check point is valid let _ = secp256k1::XOnlyPublicKey::from_byte_array(value) .map_err(|_| NssaError::InvalidPublicKey)?; @@ -30,7 +29,38 @@ impl PublicKey { #[cfg(test)] mod test { - use crate::{PublicKey, signature::bip340_test_vectors}; + use crate::{PublicKey, error::NssaError, signature::bip340_test_vectors}; + + #[test] + fn test_try_new_invalid_public_key_from_bip340_test_vectors_5() { + let value_invalid_key = [ + 238, 253, 234, 76, 219, 103, 119, 80, 164, 32, 254, 232, 7, 234, 207, 33, 235, 152, + 152, 174, 121, 185, 118, 135, 102, 228, 250, 160, 74, 45, 74, 52, + ]; + + let result = PublicKey::try_new(value_invalid_key); + + assert!(matches!(result, Err(NssaError::InvalidPublicKey))); + } + + fn test_try_new_invalid_public_key_from_bip340_test_vector_14() { + let value_invalid_key = [ + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 255, 255, 252, 48, + ]; + + let result = PublicKey::try_new(value_invalid_key); + + assert!(matches!(result, Err(NssaError::InvalidPublicKey))); + } + + fn test_try_new_valid_public_keys() { + for (i, test_vector) in bip340_test_vectors::test_vectors().into_iter().enumerate() { + let expected_public_key = test_vector.pubkey; + let public_key = PublicKey::try_new(*expected_public_key.value()).unwrap(); + assert_eq!(public_key, expected_public_key); + } + } #[test] fn test_public_key_generation_from_bip340_test_vectors() {