|
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 * This is a very trivial program I wrote for testing out a |
|
7 * couple data-only Cryptoki modules for NSS. It's not a "real" |
|
8 * test program that prints out nice "PASS" or "FAIL" messages; |
|
9 * it just makes calls and dumps data. |
|
10 */ |
|
11 |
|
12 #include "config.h" |
|
13 |
|
14 #ifdef HAVE_NSPR_H |
|
15 #include "nspr.h" |
|
16 #else |
|
17 #error "NSPR is required." |
|
18 #endif |
|
19 |
|
20 #ifdef WITH_NSS |
|
21 #define FGMR 1 |
|
22 #include "ck.h" |
|
23 #else |
|
24 #include "pkcs11t.h" |
|
25 #include "pkcs11.h" |
|
26 #endif |
|
27 |
|
28 /* The RSA versions are sloppier with namespaces */ |
|
29 #ifndef CK_TRUE |
|
30 #define CK_TRUE TRUE |
|
31 #endif |
|
32 |
|
33 #ifndef CK_FALSE |
|
34 #define CK_FALSE FALSE |
|
35 #endif |
|
36 |
|
37 int |
|
38 rmain |
|
39 ( |
|
40 int argc, |
|
41 char *argv[] |
|
42 ); |
|
43 |
|
44 int |
|
45 main |
|
46 ( |
|
47 int argc, |
|
48 char *argv[] |
|
49 ) |
|
50 { |
|
51 int rv = 0; |
|
52 |
|
53 PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 14); |
|
54 rv = rmain(argc, argv); |
|
55 PR_Cleanup(); |
|
56 |
|
57 return rv; |
|
58 } |
|
59 |
|
60 static CK_ATTRIBUTE_TYPE all_known_attribute_types[] = { |
|
61 CKA_CLASS, |
|
62 CKA_TOKEN, |
|
63 CKA_PRIVATE, |
|
64 CKA_LABEL, |
|
65 CKA_APPLICATION, |
|
66 CKA_VALUE, |
|
67 CKA_CERTIFICATE_TYPE, |
|
68 CKA_ISSUER, |
|
69 CKA_SERIAL_NUMBER, |
|
70 CKA_KEY_TYPE, |
|
71 CKA_SUBJECT, |
|
72 CKA_ID, |
|
73 CKA_SENSITIVE, |
|
74 CKA_ENCRYPT, |
|
75 CKA_DECRYPT, |
|
76 CKA_WRAP, |
|
77 CKA_UNWRAP, |
|
78 CKA_SIGN, |
|
79 CKA_SIGN_RECOVER, |
|
80 CKA_VERIFY, |
|
81 CKA_VERIFY_RECOVER, |
|
82 CKA_DERIVE, |
|
83 CKA_START_DATE, |
|
84 CKA_END_DATE, |
|
85 CKA_MODULUS, |
|
86 CKA_MODULUS_BITS, |
|
87 CKA_PUBLIC_EXPONENT, |
|
88 CKA_PRIVATE_EXPONENT, |
|
89 CKA_PRIME_1, |
|
90 CKA_PRIME_2, |
|
91 CKA_EXPONENT_1, |
|
92 CKA_EXPONENT_2, |
|
93 CKA_COEFFICIENT, |
|
94 CKA_PRIME, |
|
95 CKA_SUBPRIME, |
|
96 CKA_BASE, |
|
97 CKA_VALUE_BITS, |
|
98 CKA_VALUE_LEN, |
|
99 CKA_EXTRACTABLE, |
|
100 CKA_LOCAL, |
|
101 CKA_NEVER_EXTRACTABLE, |
|
102 CKA_ALWAYS_SENSITIVE, |
|
103 CKA_MODIFIABLE, |
|
104 #ifdef CKA_NETSCAPE |
|
105 CKA_NETSCAPE_URL, |
|
106 CKA_NETSCAPE_EMAIL, |
|
107 CKA_NETSCAPE_SMIME_INFO, |
|
108 CKA_NETSCAPE_SMIME_TIMESTAMP, |
|
109 CKA_NETSCAPE_PKCS8_SALT, |
|
110 CKA_NETSCAPE_PASSWORD_CHECK, |
|
111 CKA_NETSCAPE_EXPIRES, |
|
112 #endif /* CKA_NETSCAPE */ |
|
113 #ifdef CKA_TRUST |
|
114 CKA_TRUST_DIGITAL_SIGNATURE, |
|
115 CKA_TRUST_NON_REPUDIATION, |
|
116 CKA_TRUST_KEY_ENCIPHERMENT, |
|
117 CKA_TRUST_DATA_ENCIPHERMENT, |
|
118 CKA_TRUST_KEY_AGREEMENT, |
|
119 CKA_TRUST_KEY_CERT_SIGN, |
|
120 CKA_TRUST_CRL_SIGN, |
|
121 CKA_TRUST_SERVER_AUTH, |
|
122 CKA_TRUST_CLIENT_AUTH, |
|
123 CKA_TRUST_CODE_SIGNING, |
|
124 CKA_TRUST_EMAIL_PROTECTION, |
|
125 CKA_TRUST_IPSEC_END_SYSTEM, |
|
126 CKA_TRUST_IPSEC_TUNNEL, |
|
127 CKA_TRUST_IPSEC_USER, |
|
128 CKA_TRUST_TIME_STAMPING, |
|
129 #endif /* CKA_TRUST */ |
|
130 }; |
|
131 |
|
132 static number_of_all_known_attribute_types = |
|
133 (sizeof(all_known_attribute_types)/sizeof(all_known_attribute_types[0])); |
|
134 |
|
135 int |
|
136 usage |
|
137 ( |
|
138 char *argv0 |
|
139 ) |
|
140 { |
|
141 PR_fprintf(PR_STDERR, "Usage: %s [-i {string|--}] <library>.so\n", argv0); |
|
142 return 1; |
|
143 } |
|
144 |
|
145 int |
|
146 rmain |
|
147 ( |
|
148 int argc, |
|
149 char *argv[] |
|
150 ) |
|
151 { |
|
152 char *argv0 = argv[0]; |
|
153 PRLibrary *lib; |
|
154 CK_C_GetFunctionList gfl; |
|
155 CK_FUNCTION_LIST_PTR epv = (CK_FUNCTION_LIST_PTR)NULL; |
|
156 CK_RV ck_rv; |
|
157 CK_INFO info; |
|
158 CK_ULONG nSlots; |
|
159 CK_SLOT_ID *pSlots; |
|
160 CK_ULONG i; |
|
161 CK_C_INITIALIZE_ARGS ia, *iap; |
|
162 |
|
163 (void)memset(&ia, 0, sizeof(CK_C_INITIALIZE_ARGS)); |
|
164 iap = (CK_C_INITIALIZE_ARGS *)NULL; |
|
165 while( argv++, --argc ) { |
|
166 if( '-' == argv[0][0] ) { |
|
167 switch( argv[0][1] ) { |
|
168 case 'i': |
|
169 iap = &ia; |
|
170 if( ((char *)NULL != argv[1]) && ('-' != argv[1][0]) ) { |
|
171 #ifdef WITH_NSS |
|
172 ia.pConfig = argv[1]; |
|
173 ia.ulConfigLen = strlen(argv[1]); |
|
174 argv++, --argc; |
|
175 #else |
|
176 return usage(argv0); |
|
177 #endif /* WITH_NSS */ |
|
178 } |
|
179 break; |
|
180 case '-': |
|
181 argv++, --argc; |
|
182 goto endargs; |
|
183 default: |
|
184 return usage(argv0); |
|
185 } |
|
186 } else { |
|
187 break; |
|
188 } |
|
189 } |
|
190 endargs:; |
|
191 |
|
192 if( 1 != argc ) { |
|
193 return usage(argv0); |
|
194 } |
|
195 |
|
196 lib = PR_LoadLibrary(argv[0]); |
|
197 if( (PRLibrary *)NULL == lib ) { |
|
198 PR_fprintf(PR_STDERR, "Can't load %s: %ld, %ld\n", argv[1], PR_GetError(), PR_GetOSError()); |
|
199 return 1; |
|
200 } |
|
201 |
|
202 gfl = (CK_C_GetFunctionList)PR_FindSymbol(lib, "C_GetFunctionList"); |
|
203 if( (CK_C_GetFunctionList)NULL == gfl ) { |
|
204 PR_fprintf(PR_STDERR, "Can't find C_GetFunctionList in %s: %ld, %ld\n", argv[1], |
|
205 PR_GetError(), PR_GetOSError()); |
|
206 return 1; |
|
207 } |
|
208 |
|
209 ck_rv = (*gfl)(&epv); |
|
210 if( CKR_OK != ck_rv ) { |
|
211 PR_fprintf(PR_STDERR, "CK_GetFunctionList returned 0x%08x\n", ck_rv); |
|
212 return 1; |
|
213 } |
|
214 |
|
215 PR_fprintf(PR_STDOUT, "Module %s loaded, epv = 0x%08x.\n\n", argv[1], (CK_ULONG)epv); |
|
216 |
|
217 /* C_Initialize */ |
|
218 ck_rv = epv->C_Initialize(iap); |
|
219 if( CKR_OK != ck_rv ) { |
|
220 PR_fprintf(PR_STDERR, "C_Initialize returned 0x%08x\n", ck_rv); |
|
221 return 1; |
|
222 } |
|
223 |
|
224 /* C_GetInfo */ |
|
225 (void)memset(&info, 0, sizeof(CK_INFO)); |
|
226 ck_rv = epv->C_GetInfo(&info); |
|
227 if( CKR_OK != ck_rv ) { |
|
228 PR_fprintf(PR_STDERR, "C_GetInfo returned 0x%08x\n", ck_rv); |
|
229 return 1; |
|
230 } |
|
231 |
|
232 PR_fprintf(PR_STDOUT, "Module Info:\n"); |
|
233 PR_fprintf(PR_STDOUT, " cryptokiVersion = %lu.%02lu\n", |
|
234 (PRUint32)info.cryptokiVersion.major, (PRUint32)info.cryptokiVersion.minor); |
|
235 PR_fprintf(PR_STDOUT, " manufacturerID = \"%.32s\"\n", info.manufacturerID); |
|
236 PR_fprintf(PR_STDOUT, " flags = 0x%08lx\n", info.flags); |
|
237 PR_fprintf(PR_STDOUT, " libraryDescription = \"%.32s\"\n", info.libraryDescription); |
|
238 PR_fprintf(PR_STDOUT, " libraryVersion = %lu.%02lu\n", |
|
239 (PRUint32)info.libraryVersion.major, (PRUint32)info.libraryVersion.minor); |
|
240 PR_fprintf(PR_STDOUT, "\n"); |
|
241 |
|
242 /* C_GetSlotList */ |
|
243 nSlots = 0; |
|
244 ck_rv = epv->C_GetSlotList(CK_FALSE, (CK_SLOT_ID_PTR)CK_NULL_PTR, &nSlots); |
|
245 switch( ck_rv ) { |
|
246 case CKR_BUFFER_TOO_SMALL: |
|
247 case CKR_OK: |
|
248 break; |
|
249 default: |
|
250 PR_fprintf(PR_STDERR, "C_GetSlotList(FALSE, NULL, ) returned 0x%08x\n", ck_rv); |
|
251 return 1; |
|
252 } |
|
253 |
|
254 PR_fprintf(PR_STDOUT, "There are %lu slots.\n", nSlots); |
|
255 |
|
256 pSlots = (CK_SLOT_ID_PTR)PR_Calloc(nSlots, sizeof(CK_SLOT_ID)); |
|
257 if( (CK_SLOT_ID_PTR)NULL == pSlots ) { |
|
258 PR_fprintf(PR_STDERR, "[memory allocation of %lu bytes failed]\n", nSlots * sizeof(CK_SLOT_ID)); |
|
259 return 1; |
|
260 } |
|
261 |
|
262 ck_rv = epv->C_GetSlotList(CK_FALSE, pSlots, &nSlots); |
|
263 if( CKR_OK != ck_rv ) { |
|
264 PR_fprintf(PR_STDERR, "C_GetSlotList(FALSE, , ) returned 0x%08x\n", ck_rv); |
|
265 return 1; |
|
266 } |
|
267 |
|
268 for( i = 0; i < nSlots; i++ ) { |
|
269 PR_fprintf(PR_STDOUT, " [%lu]: CK_SLOT_ID = %lu\n", (i+1), pSlots[i]); |
|
270 } |
|
271 |
|
272 PR_fprintf(PR_STDOUT, "\n"); |
|
273 |
|
274 /* C_GetSlotInfo */ |
|
275 for( i = 0; i < nSlots; i++ ) { |
|
276 CK_SLOT_INFO sinfo; |
|
277 |
|
278 PR_fprintf(PR_STDOUT, "[%lu]: CK_SLOT_ID = %lu\n", (i+1), pSlots[i]); |
|
279 |
|
280 (void)memset(&sinfo, 0, sizeof(CK_SLOT_INFO)); |
|
281 ck_rv = epv->C_GetSlotInfo(pSlots[i], &sinfo); |
|
282 if( CKR_OK != ck_rv ) { |
|
283 PR_fprintf(PR_STDERR, "C_GetSlotInfo(%lu, ) returned 0x%08x\n", pSlots[i], ck_rv); |
|
284 return 1; |
|
285 } |
|
286 |
|
287 PR_fprintf(PR_STDOUT, " Slot Info:\n"); |
|
288 PR_fprintf(PR_STDOUT, " slotDescription = \"%.64s\"\n", sinfo.slotDescription); |
|
289 PR_fprintf(PR_STDOUT, " manufacturerID = \"%.32s\"\n", sinfo.manufacturerID); |
|
290 PR_fprintf(PR_STDOUT, " flags = 0x%08lx\n", sinfo.flags); |
|
291 PR_fprintf(PR_STDOUT, " -> TOKEN PRESENT = %s\n", |
|
292 sinfo.flags & CKF_TOKEN_PRESENT ? "TRUE" : "FALSE"); |
|
293 PR_fprintf(PR_STDOUT, " -> REMOVABLE DEVICE = %s\n", |
|
294 sinfo.flags & CKF_REMOVABLE_DEVICE ? "TRUE" : "FALSE"); |
|
295 PR_fprintf(PR_STDOUT, " -> HW SLOT = %s\n", |
|
296 sinfo.flags & CKF_HW_SLOT ? "TRUE" : "FALSE"); |
|
297 PR_fprintf(PR_STDOUT, " hardwareVersion = %lu.%02lu\n", |
|
298 (PRUint32)sinfo.hardwareVersion.major, (PRUint32)sinfo.hardwareVersion.minor); |
|
299 PR_fprintf(PR_STDOUT, " firmwareVersion = %lu.%02lu\n", |
|
300 (PRUint32)sinfo.firmwareVersion.major, (PRUint32)sinfo.firmwareVersion.minor); |
|
301 |
|
302 if( sinfo.flags & CKF_TOKEN_PRESENT ) { |
|
303 CK_TOKEN_INFO tinfo; |
|
304 CK_MECHANISM_TYPE *pMechanismList; |
|
305 CK_ULONG nMechanisms = 0; |
|
306 CK_ULONG j; |
|
307 |
|
308 (void)memset(&tinfo, 0, sizeof(CK_TOKEN_INFO)); |
|
309 ck_rv = epv->C_GetTokenInfo(pSlots[i], &tinfo); |
|
310 if( CKR_OK != ck_rv ) { |
|
311 PR_fprintf(PR_STDERR, "C_GetTokenInfo(%lu, ) returned 0x%08x\n", pSlots[i], ck_rv); |
|
312 return 1; |
|
313 } |
|
314 |
|
315 PR_fprintf(PR_STDOUT, " Token Info:\n"); |
|
316 PR_fprintf(PR_STDOUT, " label = \"%.32s\"\n", tinfo.label); |
|
317 PR_fprintf(PR_STDOUT, " manufacturerID = \"%.32s\"\n", tinfo.manufacturerID); |
|
318 PR_fprintf(PR_STDOUT, " model = \"%.16s\"\n", tinfo.model); |
|
319 PR_fprintf(PR_STDOUT, " serialNumber = \"%.16s\"\n", tinfo.serialNumber); |
|
320 PR_fprintf(PR_STDOUT, " flags = 0x%08lx\n", tinfo.flags); |
|
321 PR_fprintf(PR_STDOUT, " -> RNG = %s\n", |
|
322 tinfo.flags & CKF_RNG ? "TRUE" : "FALSE"); |
|
323 PR_fprintf(PR_STDOUT, " -> WRITE PROTECTED = %s\n", |
|
324 tinfo.flags & CKF_WRITE_PROTECTED ? "TRUE" : "FALSE"); |
|
325 PR_fprintf(PR_STDOUT, " -> LOGIN REQUIRED = %s\n", |
|
326 tinfo.flags & CKF_LOGIN_REQUIRED ? "TRUE" : "FALSE"); |
|
327 PR_fprintf(PR_STDOUT, " -> USER PIN INITIALIZED = %s\n", |
|
328 tinfo.flags & CKF_USER_PIN_INITIALIZED ? "TRUE" : "FALSE"); |
|
329 PR_fprintf(PR_STDOUT, " -> RESTORE KEY NOT NEEDED = %s\n", |
|
330 tinfo.flags & CKF_RESTORE_KEY_NOT_NEEDED ? "TRUE" : "FALSE"); |
|
331 PR_fprintf(PR_STDOUT, " -> CLOCK ON TOKEN = %s\n", |
|
332 tinfo.flags & CKF_CLOCK_ON_TOKEN ? "TRUE" : "FALSE"); |
|
333 #ifdef CKF_SUPPORTS_PARALLEL |
|
334 PR_fprintf(PR_STDOUT, " -> SUPPORTS PARALLEL = %s\n", |
|
335 tinfo.flags & CKF_SUPPORTS_PARALLEL ? "TRUE" : "FALSE"); |
|
336 #endif /* CKF_SUPPORTS_PARALLEL */ |
|
337 PR_fprintf(PR_STDOUT, " -> PROTECTED AUTHENTICATION PATH = %s\n", |
|
338 tinfo.flags & CKF_PROTECTED_AUTHENTICATION_PATH ? "TRUE" : "FALSE"); |
|
339 PR_fprintf(PR_STDOUT, " -> DUAL_CRYPTO_OPERATIONS = %s\n", |
|
340 tinfo.flags & CKF_DUAL_CRYPTO_OPERATIONS ? "TRUE" : "FALSE"); |
|
341 PR_fprintf(PR_STDOUT, " ulMaxSessionCount = %lu\n", tinfo.ulMaxSessionCount); |
|
342 PR_fprintf(PR_STDOUT, " ulSessionCount = %lu\n", tinfo.ulSessionCount); |
|
343 PR_fprintf(PR_STDOUT, " ulMaxRwSessionCount = %lu\n", tinfo.ulMaxRwSessionCount); |
|
344 PR_fprintf(PR_STDOUT, " ulRwSessionCount = %lu\n", tinfo.ulRwSessionCount); |
|
345 PR_fprintf(PR_STDOUT, " ulMaxPinLen = %lu\n", tinfo.ulMaxPinLen); |
|
346 PR_fprintf(PR_STDOUT, " ulMinPinLen = %lu\n", tinfo.ulMinPinLen); |
|
347 PR_fprintf(PR_STDOUT, " ulTotalPublicMemory = %lu\n", tinfo.ulTotalPublicMemory); |
|
348 PR_fprintf(PR_STDOUT, " ulFreePublicMemory = %lu\n", tinfo.ulFreePublicMemory); |
|
349 PR_fprintf(PR_STDOUT, " ulTotalPrivateMemory = %lu\n", tinfo.ulTotalPrivateMemory); |
|
350 PR_fprintf(PR_STDOUT, " ulFreePrivateMemory = %lu\n", tinfo.ulFreePrivateMemory); |
|
351 PR_fprintf(PR_STDOUT, " hardwareVersion = %lu.%02lu\n", |
|
352 (PRUint32)tinfo.hardwareVersion.major, (PRUint32)tinfo.hardwareVersion.minor); |
|
353 PR_fprintf(PR_STDOUT, " firmwareVersion = %lu.%02lu\n", |
|
354 (PRUint32)tinfo.firmwareVersion.major, (PRUint32)tinfo.firmwareVersion.minor); |
|
355 PR_fprintf(PR_STDOUT, " utcTime = \"%.16s\"\n", tinfo.utcTime); |
|
356 |
|
357 |
|
358 ck_rv = epv->C_GetMechanismList(pSlots[i], (CK_MECHANISM_TYPE_PTR)CK_NULL_PTR, &nMechanisms); |
|
359 switch( ck_rv ) { |
|
360 case CKR_BUFFER_TOO_SMALL: |
|
361 case CKR_OK: |
|
362 break; |
|
363 default: |
|
364 PR_fprintf(PR_STDERR, "C_GetMechanismList(%lu, NULL, ) returned 0x%08x\n", pSlots[i], ck_rv); |
|
365 return 1; |
|
366 } |
|
367 |
|
368 PR_fprintf(PR_STDOUT, " %lu mechanisms:\n", nMechanisms); |
|
369 |
|
370 pMechanismList = (CK_MECHANISM_TYPE_PTR)PR_Calloc(nMechanisms, sizeof(CK_MECHANISM_TYPE)); |
|
371 if( (CK_MECHANISM_TYPE_PTR)NULL == pMechanismList ) { |
|
372 PR_fprintf(PR_STDERR, "[memory allocation of %lu bytes failed]\n", |
|
373 nMechanisms * sizeof(CK_MECHANISM_TYPE)); |
|
374 return 1; |
|
375 } |
|
376 |
|
377 ck_rv = epv->C_GetMechanismList(pSlots[i], pMechanismList, &nMechanisms); |
|
378 if( CKR_OK != ck_rv ) { |
|
379 PR_fprintf(PR_STDERR, "C_GetMechanismList(%lu, , ) returned 0x%08x\n", pSlots[i], ck_rv); |
|
380 return 1; |
|
381 } |
|
382 |
|
383 for( j = 0; j < nMechanisms; j++ ) { |
|
384 PR_fprintf(PR_STDOUT, " {%lu}: CK_MECHANISM_TYPE = %lu\n", (j+1), pMechanismList[j]); |
|
385 } |
|
386 |
|
387 PR_fprintf(PR_STDOUT, "\n"); |
|
388 |
|
389 for( j = 0; j < nMechanisms; j++ ) { |
|
390 CK_MECHANISM_INFO minfo; |
|
391 |
|
392 (void)memset(&minfo, 0, sizeof(CK_MECHANISM_INFO)); |
|
393 ck_rv = epv->C_GetMechanismInfo(pSlots[i], pMechanismList[j], &minfo); |
|
394 if( CKR_OK != ck_rv ) { |
|
395 PR_fprintf(PR_STDERR, "C_GetMechanismInfo(%lu, %lu, ) returned 0x%08x\n", pSlots[i], |
|
396 pMechanismList[j]); |
|
397 return 1; |
|
398 } |
|
399 |
|
400 PR_fprintf(PR_STDOUT, " [%lu]: CK_MECHANISM_TYPE = %lu\n", (j+1), pMechanismList[j]); |
|
401 PR_fprintf(PR_STDOUT, " ulMinKeySize = %lu\n", minfo.ulMinKeySize); |
|
402 PR_fprintf(PR_STDOUT, " ulMaxKeySize = %lu\n", minfo.ulMaxKeySize); |
|
403 PR_fprintf(PR_STDOUT, " flags = 0x%08x\n", minfo.flags); |
|
404 PR_fprintf(PR_STDOUT, " -> HW = %s\n", minfo.flags & CKF_HW ? "TRUE" : "FALSE"); |
|
405 PR_fprintf(PR_STDOUT, " -> ENCRYPT = %s\n", minfo.flags & CKF_ENCRYPT ? "TRUE" : "FALSE"); |
|
406 PR_fprintf(PR_STDOUT, " -> DECRYPT = %s\n", minfo.flags & CKF_DECRYPT ? "TRUE" : "FALSE"); |
|
407 PR_fprintf(PR_STDOUT, " -> DIGEST = %s\n", minfo.flags & CKF_DIGEST ? "TRUE" : "FALSE"); |
|
408 PR_fprintf(PR_STDOUT, " -> SIGN = %s\n", minfo.flags & CKF_SIGN ? "TRUE" : "FALSE"); |
|
409 PR_fprintf(PR_STDOUT, " -> SIGN_RECOVER = %s\n", minfo.flags & CKF_SIGN_RECOVER ? "TRUE" : "FALSE"); |
|
410 PR_fprintf(PR_STDOUT, " -> VERIFY = %s\n", minfo.flags & CKF_VERIFY ? "TRUE" : "FALSE"); |
|
411 PR_fprintf(PR_STDOUT, " -> VERIFY_RECOVER = %s\n", minfo.flags & CKF_VERIFY_RECOVER ? "TRUE" : "FALSE"); |
|
412 PR_fprintf(PR_STDOUT, " -> GENERATE = %s\n", minfo.flags & CKF_GENERATE ? "TRUE" : "FALSE"); |
|
413 PR_fprintf(PR_STDOUT, " -> GENERATE_KEY_PAIR = %s\n", minfo.flags & CKF_GENERATE_KEY_PAIR ? "TRUE" : "FALSE"); |
|
414 PR_fprintf(PR_STDOUT, " -> WRAP = %s\n", minfo.flags & CKF_WRAP ? "TRUE" : "FALSE"); |
|
415 PR_fprintf(PR_STDOUT, " -> UNWRAP = %s\n", minfo.flags & CKF_UNWRAP ? "TRUE" : "FALSE"); |
|
416 PR_fprintf(PR_STDOUT, " -> DERIVE = %s\n", minfo.flags & CKF_DERIVE ? "TRUE" : "FALSE"); |
|
417 PR_fprintf(PR_STDOUT, " -> EXTENSION = %s\n", minfo.flags & CKF_EXTENSION ? "TRUE" : "FALSE"); |
|
418 |
|
419 PR_fprintf(PR_STDOUT, "\n"); |
|
420 } |
|
421 |
|
422 if( tinfo.flags & CKF_LOGIN_REQUIRED ) { |
|
423 PR_fprintf(PR_STDERR, "*** LOGIN REQUIRED but not yet implemented ***\n"); |
|
424 /* all the stuff about logging in as SO and setting the user pin if needed, etc. */ |
|
425 return 2; |
|
426 } |
|
427 |
|
428 /* session to find objects */ |
|
429 { |
|
430 CK_SESSION_HANDLE h = (CK_SESSION_HANDLE)0; |
|
431 CK_SESSION_INFO sinfo; |
|
432 CK_ATTRIBUTE_PTR pTemplate; |
|
433 CK_ULONG tnObjects = 0; |
|
434 |
|
435 ck_rv = epv->C_OpenSession(pSlots[i], CKF_SERIAL_SESSION, (CK_VOID_PTR)CK_NULL_PTR, (CK_NOTIFY)CK_NULL_PTR, &h); |
|
436 if( CKR_OK != ck_rv ) { |
|
437 PR_fprintf(PR_STDERR, "C_OpenSession(%lu, CKF_SERIAL_SESSION, , ) returned 0x%08x\n", pSlots[i], ck_rv); |
|
438 return 1; |
|
439 } |
|
440 |
|
441 PR_fprintf(PR_STDOUT, " Opened a session: handle = 0x%08x\n", h); |
|
442 |
|
443 (void)memset(&sinfo, 0, sizeof(CK_SESSION_INFO)); |
|
444 ck_rv = epv->C_GetSessionInfo(h, &sinfo); |
|
445 if( CKR_OK != ck_rv ) { |
|
446 PR_fprintf(PR_STDOUT, "C_GetSessionInfo(%lu, ) returned 0x%08x\n", h, ck_rv); |
|
447 return 1; |
|
448 } |
|
449 |
|
450 PR_fprintf(PR_STDOUT, " SESSION INFO:\n"); |
|
451 PR_fprintf(PR_STDOUT, " slotID = %lu\n", sinfo.slotID); |
|
452 PR_fprintf(PR_STDOUT, " state = %lu\n", sinfo.state); |
|
453 PR_fprintf(PR_STDOUT, " flags = 0x%08x\n", sinfo.flags); |
|
454 #ifdef CKF_EXCLUSIVE_SESSION |
|
455 PR_fprintf(PR_STDOUT, " -> EXCLUSIVE SESSION = %s\n", sinfo.flags & CKF_EXCLUSIVE_SESSION ? "TRUE" : "FALSE"); |
|
456 #endif /* CKF_EXCLUSIVE_SESSION */ |
|
457 PR_fprintf(PR_STDOUT, " -> RW SESSION = %s\n", sinfo.flags & CKF_RW_SESSION ? "TRUE" : "FALSE"); |
|
458 PR_fprintf(PR_STDOUT, " -> SERIAL SESSION = %s\n", sinfo.flags & CKF_SERIAL_SESSION ? "TRUE" : "FALSE"); |
|
459 #ifdef CKF_INSERTION_CALLBACK |
|
460 PR_fprintf(PR_STDOUT, " -> INSERTION CALLBACK = %s\n", sinfo.flags & CKF_INSERTION_CALLBACK ? "TRUE" : "FALSE"); |
|
461 #endif /* CKF_INSERTION_CALLBACK */ |
|
462 PR_fprintf(PR_STDOUT, " ulDeviceError = %lu\n", sinfo.ulDeviceError); |
|
463 PR_fprintf(PR_STDOUT, "\n"); |
|
464 |
|
465 ck_rv = epv->C_FindObjectsInit(h, (CK_ATTRIBUTE_PTR)CK_NULL_PTR, 0); |
|
466 if( CKR_OK != ck_rv ) { |
|
467 PR_fprintf(PR_STDOUT, "C_FindObjectsInit(%lu, NULL_PTR, 0) returned 0x%08x\n", h, ck_rv); |
|
468 return 1; |
|
469 } |
|
470 |
|
471 pTemplate = (CK_ATTRIBUTE_PTR)PR_Calloc(number_of_all_known_attribute_types, sizeof(CK_ATTRIBUTE)); |
|
472 if( (CK_ATTRIBUTE_PTR)NULL == pTemplate ) { |
|
473 PR_fprintf(PR_STDERR, "[memory allocation of %lu bytes failed]\n", |
|
474 number_of_all_known_attribute_types * sizeof(CK_ATTRIBUTE)); |
|
475 return 1; |
|
476 } |
|
477 |
|
478 PR_fprintf(PR_STDOUT, " All objects:\n"); |
|
479 |
|
480 while(1) { |
|
481 CK_OBJECT_HANDLE o = (CK_OBJECT_HANDLE)0; |
|
482 CK_ULONG nObjects = 0; |
|
483 CK_ULONG k; |
|
484 CK_ULONG nAttributes = 0; |
|
485 CK_ATTRIBUTE_PTR pT2; |
|
486 CK_ULONG l; |
|
487 |
|
488 ck_rv = epv->C_FindObjects(h, &o, 1, &nObjects); |
|
489 if( CKR_OK != ck_rv ) { |
|
490 PR_fprintf(PR_STDERR, "C_FindObjects(%lu, , 1, ) returned 0x%08x\n", h, ck_rv); |
|
491 return 1; |
|
492 } |
|
493 |
|
494 if( 0 == nObjects ) { |
|
495 PR_fprintf(PR_STDOUT, "\n"); |
|
496 break; |
|
497 } |
|
498 |
|
499 tnObjects++; |
|
500 |
|
501 PR_fprintf(PR_STDOUT, " OBJECT HANDLE %lu:\n", o); |
|
502 |
|
503 for( k = 0; k < number_of_all_known_attribute_types; k++ ) { |
|
504 pTemplate[k].type = all_known_attribute_types[k]; |
|
505 pTemplate[k].pValue = (CK_VOID_PTR)CK_NULL_PTR; |
|
506 pTemplate[k].ulValueLen = 0; |
|
507 } |
|
508 |
|
509 ck_rv = epv->C_GetAttributeValue(h, o, pTemplate, number_of_all_known_attribute_types); |
|
510 switch( ck_rv ) { |
|
511 case CKR_OK: |
|
512 case CKR_ATTRIBUTE_SENSITIVE: |
|
513 case CKR_ATTRIBUTE_TYPE_INVALID: |
|
514 case CKR_BUFFER_TOO_SMALL: |
|
515 break; |
|
516 default: |
|
517 PR_fprintf(PR_STDERR, "C_GetAtributeValue(%lu, %lu, {all attribute types}, %lu) returned 0x%08x\n", |
|
518 h, o, number_of_all_known_attribute_types, ck_rv); |
|
519 return 1; |
|
520 } |
|
521 |
|
522 for( k = 0; k < number_of_all_known_attribute_types; k++ ) { |
|
523 if( -1 != (CK_LONG)pTemplate[k].ulValueLen ) { |
|
524 nAttributes++; |
|
525 } |
|
526 } |
|
527 |
|
528 if( 1 ) { |
|
529 PR_fprintf(PR_STDOUT, " %lu attributes:\n", nAttributes); |
|
530 for( k = 0; k < number_of_all_known_attribute_types; k++ ) { |
|
531 if( -1 != (CK_LONG)pTemplate[k].ulValueLen ) { |
|
532 PR_fprintf(PR_STDOUT, " 0x%08x (len = %lu)\n", pTemplate[k].type, |
|
533 pTemplate[k].ulValueLen); |
|
534 } |
|
535 } |
|
536 PR_fprintf(PR_STDOUT, "\n"); |
|
537 } |
|
538 |
|
539 pT2 = (CK_ATTRIBUTE_PTR)PR_Calloc(nAttributes, sizeof(CK_ATTRIBUTE)); |
|
540 if( (CK_ATTRIBUTE_PTR)NULL == pT2 ) { |
|
541 PR_fprintf(PR_STDERR, "[memory allocation of %lu bytes failed]\n", |
|
542 nAttributes * sizeof(CK_ATTRIBUTE)); |
|
543 return 1; |
|
544 } |
|
545 |
|
546 for( l = 0, k = 0; k < number_of_all_known_attribute_types; k++ ) { |
|
547 if( -1 != (CK_LONG)pTemplate[k].ulValueLen ) { |
|
548 pT2[l].type = pTemplate[k].type; |
|
549 pT2[l].ulValueLen = pTemplate[k].ulValueLen; |
|
550 pT2[l].pValue = (CK_VOID_PTR)PR_Malloc(pT2[l].ulValueLen); |
|
551 if( (CK_VOID_PTR)NULL == pT2[l].pValue ) { |
|
552 PR_fprintf(PR_STDERR, "[memory allocation of %lu bytes failed]\n", pT2[l].ulValueLen); |
|
553 return 1; |
|
554 } |
|
555 l++; |
|
556 } |
|
557 } |
|
558 |
|
559 PR_ASSERT( l == nAttributes ); |
|
560 |
|
561 ck_rv = epv->C_GetAttributeValue(h, o, pT2, nAttributes); |
|
562 switch( ck_rv ) { |
|
563 case CKR_OK: |
|
564 case CKR_ATTRIBUTE_SENSITIVE: |
|
565 case CKR_ATTRIBUTE_TYPE_INVALID: |
|
566 case CKR_BUFFER_TOO_SMALL: |
|
567 break; |
|
568 default: |
|
569 PR_fprintf(PR_STDERR, "C_GetAtributeValue(%lu, %lu, {existent attribute types}, %lu) returned 0x%08x\n", |
|
570 h, o, nAttributes, ck_rv); |
|
571 return 1; |
|
572 } |
|
573 |
|
574 for( l = 0; l < nAttributes; l++ ) { |
|
575 PR_fprintf(PR_STDOUT, " type = 0x%08x, len = %ld", pT2[l].type, (CK_LONG)pT2[l].ulValueLen); |
|
576 if( -1 == (CK_LONG)pT2[l].ulValueLen ) { |
|
577 ; |
|
578 } else { |
|
579 CK_ULONG m; |
|
580 |
|
581 if( pT2[l].ulValueLen <= 8 ) { |
|
582 PR_fprintf(PR_STDOUT, ", value = "); |
|
583 } else { |
|
584 PR_fprintf(PR_STDOUT, ", value = \n "); |
|
585 } |
|
586 |
|
587 for( m = 0; (m < pT2[l].ulValueLen) && (m < 20); m++ ) { |
|
588 PR_fprintf(PR_STDOUT, "%02x", (CK_ULONG)(0xff & ((CK_CHAR_PTR)pT2[l].pValue)[m])); |
|
589 } |
|
590 |
|
591 PR_fprintf(PR_STDOUT, " "); |
|
592 |
|
593 for( m = 0; (m < pT2[l].ulValueLen) && (m < 20); m++ ) { |
|
594 CK_CHAR c = ((CK_CHAR_PTR)pT2[l].pValue)[m]; |
|
595 if( (c < 0x20) || (c >= 0x7f) ) { |
|
596 c = '.'; |
|
597 } |
|
598 PR_fprintf(PR_STDOUT, "%c", c); |
|
599 } |
|
600 } |
|
601 |
|
602 PR_fprintf(PR_STDOUT, "\n"); |
|
603 } |
|
604 |
|
605 PR_fprintf(PR_STDOUT, "\n"); |
|
606 |
|
607 for( l = 0; l < nAttributes; l++ ) { |
|
608 PR_Free(pT2[l].pValue); |
|
609 } |
|
610 PR_Free(pT2); |
|
611 } /* while(1) */ |
|
612 |
|
613 ck_rv = epv->C_FindObjectsFinal(h); |
|
614 if( CKR_OK != ck_rv ) { |
|
615 PR_fprintf(PR_STDERR, "C_FindObjectsFinal(%lu) returned 0x%08x\n", h, ck_rv); |
|
616 return 1; |
|
617 } |
|
618 |
|
619 PR_fprintf(PR_STDOUT, " (%lu objects total)\n", tnObjects); |
|
620 |
|
621 ck_rv = epv->C_CloseSession(h); |
|
622 if( CKR_OK != ck_rv ) { |
|
623 PR_fprintf(PR_STDERR, "C_CloseSession(%lu) returned 0x%08x\n", h, ck_rv); |
|
624 return 1; |
|
625 } |
|
626 } /* session to find objects */ |
|
627 |
|
628 /* session to create, find, and delete a couple session objects */ |
|
629 { |
|
630 CK_SESSION_HANDLE h = (CK_SESSION_HANDLE)0; |
|
631 CK_ATTRIBUTE one[7], two[7], three[7], delta[1], mask[1]; |
|
632 CK_OBJECT_CLASS cko_data = CKO_DATA; |
|
633 CK_BBOOL false = CK_FALSE, true = CK_TRUE; |
|
634 char *key = "TEST PROGRAM"; |
|
635 CK_ULONG key_len = strlen(key); |
|
636 CK_OBJECT_HANDLE hOneIn = (CK_OBJECT_HANDLE)0, hTwoIn = (CK_OBJECT_HANDLE)0, |
|
637 hThreeIn = (CK_OBJECT_HANDLE)0, hDeltaIn = (CK_OBJECT_HANDLE)0; |
|
638 CK_OBJECT_HANDLE found[10]; |
|
639 CK_ULONG nFound; |
|
640 |
|
641 ck_rv = epv->C_OpenSession(pSlots[i], CKF_SERIAL_SESSION, (CK_VOID_PTR)CK_NULL_PTR, (CK_NOTIFY)CK_NULL_PTR, &h); |
|
642 if( CKR_OK != ck_rv ) { |
|
643 PR_fprintf(PR_STDERR, "C_OpenSession(%lu, CKF_SERIAL_SESSION, , ) returned 0x%08x\n", pSlots[i], ck_rv); |
|
644 return 1; |
|
645 } |
|
646 |
|
647 PR_fprintf(PR_STDOUT, " Opened a session: handle = 0x%08x\n", h); |
|
648 |
|
649 one[0].type = CKA_CLASS; |
|
650 one[0].pValue = &cko_data; |
|
651 one[0].ulValueLen = sizeof(CK_OBJECT_CLASS); |
|
652 one[1].type = CKA_TOKEN; |
|
653 one[1].pValue = &false; |
|
654 one[1].ulValueLen = sizeof(CK_BBOOL); |
|
655 one[2].type = CKA_PRIVATE; |
|
656 one[2].pValue = &false; |
|
657 one[2].ulValueLen = sizeof(CK_BBOOL); |
|
658 one[3].type = CKA_MODIFIABLE; |
|
659 one[3].pValue = &true; |
|
660 one[3].ulValueLen = sizeof(CK_BBOOL); |
|
661 one[4].type = CKA_LABEL; |
|
662 one[4].pValue = "Test data object one"; |
|
663 one[4].ulValueLen = strlen(one[4].pValue); |
|
664 one[5].type = CKA_APPLICATION; |
|
665 one[5].pValue = key; |
|
666 one[5].ulValueLen = key_len; |
|
667 one[6].type = CKA_VALUE; |
|
668 one[6].pValue = "Object one"; |
|
669 one[6].ulValueLen = strlen(one[6].pValue); |
|
670 |
|
671 two[0].type = CKA_CLASS; |
|
672 two[0].pValue = &cko_data; |
|
673 two[0].ulValueLen = sizeof(CK_OBJECT_CLASS); |
|
674 two[1].type = CKA_TOKEN; |
|
675 two[1].pValue = &false; |
|
676 two[1].ulValueLen = sizeof(CK_BBOOL); |
|
677 two[2].type = CKA_PRIVATE; |
|
678 two[2].pValue = &false; |
|
679 two[2].ulValueLen = sizeof(CK_BBOOL); |
|
680 two[3].type = CKA_MODIFIABLE; |
|
681 two[3].pValue = &true; |
|
682 two[3].ulValueLen = sizeof(CK_BBOOL); |
|
683 two[4].type = CKA_LABEL; |
|
684 two[4].pValue = "Test data object two"; |
|
685 two[4].ulValueLen = strlen(two[4].pValue); |
|
686 two[5].type = CKA_APPLICATION; |
|
687 two[5].pValue = key; |
|
688 two[5].ulValueLen = key_len; |
|
689 two[6].type = CKA_VALUE; |
|
690 two[6].pValue = "Object two"; |
|
691 two[6].ulValueLen = strlen(two[6].pValue); |
|
692 |
|
693 three[0].type = CKA_CLASS; |
|
694 three[0].pValue = &cko_data; |
|
695 three[0].ulValueLen = sizeof(CK_OBJECT_CLASS); |
|
696 three[1].type = CKA_TOKEN; |
|
697 three[1].pValue = &false; |
|
698 three[1].ulValueLen = sizeof(CK_BBOOL); |
|
699 three[2].type = CKA_PRIVATE; |
|
700 three[2].pValue = &false; |
|
701 three[2].ulValueLen = sizeof(CK_BBOOL); |
|
702 three[3].type = CKA_MODIFIABLE; |
|
703 three[3].pValue = &true; |
|
704 three[3].ulValueLen = sizeof(CK_BBOOL); |
|
705 three[4].type = CKA_LABEL; |
|
706 three[4].pValue = "Test data object three"; |
|
707 three[4].ulValueLen = strlen(three[4].pValue); |
|
708 three[5].type = CKA_APPLICATION; |
|
709 three[5].pValue = key; |
|
710 three[5].ulValueLen = key_len; |
|
711 three[6].type = CKA_VALUE; |
|
712 three[6].pValue = "Object three"; |
|
713 three[6].ulValueLen = strlen(three[6].pValue); |
|
714 |
|
715 ck_rv = epv->C_CreateObject(h, one, 7, &hOneIn); |
|
716 if( CKR_OK != ck_rv ) { |
|
717 PR_fprintf(PR_STDERR, "C_CreateObject(%lu, one, 7, ) returned 0x%08x\n", h, ck_rv); |
|
718 return 1; |
|
719 } |
|
720 |
|
721 PR_fprintf(PR_STDOUT, " Created object one: handle = %lu\n", hOneIn); |
|
722 |
|
723 ck_rv = epv->C_CreateObject(h, two, 7, &hTwoIn); |
|
724 if( CKR_OK != ck_rv ) { |
|
725 PR_fprintf(PR_STDERR, "C_CreateObject(%lu, two, 7, ) returned 0x%08x\n", h, ck_rv); |
|
726 return 1; |
|
727 } |
|
728 |
|
729 PR_fprintf(PR_STDOUT, " Created object two: handle = %lu\n", hTwoIn); |
|
730 |
|
731 ck_rv = epv->C_CreateObject(h, three, 7, &hThreeIn); |
|
732 if( CKR_OK != ck_rv ) { |
|
733 PR_fprintf(PR_STDERR, "C_CreateObject(%lu, three, 7, ) returned 0x%08x\n", h, ck_rv); |
|
734 return 1; |
|
735 } |
|
736 |
|
737 PR_fprintf(PR_STDOUT, " Created object three: handle = %lu\n", hThreeIn); |
|
738 |
|
739 delta[0].type = CKA_VALUE; |
|
740 delta[0].pValue = "Copied object"; |
|
741 delta[0].ulValueLen = strlen(delta[0].pValue); |
|
742 |
|
743 ck_rv = epv->C_CopyObject(h, hThreeIn, delta, 1, &hDeltaIn); |
|
744 if( CKR_OK != ck_rv ) { |
|
745 PR_fprintf(PR_STDERR, "C_CopyObject(%lu, %lu, delta, 1, ) returned 0x%08x\n", |
|
746 h, hThreeIn, ck_rv); |
|
747 return 1; |
|
748 } |
|
749 |
|
750 PR_fprintf(PR_STDOUT, " Copied object three: new handle = %lu\n", hDeltaIn); |
|
751 |
|
752 mask[0].type = CKA_APPLICATION; |
|
753 mask[0].pValue = key; |
|
754 mask[0].ulValueLen = key_len; |
|
755 |
|
756 ck_rv = epv->C_FindObjectsInit(h, mask, 1); |
|
757 if( CKR_OK != ck_rv ) { |
|
758 PR_fprintf(PR_STDERR, "C_FindObjectsInit(%lu, mask, 1) returned 0x%08x\n", |
|
759 h, ck_rv); |
|
760 return 1; |
|
761 } |
|
762 |
|
763 (void)memset(&found, 0, sizeof(found)); |
|
764 nFound = 0; |
|
765 ck_rv = epv->C_FindObjects(h, found, 10, &nFound); |
|
766 if( CKR_OK != ck_rv ) { |
|
767 PR_fprintf(PR_STDERR, "C_FindObjects(%lu,, 10, ) returned 0x%08x\n", |
|
768 h, ck_rv); |
|
769 return 1; |
|
770 } |
|
771 |
|
772 if( 4 != nFound ) { |
|
773 PR_fprintf(PR_STDERR, "Found %lu objects, not 4.\n", nFound); |
|
774 return 1; |
|
775 } |
|
776 |
|
777 PR_fprintf(PR_STDOUT, " Found 4 objects: %lu, %lu, %lu, %lu\n", |
|
778 found[0], found[1], found[2], found[3]); |
|
779 |
|
780 ck_rv = epv->C_FindObjectsFinal(h); |
|
781 if( CKR_OK != ck_rv ) { |
|
782 PR_fprintf(PR_STDERR, "C_FindObjectsFinal(%lu) returned 0x%08x\n", h, ck_rv); |
|
783 return 1; |
|
784 } |
|
785 |
|
786 ck_rv = epv->C_DestroyObject(h, hThreeIn); |
|
787 if( CKR_OK != ck_rv ) { |
|
788 PR_fprintf(PR_STDERR, "C_DestroyObject(%lu, %lu) returned 0x%08x\n", h, hThreeIn, ck_rv); |
|
789 return 1; |
|
790 } |
|
791 |
|
792 PR_fprintf(PR_STDOUT, " Destroyed object three (handle = %lu)\n", hThreeIn); |
|
793 |
|
794 delta[0].type = CKA_APPLICATION; |
|
795 delta[0].pValue = "Changed application"; |
|
796 delta[0].ulValueLen = strlen(delta[0].pValue); |
|
797 |
|
798 ck_rv = epv->C_SetAttributeValue(h, hTwoIn, delta, 1); |
|
799 if( CKR_OK != ck_rv ) { |
|
800 PR_fprintf(PR_STDERR, "C_SetAttributeValue(%lu, %lu, delta, 1) returned 0x%08x\n", |
|
801 h, hTwoIn, ck_rv); |
|
802 return 1; |
|
803 } |
|
804 |
|
805 PR_fprintf(PR_STDOUT, " Changed object two (handle = %lu).\n", hTwoIn); |
|
806 |
|
807 /* Can another session find these session objects? */ |
|
808 { |
|
809 CK_SESSION_HANDLE h2 = (CK_SESSION_HANDLE)0; |
|
810 |
|
811 ck_rv = epv->C_OpenSession(pSlots[i], CKF_SERIAL_SESSION, (CK_VOID_PTR)CK_NULL_PTR, (CK_NOTIFY)CK_NULL_PTR, &h2); |
|
812 if( CKR_OK != ck_rv ) { |
|
813 PR_fprintf(PR_STDERR, "C_OpenSession(%lu, CKF_SERIAL_SESSION, , ) returned 0x%08x\n", pSlots[i], ck_rv); |
|
814 return 1; |
|
815 } |
|
816 |
|
817 PR_fprintf(PR_STDOUT, " Opened a second session: handle = 0x%08x\n", h2); |
|
818 |
|
819 /* mask is still the same */ |
|
820 |
|
821 ck_rv = epv->C_FindObjectsInit(h2, mask, 1); |
|
822 if( CKR_OK != ck_rv ) { |
|
823 PR_fprintf(PR_STDERR, "C_FindObjectsInit(%lu, mask, 1) returned 0x%08x\n", |
|
824 h2, ck_rv); |
|
825 return 1; |
|
826 } |
|
827 |
|
828 (void)memset(&found, 0, sizeof(found)); |
|
829 nFound = 0; |
|
830 ck_rv = epv->C_FindObjects(h2, found, 10, &nFound); |
|
831 if( CKR_OK != ck_rv ) { |
|
832 PR_fprintf(PR_STDERR, "C_FindObjects(%lu,, 10, ) returned 0x%08x\n", |
|
833 h2, ck_rv); |
|
834 return 1; |
|
835 } |
|
836 |
|
837 if( 2 != nFound ) { |
|
838 PR_fprintf(PR_STDERR, "Found %lu objects, not 2.\n", nFound); |
|
839 return 1; |
|
840 } |
|
841 |
|
842 PR_fprintf(PR_STDOUT, " Found 2 objects: %lu, %lu\n", |
|
843 found[0], found[1]); |
|
844 |
|
845 ck_rv = epv->C_FindObjectsFinal(h2); |
|
846 if( CKR_OK != ck_rv ) { |
|
847 PR_fprintf(PR_STDERR, "C_FindObjectsFinal(%lu) returned 0x%08x\n", h2, ck_rv); |
|
848 return 1; |
|
849 } |
|
850 |
|
851 /* Leave the session hanging open, we'll CloseAllSessions later */ |
|
852 } /* Can another session find these session objects? */ |
|
853 |
|
854 ck_rv = epv->C_CloseAllSessions(pSlots[i]); |
|
855 if( CKR_OK != ck_rv ) { |
|
856 PR_fprintf(PR_STDERR, "C_CloseAllSessions(%lu) returned 0x%08x\n", pSlots[i], ck_rv); |
|
857 return 1; |
|
858 } |
|
859 } /* session to create, find, and delete a couple session objects */ |
|
860 |
|
861 /* Might be interesting to do a find here to verify that all session objects are gone. */ |
|
862 |
|
863 if( tinfo.flags & CKF_WRITE_PROTECTED ) { |
|
864 PR_fprintf(PR_STDOUT, "Token is write protected, skipping token-object tests.\n"); |
|
865 } else { |
|
866 CK_SESSION_HANDLE h = (CK_SESSION_HANDLE)0; |
|
867 CK_ATTRIBUTE tobj[7], tsobj[7], stobj[7], delta[1], mask[2]; |
|
868 CK_OBJECT_CLASS cko_data = CKO_DATA; |
|
869 CK_BBOOL false = CK_FALSE, true = CK_TRUE; |
|
870 char *key = "TEST PROGRAM"; |
|
871 CK_ULONG key_len = strlen(key); |
|
872 CK_OBJECT_HANDLE hTIn = (CK_OBJECT_HANDLE)0, hTSIn = (CK_OBJECT_HANDLE)0, |
|
873 hSTIn = (CK_OBJECT_HANDLE)0, hDeltaIn = (CK_OBJECT_HANDLE)0; |
|
874 CK_OBJECT_HANDLE found[10]; |
|
875 CK_ULONG nFound; |
|
876 |
|
877 ck_rv = epv->C_OpenSession(pSlots[i], CKF_SERIAL_SESSION, (CK_VOID_PTR)CK_NULL_PTR, (CK_NOTIFY)CK_NULL_PTR, &h); |
|
878 if( CKR_OK != ck_rv ) { |
|
879 PR_fprintf(PR_STDERR, "C_OpenSession(%lu, CKF_SERIAL_SESSION, , ) returned 0x%08x\n", pSlots[i], ck_rv); |
|
880 return 1; |
|
881 } |
|
882 |
|
883 PR_fprintf(PR_STDOUT, " Opened a session: handle = 0x%08x\n", h); |
|
884 |
|
885 tobj[0].type = CKA_CLASS; |
|
886 tobj[0].pValue = &cko_data; |
|
887 tobj[0].ulValueLen = sizeof(CK_OBJECT_CLASS); |
|
888 tobj[1].type = CKA_TOKEN; |
|
889 tobj[1].pValue = &true; |
|
890 tobj[1].ulValueLen = sizeof(CK_BBOOL); |
|
891 tobj[2].type = CKA_PRIVATE; |
|
892 tobj[2].pValue = &false; |
|
893 tobj[2].ulValueLen = sizeof(CK_BBOOL); |
|
894 tobj[3].type = CKA_MODIFIABLE; |
|
895 tobj[3].pValue = &true; |
|
896 tobj[3].ulValueLen = sizeof(CK_BBOOL); |
|
897 tobj[4].type = CKA_LABEL; |
|
898 tobj[4].pValue = "Test data object token"; |
|
899 tobj[4].ulValueLen = strlen(tobj[4].pValue); |
|
900 tobj[5].type = CKA_APPLICATION; |
|
901 tobj[5].pValue = key; |
|
902 tobj[5].ulValueLen = key_len; |
|
903 tobj[6].type = CKA_VALUE; |
|
904 tobj[6].pValue = "Object token"; |
|
905 tobj[6].ulValueLen = strlen(tobj[6].pValue); |
|
906 |
|
907 tsobj[0].type = CKA_CLASS; |
|
908 tsobj[0].pValue = &cko_data; |
|
909 tsobj[0].ulValueLen = sizeof(CK_OBJECT_CLASS); |
|
910 tsobj[1].type = CKA_TOKEN; |
|
911 tsobj[1].pValue = &true; |
|
912 tsobj[1].ulValueLen = sizeof(CK_BBOOL); |
|
913 tsobj[2].type = CKA_PRIVATE; |
|
914 tsobj[2].pValue = &false; |
|
915 tsobj[2].ulValueLen = sizeof(CK_BBOOL); |
|
916 tsobj[3].type = CKA_MODIFIABLE; |
|
917 tsobj[3].pValue = &true; |
|
918 tsobj[3].ulValueLen = sizeof(CK_BBOOL); |
|
919 tsobj[4].type = CKA_LABEL; |
|
920 tsobj[4].pValue = "Test data object token->session"; |
|
921 tsobj[4].ulValueLen = strlen(tsobj[4].pValue); |
|
922 tsobj[5].type = CKA_APPLICATION; |
|
923 tsobj[5].pValue = key; |
|
924 tsobj[5].ulValueLen = key_len; |
|
925 tsobj[6].type = CKA_VALUE; |
|
926 tsobj[6].pValue = "Object token->session"; |
|
927 tsobj[6].ulValueLen = strlen(tsobj[6].pValue); |
|
928 |
|
929 stobj[0].type = CKA_CLASS; |
|
930 stobj[0].pValue = &cko_data; |
|
931 stobj[0].ulValueLen = sizeof(CK_OBJECT_CLASS); |
|
932 stobj[1].type = CKA_TOKEN; |
|
933 stobj[1].pValue = &false; |
|
934 stobj[1].ulValueLen = sizeof(CK_BBOOL); |
|
935 stobj[2].type = CKA_PRIVATE; |
|
936 stobj[2].pValue = &false; |
|
937 stobj[2].ulValueLen = sizeof(CK_BBOOL); |
|
938 stobj[3].type = CKA_MODIFIABLE; |
|
939 stobj[3].pValue = &true; |
|
940 stobj[3].ulValueLen = sizeof(CK_BBOOL); |
|
941 stobj[4].type = CKA_LABEL; |
|
942 stobj[4].pValue = "Test data object session->token"; |
|
943 stobj[4].ulValueLen = strlen(stobj[4].pValue); |
|
944 stobj[5].type = CKA_APPLICATION; |
|
945 stobj[5].pValue = key; |
|
946 stobj[5].ulValueLen = key_len; |
|
947 stobj[6].type = CKA_VALUE; |
|
948 stobj[6].pValue = "Object session->token"; |
|
949 stobj[6].ulValueLen = strlen(stobj[6].pValue); |
|
950 |
|
951 ck_rv = epv->C_CreateObject(h, tobj, 7, &hTIn); |
|
952 if( CKR_OK != ck_rv ) { |
|
953 PR_fprintf(PR_STDERR, "C_CreateObject(%lu, tobj, 7, ) returned 0x%08x\n", h, ck_rv); |
|
954 return 1; |
|
955 } |
|
956 |
|
957 PR_fprintf(PR_STDOUT, " Created object token: handle = %lu\n", hTIn); |
|
958 |
|
959 ck_rv = epv->C_CreateObject(h, tsobj, 7, &hTSIn); |
|
960 if( CKR_OK != ck_rv ) { |
|
961 PR_fprintf(PR_STDERR, "C_CreateObject(%lu, tobj, 7, ) returned 0x%08x\n", h, ck_rv); |
|
962 return 1; |
|
963 } |
|
964 |
|
965 PR_fprintf(PR_STDOUT, " Created object token->session: handle = %lu\n", hTSIn); |
|
966 ck_rv = epv->C_CreateObject(h, stobj, 7, &hSTIn); |
|
967 if( CKR_OK != ck_rv ) { |
|
968 PR_fprintf(PR_STDERR, "C_CreateObject(%lu, tobj, 7, ) returned 0x%08x\n", h, ck_rv); |
|
969 return 1; |
|
970 } |
|
971 |
|
972 PR_fprintf(PR_STDOUT, " Created object session->token: handle = %lu\n", hSTIn); |
|
973 |
|
974 /* I've created two token objects and one session object; find the two */ |
|
975 |
|
976 mask[0].type = CKA_APPLICATION; |
|
977 mask[0].pValue = key; |
|
978 mask[0].ulValueLen = key_len; |
|
979 mask[1].type = CKA_TOKEN; |
|
980 mask[1].pValue = &true; |
|
981 mask[1].ulValueLen = sizeof(CK_BBOOL); |
|
982 |
|
983 ck_rv = epv->C_FindObjectsInit(h, mask, 2); |
|
984 if( CKR_OK != ck_rv ) { |
|
985 PR_fprintf(PR_STDERR, "C_FindObjectsInit(%lu, mask, 2) returned 0x%08x\n", |
|
986 h, ck_rv); |
|
987 return 1; |
|
988 } |
|
989 |
|
990 (void)memset(&found, 0, sizeof(found)); |
|
991 nFound = 0; |
|
992 ck_rv = epv->C_FindObjects(h, found, 10, &nFound); |
|
993 if( CKR_OK != ck_rv ) { |
|
994 PR_fprintf(PR_STDERR, "C_FindObjects(%lu,, 10, ) returned 0x%08x\n", |
|
995 h, ck_rv); |
|
996 return 1; |
|
997 } |
|
998 |
|
999 if( 2 != nFound ) { |
|
1000 PR_fprintf(PR_STDERR, "Found %lu objects, not 2.\n", nFound); |
|
1001 return 1; |
|
1002 } |
|
1003 |
|
1004 PR_fprintf(PR_STDOUT, " Found 2 objects: %lu, %lu\n", |
|
1005 found[0], found[1]); |
|
1006 |
|
1007 ck_rv = epv->C_FindObjectsFinal(h); |
|
1008 if( CKR_OK != ck_rv ) { |
|
1009 PR_fprintf(PR_STDERR, "C_FindObjectsFinal(%lu) returned 0x%08x\n", h, ck_rv); |
|
1010 return 1; |
|
1011 } |
|
1012 |
|
1013 /* Convert a token to session object */ |
|
1014 |
|
1015 delta[0].type = CKA_TOKEN; |
|
1016 delta[0].pValue = &false; |
|
1017 delta[0].ulValueLen = sizeof(CK_BBOOL); |
|
1018 |
|
1019 ck_rv = epv->C_SetAttributeValue(h, hTSIn, delta, 1); |
|
1020 if( CKR_OK != ck_rv ) { |
|
1021 PR_fprintf(PR_STDERR, "C_SetAttributeValue(%lu, %lu, delta, 1) returned 0x%08x\n", |
|
1022 h, hTSIn, ck_rv); |
|
1023 return 1; |
|
1024 } |
|
1025 |
|
1026 PR_fprintf(PR_STDOUT, " Changed object from token to session (handle = %lu).\n", hTSIn); |
|
1027 |
|
1028 /* Now find again; there should be one */ |
|
1029 |
|
1030 mask[0].type = CKA_APPLICATION; |
|
1031 mask[0].pValue = key; |
|
1032 mask[0].ulValueLen = key_len; |
|
1033 mask[1].type = CKA_TOKEN; |
|
1034 mask[1].pValue = &true; |
|
1035 mask[1].ulValueLen = sizeof(CK_BBOOL); |
|
1036 |
|
1037 ck_rv = epv->C_FindObjectsInit(h, mask, 2); |
|
1038 if( CKR_OK != ck_rv ) { |
|
1039 PR_fprintf(PR_STDERR, "C_FindObjectsInit(%lu, mask, 2) returned 0x%08x\n", |
|
1040 h, ck_rv); |
|
1041 return 1; |
|
1042 } |
|
1043 |
|
1044 (void)memset(&found, 0, sizeof(found)); |
|
1045 nFound = 0; |
|
1046 ck_rv = epv->C_FindObjects(h, found, 10, &nFound); |
|
1047 if( CKR_OK != ck_rv ) { |
|
1048 PR_fprintf(PR_STDERR, "C_FindObjects(%lu,, 10, ) returned 0x%08x\n", |
|
1049 h, ck_rv); |
|
1050 return 1; |
|
1051 } |
|
1052 |
|
1053 if( 1 != nFound ) { |
|
1054 PR_fprintf(PR_STDERR, "Found %lu objects, not 1.\n", nFound); |
|
1055 return 1; |
|
1056 } |
|
1057 |
|
1058 PR_fprintf(PR_STDOUT, " Found 1 objects: %lu\n", |
|
1059 found[0]); |
|
1060 |
|
1061 ck_rv = epv->C_FindObjectsFinal(h); |
|
1062 if( CKR_OK != ck_rv ) { |
|
1063 PR_fprintf(PR_STDERR, "C_FindObjectsFinal(%lu) returned 0x%08x\n", h, ck_rv); |
|
1064 return 1; |
|
1065 } |
|
1066 |
|
1067 /* Convert a session to a token object */ |
|
1068 |
|
1069 delta[0].type = CKA_TOKEN; |
|
1070 delta[0].pValue = &true; |
|
1071 delta[0].ulValueLen = sizeof(CK_BBOOL); |
|
1072 |
|
1073 ck_rv = epv->C_SetAttributeValue(h, hSTIn, delta, 1); |
|
1074 if( CKR_OK != ck_rv ) { |
|
1075 PR_fprintf(PR_STDERR, "C_SetAttributeValue(%lu, %lu, delta, 1) returned 0x%08x\n", |
|
1076 h, hSTIn, ck_rv); |
|
1077 return 1; |
|
1078 } |
|
1079 |
|
1080 PR_fprintf(PR_STDOUT, " Changed object from session to token (handle = %lu).\n", hSTIn); |
|
1081 |
|
1082 /* Now find again; there should be two again */ |
|
1083 |
|
1084 mask[0].type = CKA_APPLICATION; |
|
1085 mask[0].pValue = key; |
|
1086 mask[0].ulValueLen = key_len; |
|
1087 mask[1].type = CKA_TOKEN; |
|
1088 mask[1].pValue = &true; |
|
1089 mask[1].ulValueLen = sizeof(CK_BBOOL); |
|
1090 |
|
1091 ck_rv = epv->C_FindObjectsInit(h, mask, 2); |
|
1092 if( CKR_OK != ck_rv ) { |
|
1093 PR_fprintf(PR_STDERR, "C_FindObjectsInit(%lu, mask, 2) returned 0x%08x\n", |
|
1094 h, ck_rv); |
|
1095 return 1; |
|
1096 } |
|
1097 |
|
1098 (void)memset(&found, 0, sizeof(found)); |
|
1099 nFound = 0; |
|
1100 ck_rv = epv->C_FindObjects(h, found, 10, &nFound); |
|
1101 if( CKR_OK != ck_rv ) { |
|
1102 PR_fprintf(PR_STDERR, "C_FindObjects(%lu,, 10, ) returned 0x%08x\n", |
|
1103 h, ck_rv); |
|
1104 return 1; |
|
1105 } |
|
1106 |
|
1107 if( 2 != nFound ) { |
|
1108 PR_fprintf(PR_STDERR, "Found %lu objects, not 2.\n", nFound); |
|
1109 return 1; |
|
1110 } |
|
1111 |
|
1112 PR_fprintf(PR_STDOUT, " Found 2 objects: %lu, %lu\n", |
|
1113 found[0], found[1]); |
|
1114 |
|
1115 ck_rv = epv->C_FindObjectsFinal(h); |
|
1116 if( CKR_OK != ck_rv ) { |
|
1117 PR_fprintf(PR_STDERR, "C_FindObjectsFinal(%lu) returned 0x%08x\n", h, ck_rv); |
|
1118 return 1; |
|
1119 } |
|
1120 |
|
1121 /* Delete the two (found) token objects to clean up */ |
|
1122 |
|
1123 ck_rv = epv->C_DestroyObject(h, found[0]); |
|
1124 if( CKR_OK != ck_rv ) { |
|
1125 PR_fprintf(PR_STDERR, "C_DestroyObject(%lu, %lu) returned 0x%08x\n", h, found[0], ck_rv); |
|
1126 return 1; |
|
1127 } |
|
1128 |
|
1129 PR_fprintf(PR_STDOUT, " Destroyed token object (handle = %lu)\n", found[0]); |
|
1130 |
|
1131 ck_rv = epv->C_DestroyObject(h, found[1]); |
|
1132 if( CKR_OK != ck_rv ) { |
|
1133 PR_fprintf(PR_STDERR, "C_DestroyObject(%lu, %lu) returned 0x%08x\n", h, found[1], ck_rv); |
|
1134 return 1; |
|
1135 } |
|
1136 |
|
1137 PR_fprintf(PR_STDOUT, " Destroyed token object (handle = %lu)\n", found[1]); |
|
1138 |
|
1139 /* Close the session and all objects should be gone */ |
|
1140 |
|
1141 ck_rv = epv->C_CloseSession(h); |
|
1142 if( CKR_OK != ck_rv ) { |
|
1143 PR_fprintf(PR_STDERR, "C_CloseSession(%lu) returned 0x%08x\n", h, ck_rv); |
|
1144 return 1; |
|
1145 } |
|
1146 } /* if( tinfo.flags & CKF_WRITE_PROTECTED ) */ |
|
1147 |
|
1148 if( tinfo.flags & CKF_WRITE_PROTECTED ) { |
|
1149 PR_fprintf(PR_STDOUT, "Token is write protected, skipping leaving a record.\n"); |
|
1150 } else { |
|
1151 CK_SESSION_HANDLE h = (CK_SESSION_HANDLE)0; |
|
1152 CK_ATTRIBUTE record[7], mask[2]; |
|
1153 CK_OBJECT_CLASS cko_data = CKO_DATA; |
|
1154 CK_BBOOL false = CK_FALSE, true = CK_TRUE; |
|
1155 char *key = "TEST RECORD"; |
|
1156 CK_ULONG key_len = strlen(key); |
|
1157 CK_OBJECT_HANDLE hin = (CK_OBJECT_HANDLE)0; |
|
1158 char timebuffer[256]; |
|
1159 |
|
1160 ck_rv = epv->C_OpenSession(pSlots[i], CKF_SERIAL_SESSION, (CK_VOID_PTR)CK_NULL_PTR, (CK_NOTIFY)CK_NULL_PTR, &h); |
|
1161 if( CKR_OK != ck_rv ) { |
|
1162 PR_fprintf(PR_STDERR, "C_OpenSession(%lu, CKF_SERIAL_SESSION, , ) returned 0x%08x\n", pSlots[i], ck_rv); |
|
1163 return 1; |
|
1164 } |
|
1165 |
|
1166 PR_fprintf(PR_STDOUT, " Opened a session: handle = 0x%08x\n", h); |
|
1167 |
|
1168 /* I can't believe how hard NSPR makes this operation */ |
|
1169 { |
|
1170 time_t now = 0; |
|
1171 struct tm *tm; |
|
1172 time(&now); |
|
1173 tm = localtime(&now); |
|
1174 strftime(timebuffer, sizeof(timebuffer), "%Y-%m-%d %T %Z", tm); |
|
1175 } |
|
1176 |
|
1177 record[0].type = CKA_CLASS; |
|
1178 record[0].pValue = &cko_data; |
|
1179 record[0].ulValueLen = sizeof(CK_OBJECT_CLASS); |
|
1180 record[1].type = CKA_TOKEN; |
|
1181 record[1].pValue = &true; |
|
1182 record[1].ulValueLen = sizeof(CK_BBOOL); |
|
1183 record[2].type = CKA_PRIVATE; |
|
1184 record[2].pValue = &false; |
|
1185 record[2].ulValueLen = sizeof(CK_BBOOL); |
|
1186 record[3].type = CKA_MODIFIABLE; |
|
1187 record[3].pValue = &true; |
|
1188 record[3].ulValueLen = sizeof(CK_BBOOL); |
|
1189 record[4].type = CKA_LABEL; |
|
1190 record[4].pValue = "Test record"; |
|
1191 record[4].ulValueLen = strlen(record[4].pValue); |
|
1192 record[5].type = CKA_APPLICATION; |
|
1193 record[5].pValue = key; |
|
1194 record[5].ulValueLen = key_len; |
|
1195 record[6].type = CKA_VALUE; |
|
1196 record[6].pValue = timebuffer; |
|
1197 record[6].ulValueLen = strlen(timebuffer)+1; |
|
1198 |
|
1199 PR_fprintf(PR_STDOUT, " Timestamping with \"%s\"\n", timebuffer); |
|
1200 |
|
1201 ck_rv = epv->C_CreateObject(h, record, 7, &hin); |
|
1202 if( CKR_OK != ck_rv ) { |
|
1203 PR_fprintf(PR_STDERR, "C_CreateObject(%lu, tobj, 7, ) returned 0x%08x\n", h, ck_rv); |
|
1204 return 1; |
|
1205 } |
|
1206 |
|
1207 PR_fprintf(PR_STDOUT, " Created record object: handle = %lu\n", hin); |
|
1208 |
|
1209 PR_fprintf(PR_STDOUT, " == All test timestamps ==\n"); |
|
1210 |
|
1211 mask[0].type = CKA_CLASS; |
|
1212 mask[0].pValue = &cko_data; |
|
1213 mask[0].ulValueLen = sizeof(CK_OBJECT_CLASS); |
|
1214 mask[1].type = CKA_APPLICATION; |
|
1215 mask[1].pValue = key; |
|
1216 mask[1].ulValueLen = key_len; |
|
1217 |
|
1218 ck_rv = epv->C_FindObjectsInit(h, mask, 2); |
|
1219 if( CKR_OK != ck_rv ) { |
|
1220 PR_fprintf(PR_STDERR, "C_FindObjectsInit(%lu, mask, 1) returned 0x%08x\n", |
|
1221 h, ck_rv); |
|
1222 return 1; |
|
1223 } |
|
1224 |
|
1225 while( 1 ) { |
|
1226 CK_OBJECT_HANDLE o = (CK_OBJECT_HANDLE)0; |
|
1227 CK_ULONG nObjects = 0; |
|
1228 CK_ATTRIBUTE value[1]; |
|
1229 char buffer[1024]; |
|
1230 |
|
1231 ck_rv = epv->C_FindObjects(h, &o, 1, &nObjects); |
|
1232 if( CKR_OK != ck_rv ) { |
|
1233 PR_fprintf(PR_STDERR, "C_FindObjects(%lu, , 1, ) returned 0x%08x\n", h, ck_rv); |
|
1234 return 1; |
|
1235 } |
|
1236 |
|
1237 if( 0 == nObjects ) { |
|
1238 PR_fprintf(PR_STDOUT, "\n"); |
|
1239 break; |
|
1240 } |
|
1241 |
|
1242 value[0].type = CKA_VALUE; |
|
1243 value[0].pValue = buffer; |
|
1244 value[0].ulValueLen = sizeof(buffer); |
|
1245 |
|
1246 ck_rv = epv->C_GetAttributeValue(h, o, value, 1); |
|
1247 switch( ck_rv ) { |
|
1248 case CKR_OK: |
|
1249 PR_fprintf(PR_STDOUT, " %s\n", value[0].pValue); |
|
1250 break; |
|
1251 case CKR_ATTRIBUTE_SENSITIVE: |
|
1252 PR_fprintf(PR_STDOUT, " [Sensitive???]\n"); |
|
1253 break; |
|
1254 case CKR_ATTRIBUTE_TYPE_INVALID: |
|
1255 PR_fprintf(PR_STDOUT, " [Invalid attribute???]\n"); |
|
1256 break; |
|
1257 case CKR_BUFFER_TOO_SMALL: |
|
1258 PR_fprintf(PR_STDOUT, " (result > 1k (%lu))\n", value[0].ulValueLen); |
|
1259 break; |
|
1260 default: |
|
1261 PR_fprintf(PR_STDERR, "C_GetAtributeValue(%lu, %lu, CKA_VALUE, 1) returned 0x%08x\n", |
|
1262 h, o); |
|
1263 return 1; |
|
1264 } |
|
1265 } /* while */ |
|
1266 |
|
1267 ck_rv = epv->C_FindObjectsFinal(h); |
|
1268 if( CKR_OK != ck_rv ) { |
|
1269 PR_fprintf(PR_STDERR, "C_FindObjectsFinal(%lu) returned 0x%08x\n", h, ck_rv); |
|
1270 return 1; |
|
1271 } |
|
1272 } /* "leaving a record" else clause */ |
|
1273 |
|
1274 } |
|
1275 |
|
1276 PR_fprintf(PR_STDOUT, "\n"); |
|
1277 } |
|
1278 |
|
1279 return 0; |
|
1280 } |