diff --git a/key_protocol/src/key_management/key_tree/keys_private.rs b/key_protocol/src/key_management/key_tree/keys_private.rs index 67d2a29..67ebacf 100644 --- a/key_protocol/src/key_management/key_tree/keys_private.rs +++ b/key_protocol/src/key_management/key_tree/keys_private.rs @@ -1,8 +1,8 @@ +use common::HashType; use k256::{Scalar, elliptic_curve::PrimeField}; use nssa_core::{NullifierPublicKey, encryption::IncomingViewingPublicKey}; use serde::{Deserialize, Serialize}; use sha2::{Digest, digest::FixedOutput}; -use common::HashType; use crate::key_management::{ KeyChain, @@ -20,7 +20,7 @@ pub struct ChildKeysPrivate { impl KeyNode for ChildKeysPrivate { fn root(seed: [u8; 64]) -> Self { - let hash_value = hmac_sha512::HMAC::mac(seed, "NSSA_master_priv"); + let hash_value = hmac_sha512::HMAC::mac(seed, b"NSSA_master_priv"); let ssk = SecretSpendingKey( *hash_value @@ -35,8 +35,7 @@ impl KeyNode for ChildKeysPrivate { let isk = ssk.generate_incoming_viewing_secret_key(); let ovk = ssk.generate_outgoing_viewing_secret_key(); - - let npk: NullifierPublicKey = { + let npk: NullifierPublicKey = { let mut hasher = sha2::Sha256::new(); hasher.update("NSSA_keys"); @@ -45,7 +44,7 @@ impl KeyNode for ChildKeysPrivate { hasher.update([0u8; 22]); NullifierPublicKey { - 0: ::from(hasher.finalize_fixed()) + 0: ::from(hasher.finalize_fixed()), } }; @@ -92,6 +91,8 @@ impl KeyNode for ChildKeysPrivate { .expect("Key generated as scalar, must be valid representation"); let mut input = vec![]; + panic!("{}", parent_pt.to_bytes()[0]); + input.extend_from_slice(b"NSSA_seed_priv"); input.extend_from_slice(&parent_pt.to_bytes()); input.extend_from_slice(&cci.to_le_bytes()); @@ -121,7 +122,7 @@ impl KeyNode for ChildKeysPrivate { hasher.update([0u8; 22]); NullifierPublicKey { - 0: ::from(hasher.finalize_fixed()) + 0: ::from(hasher.finalize_fixed()), } }; @@ -173,6 +174,16 @@ impl<'a> From<&'a mut ChildKeysPrivate> for &'a mut (KeyChain, nssa::Account) { #[cfg(test)] mod tests { + use std::process::Child; + + use k256::Secp256k1; + use nssa_core::{NullifierSecretKey, encryption::shared_key_derivation::Secp256k1Point}; + + use crate::key_management::{ + self, + secret_holders::{IncomingViewingSecretKey, OutgoingViewingSecretKey}, + }; + use super::*; #[test] @@ -289,4 +300,130 @@ mod tests { ] ); } + + #[test] + fn test_master_key_generation() { + let seed: [u8; 64] = [ + 252, 56, 204, 83, 232, 123, 209, 188, 187, 167, 39, 213, 71, 39, 58, 65, 125, 134, 255, + 49, 43, 108, 92, 53, 173, 164, 94, 142, 150, 74, 21, 163, 43, 144, 226, 87, 199, 18, + 129, 223, 176, 198, 5, 150, 157, 70, 210, 254, 14, 105, 89, 191, 246, 27, 52, 170, 56, + 114, 39, 38, 118, 197, 205, 225, + ]; + + let keys = ChildKeysPrivate::root(seed); + + let expected_ssk: SecretSpendingKey = key_management::secret_holders::SecretSpendingKey([ + 189, 102, 14, 63, 41, 116, 229, 119, 41, 59, 225, 169, 205, 21, 50, 214, 222, 67, 109, + 126, 107, 153, 57, 118, 29, 239, 79, 162, 95, 13, 197, 170, + ]); + + let expected_ccc = [ + 5, 205, 75, 227, 45, 88, 53, 168, 99, 138, 145, 94, 195, 176, 178, 118, 213, 129, 64, + 70, 105, 60, 27, 230, 73, 86, 110, 203, 28, 60, 191, 172, + ]; + let expected_nsk: NullifierSecretKey = [ + 181, 144, 216, 101, 27, 177, 89, 140, 223, 128, 200, 3, 208, 144, 250, 242, 145, 25, + 197, 107, 74, 187, 99, 58, 253, 254, 82, 16, 221, 9, 202, 99, + ]; + let expected_npk: NullifierPublicKey = nssa_core::NullifierPublicKey([ + 161, 65, 163, 239, 194, 99, 30, 5, 6, 117, 116, 154, 218, 50, 72, 221, 222, 187, 36, + 25, 18, 98, 242, 140, 117, 18, 183, 150, 235, 207, 150, 205, + ]); + let expected_isk: IncomingViewingSecretKey = [ + 153, 108, 251, 220, 218, 41, 212, 54, 175, 61, 198, 247, 82, 127, 215, 160, 226, 26, + 154, 96, 41, 126, 247, 136, 206, 187, 233, 193, 47, 159, 169, 71, + ]; + let expected_ovk: OutgoingViewingSecretKey = [ + 169, 133, 157, 26, 10, 196, 45, 254, 82, 146, 180, 151, 193, 152, 84, 92, 252, 249, + 166, 192, 43, 93, 79, 153, 205, 56, 208, 5, 116, 151, 252, 78, + ]; + let expected_ipk_as_bytes: [u8; 33] = [ + 2, 14, 226, 128, 146, 254, 56, 61, 3, 24, 211, 151, 194, 41, 166, 67, 146, 0, 73, 4, + 140, 184, 244, 200, 43, 159, 141, 234, 90, 90, 145, 53, 251, + ]; + + assert!(expected_ssk == keys.value.0.secret_spending_key); + assert!(expected_ccc == keys.ccc); + assert!(expected_nsk == keys.value.0.private_key_holder.nullifier_secret_key); + assert!(expected_npk == keys.value.0.nullifer_public_key); + assert!(expected_isk == keys.value.0.private_key_holder.incoming_viewing_secret_key); + assert!(expected_ovk == keys.value.0.private_key_holder.outgoing_viewing_secret_key); + assert!(expected_ipk_as_bytes == keys.value.0.incoming_viewing_public_key.to_bytes()); + } + + #[test] + fn test_child_keys_generation() { + let seed: [u8; 64] = [88, 189, 37, 237, 199, 125, 151, 226, 69, 153, 165, 113, 191, 69, 188, 221, 9, 34, 173, 134, 61, 109, 34, 103, 121, 39, 237, 14, 107, 194, 24, 194, 191, 14, 237, 185, 12, 87, 22, 227, 38, 71, 17, 144, 251, 118, 217, 115, 33, 222, 201, 61, 203, 246, 121, 214, 6, 187, 148, 92, 44, 253, 210, 37]; + + let root_node = ChildKeysPrivate::root(seed); + let child_node = ChildKeysPrivate::nth_child(&root_node, 42u32); + + let expected_ccc: [u8;32] = +[131, 6, 100, 230, 202, 63, 5, 206, 158, 3, 81, 177, 221, 107, 27, 194, 192, 38, 104, 87, 23, 98, 107, 1, 78, 19, 216, 195, 63, 66, 13, 172]; + + /* + let expected_nsk: NullifierSecretKey = [ + 88, 186, 150, 238, 56, 44, 107, 53, 97, 59, 42, 62, 175, 63, 222, 11, 231, 223, 174, + 39, 168, 52, 18, 14, 38, 83, 11, 86, 172, 48, 66, 201, + ];*/ + /* + let expected_npk: NullifierPublicKey = nssa_core::NullifierPublicKey([ + 246, 214, 170, 117, 73, 240, 82, 143, 201, 193, 24, 218, 75, 226, 140, 78, 10, 45, 4, + 5, 184, 164, 127, 172, 24, 26, 241, 205, 13, 179, 91, 232, + ]);*/ + /* + let expected_isk: IncomingViewingSecretKey = [ + 182, 238, 179, 119, 236, 79, 86, 2, 3, 225, 143, 237, 86, 139, 183, 108, 23, 223, 49, + 69, 23, 208, 136, 65, 139, 92, 240, 106, 46, 172, 222, 247, + ];*/ + + let expected_ovk: OutgoingViewingSecretKey = [185, 67, 59, 18, 95, 73, 48, 122, 255, 221, 165, 100, 254, 226, 243, 111, 10, 3, 107, 64, 128, 122, 6, 240, 41, 232, 105, 235, 212, 133, 43, 9]; + /* + let expected_ipk_as_bytes: [u8; 33] = [ + 3, 10, 247, 74, 120, 6, 174, 60, 163, 22, 150, 206, 196, 66, 233, 216, 66, 3, 150, 24, + 20, 120, 29, 70, 178, 26, 125, 253, 75, 166, 114, 128, 34, + ];*/ + + + assert!(expected_ccc == child_node.ccc); + /* + assert!(expected_nsk == child_node.value.0.private_key_holder.nullifier_secret_key); + assert!(expected_npk == child_node.value.0.nullifer_public_key); + assert!( + expected_isk + == child_node + .value + .0 + .private_key_holder + .incoming_viewing_secret_key + ); + */ + assert!( + expected_ovk + == child_node + .value + .0 + .private_key_holder + .outgoing_viewing_secret_key + ); + /* + assert!(expected_ipk_as_bytes == child_node.value.0.incoming_viewing_public_key.to_bytes()); +*/ + /*Child nsk +Child nsk +[35, 218, 71, 160, 145, 129, 143, 216, 174, 178, 215, 92, 182, 249, 121, 153, 146, 124, 172, 70, 131, 184, 150, 46, 175, 201, 101, 86, 203, 25, 189, 175] +Child Npk +[196, 98, 217, 101, 101, 93, 1, 11, 253, 204, 128, 139, 198, 71, 19, 189, 37, 178, 0, 18, 211, 199, 56, 211, 199, 179, 126, 184, 151, 94, 140, 63] +Child isk +[9, 6, 246, 146, 108, 119, 185, 109, 36, 205, 35, 176, 196, 196, 153, 246, 215, 127, 89, 39, 174, 3, 86, 197, 231, 181, 33, 75, 47, 29, 18, 2] +Child Ipk +[2, 165, 98, 11, 43, 108, 222, 0, 21, 41, 156, 217, 67, 122, 150, 142, 45, 156, 31, 164, 134, 241, 59, 71, 245, 44, 45, 96, 18, 118, 167, 249, 228] +Child ovk +[185, 67, 59, 18, 95, 73, 48, 122, 255, 221, 165, 100, 254, 226, 243, 111, 10, 3, 107, 64, 128, 122, 6, 240, 41, 232, 105, 235, 212, 133, 43, 9] +Child chain code +[252, 165, 63, 74, 148, 28, 14, 197, 76, 240, 82, 1, 213, 179, 149, 190, 174, 49, 47, 94, 84, 246, 219, 189, 125, 190, 86, 120, 206, 159, 36, 172] +PS C:\Users\jones\OneDrive\Desktop\key_python> + + */ + } }