2 * Copyright (c) 2000-2002 Apple Computer, Inc. All Rights Reserved.
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 obtain
7 * a copy of the License at http://www.apple.com/publicsource and read it before
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 EXPRESS
12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
15 * specific language governing rights and limitations under the License.
20 // cspclient - client interface to CSSM CSPs and their operations
22 #include <Security/cspclient.h>
24 using namespace CssmClient
;
28 // Manage CSP attachments
30 CSPImpl::CSPImpl(const Guid
&guid
) : AttachmentImpl(guid
, CSSM_SERVICE_CSP
)
34 CSPImpl::CSPImpl(const Module
&module) : AttachmentImpl(module, CSSM_SERVICE_CSP
)
44 // Delete a key explicitly
46 void CSPImpl::freeKey(CssmKey
&key
, const AccessCredentials
*cred
, bool permanent
)
48 check(CSSM_FreeKey(handle(), cred
, &key
, permanent
));
53 // Manage generic context objects
55 CssmClient::Context::Context(const CSP
&csp
, CSSM_ALGORITHMS alg
)
56 : ObjectImpl(csp
), mAlgorithm(alg
), mStaged(false)
60 CssmClient::Context::~Context()
68 void CssmClient::Context::init()
70 CssmError::throwMe(CSSM_ERRCODE_FUNCTION_NOT_IMPLEMENTED
);
73 void CssmClient::Context::deactivate()
78 check(CSSM_DeleteContext(mHandle
));
83 void CssmClient::Context::algorithm(CSSM_ALGORITHMS alg
)
86 abort(); //@@@ can't (currently?) change algorithm with active context
92 // Query context operation output sizes.
94 uint32
CssmClient::Context::getOutputSize(uint32 inputSize
, bool encrypt
= true)
96 CSSM_QUERY_SIZE_DATA data
;
97 data
.SizeInputBlock
= inputSize
;
98 getOutputSize(data
, 1, encrypt
);
99 return data
.SizeOutputBlock
;
102 void CssmClient::Context::getOutputSize(CSSM_QUERY_SIZE_DATA
&sizes
, uint32 count
, bool encrypt
= true)
104 check(CSSM_QuerySize(handle(), encrypt
, count
, &sizes
));
109 // The override() method of Context is an expert feature. It replaces the entire
110 // context with a context object provided. It is up to the caller to keep this context
111 // consistent with the purpose of the Context subclass he is (mis)using.
112 // This feature is currently used by the SecurityServer.
114 void CssmClient::Context::override(const Security::Context
&ctx
)
117 // make a valid context object (it doesn't matter what kind - keep it cheap)
118 check(CSSM_CSP_CreateDigestContext(attachment()->handle(), CSSM_ALGID_NONE
, &mHandle
));
120 // now replace everything with the context data provided
121 check(CSSM_SetContext(mHandle
, &ctx
));
122 mActive
= true; // now active
127 // Manage PassThrough contexts
131 // Invoke passThrough
134 PassThrough::operator() (uint32 passThroughId
, const void *inData
, void **outData
)
136 check(CSSM_CSP_PassThrough(handle(), passThroughId
, inData
, outData
));
139 void PassThrough::activate()
142 check(CSSM_CSP_CreatePassThroughContext(attachment()->handle(), mKey
, &mHandle
));
149 // Manage Digest contexts
151 void Digest::activate()
154 check(CSSM_CSP_CreateDigestContext(attachment()->handle(), mAlgorithm
, &mHandle
));
160 void Digest::digest(const CssmData
*data
, uint32 count
, CssmData
&digest
)
164 Error::throwMe(CSSMERR_CSP_STAGED_OPERATION_IN_PROGRESS
);
165 check(CSSM_DigestData(handle(), data
, count
, &digest
));
168 void Digest::digest(const CssmData
*data
, uint32 count
)
172 check(CSSM_DigestDataInit(handle()));
175 check(CSSM_DigestDataUpdate(handle(), data
, count
));
178 void Digest::operator () (CssmData
&digest
)
181 Error::throwMe(CSSMERR_CSP_STAGED_OPERATION_NOT_STARTED
);
182 check(CSSM_DigestDataFinal(handle(), &digest
));
188 // Random number generation
190 void Random::seed(const CssmCryptoData
&seedData
)
193 set(CSSM_ATTRIBUTE_SEED
, seedData
);
196 void Random::size(uint32 sz
)
199 set(CSSM_ATTRIBUTE_OUTPUT_SIZE
, sz
);
203 void Random::activate()
206 check(CSSM_CSP_CreateRandomGenContext(attachment()->handle(), mAlgorithm
,
207 mSeed
, mSize
, &mHandle
));
213 void Random::generate(CssmData
&data
, uint32 newSize
)
218 assert(!mStaged
); // not a stage-able operation
219 check(CSSM_GenerateRandom(handle(), &data
));