fido_hid_message.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. #ifndef DEVICE_FIDO_HID_FIDO_HID_MESSAGE_H_
  5. #define DEVICE_FIDO_HID_FIDO_HID_MESSAGE_H_
  6. #include <stddef.h>
  7. #include <stdint.h>
  8. #include <memory>
  9. #include <vector>
  10. #include "base/component_export.h"
  11. #include "base/containers/circular_deque.h"
  12. #include "base/containers/queue.h"
  13. #include "base/containers/span.h"
  14. #include "device/fido/fido_constants.h"
  15. #include "device/fido/hid/fido_hid_packet.h"
  16. #include "third_party/abseil-cpp/absl/types/optional.h"
  17. namespace device {
  18. // Represents HID message format defined by the specification at
  19. // https://fidoalliance.org/specs/fido-v2.0-rd-20161004/fido-client-to-authenticator-protocol-v2.0-rd-20161004.html#message-and-packet-structure
  20. class COMPONENT_EXPORT(DEVICE_FIDO) FidoHidMessage {
  21. public:
  22. // Static functions to create CTAP/U2F HID commands.
  23. static absl::optional<FidoHidMessage> Create(uint32_t channel_id,
  24. FidoHidDeviceCommand cmd,
  25. size_t max_report_size,
  26. base::span<const uint8_t> data);
  27. // Reconstruct a message from serialized message data.
  28. static absl::optional<FidoHidMessage> CreateFromSerializedData(
  29. base::span<const uint8_t> serialized_data);
  30. FidoHidMessage(FidoHidMessage&& that);
  31. FidoHidMessage& operator=(FidoHidMessage&& other);
  32. FidoHidMessage(const FidoHidMessage&) = delete;
  33. FidoHidMessage& operator=(const FidoHidMessage&) = delete;
  34. ~FidoHidMessage();
  35. bool MessageComplete() const;
  36. std::vector<uint8_t> GetMessagePayload() const;
  37. // Pop front of queue with next packet.
  38. std::vector<uint8_t> PopNextPacket();
  39. // Adds a continuation packet to the packet list, from the serialized
  40. // response value.
  41. bool AddContinuationPacket(base::span<const uint8_t> packet_buf);
  42. size_t NumPackets() const;
  43. uint32_t channel_id() const { return channel_id_; }
  44. FidoHidDeviceCommand cmd() const { return cmd_; }
  45. const base::circular_deque<std::unique_ptr<FidoHidPacket>>&
  46. GetPacketsForTesting() const {
  47. return packets_;
  48. }
  49. private:
  50. FidoHidMessage(uint32_t channel_id,
  51. FidoHidDeviceCommand type,
  52. size_t max_report_size,
  53. base::span<const uint8_t> data);
  54. FidoHidMessage(std::unique_ptr<FidoHidInitPacket> init_packet,
  55. size_t remaining_size);
  56. uint32_t channel_id_ = kHidBroadcastChannel;
  57. FidoHidDeviceCommand cmd_ = FidoHidDeviceCommand::kMsg;
  58. base::circular_deque<std::unique_ptr<FidoHidPacket>> packets_;
  59. size_t remaining_size_ = 0;
  60. };
  61. } // namespace device
  62. #endif // DEVICE_FIDO_HID_FIDO_HID_MESSAGE_H_