]> git.saurik.com Git - apple/security.git/blob - OSX/libsecurity_apple_csp/lib/AppleCSPKeys.cpp
Security-59754.80.3.tar.gz
[apple/security.git] / OSX / libsecurity_apple_csp / lib / AppleCSPKeys.cpp
1 /*
2 * Copyright (c) 2003,2011-2012,2014 Apple Inc. All Rights Reserved.
3 *
4 * The contents of this file constitute Original Code as defined in and are
5 * subject to the Apple Public Source License Version 1.2 (the 'License').
6 * You may not use this file except in compliance with the License. Please
7 * obtain a copy of the License at http://www.apple.com/publicsource and
8 * read it before using this file.
9 *
10 * This Original Code and all software distributed under the License are
11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
12 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
13 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
14 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
15 * Please see the License for the specific language governing rights and
16 * limitations under the License.
17 */
18 /*
19 * AppleCSPKeys.cpp - Key support
20 */
21
22 #include "AppleCSPKeys.h"
23 #include "AppleCSPUtils.h"
24 /*
25 * CSPKeyInfoProvider for symmetric keys.
26 */
27 CSPKeyInfoProvider *SymmetricKeyInfoProvider::provider(
28 const CssmKey &cssmKey,
29 AppleCSPSession &session)
30 {
31 if(cssmKey.blobType() != CSSM_KEYBLOB_RAW) {
32 errorLog0("KeyInfoProvider deals only with RAW keys!\n");
33 CssmError::throwMe(CSSMERR_CSP_INTERNAL_ERROR);
34 }
35 if(cssmKey.keyClass() != CSSM_KEYCLASS_SESSION_KEY) {
36 /* that's all we need to know */
37 return NULL;
38 }
39 return new SymmetricKeyInfoProvider(cssmKey, session);
40 }
41
42 SymmetricKeyInfoProvider::SymmetricKeyInfoProvider(
43 const CssmKey &cssmKey,
44 AppleCSPSession &session) :
45 CSPKeyInfoProvider(cssmKey, session)
46 {
47 }
48
49 /* cook up a Binary key */
50 void SymmetricKeyInfoProvider::CssmKeyToBinary(
51 CssmKey *paramKey, // ignored
52 CSSM_KEYATTR_FLAGS &attrFlags, // IN/OUT
53 BinaryKey **binKey)
54 {
55 CASSERT(mKey.keyClass() == CSSM_KEYCLASS_SESSION_KEY);
56 SymmetricBinaryKey *symBinKey = new SymmetricBinaryKey(
57 mKey.KeyHeader.LogicalKeySizeInBits);
58 copyCssmData(mKey,
59 symBinKey->mKeyData,
60 symBinKey->mAllocator);
61 *binKey = symBinKey;
62 }
63
64 /* obtain key size in bits */
65 void SymmetricKeyInfoProvider::QueryKeySizeInBits(
66 CSSM_KEY_SIZE &keySize)
67 {
68 /* FIXME - do we ever need to calculate RC2 effective size here? */
69 keySize.LogicalKeySizeInBits = keySize.EffectiveKeySizeInBits =
70 (uint32)(mKey.length() * 8);
71 }
72
73 /*
74 * Obtain blob suitable for hashing in CSSM_APPLECSP_KEYDIGEST
75 * passthrough.
76 */
77 bool SymmetricKeyInfoProvider::getHashableBlob(
78 Allocator &allocator,
79 CssmData &blob) // blob to hash goes here
80 {
81 /*
82 * This is trivial: the raw key is already in the "proper" format.
83 */
84 assert(mKey.blobType() == CSSM_KEYBLOB_RAW);
85 const CssmData &keyBlob = CssmData::overlay(mKey.KeyData);
86 copyCssmData(keyBlob, blob, allocator);
87 return true;
88 }
89