// Copyright 2018 The Chromium OS 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 U2FD_G2F_TOOLS_G2F_CLIENT_H_
#define U2FD_G2F_TOOLS_G2F_CLIENT_H_

#include <cstdint>
#include <string>

#include <base/optional.h>
#include <brillo/secure_blob.h>
#include <hidapi/hidapi.h>

#include "u2fd/u2fhid.h"

namespace g2f_client {

struct FrameBlob;

// Represents the HID layer of a U2F HID device.
class HidDevice {
 public:
  // Channel ID, as specifid in section 2.4 of FIDO U2F HID Spec.
  struct Cid {
    uint8_t raw[4];

    constexpr uint32_t value() const {
      // Cid is stored in little endian byte order.
      // Note: Cid address may be unaligned, so can't use ntohl.
      return static_cast<uint32_t>(raw[0]) |
             (static_cast<uint32_t>(raw[1]) << 8) |
             (static_cast<uint32_t>(raw[2]) << 16) |
             (static_cast<uint32_t>(raw[3]) << 24);
    }
    constexpr uint32_t IsBroadcast() const {
      return value() == 0xFFFFFFFFu;
    }
  } __attribute__((__packed__));
  static_assert(sizeof(Cid) == 4, "Wrong Cid size");

  // Broadcast Channel ID, used during INIT command to create a channel.
  static constexpr Cid kCidBroadcast = { { 0xFF, 0xFF, 0xFF, 0xFF } };

  // Creates a new instance for the device at the specified path.
  // Does not open the device.
  explicit HidDevice(const std::string& path);
  virtual ~HidDevice();

  virtual bool IsOpened() const { return dev_ != nullptr; }
  // Attempts to open the device, returns true on success.
  virtual bool Open();
  // Closes the device, if open.
  virtual void Close();
  // Sends a message to the given channel, with the specified command
  // and payload. Payload will be split into multiple messages if necessary.
  // Returns true on success.
  virtual bool SendRequest(const Cid& cid, uint8_t cmd,
                           const brillo::Blob& payload);
  // Reads a response for the given channel. This should follow a call
  // to SendRequest. Returns true on success, false if a packet could
  // not be read, or an unexpected packet was read.
  virtual bool RecvResponse(const Cid& cid, uint8_t* cmd,
                            brillo::Blob* payload,
                            int timeout_ms);

 private:
  bool WriteBlob(const FrameBlob& blob);
  bool ReadBlob(FrameBlob* blob, int timeout_ms);
  // Returns true if res == expected, prints out an error message and
  // returns false otherwise.
  bool CheckDeviceError(const std::string& func, int res, int expected);

  // Non-null iff the device is open.
  hid_device* dev_ = nullptr;
  // Path to the device.
  std::string path_;
};

// Represents U2F layer of a U2F HID device.
class U2FHid {
 public:
  using CommandCode = u2f::U2fHid::U2fHidCommand;
  using ErrorCode = u2f::U2fHid::U2fHidError;

  // Represents a U2F command, e.g. REGISTER or AUTHENTICATE.
  struct Command {
    uint8_t cmd;
    brillo::Blob payload;

    Command() = default;
    Command(CommandCode code, const brillo::Blob& payload)
        : cmd(static_cast<uint8_t>(code)), payload(payload) {}

    constexpr bool IsError() const {
      return cmd == static_cast<uint8_t>(CommandCode::kError);
    }
    constexpr uint8_t ErrorCode() const;
    // Returns true if the command was succesful, and prints
    // an error message if not.
    bool CheckSuccess(const std::string& descr) const;
    // Returns a description of the command.
    std::string Description() const;
    // Returns a hex-encoded dump of the command payload.
    std::string FullDump() const;
    // Returns a human-readable name for the command.
    std::string CommandName() const;
    // Returns a human-readable name for the error.
    std::string ErrorName() const;
  };

  // U2F HID Device version information, returned as part of
  // Init command.
  struct Version {
    uint8_t protocol;
    uint8_t major;
    uint8_t minor;
    uint8_t build;
  };

  // Creates a new instance for the specified hid_device, which must
  // outlive this instance.
  explicit U2FHid(HidDevice* hid_device);
  virtual ~U2FHid() = default;

  // Sends a raw Command and retrieves the response. Returns
  // true on success.
  bool RawCommand(const Command& request, Command* response);
  // Creates a new U2F HID Channel if necessary. Must be called
  // before calling any other commands below. If force_realloc is
  // true then a new channel will be created even if one already
  // exists. This sends a U2FHID_INIT command.
  bool Init(bool force_realloc);
  // Locks the device so that it only accepts commands from the
  // most recently created channel for the specified time.
  // This sends a U2FHID_LOCK command.
  bool Lock(uint8_t lock_timeout_seconds);
  // This sends the specified message to the device. The message
  // should be formatted according to section 4.1.1 of the FIDO
  // U2F HID spec. This sends a U2FHID_MSG command.
  virtual bool Msg(const brillo::Blob& request,
                   brillo::Blob* response);
  // This sends a ping of the specified size to the device.
  // This is a U2FHID_PING command.
  bool Ping(size_t size);
  // This sends a U2FHID_WINK command, causing the device to
  // blink (or similar).
  bool Wink();

  // Returns true if a channel has been created, and the device
  // is ready to send commands (other than Init).
  bool Initialized() const { return !cid_.IsBroadcast(); }
  // Returns the device version information, provided by the
  // device during initialization. Must successfully call Init()
  // for this to be valid.
  const Version& GetVersion() const { return version_; }
  // Returns device capabilities, provided by the device during
  // initialization. Must successfully call Init() for this to be
  // valid. Capabilities format is specified in section 4.1.2 of
  // the FIDO U2FHID spec.
  uint8_t GetCaps() const { return caps_; }
  // Sets the channel ID to use (which must already exist).
  void SetCid(const HidDevice::Cid& cid) { cid_ = cid; }

 private:
  bool GetSuccessfulResponse(const Command& request, Command* response);

  HidDevice* hid_device_;
  HidDevice::Cid cid_ = HidDevice::kCidBroadcast;
  int timeout_ms_ = -1;
  Version version_;
  uint8_t caps_;
};

// Represents the U2F layer, responsible for sending
// register, authenticate, etc messages.
class U2F {
 public:
  // Creates a new instance to wrap the specified
  // u2f_device, which must outlive this instance.
  explicit U2F(U2FHid* u2f_device) : u2f_device_(u2f_device) {}

  // This sends a U2F_REGISTER message.
  bool Register(base::Optional<uint8_t> p1,
                const brillo::Blob& challenge,
                const brillo::Blob& application,
                bool use_g2f_att_key,
                brillo::Blob* public_key,
                brillo::Blob* key_handle,
                brillo::Blob* certificate_and_signature);
  // This sends a U2F_AUTHENTICATE message.
  bool Authenticate(base::Optional<uint8_t> p1,
                    const brillo::Blob& challenge,
                    const brillo::Blob& application,
                    const brillo::Blob& key_handle,
                    bool* presence_verified,
                    brillo::Blob* counter,
                    brillo::Blob* signature);

  static void AppendBlob(const brillo::Blob& from,
                         brillo::Blob* to);

 private:
  // Sends a U2F message, checks that the response is sufficiently
  // long, and that the returned status word is SW_NO_ERROR. The
  // size specified should not include the two SW1 and SW2 bytes.
  // Returns false if size or status conditions are not met.
  bool SendMsg(const brillo::Blob& request,
               int min_response_size,
               brillo::Blob* response);

  // Copies data from a blob and appends to the end of another.
  // Start position is specified by from_it, which is updated
  // to point to the next unread byte, allowing subsequent calls
  // to re-use the same iterator to read the next available bytes.
  // Returns false if the source blob did not have enough data to
  // copy the requested length, true otherwise.
  static bool AppendFromResponse(const brillo::Blob& from,
                                 brillo::Blob::iterator* from_it,
                                 size_t length,
                                 brillo::Blob* to);

  U2FHid* u2f_device_;

  // This is the minimum set of sizes necessary to successfully
  // parse the response into sections; this does not imply that
  // further parsing of individual sections (e.g. the certificate)
  // will succeed.
  static constexpr int kRegResponseMinSize =
      1 +   // Reserved Byte (legacy reasons)
      65 +  // User Public key
      1 +   // Key Handle Length
      1 +   // Key Handle (minimum)
      1;    // Certificate + signature (minimum)
  static constexpr int kRegResponseStartOffset = 1;
  static constexpr int kRegResponsePublicKeyLength = 65;

  // This size should be interpreted in the same way as
  // kRegResponseMinSize above.
  static constexpr int kAuthResponseMinSize =
      1 +  // User presence
      4 +  // Counter
      1;   // Signature

  static constexpr int kAuthResponseCounterOffset = 1;
  static constexpr int kAuthResponseCounterLength = 4;
};

}  // namespace g2f_client

#endif  // U2FD_G2F_TOOLS_G2F_CLIENT_H_
