explicit_memory_provider.rs (1673B)
1 use futures_executor::block_on; 2 use radroots_secrets::EncryptedEnvelope; 3 use radroots_secrets::context::{ 4 EnvelopeContext, EnvelopePurpose, EnvelopeSubject, PayloadSchemaId, 5 }; 6 use radroots_secrets::envelope::{Nonce, SealMaterial, SealRequest}; 7 use radroots_secrets::id::{BackendKind, KeyVersion}; 8 use radroots_secrets::memory::MemoryProvider; 9 use radroots_secrets::wrapping::SecretMaterial; 10 use radroots_secrets::{SecretId, SecretRef}; 11 12 fn main() -> Result<(), Box<dyn std::error::Error>> { 13 let reference = SecretRef::new( 14 SecretId::parse("example-profile-key")?, 15 BackendKind::Memory, 16 KeyVersion::new(1)?, 17 ); 18 let provider = MemoryProvider::new(); 19 provider.provision(&reference, SecretMaterial::from_slice(&[0x41; 32])?)?; 20 21 let plaintext = SecretMaterial::from_slice(b"private profile value")?; 22 let data_key = SecretMaterial::from_slice(&[0x41; 32])?; 23 let context = EnvelopeContext::new( 24 EnvelopePurpose::parse("radroots.private_profile")?, 25 EnvelopeSubject::parse("profile", "example-profile")?, 26 PayloadSchemaId::parse("radroots.private_profile.v1")?, 27 ); 28 let request = SealRequest::new( 29 reference, 30 context.clone(), 31 &plaintext, 32 SealMaterial::new(data_key, Nonce::new([0x24; 24])), 33 ); 34 let encoded = block_on(EncryptedEnvelope::seal(&provider, request))?.encode()?; 35 let decoded = EncryptedEnvelope::decode(&encoded)?; 36 let opened = block_on(decoded.open(&provider, &context))?; 37 38 opened.expose_secret(|bytes| assert_eq!(bytes, b"private profile value")); 39 println!("opened one explicitly provisioned in-memory envelope"); 40 Ok(()) 41 }