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) const11bool 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)18PublicKeyCredentialParams::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)49PublicKeyCredentialParams::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)67cbor::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