src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_sign.c
branchdatagramsocketimpl-branch
changeset 58678 9cf78a70fa4f
parent 47216 71c04702a3d5
child 58679 9c3209ff7550
equal deleted inserted replaced
58677:13588c901957 58678:9cf78a70fa4f
     1 /*
     1 /*
     2  * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved.
     3  */
     3  */
     4 
     4 
     5 /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
     5 /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
     6  *
     6  *
     7  * Redistribution and use in  source and binary forms, with or without
     7  * Redistribution and use in  source and binary forms, with or without
    61  * Method:    C_SignInit
    61  * Method:    C_SignInit
    62  * Signature: (JLsun/security/pkcs11/wrapper/CK_MECHANISM;J)V
    62  * Signature: (JLsun/security/pkcs11/wrapper/CK_MECHANISM;J)V
    63  * Parametermapping:                    *PKCS11*
    63  * Parametermapping:                    *PKCS11*
    64  * @param   jlong jSessionHandle        CK_SESSION_HANDLE hSession
    64  * @param   jlong jSessionHandle        CK_SESSION_HANDLE hSession
    65  * @param   jobject jMechanism          CK_MECHANISM_PTR pMechanism
    65  * @param   jobject jMechanism          CK_MECHANISM_PTR pMechanism
    66  * @return  jlong jKeyHandle            CK_OBJECT_HANDLE hKey
    66  * @param   jlong jKeyHandle            CK_OBJECT_HANDLE hKey
    67  */
    67  */
    68 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignInit
    68 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignInit
    69     (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle)
    69     (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle)
    70 {
    70 {
    71     CK_SESSION_HANDLE ckSessionHandle;
    71     CK_SESSION_HANDLE ckSessionHandle;
    72     CK_MECHANISM ckMechanism;
    72     CK_MECHANISM_PTR ckpMechanism = NULL;
    73     CK_OBJECT_HANDLE ckKeyHandle;
    73     CK_OBJECT_HANDLE ckKeyHandle;
    74     CK_RV rv;
    74     CK_RV rv;
    75 
    75 
    76     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
    76     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
    77     if (ckpFunctions == NULL) { return; }
    77     if (ckpFunctions == NULL) { return; }
    78 
    78 
    79     ckSessionHandle = jLongToCKULong(jSessionHandle);
    79     TRACE0("DEBUG: C_SignInit\n");
    80     jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
    80 
       
    81     ckSessionHandle = jLongToCKULong(jSessionHandle);
       
    82 
       
    83     ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism);
    81     if ((*env)->ExceptionCheck(env)) { return; }
    84     if ((*env)->ExceptionCheck(env)) { return; }
       
    85 
    82     ckKeyHandle = jLongToCKULong(jKeyHandle);
    86     ckKeyHandle = jLongToCKULong(jKeyHandle);
    83 
    87 
    84     rv = (*ckpFunctions->C_SignInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
    88     rv = (*ckpFunctions->C_SignInit)(ckSessionHandle, ckpMechanism, ckKeyHandle);
    85 
    89 
    86     if (ckMechanism.pParameter != NULL_PTR) {
    90     if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK ||
    87         free(ckMechanism.pParameter);
    91             (ckpMechanism->pParameter == NULL)) {
    88     }
    92         freeCKMechanismPtr(ckpMechanism);
    89 
    93     } else {
    90     if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
    94         (*env)->SetLongField(env, jMechanism, mech_pHandleID, ptr_to_jlong(ckpMechanism));
       
    95         TRACE1("DEBUG C_SignInit: stored pMech = 0x%lX\n", ptr_to_jlong(ckpMechanism));
       
    96     }
       
    97     TRACE0("FINISHED\n");
    91 }
    98 }
    92 #endif
    99 #endif
    93 
   100 
    94 #ifdef P11_ENABLE_C_SIGN
   101 #ifdef P11_ENABLE_C_SIGN
    95 /*
   102 /*
    96  * Class:     sun_security_pkcs11_wrapper_PKCS11
   103  * Class:     sun_security_pkcs11_wrapper_PKCS11
    97  * Method:    C_Sign
   104  * Method:    C_Sign
    98  * Signature: (J[B)[B
   105  * Signature: (J[BI)[B
    99  * Parametermapping:                    *PKCS11*
   106  * Parametermapping:                    *PKCS11*
   100  * @param   jlong jSessionHandle        CK_SESSION_HANDLE hSession
   107  * @param   jlong jSessionHandle        CK_SESSION_HANDLE hSession
   101  * @param   jbyteArray jData            CK_BYTE_PTR pData
   108  * @param   jbyteArray jData            CK_BYTE_PTR pData
   102  *                                      CK_ULONG ulDataLen
   109  *                                      CK_ULONG ulDataLen
   103  * @return  jbyteArray jSignature       CK_BYTE_PTR pSignature
   110  * @return  jbyteArray jSignature       CK_BYTE_PTR pSignature
   106 JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Sign
   113 JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Sign
   107     (JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jData)
   114     (JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jData)
   108 {
   115 {
   109     CK_SESSION_HANDLE ckSessionHandle;
   116     CK_SESSION_HANDLE ckSessionHandle;
   110     CK_BYTE_PTR ckpData = NULL_PTR;
   117     CK_BYTE_PTR ckpData = NULL_PTR;
   111     CK_BYTE_PTR ckpSignature;
       
   112     CK_ULONG ckDataLength;
   118     CK_ULONG ckDataLength;
   113     CK_ULONG ckSignatureLength = 0;
   119     CK_BYTE_PTR bufP;
       
   120     CK_ULONG ckSignatureLength;
       
   121     CK_BYTE BUF[MAX_STACK_BUFFER_LEN];
   114     jbyteArray jSignature = NULL;
   122     jbyteArray jSignature = NULL;
   115     CK_RV rv;
   123     CK_RV rv;
   116 
   124 
   117     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   125     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   118     if (ckpFunctions == NULL) { return NULL; }
   126     if (ckpFunctions == NULL) { return NULL; }
   119 
   127 
       
   128     TRACE0("DEBUG: C_Sign\n");
       
   129 
   120     ckSessionHandle = jLongToCKULong(jSessionHandle);
   130     ckSessionHandle = jLongToCKULong(jSessionHandle);
   121     jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength);
   131     jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength);
   122     if ((*env)->ExceptionCheck(env)) { return NULL; }
   132     if ((*env)->ExceptionCheck(env)) {
   123 
       
   124     /* START standard code */
       
   125 
       
   126     /* first determine the length of the signature */
       
   127     rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, NULL_PTR, &ckSignatureLength);
       
   128     if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
       
   129         free(ckpData);
       
   130         return NULL;
   133         return NULL;
   131     }
   134     }
   132 
   135 
   133     ckpSignature = (CK_BYTE_PTR) malloc(ckSignatureLength * sizeof(CK_BYTE));
   136     TRACE1("DEBUG C_Sign: data length = %lu\n", ckDataLength);
   134     if (ckpSignature == NULL) {
   137 
   135         free(ckpData);
   138     // unknown signature length
   136         throwOutOfMemoryError(env, 0);
   139     bufP = BUF;
   137         return NULL;
   140     ckSignatureLength = MAX_STACK_BUFFER_LEN;
   138     }
   141 
   139 
   142     rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength,
   140     /* now get the signature */
   143         bufP, &ckSignatureLength);
   141     rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength);
   144 
   142  /* END standard code */
   145     TRACE1("DEBUG C_Sign: ret rv=0x%lX\n", rv);
   143 
   146 
   144 
       
   145     /* START workaround code for operation abort bug in pkcs#11 of Datakey and iButton */
       
   146 /*
       
   147     ckpSignature = (CK_BYTE_PTR) malloc(256 * sizeof(CK_BYTE));
       
   148     if (ckpSignature == NULL) {
       
   149         free(ckpData);
       
   150         throwOutOfMemoryError(env, 0);
       
   151         return NULL;
       
   152     }
       
   153     rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength);
       
   154 
       
   155     if (rv == CKR_BUFFER_TOO_SMALL) {
       
   156         free(ckpSignature);
       
   157         ckpSignature = (CK_BYTE_PTR) malloc(ckSignatureLength * sizeof(CK_BYTE));
       
   158         if (ckpSignature == NULL) {
       
   159             free(ckpData);
       
   160             throwOutOfMemoryError(env, 0);
       
   161             return NULL;
       
   162         }
       
   163         rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength);
       
   164     }
       
   165  */
       
   166     /* END workaround code */
       
   167     if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   147     if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   168         jSignature = ckByteArrayToJByteArray(env, ckpSignature, ckSignatureLength);
   148         jSignature = ckByteArrayToJByteArray(env, bufP, ckSignatureLength);
   169     }
   149         TRACE1("DEBUG C_Sign: signature length = %lu\n", ckSignatureLength);
       
   150     }
       
   151 
   170     free(ckpData);
   152     free(ckpData);
   171     free(ckpSignature);
   153     if (bufP != BUF) { free(bufP); }
   172 
   154 
   173     return jSignature ;
   155     TRACE0("FINISHED\n");
       
   156     return jSignature;
   174 }
   157 }
   175 #endif
   158 #endif
   176 
   159 
   177 #ifdef P11_ENABLE_C_SIGNUPDATE
   160 #ifdef P11_ENABLE_C_SIGNUPDATE
   178 /*
   161 /*
   218 
   201 
   219     while (jInLen > 0) {
   202     while (jInLen > 0) {
   220         jsize chunkLen = min(bufLen, jInLen);
   203         jsize chunkLen = min(bufLen, jInLen);
   221         (*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP);
   204         (*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP);
   222         if ((*env)->ExceptionCheck(env)) {
   205         if ((*env)->ExceptionCheck(env)) {
   223             if (bufP != BUF) { free(bufP); }
   206             goto cleanup;
   224             return;
       
   225         }
   207         }
   226         rv = (*ckpFunctions->C_SignUpdate)(ckSessionHandle, bufP, chunkLen);
   208         rv = (*ckpFunctions->C_SignUpdate)(ckSessionHandle, bufP, chunkLen);
   227         if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
   209         if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
   228             if (bufP != BUF) {
   210             goto cleanup;
   229                 free(bufP);
       
   230             }
       
   231             return;
       
   232         }
   211         }
   233         jInOfs += chunkLen;
   212         jInOfs += chunkLen;
   234         jInLen -= chunkLen;
   213         jInLen -= chunkLen;
   235     }
   214     }
   236 
   215 
       
   216 cleanup:
   237     if (bufP != BUF) { free(bufP); }
   217     if (bufP != BUF) { free(bufP); }
       
   218 
       
   219     return;
   238 }
   220 }
   239 #endif
   221 #endif
   240 
   222 
   241 #ifdef P11_ENABLE_C_SIGNFINAL
   223 #ifdef P11_ENABLE_C_SIGNFINAL
   242 /*
   224 /*
   292  * Method:    C_SignRecoverInit
   274  * Method:    C_SignRecoverInit
   293  * Signature: (JLsun/security/pkcs11/wrapper/CK_MECHANISM;J)V
   275  * Signature: (JLsun/security/pkcs11/wrapper/CK_MECHANISM;J)V
   294  * Parametermapping:                    *PKCS11*
   276  * Parametermapping:                    *PKCS11*
   295  * @param   jlong jSessionHandle        CK_SESSION_HANDLE hSession
   277  * @param   jlong jSessionHandle        CK_SESSION_HANDLE hSession
   296  * @param   jobject jMechanism          CK_MECHANISM_PTR pMechanism
   278  * @param   jobject jMechanism          CK_MECHANISM_PTR pMechanism
   297  * @return  jlong jKeyHandle            CK_OBJECT_HANDLE hKey
   279  * @param   jlong jKeyHandle            CK_OBJECT_HANDLE hKey
   298  */
   280  */
   299 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignRecoverInit
   281 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignRecoverInit
   300     (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle)
   282     (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle)
   301 {
   283 {
   302     CK_SESSION_HANDLE ckSessionHandle;
   284     CK_SESSION_HANDLE ckSessionHandle;
   303     CK_MECHANISM ckMechanism;
   285     CK_MECHANISM_PTR ckpMechanism = NULL;
   304     CK_OBJECT_HANDLE ckKeyHandle;
   286     CK_OBJECT_HANDLE ckKeyHandle;
   305     CK_RV rv;
   287     CK_RV rv;
   306 
   288 
   307     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   289     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   308     if (ckpFunctions == NULL) { return; }
   290     if (ckpFunctions == NULL) { return; }
   309 
   291 
   310     ckSessionHandle = jLongToCKULong(jSessionHandle);
   292     TRACE0("DEBUG: C_SignRecoverInit\n");
   311     jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
   293 
       
   294     ckSessionHandle = jLongToCKULong(jSessionHandle);
       
   295     ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism);
   312     if ((*env)->ExceptionCheck(env)) { return; }
   296     if ((*env)->ExceptionCheck(env)) { return; }
   313 
   297 
   314     ckKeyHandle = jLongToCKULong(jKeyHandle);
   298     ckKeyHandle = jLongToCKULong(jKeyHandle);
   315 
   299 
   316     rv = (*ckpFunctions->C_SignRecoverInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
   300     rv = (*ckpFunctions->C_SignRecoverInit)(ckSessionHandle, ckpMechanism, ckKeyHandle);
   317 
   301 
   318     if (ckMechanism.pParameter != NULL_PTR) {
   302     if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK ||
   319         free(ckMechanism.pParameter);
   303             (ckpMechanism->pParameter == NULL)) {
   320     }
   304         freeCKMechanismPtr(ckpMechanism);
   321 
   305     } else {
   322     if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   306         (*env)->SetLongField(env, jMechanism, mech_pHandleID, ptr_to_jlong(ckpMechanism));
       
   307         TRACE1("DEBUG C_SignRecoverInit, stored pMech = 0x%lX\n", ptr_to_jlong(ckpMechanism));
       
   308     }
       
   309     TRACE0("FINISHED\n");
   323 }
   310 }
   324 #endif
   311 #endif
   325 
   312 
   326 #ifdef P11_ENABLE_C_SIGNRECOVER
   313 #ifdef P11_ENABLE_C_SIGNRECOVER
   327 /*
   314 /*
   342     CK_RV rv;
   329     CK_RV rv;
   343     CK_BYTE INBUF[MAX_STACK_BUFFER_LEN];
   330     CK_BYTE INBUF[MAX_STACK_BUFFER_LEN];
   344     CK_BYTE OUTBUF[MAX_STACK_BUFFER_LEN];
   331     CK_BYTE OUTBUF[MAX_STACK_BUFFER_LEN];
   345     CK_BYTE_PTR inBufP;
   332     CK_BYTE_PTR inBufP;
   346     CK_BYTE_PTR outBufP = OUTBUF;
   333     CK_BYTE_PTR outBufP = OUTBUF;
   347     CK_ULONG ckSignatureLength = MAX_STACK_BUFFER_LEN;
   334     CK_ULONG ckSignatureLength = 0;
   348 
   335 
   349     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   336     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   350     if (ckpFunctions == NULL) { return 0; }
   337     if (ckpFunctions == NULL) { return 0; }
   351 
   338 
   352     ckSessionHandle = jLongToCKULong(jSessionHandle);
   339     ckSessionHandle = jLongToCKULong(jSessionHandle);
   353 
   340 
   354     if (jInLen <= MAX_STACK_BUFFER_LEN) {
   341     if (jInLen <= MAX_STACK_BUFFER_LEN) {
   355         inBufP = INBUF;
   342         inBufP = INBUF;
       
   343         ckSignatureLength = MAX_STACK_BUFFER_LEN;
   356     } else {
   344     } else {
   357         inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen);
   345         inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen);
   358         if (inBufP == NULL) {
   346         if (inBufP == NULL) {
   359             throwOutOfMemoryError(env, 0);
   347             throwOutOfMemoryError(env, 0);
   360             return 0;
   348             return 0;
   361         }
   349         }
       
   350         ckSignatureLength = jInLen;
   362     }
   351     }
   363 
   352 
   364     (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
   353     (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
   365     if ((*env)->ExceptionCheck(env)) {
   354     if ((*env)->ExceptionCheck(env)) {
   366         if (inBufP != INBUF) { free(inBufP); }
   355         goto cleanup;
   367         return 0;
   356     }
   368     }
   357 
   369     rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength);
   358     rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength);
   370     /* re-alloc larger buffer if it fits into our Java buffer */
   359     /* re-alloc larger buffer if it fits into our Java buffer */
   371     if ((rv == CKR_BUFFER_TOO_SMALL) && (ckSignatureLength <= jIntToCKULong(jOutLen))) {
   360     if ((rv == CKR_BUFFER_TOO_SMALL) && (ckSignatureLength <= jIntToCKULong(jOutLen))) {
   372         outBufP = (CK_BYTE_PTR) malloc(ckSignatureLength);
   361         outBufP = (CK_BYTE_PTR) malloc(ckSignatureLength);
   373         if (outBufP == NULL) {
   362         if (outBufP == NULL) {
   374             if (inBufP != INBUF) {
       
   375                 free(inBufP);
       
   376             }
       
   377             throwOutOfMemoryError(env, 0);
   363             throwOutOfMemoryError(env, 0);
   378             return 0;
   364             goto cleanup;
   379         }
   365         }
   380         rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength);
   366         rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength);
   381     }
   367     }
   382     if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   368     if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   383         (*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckSignatureLength, (jbyte *)outBufP);
   369         (*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckSignatureLength, (jbyte *)outBufP);
   384     }
   370     }
   385 
   371 cleanup:
   386     if (inBufP != INBUF) { free(inBufP); }
   372     if (inBufP != INBUF) { free(inBufP); }
   387     if (outBufP != OUTBUF) { free(outBufP); }
   373     if (outBufP != OUTBUF) { free(outBufP); }
   388 
   374 
   389     return ckSignatureLength;
   375     return ckSignatureLength;
   390 }
   376 }
   396  * Method:    C_VerifyInit
   382  * Method:    C_VerifyInit
   397  * Signature: (JLsun/security/pkcs11/wrapper/CK_MECHANISM;J)V
   383  * Signature: (JLsun/security/pkcs11/wrapper/CK_MECHANISM;J)V
   398  * Parametermapping:                    *PKCS11*
   384  * Parametermapping:                    *PKCS11*
   399  * @param   jlong jSessionHandle        CK_SESSION_HANDLE hSession
   385  * @param   jlong jSessionHandle        CK_SESSION_HANDLE hSession
   400  * @param   jobject jMechanism          CK_MECHANISM_PTR pMechanism
   386  * @param   jobject jMechanism          CK_MECHANISM_PTR pMechanism
   401  * @return  jlong jKeyHandle            CK_OBJECT_HANDLE hKey
   387  * @param   jlong jKeyHandle            CK_OBJECT_HANDLE hKey
   402  */
   388  */
   403 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyInit
   389 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyInit
   404     (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle)
   390     (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle)
   405 {
   391 {
   406     CK_SESSION_HANDLE ckSessionHandle;
   392     CK_SESSION_HANDLE ckSessionHandle;
   407     CK_MECHANISM ckMechanism;
   393     CK_MECHANISM_PTR ckpMechanism = NULL;
   408     CK_OBJECT_HANDLE ckKeyHandle;
   394     CK_OBJECT_HANDLE ckKeyHandle;
   409     CK_RV rv;
   395     CK_RV rv;
   410 
   396 
   411     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   397     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   412     if (ckpFunctions == NULL) { return; }
   398     if (ckpFunctions == NULL) { return; }
   413 
   399 
   414     ckSessionHandle = jLongToCKULong(jSessionHandle);
   400     TRACE0("DEBUG: C_VerifyInit\n");
   415     jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
   401 
   416     if ((*env)->ExceptionCheck(env)) { return; }
   402     ckSessionHandle = jLongToCKULong(jSessionHandle);
       
   403     ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism);
       
   404     if ((*env)->ExceptionCheck(env)) {
       
   405         return;
       
   406     }
   417 
   407 
   418     ckKeyHandle = jLongToCKULong(jKeyHandle);
   408     ckKeyHandle = jLongToCKULong(jKeyHandle);
   419 
   409 
   420     rv = (*ckpFunctions->C_VerifyInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
   410     rv = (*ckpFunctions->C_VerifyInit)(ckSessionHandle, ckpMechanism, ckKeyHandle);
   421 
   411 
   422     if(ckMechanism.pParameter != NULL_PTR) {
   412     if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK ||
   423         free(ckMechanism.pParameter);
   413             (ckpMechanism->pParameter == NULL)) {
   424     }
   414         freeCKMechanismPtr(ckpMechanism);
   425 
   415     } else {
   426     if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   416         (*env)->SetLongField(env, jMechanism, mech_pHandleID, ptr_to_jlong(ckpMechanism));
       
   417         TRACE1("DEBUG C_VerifyInit: stored pMech = 0x%lX\n", ptr_to_jlong(ckpMechanism));
       
   418     }
       
   419     TRACE0("FINISHED\n");
   427 }
   420 }
   428 #endif
   421 #endif
   429 
   422 
   430 #ifdef P11_ENABLE_C_VERIFY
   423 #ifdef P11_ENABLE_C_VERIFY
   431 /*
   424 /*
   445     CK_SESSION_HANDLE ckSessionHandle;
   438     CK_SESSION_HANDLE ckSessionHandle;
   446     CK_BYTE_PTR ckpData = NULL_PTR;
   439     CK_BYTE_PTR ckpData = NULL_PTR;
   447     CK_BYTE_PTR ckpSignature = NULL_PTR;
   440     CK_BYTE_PTR ckpSignature = NULL_PTR;
   448     CK_ULONG ckDataLength;
   441     CK_ULONG ckDataLength;
   449     CK_ULONG ckSignatureLength;
   442     CK_ULONG ckSignatureLength;
   450     CK_RV rv;
   443     CK_RV rv = 0;
   451 
   444 
   452     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   445     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   453     if (ckpFunctions == NULL) { return; }
   446     if (ckpFunctions == NULL) { return; }
   454 
   447 
   455     ckSessionHandle = jLongToCKULong(jSessionHandle);
   448     ckSessionHandle = jLongToCKULong(jSessionHandle);
       
   449 
   456     jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength);
   450     jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength);
   457     if ((*env)->ExceptionCheck(env)) { return; }
   451     if ((*env)->ExceptionCheck(env)) {
       
   452         return;
       
   453     }
   458 
   454 
   459     jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength);
   455     jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength);
   460     if ((*env)->ExceptionCheck(env)) {
   456     if ((*env)->ExceptionCheck(env)) {
   461         free(ckpData);
   457         goto cleanup;
   462         return;
       
   463     }
   458     }
   464 
   459 
   465     /* verify the signature */
   460     /* verify the signature */
   466     rv = (*ckpFunctions->C_Verify)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, ckSignatureLength);
   461     rv = (*ckpFunctions->C_Verify)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, ckSignatureLength);
   467 
   462 
       
   463 cleanup:
   468     free(ckpData);
   464     free(ckpData);
   469     free(ckpSignature);
   465     free(ckpSignature);
   470 
   466 
   471     if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   467     ckAssertReturnValueOK(env, rv);
   472 }
   468 }
   473 #endif
   469 #endif
   474 
   470 
   475 #ifdef P11_ENABLE_C_VERIFYUPDATE
   471 #ifdef P11_ENABLE_C_VERIFYUPDATE
   476 /*
   472 /*
   508     } else {
   504     } else {
   509         bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);
   505         bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);
   510         bufP = (CK_BYTE_PTR) malloc((size_t)bufLen);
   506         bufP = (CK_BYTE_PTR) malloc((size_t)bufLen);
   511         if (bufP == NULL) {
   507         if (bufP == NULL) {
   512             throwOutOfMemoryError(env, 0);
   508             throwOutOfMemoryError(env, 0);
   513             return;
   509             goto cleanup;
   514         }
   510         }
   515     }
   511     }
   516 
   512 
   517     while (jInLen > 0) {
   513     while (jInLen > 0) {
   518         jsize chunkLen = min(bufLen, jInLen);
   514         jsize chunkLen = min(bufLen, jInLen);
   519         (*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP);
   515         (*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP);
   520         if ((*env)->ExceptionCheck(env)) {
   516         if ((*env)->ExceptionCheck(env)) {
   521             if (bufP != BUF) { free(bufP); }
   517             goto cleanup;
   522             return;
       
   523         }
   518         }
   524 
   519 
   525         rv = (*ckpFunctions->C_VerifyUpdate)(ckSessionHandle, bufP, chunkLen);
   520         rv = (*ckpFunctions->C_VerifyUpdate)(ckSessionHandle, bufP, chunkLen);
   526         if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
   521         if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
   527             if (bufP != BUF) { free(bufP); }
   522             goto cleanup;
   528             return;
       
   529         }
   523         }
   530         jInOfs += chunkLen;
   524         jInOfs += chunkLen;
   531         jInLen -= chunkLen;
   525         jInLen -= chunkLen;
   532     }
   526     }
   533 
   527 
       
   528 cleanup:
   534     if (bufP != BUF) { free(bufP); }
   529     if (bufP != BUF) { free(bufP); }
   535 }
   530 }
   536 #endif
   531 #endif
   537 
   532 
   538 #ifdef P11_ENABLE_C_VERIFYFINAL
   533 #ifdef P11_ENABLE_C_VERIFYFINAL
   556     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   551     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   557     if (ckpFunctions == NULL) { return; }
   552     if (ckpFunctions == NULL) { return; }
   558 
   553 
   559     ckSessionHandle = jLongToCKULong(jSessionHandle);
   554     ckSessionHandle = jLongToCKULong(jSessionHandle);
   560     jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength);
   555     jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength);
   561     if ((*env)->ExceptionCheck(env)) { return; }
   556     if ((*env)->ExceptionCheck(env)) {
       
   557         return;
       
   558     }
   562 
   559 
   563     /* verify the signature */
   560     /* verify the signature */
   564     rv = (*ckpFunctions->C_VerifyFinal)(ckSessionHandle, ckpSignature, ckSignatureLength);
   561     rv = (*ckpFunctions->C_VerifyFinal)(ckSessionHandle, ckpSignature, ckSignatureLength);
   565 
   562 
   566     free(ckpSignature);
   563     free(ckpSignature);
   567 
   564 
   568     if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   565     ckAssertReturnValueOK(env, rv);
   569 }
   566 }
   570 #endif
   567 #endif
   571 
   568 
   572 #ifdef P11_ENABLE_C_VERIFYRECOVERINIT
   569 #ifdef P11_ENABLE_C_VERIFYRECOVERINIT
   573 /*
   570 /*
   581  */
   578  */
   582 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyRecoverInit
   579 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyRecoverInit
   583     (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle)
   580     (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle)
   584 {
   581 {
   585     CK_SESSION_HANDLE ckSessionHandle;
   582     CK_SESSION_HANDLE ckSessionHandle;
   586     CK_MECHANISM ckMechanism;
   583     CK_MECHANISM_PTR ckpMechanism = NULL;
   587     CK_OBJECT_HANDLE ckKeyHandle;
   584     CK_OBJECT_HANDLE ckKeyHandle;
   588     CK_RV rv;
   585     CK_RV rv;
   589 
   586 
   590     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   587     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   591     if (ckpFunctions == NULL) { return; }
   588     if (ckpFunctions == NULL) { return; }
   592 
   589 
   593     ckSessionHandle = jLongToCKULong(jSessionHandle);
   590     TRACE0("DEBUG: C_VerifyRecoverInit\n");
   594     jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
   591 
       
   592     ckSessionHandle = jLongToCKULong(jSessionHandle);
       
   593     ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism);
   595     if ((*env)->ExceptionCheck(env)) { return; }
   594     if ((*env)->ExceptionCheck(env)) { return; }
   596 
   595 
   597     ckKeyHandle = jLongToCKULong(jKeyHandle);
   596     ckKeyHandle = jLongToCKULong(jKeyHandle);
   598 
   597 
   599     rv = (*ckpFunctions->C_VerifyRecoverInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
   598     rv = (*ckpFunctions->C_VerifyRecoverInit)(ckSessionHandle, ckpMechanism, ckKeyHandle);
   600 
   599 
   601     if (ckMechanism.pParameter != NULL_PTR) {
   600     if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK ||
   602         free(ckMechanism.pParameter);
   601             (ckpMechanism->pParameter == NULL)) {
   603     }
   602         freeCKMechanismPtr(ckpMechanism);
   604 
   603     } else {
   605     if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   604         (*env)->SetLongField(env, jMechanism, mech_pHandleID, ptr_to_jlong(ckpMechanism));
       
   605         TRACE1("DEBUG C_VerifyRecoverInit: stored pMech = 0x%lX\n", ptr_to_jlong(ckpMechanism));
       
   606     }
       
   607     TRACE0("FINISHED\n");
   606 }
   608 }
   607 #endif
   609 #endif
   608 
   610 
   609 #ifdef P11_ENABLE_C_VERIFYRECOVER
   611 #ifdef P11_ENABLE_C_VERIFYRECOVER
   610 /*
   612 /*
   625     CK_RV rv;
   627     CK_RV rv;
   626     CK_BYTE INBUF[MAX_STACK_BUFFER_LEN];
   628     CK_BYTE INBUF[MAX_STACK_BUFFER_LEN];
   627     CK_BYTE OUTBUF[MAX_STACK_BUFFER_LEN];
   629     CK_BYTE OUTBUF[MAX_STACK_BUFFER_LEN];
   628     CK_BYTE_PTR inBufP;
   630     CK_BYTE_PTR inBufP;
   629     CK_BYTE_PTR outBufP = OUTBUF;
   631     CK_BYTE_PTR outBufP = OUTBUF;
   630     CK_ULONG ckDataLength = MAX_STACK_BUFFER_LEN;
   632     CK_ULONG ckDataLength = 0;
   631 
   633 
   632     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   634     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   633     if (ckpFunctions == NULL) { return 0; }
   635     if (ckpFunctions == NULL) { return 0; }
   634 
   636 
   635     ckSessionHandle = jLongToCKULong(jSessionHandle);
   637     ckSessionHandle = jLongToCKULong(jSessionHandle);
   636 
   638 
   637     if (jInLen <= MAX_STACK_BUFFER_LEN) {
   639     if (jInLen <= MAX_STACK_BUFFER_LEN) {
   638         inBufP = INBUF;
   640         inBufP = INBUF;
       
   641         ckDataLength = MAX_STACK_BUFFER_LEN;
   639     } else {
   642     } else {
   640         inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen);
   643         inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen);
   641         if (inBufP == NULL) {
   644         if (inBufP == NULL) {
   642             throwOutOfMemoryError(env, 0);
   645             throwOutOfMemoryError(env, 0);
   643             return 0;
   646             return 0;
   644         }
   647         }
       
   648         ckDataLength = jInLen;
   645     }
   649     }
   646 
   650 
   647     (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
   651     (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
   648     if ((*env)->ExceptionCheck(env)) {
   652     if ((*env)->ExceptionCheck(env)) {
   649         if (inBufP != INBUF) { free(inBufP); }
   653         goto cleanup;
   650         return 0;
       
   651     }
   654     }
   652 
   655 
   653     rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength);
   656     rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength);
   654 
   657 
   655     /* re-alloc larger buffer if it fits into our Java buffer */
   658     /* re-alloc larger buffer if it fits into our Java buffer */
   656     if ((rv == CKR_BUFFER_TOO_SMALL) && (ckDataLength <= jIntToCKULong(jOutLen))) {
   659     if ((rv == CKR_BUFFER_TOO_SMALL) && (ckDataLength <= jIntToCKULong(jOutLen))) {
   657         outBufP = (CK_BYTE_PTR) malloc(ckDataLength);
   660         outBufP = (CK_BYTE_PTR) malloc(ckDataLength);
   658         if (outBufP == NULL) {
   661         if (outBufP == NULL) {
   659             if (inBufP != INBUF) { free(inBufP); }
       
   660             throwOutOfMemoryError(env, 0);
   662             throwOutOfMemoryError(env, 0);
   661             return 0;
   663             goto cleanup;
   662         }
   664         }
   663         rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength);
   665         rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength);
   664     }
   666     }
   665     if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   667     if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   666         (*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckDataLength, (jbyte *)outBufP);
   668         (*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckDataLength, (jbyte *)outBufP);
   667     }
   669     }
   668 
   670 
       
   671 cleanup:
   669     if (inBufP != INBUF) { free(inBufP); }
   672     if (inBufP != INBUF) { free(inBufP); }
   670     if (outBufP != OUTBUF) { free(outBufP); }
   673     if (outBufP != OUTBUF) { free(outBufP); }
   671 
   674 
   672     return ckDataLength;
   675     return ckDataLength;
   673 }
   676 }