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