X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/72a12576750f52947eb043106ba5c12c0d07decf..b1ab9ed8d0e0f1c3b66d7daa8fd5564444c56195:/libsecurity_apple_csp/lib/AppleCSPKeys.cpp diff --git a/libsecurity_apple_csp/lib/AppleCSPKeys.cpp b/libsecurity_apple_csp/lib/AppleCSPKeys.cpp new file mode 100644 index 00000000..d1143ad1 --- /dev/null +++ b/libsecurity_apple_csp/lib/AppleCSPKeys.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2003 Apple Computer, Inc. All Rights Reserved. + * + * The contents of this file constitute Original Code as defined in and are + * subject to the Apple Public Source License Version 1.2 (the 'License'). + * You may not use this file except in compliance with the License. Please + * obtain a copy of the License at http://www.apple.com/publicsource and + * read it before using this file. + * + * This 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. + */ +/* + * AppleCSPKeys.cpp - Key support + */ + +#include "AppleCSPKeys.h" +#include "AppleCSPUtils.h" +/* + * CSPKeyInfoProvider for symmetric keys. + */ +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) { + /* that's all we need to know */ + return NULL; + } + return new SymmetricKeyInfoProvider(cssmKey, session); +} + +SymmetricKeyInfoProvider::SymmetricKeyInfoProvider( + const CssmKey &cssmKey, + AppleCSPSession &session) : + CSPKeyInfoProvider(cssmKey, session) +{ +} + +/* cook up a Binary key */ +void SymmetricKeyInfoProvider::CssmKeyToBinary( + CssmKey *paramKey, // ignored + CSSM_KEYATTR_FLAGS &attrFlags, // IN/OUT + BinaryKey **binKey) +{ + CASSERT(mKey.keyClass() == CSSM_KEYCLASS_SESSION_KEY); + SymmetricBinaryKey *symBinKey = new SymmetricBinaryKey( + mKey.KeyHeader.LogicalKeySizeInBits); + copyCssmData(mKey, + symBinKey->mKeyData, + symBinKey->mAllocator); + *binKey = symBinKey; +} + +/* obtain key size in bits */ +void SymmetricKeyInfoProvider::QueryKeySizeInBits( + CSSM_KEY_SIZE &keySize) +{ + /* FIXME - do we ever need to calculate RC2 effective size here? */ + keySize.LogicalKeySizeInBits = keySize.EffectiveKeySizeInBits = + mKey.length() * 8; +} + +/* + * Obtain blob suitable for hashing in CSSM_APPLECSP_KEYDIGEST + * passthrough. + */ +bool SymmetricKeyInfoProvider::getHashableBlob( + Allocator &allocator, + CssmData &blob) // blob to hash goes here +{ + /* + * This is trivial: the raw key is already in the "proper" format. + */ + assert(mKey.blobType() == CSSM_KEYBLOB_RAW); + const CssmData &keyBlob = CssmData::overlay(mKey.KeyData); + copyCssmData(keyBlob, blob, allocator); + return true; +} +