// 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.

#include "chaps/object_policy_key.h"

#include <base/macros.h>
#include <base/stl_util.h>

namespace chaps {

// Read policy list as follows:
//   {attribute, sensitive, read-only {create, copy, modify}, required}
// sensitive - True if attribute cannot be read.
// read-only.create - True if attribute cannot be set with C_CreateObject.
// read-only.copy - True if attribute cannot be set with C_CopyObject.
// read-only.modify - True if attribute cannot be set with C_SetAttributeValue.
// required - True if attribute is required for a valid object.
static const AttributePolicy kKeyPolicies[] = {
    {CKA_KEY_TYPE, false, {false, false, true}, true},
    {CKA_LOCAL, false, {true, true, true}, false},
    {CKA_KEY_GEN_MECHANISM, false, {true, true, true}, false},
    {CKA_ALLOWED_MECHANISMS, false, {false, false, true}, false},
};

ObjectPolicyKey::ObjectPolicyKey() {
  AddPolicies(kKeyPolicies, base::size(kKeyPolicies));
}

ObjectPolicyKey::~ObjectPolicyKey() {}

void ObjectPolicyKey::SetDefaultAttributes() {
  ObjectPolicyCommon::SetDefaultAttributes();
  CK_ATTRIBUTE_TYPE empty[] = {CKA_ID, CKA_START_DATE, CKA_END_DATE};
  for (size_t i = 0; i < base::size(empty); ++i) {
    if (!object_->IsAttributePresent(empty[i]))
      object_->SetAttributeString(empty[i], "");
  }
  if (!object_->IsAttributePresent(CKA_DERIVE))
    object_->SetAttributeBool(CKA_DERIVE, false);
  if (!object_->IsAttributePresent(CKA_LOCAL))
    object_->SetAttributeBool(CKA_LOCAL, false);
  if (!object_->IsAttributePresent(CKA_KEY_GEN_MECHANISM))
    object_->SetAttributeInt(CKA_KEY_GEN_MECHANISM,
                             static_cast<int>(CK_UNAVAILABLE_INFORMATION));
}

}  // namespace chaps
