crypto.c (8054B)
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 * 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 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 * 104 nssCKFWCryptoOperation_GetMDCryptoOperation( 105 NSSCKFWCryptoOperation *fwOperation) 106 { 107 return fwOperation->mdOperation; 108 } 109 110 /* 111 * nssCKFWCryptoOperation_GetType 112 */ 113 NSS_EXTERN NSSCKFWCryptoOperationType 114 nssCKFWCryptoOperation_GetType( 115 NSSCKFWCryptoOperation *fwOperation) 116 { 117 return fwOperation->type; 118 } 119 120 /* 121 * nssCKFWCryptoOperation_GetFinalLength 122 */ 123 NSS_EXTERN CK_ULONG 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 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 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 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 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 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 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 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 }