blob: 05821a15d364190cc300c4ece64aaa446883aaa3 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Portions Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
3 */
4
5/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 *
13 * 2. Redistributions in binary form must reproduce the above copyright notice,
14 * this list of conditions and the following disclaimer in the documentation
15 * and/or other materials provided with the distribution.
16 *
17 * 3. The end-user documentation included with the redistribution, if any, must
18 * include the following acknowledgment:
19 *
20 * "This product includes software developed by IAIK of Graz University of
21 * Technology."
22 *
23 * Alternately, this acknowledgment may appear in the software itself, if
24 * and wherever such third-party acknowledgments normally appear.
25 *
26 * 4. The names "Graz University of Technology" and "IAIK of Graz University of
27 * Technology" must not be used to endorse or promote products derived from
28 * this software without prior written permission.
29 *
30 * 5. Products derived from this software may not be called
31 * "IAIK PKCS Wrapper", nor may "IAIK" appear in their name, without prior
32 * written permission of Graz University of Technology.
33 *
34 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
35 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
36 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
37 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE LICENSOR BE
38 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
39 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
40 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
41 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
42 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
43 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
44 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
45 * POSSIBILITY OF SUCH DAMAGE.
46 */
47
48#include "pkcs11wrapper.h"
49
50#include <stdio.h>
51#include <stdlib.h>
52#include <string.h>
53#include <assert.h>
54
55#include "sun_security_pkcs11_wrapper_PKCS11.h"
56
57/* declare file private functions */
58
59void prefetchFields(JNIEnv *env, jclass thisClass);
60jobject ckInfoPtrToJInfo(JNIEnv *env, const CK_INFO_PTR ckpInfo);
61jobject ckSlotInfoPtrToJSlotInfo(JNIEnv *env, const CK_SLOT_INFO_PTR ckpSlotInfo);
62jobject ckTokenInfoPtrToJTokenInfo(JNIEnv *env, const CK_TOKEN_INFO_PTR ckpTokenInfo);
63jobject ckMechanismInfoPtrToJMechanismInfo(JNIEnv *env, const CK_MECHANISM_INFO_PTR ckpMechanismInfo);
64
65/* define variables */
66
67jfieldID pNativeDataID;
68jfieldID mech_mechanismID;
69jfieldID mech_pParameterID;
70
71jclass jByteArrayClass;
72jclass jLongClass;
73
74JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
75 return JNI_VERSION_1_4;
76}
77
78/* ************************************************************************** */
79/* The native implementation of the methods of the PKCS11Implementation class */
80/* ************************************************************************** */
81
82/*
83 * This method is used to do static initialization. This method is static and
84 * synchronized. Summary: use this method like a static initialization block.
85 *
86 * Class: sun_security_pkcs11_wrapper_PKCS11
87 * Method: initializeLibrary
88 * Signature: ()V
89 */
90JNIEXPORT void JNICALL
91Java_sun_security_pkcs11_wrapper_PKCS11_initializeLibrary
92(JNIEnv *env, jclass thisClass)
93{
94#ifndef NO_CALLBACKS
95 if (notifyListLock == NULL) {
96 notifyListLock = createLockObject(env);
97 }
98#endif
99
100 prefetchFields(env, thisClass);
101}
102
103jclass fetchClass(JNIEnv *env, const char *name) {
104 jclass tmpClass = (*env)->FindClass(env, name);
105 return (*env)->NewGlobalRef(env, tmpClass);
106}
107
108void prefetchFields(JNIEnv *env, jclass thisClass) {
109 jclass tmpClass;
110
111 /* PKCS11 */
112 pNativeDataID = (*env)->GetFieldID(env, thisClass, "pNativeData", "J");
113
114 /* CK_MECHANISM */
115 tmpClass = (*env)->FindClass(env, CLASS_MECHANISM);
116 mech_mechanismID = (*env)->GetFieldID(env, tmpClass, "mechanism", "J");
117 mech_pParameterID = (*env)->GetFieldID(env, tmpClass, "pParameter",
118 "Ljava/lang/Object;");
119
120 jByteArrayClass = fetchClass(env, "[B");
121 jLongClass = fetchClass(env, "java/lang/Long");
122}
123
124/* This method is designed to do a clean-up. It releases all global resources
125 * of this library. By now, this function is not called. Calling from
126 * JNI_OnUnload would be an option, but some VMs do not support JNI_OnUnload.
127 *
128 * Class: sun_security_pkcs11_wrapper_PKCS11
129 * Method: finalizeLibrary
130 * Signature: ()V
131 */
132JNIEXPORT void JNICALL
133Java_sun_security_pkcs11_wrapper_PKCS11_finalizeLibrary
134(JNIEnv *env, jclass thisClass)
135{
136/* XXX
137 * remove all left lists and release the resources and the lock
138 * objects that synchroniz access to these lists.
139 *
140 removeAllModuleEntries(env);
141 if (moduleListHead == NULL) { * check, if we removed the last active module *
142 * remove also the moduleListLock, it is no longer used *
143 if (moduleListLock != NULL) {
144 destroyLockObject(env, moduleListLock);
145 moduleListLock = NULL;
146 }
147#ifndef NO_CALLBACKS
148 * remove all left notify callback entries *
149 while (removeFirstNotifyEntry(env));
150 * remove also the notifyListLock, it is no longer used *
151 if (notifyListLock != NULL) {
152 destroyLockObject(env, notifyListLock);
153 notifyListLock = NULL;
154 }
155 if (jInitArgsObject != NULL) {
156 (*env)->DeleteGlobalRef(env, jInitArgsObject);
157 }
158 if (ckpGlobalInitArgs != NULL_PTR) {
159 free(ckpGlobalInitArgs);
160 }
161#endif * NO_CALLBACKS *
162 }
163*/
164}
165
166#ifdef P11_ENABLE_C_INITIALIZE
167/*
168 * Class: sun_security_pkcs11_wrapper_PKCS11
169 * Method: C_Initialize
170 * Signature: (Ljava/lang/Object;)V
171 * Parametermapping: *PKCS11*
172 * @param jobject jInitArgs CK_VOID_PTR pInitArgs
173 */
174JNIEXPORT void JNICALL
175Java_sun_security_pkcs11_wrapper_PKCS11_C_1Initialize
176(JNIEnv *env, jobject obj, jobject jInitArgs)
177{
178 /*
179 * Initalize Cryptoki
180 */
181 CK_C_INITIALIZE_ARGS_PTR ckpInitArgs;
182 CK_RV rv;
183 CK_FUNCTION_LIST_PTR ckpFunctions;
184
185 TRACE0("DEBUG: initializing module... ");
186
187 ckpFunctions = getFunctionList(env, obj);
188 if (ckpFunctions == NULL) {
189 TRACE0("failed getting module entry");
190 return;
191 }
192
193 ckpInitArgs = (jInitArgs != NULL)
194 ? makeCKInitArgsAdapter(env, jInitArgs)
195 : NULL_PTR;
196
197 rv = (*ckpFunctions->C_Initialize)(ckpInitArgs);
198
199 free(ckpInitArgs);
200
201 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
202
203 TRACE0("FINISHED\n");
204}
205#endif
206
207#ifdef P11_ENABLE_C_FINALIZE
208/*
209 * Class: sun_security_pkcs11_wrapper_PKCS11
210 * Method: C_Finalize
211 * Signature: (Ljava/lang/Object;)V
212 * Parametermapping: *PKCS11*
213 * @param jobject jReserved CK_VOID_PTR pReserved
214 */
215JNIEXPORT void JNICALL
216Java_sun_security_pkcs11_wrapper_PKCS11_C_1Finalize
217(JNIEnv *env, jobject obj, jobject jReserved)
218{
219 /*
220 * Finalize Cryptoki
221 */
222 CK_VOID_PTR ckpReserved;
223 CK_RV rv;
224
225 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
226 if (ckpFunctions == NULL) { return; }
227
228 ckpReserved = jObjectToCKVoidPtr(jReserved);
229
230 rv = (*ckpFunctions->C_Finalize)(ckpReserved);
231 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
232}
233#endif
234
235#ifdef P11_ENABLE_C_GETINFO
236/*
237 * Class: sun_security_pkcs11_wrapper_PKCS11
238 * Method: C_GetInfo
239 * Signature: ()Lsun/security/pkcs11/wrapper/CK_INFO;
240 * Parametermapping: *PKCS11*
241 * @return jobject jInfoObject CK_INFO_PTR pInfo
242 */
243JNIEXPORT jobject JNICALL
244Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetInfo
245(JNIEnv *env, jobject obj)
246{
247 CK_INFO ckLibInfo;
248 jobject jInfoObject;
249 CK_RV rv;
250
251 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
252 if (ckpFunctions == NULL) { return NULL; }
253
254 rv = (*ckpFunctions->C_GetInfo)(&ckLibInfo);
255 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
256
257 jInfoObject = ckInfoPtrToJInfo(env, &ckLibInfo);
258
259 return jInfoObject ;
260}
261
262/*
263 * converts a pointer to a CK_INFO structure into a Java CK_INFO Object.
264 *
265 * @param env - used to call JNI funktions to create the new Java object
266 * @param ckpInfo - the pointer to the CK_INFO structure
267 * @return - the new Java CK_INFO object
268 */
269jobject ckInfoPtrToJInfo(JNIEnv *env, const CK_INFO_PTR ckpInfo)
270{
271 jclass jInfoClass;
272 jmethodID jCtrId;
273 jobject jInfoObject;
274 jobject jCryptokiVer;
275 jcharArray jVendor;
276 jlong jFlags;
277 jcharArray jLibraryDesc;
278 jobject jLibraryVer;
279
280 /* load CK_INFO class */
281 jInfoClass = (*env)->FindClass(env, CLASS_INFO);
282 assert(jInfoClass != 0);
283
284 /* load CK_INFO constructor */
285 jCtrId = (*env)->GetMethodID
286 (env, jInfoClass, "<init>",
287 "(Lsun/security/pkcs11/wrapper/CK_VERSION;[CJ[CLsun/security/pkcs11/wrapper/CK_VERSION;)V");
288
289 assert(jCtrId != 0);
290
291 /* prep all fields */
292 jCryptokiVer = ckVersionPtrToJVersion(env, &(ckpInfo->cryptokiVersion));
293 jVendor =
294 ckUTF8CharArrayToJCharArray(env, &(ckpInfo->manufacturerID[0]), 32);
295 jFlags = ckULongToJLong(ckpInfo->flags);
296 jLibraryDesc =
297 ckUTF8CharArrayToJCharArray(env, &(ckpInfo->libraryDescription[0]), 32);
298 jLibraryVer = ckVersionPtrToJVersion(env, &(ckpInfo->libraryVersion));
299
300 /* create new CK_INFO object */
301 jInfoObject = (*env)->NewObject(env, jInfoClass, jCtrId, jCryptokiVer,
302 jVendor, jFlags, jLibraryDesc, jLibraryVer);
303 assert(jInfoObject != 0);
304
305 /* free local references */
306 (*env)->DeleteLocalRef(env, jInfoClass);
307 (*env)->DeleteLocalRef(env, jCryptokiVer);
308 (*env)->DeleteLocalRef(env, jVendor);
309 (*env)->DeleteLocalRef(env, jLibraryDesc);
310 (*env)->DeleteLocalRef(env, jLibraryVer);
311
312 return jInfoObject ;
313}
314#endif
315
316#ifdef P11_ENABLE_C_GETSLOTLIST
317/*
318 * Class: sun_security_pkcs11_wrapper_PKCS11
319 * Method: C_GetSlotList
320 * Signature: (Z)[J
321 * Parametermapping: *PKCS11*
322 * @param jboolean jTokenPresent CK_BBOOL tokenPresent
323 * @return jlongArray jSlotList CK_SLOT_ID_PTR pSlotList
324 * CK_ULONG_PTR pulCount
325 */
326JNIEXPORT jlongArray JNICALL
327Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetSlotList
328(JNIEnv *env, jobject obj, jboolean jTokenPresent)
329{
330 CK_ULONG ckTokenNumber;
331 CK_SLOT_ID_PTR ckpSlotList;
332 CK_BBOOL ckTokenPresent;
333 jlongArray jSlotList;
334 CK_RV rv;
335
336 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
337 if (ckpFunctions == NULL) { return NULL; }
338
339 ckTokenPresent = jBooleanToCKBBool(jTokenPresent);
340
341 rv = (*ckpFunctions->C_GetSlotList)(ckTokenPresent, NULL_PTR,
342 &ckTokenNumber);
343 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
344
345 ckpSlotList = (CK_SLOT_ID_PTR) malloc(ckTokenNumber * sizeof(CK_SLOT_ID));
346
347 rv = (*ckpFunctions->C_GetSlotList)(ckTokenPresent, ckpSlotList,
348 &ckTokenNumber);
349
350 jSlotList = ckULongArrayToJLongArray(env, ckpSlotList, ckTokenNumber);
351 free(ckpSlotList);
352
353 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
354
355 return jSlotList ;
356}
357#endif
358
359#ifdef P11_ENABLE_C_GETSLOTINFO
360/*
361 * Class: sun_security_pkcs11_wrapper_PKCS11
362 * Method: C_GetSlotInfo
363 * Signature: (J)Lsun/security/pkcs11/wrapper/CK_SLOT_INFO;
364 * Parametermapping: *PKCS11*
365 * @param jlong jSlotID CK_SLOT_ID slotID
366 * @return jobject jSlotInfoObject CK_SLOT_INFO_PTR pInfo
367 */
368JNIEXPORT jobject JNICALL
369Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetSlotInfo
370(JNIEnv *env, jobject obj, jlong jSlotID)
371{
372 CK_SLOT_ID ckSlotID;
373 CK_SLOT_INFO ckSlotInfo;
374 jobject jSlotInfoObject;
375 CK_RV rv;
376
377 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
378 if (ckpFunctions == NULL) { return NULL; }
379
380 ckSlotID = jLongToCKULong(jSlotID);
381
382 rv = (*ckpFunctions->C_GetSlotInfo)(ckSlotID, &ckSlotInfo);
383 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
384
385 jSlotInfoObject = ckSlotInfoPtrToJSlotInfo(env, &ckSlotInfo);
386
387 return jSlotInfoObject ;
388}
389
390/*
391 * converts a pointer to a CK_SLOT_INFO structure into a Java CK_SLOT_INFO
392 * Object.
393 *
394 * @param env - used to call JNI funktions to create the new Java object
395 * @param ckpSlotInfo - the pointer to the CK_SLOT_INFO structure
396 * @return - the new Java CK_SLOT_INFO object
397 */
398jobject
399ckSlotInfoPtrToJSlotInfo
400(JNIEnv *env, const CK_SLOT_INFO_PTR ckpSlotInfo)
401{
402 jclass jSlotInfoClass;
403 jmethodID jCtrId;
404 jobject jSlotInfoObject;
405 jcharArray jSlotDesc;
406 jcharArray jVendor;
407 jlong jFlags;
408 jobject jHardwareVer;
409 jobject jFirmwareVer;
410
411 /* load CK_SLOT_INFO class */
412 jSlotInfoClass = (*env)->FindClass(env, CLASS_SLOT_INFO);
413 assert(jSlotInfoClass != 0);
414
415 /* load CK_SLOT_INFO constructor */
416 jCtrId = (*env)->GetMethodID
417 (env, jSlotInfoClass, "<init>",
418 "([C[CJLsun/security/pkcs11/wrapper/CK_VERSION;Lsun/security/pkcs11/wrapper/CK_VERSION;)V");
419 assert(jCtrId != 0);
420
421 /* prep all fields */
422 jSlotDesc =
423 ckUTF8CharArrayToJCharArray(env, &(ckpSlotInfo->slotDescription[0]), 64);
424 jVendor =
425 ckUTF8CharArrayToJCharArray(env, &(ckpSlotInfo->manufacturerID[0]), 32);
426 jFlags = ckULongToJLong(ckpSlotInfo->flags);
427 jHardwareVer = ckVersionPtrToJVersion(env, &(ckpSlotInfo->hardwareVersion));
428 jFirmwareVer = ckVersionPtrToJVersion(env, &(ckpSlotInfo->firmwareVersion));
429
430 /* create new CK_SLOT_INFO object */
431 jSlotInfoObject = (*env)->NewObject
432 (env, jSlotInfoClass, jCtrId, jSlotDesc, jVendor, jFlags,
433 jHardwareVer, jFirmwareVer);
434 assert(jSlotInfoObject != 0);
435
436 /* free local references */
437 (*env)->DeleteLocalRef(env, jSlotInfoClass);
438 (*env)->DeleteLocalRef(env, jSlotDesc);
439 (*env)->DeleteLocalRef(env, jVendor);
440 (*env)->DeleteLocalRef(env, jHardwareVer);
441 (*env)->DeleteLocalRef(env, jFirmwareVer);
442
443 return jSlotInfoObject ;
444}
445
446#endif
447
448#ifdef P11_ENABLE_C_GETTOKENINFO
449/*
450 * Class: sun_security_pkcs11_wrapper_PKCS11
451 * Method: C_GetTokenInfo
452 * Signature: (J)Lsun/security/pkcs11/wrapper/CK_TOKEN_INFO;
453 * Parametermapping: *PKCS11*
454 * @param jlong jSlotID CK_SLOT_ID slotID
455 * @return jobject jInfoTokenObject CK_TOKEN_INFO_PTR pInfo
456 */
457JNIEXPORT jobject JNICALL
458Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetTokenInfo
459(JNIEnv *env, jobject obj, jlong jSlotID)
460{
461 CK_SLOT_ID ckSlotID;
462 CK_TOKEN_INFO ckTokenInfo;
463 jobject jInfoTokenObject;
464 CK_RV rv;
465
466 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
467 if (ckpFunctions == NULL) { return NULL; }
468
469 ckSlotID = jLongToCKULong(jSlotID);
470
471 rv = (*ckpFunctions->C_GetTokenInfo)(ckSlotID, &ckTokenInfo);
472 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
473
474 jInfoTokenObject = ckTokenInfoPtrToJTokenInfo(env, &ckTokenInfo);
475
476 return jInfoTokenObject ;
477}
478
479/*
480 * converts a pointer to a CK_TOKEN_INFO structure into a Java CK_TOKEN_INFO
481 * Object.
482 *
483 * @param env - used to call JNI funktions to create the new Java object
484 * @param ckpTokenInfo - the pointer to the CK_TOKEN_INFO structure
485 * @return - the new Java CK_TOKEN_INFO object
486 */
487jobject
488ckTokenInfoPtrToJTokenInfo
489(JNIEnv *env, const CK_TOKEN_INFO_PTR ckpTokenInfo)
490{
491 jclass jTokenInfoClass;
492 jmethodID jCtrId;
493 jobject jTokenInfoObject;
494 jcharArray jLabel;
495 jcharArray jVendor;
496 jcharArray jModel;
497 jcharArray jSerialNo;
498 jlong jFlags;
499 jlong jMaxSnCnt;
500 jlong jSnCnt;
501 jlong jMaxRwSnCnt;
502 jlong jRwSnCnt;
503 jlong jMaxPinLen;
504 jlong jMinPinLen;
505 jlong jTotalPubMem;
506 jlong jFreePubMem;
507 jlong jTotalPrivMem;
508 jlong jFreePrivMem;
509 jobject jHardwareVer;
510 jobject jFirmwareVer;
511 jcharArray jUtcTime;
512
513 /* load CK_TOKEN_INFO class */
514 jTokenInfoClass = (*env)->FindClass(env, CLASS_TOKEN_INFO);
515 assert(jTokenInfoClass != 0);
516
517 /* load CK_TOKEN_INFO constructor */
518 jCtrId = (*env)->GetMethodID
519 (env, jTokenInfoClass, "<init>",
520 "([C[C[C[CJJJJJJJJJJJLsun/security/pkcs11/wrapper/CK_VERSION;Lsun/security/pkcs11/wrapper/CK_VERSION;[C)V");
521 assert(jCtrId != 0);
522
523 /* prep all fields */
524 jLabel = ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->label[0]), 32);
525 jVendor =
526 ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->manufacturerID[0]), 32);
527 jModel = ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->model[0]), 16);
528 jSerialNo =
529 ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->serialNumber[0]), 16);
530 jFlags = ckULongToJLong(ckpTokenInfo->flags);
531 jMaxSnCnt = ckULongSpecialToJLong(ckpTokenInfo->ulMaxSessionCount);
532 jSnCnt = ckULongSpecialToJLong(ckpTokenInfo->ulSessionCount);
533 jMaxRwSnCnt = ckULongSpecialToJLong(ckpTokenInfo->ulMaxRwSessionCount);
534 jRwSnCnt = ckULongSpecialToJLong(ckpTokenInfo->ulRwSessionCount);
535 jMaxPinLen = ckULongToJLong(ckpTokenInfo->ulMaxPinLen);
536 jMinPinLen = ckULongToJLong(ckpTokenInfo->ulMinPinLen);
537 jTotalPubMem = ckULongSpecialToJLong(ckpTokenInfo->ulTotalPublicMemory);
538 jFreePubMem = ckULongSpecialToJLong(ckpTokenInfo->ulFreePublicMemory);
539 jTotalPrivMem = ckULongSpecialToJLong(ckpTokenInfo->ulTotalPrivateMemory);
540 jFreePrivMem = ckULongSpecialToJLong(ckpTokenInfo->ulFreePrivateMemory);
541 jHardwareVer =
542 ckVersionPtrToJVersion(env, &(ckpTokenInfo->hardwareVersion));
543 jFirmwareVer =
544 ckVersionPtrToJVersion(env, &(ckpTokenInfo->firmwareVersion));
545 jUtcTime =
546 ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->utcTime[0]), 16);
547
548 /* create new CK_TOKEN_INFO object */
549 jTokenInfoObject =
550 (*env)->NewObject(env, jTokenInfoClass, jCtrId, jLabel, jVendor, jModel,
551 jSerialNo, jFlags,
552 jMaxSnCnt, jSnCnt, jMaxRwSnCnt, jRwSnCnt,
553 jMaxPinLen, jMinPinLen,
554 jTotalPubMem, jFreePubMem, jTotalPrivMem, jFreePrivMem,
555 jHardwareVer, jFirmwareVer, jUtcTime);
556 assert(jTokenInfoObject != 0);
557
558 /* free local references */
559 (*env)->DeleteLocalRef(env, jTokenInfoClass);
560 (*env)->DeleteLocalRef(env, jLabel);
561 (*env)->DeleteLocalRef(env, jVendor);
562 (*env)->DeleteLocalRef(env, jModel);
563 (*env)->DeleteLocalRef(env, jSerialNo);
564 (*env)->DeleteLocalRef(env, jHardwareVer);
565 (*env)->DeleteLocalRef(env, jFirmwareVer);
566
567 return jTokenInfoObject ;
568}
569#endif
570
571#ifdef P11_ENABLE_C_WAITFORSLOTEVENT
572/*
573 * Class: sun_security_pkcs11_wrapper_PKCS11
574 * Method: C_WaitForSlotEvent
575 * Signature: (JLjava/lang/Object;)J
576 * Parametermapping: *PKCS11*
577 * @param jlong jFlags CK_FLAGS flags
578 * @param jobject jReserved CK_VOID_PTR pReserved
579 * @return jlong jSlotID CK_SLOT_ID_PTR pSlot
580 */
581JNIEXPORT jlong JNICALL
582Java_sun_security_pkcs11_wrapper_PKCS11_C_1WaitForSlotEvent
583(JNIEnv *env, jobject obj, jlong jFlags, jobject jReserved)
584{
585 CK_FLAGS ckFlags;
586 CK_SLOT_ID ckSlotID;
587 jlong jSlotID;
588 CK_RV rv;
589
590 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
591 if (ckpFunctions == NULL) { return 0L; }
592
593 ckFlags = jLongToCKULong(jFlags);
594
595 rv = (*ckpFunctions->C_WaitForSlotEvent)(ckFlags, &ckSlotID, NULL_PTR);
596 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L; }
597
598 jSlotID = ckULongToJLong(ckSlotID);
599
600 return jSlotID ;
601}
602#endif
603
604#ifdef P11_ENABLE_C_GETMECHANISMLIST
605/*
606 * Class: sun_security_pkcs11_wrapper_PKCS11
607 * Method: C_GetMechanismList
608 * Signature: (J)[J
609 * Parametermapping: *PKCS11*
610 * @param jlong jSlotID CK_SLOT_ID slotID
611 * @return jlongArray jMechanismList CK_MECHANISM_TYPE_PTR pMechanismList
612 * CK_ULONG_PTR pulCount
613 */
614JNIEXPORT jlongArray JNICALL
615Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetMechanismList
616(JNIEnv *env, jobject obj, jlong jSlotID)
617{
618 CK_SLOT_ID ckSlotID;
619 CK_ULONG ckMechanismNumber;
620 CK_MECHANISM_TYPE_PTR ckpMechanismList;
621 jlongArray jMechanismList;
622 CK_RV rv;
623
624 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
625 if (ckpFunctions == NULL) { return NULL; }
626
627 ckSlotID = jLongToCKULong(jSlotID);
628
629 rv = (*ckpFunctions->C_GetMechanismList)(ckSlotID, NULL_PTR,
630 &ckMechanismNumber);
631 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
632
633 ckpMechanismList = (CK_MECHANISM_TYPE_PTR)
634 malloc(ckMechanismNumber * sizeof(CK_MECHANISM_TYPE));
635
636 rv = (*ckpFunctions->C_GetMechanismList)(ckSlotID, ckpMechanismList,
637 &ckMechanismNumber);
638
639 jMechanismList = ckULongArrayToJLongArray(env, ckpMechanismList,
640 ckMechanismNumber);
641 free(ckpMechanismList);
642
643 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
644
645 return jMechanismList ;
646}
647#endif
648
649#ifdef P11_ENABLE_C_GETMECHANISMINFO
650/*
651 * Class: sun_security_pkcs11_wrapper_PKCS11
652 * Method: C_GetMechanismInfo
653 * Signature: (JJ)Lsun/security/pkcs11/wrapper/CK_MECHANISM_INFO;
654 * Parametermapping: *PKCS11*
655 * @param jlong jSlotID CK_SLOT_ID slotID
656 * @param jlong jType CK_MECHANISM_TYPE type
657 * @return jobject jMechanismInfo CK_MECHANISM_INFO_PTR pInfo
658 */
659JNIEXPORT jobject JNICALL
660Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetMechanismInfo
661(JNIEnv *env, jobject obj, jlong jSlotID, jlong jType)
662{
663 CK_SLOT_ID ckSlotID;
664 CK_MECHANISM_TYPE ckMechanismType;
665 CK_MECHANISM_INFO ckMechanismInfo;
666 jobject jMechanismInfo;
667 CK_RV rv;
668
669 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
670 if (ckpFunctions == NULL) { return NULL; }
671
672 ckSlotID = jLongToCKULong(jSlotID);
673 ckMechanismType = jLongToCKULong(jType);
674
675 rv = (*ckpFunctions->C_GetMechanismInfo)(ckSlotID, ckMechanismType,
676 &ckMechanismInfo);
677 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
678
679 jMechanismInfo = ckMechanismInfoPtrToJMechanismInfo(env, &ckMechanismInfo);
680
681 return jMechanismInfo ;
682}
683
684/*
685 * converts a pointer to a CK_MECHANISM_INFO structure into a Java
686 * CK_MECHANISM_INFO Object.
687 *
688 * @param env - used to call JNI funktions to create the new Java object
689 * @param ckpMechanismInfo - the pointer to the CK_MECHANISM_INFO structure
690 * @return - the new Java CK_MECHANISM_INFO object
691 */
692jobject
693ckMechanismInfoPtrToJMechanismInfo
694(JNIEnv *env, const CK_MECHANISM_INFO_PTR ckpMechanismInfo)
695{
696
697 jclass jMechanismInfoClass;
698 jmethodID jCtrId;
699 jobject jMechanismInfoObject;
700 jlong jMinKeySize;
701 jlong jMaxKeySize;
702 jlong jFlags;
703
704 /* load CK_MECHANISM_INFO class */
705 jMechanismInfoClass = (*env)->FindClass(env, CLASS_MECHANISM_INFO);
706 assert(jMechanismInfoClass != 0);
707
708 /* load CK_MECHANISM_INFO constructor */
709 jCtrId = (*env)->GetMethodID(env, jMechanismInfoClass, "<init>", "(JJJ)V");
710 assert(jCtrId != 0);
711
712 /* prep all fields */
713 jMinKeySize = ckULongToJLong(ckpMechanismInfo->ulMinKeySize);
714 jMaxKeySize = ckULongToJLong(ckpMechanismInfo->ulMaxKeySize);
715 jFlags = ckULongToJLong(ckpMechanismInfo->flags);
716
717 /* create new CK_MECHANISM_INFO object */
718 jMechanismInfoObject = (*env)->NewObject(env, jMechanismInfoClass, jCtrId,
719 jMinKeySize, jMaxKeySize, jFlags);
720 assert(jMechanismInfoObject != 0);
721
722 /* free local references */
723 (*env)->DeleteLocalRef(env, jMechanismInfoClass);
724
725 return jMechanismInfoObject ;
726}
727#endif
728
729#ifdef P11_ENABLE_C_INITTOKEN
730/*
731 * Class: sun_security_pkcs11_wrapper_PKCS11
732 * Method: C_InitToken
733 * Signature: (J[C[C)V
734 * Parametermapping: *PKCS11*
735 * @param jlong jSlotID CK_SLOT_ID slotID
736 * @param jcharArray jPin CK_CHAR_PTR pPin
737 * CK_ULONG ulPinLen
738 * @param jcharArray jLabel CK_UTF8CHAR_PTR pLabel
739 */
740JNIEXPORT void JNICALL
741Java_sun_security_pkcs11_wrapper_PKCS11_C_1InitToken
742(JNIEnv *env, jobject obj, jlong jSlotID, jcharArray jPin, jcharArray jLabel)
743{
744 CK_SLOT_ID ckSlotID;
745 CK_CHAR_PTR ckpPin = NULL_PTR;
746 CK_UTF8CHAR_PTR ckpLabel = NULL_PTR;
747 CK_ULONG ckPinLength;
748 CK_ULONG ckLabelLength;
749 CK_RV rv;
750
751 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
752 if (ckpFunctions == NULL) { return; }
753
754 ckSlotID = jLongToCKULong(jSlotID);
755 jCharArrayToCKCharArray(env, jPin, &ckpPin, &ckPinLength);
756 jCharArrayToCKUTF8CharArray(env, jLabel, &ckpLabel, &ckLabelLength);
757 /* ckLabelLength <= 32 !!! */
758
759 rv = (*ckpFunctions->C_InitToken)(ckSlotID, ckpPin, ckPinLength, ckpLabel);
760 TRACE1("InitToken return code: %d", rv);
761
762 free(ckpPin);
763 free(ckpLabel);
764
765 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
766}
767#endif
768
769#ifdef P11_ENABLE_C_INITPIN
770/*
771 * Class: sun_security_pkcs11_wrapper_PKCS11
772 * Method: C_InitPIN
773 * Signature: (J[C)V
774 * Parametermapping: *PKCS11*
775 * @param jlong jSessionHandle CK_SESSION_HANDLE
776 * @param jcharArray jPin CK_CHAR_PTR pPin
777 * CK_ULONG ulPinLen
778 */
779JNIEXPORT void JNICALL
780Java_sun_security_pkcs11_wrapper_PKCS11_C_1InitPIN
781(JNIEnv *env, jobject obj, jlong jSessionHandle, jcharArray jPin)
782{
783 CK_SESSION_HANDLE ckSessionHandle;
784 CK_CHAR_PTR ckpPin = NULL_PTR;
785 CK_ULONG ckPinLength;
786 CK_RV rv;
787
788 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
789 if (ckpFunctions == NULL) { return; }
790
791 ckSessionHandle = jLongToCKULong(jSessionHandle);
792 jCharArrayToCKCharArray(env, jPin, &ckpPin, &ckPinLength);
793
794 rv = (*ckpFunctions->C_InitPIN)(ckSessionHandle, ckpPin, ckPinLength);
795
796 free(ckpPin);
797
798 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
799}
800#endif
801
802#ifdef P11_ENABLE_C_SETPIN
803/*
804 * Class: sun_security_pkcs11_wrapper_PKCS11
805 * Method: C_SetPIN
806 * Signature: (J[C[C)V
807 * Parametermapping: *PKCS11*
808 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession
809 * @param jcharArray jOldPin CK_CHAR_PTR pOldPin
810 * CK_ULONG ulOldLen
811 * @param jcharArray jNewPin CK_CHAR_PTR pNewPin
812 * CK_ULONG ulNewLen
813 */
814JNIEXPORT void JNICALL
815Java_sun_security_pkcs11_wrapper_PKCS11_C_1SetPIN
816(JNIEnv *env, jobject obj, jlong jSessionHandle, jcharArray jOldPin,
817jcharArray jNewPin)
818{
819 CK_SESSION_HANDLE ckSessionHandle;
820 CK_CHAR_PTR ckpOldPin = NULL_PTR;
821 CK_CHAR_PTR ckpNewPin = NULL_PTR;
822 CK_ULONG ckOldPinLength;
823 CK_ULONG ckNewPinLength;
824 CK_RV rv;
825
826 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
827 if (ckpFunctions == NULL) { return; }
828
829 ckSessionHandle = jLongToCKULong(jSessionHandle);
830 jCharArrayToCKCharArray(env, jOldPin, &ckpOldPin, &ckOldPinLength);
831 jCharArrayToCKCharArray(env, jNewPin, &ckpNewPin, &ckNewPinLength);
832
833 rv = (*ckpFunctions->C_SetPIN)(ckSessionHandle, ckpOldPin, ckOldPinLength,
834 ckpNewPin, ckNewPinLength);
835
836 free(ckpOldPin);
837 free(ckpNewPin);
838
839 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
840}
841#endif