// 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_OBJECT_H_
#define CHAPS_OBJECT_H_

#include <map>
#include <string>

#include "pkcs11/cryptoki.h"

namespace chaps {

typedef std::map<CK_ATTRIBUTE_TYPE, std::string> AttributeMap;

// Object policies can differ depending on the stage an object is at in its
// lifecycle.
enum ObjectStage {
  kCreate,  // The object is being created.
  kCopy,    // The object is being created as a copy of another object.
  kModify,  // The object already exists.
  kNumObjectStages
};

// Object is the interface for a PKCS #11 object.  This component manages all
// object attributes and provides query and modify access to attributes
// according to the current object policy.
class Object {
 public:
  virtual ~Object() {}
  virtual ObjectStage GetStage() const = 0;
  // Returns a general indicator of the object's size. This size will be at
  // least as large as the combined size of the object's attribute values.
  virtual int GetSize() const = 0;
  // Returns the object class. If the CKA_CLASS attribute does not exist, the
  // return value is undefined.
  virtual CK_OBJECT_CLASS GetObjectClass() const = 0;
  // Returns the value of the CKA_TOKEN attribute.
  virtual bool IsTokenObject() const = 0;
  // Returns the value of the CKA_MODIFIABLE attribute.
  virtual bool IsModifiable() const = 0;
  // Returns the value of the CKA_PRIVATE attribute.
  virtual bool IsPrivate() const = 0;
  // Performs final tasks required when creating a new object:
  // - Assigns a policy.
  // - Validates that attributes set by the user are allowed to be set.
  // - Validates attributes for consistency and completeness.
  // - Set default values for attributes, if necessary.
  // - Move the object into the kModify stage.
  virtual CK_RV FinalizeNewObject() = 0;
  // Copies attributes and policy from another object.
  virtual CK_RV Copy(const Object* original) = 0;
  // Provides PKCS #11 attribute values according to the semantics described in
  // PKCS #11 v2.20: 11.7 - C_GetAttributeValue (p. 133). If a policy exists it
  // will be enforced.
  virtual CK_RV GetAttributes(CK_ATTRIBUTE_PTR attributes,
                              int num_attributes) const = 0;
  // Sets object attributes from a list of PKCS #11 attribute values according
  // to the semantics described in PKCS #11 v2.20: 11.7 - C_SetAttributeValue
  // (p. 135). If a policy exists it will be enforced.
  virtual CK_RV SetAttributes(const CK_ATTRIBUTE_PTR attributes,
                              int num_attributes) = 0;
  // Returns true if the a value for the attribute exists.
  virtual bool IsAttributePresent(CK_ATTRIBUTE_TYPE type) const = 0;

  // Note:
  // Policy will not be enforced for the following methods. These methods are
  // strictly for use within the PKCS #11 boundary. This allows Chaps code to
  // view and modify attributes that cannot be viewed or modified from outside
  // the PKCS #11 boundary. For example, setting CKA_LOCAL to true when a key is
  // generated.

  // Queries a boolean attribute. If the attribute does not exist or is not
  // valid, 'default_value' is returned.
  virtual bool GetAttributeBool(CK_ATTRIBUTE_TYPE type,
                                bool default_value) const = 0;
  // Sets a boolean attribute. Policies will not be enforced (e.g. CKA_LOCAL can
  // be set using this method even though a user cannot set this attribute).
  virtual void SetAttributeBool(CK_ATTRIBUTE_TYPE type, bool value) = 0;
  // Queries an integral attribute. If the attribute does not exist or is not
  // valid, 'default_value' is returned.
  virtual int GetAttributeInt(CK_ATTRIBUTE_TYPE type,
                              int default_value) const = 0;
  // Sets an integral attribute. Policies will not be enforced.
  virtual void SetAttributeInt(CK_ATTRIBUTE_TYPE type, int value) = 0;
  // Queries an attribute value as a string.
  virtual std::string GetAttributeString(CK_ATTRIBUTE_TYPE type) const = 0;
  // Sets an attribute as a string. Policies will not be enforced.
  virtual void SetAttributeString(CK_ATTRIBUTE_TYPE type,
                                  const std::string& value) = 0;
  // Removes an attribute. This is not the same as setting an attribute value to
  // the empty string.
  virtual void RemoveAttribute(CK_ATTRIBUTE_TYPE type) = 0;
  // Provides a read-only map of all existing attributes.
  virtual const AttributeMap* GetAttributeMap() const = 0;
  // Get / set handle as seen by PKCS #11 clients.
  virtual int handle() const = 0;
  virtual void set_handle(int handle) = 0;
  // Get / set an identifier as designated by a store.
  virtual int store_id() const = 0;
  virtual void set_store_id(int store_id) = 0;
};

}  // namespace chaps

#endif  // CHAPS_OBJECT_H_
