Skip to main content

orbinum_encrypted_memo/
lib.rs

1//! Encrypted memo primitives for private transactions with ChaCha20Poly1305 AEAD
2//!
3//! ## Features
4//!
5//! - **Encryption**: Per-note key derivation from viewing key + commitment
6//! - **Disclosure**: Selective disclosure proof structures (Groth16)
7//! - **Key Derivation**: SHA-256 based with domain separation
8//!
9//! ## Architecture
10//!
11//! Clean Architecture — domain layer only, no FRAME dependencies:
12//! - **value_objects**: Immutable keys and constants
13//! - **entities**: `MemoData` entity + `MemoError`
14//! - **ports**: Abstract interfaces (`MemoEncryptor`, `KeyDeriver`)
15//! - **aggregates**: `KeySet`, disclosure structures
16//! - **services**: Concrete implementations of the ports
17//!
18//! ## Example
19//!
20//! ```rust,ignore
21//! use fp_encrypted_memo::{MemoData, KeySet, encrypt_memo, decrypt_memo};
22//!
23//! let keys = KeySet::from_spending_key(spending_key);
24//! let memo = MemoData::new(1000, owner_pk, blinding, 0);
25//! let encrypted = encrypt_memo(&memo, &commitment, keys.viewing_key.as_bytes(), &nonce)?;
26//! let decrypted = decrypt_memo(&encrypted, &commitment, keys.viewing_key.as_bytes())?;
27//! ```
28
29#![cfg_attr(not(feature = "std"), no_std)]
30
31extern crate alloc;
32
33// ============================================================================
34// Modules
35// ============================================================================
36
37// Domain layer - pure business logic
38pub mod domain;
39
40// ============================================================================
41// Public API
42// ============================================================================
43
44// Constants
45pub use domain::value_objects::constants::{
46	EDDSA_KEY_DOMAIN, KEY_DOMAIN, MAC_SIZE, MAX_ENCRYPTED_MEMO_SIZE, MEMO_DATA_SIZE,
47	MIN_ENCRYPTED_MEMO_SIZE, NONCE_SIZE, NULLIFIER_KEY_DOMAIN, VIEWING_KEY_DOMAIN,
48};
49
50// Value objects (keys)
51pub use domain::value_objects::{EdDSAKey, NullifierKey, ViewingKey};
52
53// Core entity and error
54pub use domain::entities::{error::MemoError, is_valid_encrypted_memo, memo_data::MemoData};
55
56// Key set aggregate
57pub use domain::aggregates::keyset::KeySet;
58
59// Disclosure aggregates
60pub use domain::aggregates::disclosure::{
61	DisclosureMask, DisclosureProof, DisclosurePublicSignals, PartialMemoData,
62};
63
64// Ports (abstract interfaces)
65pub use domain::ports::{KeyDeriver, MemoEncryptor};
66
67// Encryption services
68pub use domain::services::encryption::{decrypt_memo, encrypt_memo, try_decrypt_memo};
69
70#[cfg(feature = "encrypt")]
71pub use domain::services::encryption::encrypt_memo_random;
72
73// Key derivation services
74pub use domain::services::key_derivation::{
75	derive_eddsa_key_from_spending, derive_nullifier_key_from_spending,
76	derive_viewing_key_from_spending,
77};