// 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_adpu.h"
#include "u2fd/user_state.h"

namespace u2f {

// Processes incoming U2F messages, and produces corresponding responses.
class U2fMessageHandler {
 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 ADPU and builds a response locally, making using of cr50
  // vendor commands where necessary.
  U2fResponseAdpu ProcessMsg(const std::string& request);

 private:
  // Process a U2F_REGISTER ADPU.
  U2fResponseAdpu ProcessU2fRegister(const U2fRegisterRequestAdpu& request);
  // Process a U2F_AUTHENTICATE ADPU.
  U2fResponseAdpu ProcessU2fAuthenticate(
      const U2fAuthenticateRequestAdpu& 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.
  U2fResponseAdpu BuildEmptyResponse(uint16_t sw);

  // Builds an empty U2F response with a U2F status code corresponding to the
  // specified cr50 status.
  U2fResponseAdpu 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_
