Skip to main content

KeyVault

Struct KeyVault 

Source
pub struct KeyVault { /* private fields */ }
Expand description

High-level Key Management module for the Qualia Node.

Implementations§

Source§

impl KeyVault

Source

pub fn new() -> Self

Creates an in-memory KeyVault with a fresh ephemeral key (for tests/stubs only).

Source

pub fn is_locked(&self) -> bool

Source

pub fn lock(&mut self)

Source

pub fn unlock(&mut self) -> Result<(), String>

Source

pub fn load_or_generate(storage_dir: &str) -> Result<Self, String>

Source

pub fn derive_key(&self, context_id: &str) -> SigningKey

Derives a deterministic Pairwise or Front Door key from the Master Key. This ensures we can recover all DIDs from the single master root.

Source

pub fn sign_payload( &self, signing_key: &SigningKey, payload: &[u8], ) -> Signature

Computes an Ed25519 signature over a generic byte payload

Source

pub fn get_master_key_bytes(&self) -> [u8; 32]

Exposes the raw bytes of the master key for libp2p identity bindings

Source

pub fn public_key_bytes_for_context(&self, context_id: &str) -> [u8; 32]

Ed25519 verifying key bytes for a context-derived pairwise key.

Source

pub fn verify_signature( public_key_bytes: &[u8; 32], payload: &[u8], signature_bytes: &[u8; 64], ) -> Result<(), String>

Verifies a payload against a given public key bytes

Source

pub fn generate_webid_tls_cert( &self, key: &SigningKey, did_uri: &str, ) -> Result<(String, String), String>

Generates a WebID-TLS / mTLS compatible self-signed X.509 certificate.

The DID URI is placed in the Subject Alternative Name URI extension so transport identity can be bound to the Qualia principal. Uses real rcgen PEM output (not a mock). Private key material is the provided Ed25519 seed encoded as PKCS#8 PEM.

Source§

impl KeyVault

Source

pub fn issue_qapp_token( &self, qapp_did: &str, audience: &str, expiry_epoch: u64, nonce: &str, capabilities: Vec<String>, sensitivity_clearance: SubgraphLayer, ) -> Result<String, String>

Issues a cryptographically signed Semantic Token for an installed qapp. The token enforces gatekeeper boundary policies (which shapes the qapp can access).

Source

pub fn verify_qapp_token( &self, token: &str, expected_audience: &str, ) -> Result<QappSessionTokenV2, String>

Verifies a qapp token’s signature using the Master Key, and checks expiry and audience.

Source§

impl KeyVault

Source

pub fn generate_layer_key(&self, layer: SubgraphLayer) -> SubgraphKey

Derive a deterministic AES-256-GCM key for layer using HKDF-SHA-256.

IKM = master ed25519 secret key bytes (32 bytes) Salt = b“qualia:subgraph:salt:v1“ Info = layer.label() bytes

Source

pub fn encapsulate_for_recipient( &self, layer_key: &SubgraphKey, recipient_x25519_pub: &[u8; 32], nonce_entropy: &[u8; 32], ) -> Result<EncapsulatedKey, String>

Encapsulate layer_key for a recipient identified by their X25519 public key bytes.

Uses ephemeral X25519 ECDH + AES-256-GCM to wrap the 32-byte layer key. The recipient_x25519_pub is typically derived from the recipient’s DID key material.

§Errors

Returns Err if the recipient public key bytes are invalid.

Source

pub fn decapsulate( &self, encapsulated: &EncapsulatedKey, recipient_x25519_secret: &[u8; 32], ) -> Result<SubgraphKey, String>

Decapsulate an EncapsulatedKey using the recipient’s X25519 static secret key bytes.

Returns the 32-byte layer key on success.

Source

pub fn derive_x25519_secret(&self) -> [u8; 32]

Derive the X25519 static secret for this node from the master Ed25519 key.

Used when the node itself is a VC recipient.

Auto Trait Implementations§

Blanket Implementations§

§

impl<S, A> Aggregate<Result<S, Error>> for A
where A: Aggregate<S>,

§

fn from_shares<T>(iter: T) -> Result<A, Error>
where T: IntoIterator<Item = Result<S, Error>>,

Aggregate shares in an MPC protocol.
Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Downcast<T> for T

§

fn downcast(&self) -> &T

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

§

impl<T> WasmNotSend for T
where T: Send,

§

impl<T> WasmNotSendSync for T
where T: WasmNotSend + WasmNotSync,

§

impl<T> WasmNotSync for T
where T: Sync,