// 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_PROXY_H
#define CHAPS_CHAPS_PROXY_H

#include <base/scoped_ptr.h>

#include "chaps/chaps_interface.h"
#include "chaps/chaps_proxy_generated.h"

namespace chaps {

// ChapsProxyImpl is the default implementation of the chaps proxy interface.
//
// All calls are forwarded to a dbus-c++ generated proxy object. All exceptions
// thrown by the dbus-c++ library are caught and handled in this class.
//
// The Connect() method must be called successfully before calling any other
// methods.
class ChapsProxyImpl : public ChapsInterface {
public:
  ChapsProxyImpl();
  virtual ~ChapsProxyImpl();
  bool Init();
  // ChapsInterface methods.
  virtual uint32_t GetSlotList(bool token_present,
                               std::vector<uint32_t>* slot_list);
  virtual uint32_t GetSlotInfo(uint32_t slot_id,
                               std::string* slot_description,
                               std::string* manufacturer_id,
                               uint32_t* flags,
                               uint8_t* hardware_version_major,
                               uint8_t* hardware_version_minor,
                               uint8_t* firmware_version_major,
                               uint8_t* firmware_version_minor);
  virtual uint32_t GetTokenInfo(uint32_t slot_id,
                                std::string* label,
                                std::string* manufacturer_id,
                                std::string* model,
                                std::string* serial_number,
                                uint32_t* flags,
                                uint32_t* max_session_count,
                                uint32_t* session_count,
                                uint32_t* max_session_count_rw,
                                uint32_t* session_count_rw,
                                uint32_t* max_pin_len,
                                uint32_t* min_pin_len,
                                uint32_t* total_public_memory,
                                uint32_t* free_public_memory,
                                uint32_t* total_private_memory,
                                uint32_t* free_private_memory,
                                uint8_t* hardware_version_major,
                                uint8_t* hardware_version_minor,
                                uint8_t* firmware_version_major,
                                uint8_t* firmware_version_minor);
  virtual uint32_t GetMechanismList(uint32_t slot_id,
                                    std::vector<uint32_t>* mechanism_list);
  virtual uint32_t GetMechanismInfo(uint32_t slot_id,
                                    uint32_t mechanism_type,
                                    uint32_t* min_key_size,
                                    uint32_t* max_key_size,
                                    uint32_t* flags);
  virtual uint32_t InitToken(uint32_t slot_id, const std::string* so_pin,
                             const std::string& label);
  virtual uint32_t InitPIN(uint32_t session_id, const std::string* pin);
  virtual uint32_t SetPIN(uint32_t session_id, const std::string* old_pin,
                          const std::string* new_pin);
  virtual uint32_t OpenSession(uint32_t slot_id, uint32_t flags,
                               uint32_t* session_id);
  virtual uint32_t CloseSession(uint32_t session_id);
  virtual uint32_t CloseAllSessions(uint32_t slot_id);
  virtual uint32_t GetSessionInfo(uint32_t session_id,
                                  uint32_t* slot_id,
                                  uint32_t* state,
                                  uint32_t* flags,
                                  uint32_t* device_error);
  virtual uint32_t GetOperationState(uint32_t session_id,
                                     std::vector<uint8_t>* operation_state);
  virtual uint32_t SetOperationState(
      uint32_t session_id,
      const std::vector<uint8_t>& operation_state,
      uint32_t encryption_key_handle,
      uint32_t authentication_key_handle);
  virtual uint32_t Login(uint32_t session_id,
                         uint32_t user_type,
                         const std::string* pin);
  virtual uint32_t Logout(uint32_t session_id);
  virtual uint32_t CreateObject(uint32_t session_id,
                                const std::vector<uint8_t>& attributes,
                                uint32_t* new_object_handle);
  virtual uint32_t CopyObject(uint32_t session_id,
                              uint32_t object_handle,
                              const std::vector<uint8_t>& attributes,
                              uint32_t* new_object_handle);
  virtual uint32_t DestroyObject(uint32_t session_id,
                                 uint32_t object_handle);
  virtual uint32_t GetObjectSize(uint32_t session_id,
                                 uint32_t object_handle,
                                 uint32_t* object_size);
  virtual uint32_t GetAttributeValue(uint32_t session_id,
                                     uint32_t object_handle,
                                     const std::vector<uint8_t>& attributes_in,
                                     std::vector<uint8_t>* attributes_out);
  virtual uint32_t SetAttributeValue(uint32_t session_id,
                                     uint32_t object_handle,
                                     const std::vector<uint8_t>& attributes);
  virtual uint32_t FindObjectsInit(uint32_t session_id,
                                   const std::vector<uint8_t>& attributes);
  virtual uint32_t FindObjects(uint32_t session_id,
                               uint32_t max_object_count,
                               std::vector<uint32_t>* object_list);
  virtual uint32_t FindObjectsFinal(uint32_t session_id);
  virtual uint32_t EncryptInit(uint32_t session_id,
                               uint32_t mechanism_type,
                               const std::vector<uint8_t>& mechanism_parameter,
                               uint32_t key_handle);
  virtual uint32_t Encrypt(uint32_t session_id,
                           const std::vector<uint8_t>& data_in,
                           uint32_t max_out_length,
                           uint32_t* actual_out_length,
                           std::vector<uint8_t>* data_out);
  virtual uint32_t EncryptUpdate(uint32_t session_id,
                                 const std::vector<uint8_t>& data_in,
                                 uint32_t max_out_length,
                                 uint32_t* actual_out_length,
                                 std::vector<uint8_t>* data_out);
  virtual uint32_t EncryptFinal(uint32_t session_id,
                                uint32_t max_out_length,
                                uint32_t* actual_out_length,
                                std::vector<uint8_t>* data_out);
  virtual uint32_t DecryptInit(uint32_t session_id,
                               uint32_t mechanism_type,
                               const std::vector<uint8_t>& mechanism_parameter,
                               uint32_t key_handle);
  virtual uint32_t Decrypt(uint32_t session_id,
                           const std::vector<uint8_t>& data_in,
                           uint32_t max_out_length,
                           uint32_t* actual_out_length,
                           std::vector<uint8_t>* data_out);
  virtual uint32_t DecryptUpdate(uint32_t session_id,
                                 const std::vector<uint8_t>& data_in,
                                 uint32_t max_out_length,
                                 uint32_t* actual_out_length,
                                 std::vector<uint8_t>* data_out);
  virtual uint32_t DecryptFinal(uint32_t session_id,
                                uint32_t max_out_length,
                                uint32_t* actual_out_length,
                                std::vector<uint8_t>* data_out);
  virtual uint32_t DigestInit(uint32_t session_id,
                              uint32_t mechanism_type,
                              const std::vector<uint8_t>& mechanism_parameter);
  virtual uint32_t Digest(uint32_t session_id,
                          const std::vector<uint8_t>& data_in,
                          uint32_t max_out_length,
                          uint32_t* actual_out_length,
                          std::vector<uint8_t>* digest);
  virtual uint32_t DigestUpdate(uint32_t session_id,
                                const std::vector<uint8_t>& data_in);
  virtual uint32_t DigestKey(uint32_t session_id,
                             uint32_t key_handle);
  virtual uint32_t DigestFinal(uint32_t session_id,
                               uint32_t max_out_length,
                               uint32_t* actual_out_length,
                               std::vector<uint8_t>* digest);
  virtual uint32_t SignInit(uint32_t session_id,
                            uint32_t mechanism_type,
                            const std::vector<uint8_t>& mechanism_parameter,
                            uint32_t key_handle);
  virtual uint32_t Sign(uint32_t session_id,
                        const std::vector<uint8_t>& data,
                        uint32_t max_out_length,
                        uint32_t* actual_out_length,
                        std::vector<uint8_t>* signature);
  virtual uint32_t SignUpdate(uint32_t session_id,
                              const std::vector<uint8_t>& data_part);
  virtual uint32_t SignFinal(uint32_t session_id,
                             uint32_t max_out_length,
                             uint32_t* actual_out_length,
                             std::vector<uint8_t>* signature);
  virtual uint32_t SignRecoverInit(
      uint32_t session_id,
      uint32_t mechanism_type,
      const std::vector<uint8_t>& mechanism_parameter,
      uint32_t key_handle);
  virtual uint32_t SignRecover(uint32_t session_id,
                               const std::vector<uint8_t>& data,
                               uint32_t max_out_length,
                               uint32_t* actual_out_length,
                               std::vector<uint8_t>* signature);
  virtual uint32_t VerifyInit(uint32_t session_id,
                              uint32_t mechanism_type,
                              const std::vector<uint8_t>& mechanism_parameter,
                              uint32_t key_handle);
  virtual uint32_t Verify(uint32_t session_id,
                          const std::vector<uint8_t>& data,
                          const std::vector<uint8_t>& signature);
  virtual uint32_t VerifyUpdate(uint32_t session_id,
                                const std::vector<uint8_t>& data_part);
  virtual uint32_t VerifyFinal(uint32_t session_id,
                               const std::vector<uint8_t>& signature);
  virtual uint32_t VerifyRecoverInit(
      uint32_t session_id,
      uint32_t mechanism_type,
      const std::vector<uint8_t>& mechanism_parameter,
      uint32_t key_handle);
  virtual uint32_t VerifyRecover(uint32_t session_id,
                                 const std::vector<uint8_t>& signature,
                                 uint32_t max_out_length,
                                 uint32_t* actual_out_length,
                                 std::vector<uint8_t>* data);
  virtual uint32_t DigestEncryptUpdate(uint32_t session_id,
                                       const std::vector<uint8_t>& data_in,
                                       uint32_t max_out_length,
                                       uint32_t* actual_out_length,
                                       std::vector<uint8_t>* data_out);
  virtual uint32_t DecryptDigestUpdate(uint32_t session_id,
                                       const std::vector<uint8_t>& data_in,
                                       uint32_t max_out_length,
                                       uint32_t* actual_out_length,
                                       std::vector<uint8_t>* data_out);
  virtual uint32_t SignEncryptUpdate(uint32_t session_id,
                                     const std::vector<uint8_t>& data_in,
                                     uint32_t max_out_length,
                                     uint32_t* actual_out_length,
                                     std::vector<uint8_t>* data_out);
  virtual uint32_t DecryptVerifyUpdate(uint32_t session_id,
                                       const std::vector<uint8_t>& data_in,
                                       uint32_t max_out_length,
                                       uint32_t* actual_out_length,
                                       std::vector<uint8_t>* data_out);
  virtual uint32_t GenerateKey(uint32_t session_id,
                               uint32_t mechanism_type,
                               const std::vector<uint8_t>& mechanism_parameter,
                               const std::vector<uint8_t>& attributes,
                               uint32_t* key_handle);
  virtual uint32_t GenerateKeyPair(
      uint32_t session_id,
      uint32_t mechanism_type,
      const std::vector<uint8_t>& mechanism_parameter,
      const std::vector<uint8_t>& public_attributes,
      const std::vector<uint8_t>& private_attributes,
      uint32_t* public_key_handle,
      uint32_t* private_key_handle);
  virtual uint32_t WrapKey(uint32_t session_id,
                           uint32_t mechanism_type,
                           const std::vector<uint8_t>& mechanism_parameter,
                           uint32_t wrapping_key_handle,
                           uint32_t key_handle,
                           uint32_t max_out_length,
                           uint32_t* actual_out_length,
                           std::vector<uint8_t>* wrapped_key);
  virtual uint32_t UnwrapKey(uint32_t session_id,
                             uint32_t mechanism_type,
                             const std::vector<uint8_t>& mechanism_parameter,
                             uint32_t wrapping_key_handle,
                             const std::vector<uint8_t>& wrapped_key,
                             const std::vector<uint8_t>& attributes,
                             uint32_t* key_handle);
  virtual uint32_t DeriveKey(uint32_t session_id,
                             uint32_t mechanism_type,
                             const std::vector<uint8_t>& mechanism_parameter,
                             uint32_t base_key_handle,
                             const std::vector<uint8_t>& attributes,
                             uint32_t* key_handle);
  virtual uint32_t SeedRandom(uint32_t session_id,
                              const std::vector<uint8_t>& seed);
  virtual uint32_t GenerateRandom(uint32_t session_id,
                                  uint32_t num_bytes,
                                  std::vector<uint8_t>* random_data);


private:
  // This class provides the link to the dbus-c++ generated proxy.
  class Proxy : public org::chromium::Chaps_proxy,
                public DBus::ObjectProxy {
  public:
    Proxy(DBus::Connection &connection,
          const char* path,
          const char* service) : ObjectProxy(connection, path, service) {}
    virtual ~Proxy() {}

  private:
    DISALLOW_COPY_AND_ASSIGN(Proxy);
  };

  scoped_ptr<Proxy> proxy_;

  DISALLOW_COPY_AND_ASSIGN(ChapsProxyImpl);
};

}  // namespace

#endif  // CHAPS_CHAPS_PROXY_H
