blob: ecf386cd39ec4528551b9a43fe0e0636cc3ee3a1 [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.
#ifndef DEVICE_FIDO_FIDO_HID_MESSAGE_H_
#define DEVICE_FIDO_FIDO_HID_MESSAGE_H_
#include <stddef.h>
#include <stdint.h>
#include <list>
#include <memory>
#include <vector>
#include "base/component_export.h"
#include "base/containers/circular_deque.h"
#include "base/containers/queue.h"
#include "base/containers/span.h"
#include "base/macros.h"
#include "base/optional.h"
#include "device/fido/fido_constants.h"
#include "device/fido/fido_hid_packet.h"
namespace device {
// Represents HID message format defined by the specification at
// https://fidoalliance.org/specs/fido-v2.0-rd-20161004/fido-client-to-authenticator-protocol-v2.0-rd-20161004.html#message-and-packet-structure
class COMPONENT_EXPORT(DEVICE_FIDO) FidoHidMessage {
public:
// Static functions to create CTAP/U2F HID commands.
static base::Optional<FidoHidMessage> Create(uint32_t channel_id,
FidoHidDeviceCommand cmd,
base::span<const uint8_t> data);
// Reconstruct a message from serialized message data.
static base::Optional<FidoHidMessage> CreateFromSerializedData(
base::span<const uint8_t> serialized_data);
FidoHidMessage(FidoHidMessage&& that);
FidoHidMessage& operator=(FidoHidMessage&& other);
~FidoHidMessage();
bool MessageComplete() const;
std::vector<uint8_t> GetMessagePayload() const;
// Pop front of queue with next packet.
std::vector<uint8_t> PopNextPacket();
// Adds a continuation packet to the packet list, from the serialized
// response value.
bool AddContinuationPacket(base::span<const uint8_t> packet_buf);
size_t NumPackets() const;
uint32_t channel_id() const { return channel_id_; }
FidoHidDeviceCommand cmd() const { return cmd_; }
const base::circular_deque<std::unique_ptr<FidoHidPacket>>&
GetPacketsForTesting() const {
return packets_;
}
private:
FidoHidMessage(uint32_t channel_id,
FidoHidDeviceCommand type,
base::span<const uint8_t> data);
FidoHidMessage(std::unique_ptr<FidoHidInitPacket> init_packet,
size_t remaining_size);
uint32_t channel_id_ = kHidBroadcastChannel;
FidoHidDeviceCommand cmd_ = FidoHidDeviceCommand::kMsg;
base::circular_deque<std::unique_ptr<FidoHidPacket>> packets_;
size_t remaining_size_ = 0;
DISALLOW_COPY_AND_ASSIGN(FidoHidMessage);
};
} // namespace device
#endif // DEVICE_FIDO_FIDO_HID_MESSAGE_H_