1use crate::api::auth::types::{
4 CreateCredentialChallengeResponse, CreateRegistrationChallengeResponse,
5};
6use crate::error::DfnsError;
7use serde::{Deserialize, Serialize};
8use std::future::Future;
9use std::pin::Pin;
10
11#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
12#[serde(rename_all = "kebab-case")]
13pub enum AuthenticatorAttachment {
14 #[serde(rename = "cross-platform")]
15 CrossPlatform,
16
17 Platform,
18}
19
20#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
21#[serde(rename_all = "snake_case")]
22pub enum ResidentKeyRequirement {
23 Discouraged,
24
25 Preferred,
26
27 Required,
28}
29
30#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
31#[serde(rename_all = "snake_case")]
32pub enum AttestationConveyancePreference {
33 Direct,
34
35 Enterprise,
36
37 Indirect,
38
39 None,
40}
41
42#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
43#[serde(rename_all = "camelCase")]
44pub struct KeyAttestation {
45 pub credential_info: KeyAttestationCredentialInfo,
46
47 pub credential_kind: KeyAttestationCredentialKind,
48}
49
50#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
51#[serde(rename_all = "camelCase")]
52pub struct KeyAttestationCredentialInfo {
53 pub attestation_data: String,
54
55 pub client_data: String,
56
57 pub cred_id: String,
58}
59
60#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
61pub enum KeyAttestationCredentialKind {
62 Key,
63}
64
65#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
66#[serde(rename_all = "camelCase")]
67pub struct Fido2Attestation {
68 pub credential_info: Fido2AttestationCredentialInfo,
69
70 pub credential_kind: Fido2AttestationCredentialKind,
71}
72
73#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
74#[serde(rename_all = "camelCase")]
75pub struct Fido2AttestationCredentialInfo {
76 pub attestation_data: String,
77
78 pub client_data: String,
79
80 pub cred_id: String,
81}
82
83#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
84pub enum Fido2AttestationCredentialKind {
85 Fido2,
86}
87
88#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
89#[serde(rename_all = "camelCase")]
90pub struct PasswordAttestation {
91 pub credential_info: PasswordAttestationCredentialInfo,
92
93 pub credential_kind: PasswordAttestationCredentialKind,
94}
95
96#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
97pub struct PasswordAttestationCredentialInfo {
98 pub password: String,
99}
100
101#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
102pub enum PasswordAttestationCredentialKind {
103 Password,
104}
105
106#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
107#[serde(rename_all = "camelCase")]
108pub struct TotpAttestation {
109 pub credential_info: TotpAttestationCredentialInfo,
110
111 pub credential_kind: TotpAttestationCredentialKind,
112}
113
114#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
115#[serde(rename_all = "camelCase")]
116pub struct TotpAttestationCredentialInfo {
117 pub otp_code: String,
118}
119
120#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
121pub enum TotpAttestationCredentialKind {
122 Totp,
123}
124
125#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
126#[serde(rename_all = "camelCase")]
127pub struct FirstFactorAttestation {
128 pub credential_info: FirstFactorAttestationCredentialInfo,
129
130 pub credential_kind: FirstFactorAttestationCredentialKind,
131}
132
133#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
134#[serde(rename_all = "camelCase")]
135pub struct FirstFactorAttestationCredentialInfo {
136 pub attestation_data: Option<String>,
137
138 pub client_data: Option<String>,
139
140 pub cred_id: Option<String>,
141
142 pub password: Option<String>,
143}
144
145#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
146pub enum FirstFactorAttestationCredentialKind {
147 Fido2,
148
149 Key,
150
151 Password,
152}
153
154#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
155#[serde(rename_all = "camelCase")]
156pub struct SecondFactorAttestation {
157 pub credential_info: SecondFactorAttestationCredentialInfo,
158
159 pub credential_kind: SecondFactorAttestationCredentialKind,
160}
161
162#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
163#[serde(rename_all = "camelCase")]
164pub struct SecondFactorAttestationCredentialInfo {
165 pub attestation_data: Option<String>,
166
167 pub client_data: Option<String>,
168
169 pub cred_id: Option<String>,
170
171 pub otp_code: Option<String>,
172}
173
174#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
175pub enum SecondFactorAttestationCredentialKind {
176 Fido2,
177
178 Key,
179
180 Totp,
181}
182
183#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
184#[serde(rename_all = "camelCase")]
185pub struct RecoveryKeyAttestation {
186 pub credential_info: RecoveryKeyAttestationCredentialInfo,
187
188 pub credential_kind: RecoveryKeyAttestationCredentialKind,
189
190 pub encrypted_private_key: Option<String>,
191}
192
193#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
194#[serde(rename_all = "camelCase")]
195pub struct RecoveryKeyAttestationCredentialInfo {
196 pub attestation_data: String,
197
198 pub client_data: String,
199
200 pub cred_id: String,
201}
202
203#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
204pub enum RecoveryKeyAttestationCredentialKind {
205 #[serde(rename = "RecoveryKey")]
206 RecoveryKey,
207}
208
209#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
210#[serde(rename_all = "camelCase")]
211pub struct RecoveryFactorAttestation {
212 pub credential_info: RecoveryFactorAttestationCredentialInfo,
213
214 pub credential_kind: RecoveryKeyAttestationCredentialKind,
215
216 pub encrypted_private_key: Option<String>,
217}
218
219#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
220#[serde(rename_all = "camelCase")]
221pub struct RecoveryFactorAttestationCredentialInfo {
222 pub attestation_data: String,
223
224 pub client_data: String,
225
226 pub cred_id: String,
227}
228
229#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
230#[serde(rename_all = "camelCase")]
231pub struct CredentialAttestation {
232 pub credential_info: CredentialAttestationCredentialInfo,
233
234 pub credential_kind: CredentialAttestationCredentialKind,
235
236 pub encrypted_private_key: Option<String>,
237}
238
239#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
240#[serde(rename_all = "camelCase")]
241pub struct CredentialAttestationCredentialInfo {
242 pub attestation_data: Option<String>,
243
244 pub client_data: Option<String>,
245
246 pub cred_id: Option<String>,
247
248 pub password: Option<String>,
249
250 pub otp_code: Option<String>,
251}
252
253#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
254pub enum CredentialAttestationCredentialKind {
255 Fido2,
256
257 Key,
258
259 Password,
260
261 #[serde(rename = "RecoveryKey")]
262 RecoveryKey,
263
264 Totp,
265}
266
267pub type UserRegistrationChallenge = CreateRegistrationChallengeResponse;
268
269#[derive(Debug, Clone)]
270pub enum Challenge {
271 Registration(CreateRegistrationChallengeResponse),
272 Credential(CreateCredentialChallengeResponse),
273}
274
275pub trait CredentialAttestationTrait: Send + Sync + 'static {
276 fn get_kind(&self) -> &str;
277}
278
279pub trait CredentialStore<T: CredentialAttestationTrait> {
280 fn create<'a>(
281 &'a self,
282 challenge: Challenge,
283 ) -> Pin<Box<dyn Future<Output = Result<T, DfnsError>> + Send + 'a>>;
284}
285
286impl CredentialAttestationTrait for FirstFactorAttestation {
287 fn get_kind(&self) -> &str {
288 "FirstFactor"
289 }
290}