Skip to main content

orbinum_encrypted_memo/domain/value_objects/
nullifier_key.rs

1//! Nullifier Key value object.
2//!
3//! Used to derive nullifiers for spent notes, preventing double-spending.
4//! Derived from spending key via `SHA256(spending_key || NULLIFIER_KEY_DOMAIN)`.
5
6#[cfg(all(feature = "parity-scale-codec", feature = "scale-info"))]
7use parity_scale_codec::{Decode, Encode};
8#[cfg(all(feature = "parity-scale-codec", feature = "scale-info"))]
9use scale_info::TypeInfo;
10
11/// Nullifier derivation key.
12///
13/// Used to compute `nullifier = Poseidon(commitment, nullifier_key)`.
14#[derive(Clone, PartialEq, Eq, Debug)]
15#[cfg_attr(
16	all(feature = "parity-scale-codec", feature = "scale-info"),
17	derive(Encode, Decode, TypeInfo)
18)]
19pub struct NullifierKey(pub [u8; 32]);
20
21impl NullifierKey {
22	/// Creates a nullifier key from raw bytes.
23	pub fn from_bytes(bytes: [u8; 32]) -> Self {
24		Self(bytes)
25	}
26
27	/// Returns the raw key bytes.
28	pub fn as_bytes(&self) -> &[u8; 32] {
29		&self.0
30	}
31}
32
33impl AsRef<[u8; 32]> for NullifierKey {
34	fn as_ref(&self) -> &[u8; 32] {
35		&self.0
36	}
37}
38
39impl From<[u8; 32]> for NullifierKey {
40	fn from(bytes: [u8; 32]) -> Self {
41		Self(bytes)
42	}
43}
44
45// ============================================================================
46// Tests
47// ============================================================================
48
49#[cfg(test)]
50mod tests {
51	use super::*;
52	extern crate alloc;
53	use alloc::format;
54
55	const BYTES: [u8; 32] = [17u8; 32];
56
57	#[test]
58	fn test_from_bytes_stores_inner() {
59		assert_eq!(NullifierKey::from_bytes(BYTES).0, BYTES);
60	}
61
62	#[test]
63	fn test_as_bytes_returns_reference() {
64		assert_eq!(NullifierKey::from_bytes(BYTES).as_bytes(), &BYTES);
65	}
66
67	#[test]
68	fn test_as_ref() {
69		let k = NullifierKey::from_bytes(BYTES);
70		let r: &[u8; 32] = k.as_ref();
71		assert_eq!(r, &BYTES);
72	}
73
74	#[test]
75	fn test_from_trait() {
76		let k: NullifierKey = BYTES.into();
77		assert_eq!(k.0, BYTES);
78	}
79
80	#[test]
81	fn test_clone_eq() {
82		let k1 = NullifierKey::from_bytes(BYTES);
83		assert_eq!(k1.clone(), k1);
84	}
85
86	#[test]
87	fn test_ne_different_bytes() {
88		assert_ne!(
89			NullifierKey::from_bytes([1u8; 32]),
90			NullifierKey::from_bytes([2u8; 32])
91		);
92	}
93
94	#[test]
95	fn test_debug_contains_type_name() {
96		let s = format!("{:?}", NullifierKey::from_bytes([0u8; 32]));
97		assert!(s.contains("NullifierKey"));
98	}
99
100	#[test]
101	fn test_all_zeros() {
102		assert_eq!(NullifierKey::from_bytes([0u8; 32]).as_bytes(), &[0u8; 32]);
103	}
104
105	#[test]
106	fn test_all_ones() {
107		assert_eq!(
108			NullifierKey::from_bytes([0xFFu8; 32]).as_bytes(),
109			&[0xFFu8; 32]
110		);
111	}
112}