bitwarden_unlock/
session_key.rs1use bitwarden_crypto::{
2 KeySlotIds, KeyStoreContext, SymmetricCryptoKey,
3 safe::{SymmetricKeyEnvelope, SymmetricKeyEnvelopeError, SymmetricKeyEnvelopeNamespace},
4};
5
6#[derive(PartialEq)] pub struct SessionKey(pub(crate) SymmetricCryptoKey);
16
17impl SessionKey {
18 pub fn make() -> Self {
20 Self(SymmetricCryptoKey::make_xchacha20_poly1305_key())
21 }
22
23 pub fn from_context<Ids: KeySlotIds>(
26 key_to_seal: Ids::Symmetric,
27 ctx: &mut KeyStoreContext<Ids>,
28 ) -> Result<(SymmetricKeyEnvelope, SessionKey), SymmetricKeyEnvelopeError> {
29 let session_key = SessionKey::make();
30 let session_key_id = ctx.add_local_symmetric_key(session_key.0.clone());
31 let envelope = SymmetricKeyEnvelope::seal(
32 key_to_seal,
33 session_key_id,
34 SymmetricKeyEnvelopeNamespace::SessionKey,
35 ctx,
36 )?;
37 Ok((envelope, session_key))
38 }
39
40 pub fn unwrap_to_context<Ids: KeySlotIds>(
43 &self,
44 envelope: &SymmetricKeyEnvelope,
45 ctx: &mut KeyStoreContext<Ids>,
46 ) -> Result<Ids::Symmetric, SymmetricKeyEnvelopeError> {
47 let session_key_id = ctx.add_local_symmetric_key(self.0.clone());
48 envelope.unseal(
49 session_key_id,
50 SymmetricKeyEnvelopeNamespace::SessionKey,
51 ctx,
52 )
53 }
54}