bitwarden_access_token/
secrets.rs1use bitwarden_access_token_crypto::{AccessTokenKeyMaterial, AccessTokenSeed};
4use bitwarden_crypto::{EncString, KeySlotIds, KeyStoreContext};
5use bitwarden_encoding::B64;
6use uuid::Uuid;
7
8use crate::{AccessTokenError, AccessTokenKind, consts::TOKEN_VERSION};
9
10pub struct AccessTokenSecrets {
12 pub encrypted_payload: EncString,
14 pub key: EncString,
16 seed: AccessTokenSeed,
17 kind: AccessTokenKind,
19}
20
21impl AccessTokenSecrets {
22 pub fn into_token(self, api_key_id: Uuid, client_secret: &str) -> String {
25 let seed_b64 = B64::from(self.seed.as_bytes().as_slice());
26 match self.kind.segment() {
27 Some(segment) => {
28 format!("{TOKEN_VERSION}.{segment}.{api_key_id}.{client_secret}:{seed_b64}")
29 }
30 None => format!("{TOKEN_VERSION}.{api_key_id}.{client_secret}:{seed_b64}"),
31 }
32 }
33}
34
35pub fn make_access_token_secrets<Ids: KeySlotIds>(
39 ctx: &mut KeyStoreContext<Ids>,
40 organization_key: Ids::Symmetric,
41 kind: AccessTokenKind,
42) -> Result<AccessTokenSecrets, AccessTokenError> {
43 let material = AccessTokenKeyMaterial::make(ctx, organization_key, kind.key_purpose())?;
44
45 let encrypted_payload = material.encrypted_payload.clone();
47 let key = material.key.clone();
48 let seed = material.into_seed();
49
50 Ok(AccessTokenSecrets {
51 encrypted_payload,
52 key,
53 seed,
54 kind,
55 })
56}