#![deny(missing_docs)]
pub mod lockbox {
pub use revault_lockbox_api::{
ArtifactKind, CacheLimit, CacheStats, ContactKeyPair, ContactPublicKey, ContentChunk,
ContentStreamOptions, ContentStreamOrder, Error, ExtractPolicy, FormDefinition,
FormFieldDefinition, FormFieldKind, FormFieldValue, FormRecord, FormTypeId, FormValue,
ImportStats, ListOptions, Lockbox, LockboxEntry, LockboxEntryKind, LockboxFileInspection,
LockboxFileMut, LockboxFileReader, LockboxId, LockboxInspector, LockboxKeySlot,
LockboxKeySlotAlgorithm, LockboxKeySlotProtection, LockboxOpen, LockboxOptions,
LockboxOwnerInspection, LockboxPath, LockboxProtection, MirrorMissingFilePolicy,
MirrorProject, OpenFileOptions, PageInspection, PageObjectInspection, ReadOnly,
RecoveryReport, RecoveryReportOptions, RecoveryScanner, Result, SecretString, SecretVec,
VariableName, VariableNamePattern, VariableSensitivity, VariableValueRef, WorkerPolicy,
WorkloadProfile, Writable, WritableLockboxState,
};
pub type ProfileSigningKeyPair = revault_lockbox_api::OwnerSigningKeyPair;
pub type ProfileSigningPublicKey = revault_lockbox_api::OwnerSigningPublicKey;
pub type WrappedContactKey = revault_lockbox_api::ContactWrappedKey;
}
pub mod vault {
use revault_lockbox_api::{ContactKeyPair, ContactPublicKey};
pub use revault_vault_api::{
backup_default_vault, decode_fingerprint_crockford_96, decode_fingerprint_hex,
default_vault_dir, default_vault_path, disable_platform_secret_store,
enable_platform_secret_store, encode_hex, export_private_key, export_public_key, forget,
forget_all, forget_platform_vault_password, forget_vault_unlock_key,
format_fingerprint_crockford_96, format_fingerprint_crockford_96_reading,
format_fingerprint_hex_pairs, get, get_platform_vault_password, get_vault_unlock_key,
import_private_key, import_private_key_file, import_public_key, is_running, list,
platform_secret_store_disabled, platform_secret_store_status, public_key_fingerprint, put,
put_platform_vault_password, put_vault_unlock_key, restore_default_vault, serve_agent,
set_auto_open_scope, start, stop, verify_agent_transport_security, AccessSlotLabel,
AgentSleepSupport, AutoOpenScope, CachedLockbox, ContentKeyStore, KeyFormat, KnownLockbox,
NoopStore, PlatformSecretStoreStatus, ProfileGeneration, ProfileGenerationStatus,
ProfileHistory, SecretActivityGuard, SecretActivityKind, SecretString, SecretVec,
StoredContact, VaultBackupManifest, CURRENT_VAULT_STRUCTURE_VERSION,
FINGERPRINT_CODE_96_LEN,
};
#[derive(Debug)]
pub struct Vault(revault_vault_api::VaultDirectory);
impl Vault {
pub fn open_default(password: &SecretString) -> revault_lockbox_api::Result<Self> {
let path = revault_vault_api::default_vault_path()?;
revault_vault_api::VaultDirectory::open_file(path, password).map(Self)
}
pub fn open_or_create_default(
password: &SecretString,
) -> revault_lockbox_api::Result<Self> {
revault_vault_api::VaultDirectory::open_or_create_default(password).map(Self)
}
pub fn create_file(
path: impl AsRef<std::path::Path>,
password: &SecretString,
) -> revault_lockbox_api::Result<Self> {
revault_vault_api::VaultDirectory::create_file(path, password).map(Self)
}
pub fn open_file(
path: impl AsRef<std::path::Path>,
password: &SecretString,
) -> revault_lockbox_api::Result<Self> {
revault_vault_api::VaultDirectory::open_file(path, password).map(Self)
}
pub fn open_or_create(
root: impl AsRef<std::path::Path>,
password: &SecretString,
) -> revault_lockbox_api::Result<Self> {
revault_vault_api::VaultDirectory::open_or_create(root, password).map(Self)
}
pub fn replace(
root: impl AsRef<std::path::Path>,
password: &SecretString,
) -> revault_lockbox_api::Result<Self> {
revault_vault_api::VaultDirectory::replace(root, password).map(Self)
}
pub fn probe_structure_version(
root: impl AsRef<std::path::Path>,
password: &SecretString,
) -> revault_lockbox_api::Result<u32> {
revault_vault_api::VaultDirectory::probe_structure_version(root, password)
}
pub fn root(&self) -> &std::path::Path {
self.0.root()
}
pub fn path(&self) -> &std::path::Path {
self.0.path()
}
pub fn structure_version(&self) -> revault_lockbox_api::Result<u32> {
self.0.structure_version()
}
pub fn store_private_key(
&self,
name: &str,
key: &ContactKeyPair,
) -> revault_lockbox_api::Result<()> {
self.0.store_private_key(name, key)
}
pub fn load_private_key(&self, name: &str) -> revault_lockbox_api::Result<ContactKeyPair> {
self.0.load_private_key(name)
}
pub fn private_key_exists(&self, name: &str) -> revault_lockbox_api::Result<bool> {
self.0.private_key_exists(name)
}
pub fn list_private_keys(&self) -> revault_lockbox_api::Result<Vec<String>> {
self.0.list_private_keys()
}
pub fn delete_private_key(&self, name: &str) -> revault_lockbox_api::Result<()> {
self.0.delete_private_key(name)
}
pub fn store_profile_email(
&self,
name: &str,
email: &str,
) -> revault_lockbox_api::Result<()> {
self.0.store_profile_email(name, email)
}
pub fn profile_email(&self, name: &str) -> revault_lockbox_api::Result<Option<String>> {
self.0.profile_email(name)
}
pub fn list_profile_generations(
&self,
name: &str,
) -> revault_lockbox_api::Result<ProfileHistory> {
self.0.list_profile_generations(name)
}
pub fn rotate_private_key(
&self,
name: &str,
) -> revault_lockbox_api::Result<ProfileHistory> {
self.0.rotate_private_key(name)
}
pub fn load_profile_signing_key(
&self,
name: &str,
) -> revault_lockbox_api::Result<super::ProfileSigningKeyPair> {
self.0.load_owner_signing_key(name)
}
pub fn load_profile_signing_key_generation(
&self,
name: &str,
index: u16,
) -> revault_lockbox_api::Result<super::ProfileSigningKeyPair> {
self.0.load_owner_signing_key_generation(name, index)
}
pub fn store_contact(
&self,
name: &str,
key: &ContactPublicKey,
) -> revault_lockbox_api::Result<()> {
self.0.store_contact(name, key)
}
pub fn load_contact(&self, name: &str) -> revault_lockbox_api::Result<ContactPublicKey> {
self.0.load_contact(name)
}
pub fn contact_exists(&self, name: &str) -> revault_lockbox_api::Result<bool> {
self.0.contact_exists(name)
}
pub fn delete_contact(&self, name: &str) -> revault_lockbox_api::Result<()> {
self.0.delete_contact(name)
}
pub fn list_contacts(&self) -> revault_lockbox_api::Result<Vec<StoredContact>> {
self.0.list_contacts()
}
pub fn store_contact_signing_key(
&self,
name: &str,
key: &super::ProfileSigningPublicKey,
) -> revault_lockbox_api::Result<()> {
self.0.store_contact_signing_key(name, key)
}
pub fn load_contact_signing_key(
&self,
name: &str,
) -> revault_lockbox_api::Result<super::ProfileSigningPublicKey> {
self.0.load_contact_signing_key(name)
}
}
#[derive(Debug)]
pub struct ReadOnlyVault(revault_vault_api::ReadOnlyVaultDirectory);
impl ReadOnlyVault {
pub fn open_default(password: &SecretString) -> revault_lockbox_api::Result<Self> {
revault_vault_api::ReadOnlyVaultDirectory::open_default(password).map(Self)
}
pub fn open(
root: impl AsRef<std::path::Path>,
password: &SecretString,
) -> revault_lockbox_api::Result<Self> {
revault_vault_api::ReadOnlyVaultDirectory::open(root, password).map(Self)
}
pub fn list_private_key_names(&self) -> revault_lockbox_api::Result<Vec<String>> {
self.0.list_private_key_names()
}
pub fn list_contact_names(&self) -> revault_lockbox_api::Result<Vec<String>> {
self.0.list_contact_names()
}
pub fn list_form_aliases(&self) -> revault_lockbox_api::Result<Vec<String>> {
self.0.list_form_aliases()
}
pub fn list_known_lockboxes(&self) -> revault_lockbox_api::Result<Vec<KnownLockbox>> {
self.0.list_known_lockboxes()
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct AgentSession;
impl AgentSession {
pub const fn instance() -> Self {
Self
}
pub fn start(&self) -> std::io::Result<()> {
revault_vault_api::start()
}
pub fn stop(&self) -> std::io::Result<()> {
revault_vault_api::stop()
}
pub fn close_all(&self) -> std::io::Result<()> {
revault_vault_api::forget_all()
}
pub fn profile_signing_key(
&self,
vault_id: &str,
profile: &str,
) -> std::io::Result<Option<super::ProfileSigningKeyPair>> {
revault_vault_api::get_owner_signing_key(vault_id, profile)
}
pub fn cache_profile_signing_key(
&self,
vault_id: &str,
profile: &str,
key: super::ProfileSigningKeyPair,
ttl_seconds: Option<u64>,
) -> std::io::Result<()> {
revault_vault_api::put_owner_signing_key(vault_id, profile, key, ttl_seconds)
}
pub fn forget_profile_signing_key(
&self,
vault_id: &str,
profile: &str,
) -> std::io::Result<()> {
revault_vault_api::forget_owner_signing_key(vault_id, profile)
}
pub fn is_running(&self) -> bool {
revault_vault_api::is_running()
}
pub fn serve(&self) -> std::io::Result<()> {
revault_vault_api::serve_agent()
}
}
}
pub use lockbox::{ProfileSigningKeyPair, ProfileSigningPublicKey, WrappedContactKey};
pub use revault_lockbox_api::{ContactKeyPair, ContactPublicKey, Lockbox};
pub use vault::{AgentSession, ReadOnlyVault, Vault};
#[derive(Debug, Clone, Copy, Default)]
pub struct Revault;
impl Revault {
pub const fn load() -> Self {
Self
}
}
#[cfg(test)]
mod tests {
use super::{AgentSession, ProfileSigningKeyPair, ReadOnlyVault, Revault, Vault};
#[test]
fn reviewed_runtime_and_profile_identity_are_process_local() {
let _runtime = Revault::load();
let session = AgentSession::instance();
let _running = session.is_running();
let signing_key = ProfileSigningKeyPair::generate().expect("generate profile key");
let public_key = signing_key.public_key();
assert!(!public_key.to_bytes().is_empty());
let root = std::env::temp_dir().join(format!(
"revault-api-facade-{}-{}",
std::process::id(),
public_key.to_bytes()[0]
));
let passphrase = super::vault::SecretString::try_from_slice(b"facade test passphrase")
.expect("construct vault passphrase");
let vault = Vault::replace(&root, &passphrase).expect("replace test Vault");
assert!(vault.structure_version().expect("read structure version") > 0);
drop(vault);
let readonly = ReadOnlyVault::open(&root, &passphrase).expect("open read-only Vault");
assert!(readonly
.list_private_key_names()
.expect("list profile names")
.is_empty());
let _ = std::fs::remove_dir_all(root);
}
}