Path: blob/master/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_convert.c
41149 views
/*1* Copyright (c) 2003, 2021, 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/*48* pkcs11wrapper.c49* 18.05.200150*51* This is the implementation of the native functions of the Java to PKCS#11 interface.52* All function use some helper functions to convert the JNI types to PKCS#11 types.53*54* @author Karl Scheibelhofer <[email protected]>55* @author Martin Schlaeffer <[email protected]>56*/575859#include "pkcs11wrapper.h"6061#include <stdio.h>62#include <stdlib.h>63#include <string.h>64#include <assert.h>6566#include "sun_security_pkcs11_wrapper_PKCS11.h"6768/* declare file private functions */6970CK_VOID_PTR jMechParamToCKMechParamPtrSlow(JNIEnv *env, jobject jParam,71CK_MECHANISM_TYPE ckMech, CK_ULONG *ckpLength);727374/*75* converts a CK_DATE pointer into a Java CK_DATE Object.76*77* @param env - used to call JNI funktions to create the new Java object78* @param ckpValue - the pointer to the CK_DATE structure79* @return - the new Java CK_DATE object80*/81jobject ckDatePtrToJDateObject(JNIEnv *env, const CK_DATE *ckpDate)82{83jclass jDateClass;84jmethodID jCtrId;85jobject jDateObject;86jcharArray jYear;87jcharArray jMonth;88jcharArray jDay;8990/* load CK_DATE class */91jDateClass = (*env)->FindClass(env, CLASS_DATE);92if (jDateClass == NULL) { return NULL; }9394/* load CK_DATE constructor */95jCtrId = (*env)->GetMethodID(env, jDateClass, "<init>", "([C[C[C)V");96if (jCtrId == NULL) { return NULL; }9798/* prep all fields */99jYear = ckCharArrayToJCharArray(env, (CK_CHAR_PTR)(ckpDate->year), 4);100if (jYear == NULL) { return NULL; }101jMonth = ckCharArrayToJCharArray(env, (CK_CHAR_PTR)(ckpDate->month), 2);102if (jMonth == NULL) { return NULL; }103jDay = ckCharArrayToJCharArray(env, (CK_CHAR_PTR)(ckpDate->day), 2);104if (jDay == NULL) { return NULL; }105106/* create new CK_DATE object */107jDateObject =108(*env)->NewObject(env, jDateClass, jCtrId, jYear, jMonth, jDay);109if (jDateObject == NULL) { return NULL; }110111/* free local references */112(*env)->DeleteLocalRef(env, jDateClass);113(*env)->DeleteLocalRef(env, jYear);114(*env)->DeleteLocalRef(env, jMonth);115(*env)->DeleteLocalRef(env, jDay);116117return jDateObject ;118}119120/*121* converts a CK_VERSION pointer into a Java CK_VERSION Object.122*123* @param env - used to call JNI funktions to create the new Java object124* @param ckpVersion - the pointer to the CK_VERSION structure125* @return the new Java CK_VERSION object126*/127jobject ckVersionPtrToJVersion(JNIEnv *env, const CK_VERSION_PTR ckpVersion)128{129jclass jVersionClass;130jmethodID jCtrId;131jobject jVersionObject;132jint jMajor;133jint jMinor;134135/* load CK_VERSION class */136jVersionClass = (*env)->FindClass(env, CLASS_VERSION);137if (jVersionClass == NULL) { return NULL; }138139/* load CK_VERSION constructor */140jCtrId = (*env)->GetMethodID(env, jVersionClass, "<init>", "(II)V");141if (jCtrId == NULL) { return NULL; }142143/* prep both fields */144jMajor = ckpVersion->major;145jMinor = ckpVersion->minor;146147/* create new CK_VERSION object */148jVersionObject =149(*env)->NewObject(env, jVersionClass, jCtrId, jMajor, jMinor);150if (jVersionObject == NULL) { return NULL; }151152/* free local references */153(*env)->DeleteLocalRef(env, jVersionClass);154155return jVersionObject ;156}157158/*159* converts a CK_SESSION_INFO pointer into a Java CK_SESSION_INFO Object.160*161* @param env - used to call JNI funktions to create the new Java object162* @param ckpSessionInfo - the pointer to the CK_SESSION_INFO structure163* @return the new Java CK_SESSION_INFO object164*/165jobject ckSessionInfoPtrToJSessionInfo(JNIEnv *env, const CK_SESSION_INFO_PTR ckpSessionInfo)166{167jclass jSessionInfoClass;168jmethodID jCtrId;169jobject jSessionInfoObject;170jlong jSlotID;171jlong jState;172jlong jFlags;173jlong jDeviceError;174175/* load CK_SESSION_INFO class */176jSessionInfoClass = (*env)->FindClass(env, CLASS_SESSION_INFO);177if (jSessionInfoClass == NULL) { return NULL; }178179/* load CK_SESSION_INFO constructor */180jCtrId = (*env)->GetMethodID(env, jSessionInfoClass, "<init>", "(JJJJ)V");181if (jCtrId == NULL) { return NULL; }182183/* prep all fields */184jSlotID = ckULongToJLong(ckpSessionInfo->slotID);185jState = ckULongToJLong(ckpSessionInfo->state);186jFlags = ckULongToJLong(ckpSessionInfo->flags);187jDeviceError = ckULongToJLong(ckpSessionInfo->ulDeviceError);188189/* create new CK_SESSION_INFO object */190jSessionInfoObject =191(*env)->NewObject(env, jSessionInfoClass, jCtrId, jSlotID, jState,192jFlags, jDeviceError);193if (jSessionInfoObject == NULL) { return NULL; }194195/* free local references */196(*env)->DeleteLocalRef(env, jSessionInfoClass);197198return jSessionInfoObject ;199}200201/*202* converts a CK_ATTRIBUTE pointer into a Java CK_ATTRIBUTE Object.203*204* @param env - used to call JNI funktions to create the new Java object205* @param ckpAttribute - the pointer to the CK_ATTRIBUTE structure206* @return the new Java CK_ATTRIBUTE object207*/208jobject ckAttributePtrToJAttribute(JNIEnv *env, const CK_ATTRIBUTE_PTR ckpAttribute)209{210jclass jAttributeClass;211jmethodID jCtrId;212jobject jAttributeObject;213jlong jType;214jobject jPValue = NULL;215216jAttributeClass = (*env)->FindClass(env, CLASS_ATTRIBUTE);217if (jAttributeClass == NULL) { return NULL; }218219/* load CK_INFO constructor */220jCtrId = (*env)->GetMethodID(env, jAttributeClass, "<init>", "(JLjava/lang/Object;)V");221if (jCtrId == NULL) { return NULL; }222223/* prep both fields */224jType = ckULongToJLong(ckpAttribute->type);225jPValue = ckAttributeValueToJObject(env, ckpAttribute);226if ((*env)->ExceptionCheck(env)) { return NULL; }227228/* create new CK_ATTRIBUTE object */229jAttributeObject =230(*env)->NewObject(env, jAttributeClass, jCtrId, jType, jPValue);231if (jAttributeObject == NULL) { return NULL; }232233/* free local references */234(*env)->DeleteLocalRef(env, jAttributeClass);235(*env)->DeleteLocalRef(env, jPValue);236237return jAttributeObject;238}239240241/*242* converts a Java CK_VERSION object into a CK_VERSION pointer243*244* @param env - used to call JNI funktions to get the values out of the Java object245* @param jVersion - the Java CK_VERSION object to convert246* @return pointer to the new CK_VERSION structure247*/248CK_VERSION_PTR249jVersionToCKVersionPtr(JNIEnv *env, jobject jVersion)250{251CK_VERSION_PTR ckpVersion;252jclass jVersionClass;253jfieldID jFieldID;254jbyte jMajor, jMinor;255256if (jVersion == NULL) {257return NULL;258}259260// retrieve java values261jVersionClass = (*env)->GetObjectClass(env, jVersion);262if (jVersionClass == NULL) { return NULL; }263jFieldID = (*env)->GetFieldID(env, jVersionClass, "major", "B");264if (jFieldID == NULL) { return NULL; }265jMajor = (*env)->GetByteField(env, jVersion, jFieldID);266jFieldID = (*env)->GetFieldID(env, jVersionClass, "minor", "B");267if (jFieldID == NULL) { return NULL; }268jMinor = (*env)->GetByteField(env, jVersion, jFieldID);269270// allocate memory for CK_VERSION pointer271ckpVersion = (CK_VERSION_PTR) calloc(1, sizeof(CK_VERSION));272if (ckpVersion == NULL) {273throwOutOfMemoryError(env, 0);274return NULL;275}276277// populate using java values278ckpVersion->major = jByteToCKByte(jMajor);279ckpVersion->minor = jByteToCKByte(jMinor);280281return ckpVersion;282}283284285/*286* converts a Java CK_DATE object into a CK_DATE pointer287*288* @param env - used to call JNI functions to get the values out of the Java object289* @param jDate - the Java CK_DATE object to convert290* @return pointer to the new CK_DATE structure291*/292CK_DATE * jDateObjectToCKDatePtr(JNIEnv *env, jobject jDate)293{294CK_DATE * ckpDate = NULL;295CK_ULONG ckLength;296jclass jDateClass;297jfieldID jFieldID;298jobject jYear, jMonth, jDay;299jchar *jTempChars = NULL;300CK_ULONG i;301302if (jDate == NULL) {303return NULL;304}305306// retrieve java values307jDateClass = (*env)->FindClass(env, CLASS_DATE);308if (jDateClass == NULL) { return NULL; }309jFieldID = (*env)->GetFieldID(env, jDateClass, "year", "[C");310if (jFieldID == NULL) { return NULL; }311jYear = (*env)->GetObjectField(env, jDate, jFieldID);312jFieldID = (*env)->GetFieldID(env, jDateClass, "month", "[C");313if (jFieldID == NULL) { return NULL; }314jMonth = (*env)->GetObjectField(env, jDate, jFieldID);315jFieldID = (*env)->GetFieldID(env, jDateClass, "day", "[C");316if (jFieldID == NULL) { return NULL; }317jDay = (*env)->GetObjectField(env, jDate, jFieldID);318319// allocate memory for CK_DATE pointer320ckpDate = (CK_DATE *) calloc(1, sizeof(CK_DATE));321if (ckpDate == NULL) {322throwOutOfMemoryError(env, 0);323return NULL;324}325326// populate using java values327if (jYear == NULL) {328ckpDate->year[0] = 0;329ckpDate->year[1] = 0;330ckpDate->year[2] = 0;331ckpDate->year[3] = 0;332} else {333ckLength = (*env)->GetArrayLength(env, jYear);334jTempChars = (jchar*) calloc(ckLength, sizeof(jchar));335if (jTempChars == NULL) {336throwOutOfMemoryError(env, 0);337goto cleanup;338}339(*env)->GetCharArrayRegion(env, jYear, 0, ckLength, jTempChars);340if ((*env)->ExceptionCheck(env)) {341goto cleanup;342}343344for (i = 0; (i < ckLength) && (i < 4) ; i++) {345ckpDate->year[i] = jCharToCKChar(jTempChars[i]);346}347free(jTempChars);348}349350if (jMonth == NULL) {351ckpDate->month[0] = 0;352ckpDate->month[1] = 0;353} else {354ckLength = (*env)->GetArrayLength(env, jMonth);355jTempChars = (jchar*) calloc(ckLength, sizeof(jchar));356if (jTempChars == NULL) {357throwOutOfMemoryError(env, 0);358goto cleanup;359}360(*env)->GetCharArrayRegion(env, jMonth, 0, ckLength, jTempChars);361if ((*env)->ExceptionCheck(env)) {362goto cleanup;363}364365for (i = 0; (i < ckLength) && (i < 2) ; i++) {366ckpDate->month[i] = jCharToCKChar(jTempChars[i]);367}368free(jTempChars);369}370371if (jDay == NULL) {372ckpDate->day[0] = 0;373ckpDate->day[1] = 0;374} else {375ckLength = (*env)->GetArrayLength(env, jDay);376jTempChars = (jchar*) calloc(ckLength, sizeof(jchar));377if (jTempChars == NULL) {378throwOutOfMemoryError(env, 0);379goto cleanup;380}381(*env)->GetCharArrayRegion(env, jDay, 0, ckLength, jTempChars);382if ((*env)->ExceptionCheck(env)) {383goto cleanup;384}385386for (i = 0; (i < ckLength) && (i < 2) ; i++) {387ckpDate->day[i] = jCharToCKChar(jTempChars[i]);388}389free(jTempChars);390}391392return ckpDate;393cleanup:394free(jTempChars);395free(ckpDate);396return NULL;397}398399400/*401* converts a Java CK_ATTRIBUTE object into a CK_ATTRIBUTE structure402*403* @param env - used to call JNI funktions to get the values out of the Java object404* @param jAttribute - the Java CK_ATTRIBUTE object to convert405* @return the new CK_ATTRIBUTE structure406*/407CK_ATTRIBUTE jAttributeToCKAttribute(JNIEnv *env, jobject jAttribute)408{409CK_ATTRIBUTE ckAttribute;410jclass jAttributeClass;411jfieldID jFieldID;412jlong jType;413jobject jPValue;414415memset(&ckAttribute, 0, sizeof(CK_ATTRIBUTE));416417// TBD: what if jAttribute == NULL?!418TRACE0("\nDEBUG: jAttributeToCKAttribute");419420/* get CK_ATTRIBUTE class */421TRACE0(", getting attribute object class");422jAttributeClass = (*env)->GetObjectClass(env, jAttribute);423if (jAttributeClass == NULL) { return ckAttribute; }424425/* get type */426TRACE0(", getting type field");427jFieldID = (*env)->GetFieldID(env, jAttributeClass, "type", "J");428if (jFieldID == NULL) { return ckAttribute; }429jType = (*env)->GetLongField(env, jAttribute, jFieldID);430TRACE1(", type=0x%lX", jType);431432/* get pValue */433TRACE0(", getting pValue field");434jFieldID = (*env)->GetFieldID(env, jAttributeClass, "pValue", "Ljava/lang/Object;");435if (jFieldID == NULL) { return ckAttribute; }436jPValue = (*env)->GetObjectField(env, jAttribute, jFieldID);437TRACE1(", pValue=%p", jPValue);438439ckAttribute.type = jLongToCKULong(jType);440TRACE0(", converting pValue to primitive object");441442/* convert the Java pValue object to a CK-type pValue pointer */443ckAttribute.pValue = jObjectToPrimitiveCKObjectPtr(env, jPValue, &(ckAttribute.ulValueLen));444445TRACE0("\nDEBUG: jAttributeToCKAttribute FINISHED\n");446447return ckAttribute ;448}449450void masterKeyDeriveParamToCKMasterKeyDeriveParam(JNIEnv *env, jobject jParam,451jclass masterKeyDeriveParamClass,452CK_VERSION_PTR* cKMasterKeyDeriveParamVersion,453CK_SSL3_RANDOM_DATA* cKMasterKeyDeriveParamRandomInfo) {454jfieldID fieldID;455jclass jSsl3RandomDataClass;456jobject jRandomInfo, jRIClientRandom, jRIServerRandom, jVersion;457458// retrieve java values459fieldID = (*env)->GetFieldID(env, masterKeyDeriveParamClass, "RandomInfo",460"Lsun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA;");461if (fieldID == NULL) { return; }462jRandomInfo = (*env)->GetObjectField(env, jParam, fieldID);463jSsl3RandomDataClass = (*env)->FindClass(env, CLASS_SSL3_RANDOM_DATA);464if (jSsl3RandomDataClass == NULL) { return; }465fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pClientRandom", "[B");466if (fieldID == NULL) { return; }467jRIClientRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);468fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pServerRandom", "[B");469if (fieldID == NULL) { return; }470jRIServerRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);471fieldID = (*env)->GetFieldID(env, masterKeyDeriveParamClass, "pVersion",472"Lsun/security/pkcs11/wrapper/CK_VERSION;");473if (fieldID == NULL) { return; }474jVersion = (*env)->GetObjectField(env, jParam, fieldID);475476// populate using java values477*cKMasterKeyDeriveParamVersion = jVersionToCKVersionPtr(env, jVersion);478if ((*env)->ExceptionCheck(env)) { return; }479jByteArrayToCKByteArray(env, jRIClientRandom,480&(cKMasterKeyDeriveParamRandomInfo->pClientRandom),481&(cKMasterKeyDeriveParamRandomInfo->ulClientRandomLen));482if ((*env)->ExceptionCheck(env)) {483goto cleanup;484}485jByteArrayToCKByteArray(env, jRIServerRandom,486&(cKMasterKeyDeriveParamRandomInfo->pServerRandom),487&(cKMasterKeyDeriveParamRandomInfo->ulServerRandomLen));488if ((*env)->ExceptionCheck(env)) {489goto cleanup;490}491return;492cleanup:493free(*cKMasterKeyDeriveParamVersion);494free(cKMasterKeyDeriveParamRandomInfo->pClientRandom);495cKMasterKeyDeriveParamRandomInfo->ulClientRandomLen = 0L;496free(cKMasterKeyDeriveParamRandomInfo->pServerRandom);497cKMasterKeyDeriveParamRandomInfo->ulServerRandomLen = 0L;498// explicitly set to NULL to ensure no double free possible499*cKMasterKeyDeriveParamVersion = NULL;500cKMasterKeyDeriveParamRandomInfo->pClientRandom = NULL;501cKMasterKeyDeriveParamRandomInfo->pServerRandom = NULL;502}503504/*505* converts the Java CK_SSL3_MASTER_KEY_DERIVE_PARAMS object to a506* CK_SSL3_MASTER_KEY_DERIVE_PARAMS pointer507*508* @param env - used to call JNI functions to get the Java classes and objects509* @param jParam - the Java CK_SSL3_MASTER_KEY_DERIVE_PARAMS object to convert510* @param pLength - length of the allocated memory of the returned pointer511* @return pointer to the new CK_SSL3_MASTER_KEY_DERIVE_PARAMS structure512*/513CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR514jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParamPtr(JNIEnv *env,515jobject jParam, CK_ULONG *pLength)516{517CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR ckParamPtr;518jclass jSsl3MasterKeyDeriveParamsClass;519520if (pLength != NULL) {521*pLength = 0L;522}523524// allocate memory for CK_SSL3_MASTER_KEY_DERIVE_PARAMS pointer525ckParamPtr = calloc(1, sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS));526if (ckParamPtr == NULL) {527throwOutOfMemoryError(env, 0);528return NULL;529}530531// retrieve and populate using java values532jSsl3MasterKeyDeriveParamsClass =533(*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);534if (jSsl3MasterKeyDeriveParamsClass == NULL) {535goto cleanup;536}537masterKeyDeriveParamToCKMasterKeyDeriveParam(env, jParam,538jSsl3MasterKeyDeriveParamsClass,539&(ckParamPtr->pVersion), &(ckParamPtr->RandomInfo));540if ((*env)->ExceptionCheck(env)) {541goto cleanup;542}543544if (pLength != NULL) {545*pLength = sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS);546}547return ckParamPtr;548cleanup:549free(ckParamPtr);550return NULL;551}552553/*554* converts the Java CK_TLS12_MASTER_KEY_DERIVE_PARAMS object to a555* CK_TLS12_MASTER_KEY_DERIVE_PARAMS pointer556*557* @param env - used to call JNI functions to get the Java classes and objects558* @param jParam - the Java CK_TLS12_MASTER_KEY_DERIVE_PARAMS object to convert559* @param pLength - length of the allocated memory of the returned pointer560* @return pointer to the new CK_TLS12_MASTER_KEY_DERIVE_PARAMS structure561*/562CK_TLS12_MASTER_KEY_DERIVE_PARAMS_PTR563jTls12MasterKeyDeriveParamToCKTls12MasterKeyDeriveParamPtr(JNIEnv *env,564jobject jParam, CK_ULONG *pLength)565{566CK_TLS12_MASTER_KEY_DERIVE_PARAMS_PTR ckParamPtr;567jclass jTls12MasterKeyDeriveParamsClass;568jfieldID fieldID;569jlong prfHashMechanism;570571if (pLength != NULL) {572*pLength = 0L;573}574575// retrieve java values576jTls12MasterKeyDeriveParamsClass =577(*env)->FindClass(env, CLASS_TLS12_MASTER_KEY_DERIVE_PARAMS);578if (jTls12MasterKeyDeriveParamsClass == NULL) { return NULL; }579fieldID = (*env)->GetFieldID(env,580jTls12MasterKeyDeriveParamsClass, "prfHashMechanism", "J");581if (fieldID == NULL) { return NULL; }582prfHashMechanism = (*env)->GetLongField(env, jParam, fieldID);583584// allocate memory for CK_TLS12_MASTER_KEY_DERIVE_PARAMS pointer585ckParamPtr = calloc(1, sizeof(CK_TLS12_MASTER_KEY_DERIVE_PARAMS));586if (ckParamPtr == NULL) {587throwOutOfMemoryError(env, 0);588return NULL;589}590591// populate using java values592masterKeyDeriveParamToCKMasterKeyDeriveParam(env, jParam,593jTls12MasterKeyDeriveParamsClass, &ckParamPtr->pVersion,594&ckParamPtr->RandomInfo);595if ((*env)->ExceptionCheck(env)) {596goto cleanup;597}598599ckParamPtr->prfHashMechanism = (CK_MECHANISM_TYPE) prfHashMechanism;600601if (pLength != NULL) {602*pLength = sizeof(CK_TLS12_MASTER_KEY_DERIVE_PARAMS);603}604return ckParamPtr;605cleanup:606free(ckParamPtr);607return NULL;608}609610/*611* converts the Java CK_TLS_PRF_PARAMS object to a CK_TLS_PRF_PARAMS pointer612*613* @param env - used to call JNI functions to get the Java classes and objects614* @param jParam - the Java CK_TLS_PRF_PARAMS object to convert615* @param pLength - length of the allocated memory of the returned pointer616* @return pointer to the new CK_TLS_PRF_PARAMS structure617*/618CK_TLS_PRF_PARAMS_PTR619jTlsPrfParamsToCKTlsPrfParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength)620{621CK_TLS_PRF_PARAMS_PTR ckParamPtr;622jclass jTlsPrfParamsClass;623jfieldID fieldID;624jobject jSeed, jLabel, jOutput;625626if (pLength != NULL) {627*pLength = 0;628}629630// retrieve java values631jTlsPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS);632if (jTlsPrfParamsClass == NULL) { return NULL; }633fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pSeed", "[B");634if (fieldID == NULL) { return NULL; }635jSeed = (*env)->GetObjectField(env, jParam, fieldID);636fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pLabel", "[B");637if (fieldID == NULL) { return NULL; }638jLabel = (*env)->GetObjectField(env, jParam, fieldID);639fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pOutput", "[B");640if (fieldID == NULL) { return NULL; }641jOutput = (*env)->GetObjectField(env, jParam, fieldID);642643// allocate memory for CK_TLS_PRF_PARAMS pointer644ckParamPtr = calloc(1, sizeof(CK_TLS_PRF_PARAMS));645if (ckParamPtr == NULL) {646throwOutOfMemoryError(env, 0);647return NULL;648}649650// populate using java values651jByteArrayToCKByteArray(env, jSeed, &(ckParamPtr->pSeed), &(ckParamPtr->ulSeedLen));652if ((*env)->ExceptionCheck(env)) {653goto cleanup;654}655jByteArrayToCKByteArray(env, jLabel, &(ckParamPtr->pLabel), &(ckParamPtr->ulLabelLen));656if ((*env)->ExceptionCheck(env)) {657goto cleanup;658}659ckParamPtr->pulOutputLen = calloc(1, sizeof(CK_ULONG));660if (ckParamPtr->pulOutputLen == NULL) {661goto cleanup;662}663jByteArrayToCKByteArray(env, jOutput, &(ckParamPtr->pOutput), ckParamPtr->pulOutputLen);664if ((*env)->ExceptionCheck(env)) {665goto cleanup;666}667668if (pLength != NULL) {669*pLength = sizeof(CK_TLS_PRF_PARAMS);670}671return ckParamPtr;672cleanup:673free(ckParamPtr->pSeed);674free(ckParamPtr->pLabel);675free(ckParamPtr->pOutput);676free(ckParamPtr->pulOutputLen);677free(ckParamPtr);678return NULL;679}680681/*682* converts the Java CK_TLS_MAC_PARAMS object to a CK_TLS_MAC_PARAMS pointer683*684* @param env - used to call JNI functions to get the Java classes and objects685* @param jParam - the Java CK_TLS_MAC_PARAMS object to convert686* @param pLength - length of the allocated memory of the returned pointer687* @return pointer to the new CK_TLS_MAC_PARAMS structure688*/689690CK_TLS_MAC_PARAMS_PTR691jTlsMacParamsToCKTlsMacParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength)692{693CK_TLS_MAC_PARAMS_PTR ckParamPtr;694jclass jTlsMacParamsClass;695jfieldID fieldID;696jlong jPrfMechanism, jUlMacLength, jUlServerOrClient;697698if (pLength != NULL) {699*pLength = 0L;700}701702// retrieve java values703jTlsMacParamsClass = (*env)->FindClass(env, CLASS_TLS_MAC_PARAMS);704if (jTlsMacParamsClass == NULL) { return NULL; }705fieldID = (*env)->GetFieldID(env, jTlsMacParamsClass, "prfMechanism", "J");706if (fieldID == NULL) { return NULL; }707jPrfMechanism = (*env)->GetLongField(env, jParam, fieldID);708fieldID = (*env)->GetFieldID(env, jTlsMacParamsClass, "ulMacLength", "J");709if (fieldID == NULL) { return NULL; }710jUlMacLength = (*env)->GetLongField(env, jParam, fieldID);711fieldID = (*env)->GetFieldID(env, jTlsMacParamsClass, "ulServerOrClient", "J");712if (fieldID == NULL) { return NULL; }713jUlServerOrClient = (*env)->GetLongField(env, jParam, fieldID);714715// allocate memory for CK_TLS_MAC_PARAMS pointer716ckParamPtr = calloc(1, sizeof(CK_TLS_MAC_PARAMS));717if (ckParamPtr == NULL) {718throwOutOfMemoryError(env, 0);719return NULL;720}721722// populate using java values723ckParamPtr->prfHashMechanism = jLongToCKULong(jPrfMechanism);724ckParamPtr->ulMacLength = jLongToCKULong(jUlMacLength);725ckParamPtr->ulServerOrClient = jLongToCKULong(jUlServerOrClient);726727if (pLength != NULL) {728*pLength = sizeof(CK_TLS_MAC_PARAMS);729}730return ckParamPtr;731}732733void keyMatParamToCKKeyMatParam(JNIEnv *env, jobject jParam,734jclass jKeyMatParamClass,735CK_ULONG* cKKeyMatParamUlMacSizeInBits,736CK_ULONG* cKKeyMatParamUlKeySizeInBits,737CK_ULONG* cKKeyMatParamUlIVSizeInBits,738CK_BBOOL* cKKeyMatParamBIsExport,739CK_SSL3_RANDOM_DATA* cKKeyMatParamRandomInfo,740CK_SSL3_KEY_MAT_OUT_PTR* cKKeyMatParamPReturnedKeyMaterial)741{742jclass jSsl3RandomDataClass, jSsl3KeyMatOutClass;743jfieldID fieldID;744jlong jMacSizeInBits, jKeySizeInBits, jIVSizeInBits;745jboolean jIsExport;746jobject jRandomInfo, jRIClientRandom, jRIServerRandom;747jobject jReturnedKeyMaterial, jRMIvClient, jRMIvServer;748CK_ULONG ckTemp;749750// the pointer arguments should already be initialized by caller751752// retrieve java values753fieldID = (*env)->GetFieldID(env, jKeyMatParamClass, "ulMacSizeInBits", "J");754if (fieldID == NULL) { return; }755jMacSizeInBits = (*env)->GetLongField(env, jParam, fieldID);756fieldID = (*env)->GetFieldID(env, jKeyMatParamClass, "ulKeySizeInBits", "J");757if (fieldID == NULL) { return; }758jKeySizeInBits = (*env)->GetLongField(env, jParam, fieldID);759fieldID = (*env)->GetFieldID(env, jKeyMatParamClass, "ulIVSizeInBits", "J");760if (fieldID == NULL) { return; }761jIVSizeInBits = (*env)->GetLongField(env, jParam, fieldID);762fieldID = (*env)->GetFieldID(env, jKeyMatParamClass, "bIsExport", "Z");763if (fieldID == NULL) { return; }764jIsExport = (*env)->GetBooleanField(env, jParam, fieldID);765jSsl3RandomDataClass = (*env)->FindClass(env, CLASS_SSL3_RANDOM_DATA);766if (jSsl3RandomDataClass == NULL) { return; }767fieldID = (*env)->GetFieldID(env, jKeyMatParamClass, "RandomInfo",768"Lsun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA;");769if (fieldID == NULL) { return; }770jRandomInfo = (*env)->GetObjectField(env, jParam, fieldID);771fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pClientRandom", "[B");772if (fieldID == NULL) { return; }773jRIClientRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);774fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pServerRandom", "[B");775if (fieldID == NULL) { return; }776jRIServerRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);777jSsl3KeyMatOutClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_OUT);778if (jSsl3KeyMatOutClass == NULL) { return; }779fieldID = (*env)->GetFieldID(env, jKeyMatParamClass, "pReturnedKeyMaterial",780"Lsun/security/pkcs11/wrapper/CK_SSL3_KEY_MAT_OUT;");781if (fieldID == NULL) { return; }782jReturnedKeyMaterial = (*env)->GetObjectField(env, jParam, fieldID);783fieldID = (*env)->GetFieldID(env, jSsl3KeyMatOutClass, "pIVClient", "[B");784if (fieldID == NULL) { return; }785jRMIvClient = (*env)->GetObjectField(env, jReturnedKeyMaterial, fieldID);786fieldID = (*env)->GetFieldID(env, jSsl3KeyMatOutClass, "pIVServer", "[B");787if (fieldID == NULL) { return; }788jRMIvServer = (*env)->GetObjectField(env, jReturnedKeyMaterial, fieldID);789790// populate the specified pointers using java values791*cKKeyMatParamUlMacSizeInBits = jLongToCKULong(jMacSizeInBits);792*cKKeyMatParamUlKeySizeInBits = jLongToCKULong(jKeySizeInBits);793*cKKeyMatParamUlIVSizeInBits = jLongToCKULong(jIVSizeInBits);794*cKKeyMatParamBIsExport = jBooleanToCKBBool(jIsExport);795jByteArrayToCKByteArray(env, jRIClientRandom,796&(cKKeyMatParamRandomInfo->pClientRandom),797&(cKKeyMatParamRandomInfo->ulClientRandomLen));798if ((*env)->ExceptionCheck(env)) {799// just return as no memory allocation yet800return;801}802jByteArrayToCKByteArray(env, jRIServerRandom,803&(cKKeyMatParamRandomInfo->pServerRandom),804&(cKKeyMatParamRandomInfo->ulServerRandomLen));805if ((*env)->ExceptionCheck(env)) {806goto cleanup;807}808/* allocate memory for pReturnedKeyMaterial */809*cKKeyMatParamPReturnedKeyMaterial =810(CK_SSL3_KEY_MAT_OUT_PTR) calloc(1, sizeof(CK_SSL3_KEY_MAT_OUT));811if (*cKKeyMatParamPReturnedKeyMaterial == NULL) {812throwOutOfMemoryError(env, 0);813goto cleanup;814}815816// the handles are output params only, no need to fetch them from Java817(*cKKeyMatParamPReturnedKeyMaterial)->hClientMacSecret = 0;818(*cKKeyMatParamPReturnedKeyMaterial)->hServerMacSecret = 0;819(*cKKeyMatParamPReturnedKeyMaterial)->hClientKey = 0;820(*cKKeyMatParamPReturnedKeyMaterial)->hServerKey = 0;821822jByteArrayToCKByteArray(env, jRMIvClient,823&((*cKKeyMatParamPReturnedKeyMaterial)->pIVClient), &ckTemp);824if ((*env)->ExceptionCheck(env)) {825goto cleanup;826}827jByteArrayToCKByteArray(env, jRMIvServer,828&((*cKKeyMatParamPReturnedKeyMaterial)->pIVServer), &ckTemp);829if ((*env)->ExceptionCheck(env)) {830goto cleanup;831}832833return;834cleanup:835free(cKKeyMatParamRandomInfo->pClientRandom);836free(cKKeyMatParamRandomInfo->pServerRandom);837if ((*cKKeyMatParamPReturnedKeyMaterial) != NULL) {838free((*cKKeyMatParamPReturnedKeyMaterial)->pIVClient);839free(*cKKeyMatParamPReturnedKeyMaterial);840}841// explicitly set to NULL to ensure no double free possible842cKKeyMatParamRandomInfo->pClientRandom = NULL;843cKKeyMatParamRandomInfo->pServerRandom = NULL;844*cKKeyMatParamPReturnedKeyMaterial = NULL;845return;846}847/*848* converts the Java CK_SSL3_KEY_MAT_PARAMS object to a849* CK_SSL3_KEY_MAT_PARAMS pointer850*851* @param env - used to call JNI funktions to get the Java classes and objects852* @param jParam - the Java CK_SSL3_KEY_MAT_PARAMS object to convert853* @param pLength - length of the allocated memory of the returned pointer854* @return pointer to the new CK_SSL3_KEY_MAT_PARAMS structure855*/856CK_SSL3_KEY_MAT_PARAMS_PTR857jSsl3KeyMatParamToCKSsl3KeyMatParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength)858{859CK_SSL3_KEY_MAT_PARAMS_PTR ckParamPtr;860jclass jSsl3KeyMatParamsClass;861862if (pLength != NULL) {863*pLength = 0;864}865866// allocate memory for CK_SSL3_KEY_MAT_PARAMS pointer867ckParamPtr = calloc(1, sizeof(CK_SSL3_KEY_MAT_PARAMS));868if (ckParamPtr == NULL) {869throwOutOfMemoryError(env, 0);870return NULL;871}872873// retrieve and populate using java values874jSsl3KeyMatParamsClass = (*env)->FindClass(env,875CLASS_SSL3_KEY_MAT_PARAMS);876if (jSsl3KeyMatParamsClass == NULL) {877goto cleanup;878}879keyMatParamToCKKeyMatParam(env, jParam, jSsl3KeyMatParamsClass,880&(ckParamPtr->ulMacSizeInBits), &(ckParamPtr->ulKeySizeInBits),881&(ckParamPtr->ulIVSizeInBits), &(ckParamPtr->bIsExport),882&(ckParamPtr->RandomInfo), &(ckParamPtr->pReturnedKeyMaterial));883if ((*env)->ExceptionCheck(env)) {884goto cleanup;885}886887if (pLength != NULL) {888*pLength = sizeof(CK_SSL3_KEY_MAT_PARAMS);889}890return ckParamPtr;891cleanup:892free(ckParamPtr);893return NULL;894}895896/*897* converts the Java CK_TLS12_KEY_MAT_PARAMS object to a898* CK_TLS12_KEY_MAT_PARAMS pointer899*900* @param env - used to call JNI functions to get the Java classes and objects901* @param jParam - the Java CK_TLS12_KEY_MAT_PARAMS object to convert902* @param pLength - length of the allocated memory of the returned pointer903* @return pointer to the new CK_TLS12_KEY_MAT_PARAMS structure904*/905CK_TLS12_KEY_MAT_PARAMS_PTR jTls12KeyMatParamToCKTls12KeyMatParamPtr(JNIEnv *env,906jobject jParam, CK_ULONG *pLength)907{908CK_TLS12_KEY_MAT_PARAMS_PTR ckParamPtr;909jclass jTls12KeyMatParamsClass;910jfieldID fieldID;911jlong prfHashMechanism;912913if (pLength != NULL) {914*pLength = 0;915}916917// retrieve java values918jTls12KeyMatParamsClass = (*env)->FindClass(env,919CLASS_TLS12_KEY_MAT_PARAMS);920if (jTls12KeyMatParamsClass == NULL) { return NULL; }921fieldID = (*env)->GetFieldID(env, jTls12KeyMatParamsClass,922"prfHashMechanism", "J");923if (fieldID == NULL) { return NULL; }924prfHashMechanism = (*env)->GetLongField(env, jParam, fieldID);925926// allocate memory for CK_TLS12_KEY_MAT_PARAMS pointer927ckParamPtr = calloc(1, sizeof(CK_TLS12_KEY_MAT_PARAMS));928if (ckParamPtr == NULL) {929throwOutOfMemoryError(env, 0);930return NULL;931}932933// populate using java values934keyMatParamToCKKeyMatParam(env, jParam, jTls12KeyMatParamsClass,935&(ckParamPtr->ulMacSizeInBits), &(ckParamPtr->ulKeySizeInBits),936&(ckParamPtr->ulIVSizeInBits), &(ckParamPtr->bIsExport),937&(ckParamPtr->RandomInfo), &(ckParamPtr->pReturnedKeyMaterial));938if ((*env)->ExceptionCheck(env)) {939goto cleanup;940}941ckParamPtr->prfHashMechanism = (CK_MECHANISM_TYPE)prfHashMechanism;942943if (pLength != NULL) {944*pLength = sizeof(CK_TLS12_KEY_MAT_PARAMS);945}946return ckParamPtr;947cleanup:948free(ckParamPtr);949return NULL;950}951952/*953* converts the Java CK_AES_CTR_PARAMS object to a CK_AES_CTR_PARAMS pointer954*955* @param env - used to call JNI funktions to get the Java classes and objects956* @param jParam - the Java CK_AES_CTR_PARAMS object to convert957* @param pLength - length of the allocated memory of the returned pointer958* @return pointer to the new CK_AES_CTR_PARAMS structure959*/960CK_AES_CTR_PARAMS_PTR961jAesCtrParamsToCKAesCtrParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength)962{963CK_AES_CTR_PARAMS_PTR ckParamPtr;964jclass jAesCtrParamsClass;965jfieldID fieldID;966jlong jCounterBits;967jobject jCb;968CK_BYTE_PTR ckBytes = NULL;969CK_ULONG ckTemp;970971if (pLength != NULL) {972*pLength = 0L;973}974975// retrieve java values976jAesCtrParamsClass = (*env)->FindClass(env, CLASS_AES_CTR_PARAMS);977if (jAesCtrParamsClass == NULL) { return NULL; }978if (!(*env)->IsInstanceOf(env, jParam, jAesCtrParamsClass)) {979return NULL;980}981fieldID = (*env)->GetFieldID(env, jAesCtrParamsClass, "ulCounterBits", "J");982if (fieldID == NULL) { return NULL; }983jCounterBits = (*env)->GetLongField(env, jParam, fieldID);984fieldID = (*env)->GetFieldID(env, jAesCtrParamsClass, "cb", "[B");985if (fieldID == NULL) { return NULL; }986jCb = (*env)->GetObjectField(env, jParam, fieldID);987988// allocate memory for CK_AES_CTR_PARAMS pointer989ckParamPtr = calloc(1, sizeof(CK_AES_CTR_PARAMS));990if (ckParamPtr == NULL) {991throwOutOfMemoryError(env, 0);992return NULL;993}994995// populate using java values996jByteArrayToCKByteArray(env, jCb, &ckBytes, &ckTemp);997if ((*env)->ExceptionCheck(env) || ckTemp != 16) {998goto cleanup;999}1000memcpy(ckParamPtr->cb, ckBytes, ckTemp);1001free(ckBytes);10021003ckParamPtr->ulCounterBits = jLongToCKULong(jCounterBits);10041005if (pLength != NULL) {1006*pLength = sizeof(CK_AES_CTR_PARAMS);1007}1008return ckParamPtr;1009cleanup:1010free(ckBytes);1011free(ckParamPtr);1012return NULL;1013}10141015/*1016* converts the Java CK_GCM_PARAMS object to a CK_GCM_PARAMS_NO_IVBITS pointer1017* Note: Need to try NSS definition first to avoid SIGSEGV.1018*1019* @param env - used to call JNI funktions to get the Java classes and objects1020* @param jParam - the Java CK_GCM_PARAMS object to convert1021* @param pLength - length of the allocated memory of the returned pointer1022* @return pointer to the new CK_GCM_PARAMS_NO_IVBITS structure1023*/1024CK_GCM_PARAMS_NO_IVBITS_PTR1025jGCMParamsToCKGCMParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength)1026{1027CK_GCM_PARAMS_NO_IVBITS_PTR ckParamPtr;1028jclass jGcmParamsClass;1029jfieldID fieldID;1030jobject jIv, jAad;1031jlong jTagLen;10321033TRACE0("DEBUG jGCMParamsToCKGCMParam is called\n");10341035if (pLength != NULL) {1036*pLength = 0L;1037}10381039// retrieve java values1040jGcmParamsClass = (*env)->FindClass(env, CLASS_GCM_PARAMS);1041if (jGcmParamsClass == NULL) { return NULL; }1042if (!(*env)->IsInstanceOf(env, jParam, jGcmParamsClass)) {1043return NULL;1044}1045fieldID = (*env)->GetFieldID(env, jGcmParamsClass, "iv", "[B");1046if (fieldID == NULL) { return NULL; }1047jIv = (*env)->GetObjectField(env, jParam, fieldID);1048fieldID = (*env)->GetFieldID(env, jGcmParamsClass, "aad", "[B");1049if (fieldID == NULL) { return NULL; }1050jAad = (*env)->GetObjectField(env, jParam, fieldID);1051fieldID = (*env)->GetFieldID(env, jGcmParamsClass, "tagBits", "J");1052if (fieldID == NULL) { return NULL; }1053jTagLen = (*env)->GetLongField(env, jParam, fieldID);10541055// allocate memory for CK_GCM_PARAMS_NO_IVBITS pointer1056ckParamPtr = calloc(1, sizeof(CK_GCM_PARAMS_NO_IVBITS));1057if (ckParamPtr == NULL) {1058throwOutOfMemoryError(env, 0);1059return NULL;1060}10611062// populate using java values1063jByteArrayToCKByteArray(env, jIv, &(ckParamPtr->pIv), &(ckParamPtr->ulIvLen));1064if ((*env)->ExceptionCheck(env)) {1065goto cleanup;1066}10671068jByteArrayToCKByteArray(env, jAad, &(ckParamPtr->pAAD), &(ckParamPtr->ulAADLen));1069if ((*env)->ExceptionCheck(env)) {1070goto cleanup;1071}10721073ckParamPtr->ulTagBits = jLongToCKULong(jTagLen);10741075if (pLength != NULL) {1076*pLength = sizeof(CK_GCM_PARAMS_NO_IVBITS);1077}1078TRACE1("Created inner GCM_PARAMS PTR w/o ulIvBits %p\n", ckParamPtr);1079return ckParamPtr;1080cleanup:1081free(ckParamPtr->pIv);1082free(ckParamPtr->pAAD);1083free(ckParamPtr);1084return NULL;1085}10861087/*1088* converts the Java CK_CCM_PARAMS object to a CK_CCM_PARAMS pointer1089*1090* @param env - used to call JNI functions to get the Java classes and objects1091* @param jParam - the Java CK_CCM_PARAMS object to convert1092* @param pLength - length of the allocated memory of the returned pointer1093* @return pointer to the new CK_CCM_PARAMS structure1094*/1095CK_CCM_PARAMS_PTR1096jCCMParamsToCKCCMParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength)1097{1098CK_CCM_PARAMS_PTR ckParamPtr;1099jclass jCcmParamsClass;1100jfieldID fieldID;1101jobject jNonce, jAad;1102jlong jDataLen, jMacLen;11031104if (pLength != NULL) {1105*pLength = 0;1106}11071108// retrieve java values1109jCcmParamsClass = (*env)->FindClass(env, CLASS_CCM_PARAMS);1110if (jCcmParamsClass == NULL) { return NULL; }1111if (!(*env)->IsInstanceOf(env, jParam, jCcmParamsClass)) {1112return NULL;1113}1114fieldID = (*env)->GetFieldID(env, jCcmParamsClass, "dataLen", "J");1115if (fieldID == NULL) { return NULL; }1116jDataLen = (*env)->GetLongField(env, jParam, fieldID);1117fieldID = (*env)->GetFieldID(env, jCcmParamsClass, "nonce", "[B");1118if (fieldID == NULL) { return NULL; }1119jNonce = (*env)->GetObjectField(env, jParam, fieldID);1120fieldID = (*env)->GetFieldID(env, jCcmParamsClass, "aad", "[B");1121if (fieldID == NULL) { return NULL; }1122jAad = (*env)->GetObjectField(env, jParam, fieldID);1123fieldID = (*env)->GetFieldID(env, jCcmParamsClass, "macLen", "J");1124if (fieldID == NULL) { return NULL; }1125jMacLen = (*env)->GetLongField(env, jParam, fieldID);11261127// allocate memory for CK_CCM_PARAMS pointer1128ckParamPtr = calloc(1, sizeof(CK_CCM_PARAMS));1129if (ckParamPtr == NULL) {1130throwOutOfMemoryError(env, 0);1131return NULL;1132}11331134// populate using java values1135ckParamPtr->ulDataLen = jLongToCKULong(jDataLen);1136jByteArrayToCKByteArray(env, jNonce, &(ckParamPtr->pNonce),1137&(ckParamPtr->ulNonceLen));1138if ((*env)->ExceptionCheck(env)) {1139goto cleanup;1140}11411142jByteArrayToCKByteArray(env, jAad, &(ckParamPtr->pAAD),1143&(ckParamPtr->ulAADLen));1144if ((*env)->ExceptionCheck(env)) {1145goto cleanup;1146}11471148ckParamPtr->ulMACLen = jLongToCKULong(jMacLen);11491150if (pLength != NULL) {1151*pLength = sizeof(CK_CCM_PARAMS);1152}1153return ckParamPtr;1154cleanup:1155free(ckParamPtr->pNonce);1156free(ckParamPtr->pAAD);1157free(ckParamPtr);1158return NULL;1159}11601161/*1162* converts the Java CK_SALSA20_CHACHA20_POLY1305_PARAMS object to a1163* CK_SALSA20_CHACHA20_POLY1305_PARAMS pointer1164*1165* @param env - used to call JNI functions to get the Java classes and objects1166* @param jParam - the Java CK_SALSA20_CHACHA20_POLY1305_PARAMS object to1167* convert1168* @param pLength - length of the allocated memory of the returned pointer1169* @return pointer to the new CK_SALSA20_CHACHA20_POLY1305_PARAMS structure1170*/1171CK_SALSA20_CHACHA20_POLY1305_PARAMS_PTR1172jSalsaChaChaPolyParamsToCKSalsaChaChaPolyParamPtr(1173JNIEnv *env, jobject jParam, CK_ULONG *pLength)1174{1175CK_SALSA20_CHACHA20_POLY1305_PARAMS_PTR ckParamPtr;1176jclass jParamsClass;1177jfieldID fieldID;1178jobject jNonce, jAad;11791180if (pLength != NULL) {1181*pLength = 0;1182}11831184// retrieve java values1185jParamsClass = (*env)->FindClass(env,1186CLASS_SALSA20_CHACHA20_POLY1305_PARAMS);1187if (jParamsClass == NULL) { return NULL; }1188if (!(*env)->IsInstanceOf(env, jParam, jParamsClass)) {1189return NULL;1190}1191fieldID = (*env)->GetFieldID(env, jParamsClass, "nonce", "[B");1192if (fieldID == NULL) { return NULL; }1193jNonce = (*env)->GetObjectField(env, jParam, fieldID);1194fieldID = (*env)->GetFieldID(env, jParamsClass, "aad", "[B");1195if (fieldID == NULL) { return NULL; }1196jAad = (*env)->GetObjectField(env, jParam, fieldID);1197// allocate memory for CK_SALSA20_CHACHA20_POLY1305_PARAMS pointer1198ckParamPtr = calloc(1, sizeof(CK_SALSA20_CHACHA20_POLY1305_PARAMS));1199if (ckParamPtr == NULL) {1200throwOutOfMemoryError(env, 0);1201return NULL;1202}12031204// populate using java values1205jByteArrayToCKByteArray(env, jNonce, &(ckParamPtr->pNonce),1206&(ckParamPtr->ulNonceLen));1207if ((*env)->ExceptionCheck(env)) {1208goto cleanup;1209}12101211jByteArrayToCKByteArray(env, jAad, &(ckParamPtr->pAAD),1212&(ckParamPtr->ulAADLen));1213if ((*env)->ExceptionCheck(env)) {1214goto cleanup;1215}12161217if (pLength != NULL) {1218*pLength = sizeof(CK_SALSA20_CHACHA20_POLY1305_PARAMS);1219}1220return ckParamPtr;1221cleanup:1222free(ckParamPtr->pNonce);1223free(ckParamPtr->pAAD);1224free(ckParamPtr);1225return NULL;1226}12271228/*1229* converts a Java CK_MECHANISM object into a CK_MECHANISM pointer1230* pointer.1231*1232* @param env - used to call JNI funktions to get the values out of the Java object1233* @param jMech - the Java CK_MECHANISM object to convert1234* @return pointer to the new CK_MECHANISM structure1235*/1236CK_MECHANISM_PTR jMechanismToCKMechanismPtr(JNIEnv *env, jobject jMech)1237{1238CK_MECHANISM_PTR ckpMech;1239jlong jMechType = (*env)->GetLongField(env, jMech, mech_mechanismID);1240jobject jParam = (*env)->GetObjectField(env, jMech, mech_pParameterID);12411242/* allocate memory for CK_MECHANISM_PTR */1243ckpMech = (CK_MECHANISM_PTR) calloc(1, sizeof(CK_MECHANISM));1244if (ckpMech == NULL) {1245throwOutOfMemoryError(env, 0);1246return NULL;1247}1248TRACE1("DEBUG jMechanismToCKMechanismPtr: allocated mech %p\n", ckpMech);12491250ckpMech->mechanism = jLongToCKULong(jMechType);12511252/* convert the specific Java mechanism parameter object to a pointer to a1253* CK-type mechanism structure1254*/1255if (jParam == NULL) {1256ckpMech->pParameter = NULL;1257ckpMech->ulParameterLen = 0;1258} else {1259ckpMech->pParameter = jMechParamToCKMechParamPtr(env, jParam,1260ckpMech->mechanism, &(ckpMech->ulParameterLen));1261}1262return ckpMech;1263}12641265/*1266* converts the pValue of a CK_ATTRIBUTE structure into a Java Object by1267* checking the type of the attribute. A PKCS#11 attribute value can1268* be a CK_ULONG, CK_BYTE[], CK_CHAR[], big integer, CK_BBOOL, CK_UTF8CHAR[],1269* CK_DATE or CK_FLAGS that gets converted to a corresponding Java object.1270*1271* @param env - used to call JNI functions to create the new Java object1272* @param ckpAttribute - the pointer to the CK_ATTRIBUTE structure that contains the type1273* and the pValue to convert1274* @return the new Java object of the CK-type pValue1275*/1276jobject ckAttributeValueToJObject(JNIEnv *env, const CK_ATTRIBUTE_PTR ckpAttribute)1277{1278jint jValueLength;1279jobject jValueObject = NULL;12801281jValueLength = ckULongToJInt(ckpAttribute->ulValueLen);12821283if ((jValueLength <= 0) || (ckpAttribute->pValue == NULL)) {1284return NULL ;1285}12861287switch(ckpAttribute->type) {1288case CKA_CLASS:1289/* value CK_OBJECT_CLASS, defacto a CK_ULONG */1290case CKA_KEY_TYPE:1291/* value CK_KEY_TYPE, defacto a CK_ULONG */1292case CKA_CERTIFICATE_TYPE:1293/* value CK_CERTIFICATE_TYPE, defacto a CK_ULONG */1294case CKA_HW_FEATURE_TYPE:1295/* value CK_HW_FEATURE_TYPE, defacto a CK_ULONG */1296case CKA_MODULUS_BITS:1297case CKA_VALUE_BITS:1298case CKA_VALUE_LEN:1299case CKA_KEY_GEN_MECHANISM:1300case CKA_PRIME_BITS:1301case CKA_SUB_PRIME_BITS:1302/* value CK_ULONG */1303jValueObject = ckULongPtrToJLongObject(env, (CK_ULONG*) ckpAttribute->pValue);1304break;13051306/* can be CK_BYTE[],CK_CHAR[] or big integer; defacto always CK_BYTE[] */1307case CKA_VALUE:1308case CKA_OBJECT_ID:1309case CKA_SUBJECT:1310case CKA_ID:1311case CKA_ISSUER:1312case CKA_SERIAL_NUMBER:1313case CKA_OWNER:1314case CKA_AC_ISSUER:1315case CKA_ATTR_TYPES:1316case CKA_ECDSA_PARAMS:1317/* CKA_EC_PARAMS is the same, these two are equivalent */1318case CKA_EC_POINT:1319case CKA_PRIVATE_EXPONENT:1320case CKA_PRIME_1:1321case CKA_PRIME_2:1322case CKA_EXPONENT_1:1323case CKA_EXPONENT_2:1324case CKA_COEFFICIENT:1325/* value CK_BYTE[] */1326jValueObject = ckByteArrayToJByteArray(env, (CK_BYTE*) ckpAttribute->pValue, jValueLength);1327break;13281329case CKA_RESET_ON_INIT:1330case CKA_HAS_RESET:1331case CKA_TOKEN:1332case CKA_PRIVATE:1333case CKA_MODIFIABLE:1334case CKA_DERIVE:1335case CKA_LOCAL:1336case CKA_ENCRYPT:1337case CKA_VERIFY:1338case CKA_VERIFY_RECOVER:1339case CKA_WRAP:1340case CKA_SENSITIVE:1341case CKA_SECONDARY_AUTH:1342case CKA_DECRYPT:1343case CKA_SIGN:1344case CKA_SIGN_RECOVER:1345case CKA_UNWRAP:1346case CKA_EXTRACTABLE:1347case CKA_ALWAYS_SENSITIVE:1348case CKA_NEVER_EXTRACTABLE:1349case CKA_TRUSTED:1350/* value CK_BBOOL */1351jValueObject = ckBBoolPtrToJBooleanObject(env, (CK_BBOOL*) ckpAttribute->pValue);1352break;13531354case CKA_LABEL:1355case CKA_APPLICATION:1356/* value RFC 2279 (UTF-8) string */1357jValueObject = ckUTF8CharArrayToJCharArray(env, (CK_UTF8CHAR*) ckpAttribute->pValue, jValueLength);1358break;13591360case CKA_START_DATE:1361case CKA_END_DATE:1362/* value CK_DATE */1363jValueObject = ckDatePtrToJDateObject(env, (CK_DATE*) ckpAttribute->pValue);1364break;13651366case CKA_MODULUS:1367case CKA_PUBLIC_EXPONENT:1368case CKA_PRIME:1369case CKA_SUBPRIME:1370case CKA_BASE:1371/* value big integer, i.e. CK_BYTE[] */1372jValueObject = ckByteArrayToJByteArray(env, (CK_BYTE*) ckpAttribute->pValue, jValueLength);1373break;13741375case CKA_AUTH_PIN_FLAGS:1376jValueObject = ckULongPtrToJLongObject(env, (CK_ULONG*) ckpAttribute->pValue);1377/* value FLAGS, defacto a CK_ULONG */1378break;13791380case CKA_VENDOR_DEFINED:1381/* we make a CK_BYTE[] out of this */1382jValueObject = ckByteArrayToJByteArray(env, (CK_BYTE*) ckpAttribute->pValue, jValueLength);1383break;13841385// Netscape trust attributes1386case CKA_NETSCAPE_TRUST_SERVER_AUTH:1387case CKA_NETSCAPE_TRUST_CLIENT_AUTH:1388case CKA_NETSCAPE_TRUST_CODE_SIGNING:1389case CKA_NETSCAPE_TRUST_EMAIL_PROTECTION:1390/* value CK_ULONG */1391jValueObject = ckULongPtrToJLongObject(env, (CK_ULONG*) ckpAttribute->pValue);1392break;13931394default:1395/* we make a CK_BYTE[] out of this */1396jValueObject = ckByteArrayToJByteArray(env, (CK_BYTE*) ckpAttribute->pValue, jValueLength);1397break;1398}13991400return jValueObject ;1401}14021403/*1404* the following functions convert a Java mechanism parameter object to a PKCS#111405* mechanism parameter structure1406*1407* CK_<Param>_PARAMS j<Param>ParamToCK<Param>Param(JNIEnv *env,1408* jobject jParam);1409*1410* These functions get a Java object, that must be the right Java mechanism1411* object and they return the new PKCS#11 mechanism parameter structure.1412* Every field of the Java object is retrieved, gets converted to a corresponding1413* PKCS#11 type and is set in the new PKCS#11 structure.1414*/14151416/*1417* converts the given Java mechanism parameter to a CK mechanism parameter1418* pointer and store the length in bytes in the length variable.1419*1420* @param env - used to call JNI funktions to get the Java classes and objects1421* @param jParam - the Java mechanism parameter object to convert1422* @param ckMech - the PKCS#11 mechanism type1423* @param ckpLength - the reference of the length in bytes of the new CK mechanism parameter1424* structure1425* @return pointer to the new CK mechanism parameter structure1426*/1427CK_VOID_PTR jMechParamToCKMechParamPtr(JNIEnv *env, jobject jParam,1428CK_MECHANISM_TYPE ckMech, CK_ULONG *ckpLength)1429{1430CK_VOID_PTR ckpParamPtr;1431if (jParam == NULL) {1432ckpParamPtr = NULL;1433*ckpLength = 0;1434} else if ((*env)->IsInstanceOf(env, jParam, jByteArrayClass)) {1435jByteArrayToCKByteArray(env, jParam, (CK_BYTE_PTR *) &ckpParamPtr, ckpLength);1436} else if ((*env)->IsInstanceOf(env, jParam, jLongClass)) {1437ckpParamPtr = jLongObjectToCKULongPtr(env, jParam);1438*ckpLength = sizeof(CK_ULONG);1439} else {1440ckpParamPtr = jMechParamToCKMechParamPtrSlow(env, jParam, ckMech, ckpLength);1441}1442return ckpParamPtr;1443}14441445CK_VOID_PTR jMechParamToCKMechParamPtrSlow(JNIEnv *env, jobject jParam,1446CK_MECHANISM_TYPE ckMech, CK_ULONG *ckpLength)1447{1448CK_VOID_PTR ckpParamPtr = NULL;14491450/*1451* Most common cases, i.e. NULL/byte[]/long, are already handled by1452* jMechParamToCKMechParam before calling this method.1453*/1454TRACE1("\nDEBUG: jMechParamToCKMechParamPtrSlow, mech=0x%lX\n", ckMech);14551456switch (ckMech) {1457case CKM_SSL3_PRE_MASTER_KEY_GEN:1458case CKM_TLS_PRE_MASTER_KEY_GEN:1459ckpParamPtr = jVersionToCKVersionPtr(env, jParam);1460if (ckpParamPtr != NULL) {1461*ckpLength = sizeof(CK_VERSION);1462} else {1463*ckpLength = 0;1464}1465break;1466case CKM_SSL3_MASTER_KEY_DERIVE:1467case CKM_TLS_MASTER_KEY_DERIVE:1468case CKM_SSL3_MASTER_KEY_DERIVE_DH:1469case CKM_TLS_MASTER_KEY_DERIVE_DH:1470ckpParamPtr = jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParamPtr(env, jParam,1471ckpLength);1472break;1473case CKM_SSL3_KEY_AND_MAC_DERIVE:1474case CKM_TLS_KEY_AND_MAC_DERIVE:1475ckpParamPtr = jSsl3KeyMatParamToCKSsl3KeyMatParamPtr(env, jParam,1476ckpLength);1477break;1478case CKM_TLS12_KEY_AND_MAC_DERIVE:1479ckpParamPtr = jTls12KeyMatParamToCKTls12KeyMatParamPtr(env, jParam,1480ckpLength);1481break;1482case CKM_TLS12_MASTER_KEY_DERIVE:1483case CKM_TLS12_MASTER_KEY_DERIVE_DH:1484ckpParamPtr = jTls12MasterKeyDeriveParamToCKTls12MasterKeyDeriveParamPtr(env, jParam,1485ckpLength);1486break;1487case CKM_TLS_PRF:1488case CKM_NSS_TLS_PRF_GENERAL:1489ckpParamPtr = jTlsPrfParamsToCKTlsPrfParamPtr(env, jParam,1490ckpLength);1491break;1492case CKM_TLS_MAC:1493ckpParamPtr = jTlsMacParamsToCKTlsMacParamPtr(env, jParam,1494ckpLength);1495break;1496case CKM_AES_CTR:1497ckpParamPtr = jAesCtrParamsToCKAesCtrParamPtr(env, jParam,1498ckpLength);1499break;1500case CKM_AES_GCM:1501ckpParamPtr = jGCMParamsToCKGCMParamPtr(env, jParam, ckpLength);1502break;1503case CKM_AES_CCM:1504ckpParamPtr = jCCMParamsToCKCCMParamPtr(env, jParam, ckpLength);1505break;1506case CKM_CHACHA20_POLY1305:1507ckpParamPtr =1508jSalsaChaChaPolyParamsToCKSalsaChaChaPolyParamPtr(env,1509jParam, ckpLength);1510break;1511case CKM_RSA_PKCS_OAEP:1512ckpParamPtr = jRsaPkcsOaepParamToCKRsaPkcsOaepParamPtr(env, jParam, ckpLength);1513break;1514case CKM_PBE_SHA1_DES3_EDE_CBC:1515case CKM_PBE_SHA1_DES2_EDE_CBC:1516case CKM_PBA_SHA1_WITH_SHA1_HMAC:1517ckpParamPtr = jPbeParamToCKPbeParamPtr(env, jParam, ckpLength);1518break;1519case CKM_PKCS5_PBKD2:1520ckpParamPtr = jPkcs5Pbkd2ParamToCKPkcs5Pbkd2ParamPtr(env, jParam, ckpLength);1521break;1522case CKM_RSA_PKCS_PSS:1523case CKM_SHA1_RSA_PKCS_PSS:1524case CKM_SHA256_RSA_PKCS_PSS:1525case CKM_SHA384_RSA_PKCS_PSS:1526case CKM_SHA512_RSA_PKCS_PSS:1527case CKM_SHA224_RSA_PKCS_PSS:1528ckpParamPtr = jRsaPkcsPssParamToCKRsaPkcsPssParamPtr(env, jParam, ckpLength);1529break;1530case CKM_ECDH1_DERIVE:1531case CKM_ECDH1_COFACTOR_DERIVE:1532ckpParamPtr = jEcdh1DeriveParamToCKEcdh1DeriveParamPtr(env, jParam, ckpLength);1533break;1534case CKM_ECMQV_DERIVE:1535ckpParamPtr = jEcdh2DeriveParamToCKEcdh2DeriveParamPtr(env, jParam, ckpLength);1536break;1537case CKM_X9_42_DH_DERIVE:1538ckpParamPtr = jX942Dh1DeriveParamToCKX942Dh1DeriveParamPtr(env, jParam, ckpLength);1539break;1540case CKM_X9_42_DH_HYBRID_DERIVE:1541case CKM_X9_42_MQV_DERIVE:1542ckpParamPtr = jX942Dh2DeriveParamToCKX942Dh2DeriveParamPtr(env, jParam, ckpLength);1543break;1544// defined by pkcs11.h but we don't support1545case CKM_KEA_DERIVE: // CK_KEA_DERIVE_PARAMS1546case CKM_RC2_CBC: // CK_RC2_CBC_PARAMS1547case CKM_RC2_MAC_GENERAL: // CK_RC2_MAC_GENERAL_PARAMS1548case CKM_RC5_ECB: // CK_RC5_PARAMS1549case CKM_RC5_MAC: // CK_RC5_PARAMS1550case CKM_RC5_CBC: // CK_RC5_CBC_PARAMS1551case CKM_RC5_MAC_GENERAL: // CK_RC5_MAC_GENERAL_PARAMS1552case CKM_SKIPJACK_PRIVATE_WRAP: // CK_SKIPJACK_PRIVATE_WRAP_PARAMS1553case CKM_SKIPJACK_RELAYX: // CK_SKIPJACK_RELAYX_PARAMS1554case CKM_KEY_WRAP_SET_OAEP: // CK_KEY_WRAP_SET_OAEP_PARAMS1555throwPKCS11RuntimeException(env, "No parameter support for this mchanism");1556break;1557default:1558/* if everything faild up to here */1559/* try if the parameter is a primitive Java type */1560ckpParamPtr = jObjectToPrimitiveCKObjectPtr(env, jParam, ckpLength);1561/* *ckpParamPtr = jObjectToCKVoidPtr(jParam); */1562/* *ckpLength = 1; */1563}1564TRACE0("\nDEBUG: jMechParamToCKMechParamPtrSlow FINISHED\n");15651566if ((*env)->ExceptionCheck(env)) {1567return NULL;1568}15691570return ckpParamPtr;1571}15721573/*1574* converts the Java CK_RSA_PKCS_OAEP_PARAMS object to a1575* CK_RSA_PKCS_OAEP_PARAMS pointer1576*1577* @param env - used to call JNI funktions to get the Java classes and objects1578* @param jParam - the Java CK_RSA_PKCS_OAEP_PARAMS object to convert1579* @param pLength - length of the allocated memory of the returned pointer1580* @return pointer to the new CK_RSA_PKCS_OAEP_PARAMS structure1581*/1582CK_RSA_PKCS_OAEP_PARAMS_PTR1583jRsaPkcsOaepParamToCKRsaPkcsOaepParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength)1584{1585CK_RSA_PKCS_OAEP_PARAMS_PTR ckParamPtr;1586jclass jRsaPkcsOaepParamsClass;1587jfieldID fieldID;1588jlong jHashAlg, jMgf, jSource;1589jobject jSourceData;15901591if (pLength!= NULL) {1592*pLength = 0L;1593}15941595// retrieve java values1596jRsaPkcsOaepParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_OAEP_PARAMS);1597if (jRsaPkcsOaepParamsClass == NULL) { return NULL; }1598fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "hashAlg", "J");1599if (fieldID == NULL) { return NULL; }1600jHashAlg = (*env)->GetLongField(env, jParam, fieldID);1601fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "mgf", "J");1602if (fieldID == NULL) { return NULL; }1603jMgf = (*env)->GetLongField(env, jParam, fieldID);1604fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "source", "J");1605if (fieldID == NULL) { return NULL; }1606jSource = (*env)->GetLongField(env, jParam, fieldID);1607fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "pSourceData", "[B");1608if (fieldID == NULL) { return NULL; }1609jSourceData = (*env)->GetObjectField(env, jParam, fieldID);16101611// allocate memory for CK_RSA_PKCS_OAEP_PARAMS pointer1612ckParamPtr = calloc(1, sizeof(CK_RSA_PKCS_OAEP_PARAMS));1613if (ckParamPtr == NULL) {1614throwOutOfMemoryError(env, 0);1615return NULL;1616}16171618// populate using java values1619ckParamPtr->hashAlg = jLongToCKULong(jHashAlg);1620ckParamPtr->mgf = jLongToCKULong(jMgf);1621ckParamPtr->source = jLongToCKULong(jSource);1622jByteArrayToCKByteArray(env, jSourceData, (CK_BYTE_PTR*) &(ckParamPtr->pSourceData),1623&(ckParamPtr->ulSourceDataLen));1624if ((*env)->ExceptionCheck(env)) {1625free(ckParamPtr);1626return NULL;1627}16281629if (pLength!= NULL) {1630*pLength = sizeof(CK_RSA_PKCS_OAEP_PARAMS);1631}1632return ckParamPtr;1633}16341635/*1636* converts the Java CK_PBE_PARAMS object to a CK_PBE_PARAMS pointer1637*1638* @param env - used to call JNI funktions to get the Java classes and objects1639* @param jParam - the Java CK_PBE_PARAMS object to convert1640* @param pLength - length of the allocated memory of the returned pointer1641* @return pointer to the new CK_PBE_PARAMS structure1642*/1643CK_PBE_PARAMS_PTR1644jPbeParamToCKPbeParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength)1645{1646CK_PBE_PARAMS_PTR ckParamPtr;1647jclass jPbeParamsClass;1648jfieldID fieldID;1649jlong jIteration;1650jobject jInitVector, jPassword, jSalt;1651CK_ULONG ckTemp;16521653if (pLength != NULL) {1654*pLength = 0;1655}16561657// retrieve java values1658jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);1659if (jPbeParamsClass == NULL) { return NULL; }1660fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pInitVector", "[C");1661if (fieldID == NULL) { return NULL; }1662jInitVector = (*env)->GetObjectField(env, jParam, fieldID);1663fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pPassword", "[C");1664if (fieldID == NULL) { return NULL; }1665jPassword = (*env)->GetObjectField(env, jParam, fieldID);1666fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pSalt", "[C");1667if (fieldID == NULL) { return NULL; }1668jSalt = (*env)->GetObjectField(env, jParam, fieldID);1669fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "ulIteration", "J");1670if (fieldID == NULL) { return NULL; }1671jIteration = (*env)->GetLongField(env, jParam, fieldID);16721673// allocate memory for CK_PBE_PARAMS pointer1674ckParamPtr = calloc(1, sizeof(CK_PBE_PARAMS));1675if (ckParamPtr == NULL) {1676throwOutOfMemoryError(env, 0);1677return NULL;1678}16791680// populate using java values1681ckParamPtr->ulIteration = jLongToCKULong(jIteration);1682jCharArrayToCKCharArray(env, jInitVector, &(ckParamPtr->pInitVector), &ckTemp);1683if ((*env)->ExceptionCheck(env)) {1684goto cleanup;1685}1686jCharArrayToCKCharArray(env, jPassword, &(ckParamPtr->pPassword), &(ckParamPtr->ulPasswordLen));1687if ((*env)->ExceptionCheck(env)) {1688goto cleanup;1689}1690jCharArrayToCKCharArray(env, jSalt, &(ckParamPtr->pSalt), &(ckParamPtr->ulSaltLen));1691if ((*env)->ExceptionCheck(env)) {1692goto cleanup;1693}16941695if (pLength != NULL) {1696*pLength = sizeof(CK_PBE_PARAMS);1697}1698return ckParamPtr;1699cleanup:1700free(ckParamPtr->pInitVector);1701free(ckParamPtr->pPassword);1702free(ckParamPtr->pSalt);1703free(ckParamPtr);1704return NULL;1705}17061707/*1708* Copy back the initialization vector from the native structure to the1709* Java object. This is only used for CKM_PBE_* mechanisms and their1710* CK_PBE_PARAMS parameters.1711*1712*/1713void copyBackPBEInitializationVector(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism)1714{1715jclass jMechanismClass, jPbeParamsClass;1716CK_PBE_PARAMS *ckParam;1717jfieldID fieldID;1718CK_MECHANISM_TYPE ckMechanismType;1719jlong jMechanismType;1720jobject jParameter;1721jobject jInitVector;1722jint jInitVectorLength;1723CK_CHAR_PTR initVector;1724int i;1725jchar* jInitVectorChars;17261727/* get mechanism */1728jMechanismClass = (*env)->FindClass(env, CLASS_MECHANISM);1729if (jMechanismClass == NULL) { return; }1730fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J");1731if (fieldID == NULL) { return; }1732jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID);1733ckMechanismType = jLongToCKULong(jMechanismType);1734if (ckMechanismType != ckMechanism->mechanism) {1735/* we do not have matching types, this should not occur */1736return;1737}17381739jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);1740if (jPbeParamsClass == NULL) { return; }1741ckParam = (CK_PBE_PARAMS *) ckMechanism->pParameter;1742if (ckParam != NULL_PTR) {1743initVector = ckParam->pInitVector;1744if (initVector != NULL_PTR) {1745/* get pParameter */1746fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;");1747if (fieldID == NULL) { return; }1748jParameter = (*env)->GetObjectField(env, jMechanism, fieldID);1749fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pInitVektor", "[C");1750if (fieldID == NULL) { return; }1751jInitVector = (*env)->GetObjectField(env, jParameter, fieldID);17521753if (jInitVector != NULL) {1754jInitVectorLength = (*env)->GetArrayLength(env, jInitVector);1755jInitVectorChars = (*env)->GetCharArrayElements(env, jInitVector, NULL);1756if (jInitVectorChars == NULL) { return; }17571758/* copy the chars to the Java buffer */1759for (i=0; i < jInitVectorLength; i++) {1760jInitVectorChars[i] = ckCharToJChar(initVector[i]);1761}1762/* copy back the Java buffer to the object */1763(*env)->ReleaseCharArrayElements(env, jInitVector, jInitVectorChars, 0);1764}1765}1766}1767}17681769/*1770* converts the Java CK_PKCS5_PBKD2_PARAMS object to a CK_PKCS5_PBKD2_PARAMS1771* pointer1772*1773* @param env - used to call JNI funktions to get the Java classes and objects1774* @param jParam - the Java CK_PKCS5_PBKD2_PARAMS object to convert1775* @param pLength - length of the allocated memory of the returned pointer1776* @return pointer to the new CK_PKCS5_PBKD2_PARAMS structure1777*/1778CK_PKCS5_PBKD2_PARAMS_PTR1779jPkcs5Pbkd2ParamToCKPkcs5Pbkd2ParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength)1780{1781CK_PKCS5_PBKD2_PARAMS_PTR ckParamPtr;1782jclass jPkcs5Pbkd2ParamsClass;1783jfieldID fieldID;1784jlong jSaltSource, jIteration, jPrf;1785jobject jSaltSourceData, jPrfData;17861787if (pLength != NULL) {1788*pLength = 0L;1789}17901791// retrieve java values1792jPkcs5Pbkd2ParamsClass = (*env)->FindClass(env, CLASS_PKCS5_PBKD2_PARAMS);1793if (jPkcs5Pbkd2ParamsClass == NULL) { return NULL; }1794fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "saltSource", "J");1795if (fieldID == NULL) { return NULL; }1796jSaltSource = (*env)->GetLongField(env, jParam, fieldID);1797fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "pSaltSourceData", "[B");1798if (fieldID == NULL) { return NULL; }1799jSaltSourceData = (*env)->GetObjectField(env, jParam, fieldID);1800fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "iterations", "J");1801if (fieldID == NULL) { return NULL; }1802jIteration = (*env)->GetLongField(env, jParam, fieldID);1803fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "prf", "J");1804if (fieldID == NULL) { return NULL; }1805jPrf = (*env)->GetLongField(env, jParam, fieldID);1806fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "pPrfData", "[B");1807if (fieldID == NULL) { return NULL; }1808jPrfData = (*env)->GetObjectField(env, jParam, fieldID);18091810// allocate memory for CK_PKCS5_PBKD2_PARAMS pointer1811ckParamPtr = calloc(1, sizeof(CK_PKCS5_PBKD2_PARAMS));1812if (ckParamPtr == NULL) {1813throwOutOfMemoryError(env, 0);1814return NULL;1815}18161817// populate using java values1818ckParamPtr->saltSource = jLongToCKULong(jSaltSource);1819jByteArrayToCKByteArray(env, jSaltSourceData, (CK_BYTE_PTR *)1820&(ckParamPtr->pSaltSourceData), &(ckParamPtr->ulSaltSourceDataLen));1821if ((*env)->ExceptionCheck(env)) {1822goto cleanup;1823}1824ckParamPtr->iterations = jLongToCKULong(jIteration);1825ckParamPtr->prf = jLongToCKULong(jPrf);1826jByteArrayToCKByteArray(env, jPrfData, (CK_BYTE_PTR *)1827&(ckParamPtr->pPrfData), &(ckParamPtr->ulPrfDataLen));1828if ((*env)->ExceptionCheck(env)) {1829goto cleanup;1830}18311832if (pLength != NULL) {1833*pLength = sizeof(CK_PKCS5_PBKD2_PARAMS);1834}1835return ckParamPtr;1836cleanup:1837free(ckParamPtr->pSaltSourceData);1838free(ckParamPtr->pPrfData);1839free(ckParamPtr);1840return NULL;18411842}18431844/*1845* converts the Java CK_RSA_PKCS_PSS_PARAMS object to a CK_RSA_PKCS_PSS_PARAMS1846* pointer1847*1848* @param env - used to call JNI funktions to get the Java classes and objects1849* @param jParam - the Java CK_RSA_PKCS_PSS_PARAMS object to convert1850* @param pLength - length of the allocated memory of the returned pointer1851* @return pointer to the new CK_RSA_PKCS_PSS_PARAMS structure1852*/1853CK_RSA_PKCS_PSS_PARAMS_PTR1854jRsaPkcsPssParamToCKRsaPkcsPssParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength)1855{1856CK_RSA_PKCS_PSS_PARAMS_PTR ckParamPtr;1857jclass jRsaPkcsPssParamsClass;1858jfieldID fieldID;1859jlong jHashAlg, jMgf, jSLen;18601861if (pLength != NULL) {1862*pLength = 0;1863}18641865// retrieve java values1866jRsaPkcsPssParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_PSS_PARAMS);1867if (jRsaPkcsPssParamsClass == NULL) { return NULL; }1868fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "hashAlg", "J");1869if (fieldID == NULL) { return NULL; }1870jHashAlg = (*env)->GetLongField(env, jParam, fieldID);1871fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "mgf", "J");1872if (fieldID == NULL) { return NULL; }1873jMgf = (*env)->GetLongField(env, jParam, fieldID);1874fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "sLen", "J");1875if (fieldID == NULL) { return NULL; }1876jSLen = (*env)->GetLongField(env, jParam, fieldID);18771878// allocate memory for CK_RSA_PKCS_PSS_PARAMS pointer1879ckParamPtr = calloc(1, sizeof(CK_RSA_PKCS_PSS_PARAMS));1880if (ckParamPtr == NULL) {1881throwOutOfMemoryError(env, 0);1882return NULL;1883}18841885// populate using java values1886ckParamPtr->hashAlg = jLongToCKULong(jHashAlg);1887ckParamPtr->mgf = jLongToCKULong(jMgf);1888ckParamPtr->sLen = jLongToCKULong(jSLen);1889TRACE1("DEBUG: jRsaPkcsPssParamToCKRsaPkcsPssParam, hashAlg=0x%lX\n", ckParamPtr->hashAlg);1890TRACE1("DEBUG: jRsaPkcsPssParamToCKRsaPkcsPssParam, mgf=0x%lX\n", ckParamPtr->mgf);1891TRACE1("DEBUG: jRsaPkcsPssParamToCKRsaPkcsPssParam, sLen=%lu\n", ckParamPtr->sLen);18921893if (pLength != NULL) {1894*pLength = sizeof(CK_RSA_PKCS_PSS_PARAMS);1895}1896return ckParamPtr;18971898}18991900/*1901* converts the Java CK_ECDH1_DERIVE_PARAMS object to a CK_ECDH1_DERIVE_PARAMS1902* pointer1903*1904* @param env - used to call JNI funktions to get the Java classes and objects1905* @param jParam - the Java CK_ECDH1_DERIVE_PARAMS object to convert1906* @param pLength - length of the allocated memory of the returned pointer1907* @retur pointer to nthe new CK_ECDH1_DERIVE_PARAMS structure1908*/1909CK_ECDH1_DERIVE_PARAMS_PTR1910jEcdh1DeriveParamToCKEcdh1DeriveParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength)1911{1912CK_ECDH1_DERIVE_PARAMS_PTR ckParamPtr;1913jclass jEcdh1DeriveParamsClass;1914jfieldID fieldID;1915jlong jLong;1916jobject jSharedData, jPublicData;19171918if (pLength != NULL) {1919*pLength = 0;1920}19211922// retrieve java values1923jEcdh1DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH1_DERIVE_PARAMS);1924if (jEcdh1DeriveParamsClass == NULL) { return NULL; }1925fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "kdf", "J");1926if (fieldID == NULL) { return NULL; }1927jLong = (*env)->GetLongField(env, jParam, fieldID);1928fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "pSharedData", "[B");1929if (fieldID == NULL) { return NULL; }1930jSharedData = (*env)->GetObjectField(env, jParam, fieldID);1931fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "pPublicData", "[B");1932if (fieldID == NULL) { return NULL; }1933jPublicData = (*env)->GetObjectField(env, jParam, fieldID);19341935// allocate memory for CK_ECDH1_DERIVE_PARAMS pointer1936ckParamPtr = calloc(1, sizeof(CK_ECDH1_DERIVE_PARAMS));1937if (ckParamPtr == NULL) {1938throwOutOfMemoryError(env, 0);1939return NULL;1940}19411942// populate using java values1943ckParamPtr->kdf = jLongToCKULong(jLong);1944jByteArrayToCKByteArray(env, jSharedData, &(ckParamPtr->pSharedData),1945&(ckParamPtr->ulSharedDataLen));1946if ((*env)->ExceptionCheck(env)) {1947goto cleanup;1948}1949jByteArrayToCKByteArray(env, jPublicData, &(ckParamPtr->pPublicData),1950&(ckParamPtr->ulPublicDataLen));1951if ((*env)->ExceptionCheck(env)) {1952goto cleanup;1953}19541955if (pLength != NULL) {1956*pLength = sizeof(CK_ECDH1_DERIVE_PARAMS);1957}1958return ckParamPtr;1959cleanup:1960free(ckParamPtr->pSharedData);1961free(ckParamPtr->pPublicData);1962free(ckParamPtr);1963return NULL;1964}19651966/*1967* converts the Java CK_ECDH2_DERIVE_PARAMS object to a CK_ECDH2_DERIVE_PARAMS1968* pointer1969*1970* @param env - used to call JNI funktions to get the Java classes and objects1971* @param jParam - the Java CK_ECDH2_DERIVE_PARAMS object to convert1972* @param pLength - length of the allocated memory of the returned pointer1973* @return pointer to the new CK_ECDH2_DERIVE_PARAMS structure1974*/1975CK_ECDH2_DERIVE_PARAMS_PTR1976jEcdh2DeriveParamToCKEcdh2DeriveParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength)1977{1978CK_ECDH2_DERIVE_PARAMS_PTR ckParamPtr;1979jclass jEcdh2DeriveParamsClass;1980jfieldID fieldID;1981jlong jKdf, jPrivateDataLen, jPrivateData;1982jobject jSharedData, jPublicData, jPublicData2;19831984// retrieve java values1985jEcdh2DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH2_DERIVE_PARAMS);1986if (jEcdh2DeriveParamsClass == NULL) { return NULL; }1987fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "kdf", "J");1988if (fieldID == NULL) { return NULL; }1989jKdf = (*env)->GetLongField(env, jParam, fieldID);1990fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pSharedData", "[B");1991if (fieldID == NULL) { return NULL; }1992jSharedData = (*env)->GetObjectField(env, jParam, fieldID);1993fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pPublicData", "[B");1994if (fieldID == NULL) { return NULL; }1995jPublicData = (*env)->GetObjectField(env, jParam, fieldID);1996fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "ulPrivateDataLen", "J");1997if (fieldID == NULL) { return NULL; }1998jPrivateDataLen = (*env)->GetLongField(env, jParam, fieldID);1999fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "hPrivateData", "J");2000if (fieldID == NULL) { return NULL; }2001jPrivateData = (*env)->GetLongField(env, jParam, fieldID);2002fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pPublicData2", "[B");2003if (fieldID == NULL) { return NULL; }2004jPublicData2 = (*env)->GetObjectField(env, jParam, fieldID);20052006// allocate memory for CK_ECDH2_DERIVE_PARAMS pointer2007ckParamPtr = calloc(1, sizeof(CK_ECDH2_DERIVE_PARAMS));2008if (ckParamPtr == NULL) {2009throwOutOfMemoryError(env, 0);2010return NULL;2011}20122013// populate using java values2014ckParamPtr->kdf = jLongToCKULong(jKdf);2015jByteArrayToCKByteArray(env, jSharedData, &(ckParamPtr->pSharedData),2016&(ckParamPtr->ulSharedDataLen));2017if ((*env)->ExceptionCheck(env)) {2018goto cleanup;2019}2020jByteArrayToCKByteArray(env, jPublicData, &(ckParamPtr->pPublicData),2021&(ckParamPtr->ulPublicDataLen));2022if ((*env)->ExceptionCheck(env)) {2023goto cleanup;2024}2025ckParamPtr->ulPrivateDataLen = jLongToCKULong(jPrivateDataLen);2026ckParamPtr->hPrivateData = jLongToCKULong(jPrivateData);2027jByteArrayToCKByteArray(env, jPublicData2, &(ckParamPtr->pPublicData2),2028&(ckParamPtr->ulPublicDataLen2));2029if ((*env)->ExceptionCheck(env)) {2030goto cleanup;2031}20322033if (pLength != NULL) {2034*pLength = sizeof(CK_ECDH2_DERIVE_PARAMS);2035}2036return ckParamPtr;2037cleanup:2038free(ckParamPtr->pSharedData);2039free(ckParamPtr->pPublicData);2040free(ckParamPtr->pPublicData2);2041free(ckParamPtr);2042return NULL;2043}20442045/*2046* converts the Java CK_X9_42_DH1_DERIVE_PARAMS object to a2047* CK_X9_42_DH1_DERIVE_PARAMS pointer2048*2049* @param env - used to call JNI funktions to get the Java classes and objects2050* @param jParam - the Java CK_X9_42_DH1_DERIVE_PARAMS object to convert2051* @param pLength - length of the allocated memory of the returned pointer2052* @return pointer to the new CK_X9_42_DH1_DERIVE_PARAMS structure2053*/2054CK_X9_42_DH1_DERIVE_PARAMS_PTR2055jX942Dh1DeriveParamToCKX942Dh1DeriveParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength)2056{2057CK_X9_42_DH1_DERIVE_PARAMS_PTR ckParamPtr;2058jclass jX942Dh1DeriveParamsClass;2059jfieldID fieldID;2060jlong jKdf;2061jobject jOtherInfo, jPublicData;20622063if (pLength != NULL) {2064*pLength = 0;2065}20662067// retrieve java values2068jX942Dh1DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH1_DERIVE_PARAMS);2069if (jX942Dh1DeriveParamsClass == NULL) { return NULL; }2070fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "kdf", "J");2071if (fieldID == NULL) { return NULL; }2072jKdf = (*env)->GetLongField(env, jParam, fieldID);2073fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "pOtherInfo", "[B");2074if (fieldID == NULL) { return NULL; }2075jOtherInfo = (*env)->GetObjectField(env, jParam, fieldID);2076fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "pPublicData", "[B");2077if (fieldID == NULL) { return NULL; }2078jPublicData = (*env)->GetObjectField(env, jParam, fieldID);20792080// allocate memory for CK_X9_42_DH1_DERIVE_PARAMS pointer2081ckParamPtr = calloc(1, sizeof(CK_X9_42_DH1_DERIVE_PARAMS));2082if (ckParamPtr == NULL) {2083throwOutOfMemoryError(env, 0);2084return NULL;2085}20862087// populate using java values2088ckParamPtr->kdf = jLongToCKULong(jKdf);2089jByteArrayToCKByteArray(env, jOtherInfo, &(ckParamPtr->pOtherInfo),2090&(ckParamPtr->ulOtherInfoLen));2091if ((*env)->ExceptionCheck(env)) {2092goto cleanup;2093}2094jByteArrayToCKByteArray(env, jPublicData, &(ckParamPtr->pPublicData),2095&(ckParamPtr->ulPublicDataLen));2096if ((*env)->ExceptionCheck(env)) {2097goto cleanup;2098}20992100if (pLength != NULL) {2101*pLength = sizeof(CK_X9_42_DH1_DERIVE_PARAMS);2102}2103return ckParamPtr;2104cleanup:2105free(ckParamPtr->pOtherInfo);2106free(ckParamPtr->pPublicData);2107free(ckParamPtr);2108return NULL;2109}21102111/*2112* converts the Java CK_X9_42_DH2_DERIVE_PARAMS object to a2113* CK_X9_42_DH2_DERIVE_PARAMS pointer2114*2115* @param env - used to call JNI funktions to get the Java classes and objects2116* @param jParam - the Java CK_X9_42_DH2_DERIVE_PARAMS object to convert2117* @param pLength - length of the allocated memory of the returned pointer2118* @return pointer to the new CK_X9_42_DH2_DERIVE_PARAMS structure2119*/2120CK_X9_42_DH2_DERIVE_PARAMS_PTR2121jX942Dh2DeriveParamToCKX942Dh2DeriveParamPtr(JNIEnv *env, jobject jParam, CK_ULONG *pLength)2122{2123CK_X9_42_DH2_DERIVE_PARAMS_PTR ckParamPtr;2124jclass jX942Dh2DeriveParamsClass;2125jfieldID fieldID;2126jlong jKdf, jPrivateDataLen, jPrivateData;2127jobject jOtherInfo, jPublicData, jPublicData2;21282129if (pLength != NULL) {2130*pLength = 0L;2131}21322133// retrieve java values2134jX942Dh2DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH2_DERIVE_PARAMS);2135if (jX942Dh2DeriveParamsClass == NULL) { return NULL; }2136fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "kdf", "J");2137if (fieldID == NULL) { return NULL; }2138jKdf = (*env)->GetLongField(env, jParam, fieldID);2139fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pOtherInfo", "[B");2140if (fieldID == NULL) { return NULL; }2141jOtherInfo = (*env)->GetObjectField(env, jParam, fieldID);2142fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pPublicData", "[B");2143if (fieldID == NULL) { return NULL; }2144jPublicData = (*env)->GetObjectField(env, jParam, fieldID);2145fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "ulPrivateDataLen", "J");2146if (fieldID == NULL) { return NULL; }2147jPrivateDataLen = (*env)->GetLongField(env, jParam, fieldID);2148fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "hPrivateData", "J");2149if (fieldID == NULL) { return NULL; }2150jPrivateData = (*env)->GetLongField(env, jParam, fieldID);2151fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pPublicData2", "[B");2152if (fieldID == NULL) { return NULL; }2153jPublicData2 = (*env)->GetObjectField(env, jParam, fieldID);21542155// allocate memory for CK_DATE pointer2156ckParamPtr = calloc(1, sizeof(CK_X9_42_DH2_DERIVE_PARAMS));2157if (ckParamPtr == NULL) {2158throwOutOfMemoryError(env, 0);2159return NULL;2160}21612162// populate using java values2163ckParamPtr->kdf = jLongToCKULong(jKdf);2164jByteArrayToCKByteArray(env, jOtherInfo, &(ckParamPtr->pOtherInfo),2165&(ckParamPtr->ulOtherInfoLen));2166if ((*env)->ExceptionCheck(env)) {2167goto cleanup;2168}2169jByteArrayToCKByteArray(env, jPublicData, &(ckParamPtr->pPublicData),2170&(ckParamPtr->ulPublicDataLen));2171if ((*env)->ExceptionCheck(env)) {2172goto cleanup;2173}2174ckParamPtr->ulPrivateDataLen = jLongToCKULong(jPrivateDataLen);2175ckParamPtr->hPrivateData = jLongToCKULong(jPrivateData);2176jByteArrayToCKByteArray(env, jPublicData2, &(ckParamPtr->pPublicData2),2177&(ckParamPtr->ulPublicDataLen2));2178if ((*env)->ExceptionCheck(env)) {2179goto cleanup;2180}21812182if (pLength != NULL) {2183*pLength = sizeof(CK_X9_42_DH2_DERIVE_PARAMS);2184}2185return ckParamPtr;2186cleanup:2187free(ckParamPtr->pOtherInfo);2188free(ckParamPtr->pPublicData);2189free(ckParamPtr->pPublicData2);2190free(ckParamPtr);2191return NULL;2192}219321942195