blob: e3f448c052b730a36641faec845511e7c03f2f90 [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/fido_device.h"
#include <utility>
#include "base/bind.h"
#include "base/stl_util.h"
#include "device/base/features.h"
#include "device/fido/ctap_empty_authenticator_request.h"
#include "device/fido/device_response_converter.h"
#include "device/fido/fido_constants.h"
namespace device {
FidoDevice::FidoDevice() = default;
FidoDevice::~FidoDevice() = default;
void FidoDevice::DiscoverSupportedProtocolAndDeviceInfo(
base::OnceClosure done) {
if (base::FeatureList::IsEnabled(kNewCtap2Device)) {
// Set the protocol version to CTAP2 for the purpose of sending the GetInfo
// request. The correct value will be set in the callback based on the
// device response.
supported_protocol_ = ProtocolVersion::kCtap;
DeviceTransact(AuthenticatorGetInfoRequest().Serialize(),
base::BindOnce(&FidoDevice::OnDeviceInfoReceived,
GetWeakPtr(), std::move(done)));
} else {
supported_protocol_ = ProtocolVersion::kU2f;
std::move(done).Run();
}
}
bool FidoDevice::SupportedProtocolIsInitialized() {
return (supported_protocol_ == ProtocolVersion::kU2f && !device_info_) ||
(supported_protocol_ == ProtocolVersion::kCtap && device_info_);
}
void FidoDevice::OnDeviceInfoReceived(
base::OnceClosure done,
base::Optional<std::vector<uint8_t>> response) {
state_ = FidoDevice::State::kReady;
base::Optional<AuthenticatorGetInfoResponse> get_info_response =
response ? ReadCTAPGetInfoResponse(*response) : base::nullopt;
if (!get_info_response || !base::ContainsKey(get_info_response->versions(),
ProtocolVersion::kCtap)) {
supported_protocol_ = ProtocolVersion::kU2f;
} else {
supported_protocol_ = ProtocolVersion::kCtap;
device_info_ = std::move(*get_info_response);
}
std::move(done).Run();
}
void FidoDevice::SetDeviceInfo(AuthenticatorGetInfoResponse device_info) {
device_info_ = std::move(device_info);
}
} // namespace device