bitwarden_access_token_crypto/
material.rs1use bitwarden_crypto::{EncString, KeySlotIds, KeyStoreContext, PrimitiveEncryptable};
4use zeroize::Zeroizing;
5
6use crate::{AccessTokenError, AccessTokenSeed, key::DERIVE_NAME, purpose::KeyPurpose};
7
8pub struct AccessTokenKeyMaterial {
10 pub encrypted_payload: EncString,
12 pub key: EncString,
15 seed: AccessTokenSeed,
17}
18
19impl AccessTokenKeyMaterial {
20 pub fn into_seed(self) -> AccessTokenSeed {
22 self.seed
23 }
24
25 pub fn make<Ids: KeySlotIds>(
30 ctx: &mut KeyStoreContext<Ids>,
31 organization_key: Ids::Symmetric,
32 purpose: KeyPurpose,
33 ) -> Result<Self, AccessTokenError> {
34 let seed = AccessTokenSeed::make();
35
36 let derived_key = ctx.derive_shareable_key(
37 Zeroizing::new(*seed.as_bytes()),
38 DERIVE_NAME,
39 Some(purpose.as_str()),
40 )?;
41
42 #[allow(deprecated)]
44 let organization_key_b64 = ctx
45 .dangerous_get_symmetric_key(organization_key)?
46 .to_base64();
47 let payload = serde_json::json!({ "encryptionKey": organization_key_b64.to_string() });
48 let encrypted_payload = payload.to_string().encrypt(ctx, derived_key)?;
49
50 #[allow(deprecated)]
51 let derived_key_b64 = ctx.dangerous_get_symmetric_key(derived_key)?.to_base64();
52 let key = derived_key_b64.to_string().encrypt(ctx, organization_key)?;
53
54 Ok(Self {
55 encrypted_payload,
56 key,
57 seed,
58 })
59 }
60}