Skip to content

Commit 7f89200

Browse files
Merge pull request #69 from cconlon/verifyCbfix
Internal verify callback fixes and rework
2 parents 4a65ce3 + 3930359 commit 7f89200

13 files changed

Lines changed: 667 additions & 223 deletions

native/com_wolfssl_WolfSSL.c

Lines changed: 53 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,20 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_cleanup
555555
(void)jenv;
556556
(void)jcl;
557557

558+
/* release global logging callback object if registered */
559+
if (g_loggingCbIfaceObj != NULL) {
560+
(*jenv)->DeleteGlobalRef(jenv, g_loggingCbIfaceObj);
561+
g_loggingCbIfaceObj = NULL;
562+
}
563+
564+
#ifdef HAVE_FIPS
565+
/* release existing FIPS callback object if set */
566+
if (g_fipsCbIfaceObj != NULL) {
567+
(*jenv)->DeleteGlobalRef(jenv, g_fipsCbIfaceObj);
568+
g_fipsCbIfaceObj = NULL;
569+
}
570+
#endif
571+
558572
return wolfSSL_Cleanup();
559573
}
560574

@@ -583,18 +597,26 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_setLoggingCb
583597

584598
(void)jcl;
585599

586-
if (!jenv || !callback) {
600+
if (jenv == NULL) {
587601
return BAD_FUNC_ARG;
588602
}
589603

590-
/* store Java logging callback Interface object */
591-
g_loggingCbIfaceObj = (*jenv)->NewGlobalRef(jenv, callback);
592-
if (!g_loggingCbIfaceObj) {
593-
printf("error storing global logging callback interface\n");
594-
return SSL_FAILURE;
604+
/* release existing logging callback object if registered */
605+
if (g_loggingCbIfaceObj != NULL) {
606+
(*jenv)->DeleteGlobalRef(jenv, g_loggingCbIfaceObj);
607+
g_loggingCbIfaceObj = NULL;
595608
}
596609

597-
ret = wolfSSL_SetLoggingCb(NativeLoggingCallback);
610+
if (callback != NULL) {
611+
/* store Java logging callback Interface object */
612+
g_loggingCbIfaceObj = (*jenv)->NewGlobalRef(jenv, callback);
613+
if (g_loggingCbIfaceObj == NULL) {
614+
printf("error storing global logging callback interface\n");
615+
return SSL_FAILURE;
616+
}
617+
618+
ret = wolfSSL_SetLoggingCb(NativeLoggingCallback);
619+
}
598620

599621
return ret;
600622
}
@@ -776,6 +798,10 @@ void NativeFIPSErrorCallback(const int ok, const int err,
776798
(*jenv)->ThrowNew(jenv, excClass,
777799
"Object reference invalid in NativeFIPSErrorCallback");
778800
}
801+
#else
802+
(void)ok;
803+
(void)err;
804+
(void)hash;
779805
#endif
780806
}
781807

@@ -786,21 +812,29 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_setFIPSCb
786812
(void)jcl;
787813

788814
#ifdef HAVE_FIPS
789-
if (jenv == NULL || callback == NULL) {
815+
if (jenv == NULL) {
790816
return BAD_FUNC_ARG;
791817
}
792818

793-
/* store Java FIPS callback Interface object */
794-
g_fipsCbIfaceObj = (*jenv)->NewGlobalRef(jenv, callback);
795-
if (!g_fipsCbIfaceObj) {
796-
printf("error storing global wolfCrypt FIPS callback interface\n");
797-
return SSL_FAILURE;
819+
/* release existing FIPS callback object if set */
820+
if (g_fipsCbIfaceObj != NULL) {
821+
(*jenv)->DeleteGlobalRef(jenv, g_fipsCbIfaceObj);
822+
g_fipsCbIfaceObj = NULL;
798823
}
799824

800-
/* register NativeFIPSErrorCallback, wraps Java callback */
801-
ret = wolfCrypt_SetCb_fips(NativeFIPSErrorCallback);
802-
if (ret == 0) {
803-
ret = SSL_SUCCESS;
825+
if (callback != NULL) {
826+
/* store Java FIPS callback Interface object */
827+
g_fipsCbIfaceObj = (*jenv)->NewGlobalRef(jenv, callback);
828+
if (g_fipsCbIfaceObj == NULL) {
829+
printf("error storing global wolfCrypt FIPS callback interface\n");
830+
return SSL_FAILURE;
831+
}
832+
833+
/* register NativeFIPSErrorCallback, wraps Java callback */
834+
ret = wolfCrypt_SetCb_fips(NativeFIPSErrorCallback);
835+
if (ret == 0) {
836+
ret = SSL_SUCCESS;
837+
}
804838
}
805839
#else
806840
(void)jenv;
@@ -817,6 +851,8 @@ JNIEXPORT jstring JNICALL Java_com_wolfssl_WolfSSL_getWolfCryptFIPSCoreHash
817851
#ifdef HAVE_FIPS
818852
return (*jenv)->NewStringUTF(jenv, wolfCrypt_GetCoreHash_fips());
819853
#else
854+
(void)jenv;
855+
(void)jcl;
820856
return NULL;
821857
#endif
822858
}

native/com_wolfssl_WolfSSLCertificate.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,6 @@ JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1get_1sign
332332
(*jenv)->ExceptionDescribe(jenv);
333333
(*jenv)->ExceptionClear(jenv);
334334
(*jenv)->DeleteLocalRef(jenv, ret);
335-
XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
336335
return NULL;
337336
}
338337

@@ -547,7 +546,6 @@ JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1get_1pubk
547546
(*jenv)->ExceptionDescribe(jenv);
548547
(*jenv)->ExceptionClear(jenv);
549548
(*jenv)->DeleteLocalRef(jenv, ret);
550-
XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
551549
return NULL;
552550
}
553551

native/com_wolfssl_WolfSSLContext.c

Lines changed: 47 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,18 @@ JNIEXPORT void JNICALL Java_com_wolfssl_WolfSSLContext_freeContext
324324
(void)jenv;
325325
(void)jcl;
326326

327+
/* release verify callback object if set */
328+
if (g_verifyCbIfaceObj != NULL) {
329+
(*jenv)->DeleteGlobalRef(jenv, g_verifyCbIfaceObj);
330+
g_verifyCbIfaceObj = NULL;
331+
}
332+
333+
/* release global CRL callback object if set */
334+
if (g_crlCtxCbIfaceObj != NULL) {
335+
(*jenv)->DeleteGlobalRef(jenv, g_crlCtxCbIfaceObj);
336+
g_crlCtxCbIfaceObj = NULL;
337+
}
338+
327339
/* wolfSSL checks for null pointer */
328340
wolfSSL_CTX_free((WOLFSSL_CTX*)(uintptr_t)ctx);
329341
}
@@ -333,13 +345,23 @@ JNIEXPORT void JNICALL Java_com_wolfssl_WolfSSLContext_setVerify(JNIEnv* jenv,
333345
{
334346
(void)jcl;
335347

348+
if (jenv == NULL) {
349+
return;
350+
}
351+
352+
/* release verify callback object if set before */
353+
if (g_verifyCbIfaceObj != NULL) {
354+
(*jenv)->DeleteGlobalRef(jenv, g_verifyCbIfaceObj);
355+
g_verifyCbIfaceObj = NULL;
356+
}
357+
336358
if (!callbackIface) {
337359
wolfSSL_CTX_set_verify((WOLFSSL_CTX*)(uintptr_t)ctx, mode, NULL);
338-
} else {
339-
360+
}
361+
else {
340362
/* store Java verify Interface object */
341363
g_verifyCbIfaceObj = (*jenv)->NewGlobalRef(jenv, callbackIface);
342-
if (!g_verifyCbIfaceObj) {
364+
if (g_verifyCbIfaceObj == NULL) {
343365
printf("error storing global callback interface\n");
344366
}
345367

@@ -1512,25 +1534,34 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLContext_setCRLCb
15121534

15131535
(void)jcl;
15141536

1515-
if (!jenv || !ctx || !cb) {
1537+
if (jenv == NULL || ctx == 0) {
15161538
return BAD_FUNC_ARG;
15171539
}
15181540

1519-
/* store Java CRL callback Interface object */
1520-
g_crlCtxCbIfaceObj = (*jenv)->NewGlobalRef(jenv, cb);
1541+
/* release global CRL callback object if set */
1542+
if (g_crlCtxCbIfaceObj != NULL) {
1543+
(*jenv)->DeleteGlobalRef(jenv, g_crlCtxCbIfaceObj);
1544+
g_crlCtxCbIfaceObj = NULL;
1545+
}
15211546

1522-
if (!g_crlCtxCbIfaceObj) {
1523-
excClass = (*jenv)->FindClass(jenv, "com/wolfssl/WolfSSLJNIException");
1524-
if ((*jenv)->ExceptionOccurred(jenv)) {
1525-
(*jenv)->ExceptionDescribe(jenv);
1526-
(*jenv)->ExceptionClear(jenv);
1547+
if (cb != NULL) {
1548+
/* store Java CRL callback Interface object */
1549+
g_crlCtxCbIfaceObj = (*jenv)->NewGlobalRef(jenv, cb);
1550+
1551+
if (!g_crlCtxCbIfaceObj) {
1552+
excClass = (*jenv)->FindClass(jenv,
1553+
"com/wolfssl/WolfSSLJNIException");
1554+
if ((*jenv)->ExceptionOccurred(jenv)) {
1555+
(*jenv)->ExceptionDescribe(jenv);
1556+
(*jenv)->ExceptionClear(jenv);
1557+
}
1558+
(*jenv)->ThrowNew(jenv, excClass,
1559+
"error storing global missing CTX CRL callback interface");
15271560
}
1528-
(*jenv)->ThrowNew(jenv, excClass,
1529-
"error storing global missing CTX CRL callback interface");
1530-
}
15311561

1532-
ret = wolfSSL_CTX_SetCRL_Cb((WOLFSSL_CTX*)(uintptr_t)ctx,
1533-
NativeCtxMissingCRLCallback);
1562+
ret = wolfSSL_CTX_SetCRL_Cb((WOLFSSL_CTX*)(uintptr_t)ctx,
1563+
NativeCtxMissingCRLCallback);
1564+
}
15341565

15351566
return ret;
15361567
#else

0 commit comments

Comments
 (0)