1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
5 /*
6 * crypto.c
7 *
8 * This file implements the NSSCKFWCryptoOperation type and methods.
9 */
10
11 #ifndef CK_T
12 #include "ck.h"
13 #endif /* CK_T */
14
15 /*
16 * NSSCKFWCryptoOperation
17 *
18 * -- create/destroy --
19 * nssCKFWCrytoOperation_Create
20 * nssCKFWCryptoOperation_Destroy
21 *
22 * -- implement public accessors --
23 * nssCKFWCryptoOperation_GetMDCryptoOperation
24 * nssCKFWCryptoOperation_GetType
25 *
26 * -- private accessors --
27 *
28 * -- module fronts --
29 * nssCKFWCryptoOperation_GetFinalLength
30 * nssCKFWCryptoOperation_GetOperationLength
31 * nssCKFWCryptoOperation_Final
32 * nssCKFWCryptoOperation_Update
33 * nssCKFWCryptoOperation_DigestUpdate
34 * nssCKFWCryptoOperation_UpdateFinal
35 */
36
37 struct NSSCKFWCryptoOperationStr {
38 /* NSSArena *arena; */
39 NSSCKMDCryptoOperation *mdOperation;
40 NSSCKMDSession *mdSession;
41 NSSCKFWSession *fwSession;
42 NSSCKMDToken *mdToken;
43 NSSCKFWToken *fwToken;
44 NSSCKMDInstance *mdInstance;
45 NSSCKFWInstance *fwInstance;
46 NSSCKFWCryptoOperationType type;
47 };
48
49 /*
50 * nssCKFWCrytoOperation_Create
51 */
52 NSS_EXTERN NSSCKFWCryptoOperation *
nssCKFWCryptoOperation_Create(NSSCKMDCryptoOperation * mdOperation,NSSCKMDSession * mdSession,NSSCKFWSession * fwSession,NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance,NSSCKFWCryptoOperationType type,CK_RV * pError)53 nssCKFWCryptoOperation_Create(
54 NSSCKMDCryptoOperation *mdOperation,
55 NSSCKMDSession *mdSession,
56 NSSCKFWSession *fwSession,
57 NSSCKMDToken *mdToken,
58 NSSCKFWToken *fwToken,
59 NSSCKMDInstance *mdInstance,
60 NSSCKFWInstance *fwInstance,
61 NSSCKFWCryptoOperationType type,
62 CK_RV *pError)
63 {
64 NSSCKFWCryptoOperation *fwOperation;
65 fwOperation = nss_ZNEW(NULL, NSSCKFWCryptoOperation);
66 if (!fwOperation) {
67 *pError = CKR_HOST_MEMORY;
68 return (NSSCKFWCryptoOperation *)NULL;
69 }
70 fwOperation->mdOperation = mdOperation;
71 fwOperation->mdSession = mdSession;
72 fwOperation->fwSession = fwSession;
73 fwOperation->mdToken = mdToken;
74 fwOperation->fwToken = fwToken;
75 fwOperation->mdInstance = mdInstance;
76 fwOperation->fwInstance = fwInstance;
77 fwOperation->type = type;
78 return fwOperation;
79 }
80
81 /*
82 * nssCKFWCryptoOperation_Destroy
83 */
84 NSS_EXTERN void
nssCKFWCryptoOperation_Destroy(NSSCKFWCryptoOperation * fwOperation)85 nssCKFWCryptoOperation_Destroy(
86 NSSCKFWCryptoOperation *fwOperation)
87 {
88 if ((NSSCKMDCryptoOperation *)NULL != fwOperation->mdOperation) {
89 if (fwOperation->mdOperation->Destroy) {
90 fwOperation->mdOperation->Destroy(
91 fwOperation->mdOperation,
92 fwOperation,
93 fwOperation->mdInstance,
94 fwOperation->fwInstance);
95 }
96 }
97 nss_ZFreeIf(fwOperation);
98 }
99
100 /*
101 * nssCKFWCryptoOperation_GetMDCryptoOperation
102 */
103 NSS_EXTERN NSSCKMDCryptoOperation *
nssCKFWCryptoOperation_GetMDCryptoOperation(NSSCKFWCryptoOperation * fwOperation)104 nssCKFWCryptoOperation_GetMDCryptoOperation(
105 NSSCKFWCryptoOperation *fwOperation)
106 {
107 return fwOperation->mdOperation;
108 }
109
110 /*
111 * nssCKFWCryptoOperation_GetType
112 */
113 NSS_EXTERN NSSCKFWCryptoOperationType
nssCKFWCryptoOperation_GetType(NSSCKFWCryptoOperation * fwOperation)114 nssCKFWCryptoOperation_GetType(
115 NSSCKFWCryptoOperation *fwOperation)
116 {
117 return fwOperation->type;
118 }
119
120 /*
121 * nssCKFWCryptoOperation_GetFinalLength
122 */
123 NSS_EXTERN CK_ULONG
nssCKFWCryptoOperation_GetFinalLength(NSSCKFWCryptoOperation * fwOperation,CK_RV * pError)124 nssCKFWCryptoOperation_GetFinalLength(
125 NSSCKFWCryptoOperation *fwOperation,
126 CK_RV *pError)
127 {
128 if (!fwOperation->mdOperation->GetFinalLength) {
129 *pError = CKR_FUNCTION_FAILED;
130 return 0;
131 }
132 return fwOperation->mdOperation->GetFinalLength(
133 fwOperation->mdOperation,
134 fwOperation,
135 fwOperation->mdSession,
136 fwOperation->fwSession,
137 fwOperation->mdToken,
138 fwOperation->fwToken,
139 fwOperation->mdInstance,
140 fwOperation->fwInstance,
141 pError);
142 }
143
144 /*
145 * nssCKFWCryptoOperation_GetOperationLength
146 */
147 NSS_EXTERN CK_ULONG
nssCKFWCryptoOperation_GetOperationLength(NSSCKFWCryptoOperation * fwOperation,NSSItem * inputBuffer,CK_RV * pError)148 nssCKFWCryptoOperation_GetOperationLength(
149 NSSCKFWCryptoOperation *fwOperation,
150 NSSItem *inputBuffer,
151 CK_RV *pError)
152 {
153 if (!fwOperation->mdOperation->GetOperationLength) {
154 *pError = CKR_FUNCTION_FAILED;
155 return 0;
156 }
157 return fwOperation->mdOperation->GetOperationLength(
158 fwOperation->mdOperation,
159 fwOperation,
160 fwOperation->mdSession,
161 fwOperation->fwSession,
162 fwOperation->mdToken,
163 fwOperation->fwToken,
164 fwOperation->mdInstance,
165 fwOperation->fwInstance,
166 inputBuffer,
167 pError);
168 }
169
170 /*
171 * nssCKFWCryptoOperation_Final
172 */
173 NSS_EXTERN CK_RV
nssCKFWCryptoOperation_Final(NSSCKFWCryptoOperation * fwOperation,NSSItem * outputBuffer)174 nssCKFWCryptoOperation_Final(
175 NSSCKFWCryptoOperation *fwOperation,
176 NSSItem *outputBuffer)
177 {
178 if (!fwOperation->mdOperation->Final) {
179 return CKR_FUNCTION_FAILED;
180 }
181 return fwOperation->mdOperation->Final(
182 fwOperation->mdOperation,
183 fwOperation,
184 fwOperation->mdSession,
185 fwOperation->fwSession,
186 fwOperation->mdToken,
187 fwOperation->fwToken,
188 fwOperation->mdInstance,
189 fwOperation->fwInstance,
190 outputBuffer);
191 }
192
193 /*
194 * nssCKFWCryptoOperation_Update
195 */
196 NSS_EXTERN CK_RV
nssCKFWCryptoOperation_Update(NSSCKFWCryptoOperation * fwOperation,NSSItem * inputBuffer,NSSItem * outputBuffer)197 nssCKFWCryptoOperation_Update(
198 NSSCKFWCryptoOperation *fwOperation,
199 NSSItem *inputBuffer,
200 NSSItem *outputBuffer)
201 {
202 if (!fwOperation->mdOperation->Update) {
203 return CKR_FUNCTION_FAILED;
204 }
205 return fwOperation->mdOperation->Update(
206 fwOperation->mdOperation,
207 fwOperation,
208 fwOperation->mdSession,
209 fwOperation->fwSession,
210 fwOperation->mdToken,
211 fwOperation->fwToken,
212 fwOperation->mdInstance,
213 fwOperation->fwInstance,
214 inputBuffer,
215 outputBuffer);
216 }
217
218 /*
219 * nssCKFWCryptoOperation_DigestUpdate
220 */
221 NSS_EXTERN CK_RV
nssCKFWCryptoOperation_DigestUpdate(NSSCKFWCryptoOperation * fwOperation,NSSItem * inputBuffer)222 nssCKFWCryptoOperation_DigestUpdate(
223 NSSCKFWCryptoOperation *fwOperation,
224 NSSItem *inputBuffer)
225 {
226 if (!fwOperation->mdOperation->DigestUpdate) {
227 return CKR_FUNCTION_FAILED;
228 }
229 return fwOperation->mdOperation->DigestUpdate(
230 fwOperation->mdOperation,
231 fwOperation,
232 fwOperation->mdSession,
233 fwOperation->fwSession,
234 fwOperation->mdToken,
235 fwOperation->fwToken,
236 fwOperation->mdInstance,
237 fwOperation->fwInstance,
238 inputBuffer);
239 }
240
241 /*
242 * nssCKFWCryptoOperation_DigestKey
243 */
244 NSS_EXTERN CK_RV
nssCKFWCryptoOperation_DigestKey(NSSCKFWCryptoOperation * fwOperation,NSSCKFWObject * fwObject)245 nssCKFWCryptoOperation_DigestKey(
246 NSSCKFWCryptoOperation *fwOperation,
247 NSSCKFWObject *fwObject /* Key */
248 )
249 {
250 NSSCKMDObject *mdObject;
251
252 if (!fwOperation->mdOperation->DigestKey) {
253 return CKR_FUNCTION_FAILED;
254 }
255 mdObject = nssCKFWObject_GetMDObject(fwObject);
256 return fwOperation->mdOperation->DigestKey(
257 fwOperation->mdOperation,
258 fwOperation,
259 fwOperation->mdToken,
260 fwOperation->fwToken,
261 fwOperation->mdInstance,
262 fwOperation->fwInstance,
263 mdObject,
264 fwObject);
265 }
266
267 /*
268 * nssCKFWCryptoOperation_UpdateFinal
269 */
270 NSS_EXTERN CK_RV
nssCKFWCryptoOperation_UpdateFinal(NSSCKFWCryptoOperation * fwOperation,NSSItem * inputBuffer,NSSItem * outputBuffer)271 nssCKFWCryptoOperation_UpdateFinal(
272 NSSCKFWCryptoOperation *fwOperation,
273 NSSItem *inputBuffer,
274 NSSItem *outputBuffer)
275 {
276 if (!fwOperation->mdOperation->UpdateFinal) {
277 return CKR_FUNCTION_FAILED;
278 }
279 return fwOperation->mdOperation->UpdateFinal(
280 fwOperation->mdOperation,
281 fwOperation,
282 fwOperation->mdSession,
283 fwOperation->fwSession,
284 fwOperation->mdToken,
285 fwOperation->fwToken,
286 fwOperation->mdInstance,
287 fwOperation->fwInstance,
288 inputBuffer,
289 outputBuffer);
290 }
291
292 /*
293 * nssCKFWCryptoOperation_UpdateCombo
294 */
295 NSS_EXTERN CK_RV
nssCKFWCryptoOperation_UpdateCombo(NSSCKFWCryptoOperation * fwOperation,NSSCKFWCryptoOperation * fwPeerOperation,NSSItem * inputBuffer,NSSItem * outputBuffer)296 nssCKFWCryptoOperation_UpdateCombo(
297 NSSCKFWCryptoOperation *fwOperation,
298 NSSCKFWCryptoOperation *fwPeerOperation,
299 NSSItem *inputBuffer,
300 NSSItem *outputBuffer)
301 {
302 if (!fwOperation->mdOperation->UpdateCombo) {
303 return CKR_FUNCTION_FAILED;
304 }
305 return fwOperation->mdOperation->UpdateCombo(
306 fwOperation->mdOperation,
307 fwOperation,
308 fwPeerOperation->mdOperation,
309 fwPeerOperation,
310 fwOperation->mdSession,
311 fwOperation->fwSession,
312 fwOperation->mdToken,
313 fwOperation->fwToken,
314 fwOperation->mdInstance,
315 fwOperation->fwInstance,
316 inputBuffer,
317 outputBuffer);
318 }
319