// Copyright 2019 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_U2F_MSG_HANDLER_H_
#define U2FD_U2F_MSG_HANDLER_H_

#include <functional>
#include <memory>
#include <string>
#include <vector>

#include <attestation/proto_bindings/interface.pb.h>
#include <base/optional.h>
#include <metrics/metrics_library.h>

#include "u2fd/allowlisting_util.h"
#include "u2fd/tpm_vendor_cmd.h"
#include "u2fd/u2f_apdu.h"
#include "u2fd/u2f_msg_handler_interface.h"
#include "u2fd/user_state.h"

namespace u2f {

// Processes incoming U2F messages, and produces corresponding responses.
class U2fMessageHandler : public U2fMessageHandlerInterface {
 public:
  // Constructs a new message handler. Does not take ownership of proxy or
  // metrics, both of which must outlive this instance.
  U2fMessageHandler(std::unique_ptr<AllowlistingUtil> allowlisting_util,
                    std::function<void()> request_user_presence,
                    UserState* user_state,
                    TpmVendorCommandProxy* proxy,
                    MetricsLibraryInterface* metrics,
                    bool allow_legacy_kh_sign,
                    bool allow_g2f_attestation);

  // Processes the APDU and builds a response locally, making using of cr50
  // vendor commands where necessary.
  U2fResponseApdu ProcessMsg(const std::string& request) override;

 private:
  // Process a U2F_REGISTER APDU.
  U2fResponseApdu ProcessU2fRegister(const U2fRegisterRequestApdu& request);
  // Process a U2F_AUTHENTICATE APDU.
  U2fResponseApdu ProcessU2fAuthenticate(
      const U2fAuthenticateRequestApdu& request);

  // Status for execution of a cr50 command. Includes status of preparation
  // of the request, actual execution of the cr50 command, and any processing
  // of the response.
  enum class Cr50CmdStatus : uint32_t {
    // Cr50 return codes, map to vendor_cmd_rc in tpm_vendor_cmds.h
    kSuccess = 0,
    kNotAllowed = 0x507,
    kPasswordRequired = 0x50a,
    // Errors that occur in u2fd while processing requests/responses.
    kInvalidState = 0x580,
    kInvalidResponseData,
  };

  // Wrapper functions for cr50 U2F vendor commands.

  // Run a U2F_GENERATE command to create a new key handle.
  Cr50CmdStatus DoU2fGenerate(const std::vector<uint8_t>& app_id,
                              std::vector<uint8_t>* pub_key,
                              std::vector<uint8_t>* key_handle);
  // Run a U2F_SIGN command to sign a hash using an existing key handle.
  Cr50CmdStatus DoU2fSign(const std::vector<uint8_t>& app_id,
                          const std::vector<uint8_t>& key_handle,
                          const std::vector<uint8_t>& hash,
                          std::vector<uint8_t>* signature);
  // Run a U2F_SIGN command to check if a key handle is valid.
  Cr50CmdStatus DoU2fSignCheckOnly(const std::vector<uint8_t>& app_id,
                                   const std::vector<uint8_t>& key_handle);
  // Run a U2F_ATTEST command to sign data using the cr50 individual attestation
  // certificate. Returns true on success.
  Cr50CmdStatus DoG2fAttest(const std::vector<uint8_t>& data,
                            uint8_t format,
                            std::vector<uint8_t>* sig_out);

  // Builds an empty U2F response with the specified status code.
  U2fResponseApdu BuildEmptyResponse(uint16_t sw);

  // Builds an empty U2F response with a U2F status code corresponding to the
  // specified cr50 status.
  U2fResponseApdu BuildErrorResponse(Cr50CmdStatus status);

  std::unique_ptr<AllowlistingUtil> allowlisting_util_;
  std::function<void()> request_user_presence_;
  UserState* user_state_;
  TpmVendorCommandProxy* proxy_;
  MetricsLibraryInterface* metrics_;

  const bool allow_legacy_kh_sign_;
  const bool allow_g2f_attestation_;
};

}  // namespace u2f

#endif  // U2FD_U2F_MSG_HANDLER_H_
