Path: blob/master/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_general.c
41149 views
/*1* Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved.2*/34/* Copyright (c) 2002 Graz University of Technology. All rights reserved.5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions are met:8*9* 1. Redistributions of source code must retain the above copyright notice,10* this list of conditions and the following disclaimer.11*12* 2. Redistributions in binary form must reproduce the above copyright notice,13* this list of conditions and the following disclaimer in the documentation14* and/or other materials provided with the distribution.15*16* 3. The end-user documentation included with the redistribution, if any, must17* include the following acknowledgment:18*19* "This product includes software developed by IAIK of Graz University of20* Technology."21*22* Alternately, this acknowledgment may appear in the software itself, if23* and wherever such third-party acknowledgments normally appear.24*25* 4. The names "Graz University of Technology" and "IAIK of Graz University of26* Technology" must not be used to endorse or promote products derived from27* this software without prior written permission.28*29* 5. Products derived from this software may not be called30* "IAIK PKCS Wrapper", nor may "IAIK" appear in their name, without prior31* written permission of Graz University of Technology.32*33* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED34* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED35* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR36* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE LICENSOR BE37* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,38* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,39* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,40* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON41* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,42* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY43* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE44* POSSIBILITY OF SUCH DAMAGE.45*/4647#include "pkcs11wrapper.h"4849#include <stdio.h>50#include <stdlib.h>51#include <string.h>52#include <assert.h>53#include "jlong.h"5455#include "sun_security_pkcs11_wrapper_PKCS11.h"5657/* declare file private functions */5859void 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);6465/* define variables */6667jfieldID pNativeDataID;68jfieldID mech_mechanismID;69jfieldID mech_pParameterID;70jfieldID mech_pHandleID;7172jclass jByteArrayClass;73jclass jLongClass;7475JavaVM* jvm = NULL;7677jboolean debug = 0;7879JNIEXPORT jint JNICALL DEF_JNI_OnLoad(JavaVM *vm, void *reserved) {80jvm = vm;81return JNI_VERSION_1_4;82}8384/* ************************************************************************** */85/* The native implementation of the methods of the PKCS11Implementation class */86/* ************************************************************************** */8788/*89* This method is used to do free the memory allocated for CK_MECHANISM structure.90*91* Class: sun_security_pkcs11_wrapper_PKCS1192* Method: freeMechanism93* Signature: (J)J94*/95JNIEXPORT jlong JNICALL96Java_sun_security_pkcs11_wrapper_PKCS11_freeMechanism97(JNIEnv *env, jclass thisClass, jlong ckpMechanism) {98if (ckpMechanism != 0L) {99freeCKMechanismPtr(jlong_to_ptr(ckpMechanism));100TRACE1("DEBUG PKCS11_freeMechanism: free pMech = %lld\n", (long long int) ckpMechanism);101}102return 0L;103}104105/*106* This method is used to do static initialization. This method is static and107* synchronized. Summary: use this method like a static initialization block.108*109* Class: sun_security_pkcs11_wrapper_PKCS11110* Method: initializeLibrary111* Signature: ()V112*/113JNIEXPORT void JNICALL114Java_sun_security_pkcs11_wrapper_PKCS11_initializeLibrary115(JNIEnv *env, jclass thisClass, jboolean enableDebug)116{117#ifndef NO_CALLBACKS118if (notifyListLock == NULL) {119notifyListLock = createLockObject(env);120}121#endif122123prefetchFields(env, thisClass);124debug = enableDebug;125}126127jclass fetchClass(JNIEnv *env, const char *name) {128jclass tmpClass = (*env)->FindClass(env, name);129if (tmpClass == NULL) { return NULL; }130return (*env)->NewGlobalRef(env, tmpClass);131}132133void prefetchFields(JNIEnv *env, jclass thisClass) {134jclass tmpClass;135136/* PKCS11 - pNativeData */137pNativeDataID = (*env)->GetFieldID(env, thisClass, "pNativeData", "J");138if (pNativeDataID == NULL) { return; }139140/* CK_MECHANISM - mechanism, pParameter, pHandle */141tmpClass = (*env)->FindClass(env, CLASS_MECHANISM);142if (tmpClass == NULL) { return; }143mech_mechanismID = (*env)->GetFieldID(env, tmpClass, "mechanism", "J");144if (mech_mechanismID == NULL) { return; }145mech_pParameterID = (*env)->GetFieldID(env, tmpClass, "pParameter",146"Ljava/lang/Object;");147if (mech_pParameterID == NULL) { return; }148mech_pHandleID = (*env)->GetFieldID(env, tmpClass, "pHandle", "J");149if (mech_pHandleID == NULL) { return; }150151/* java classes for primitive types - byte[], long */152jByteArrayClass = fetchClass(env, "[B");153if (jByteArrayClass == NULL) { return; }154jLongClass = fetchClass(env, "java/lang/Long");155}156157/* This method is designed to do a clean-up. It releases all global resources158* of this library. By now, this function is not called. Calling from159* JNI_OnUnload would be an option, but some VMs do not support JNI_OnUnload.160*161* Class: sun_security_pkcs11_wrapper_PKCS11162* Method: finalizeLibrary163* Signature: ()V164*/165JNIEXPORT void JNICALL166Java_sun_security_pkcs11_wrapper_PKCS11_finalizeLibrary167(JNIEnv *env, jclass thisClass)168{169/* XXX170* remove all left lists and release the resources and the lock171* objects that synchroniz access to these lists.172*173removeAllModuleEntries(env);174if (moduleListHead == NULL) { * check, if we removed the last active module *175* remove also the moduleListLock, it is no longer used *176if (moduleListLock != NULL) {177destroyLockObject(env, moduleListLock);178moduleListLock = NULL;179}180#ifndef NO_CALLBACKS181* remove all left notify callback entries *182while (removeFirstNotifyEntry(env));183* remove also the notifyListLock, it is no longer used *184if (notifyListLock != NULL) {185destroyLockObject(env, notifyListLock);186notifyListLock = NULL;187}188if (jInitArgsObject != NULL) {189(*env)->DeleteGlobalRef(env, jInitArgsObject);190}191if (ckpGlobalInitArgs != NULL_PTR) {192free(ckpGlobalInitArgs);193}194#endif * NO_CALLBACKS *195}196*/197}198199#ifdef P11_ENABLE_C_INITIALIZE200/*201* Class: sun_security_pkcs11_wrapper_PKCS11202* Method: C_Initialize203* Signature: (Ljava/lang/Object;)V204* Parametermapping: *PKCS11*205* @param jobject jInitArgs CK_VOID_PTR pInitArgs206*/207JNIEXPORT void JNICALL208Java_sun_security_pkcs11_wrapper_PKCS11_C_1Initialize209(JNIEnv *env, jobject obj, jobject jInitArgs)210{211/*212* Initalize Cryptoki213*/214CK_C_INITIALIZE_ARGS_PTR ckpInitArgs;215CK_RV rv;216CK_FUNCTION_LIST_PTR ckpFunctions;217218TRACE0("DEBUG: initializing module... ");219220ckpFunctions = getFunctionList(env, obj);221if (ckpFunctions == NULL) {222TRACE0("failed getting module entry");223return;224}225226ckpInitArgs = (jInitArgs != NULL)227? makeCKInitArgsAdapter(env, jInitArgs)228: NULL_PTR;229230rv = (*ckpFunctions->C_Initialize)(ckpInitArgs);231232free(ckpInitArgs);233234if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {235TRACE1("DEBUG: C_Initialize had a bad return value %lu \n", (unsigned long) rv);236return;237}238239TRACE0("FINISHED\n");240}241#endif242243#ifdef P11_ENABLE_C_FINALIZE244/*245* Class: sun_security_pkcs11_wrapper_PKCS11246* Method: C_Finalize247* Signature: (Ljava/lang/Object;)V248* Parametermapping: *PKCS11*249* @param jobject jReserved CK_VOID_PTR pReserved250*/251JNIEXPORT void JNICALL252Java_sun_security_pkcs11_wrapper_PKCS11_C_1Finalize253(JNIEnv *env, jobject obj, jobject jReserved)254{255/*256* Finalize Cryptoki257*/258CK_VOID_PTR ckpReserved;259CK_RV rv;260261CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);262if (ckpFunctions == NULL) { return; }263264ckpReserved = jObjectToCKVoidPtr(jReserved);265266rv = (*ckpFunctions->C_Finalize)(ckpReserved);267if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }268}269#endif270271#ifdef P11_ENABLE_C_GETINFO272/*273* Class: sun_security_pkcs11_wrapper_PKCS11274* Method: C_GetInfo275* Signature: ()Lsun/security/pkcs11/wrapper/CK_INFO;276* Parametermapping: *PKCS11*277* @return jobject jInfoObject CK_INFO_PTR pInfo278*/279JNIEXPORT jobject JNICALL280Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetInfo281(JNIEnv *env, jobject obj)282{283CK_INFO ckLibInfo;284jobject jInfoObject=NULL;285CK_RV rv;286CK_FUNCTION_LIST_PTR ckpFunctions;287memset(&ckLibInfo, 0, sizeof(CK_INFO));288289ckpFunctions = getFunctionList(env, obj);290if (ckpFunctions == NULL) { return NULL; }291292rv = (*ckpFunctions->C_GetInfo)(&ckLibInfo);293if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {294jInfoObject = ckInfoPtrToJInfo(env, &ckLibInfo);295}296return jInfoObject ;297}298299/*300* converts a pointer to a CK_INFO structure into a Java CK_INFO Object.301*302* @param env - used to call JNI funktions to create the new Java object303* @param ckpInfo - the pointer to the CK_INFO structure304* @return - the new Java CK_INFO object305*/306jobject ckInfoPtrToJInfo(JNIEnv *env, const CK_INFO_PTR ckpInfo)307{308jclass jInfoClass;309jmethodID jCtrId;310jobject jInfoObject;311jobject jCryptokiVer;312jcharArray jVendor;313jlong jFlags;314jcharArray jLibraryDesc;315jobject jLibraryVer;316317/* load CK_INFO class */318jInfoClass = (*env)->FindClass(env, CLASS_INFO);319if (jInfoClass == NULL) { return NULL; };320321/* load CK_INFO constructor */322jCtrId = (*env)->GetMethodID323(env, jInfoClass, "<init>",324"(Lsun/security/pkcs11/wrapper/CK_VERSION;[CJ[CLsun/security/pkcs11/wrapper/CK_VERSION;)V");325if (jCtrId == NULL) { return NULL; }326327/* prep all fields */328jCryptokiVer = ckVersionPtrToJVersion(env, &(ckpInfo->cryptokiVersion));329if (jCryptokiVer == NULL) { return NULL; }330jVendor =331ckUTF8CharArrayToJCharArray(env, &(ckpInfo->manufacturerID[0]), 32);332if (jVendor == NULL) { return NULL; }333jFlags = ckULongToJLong(ckpInfo->flags);334jLibraryDesc =335ckUTF8CharArrayToJCharArray(env, &(ckpInfo->libraryDescription[0]), 32);336if (jLibraryDesc == NULL) { return NULL; }337jLibraryVer = ckVersionPtrToJVersion(env, &(ckpInfo->libraryVersion));338if (jLibraryVer == NULL) { return NULL; }339340/* create new CK_INFO object */341jInfoObject = (*env)->NewObject(env, jInfoClass, jCtrId, jCryptokiVer,342jVendor, jFlags, jLibraryDesc, jLibraryVer);343if (jInfoObject == NULL) { return NULL; }344345/* free local references */346(*env)->DeleteLocalRef(env, jInfoClass);347(*env)->DeleteLocalRef(env, jCryptokiVer);348(*env)->DeleteLocalRef(env, jVendor);349(*env)->DeleteLocalRef(env, jLibraryDesc);350(*env)->DeleteLocalRef(env, jLibraryVer);351352return jInfoObject ;353}354#endif355356#ifdef P11_ENABLE_C_GETSLOTLIST357/*358* Class: sun_security_pkcs11_wrapper_PKCS11359* Method: C_GetSlotList360* Signature: (Z)[J361* Parametermapping: *PKCS11*362* @param jboolean jTokenPresent CK_BBOOL tokenPresent363* @return jlongArray jSlotList CK_SLOT_ID_PTR pSlotList364* CK_ULONG_PTR pulCount365*/366JNIEXPORT jlongArray JNICALL367Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetSlotList368(JNIEnv *env, jobject obj, jboolean jTokenPresent)369{370CK_ULONG ckTokenNumber;371CK_SLOT_ID_PTR ckpSlotList;372CK_BBOOL ckTokenPresent;373jlongArray jSlotList = NULL;374CK_RV rv;375376CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);377if (ckpFunctions == NULL) { return NULL; }378379ckTokenPresent = jBooleanToCKBBool(jTokenPresent);380381rv = (*ckpFunctions->C_GetSlotList)(ckTokenPresent, NULL_PTR,382&ckTokenNumber);383if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }384385ckpSlotList = (CK_SLOT_ID_PTR) malloc(ckTokenNumber * sizeof(CK_SLOT_ID));386if (ckpSlotList == NULL) {387throwOutOfMemoryError(env, 0);388return NULL;389}390391rv = (*ckpFunctions->C_GetSlotList)(ckTokenPresent, ckpSlotList,392&ckTokenNumber);393if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {394jSlotList = ckULongArrayToJLongArray(env, ckpSlotList, ckTokenNumber);395}396free(ckpSlotList);397398return jSlotList ;399}400#endif401402#ifdef P11_ENABLE_C_GETSLOTINFO403/*404* Class: sun_security_pkcs11_wrapper_PKCS11405* Method: C_GetSlotInfo406* Signature: (J)Lsun/security/pkcs11/wrapper/CK_SLOT_INFO;407* Parametermapping: *PKCS11*408* @param jlong jSlotID CK_SLOT_ID slotID409* @return jobject jSlotInfoObject CK_SLOT_INFO_PTR pInfo410*/411JNIEXPORT jobject JNICALL412Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetSlotInfo413(JNIEnv *env, jobject obj, jlong jSlotID)414{415CK_SLOT_ID ckSlotID;416CK_SLOT_INFO ckSlotInfo;417jobject jSlotInfoObject=NULL;418CK_RV rv;419420CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);421if (ckpFunctions == NULL) { return NULL; }422423ckSlotID = jLongToCKULong(jSlotID);424425rv = (*ckpFunctions->C_GetSlotInfo)(ckSlotID, &ckSlotInfo);426if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {427jSlotInfoObject = ckSlotInfoPtrToJSlotInfo(env, &ckSlotInfo);428}429return jSlotInfoObject;430}431432/*433* converts a pointer to a CK_SLOT_INFO structure into a Java CK_SLOT_INFO434* Object.435*436* @param env - used to call JNI funktions to create the new Java object437* @param ckpSlotInfo - the pointer to the CK_SLOT_INFO structure438* @return - the new Java CK_SLOT_INFO object439*/440jobject441ckSlotInfoPtrToJSlotInfo442(JNIEnv *env, const CK_SLOT_INFO_PTR ckpSlotInfo)443{444jclass jSlotInfoClass;445jmethodID jCtrId;446jobject jSlotInfoObject;447jcharArray jSlotDesc;448jcharArray jVendor;449jlong jFlags;450jobject jHardwareVer;451jobject jFirmwareVer;452453/* load CK_SLOT_INFO class */454jSlotInfoClass = (*env)->FindClass(env, CLASS_SLOT_INFO);455if (jSlotInfoClass == NULL) { return NULL; };456457/* load CK_SLOT_INFO constructor */458jCtrId = (*env)->GetMethodID459(env, jSlotInfoClass, "<init>",460"([C[CJLsun/security/pkcs11/wrapper/CK_VERSION;Lsun/security/pkcs11/wrapper/CK_VERSION;)V");461if (jCtrId == NULL) { return NULL; }462463/* prep all fields */464jSlotDesc =465ckUTF8CharArrayToJCharArray(env, &(ckpSlotInfo->slotDescription[0]), 64);466if (jSlotDesc == NULL) { return NULL; }467jVendor =468ckUTF8CharArrayToJCharArray(env, &(ckpSlotInfo->manufacturerID[0]), 32);469if (jVendor == NULL) { return NULL; }470jFlags = ckULongToJLong(ckpSlotInfo->flags);471jHardwareVer = ckVersionPtrToJVersion(env, &(ckpSlotInfo->hardwareVersion));472if (jHardwareVer == NULL) { return NULL; }473jFirmwareVer = ckVersionPtrToJVersion(env, &(ckpSlotInfo->firmwareVersion));474if (jFirmwareVer == NULL) { return NULL; }475476/* create new CK_SLOT_INFO object */477jSlotInfoObject = (*env)->NewObject478(env, jSlotInfoClass, jCtrId, jSlotDesc, jVendor, jFlags,479jHardwareVer, jFirmwareVer);480if (jSlotInfoObject == NULL) { return NULL; }481482/* free local references */483(*env)->DeleteLocalRef(env, jSlotInfoClass);484(*env)->DeleteLocalRef(env, jSlotDesc);485(*env)->DeleteLocalRef(env, jVendor);486(*env)->DeleteLocalRef(env, jHardwareVer);487(*env)->DeleteLocalRef(env, jFirmwareVer);488489return jSlotInfoObject ;490}491492#endif493494#ifdef P11_ENABLE_C_GETTOKENINFO495/*496* Class: sun_security_pkcs11_wrapper_PKCS11497* Method: C_GetTokenInfo498* Signature: (J)Lsun/security/pkcs11/wrapper/CK_TOKEN_INFO;499* Parametermapping: *PKCS11*500* @param jlong jSlotID CK_SLOT_ID slotID501* @return jobject jInfoTokenObject CK_TOKEN_INFO_PTR pInfo502*/503JNIEXPORT jobject JNICALL504Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetTokenInfo505(JNIEnv *env, jobject obj, jlong jSlotID)506{507CK_SLOT_ID ckSlotID;508CK_TOKEN_INFO ckTokenInfo;509jobject jInfoTokenObject = NULL;510CK_RV rv;511512CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);513if (ckpFunctions == NULL) { return NULL; }514515ckSlotID = jLongToCKULong(jSlotID);516517rv = (*ckpFunctions->C_GetTokenInfo)(ckSlotID, &ckTokenInfo);518if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {519jInfoTokenObject = ckTokenInfoPtrToJTokenInfo(env, &ckTokenInfo);520}521return jInfoTokenObject ;522}523524/*525* converts a pointer to a CK_TOKEN_INFO structure into a Java CK_TOKEN_INFO526* Object.527*528* @param env - used to call JNI funktions to create the new Java object529* @param ckpTokenInfo - the pointer to the CK_TOKEN_INFO structure530* @return - the new Java CK_TOKEN_INFO object531*/532jobject533ckTokenInfoPtrToJTokenInfo534(JNIEnv *env, const CK_TOKEN_INFO_PTR ckpTokenInfo)535{536jclass jTokenInfoClass;537jmethodID jCtrId;538jobject jTokenInfoObject;539jcharArray jLabel;540jcharArray jVendor;541jcharArray jModel;542jcharArray jSerialNo;543jlong jFlags;544jlong jMaxSnCnt;545jlong jSnCnt;546jlong jMaxRwSnCnt;547jlong jRwSnCnt;548jlong jMaxPinLen;549jlong jMinPinLen;550jlong jTotalPubMem;551jlong jFreePubMem;552jlong jTotalPrivMem;553jlong jFreePrivMem;554jobject jHardwareVer;555jobject jFirmwareVer;556jcharArray jUtcTime;557558/* load CK_TOKEN_INFO class */559jTokenInfoClass = (*env)->FindClass(env, CLASS_TOKEN_INFO);560if (jTokenInfoClass == NULL) { return NULL; };561562/* load CK_TOKEN_INFO constructor */563jCtrId = (*env)->GetMethodID564(env, jTokenInfoClass, "<init>",565"([C[C[C[CJJJJJJJJJJJLsun/security/pkcs11/wrapper/CK_VERSION;Lsun/security/pkcs11/wrapper/CK_VERSION;[C)V");566if (jCtrId == NULL) { return NULL; };567568/* prep all fields */569jLabel = ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->label[0]), 32);570if (jLabel == NULL) { return NULL; };571jVendor =572ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->manufacturerID[0]), 32);573if (jVendor == NULL) { return NULL; };574jModel = ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->model[0]), 16);575if (jModel == NULL) { return NULL; };576jSerialNo =577ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->serialNumber[0]), 16);578if (jSerialNo == NULL) { return NULL; };579jFlags = ckULongToJLong(ckpTokenInfo->flags);580jMaxSnCnt = ckULongSpecialToJLong(ckpTokenInfo->ulMaxSessionCount);581jSnCnt = ckULongSpecialToJLong(ckpTokenInfo->ulSessionCount);582jMaxRwSnCnt = ckULongSpecialToJLong(ckpTokenInfo->ulMaxRwSessionCount);583jRwSnCnt = ckULongSpecialToJLong(ckpTokenInfo->ulRwSessionCount);584jMaxPinLen = ckULongToJLong(ckpTokenInfo->ulMaxPinLen);585jMinPinLen = ckULongToJLong(ckpTokenInfo->ulMinPinLen);586jTotalPubMem = ckULongSpecialToJLong(ckpTokenInfo->ulTotalPublicMemory);587jFreePubMem = ckULongSpecialToJLong(ckpTokenInfo->ulFreePublicMemory);588jTotalPrivMem = ckULongSpecialToJLong(ckpTokenInfo->ulTotalPrivateMemory);589jFreePrivMem = ckULongSpecialToJLong(ckpTokenInfo->ulFreePrivateMemory);590jHardwareVer =591ckVersionPtrToJVersion(env, &(ckpTokenInfo->hardwareVersion));592if (jHardwareVer == NULL) { return NULL; }593jFirmwareVer =594ckVersionPtrToJVersion(env, &(ckpTokenInfo->firmwareVersion));595if (jFirmwareVer == NULL) { return NULL; }596jUtcTime =597ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->utcTime[0]), 16);598if (jUtcTime == NULL) { return NULL; }599600/* create new CK_TOKEN_INFO object */601jTokenInfoObject =602(*env)->NewObject(env, jTokenInfoClass, jCtrId, jLabel, jVendor, jModel,603jSerialNo, jFlags,604jMaxSnCnt, jSnCnt, jMaxRwSnCnt, jRwSnCnt,605jMaxPinLen, jMinPinLen,606jTotalPubMem, jFreePubMem, jTotalPrivMem, jFreePrivMem,607jHardwareVer, jFirmwareVer, jUtcTime);608if (jTokenInfoObject == NULL) { return NULL; }609610/* free local references */611(*env)->DeleteLocalRef(env, jTokenInfoClass);612(*env)->DeleteLocalRef(env, jLabel);613(*env)->DeleteLocalRef(env, jVendor);614(*env)->DeleteLocalRef(env, jModel);615(*env)->DeleteLocalRef(env, jSerialNo);616(*env)->DeleteLocalRef(env, jHardwareVer);617(*env)->DeleteLocalRef(env, jFirmwareVer);618619return jTokenInfoObject ;620}621#endif622623#ifdef P11_ENABLE_C_WAITFORSLOTEVENT624/*625* Class: sun_security_pkcs11_wrapper_PKCS11626* Method: C_WaitForSlotEvent627* Signature: (JLjava/lang/Object;)J628* Parametermapping: *PKCS11*629* @param jlong jFlags CK_FLAGS flags630* @param jobject jReserved CK_VOID_PTR pReserved631* @return jlong jSlotID CK_SLOT_ID_PTR pSlot632*/633JNIEXPORT jlong JNICALL634Java_sun_security_pkcs11_wrapper_PKCS11_C_1WaitForSlotEvent635(JNIEnv *env, jobject obj, jlong jFlags, jobject jReserved)636{637CK_FLAGS ckFlags;638CK_SLOT_ID ckSlotID;639jlong jSlotID = 0L;640CK_RV rv;641642CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);643if (ckpFunctions == NULL) { return 0L; }644645ckFlags = jLongToCKULong(jFlags);646647rv = (*ckpFunctions->C_WaitForSlotEvent)(ckFlags, &ckSlotID, NULL_PTR);648if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {649jSlotID = ckULongToJLong(ckSlotID);650}651652return jSlotID ;653}654#endif655656#ifdef P11_ENABLE_C_GETMECHANISMLIST657/*658* Class: sun_security_pkcs11_wrapper_PKCS11659* Method: C_GetMechanismList660* Signature: (J)[J661* Parametermapping: *PKCS11*662* @param jlong jSlotID CK_SLOT_ID slotID663* @return jlongArray jMechanismList CK_MECHANISM_TYPE_PTR pMechanismList664* CK_ULONG_PTR pulCount665*/666JNIEXPORT jlongArray JNICALL667Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetMechanismList668(JNIEnv *env, jobject obj, jlong jSlotID)669{670CK_SLOT_ID ckSlotID;671CK_ULONG ckMechanismNumber;672CK_MECHANISM_TYPE_PTR ckpMechanismList;673jlongArray jMechanismList = NULL;674CK_RV rv;675676CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);677if (ckpFunctions == NULL) { return NULL; }678679ckSlotID = jLongToCKULong(jSlotID);680681rv = (*ckpFunctions->C_GetMechanismList)(ckSlotID, NULL_PTR,682&ckMechanismNumber);683if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }684685ckpMechanismList = (CK_MECHANISM_TYPE_PTR)686malloc(ckMechanismNumber * sizeof(CK_MECHANISM_TYPE));687if (ckpMechanismList == NULL) {688throwOutOfMemoryError(env, 0);689return NULL;690}691692rv = (*ckpFunctions->C_GetMechanismList)(ckSlotID, ckpMechanismList,693&ckMechanismNumber);694if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {695jMechanismList = ckULongArrayToJLongArray(env, ckpMechanismList,696ckMechanismNumber);697}698free(ckpMechanismList);699700return jMechanismList ;701}702#endif703704#ifdef P11_ENABLE_C_GETMECHANISMINFO705/*706* Class: sun_security_pkcs11_wrapper_PKCS11707* Method: C_GetMechanismInfo708* Signature: (JJ)Lsun/security/pkcs11/wrapper/CK_MECHANISM_INFO;709* Parametermapping: *PKCS11*710* @param jlong jSlotID CK_SLOT_ID slotID711* @param jlong jType CK_MECHANISM_TYPE type712* @return jobject jMechanismInfo CK_MECHANISM_INFO_PTR pInfo713*/714JNIEXPORT jobject JNICALL715Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetMechanismInfo716(JNIEnv *env, jobject obj, jlong jSlotID, jlong jType)717{718CK_SLOT_ID ckSlotID;719CK_MECHANISM_TYPE ckMechanismType;720CK_MECHANISM_INFO ckMechanismInfo;721jobject jMechanismInfo = NULL;722CK_RV rv;723724CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);725if (ckpFunctions == NULL) { return NULL; }726727ckSlotID = jLongToCKULong(jSlotID);728ckMechanismType = jLongToCKULong(jType);729730rv = (*ckpFunctions->C_GetMechanismInfo)(ckSlotID, ckMechanismType,731&ckMechanismInfo);732if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {733jMechanismInfo = ckMechanismInfoPtrToJMechanismInfo(env, &ckMechanismInfo);734}735return jMechanismInfo ;736}737738/*739* converts a pointer to a CK_MECHANISM_INFO structure into a Java740* CK_MECHANISM_INFO Object.741*742* @param env - used to call JNI funktions to create the new Java object743* @param ckpMechanismInfo - the pointer to the CK_MECHANISM_INFO structure744* @return - the new Java CK_MECHANISM_INFO object745*/746jobject747ckMechanismInfoPtrToJMechanismInfo748(JNIEnv *env, const CK_MECHANISM_INFO_PTR ckpMechanismInfo)749{750751jclass jMechanismInfoClass;752jmethodID jCtrId;753jobject jMechanismInfoObject;754jlong jMinKeySize;755jlong jMaxKeySize;756jlong jFlags;757758/* load CK_MECHANISM_INFO class */759jMechanismInfoClass = (*env)->FindClass(env, CLASS_MECHANISM_INFO);760if (jMechanismInfoClass == NULL) { return NULL; };761762/* load CK_MECHANISM_INFO constructor */763jCtrId = (*env)->GetMethodID(env, jMechanismInfoClass, "<init>", "(JJJ)V");764if (jCtrId == NULL) { return NULL; };765766/* prep all fields */767jMinKeySize = ckULongToJLong(ckpMechanismInfo->ulMinKeySize);768jMaxKeySize = ckULongToJLong(ckpMechanismInfo->ulMaxKeySize);769jFlags = ckULongToJLong(ckpMechanismInfo->flags);770771/* create new CK_MECHANISM_INFO object */772jMechanismInfoObject = (*env)->NewObject(env, jMechanismInfoClass, jCtrId,773jMinKeySize, jMaxKeySize, jFlags);774if (jMechanismInfoObject == NULL) { return NULL; };775776/* free local references */777(*env)->DeleteLocalRef(env, jMechanismInfoClass);778779return jMechanismInfoObject ;780}781#endif782783#ifdef P11_ENABLE_C_INITTOKEN784/*785* Class: sun_security_pkcs11_wrapper_PKCS11786* Method: C_InitToken787* Signature: (J[C[C)V788* Parametermapping: *PKCS11*789* @param jlong jSlotID CK_SLOT_ID slotID790* @param jcharArray jPin CK_CHAR_PTR pPin791* CK_ULONG ulPinLen792* @param jcharArray jLabel CK_UTF8CHAR_PTR pLabel793*/794JNIEXPORT void JNICALL795Java_sun_security_pkcs11_wrapper_PKCS11_C_1InitToken796(JNIEnv *env, jobject obj, jlong jSlotID, jcharArray jPin, jcharArray jLabel)797{798CK_SLOT_ID ckSlotID;799CK_CHAR_PTR ckpPin = NULL_PTR;800CK_UTF8CHAR_PTR ckpLabel = NULL_PTR;801CK_ULONG ckPinLength;802CK_ULONG ckLabelLength;803CK_RV rv;804805CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);806if (ckpFunctions == NULL) { return; }807808ckSlotID = jLongToCKULong(jSlotID);809jCharArrayToCKCharArray(env, jPin, &ckpPin, &ckPinLength);810if ((*env)->ExceptionCheck(env)) { return; }811/* ckLabelLength <= 32 !!! */812jCharArrayToCKUTF8CharArray(env, jLabel, &ckpLabel, &ckLabelLength);813if ((*env)->ExceptionCheck(env)) {814free(ckpPin);815return;816}817818rv = (*ckpFunctions->C_InitToken)(ckSlotID, ckpPin, ckPinLength, ckpLabel);819TRACE1("InitToken return code: %d", rv);820821free(ckpPin);822free(ckpLabel);823824if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }825}826#endif827828#ifdef P11_ENABLE_C_INITPIN829/*830* Class: sun_security_pkcs11_wrapper_PKCS11831* Method: C_InitPIN832* Signature: (J[C)V833* Parametermapping: *PKCS11*834* @param jlong jSessionHandle CK_SESSION_HANDLE835* @param jcharArray jPin CK_CHAR_PTR pPin836* CK_ULONG ulPinLen837*/838JNIEXPORT void JNICALL839Java_sun_security_pkcs11_wrapper_PKCS11_C_1InitPIN840(JNIEnv *env, jobject obj, jlong jSessionHandle, jcharArray jPin)841{842CK_SESSION_HANDLE ckSessionHandle;843CK_CHAR_PTR ckpPin = NULL_PTR;844CK_ULONG ckPinLength;845CK_RV rv;846847CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);848if (ckpFunctions == NULL) { return; }849850ckSessionHandle = jLongToCKULong(jSessionHandle);851jCharArrayToCKCharArray(env, jPin, &ckpPin, &ckPinLength);852if ((*env)->ExceptionCheck(env)) { return; }853854rv = (*ckpFunctions->C_InitPIN)(ckSessionHandle, ckpPin, ckPinLength);855856free(ckpPin);857858if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }859}860#endif861862#ifdef P11_ENABLE_C_SETPIN863/*864* Class: sun_security_pkcs11_wrapper_PKCS11865* Method: C_SetPIN866* Signature: (J[C[C)V867* Parametermapping: *PKCS11*868* @param jlong jSessionHandle CK_SESSION_HANDLE hSession869* @param jcharArray jOldPin CK_CHAR_PTR pOldPin870* CK_ULONG ulOldLen871* @param jcharArray jNewPin CK_CHAR_PTR pNewPin872* CK_ULONG ulNewLen873*/874JNIEXPORT void JNICALL875Java_sun_security_pkcs11_wrapper_PKCS11_C_1SetPIN876(JNIEnv *env, jobject obj, jlong jSessionHandle, jcharArray jOldPin,877jcharArray jNewPin)878{879CK_SESSION_HANDLE ckSessionHandle;880CK_CHAR_PTR ckpOldPin = NULL_PTR;881CK_CHAR_PTR ckpNewPin = NULL_PTR;882CK_ULONG ckOldPinLength;883CK_ULONG ckNewPinLength;884CK_RV rv;885886CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);887if (ckpFunctions == NULL) { return; }888889ckSessionHandle = jLongToCKULong(jSessionHandle);890jCharArrayToCKCharArray(env, jOldPin, &ckpOldPin, &ckOldPinLength);891if ((*env)->ExceptionCheck(env)) { return; }892jCharArrayToCKCharArray(env, jNewPin, &ckpNewPin, &ckNewPinLength);893if ((*env)->ExceptionCheck(env)) {894free(ckpOldPin);895return;896}897898rv = (*ckpFunctions->C_SetPIN)(ckSessionHandle, ckpOldPin, ckOldPinLength,899ckpNewPin, ckNewPinLength);900901free(ckpOldPin);902free(ckpNewPin);903904if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }905}906#endif907908909