@@ -847,3 +847,228 @@ JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1get_1signatu
847847 return NULL ;
848848#endif
849849}
850+
851+ JNIEXPORT jlong JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1load_1buffer
852+ (JNIEnv * jenv , jclass jcl , jbyteArray buf , jint format )
853+ {
854+ #if defined(HAVE_CRL ) && defined(OPENSSL_EXTRA )
855+ WOLFSSL_X509_CRL * crl = NULL ;
856+ byte * bufPtr = NULL ;
857+ int bufSz = 0 ;
858+ (void )jcl ;
859+
860+ if (jenv == NULL || buf == NULL ) {
861+ return 0 ;
862+ }
863+
864+ bufPtr = (byte * )(* jenv )-> GetByteArrayElements (jenv , buf , NULL );
865+ bufSz = (* jenv )-> GetArrayLength (jenv , buf );
866+
867+ if (bufPtr == NULL || bufSz <= 0 ) {
868+ if (bufPtr != NULL ) {
869+ (* jenv )-> ReleaseByteArrayElements (
870+ jenv , buf , (jbyte * )bufPtr , JNI_ABORT );
871+ }
872+ return 0 ;
873+ }
874+
875+ if ((int )format == WOLFSSL_FILETYPE_PEM ) {
876+ /* PEM format: use BIO to decode */
877+ WOLFSSL_BIO * bio = wolfSSL_BIO_new_mem_buf (bufPtr , bufSz );
878+ if (bio != NULL ) {
879+ crl = wolfSSL_PEM_read_bio_X509_CRL (bio , NULL , NULL , NULL );
880+ wolfSSL_BIO_free (bio );
881+ }
882+ }
883+ else {
884+ /* DER format: decode directly */
885+ crl = wolfSSL_d2i_X509_CRL (NULL , (const unsigned char * )bufPtr , bufSz );
886+ }
887+
888+ (* jenv )-> ReleaseByteArrayElements (jenv , buf , (jbyte * )bufPtr , JNI_ABORT );
889+
890+ return (jlong )(uintptr_t )crl ;
891+ #else
892+ (void )jenv ;
893+ (void )jcl ;
894+ (void )buf ;
895+ (void )format ;
896+ return 0 ;
897+ #endif
898+ }
899+
900+ JNIEXPORT jlong JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1load_1file
901+ (JNIEnv * jenv , jclass jcl , jstring path , jint format )
902+ {
903+ #if defined(HAVE_CRL ) && defined(OPENSSL_EXTRA ) && \
904+ !defined(NO_FILESYSTEM )
905+ WOLFSSL_X509_CRL * crl = NULL ;
906+ const char * cPath = NULL ;
907+ XFILE fp = XBADFILE ;
908+ (void )jcl ;
909+
910+ if (jenv == NULL || path == NULL ) {
911+ return 0 ;
912+ }
913+
914+ cPath = (* jenv )-> GetStringUTFChars (jenv , path , NULL );
915+ if (cPath == NULL ) {
916+ return 0 ;
917+ }
918+
919+ fp = XFOPEN (cPath , "rb" );
920+ if (fp == XBADFILE ) {
921+ (* jenv )-> ReleaseStringUTFChars (jenv , path , cPath );
922+ return 0 ;
923+ }
924+
925+ if ((int )format == WOLFSSL_FILETYPE_PEM ) {
926+ crl = wolfSSL_PEM_read_X509_CRL (fp , NULL , NULL , NULL );
927+ }
928+ else {
929+ crl = wolfSSL_d2i_X509_CRL_fp (fp , NULL );
930+ }
931+
932+ XFCLOSE (fp );
933+ (* jenv )-> ReleaseStringUTFChars (jenv , path , cPath );
934+
935+ return (jlong )(uintptr_t )crl ;
936+ #else
937+ (void )jenv ;
938+ (void )jcl ;
939+ (void )path ;
940+ (void )format ;
941+ return 0 ;
942+ #endif
943+ }
944+
945+ JNIEXPORT jstring JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1get_1issuer_1name_1string
946+ (JNIEnv * jenv , jclass jcl , jlong crlPtr )
947+ {
948+ #if defined(HAVE_CRL ) && defined(OPENSSL_EXTRA )
949+ WOLFSSL_X509_CRL * crl = (WOLFSSL_X509_CRL * )(uintptr_t )crlPtr ;
950+ WOLFSSL_X509_NAME * name = NULL ;
951+ char * nameStr = NULL ;
952+ jstring ret = NULL ;
953+ (void )jcl ;
954+
955+ if (jenv == NULL || crl == NULL ) {
956+ return NULL ;
957+ }
958+
959+ name = wolfSSL_X509_CRL_get_issuer_name (crl );
960+ if (name != NULL ) {
961+ nameStr = wolfSSL_X509_NAME_oneline (name , NULL , 0 );
962+ if (nameStr == NULL ) {
963+ return NULL ;
964+ }
965+ ret = (* jenv )-> NewStringUTF (jenv , nameStr );
966+ XFREE (nameStr , NULL , DYNAMIC_TYPE_OPENSSL );
967+ return ret ;
968+ }
969+ return NULL ;
970+ #else
971+ (void )jenv ;
972+ (void )jcl ;
973+ (void )crlPtr ;
974+ return NULL ;
975+ #endif
976+ }
977+
978+ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1get_1signature_1type
979+ (JNIEnv * jenv , jclass jcl , jlong crlPtr )
980+ {
981+ #if defined(HAVE_CRL ) && defined(OPENSSL_EXTRA )
982+ WOLFSSL_X509_CRL * crl = (WOLFSSL_X509_CRL * )(uintptr_t )crlPtr ;
983+ (void )jcl ;
984+
985+ if (jenv == NULL || crl == NULL ) {
986+ return 0 ;
987+ }
988+
989+ return (jint )wolfSSL_X509_CRL_get_signature_type (crl );
990+ #else
991+ (void )jenv ;
992+ (void )jcl ;
993+ (void )crlPtr ;
994+ return 0 ;
995+ #endif
996+ }
997+
998+ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1get_1signature_1nid
999+ (JNIEnv * jenv , jclass jcl , jlong crlPtr )
1000+ {
1001+ #if defined(HAVE_CRL ) && defined(OPENSSL_EXTRA )
1002+ WOLFSSL_X509_CRL * crl = (WOLFSSL_X509_CRL * )(uintptr_t )crlPtr ;
1003+ (void )jcl ;
1004+
1005+ if (jenv == NULL || crl == NULL ) {
1006+ return 0 ;
1007+ }
1008+
1009+ return (jint )wolfSSL_X509_CRL_get_signature_nid (crl );
1010+ #else
1011+ (void )jenv ;
1012+ (void )jcl ;
1013+ (void )crlPtr ;
1014+ return 0 ;
1015+ #endif
1016+ }
1017+
1018+ /* TODO: wolfSSL_X509_CRL_verify() is currently a stub in wolfSSL
1019+ * (src/x509.c, guarded by NO_WOLFSSL_STUB) and always returns 0.
1020+ * This JNI wrapper is provided for API completeness and will work
1021+ * correctly once the native implementation is completed. */
1022+ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1verify
1023+ (JNIEnv * jenv , jclass jcl , jlong crlPtr , jbyteArray pubKey )
1024+ {
1025+ #if defined(HAVE_CRL ) && defined(OPENSSL_EXTRA )
1026+ WOLFSSL_X509_CRL * crl = (WOLFSSL_X509_CRL * )(uintptr_t )crlPtr ;
1027+ WOLFSSL_EVP_PKEY * pkey = NULL ;
1028+ unsigned char * buf = NULL ;
1029+ #if LIBWOLFSSL_VERSION_HEX >= 0x04004000
1030+ const unsigned char * ptr = NULL ;
1031+ #else
1032+ unsigned char * ptr = NULL ;
1033+ #endif
1034+ int pubKeySz ;
1035+ int ret ;
1036+ (void )jcl ;
1037+
1038+ if (jenv == NULL || crl == NULL || pubKey == NULL ) {
1039+ return BAD_FUNC_ARG ;
1040+ }
1041+
1042+ pubKeySz = (* jenv )-> GetArrayLength (jenv , pubKey );
1043+ if (pubKeySz <= 0 ) {
1044+ return BAD_FUNC_ARG ;
1045+ }
1046+
1047+ buf = (unsigned char * )(* jenv )-> GetByteArrayElements (jenv , pubKey , NULL );
1048+ if (buf == NULL ) {
1049+ return MEMORY_E ;
1050+ }
1051+ ptr = buf ;
1052+
1053+ /* Note thatwolfSSL_d2i_PUBKEY advances ptr */
1054+ pkey = wolfSSL_d2i_PUBKEY (NULL , & ptr , pubKeySz );
1055+
1056+ (* jenv )-> ReleaseByteArrayElements (jenv , pubKey , (jbyte * )buf , JNI_ABORT );
1057+
1058+ if (pkey == NULL ) {
1059+ return WOLFSSL_FAILURE ;
1060+ }
1061+
1062+ ret = wolfSSL_X509_CRL_verify (crl , pkey );
1063+
1064+ wolfSSL_EVP_PKEY_free (pkey );
1065+
1066+ return ret ;
1067+ #else
1068+ (void )jenv ;
1069+ (void )jcl ;
1070+ (void )crlPtr ;
1071+ (void )pubKey ;
1072+ return 0 ;
1073+ #endif
1074+ }
0 commit comments