// 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 ARC_KEYMASTER_KEYMASTER_SERVER_H_
#define ARC_KEYMASTER_KEYMASTER_SERVER_H_

#include <memory>
#include <vector>

#include <base/location.h>
#include <base/macros.h>
#include <base/memory/scoped_refptr.h>
#include <base/threading/thread.h>
#include <keymaster/android_keymaster.h>
#include <mojo/keymaster.mojom.h>

#include "arc/keymaster/context/arc_keymaster_context.h"

namespace arc {
namespace keymaster {

// KeymasterServer is a Mojo implementation of the Keymaster 3 HIDL interface.
// It fulfills requests using the reference Android Keymaster implementation.
class KeymasterServer : public arc::mojom::KeymasterServer {
 public:
  KeymasterServer();
  // Not copyable nor assignable.
  KeymasterServer(const KeymasterServer&) = delete;
  KeymasterServer& operator=(const KeymasterServer&) = delete;
  ~KeymasterServer() override;

  void SetSystemVersion(uint32_t osVersion, uint32_t osPatchLevel) override;

  void AddRngEntropy(const std::vector<uint8_t>& data,
                     AddRngEntropyCallback callback) override;

  void GetKeyCharacteristics(
      ::arc::mojom::GetKeyCharacteristicsRequestPtr request,
      GetKeyCharacteristicsCallback callback) override;

  void GenerateKey(std::vector<mojom::KeyParameterPtr> key_params,
                   GenerateKeyCallback callback) override;

  void ImportKey(arc::mojom::ImportKeyRequestPtr request,
                 ImportKeyCallback callback) override;

  void ExportKey(arc::mojom::ExportKeyRequestPtr request,
                 ExportKeyCallback callback) override;

  void AttestKey(arc::mojom::AttestKeyRequestPtr request,
                 AttestKeyCallback callback) override;

  void UpgradeKey(arc::mojom::UpgradeKeyRequestPtr request,
                  UpgradeKeyCallback callback) override;

  void DeleteKey(const std::vector<uint8_t>& key_blob,
                 DeleteKeyCallback callback) override;

  void DeleteAllKeys(DeleteKeyCallback callback) override;

  void Begin(arc::mojom::BeginRequestPtr request,
             BeginCallback callback) override;

  void Update(arc::mojom::UpdateRequestPtr request,
              UpdateCallback callback) override;

  void Finish(arc::mojom::FinishRequestPtr request,
              FinishCallback callback) override;

  void Abort(uint64_t operationHandle, AbortCallback callback) override;

 private:
  class Backend {
   public:
    Backend();
    // Not copyable nor assignable.
    Backend(const Backend&) = delete;
    Backend& operator=(const Backend&) = delete;
    ~Backend();

    context::ArcKeymasterContext* context() { return context_; }

    ::keymaster::AndroidKeymaster* keymaster() { return &keymaster_; }

   private:
    // Owned by |keymaster_|.
    context::ArcKeymasterContext* context_;
    ::keymaster::AndroidKeymaster keymaster_;
  };

  // Runs the AndroidKeymaster operation |member| with |request| as input in the
  // background |backend_thread_|.
  //
  // The given |callback| is run with the output of the keymaster operation,
  // after being posted to the original task runner that called this method.
  template <typename KmMember, typename KmRequest, typename KmResponse>
  void RunKeymasterRequest(
      const base::Location& location,
      KmMember member,
      std::unique_ptr<KmRequest> request,
      base::OnceCallback<void(std::unique_ptr<KmResponse>)> callback);

  // Encapsulates all fields that should only be accessed from the background
  // |backend_thread_|.
  //
  // This must be created before |backend_thread_| and outlive it. There are no
  // other thread safety requirements during construction or destruction.
  Backend backend_;

  // Thread where Keymaster operations are executed.
  //
  // |base::Thread| guarantees that destruction waits until any leftover tasks
  // are executed, so this must be destroyed before |backend_| is.
  base::Thread backend_thread_;
};

}  // namespace keymaster
}  // namespace arc

#endif  // ARC_KEYMASTER_KEYMASTER_SERVER_H_
