Path: blob/master/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_dual.c
41149 views
/*1* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.2*/34/* Copyright (c) 2002 Graz University of Technology. All rights reserved.5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions are met:8*9* 1. Redistributions of source code must retain the above copyright notice,10* this list of conditions and the following disclaimer.11*12* 2. Redistributions in binary form must reproduce the above copyright notice,13* this list of conditions and the following disclaimer in the documentation14* and/or other materials provided with the distribution.15*16* 3. The end-user documentation included with the redistribution, if any, must17* include the following acknowledgment:18*19* "This product includes software developed by IAIK of Graz University of20* Technology."21*22* Alternately, this acknowledgment may appear in the software itself, if23* and wherever such third-party acknowledgments normally appear.24*25* 4. The names "Graz University of Technology" and "IAIK of Graz University of26* Technology" must not be used to endorse or promote products derived from27* this software without prior written permission.28*29* 5. Products derived from this software may not be called30* "IAIK PKCS Wrapper", nor may "IAIK" appear in their name, without prior31* written permission of Graz University of Technology.32*33* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED34* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED35* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR36* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE LICENSOR BE37* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,38* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,39* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,40* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON41* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,42* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY43* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE44* POSSIBILITY OF SUCH DAMAGE.45* ===========================================================================46*/4748#include "pkcs11wrapper.h"4950#include <stdio.h>51#include <stdlib.h>52#include <string.h>53#include <assert.h>5455#include "sun_security_pkcs11_wrapper_PKCS11.h"5657#ifdef P11_ENABLE_C_DIGESTENCRYPTUPDATE58/*59* Class: sun_security_pkcs11_wrapper_PKCS1160* Method: C_DigestEncryptUpdate61* Signature: (J[B)[B62* Parametermapping: *PKCS11*63* @param jlong jSessionHandle CK_SESSION_HANDLE hSession64* @param jbyteArray jPart CK_BYTE_PTR pPart65* CK_ULONG ulPartLen66* @return jbyteArray jEncryptedPart CK_BYTE_PTR pEncryptedPart67* CK_ULONG_PTR pulEncryptedPartLen68*/69JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestEncryptUpdate70(JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jPart)71{72CK_SESSION_HANDLE ckSessionHandle;73CK_BYTE_PTR ckpPart = NULL_PTR, ckpEncryptedPart;74CK_ULONG ckPartLength, ckEncryptedPartLength = 0;75jbyteArray jEncryptedPart = NULL;76CK_RV rv;7778CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);79if (ckpFunctions == NULL) { return NULL; }8081ckSessionHandle = jLongToCKULong(jSessionHandle);82jByteArrayToCKByteArray(env, jPart, &ckpPart, &ckPartLength);83if ((*env)->ExceptionCheck(env)) { return NULL; }8485rv = (*ckpFunctions->C_DigestEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, NULL_PTR, &ckEncryptedPartLength);86if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {87free(ckpPart);88return NULL;89}9091ckpEncryptedPart = (CK_BYTE_PTR) malloc(ckEncryptedPartLength * sizeof(CK_BYTE));92if (ckpEncryptedPart == NULL) {93free(ckpPart);94throwOutOfMemoryError(env, 0);95return NULL;96}9798rv = (*ckpFunctions->C_DigestEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, ckpEncryptedPart, &ckEncryptedPartLength);99if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {100jEncryptedPart = ckByteArrayToJByteArray(env, ckpEncryptedPart, ckEncryptedPartLength);101}102free(ckpPart);103free(ckpEncryptedPart);104105return jEncryptedPart ;106}107#endif108109#ifdef P11_ENABLE_C_DECRYPTDIGESTUPDATE110/*111* Class: sun_security_pkcs11_wrapper_PKCS11112* Method: C_DecryptDigestUpdate113* Signature: (J[B)[B114* Parametermapping: *PKCS11*115* @param jlong jSessionHandle CK_SESSION_HANDLE hSession116* @param jbyteArray jEncryptedPart CK_BYTE_PTR pEncryptedPart117* CK_ULONG ulEncryptedPartLen118* @return jbyteArray jPart CK_BYTE_PTR pPart119* CK_ULONG_PTR pulPartLen120*/121JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptDigestUpdate122(JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jEncryptedPart)123{124CK_SESSION_HANDLE ckSessionHandle;125CK_BYTE_PTR ckpPart, ckpEncryptedPart = NULL_PTR;126CK_ULONG ckPartLength = 0, ckEncryptedPartLength;127jbyteArray jPart = NULL;128CK_RV rv;129130CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);131if (ckpFunctions == NULL) { return NULL; }132133ckSessionHandle = jLongToCKULong(jSessionHandle);134jByteArrayToCKByteArray(env, jEncryptedPart, &ckpEncryptedPart, &ckEncryptedPartLength);135if ((*env)->ExceptionCheck(env)) { return NULL; }136137rv = (*ckpFunctions->C_DecryptDigestUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, NULL_PTR, &ckPartLength);138if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {139free(ckpEncryptedPart);140return NULL;141}142143ckpPart = (CK_BYTE_PTR) malloc(ckPartLength * sizeof(CK_BYTE));144if (ckpPart == NULL) {145free(ckpEncryptedPart);146throwOutOfMemoryError(env, 0);147return NULL;148}149150rv = (*ckpFunctions->C_DecryptDigestUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, ckpPart, &ckPartLength);151if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {152jPart = ckByteArrayToJByteArray(env, ckpPart, ckPartLength);153}154free(ckpEncryptedPart);155free(ckpPart);156157return jPart ;158}159#endif160161#ifdef P11_ENABLE_C_SIGNENCRYPTUPDATE162/*163* Class: sun_security_pkcs11_wrapper_PKCS11164* Method: C_SignEncryptUpdate165* Signature: (J[B)[B166* Parametermapping: *PKCS11*167* @param jlong jSessionHandle CK_SESSION_HANDLE hSession168* @param jbyteArray jPart CK_BYTE_PTR pPart169* CK_ULONG ulPartLen170* @return jbyteArray jEncryptedPart CK_BYTE_PTR pEncryptedPart171* CK_ULONG_PTR pulEncryptedPartLen172*/173JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignEncryptUpdate174(JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jPart)175{176CK_SESSION_HANDLE ckSessionHandle;177CK_BYTE_PTR ckpPart = NULL_PTR, ckpEncryptedPart;178CK_ULONG ckPartLength, ckEncryptedPartLength = 0;179jbyteArray jEncryptedPart = NULL;180CK_RV rv;181182CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);183if (ckpFunctions == NULL) { return NULL; }184185ckSessionHandle = jLongToCKULong(jSessionHandle);186jByteArrayToCKByteArray(env, jPart, &ckpPart, &ckPartLength);187if ((*env)->ExceptionCheck(env)) { return NULL; }188189rv = (*ckpFunctions->C_SignEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, NULL_PTR, &ckEncryptedPartLength);190if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {191free(ckpPart);192return NULL;193}194195ckpEncryptedPart = (CK_BYTE_PTR) malloc(ckEncryptedPartLength * sizeof(CK_BYTE));196if (ckpEncryptedPart == NULL) {197free(ckpPart);198throwOutOfMemoryError(env, 0);199return NULL;200}201202rv = (*ckpFunctions->C_SignEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, ckpEncryptedPart, &ckEncryptedPartLength);203if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {204jEncryptedPart = ckByteArrayToJByteArray(env, ckpEncryptedPart, ckEncryptedPartLength);205}206free(ckpPart);207free(ckpEncryptedPart);208209return jEncryptedPart ;210}211#endif212213#ifdef P11_ENABLE_C_DECRYPTVERIFYUPDATE214/*215* Class: sun_security_pkcs11_wrapper_PKCS11216* Method: C_DecryptVerifyUpdate217* Signature: (J[B)[B218* Parametermapping: *PKCS11*219* @param jlong jSessionHandle CK_SESSION_HANDLE hSession220* @param jbyteArray jEncryptedPart CK_BYTE_PTR pEncryptedPart221* CK_ULONG ulEncryptedPartLen222* @return jbyteArray jPart CK_BYTE_PTR pPart223* CK_ULONG_PTR pulPartLen224*/225JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptVerifyUpdate226(JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jEncryptedPart)227{228CK_SESSION_HANDLE ckSessionHandle;229CK_BYTE_PTR ckpPart, ckpEncryptedPart = NULL_PTR;230CK_ULONG ckPartLength = 0, ckEncryptedPartLength;231jbyteArray jPart = NULL;232CK_RV rv;233234CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);235if (ckpFunctions == NULL) { return NULL; }236237ckSessionHandle = jLongToCKULong(jSessionHandle);238jByteArrayToCKByteArray(env, jEncryptedPart, &ckpEncryptedPart, &ckEncryptedPartLength);239if ((*env)->ExceptionCheck(env)) { return NULL; }240241rv = (*ckpFunctions->C_DecryptVerifyUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, NULL_PTR, &ckPartLength);242if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {243free(ckpEncryptedPart);244return NULL;245}246247ckpPart = (CK_BYTE_PTR) malloc(ckPartLength * sizeof(CK_BYTE));248if (ckpPart == NULL) {249free(ckpEncryptedPart);250throwOutOfMemoryError(env, 0);251return NULL;252}253254rv = (*ckpFunctions->C_DecryptVerifyUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, ckpPart, &ckPartLength);255256if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {257jPart = ckByteArrayToJByteArray(env, ckpPart, ckPartLength);258}259free(ckpEncryptedPart);260free(ckpPart);261262return jPart ;263}264#endif265266#ifdef P11_ENABLE_C_GETFUNCTIONSTATUS267/*268* Class: sun_security_pkcs11_wrapper_PKCS11269* Method: C_GetFunctionStatus270* Signature: (J)V271* Parametermapping: *PKCS11*272* @param jlong jSessionHandle CK_SESSION_HANDLE hSession273*/274JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetFunctionStatus275(JNIEnv *env, jobject obj, jlong jSessionHandle)276{277CK_SESSION_HANDLE ckSessionHandle;278CK_RV rv;279280CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);281if (ckpFunctions == NULL) { return; }282283ckSessionHandle = jLongToCKULong(jSessionHandle);284285/* C_GetFunctionStatus should always return CKR_FUNCTION_NOT_PARALLEL */286rv = (*ckpFunctions->C_GetFunctionStatus)(ckSessionHandle);287if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }288}289#endif290291#ifdef P11_ENABLE_C_CANCELFUNCTION292/*293* Class: sun_security_pkcs11_wrapper_PKCS11294* Method: C_CancelFunction295* Signature: (J)V296* Parametermapping: *PKCS11*297* @param jlong jSessionHandle CK_SESSION_HANDLE hSession298*/299JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1CancelFunction300(JNIEnv *env, jobject obj, jlong jSessionHandle)301{302CK_SESSION_HANDLE ckSessionHandle;303CK_RV rv;304305CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);306if (ckpFunctions == NULL) { return; }307308ckSessionHandle = jLongToCKULong(jSessionHandle);309310/* C_GetFunctionStatus should always return CKR_FUNCTION_NOT_PARALLEL */311rv = (*ckpFunctions->C_CancelFunction)(ckSessionHandle);312if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }313}314#endif315316317