jdk/src/share/native/sun/security/pkcs11/wrapper/p11_util.c
author duke
Sat, 01 Dec 2007 00:00:00 +0000
changeset 2 90ce3da70b43
child 2180 9994f4f08a59
permissions -rw-r--r--
Initial load
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
     2
 * Portions Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
/* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     7
 * Redistribution and use in  source and binary forms, with or without
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * modification, are permitted  provided that the following conditions are met:
90ce3da70b43 Initial load
duke
parents:
diff changeset
     9
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 * 1. Redistributions of  source code must retain the above copyright notice,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 *    this list of conditions and the following disclaimer.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * 2. Redistributions in  binary form must reproduce the above copyright notice,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 *    this list of conditions and the following disclaimer in the documentation
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 *    and/or other materials provided with the distribution.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * 3. The end-user documentation included with the redistribution, if any, must
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 *    include the following acknowledgment:
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *    "This product includes software developed by IAIK of Graz University of
90ce3da70b43 Initial load
duke
parents:
diff changeset
    21
 *     Technology."
90ce3da70b43 Initial load
duke
parents:
diff changeset
    22
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    23
 *    Alternately, this acknowledgment may appear in the software itself, if
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 *    and wherever such third-party acknowledgments normally appear.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
 * 4. The names "Graz University of Technology" and "IAIK of Graz University of
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
 *    Technology" must not be used to endorse or promote products derived from
90ce3da70b43 Initial load
duke
parents:
diff changeset
    28
 *    this software without prior written permission.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    29
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    30
 * 5. Products derived from this software may not be called
90ce3da70b43 Initial load
duke
parents:
diff changeset
    31
 *    "IAIK PKCS Wrapper", nor may "IAIK" appear in their name, without prior
90ce3da70b43 Initial load
duke
parents:
diff changeset
    32
 *    written permission of Graz University of Technology.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    33
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    34
 *  THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
 *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
90ce3da70b43 Initial load
duke
parents:
diff changeset
    36
 *  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
90ce3da70b43 Initial load
duke
parents:
diff changeset
    37
 *  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE LICENSOR BE
90ce3da70b43 Initial load
duke
parents:
diff changeset
    38
 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    39
 *  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    40
 *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    41
 *  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
 *  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    43
 *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
90ce3da70b43 Initial load
duke
parents:
diff changeset
    44
 *  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
90ce3da70b43 Initial load
duke
parents:
diff changeset
    45
 *  POSSIBILITY  OF SUCH DAMAGE.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    46
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    47
90ce3da70b43 Initial load
duke
parents:
diff changeset
    48
#include "pkcs11wrapper.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    49
90ce3da70b43 Initial load
duke
parents:
diff changeset
    50
#include <stdio.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    51
#include <stdlib.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    52
#include <string.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    53
#include <assert.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    54
90ce3da70b43 Initial load
duke
parents:
diff changeset
    55
/* declare file private functions */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    56
90ce3da70b43 Initial load
duke
parents:
diff changeset
    57
ModuleData * getModuleEntry(JNIEnv *env, jobject pkcs11Implementation);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    58
int isModulePresent(JNIEnv *env, jobject pkcs11Implementation);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    59
void removeAllModuleEntries(JNIEnv *env);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    60
90ce3da70b43 Initial load
duke
parents:
diff changeset
    61
90ce3da70b43 Initial load
duke
parents:
diff changeset
    62
/* ************************************************************************** */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    63
/* Functions for keeping track of currently active and loaded modules         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    64
/* ************************************************************************** */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    65
90ce3da70b43 Initial load
duke
parents:
diff changeset
    66
90ce3da70b43 Initial load
duke
parents:
diff changeset
    67
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
    68
 * Create a new object for locking.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    69
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    70
jobject createLockObject(JNIEnv *env) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    71
    jclass jObjectClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    72
    jobject jLockObject;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    73
    jmethodID jConstructor;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    74
90ce3da70b43 Initial load
duke
parents:
diff changeset
    75
    jObjectClass = (*env)->FindClass(env, "java/lang/Object");
90ce3da70b43 Initial load
duke
parents:
diff changeset
    76
    assert(jObjectClass != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    77
    jConstructor = (*env)->GetMethodID(env, jObjectClass, "<init>", "()V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
    assert(jConstructor != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    79
    jLockObject = (*env)->NewObject(env, jObjectClass, jConstructor);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    80
    assert(jLockObject != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    81
    jLockObject = (*env)->NewGlobalRef(env, jLockObject);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    82
90ce3da70b43 Initial load
duke
parents:
diff changeset
    83
    return jLockObject ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    84
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
    85
90ce3da70b43 Initial load
duke
parents:
diff changeset
    86
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
    87
 * Create a new object for locking.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    88
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    89
void destroyLockObject(JNIEnv *env, jobject jLockObject) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    90
    if (jLockObject != NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    91
        (*env)->DeleteGlobalRef(env, jLockObject);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    92
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    93
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
    94
90ce3da70b43 Initial load
duke
parents:
diff changeset
    95
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
    96
 * Add the given pkcs11Implementation object to the list of present modules.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    97
 * Attach the given data to the entry. If the given pkcs11Implementation is
90ce3da70b43 Initial load
duke
parents:
diff changeset
    98
 * already in the lsit, just override its old module data with the new one.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    99
 * None of the arguments can be NULL. If one of the arguments is NULL, this
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
 * function does nothing.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   101
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   102
void putModuleEntry(JNIEnv *env, jobject pkcs11Implementation, ModuleData *moduleData) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   103
    if (pkcs11Implementation == NULL_PTR) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   104
        return ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   106
    if (moduleData == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
        return ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   108
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
    (*env)->SetLongField(env, pkcs11Implementation, pNativeDataID, (jlong)moduleData);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   110
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   111
90ce3da70b43 Initial load
duke
parents:
diff changeset
   112
90ce3da70b43 Initial load
duke
parents:
diff changeset
   113
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   114
 * Get the module data of the entry for the given pkcs11Implementation. Returns
90ce3da70b43 Initial load
duke
parents:
diff changeset
   115
 * NULL, if the pkcs11Implementation is not in the list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   116
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   117
ModuleData * getModuleEntry(JNIEnv *env, jobject pkcs11Implementation) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   118
    jlong jData;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   119
    if (pkcs11Implementation == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   120
        return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   122
    jData = (*env)->GetLongField(env, pkcs11Implementation, pNativeDataID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   123
    return (ModuleData*)jData;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   124
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   125
90ce3da70b43 Initial load
duke
parents:
diff changeset
   126
CK_FUNCTION_LIST_PTR getFunctionList(JNIEnv *env, jobject pkcs11Implementation) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   127
    ModuleData *moduleData;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   128
    CK_FUNCTION_LIST_PTR ckpFunctions;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   129
90ce3da70b43 Initial load
duke
parents:
diff changeset
   130
    moduleData = getModuleEntry(env, pkcs11Implementation);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   131
    if (moduleData == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   132
        throwDisconnectedRuntimeException(env);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   133
        return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   134
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   135
    ckpFunctions = moduleData->ckFunctionListPtr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   136
    return ckpFunctions;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   137
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   138
90ce3da70b43 Initial load
duke
parents:
diff changeset
   139
90ce3da70b43 Initial load
duke
parents:
diff changeset
   140
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   141
 * Returns 1, if the given pkcs11Implementation is in the list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   142
 * 0, otherwise.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   143
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   144
int isModulePresent(JNIEnv *env, jobject pkcs11Implementation) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   145
    int present;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   146
90ce3da70b43 Initial load
duke
parents:
diff changeset
   147
    ModuleData *moduleData = getModuleEntry(env, pkcs11Implementation);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   148
90ce3da70b43 Initial load
duke
parents:
diff changeset
   149
    present = (moduleData != NULL) ? 1 : 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   150
90ce3da70b43 Initial load
duke
parents:
diff changeset
   151
    return present ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   152
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   153
90ce3da70b43 Initial load
duke
parents:
diff changeset
   154
90ce3da70b43 Initial load
duke
parents:
diff changeset
   155
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   156
 * Removes the entry for the given pkcs11Implementation from the list. Returns
90ce3da70b43 Initial load
duke
parents:
diff changeset
   157
 * the module's data, after the node was removed. If this function returns NULL
90ce3da70b43 Initial load
duke
parents:
diff changeset
   158
 * the pkcs11Implementation was not in the list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   159
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   160
ModuleData * removeModuleEntry(JNIEnv *env, jobject pkcs11Implementation) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   161
    ModuleData *moduleData = getModuleEntry(env, pkcs11Implementation);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   162
    if (moduleData == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   163
        return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   164
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   165
    (*env)->SetLongField(env, pkcs11Implementation, pNativeDataID, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   166
    return moduleData;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   167
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   168
90ce3da70b43 Initial load
duke
parents:
diff changeset
   169
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   170
 * Removes all present entries from the list of modules and frees all
90ce3da70b43 Initial load
duke
parents:
diff changeset
   171
 * associated resources. This function is used for clean-up.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   172
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   173
void removeAllModuleEntries(JNIEnv *env) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
    /* XXX empty */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   175
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
/* ************************************************************************** */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   178
/* Below there follow the helper functions to support conversions between     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   179
/* Java and Cryptoki types                                                    */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   180
/* ************************************************************************** */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
90ce3da70b43 Initial load
duke
parents:
diff changeset
   182
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   183
 * function to convert a PKCS#11 return value into a PKCS#11Exception
90ce3da70b43 Initial load
duke
parents:
diff changeset
   184
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   185
 * This function generates a PKCS#11Exception with the returnValue as the errorcode
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
 * if the returnValue is not CKR_OK. The functin returns 0, if the returnValue is
90ce3da70b43 Initial load
duke
parents:
diff changeset
   187
 * CKR_OK. Otherwise, it returns the returnValue as a jLong.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   188
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   189
 * @param env - used to call JNI funktions and to get the Exception class
90ce3da70b43 Initial load
duke
parents:
diff changeset
   190
 * @param returnValue - of the PKCS#11 function
90ce3da70b43 Initial load
duke
parents:
diff changeset
   191
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   192
jlong ckAssertReturnValueOK(JNIEnv *env, CK_RV returnValue)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   193
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   194
    jclass jPKCS11ExceptionClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   195
    jmethodID jConstructor;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   196
    jthrowable jPKCS11Exception;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   197
    jlong jErrorCode;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   198
90ce3da70b43 Initial load
duke
parents:
diff changeset
   199
    if (returnValue == CKR_OK) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   200
        return 0L ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   201
    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   202
        jPKCS11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   203
        assert(jPKCS11ExceptionClass != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   204
        jConstructor = (*env)->GetMethodID(env, jPKCS11ExceptionClass, "<init>", "(J)V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   205
        assert(jConstructor != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   206
        jErrorCode = ckULongToJLong(returnValue);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   207
        jPKCS11Exception = (jthrowable) (*env)->NewObject(env, jPKCS11ExceptionClass, jConstructor, jErrorCode);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   208
        (*env)->Throw(env, jPKCS11Exception);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   209
        return jErrorCode ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   210
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   211
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   212
90ce3da70b43 Initial load
duke
parents:
diff changeset
   213
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   214
 * this function simply throws a FileNotFoundException
90ce3da70b43 Initial load
duke
parents:
diff changeset
   215
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   216
 * @param env Used to call JNI funktions and to get the Exception class.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   217
 * @param jmessage The message string of the Exception object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   218
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   219
void throwFileNotFoundException(JNIEnv *env, jstring jmessage)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   220
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   221
    jclass jFileNotFoundExceptionClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   222
    jmethodID jConstructor;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   223
    jthrowable jFileNotFoundException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   224
90ce3da70b43 Initial load
duke
parents:
diff changeset
   225
    jFileNotFoundExceptionClass = (*env)->FindClass(env, CLASS_FILE_NOT_FOUND_EXCEPTION);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   226
    assert(jFileNotFoundExceptionClass != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   227
90ce3da70b43 Initial load
duke
parents:
diff changeset
   228
    jConstructor = (*env)->GetMethodID(env, jFileNotFoundExceptionClass, "<init>", "(Ljava/lang/String;)V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   229
    assert(jConstructor != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   230
    jFileNotFoundException = (jthrowable) (*env)->NewObject(env, jFileNotFoundExceptionClass, jConstructor, jmessage);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   231
    (*env)->Throw(env, jFileNotFoundException);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   232
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   233
90ce3da70b43 Initial load
duke
parents:
diff changeset
   234
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   235
 * this function simply throws an IOException
90ce3da70b43 Initial load
duke
parents:
diff changeset
   236
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   237
 * @param env Used to call JNI funktions and to get the Exception class.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   238
 * @param message The message string of the Exception object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   239
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   240
void throwIOException(JNIEnv *env, const char * message)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   241
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   242
    jclass jIOExceptionClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   243
90ce3da70b43 Initial load
duke
parents:
diff changeset
   244
    jIOExceptionClass = (*env)->FindClass(env, CLASS_IO_EXCEPTION);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   245
    assert(jIOExceptionClass != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   246
90ce3da70b43 Initial load
duke
parents:
diff changeset
   247
    (*env)->ThrowNew(env, jIOExceptionClass, message);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   248
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   249
90ce3da70b43 Initial load
duke
parents:
diff changeset
   250
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   251
 * this function simply throws an IOException and takes a unicode
90ce3da70b43 Initial load
duke
parents:
diff changeset
   252
 * messge.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   253
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   254
 * @param env Used to call JNI funktions and to get the Exception class.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   255
 * @param message The unicode message string of the Exception object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   256
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   257
void throwIOExceptionUnicodeMessage(JNIEnv *env, const short *message)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   258
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   259
    jclass jIOExceptionClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   260
    jmethodID jConstructor;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   261
    jthrowable jIOException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   262
    jstring jmessage;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   263
    jsize length;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   264
    short *currentCharacter;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   265
90ce3da70b43 Initial load
duke
parents:
diff changeset
   266
    jIOExceptionClass = (*env)->FindClass(env, CLASS_IO_EXCEPTION);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   267
    assert(jIOExceptionClass != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   268
90ce3da70b43 Initial load
duke
parents:
diff changeset
   269
    length = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   270
    if (message != NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   271
        currentCharacter = (short *) message;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   272
        while (*(currentCharacter++) != 0) length++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   273
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   274
90ce3da70b43 Initial load
duke
parents:
diff changeset
   275
    jmessage = (*env)->NewString(env, (const jchar *)message, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   276
90ce3da70b43 Initial load
duke
parents:
diff changeset
   277
    jConstructor = (*env)->GetMethodID(env, jIOExceptionClass, "<init>", "(Ljava/lang/String;)V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   278
    assert(jConstructor != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   279
    jIOException = (jthrowable) (*env)->NewObject(env, jIOExceptionClass, jConstructor, jmessage);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   280
    (*env)->Throw(env, jIOException);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   281
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   282
90ce3da70b43 Initial load
duke
parents:
diff changeset
   283
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
 * This function simply throws a PKCS#11RuntimeException with the given
90ce3da70b43 Initial load
duke
parents:
diff changeset
   285
 * string as its message. If the message is NULL, the exception is created
90ce3da70b43 Initial load
duke
parents:
diff changeset
   286
 * using the default constructor.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   287
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   288
 * @param env Used to call JNI funktions and to get the Exception class.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   289
 * @param jmessage The message string of the Exception object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   290
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   291
void throwPKCS11RuntimeException(JNIEnv *env, jstring jmessage)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   292
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   293
    jclass jPKCS11RuntimeExceptionClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   294
    jmethodID jConstructor;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   295
    jthrowable jPKCS11RuntimeException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   296
90ce3da70b43 Initial load
duke
parents:
diff changeset
   297
    jPKCS11RuntimeExceptionClass = (*env)->FindClass(env, CLASS_PKCS11RUNTIMEEXCEPTION);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   298
    assert(jPKCS11RuntimeExceptionClass != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   299
90ce3da70b43 Initial load
duke
parents:
diff changeset
   300
    if (jmessage == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   301
        jConstructor = (*env)->GetMethodID(env, jPKCS11RuntimeExceptionClass, "<init>", "()V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   302
        assert(jConstructor != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   303
        jPKCS11RuntimeException = (jthrowable) (*env)->NewObject(env, jPKCS11RuntimeExceptionClass, jConstructor);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   304
        (*env)->Throw(env, jPKCS11RuntimeException);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   305
    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   306
        jConstructor = (*env)->GetMethodID(env, jPKCS11RuntimeExceptionClass, "<init>", "(Ljava/lang/String;)V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   307
        assert(jConstructor != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   308
        jPKCS11RuntimeException = (jthrowable) (*env)->NewObject(env, jPKCS11RuntimeExceptionClass, jConstructor, jmessage);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   309
        (*env)->Throw(env, jPKCS11RuntimeException);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   310
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   311
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   312
90ce3da70b43 Initial load
duke
parents:
diff changeset
   313
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   314
 * This function simply throws a PKCS#11RuntimeException. The message says that
90ce3da70b43 Initial load
duke
parents:
diff changeset
   315
 * the object is not connected to the module.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   316
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   317
 * @param env Used to call JNI funktions and to get the Exception class.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   318
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   319
void throwDisconnectedRuntimeException(JNIEnv *env)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   320
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   321
    jstring jExceptionMessage = (*env)->NewStringUTF(env, "This object is not connected to a module.");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   322
90ce3da70b43 Initial load
duke
parents:
diff changeset
   323
    throwPKCS11RuntimeException(env, jExceptionMessage);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   324
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   325
90ce3da70b43 Initial load
duke
parents:
diff changeset
   326
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   327
 * the following functions convert Java arrays to PKCS#11 array pointers and
90ce3da70b43 Initial load
duke
parents:
diff changeset
   328
 * their array length and vice versa
90ce3da70b43 Initial load
duke
parents:
diff changeset
   329
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   330
 * void j<Type>ArrayToCK<Type>Array(JNIEnv *env,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   331
 *                                  const j<Type>Array jArray,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   332
 *                                  CK_<Type>_PTR *ckpArray,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   333
 *                                  CK_ULONG_PTR ckLength);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   334
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   335
 * j<Type>Array ck<Type>ArrayToJ<Type>Array(JNIEnv *env,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   336
 *                                          const CK_<Type>_PTR ckpArray,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   337
 *                                          CK_ULONG ckLength);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   338
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   339
 * PKCS#11 arrays consist always of a pointer to the beginning of the array and
90ce3da70b43 Initial load
duke
parents:
diff changeset
   340
 * the array length whereas Java arrays carry their array length.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   341
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   342
 * The Functions to convert a Java array to a PKCS#11 array are void functions.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   343
 * Their arguments are the Java array object to convert, the reference to the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   344
 * array pointer, where the new PKCS#11 array should be stored and the reference
90ce3da70b43 Initial load
duke
parents:
diff changeset
   345
 * to the array length where the PKCS#11 array length should be stored. These two
90ce3da70b43 Initial load
duke
parents:
diff changeset
   346
 * references must not be NULL_PTR.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   347
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   348
 * The functions first obtain the array length of the Java array and then allocate
90ce3da70b43 Initial load
duke
parents:
diff changeset
   349
 * the memory for the PKCS#11 array and set the array length. Then each element
90ce3da70b43 Initial load
duke
parents:
diff changeset
   350
 * gets converted depending on their type. After use the allocated memory of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   351
 * PKCS#11 array has to be explicitly freed.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   352
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   353
 * The Functions to convert a PKCS#11 array to a Java array get the PKCS#11 array
90ce3da70b43 Initial load
duke
parents:
diff changeset
   354
 * pointer and the array length and they return the new Java array object. The
90ce3da70b43 Initial load
duke
parents:
diff changeset
   355
 * Java array does not need to get freed after use.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   356
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   357
90ce3da70b43 Initial load
duke
parents:
diff changeset
   358
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   359
 * converts a jbooleanArray to a CK_BBOOL array. The allocated memory has to be freed after use!
90ce3da70b43 Initial load
duke
parents:
diff changeset
   360
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   361
 * @param env - used to call JNI funktions to get the array informtaion
90ce3da70b43 Initial load
duke
parents:
diff changeset
   362
 * @param jArray - the Java array to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   363
 * @param ckpArray - the reference, where the pointer to the new CK_BBOOL array will be stored
90ce3da70b43 Initial load
duke
parents:
diff changeset
   364
 * @param ckpLength - the reference, where the array length will be stored
90ce3da70b43 Initial load
duke
parents:
diff changeset
   365
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   366
void jBooleanArrayToCKBBoolArray(JNIEnv *env, const jbooleanArray jArray, CK_BBOOL **ckpArray, CK_ULONG_PTR ckpLength)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   367
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   368
    jboolean* jpTemp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   369
    CK_ULONG i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   370
90ce3da70b43 Initial load
duke
parents:
diff changeset
   371
    if(jArray == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   372
        *ckpArray = NULL_PTR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   373
        *ckpLength = 0L;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   374
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   375
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   376
    *ckpLength = (*env)->GetArrayLength(env, jArray);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   377
    jpTemp = (jboolean*) malloc((*ckpLength) * sizeof(jboolean));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   378
    (*env)->GetBooleanArrayRegion(env, jArray, 0, *ckpLength, jpTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   379
    *ckpArray = (CK_BBOOL*) malloc ((*ckpLength) * sizeof(CK_BBOOL));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   380
    for (i=0; i<(*ckpLength); i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   381
        (*ckpArray)[i] = jBooleanToCKBBool(jpTemp[i]);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   382
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   383
    free(jpTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   384
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   385
90ce3da70b43 Initial load
duke
parents:
diff changeset
   386
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   387
 * converts a jbyteArray to a CK_BYTE array. The allocated memory has to be freed after use!
90ce3da70b43 Initial load
duke
parents:
diff changeset
   388
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   389
 * @param env - used to call JNI funktions to get the array informtaion
90ce3da70b43 Initial load
duke
parents:
diff changeset
   390
 * @param jArray - the Java array to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   391
 * @param ckpArray - the reference, where the pointer to the new CK_BYTE array will be stored
90ce3da70b43 Initial load
duke
parents:
diff changeset
   392
 * @param ckpLength - the reference, where the array length will be stored
90ce3da70b43 Initial load
duke
parents:
diff changeset
   393
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   394
void jByteArrayToCKByteArray(JNIEnv *env, const jbyteArray jArray, CK_BYTE_PTR *ckpArray, CK_ULONG_PTR ckpLength)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   395
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   396
    jbyte* jpTemp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   397
    CK_ULONG i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   398
90ce3da70b43 Initial load
duke
parents:
diff changeset
   399
    if(jArray == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   400
        *ckpArray = NULL_PTR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   401
        *ckpLength = 0L;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   402
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   403
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   404
    *ckpLength = (*env)->GetArrayLength(env, jArray);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   405
    jpTemp = (jbyte*) malloc((*ckpLength) * sizeof(jbyte));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   406
    (*env)->GetByteArrayRegion(env, jArray, 0, *ckpLength, jpTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   407
90ce3da70b43 Initial load
duke
parents:
diff changeset
   408
    /* if CK_BYTE is the same size as jbyte, we save an additional copy */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   409
    if (sizeof(CK_BYTE) == sizeof(jbyte)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   410
        *ckpArray = (CK_BYTE_PTR) jpTemp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   411
    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   412
        *ckpArray = (CK_BYTE_PTR) malloc ((*ckpLength) * sizeof(CK_BYTE));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   413
        for (i=0; i<(*ckpLength); i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   414
            (*ckpArray)[i] = jByteToCKByte(jpTemp[i]);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   415
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   416
        free(jpTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   417
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   418
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   419
90ce3da70b43 Initial load
duke
parents:
diff changeset
   420
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   421
 * converts a jlongArray to a CK_ULONG array. The allocated memory has to be freed after use!
90ce3da70b43 Initial load
duke
parents:
diff changeset
   422
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   423
 * @param env - used to call JNI funktions to get the array informtaion
90ce3da70b43 Initial load
duke
parents:
diff changeset
   424
 * @param jArray - the Java array to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   425
 * @param ckpArray - the reference, where the pointer to the new CK_ULONG array will be stored
90ce3da70b43 Initial load
duke
parents:
diff changeset
   426
 * @param ckpLength - the reference, where the array length will be stored
90ce3da70b43 Initial load
duke
parents:
diff changeset
   427
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   428
void jLongArrayToCKULongArray(JNIEnv *env, const jlongArray jArray, CK_ULONG_PTR *ckpArray, CK_ULONG_PTR ckpLength)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   429
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   430
    jlong* jTemp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   431
    CK_ULONG i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   432
90ce3da70b43 Initial load
duke
parents:
diff changeset
   433
    if(jArray == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   434
        *ckpArray = NULL_PTR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   435
        *ckpLength = 0L;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   436
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   437
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   438
    *ckpLength = (*env)->GetArrayLength(env, jArray);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   439
    jTemp = (jlong*) malloc((*ckpLength) * sizeof(jlong));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   440
    (*env)->GetLongArrayRegion(env, jArray, 0, *ckpLength, jTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   441
    *ckpArray = (CK_ULONG_PTR) malloc (*ckpLength * sizeof(CK_ULONG));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   442
    for (i=0; i<(*ckpLength); i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   443
        (*ckpArray)[i] = jLongToCKULong(jTemp[i]);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   444
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   445
    free(jTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   446
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   447
90ce3da70b43 Initial load
duke
parents:
diff changeset
   448
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   449
 * converts a jcharArray to a CK_CHAR array. The allocated memory has to be freed after use!
90ce3da70b43 Initial load
duke
parents:
diff changeset
   450
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   451
 * @param env - used to call JNI funktions to get the array informtaion
90ce3da70b43 Initial load
duke
parents:
diff changeset
   452
 * @param jArray - the Java array to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   453
 * @param ckpArray - the reference, where the pointer to the new CK_CHAR array will be stored
90ce3da70b43 Initial load
duke
parents:
diff changeset
   454
 * @param ckpLength - the reference, where the array length will be stored
90ce3da70b43 Initial load
duke
parents:
diff changeset
   455
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   456
void jCharArrayToCKCharArray(JNIEnv *env, const jcharArray jArray, CK_CHAR_PTR *ckpArray, CK_ULONG_PTR ckpLength)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   457
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   458
    jchar* jpTemp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   459
    CK_ULONG i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   460
90ce3da70b43 Initial load
duke
parents:
diff changeset
   461
    if(jArray == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   462
        *ckpArray = NULL_PTR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   463
        *ckpLength = 0L;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   464
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   465
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   466
    *ckpLength = (*env)->GetArrayLength(env, jArray);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   467
    jpTemp = (jchar*) malloc((*ckpLength) * sizeof(jchar));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   468
    (*env)->GetCharArrayRegion(env, jArray, 0, *ckpLength, jpTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   469
    *ckpArray = (CK_CHAR_PTR) malloc (*ckpLength * sizeof(CK_CHAR));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   470
    for (i=0; i<(*ckpLength); i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   471
        (*ckpArray)[i] = jCharToCKChar(jpTemp[i]);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   472
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   473
    free(jpTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   474
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   475
90ce3da70b43 Initial load
duke
parents:
diff changeset
   476
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   477
 * converts a jcharArray to a CK_UTF8CHAR array. The allocated memory has to be freed after use!
90ce3da70b43 Initial load
duke
parents:
diff changeset
   478
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   479
 * @param env - used to call JNI funktions to get the array informtaion
90ce3da70b43 Initial load
duke
parents:
diff changeset
   480
 * @param jArray - the Java array to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   481
 * @param ckpArray - the reference, where the pointer to the new CK_UTF8CHAR array will be stored
90ce3da70b43 Initial load
duke
parents:
diff changeset
   482
 * @param ckpLength - the reference, where the array length will be stored
90ce3da70b43 Initial load
duke
parents:
diff changeset
   483
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   484
void jCharArrayToCKUTF8CharArray(JNIEnv *env, const jcharArray jArray, CK_UTF8CHAR_PTR *ckpArray, CK_ULONG_PTR ckpLength)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   485
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   486
    jchar* jTemp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   487
    CK_ULONG i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   488
90ce3da70b43 Initial load
duke
parents:
diff changeset
   489
    if(jArray == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   490
        *ckpArray = NULL_PTR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   491
        *ckpLength = 0L;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   492
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   493
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   494
    *ckpLength = (*env)->GetArrayLength(env, jArray);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   495
    jTemp = (jchar*) malloc((*ckpLength) * sizeof(jchar));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   496
    (*env)->GetCharArrayRegion(env, jArray, 0, *ckpLength, jTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   497
    *ckpArray = (CK_UTF8CHAR_PTR) malloc (*ckpLength * sizeof(CK_UTF8CHAR));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   498
    for (i=0; i<(*ckpLength); i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   499
        (*ckpArray)[i] = jCharToCKUTF8Char(jTemp[i]);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   500
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   501
    free(jTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   502
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   503
90ce3da70b43 Initial load
duke
parents:
diff changeset
   504
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   505
 * converts a jstring to a CK_CHAR array. The allocated memory has to be freed after use!
90ce3da70b43 Initial load
duke
parents:
diff changeset
   506
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   507
 * @param env - used to call JNI funktions to get the array informtaion
90ce3da70b43 Initial load
duke
parents:
diff changeset
   508
 * @param jArray - the Java array to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   509
 * @param ckpArray - the reference, where the pointer to the new CK_CHAR array will be stored
90ce3da70b43 Initial load
duke
parents:
diff changeset
   510
 * @param ckpLength - the reference, where the array length will be stored
90ce3da70b43 Initial load
duke
parents:
diff changeset
   511
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   512
void jStringToCKUTF8CharArray(JNIEnv *env, const jstring jArray, CK_UTF8CHAR_PTR *ckpArray, CK_ULONG_PTR ckpLength)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   513
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   514
    const char* pCharArray;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   515
    jboolean isCopy;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   516
90ce3da70b43 Initial load
duke
parents:
diff changeset
   517
    if(jArray == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   518
        *ckpArray = NULL_PTR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   519
        *ckpLength = 0L;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   520
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   521
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   522
90ce3da70b43 Initial load
duke
parents:
diff changeset
   523
    pCharArray = (*env)->GetStringUTFChars(env, jArray, &isCopy);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   524
    *ckpLength = strlen(pCharArray);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   525
    *ckpArray = (CK_UTF8CHAR_PTR) malloc((*ckpLength + 1) * sizeof(CK_UTF8CHAR));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   526
    strcpy((char*)*ckpArray, pCharArray);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   527
    (*env)->ReleaseStringUTFChars(env, (jstring) jArray, pCharArray);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   528
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   529
90ce3da70b43 Initial load
duke
parents:
diff changeset
   530
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   531
 * converts a jobjectArray with Java Attributes to a CK_ATTRIBUTE array. The allocated memory
90ce3da70b43 Initial load
duke
parents:
diff changeset
   532
 * has to be freed after use!
90ce3da70b43 Initial load
duke
parents:
diff changeset
   533
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   534
 * @param env - used to call JNI funktions to get the array informtaion
90ce3da70b43 Initial load
duke
parents:
diff changeset
   535
 * @param jArray - the Java Attribute array (template) to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   536
 * @param ckpArray - the reference, where the pointer to the new CK_ATTRIBUTE array will be
90ce3da70b43 Initial load
duke
parents:
diff changeset
   537
 *                   stored
90ce3da70b43 Initial load
duke
parents:
diff changeset
   538
 * @param ckpLength - the reference, where the array length will be stored
90ce3da70b43 Initial load
duke
parents:
diff changeset
   539
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   540
void jAttributeArrayToCKAttributeArray(JNIEnv *env, jobjectArray jArray, CK_ATTRIBUTE_PTR *ckpArray, CK_ULONG_PTR ckpLength)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   541
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   542
    CK_ULONG i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   543
    jlong jLength;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   544
    jobject jAttribute;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   545
90ce3da70b43 Initial load
duke
parents:
diff changeset
   546
    TRACE0("\nDEBUG: jAttributeArrayToCKAttributeArray");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   547
    if (jArray == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   548
        *ckpArray = NULL_PTR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   549
        *ckpLength = 0L;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   550
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   551
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   552
    jLength = (*env)->GetArrayLength(env, jArray);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   553
    *ckpLength = jLongToCKULong(jLength);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   554
    *ckpArray = (CK_ATTRIBUTE_PTR) malloc(*ckpLength * sizeof(CK_ATTRIBUTE));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   555
    TRACE1(", converting %d attibutes", jLength);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   556
    for (i=0; i<(*ckpLength); i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   557
        TRACE1(", getting %d. attibute", i);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   558
        jAttribute = (*env)->GetObjectArrayElement(env, jArray, i);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   559
        TRACE1(", jAttribute = %d", jAttribute);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   560
        TRACE1(", converting %d. attibute", i);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   561
        (*ckpArray)[i] = jAttributeToCKAttribute(env, jAttribute);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   562
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   563
    TRACE0("FINISHED\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   564
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   565
90ce3da70b43 Initial load
duke
parents:
diff changeset
   566
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   567
 * converts a jobjectArray to a CK_VOID_PTR array. The allocated memory has to be freed after
90ce3da70b43 Initial load
duke
parents:
diff changeset
   568
 * use!
90ce3da70b43 Initial load
duke
parents:
diff changeset
   569
 * NOTE: this function does not work and is not used yet
90ce3da70b43 Initial load
duke
parents:
diff changeset
   570
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   571
 * @param env - used to call JNI funktions to get the array informtaion
90ce3da70b43 Initial load
duke
parents:
diff changeset
   572
 * @param jArray - the Java object array to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   573
 * @param ckpArray - the reference, where the pointer to the new CK_VOID_PTR array will be stored
90ce3da70b43 Initial load
duke
parents:
diff changeset
   574
 * @param ckpLength - the reference, where the array length will be stored
90ce3da70b43 Initial load
duke
parents:
diff changeset
   575
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   576
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   577
void jObjectArrayToCKVoidPtrArray(JNIEnv *env, const jobjectArray jArray, CK_VOID_PTR_PTR *ckpArray, CK_ULONG_PTR ckpLength)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   578
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   579
    jobject jTemp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   580
    CK_ULONG i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   581
90ce3da70b43 Initial load
duke
parents:
diff changeset
   582
    if(jArray == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   583
        *ckpArray = NULL_PTR;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   584
        *ckpLength = 0L;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   585
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   586
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   587
    *ckpLength = (*env)->GetArrayLength(env, jArray);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   588
    *ckpArray = (CK_VOID_PTR_PTR) malloc (*ckpLength * sizeof(CK_VOID_PTR));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   589
    for (i=0; i<(*ckpLength); i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   590
        jTemp = (*env)->GetObjectArrayElement(env, jArray, i);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   591
        (*ckpArray)[i] = jObjectToCKVoidPtr(jTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   592
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   593
    free(jTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   594
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   595
*/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   596
90ce3da70b43 Initial load
duke
parents:
diff changeset
   597
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   598
 * converts a CK_BYTE array and its length to a jbyteArray.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   599
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   600
 * @param env - used to call JNI funktions to create the new Java array
90ce3da70b43 Initial load
duke
parents:
diff changeset
   601
 * @param ckpArray - the pointer to the CK_BYTE array to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   602
 * @param ckpLength - the length of the array to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   603
 * @return - the new Java byte array
90ce3da70b43 Initial load
duke
parents:
diff changeset
   604
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   605
jbyteArray ckByteArrayToJByteArray(JNIEnv *env, const CK_BYTE_PTR ckpArray, CK_ULONG ckLength)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   606
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   607
    CK_ULONG i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   608
    jbyte* jpTemp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   609
    jbyteArray jArray;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   610
90ce3da70b43 Initial load
duke
parents:
diff changeset
   611
    /* if CK_BYTE is the same size as jbyte, we save an additional copy */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   612
    if (sizeof(CK_BYTE) == sizeof(jbyte)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   613
        jpTemp = (jbyte*) ckpArray;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   614
    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   615
        jpTemp = (jbyte*) malloc((ckLength) * sizeof(jbyte));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   616
        for (i=0; i<ckLength; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   617
            jpTemp[i] = ckByteToJByte(ckpArray[i]);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   618
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   619
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   620
90ce3da70b43 Initial load
duke
parents:
diff changeset
   621
    jArray = (*env)->NewByteArray(env, ckULongToJSize(ckLength));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   622
    (*env)->SetByteArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   623
90ce3da70b43 Initial load
duke
parents:
diff changeset
   624
    if (sizeof(CK_BYTE) != sizeof(jbyte)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   625
        free(jpTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   626
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   627
90ce3da70b43 Initial load
duke
parents:
diff changeset
   628
    return jArray ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   629
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   630
90ce3da70b43 Initial load
duke
parents:
diff changeset
   631
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   632
 * converts a CK_ULONG array and its length to a jlongArray.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   633
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   634
 * @param env - used to call JNI funktions to create the new Java array
90ce3da70b43 Initial load
duke
parents:
diff changeset
   635
 * @param ckpArray - the pointer to the CK_ULONG array to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   636
 * @param ckpLength - the length of the array to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   637
 * @return - the new Java long array
90ce3da70b43 Initial load
duke
parents:
diff changeset
   638
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   639
jlongArray ckULongArrayToJLongArray(JNIEnv *env, const CK_ULONG_PTR ckpArray, CK_ULONG ckLength)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   640
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   641
    CK_ULONG i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   642
    jlong* jpTemp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   643
    jlongArray jArray;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   644
90ce3da70b43 Initial load
duke
parents:
diff changeset
   645
    jpTemp = (jlong*) malloc((ckLength) * sizeof(jlong));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   646
    for (i=0; i<ckLength; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   647
        jpTemp[i] = ckLongToJLong(ckpArray[i]);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   648
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   649
    jArray = (*env)->NewLongArray(env, ckULongToJSize(ckLength));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   650
    (*env)->SetLongArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   651
    free(jpTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   652
90ce3da70b43 Initial load
duke
parents:
diff changeset
   653
    return jArray ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   654
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   655
90ce3da70b43 Initial load
duke
parents:
diff changeset
   656
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   657
 * converts a CK_CHAR array and its length to a jcharArray.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   658
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   659
 * @param env - used to call JNI funktions to create the new Java array
90ce3da70b43 Initial load
duke
parents:
diff changeset
   660
 * @param ckpArray - the pointer to the CK_CHAR array to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   661
 * @param ckpLength - the length of the array to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   662
 * @return - the new Java char array
90ce3da70b43 Initial load
duke
parents:
diff changeset
   663
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   664
jcharArray ckCharArrayToJCharArray(JNIEnv *env, const CK_CHAR_PTR ckpArray, CK_ULONG ckLength)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   665
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   666
    CK_ULONG i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   667
    jchar* jpTemp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   668
    jcharArray jArray;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   669
90ce3da70b43 Initial load
duke
parents:
diff changeset
   670
    jpTemp = (jchar*) malloc(ckLength * sizeof(jchar));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   671
    for (i=0; i<ckLength; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   672
        jpTemp[i] = ckCharToJChar(ckpArray[i]);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   673
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   674
    jArray = (*env)->NewCharArray(env, ckULongToJSize(ckLength));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   675
    (*env)->SetCharArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   676
    free(jpTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   677
90ce3da70b43 Initial load
duke
parents:
diff changeset
   678
    return jArray ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   679
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   680
90ce3da70b43 Initial load
duke
parents:
diff changeset
   681
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   682
 * converts a CK_UTF8CHAR array and its length to a jcharArray.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   683
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   684
 * @param env - used to call JNI funktions to create the new Java array
90ce3da70b43 Initial load
duke
parents:
diff changeset
   685
 * @param ckpArray - the pointer to the CK_UTF8CHAR array to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   686
 * @param ckpLength - the length of the array to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   687
 * @return - the new Java char array
90ce3da70b43 Initial load
duke
parents:
diff changeset
   688
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   689
jcharArray ckUTF8CharArrayToJCharArray(JNIEnv *env, const CK_UTF8CHAR_PTR ckpArray, CK_ULONG ckLength)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   690
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   691
    CK_ULONG i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   692
    jchar* jpTemp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   693
    jcharArray jArray;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   694
90ce3da70b43 Initial load
duke
parents:
diff changeset
   695
    jpTemp = (jchar*) malloc(ckLength * sizeof(jchar));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   696
    for (i=0; i<ckLength; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   697
        jpTemp[i] = ckUTF8CharToJChar(ckpArray[i]);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   698
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   699
    jArray = (*env)->NewCharArray(env, ckULongToJSize(ckLength));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   700
    (*env)->SetCharArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   701
    free(jpTemp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   702
90ce3da70b43 Initial load
duke
parents:
diff changeset
   703
    return jArray ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   704
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   705
90ce3da70b43 Initial load
duke
parents:
diff changeset
   706
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   707
 * the following functions convert Java objects to PKCS#11 pointers and the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   708
 * length in bytes and vice versa
90ce3da70b43 Initial load
duke
parents:
diff changeset
   709
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   710
 * CK_<Type>_PTR j<Object>ToCK<Type>Ptr(JNIEnv *env, jobject jObject);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   711
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   712
 * jobject ck<Type>PtrToJ<Object>(JNIEnv *env, const CK_<Type>_PTR ckpValue);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   713
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   714
 * The functions that convert a Java object to a PKCS#11 pointer first allocate
90ce3da70b43 Initial load
duke
parents:
diff changeset
   715
 * the memory for the PKCS#11 pointer. Then they set each element corresponding
90ce3da70b43 Initial load
duke
parents:
diff changeset
   716
 * to the fields in the Java object to convert. After use the allocated memory of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   717
 * the PKCS#11 pointer has to be explicitly freed.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   718
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   719
 * The functions to convert a PKCS#11 pointer to a Java object create a new Java
90ce3da70b43 Initial load
duke
parents:
diff changeset
   720
 * object first and than they set all fields in the object depending on the values
90ce3da70b43 Initial load
duke
parents:
diff changeset
   721
 * of the type or structure where the PKCS#11 pointer points to.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   722
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   723
90ce3da70b43 Initial load
duke
parents:
diff changeset
   724
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   725
 * converts a CK_BBOOL pointer to a Java boolean Object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   726
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   727
 * @param env - used to call JNI funktions to create the new Java object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   728
 * @param ckpValue - the pointer to the CK_BBOOL value
90ce3da70b43 Initial load
duke
parents:
diff changeset
   729
 * @return - the new Java boolean object with the boolean value
90ce3da70b43 Initial load
duke
parents:
diff changeset
   730
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   731
jobject ckBBoolPtrToJBooleanObject(JNIEnv *env, const CK_BBOOL *ckpValue)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   732
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   733
    jclass jValueObjectClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   734
    jmethodID jConstructor;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   735
    jobject jValueObject;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   736
    jboolean jValue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   737
90ce3da70b43 Initial load
duke
parents:
diff changeset
   738
    jValueObjectClass = (*env)->FindClass(env, "java/lang/Boolean");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   739
    assert(jValueObjectClass != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   740
    jConstructor = (*env)->GetMethodID(env, jValueObjectClass, "<init>", "(Z)V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   741
    assert(jConstructor != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   742
    jValue = ckBBoolToJBoolean(*ckpValue);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   743
    jValueObject = (*env)->NewObject(env, jValueObjectClass, jConstructor, jValue);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   744
    assert(jValueObject != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   745
90ce3da70b43 Initial load
duke
parents:
diff changeset
   746
    return jValueObject ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   747
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   748
90ce3da70b43 Initial load
duke
parents:
diff changeset
   749
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   750
 * converts a CK_ULONG pointer to a Java long Object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   751
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   752
 * @param env - used to call JNI funktions to create the new Java object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   753
 * @param ckpValue - the pointer to the CK_ULONG value
90ce3da70b43 Initial load
duke
parents:
diff changeset
   754
 * @return - the new Java long object with the long value
90ce3da70b43 Initial load
duke
parents:
diff changeset
   755
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   756
jobject ckULongPtrToJLongObject(JNIEnv *env, const CK_ULONG_PTR ckpValue)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   757
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   758
    jclass jValueObjectClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   759
    jmethodID jConstructor;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   760
    jobject jValueObject;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   761
    jlong jValue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   762
90ce3da70b43 Initial load
duke
parents:
diff changeset
   763
    jValueObjectClass = (*env)->FindClass(env, "java/lang/Long");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   764
    assert(jValueObjectClass != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   765
    jConstructor = (*env)->GetMethodID(env, jValueObjectClass, "<init>", "(J)V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   766
    assert(jConstructor != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   767
    jValue = ckULongToJLong(*ckpValue);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   768
    jValueObject = (*env)->NewObject(env, jValueObjectClass, jConstructor, jValue);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   769
    assert(jValueObject != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   770
90ce3da70b43 Initial load
duke
parents:
diff changeset
   771
    return jValueObject ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   772
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   773
90ce3da70b43 Initial load
duke
parents:
diff changeset
   774
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   775
 * converts a Java boolean object into a pointer to a CK_BBOOL value. The memory has to be
90ce3da70b43 Initial load
duke
parents:
diff changeset
   776
 * freed after use!
90ce3da70b43 Initial load
duke
parents:
diff changeset
   777
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   778
 * @param env - used to call JNI funktions to get the value out of the Java object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   779
 * @param jObject - the "java/lang/Boolean" object to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   780
 * @return - the pointer to the new CK_BBOOL value
90ce3da70b43 Initial load
duke
parents:
diff changeset
   781
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   782
CK_BBOOL* jBooleanObjectToCKBBoolPtr(JNIEnv *env, jobject jObject)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   783
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   784
    jclass jObjectClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   785
    jmethodID jValueMethod;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   786
    jboolean jValue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   787
    CK_BBOOL *ckpValue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   788
90ce3da70b43 Initial load
duke
parents:
diff changeset
   789
    jObjectClass = (*env)->FindClass(env, "java/lang/Boolean");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   790
    assert(jObjectClass != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   791
    jValueMethod = (*env)->GetMethodID(env, jObjectClass, "booleanValue", "()Z");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   792
    assert(jValueMethod != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   793
    jValue = (*env)->CallBooleanMethod(env, jObject, jValueMethod);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   794
    ckpValue = (CK_BBOOL *) malloc(sizeof(CK_BBOOL));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   795
    *ckpValue = jBooleanToCKBBool(jValue);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   796
90ce3da70b43 Initial load
duke
parents:
diff changeset
   797
    return ckpValue ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   798
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   799
90ce3da70b43 Initial load
duke
parents:
diff changeset
   800
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   801
 * converts a Java byte object into a pointer to a CK_BYTE value. The memory has to be
90ce3da70b43 Initial load
duke
parents:
diff changeset
   802
 * freed after use!
90ce3da70b43 Initial load
duke
parents:
diff changeset
   803
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   804
 * @param env - used to call JNI funktions to get the value out of the Java object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   805
 * @param jObject - the "java/lang/Byte" object to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   806
 * @return - the pointer to the new CK_BYTE value
90ce3da70b43 Initial load
duke
parents:
diff changeset
   807
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   808
CK_BYTE_PTR jByteObjectToCKBytePtr(JNIEnv *env, jobject jObject)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   809
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   810
    jclass jObjectClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   811
    jmethodID jValueMethod;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   812
    jbyte jValue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   813
    CK_BYTE_PTR ckpValue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   814
90ce3da70b43 Initial load
duke
parents:
diff changeset
   815
    jObjectClass = (*env)->FindClass(env, "java/lang/Byte");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   816
    assert(jObjectClass != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   817
    jValueMethod = (*env)->GetMethodID(env, jObjectClass, "byteValue", "()B");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   818
    assert(jValueMethod != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   819
    jValue = (*env)->CallByteMethod(env, jObject, jValueMethod);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   820
    ckpValue = (CK_BYTE_PTR) malloc(sizeof(CK_BYTE));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   821
    *ckpValue = jByteToCKByte(jValue);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   822
90ce3da70b43 Initial load
duke
parents:
diff changeset
   823
    return ckpValue ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   824
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   825
90ce3da70b43 Initial load
duke
parents:
diff changeset
   826
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   827
 * converts a Java integer object into a pointer to a CK_ULONG value. The memory has to be
90ce3da70b43 Initial load
duke
parents:
diff changeset
   828
 * freed after use!
90ce3da70b43 Initial load
duke
parents:
diff changeset
   829
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   830
 * @param env - used to call JNI funktions to get the value out of the Java object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   831
 * @param jObject - the "java/lang/Integer" object to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   832
 * @return - the pointer to the new CK_ULONG value
90ce3da70b43 Initial load
duke
parents:
diff changeset
   833
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   834
CK_ULONG* jIntegerObjectToCKULongPtr(JNIEnv *env, jobject jObject)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   835
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   836
    jclass jObjectClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   837
    jmethodID jValueMethod;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   838
    jint jValue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   839
    CK_ULONG *ckpValue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   840
90ce3da70b43 Initial load
duke
parents:
diff changeset
   841
    jObjectClass = (*env)->FindClass(env, "java/lang/Integer");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   842
    assert(jObjectClass != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   843
    jValueMethod = (*env)->GetMethodID(env, jObjectClass, "intValue", "()I");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   844
    assert(jValueMethod != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   845
    jValue = (*env)->CallIntMethod(env, jObject, jValueMethod);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   846
    ckpValue = (CK_ULONG *) malloc(sizeof(CK_ULONG));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   847
    *ckpValue = jLongToCKLong(jValue);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   848
90ce3da70b43 Initial load
duke
parents:
diff changeset
   849
    return ckpValue ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   850
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   851
90ce3da70b43 Initial load
duke
parents:
diff changeset
   852
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   853
 * converts a Java long object into a pointer to a CK_ULONG value. The memory has to be
90ce3da70b43 Initial load
duke
parents:
diff changeset
   854
 * freed after use!
90ce3da70b43 Initial load
duke
parents:
diff changeset
   855
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   856
 * @param env - used to call JNI funktions to get the value out of the Java object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   857
 * @param jObject - the "java/lang/Long" object to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   858
 * @return - the pointer to the new CK_ULONG value
90ce3da70b43 Initial load
duke
parents:
diff changeset
   859
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   860
CK_ULONG* jLongObjectToCKULongPtr(JNIEnv *env, jobject jObject)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   861
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   862
    jclass jObjectClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   863
    jmethodID jValueMethod;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   864
    jlong jValue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   865
    CK_ULONG *ckpValue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   866
90ce3da70b43 Initial load
duke
parents:
diff changeset
   867
    jObjectClass = (*env)->FindClass(env, "java/lang/Long");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   868
    assert(jObjectClass != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   869
    jValueMethod = (*env)->GetMethodID(env, jObjectClass, "longValue", "()J");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   870
    assert(jValueMethod != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   871
    jValue = (*env)->CallLongMethod(env, jObject, jValueMethod);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   872
    ckpValue = (CK_ULONG *) malloc(sizeof(CK_ULONG));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   873
    *ckpValue = jLongToCKULong(jValue);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   874
90ce3da70b43 Initial load
duke
parents:
diff changeset
   875
    return ckpValue ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   876
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   877
90ce3da70b43 Initial load
duke
parents:
diff changeset
   878
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   879
 * converts a Java char object into a pointer to a CK_CHAR value. The memory has to be
90ce3da70b43 Initial load
duke
parents:
diff changeset
   880
 * freed after use!
90ce3da70b43 Initial load
duke
parents:
diff changeset
   881
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   882
 * @param env - used to call JNI funktions to get the value out of the Java object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   883
 * @param jObject - the "java/lang/Char" object to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   884
 * @return - the pointer to the new CK_CHAR value
90ce3da70b43 Initial load
duke
parents:
diff changeset
   885
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   886
CK_CHAR_PTR jCharObjectToCKCharPtr(JNIEnv *env, jobject jObject)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   887
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   888
    jclass jObjectClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   889
    jmethodID jValueMethod;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   890
    jchar jValue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   891
    CK_CHAR_PTR ckpValue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   892
90ce3da70b43 Initial load
duke
parents:
diff changeset
   893
    jObjectClass = (*env)->FindClass(env, "java/lang/Char");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   894
    assert(jObjectClass != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   895
    jValueMethod = (*env)->GetMethodID(env, jObjectClass, "charValue", "()C");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   896
    assert(jValueMethod != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   897
    jValue = (*env)->CallCharMethod(env, jObject, jValueMethod);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   898
    ckpValue = (CK_CHAR_PTR) malloc(sizeof(CK_CHAR));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   899
    *ckpValue = jCharToCKChar(jValue);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   900
90ce3da70b43 Initial load
duke
parents:
diff changeset
   901
    return ckpValue ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   902
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   903
90ce3da70b43 Initial load
duke
parents:
diff changeset
   904
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   905
 * converts a Java object into a pointer to CK-type or a CK-structure with the length in Bytes.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   906
 * The memory of *ckpObjectPtr to be freed after use! This function is only used by
90ce3da70b43 Initial load
duke
parents:
diff changeset
   907
 * jAttributeToCKAttribute by now.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   908
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   909
 * @param env - used to call JNI funktions to get the Java classes and objects
90ce3da70b43 Initial load
duke
parents:
diff changeset
   910
 * @param jObject - the Java object to convert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   911
 * @param ckpObjectPtr - the reference of the new pointer to the new CK-value or CK-structure
90ce3da70b43 Initial load
duke
parents:
diff changeset
   912
 * @param ckpLength - the reference of the length in bytes of the new CK-value or CK-structure
90ce3da70b43 Initial load
duke
parents:
diff changeset
   913
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   914
void jObjectToPrimitiveCKObjectPtrPtr(JNIEnv *env, jobject jObject, CK_VOID_PTR *ckpObjectPtr, CK_ULONG *ckpLength)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   915
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   916
    jclass jBooleanClass     = (*env)->FindClass(env, "java/lang/Boolean");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   917
    jclass jByteClass        = (*env)->FindClass(env, "java/lang/Byte");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   918
    jclass jCharacterClass   = (*env)->FindClass(env, "java/lang/Character");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   919
    jclass jClassClass = (*env)->FindClass(env, "java/lang/Class");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   920
    /* jclass jShortClass       = (*env)->FindClass(env, "java/lang/Short"); */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   921
    jclass jIntegerClass     = (*env)->FindClass(env, "java/lang/Integer");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   922
    jclass jLongClass        = (*env)->FindClass(env, "java/lang/Long");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   923
    /* jclass jFloatClass       = (*env)->FindClass(env, "java/lang/Float"); */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   924
    /* jclass jDoubleClass      = (*env)->FindClass(env, "java/lang/Double"); */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   925
    jclass jDateClass      = (*env)->FindClass(env, CLASS_DATE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   926
    jclass jStringClass      = (*env)->FindClass(env, "java/lang/String");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   927
    jclass jStringBufferClass      = (*env)->FindClass(env, "java/lang/StringBuffer");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   928
    jclass jBooleanArrayClass = (*env)->FindClass(env, "[Z");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   929
    jclass jByteArrayClass    = (*env)->FindClass(env, "[B");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   930
    jclass jCharArrayClass    = (*env)->FindClass(env, "[C");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   931
    /* jclass jShortArrayClass   = (*env)->FindClass(env, "[S"); */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   932
    jclass jIntArrayClass     = (*env)->FindClass(env, "[I");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   933
    jclass jLongArrayClass    = (*env)->FindClass(env, "[J");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   934
    /* jclass jFloatArrayClass   = (*env)->FindClass(env, "[F"); */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   935
    /* jclass jDoubleArrayClass  = (*env)->FindClass(env, "[D"); */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   936
    jclass jObjectClass = (*env)->FindClass(env, "java/lang/Object");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   937
    /* jclass jObjectArrayClass = (*env)->FindClass(env, "[java/lang/Object"); */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   938
    /* ATTENTION: jObjectArrayClass is always NULL !! */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   939
    /* CK_ULONG ckArrayLength; */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   940
    /* CK_VOID_PTR *ckpElementObject; */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   941
    /* CK_ULONG ckElementLength; */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   942
    /* CK_ULONG i; */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   943
    CK_VOID_PTR ckpVoid = *ckpObjectPtr;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   944
    jmethodID jMethod;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   945
    jobject jClassObject;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   946
    jstring jClassNameString;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   947
    jstring jExceptionMessagePrefix;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   948
    jobject jExceptionMessageStringBuffer;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   949
    jstring jExceptionMessage;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   950
90ce3da70b43 Initial load
duke
parents:
diff changeset
   951
    TRACE0("\nDEBUG: jObjectToPrimitiveCKObjectPtrPtr");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   952
    if (jObject == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   953
        *ckpObjectPtr = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   954
        *ckpLength = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   955
    } else if ((*env)->IsInstanceOf(env, jObject, jLongClass)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   956
        *ckpObjectPtr = jLongObjectToCKULongPtr(env, jObject);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   957
        *ckpLength = sizeof(CK_ULONG);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   958
        TRACE1("<converted long value %X>", *((CK_ULONG *) *ckpObjectPtr));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   959
    } else if ((*env)->IsInstanceOf(env, jObject, jBooleanClass)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   960
        *ckpObjectPtr = jBooleanObjectToCKBBoolPtr(env, jObject);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   961
        *ckpLength = sizeof(CK_BBOOL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   962
        TRACE0(" <converted boolean value ");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   963
        TRACE0((*((CK_BBOOL *) *ckpObjectPtr) == TRUE) ? "TRUE>" : "FALSE>");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   964
    } else if ((*env)->IsInstanceOf(env, jObject, jByteArrayClass)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   965
        jByteArrayToCKByteArray(env, jObject, (CK_BYTE_PTR*)ckpObjectPtr, ckpLength);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   966
    } else if ((*env)->IsInstanceOf(env, jObject, jCharArrayClass)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   967
        jCharArrayToCKUTF8CharArray(env, jObject, (CK_UTF8CHAR_PTR*)ckpObjectPtr, ckpLength);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   968
    } else if ((*env)->IsInstanceOf(env, jObject, jByteClass)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   969
        *ckpObjectPtr = jByteObjectToCKBytePtr(env, jObject);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   970
        *ckpLength = sizeof(CK_BYTE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   971
        TRACE1("<converted byte value %X>", *((CK_BYTE *) *ckpObjectPtr));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   972
    } else if ((*env)->IsInstanceOf(env, jObject, jDateClass)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   973
        *ckpObjectPtr = jDateObjectPtrToCKDatePtr(env, jObject);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   974
        *ckpLength = sizeof(CK_DATE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   975
        TRACE3("<converted date value %.4s-%.2s-%.2s>", (*((CK_DATE *) *ckpObjectPtr)).year,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   976
                                                    (*((CK_DATE *) *ckpObjectPtr)).month,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   977
                                                    (*((CK_DATE *) *ckpObjectPtr)).day);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   978
    } else if ((*env)->IsInstanceOf(env, jObject, jCharacterClass)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   979
        *ckpObjectPtr = jCharObjectToCKCharPtr(env, jObject);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   980
        *ckpLength = sizeof(CK_UTF8CHAR);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   981
        TRACE1("<converted char value %c>", *((CK_CHAR *) *ckpObjectPtr));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   982
    } else if ((*env)->IsInstanceOf(env, jObject, jIntegerClass)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   983
        *ckpObjectPtr = jIntegerObjectToCKULongPtr(env, jObject);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   984
        *ckpLength = sizeof(CK_ULONG);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   985
        TRACE1("<converted integer value %X>", *((CK_ULONG *) *ckpObjectPtr));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   986
    } else if ((*env)->IsInstanceOf(env, jObject, jBooleanArrayClass)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   987
        jBooleanArrayToCKBBoolArray(env, jObject, (CK_BBOOL**)ckpObjectPtr, ckpLength);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   988
    } else if ((*env)->IsInstanceOf(env, jObject, jIntArrayClass)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   989
        jLongArrayToCKULongArray(env, jObject, (CK_ULONG_PTR*)ckpObjectPtr, ckpLength);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   990
    } else if ((*env)->IsInstanceOf(env, jObject, jLongArrayClass)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   991
        jLongArrayToCKULongArray(env, jObject, (CK_ULONG_PTR*)ckpObjectPtr, ckpLength);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   992
    } else if ((*env)->IsInstanceOf(env, jObject, jStringClass)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   993
        jStringToCKUTF8CharArray(env, jObject, (CK_UTF8CHAR_PTR*)ckpObjectPtr, ckpLength);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   994
90ce3da70b43 Initial load
duke
parents:
diff changeset
   995
        /* a Java object array is not used by CK_ATTRIBUTE by now... */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   996
/*  } else if ((*env)->IsInstanceOf(env, jObject, jObjectArrayClass)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   997
        ckArrayLength = (*env)->GetArrayLength(env, (jarray) jObject);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   998
        ckpObjectPtr = (CK_VOID_PTR_PTR) malloc(sizeof(CK_VOID_PTR) * ckArrayLength);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   999
        *ckpLength = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1000
        for (i = 0; i < ckArrayLength; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1001
            jObjectToPrimitiveCKObjectPtrPtr(env, (*env)->GetObjectArrayElement(env, (jarray) jObject, i),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1002
                     ckpElementObject, &ckElementLength);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1003
            (*ckpObjectPtr)[i] = *ckpElementObject;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1004
            *ckpLength += ckElementLength;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1005
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1006
*/
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1007
    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1008
        /* type of jObject unknown, throw PKCS11RuntimeException */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1009
        jMethod = (*env)->GetMethodID(env, jObjectClass, "getClass", "()Ljava/lang/Class;");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1010
        assert(jMethod != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1011
        jClassObject = (*env)->CallObjectMethod(env, jObject, jMethod);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1012
        assert(jClassObject != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1013
        jMethod = (*env)->GetMethodID(env, jClassClass, "getName", "()Ljava/lang/String;");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1014
        assert(jMethod != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1015
        jClassNameString = (jstring)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1016
                (*env)->CallObjectMethod(env, jClassObject, jMethod);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1017
        assert(jClassNameString != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1018
        jExceptionMessagePrefix = (*env)->NewStringUTF(env, "Java object of this class cannot be converted to native PKCS#11 type: ");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1019
        jMethod = (*env)->GetMethodID(env, jStringBufferClass, "<init>", "(Ljava/lang/String;)V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1020
        assert(jMethod != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1021
        jExceptionMessageStringBuffer = (*env)->NewObject(env, jStringBufferClass, jMethod, jExceptionMessagePrefix);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1022
        assert(jClassNameString != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1023
        jMethod = (*env)->GetMethodID(env, jStringBufferClass, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1024
        assert(jMethod != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1025
        jExceptionMessage = (jstring)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1026
                 (*env)->CallObjectMethod(env, jExceptionMessageStringBuffer, jMethod, jClassNameString);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1027
        assert(jExceptionMessage != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1028
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1029
        throwPKCS11RuntimeException(env, jExceptionMessage);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1030
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1031
        *ckpObjectPtr = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1032
        *ckpLength = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1033
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1034
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1035
    TRACE0("FINISHED\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1036
}