X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/5dd5f9ec28f304ca377c42fd7f711d6cf12b90e1..5c19dc3ae3bd8e40a9c028b0deddd50ff337692c:/OSX/libsecurity_cdsa_utilities/lib/cssmkey.h diff --git a/OSX/libsecurity_cdsa_utilities/lib/cssmkey.h b/OSX/libsecurity_cdsa_utilities/lib/cssmkey.h new file mode 100644 index 00000000..74a7f918 --- /dev/null +++ b/OSX/libsecurity_cdsa_utilities/lib/cssmkey.h @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2000-2004,2006,2011,2014 Apple Inc. All Rights Reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +// +// PODWrapper for CssmKey and related types +// +#ifndef _H_CSSMKEY +#define _H_CSSMKEY + +#include +#include +#include +#include + + +namespace Security { + + +// +// User-friendlier CSSM_KEY objects +// +class CssmKey : public PodWrapper { +public: + CssmKey() { clearPod(); KeyHeader.HeaderVersion = CSSM_KEYHEADER_VERSION; } + // all of the following constructors take over ownership of the key data + CssmKey(const CSSM_KEY &key); + CssmKey(const CSSM_DATA &keyData); + CssmKey(uint32 length, void *data); + +public: + class Header : public PodWrapper { + public: + // access to components of the key header + 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; } + + }; + + // access to the key header + 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: + // access to the key data + 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; } +}; + + +// +// Wrapped keys are currently identically structured to normal keys. +// But perhaps in the future... +// +typedef CssmKey CssmWrappedKey; + + +} // end namespace Security + + +#endif //_H_CSSMUTILITIES