1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CONTENT_BROWSER_WEBAUTH_AUTHENTICATOR_MOJOM_TRAITS_H_
6 #define CONTENT_BROWSER_WEBAUTH_AUTHENTICATOR_MOJOM_TRAITS_H_
7 
8 #include <string>
9 #include <vector>
10 
11 #include "base/containers/flat_tree.h"
12 #include "base/optional.h"
13 #include "base/strings/string16.h"
14 #include "device/fido/authenticator_selection_criteria.h"
15 #include "device/fido/cable/cable_discovery_data.h"
16 #include "device/fido/fido_constants.h"
17 #include "device/fido/fido_transport_protocol.h"
18 #include "device/fido/public_key_credential_descriptor.h"
19 #include "device/fido/public_key_credential_params.h"
20 #include "device/fido/public_key_credential_rp_entity.h"
21 #include "device/fido/public_key_credential_user_entity.h"
22 #include "mojo/public/cpp/bindings/array_traits_stl.h"
23 #include "mojo/public/cpp/bindings/enum_traits.h"
24 #include "mojo/public/cpp/bindings/struct_traits.h"
25 #include "third_party/blink/public/common/common_export.h"
26 #include "third_party/blink/public/mojom/webauthn/authenticator.mojom-shared.h"
27 
28 namespace mojo {
29 
30 template <>
31 struct BLINK_COMMON_EXPORT EnumTraits<blink::mojom::AuthenticatorTransport,
32                                       device::FidoTransportProtocol> {
33   static blink::mojom::AuthenticatorTransport ToMojom(
34       device::FidoTransportProtocol input);
35   static bool FromMojom(blink::mojom::AuthenticatorTransport input,
36                         device::FidoTransportProtocol* output);
37 };
38 
39 template <>
40 struct BLINK_COMMON_EXPORT
41     EnumTraits<blink::mojom::PublicKeyCredentialType, device::CredentialType> {
42   static blink::mojom::PublicKeyCredentialType ToMojom(
43       device::CredentialType input);
44   static bool FromMojom(blink::mojom::PublicKeyCredentialType input,
45                         device::CredentialType* output);
46 };
47 
48 template <>
49 struct BLINK_COMMON_EXPORT
50     StructTraits<blink::mojom::PublicKeyCredentialParametersDataView,
51                  device::PublicKeyCredentialParams::CredentialInfo> {
52   static device::CredentialType type(
53       const device::PublicKeyCredentialParams::CredentialInfo& in) {
54     return in.type;
55   }
56 
57   static int32_t algorithm_identifier(
58       const device::PublicKeyCredentialParams::CredentialInfo& in) {
59     return in.algorithm;
60   }
61 
62   static bool Read(blink::mojom::PublicKeyCredentialParametersDataView data,
63                    device::PublicKeyCredentialParams::CredentialInfo* out);
64 };
65 
66 template <>
67 struct BLINK_COMMON_EXPORT
68     StructTraits<blink::mojom::PublicKeyCredentialDescriptorDataView,
69                  device::PublicKeyCredentialDescriptor> {
70   static device::CredentialType type(
71       const device::PublicKeyCredentialDescriptor& in) {
72     return in.credential_type();
73   }
74 
75   static const std::vector<uint8_t>& id(
76       const device::PublicKeyCredentialDescriptor& in) {
77     return in.id();
78   }
79 
80   static const std::vector<device::FidoTransportProtocol> transports(
81       const device::PublicKeyCredentialDescriptor& in) {
82     std::vector<device::FidoTransportProtocol> protocols;
83     for (const auto& protocol : in.transports()) {
84       protocols.push_back(protocol);
85     }
86     return protocols;
87   }
88 
89   static bool Read(blink::mojom::PublicKeyCredentialDescriptorDataView data,
90                    device::PublicKeyCredentialDescriptor* out);
91 };
92 
93 template <>
94 struct BLINK_COMMON_EXPORT EnumTraits<blink::mojom::AuthenticatorAttachment,
95                                       device::AuthenticatorAttachment> {
96   static blink::mojom::AuthenticatorAttachment ToMojom(
97       device::AuthenticatorAttachment input);
98   static bool FromMojom(blink::mojom::AuthenticatorAttachment input,
99                         device::AuthenticatorAttachment* output);
100 };
101 
102 template <>
103 struct BLINK_COMMON_EXPORT EnumTraits<blink::mojom::ResidentKeyRequirement,
104                                       device::ResidentKeyRequirement> {
105   static blink::mojom::ResidentKeyRequirement ToMojom(
106       device::ResidentKeyRequirement input);
107   static bool FromMojom(blink::mojom::ResidentKeyRequirement input,
108                         device::ResidentKeyRequirement* output);
109 };
110 
111 template <>
112 struct BLINK_COMMON_EXPORT EnumTraits<blink::mojom::UserVerificationRequirement,
113                                       device::UserVerificationRequirement> {
114   static blink::mojom::UserVerificationRequirement ToMojom(
115       device::UserVerificationRequirement input);
116   static bool FromMojom(blink::mojom::UserVerificationRequirement input,
117                         device::UserVerificationRequirement* output);
118 };
119 
120 template <>
121 struct BLINK_COMMON_EXPORT
122     EnumTraits<blink::mojom::LargeBlobSupport, device::LargeBlobSupport> {
123   static blink::mojom::LargeBlobSupport ToMojom(device::LargeBlobSupport input);
124   static bool FromMojom(blink::mojom::LargeBlobSupport input,
125                         device::LargeBlobSupport* output);
126 };
127 
128 template <>
129 struct BLINK_COMMON_EXPORT
130     StructTraits<blink::mojom::AuthenticatorSelectionCriteriaDataView,
131                  device::AuthenticatorSelectionCriteria> {
132   static device::AuthenticatorAttachment authenticator_attachment(
133       const device::AuthenticatorSelectionCriteria& in) {
134     return in.authenticator_attachment();
135   }
136 
137   static device::ResidentKeyRequirement resident_key(
138       const device::AuthenticatorSelectionCriteria& in) {
139     return in.resident_key();
140   }
141 
142   static device::UserVerificationRequirement user_verification(
143       const device::AuthenticatorSelectionCriteria& in) {
144     return in.user_verification_requirement();
145   }
146 
147   static bool Read(blink::mojom::AuthenticatorSelectionCriteriaDataView data,
148                    device::AuthenticatorSelectionCriteria* out);
149 };
150 
151 template <>
152 struct BLINK_COMMON_EXPORT
153     StructTraits<blink::mojom::PublicKeyCredentialRpEntityDataView,
154                  device::PublicKeyCredentialRpEntity> {
155   static const std::string& id(const device::PublicKeyCredentialRpEntity& in) {
156     return in.id;
157   }
158 
159   static const base::Optional<std::string>& name(
160       const device::PublicKeyCredentialRpEntity& in) {
161     return in.name;
162   }
163 
164   static const base::Optional<GURL>& icon(
165       const device::PublicKeyCredentialRpEntity& in) {
166     return in.icon_url;
167   }
168 
169   static bool Read(blink::mojom::PublicKeyCredentialRpEntityDataView data,
170                    device::PublicKeyCredentialRpEntity* out);
171 };
172 
173 template <>
174 struct BLINK_COMMON_EXPORT
175     StructTraits<blink::mojom::PublicKeyCredentialUserEntityDataView,
176                  device::PublicKeyCredentialUserEntity> {
177   static const std::vector<uint8_t>& id(
178       const device::PublicKeyCredentialUserEntity& in) {
179     return in.id;
180   }
181 
182   static const base::Optional<std::string>& name(
183       const device::PublicKeyCredentialUserEntity& in) {
184     return in.name;
185   }
186 
187   static const base::Optional<std::string>& display_name(
188       const device::PublicKeyCredentialUserEntity& in) {
189     return in.display_name;
190   }
191 
192   static const base::Optional<GURL>& icon(
193       const device::PublicKeyCredentialUserEntity& in) {
194     return in.icon_url;
195   }
196 
197   static bool Read(blink::mojom::PublicKeyCredentialUserEntityDataView data,
198                    device::PublicKeyCredentialUserEntity* out);
199 };
200 
201 template <>
202 struct BLINK_COMMON_EXPORT
203     StructTraits<blink::mojom::CableAuthenticationDataView,
204                  device::CableDiscoveryData> {
205   static uint8_t version(const device::CableDiscoveryData& in) {
206     CHECK_EQ(device::CableDiscoveryData::Version::V1, in.version);
207     return 1;
208   }
209 
210   static const device::CableEidArray& client_eid(
211       const device::CableDiscoveryData& in) {
212     CHECK_EQ(device::CableDiscoveryData::Version::V1, in.version);
213     return in.v1->client_eid;
214   }
215 
216   static const device::CableEidArray& authenticator_eid(
217       const device::CableDiscoveryData& in) {
218     CHECK_EQ(device::CableDiscoveryData::Version::V1, in.version);
219     return in.v1->authenticator_eid;
220   }
221 
222   static const device::CableSessionPreKeyArray& session_pre_key(
223       const device::CableDiscoveryData& in) {
224     CHECK_EQ(device::CableDiscoveryData::Version::V1, in.version);
225     return in.v1->session_pre_key;
226   }
227 
228   static bool Read(blink::mojom::CableAuthenticationDataView data,
229                    device::CableDiscoveryData* out);
230 };
231 
232 template <>
233 struct BLINK_COMMON_EXPORT
234     EnumTraits<blink::mojom::AttestationConveyancePreference,
235                device::AttestationConveyancePreference> {
236   static blink::mojom::AttestationConveyancePreference ToMojom(
237       device::AttestationConveyancePreference input);
238   static bool FromMojom(blink::mojom::AttestationConveyancePreference input,
239                         device::AttestationConveyancePreference* output);
240 };
241 
242 }  // namespace mojo
243 
244 #endif  // CONTENT_BROWSER_WEBAUTH_AUTHENTICATOR_MOJOM_TRAITS_H_
245