1 /*
   2  * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
   3  */
   4 
   5 /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   6  *
   7  * Redistribution and use in  source and binary forms, with or without
   8  * modification, are permitted  provided that the following conditions are met:
   9  *
  10  * 1. Redistributions of  source code must retain the above copyright notice,
  11  *    this list of conditions and the following disclaimer.
  12  *
  13  * 2. Redistributions in  binary form must reproduce the above copyright notice,
  14  *    this list of conditions and the following disclaimer in the documentation
  15  *    and/or other materials provided with the distribution.
  16  *
  17  * 3. The end-user documentation included with the redistribution, if any, must
  18  *    include the following acknowledgment:
  19  *
  20  *    "This product includes software developed by IAIK of Graz University of
  21  *     Technology."
  22  *
  23  *    Alternately, this acknowledgment may appear in the software itself, if
  24  *    and wherever such third-party acknowledgments normally appear.
  25  *
  26  * 4. The names "Graz University of Technology" and "IAIK of Graz University of
  27  *    Technology" must not be used to endorse or promote products derived from
  28  *    this software without prior written permission.
  29  *
  30  * 5. Products derived from this software may not be called
  31  *    "IAIK PKCS Wrapper", nor may "IAIK" appear in their name, without prior
  32  *    written permission of Graz University of Technology.
  33  *
  34  *  THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  35  *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  36  *  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  37  *  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE LICENSOR BE
  38  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
  39  *  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  40  *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  41  *  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  42  *  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  43  *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  44  *  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  45  *  POSSIBILITY  OF SUCH DAMAGE.
  46  */
  47 
  48 /*
  49  * pkcs11wrapper.c
  50  * 18.05.2001
  51  *
  52  * This is the implementation of the native functions of the Java to PKCS#11 interface.
  53  * All function use some helper functions to convert the JNI types to PKCS#11 types.
  54  *
  55  * @author Karl Scheibelhofer <Karl.Scheibelhofer@iaik.at>
  56  * @author Martin Schlaeffer <schlaeff@sbox.tugraz.at>
  57  */
  58 
  59 
  60 #include "pkcs11wrapper.h"
  61 
  62 #include <stdio.h>
  63 #include <stdlib.h>
  64 #include <string.h>
  65 #include <assert.h>
  66 
  67 #include "sun_security_pkcs11_wrapper_PKCS11.h"
  68 
  69 /* declare file private functions */
  70 
  71 void jMechanismParameterToCKMechanismParameterSlow(JNIEnv *env, jobject jParam, CK_VOID_PTR *ckpParamPtr, CK_ULONG *ckpLength);
  72 
  73 
  74 /*
  75  * converts a pointer to a CK_DATE structure into a Java CK_DATE Object.
  76  *
  77  * @param env - used to call JNI funktions to create the new Java object
  78  * @param ckpValue - the pointer to the CK_DATE structure
  79  * @return - the new Java CK_DATE object
  80  */
  81 jobject ckDatePtrToJDateObject(JNIEnv *env, const CK_DATE *ckpDate)
  82 {
  83     jclass jDateClass;
  84     jmethodID jCtrId;
  85     jobject jDateObject;
  86     jcharArray jYear;
  87     jcharArray jMonth;
  88     jcharArray jDay;
  89 
  90     /* load CK_DATE class */
  91     jDateClass = (*env)->FindClass(env, CLASS_DATE);
  92     if (jDateClass == NULL) { return NULL; }
  93 
  94     /* load CK_DATE constructor */
  95     jCtrId = (*env)->GetMethodID(env, jDateClass, "<init>", "([C[C[C)V");
  96     if (jCtrId == NULL) { return NULL; }
  97 
  98     /* prep all fields */
  99     jYear = ckCharArrayToJCharArray(env, (CK_CHAR_PTR)(ckpDate->year), 4);
 100     if (jYear == NULL) { return NULL; }
 101     jMonth = ckCharArrayToJCharArray(env, (CK_CHAR_PTR)(ckpDate->month), 2);
 102     if (jMonth == NULL) { return NULL; }
 103     jDay = ckCharArrayToJCharArray(env, (CK_CHAR_PTR)(ckpDate->day), 2);
 104     if (jDay == NULL) { return NULL; }
 105 
 106     /* create new CK_DATE object */
 107     jDateObject =
 108       (*env)->NewObject(env, jDateClass, jCtrId, jYear, jMonth, jDay);
 109     if (jDateObject == NULL) { return NULL; }
 110 
 111     /* free local references */
 112     (*env)->DeleteLocalRef(env, jDateClass);
 113     (*env)->DeleteLocalRef(env, jYear);
 114     (*env)->DeleteLocalRef(env, jMonth);
 115     (*env)->DeleteLocalRef(env, jDay);
 116 
 117     return jDateObject ;
 118 }
 119 
 120 /*
 121  * converts a pointer to a CK_VERSION structure into a Java CK_VERSION Object.
 122  *
 123  * @param env - used to call JNI funktions to create the new Java object
 124  * @param ckpVersion - the pointer to the CK_VERSION structure
 125  * @return - the new Java CK_VERSION object
 126  */
 127 jobject ckVersionPtrToJVersion(JNIEnv *env, const CK_VERSION_PTR ckpVersion)
 128 {
 129     jclass jVersionClass;
 130     jmethodID jCtrId;
 131     jobject jVersionObject;
 132     jint jMajor;
 133     jint jMinor;
 134 
 135     /* load CK_VERSION class */
 136     jVersionClass = (*env)->FindClass(env, CLASS_VERSION);
 137     if (jVersionClass == NULL) { return NULL; }
 138 
 139     /* load CK_VERSION constructor */
 140     jCtrId = (*env)->GetMethodID(env, jVersionClass, "<init>", "(II)V");
 141     if (jCtrId == NULL) { return NULL; }
 142 
 143     /* prep both fields */
 144     jMajor = ckpVersion->major;
 145     jMinor = ckpVersion->minor;
 146 
 147     /* create new CK_VERSION object */
 148     jVersionObject =
 149       (*env)->NewObject(env, jVersionClass, jCtrId, jMajor, jMinor);
 150     if (jVersionObject == NULL) { return NULL; }
 151 
 152     /* free local references */
 153     (*env)->DeleteLocalRef(env, jVersionClass);
 154 
 155     return jVersionObject ;
 156 }
 157 
 158 /*
 159  * converts a pointer to a CK_SESSION_INFO structure into a Java CK_SESSION_INFO Object.
 160  *
 161  * @param env - used to call JNI funktions to create the new Java object
 162  * @param ckpSessionInfo - the pointer to the CK_SESSION_INFO structure
 163  * @return - the new Java CK_SESSION_INFO object
 164  */
 165 jobject ckSessionInfoPtrToJSessionInfo(JNIEnv *env, const CK_SESSION_INFO_PTR ckpSessionInfo)
 166 {
 167     jclass jSessionInfoClass;
 168     jmethodID jCtrId;
 169     jobject jSessionInfoObject;
 170     jlong jSlotID;
 171     jlong jState;
 172     jlong jFlags;
 173     jlong jDeviceError;
 174 
 175     /* load CK_SESSION_INFO class */
 176     jSessionInfoClass = (*env)->FindClass(env, CLASS_SESSION_INFO);
 177     if (jSessionInfoClass == NULL) { return NULL; }
 178 
 179     /* load CK_SESSION_INFO constructor */
 180     jCtrId = (*env)->GetMethodID(env, jSessionInfoClass, "<init>", "(JJJJ)V");
 181     if (jCtrId == NULL) { return NULL; }
 182 
 183     /* prep all fields */
 184     jSlotID = ckULongToJLong(ckpSessionInfo->slotID);
 185     jState = ckULongToJLong(ckpSessionInfo->state);
 186     jFlags = ckULongToJLong(ckpSessionInfo->flags);
 187     jDeviceError = ckULongToJLong(ckpSessionInfo->ulDeviceError);
 188 
 189     /* create new CK_SESSION_INFO object */
 190     jSessionInfoObject =
 191       (*env)->NewObject(env, jSessionInfoClass, jCtrId, jSlotID, jState,
 192                         jFlags, jDeviceError);
 193     if (jSessionInfoObject == NULL) { return NULL; }
 194 
 195     /* free local references */
 196     (*env)->DeleteLocalRef(env, jSessionInfoClass);
 197 
 198     return jSessionInfoObject ;
 199 }
 200 
 201 /*
 202  * converts a pointer to a CK_ATTRIBUTE structure into a Java CK_ATTRIBUTE Object.
 203  *
 204  * @param env - used to call JNI funktions to create the new Java object
 205  * @param ckpAttribute - the pointer to the CK_ATTRIBUTE structure
 206  * @return - the new Java CK_ATTRIBUTE object
 207  */
 208 jobject ckAttributePtrToJAttribute(JNIEnv *env, const CK_ATTRIBUTE_PTR ckpAttribute)
 209 {
 210     jclass jAttributeClass;
 211     jmethodID jCtrId;
 212     jobject jAttributeObject;
 213     jlong jType;
 214     jobject jPValue = NULL;
 215 
 216     jAttributeClass = (*env)->FindClass(env, CLASS_ATTRIBUTE);
 217     if (jAttributeClass == NULL) { return NULL; }
 218 
 219     /* load CK_INFO constructor */
 220     jCtrId = (*env)->GetMethodID(env, jAttributeClass, "<init>", "(JLjava/lang/Object;)V");
 221     if (jCtrId == NULL) { return NULL; }
 222 
 223     /* prep both fields */
 224     jType = ckULongToJLong(ckpAttribute->type);
 225     jPValue = ckAttributeValueToJObject(env, ckpAttribute);
 226     if ((*env)->ExceptionCheck(env)) { return NULL; }
 227 
 228     /* create new CK_ATTRIBUTE object */
 229     jAttributeObject =
 230       (*env)->NewObject(env, jAttributeClass, jCtrId, jType, jPValue);
 231     if (jAttributeObject == NULL) { return NULL; }
 232 
 233     /* free local references */
 234     (*env)->DeleteLocalRef(env, jAttributeClass);
 235     (*env)->DeleteLocalRef(env, jPValue);
 236 
 237     return jAttributeObject;
 238 }
 239 
 240 
 241 /*
 242  * converts a Java CK_VERSION object into a pointer to a CK_VERSION structure
 243  *
 244  * @param env - used to call JNI funktions to get the values out of the Java object
 245  * @param jVersion - the Java CK_VERSION object to convert
 246  * @return - the pointer to the new CK_VERSION structure
 247  */
 248 CK_VERSION_PTR jVersionToCKVersionPtr(JNIEnv *env, jobject jVersion)
 249 {
 250     CK_VERSION_PTR ckpVersion;
 251     jclass jVersionClass;
 252     jfieldID jFieldID;
 253     jbyte jMajor, jMinor;
 254 
 255     if (jVersion == NULL) {
 256         return NULL;
 257     }
 258 
 259     /* get CK_VERSION class */
 260     jVersionClass = (*env)->GetObjectClass(env, jVersion);
 261     if (jVersionClass == NULL) { return NULL; }
 262 
 263     /* get Major */
 264     jFieldID = (*env)->GetFieldID(env, jVersionClass, "major", "B");
 265     if (jFieldID == NULL) { return NULL; }
 266     jMajor = (*env)->GetByteField(env, jVersion, jFieldID);
 267 
 268     /* get Minor */
 269     jFieldID = (*env)->GetFieldID(env, jVersionClass, "minor", "B");
 270     if (jFieldID == NULL) { return NULL; }
 271     jMinor = (*env)->GetByteField(env, jVersion, jFieldID);
 272 
 273     /* allocate memory for CK_VERSION pointer */
 274     ckpVersion = (CK_VERSION_PTR) malloc(sizeof(CK_VERSION));
 275     if (ckpVersion == NULL) {
 276         throwOutOfMemoryError(env, 0);
 277         return NULL;
 278     }
 279     ckpVersion->major = jByteToCKByte(jMajor);
 280     ckpVersion->minor = jByteToCKByte(jMinor);
 281 
 282     return ckpVersion ;
 283 }
 284 
 285 
 286 /*
 287  * converts a Java CK_DATE object into a pointer to a CK_DATE structure
 288  *
 289  * @param env - used to call JNI funktions to get the values out of the Java object
 290  * @param jVersion - the Java CK_DATE object to convert
 291  * @return - the pointer to the new CK_DATE structure
 292  */
 293 CK_DATE * jDateObjectPtrToCKDatePtr(JNIEnv *env, jobject jDate)
 294 {
 295     CK_DATE * ckpDate;
 296     CK_ULONG ckLength;
 297     jclass jDateClass;
 298     jfieldID jFieldID;
 299     jobject jYear, jMonth, jDay;
 300     jchar *jTempChars;
 301     CK_ULONG i;
 302 
 303     if (jDate == NULL) {
 304         return NULL;
 305     }
 306 
 307     /* get CK_DATE class */
 308     jDateClass = (*env)->FindClass(env, CLASS_DATE);
 309     if (jDateClass == NULL) { return NULL; }
 310 
 311     /* get Year */
 312     jFieldID = (*env)->GetFieldID(env, jDateClass, "year", "[C");
 313     if (jFieldID == NULL) { return NULL; }
 314     jYear = (*env)->GetObjectField(env, jDate, jFieldID);
 315 
 316     /* get Month */
 317     jFieldID = (*env)->GetFieldID(env, jDateClass, "month", "[C");
 318     if (jFieldID == NULL) { return NULL; }
 319     jMonth = (*env)->GetObjectField(env, jDate, jFieldID);
 320 
 321     /* get Day */
 322     jFieldID = (*env)->GetFieldID(env, jDateClass, "day", "[C");
 323     if (jFieldID == NULL) { return NULL; }
 324     jDay = (*env)->GetObjectField(env, jDate, jFieldID);
 325 
 326     /* allocate memory for CK_DATE pointer */
 327     ckpDate = (CK_DATE *) malloc(sizeof(CK_DATE));
 328     if (ckpDate == NULL) {
 329         throwOutOfMemoryError(env, 0);
 330         return NULL;
 331     }
 332 
 333     if (jYear == NULL) {
 334         ckpDate->year[0] = 0;
 335         ckpDate->year[1] = 0;
 336         ckpDate->year[2] = 0;
 337         ckpDate->year[3] = 0;
 338     } else {
 339         ckLength = (*env)->GetArrayLength(env, jYear);
 340         jTempChars = (jchar*) malloc((ckLength) * sizeof(jchar));
 341         if (jTempChars == NULL) {
 342             free(ckpDate);
 343             throwOutOfMemoryError(env, 0);
 344             return NULL;
 345         }
 346         (*env)->GetCharArrayRegion(env, jYear, 0, ckLength, jTempChars);
 347         if ((*env)->ExceptionCheck(env)) {
 348             free(ckpDate);
 349             free(jTempChars);
 350             return NULL;
 351         }
 352 
 353         for (i = 0; (i < ckLength) && (i < 4) ; i++) {
 354             ckpDate->year[i] = jCharToCKChar(jTempChars[i]);
 355         }
 356         free(jTempChars);
 357     }
 358 
 359     if (jMonth == NULL) {
 360         ckpDate->month[0] = 0;
 361         ckpDate->month[1] = 0;
 362     } else {
 363         ckLength = (*env)->GetArrayLength(env, jMonth);
 364         jTempChars = (jchar*) malloc((ckLength) * sizeof(jchar));
 365         if (jTempChars == NULL) {
 366             free(ckpDate);
 367             throwOutOfMemoryError(env, 0);
 368             return NULL;
 369         }
 370         (*env)->GetCharArrayRegion(env, jMonth, 0, ckLength, jTempChars);
 371         if ((*env)->ExceptionCheck(env)) {
 372             free(ckpDate);
 373             free(jTempChars);
 374             return NULL;
 375         }
 376 
 377         for (i = 0; (i < ckLength) && (i < 2) ; i++) {
 378             ckpDate->month[i] = jCharToCKChar(jTempChars[i]);
 379         }
 380         free(jTempChars);
 381     }
 382 
 383     if (jDay == NULL) {
 384         ckpDate->day[0] = 0;
 385         ckpDate->day[1] = 0;
 386     } else {
 387         ckLength = (*env)->GetArrayLength(env, jDay);
 388         jTempChars = (jchar*) malloc((ckLength) * sizeof(jchar));
 389         if (jTempChars == NULL) {
 390             free(ckpDate);
 391             throwOutOfMemoryError(env, 0);
 392             return NULL;
 393         }
 394         (*env)->GetCharArrayRegion(env, jDay, 0, ckLength, jTempChars);
 395         if ((*env)->ExceptionCheck(env)) {
 396             free(ckpDate);
 397             free(jTempChars);
 398             return NULL;
 399         }
 400 
 401         for (i = 0; (i < ckLength) && (i < 2) ; i++) {
 402             ckpDate->day[i] = jCharToCKChar(jTempChars[i]);
 403         }
 404         free(jTempChars);
 405     }
 406 
 407     return ckpDate ;
 408 }
 409 
 410 
 411 /*
 412  * converts a Java CK_ATTRIBUTE object into a CK_ATTRIBUTE structure
 413  *
 414  * @param env - used to call JNI funktions to get the values out of the Java object
 415  * @param jAttribute - the Java CK_ATTRIBUTE object to convert
 416  * @return - the new CK_ATTRIBUTE structure
 417  */
 418 CK_ATTRIBUTE jAttributeToCKAttribute(JNIEnv *env, jobject jAttribute)
 419 {
 420     CK_ATTRIBUTE ckAttribute;
 421     jclass jAttributeClass;
 422     jfieldID jFieldID;
 423     jlong jType;
 424     jobject jPValue;
 425     memset(&ckAttribute, 0, sizeof(CK_ATTRIBUTE));
 426 
 427     // TBD: what if jAttribute == NULL?!
 428 
 429     TRACE0("\nDEBUG: jAttributeToCKAttribute");
 430     /* get CK_ATTRIBUTE class */
 431     TRACE0(", getting attribute object class");
 432     jAttributeClass = (*env)->GetObjectClass(env, jAttribute);
 433     if (jAttributeClass == NULL) { return ckAttribute; }
 434 
 435     /* get type */
 436     TRACE0(", getting type field");
 437     jFieldID = (*env)->GetFieldID(env, jAttributeClass, "type", "J");
 438     if (jFieldID == NULL) { return ckAttribute; }
 439     jType = (*env)->GetLongField(env, jAttribute, jFieldID);
 440     TRACE1(", type=0x%X", jType);
 441 
 442     /* get pValue */
 443     TRACE0(", getting pValue field");
 444     jFieldID = (*env)->GetFieldID(env, jAttributeClass, "pValue", "Ljava/lang/Object;");
 445     if (jFieldID == NULL) { return ckAttribute; }
 446     jPValue = (*env)->GetObjectField(env, jAttribute, jFieldID);
 447     TRACE1(", pValue=%p", jPValue);
 448 
 449     ckAttribute.type = jLongToCKULong(jType);
 450     TRACE0(", converting pValue to primitive object");
 451 
 452     /* convert the Java pValue object to a CK-type pValue pointer */
 453     jObjectToPrimitiveCKObjectPtrPtr(env, jPValue, &(ckAttribute.pValue), &(ckAttribute.ulValueLen));
 454 
 455     TRACE0("\nFINISHED\n");
 456 
 457     return ckAttribute ;
 458 }
 459 
 460 /*
 461  * converts the Java CK_SSL3_MASTER_KEY_DERIVE_PARAMS object to a
 462  * CK_SSL3_MASTER_KEY_DERIVE_PARAMS structure
 463  *
 464  * @param env - used to call JNI funktions to get the Java classes and objects
 465  * @param jParam - the Java CK_SSL3_MASTER_KEY_DERIVE_PARAMS object to convert
 466  * @return - the new CK_SSL3_MASTER_KEY_DERIVE_PARAMS structure
 467  */
 468 CK_SSL3_MASTER_KEY_DERIVE_PARAMS jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(JNIEnv *env, jobject jParam)
 469 {
 470     // XXX don't return structs
 471     // XXX prefetch class and field ids
 472     jclass jSsl3MasterKeyDeriveParamsClass;
 473     CK_SSL3_MASTER_KEY_DERIVE_PARAMS ckParam;
 474     jfieldID fieldID;
 475     jclass jSsl3RandomDataClass;
 476     jobject jRandomInfo, jRIClientRandom, jRIServerRandom, jVersion;
 477     memset(&ckParam, 0, sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS));
 478 
 479     /* get RandomInfo */
 480     jSsl3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);
 481     if (jSsl3MasterKeyDeriveParamsClass == NULL) { return ckParam; }
 482     fieldID = (*env)->GetFieldID(env, jSsl3MasterKeyDeriveParamsClass, "RandomInfo", "Lsun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA;");
 483     if (fieldID == NULL) { return ckParam; }
 484     jRandomInfo = (*env)->GetObjectField(env, jParam, fieldID);
 485 
 486     /* get pClientRandom and ulClientRandomLength out of RandomInfo */
 487     jSsl3RandomDataClass = (*env)->FindClass(env, CLASS_SSL3_RANDOM_DATA);
 488     if (jSsl3RandomDataClass == NULL) { return ckParam; }
 489     fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pClientRandom", "[B");
 490     if (fieldID == NULL) { return ckParam; }
 491     jRIClientRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);
 492 
 493     /* get pServerRandom and ulServerRandomLength out of RandomInfo */
 494     fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pServerRandom", "[B");
 495     if (fieldID == NULL) { return ckParam; }
 496     jRIServerRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);
 497 
 498     /* get pVersion */
 499     fieldID = (*env)->GetFieldID(env, jSsl3MasterKeyDeriveParamsClass, "pVersion",  "Lsun/security/pkcs11/wrapper/CK_VERSION;");
 500     if (fieldID == NULL) { return ckParam; }
 501     jVersion = (*env)->GetObjectField(env, jParam, fieldID);
 502 
 503     /* populate java values */
 504     ckParam.pVersion = jVersionToCKVersionPtr(env, jVersion);
 505     if ((*env)->ExceptionCheck(env)) { return ckParam; }
 506     jByteArrayToCKByteArray(env, jRIClientRandom, &(ckParam.RandomInfo.pClientRandom), &(ckParam.RandomInfo.ulClientRandomLen));
 507     if ((*env)->ExceptionCheck(env)) {
 508         free(ckParam.pVersion);
 509         return ckParam;
 510     }
 511     jByteArrayToCKByteArray(env, jRIServerRandom, &(ckParam.RandomInfo.pServerRandom), &(ckParam.RandomInfo.ulServerRandomLen));
 512     if ((*env)->ExceptionCheck(env)) {
 513         free(ckParam.pVersion);
 514         free(ckParam.RandomInfo.pClientRandom);
 515         return ckParam;
 516     }
 517 
 518     return ckParam ;
 519 }
 520 
 521 
 522 /*
 523  * converts the Java CK_TLS_PRF_PARAMS object to a CK_TLS_PRF_PARAMS structure
 524  */
 525 CK_TLS_PRF_PARAMS jTlsPrfParamsToCKTlsPrfParam(JNIEnv *env, jobject jParam)
 526 {
 527     jclass jTlsPrfParamsClass;
 528     CK_TLS_PRF_PARAMS ckParam;
 529     jfieldID fieldID;
 530     jobject jSeed, jLabel, jOutput;
 531     memset(&ckParam, 0, sizeof(CK_TLS_PRF_PARAMS));
 532 
 533     // TBD: what if jParam == NULL?!
 534 
 535     /* get pSeed */
 536     jTlsPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS);
 537     if (jTlsPrfParamsClass == NULL) { return ckParam; }
 538     fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pSeed", "[B");
 539     if (fieldID == NULL) { return ckParam; }
 540     jSeed = (*env)->GetObjectField(env, jParam, fieldID);
 541 
 542     /* get pLabel */
 543     fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pLabel", "[B");
 544     if (fieldID == NULL) { return ckParam; }
 545     jLabel = (*env)->GetObjectField(env, jParam, fieldID);
 546 
 547     /* get pOutput */
 548     fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pOutput", "[B");
 549     if (fieldID == NULL) { return ckParam; }
 550     jOutput = (*env)->GetObjectField(env, jParam, fieldID);
 551 
 552     /* populate java values */
 553     jByteArrayToCKByteArray(env, jSeed, &(ckParam.pSeed), &(ckParam.ulSeedLen));
 554     if ((*env)->ExceptionCheck(env)) { return ckParam; }
 555     jByteArrayToCKByteArray(env, jLabel, &(ckParam.pLabel), &(ckParam.ulLabelLen));
 556     if ((*env)->ExceptionCheck(env)) {
 557         free(ckParam.pSeed);
 558         return ckParam;
 559     }
 560     ckParam.pulOutputLen = malloc(sizeof(CK_ULONG));
 561     if (ckParam.pulOutputLen == NULL) {
 562         free(ckParam.pSeed);
 563         free(ckParam.pLabel);
 564         throwOutOfMemoryError(env, 0);
 565         return ckParam;
 566     }
 567     jByteArrayToCKByteArray(env, jOutput, &(ckParam.pOutput), ckParam.pulOutputLen);
 568     if ((*env)->ExceptionCheck(env)) {
 569         free(ckParam.pSeed);
 570         free(ckParam.pLabel);
 571         free(ckParam.pulOutputLen);
 572         return ckParam;
 573     }
 574 
 575     return ckParam ;
 576 }
 577 
 578 /*
 579  * converts the Java CK_SSL3_KEY_MAT_PARAMS object to a CK_SSL3_KEY_MAT_PARAMS structure
 580  *
 581  * @param env - used to call JNI funktions to get the Java classes and objects
 582  * @param jParam - the Java CK_SSL3_KEY_MAT_PARAMS object to convert
 583  * @return - the new CK_SSL3_KEY_MAT_PARAMS structure
 584  */
 585 CK_SSL3_KEY_MAT_PARAMS jSsl3KeyMatParamToCKSsl3KeyMatParam(JNIEnv *env, jobject jParam)
 586 {
 587     // XXX don't return structs
 588     // XXX prefetch class and field ids
 589     jclass jSsl3KeyMatParamsClass, jSsl3RandomDataClass, jSsl3KeyMatOutClass;
 590     CK_SSL3_KEY_MAT_PARAMS ckParam;
 591     jfieldID fieldID;
 592     jlong jMacSizeInBits, jKeySizeInBits, jIVSizeInBits;
 593     jboolean jIsExport;
 594     jobject jRandomInfo, jRIClientRandom, jRIServerRandom;
 595     jobject jReturnedKeyMaterial, jRMIvClient, jRMIvServer;
 596     CK_ULONG ckTemp;
 597     memset(&ckParam, 0, sizeof(CK_SSL3_KEY_MAT_PARAMS));
 598 
 599     /* get ulMacSizeInBits */
 600     jSsl3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS);
 601     if (jSsl3KeyMatParamsClass == NULL) { return ckParam; }
 602     fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "ulMacSizeInBits", "J");
 603     if (fieldID == NULL) { return ckParam; }
 604     jMacSizeInBits = (*env)->GetLongField(env, jParam, fieldID);
 605 
 606     /* get ulKeySizeInBits */
 607     fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "ulKeySizeInBits", "J");
 608     if (fieldID == NULL) { return ckParam; }
 609     jKeySizeInBits = (*env)->GetLongField(env, jParam, fieldID);
 610 
 611     /* get ulIVSizeInBits */
 612     fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "ulIVSizeInBits", "J");
 613     if (fieldID == NULL) { return ckParam; }
 614     jIVSizeInBits = (*env)->GetLongField(env, jParam, fieldID);
 615 
 616     /* get bIsExport */
 617     fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "bIsExport", "Z");
 618     if (fieldID == NULL) { return ckParam; }
 619     jIsExport = (*env)->GetBooleanField(env, jParam, fieldID);
 620 
 621     /* get RandomInfo */
 622     jSsl3RandomDataClass = (*env)->FindClass(env, CLASS_SSL3_RANDOM_DATA);
 623     if (jSsl3RandomDataClass == NULL) { return ckParam; }
 624     fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "RandomInfo",  "Lsun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA;");
 625     if (fieldID == NULL) { return ckParam; }
 626     jRandomInfo = (*env)->GetObjectField(env, jParam, fieldID);
 627 
 628     /* get pClientRandom and ulClientRandomLength out of RandomInfo */
 629     fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pClientRandom", "[B");
 630     if (fieldID == NULL) { return ckParam; }
 631     jRIClientRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);
 632 
 633     /* get pServerRandom and ulServerRandomLength out of RandomInfo */
 634     fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pServerRandom", "[B");
 635     if (fieldID == NULL) { return ckParam; }
 636     jRIServerRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);
 637 
 638     /* get pReturnedKeyMaterial */
 639     jSsl3KeyMatOutClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_OUT);
 640     if (jSsl3KeyMatOutClass == NULL) { return ckParam; }
 641     fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "pReturnedKeyMaterial",  "Lsun/security/pkcs11/wrapper/CK_SSL3_KEY_MAT_OUT;");
 642     if (fieldID == NULL) { return ckParam; }
 643     jReturnedKeyMaterial = (*env)->GetObjectField(env, jParam, fieldID);
 644 
 645     /* get pIVClient out of pReturnedKeyMaterial */
 646     fieldID = (*env)->GetFieldID(env, jSsl3KeyMatOutClass, "pIVClient", "[B");
 647     if (fieldID == NULL) { return ckParam; }
 648     jRMIvClient = (*env)->GetObjectField(env, jReturnedKeyMaterial, fieldID);
 649 
 650     /* get pIVServer out of pReturnedKeyMaterial */
 651     fieldID = (*env)->GetFieldID(env, jSsl3KeyMatOutClass, "pIVServer", "[B");
 652     if (fieldID == NULL) { return ckParam; }
 653     jRMIvServer = (*env)->GetObjectField(env, jReturnedKeyMaterial, fieldID);
 654 
 655     /* populate java values */
 656     ckParam.ulMacSizeInBits = jLongToCKULong(jMacSizeInBits);
 657     ckParam.ulKeySizeInBits = jLongToCKULong(jKeySizeInBits);
 658     ckParam.ulIVSizeInBits = jLongToCKULong(jIVSizeInBits);
 659     ckParam.bIsExport = jBooleanToCKBBool(jIsExport);
 660     jByteArrayToCKByteArray(env, jRIClientRandom, &(ckParam.RandomInfo.pClientRandom), &(ckParam.RandomInfo.ulClientRandomLen));
 661     if ((*env)->ExceptionCheck(env)) { return ckParam; }
 662     jByteArrayToCKByteArray(env, jRIServerRandom, &(ckParam.RandomInfo.pServerRandom), &(ckParam.RandomInfo.ulServerRandomLen));
 663     if ((*env)->ExceptionCheck(env)) {
 664         free(ckParam.RandomInfo.pClientRandom);
 665         return ckParam;
 666     }
 667     /* allocate memory for pRetrunedKeyMaterial */
 668     ckParam.pReturnedKeyMaterial = (CK_SSL3_KEY_MAT_OUT_PTR) malloc(sizeof(CK_SSL3_KEY_MAT_OUT));
 669     if (ckParam.pReturnedKeyMaterial == NULL) {
 670         free(ckParam.RandomInfo.pClientRandom);
 671         free(ckParam.RandomInfo.pServerRandom);
 672         throwOutOfMemoryError(env, 0);
 673         return ckParam;
 674     }
 675 
 676     // the handles are output params only, no need to fetch them from Java
 677     ckParam.pReturnedKeyMaterial->hClientMacSecret = 0;
 678     ckParam.pReturnedKeyMaterial->hServerMacSecret = 0;
 679     ckParam.pReturnedKeyMaterial->hClientKey = 0;
 680     ckParam.pReturnedKeyMaterial->hServerKey = 0;
 681 
 682     jByteArrayToCKByteArray(env, jRMIvClient, &(ckParam.pReturnedKeyMaterial->pIVClient), &ckTemp);
 683     if ((*env)->ExceptionCheck(env)) {
 684         free(ckParam.RandomInfo.pClientRandom);
 685         free(ckParam.RandomInfo.pServerRandom);
 686         free(ckParam.pReturnedKeyMaterial);
 687         return ckParam;
 688     }
 689     jByteArrayToCKByteArray(env, jRMIvServer, &(ckParam.pReturnedKeyMaterial->pIVServer), &ckTemp);
 690     if ((*env)->ExceptionCheck(env)) {
 691         free(ckParam.RandomInfo.pClientRandom);
 692         free(ckParam.RandomInfo.pServerRandom);
 693         free(ckParam.pReturnedKeyMaterial->pIVClient);
 694         free(ckParam.pReturnedKeyMaterial);
 695         return ckParam;
 696     }
 697 
 698     return ckParam ;
 699 }
 700 
 701 /*
 702  * converts the Java CK_AES_CTR_PARAMS object to a CK_AES_CTR_PARAMS structure
 703  *
 704  * @param env - used to call JNI funktions to get the Java classes and objects
 705  * @param jParam - the Java CK_AES_CTR_PARAMS object to convert
 706  * @param ckpParam - pointer to the new CK_AES_CTR_PARAMS structure
 707  */
 708 void jAesCtrParamsToCKAesCtrParam(JNIEnv *env, jobject jParam,
 709                                   CK_AES_CTR_PARAMS_PTR ckpParam) {
 710     jclass jAesCtrParamsClass;
 711     jfieldID fieldID;
 712     jlong jCounterBits;
 713     jobject jCb;
 714     CK_BYTE_PTR ckBytes;
 715     CK_ULONG ckTemp;
 716 
 717     /* get ulCounterBits */
 718     jAesCtrParamsClass = (*env)->FindClass(env, CLASS_AES_CTR_PARAMS);
 719     if (jAesCtrParamsClass == NULL) { return; }
 720     fieldID = (*env)->GetFieldID(env, jAesCtrParamsClass, "ulCounterBits", "J");
 721     if (fieldID == NULL) { return; }
 722     jCounterBits = (*env)->GetLongField(env, jParam, fieldID);
 723 
 724     /* get cb */
 725     fieldID = (*env)->GetFieldID(env, jAesCtrParamsClass, "cb", "[B");
 726     if (fieldID == NULL) { return; }
 727     jCb = (*env)->GetObjectField(env, jParam, fieldID);
 728 
 729     /* populate java values */
 730     ckpParam->ulCounterBits = jLongToCKULong(jCounterBits);
 731     jByteArrayToCKByteArray(env, jCb, &ckBytes, &ckTemp);
 732     if ((*env)->ExceptionCheck(env)) { return; }
 733     if (ckTemp != 16) {
 734         TRACE1("ERROR: WRONG CTR IV LENGTH %d", ckTemp);
 735     } else {
 736         memcpy(ckpParam->cb, ckBytes, ckTemp);
 737         free(ckBytes);
 738     }
 739 }
 740 
 741 /*
 742  * converts a Java CK_MECHANISM object into a CK_MECHANISM structure
 743  *
 744  * @param env - used to call JNI funktions to get the values out of the Java object
 745  * @param jMechanism - the Java CK_MECHANISM object to convert
 746  * @return - the new CK_MECHANISM structure
 747  */
 748 void jMechanismToCKMechanism(JNIEnv *env, jobject jMechanism, CK_MECHANISM_PTR ckMechanismPtr)
 749 {
 750     jlong jMechanismType = (*env)->GetLongField(env, jMechanism, mech_mechanismID);
 751     jobject jParameter = (*env)->GetObjectField(env, jMechanism, mech_pParameterID);
 752 
 753     (*ckMechanismPtr).mechanism = jLongToCKULong(jMechanismType);
 754 
 755     /* convert the specific Java mechanism parameter object to a pointer to a CK-type mechanism
 756      * structure
 757      */
 758     if (jParameter == NULL) {
 759         (*ckMechanismPtr).pParameter = NULL;
 760         (*ckMechanismPtr).ulParameterLen = 0;
 761     } else {
 762         jMechanismParameterToCKMechanismParameter(env, jParameter, &(*ckMechanismPtr).pParameter, &(*ckMechanismPtr).ulParameterLen);
 763     }
 764 }
 765 
 766 /*
 767  * the following functions convert Attribute and Mechanism value pointers
 768  *
 769  * jobject ckAttributeValueToJObject(JNIEnv *env,
 770  *                                   const CK_ATTRIBUTE_PTR ckpAttribute);
 771  *
 772  * void jObjectToPrimitiveCKObjectPtrPtr(JNIEnv *env,
 773  *                                       jobject jObject,
 774  *                                       CK_VOID_PTR *ckpObjectPtr,
 775  *                                       CK_ULONG *pLength);
 776  *
 777  * void jMechanismParameterToCKMechanismParameter(JNIEnv *env,
 778  *                                                jobject jParam,
 779  *                                                CK_VOID_PTR *ckpParamPtr,
 780  *                                                CK_ULONG *ckpLength);
 781  *
 782  * These functions are used if a PKCS#11 mechanism or attribute structure gets
 783  * convertet to a Java attribute or mechanism object or vice versa.
 784  *
 785  * ckAttributeValueToJObject converts a PKCS#11 attribute value pointer to a Java
 786  * object depending on the type of the Attribute. A PKCS#11 attribute value can
 787  * be a CK_ULONG, CK_BYTE[], CK_CHAR[], big integer, CK_BBOOL, CK_UTF8CHAR[],
 788  * CK_DATE or CK_FLAGS that gets converted to a corresponding Java object.
 789  *
 790  * jObjectToPrimitiveCKObjectPtrPtr is used by jAttributeToCKAttributePtr for
 791  * converting the Java attribute value to a PKCS#11 attribute value pointer.
 792  * For now only primitive datatypes and arrays of primitive datatypes can get
 793  * converted. Otherwise this function throws a PKCS#11Exception with the
 794  * errorcode CKR_VENDOR_DEFINED.
 795  *
 796  * jMechanismParameterToCKMechanismParameter converts a Java mechanism parameter
 797  * to a PKCS#11 mechanism parameter. First this function determines what mechanism
 798  * parameter the Java object is, then it allocates the memory for the new PKCS#11
 799  * structure and calls the corresponding function to convert the Java object to
 800  * a PKCS#11 mechanism parameter structure.
 801  */
 802 
 803 /*
 804  * converts the pValue of a CK_ATTRIBUTE structure into a Java Object by checking the type
 805  * of the attribute.
 806  *
 807  * @param env - used to call JNI funktions to create the new Java object
 808  * @param ckpAttribute - the pointer to the CK_ATTRIBUTE structure that contains the type
 809  *                       and the pValue to convert
 810  * @return - the new Java object of the CK-type pValue
 811  */
 812 jobject ckAttributeValueToJObject(JNIEnv *env, const CK_ATTRIBUTE_PTR ckpAttribute)
 813 {
 814     jint jValueLength;
 815     jobject jValueObject = NULL;
 816 
 817     jValueLength = ckULongToJInt(ckpAttribute->ulValueLen);
 818 
 819     if ((jValueLength <= 0) || (ckpAttribute->pValue == NULL)) {
 820         return NULL ;
 821     }
 822 
 823     switch(ckpAttribute->type) {
 824         case CKA_CLASS:
 825             /* value CK_OBJECT_CLASS, defacto a CK_ULONG */
 826         case CKA_KEY_TYPE:
 827             /* value CK_KEY_TYPE, defacto a CK_ULONG */
 828         case CKA_CERTIFICATE_TYPE:
 829             /* value CK_CERTIFICATE_TYPE, defacto a CK_ULONG */
 830         case CKA_HW_FEATURE_TYPE:
 831             /* value CK_HW_FEATURE_TYPE, defacto a CK_ULONG */
 832         case CKA_MODULUS_BITS:
 833         case CKA_VALUE_BITS:
 834         case CKA_VALUE_LEN:
 835         case CKA_KEY_GEN_MECHANISM:
 836         case CKA_PRIME_BITS:
 837         case CKA_SUB_PRIME_BITS:
 838             /* value CK_ULONG */
 839             jValueObject = ckULongPtrToJLongObject(env, (CK_ULONG*) ckpAttribute->pValue);
 840             break;
 841 
 842             /* can be CK_BYTE[],CK_CHAR[] or big integer; defacto always CK_BYTE[] */
 843         case CKA_VALUE:
 844         case CKA_OBJECT_ID:
 845         case CKA_SUBJECT:
 846         case CKA_ID:
 847         case CKA_ISSUER:
 848         case CKA_SERIAL_NUMBER:
 849         case CKA_OWNER:
 850         case CKA_AC_ISSUER:
 851         case CKA_ATTR_TYPES:
 852         case CKA_ECDSA_PARAMS:
 853             /* CKA_EC_PARAMS is the same, these two are equivalent */
 854         case CKA_EC_POINT:
 855         case CKA_PRIVATE_EXPONENT:
 856         case CKA_PRIME_1:
 857         case CKA_PRIME_2:
 858         case CKA_EXPONENT_1:
 859         case CKA_EXPONENT_2:
 860         case CKA_COEFFICIENT:
 861             /* value CK_BYTE[] */
 862             jValueObject = ckByteArrayToJByteArray(env, (CK_BYTE*) ckpAttribute->pValue, jValueLength);
 863             break;
 864 
 865         case CKA_RESET_ON_INIT:
 866         case CKA_HAS_RESET:
 867         case CKA_TOKEN:
 868         case CKA_PRIVATE:
 869         case CKA_MODIFIABLE:
 870         case CKA_DERIVE:
 871         case CKA_LOCAL:
 872         case CKA_ENCRYPT:
 873         case CKA_VERIFY:
 874         case CKA_VERIFY_RECOVER:
 875         case CKA_WRAP:
 876         case CKA_SENSITIVE:
 877         case CKA_SECONDARY_AUTH:
 878         case CKA_DECRYPT:
 879         case CKA_SIGN:
 880         case CKA_SIGN_RECOVER:
 881         case CKA_UNWRAP:
 882         case CKA_EXTRACTABLE:
 883         case CKA_ALWAYS_SENSITIVE:
 884         case CKA_NEVER_EXTRACTABLE:
 885         case CKA_TRUSTED:
 886             /* value CK_BBOOL */
 887             jValueObject = ckBBoolPtrToJBooleanObject(env, (CK_BBOOL*) ckpAttribute->pValue);
 888             break;
 889 
 890         case CKA_LABEL:
 891         case CKA_APPLICATION:
 892             /* value RFC 2279 (UTF-8) string */
 893             jValueObject = ckUTF8CharArrayToJCharArray(env, (CK_UTF8CHAR*) ckpAttribute->pValue, jValueLength);
 894             break;
 895 
 896         case CKA_START_DATE:
 897         case CKA_END_DATE:
 898             /* value CK_DATE */
 899             jValueObject = ckDatePtrToJDateObject(env, (CK_DATE*) ckpAttribute->pValue);
 900             break;
 901 
 902         case CKA_MODULUS:
 903         case CKA_PUBLIC_EXPONENT:
 904         case CKA_PRIME:
 905         case CKA_SUBPRIME:
 906         case CKA_BASE:
 907             /* value big integer, i.e. CK_BYTE[] */
 908             jValueObject = ckByteArrayToJByteArray(env, (CK_BYTE*) ckpAttribute->pValue, jValueLength);
 909             break;
 910 
 911         case CKA_AUTH_PIN_FLAGS:
 912             jValueObject = ckULongPtrToJLongObject(env, (CK_ULONG*) ckpAttribute->pValue);
 913             /* value FLAGS, defacto a CK_ULONG */
 914             break;
 915 
 916         case CKA_VENDOR_DEFINED:
 917             /* we make a CK_BYTE[] out of this */
 918             jValueObject = ckByteArrayToJByteArray(env, (CK_BYTE*) ckpAttribute->pValue, jValueLength);
 919             break;
 920 
 921         // Netscape trust attributes
 922         case CKA_NETSCAPE_TRUST_SERVER_AUTH:
 923         case CKA_NETSCAPE_TRUST_CLIENT_AUTH:
 924         case CKA_NETSCAPE_TRUST_CODE_SIGNING:
 925         case CKA_NETSCAPE_TRUST_EMAIL_PROTECTION:
 926             /* value CK_ULONG */
 927             jValueObject = ckULongPtrToJLongObject(env, (CK_ULONG*) ckpAttribute->pValue);
 928             break;
 929 
 930         default:
 931             /* we make a CK_BYTE[] out of this */
 932             jValueObject = ckByteArrayToJByteArray(env, (CK_BYTE*) ckpAttribute->pValue, jValueLength);
 933             break;
 934     }
 935 
 936     return jValueObject ;
 937 }
 938 
 939 /*
 940  * the following functions convert a Java mechanism parameter object to a PKCS#11
 941  * mechanism parameter structure
 942  *
 943  * CK_<Param>_PARAMS j<Param>ParamToCK<Param>Param(JNIEnv *env,
 944  *                                                 jobject jParam);
 945  *
 946  * These functions get a Java object, that must be the right Java mechanism
 947  * object and they return the new PKCS#11 mechanism parameter structure.
 948  * Every field of the Java object is retrieved, gets converted to a corresponding
 949  * PKCS#11 type and is set in the new PKCS#11 structure.
 950  */
 951 
 952 /*
 953  * converts the given Java mechanism parameter to a CK mechanism parameter structure
 954  * and store the length in bytes in the length variable.
 955  * The memory of *ckpParamPtr has to be freed after use!
 956  *
 957  * @param env - used to call JNI funktions to get the Java classes and objects
 958  * @param jParam - the Java mechanism parameter object to convert
 959  * @param ckpParamPtr - the reference of the new pointer to the new CK mechanism parameter
 960  *                      structure
 961  * @param ckpLength - the reference of the length in bytes of the new CK mechanism parameter
 962  *                    structure
 963  */
 964 void jMechanismParameterToCKMechanismParameter(JNIEnv *env, jobject jParam, CK_VOID_PTR *ckpParamPtr, CK_ULONG *ckpLength)
 965 {
 966     if (jParam == NULL) {
 967         *ckpParamPtr = NULL;
 968         *ckpLength = 0;
 969     } else if ((*env)->IsInstanceOf(env, jParam, jByteArrayClass)) {
 970         jByteArrayToCKByteArray(env, jParam, (CK_BYTE_PTR *)ckpParamPtr, ckpLength);
 971     } else if ((*env)->IsInstanceOf(env, jParam, jLongClass)) {
 972         *ckpParamPtr = jLongObjectToCKULongPtr(env, jParam);
 973         *ckpLength = sizeof(CK_ULONG);
 974     } else {
 975         TRACE0("\nSLOW PATH jMechanismParameterToCKMechanismParameter\n");
 976         jMechanismParameterToCKMechanismParameterSlow(env, jParam, ckpParamPtr, ckpLength);
 977     }
 978 }
 979 
 980 void jMechanismParameterToCKMechanismParameterSlow(JNIEnv *env, jobject jParam, CK_VOID_PTR *ckpParamPtr, CK_ULONG *ckpLength)
 981 {
 982     /* get all Java mechanism parameter classes */
 983     jclass jVersionClass, jSsl3MasterKeyDeriveParamsClass, jSsl3KeyMatParamsClass;
 984     jclass jTlsPrfParamsClass, jAesCtrParamsClass, jRsaPkcsOaepParamsClass;
 985     jclass jPbeParamsClass, jPkcs5Pbkd2ParamsClass, jRsaPkcsPssParamsClass;
 986     jclass jEcdh1DeriveParamsClass, jEcdh2DeriveParamsClass;
 987     jclass jX942Dh1DeriveParamsClass, jX942Dh2DeriveParamsClass;
 988     TRACE0("\nDEBUG: jMechanismParameterToCKMechanismParameter");
 989 
 990     /* most common cases, i.e. NULL/byte[]/long, are already handled by
 991      * jMechanismParameterToCKMechanismParameter before calling this method.
 992      */
 993     jVersionClass = (*env)->FindClass(env, CLASS_VERSION);
 994     if (jVersionClass == NULL) { return; }
 995     if ((*env)->IsInstanceOf(env, jParam, jVersionClass)) {
 996         /*
 997          * CK_VERSION used by CKM_SSL3_PRE_MASTER_KEY_GEN
 998          */
 999         CK_VERSION_PTR ckpParam;
1000 
1001         /* convert jParameter to CKParameter */
1002         ckpParam = jVersionToCKVersionPtr(env, jParam);
1003 
1004         /* get length and pointer of parameter */
1005         *ckpLength = sizeof(CK_VERSION);
1006         *ckpParamPtr = ckpParam;
1007         return;
1008     }
1009 
1010     jSsl3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);
1011     if (jSsl3MasterKeyDeriveParamsClass == NULL) { return; }
1012     if ((*env)->IsInstanceOf(env, jParam, jSsl3MasterKeyDeriveParamsClass)) {
1013         /*
1014          * CK_SSL3_MASTER_KEY_DERIVE_PARAMS
1015          */
1016         CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR ckpParam;
1017 
1018         ckpParam = (CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR) malloc(sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS));
1019         if (ckpParam == NULL) {
1020             throwOutOfMemoryError(env, 0);
1021             return;
1022         }
1023 
1024         /* convert jParameter to CKParameter */
1025         *ckpParam = jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(env, jParam);
1026         if ((*env)->ExceptionCheck(env)) {
1027             free(ckpParam);
1028             return;
1029         }
1030 
1031         /* get length and pointer of parameter */
1032         *ckpLength = sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS);
1033         *ckpParamPtr = ckpParam;
1034         return;
1035     }
1036 
1037     jSsl3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS);
1038     if (jSsl3KeyMatParamsClass == NULL) { return; }
1039     if ((*env)->IsInstanceOf(env, jParam, jSsl3KeyMatParamsClass)) {
1040         /*
1041          * CK_SSL3_KEY_MAT_PARAMS
1042          */
1043         CK_SSL3_KEY_MAT_PARAMS_PTR ckpParam;
1044 
1045         ckpParam = (CK_SSL3_KEY_MAT_PARAMS_PTR) malloc(sizeof(CK_SSL3_KEY_MAT_PARAMS));
1046         if (ckpParam == NULL) {
1047             throwOutOfMemoryError(env, 0);
1048             return;
1049         }
1050 
1051         /* convert jParameter to CKParameter */
1052         *ckpParam = jSsl3KeyMatParamToCKSsl3KeyMatParam(env, jParam);
1053         if ((*env)->ExceptionCheck(env)) {
1054             free(ckpParam);
1055             return;
1056         }
1057 
1058         /* get length and pointer of parameter */
1059         *ckpLength = sizeof(CK_SSL3_KEY_MAT_PARAMS);
1060         *ckpParamPtr = ckpParam;
1061         return;
1062     }
1063 
1064     jTlsPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS);
1065     if (jTlsPrfParamsClass == NULL) { return; }
1066     if ((*env)->IsInstanceOf(env, jParam, jTlsPrfParamsClass)) {
1067         /*
1068          * CK_TLS_PRF_PARAMS
1069          */
1070         CK_TLS_PRF_PARAMS_PTR ckpParam;
1071 
1072         ckpParam = (CK_TLS_PRF_PARAMS_PTR) malloc(sizeof(CK_TLS_PRF_PARAMS));
1073         if (ckpParam == NULL) {
1074             throwOutOfMemoryError(env, 0);
1075             return;
1076         }
1077 
1078         /* convert jParameter to CKParameter */
1079         *ckpParam = jTlsPrfParamsToCKTlsPrfParam(env, jParam);
1080         if ((*env)->ExceptionCheck(env)) {
1081             free(ckpParam);
1082             return;
1083         }
1084 
1085         /* get length and pointer of parameter */
1086         *ckpLength = sizeof(CK_TLS_PRF_PARAMS);
1087         *ckpParamPtr = ckpParam;
1088         return;
1089     }
1090 
1091     jAesCtrParamsClass = (*env)->FindClass(env, CLASS_AES_CTR_PARAMS);
1092     if (jAesCtrParamsClass == NULL) { return; }
1093     if ((*env)->IsInstanceOf(env, jParam, jAesCtrParamsClass)) {
1094         /*
1095          * CK_AES_CTR_PARAMS
1096          */
1097         CK_AES_CTR_PARAMS_PTR ckpParam;
1098 
1099         ckpParam = (CK_AES_CTR_PARAMS_PTR) malloc(sizeof(CK_AES_CTR_PARAMS));
1100         if (ckpParam == NULL) {
1101             throwOutOfMemoryError(env, 0);
1102             return;
1103         }
1104 
1105         /* convert jParameter to CKParameter */
1106         jAesCtrParamsToCKAesCtrParam(env, jParam, ckpParam);
1107         if ((*env)->ExceptionCheck(env)) {
1108             free(ckpParam);
1109             return;
1110         }
1111 
1112         /* get length and pointer of parameter */
1113         *ckpLength = sizeof(CK_AES_CTR_PARAMS);
1114         *ckpParamPtr = ckpParam;
1115         return;
1116     }
1117 
1118     jRsaPkcsOaepParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_OAEP_PARAMS);
1119     if (jRsaPkcsOaepParamsClass == NULL) { return; }
1120     if ((*env)->IsInstanceOf(env, jParam, jRsaPkcsOaepParamsClass)) {
1121         /*
1122          * CK_RSA_PKCS_OAEP_PARAMS
1123          */
1124         CK_RSA_PKCS_OAEP_PARAMS_PTR ckpParam;
1125 
1126         ckpParam = (CK_RSA_PKCS_OAEP_PARAMS_PTR) malloc(sizeof(CK_RSA_PKCS_OAEP_PARAMS));
1127         if (ckpParam == NULL) {
1128             throwOutOfMemoryError(env, 0);
1129             return;
1130         }
1131 
1132         /* convert jParameter to CKParameter */
1133         *ckpParam = jRsaPkcsOaepParamToCKRsaPkcsOaepParam(env, jParam);
1134         if ((*env)->ExceptionCheck(env)) {
1135             free(ckpParam);
1136             return;
1137         }
1138 
1139         /* get length and pointer of parameter */
1140         *ckpLength = sizeof(CK_RSA_PKCS_OAEP_PARAMS);
1141         *ckpParamPtr = ckpParam;
1142         return;
1143     }
1144 
1145     jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);
1146     if (jPbeParamsClass == NULL) { return; }
1147     if ((*env)->IsInstanceOf(env, jParam, jPbeParamsClass)) {
1148         /*
1149          * CK_PBE_PARAMS
1150          */
1151         CK_PBE_PARAMS_PTR ckpParam;
1152 
1153         ckpParam = (CK_PBE_PARAMS_PTR) malloc(sizeof(CK_PBE_PARAMS));
1154         if (ckpParam == NULL) {
1155             throwOutOfMemoryError(env, 0);
1156             return;
1157         }
1158 
1159         /* convert jParameter to CKParameter */
1160         *ckpParam = jPbeParamToCKPbeParam(env, jParam);
1161         if ((*env)->ExceptionCheck(env)) {
1162             free(ckpParam);
1163             return;
1164         }
1165 
1166         /* get length and pointer of parameter */
1167         *ckpLength = sizeof(CK_PBE_PARAMS);
1168         *ckpParamPtr = ckpParam;
1169         return;
1170     }
1171 
1172     jPkcs5Pbkd2ParamsClass = (*env)->FindClass(env, CLASS_PKCS5_PBKD2_PARAMS);
1173     if (jPkcs5Pbkd2ParamsClass == NULL) { return; }
1174     if ((*env)->IsInstanceOf(env, jParam, jPkcs5Pbkd2ParamsClass)) {
1175         /*
1176          * CK_PKCS5_PBKD2_PARAMS
1177          */
1178         CK_PKCS5_PBKD2_PARAMS_PTR ckpParam;
1179 
1180         ckpParam = (CK_PKCS5_PBKD2_PARAMS_PTR) malloc(sizeof(CK_PKCS5_PBKD2_PARAMS));
1181         if (ckpParam == NULL) {
1182             throwOutOfMemoryError(env, 0);
1183             return;
1184         }
1185 
1186         /* convert jParameter to CKParameter */
1187         *ckpParam = jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(env, jParam);
1188         if ((*env)->ExceptionCheck(env)) {
1189             free(ckpParam);
1190             return;
1191         }
1192 
1193         /* get length and pointer of parameter */
1194         *ckpLength = sizeof(CK_PKCS5_PBKD2_PARAMS);
1195         *ckpParamPtr = ckpParam;
1196         return;
1197     }
1198 
1199     jRsaPkcsPssParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_PSS_PARAMS);
1200     if (jRsaPkcsPssParamsClass == NULL) { return; }
1201     if ((*env)->IsInstanceOf(env, jParam, jRsaPkcsPssParamsClass)) {
1202         /*
1203          * CK_RSA_PKCS_PSS_PARAMS
1204          */
1205         CK_RSA_PKCS_PSS_PARAMS_PTR ckpParam;
1206 
1207         ckpParam = (CK_RSA_PKCS_PSS_PARAMS_PTR) malloc(sizeof(CK_RSA_PKCS_PSS_PARAMS));
1208         if (ckpParam == NULL) {
1209             throwOutOfMemoryError(env, 0);
1210             return;
1211         }
1212 
1213         /* convert jParameter to CKParameter */
1214         *ckpParam = jRsaPkcsPssParamToCKRsaPkcsPssParam(env, jParam);
1215         if ((*env)->ExceptionCheck(env)) {
1216             free(ckpParam);
1217             return;
1218         }
1219 
1220         /* get length and pointer of parameter */
1221         *ckpLength = sizeof(CK_RSA_PKCS_PSS_PARAMS);
1222         *ckpParamPtr = ckpParam;
1223         return;
1224     }
1225 
1226     jEcdh1DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH1_DERIVE_PARAMS);
1227     if (jEcdh1DeriveParamsClass == NULL) { return; }
1228     if ((*env)->IsInstanceOf(env, jParam, jEcdh1DeriveParamsClass)) {
1229         /*
1230          * CK_ECDH1_DERIVE_PARAMS
1231          */
1232         CK_ECDH1_DERIVE_PARAMS_PTR ckpParam;
1233 
1234         ckpParam = (CK_ECDH1_DERIVE_PARAMS_PTR) malloc(sizeof(CK_ECDH1_DERIVE_PARAMS));
1235         if (ckpParam == NULL) {
1236             throwOutOfMemoryError(env, 0);
1237             return;
1238         }
1239 
1240         /* convert jParameter to CKParameter */
1241         *ckpParam = jEcdh1DeriveParamToCKEcdh1DeriveParam(env, jParam);
1242         if ((*env)->ExceptionCheck(env)) {
1243             free(ckpParam);
1244             return;
1245         }
1246 
1247         /* get length and pointer of parameter */
1248         *ckpLength = sizeof(CK_ECDH1_DERIVE_PARAMS);
1249         *ckpParamPtr = ckpParam;
1250         return;
1251     }
1252 
1253     jEcdh2DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH2_DERIVE_PARAMS);
1254     if (jEcdh2DeriveParamsClass == NULL) { return; }
1255     if ((*env)->IsInstanceOf(env, jParam, jEcdh2DeriveParamsClass)) {
1256         /*
1257          * CK_ECDH2_DERIVE_PARAMS
1258          */
1259         CK_ECDH2_DERIVE_PARAMS_PTR ckpParam;
1260 
1261         ckpParam = (CK_ECDH2_DERIVE_PARAMS_PTR) malloc(sizeof(CK_ECDH2_DERIVE_PARAMS));
1262         if (ckpParam == NULL) {
1263             throwOutOfMemoryError(env, 0);
1264             return;
1265         }
1266 
1267         /* convert jParameter to CKParameter */
1268         *ckpParam = jEcdh2DeriveParamToCKEcdh2DeriveParam(env, jParam);
1269         if ((*env)->ExceptionCheck(env)) {
1270             free(ckpParam);
1271             return;
1272         }
1273 
1274         /* get length and pointer of parameter */
1275         *ckpLength = sizeof(CK_ECDH2_DERIVE_PARAMS);
1276         *ckpParamPtr = ckpParam;
1277         return;
1278     }
1279 
1280     jX942Dh1DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH1_DERIVE_PARAMS);
1281     if (jX942Dh1DeriveParamsClass == NULL) { return; }
1282     if ((*env)->IsInstanceOf(env, jParam, jX942Dh1DeriveParamsClass)) {
1283         /*
1284          * CK_X9_42_DH1_DERIVE_PARAMS
1285          */
1286         CK_X9_42_DH1_DERIVE_PARAMS_PTR ckpParam;
1287 
1288         ckpParam = (CK_X9_42_DH1_DERIVE_PARAMS_PTR) malloc(sizeof(CK_X9_42_DH1_DERIVE_PARAMS));
1289         if (ckpParam == NULL) {
1290             throwOutOfMemoryError(env, 0);
1291             return;
1292         }
1293 
1294         /* convert jParameter to CKParameter */
1295         *ckpParam = jX942Dh1DeriveParamToCKX942Dh1DeriveParam(env, jParam);
1296         if ((*env)->ExceptionCheck(env)) {
1297             free(ckpParam);
1298             return;
1299         }
1300 
1301         /* get length and pointer of parameter */
1302         *ckpLength = sizeof(CK_X9_42_DH1_DERIVE_PARAMS);
1303         *ckpParamPtr = ckpParam;
1304         return;
1305     }
1306 
1307     jX942Dh2DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH2_DERIVE_PARAMS);
1308     if (jX942Dh2DeriveParamsClass == NULL) { return; }
1309     if ((*env)->IsInstanceOf(env, jParam, jX942Dh2DeriveParamsClass)) {
1310         /*
1311          * CK_X9_42_DH2_DERIVE_PARAMS
1312          */
1313         CK_X9_42_DH2_DERIVE_PARAMS_PTR ckpParam;
1314 
1315         ckpParam = (CK_X9_42_DH2_DERIVE_PARAMS_PTR) malloc(sizeof(CK_X9_42_DH2_DERIVE_PARAMS));
1316         if (ckpParam == NULL) {
1317             throwOutOfMemoryError(env, 0);
1318             return;
1319         }
1320 
1321         /* convert jParameter to CKParameter */
1322         *ckpParam = jX942Dh2DeriveParamToCKX942Dh2DeriveParam(env, jParam);
1323         if ((*env)->ExceptionCheck(env)) {
1324             free(ckpParam);
1325             return;
1326         }
1327 
1328         /* get length and pointer of parameter */
1329         *ckpLength = sizeof(CK_X9_42_DH2_DERIVE_PARAMS);
1330         *ckpParamPtr = ckpParam;
1331         return;
1332     }
1333 
1334     /* if everything faild up to here */
1335     /* try if the parameter is a primitive Java type */
1336     jObjectToPrimitiveCKObjectPtrPtr(env, jParam, ckpParamPtr, ckpLength);
1337     /* *ckpParamPtr = jObjectToCKVoidPtr(jParam); */
1338     /* *ckpLength = 1; */
1339 
1340     TRACE0("FINISHED\n");
1341 }
1342 
1343 
1344 /* the mechanism parameter convertion functions: */
1345 
1346 /*
1347  * converts the Java CK_RSA_PKCS_OAEP_PARAMS object to a CK_RSA_PKCS_OAEP_PARAMS structure
1348  *
1349  * @param env - used to call JNI funktions to get the Java classes and objects
1350  * @param jParam - the Java CK_RSA_PKCS_OAEP_PARAMS object to convert
1351  * @return - the new CK_RSA_PKCS_OAEP_PARAMS structure
1352  */
1353 CK_RSA_PKCS_OAEP_PARAMS jRsaPkcsOaepParamToCKRsaPkcsOaepParam(JNIEnv *env, jobject jParam)
1354 {
1355     jclass jRsaPkcsOaepParamsClass;
1356     CK_RSA_PKCS_OAEP_PARAMS ckParam;
1357     jfieldID fieldID;
1358     jlong jHashAlg, jMgf, jSource;
1359     jobject jSourceData;
1360     CK_BYTE_PTR ckpByte;
1361     memset(&ckParam, 0, sizeof(CK_RSA_PKCS_OAEP_PARAMS));
1362 
1363     /* get hashAlg */
1364     jRsaPkcsOaepParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_OAEP_PARAMS);
1365     if (jRsaPkcsOaepParamsClass == NULL) { return ckParam; }
1366     fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "hashAlg", "J");
1367     if (fieldID == NULL) { return ckParam; }
1368     jHashAlg = (*env)->GetLongField(env, jParam, fieldID);
1369 
1370     /* get mgf */
1371     fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "mgf", "J");
1372     if (fieldID == NULL) { return ckParam; }
1373     jMgf = (*env)->GetLongField(env, jParam, fieldID);
1374 
1375     /* get source */
1376     fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "source", "J");
1377     if (fieldID == NULL) { return ckParam; }
1378     jSource = (*env)->GetLongField(env, jParam, fieldID);
1379 
1380     /* get sourceData and sourceDataLength */
1381     fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "pSourceData", "[B");
1382     if (fieldID == NULL) { return ckParam; }
1383     jSourceData = (*env)->GetObjectField(env, jParam, fieldID);
1384 
1385     /* populate java values */
1386     ckParam.hashAlg = jLongToCKULong(jHashAlg);
1387     ckParam.mgf = jLongToCKULong(jMgf);
1388     ckParam.source = jLongToCKULong(jSource);
1389     jByteArrayToCKByteArray(env, jSourceData, & ckpByte, &(ckParam.ulSourceDataLen));
1390     if ((*env)->ExceptionCheck(env)) { return ckParam; }
1391     ckParam.pSourceData = (CK_VOID_PTR) ckpByte;
1392 
1393     return ckParam ;
1394 }
1395 
1396 /*
1397  * converts the Java CK_PBE_PARAMS object to a CK_PBE_PARAMS structure
1398  *
1399  * @param env - used to call JNI funktions to get the Java classes and objects
1400  * @param jParam - the Java CK_PBE_PARAMS object to convert
1401  * @return - the new CK_PBE_PARAMS structure
1402  */
1403 CK_PBE_PARAMS jPbeParamToCKPbeParam(JNIEnv *env, jobject jParam)
1404 {
1405     jclass jPbeParamsClass;
1406     CK_PBE_PARAMS ckParam;
1407     jfieldID fieldID;
1408     jlong jIteration;
1409     jobject jInitVector, jPassword, jSalt;
1410     CK_ULONG ckTemp;
1411     memset(&ckParam, 0, sizeof(CK_PBE_PARAMS));
1412 
1413     /* get pInitVector */
1414     jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);
1415     if (jPbeParamsClass == NULL) { return ckParam; }
1416     fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pInitVector", "[C");
1417     if (fieldID == NULL) { return ckParam; }
1418     jInitVector = (*env)->GetObjectField(env, jParam, fieldID);
1419 
1420     /* get pPassword and ulPasswordLength */
1421     fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pPassword", "[C");
1422     if (fieldID == NULL) { return ckParam; }
1423     jPassword = (*env)->GetObjectField(env, jParam, fieldID);
1424 
1425     /* get pSalt and ulSaltLength */
1426     fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pSalt", "[C");
1427     if (fieldID == NULL) { return ckParam; }
1428     jSalt = (*env)->GetObjectField(env, jParam, fieldID);
1429 
1430     /* get ulIteration */
1431     fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "ulIteration", "J");
1432     if (fieldID == NULL) { return ckParam; }
1433     jIteration = (*env)->GetLongField(env, jParam, fieldID);
1434 
1435     /* populate java values */
1436     ckParam.ulIteration = jLongToCKULong(jIteration);
1437     jCharArrayToCKCharArray(env, jInitVector, &(ckParam.pInitVector), &ckTemp);
1438     if ((*env)->ExceptionCheck(env)) { return ckParam; }
1439     jCharArrayToCKCharArray(env, jPassword, &(ckParam.pPassword), &(ckParam.ulPasswordLen));
1440     if ((*env)->ExceptionCheck(env)) {
1441         free(ckParam.pInitVector);
1442         return ckParam;
1443     }
1444     jCharArrayToCKCharArray(env, jSalt, &(ckParam.pSalt), &(ckParam.ulSaltLen));
1445     if ((*env)->ExceptionCheck(env)) {
1446         free(ckParam.pInitVector);
1447         free(ckParam.pPassword);
1448         return ckParam;
1449     }
1450 
1451     return ckParam ;
1452 }
1453 
1454 /*
1455  * Copy back the initialization vector from the native structure to the
1456  * Java object. This is only used for CKM_PBE_* mechanisms and their
1457  * CK_PBE_PARAMS parameters.
1458  *
1459  */
1460 void copyBackPBEInitializationVector(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism)
1461 {
1462     jclass jMechanismClass, jPbeParamsClass;
1463     CK_PBE_PARAMS *ckParam;
1464     jfieldID fieldID;
1465     CK_MECHANISM_TYPE ckMechanismType;
1466     jlong jMechanismType;
1467     jobject jParameter;
1468     jobject jInitVector;
1469     jint jInitVectorLength;
1470     CK_CHAR_PTR initVector;
1471     int i;
1472     jchar* jInitVectorChars;
1473 
1474     /* get mechanism */
1475     jMechanismClass = (*env)->FindClass(env, CLASS_MECHANISM);
1476     if (jMechanismClass == NULL) { return; }
1477     fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J");
1478     if (fieldID == NULL) { return; }
1479     jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID);
1480     ckMechanismType = jLongToCKULong(jMechanismType);
1481     if (ckMechanismType != ckMechanism->mechanism) {
1482         /* we do not have maching types, this should not occur */
1483         return;
1484     }
1485 
1486     jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);
1487     if (jPbeParamsClass == NULL) { return; }
1488     ckParam = (CK_PBE_PARAMS *) ckMechanism->pParameter;
1489     if (ckParam != NULL_PTR) {
1490         initVector = ckParam->pInitVector;
1491         if (initVector != NULL_PTR) {
1492             /* get pParameter */
1493             fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;");
1494             if (fieldID == NULL) { return; }
1495             jParameter = (*env)->GetObjectField(env, jMechanism, fieldID);
1496             fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pInitVektor", "[C");
1497             if (fieldID == NULL) { return; }
1498             jInitVector = (*env)->GetObjectField(env, jParameter, fieldID);
1499 
1500             if (jInitVector != NULL) {
1501                 jInitVectorLength = (*env)->GetArrayLength(env, jInitVector);
1502                 jInitVectorChars = (*env)->GetCharArrayElements(env, jInitVector, NULL);
1503                 if (jInitVectorChars == NULL) { return; }
1504 
1505                 /* copy the chars to the Java buffer */
1506                 for (i=0; i < jInitVectorLength; i++) {
1507                     jInitVectorChars[i] = ckCharToJChar(initVector[i]);
1508                 }
1509                 /* copy back the Java buffer to the object */
1510                 (*env)->ReleaseCharArrayElements(env, jInitVector, jInitVectorChars, 0);
1511             }
1512         }
1513     }
1514 }
1515 
1516 /*
1517  * converts the Java CK_PKCS5_PBKD2_PARAMS object to a CK_PKCS5_PBKD2_PARAMS structure
1518  *
1519  * @param env - used to call JNI funktions to get the Java classes and objects
1520  * @param jParam - the Java CK_PKCS5_PBKD2_PARAMS object to convert
1521  * @return - the new CK_PKCS5_PBKD2_PARAMS structure
1522  */
1523 CK_PKCS5_PBKD2_PARAMS jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(JNIEnv *env, jobject jParam)
1524 {
1525     jclass jPkcs5Pbkd2ParamsClass;
1526     CK_PKCS5_PBKD2_PARAMS ckParam;
1527     jfieldID fieldID;
1528     jlong jSaltSource, jIteration, jPrf;
1529     jobject jSaltSourceData, jPrfData;
1530     memset(&ckParam, 0, sizeof(CK_PKCS5_PBKD2_PARAMS));
1531 
1532     /* get saltSource */
1533     jPkcs5Pbkd2ParamsClass = (*env)->FindClass(env, CLASS_PKCS5_PBKD2_PARAMS);
1534     if (jPkcs5Pbkd2ParamsClass == NULL) { return ckParam; }
1535     fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "saltSource", "J");
1536     if (fieldID == NULL) { return ckParam; }
1537     jSaltSource = (*env)->GetLongField(env, jParam, fieldID);
1538 
1539     /* get pSaltSourceData */
1540     fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "pSaltSourceData", "[B");
1541     if (fieldID == NULL) { return ckParam; }
1542     jSaltSourceData = (*env)->GetObjectField(env, jParam, fieldID);
1543 
1544     /* get iterations */
1545     fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "iterations", "J");
1546     if (fieldID == NULL) { return ckParam; }
1547     jIteration = (*env)->GetLongField(env, jParam, fieldID);
1548 
1549     /* get prf */
1550     fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "prf", "J");
1551     if (fieldID == NULL) { return ckParam; }
1552     jPrf = (*env)->GetLongField(env, jParam, fieldID);
1553 
1554     /* get pPrfData and ulPrfDataLength in byte */
1555     fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "pPrfData", "[B");
1556     if (fieldID == NULL) { return ckParam; }
1557     jPrfData = (*env)->GetObjectField(env, jParam, fieldID);
1558 
1559     /* populate java values */
1560     ckParam.saltSource = jLongToCKULong(jSaltSource);
1561     jByteArrayToCKByteArray(env, jSaltSourceData, (CK_BYTE_PTR *) &(ckParam.pSaltSourceData), &(ckParam.ulSaltSourceDataLen));
1562     if ((*env)->ExceptionCheck(env)) { return ckParam; }
1563     ckParam.iterations = jLongToCKULong(jIteration);
1564     ckParam.prf = jLongToCKULong(jPrf);
1565     jByteArrayToCKByteArray(env, jPrfData, (CK_BYTE_PTR *) &(ckParam.pPrfData), &(ckParam.ulPrfDataLen));
1566     if ((*env)->ExceptionCheck(env)) {
1567         free(ckParam.pSaltSourceData);
1568         return ckParam;
1569     }
1570 
1571     return ckParam ;
1572 }
1573 
1574 /*
1575  * converts the Java CK_RSA_PKCS_PSS_PARAMS object to a CK_RSA_PKCS_PSS_PARAMS structure
1576  *
1577  * @param env - used to call JNI funktions to get the Java classes and objects
1578  * @param jParam - the Java CK_RSA_PKCS_PSS_PARAMS object to convert
1579  * @return - the new CK_RSA_PKCS_PSS_PARAMS structure
1580  */
1581 CK_RSA_PKCS_PSS_PARAMS jRsaPkcsPssParamToCKRsaPkcsPssParam(JNIEnv *env, jobject jParam)
1582 {
1583     jclass jRsaPkcsPssParamsClass;
1584     CK_RSA_PKCS_PSS_PARAMS ckParam;
1585     jfieldID fieldID;
1586     jlong jHashAlg, jMgf, jSLen;
1587     memset(&ckParam, 0, sizeof(CK_RSA_PKCS_PSS_PARAMS));
1588 
1589     /* get hashAlg */
1590     jRsaPkcsPssParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_PSS_PARAMS);
1591     if (jRsaPkcsPssParamsClass == NULL) { return ckParam; }
1592     fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "hashAlg", "J");
1593     if (fieldID == NULL) { return ckParam; }
1594     jHashAlg = (*env)->GetLongField(env, jParam, fieldID);
1595 
1596     /* get mgf */
1597     fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "mgf", "J");
1598     if (fieldID == NULL) { return ckParam; }
1599     jMgf = (*env)->GetLongField(env, jParam, fieldID);
1600 
1601     /* get sLen */
1602     fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "sLen", "J");
1603     if (fieldID == NULL) { return ckParam; }
1604     jSLen = (*env)->GetLongField(env, jParam, fieldID);
1605 
1606     /* populate java values */
1607     ckParam.hashAlg = jLongToCKULong(jHashAlg);
1608     ckParam.mgf = jLongToCKULong(jMgf);
1609     ckParam.sLen = jLongToCKULong(jSLen);
1610 
1611     return ckParam ;
1612 }
1613 
1614 /*
1615  * converts the Java CK_ECDH1_DERIVE_PARAMS object to a CK_ECDH1_DERIVE_PARAMS structure
1616  *
1617  * @param env - used to call JNI funktions to get the Java classes and objects
1618  * @param jParam - the Java CK_ECDH1_DERIVE_PARAMS object to convert
1619  * @return - the new CK_ECDH1_DERIVE_PARAMS structure
1620  */
1621 CK_ECDH1_DERIVE_PARAMS jEcdh1DeriveParamToCKEcdh1DeriveParam(JNIEnv *env, jobject jParam)
1622 {
1623     jclass jEcdh1DeriveParamsClass;
1624     CK_ECDH1_DERIVE_PARAMS ckParam;
1625     jfieldID fieldID;
1626     jlong jLong;
1627     jobject jSharedData, jPublicData;
1628     memset(&ckParam, 0, sizeof(CK_ECDH1_DERIVE_PARAMS));
1629 
1630     /* get kdf */
1631     jEcdh1DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH1_DERIVE_PARAMS);
1632     if (jEcdh1DeriveParamsClass == NULL) { return ckParam; }
1633     fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "kdf", "J");
1634     if (fieldID == NULL) { return ckParam; }
1635     jLong = (*env)->GetLongField(env, jParam, fieldID);
1636     ckParam.kdf = jLongToCKULong(jLong);
1637 
1638     /* get pSharedData and ulSharedDataLen */
1639     fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "pSharedData", "[B");
1640     if (fieldID == NULL) { return ckParam; }
1641     jSharedData = (*env)->GetObjectField(env, jParam, fieldID);
1642 
1643     /* get pPublicData and ulPublicDataLen */
1644     fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "pPublicData", "[B");
1645     if (fieldID == NULL) { return ckParam; }
1646     jPublicData = (*env)->GetObjectField(env, jParam, fieldID);
1647 
1648     /* populate java values */
1649     ckParam.kdf = jLongToCKULong(jLong);
1650     jByteArrayToCKByteArray(env, jSharedData, &(ckParam.pSharedData), &(ckParam.ulSharedDataLen));
1651     if ((*env)->ExceptionCheck(env)) { return ckParam; }
1652     jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
1653     if ((*env)->ExceptionCheck(env)) {
1654         free(ckParam.pSharedData);
1655         return ckParam;
1656     }
1657 
1658     return ckParam ;
1659 }
1660 
1661 /*
1662  * converts the Java CK_ECDH2_DERIVE_PARAMS object to a CK_ECDH2_DERIVE_PARAMS structure
1663  *
1664  * @param env - used to call JNI funktions to get the Java classes and objects
1665  * @param jParam - the Java CK_ECDH2_DERIVE_PARAMS object to convert
1666  * @return - the new CK_ECDH2_DERIVE_PARAMS structure
1667  */
1668 CK_ECDH2_DERIVE_PARAMS jEcdh2DeriveParamToCKEcdh2DeriveParam(JNIEnv *env, jobject jParam)
1669 {
1670     jclass jEcdh2DeriveParamsClass;
1671     CK_ECDH2_DERIVE_PARAMS ckParam;
1672     jfieldID fieldID;
1673     jlong jKdf, jPrivateDataLen, jPrivateData;
1674     jobject jSharedData, jPublicData, jPublicData2;
1675     memset(&ckParam, 0, sizeof(CK_ECDH2_DERIVE_PARAMS));
1676 
1677     /* get kdf */
1678     jEcdh2DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH2_DERIVE_PARAMS);
1679     if (jEcdh2DeriveParamsClass == NULL) { return ckParam; }
1680     fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "kdf", "J");
1681     if (fieldID == NULL) { return ckParam; }
1682     jKdf = (*env)->GetLongField(env, jParam, fieldID);
1683 
1684     /* get pSharedData and ulSharedDataLen */
1685     fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pSharedData", "[B");
1686     if (fieldID == NULL) { return ckParam; }
1687     jSharedData = (*env)->GetObjectField(env, jParam, fieldID);
1688 
1689     /* get pPublicData and ulPublicDataLen */
1690     fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pPublicData", "[B");
1691     if (fieldID == NULL) { return ckParam; }
1692     jPublicData = (*env)->GetObjectField(env, jParam, fieldID);
1693 
1694     /* get ulPrivateDataLen */
1695     fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "ulPrivateDataLen", "J");
1696     if (fieldID == NULL) { return ckParam; }
1697     jPrivateDataLen = (*env)->GetLongField(env, jParam, fieldID);
1698 
1699     /* get hPrivateData */
1700     fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "hPrivateData", "J");
1701     if (fieldID == NULL) { return ckParam; }
1702     jPrivateData = (*env)->GetLongField(env, jParam, fieldID);
1703 
1704     /* get pPublicData2 and ulPublicDataLen2 */
1705     fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pPublicData2", "[B");
1706     if (fieldID == NULL) { return ckParam; }
1707     jPublicData2 = (*env)->GetObjectField(env, jParam, fieldID);
1708 
1709     /* populate java values */
1710     ckParam.kdf = jLongToCKULong(jKdf);
1711     jByteArrayToCKByteArray(env, jSharedData, &(ckParam.pSharedData), &(ckParam.ulSharedDataLen));
1712     if ((*env)->ExceptionCheck(env)) { return ckParam; }
1713     jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
1714     if ((*env)->ExceptionCheck(env)) {
1715         free(ckParam.pSharedData);
1716         return ckParam;
1717     }
1718     ckParam.ulPrivateDataLen = jLongToCKULong(jPrivateDataLen);
1719     ckParam.hPrivateData = jLongToCKULong(jPrivateData);
1720     jByteArrayToCKByteArray(env, jPublicData2, &(ckParam.pPublicData2), &(ckParam.ulPublicDataLen2));
1721     if ((*env)->ExceptionCheck(env)) {
1722         free(ckParam.pSharedData);
1723         free(ckParam.pPublicData);
1724         return ckParam;
1725     }
1726     return ckParam ;
1727 }
1728 
1729 /*
1730  * converts the Java CK_X9_42_DH1_DERIVE_PARAMS object to a CK_X9_42_DH1_DERIVE_PARAMS structure
1731  *
1732  * @param env - used to call JNI funktions to get the Java classes and objects
1733  * @param jParam - the Java CK_X9_42_DH1_DERIVE_PARAMS object to convert
1734  * @return - the new CK_X9_42_DH1_DERIVE_PARAMS structure
1735  */
1736 CK_X9_42_DH1_DERIVE_PARAMS jX942Dh1DeriveParamToCKX942Dh1DeriveParam(JNIEnv *env, jobject jParam)
1737 {
1738     jclass jX942Dh1DeriveParamsClass;
1739     CK_X9_42_DH1_DERIVE_PARAMS ckParam;
1740     jfieldID fieldID;
1741     jlong jKdf;
1742     jobject jOtherInfo, jPublicData;
1743     memset(&ckParam, 0, sizeof(CK_X9_42_DH1_DERIVE_PARAMS));
1744 
1745     /* get kdf */
1746     jX942Dh1DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH1_DERIVE_PARAMS);
1747     if (jX942Dh1DeriveParamsClass == NULL) { return ckParam; }
1748     fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "kdf", "J");
1749     if (fieldID == NULL) { return ckParam; }
1750     jKdf = (*env)->GetLongField(env, jParam, fieldID);
1751 
1752     /* get pOtherInfo and ulOtherInfoLen */
1753     fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "pOtherInfo", "[B");
1754     if (fieldID == NULL) { return ckParam; }
1755     jOtherInfo = (*env)->GetObjectField(env, jParam, fieldID);
1756 
1757     /* get pPublicData and ulPublicDataLen */
1758     fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "pPublicData", "[B");
1759     if (fieldID == NULL) { return ckParam; }
1760     jPublicData = (*env)->GetObjectField(env, jParam, fieldID);
1761 
1762     /* populate java values */
1763     ckParam.kdf = jLongToCKULong(jKdf);
1764     jByteArrayToCKByteArray(env, jOtherInfo, &(ckParam.pOtherInfo), &(ckParam.ulOtherInfoLen));
1765     if ((*env)->ExceptionCheck(env)) { return ckParam; }
1766     jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
1767     if ((*env)->ExceptionCheck(env)) {
1768         free(ckParam.pOtherInfo);
1769         return ckParam;
1770     }
1771 
1772     return ckParam ;
1773 }
1774 
1775 /*
1776  * converts the Java CK_X9_42_DH2_DERIVE_PARAMS object to a CK_X9_42_DH2_DERIVE_PARAMS structure
1777  *
1778  * @param env - used to call JNI funktions to get the Java classes and objects
1779  * @param jParam - the Java CK_X9_42_DH2_DERIVE_PARAMS object to convert
1780  * @return - the new CK_X9_42_DH2_DERIVE_PARAMS structure
1781  */
1782 CK_X9_42_DH2_DERIVE_PARAMS jX942Dh2DeriveParamToCKX942Dh2DeriveParam(JNIEnv *env, jobject jParam)
1783 {
1784     jclass jX942Dh2DeriveParamsClass;
1785     CK_X9_42_DH2_DERIVE_PARAMS ckParam;
1786     jfieldID fieldID;
1787     jlong jKdf, jPrivateDataLen, jPrivateData;
1788     jobject jOtherInfo, jPublicData, jPublicData2;
1789     memset(&ckParam, 0, sizeof(CK_X9_42_DH2_DERIVE_PARAMS));
1790 
1791     /* get kdf */
1792     jX942Dh2DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH2_DERIVE_PARAMS);
1793     if (jX942Dh2DeriveParamsClass == NULL) { return ckParam; }
1794     fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "kdf", "J");
1795     if (fieldID == NULL) { return ckParam; }
1796     jKdf = (*env)->GetLongField(env, jParam, fieldID);
1797 
1798     /* get pOtherInfo and ulOtherInfoLen */
1799     fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pOtherInfo", "[B");
1800     if (fieldID == NULL) { return ckParam; }
1801     jOtherInfo = (*env)->GetObjectField(env, jParam, fieldID);
1802 
1803     /* get pPublicData and ulPublicDataLen */
1804     fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pPublicData", "[B");
1805     if (fieldID == NULL) { return ckParam; }
1806     jPublicData = (*env)->GetObjectField(env, jParam, fieldID);
1807 
1808     /* get ulPrivateDataLen */
1809     fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "ulPrivateDataLen", "J");
1810     if (fieldID == NULL) { return ckParam; }
1811     jPrivateDataLen = (*env)->GetLongField(env, jParam, fieldID);
1812 
1813     /* get hPrivateData */
1814     fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "hPrivateData", "J");
1815     if (fieldID == NULL) { return ckParam; }
1816     jPrivateData = (*env)->GetLongField(env, jParam, fieldID);
1817 
1818     /* get pPublicData2 and ulPublicDataLen2 */
1819     fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pPublicData2", "[B");
1820     if (fieldID == NULL) { return ckParam; }
1821     jPublicData2 = (*env)->GetObjectField(env, jParam, fieldID);
1822 
1823     /* populate java values */
1824     ckParam.kdf = jLongToCKULong(jKdf);
1825     jByteArrayToCKByteArray(env, jOtherInfo, &(ckParam.pOtherInfo), &(ckParam.ulOtherInfoLen));
1826     if ((*env)->ExceptionCheck(env)) { return ckParam; }
1827     jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
1828     if ((*env)->ExceptionCheck(env)) {
1829         free(ckParam.pOtherInfo);
1830         return ckParam;
1831     }
1832     ckParam.ulPrivateDataLen = jLongToCKULong(jPrivateDataLen);
1833     ckParam.hPrivateData = jLongToCKULong(jPrivateData);
1834     jByteArrayToCKByteArray(env, jPublicData2, &(ckParam.pPublicData2), &(ckParam.ulPublicDataLen2));
1835     if ((*env)->ExceptionCheck(env)) {
1836         free(ckParam.pOtherInfo);
1837         free(ckParam.pPublicData);
1838         return ckParam;
1839     }
1840 
1841     return ckParam ;
1842 }