// Copyright (c) 2012 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_SLOT_MANAGER_H_
#define CHAPS_SLOT_MANAGER_H_

#include <map>
#include <string>

#include <brillo/secure_blob.h>

#include "pkcs11/cryptoki.h"

namespace chaps {

typedef std::map<CK_MECHANISM_TYPE, CK_MECHANISM_INFO> MechanismMap;
typedef std::map<CK_MECHANISM_TYPE, CK_MECHANISM_INFO>::const_iterator
    MechanismMapIterator;

class Session;

// SlotManager is the interface for a slot manager. This component is
// responsible for maintaining a list of slots and slot information as well as
// maintaining a list of open sessions for each slot. See PKCS #11 v2.20: 6.3
// and 11.5 for details on PKCS #11 slots. See sections 6.7 and 11.6 for details
// on PKCS #11 sessions.
class SlotManager {
 public:
  virtual ~SlotManager() {}
  // Returns the total number of slots available. A slot is identified by zero-
  // based offset. I.e. If there are two slots, 0 and 1 are valid 'slot_id'
  // values. This method should be used to verify slot IDs are valid before
  // using the ID with other methods. This method is not const because
  // implementations may refresh internal slot information when this is called.
  virtual int GetSlotCount() = 0;
  virtual bool IsTokenAccessible(const brillo::SecureBlob& isolate_credential,
                                 int slot_id) const = 0;
  virtual bool IsTokenPresent(const brillo::SecureBlob& isolate_credential,
                              int slot_id) const = 0;
  virtual void GetSlotInfo(const brillo::SecureBlob& isolate_credential,
                           int slot_id, CK_SLOT_INFO* slot_info) const = 0;
  virtual void GetTokenInfo(const brillo::SecureBlob& isolate_credential,
                            int slot_id, CK_TOKEN_INFO* token_info) const = 0;
  virtual const MechanismMap* GetMechanismInfo(
      const brillo::SecureBlob& isolate_credential, int slot_id) const = 0;
  // Opens a new session with the token in the given slot. A token must be
  // present. A new and unique session identifier is returned.
  virtual int OpenSession(
      const brillo::SecureBlob& isolate_credential,
      int slot_id,
      bool is_read_only) = 0;
  virtual bool CloseSession(const brillo::SecureBlob& isolate_credential,
      int session_id) = 0;
  virtual void CloseAllSessions(const brillo::SecureBlob& isolate_credential,
      int slot_id) = 0;
  virtual bool GetSession(const brillo::SecureBlob& isolate_credential,
      int session_id, Session** session) const = 0;
};

}  // namespace chaps

#endif  // CHAPS_SLOT_MANAGER_H_
