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 "device/fido/public_key_credential_params.h"
6 
7 #include <utility>
8 
9 namespace device {
10 
operator ==(const CredentialInfo & other) const11 bool PublicKeyCredentialParams::CredentialInfo::operator==(
12     const CredentialInfo& other) const {
13   return type == other.type && algorithm == other.algorithm;
14 }
15 
16 // static
17 base::Optional<PublicKeyCredentialParams>
CreateFromCBORValue(const cbor::Value & cbor_value)18 PublicKeyCredentialParams::CreateFromCBORValue(const cbor::Value& cbor_value) {
19   if (!cbor_value.is_array())
20     return base::nullopt;
21 
22   std::vector<PublicKeyCredentialParams::CredentialInfo> credential_params;
23   for (const auto& credential : cbor_value.GetArray()) {
24     if (!credential.is_map() || credential.GetMap().size() != 2)
25       return base::nullopt;
26 
27     const auto& credential_map = credential.GetMap();
28     const auto credential_type_it =
29         credential_map.find(cbor::Value(kCredentialTypeMapKey));
30     const auto algorithm_type_it =
31         credential_map.find(cbor::Value(kCredentialAlgorithmMapKey));
32 
33     if (credential_type_it == credential_map.end() ||
34         !credential_type_it->second.is_string() ||
35         credential_type_it->second.GetString() != kPublicKey ||
36         algorithm_type_it == credential_map.end() ||
37         !algorithm_type_it->second.is_integer()) {
38       return base::nullopt;
39     }
40 
41     credential_params.push_back(PublicKeyCredentialParams::CredentialInfo{
42         CredentialType::kPublicKey,
43         static_cast<int>(algorithm_type_it->second.GetInteger())});
44   }
45 
46   return PublicKeyCredentialParams(std::move(credential_params));
47 }
48 
PublicKeyCredentialParams(std::vector<CredentialInfo> credential_params)49 PublicKeyCredentialParams::PublicKeyCredentialParams(
50     std::vector<CredentialInfo> credential_params)
51     : public_key_credential_params_(std::move(credential_params)) {}
52 
53 PublicKeyCredentialParams::PublicKeyCredentialParams(
54     const PublicKeyCredentialParams& other) = default;
55 
56 PublicKeyCredentialParams::PublicKeyCredentialParams(
57     PublicKeyCredentialParams&& other) = default;
58 
59 PublicKeyCredentialParams& PublicKeyCredentialParams::operator=(
60     const PublicKeyCredentialParams& other) = default;
61 
62 PublicKeyCredentialParams& PublicKeyCredentialParams::operator=(
63     PublicKeyCredentialParams&& other) = default;
64 
65 PublicKeyCredentialParams::~PublicKeyCredentialParams() = default;
66 
AsCBOR(const PublicKeyCredentialParams & params)67 cbor::Value AsCBOR(const PublicKeyCredentialParams& params) {
68   cbor::Value::ArrayValue credential_param_array;
69   credential_param_array.reserve(params.public_key_credential_params().size());
70 
71   for (const auto& credential : params.public_key_credential_params()) {
72     cbor::Value::MapValue cbor_credential_map;
73     cbor_credential_map.emplace(kCredentialTypeMapKey,
74                                 CredentialTypeToString(credential.type));
75     cbor_credential_map.emplace(kCredentialAlgorithmMapKey,
76                                 credential.algorithm);
77     credential_param_array.emplace_back(std::move(cbor_credential_map));
78   }
79   return cbor::Value(std::move(credential_param_array));
80 }
81 
82 }  // namespace device
83