Path: blob/master/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_digest.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_DIGESTINIT58/*59* Class: sun_security_pkcs11_wrapper_PKCS1160* Method: C_DigestInit61* Signature: (JLsun/security/pkcs11/wrapper/CK_MECHANISM;)V62* Parametermapping: *PKCS11*63* @param jlong jSessionHandle CK_SESSION_HANDLE hSession64* @param jobject jMechanism CK_MECHANISM_PTR pMechanism65*/66JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestInit67(JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism)68{69CK_SESSION_HANDLE ckSessionHandle;70CK_MECHANISM_PTR ckpMechanism = NULL;71CK_RV rv;7273CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);74if (ckpFunctions == NULL) { return; }7576ckSessionHandle = jLongToCKULong(jSessionHandle);77ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism);78if ((*env)->ExceptionCheck(env)) { return; }7980rv = (*ckpFunctions->C_DigestInit)(ckSessionHandle, ckpMechanism);8182freeCKMechanismPtr(ckpMechanism);8384if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }85}86#endif8788#ifdef P11_ENABLE_C_DIGEST89/*90* Class: sun_security_pkcs11_wrapper_PKCS1191* Method: C_Digest92* Signature: (J[BII[BII)I93* Parametermapping: *PKCS11*94* @param jlong jSessionHandle CK_SESSION_HANDLE hSession95* @param jbyteArray jData CK_BYTE_PTR pData96* CK_ULONG ulDataLen97* @return jbyteArray jDigest CK_BYTE_PTR pDigest98* CK_ULONG_PTR pulDigestLen99*/100JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestSingle101(JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism,102jbyteArray jIn, jint jInOfs, jint jInLen, jbyteArray jDigest,103jint jDigestOfs, jint jDigestLen)104{105CK_SESSION_HANDLE ckSessionHandle;106CK_RV rv;107CK_BYTE BUF[MAX_STACK_BUFFER_LEN];108CK_BYTE_PTR bufP = BUF;109CK_BYTE DIGESTBUF[MAX_DIGEST_LEN];110CK_ULONG ckDigestLength = 0;111CK_MECHANISM_PTR ckpMechanism = NULL;112113CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);114if (ckpFunctions == NULL) { return 0; }115116ckSessionHandle = jLongToCKULong(jSessionHandle);117ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism);118if ((*env)->ExceptionCheck(env)) { return 0; }119120rv = (*ckpFunctions->C_DigestInit)(ckSessionHandle, ckpMechanism);121if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { goto cleanup; }122123if (jInLen > MAX_STACK_BUFFER_LEN) {124/* always use single part op, even for large data */125bufP = (CK_BYTE_PTR) malloc((size_t)jInLen);126if (bufP == NULL) {127throwOutOfMemoryError(env, 0);128goto cleanup;129}130}131132(*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)bufP);133if ((*env)->ExceptionCheck(env)) {134goto cleanup;135}136137ckDigestLength = min(MAX_DIGEST_LEN, jDigestLen);138139rv = (*ckpFunctions->C_Digest)(ckSessionHandle, bufP, jInLen, DIGESTBUF, &ckDigestLength);140if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {141(*env)->SetByteArrayRegion(env, jDigest, jDigestOfs, ckDigestLength, (jbyte *)DIGESTBUF);142}143cleanup:144freeCKMechanismPtr(ckpMechanism);145if (bufP != BUF) { free(bufP); }146147return ckDigestLength;148}149#endif150151#ifdef P11_ENABLE_C_DIGESTUPDATE152/*153* Class: sun_security_pkcs11_wrapper_PKCS11154* Method: C_DigestUpdate155* Signature: (J[B)V156* Parametermapping: *PKCS11*157* @param jlong jSessionHandle CK_SESSION_HANDLE hSession158* @param jbyteArray jData CK_BYTE_PTR pData159* CK_ULONG ulDataLen160*/161JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestUpdate162(JNIEnv *env, jobject obj, jlong jSessionHandle, jlong directIn, jbyteArray jIn,163jint jInOfs, jint jInLen)164{165CK_SESSION_HANDLE ckSessionHandle;166CK_RV rv;167CK_BYTE_PTR bufP;168CK_BYTE BUF[MAX_STACK_BUFFER_LEN];169jsize bufLen;170171CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);172if (ckpFunctions == NULL) { return; }173174ckSessionHandle = jLongToCKULong(jSessionHandle);175176if (directIn != 0) {177rv = (*ckpFunctions->C_DigestUpdate)(ckSessionHandle, (CK_BYTE_PTR)jlong_to_ptr(directIn), jInLen);178ckAssertReturnValueOK(env, rv);179return;180}181182if (jInLen <= MAX_STACK_BUFFER_LEN) {183bufLen = MAX_STACK_BUFFER_LEN;184bufP = BUF;185} else {186bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);187bufP = (CK_BYTE_PTR) malloc((size_t)bufLen);188if (bufP == NULL) {189throwOutOfMemoryError(env, 0);190return;191}192}193194while (jInLen > 0) {195jsize chunkLen = min(bufLen, jInLen);196(*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP);197if ((*env)->ExceptionCheck(env)) {198if (bufP != BUF) { free(bufP); }199return;200}201rv = (*ckpFunctions->C_DigestUpdate)(ckSessionHandle, bufP, chunkLen);202if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {203if (bufP != BUF) { free(bufP); }204return;205}206jInOfs += chunkLen;207jInLen -= chunkLen;208}209210if (bufP != BUF) {211free(bufP);212}213}214#endif215216#ifdef P11_ENABLE_C_DIGESTKEY217/*218* Class: sun_security_pkcs11_wrapper_PKCS11219* Method: C_DigestKey220* Signature: (JJ)V221* Parametermapping: *PKCS11*222* @param jlong jSessionHandle CK_SESSION_HANDLE hSession223* @param jlong jKeyHandle CK_OBJECT_HANDLE hKey224*/225JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestKey226(JNIEnv *env, jobject obj, jlong jSessionHandle, jlong jKeyHandle)227{228CK_SESSION_HANDLE ckSessionHandle;229CK_ULONG ckKeyHandle;230CK_RV rv;231232CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);233if (ckpFunctions == NULL) { return; }234235ckSessionHandle = jLongToCKULong(jSessionHandle);236ckKeyHandle = jLongToCKULong(jKeyHandle);237238rv = (*ckpFunctions->C_DigestKey)(ckSessionHandle, ckKeyHandle);239if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }240}241#endif242243#ifdef P11_ENABLE_C_DIGESTFINAL244/*245* Class: sun_security_pkcs11_wrapper_PKCS11246* Method: C_DigestFinal247* Signature: (J[BII)I248* Parametermapping: *PKCS11*249* @param jlong jSessionHandle CK_SESSION_HANDLE hSession250* @return jbyteArray jDigest CK_BYTE_PTR pDigest251* CK_ULONG_PTR pulDigestLen252*/253JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestFinal254(JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jDigest,255jint jDigestOfs, jint jDigestLen)256{257CK_SESSION_HANDLE ckSessionHandle;258CK_RV rv;259CK_BYTE BUF[MAX_DIGEST_LEN];260CK_ULONG ckDigestLength = min(MAX_DIGEST_LEN, jDigestLen);261262CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);263if (ckpFunctions == NULL) { return 0; }264265ckSessionHandle = jLongToCKULong(jSessionHandle);266267rv = (*ckpFunctions->C_DigestFinal)(ckSessionHandle, BUF, &ckDigestLength);268if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {269(*env)->SetByteArrayRegion(env, jDigest, jDigestOfs, ckDigestLength, (jbyte *)BUF);270}271return ckDigestLength;272}273#endif274275#ifdef P11_ENABLE_C_SEEDRANDOM276/*277* Class: sun_security_pkcs11_wrapper_PKCS11278* Method: C_SeedRandom279* Signature: (J[B)V280* Parametermapping: *PKCS11*281* @param jlong jSessionHandle CK_SESSION_HANDLE hSession282* @param jbyteArray jSeed CK_BYTE_PTR pSeed283* CK_ULONG ulSeedLen284*/285JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SeedRandom286(JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jSeed)287{288CK_SESSION_HANDLE ckSessionHandle;289CK_BYTE_PTR ckpSeed = NULL_PTR;290CK_ULONG ckSeedLength;291CK_RV rv;292293CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);294if (ckpFunctions == NULL) { return; }295296ckSessionHandle = jLongToCKULong(jSessionHandle);297jByteArrayToCKByteArray(env, jSeed, &ckpSeed, &ckSeedLength);298if ((*env)->ExceptionCheck(env)) { return; }299300rv = (*ckpFunctions->C_SeedRandom)(ckSessionHandle, ckpSeed, ckSeedLength);301302free(ckpSeed);303304if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }305}306#endif307308#ifdef P11_ENABLE_C_GENERATERANDOM309/*310* Class: sun_security_pkcs11_wrapper_PKCS11311* Method: C_GenerateRandom312* Signature: (J[B)V313* Parametermapping: *PKCS11*314* @param jlong jSessionHandle CK_SESSION_HANDLE hSession315* @param jbyteArray jRandomData CK_BYTE_PTR pRandomData316* CK_ULONG ulRandomDataLen317*/318JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GenerateRandom319(JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jRandomData)320{321CK_SESSION_HANDLE ckSessionHandle;322jbyte *jRandomBuffer;323jlong jRandomBufferLength;324CK_RV rv;325326CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);327if (ckpFunctions == NULL) { return; }328329ckSessionHandle = jLongToCKULong(jSessionHandle);330331jRandomBufferLength = (*env)->GetArrayLength(env, jRandomData);332jRandomBuffer = (*env)->GetByteArrayElements(env, jRandomData, NULL);333if (jRandomBuffer == NULL) { return; }334335rv = (*ckpFunctions->C_GenerateRandom)(ckSessionHandle,336(CK_BYTE_PTR) jRandomBuffer,337jLongToCKULong(jRandomBufferLength));338339/* copy back generated bytes */340(*env)->ReleaseByteArrayElements(env, jRandomData, jRandomBuffer, 0);341342if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }343}344#endif345346347