blob: 0ea270a89755c7450b0496f60be706a5a6c6be47 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "device/fido/public_key_credential_params.h"
#include <utility>
namespace device {
// static
base::Optional<PublicKeyCredentialParams>
PublicKeyCredentialParams::CreateFromCBORValue(const cbor::Value& cbor_value) {
if (!cbor_value.is_array())
return base::nullopt;
std::vector<PublicKeyCredentialParams::CredentialInfo> credential_params;
for (const auto& credential : cbor_value.GetArray()) {
if (!credential.is_map() || credential.GetMap().size() != 2)
return base::nullopt;
const auto& credential_map = credential.GetMap();
const auto credential_type_it =
credential_map.find(cbor::Value(kCredentialTypeMapKey));
const auto algorithm_type_it =
credential_map.find(cbor::Value(kCredentialAlgorithmMapKey));
if (credential_type_it == credential_map.end() ||
!credential_type_it->second.is_string() ||
credential_type_it->second.GetString() != kPublicKey ||
algorithm_type_it == credential_map.end() ||
!algorithm_type_it->second.is_integer()) {
return base::nullopt;
}
credential_params.push_back(PublicKeyCredentialParams::CredentialInfo{
CredentialType::kPublicKey, algorithm_type_it->second.GetInteger()});
}
return PublicKeyCredentialParams(std::move(credential_params));
}
PublicKeyCredentialParams::PublicKeyCredentialParams(
std::vector<CredentialInfo> credential_params)
: public_key_credential_params_(std::move(credential_params)) {}
PublicKeyCredentialParams::PublicKeyCredentialParams(
const PublicKeyCredentialParams& other) = default;
PublicKeyCredentialParams::PublicKeyCredentialParams(
PublicKeyCredentialParams&& other) = default;
PublicKeyCredentialParams& PublicKeyCredentialParams::operator=(
const PublicKeyCredentialParams& other) = default;
PublicKeyCredentialParams& PublicKeyCredentialParams::operator=(
PublicKeyCredentialParams&& other) = default;
PublicKeyCredentialParams::~PublicKeyCredentialParams() = default;
cbor::Value PublicKeyCredentialParams::ConvertToCBOR() const {
cbor::Value::ArrayValue credential_param_array;
credential_param_array.reserve(public_key_credential_params_.size());
for (const auto& credential : public_key_credential_params_) {
cbor::Value::MapValue cbor_credential_map;
cbor_credential_map.emplace(kCredentialTypeMapKey,
CredentialTypeToString(credential.type));
cbor_credential_map.emplace(kCredentialAlgorithmMapKey,
credential.algorithm);
credential_param_array.emplace_back(std::move(cbor_credential_map));
}
return cbor::Value(std::move(credential_param_array));
}
} // namespace device