#include "AppleCSPKeys.h"
#include "AppleCSPUtils.h"
CSPKeyInfoProvider *SymmetricKeyInfoProvider::provider(
const CssmKey &cssmKey,
AppleCSPSession &session)
{
if(cssmKey.blobType() != CSSM_KEYBLOB_RAW) {
errorLog0("KeyInfoProvider deals only with RAW keys!\n");
CssmError::throwMe(CSSMERR_CSP_INTERNAL_ERROR);
}
if(cssmKey.keyClass() != CSSM_KEYCLASS_SESSION_KEY) {
return NULL;
}
return new SymmetricKeyInfoProvider(cssmKey, session);
}
SymmetricKeyInfoProvider::SymmetricKeyInfoProvider(
const CssmKey &cssmKey,
AppleCSPSession &session) :
CSPKeyInfoProvider(cssmKey, session)
{
}
void SymmetricKeyInfoProvider::CssmKeyToBinary(
CssmKey *paramKey, CSSM_KEYATTR_FLAGS &attrFlags, BinaryKey **binKey)
{
CASSERT(mKey.keyClass() == CSSM_KEYCLASS_SESSION_KEY);
SymmetricBinaryKey *symBinKey = new SymmetricBinaryKey(
mKey.KeyHeader.LogicalKeySizeInBits);
copyCssmData(mKey,
symBinKey->mKeyData,
symBinKey->mAllocator);
*binKey = symBinKey;
}
void SymmetricKeyInfoProvider::QueryKeySizeInBits(
CSSM_KEY_SIZE &keySize)
{
keySize.LogicalKeySizeInBits = keySize.EffectiveKeySizeInBits =
(uint32)(mKey.length() * 8);
}
bool SymmetricKeyInfoProvider::getHashableBlob(
Allocator &allocator,
CssmData &blob) {
assert(mKey.blobType() == CSSM_KEYBLOB_RAW);
const CssmData &keyBlob = CssmData::overlay(mKey.KeyData);
copyCssmData(keyBlob, blob, allocator);
return true;
}