]> git.saurik.com Git - apple/security.git/blob - cdsa/cdsa_client/cspclient.cpp
Security-28.tar.gz
[apple/security.git] / cdsa / cdsa_client / cspclient.cpp
1 /*
2 * Copyright (c) 2000-2001 Apple Computer, 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 obtain
7 * a copy of the License at http://www.apple.com/publicsource and read it before
8 * 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 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.
16 */
17
18
19 //
20 // cspclient - client interface to CSSM CSPs and their operations
21 //
22 #include <Security/cspclient.h>
23
24 using namespace CssmClient;
25
26
27 //
28 // Manage CSP attachments
29 //
30 CSPImpl::CSPImpl(const Guid &guid) : AttachmentImpl(guid, CSSM_SERVICE_CSP)
31 {
32 }
33
34 CSPImpl::CSPImpl(const Module &module) : AttachmentImpl(module, CSSM_SERVICE_CSP)
35 {
36 }
37
38 CSPImpl::~CSPImpl()
39 {
40 }
41
42
43 //
44 // Delete a key explicitly
45 //
46 void CSPImpl::freeKey(CssmKey &key, const AccessCredentials *cred, bool permanent)
47 {
48 check(CSSM_FreeKey(handle(), cred, &key, permanent));
49 }
50
51
52 //
53 // Manage generic context objects
54 //
55 CssmClient::Context::Context(const CSP &csp, CSSM_ALGORITHMS alg)
56 : ObjectImpl(csp), mAlgorithm(alg), mStaged(false)
57 {
58 }
59
60 CssmClient::Context::~Context()
61 {
62 try
63 {
64 deactivate();
65 } catch(...) {}
66 }
67
68 void CssmClient::Context::init()
69 {
70 CssmError::throwMe(CSSM_ERRCODE_FUNCTION_NOT_IMPLEMENTED);
71 }
72
73 void CssmClient::Context::deactivate()
74 {
75 if (mActive)
76 {
77 mActive = false;
78 check(CSSM_DeleteContext(mHandle));
79 }
80 }
81
82
83 void CssmClient::Context::algorithm(CSSM_ALGORITHMS alg)
84 {
85 if (isActive())
86 abort(); //@@@ can't (currently?) change algorithm with active context
87 mAlgorithm = alg;
88 }
89
90
91 //
92 // The override() method of Context is an expert feature. It replaces the entire
93 // context with a context object provided. It is up to the caller to keep this context
94 // consistent with the purpose of the Context subclass he is (mis)using.
95 // This feature is currently used by the SecurityServer.
96 //
97 void CssmClient::Context::override(const Security::Context &ctx)
98 {
99 if (!isActive()) {
100 // make a valid context object (it doesn't matter what kind - keep it cheap)
101 check(CSSM_CSP_CreateDigestContext(attachment()->handle(), CSSM_ALGID_NONE, &mHandle));
102 }
103 // now replace everything with the context data provided
104 check(CSSM_SetContext(mHandle, &ctx));
105 mActive = true; // now active
106 }
107
108
109 //
110 // Manage Digest contexts
111 //
112 void Digest::activate()
113 {
114 if (!mActive) {
115 check(CSSM_CSP_CreateDigestContext(attachment()->handle(), mAlgorithm, &mHandle));
116 mActive = true;
117 }
118 }
119
120
121 void Digest::digest(const CssmData *data, uint32 count, CssmData &digest)
122 {
123 activate();
124 if (mStaged)
125 Error::throwMe(CSSMERR_CSP_STAGED_OPERATION_IN_PROGRESS);
126 check(CSSM_DigestData(handle(), data, count, &digest));
127 }
128
129 void Digest::digest(const CssmData *data, uint32 count)
130 {
131 activate();
132 if (!mStaged) {
133 check(CSSM_DigestDataInit(handle()));
134 mStaged = true;
135 }
136 check(CSSM_DigestDataUpdate(handle(), data, count));
137 }
138
139 void Digest::operator () (CssmData &digest)
140 {
141 if (!mStaged)
142 Error::throwMe(CSSMERR_CSP_STAGED_OPERATION_NOT_STARTED);
143 check(CSSM_DigestDataFinal(handle(), &digest));
144 mStaged = false;
145 }
146
147
148 //
149 // Random number generation
150 //
151 void Random::seed(const CssmCryptoData &seedData)
152 {
153 mSeed = &seedData;
154 set(CSSM_ATTRIBUTE_SEED, seedData);
155 }
156
157 void Random::size(uint32 sz)
158 {
159 mSize = sz;
160 set(CSSM_ATTRIBUTE_OUTPUT_SIZE, sz);
161 }
162
163
164 void Random::activate()
165 {
166 if (!mActive) {
167 check(CSSM_CSP_CreateRandomGenContext(attachment()->handle(), mAlgorithm,
168 mSeed, mSize, &mHandle));
169 mActive = true;
170 }
171 }
172
173
174 void Random::generate(CssmData &data, uint32 newSize)
175 {
176 if (newSize)
177 size(newSize);
178 activate();
179 assert(!mStaged); // not a stage-able operation
180 check(CSSM_GenerateRandom(handle(), &data));
181 }