bitwarden_core/auth/
register.rs

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