0N/A/*
3645N/A * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
0N/A */
0N/A
0N/A/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
0N/A *
0N/A * Redistribution and use in source and binary forms, with or without
0N/A * modification, are permitted provided that the following conditions are met:
0N/A *
0N/A * 1. Redistributions of source code must retain the above copyright notice,
0N/A * this list of conditions and the following disclaimer.
0N/A *
0N/A * 2. Redistributions in binary form must reproduce the above copyright notice,
0N/A * this list of conditions and the following disclaimer in the documentation
0N/A * and/or other materials provided with the distribution.
0N/A *
0N/A * 3. The end-user documentation included with the redistribution, if any, must
0N/A * include the following acknowledgment:
0N/A *
0N/A * "This product includes software developed by IAIK of Graz University of
0N/A * Technology."
0N/A *
0N/A * Alternately, this acknowledgment may appear in the software itself, if
0N/A * and wherever such third-party acknowledgments normally appear.
0N/A *
0N/A * 4. The names "Graz University of Technology" and "IAIK of Graz University of
0N/A * Technology" must not be used to endorse or promote products derived from
0N/A * this software without prior written permission.
0N/A *
0N/A * 5. Products derived from this software may not be called
0N/A * "IAIK PKCS Wrapper", nor may "IAIK" appear in their name, without prior
0N/A * written permission of Graz University of Technology.
0N/A *
0N/A * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
0N/A * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
0N/A * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
0N/A * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE LICENSOR BE
0N/A * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
0N/A * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
0N/A * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
0N/A * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
0N/A * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
0N/A * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
0N/A * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0N/A * POSSIBILITY OF SUCH DAMAGE.
0N/A */
0N/A
0N/A/*
0N/A * pkcs11wrapper.c
0N/A * 18.05.2001
0N/A *
0N/A * This is the implementation of the native functions of the Java to PKCS#11 interface.
0N/A * All function use some helper functions to convert the JNI types to PKCS#11 types.
0N/A *
0N/A * @author Karl Scheibelhofer <Karl.Scheibelhofer@iaik.at>
0N/A * @author Martin Schlaeffer <schlaeff@sbox.tugraz.at>
0N/A */
0N/A
0N/A
0N/A#include "pkcs11wrapper.h"
0N/A
0N/A#include <stdio.h>
0N/A#include <stdlib.h>
0N/A#include <string.h>
0N/A#include <assert.h>
0N/A
0N/A#include "sun_security_pkcs11_wrapper_PKCS11.h"
0N/A
0N/A/* declare file private functions */
0N/A
0N/Avoid jMechanismParameterToCKMechanismParameterSlow(JNIEnv *env, jobject jParam, CK_VOID_PTR *ckpParamPtr, CK_ULONG *ckpLength);
0N/A
0N/A
0N/A/*
0N/A * converts a pointer to a CK_DATE structure into a Java CK_DATE Object.
0N/A *
0N/A * @param env - used to call JNI funktions to create the new Java object
0N/A * @param ckpValue - the pointer to the CK_DATE structure
0N/A * @return - the new Java CK_DATE object
0N/A */
0N/Ajobject ckDatePtrToJDateObject(JNIEnv *env, const CK_DATE *ckpDate)
0N/A{
0N/A jclass jDateClass;
0N/A jmethodID jCtrId;
0N/A jobject jDateObject;
0N/A jcharArray jYear;
0N/A jcharArray jMonth;
0N/A jcharArray jDay;
0N/A
0N/A /* load CK_DATE class */
0N/A jDateClass = (*env)->FindClass(env, CLASS_DATE);
936N/A if (jDateClass == NULL) { return NULL; }
0N/A
0N/A /* load CK_DATE constructor */
0N/A jCtrId = (*env)->GetMethodID(env, jDateClass, "<init>", "([C[C[C)V");
936N/A if (jCtrId == NULL) { return NULL; }
0N/A
0N/A /* prep all fields */
0N/A jYear = ckCharArrayToJCharArray(env, (CK_CHAR_PTR)(ckpDate->year), 4);
936N/A if (jYear == NULL) { return NULL; }
0N/A jMonth = ckCharArrayToJCharArray(env, (CK_CHAR_PTR)(ckpDate->month), 2);
936N/A if (jMonth == NULL) { return NULL; }
0N/A jDay = ckCharArrayToJCharArray(env, (CK_CHAR_PTR)(ckpDate->day), 2);
936N/A if (jDay == NULL) { return NULL; }
0N/A
0N/A /* create new CK_DATE object */
0N/A jDateObject =
0N/A (*env)->NewObject(env, jDateClass, jCtrId, jYear, jMonth, jDay);
936N/A if (jDateObject == NULL) { return NULL; }
0N/A
0N/A /* free local references */
0N/A (*env)->DeleteLocalRef(env, jDateClass);
0N/A (*env)->DeleteLocalRef(env, jYear);
0N/A (*env)->DeleteLocalRef(env, jMonth);
0N/A (*env)->DeleteLocalRef(env, jDay);
0N/A
0N/A return jDateObject ;
0N/A}
0N/A
0N/A/*
0N/A * converts a pointer to a CK_VERSION structure into a Java CK_VERSION Object.
0N/A *
0N/A * @param env - used to call JNI funktions to create the new Java object
0N/A * @param ckpVersion - the pointer to the CK_VERSION structure
0N/A * @return - the new Java CK_VERSION object
0N/A */
0N/Ajobject ckVersionPtrToJVersion(JNIEnv *env, const CK_VERSION_PTR ckpVersion)
0N/A{
0N/A jclass jVersionClass;
0N/A jmethodID jCtrId;
0N/A jobject jVersionObject;
0N/A jint jMajor;
0N/A jint jMinor;
0N/A
0N/A /* load CK_VERSION class */
0N/A jVersionClass = (*env)->FindClass(env, CLASS_VERSION);
936N/A if (jVersionClass == NULL) { return NULL; }
0N/A
0N/A /* load CK_VERSION constructor */
0N/A jCtrId = (*env)->GetMethodID(env, jVersionClass, "<init>", "(II)V");
936N/A if (jCtrId == NULL) { return NULL; }
0N/A
0N/A /* prep both fields */
0N/A jMajor = ckpVersion->major;
0N/A jMinor = ckpVersion->minor;
0N/A
0N/A /* create new CK_VERSION object */
0N/A jVersionObject =
0N/A (*env)->NewObject(env, jVersionClass, jCtrId, jMajor, jMinor);
936N/A if (jVersionObject == NULL) { return NULL; }
0N/A
0N/A /* free local references */
0N/A (*env)->DeleteLocalRef(env, jVersionClass);
0N/A
0N/A return jVersionObject ;
0N/A}
0N/A
0N/A/*
0N/A * converts a pointer to a CK_SESSION_INFO structure into a Java CK_SESSION_INFO Object.
0N/A *
0N/A * @param env - used to call JNI funktions to create the new Java object
0N/A * @param ckpSessionInfo - the pointer to the CK_SESSION_INFO structure
0N/A * @return - the new Java CK_SESSION_INFO object
0N/A */
0N/Ajobject ckSessionInfoPtrToJSessionInfo(JNIEnv *env, const CK_SESSION_INFO_PTR ckpSessionInfo)
0N/A{
0N/A jclass jSessionInfoClass;
0N/A jmethodID jCtrId;
0N/A jobject jSessionInfoObject;
0N/A jlong jSlotID;
0N/A jlong jState;
0N/A jlong jFlags;
0N/A jlong jDeviceError;
0N/A
0N/A /* load CK_SESSION_INFO class */
0N/A jSessionInfoClass = (*env)->FindClass(env, CLASS_SESSION_INFO);
936N/A if (jSessionInfoClass == NULL) { return NULL; }
0N/A
0N/A /* load CK_SESSION_INFO constructor */
0N/A jCtrId = (*env)->GetMethodID(env, jSessionInfoClass, "<init>", "(JJJJ)V");
936N/A if (jCtrId == NULL) { return NULL; }
0N/A
0N/A /* prep all fields */
0N/A jSlotID = ckULongToJLong(ckpSessionInfo->slotID);
0N/A jState = ckULongToJLong(ckpSessionInfo->state);
0N/A jFlags = ckULongToJLong(ckpSessionInfo->flags);
0N/A jDeviceError = ckULongToJLong(ckpSessionInfo->ulDeviceError);
0N/A
0N/A /* create new CK_SESSION_INFO object */
0N/A jSessionInfoObject =
0N/A (*env)->NewObject(env, jSessionInfoClass, jCtrId, jSlotID, jState,
0N/A jFlags, jDeviceError);
936N/A if (jSessionInfoObject == NULL) { return NULL; }
0N/A
0N/A /* free local references */
0N/A (*env)->DeleteLocalRef(env, jSessionInfoClass);
0N/A
0N/A return jSessionInfoObject ;
0N/A}
0N/A
0N/A/*
0N/A * converts a pointer to a CK_ATTRIBUTE structure into a Java CK_ATTRIBUTE Object.
0N/A *
0N/A * @param env - used to call JNI funktions to create the new Java object
0N/A * @param ckpAttribute - the pointer to the CK_ATTRIBUTE structure
0N/A * @return - the new Java CK_ATTRIBUTE object
0N/A */
0N/Ajobject ckAttributePtrToJAttribute(JNIEnv *env, const CK_ATTRIBUTE_PTR ckpAttribute)
0N/A{
0N/A jclass jAttributeClass;
0N/A jmethodID jCtrId;
0N/A jobject jAttributeObject;
0N/A jlong jType;
0N/A jobject jPValue = NULL;
0N/A
0N/A jAttributeClass = (*env)->FindClass(env, CLASS_ATTRIBUTE);
936N/A if (jAttributeClass == NULL) { return NULL; }
0N/A
0N/A /* load CK_INFO constructor */
0N/A jCtrId = (*env)->GetMethodID(env, jAttributeClass, "<init>", "(JLjava/lang/Object;)V");
936N/A if (jCtrId == NULL) { return NULL; }
0N/A
0N/A /* prep both fields */
0N/A jType = ckULongToJLong(ckpAttribute->type);
0N/A jPValue = ckAttributeValueToJObject(env, ckpAttribute);
936N/A if ((*env)->ExceptionCheck(env)) { return NULL; }
0N/A
0N/A /* create new CK_ATTRIBUTE object */
0N/A jAttributeObject =
0N/A (*env)->NewObject(env, jAttributeClass, jCtrId, jType, jPValue);
936N/A if (jAttributeObject == NULL) { return NULL; }
0N/A
0N/A /* free local references */
0N/A (*env)->DeleteLocalRef(env, jAttributeClass);
0N/A (*env)->DeleteLocalRef(env, jPValue);
0N/A
0N/A return jAttributeObject;
0N/A}
0N/A
0N/A
0N/A/*
0N/A * converts a Java CK_VERSION object into a pointer to a CK_VERSION structure
0N/A *
0N/A * @param env - used to call JNI funktions to get the values out of the Java object
0N/A * @param jVersion - the Java CK_VERSION object to convert
0N/A * @return - the pointer to the new CK_VERSION structure
0N/A */
0N/ACK_VERSION_PTR jVersionToCKVersionPtr(JNIEnv *env, jobject jVersion)
0N/A{
0N/A CK_VERSION_PTR ckpVersion;
0N/A jclass jVersionClass;
0N/A jfieldID jFieldID;
0N/A jbyte jMajor, jMinor;
0N/A
0N/A if (jVersion == NULL) {
0N/A return NULL;
0N/A }
0N/A
0N/A /* get CK_VERSION class */
0N/A jVersionClass = (*env)->GetObjectClass(env, jVersion);
936N/A if (jVersionClass == NULL) { return NULL; }
0N/A
0N/A /* get Major */
0N/A jFieldID = (*env)->GetFieldID(env, jVersionClass, "major", "B");
936N/A if (jFieldID == NULL) { return NULL; }
0N/A jMajor = (*env)->GetByteField(env, jVersion, jFieldID);
0N/A
0N/A /* get Minor */
0N/A jFieldID = (*env)->GetFieldID(env, jVersionClass, "minor", "B");
936N/A if (jFieldID == NULL) { return NULL; }
0N/A jMinor = (*env)->GetByteField(env, jVersion, jFieldID);
936N/A
936N/A /* allocate memory for CK_VERSION pointer */
936N/A ckpVersion = (CK_VERSION_PTR) malloc(sizeof(CK_VERSION));
936N/A if (ckpVersion == NULL) {
936N/A JNU_ThrowOutOfMemoryError(env, 0);
936N/A return NULL;
936N/A }
936N/A ckpVersion->major = jByteToCKByte(jMajor);
0N/A ckpVersion->minor = jByteToCKByte(jMinor);
0N/A
0N/A return ckpVersion ;
0N/A}
0N/A
0N/A
0N/A/*
0N/A * converts a Java CK_DATE object into a pointer to a CK_DATE structure
0N/A *
0N/A * @param env - used to call JNI funktions to get the values out of the Java object
0N/A * @param jVersion - the Java CK_DATE object to convert
0N/A * @return - the pointer to the new CK_DATE structure
0N/A */
0N/ACK_DATE * jDateObjectPtrToCKDatePtr(JNIEnv *env, jobject jDate)
0N/A{
0N/A CK_DATE * ckpDate;
0N/A CK_ULONG ckLength;
0N/A jclass jDateClass;
0N/A jfieldID jFieldID;
0N/A jobject jYear, jMonth, jDay;
0N/A jchar *jTempChars;
0N/A CK_ULONG i;
0N/A
936N/A if (jDate == NULL) {
936N/A return NULL;
936N/A }
0N/A
0N/A /* get CK_DATE class */
0N/A jDateClass = (*env)->FindClass(env, CLASS_DATE);
936N/A if (jDateClass == NULL) { return NULL; }
0N/A
0N/A /* get Year */
0N/A jFieldID = (*env)->GetFieldID(env, jDateClass, "year", "[C");
936N/A if (jFieldID == NULL) { return NULL; }
0N/A jYear = (*env)->GetObjectField(env, jDate, jFieldID);
0N/A
936N/A /* get Month */
936N/A jFieldID = (*env)->GetFieldID(env, jDateClass, "month", "[C");
936N/A if (jFieldID == NULL) { return NULL; }
936N/A jMonth = (*env)->GetObjectField(env, jDate, jFieldID);
936N/A
936N/A /* get Day */
936N/A jFieldID = (*env)->GetFieldID(env, jDateClass, "day", "[C");
936N/A if (jFieldID == NULL) { return NULL; }
936N/A jDay = (*env)->GetObjectField(env, jDate, jFieldID);
936N/A
936N/A /* allocate memory for CK_DATE pointer */
936N/A ckpDate = (CK_DATE *) malloc(sizeof(CK_DATE));
936N/A if (ckpDate == NULL) {
936N/A JNU_ThrowOutOfMemoryError(env, 0);
936N/A return NULL;
936N/A }
936N/A
0N/A if (jYear == NULL) {
0N/A ckpDate->year[0] = 0;
0N/A ckpDate->year[1] = 0;
0N/A ckpDate->year[2] = 0;
0N/A ckpDate->year[3] = 0;
0N/A } else {
0N/A ckLength = (*env)->GetArrayLength(env, jYear);
0N/A jTempChars = (jchar*) malloc((ckLength) * sizeof(jchar));
936N/A if (jTempChars == NULL) {
936N/A free(ckpDate);
936N/A JNU_ThrowOutOfMemoryError(env, 0);
936N/A return NULL;
936N/A }
0N/A (*env)->GetCharArrayRegion(env, jYear, 0, ckLength, jTempChars);
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckpDate);
936N/A free(jTempChars);
936N/A return NULL;
936N/A }
936N/A
0N/A for (i = 0; (i < ckLength) && (i < 4) ; i++) {
0N/A ckpDate->year[i] = jCharToCKChar(jTempChars[i]);
0N/A }
0N/A free(jTempChars);
0N/A }
0N/A
0N/A if (jMonth == NULL) {
0N/A ckpDate->month[0] = 0;
0N/A ckpDate->month[1] = 0;
0N/A } else {
0N/A ckLength = (*env)->GetArrayLength(env, jMonth);
0N/A jTempChars = (jchar*) malloc((ckLength) * sizeof(jchar));
936N/A if (jTempChars == NULL) {
936N/A free(ckpDate);
936N/A JNU_ThrowOutOfMemoryError(env, 0);
936N/A return NULL;
936N/A }
0N/A (*env)->GetCharArrayRegion(env, jMonth, 0, ckLength, jTempChars);
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckpDate);
936N/A free(jTempChars);
936N/A return NULL;
936N/A }
936N/A
0N/A for (i = 0; (i < ckLength) && (i < 4) ; i++) {
0N/A ckpDate->month[i] = jCharToCKChar(jTempChars[i]);
0N/A }
0N/A free(jTempChars);
0N/A }
0N/A
0N/A if (jDay == NULL) {
0N/A ckpDate->day[0] = 0;
0N/A ckpDate->day[1] = 0;
0N/A } else {
0N/A ckLength = (*env)->GetArrayLength(env, jDay);
0N/A jTempChars = (jchar*) malloc((ckLength) * sizeof(jchar));
936N/A if (jTempChars == NULL) {
936N/A free(ckpDate);
936N/A JNU_ThrowOutOfMemoryError(env, 0);
936N/A return NULL;
936N/A }
0N/A (*env)->GetCharArrayRegion(env, jDay, 0, ckLength, jTempChars);
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckpDate);
936N/A free(jTempChars);
936N/A return NULL;
936N/A }
936N/A
0N/A for (i = 0; (i < ckLength) && (i < 4) ; i++) {
0N/A ckpDate->day[i] = jCharToCKChar(jTempChars[i]);
0N/A }
0N/A free(jTempChars);
0N/A }
0N/A
0N/A return ckpDate ;
0N/A}
0N/A
0N/A
0N/A/*
0N/A * converts a Java CK_ATTRIBUTE object into a CK_ATTRIBUTE structure
0N/A *
0N/A * @param env - used to call JNI funktions to get the values out of the Java object
0N/A * @param jAttribute - the Java CK_ATTRIBUTE object to convert
0N/A * @return - the new CK_ATTRIBUTE structure
0N/A */
0N/ACK_ATTRIBUTE jAttributeToCKAttribute(JNIEnv *env, jobject jAttribute)
0N/A{
0N/A CK_ATTRIBUTE ckAttribute;
0N/A jclass jAttributeClass;
0N/A jfieldID jFieldID;
0N/A jlong jType;
0N/A jobject jPValue;
0N/A
936N/A // TBD: what if jAttribute == NULL?!
936N/A
0N/A TRACE0("\nDEBUG: jAttributeToCKAttribute");
0N/A /* get CK_ATTRIBUTE class */
0N/A TRACE0(", getting attribute object class");
0N/A jAttributeClass = (*env)->GetObjectClass(env, jAttribute);
936N/A if (jAttributeClass == NULL) { return ckAttribute; }
0N/A
0N/A /* get type */
0N/A TRACE0(", getting type field");
0N/A jFieldID = (*env)->GetFieldID(env, jAttributeClass, "type", "J");
936N/A if (jFieldID == NULL) { return ckAttribute; }
0N/A jType = (*env)->GetLongField(env, jAttribute, jFieldID);
0N/A TRACE1(", type=0x%X", jType);
0N/A
0N/A /* get pValue */
0N/A TRACE0(", getting pValue field");
0N/A jFieldID = (*env)->GetFieldID(env, jAttributeClass, "pValue", "Ljava/lang/Object;");
936N/A if (jFieldID == NULL) { return ckAttribute; }
0N/A jPValue = (*env)->GetObjectField(env, jAttribute, jFieldID);
0N/A TRACE1(", pValue=%p", jPValue);
0N/A
0N/A ckAttribute.type = jLongToCKULong(jType);
0N/A TRACE0(", converting pValue to primitive object");
0N/A
0N/A /* convert the Java pValue object to a CK-type pValue pointer */
0N/A jObjectToPrimitiveCKObjectPtrPtr(env, jPValue, &(ckAttribute.pValue), &(ckAttribute.ulValueLen));
0N/A
0N/A TRACE0("\nFINISHED\n");
0N/A
0N/A return ckAttribute ;
0N/A}
0N/A
0N/A/*
0N/A * converts the Java CK_SSL3_MASTER_KEY_DERIVE_PARAMS object to a
0N/A * CK_SSL3_MASTER_KEY_DERIVE_PARAMS structure
0N/A *
0N/A * @param env - used to call JNI funktions to get the Java classes and objects
0N/A * @param jParam - the Java CK_SSL3_MASTER_KEY_DERIVE_PARAMS object to convert
0N/A * @return - the new CK_SSL3_MASTER_KEY_DERIVE_PARAMS structure
0N/A */
0N/ACK_SSL3_MASTER_KEY_DERIVE_PARAMS jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(JNIEnv *env, jobject jParam)
0N/A{
0N/A // XXX don't return structs
0N/A // XXX prefetch class and field ids
936N/A jclass jSsl3MasterKeyDeriveParamsClass;
0N/A CK_SSL3_MASTER_KEY_DERIVE_PARAMS ckParam;
0N/A jfieldID fieldID;
0N/A jclass jSsl3RandomDataClass;
936N/A jobject jRandomInfo, jRIClientRandom, jRIServerRandom, jVersion;
0N/A
0N/A /* get RandomInfo */
936N/A jSsl3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);
936N/A if (jSsl3MasterKeyDeriveParamsClass == NULL) { return ckParam; }
0N/A fieldID = (*env)->GetFieldID(env, jSsl3MasterKeyDeriveParamsClass, "RandomInfo", "Lsun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA;");
936N/A if (fieldID == NULL) { return ckParam; }
0N/A jRandomInfo = (*env)->GetObjectField(env, jParam, fieldID);
0N/A
0N/A /* get pClientRandom and ulClientRandomLength out of RandomInfo */
936N/A jSsl3RandomDataClass = (*env)->FindClass(env, CLASS_SSL3_RANDOM_DATA);
936N/A if (jSsl3RandomDataClass == NULL) { return ckParam; }
0N/A fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pClientRandom", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jRIClientRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);
0N/A
0N/A /* get pServerRandom and ulServerRandomLength out of RandomInfo */
0N/A fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pServerRandom", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jRIServerRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);
0N/A
0N/A /* get pVersion */
0N/A fieldID = (*env)->GetFieldID(env, jSsl3MasterKeyDeriveParamsClass, "pVersion", "Lsun/security/pkcs11/wrapper/CK_VERSION;");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jVersion = (*env)->GetObjectField(env, jParam, fieldID);
936N/A
936N/A /* populate java values */
936N/A ckParam.pVersion = jVersionToCKVersionPtr(env, jVersion);
936N/A if ((*env)->ExceptionCheck(env)) { return ckParam; }
936N/A jByteArrayToCKByteArray(env, jRIClientRandom, &(ckParam.RandomInfo.pClientRandom), &(ckParam.RandomInfo.ulClientRandomLen));
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckParam.pVersion);
936N/A return ckParam;
936N/A }
936N/A jByteArrayToCKByteArray(env, jRIServerRandom, &(ckParam.RandomInfo.pServerRandom), &(ckParam.RandomInfo.ulServerRandomLen));
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckParam.pVersion);
936N/A free(ckParam.RandomInfo.pClientRandom);
936N/A return ckParam;
936N/A }
0N/A
0N/A return ckParam ;
0N/A}
0N/A
0N/A
0N/A/*
0N/A * converts the Java CK_TLS_PRF_PARAMS object to a CK_TLS_PRF_PARAMS structure
0N/A */
0N/ACK_TLS_PRF_PARAMS jTlsPrfParamsToCKTlsPrfParam(JNIEnv *env, jobject jParam)
0N/A{
936N/A jclass jTlsPrfParamsClass;
0N/A CK_TLS_PRF_PARAMS ckParam;
0N/A jfieldID fieldID;
936N/A jobject jSeed, jLabel, jOutput;
936N/A
936N/A // TBD: what if jParam == NULL?!
0N/A
936N/A /* get pSeed */
936N/A jTlsPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS);
936N/A if (jTlsPrfParamsClass == NULL) { return ckParam; }
0N/A fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pSeed", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jSeed = (*env)->GetObjectField(env, jParam, fieldID);
0N/A
936N/A /* get pLabel */
0N/A fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pLabel", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jLabel = (*env)->GetObjectField(env, jParam, fieldID);
936N/A
936N/A /* get pOutput */
936N/A fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pOutput", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jOutput = (*env)->GetObjectField(env, jParam, fieldID);
0N/A
936N/A /* populate java values */
936N/A jByteArrayToCKByteArray(env, jSeed, &(ckParam.pSeed), &(ckParam.ulSeedLen));
936N/A if ((*env)->ExceptionCheck(env)) { return ckParam; }
936N/A jByteArrayToCKByteArray(env, jLabel, &(ckParam.pLabel), &(ckParam.ulLabelLen));
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckParam.pSeed);
936N/A return ckParam;
936N/A }
0N/A ckParam.pulOutputLen = malloc(sizeof(CK_ULONG));
936N/A if (ckParam.pulOutputLen == NULL) {
936N/A free(ckParam.pSeed);
936N/A free(ckParam.pLabel);
936N/A JNU_ThrowOutOfMemoryError(env, 0);
936N/A return ckParam;
936N/A }
936N/A jByteArrayToCKByteArray(env, jOutput, &(ckParam.pOutput), ckParam.pulOutputLen);
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckParam.pSeed);
936N/A free(ckParam.pLabel);
936N/A free(ckParam.pulOutputLen);
936N/A return ckParam;
936N/A }
0N/A
0N/A return ckParam ;
0N/A}
0N/A
0N/A/*
0N/A * converts the Java CK_SSL3_KEY_MAT_PARAMS object to a CK_SSL3_KEY_MAT_PARAMS structure
0N/A *
0N/A * @param env - used to call JNI funktions to get the Java classes and objects
0N/A * @param jParam - the Java CK_SSL3_KEY_MAT_PARAMS object to convert
0N/A * @return - the new CK_SSL3_KEY_MAT_PARAMS structure
0N/A */
0N/ACK_SSL3_KEY_MAT_PARAMS jSsl3KeyMatParamToCKSsl3KeyMatParam(JNIEnv *env, jobject jParam)
0N/A{
0N/A // XXX don't return structs
0N/A // XXX prefetch class and field ids
936N/A jclass jSsl3KeyMatParamsClass, jSsl3RandomDataClass, jSsl3KeyMatOutClass;
0N/A CK_SSL3_KEY_MAT_PARAMS ckParam;
0N/A jfieldID fieldID;
936N/A jlong jMacSizeInBits, jKeySizeInBits, jIVSizeInBits;
936N/A jboolean jIsExport;
936N/A jobject jRandomInfo, jRIClientRandom, jRIServerRandom;
936N/A jobject jReturnedKeyMaterial, jRMIvClient, jRMIvServer;
0N/A CK_ULONG ckTemp;
0N/A
0N/A /* get ulMacSizeInBits */
936N/A jSsl3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS);
936N/A if (jSsl3KeyMatParamsClass == NULL) { return ckParam; }
0N/A fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "ulMacSizeInBits", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jMacSizeInBits = (*env)->GetLongField(env, jParam, fieldID);
0N/A
0N/A /* get ulKeySizeInBits */
0N/A fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "ulKeySizeInBits", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jKeySizeInBits = (*env)->GetLongField(env, jParam, fieldID);
0N/A
0N/A /* get ulIVSizeInBits */
0N/A fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "ulIVSizeInBits", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jIVSizeInBits = (*env)->GetLongField(env, jParam, fieldID);
0N/A
0N/A /* get bIsExport */
0N/A fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "bIsExport", "Z");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jIsExport = (*env)->GetBooleanField(env, jParam, fieldID);
0N/A
0N/A /* get RandomInfo */
0N/A jSsl3RandomDataClass = (*env)->FindClass(env, CLASS_SSL3_RANDOM_DATA);
936N/A if (jSsl3RandomDataClass == NULL) { return ckParam; }
0N/A fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "RandomInfo", "Lsun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA;");
936N/A if (fieldID == NULL) { return ckParam; }
0N/A jRandomInfo = (*env)->GetObjectField(env, jParam, fieldID);
0N/A
0N/A /* get pClientRandom and ulClientRandomLength out of RandomInfo */
0N/A fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pClientRandom", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jRIClientRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);
0N/A
0N/A /* get pServerRandom and ulServerRandomLength out of RandomInfo */
0N/A fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pServerRandom", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jRIServerRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);
0N/A
0N/A /* get pReturnedKeyMaterial */
0N/A jSsl3KeyMatOutClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_OUT);
936N/A if (jSsl3KeyMatOutClass == NULL) { return ckParam; }
0N/A fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "pReturnedKeyMaterial", "Lsun/security/pkcs11/wrapper/CK_SSL3_KEY_MAT_OUT;");
936N/A if (fieldID == NULL) { return ckParam; }
0N/A jReturnedKeyMaterial = (*env)->GetObjectField(env, jParam, fieldID);
0N/A
936N/A /* get pIVClient out of pReturnedKeyMaterial */
936N/A fieldID = (*env)->GetFieldID(env, jSsl3KeyMatOutClass, "pIVClient", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jRMIvClient = (*env)->GetObjectField(env, jReturnedKeyMaterial, fieldID);
936N/A
936N/A /* get pIVServer out of pReturnedKeyMaterial */
936N/A fieldID = (*env)->GetFieldID(env, jSsl3KeyMatOutClass, "pIVServer", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jRMIvServer = (*env)->GetObjectField(env, jReturnedKeyMaterial, fieldID);
936N/A
936N/A /* populate java values */
936N/A ckParam.ulMacSizeInBits = jLongToCKULong(jMacSizeInBits);
936N/A ckParam.ulKeySizeInBits = jLongToCKULong(jKeySizeInBits);
936N/A ckParam.ulIVSizeInBits = jLongToCKULong(jIVSizeInBits);
936N/A ckParam.bIsExport = jBooleanToCKBBool(jIsExport);
936N/A jByteArrayToCKByteArray(env, jRIClientRandom, &(ckParam.RandomInfo.pClientRandom), &(ckParam.RandomInfo.ulClientRandomLen));
936N/A if ((*env)->ExceptionCheck(env)) { return ckParam; }
936N/A jByteArrayToCKByteArray(env, jRIServerRandom, &(ckParam.RandomInfo.pServerRandom), &(ckParam.RandomInfo.ulServerRandomLen));
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckParam.RandomInfo.pClientRandom);
936N/A return ckParam;
936N/A }
0N/A /* allocate memory for pRetrunedKeyMaterial */
0N/A ckParam.pReturnedKeyMaterial = (CK_SSL3_KEY_MAT_OUT_PTR) malloc(sizeof(CK_SSL3_KEY_MAT_OUT));
936N/A if (ckParam.pReturnedKeyMaterial == NULL) {
936N/A free(ckParam.RandomInfo.pClientRandom);
936N/A free(ckParam.RandomInfo.pServerRandom);
936N/A JNU_ThrowOutOfMemoryError(env, 0);
936N/A return ckParam;
936N/A }
0N/A
0N/A // the handles are output params only, no need to fetch them from Java
0N/A ckParam.pReturnedKeyMaterial->hClientMacSecret = 0;
0N/A ckParam.pReturnedKeyMaterial->hServerMacSecret = 0;
0N/A ckParam.pReturnedKeyMaterial->hClientKey = 0;
0N/A ckParam.pReturnedKeyMaterial->hServerKey = 0;
0N/A
936N/A jByteArrayToCKByteArray(env, jRMIvClient, &(ckParam.pReturnedKeyMaterial->pIVClient), &ckTemp);
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckParam.RandomInfo.pClientRandom);
936N/A free(ckParam.RandomInfo.pServerRandom);
936N/A free(ckParam.pReturnedKeyMaterial);
936N/A return ckParam;
936N/A }
936N/A jByteArrayToCKByteArray(env, jRMIvServer, &(ckParam.pReturnedKeyMaterial->pIVServer), &ckTemp);
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckParam.RandomInfo.pClientRandom);
936N/A free(ckParam.RandomInfo.pServerRandom);
936N/A free(ckParam.pReturnedKeyMaterial);
936N/A free(ckParam.pReturnedKeyMaterial->pIVClient);
936N/A return ckParam;
936N/A }
0N/A
0N/A return ckParam ;
0N/A}
0N/A
0N/A/*
3645N/A * converts the Java CK_AES_CTR_PARAMS object to a CK_AES_CTR_PARAMS structure
3645N/A *
3645N/A * @param env - used to call JNI funktions to get the Java classes and objects
3645N/A * @param jParam - the Java CK_AES_CTR_PARAMS object to convert
3645N/A * @param ckpParam - pointer to the new CK_AES_CTR_PARAMS structure
3645N/A */
3645N/Avoid jAesCtrParamsToCKAesCtrParam(JNIEnv *env, jobject jParam,
3645N/A CK_AES_CTR_PARAMS_PTR ckpParam) {
3645N/A jclass jAesCtrParamsClass;
3645N/A jfieldID fieldID;
3645N/A jlong jCounterBits;
3645N/A jobject jCb;
3645N/A CK_BYTE_PTR ckBytes;
3645N/A CK_ULONG ckTemp;
3645N/A
3645N/A /* get ulCounterBits */
3645N/A jAesCtrParamsClass = (*env)->FindClass(env, CLASS_AES_CTR_PARAMS);
3645N/A if (jAesCtrParamsClass == NULL) { return; }
3645N/A fieldID = (*env)->GetFieldID(env, jAesCtrParamsClass, "ulCounterBits", "J");
3645N/A if (fieldID == NULL) { return; }
3645N/A jCounterBits = (*env)->GetLongField(env, jParam, fieldID);
3645N/A
3645N/A /* get cb */
3645N/A fieldID = (*env)->GetFieldID(env, jAesCtrParamsClass, "cb", "[B");
3645N/A if (fieldID == NULL) { return; }
3645N/A jCb = (*env)->GetObjectField(env, jParam, fieldID);
3645N/A
3645N/A /* populate java values */
3645N/A ckpParam->ulCounterBits = jLongToCKULong(jCounterBits);
3645N/A jByteArrayToCKByteArray(env, jCb, &ckBytes, &ckTemp);
3645N/A if ((*env)->ExceptionCheck(env)) { return; }
3645N/A if (ckTemp != 16) {
3645N/A TRACE1("ERROR: WRONG CTR IV LENGTH %d", ckTemp);
3645N/A } else {
3645N/A memcpy(ckpParam->cb, ckBytes, ckTemp);
3645N/A free(ckBytes);
3645N/A }
3645N/A}
3645N/A
3645N/A/*
0N/A * converts a Java CK_MECHANISM object into a CK_MECHANISM structure
0N/A *
0N/A * @param env - used to call JNI funktions to get the values out of the Java object
0N/A * @param jMechanism - the Java CK_MECHANISM object to convert
0N/A * @return - the new CK_MECHANISM structure
0N/A */
0N/Avoid jMechanismToCKMechanism(JNIEnv *env, jobject jMechanism, CK_MECHANISM_PTR ckMechanismPtr)
0N/A{
0N/A jlong jMechanismType = (*env)->GetLongField(env, jMechanism, mech_mechanismID);
0N/A jobject jParameter = (*env)->GetObjectField(env, jMechanism, mech_pParameterID);
0N/A
0N/A (*ckMechanismPtr).mechanism = jLongToCKULong(jMechanismType);
0N/A
0N/A /* convert the specific Java mechanism parameter object to a pointer to a CK-type mechanism
0N/A * structure
0N/A */
0N/A if (jParameter == NULL) {
0N/A (*ckMechanismPtr).pParameter = NULL;
0N/A (*ckMechanismPtr).ulParameterLen = 0;
0N/A } else {
0N/A jMechanismParameterToCKMechanismParameter(env, jParameter, &(*ckMechanismPtr).pParameter, &(*ckMechanismPtr).ulParameterLen);
0N/A }
0N/A}
0N/A
0N/A/*
0N/A * the following functions convert Attribute and Mechanism value pointers
0N/A *
0N/A * jobject ckAttributeValueToJObject(JNIEnv *env,
0N/A * const CK_ATTRIBUTE_PTR ckpAttribute);
0N/A *
0N/A * void jObjectToPrimitiveCKObjectPtrPtr(JNIEnv *env,
0N/A * jobject jObject,
0N/A * CK_VOID_PTR *ckpObjectPtr,
0N/A * CK_ULONG *pLength);
0N/A *
0N/A * void jMechanismParameterToCKMechanismParameter(JNIEnv *env,
0N/A * jobject jParam,
0N/A * CK_VOID_PTR *ckpParamPtr,
0N/A * CK_ULONG *ckpLength);
0N/A *
0N/A * These functions are used if a PKCS#11 mechanism or attribute structure gets
0N/A * convertet to a Java attribute or mechanism object or vice versa.
0N/A *
0N/A * ckAttributeValueToJObject converts a PKCS#11 attribute value pointer to a Java
0N/A * object depending on the type of the Attribute. A PKCS#11 attribute value can
0N/A * be a CK_ULONG, CK_BYTE[], CK_CHAR[], big integer, CK_BBOOL, CK_UTF8CHAR[],
0N/A * CK_DATE or CK_FLAGS that gets converted to a corresponding Java object.
0N/A *
0N/A * jObjectToPrimitiveCKObjectPtrPtr is used by jAttributeToCKAttributePtr for
0N/A * converting the Java attribute value to a PKCS#11 attribute value pointer.
0N/A * For now only primitive datatypes and arrays of primitive datatypes can get
0N/A * converted. Otherwise this function throws a PKCS#11Exception with the
0N/A * errorcode CKR_VENDOR_DEFINED.
0N/A *
0N/A * jMechanismParameterToCKMechanismParameter converts a Java mechanism parameter
0N/A * to a PKCS#11 mechanism parameter. First this function determines what mechanism
0N/A * parameter the Java object is, then it allocates the memory for the new PKCS#11
0N/A * structure and calls the corresponding function to convert the Java object to
0N/A * a PKCS#11 mechanism parameter structure.
0N/A */
0N/A
0N/A/*
0N/A * converts the pValue of a CK_ATTRIBUTE structure into a Java Object by checking the type
0N/A * of the attribute.
0N/A *
0N/A * @param env - used to call JNI funktions to create the new Java object
0N/A * @param ckpAttribute - the pointer to the CK_ATTRIBUTE structure that contains the type
0N/A * and the pValue to convert
0N/A * @return - the new Java object of the CK-type pValue
0N/A */
0N/Ajobject ckAttributeValueToJObject(JNIEnv *env, const CK_ATTRIBUTE_PTR ckpAttribute)
0N/A{
0N/A jint jValueLength;
0N/A jobject jValueObject = NULL;
0N/A
0N/A jValueLength = ckULongToJInt(ckpAttribute->ulValueLen);
0N/A
0N/A if ((jValueLength <= 0) || (ckpAttribute->pValue == NULL)) {
0N/A return NULL ;
0N/A }
0N/A
0N/A switch(ckpAttribute->type) {
0N/A case CKA_CLASS:
0N/A /* value CK_OBJECT_CLASS, defacto a CK_ULONG */
0N/A case CKA_KEY_TYPE:
0N/A /* value CK_KEY_TYPE, defacto a CK_ULONG */
0N/A case CKA_CERTIFICATE_TYPE:
0N/A /* value CK_CERTIFICATE_TYPE, defacto a CK_ULONG */
0N/A case CKA_HW_FEATURE_TYPE:
0N/A /* value CK_HW_FEATURE_TYPE, defacto a CK_ULONG */
0N/A case CKA_MODULUS_BITS:
0N/A case CKA_VALUE_BITS:
0N/A case CKA_VALUE_LEN:
0N/A case CKA_KEY_GEN_MECHANISM:
0N/A case CKA_PRIME_BITS:
0N/A case CKA_SUB_PRIME_BITS:
0N/A /* value CK_ULONG */
0N/A jValueObject = ckULongPtrToJLongObject(env, (CK_ULONG*) ckpAttribute->pValue);
0N/A break;
0N/A
0N/A /* can be CK_BYTE[],CK_CHAR[] or big integer; defacto always CK_BYTE[] */
0N/A case CKA_VALUE:
0N/A case CKA_OBJECT_ID:
0N/A case CKA_SUBJECT:
0N/A case CKA_ID:
0N/A case CKA_ISSUER:
0N/A case CKA_SERIAL_NUMBER:
0N/A case CKA_OWNER:
0N/A case CKA_AC_ISSUER:
0N/A case CKA_ATTR_TYPES:
0N/A case CKA_ECDSA_PARAMS:
0N/A /* CKA_EC_PARAMS is the same, these two are equivalent */
0N/A case CKA_EC_POINT:
0N/A case CKA_PRIVATE_EXPONENT:
0N/A case CKA_PRIME_1:
0N/A case CKA_PRIME_2:
0N/A case CKA_EXPONENT_1:
0N/A case CKA_EXPONENT_2:
0N/A case CKA_COEFFICIENT:
0N/A /* value CK_BYTE[] */
0N/A jValueObject = ckByteArrayToJByteArray(env, (CK_BYTE*) ckpAttribute->pValue, jValueLength);
0N/A break;
0N/A
0N/A case CKA_RESET_ON_INIT:
0N/A case CKA_HAS_RESET:
0N/A case CKA_TOKEN:
0N/A case CKA_PRIVATE:
0N/A case CKA_MODIFIABLE:
0N/A case CKA_DERIVE:
0N/A case CKA_LOCAL:
0N/A case CKA_ENCRYPT:
0N/A case CKA_VERIFY:
0N/A case CKA_VERIFY_RECOVER:
0N/A case CKA_WRAP:
0N/A case CKA_SENSITIVE:
0N/A case CKA_SECONDARY_AUTH:
0N/A case CKA_DECRYPT:
0N/A case CKA_SIGN:
0N/A case CKA_SIGN_RECOVER:
0N/A case CKA_UNWRAP:
0N/A case CKA_EXTRACTABLE:
0N/A case CKA_ALWAYS_SENSITIVE:
0N/A case CKA_NEVER_EXTRACTABLE:
0N/A case CKA_TRUSTED:
0N/A /* value CK_BBOOL */
0N/A jValueObject = ckBBoolPtrToJBooleanObject(env, (CK_BBOOL*) ckpAttribute->pValue);
0N/A break;
0N/A
0N/A case CKA_LABEL:
0N/A case CKA_APPLICATION:
0N/A /* value RFC 2279 (UTF-8) string */
0N/A jValueObject = ckUTF8CharArrayToJCharArray(env, (CK_UTF8CHAR*) ckpAttribute->pValue, jValueLength);
0N/A break;
0N/A
0N/A case CKA_START_DATE:
0N/A case CKA_END_DATE:
0N/A /* value CK_DATE */
0N/A jValueObject = ckDatePtrToJDateObject(env, (CK_DATE*) ckpAttribute->pValue);
0N/A break;
0N/A
0N/A case CKA_MODULUS:
0N/A case CKA_PUBLIC_EXPONENT:
0N/A case CKA_PRIME:
0N/A case CKA_SUBPRIME:
0N/A case CKA_BASE:
0N/A /* value big integer, i.e. CK_BYTE[] */
0N/A jValueObject = ckByteArrayToJByteArray(env, (CK_BYTE*) ckpAttribute->pValue, jValueLength);
0N/A break;
0N/A
0N/A case CKA_AUTH_PIN_FLAGS:
0N/A jValueObject = ckULongPtrToJLongObject(env, (CK_ULONG*) ckpAttribute->pValue);
0N/A /* value FLAGS, defacto a CK_ULONG */
0N/A break;
0N/A
0N/A case CKA_VENDOR_DEFINED:
0N/A /* we make a CK_BYTE[] out of this */
0N/A jValueObject = ckByteArrayToJByteArray(env, (CK_BYTE*) ckpAttribute->pValue, jValueLength);
0N/A break;
0N/A
0N/A // Netscape trust attributes
0N/A case CKA_NETSCAPE_TRUST_SERVER_AUTH:
0N/A case CKA_NETSCAPE_TRUST_CLIENT_AUTH:
0N/A case CKA_NETSCAPE_TRUST_CODE_SIGNING:
0N/A case CKA_NETSCAPE_TRUST_EMAIL_PROTECTION:
0N/A /* value CK_ULONG */
0N/A jValueObject = ckULongPtrToJLongObject(env, (CK_ULONG*) ckpAttribute->pValue);
0N/A break;
0N/A
0N/A default:
0N/A /* we make a CK_BYTE[] out of this */
0N/A jValueObject = ckByteArrayToJByteArray(env, (CK_BYTE*) ckpAttribute->pValue, jValueLength);
0N/A break;
0N/A }
0N/A
0N/A return jValueObject ;
0N/A}
0N/A
0N/A/*
0N/A * the following functions convert a Java mechanism parameter object to a PKCS#11
0N/A * mechanism parameter structure
0N/A *
0N/A * CK_<Param>_PARAMS j<Param>ParamToCK<Param>Param(JNIEnv *env,
0N/A * jobject jParam);
0N/A *
0N/A * These functions get a Java object, that must be the right Java mechanism
0N/A * object and they return the new PKCS#11 mechanism parameter structure.
0N/A * Every field of the Java object is retrieved, gets converted to a corresponding
0N/A * PKCS#11 type and is set in the new PKCS#11 structure.
0N/A */
0N/A
0N/A/*
0N/A * converts the given Java mechanism parameter to a CK mechanism parameter structure
0N/A * and store the length in bytes in the length variable.
0N/A * The memory of *ckpParamPtr has to be freed after use!
0N/A *
0N/A * @param env - used to call JNI funktions to get the Java classes and objects
0N/A * @param jParam - the Java mechanism parameter object to convert
0N/A * @param ckpParamPtr - the reference of the new pointer to the new CK mechanism parameter
0N/A * structure
0N/A * @param ckpLength - the reference of the length in bytes of the new CK mechanism parameter
0N/A * structure
0N/A */
0N/Avoid jMechanismParameterToCKMechanismParameter(JNIEnv *env, jobject jParam, CK_VOID_PTR *ckpParamPtr, CK_ULONG *ckpLength)
0N/A{
0N/A if (jParam == NULL) {
0N/A *ckpParamPtr = NULL;
0N/A *ckpLength = 0;
0N/A } else if ((*env)->IsInstanceOf(env, jParam, jByteArrayClass)) {
0N/A jByteArrayToCKByteArray(env, jParam, (CK_BYTE_PTR *)ckpParamPtr, ckpLength);
0N/A } else if ((*env)->IsInstanceOf(env, jParam, jLongClass)) {
0N/A *ckpParamPtr = jLongObjectToCKULongPtr(env, jParam);
0N/A *ckpLength = sizeof(CK_ULONG);
0N/A } else {
936N/A TRACE0("\nSLOW PATH jMechanismParameterToCKMechanismParameter\n");
0N/A jMechanismParameterToCKMechanismParameterSlow(env, jParam, ckpParamPtr, ckpLength);
0N/A }
0N/A}
0N/A
0N/Avoid jMechanismParameterToCKMechanismParameterSlow(JNIEnv *env, jobject jParam, CK_VOID_PTR *ckpParamPtr, CK_ULONG *ckpLength)
0N/A{
0N/A /* get all Java mechanism parameter classes */
936N/A jclass jVersionClass, jSsl3MasterKeyDeriveParamsClass, jSsl3KeyMatParamsClass;
3645N/A jclass jTlsPrfParamsClass, jAesCtrParamsClass, jRsaPkcsOaepParamsClass;
3645N/A jclass jPbeParamsClass, jPkcs5Pbkd2ParamsClass, jRsaPkcsPssParamsClass;
936N/A jclass jEcdh1DeriveParamsClass, jEcdh2DeriveParamsClass;
936N/A jclass jX942Dh1DeriveParamsClass, jX942Dh2DeriveParamsClass;
0N/A TRACE0("\nDEBUG: jMechanismParameterToCKMechanismParameter");
0N/A
936N/A /* most common cases, i.e. NULL/byte[]/long, are already handled by
936N/A * jMechanismParameterToCKMechanismParameter before calling this method.
936N/A */
936N/A jVersionClass = (*env)->FindClass(env, CLASS_VERSION);
936N/A if (jVersionClass == NULL) { return; }
0N/A if ((*env)->IsInstanceOf(env, jParam, jVersionClass)) {
0N/A /*
0N/A * CK_VERSION used by CKM_SSL3_PRE_MASTER_KEY_GEN
0N/A */
0N/A CK_VERSION_PTR ckpParam;
0N/A
0N/A /* convert jParameter to CKParameter */
0N/A ckpParam = jVersionToCKVersionPtr(env, jParam);
0N/A
0N/A /* get length and pointer of parameter */
0N/A *ckpLength = sizeof(CK_VERSION);
0N/A *ckpParamPtr = ckpParam;
936N/A return;
936N/A }
0N/A
936N/A jSsl3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);
936N/A if (jSsl3MasterKeyDeriveParamsClass == NULL) { return; }
936N/A if ((*env)->IsInstanceOf(env, jParam, jSsl3MasterKeyDeriveParamsClass)) {
0N/A /*
0N/A * CK_SSL3_MASTER_KEY_DERIVE_PARAMS
0N/A */
0N/A CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR ckpParam;
0N/A
0N/A ckpParam = (CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR) malloc(sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS));
936N/A if (ckpParam == NULL) {
936N/A JNU_ThrowOutOfMemoryError(env, 0);
936N/A return;
936N/A }
0N/A
0N/A /* convert jParameter to CKParameter */
0N/A *ckpParam = jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(env, jParam);
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckpParam);
936N/A return;
936N/A }
0N/A
0N/A /* get length and pointer of parameter */
0N/A *ckpLength = sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS);
0N/A *ckpParamPtr = ckpParam;
936N/A return;
936N/A }
0N/A
936N/A jSsl3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS);
936N/A if (jSsl3KeyMatParamsClass == NULL) { return; }
936N/A if ((*env)->IsInstanceOf(env, jParam, jSsl3KeyMatParamsClass)) {
0N/A /*
0N/A * CK_SSL3_KEY_MAT_PARAMS
0N/A */
0N/A CK_SSL3_KEY_MAT_PARAMS_PTR ckpParam;
0N/A
0N/A ckpParam = (CK_SSL3_KEY_MAT_PARAMS_PTR) malloc(sizeof(CK_SSL3_KEY_MAT_PARAMS));
936N/A if (ckpParam == NULL) {
936N/A JNU_ThrowOutOfMemoryError(env, 0);
936N/A return;
936N/A }
0N/A
0N/A /* convert jParameter to CKParameter */
0N/A *ckpParam = jSsl3KeyMatParamToCKSsl3KeyMatParam(env, jParam);
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckpParam);
936N/A return;
936N/A }
0N/A
0N/A /* get length and pointer of parameter */
0N/A *ckpLength = sizeof(CK_SSL3_KEY_MAT_PARAMS);
0N/A *ckpParamPtr = ckpParam;
936N/A return;
936N/A }
0N/A
936N/A jTlsPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS);
936N/A if (jTlsPrfParamsClass == NULL) { return; }
936N/A if ((*env)->IsInstanceOf(env, jParam, jTlsPrfParamsClass)) {
936N/A /*
936N/A * CK_TLS_PRF_PARAMS
936N/A */
0N/A CK_TLS_PRF_PARAMS_PTR ckpParam;
0N/A
0N/A ckpParam = (CK_TLS_PRF_PARAMS_PTR) malloc(sizeof(CK_TLS_PRF_PARAMS));
936N/A if (ckpParam == NULL) {
936N/A JNU_ThrowOutOfMemoryError(env, 0);
936N/A return;
936N/A }
0N/A
936N/A /* convert jParameter to CKParameter */
0N/A *ckpParam = jTlsPrfParamsToCKTlsPrfParam(env, jParam);
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckpParam);
936N/A return;
936N/A }
0N/A
936N/A /* get length and pointer of parameter */
0N/A *ckpLength = sizeof(CK_TLS_PRF_PARAMS);
0N/A *ckpParamPtr = ckpParam;
936N/A return;
936N/A }
0N/A
3645N/A jAesCtrParamsClass = (*env)->FindClass(env, CLASS_AES_CTR_PARAMS);
3645N/A if (jAesCtrParamsClass == NULL) { return; }
3645N/A if ((*env)->IsInstanceOf(env, jParam, jAesCtrParamsClass)) {
3645N/A /*
3645N/A * CK_AES_CTR_PARAMS
3645N/A */
3645N/A CK_AES_CTR_PARAMS_PTR ckpParam;
3645N/A
3645N/A ckpParam = (CK_AES_CTR_PARAMS_PTR) malloc(sizeof(CK_AES_CTR_PARAMS));
3645N/A if (ckpParam == NULL) {
3645N/A JNU_ThrowOutOfMemoryError(env, 0);
3645N/A return;
3645N/A }
3645N/A
3645N/A /* convert jParameter to CKParameter */
3645N/A jAesCtrParamsToCKAesCtrParam(env, jParam, ckpParam);
3645N/A if ((*env)->ExceptionCheck(env)) {
3645N/A free(ckpParam);
3645N/A return;
3645N/A }
3645N/A
3645N/A /* get length and pointer of parameter */
3645N/A *ckpLength = sizeof(CK_AES_CTR_PARAMS);
3645N/A *ckpParamPtr = ckpParam;
3645N/A return;
3645N/A }
3645N/A
936N/A jRsaPkcsOaepParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_OAEP_PARAMS);
936N/A if (jRsaPkcsOaepParamsClass == NULL) { return; }
936N/A if ((*env)->IsInstanceOf(env, jParam, jRsaPkcsOaepParamsClass)) {
0N/A /*
0N/A * CK_RSA_PKCS_OAEP_PARAMS
0N/A */
0N/A CK_RSA_PKCS_OAEP_PARAMS_PTR ckpParam;
0N/A
0N/A ckpParam = (CK_RSA_PKCS_OAEP_PARAMS_PTR) malloc(sizeof(CK_RSA_PKCS_OAEP_PARAMS));
936N/A if (ckpParam == NULL) {
936N/A JNU_ThrowOutOfMemoryError(env, 0);
936N/A return;
936N/A }
0N/A
0N/A /* convert jParameter to CKParameter */
0N/A *ckpParam = jRsaPkcsOaepParamToCKRsaPkcsOaepParam(env, jParam);
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckpParam);
936N/A return;
936N/A }
0N/A
0N/A /* get length and pointer of parameter */
0N/A *ckpLength = sizeof(CK_RSA_PKCS_OAEP_PARAMS);
0N/A *ckpParamPtr = ckpParam;
936N/A return;
936N/A }
0N/A
936N/A jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);
936N/A if (jPbeParamsClass == NULL) { return; }
936N/A if ((*env)->IsInstanceOf(env, jParam, jPbeParamsClass)) {
0N/A /*
0N/A * CK_PBE_PARAMS
0N/A */
0N/A CK_PBE_PARAMS_PTR ckpParam;
0N/A
0N/A ckpParam = (CK_PBE_PARAMS_PTR) malloc(sizeof(CK_PBE_PARAMS));
936N/A if (ckpParam == NULL) {
936N/A JNU_ThrowOutOfMemoryError(env, 0);
936N/A return;
936N/A }
0N/A
0N/A /* convert jParameter to CKParameter */
0N/A *ckpParam = jPbeParamToCKPbeParam(env, jParam);
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckpParam);
936N/A return;
936N/A }
0N/A
0N/A /* get length and pointer of parameter */
0N/A *ckpLength = sizeof(CK_PBE_PARAMS);
0N/A *ckpParamPtr = ckpParam;
936N/A return;
936N/A }
0N/A
936N/A jPkcs5Pbkd2ParamsClass = (*env)->FindClass(env, CLASS_PKCS5_PBKD2_PARAMS);
936N/A if (jPkcs5Pbkd2ParamsClass == NULL) { return; }
936N/A if ((*env)->IsInstanceOf(env, jParam, jPkcs5Pbkd2ParamsClass)) {
0N/A /*
0N/A * CK_PKCS5_PBKD2_PARAMS
0N/A */
0N/A CK_PKCS5_PBKD2_PARAMS_PTR ckpParam;
0N/A
0N/A ckpParam = (CK_PKCS5_PBKD2_PARAMS_PTR) malloc(sizeof(CK_PKCS5_PBKD2_PARAMS));
936N/A if (ckpParam == NULL) {
936N/A JNU_ThrowOutOfMemoryError(env, 0);
936N/A return;
936N/A }
0N/A
0N/A /* convert jParameter to CKParameter */
0N/A *ckpParam = jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(env, jParam);
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckpParam);
936N/A return;
936N/A }
0N/A
0N/A /* get length and pointer of parameter */
0N/A *ckpLength = sizeof(CK_PKCS5_PBKD2_PARAMS);
0N/A *ckpParamPtr = ckpParam;
936N/A return;
936N/A }
0N/A
936N/A jRsaPkcsPssParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_PSS_PARAMS);
936N/A if (jRsaPkcsPssParamsClass == NULL) { return; }
936N/A if ((*env)->IsInstanceOf(env, jParam, jRsaPkcsPssParamsClass)) {
0N/A /*
0N/A * CK_RSA_PKCS_PSS_PARAMS
0N/A */
0N/A CK_RSA_PKCS_PSS_PARAMS_PTR ckpParam;
0N/A
0N/A ckpParam = (CK_RSA_PKCS_PSS_PARAMS_PTR) malloc(sizeof(CK_RSA_PKCS_PSS_PARAMS));
936N/A if (ckpParam == NULL) {
936N/A JNU_ThrowOutOfMemoryError(env, 0);
936N/A return;
936N/A }
0N/A
0N/A /* convert jParameter to CKParameter */
0N/A *ckpParam = jRsaPkcsPssParamToCKRsaPkcsPssParam(env, jParam);
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckpParam);
936N/A return;
936N/A }
0N/A
0N/A /* get length and pointer of parameter */
0N/A *ckpLength = sizeof(CK_RSA_PKCS_PSS_PARAMS);
0N/A *ckpParamPtr = ckpParam;
936N/A return;
936N/A }
0N/A
936N/A jEcdh1DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH1_DERIVE_PARAMS);
936N/A if (jEcdh1DeriveParamsClass == NULL) { return; }
936N/A if ((*env)->IsInstanceOf(env, jParam, jEcdh1DeriveParamsClass)) {
0N/A /*
0N/A * CK_ECDH1_DERIVE_PARAMS
0N/A */
0N/A CK_ECDH1_DERIVE_PARAMS_PTR ckpParam;
0N/A
0N/A ckpParam = (CK_ECDH1_DERIVE_PARAMS_PTR) malloc(sizeof(CK_ECDH1_DERIVE_PARAMS));
936N/A if (ckpParam == NULL) {
936N/A JNU_ThrowOutOfMemoryError(env, 0);
936N/A return;
936N/A }
0N/A
0N/A /* convert jParameter to CKParameter */
0N/A *ckpParam = jEcdh1DeriveParamToCKEcdh1DeriveParam(env, jParam);
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckpParam);
936N/A return;
936N/A }
0N/A
0N/A /* get length and pointer of parameter */
0N/A *ckpLength = sizeof(CK_ECDH1_DERIVE_PARAMS);
0N/A *ckpParamPtr = ckpParam;
936N/A return;
936N/A }
0N/A
936N/A jEcdh2DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH2_DERIVE_PARAMS);
936N/A if (jEcdh2DeriveParamsClass == NULL) { return; }
936N/A if ((*env)->IsInstanceOf(env, jParam, jEcdh2DeriveParamsClass)) {
0N/A /*
0N/A * CK_ECDH2_DERIVE_PARAMS
0N/A */
0N/A CK_ECDH2_DERIVE_PARAMS_PTR ckpParam;
0N/A
0N/A ckpParam = (CK_ECDH2_DERIVE_PARAMS_PTR) malloc(sizeof(CK_ECDH2_DERIVE_PARAMS));
936N/A if (ckpParam == NULL) {
936N/A JNU_ThrowOutOfMemoryError(env, 0);
936N/A return;
936N/A }
0N/A
0N/A /* convert jParameter to CKParameter */
0N/A *ckpParam = jEcdh2DeriveParamToCKEcdh2DeriveParam(env, jParam);
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckpParam);
936N/A return;
936N/A }
0N/A
0N/A /* get length and pointer of parameter */
0N/A *ckpLength = sizeof(CK_ECDH2_DERIVE_PARAMS);
0N/A *ckpParamPtr = ckpParam;
936N/A return;
936N/A }
0N/A
936N/A jX942Dh1DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH1_DERIVE_PARAMS);
936N/A if (jX942Dh1DeriveParamsClass == NULL) { return; }
936N/A if ((*env)->IsInstanceOf(env, jParam, jX942Dh1DeriveParamsClass)) {
0N/A /*
0N/A * CK_X9_42_DH1_DERIVE_PARAMS
0N/A */
0N/A CK_X9_42_DH1_DERIVE_PARAMS_PTR ckpParam;
0N/A
0N/A ckpParam = (CK_X9_42_DH1_DERIVE_PARAMS_PTR) malloc(sizeof(CK_X9_42_DH1_DERIVE_PARAMS));
936N/A if (ckpParam == NULL) {
936N/A JNU_ThrowOutOfMemoryError(env, 0);
936N/A return;
936N/A }
0N/A
0N/A /* convert jParameter to CKParameter */
0N/A *ckpParam = jX942Dh1DeriveParamToCKX942Dh1DeriveParam(env, jParam);
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckpParam);
936N/A return;
936N/A }
0N/A
0N/A /* get length and pointer of parameter */
0N/A *ckpLength = sizeof(CK_X9_42_DH1_DERIVE_PARAMS);
0N/A *ckpParamPtr = ckpParam;
936N/A return;
936N/A }
0N/A
936N/A jX942Dh2DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH2_DERIVE_PARAMS);
936N/A if (jX942Dh2DeriveParamsClass == NULL) { return; }
936N/A if ((*env)->IsInstanceOf(env, jParam, jX942Dh2DeriveParamsClass)) {
0N/A /*
0N/A * CK_X9_42_DH2_DERIVE_PARAMS
0N/A */
0N/A CK_X9_42_DH2_DERIVE_PARAMS_PTR ckpParam;
0N/A
0N/A ckpParam = (CK_X9_42_DH2_DERIVE_PARAMS_PTR) malloc(sizeof(CK_X9_42_DH2_DERIVE_PARAMS));
936N/A if (ckpParam == NULL) {
936N/A JNU_ThrowOutOfMemoryError(env, 0);
936N/A return;
936N/A }
0N/A
0N/A /* convert jParameter to CKParameter */
0N/A *ckpParam = jX942Dh2DeriveParamToCKX942Dh2DeriveParam(env, jParam);
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckpParam);
936N/A return;
936N/A }
0N/A
0N/A /* get length and pointer of parameter */
0N/A *ckpLength = sizeof(CK_X9_42_DH2_DERIVE_PARAMS);
0N/A *ckpParamPtr = ckpParam;
936N/A return;
936N/A }
0N/A
936N/A /* if everything faild up to here */
936N/A /* try if the parameter is a primitive Java type */
936N/A jObjectToPrimitiveCKObjectPtrPtr(env, jParam, ckpParamPtr, ckpLength);
936N/A /* *ckpParamPtr = jObjectToCKVoidPtr(jParam); */
936N/A /* *ckpLength = 1; */
0N/A
0N/A TRACE0("FINISHED\n");
0N/A}
0N/A
0N/A
0N/A/* the mechanism parameter convertion functions: */
0N/A
0N/A/*
0N/A * converts the Java CK_RSA_PKCS_OAEP_PARAMS object to a CK_RSA_PKCS_OAEP_PARAMS structure
0N/A *
0N/A * @param env - used to call JNI funktions to get the Java classes and objects
0N/A * @param jParam - the Java CK_RSA_PKCS_OAEP_PARAMS object to convert
0N/A * @return - the new CK_RSA_PKCS_OAEP_PARAMS structure
0N/A */
0N/ACK_RSA_PKCS_OAEP_PARAMS jRsaPkcsOaepParamToCKRsaPkcsOaepParam(JNIEnv *env, jobject jParam)
0N/A{
936N/A jclass jRsaPkcsOaepParamsClass;
0N/A CK_RSA_PKCS_OAEP_PARAMS ckParam;
0N/A jfieldID fieldID;
936N/A jlong jHashAlg, jMgf, jSource;
936N/A jobject jSourceData;
0N/A CK_BYTE_PTR ckpByte;
0N/A
0N/A /* get hashAlg */
936N/A jRsaPkcsOaepParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_OAEP_PARAMS);
936N/A if (jRsaPkcsOaepParamsClass == NULL) { return ckParam; }
0N/A fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "hashAlg", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jHashAlg = (*env)->GetLongField(env, jParam, fieldID);
0N/A
0N/A /* get mgf */
0N/A fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "mgf", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jMgf = (*env)->GetLongField(env, jParam, fieldID);
0N/A
0N/A /* get source */
0N/A fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "source", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jSource = (*env)->GetLongField(env, jParam, fieldID);
0N/A
0N/A /* get sourceData and sourceDataLength */
0N/A fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "pSourceData", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jSourceData = (*env)->GetObjectField(env, jParam, fieldID);
936N/A
936N/A /* populate java values */
936N/A ckParam.hashAlg = jLongToCKULong(jHashAlg);
936N/A ckParam.mgf = jLongToCKULong(jMgf);
936N/A ckParam.source = jLongToCKULong(jSource);
936N/A jByteArrayToCKByteArray(env, jSourceData, & ckpByte, &(ckParam.ulSourceDataLen));
936N/A if ((*env)->ExceptionCheck(env)) { return ckParam; }
0N/A ckParam.pSourceData = (CK_VOID_PTR) ckpByte;
0N/A
0N/A return ckParam ;
0N/A}
0N/A
0N/A/*
0N/A * converts the Java CK_PBE_PARAMS object to a CK_PBE_PARAMS structure
0N/A *
0N/A * @param env - used to call JNI funktions to get the Java classes and objects
0N/A * @param jParam - the Java CK_PBE_PARAMS object to convert
0N/A * @return - the new CK_PBE_PARAMS structure
0N/A */
0N/ACK_PBE_PARAMS jPbeParamToCKPbeParam(JNIEnv *env, jobject jParam)
0N/A{
936N/A jclass jPbeParamsClass;
0N/A CK_PBE_PARAMS ckParam;
0N/A jfieldID fieldID;
936N/A jlong jIteration;
936N/A jobject jInitVector, jPassword, jSalt;
0N/A CK_ULONG ckTemp;
0N/A
0N/A /* get pInitVector */
936N/A jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);
936N/A if (jPbeParamsClass == NULL) { return ckParam; }
0N/A fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pInitVector", "[C");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jInitVector = (*env)->GetObjectField(env, jParam, fieldID);
0N/A
0N/A /* get pPassword and ulPasswordLength */
0N/A fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pPassword", "[C");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jPassword = (*env)->GetObjectField(env, jParam, fieldID);
0N/A
0N/A /* get pSalt and ulSaltLength */
0N/A fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pSalt", "[C");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jSalt = (*env)->GetObjectField(env, jParam, fieldID);
0N/A
0N/A /* get ulIteration */
0N/A fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "ulIteration", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jIteration = (*env)->GetLongField(env, jParam, fieldID);
936N/A
936N/A /* populate java values */
936N/A ckParam.ulIteration = jLongToCKULong(jIteration);
936N/A jCharArrayToCKCharArray(env, jInitVector, &(ckParam.pInitVector), &ckTemp);
936N/A if ((*env)->ExceptionCheck(env)) { return ckParam; }
936N/A jCharArrayToCKCharArray(env, jPassword, &(ckParam.pPassword), &(ckParam.ulPasswordLen));
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckParam.pInitVector);
936N/A return ckParam;
936N/A }
936N/A jCharArrayToCKCharArray(env, jSalt, &(ckParam.pSalt), &(ckParam.ulSaltLen));
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckParam.pInitVector);
936N/A free(ckParam.pPassword);
936N/A return ckParam;
936N/A }
0N/A
0N/A return ckParam ;
0N/A}
0N/A
0N/A/*
0N/A * Copy back the initialization vector from the native structure to the
0N/A * Java object. This is only used for CKM_PBE_* mechanisms and their
0N/A * CK_PBE_PARAMS parameters.
0N/A *
0N/A */
0N/Avoid copyBackPBEInitializationVector(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism)
0N/A{
936N/A jclass jMechanismClass, jPbeParamsClass;
0N/A CK_PBE_PARAMS *ckParam;
0N/A jfieldID fieldID;
0N/A CK_MECHANISM_TYPE ckMechanismType;
0N/A jlong jMechanismType;
0N/A jobject jParameter;
0N/A jobject jInitVector;
0N/A jint jInitVectorLength;
0N/A CK_CHAR_PTR initVector;
0N/A int i;
0N/A jchar* jInitVectorChars;
0N/A
0N/A /* get mechanism */
936N/A jMechanismClass = (*env)->FindClass(env, CLASS_MECHANISM);
936N/A if (jMechanismClass == NULL) { return; }
0N/A fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J");
936N/A if (fieldID == NULL) { return; }
0N/A jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID);
0N/A ckMechanismType = jLongToCKULong(jMechanismType);
0N/A if (ckMechanismType != ckMechanism->mechanism) {
0N/A /* we do not have maching types, this should not occur */
0N/A return;
0N/A }
0N/A
936N/A jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);
936N/A if (jPbeParamsClass == NULL) { return; }
0N/A ckParam = (CK_PBE_PARAMS *) ckMechanism->pParameter;
0N/A if (ckParam != NULL_PTR) {
0N/A initVector = ckParam->pInitVector;
0N/A if (initVector != NULL_PTR) {
0N/A /* get pParameter */
0N/A fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;");
936N/A if (fieldID == NULL) { return; }
0N/A jParameter = (*env)->GetObjectField(env, jMechanism, fieldID);
0N/A fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pInitVektor", "[C");
936N/A if (fieldID == NULL) { return; }
0N/A jInitVector = (*env)->GetObjectField(env, jParameter, fieldID);
0N/A
0N/A if (jInitVector != NULL) {
0N/A jInitVectorLength = (*env)->GetArrayLength(env, jInitVector);
0N/A jInitVectorChars = (*env)->GetCharArrayElements(env, jInitVector, NULL);
936N/A if (jInitVectorChars == NULL) { return; }
936N/A
0N/A /* copy the chars to the Java buffer */
0N/A for (i=0; i < jInitVectorLength; i++) {
0N/A jInitVectorChars[i] = ckCharToJChar(initVector[i]);
0N/A }
0N/A /* copy back the Java buffer to the object */
0N/A (*env)->ReleaseCharArrayElements(env, jInitVector, jInitVectorChars, 0);
0N/A }
0N/A }
0N/A }
0N/A}
0N/A
0N/A/*
0N/A * converts the Java CK_PKCS5_PBKD2_PARAMS object to a CK_PKCS5_PBKD2_PARAMS structure
0N/A *
0N/A * @param env - used to call JNI funktions to get the Java classes and objects
0N/A * @param jParam - the Java CK_PKCS5_PBKD2_PARAMS object to convert
0N/A * @return - the new CK_PKCS5_PBKD2_PARAMS structure
0N/A */
0N/ACK_PKCS5_PBKD2_PARAMS jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(JNIEnv *env, jobject jParam)
0N/A{
936N/A jclass jPkcs5Pbkd2ParamsClass;
0N/A CK_PKCS5_PBKD2_PARAMS ckParam;
0N/A jfieldID fieldID;
936N/A jlong jSaltSource, jIteration, jPrf;
936N/A jobject jSaltSourceData, jPrfData;
0N/A
0N/A /* get saltSource */
936N/A jPkcs5Pbkd2ParamsClass = (*env)->FindClass(env, CLASS_PKCS5_PBKD2_PARAMS);
936N/A if (jPkcs5Pbkd2ParamsClass == NULL) { return ckParam; }
0N/A fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "saltSource", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jSaltSource = (*env)->GetLongField(env, jParam, fieldID);
0N/A
0N/A /* get pSaltSourceData */
0N/A fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "pSaltSourceData", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jSaltSourceData = (*env)->GetObjectField(env, jParam, fieldID);
0N/A
0N/A /* get iterations */
0N/A fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "iterations", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jIteration = (*env)->GetLongField(env, jParam, fieldID);
0N/A
0N/A /* get prf */
0N/A fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "prf", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jPrf = (*env)->GetLongField(env, jParam, fieldID);
0N/A
0N/A /* get pPrfData and ulPrfDataLength in byte */
0N/A fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "pPrfData", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jPrfData = (*env)->GetObjectField(env, jParam, fieldID);
936N/A
936N/A /* populate java values */
936N/A ckParam.saltSource = jLongToCKULong(jSaltSource);
936N/A jByteArrayToCKByteArray(env, jSaltSourceData, (CK_BYTE_PTR *) &(ckParam.pSaltSourceData), &(ckParam.ulSaltSourceDataLen));
936N/A if ((*env)->ExceptionCheck(env)) { return ckParam; }
936N/A ckParam.iterations = jLongToCKULong(jIteration);
936N/A ckParam.prf = jLongToCKULong(jPrf);
936N/A jByteArrayToCKByteArray(env, jPrfData, (CK_BYTE_PTR *) &(ckParam.pPrfData), &(ckParam.ulPrfDataLen));
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckParam.pSaltSourceData);
936N/A return ckParam;
936N/A }
0N/A
0N/A return ckParam ;
0N/A}
0N/A
0N/A/*
0N/A * converts the Java CK_RSA_PKCS_PSS_PARAMS object to a CK_RSA_PKCS_PSS_PARAMS structure
0N/A *
0N/A * @param env - used to call JNI funktions to get the Java classes and objects
0N/A * @param jParam - the Java CK_RSA_PKCS_PSS_PARAMS object to convert
0N/A * @return - the new CK_RSA_PKCS_PSS_PARAMS structure
0N/A */
0N/ACK_RSA_PKCS_PSS_PARAMS jRsaPkcsPssParamToCKRsaPkcsPssParam(JNIEnv *env, jobject jParam)
0N/A{
936N/A jclass jRsaPkcsPssParamsClass;
0N/A CK_RSA_PKCS_PSS_PARAMS ckParam;
0N/A jfieldID fieldID;
936N/A jlong jHashAlg, jMgf, jSLen;
0N/A
0N/A /* get hashAlg */
936N/A jRsaPkcsPssParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_PSS_PARAMS);
936N/A if (jRsaPkcsPssParamsClass == NULL) { return ckParam; }
0N/A fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "hashAlg", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jHashAlg = (*env)->GetLongField(env, jParam, fieldID);
0N/A
0N/A /* get mgf */
0N/A fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "mgf", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jMgf = (*env)->GetLongField(env, jParam, fieldID);
0N/A
0N/A /* get sLen */
0N/A fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "sLen", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jSLen = (*env)->GetLongField(env, jParam, fieldID);
936N/A
936N/A /* populate java values */
936N/A ckParam.hashAlg = jLongToCKULong(jHashAlg);
936N/A ckParam.mgf = jLongToCKULong(jMgf);
936N/A ckParam.sLen = jLongToCKULong(jSLen);
0N/A
0N/A return ckParam ;
0N/A}
0N/A
0N/A/*
0N/A * converts the Java CK_ECDH1_DERIVE_PARAMS object to a CK_ECDH1_DERIVE_PARAMS structure
0N/A *
0N/A * @param env - used to call JNI funktions to get the Java classes and objects
0N/A * @param jParam - the Java CK_ECDH1_DERIVE_PARAMS object to convert
0N/A * @return - the new CK_ECDH1_DERIVE_PARAMS structure
0N/A */
0N/ACK_ECDH1_DERIVE_PARAMS jEcdh1DeriveParamToCKEcdh1DeriveParam(JNIEnv *env, jobject jParam)
0N/A{
936N/A jclass jEcdh1DeriveParamsClass;
0N/A CK_ECDH1_DERIVE_PARAMS ckParam;
0N/A jfieldID fieldID;
0N/A jlong jLong;
936N/A jobject jSharedData, jPublicData;
0N/A
0N/A /* get kdf */
936N/A jEcdh1DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH1_DERIVE_PARAMS);
936N/A if (jEcdh1DeriveParamsClass == NULL) { return ckParam; }
0N/A fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "kdf", "J");
936N/A if (fieldID == NULL) { return ckParam; }
0N/A jLong = (*env)->GetLongField(env, jParam, fieldID);
0N/A ckParam.kdf = jLongToCKULong(jLong);
0N/A
0N/A /* get pSharedData and ulSharedDataLen */
0N/A fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "pSharedData", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jSharedData = (*env)->GetObjectField(env, jParam, fieldID);
0N/A
0N/A /* get pPublicData and ulPublicDataLen */
0N/A fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "pPublicData", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jPublicData = (*env)->GetObjectField(env, jParam, fieldID);
936N/A
936N/A /* populate java values */
936N/A ckParam.kdf = jLongToCKULong(jLong);
936N/A jByteArrayToCKByteArray(env, jSharedData, &(ckParam.pSharedData), &(ckParam.ulSharedDataLen));
936N/A if ((*env)->ExceptionCheck(env)) { return ckParam; }
936N/A jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckParam.pSharedData);
936N/A return ckParam;
936N/A }
0N/A
0N/A return ckParam ;
0N/A}
0N/A
0N/A/*
0N/A * converts the Java CK_ECDH2_DERIVE_PARAMS object to a CK_ECDH2_DERIVE_PARAMS structure
0N/A *
0N/A * @param env - used to call JNI funktions to get the Java classes and objects
0N/A * @param jParam - the Java CK_ECDH2_DERIVE_PARAMS object to convert
0N/A * @return - the new CK_ECDH2_DERIVE_PARAMS structure
0N/A */
0N/ACK_ECDH2_DERIVE_PARAMS jEcdh2DeriveParamToCKEcdh2DeriveParam(JNIEnv *env, jobject jParam)
0N/A{
936N/A jclass jEcdh2DeriveParamsClass;
0N/A CK_ECDH2_DERIVE_PARAMS ckParam;
0N/A jfieldID fieldID;
936N/A jlong jKdf, jPrivateDataLen, jPrivateData;
936N/A jobject jSharedData, jPublicData, jPublicData2;
0N/A
0N/A /* get kdf */
936N/A jEcdh2DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH2_DERIVE_PARAMS);
936N/A if (jEcdh2DeriveParamsClass == NULL) { return ckParam; }
0N/A fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "kdf", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jKdf = (*env)->GetLongField(env, jParam, fieldID);
0N/A
0N/A /* get pSharedData and ulSharedDataLen */
0N/A fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pSharedData", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jSharedData = (*env)->GetObjectField(env, jParam, fieldID);
0N/A
0N/A /* get pPublicData and ulPublicDataLen */
0N/A fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pPublicData", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jPublicData = (*env)->GetObjectField(env, jParam, fieldID);
0N/A
0N/A /* get ulPrivateDataLen */
0N/A fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "ulPrivateDataLen", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jPrivateDataLen = (*env)->GetLongField(env, jParam, fieldID);
0N/A
0N/A /* get hPrivateData */
0N/A fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "hPrivateData", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jPrivateData = (*env)->GetLongField(env, jParam, fieldID);
0N/A
0N/A /* get pPublicData2 and ulPublicDataLen2 */
0N/A fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pPublicData2", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jPublicData2 = (*env)->GetObjectField(env, jParam, fieldID);
0N/A
936N/A /* populate java values */
936N/A ckParam.kdf = jLongToCKULong(jKdf);
936N/A jByteArrayToCKByteArray(env, jSharedData, &(ckParam.pSharedData), &(ckParam.ulSharedDataLen));
936N/A if ((*env)->ExceptionCheck(env)) { return ckParam; }
936N/A jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckParam.pSharedData);
936N/A return ckParam;
936N/A }
936N/A ckParam.ulPrivateDataLen = jLongToCKULong(jPrivateDataLen);
936N/A ckParam.hPrivateData = jLongToCKULong(jPrivateData);
936N/A jByteArrayToCKByteArray(env, jPublicData2, &(ckParam.pPublicData2), &(ckParam.ulPublicDataLen2));
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckParam.pSharedData);
936N/A free(ckParam.pPublicData);
936N/A return ckParam;
936N/A }
0N/A return ckParam ;
0N/A}
0N/A
0N/A/*
0N/A * converts the Java CK_X9_42_DH1_DERIVE_PARAMS object to a CK_X9_42_DH1_DERIVE_PARAMS structure
0N/A *
0N/A * @param env - used to call JNI funktions to get the Java classes and objects
0N/A * @param jParam - the Java CK_X9_42_DH1_DERIVE_PARAMS object to convert
0N/A * @return - the new CK_X9_42_DH1_DERIVE_PARAMS structure
0N/A */
0N/ACK_X9_42_DH1_DERIVE_PARAMS jX942Dh1DeriveParamToCKX942Dh1DeriveParam(JNIEnv *env, jobject jParam)
0N/A{
936N/A jclass jX942Dh1DeriveParamsClass;
0N/A CK_X9_42_DH1_DERIVE_PARAMS ckParam;
0N/A jfieldID fieldID;
936N/A jlong jKdf;
936N/A jobject jOtherInfo, jPublicData;
0N/A
0N/A /* get kdf */
936N/A jX942Dh1DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH1_DERIVE_PARAMS);
936N/A if (jX942Dh1DeriveParamsClass == NULL) { return ckParam; }
0N/A fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "kdf", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jKdf = (*env)->GetLongField(env, jParam, fieldID);
0N/A
0N/A /* get pOtherInfo and ulOtherInfoLen */
0N/A fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "pOtherInfo", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jOtherInfo = (*env)->GetObjectField(env, jParam, fieldID);
0N/A
0N/A /* get pPublicData and ulPublicDataLen */
0N/A fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "pPublicData", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jPublicData = (*env)->GetObjectField(env, jParam, fieldID);
936N/A
936N/A /* populate java values */
936N/A ckParam.kdf = jLongToCKULong(jKdf);
936N/A jByteArrayToCKByteArray(env, jOtherInfo, &(ckParam.pOtherInfo), &(ckParam.ulOtherInfoLen));
936N/A if ((*env)->ExceptionCheck(env)) { return ckParam; }
936N/A jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckParam.pOtherInfo);
936N/A return ckParam;
936N/A }
0N/A
0N/A return ckParam ;
0N/A}
0N/A
0N/A/*
0N/A * converts the Java CK_X9_42_DH2_DERIVE_PARAMS object to a CK_X9_42_DH2_DERIVE_PARAMS structure
0N/A *
0N/A * @param env - used to call JNI funktions to get the Java classes and objects
0N/A * @param jParam - the Java CK_X9_42_DH2_DERIVE_PARAMS object to convert
0N/A * @return - the new CK_X9_42_DH2_DERIVE_PARAMS structure
0N/A */
0N/ACK_X9_42_DH2_DERIVE_PARAMS jX942Dh2DeriveParamToCKX942Dh2DeriveParam(JNIEnv *env, jobject jParam)
0N/A{
936N/A jclass jX942Dh2DeriveParamsClass;
0N/A CK_X9_42_DH2_DERIVE_PARAMS ckParam;
0N/A jfieldID fieldID;
936N/A jlong jKdf, jPrivateDataLen, jPrivateData;
936N/A jobject jOtherInfo, jPublicData, jPublicData2;
0N/A
0N/A /* get kdf */
936N/A jX942Dh2DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH2_DERIVE_PARAMS);
936N/A if (jX942Dh2DeriveParamsClass == NULL) { return ckParam; }
0N/A fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "kdf", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jKdf = (*env)->GetLongField(env, jParam, fieldID);
0N/A
0N/A /* get pOtherInfo and ulOtherInfoLen */
0N/A fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pOtherInfo", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jOtherInfo = (*env)->GetObjectField(env, jParam, fieldID);
0N/A
0N/A /* get pPublicData and ulPublicDataLen */
0N/A fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pPublicData", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jPublicData = (*env)->GetObjectField(env, jParam, fieldID);
0N/A
0N/A /* get ulPrivateDataLen */
0N/A fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "ulPrivateDataLen", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jPrivateDataLen = (*env)->GetLongField(env, jParam, fieldID);
0N/A
0N/A /* get hPrivateData */
0N/A fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "hPrivateData", "J");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jPrivateData = (*env)->GetLongField(env, jParam, fieldID);
0N/A
0N/A /* get pPublicData2 and ulPublicDataLen2 */
0N/A fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pPublicData2", "[B");
936N/A if (fieldID == NULL) { return ckParam; }
936N/A jPublicData2 = (*env)->GetObjectField(env, jParam, fieldID);
936N/A
936N/A /* populate java values */
936N/A ckParam.kdf = jLongToCKULong(jKdf);
936N/A jByteArrayToCKByteArray(env, jOtherInfo, &(ckParam.pOtherInfo), &(ckParam.ulOtherInfoLen));
936N/A if ((*env)->ExceptionCheck(env)) { return ckParam; }
936N/A jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckParam.pOtherInfo);
936N/A return ckParam;
936N/A }
936N/A ckParam.ulPrivateDataLen = jLongToCKULong(jPrivateDataLen);
936N/A ckParam.hPrivateData = jLongToCKULong(jPrivateData);
936N/A jByteArrayToCKByteArray(env, jPublicData2, &(ckParam.pPublicData2), &(ckParam.ulPublicDataLen2));
936N/A if ((*env)->ExceptionCheck(env)) {
936N/A free(ckParam.pOtherInfo);
936N/A free(ckParam.pPublicData);
936N/A return ckParam;
936N/A }
0N/A
0N/A return ckParam ;
0N/A}