// Copyright (c) 2011 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 CHAPS_CHAPS_ADAPTOR_H
#define CHAPS_CHAPS_ADAPTOR_H

#include <base/basictypes.h>

#include "chaps/dbus_adaptors/chaps_interface.h"

namespace base {
  class Lock;
}

namespace chaps {

class ChapsInterface;
class TokenManagerInterface;

// The ChapsAdaptor class implements the dbus-c++ generated adaptor interface
// and redirects IPC calls to a ChapsInterface instance.  All dbus-c++ specific
// logic, error handling, etc. is implemented here.  Specifically, the
// ChapsInterface instance need not be aware of dbus-c++ or IPC.  This class
// exists because we don't want to couple dbus-c++ with the Chaps service
// implementation.
class ChapsAdaptor : public org::chromium::Chaps_adaptor,
                     public DBus::ObjectAdaptor {
public:
  ChapsAdaptor(base::Lock* lock,
               ChapsInterface* service,
               TokenManagerInterface* token_manager);
  virtual ~ChapsAdaptor();

  // These methods are generated by the ChromeOS dbus library.
  virtual void OpenIsolate(const std::vector<uint8_t>& isolate_credential_in,
                           std::vector<uint8_t>& isolate_credential_out,
                           bool& new_isolate_created,
                           bool& result,
                           ::DBus::Error& error);
  virtual void CloseIsolate(const std::vector<uint8_t>& isolate_credential,
                            ::DBus::Error& error);
  virtual void LoadToken(const std::vector<uint8_t>& isolate_credential,
                         const std::string& path,
                         const std::vector<uint8_t>& auth_data,
                         const std::string& label,
                         uint64_t& slot_id,
                         bool& result,
                         ::DBus::Error& error);
  virtual void UnloadToken(const std::vector<uint8_t>& isolate_credential,
                           const std::string& path,
                           ::DBus::Error& error);
  virtual void ChangeTokenAuthData(const std::string& path,
                                   const std::vector<uint8_t>& old_auth_data,
                                   const std::vector<uint8_t>& new_auth_data,
                                   ::DBus::Error& error);
  virtual void GetTokenPath(const std::vector<uint8_t>& isolate_credential,
                            const uint64_t& slot_id,
                            std::string& path,
                            bool& result,
                            ::DBus::Error& error);
  virtual void SetLogLevel(const int32_t& level, ::DBus::Error& error);
  virtual void GetSlotList(const std::vector<uint8_t>& isolate_credential,
                           const bool& token_present,
                           std::vector<uint64_t>& slot_list,
                           uint32_t& result,
                           ::DBus::Error& error);
  virtual void GetSlotInfo(const std::vector<uint8_t>& isolate_credential,
                           const uint64_t& slot_id,
                           std::vector<uint8_t>& slot_description,
                           std::vector<uint8_t>& manufacturer_id,
                           uint64_t& flags,
                           uint8_t& hardware_version_major,
                           uint8_t& hardware_version_minor,
                           uint8_t& firmware_version_major,
                           uint8_t& firmware_version_minor,
                           uint32_t& result,
                           ::DBus::Error& error);
  virtual void GetTokenInfo(const std::vector<uint8_t>& isolate_credential,
                            const uint64_t& slot_id,
                            std::vector<uint8_t>& label,
                            std::vector<uint8_t>& manufacturer_id,
                            std::vector<uint8_t>& model,
                            std::vector<uint8_t>& serial_number,
                            uint64_t& flags,
                            uint64_t& max_session_count,
                            uint64_t& session_count,
                            uint64_t& max_session_count_rw,
                            uint64_t& session_count_rw,
                            uint64_t& max_pin_len,
                            uint64_t& min_pin_len,
                            uint64_t& total_public_memory,
                            uint64_t& free_public_memory,
                            uint64_t& total_private_memory,
                            uint64_t& free_private_memory,
                            uint8_t& hardware_version_major,
                            uint8_t& hardware_version_minor,
                            uint8_t& firmware_version_major,
                            uint8_t& firmware_version_minor,
                            uint32_t& result,
                            ::DBus::Error& error);
  virtual void GetMechanismList(const std::vector<uint8_t>& isolate_credential,
                                const uint64_t& slot_id,
                                std::vector<uint64_t>& mechanism_list,
                                uint32_t& result,
                                ::DBus::Error& error);
  virtual void GetMechanismInfo(const std::vector<uint8_t>& isolate_credential,
                                const uint64_t& slot_id,
                                const uint64_t& mechanism_type,
                                uint64_t& min_key_size,
                                uint64_t& max_key_size,
                                uint64_t& flags,
                                uint32_t& result,
                                ::DBus::Error& error);
  virtual uint32_t InitToken(const std::vector<uint8_t>& isolate_credential,
                             const uint64_t& slot_id,
                             const bool& use_null_pin,
                             const std::string& optional_so_pin,
                             const std::vector<uint8_t>& new_token_label,
                             ::DBus::Error& error);
  virtual uint32_t InitPIN(const std::vector<uint8_t>& isolate_credential,
                           const uint64_t& session_id,
                           const bool& use_null_pin,
                           const std::string& optional_user_pin,
                           ::DBus::Error& error);
  virtual uint32_t SetPIN(const std::vector<uint8_t>& isolate_credential,
                          const uint64_t& session_id,
                          const bool& use_null_old_pin,
                          const std::string& optional_old_pin,
                          const bool& use_null_new_pin,
                          const std::string& optional_new_pin,
                          ::DBus::Error& error);
  virtual void OpenSession(const std::vector<uint8_t>& isolate_credential,
                           const uint64_t& slot_id, const uint64_t& flags,
                           uint64_t& session_id, uint32_t& result,
                           ::DBus::Error& error);
  virtual uint32_t CloseSession(const std::vector<uint8_t>& isolate_credential,
                                const uint64_t& session_id,
                                ::DBus::Error& error);
  virtual uint32_t CloseAllSessions(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& slot_id,
      ::DBus::Error& error);
  virtual void GetSessionInfo(const std::vector<uint8_t>& isolate_credential,
                              const uint64_t& session_id,
                              uint64_t& slot_id,
                              uint64_t& state,
                              uint64_t& flags,
                              uint64_t& device_error,
                              uint32_t& result,
                              ::DBus::Error& error);
  virtual void GetOperationState(const std::vector<uint8_t>& isolate_credential,
                                 const uint64_t& session_id,
                                 std::vector<uint8_t>& operation_state,
                                 uint32_t& result,
                                 ::DBus::Error& error);
  virtual uint32_t SetOperationState(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const std::vector<uint8_t>& operation_state,
      const uint64_t& encryption_key_handle,
      const uint64_t& authentication_key_handle,
      ::DBus::Error& error);
  virtual uint32_t Login(const std::vector<uint8_t>& isolate_credential,
                         const uint64_t& session_id,
                         const uint64_t& user_type,
                         const bool& use_null_pin,
                         const std::string& optional_pin,
                         ::DBus::Error& error);
  virtual uint32_t Logout(const std::vector<uint8_t>& isolate_credential,
                          const uint64_t& session_id,
                          ::DBus::Error& error);
  virtual void CreateObject(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const std::vector<uint8_t>& attributes,
      uint64_t& new_object_handle,
      uint32_t& result,
      ::DBus::Error& error);
  virtual void CopyObject(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const uint64_t& object_handle,
      const std::vector<uint8_t>& attributes,
      uint64_t& new_object_handle,
      uint32_t& result,
      ::DBus::Error& error);
  virtual uint32_t DestroyObject(const std::vector<uint8_t>& isolate_credential,
                                 const uint64_t& session_id,
                                 const uint64_t& object_handle,
                                 ::DBus::Error& error);
  virtual void GetObjectSize(const std::vector<uint8_t>& isolate_credential,
                             const uint64_t& session_id,
                             const uint64_t& object_handle,
                             uint64_t& object_size,
                             uint32_t& result,
                             ::DBus::Error& error);
  virtual void GetAttributeValue(const std::vector<uint8_t>& isolate_credential,
                                 const uint64_t& session_id,
                                 const uint64_t& object_handle,
                                 const std::vector<uint8_t>& attributes_in,
                                 std::vector<uint8_t>& attributes_out,
                                 uint32_t& result,
                                 ::DBus::Error& error);
  virtual uint32_t SetAttributeValue(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const uint64_t& object_handle,
      const std::vector<uint8_t>& attributes,
      ::DBus::Error& error);
  virtual uint32_t FindObjectsInit(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const std::vector<uint8_t>& attributes,
      ::DBus::Error& error);
  virtual void FindObjects(const std::vector<uint8_t>& isolate_credential,
                           const uint64_t& session_id,
                           const uint64_t& max_object_count,
                           std::vector<uint64_t>& object_list,
                           uint32_t& result,
                           ::DBus::Error& error);
  virtual uint32_t FindObjectsFinal(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      ::DBus::Error& error);
  virtual uint32_t EncryptInit(const std::vector<uint8_t>& isolate_credential,
                               const uint64_t& session_id,
                               const uint64_t& mechanism_type,
                               const std::vector<uint8_t>& mechanism_parameter,
                               const uint64_t& key_handle,
                               ::DBus::Error& error);
  virtual void Encrypt(const std::vector<uint8_t>& isolate_credential,
                       const uint64_t& session_id,
                       const std::vector<uint8_t>& data_in,
                       const uint64_t& max_out_length,
                       uint64_t& actual_out_length,
                       std::vector<uint8_t>& data_out,
                       uint32_t& result,
                       ::DBus::Error& error);
  virtual void EncryptUpdate(const std::vector<uint8_t>& isolate_credential,
                             const uint64_t& session_id,
                             const std::vector<uint8_t>& data_in,
                             const uint64_t& max_out_length,
                             uint64_t& actual_out_length,
                             std::vector<uint8_t>& data_out,
                             uint32_t& result,
                             ::DBus::Error& error);
  virtual void EncryptFinal(const std::vector<uint8_t>& isolate_credential,
                            const uint64_t& session_id,
                            const uint64_t& max_out_length,
                            uint64_t& actual_out_length,
                            std::vector<uint8_t>& data_out,
                            uint32_t& result,
                            ::DBus::Error& error);
  virtual uint32_t DecryptInit(const std::vector<uint8_t>& isolate_credential,
                               const uint64_t& session_id,
                               const uint64_t& mechanism_type,
                               const std::vector<uint8_t>& mechanism_parameter,
                               const uint64_t& key_handle,
                               ::DBus::Error& error);
  virtual void Decrypt(const std::vector<uint8_t>& isolate_credential,
                       const uint64_t& session_id,
                       const std::vector<uint8_t>& data_in,
                       const uint64_t& max_out_length,
                       uint64_t& actual_out_length,
                       std::vector<uint8_t>& data_out,
                       uint32_t& result,
                       ::DBus::Error& error);
  virtual void DecryptUpdate(const std::vector<uint8_t>& isolate_credential,
                             const uint64_t& session_id,
                             const std::vector<uint8_t>& data_in,
                             const uint64_t& max_out_length,
                             uint64_t& actual_out_length,
                             std::vector<uint8_t>& data_out,
                             uint32_t& result,
                             ::DBus::Error& error);
  virtual void DecryptFinal(const std::vector<uint8_t>& isolate_credential,
                            const uint64_t& session_id,
                            const uint64_t& max_out_length,
                            uint64_t& actual_out_length,
                            std::vector<uint8_t>& data_out,
                            uint32_t& result,
                            ::DBus::Error& error);
  virtual uint32_t DigestInit(const std::vector<uint8_t>& isolate_credential,
                              const uint64_t& session_id,
                              const uint64_t& mechanism_type,
                              const std::vector<uint8_t>& mechanism_parameter,
                              ::DBus::Error& error);
  virtual void Digest(const std::vector<uint8_t>& isolate_credential,
                      const uint64_t& session_id,
                      const std::vector<uint8_t>& data_in,
                      const uint64_t& max_out_length,
                      uint64_t& actual_out_length,
                      std::vector<uint8_t>& digest,
                      uint32_t& result,
                      ::DBus::Error& error);
  virtual uint32_t DigestUpdate(const std::vector<uint8_t>& isolate_credential,
                                const uint64_t& session_id,
                                const std::vector<uint8_t>& data_in,
                                ::DBus::Error& error);
  virtual uint32_t DigestKey(const std::vector<uint8_t>& isolate_credential,
                             const uint64_t& session_id,
                             const uint64_t& key_handle,
                             ::DBus::Error& error);
  virtual void DigestFinal(const std::vector<uint8_t>& isolate_credential,
                           const uint64_t& session_id,
                           const uint64_t& max_out_length,
                           uint64_t& actual_out_length,
                           std::vector<uint8_t>& digest,
                           uint32_t& result,
                           ::DBus::Error& error);
  virtual uint32_t SignInit(const std::vector<uint8_t>& isolate_credential,
                            const uint64_t& session_id,
                            const uint64_t& mechanism_type,
                            const std::vector<uint8_t>& mechanism_parameter,
                            const uint64_t& key_handle,
                            ::DBus::Error& error);
  virtual void Sign(const std::vector<uint8_t>& isolate_credential,
                    const uint64_t& session_id,
                    const std::vector<uint8_t>& data,
                    const uint64_t& max_out_length,
                    uint64_t& actual_out_length,
                    std::vector<uint8_t>& signature,
                    uint32_t& result,
                    ::DBus::Error& error);
  virtual uint32_t SignUpdate(const std::vector<uint8_t>& isolate_credential,
                              const uint64_t& session_id,
                              const std::vector<uint8_t>& data_part,
                              ::DBus::Error& error);
  virtual void SignFinal(const std::vector<uint8_t>& isolate_credential,
                         const uint64_t& session_id,
                         const uint64_t& max_out_length,
                         uint64_t& actual_out_length,
                         std::vector<uint8_t>& signature,
                         uint32_t& result,
                         ::DBus::Error& error);
  virtual uint32_t SignRecoverInit(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const uint64_t& mechanism_type,
      const std::vector<uint8_t>& mechanism_parameter,
      const uint64_t& key_handle,
      ::DBus::Error& error);
  virtual void SignRecover(const std::vector<uint8_t>& isolate_credential,
                           const uint64_t& session_id,
                           const std::vector<uint8_t>& data,
                           const uint64_t& max_out_length,
                           uint64_t& actual_out_length,
                           std::vector<uint8_t>& signature,
                           uint32_t& result,
                           ::DBus::Error& error);
  virtual uint32_t VerifyInit(const std::vector<uint8_t>& isolate_credential,
                              const uint64_t& session_id,
                              const uint64_t& mechanism_type,
                              const std::vector<uint8_t>& mechanism_parameter,
                              const uint64_t& key_handle,
                              ::DBus::Error& error);
  virtual uint32_t Verify(const std::vector<uint8_t>& isolate_credential,
                          const uint64_t& session_id,
                          const std::vector<uint8_t>& data,
                          const std::vector<uint8_t>& signature,
                          ::DBus::Error& error);
  virtual uint32_t VerifyUpdate(const std::vector<uint8_t>& isolate_credential,
                                const uint64_t& session_id,
                                const std::vector<uint8_t>& data_part,
                                ::DBus::Error& error);
  virtual uint32_t VerifyFinal(const std::vector<uint8_t>& isolate_credential,
                               const uint64_t& session_id,
                               const std::vector<uint8_t>& signature,
                               ::DBus::Error& error);
  virtual uint32_t VerifyRecoverInit(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const uint64_t& mechanism_type,
      const std::vector<uint8_t>& mechanism_parameter,
      const uint64_t& key_handle,
      ::DBus::Error& error);
  virtual void VerifyRecover(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const std::vector<uint8_t>& signature,
      const uint64_t& max_out_length,
      uint64_t& actual_out_length,
      std::vector<uint8_t>& data,
      uint32_t& result,
      ::DBus::Error& error);
  virtual void DigestEncryptUpdate(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const std::vector<uint8_t>& data_in,
      const uint64_t& max_out_length,
      uint64_t& actual_out_length,
      std::vector<uint8_t>& data_out,
      uint32_t& result,
      ::DBus::Error& error);
  virtual void DecryptDigestUpdate(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const std::vector<uint8_t>& data_in,
      const uint64_t& max_out_length,
      uint64_t& actual_out_length,
      std::vector<uint8_t>& data_out,
      uint32_t& result,
      ::DBus::Error& error);
  virtual void SignEncryptUpdate(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const std::vector<uint8_t>& data_in,
      const uint64_t& max_out_length,
      uint64_t& actual_out_length,
      std::vector<uint8_t>& data_out,
      uint32_t& result,
      ::DBus::Error& error);
  virtual void DecryptVerifyUpdate(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const std::vector<uint8_t>& data_in,
      const uint64_t& max_out_length,
      uint64_t& actual_out_length,
      std::vector<uint8_t>& data_out,
      uint32_t& result,
      ::DBus::Error& error);
  virtual void GenerateKey(const std::vector<uint8_t>& isolate_credential,
                           const uint64_t& session_id,
                           const uint64_t& mechanism_type,
                           const std::vector<uint8_t>& mechanism_parameter,
                           const std::vector<uint8_t>& attributes,
                           uint64_t& key_handle,
                           uint32_t& result,
                           ::DBus::Error& error);
  virtual void GenerateKeyPair(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const uint64_t& mechanism_type,
      const std::vector<uint8_t>& mechanism_parameter,
      const std::vector<uint8_t>& public_attributes,
      const std::vector<uint8_t>& private_attributes,
      uint64_t& public_key_handle,
      uint64_t& private_key_handle,
      uint32_t& result,
      ::DBus::Error& error);
  virtual void WrapKey(const std::vector<uint8_t>& isolate_credential,
                       const uint64_t& session_id,
                       const uint64_t& mechanism_type,
                       const std::vector<uint8_t>& mechanism_parameter,
                       const uint64_t& wrapping_key_handle,
                       const uint64_t& key_handle,
                       const uint64_t& max_out_length,
                       uint64_t& actual_out_length,
                       std::vector<uint8_t>& wrapped_key,
                       uint32_t& result,
                       ::DBus::Error& error);
  virtual void UnwrapKey(const std::vector<uint8_t>& isolate_credential,
                         const uint64_t& session_id,
                         const uint64_t& mechanism_type,
                         const std::vector<uint8_t>& mechanism_parameter,
                         const uint64_t& wrapping_key_handle,
                         const std::vector<uint8_t>& wrapped_key,
                         const std::vector<uint8_t>& attributes,
                         uint64_t& key_handle,
                         uint32_t& result,
                         ::DBus::Error& error);
  virtual void DeriveKey(const std::vector<uint8_t>& isolate_credential,
                         const uint64_t& session_id,
                         const uint64_t& mechanism_type,
                         const std::vector<uint8_t>& mechanism_parameter,
                         const uint64_t& base_key_handle,
                         const std::vector<uint8_t>& attributes,
                         uint64_t& key_handle,
                         uint32_t& result,
                         ::DBus::Error& error);
  virtual uint32_t SeedRandom(const std::vector<uint8_t>& isolate_credential,
                              const uint64_t& session_id,
                              const std::vector<uint8_t>& seed,
                              ::DBus::Error& error);
  virtual void GenerateRandom(const std::vector<uint8_t>& isolate_credential,
                              const uint64_t& session_id,
                              const uint64_t& num_bytes,
                              std::vector<uint8_t>& random_data,
                              uint32_t& result,
                              ::DBus::Error& error);

  // These methods are generated by the Linux dbus library.
  virtual void OpenIsolate(const std::vector<uint8_t>& isolate_credential_in,
                           std::vector<uint8_t>& isolate_credential_out,
                           bool& new_isolate_created,
                           bool& result);
  virtual void CloseIsolate(const std::vector<uint8_t>& isolate_credential);
  virtual void LoadToken(const std::vector<uint8_t>& isolate_credential,
                         const std::string& path,
                         const std::vector<uint8_t>& auth_data,
                         const std::string& label,
                         uint64_t& slot_id,
                         bool& result);
  virtual void UnloadToken(const std::vector<uint8_t>& isolate_credential,
                           const std::string& path);
  virtual void ChangeTokenAuthData(const std::string& path,
                                   const std::vector<uint8_t>& old_auth_data,
                                   const std::vector<uint8_t>& new_auth_data);
  virtual void GetTokenPath(const std::vector<uint8_t>& isolate_credential,
                            const uint64_t& slot_id,
                            std::string& path,
                            bool& result);
  virtual void SetLogLevel(const int32_t& level);
  virtual void GetSlotList(const std::vector<uint8_t>& isolate_credential,
                           const bool& token_present,
                           std::vector<uint64_t>& slot_list,
                           uint32_t& result);
  virtual void GetSlotInfo(const std::vector<uint8_t>& isolate_credential,
                           const uint64_t& slot_id,
                           std::vector<uint8_t>& slot_description,
                           std::vector<uint8_t>& manufacturer_id,
                           uint64_t& flags,
                           uint8_t& hardware_version_major,
                           uint8_t& hardware_version_minor,
                           uint8_t& firmware_version_major,
                           uint8_t& firmware_version_minor,
                           uint32_t& result);
  virtual void GetTokenInfo(const std::vector<uint8_t>& isolate_credential,
                            const uint64_t& slot_id,
                            std::vector<uint8_t>& label,
                            std::vector<uint8_t>& manufacturer_id,
                            std::vector<uint8_t>& model,
                            std::vector<uint8_t>& serial_number,
                            uint64_t& flags,
                            uint64_t& max_session_count,
                            uint64_t& session_count,
                            uint64_t& max_session_count_rw,
                            uint64_t& session_count_rw,
                            uint64_t& max_pin_len,
                            uint64_t& min_pin_len,
                            uint64_t& total_public_memory,
                            uint64_t& free_public_memory,
                            uint64_t& total_private_memory,
                            uint64_t& free_private_memory,
                            uint8_t& hardware_version_major,
                            uint8_t& hardware_version_minor,
                            uint8_t& firmware_version_major,
                            uint8_t& firmware_version_minor,
                            uint32_t& result);
  virtual void GetMechanismList(const std::vector<uint8_t>& isolate_credential,
                                const uint64_t& slot_id,
                                std::vector<uint64_t>& mechanism_list,
                                uint32_t& result);
  virtual void GetMechanismInfo(const std::vector<uint8_t>& isolate_credential,
                                const uint64_t& slot_id,
                                const uint64_t& mechanism_type,
                                uint64_t& min_key_size,
                                uint64_t& max_key_size,
                                uint64_t& flags,
                                uint32_t& result);
  virtual uint32_t InitToken(const std::vector<uint8_t>& isolate_credential,
                             const uint64_t& slot_id,
                             const bool& use_null_pin,
                             const std::string& optional_so_pin,
                             const std::vector<uint8_t>& new_token_label);
  virtual uint32_t InitPIN(const std::vector<uint8_t>& isolate_credential,
                           const uint64_t& session_id,
                           const bool& use_null_pin,
                           const std::string& optional_user_pin);
  virtual uint32_t SetPIN(const std::vector<uint8_t>& isolate_credential,
                          const uint64_t& session_id,
                          const bool& use_null_old_pin,
                          const std::string& optional_old_pin,
                          const bool& use_null_new_pin,
                          const std::string& optional_new_pin);
  virtual void OpenSession(const std::vector<uint8_t>& isolate_credential,
                           const uint64_t& slot_id, const uint64_t& flags,
                           uint64_t& session_id, uint32_t& result);
  virtual uint32_t CloseSession(const std::vector<uint8_t>& isolate_credential,
                                const uint64_t& session_id);
  virtual uint32_t CloseAllSessions(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& slot_id);
  virtual void GetSessionInfo(const std::vector<uint8_t>& isolate_credential,
                              const uint64_t& session_id,
                              uint64_t& slot_id,
                              uint64_t& state,
                              uint64_t& flags,
                              uint64_t& device_error,
                              uint32_t& result);
  virtual void GetOperationState(const std::vector<uint8_t>& isolate_credential,
                                 const uint64_t& session_id,
                                 std::vector<uint8_t>& operation_state,
                                 uint32_t& result);
  virtual uint32_t SetOperationState(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const std::vector<uint8_t>& operation_state,
      const uint64_t& encryption_key_handle,
      const uint64_t& authentication_key_handle);
  virtual uint32_t Login(const std::vector<uint8_t>& isolate_credential,
                         const uint64_t& session_id,
                         const uint64_t& user_type,
                         const bool& use_null_pin,
                         const std::string& optional_pin);
  virtual uint32_t Logout(const std::vector<uint8_t>& isolate_credential,
                          const uint64_t& session_id);
  virtual void CreateObject(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const std::vector<uint8_t>& attributes,
      uint64_t& new_object_handle,
      uint32_t& result);
  virtual void CopyObject(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const uint64_t& object_handle,
      const std::vector<uint8_t>& attributes,
      uint64_t& new_object_handle,
      uint32_t& result);
  virtual uint32_t DestroyObject(const std::vector<uint8_t>& isolate_credential,
                                 const uint64_t& session_id,
                                 const uint64_t& object_handle);
  virtual void GetObjectSize(const std::vector<uint8_t>& isolate_credential,
                             const uint64_t& session_id,
                             const uint64_t& object_handle,
                             uint64_t& object_size,
                             uint32_t& result);
  virtual void GetAttributeValue(const std::vector<uint8_t>& isolate_credential,
                                 const uint64_t& session_id,
                                 const uint64_t& object_handle,
                                 const std::vector<uint8_t>& attributes_in,
                                 std::vector<uint8_t>& attributes_out,
                                 uint32_t& result);
  virtual uint32_t SetAttributeValue(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const uint64_t& object_handle,
      const std::vector<uint8_t>& attributes);
  virtual uint32_t FindObjectsInit(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const std::vector<uint8_t>& attributes);
  virtual void FindObjects(const std::vector<uint8_t>& isolate_credential,
                           const uint64_t& session_id,
                           const uint64_t& max_object_count,
                           std::vector<uint64_t>& object_list,
                           uint32_t& result);
  virtual uint32_t FindObjectsFinal(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id);
  virtual uint32_t EncryptInit(const std::vector<uint8_t>& isolate_credential,
                               const uint64_t& session_id,
                               const uint64_t& mechanism_type,
                               const std::vector<uint8_t>& mechanism_parameter,
                               const uint64_t& key_handle);
  virtual void Encrypt(const std::vector<uint8_t>& isolate_credential,
                       const uint64_t& session_id,
                       const std::vector<uint8_t>& data_in,
                       const uint64_t& max_out_length,
                       uint64_t& actual_out_length,
                       std::vector<uint8_t>& data_out,
                       uint32_t& result);
  virtual void EncryptUpdate(const std::vector<uint8_t>& isolate_credential,
                             const uint64_t& session_id,
                             const std::vector<uint8_t>& data_in,
                             const uint64_t& max_out_length,
                             uint64_t& actual_out_length,
                             std::vector<uint8_t>& data_out,
                             uint32_t& result);
  virtual void EncryptFinal(const std::vector<uint8_t>& isolate_credential,
                            const uint64_t& session_id,
                            const uint64_t& max_out_length,
                            uint64_t& actual_out_length,
                            std::vector<uint8_t>& data_out,
                            uint32_t& result);
  virtual uint32_t DecryptInit(const std::vector<uint8_t>& isolate_credential,
                               const uint64_t& session_id,
                               const uint64_t& mechanism_type,
                               const std::vector<uint8_t>& mechanism_parameter,
                               const uint64_t& key_handle);
  virtual void Decrypt(const std::vector<uint8_t>& isolate_credential,
                       const uint64_t& session_id,
                       const std::vector<uint8_t>& data_in,
                       const uint64_t& max_out_length,
                       uint64_t& actual_out_length,
                       std::vector<uint8_t>& data_out,
                       uint32_t& result);
  virtual void DecryptUpdate(const std::vector<uint8_t>& isolate_credential,
                             const uint64_t& session_id,
                             const std::vector<uint8_t>& data_in,
                             const uint64_t& max_out_length,
                             uint64_t& actual_out_length,
                             std::vector<uint8_t>& data_out,
                             uint32_t& result);
  virtual void DecryptFinal(const std::vector<uint8_t>& isolate_credential,
                            const uint64_t& session_id,
                            const uint64_t& max_out_length,
                            uint64_t& actual_out_length,
                            std::vector<uint8_t>& data_out,
                            uint32_t& result);
  virtual uint32_t DigestInit(const std::vector<uint8_t>& isolate_credential,
                              const uint64_t& session_id,
                              const uint64_t& mechanism_type,
                              const std::vector<uint8_t>& mechanism_parameter);
  virtual void Digest(const std::vector<uint8_t>& isolate_credential,
                      const uint64_t& session_id,
                      const std::vector<uint8_t>& data_in,
                      const uint64_t& max_out_length,
                      uint64_t& actual_out_length,
                      std::vector<uint8_t>& digest,
                      uint32_t& result);
  virtual uint32_t DigestUpdate(const std::vector<uint8_t>& isolate_credential,
                                const uint64_t& session_id,
                                const std::vector<uint8_t>& data_in);
  virtual uint32_t DigestKey(const std::vector<uint8_t>& isolate_credential,
                             const uint64_t& session_id,
                             const uint64_t& key_handle);
  virtual void DigestFinal(const std::vector<uint8_t>& isolate_credential,
                           const uint64_t& session_id,
                           const uint64_t& max_out_length,
                           uint64_t& actual_out_length,
                           std::vector<uint8_t>& digest,
                           uint32_t& result);
  virtual uint32_t SignInit(const std::vector<uint8_t>& isolate_credential,
                            const uint64_t& session_id,
                            const uint64_t& mechanism_type,
                            const std::vector<uint8_t>& mechanism_parameter,
                            const uint64_t& key_handle);
  virtual void Sign(const std::vector<uint8_t>& isolate_credential,
                    const uint64_t& session_id,
                    const std::vector<uint8_t>& data,
                    const uint64_t& max_out_length,
                    uint64_t& actual_out_length,
                    std::vector<uint8_t>& signature,
                    uint32_t& result);
  virtual uint32_t SignUpdate(const std::vector<uint8_t>& isolate_credential,
                              const uint64_t& session_id,
                              const std::vector<uint8_t>& data_part);
  virtual void SignFinal(const std::vector<uint8_t>& isolate_credential,
                         const uint64_t& session_id,
                         const uint64_t& max_out_length,
                         uint64_t& actual_out_length,
                         std::vector<uint8_t>& signature,
                         uint32_t& result);
  virtual uint32_t SignRecoverInit(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const uint64_t& mechanism_type,
      const std::vector<uint8_t>& mechanism_parameter,
      const uint64_t& key_handle);
  virtual void SignRecover(const std::vector<uint8_t>& isolate_credential,
                           const uint64_t& session_id,
                           const std::vector<uint8_t>& data,
                           const uint64_t& max_out_length,
                           uint64_t& actual_out_length,
                           std::vector<uint8_t>& signature,
                           uint32_t& result);
  virtual uint32_t VerifyInit(const std::vector<uint8_t>& isolate_credential,
                              const uint64_t& session_id,
                              const uint64_t& mechanism_type,
                              const std::vector<uint8_t>& mechanism_parameter,
                              const uint64_t& key_handle);
  virtual uint32_t Verify(const std::vector<uint8_t>& isolate_credential,
                          const uint64_t& session_id,
                          const std::vector<uint8_t>& data,
                          const std::vector<uint8_t>& signature);
  virtual uint32_t VerifyUpdate(const std::vector<uint8_t>& isolate_credential,
                                const uint64_t& session_id,
                                const std::vector<uint8_t>& data_part);
  virtual uint32_t VerifyFinal(const std::vector<uint8_t>& isolate_credential,
                               const uint64_t& session_id,
                               const std::vector<uint8_t>& signature);
  virtual uint32_t VerifyRecoverInit(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const uint64_t& mechanism_type,
      const std::vector<uint8_t>& mechanism_parameter,
      const uint64_t& key_handle);
  virtual void VerifyRecover(const std::vector<uint8_t>& isolate_credential,
                             const uint64_t& session_id,
                             const std::vector<uint8_t>& signature,
                             const uint64_t& max_out_length,
                             uint64_t& actual_out_length,
                             std::vector<uint8_t>& data,
                             uint32_t& result);
  virtual void DigestEncryptUpdate(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const std::vector<uint8_t>& data_in,
      const uint64_t& max_out_length,
      uint64_t& actual_out_length,
      std::vector<uint8_t>& data_out,
      uint32_t& result);
  virtual void DecryptDigestUpdate(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const std::vector<uint8_t>& data_in,
      const uint64_t& max_out_length,
      uint64_t& actual_out_length,
      std::vector<uint8_t>& data_out,
      uint32_t& result);
  virtual void SignEncryptUpdate(const std::vector<uint8_t>& isolate_credential,
                                 const uint64_t& session_id,
                                 const std::vector<uint8_t>& data_in,
                                 const uint64_t& max_out_length,
                                 uint64_t& actual_out_length,
                                 std::vector<uint8_t>& data_out,
                                 uint32_t& result);
  virtual void DecryptVerifyUpdate(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const std::vector<uint8_t>& data_in,
      const uint64_t& max_out_length,
      uint64_t& actual_out_length,
      std::vector<uint8_t>& data_out,
      uint32_t& result);
  virtual void GenerateKey(const std::vector<uint8_t>& isolate_credential,
                           const uint64_t& session_id,
                           const uint64_t& mechanism_type,
                           const std::vector<uint8_t>& mechanism_parameter,
                           const std::vector<uint8_t>& attributes,
                           uint64_t& key_handle,
                           uint32_t& result);
  virtual void GenerateKeyPair(
      const std::vector<uint8_t>& isolate_credential,
      const uint64_t& session_id,
      const uint64_t& mechanism_type,
      const std::vector<uint8_t>& mechanism_parameter,
      const std::vector<uint8_t>& public_attributes,
      const std::vector<uint8_t>& private_attributes,
      uint64_t& public_key_handle,
      uint64_t& private_key_handle,
      uint32_t& result);
  virtual void WrapKey(const std::vector<uint8_t>& isolate_credential,
                       const uint64_t& session_id,
                       const uint64_t& mechanism_type,
                       const std::vector<uint8_t>& mechanism_parameter,
                       const uint64_t& wrapping_key_handle,
                       const uint64_t& key_handle,
                       const uint64_t& max_out_length,
                       uint64_t& actual_out_length,
                       std::vector<uint8_t>& wrapped_key,
                       uint32_t& result);
  virtual void UnwrapKey(const std::vector<uint8_t>& isolate_credential,
                         const uint64_t& session_id,
                         const uint64_t& mechanism_type,
                         const std::vector<uint8_t>& mechanism_parameter,
                         const uint64_t& wrapping_key_handle,
                         const std::vector<uint8_t>& wrapped_key,
                         const std::vector<uint8_t>& attributes,
                         uint64_t& key_handle,
                         uint32_t& result);
  virtual void DeriveKey(const std::vector<uint8_t>& isolate_credential,
                         const uint64_t& session_id,
                         const uint64_t& mechanism_type,
                         const std::vector<uint8_t>& mechanism_parameter,
                         const uint64_t& base_key_handle,
                         const std::vector<uint8_t>& attributes,
                         uint64_t& key_handle,
                         uint32_t& result);
  virtual uint32_t SeedRandom(const std::vector<uint8_t>& isolate_credential,
                              const uint64_t& session_id,
                              const std::vector<uint8_t>& seed);
  virtual void GenerateRandom(const std::vector<uint8_t>& isolate_credential,
                              const uint64_t& session_id,
                              const uint64_t& num_bytes,
                              std::vector<uint8_t>& random_data,
                              uint32_t& result);

private:
  base::Lock* lock_;
  ChapsInterface* service_;
  TokenManagerInterface* token_manager_;

  DISALLOW_COPY_AND_ASSIGN(ChapsAdaptor);
};

}  // namespace
#endif  // CHAPS_CHAPS_ADAPTOR_H
