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