bitwarden_core/auth/
register.rs

1use bitwarden_crypto::{CryptoError, EncString, HashPurpose, Kdf, MasterKey, RsaKeyPair};
2use bitwarden_encoding::B64;
3use serde::{Deserialize, Serialize};
4use thiserror::Error;
5
6use crate::ApiError;
7
8#[allow(missing_docs)]
9#[derive(Serialize, Deserialize, Debug)]
10#[serde(rename_all = "camelCase", deny_unknown_fields)]
11pub struct RegisterRequest {
12    pub email: String,
13    pub name: Option<String>,
14    pub password: String,
15    pub password_hint: Option<String>,
16}
17
18#[allow(missing_docs)]
19#[derive(Debug, Error)]
20pub enum RegisterError {
21    #[error(transparent)]
22    Crypto(#[from] CryptoError),
23    #[error(transparent)]
24    Api(#[from] ApiError),
25}
26
27pub(super) fn make_register_keys(
28    email: String,
29    password: String,
30    kdf: Kdf,
31) -> Result<RegisterKeyResponse, CryptoError> {
32    let master_key = MasterKey::derive(&password, &email, &kdf)?;
33    let master_password_hash =
34        master_key.derive_master_key_hash(password.as_bytes(), HashPurpose::ServerAuthorization);
35    let (user_key, encrypted_user_key) = master_key.make_user_key()?;
36    let keys = user_key.make_key_pair()?;
37
38    Ok(RegisterKeyResponse {
39        master_password_hash,
40        encrypted_user_key,
41        keys,
42    })
43}
44
45#[allow(missing_docs)]
46#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
47pub struct RegisterKeyResponse {
48    pub master_password_hash: B64,
49    pub encrypted_user_key: EncString,
50    pub keys: RsaKeyPair,
51}