blob: 4c5b84d31b2caf9b38070499f31d364f3ef6e63a [file] [log] [blame]
// 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_IMPL_H_
#define CHAPS_OBJECT_IMPL_H_
#include "chaps/object.h"
#include <memory>
#include <set>
#include <string>
#include <base/macros.h>
#include "pkcs11/cryptoki.h"
namespace chaps {
class ChapsFactory;
class ObjectPolicy;
class ObjectImpl : public Object {
public:
explicit ObjectImpl(ChapsFactory* factory);
ObjectImpl(const ObjectImpl&) = delete;
ObjectImpl& operator=(const ObjectImpl&) = delete;
~ObjectImpl() override;
ObjectStage GetStage() const override;
int GetSize() const override;
CK_OBJECT_CLASS GetObjectClass() const override;
bool IsTokenObject() const override;
bool IsModifiable() const override;
bool IsPrivate() const override;
CK_RV FinalizeNewObject() override;
CK_RV FinalizeCopyObject() override;
CK_RV Copy(const Object* original) override;
CK_RV GetAttributes(CK_ATTRIBUTE_PTR attributes,
int num_attributes) const override;
CK_RV SetAttributes(const CK_ATTRIBUTE_PTR attributes,
int num_attributes) override;
bool IsAttributePresent(CK_ATTRIBUTE_TYPE type) const override;
bool GetAttributeBool(CK_ATTRIBUTE_TYPE type,
bool default_value) const override;
void SetAttributeBool(CK_ATTRIBUTE_TYPE type, bool value) override;
CK_ULONG GetAttributeInt(CK_ATTRIBUTE_TYPE type,
CK_ULONG default_value) const override;
void SetAttributeInt(CK_ATTRIBUTE_TYPE type, CK_ULONG value) override;
std::string GetAttributeString(CK_ATTRIBUTE_TYPE type) const override;
void SetAttributeString(CK_ATTRIBUTE_TYPE type,
const std::string& value) override;
void RemoveAttribute(CK_ATTRIBUTE_TYPE type) override;
const AttributeMap* GetAttributeMap() const override;
bool OnLoad() override;
int handle() const override { return handle_; }
void set_handle(int handle) override { handle_ = handle; }
int store_id() const override { return store_id_; }
void set_store_id(int store_id) override { store_id_ = store_id; }
private:
ChapsFactory* factory_;
ObjectStage stage_;
AttributeMap attributes_;
// Tracks attributes which have been set by the user.
std::set<CK_ATTRIBUTE_TYPE> external_attributes_;
std::unique_ptr<ObjectPolicy> policy_;
int handle_;
int store_id_;
bool SetPolicyByClass();
};
} // namespace chaps
#endif // CHAPS_OBJECT_IMPL_H_