|
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 * Internal data structures and functions used by pkcs11.c |
|
6 */ |
|
7 #ifndef _PKCS11I_H_ |
|
8 #define _PKCS11I_H_ 1 |
|
9 |
|
10 #include "nssilock.h" |
|
11 #include "seccomon.h" |
|
12 #include "secoidt.h" |
|
13 #include "lowkeyti.h" |
|
14 #include "pkcs11t.h" |
|
15 |
|
16 #include "sftkdbt.h" |
|
17 #include "hasht.h" |
|
18 |
|
19 /* |
|
20 * Configuration Defines |
|
21 * |
|
22 * The following defines affect the space verse speed trade offs of |
|
23 * the PKCS #11 module. For the most part the current settings are optimized |
|
24 * for web servers, where we want faster speed and lower lock contention at |
|
25 * the expense of space. |
|
26 */ |
|
27 |
|
28 /* |
|
29 * The attribute allocation strategy is static allocation: |
|
30 * Attributes are pre-allocated as part of the session object and used from |
|
31 * the object array. |
|
32 */ |
|
33 #define MAX_OBJS_ATTRS 45 /* number of attributes to preallocate in |
|
34 * the object (must me the absolute max) */ |
|
35 #define ATTR_SPACE 50 /* Maximum size of attribute data before extra |
|
36 * data needs to be allocated. This is set to |
|
37 * enough space to hold an SSL MASTER secret */ |
|
38 |
|
39 #define NSC_STRICT PR_FALSE /* forces the code to do strict template |
|
40 * matching when doing C_FindObject on token |
|
41 * objects. This will slow down search in |
|
42 * NSS. */ |
|
43 /* default search block allocations and increments */ |
|
44 #define NSC_CERT_BLOCK_SIZE 50 |
|
45 #define NSC_SEARCH_BLOCK_SIZE 5 |
|
46 #define NSC_SLOT_LIST_BLOCK_SIZE 10 |
|
47 |
|
48 #define NSC_FIPS_MODULE 1 |
|
49 #define NSC_NON_FIPS_MODULE 0 |
|
50 |
|
51 /* these are data base storage hashes, not cryptographic hashes.. The define |
|
52 * the effective size of the various object hash tables */ |
|
53 /* clients care more about memory usage than lookup performance on |
|
54 * cyrptographic objects. Clients also have less objects around to play with |
|
55 * |
|
56 * we eventually should make this configurable at runtime! Especially now that |
|
57 * NSS is a shared library. |
|
58 */ |
|
59 #define SPACE_ATTRIBUTE_HASH_SIZE 32 |
|
60 #define SPACE_SESSION_OBJECT_HASH_SIZE 32 |
|
61 #define SPACE_SESSION_HASH_SIZE 32 |
|
62 #define TIME_ATTRIBUTE_HASH_SIZE 32 |
|
63 #define TIME_SESSION_OBJECT_HASH_SIZE 1024 |
|
64 #define TIME_SESSION_HASH_SIZE 1024 |
|
65 #define MAX_OBJECT_LIST_SIZE 800 |
|
66 /* how many objects to keep on the free list |
|
67 * before we start freeing them */ |
|
68 #define MAX_KEY_LEN 256 /* maximum symmetric key length in bytes */ |
|
69 |
|
70 /* |
|
71 * LOG2_BUCKETS_PER_SESSION_LOCK must be a prime number. |
|
72 * With SESSION_HASH_SIZE=1024, LOG2 can be 9, 5, 1, or 0. |
|
73 * With SESSION_HASH_SIZE=4096, LOG2 can be 11, 9, 5, 1, or 0. |
|
74 * |
|
75 * HASH_SIZE LOG2_BUCKETS_PER BUCKETS_PER_LOCK NUMBER_OF_BUCKETS |
|
76 * 1024 9 512 2 |
|
77 * 1024 5 32 32 |
|
78 * 1024 1 2 512 |
|
79 * 1024 0 1 1024 |
|
80 * 4096 11 2048 2 |
|
81 * 4096 9 512 8 |
|
82 * 4096 5 32 128 |
|
83 * 4096 1 2 2048 |
|
84 * 4096 0 1 4096 |
|
85 */ |
|
86 #define LOG2_BUCKETS_PER_SESSION_LOCK 1 |
|
87 #define BUCKETS_PER_SESSION_LOCK (1 << (LOG2_BUCKETS_PER_SESSION_LOCK)) |
|
88 /* NOSPREAD sessionID to hash table index macro has been slower. */ |
|
89 |
|
90 /* define typedefs, double as forward declarations as well */ |
|
91 typedef struct SFTKAttributeStr SFTKAttribute; |
|
92 typedef struct SFTKObjectListStr SFTKObjectList; |
|
93 typedef struct SFTKObjectFreeListStr SFTKObjectFreeList; |
|
94 typedef struct SFTKObjectListElementStr SFTKObjectListElement; |
|
95 typedef struct SFTKObjectStr SFTKObject; |
|
96 typedef struct SFTKSessionObjectStr SFTKSessionObject; |
|
97 typedef struct SFTKTokenObjectStr SFTKTokenObject; |
|
98 typedef struct SFTKSessionStr SFTKSession; |
|
99 typedef struct SFTKSlotStr SFTKSlot; |
|
100 typedef struct SFTKSessionContextStr SFTKSessionContext; |
|
101 typedef struct SFTKSearchResultsStr SFTKSearchResults; |
|
102 typedef struct SFTKHashVerifyInfoStr SFTKHashVerifyInfo; |
|
103 typedef struct SFTKHashSignInfoStr SFTKHashSignInfo; |
|
104 typedef struct SFTKOAEPEncryptInfoStr SFTKOAEPEncryptInfo; |
|
105 typedef struct SFTKOAEPDecryptInfoStr SFTKOAEPDecryptInfo; |
|
106 typedef struct SFTKSSLMACInfoStr SFTKSSLMACInfo; |
|
107 typedef struct SFTKItemTemplateStr SFTKItemTemplate; |
|
108 |
|
109 /* define function pointer typdefs for pointer tables */ |
|
110 typedef void (*SFTKDestroy)(void *, PRBool); |
|
111 typedef void (*SFTKBegin)(void *); |
|
112 typedef SECStatus (*SFTKCipher)(void *,void *,unsigned int *,unsigned int, |
|
113 void *, unsigned int); |
|
114 typedef SECStatus (*SFTKVerify)(void *,void *,unsigned int,void *,unsigned int); |
|
115 typedef void (*SFTKHash)(void *,void *,unsigned int); |
|
116 typedef void (*SFTKEnd)(void *,void *,unsigned int *,unsigned int); |
|
117 typedef void (*SFTKFree)(void *); |
|
118 |
|
119 /* Value to tell if an attribute is modifiable or not. |
|
120 * NEVER: attribute is only set on creation. |
|
121 * ONCOPY: attribute is set on creation and can only be changed on copy. |
|
122 * SENSITIVE: attribute can only be changed to TRUE. |
|
123 * ALWAYS: attribute can always be changed. |
|
124 */ |
|
125 typedef enum { |
|
126 SFTK_NEVER = 0, |
|
127 SFTK_ONCOPY = 1, |
|
128 SFTK_SENSITIVE = 2, |
|
129 SFTK_ALWAYS = 3 |
|
130 } SFTKModifyType; |
|
131 |
|
132 /* |
|
133 * Free Status Enum... tell us more information when we think we're |
|
134 * deleting an object. |
|
135 */ |
|
136 typedef enum { |
|
137 SFTK_DestroyFailure, |
|
138 SFTK_Destroyed, |
|
139 SFTK_Busy |
|
140 } SFTKFreeStatus; |
|
141 |
|
142 /* |
|
143 * attribute values of an object. |
|
144 */ |
|
145 struct SFTKAttributeStr { |
|
146 SFTKAttribute *next; |
|
147 SFTKAttribute *prev; |
|
148 PRBool freeAttr; |
|
149 PRBool freeData; |
|
150 /*must be called handle to make sftkqueue_find work */ |
|
151 CK_ATTRIBUTE_TYPE handle; |
|
152 CK_ATTRIBUTE attrib; |
|
153 unsigned char space[ATTR_SPACE]; |
|
154 }; |
|
155 |
|
156 |
|
157 /* |
|
158 * doubly link list of objects |
|
159 */ |
|
160 struct SFTKObjectListStr { |
|
161 SFTKObjectList *next; |
|
162 SFTKObjectList *prev; |
|
163 SFTKObject *parent; |
|
164 }; |
|
165 |
|
166 struct SFTKObjectFreeListStr { |
|
167 SFTKObject *head; |
|
168 PZLock *lock; |
|
169 int count; |
|
170 }; |
|
171 |
|
172 /* |
|
173 * PKCS 11 crypto object structure |
|
174 */ |
|
175 struct SFTKObjectStr { |
|
176 SFTKObject *next; |
|
177 SFTKObject *prev; |
|
178 CK_OBJECT_CLASS objclass; |
|
179 CK_OBJECT_HANDLE handle; |
|
180 int refCount; |
|
181 PZLock *refLock; |
|
182 SFTKSlot *slot; |
|
183 void *objectInfo; |
|
184 SFTKFree infoFree; |
|
185 }; |
|
186 |
|
187 struct SFTKTokenObjectStr { |
|
188 SFTKObject obj; |
|
189 SECItem dbKey; |
|
190 }; |
|
191 |
|
192 struct SFTKSessionObjectStr { |
|
193 SFTKObject obj; |
|
194 SFTKObjectList sessionList; |
|
195 PZLock *attributeLock; |
|
196 SFTKSession *session; |
|
197 PRBool wasDerived; |
|
198 int nextAttr; |
|
199 SFTKAttribute attrList[MAX_OBJS_ATTRS]; |
|
200 PRBool optimizeSpace; |
|
201 unsigned int hashSize; |
|
202 SFTKAttribute *head[1]; |
|
203 }; |
|
204 |
|
205 /* |
|
206 * struct to deal with a temparary list of objects |
|
207 */ |
|
208 struct SFTKObjectListElementStr { |
|
209 SFTKObjectListElement *next; |
|
210 SFTKObject *object; |
|
211 }; |
|
212 |
|
213 /* |
|
214 * Area to hold Search results |
|
215 */ |
|
216 struct SFTKSearchResultsStr { |
|
217 CK_OBJECT_HANDLE *handles; |
|
218 int size; |
|
219 int index; |
|
220 int array_size; |
|
221 }; |
|
222 |
|
223 |
|
224 /* |
|
225 * the universal crypto/hash/sign/verify context structure |
|
226 */ |
|
227 typedef enum { |
|
228 SFTK_ENCRYPT, |
|
229 SFTK_DECRYPT, |
|
230 SFTK_HASH, |
|
231 SFTK_SIGN, |
|
232 SFTK_SIGN_RECOVER, |
|
233 SFTK_VERIFY, |
|
234 SFTK_VERIFY_RECOVER |
|
235 } SFTKContextType; |
|
236 |
|
237 /** max block size of supported block ciphers */ |
|
238 #define SFTK_MAX_BLOCK_SIZE 16 |
|
239 /** currently SHA512 is the biggest hash length */ |
|
240 #define SFTK_MAX_MAC_LENGTH 64 |
|
241 #define SFTK_INVALID_MAC_SIZE 0xffffffff |
|
242 |
|
243 /** Particular ongoing operation in session (sign/verify/digest/encrypt/...) |
|
244 * |
|
245 * Understanding sign/verify context: |
|
246 * multi=1 hashInfo=0 block (symmetric) cipher MACing |
|
247 * multi=1 hashInfo=X PKC S/V with prior hashing |
|
248 * multi=0 hashInfo=0 PKC S/V one shot (w/o hashing) |
|
249 * multi=0 hashInfo=X *** shouldn't happen *** |
|
250 */ |
|
251 struct SFTKSessionContextStr { |
|
252 SFTKContextType type; |
|
253 PRBool multi; /* is multipart */ |
|
254 PRBool rsa; /* is rsa */ |
|
255 PRBool doPad; /* use PKCS padding for block ciphers */ |
|
256 unsigned int blockSize; /* blocksize for padding */ |
|
257 unsigned int padDataLength; /* length of the valid data in padbuf */ |
|
258 /** latest incomplete block of data for block cipher */ |
|
259 unsigned char padBuf[SFTK_MAX_BLOCK_SIZE]; |
|
260 /** result of MAC'ing of latest full block of data with block cipher */ |
|
261 unsigned char macBuf[SFTK_MAX_BLOCK_SIZE]; |
|
262 CK_ULONG macSize; /* size of a general block cipher mac*/ |
|
263 void *cipherInfo; |
|
264 void *hashInfo; |
|
265 unsigned int cipherInfoLen; |
|
266 CK_MECHANISM_TYPE currentMech; |
|
267 SFTKCipher update; |
|
268 SFTKHash hashUpdate; |
|
269 SFTKEnd end; |
|
270 SFTKDestroy destroy; |
|
271 SFTKDestroy hashdestroy; |
|
272 SFTKVerify verify; |
|
273 unsigned int maxLen; |
|
274 SFTKObject *key; |
|
275 }; |
|
276 |
|
277 /* |
|
278 * Sessions (have objects) |
|
279 */ |
|
280 struct SFTKSessionStr { |
|
281 SFTKSession *next; |
|
282 SFTKSession *prev; |
|
283 CK_SESSION_HANDLE handle; |
|
284 int refCount; |
|
285 PZLock *objectLock; |
|
286 int objectIDCount; |
|
287 CK_SESSION_INFO info; |
|
288 CK_NOTIFY notify; |
|
289 CK_VOID_PTR appData; |
|
290 SFTKSlot *slot; |
|
291 SFTKSearchResults *search; |
|
292 SFTKSessionContext *enc_context; |
|
293 SFTKSessionContext *hash_context; |
|
294 SFTKSessionContext *sign_context; |
|
295 SFTKObjectList *objects[1]; |
|
296 }; |
|
297 |
|
298 /* |
|
299 * slots (have sessions and objects) |
|
300 * |
|
301 * The array of sessionLock's protect the session hash table (head[]) |
|
302 * as well as the reference count of session objects in that bucket |
|
303 * (head[]->refCount), objectLock protects all elements of the slot's |
|
304 * object hash tables (sessObjHashTable[] and tokObjHashTable), and |
|
305 * sessionObjectHandleCount. |
|
306 * slotLock protects the remaining protected elements: |
|
307 * password, isLoggedIn, ssoLoggedIn, and sessionCount, |
|
308 * and pwCheckLock serializes the key database password checks in |
|
309 * NSC_SetPIN and NSC_Login. |
|
310 * |
|
311 * Each of the fields below has the following lifetime as commented |
|
312 * next to the fields: |
|
313 * invariant - This value is set when the slot is first created and |
|
314 * never changed until it is destroyed. |
|
315 * per load - This value is set when the slot is first created, or |
|
316 * when the slot is used to open another directory. Between open and close |
|
317 * this field does not change. |
|
318 * variable - This value changes through the normal process of slot operation. |
|
319 * - reset. The value of this variable is cleared during an open/close |
|
320 * cycles. |
|
321 * - preserved. The value of this variable is preserved over open/close |
|
322 * cycles. |
|
323 */ |
|
324 struct SFTKSlotStr { |
|
325 CK_SLOT_ID slotID; /* invariant */ |
|
326 PZLock *slotLock; /* invariant */ |
|
327 PZLock **sessionLock; /* invariant */ |
|
328 unsigned int numSessionLocks; /* invariant */ |
|
329 unsigned long sessionLockMask; /* invariant */ |
|
330 PZLock *objectLock; /* invariant */ |
|
331 PRLock *pwCheckLock; /* invariant */ |
|
332 PRBool present; /* variable -set */ |
|
333 PRBool hasTokens; /* per load */ |
|
334 PRBool isLoggedIn; /* variable - reset */ |
|
335 PRBool ssoLoggedIn; /* variable - reset */ |
|
336 PRBool needLogin; /* per load */ |
|
337 PRBool DB_loaded; /* per load */ |
|
338 PRBool readOnly; /* per load */ |
|
339 PRBool optimizeSpace; /* invariant */ |
|
340 SFTKDBHandle *certDB; /* per load */ |
|
341 SFTKDBHandle *keyDB; /* per load */ |
|
342 int minimumPinLen; /* per load */ |
|
343 PRInt32 sessionIDCount; /* atomically incremented */ |
|
344 /* (preserved) */ |
|
345 int sessionIDConflict; /* not protected by a lock */ |
|
346 /* (preserved) */ |
|
347 int sessionCount; /* variable - reset */ |
|
348 PRInt32 rwSessionCount; /* set by atomic operations */ |
|
349 /* (reset) */ |
|
350 int sessionObjectHandleCount;/* variable - perserved */ |
|
351 int index; /* invariant */ |
|
352 PLHashTable *tokObjHashTable; /* invariant */ |
|
353 SFTKObject **sessObjHashTable; /* variable - reset */ |
|
354 unsigned int sessObjHashSize; /* invariant */ |
|
355 SFTKSession **head; /* variable -reset */ |
|
356 unsigned int sessHashSize; /* invariant */ |
|
357 char tokDescription[33]; /* per load */ |
|
358 char updateTokDescription[33]; /* per load */ |
|
359 char slotDescription[65]; /* invariant */ |
|
360 }; |
|
361 |
|
362 /* |
|
363 * special joint operations Contexts |
|
364 */ |
|
365 struct SFTKHashVerifyInfoStr { |
|
366 SECOidTag hashOid; |
|
367 void *params; |
|
368 NSSLOWKEYPublicKey *key; |
|
369 }; |
|
370 |
|
371 struct SFTKHashSignInfoStr { |
|
372 SECOidTag hashOid; |
|
373 void *params; |
|
374 NSSLOWKEYPrivateKey *key; |
|
375 }; |
|
376 |
|
377 /** |
|
378 * Contexts for RSA-OAEP |
|
379 */ |
|
380 struct SFTKOAEPEncryptInfoStr { |
|
381 CK_RSA_PKCS_OAEP_PARAMS *params; |
|
382 NSSLOWKEYPublicKey *key; |
|
383 }; |
|
384 |
|
385 struct SFTKOAEPDecryptInfoStr { |
|
386 CK_RSA_PKCS_OAEP_PARAMS *params; |
|
387 NSSLOWKEYPrivateKey *key; |
|
388 }; |
|
389 |
|
390 /* context for the Final SSLMAC message */ |
|
391 struct SFTKSSLMACInfoStr { |
|
392 void *hashContext; |
|
393 SFTKBegin begin; |
|
394 SFTKHash update; |
|
395 SFTKEnd end; |
|
396 CK_ULONG macSize; |
|
397 int padSize; |
|
398 unsigned char key[MAX_KEY_LEN]; |
|
399 unsigned int keySize; |
|
400 }; |
|
401 |
|
402 /* |
|
403 * Template based on SECItems, suitable for passing as arrays |
|
404 */ |
|
405 struct SFTKItemTemplateStr { |
|
406 CK_ATTRIBUTE_TYPE type; |
|
407 SECItem *item; |
|
408 }; |
|
409 |
|
410 /* macro for setting SFTKTemplates. */ |
|
411 #define SFTK_SET_ITEM_TEMPLATE(templ, count, itemPtr, attr) \ |
|
412 templ[count].type = attr; \ |
|
413 templ[count].item = itemPtr |
|
414 |
|
415 #define SFTK_MAX_ITEM_TEMPLATE 10 |
|
416 |
|
417 /* |
|
418 * session handle modifiers |
|
419 */ |
|
420 #define SFTK_SESSION_SLOT_MASK 0xff000000L |
|
421 |
|
422 /* |
|
423 * object handle modifiers |
|
424 */ |
|
425 #define SFTK_TOKEN_MASK 0x80000000L |
|
426 #define SFTK_TOKEN_MAGIC 0x80000000L |
|
427 #define SFTK_TOKEN_TYPE_MASK 0x70000000L |
|
428 /* keydb (high bit == 0) */ |
|
429 #define SFTK_TOKEN_TYPE_PRIV 0x10000000L |
|
430 #define SFTK_TOKEN_TYPE_PUB 0x20000000L |
|
431 #define SFTK_TOKEN_TYPE_KEY 0x30000000L |
|
432 /* certdb (high bit == 1) */ |
|
433 #define SFTK_TOKEN_TYPE_TRUST 0x40000000L |
|
434 #define SFTK_TOKEN_TYPE_CRL 0x50000000L |
|
435 #define SFTK_TOKEN_TYPE_SMIME 0x60000000L |
|
436 #define SFTK_TOKEN_TYPE_CERT 0x70000000L |
|
437 |
|
438 #define SFTK_TOKEN_KRL_HANDLE (SFTK_TOKEN_MAGIC|SFTK_TOKEN_TYPE_CRL|1) |
|
439 /* how big (in bytes) a password/pin we can deal with */ |
|
440 #define SFTK_MAX_PIN 255 |
|
441 /* minimum password/pin length (in Unicode characters) in FIPS mode */ |
|
442 #define FIPS_MIN_PIN 7 |
|
443 |
|
444 /* slot ID's */ |
|
445 #define NETSCAPE_SLOT_ID 1 |
|
446 #define PRIVATE_KEY_SLOT_ID 2 |
|
447 #define FIPS_SLOT_ID 3 |
|
448 |
|
449 /* slot helper macros */ |
|
450 #define sftk_SlotFromSession(sp) ((sp)->slot) |
|
451 #define sftk_isToken(id) (((id) & SFTK_TOKEN_MASK) == SFTK_TOKEN_MAGIC) |
|
452 |
|
453 /* the session hash multiplier (see bug 201081) */ |
|
454 #define SHMULTIPLIER 1791398085 |
|
455 |
|
456 /* queueing helper macros */ |
|
457 #define sftk_hash(value,size) \ |
|
458 ((PRUint32)((value) * SHMULTIPLIER) & (size-1)) |
|
459 #define sftkqueue_add(element,id,head,hash_size) \ |
|
460 { int tmp = sftk_hash(id,hash_size); \ |
|
461 (element)->next = (head)[tmp]; \ |
|
462 (element)->prev = NULL; \ |
|
463 if ((head)[tmp]) (head)[tmp]->prev = (element); \ |
|
464 (head)[tmp] = (element); } |
|
465 #define sftkqueue_find(element,id,head,hash_size) \ |
|
466 for( (element) = (head)[sftk_hash(id,hash_size)]; (element) != NULL; \ |
|
467 (element) = (element)->next) { \ |
|
468 if ((element)->handle == (id)) { break; } } |
|
469 #define sftkqueue_is_queued(element,id,head,hash_size) \ |
|
470 ( ((element)->next) || ((element)->prev) || \ |
|
471 ((head)[sftk_hash(id,hash_size)] == (element)) ) |
|
472 #define sftkqueue_delete(element,id,head,hash_size) \ |
|
473 if ((element)->next) (element)->next->prev = (element)->prev; \ |
|
474 if ((element)->prev) (element)->prev->next = (element)->next; \ |
|
475 else (head)[sftk_hash(id,hash_size)] = ((element)->next); \ |
|
476 (element)->next = NULL; \ |
|
477 (element)->prev = NULL; \ |
|
478 |
|
479 #define sftkqueue_init_element(element) \ |
|
480 (element)->prev = NULL; |
|
481 |
|
482 #define sftkqueue_add2(element, id, index, head) \ |
|
483 { \ |
|
484 (element)->next = (head)[index]; \ |
|
485 if ((head)[index]) \ |
|
486 (head)[index]->prev = (element); \ |
|
487 (head)[index] = (element); \ |
|
488 } |
|
489 |
|
490 #define sftkqueue_find2(element, id, index, head) \ |
|
491 for ( (element) = (head)[index]; \ |
|
492 (element) != NULL; \ |
|
493 (element) = (element)->next) { \ |
|
494 if ((element)->handle == (id)) { break; } \ |
|
495 } |
|
496 |
|
497 #define sftkqueue_delete2(element, id, index, head) \ |
|
498 if ((element)->next) (element)->next->prev = (element)->prev; \ |
|
499 if ((element)->prev) (element)->prev->next = (element)->next; \ |
|
500 else (head)[index] = ((element)->next); |
|
501 |
|
502 #define sftkqueue_clear_deleted_element(element) \ |
|
503 (element)->next = NULL; \ |
|
504 (element)->prev = NULL; \ |
|
505 |
|
506 |
|
507 /* sessionID (handle) is used to determine session lock bucket */ |
|
508 #ifdef NOSPREAD |
|
509 /* NOSPREAD: (ID>>L2LPB) & (perbucket-1) */ |
|
510 #define SFTK_SESSION_LOCK(slot,handle) \ |
|
511 ((slot)->sessionLock[((handle) >> LOG2_BUCKETS_PER_SESSION_LOCK) \ |
|
512 & (slot)->sessionLockMask]) |
|
513 #else |
|
514 /* SPREAD: ID & (perbucket-1) */ |
|
515 #define SFTK_SESSION_LOCK(slot,handle) \ |
|
516 ((slot)->sessionLock[(handle) & (slot)->sessionLockMask]) |
|
517 #endif |
|
518 |
|
519 /* expand an attribute & secitem structures out */ |
|
520 #define sftk_attr_expand(ap) (ap)->type,(ap)->pValue,(ap)->ulValueLen |
|
521 #define sftk_item_expand(ip) (ip)->data,(ip)->len |
|
522 |
|
523 typedef struct sftk_token_parametersStr { |
|
524 CK_SLOT_ID slotID; |
|
525 char *configdir; |
|
526 char *certPrefix; |
|
527 char *keyPrefix; |
|
528 char *updatedir; |
|
529 char *updCertPrefix; |
|
530 char *updKeyPrefix; |
|
531 char *updateID; |
|
532 char *tokdes; |
|
533 char *slotdes; |
|
534 char *updtokdes; |
|
535 int minPW; |
|
536 PRBool readOnly; |
|
537 PRBool noCertDB; |
|
538 PRBool noKeyDB; |
|
539 PRBool forceOpen; |
|
540 PRBool pwRequired; |
|
541 PRBool optimizeSpace; |
|
542 } sftk_token_parameters; |
|
543 |
|
544 typedef struct sftk_parametersStr { |
|
545 char *configdir; |
|
546 char *updatedir; |
|
547 char *updateID; |
|
548 char *secmodName; |
|
549 char *man; |
|
550 char *libdes; |
|
551 PRBool readOnly; |
|
552 PRBool noModDB; |
|
553 PRBool noCertDB; |
|
554 PRBool forceOpen; |
|
555 PRBool pwRequired; |
|
556 PRBool optimizeSpace; |
|
557 sftk_token_parameters *tokens; |
|
558 int token_count; |
|
559 } sftk_parameters; |
|
560 |
|
561 |
|
562 /* path stuff (was machine dependent) used by dbinit.c and pk11db.c */ |
|
563 #define CERT_DB_FMT "%scert%s.db" |
|
564 #define KEY_DB_FMT "%skey%s.db" |
|
565 |
|
566 SEC_BEGIN_PROTOS |
|
567 |
|
568 /* shared functions between pkcs11.c and fipstokn.c */ |
|
569 extern PRBool nsf_init; |
|
570 extern CK_RV nsc_CommonInitialize(CK_VOID_PTR pReserved, PRBool isFIPS); |
|
571 extern CK_RV nsc_CommonFinalize(CK_VOID_PTR pReserved, PRBool isFIPS); |
|
572 extern PRBool sftk_ForkReset(CK_VOID_PTR pReserved, CK_RV* crv); |
|
573 extern CK_RV nsc_CommonGetSlotList(CK_BBOOL tokPresent, |
|
574 CK_SLOT_ID_PTR pSlotList, CK_ULONG_PTR pulCount, int moduleIndex); |
|
575 |
|
576 /* slot initialization, reinit, shutdown and destruction */ |
|
577 extern CK_RV SFTK_SlotInit(char *configdir, char *updatedir, char *updateID, |
|
578 sftk_token_parameters *params, int moduleIndex); |
|
579 extern CK_RV SFTK_SlotReInit(SFTKSlot *slot, char *configdir, |
|
580 char *updatedir, char *updateID, |
|
581 sftk_token_parameters *params, int moduleIndex); |
|
582 extern CK_RV SFTK_DestroySlotData(SFTKSlot *slot); |
|
583 extern CK_RV SFTK_ShutdownSlot(SFTKSlot *slot); |
|
584 extern CK_RV sftk_CloseAllSessions(SFTKSlot *slot, PRBool logout); |
|
585 |
|
586 |
|
587 /* internal utility functions used by pkcs11.c */ |
|
588 extern SFTKAttribute *sftk_FindAttribute(SFTKObject *object, |
|
589 CK_ATTRIBUTE_TYPE type); |
|
590 extern void sftk_FreeAttribute(SFTKAttribute *attribute); |
|
591 extern CK_RV sftk_AddAttributeType(SFTKObject *object, CK_ATTRIBUTE_TYPE type, |
|
592 const void *valPtr, CK_ULONG length); |
|
593 extern CK_RV sftk_Attribute2SecItem(PLArenaPool *arena, SECItem *item, |
|
594 SFTKObject *object, CK_ATTRIBUTE_TYPE type); |
|
595 extern CK_RV sftk_MultipleAttribute2SecItem(PLArenaPool *arena, |
|
596 SFTKObject *object, SFTKItemTemplate *templ, int count); |
|
597 extern unsigned int sftk_GetLengthInBits(unsigned char *buf, |
|
598 unsigned int bufLen); |
|
599 extern CK_RV sftk_ConstrainAttribute(SFTKObject *object, |
|
600 CK_ATTRIBUTE_TYPE type, int minLength, int maxLength, int minMultiple); |
|
601 extern PRBool sftk_hasAttribute(SFTKObject *object, CK_ATTRIBUTE_TYPE type); |
|
602 extern PRBool sftk_isTrue(SFTKObject *object, CK_ATTRIBUTE_TYPE type); |
|
603 extern void sftk_DeleteAttributeType(SFTKObject *object, |
|
604 CK_ATTRIBUTE_TYPE type); |
|
605 extern CK_RV sftk_Attribute2SecItem(PLArenaPool *arena, SECItem *item, |
|
606 SFTKObject *object, CK_ATTRIBUTE_TYPE type); |
|
607 extern CK_RV sftk_Attribute2SSecItem(PLArenaPool *arena, SECItem *item, |
|
608 SFTKObject *object, |
|
609 CK_ATTRIBUTE_TYPE type); |
|
610 extern SFTKModifyType sftk_modifyType(CK_ATTRIBUTE_TYPE type, |
|
611 CK_OBJECT_CLASS inClass); |
|
612 extern PRBool sftk_isSensitive(CK_ATTRIBUTE_TYPE type, CK_OBJECT_CLASS inClass); |
|
613 extern char *sftk_getString(SFTKObject *object, CK_ATTRIBUTE_TYPE type); |
|
614 extern void sftk_nullAttribute(SFTKObject *object,CK_ATTRIBUTE_TYPE type); |
|
615 extern CK_RV sftk_GetULongAttribute(SFTKObject *object, CK_ATTRIBUTE_TYPE type, |
|
616 CK_ULONG *longData); |
|
617 extern CK_RV sftk_forceAttribute(SFTKObject *object, CK_ATTRIBUTE_TYPE type, |
|
618 const void *value, unsigned int len); |
|
619 extern CK_RV sftk_defaultAttribute(SFTKObject *object, CK_ATTRIBUTE_TYPE type, |
|
620 const void *value, unsigned int len); |
|
621 extern unsigned int sftk_MapTrust(CK_TRUST trust, PRBool clientAuth); |
|
622 |
|
623 extern SFTKObject *sftk_NewObject(SFTKSlot *slot); |
|
624 extern CK_RV sftk_CopyObject(SFTKObject *destObject, SFTKObject *srcObject); |
|
625 extern SFTKFreeStatus sftk_FreeObject(SFTKObject *object); |
|
626 extern CK_RV sftk_DeleteObject(SFTKSession *session, SFTKObject *object); |
|
627 extern void sftk_ReferenceObject(SFTKObject *object); |
|
628 extern SFTKObject *sftk_ObjectFromHandle(CK_OBJECT_HANDLE handle, |
|
629 SFTKSession *session); |
|
630 extern void sftk_AddSlotObject(SFTKSlot *slot, SFTKObject *object); |
|
631 extern void sftk_AddObject(SFTKSession *session, SFTKObject *object); |
|
632 /* clear out all the existing object ID to database key mappings. |
|
633 * used to reinit a token */ |
|
634 extern CK_RV SFTK_ClearTokenKeyHashTable(SFTKSlot *slot); |
|
635 |
|
636 extern CK_RV sftk_searchObjectList(SFTKSearchResults *search, |
|
637 SFTKObject **head, unsigned int size, |
|
638 PZLock *lock, CK_ATTRIBUTE_PTR inTemplate, |
|
639 int count, PRBool isLoggedIn); |
|
640 extern SFTKObjectListElement *sftk_FreeObjectListElement( |
|
641 SFTKObjectListElement *objectList); |
|
642 extern void sftk_FreeObjectList(SFTKObjectListElement *objectList); |
|
643 extern void sftk_FreeSearch(SFTKSearchResults *search); |
|
644 extern CK_RV sftk_handleObject(SFTKObject *object, SFTKSession *session); |
|
645 |
|
646 extern SFTKSlot *sftk_SlotFromID(CK_SLOT_ID slotID, PRBool all); |
|
647 extern SFTKSlot *sftk_SlotFromSessionHandle(CK_SESSION_HANDLE handle); |
|
648 extern SFTKSession *sftk_SessionFromHandle(CK_SESSION_HANDLE handle); |
|
649 extern void sftk_FreeSession(SFTKSession *session); |
|
650 extern SFTKSession *sftk_NewSession(CK_SLOT_ID slotID, CK_NOTIFY notify, |
|
651 CK_VOID_PTR pApplication, CK_FLAGS flags); |
|
652 extern void sftk_update_state(SFTKSlot *slot,SFTKSession *session); |
|
653 extern void sftk_update_all_states(SFTKSlot *slot); |
|
654 extern void sftk_FreeContext(SFTKSessionContext *context); |
|
655 extern void sftk_InitFreeLists(void); |
|
656 extern void sftk_CleanupFreeLists(void); |
|
657 |
|
658 extern NSSLOWKEYPublicKey *sftk_GetPubKey(SFTKObject *object, |
|
659 CK_KEY_TYPE key_type, CK_RV *crvp); |
|
660 extern NSSLOWKEYPrivateKey *sftk_GetPrivKey(SFTKObject *object, |
|
661 CK_KEY_TYPE key_type, CK_RV *crvp); |
|
662 extern void sftk_FormatDESKey(unsigned char *key, int length); |
|
663 extern PRBool sftk_CheckDESKey(unsigned char *key); |
|
664 extern PRBool sftk_IsWeakKey(unsigned char *key,CK_KEY_TYPE key_type); |
|
665 |
|
666 /* mechanism allows this operation */ |
|
667 extern CK_RV sftk_MechAllowsOperation(CK_MECHANISM_TYPE type, CK_ATTRIBUTE_TYPE op); |
|
668 |
|
669 /* helper function which calls nsslowkey_FindKeyByPublicKey after safely |
|
670 * acquiring a reference to the keydb from the slot */ |
|
671 NSSLOWKEYPrivateKey *sftk_FindKeyByPublicKey(SFTKSlot *slot, SECItem *dbKey); |
|
672 |
|
673 /* |
|
674 * parameter parsing functions |
|
675 */ |
|
676 CK_RV sftk_parseParameters(char *param, sftk_parameters *parsed, PRBool isFIPS); |
|
677 void sftk_freeParams(sftk_parameters *params); |
|
678 |
|
679 |
|
680 /* |
|
681 * narrow objects |
|
682 */ |
|
683 SFTKSessionObject * sftk_narrowToSessionObject(SFTKObject *); |
|
684 SFTKTokenObject * sftk_narrowToTokenObject(SFTKObject *); |
|
685 |
|
686 /* |
|
687 * token object utilities |
|
688 */ |
|
689 void sftk_addHandle(SFTKSearchResults *search, CK_OBJECT_HANDLE handle); |
|
690 PRBool sftk_poisonHandle(SFTKSlot *slot, SECItem *dbkey, |
|
691 CK_OBJECT_HANDLE handle); |
|
692 SFTKObject * sftk_NewTokenObject(SFTKSlot *slot, SECItem *dbKey, |
|
693 CK_OBJECT_HANDLE handle); |
|
694 SFTKTokenObject *sftk_convertSessionToToken(SFTKObject *so); |
|
695 |
|
696 |
|
697 /* J-PAKE (jpakesftk.c) */ |
|
698 extern |
|
699 CK_RV jpake_Round1(HASH_HashType hashType, |
|
700 CK_NSS_JPAKERound1Params * params, |
|
701 SFTKObject * key); |
|
702 extern |
|
703 CK_RV jpake_Round2(HASH_HashType hashType, |
|
704 CK_NSS_JPAKERound2Params * params, |
|
705 SFTKObject * sourceKey, SFTKObject * key); |
|
706 extern |
|
707 CK_RV jpake_Final(HASH_HashType hashType, |
|
708 const CK_NSS_JPAKEFinalParams * params, |
|
709 SFTKObject * sourceKey, SFTKObject * key); |
|
710 |
|
711 /* Constant time MAC functions (hmacct.c) */ |
|
712 |
|
713 struct sftk_MACConstantTimeCtxStr { |
|
714 const SECHashObject *hash; |
|
715 unsigned char mac[64]; |
|
716 unsigned char secret[64]; |
|
717 unsigned int headerLength; |
|
718 unsigned int secretLength; |
|
719 unsigned int totalLength; |
|
720 unsigned char header[75]; |
|
721 }; |
|
722 typedef struct sftk_MACConstantTimeCtxStr sftk_MACConstantTimeCtx; |
|
723 sftk_MACConstantTimeCtx* sftk_HMACConstantTime_New( |
|
724 CK_MECHANISM_PTR mech, SFTKObject *key); |
|
725 sftk_MACConstantTimeCtx* sftk_SSLv3MACConstantTime_New( |
|
726 CK_MECHANISM_PTR mech, SFTKObject *key); |
|
727 void sftk_HMACConstantTime_Update(void *pctx, void *data, unsigned int len); |
|
728 void sftk_SSLv3MACConstantTime_Update(void *pctx, void *data, unsigned int len); |
|
729 void sftk_MACConstantTime_EndHash( |
|
730 void *pctx, void *out, unsigned int *outLength, unsigned int maxLength); |
|
731 void sftk_MACConstantTime_DestroyContext(void *pctx, PRBool); |
|
732 |
|
733 /**************************************** |
|
734 * implement TLS Pseudo Random Function (PRF) |
|
735 */ |
|
736 |
|
737 extern CK_RV |
|
738 sftk_TLSPRFInit(SFTKSessionContext *context, |
|
739 SFTKObject * key, |
|
740 CK_KEY_TYPE key_type, |
|
741 HASH_HashType hash_alg); |
|
742 |
|
743 SEC_END_PROTOS |
|
744 |
|
745 #endif /* _PKCS11I_H_ */ |