dfns_sdk_rs/
store.rs

1// @dfns-sdk-rs/src/store.rs
2
3use 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}