Path: blob/master/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_sign.c
41149 views
/*1* Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved.2*/34/* Copyright (c) 2002 Graz University of Technology. All rights reserved.5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions are met:8*9* 1. Redistributions of source code must retain the above copyright notice,10* this list of conditions and the following disclaimer.11*12* 2. Redistributions in binary form must reproduce the above copyright notice,13* this list of conditions and the following disclaimer in the documentation14* and/or other materials provided with the distribution.15*16* 3. The end-user documentation included with the redistribution, if any, must17* include the following acknowledgment:18*19* "This product includes software developed by IAIK of Graz University of20* Technology."21*22* Alternately, this acknowledgment may appear in the software itself, if23* and wherever such third-party acknowledgments normally appear.24*25* 4. The names "Graz University of Technology" and "IAIK of Graz University of26* Technology" must not be used to endorse or promote products derived from27* this software without prior written permission.28*29* 5. Products derived from this software may not be called30* "IAIK PKCS Wrapper", nor may "IAIK" appear in their name, without prior31* written permission of Graz University of Technology.32*33* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED34* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED35* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR36* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE LICENSOR BE37* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,38* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,39* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,40* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON41* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,42* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY43* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE44* POSSIBILITY OF SUCH DAMAGE.45*/4647#include "pkcs11wrapper.h"4849#include <stdio.h>50#include <stdlib.h>51#include <string.h>52#include <assert.h>53#include "jlong.h"5455#include "sun_security_pkcs11_wrapper_PKCS11.h"5657#ifdef P11_ENABLE_C_SIGNINIT58/*59* Class: sun_security_pkcs11_wrapper_PKCS1160* Method: C_SignInit61* Signature: (JLsun/security/pkcs11/wrapper/CK_MECHANISM;J)V62* Parametermapping: *PKCS11*63* @param jlong jSessionHandle CK_SESSION_HANDLE hSession64* @param jobject jMechanism CK_MECHANISM_PTR pMechanism65* @param jlong jKeyHandle CK_OBJECT_HANDLE hKey66*/67JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignInit68(JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle)69{70CK_SESSION_HANDLE ckSessionHandle;71CK_MECHANISM_PTR ckpMechanism = NULL;72CK_OBJECT_HANDLE ckKeyHandle;73CK_RV rv;7475CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);76if (ckpFunctions == NULL) { return; }7778TRACE0("DEBUG: C_SignInit\n");7980ckSessionHandle = jLongToCKULong(jSessionHandle);8182ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism);83if ((*env)->ExceptionCheck(env)) { return; }8485ckKeyHandle = jLongToCKULong(jKeyHandle);8687rv = (*ckpFunctions->C_SignInit)(ckSessionHandle, ckpMechanism, ckKeyHandle);8889if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK ||90(ckpMechanism->pParameter == NULL)) {91freeCKMechanismPtr(ckpMechanism);92} else {93(*env)->SetLongField(env, jMechanism, mech_pHandleID, ptr_to_jlong(ckpMechanism));94TRACE1("DEBUG C_SignInit: stored pMech = 0x%lX\n", ptr_to_jlong(ckpMechanism));95}96TRACE0("FINISHED\n");97}98#endif99100#ifdef P11_ENABLE_C_SIGN101/*102* Class: sun_security_pkcs11_wrapper_PKCS11103* Method: C_Sign104* Signature: (J[BI)[B105* Parametermapping: *PKCS11*106* @param jlong jSessionHandle CK_SESSION_HANDLE hSession107* @param jbyteArray jData CK_BYTE_PTR pData108* CK_ULONG ulDataLen109* @return jbyteArray jSignature CK_BYTE_PTR pSignature110* CK_ULONG_PTR pulSignatureLen111*/112JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Sign113(JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jData)114{115CK_SESSION_HANDLE ckSessionHandle;116CK_BYTE_PTR ckpData = NULL_PTR;117CK_ULONG ckDataLength;118CK_BYTE_PTR bufP;119CK_ULONG ckSignatureLength;120CK_BYTE BUF[MAX_STACK_BUFFER_LEN];121jbyteArray jSignature = NULL;122CK_RV rv;123124CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);125if (ckpFunctions == NULL) { return NULL; }126127TRACE0("DEBUG: C_Sign\n");128129ckSessionHandle = jLongToCKULong(jSessionHandle);130jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength);131if ((*env)->ExceptionCheck(env)) {132return NULL;133}134135TRACE1("DEBUG C_Sign: data length = %lu\n", ckDataLength);136137// unknown signature length138bufP = BUF;139ckSignatureLength = MAX_STACK_BUFFER_LEN;140141rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength,142bufP, &ckSignatureLength);143144TRACE1("DEBUG C_Sign: ret rv=0x%lX\n", rv);145146if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {147jSignature = ckByteArrayToJByteArray(env, bufP, ckSignatureLength);148TRACE1("DEBUG C_Sign: signature length = %lu\n", ckSignatureLength);149}150151free(ckpData);152if (bufP != BUF) { free(bufP); }153154TRACE0("FINISHED\n");155return jSignature;156}157#endif158159#ifdef P11_ENABLE_C_SIGNUPDATE160/*161* Class: sun_security_pkcs11_wrapper_PKCS11162* Method: C_SignUpdate163* Signature: (J[BII)V164* Parametermapping: *PKCS11*165* @param jlong jSessionHandle CK_SESSION_HANDLE hSession166* @param jbyteArray jPart CK_BYTE_PTR pPart167* CK_ULONG ulPartLen168*/169JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignUpdate170(JNIEnv *env, jobject obj, jlong jSessionHandle, jlong directIn, jbyteArray jIn, jint jInOfs, jint jInLen)171{172CK_SESSION_HANDLE ckSessionHandle;173CK_RV rv;174CK_BYTE_PTR bufP;175CK_BYTE BUF[MAX_STACK_BUFFER_LEN];176jsize bufLen;177178CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);179if (ckpFunctions == NULL) { return; }180181ckSessionHandle = jLongToCKULong(jSessionHandle);182183if (directIn != 0) {184rv = (*ckpFunctions->C_SignUpdate)(ckSessionHandle, (CK_BYTE_PTR) jlong_to_ptr(directIn), jInLen);185ckAssertReturnValueOK(env, rv);186return;187}188189if (jInLen <= MAX_STACK_BUFFER_LEN) {190bufLen = MAX_STACK_BUFFER_LEN;191bufP = BUF;192} else {193bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);194bufP = (CK_BYTE_PTR) malloc((size_t)bufLen);195if (bufP == NULL) {196throwOutOfMemoryError(env, 0);197return;198}199}200201while (jInLen > 0) {202jsize chunkLen = min(bufLen, jInLen);203(*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP);204if ((*env)->ExceptionCheck(env)) {205goto cleanup;206}207rv = (*ckpFunctions->C_SignUpdate)(ckSessionHandle, bufP, chunkLen);208if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {209goto cleanup;210}211jInOfs += chunkLen;212jInLen -= chunkLen;213}214215cleanup:216if (bufP != BUF) { free(bufP); }217218return;219}220#endif221222#ifdef P11_ENABLE_C_SIGNFINAL223/*224* Class: sun_security_pkcs11_wrapper_PKCS11225* Method: C_SignFinal226* Signature: (J)[B227* Parametermapping: *PKCS11*228* @param jlong jSessionHandle CK_SESSION_HANDLE hSession229* @return jbyteArray jSignature CK_BYTE_PTR pSignature230* CK_ULONG_PTR pulSignatureLen231*/232JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignFinal233(JNIEnv *env, jobject obj, jlong jSessionHandle, jint jExpectedLength)234{235CK_SESSION_HANDLE ckSessionHandle;236jbyteArray jSignature = NULL;237CK_RV rv;238CK_BYTE BUF[MAX_STACK_BUFFER_LEN];239CK_BYTE_PTR bufP = BUF;240CK_ULONG ckSignatureLength = MAX_STACK_BUFFER_LEN;241242CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);243if (ckpFunctions == NULL) { return NULL; }244245ckSessionHandle = jLongToCKULong(jSessionHandle);246247if ((jExpectedLength > 0) && ((CK_ULONG)jExpectedLength < ckSignatureLength)) {248ckSignatureLength = jExpectedLength;249}250251rv = (*ckpFunctions->C_SignFinal)(ckSessionHandle, bufP, &ckSignatureLength);252if (rv == CKR_BUFFER_TOO_SMALL) {253bufP = (CK_BYTE_PTR) malloc(ckSignatureLength);254if (bufP == NULL) {255throwOutOfMemoryError(env, 0);256return NULL;257}258rv = (*ckpFunctions->C_SignFinal)(ckSessionHandle, bufP, &ckSignatureLength);259}260if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {261jSignature = ckByteArrayToJByteArray(env, bufP, ckSignatureLength);262}263264if (bufP != BUF) { free(bufP); }265266return jSignature;267}268#endif269270#ifdef P11_ENABLE_C_SIGNRECOVERINIT271/*272* Class: sun_security_pkcs11_wrapper_PKCS11273* Method: C_SignRecoverInit274* Signature: (JLsun/security/pkcs11/wrapper/CK_MECHANISM;J)V275* Parametermapping: *PKCS11*276* @param jlong jSessionHandle CK_SESSION_HANDLE hSession277* @param jobject jMechanism CK_MECHANISM_PTR pMechanism278* @param jlong jKeyHandle CK_OBJECT_HANDLE hKey279*/280JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignRecoverInit281(JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle)282{283CK_SESSION_HANDLE ckSessionHandle;284CK_MECHANISM_PTR ckpMechanism = NULL;285CK_OBJECT_HANDLE ckKeyHandle;286CK_RV rv;287288CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);289if (ckpFunctions == NULL) { return; }290291TRACE0("DEBUG: C_SignRecoverInit\n");292293ckSessionHandle = jLongToCKULong(jSessionHandle);294ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism);295if ((*env)->ExceptionCheck(env)) { return; }296297ckKeyHandle = jLongToCKULong(jKeyHandle);298299rv = (*ckpFunctions->C_SignRecoverInit)(ckSessionHandle, ckpMechanism, ckKeyHandle);300301if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK ||302(ckpMechanism->pParameter == NULL)) {303freeCKMechanismPtr(ckpMechanism);304} else {305(*env)->SetLongField(env, jMechanism, mech_pHandleID, ptr_to_jlong(ckpMechanism));306TRACE1("DEBUG C_SignRecoverInit, stored pMech = 0x%lX\n", ptr_to_jlong(ckpMechanism));307}308TRACE0("FINISHED\n");309}310#endif311312#ifdef P11_ENABLE_C_SIGNRECOVER313/*314* Class: sun_security_pkcs11_wrapper_PKCS11315* Method: C_SignRecover316* Signature: (J[BII[BII)I317* Parametermapping: *PKCS11*318* @param jlong jSessionHandle CK_SESSION_HANDLE hSession319* @param jbyteArray jData CK_BYTE_PTR pData320* CK_ULONG ulDataLen321* @return jbyteArray jSignature CK_BYTE_PTR pSignature322* CK_ULONG_PTR pulSignatureLen323*/324JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignRecover325(JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jIn, jint jInOfs, jint jInLen, jbyteArray jOut, jint jOutOfs, jint jOutLen)326{327CK_SESSION_HANDLE ckSessionHandle;328CK_RV rv;329CK_BYTE INBUF[MAX_STACK_BUFFER_LEN];330CK_BYTE OUTBUF[MAX_STACK_BUFFER_LEN];331CK_BYTE_PTR inBufP;332CK_BYTE_PTR outBufP = OUTBUF;333CK_ULONG ckSignatureLength = 0;334335CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);336if (ckpFunctions == NULL) { return 0; }337338ckSessionHandle = jLongToCKULong(jSessionHandle);339340if (jInLen <= MAX_STACK_BUFFER_LEN) {341inBufP = INBUF;342ckSignatureLength = MAX_STACK_BUFFER_LEN;343} else {344inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen);345if (inBufP == NULL) {346throwOutOfMemoryError(env, 0);347return 0;348}349ckSignatureLength = jInLen;350}351352(*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);353if ((*env)->ExceptionCheck(env)) {354goto cleanup;355}356357rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength);358/* re-alloc larger buffer if it fits into our Java buffer */359if ((rv == CKR_BUFFER_TOO_SMALL) && (ckSignatureLength <= jIntToCKULong(jOutLen))) {360outBufP = (CK_BYTE_PTR) malloc(ckSignatureLength);361if (outBufP == NULL) {362throwOutOfMemoryError(env, 0);363goto cleanup;364}365rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength);366}367if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {368(*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckSignatureLength, (jbyte *)outBufP);369}370cleanup:371if (inBufP != INBUF) { free(inBufP); }372if (outBufP != OUTBUF) { free(outBufP); }373374return ckSignatureLength;375}376#endif377378#ifdef P11_ENABLE_C_VERIFYINIT379/*380* Class: sun_security_pkcs11_wrapper_PKCS11381* Method: C_VerifyInit382* Signature: (JLsun/security/pkcs11/wrapper/CK_MECHANISM;J)V383* Parametermapping: *PKCS11*384* @param jlong jSessionHandle CK_SESSION_HANDLE hSession385* @param jobject jMechanism CK_MECHANISM_PTR pMechanism386* @param jlong jKeyHandle CK_OBJECT_HANDLE hKey387*/388JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyInit389(JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle)390{391CK_SESSION_HANDLE ckSessionHandle;392CK_MECHANISM_PTR ckpMechanism = NULL;393CK_OBJECT_HANDLE ckKeyHandle;394CK_RV rv;395396CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);397if (ckpFunctions == NULL) { return; }398399TRACE0("DEBUG: C_VerifyInit\n");400401ckSessionHandle = jLongToCKULong(jSessionHandle);402ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism);403if ((*env)->ExceptionCheck(env)) {404return;405}406407ckKeyHandle = jLongToCKULong(jKeyHandle);408409rv = (*ckpFunctions->C_VerifyInit)(ckSessionHandle, ckpMechanism, ckKeyHandle);410411if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK ||412(ckpMechanism->pParameter == NULL)) {413freeCKMechanismPtr(ckpMechanism);414} else {415(*env)->SetLongField(env, jMechanism, mech_pHandleID, ptr_to_jlong(ckpMechanism));416TRACE1("DEBUG C_VerifyInit: stored pMech = 0x%lX\n", ptr_to_jlong(ckpMechanism));417}418TRACE0("FINISHED\n");419}420#endif421422#ifdef P11_ENABLE_C_VERIFY423/*424* Class: sun_security_pkcs11_wrapper_PKCS11425* Method: C_Verify426* Signature: (J[B[B)V427* Parametermapping: *PKCS11*428* @param jlong jSessionHandle CK_SESSION_HANDLE hSession429* @param jbyteArray jData CK_BYTE_PTR pData430* CK_ULONG ulDataLen431* @param jbyteArray jSignature CK_BYTE_PTR pSignature432* CK_ULONG_PTR pulSignatureLen433*/434JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Verify435(JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jData, jbyteArray jSignature)436{437CK_SESSION_HANDLE ckSessionHandle;438CK_BYTE_PTR ckpData = NULL_PTR;439CK_BYTE_PTR ckpSignature = NULL_PTR;440CK_ULONG ckDataLength;441CK_ULONG ckSignatureLength;442CK_RV rv = 0;443444CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);445if (ckpFunctions == NULL) { return; }446447ckSessionHandle = jLongToCKULong(jSessionHandle);448449jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength);450if ((*env)->ExceptionCheck(env)) {451return;452}453454jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength);455if ((*env)->ExceptionCheck(env)) {456goto cleanup;457}458459/* verify the signature */460rv = (*ckpFunctions->C_Verify)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, ckSignatureLength);461462cleanup:463free(ckpData);464free(ckpSignature);465466ckAssertReturnValueOK(env, rv);467}468#endif469470#ifdef P11_ENABLE_C_VERIFYUPDATE471/*472* Class: sun_security_pkcs11_wrapper_PKCS11473* Method: C_VerifyUpdate474* Signature: (J[BII)V475* Parametermapping: *PKCS11*476* @param jlong jSessionHandle CK_SESSION_HANDLE hSession477* @param jbyteArray jPart CK_BYTE_PTR pPart478* CK_ULONG ulPartLen479*/480JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyUpdate481(JNIEnv *env, jobject obj, jlong jSessionHandle, jlong directIn, jbyteArray jIn, jint jInOfs, jint jInLen)482{483CK_SESSION_HANDLE ckSessionHandle;484CK_RV rv;485CK_BYTE_PTR bufP;486CK_BYTE BUF[MAX_STACK_BUFFER_LEN];487jsize bufLen;488489CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);490if (ckpFunctions == NULL) { return; }491492ckSessionHandle = jLongToCKULong(jSessionHandle);493494if (directIn != 0) {495rv = (*ckpFunctions->C_VerifyUpdate)(ckSessionHandle, (CK_BYTE_PTR)jlong_to_ptr(directIn), jInLen);496ckAssertReturnValueOK(env, rv);497return;498}499500if (jInLen <= MAX_STACK_BUFFER_LEN) {501bufLen = MAX_STACK_BUFFER_LEN;502bufP = BUF;503} else {504bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);505bufP = (CK_BYTE_PTR) malloc((size_t)bufLen);506if (bufP == NULL) {507throwOutOfMemoryError(env, 0);508goto cleanup;509}510}511512while (jInLen > 0) {513jsize chunkLen = min(bufLen, jInLen);514(*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP);515if ((*env)->ExceptionCheck(env)) {516goto cleanup;517}518519rv = (*ckpFunctions->C_VerifyUpdate)(ckSessionHandle, bufP, chunkLen);520if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {521goto cleanup;522}523jInOfs += chunkLen;524jInLen -= chunkLen;525}526527cleanup:528if (bufP != BUF) { free(bufP); }529}530#endif531532#ifdef P11_ENABLE_C_VERIFYFINAL533/*534* Class: sun_security_pkcs11_wrapper_PKCS11535* Method: C_VerifyFinal536* Signature: (J[B)V537* Parametermapping: *PKCS11*538* @param jlong jSessionHandle CK_SESSION_HANDLE hSession539* @param jbyteArray jSignature CK_BYTE_PTR pSignature540* CK_ULONG ulSignatureLen541*/542JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyFinal543(JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jSignature)544{545CK_SESSION_HANDLE ckSessionHandle;546CK_BYTE_PTR ckpSignature = NULL_PTR;547CK_ULONG ckSignatureLength;548CK_RV rv;549550CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);551if (ckpFunctions == NULL) { return; }552553ckSessionHandle = jLongToCKULong(jSessionHandle);554jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength);555if ((*env)->ExceptionCheck(env)) {556return;557}558559/* verify the signature */560rv = (*ckpFunctions->C_VerifyFinal)(ckSessionHandle, ckpSignature, ckSignatureLength);561562free(ckpSignature);563564ckAssertReturnValueOK(env, rv);565}566#endif567568#ifdef P11_ENABLE_C_VERIFYRECOVERINIT569/*570* Class: sun_security_pkcs11_wrapper_PKCS11571* Method: C_VerifyRecoverInit572* Signature: (JLsun/security/pkcs11/wrapper/CK_MECHANISM;J)V573* Parametermapping: *PKCS11*574* @param jlong jSessionHandle CK_SESSION_HANDLE hSession575* @param jobject jMechanism CK_MECHANISM_PTR pMechanism576* @return jlong jKeyHandle CK_OBJECT_HANDLE hKey577*/578JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyRecoverInit579(JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle)580{581CK_SESSION_HANDLE ckSessionHandle;582CK_MECHANISM_PTR ckpMechanism = NULL;583CK_OBJECT_HANDLE ckKeyHandle;584CK_RV rv;585586CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);587if (ckpFunctions == NULL) { return; }588589TRACE0("DEBUG: C_VerifyRecoverInit\n");590591ckSessionHandle = jLongToCKULong(jSessionHandle);592ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism);593if ((*env)->ExceptionCheck(env)) { return; }594595ckKeyHandle = jLongToCKULong(jKeyHandle);596597rv = (*ckpFunctions->C_VerifyRecoverInit)(ckSessionHandle, ckpMechanism, ckKeyHandle);598599if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK ||600(ckpMechanism->pParameter == NULL)) {601freeCKMechanismPtr(ckpMechanism);602} else {603(*env)->SetLongField(env, jMechanism, mech_pHandleID, ptr_to_jlong(ckpMechanism));604TRACE1("DEBUG C_VerifyRecoverInit: stored pMech = 0x%lX\n", ptr_to_jlong(ckpMechanism));605}606TRACE0("FINISHED\n");607}608#endif609610#ifdef P11_ENABLE_C_VERIFYRECOVER611/*612* Class: sun_security_pkcs11_wrapper_PKCS11613* Method: C_VerifyRecover614* Signature: (J[BII[BII)I615* Parametermapping: *PKCS11*616* @param jlong jSessionHandle CK_SESSION_HANDLE hSession617* @param jbyteArray jSignature CK_BYTE_PTR pSignature618* CK_ULONG ulSignatureLen619* @return jbyteArray jData CK_BYTE_PTR pData620* CK_ULONG_PTR pulDataLen621*/622JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyRecover623(JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jIn, jint jInOfs, jint jInLen, jbyteArray jOut, jint jOutOfs, jint jOutLen)624{625CK_SESSION_HANDLE ckSessionHandle;626CK_RV rv;627CK_BYTE INBUF[MAX_STACK_BUFFER_LEN];628CK_BYTE OUTBUF[MAX_STACK_BUFFER_LEN];629CK_BYTE_PTR inBufP;630CK_BYTE_PTR outBufP = OUTBUF;631CK_ULONG ckDataLength = 0;632633CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);634if (ckpFunctions == NULL) { return 0; }635636ckSessionHandle = jLongToCKULong(jSessionHandle);637638if (jInLen <= MAX_STACK_BUFFER_LEN) {639inBufP = INBUF;640ckDataLength = MAX_STACK_BUFFER_LEN;641} else {642inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen);643if (inBufP == NULL) {644throwOutOfMemoryError(env, 0);645return 0;646}647ckDataLength = jInLen;648}649650(*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);651if ((*env)->ExceptionCheck(env)) {652goto cleanup;653}654655rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength);656657/* re-alloc larger buffer if it fits into our Java buffer */658if ((rv == CKR_BUFFER_TOO_SMALL) && (ckDataLength <= jIntToCKULong(jOutLen))) {659outBufP = (CK_BYTE_PTR) malloc(ckDataLength);660if (outBufP == NULL) {661throwOutOfMemoryError(env, 0);662goto cleanup;663}664rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength);665}666if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {667(*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckDataLength, (jbyte *)outBufP);668}669670cleanup:671if (inBufP != INBUF) { free(inBufP); }672if (outBufP != OUTBUF) { free(outBufP); }673674return ckDataLength;675}676#endif677678679