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