bitwarden_core/auth/
register.rs1use 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}