#ifndef _H_CSSMKEY
#define _H_CSSMKEY
#include <security_utilities/utilities.h>
#include <security_cdsa_utilities/cssmpods.h>
#include <security_cdsa_utilities/cssmerrors.h>
#include <Security/cssm.h>
namespace Security {
class CssmKey : public PodWrapper<CssmKey, CSSM_KEY> {
public:
CssmKey() { clearPod(); KeyHeader.HeaderVersion = CSSM_KEYHEADER_VERSION; }
CssmKey(const CSSM_KEY &key);
CssmKey(const CSSM_DATA &keyData);
CssmKey(uint32 length, void *data);
public:
class Header : public PodWrapper<Header, CSSM_KEYHEADER> {
public:
CSSM_KEYBLOB_TYPE blobType() const { return BlobType; }
void blobType(CSSM_KEYBLOB_TYPE blobType) { BlobType = blobType; }
CSSM_KEYBLOB_FORMAT blobFormat() const { return Format; }
void blobFormat(CSSM_KEYBLOB_FORMAT blobFormat) { Format = blobFormat; }
CSSM_KEYCLASS keyClass() const { return KeyClass; }
void keyClass(CSSM_KEYCLASS keyClass) { KeyClass = keyClass; }
CSSM_KEY_TYPE algorithm() const { return AlgorithmId; }
void algorithm(CSSM_KEY_TYPE algorithm) { AlgorithmId = algorithm; }
CSSM_KEY_TYPE wrapAlgorithm() const { return WrapAlgorithmId; }
void wrapAlgorithm(CSSM_KEY_TYPE wrapAlgorithm) { WrapAlgorithmId = wrapAlgorithm; }
CSSM_ENCRYPT_MODE wrapMode() const { return WrapMode; }
void wrapMode(CSSM_ENCRYPT_MODE mode) { WrapMode = mode; }
bool isWrapped() const { return WrapAlgorithmId != CSSM_ALGID_NONE; }
const Guid &cspGuid() const { return Guid::overlay(CspId); }
void cspGuid(const Guid &guid) { Guid::overlay(CspId) = guid; }
uint32 attributes() const { return KeyAttr; }
bool attribute(uint32 attr) const { return KeyAttr & attr; }
void setAttribute(uint32 attr) { KeyAttr |= attr; }
void clearAttribute(uint32 attr) { KeyAttr &= ~attr; }
uint32 usage() const { return KeyUsage; }
bool useFor(uint32 u) const { return KeyUsage & u; }
void usage(uint32 u) { KeyUsage |= u; }
void clearUsage(uint32 u) { KeyUsage &= ~u; }
};
Header &header() { return Header::overlay(KeyHeader); }
const Header &header() const { return Header::overlay(KeyHeader); }
CSSM_KEYBLOB_TYPE blobType() const { return header().blobType(); }
void blobType(CSSM_KEYBLOB_TYPE blobType) { header().blobType(blobType); }
CSSM_KEYBLOB_FORMAT blobFormat() const { return header().blobFormat(); }
void blobFormat(CSSM_KEYBLOB_FORMAT blobFormat) { header().blobFormat(blobFormat); }
CSSM_KEYCLASS keyClass() const { return header().keyClass(); }
void keyClass(CSSM_KEYCLASS keyClass) { header().keyClass(keyClass); }
CSSM_KEY_TYPE algorithm() const { return header().algorithm(); }
void algorithm(CSSM_KEY_TYPE algorithm) { header().algorithm(algorithm); }
CSSM_KEY_TYPE wrapAlgorithm() const { return header().wrapAlgorithm(); }
void wrapAlgorithm(CSSM_KEY_TYPE wrapAlgorithm) { header().wrapAlgorithm(wrapAlgorithm); }
CSSM_ENCRYPT_MODE wrapMode() const { return header().wrapMode(); }
void wrapMode(CSSM_ENCRYPT_MODE mode) { header().wrapMode(mode); }
bool isWrapped() const { return header().isWrapped(); }
const Guid &cspGuid() const { return header().cspGuid(); }
uint32 attributes() const { return header().attributes(); }
bool attribute(uint32 a) const { return header().attribute(a); }
void setAttribute(uint32 attr) { header().setAttribute(attr); }
void clearAttribute(uint32 attr) { header().clearAttribute(attr); }
uint32 usage() const { return header().usage(); }
bool useFor(uint32 u) const { return header().useFor(u); }
void usage(uint32 u) { header().usage(u); }
void clearUsage(uint32 u) { header().clearUsage(u); }
public:
size_t length() const { return KeyData.Length; }
void *data() const { return KeyData.Data; }
operator void * () const { return data(); }
CssmData &keyData() { return CssmData::overlay(KeyData); }
const CssmData &keyData() const { return CssmData::overlay(KeyData); }
operator CssmData & () { return keyData(); }
operator const CssmData & () const { return keyData(); }
operator bool () const { return KeyData.Data != NULL; }
void operator = (const CssmData &data) { KeyData = data; }
};
typedef CssmKey CssmWrappedKey;
}
#endif //_H_CSSMUTILITIES