1 // Copyright 2017 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 #include <utility>
6
7 #include "device/fido/public_key_credential_descriptor.h"
8
9 namespace device {
10
11 namespace {
12
13 // Keys for storing credential descriptor information in CBOR map.
14 constexpr char kCredentialIdKey[] = "id";
15 constexpr char kCredentialTypeKey[] = "type";
16
17 } // namespace
18
19 // static
20 base::Optional<PublicKeyCredentialDescriptor>
CreateFromCBORValue(const cbor::Value & cbor)21 PublicKeyCredentialDescriptor::CreateFromCBORValue(const cbor::Value& cbor) {
22 if (!cbor.is_map()) {
23 return base::nullopt;
24 }
25
26 const cbor::Value::MapValue& map = cbor.GetMap();
27 auto type = map.find(cbor::Value(kCredentialTypeKey));
28 if (type == map.end() || !type->second.is_string() ||
29 type->second.GetString() != kPublicKey)
30 return base::nullopt;
31
32 auto id = map.find(cbor::Value(kCredentialIdKey));
33 if (id == map.end() || !id->second.is_bytestring())
34 return base::nullopt;
35
36 return PublicKeyCredentialDescriptor(CredentialType::kPublicKey,
37 id->second.GetBytestring());
38 }
39
40 PublicKeyCredentialDescriptor::PublicKeyCredentialDescriptor() = default;
41
PublicKeyCredentialDescriptor(CredentialType credential_type,std::vector<uint8_t> id)42 PublicKeyCredentialDescriptor::PublicKeyCredentialDescriptor(
43 CredentialType credential_type,
44 std::vector<uint8_t> id)
45 : PublicKeyCredentialDescriptor(
46 credential_type,
47 std::move(id),
48 {FidoTransportProtocol::kUsbHumanInterfaceDevice,
49 FidoTransportProtocol::kBluetoothLowEnergy,
50 FidoTransportProtocol::kNearFieldCommunication,
51 FidoTransportProtocol::kCloudAssistedBluetoothLowEnergy,
52 FidoTransportProtocol::kInternal}) {}
53
PublicKeyCredentialDescriptor(CredentialType credential_type,std::vector<uint8_t> id,base::flat_set<FidoTransportProtocol> transports)54 PublicKeyCredentialDescriptor::PublicKeyCredentialDescriptor(
55 CredentialType credential_type,
56 std::vector<uint8_t> id,
57 base::flat_set<FidoTransportProtocol> transports)
58 : credential_type_(credential_type),
59 id_(std::move(id)),
60 transports_(std::move(transports)) {}
61
62 PublicKeyCredentialDescriptor::PublicKeyCredentialDescriptor(
63 const PublicKeyCredentialDescriptor& other) = default;
64
65 PublicKeyCredentialDescriptor::PublicKeyCredentialDescriptor(
66 PublicKeyCredentialDescriptor&& other) = default;
67
68 PublicKeyCredentialDescriptor& PublicKeyCredentialDescriptor::operator=(
69 const PublicKeyCredentialDescriptor& other) = default;
70
71 PublicKeyCredentialDescriptor& PublicKeyCredentialDescriptor::operator=(
72 PublicKeyCredentialDescriptor&& other) = default;
73
74 PublicKeyCredentialDescriptor::~PublicKeyCredentialDescriptor() = default;
75
operator ==(const PublicKeyCredentialDescriptor & other) const76 bool PublicKeyCredentialDescriptor::operator==(
77 const PublicKeyCredentialDescriptor& other) const {
78 return credential_type_ == other.credential_type_ && id_ == other.id_ &&
79 transports_ == other.transports_;
80 }
81
AsCBOR(const PublicKeyCredentialDescriptor & desc)82 cbor::Value AsCBOR(const PublicKeyCredentialDescriptor& desc) {
83 cbor::Value::MapValue cbor_descriptor_map;
84 cbor_descriptor_map[cbor::Value(kCredentialIdKey)] = cbor::Value(desc.id());
85 cbor_descriptor_map[cbor::Value(kCredentialTypeKey)] =
86 cbor::Value(CredentialTypeToString(desc.credential_type()));
87 return cbor::Value(std::move(cbor_descriptor_map));
88 }
89
90 } // namespace device
91