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