blob: 128f1ed2e35ef1cc2e8c935c9eb1ac68479469e0 [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_PACKET_H_
#define DEVICE_FIDO_FIDO_HID_PACKET_H_
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include <vector>
#include "base/component_export.h"
#include "base/containers/span.h"
#include "base/macros.h"
#include "device/fido/fido_constants.h"
namespace device {
// HID Packets are 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
// Packets are one of two types, initialization packets and continuation
// packets. HID Packets have header information and a payload. If a
// FidoHidInitPacket cannot store the entire payload, further payload
// information is stored in HidContinuationPackets.
class COMPONENT_EXPORT(DEVICE_FIDO) FidoHidPacket {
public:
FidoHidPacket(std::vector<uint8_t> data, uint32_t channel_id);
virtual ~FidoHidPacket();
virtual std::vector<uint8_t> GetSerializedData() const = 0;
const std::vector<uint8_t>& GetPacketPayload() const { return data_; }
uint32_t channel_id() const { return channel_id_; }
protected:
FidoHidPacket();
std::vector<uint8_t> data_;
uint32_t channel_id_ = kHidBroadcastChannel;
private:
friend class HidMessage;
DISALLOW_COPY_AND_ASSIGN(FidoHidPacket);
};
// FidoHidInitPacket, based on the CTAP specification consists of a header with
// data that is serialized into a IOBuffer. A channel identifier is allocated by
// the CTAP device to ensure its system-wide uniqueness. Command identifiers
// determine the type of message the packet corresponds to. Payload length
// is the length of the entire message payload, and the data is only the portion
// of the payload that will fit into the HidInitPacket.
class COMPONENT_EXPORT(DEVICE_FIDO) FidoHidInitPacket : public FidoHidPacket {
public:
// Creates a packet from the serialized data of an initialization packet. As
// this is the first packet, the payload length of the entire message will be
// included within the serialized data. Remaining size will be returned to
// inform the callee how many additional packets to expect.
static std::unique_ptr<FidoHidInitPacket> CreateFromSerializedData(
base::span<const uint8_t> serialized,
size_t* remaining_size);
FidoHidInitPacket(uint32_t channel_id,
FidoHidDeviceCommand cmd,
std::vector<uint8_t> data,
uint16_t payload_length);
~FidoHidInitPacket() final;
std::vector<uint8_t> GetSerializedData() const final;
FidoHidDeviceCommand command() const { return command_; }
uint16_t payload_length() const { return payload_length_; }
private:
FidoHidDeviceCommand command_;
uint16_t payload_length_;
DISALLOW_COPY_AND_ASSIGN(FidoHidInitPacket);
};
// FidoHidContinuationPacket, based on the CTAP Specification consists of a
// header with data that is serialized into an IOBuffer. The channel identifier
// will be identical to the identifier in all other packets of the message. The
// packet sequence will be the sequence number of this particular packet, from
// 0x00 to 0x7f.
class COMPONENT_EXPORT(DEVICE_FIDO) FidoHidContinuationPacket
: public FidoHidPacket {
public:
// Creates a packet from the serialized data of a continuation packet. As an
// HidInitPacket would have arrived earlier with the total payload size,
// the remaining size should be passed to inform the packet of how much data
// to expect.
static std::unique_ptr<FidoHidContinuationPacket> CreateFromSerializedData(
base::span<const uint8_t> serialized,
size_t* remaining_size);
FidoHidContinuationPacket(uint32_t channel_id,
uint8_t sequence,
std::vector<uint8_t> data);
~FidoHidContinuationPacket() final;
std::vector<uint8_t> GetSerializedData() const final;
uint8_t sequence() const { return sequence_; }
private:
uint8_t sequence_;
DISALLOW_COPY_AND_ASSIGN(FidoHidContinuationPacket);
};
} // namespace device
#endif // DEVICE_FIDO_FIDO_HID_PACKET_H_