2121
2222#include <stdio.h>
2323#include <stdint.h>
24+ #include <stdlib.h>
2425#ifdef WOLFSSL_USER_SETTINGS
2526 #include <wolfssl/wolfcrypt/settings.h>
2627#else
@@ -74,6 +75,135 @@ jmethodID g_verifyCallbackMethodId = NULL;
7475static jobject g_fipsCbIfaceObj ;
7576#endif
7677
78+ typedef struct WolfSSLJniObjMap {
79+ WOLFSSL * ssl ;
80+ void * obj ;
81+ struct WolfSSLJniObjMap * next ;
82+ } WolfSSLJniObjMap ;
83+
84+ static WolfSSLJniObjMap * g_jniObjMap = NULL ;
85+ static wolfSSL_Mutex g_jniObjMapLock ;
86+ static int g_jniObjMapLockInit = 0 ;
87+
88+ static void wolfSSL_jni_objmap_cleanup (void )
89+ {
90+ WolfSSLJniObjMap * cur ;
91+ WolfSSLJniObjMap * next ;
92+
93+ if (!g_jniObjMapLockInit ) {
94+ g_jniObjMap = NULL ;
95+ return ;
96+ }
97+
98+ if (wc_LockMutex (& g_jniObjMapLock ) == 0 ) {
99+ cur = g_jniObjMap ;
100+ g_jniObjMap = NULL ;
101+ wc_UnLockMutex (& g_jniObjMapLock );
102+ }
103+ else {
104+ cur = g_jniObjMap ;
105+ g_jniObjMap = NULL ;
106+ }
107+
108+ while (cur != NULL ) {
109+ next = cur -> next ;
110+ free (cur );
111+ cur = next ;
112+ }
113+
114+ wc_FreeMutex (& g_jniObjMapLock );
115+ g_jniObjMapLockInit = 0 ;
116+ }
117+
118+ int wolfSSL_jni_set_jobject (WOLFSSL * ssl , void * objPtr )
119+ {
120+ #ifdef WOLFSSL_JNI
121+ return wolfSSL_set_jobject (ssl , objPtr );
122+ #else
123+ WolfSSLJniObjMap * cur ;
124+ WolfSSLJniObjMap * prev = NULL ;
125+ WolfSSLJniObjMap * node ;
126+
127+ if (ssl == NULL ) {
128+ return BAD_FUNC_ARG ;
129+ }
130+ if (!g_jniObjMapLockInit ) {
131+ return SSL_FAILURE ;
132+ }
133+ if (wc_LockMutex (& g_jniObjMapLock ) != 0 ) {
134+ return SSL_FAILURE ;
135+ }
136+
137+ cur = g_jniObjMap ;
138+ while (cur != NULL && cur -> ssl != ssl ) {
139+ prev = cur ;
140+ cur = cur -> next ;
141+ }
142+
143+ if (objPtr == NULL ) {
144+ if (cur != NULL ) {
145+ if (prev != NULL ) {
146+ prev -> next = cur -> next ;
147+ }
148+ else {
149+ g_jniObjMap = cur -> next ;
150+ }
151+ free (cur );
152+ }
153+ wc_UnLockMutex (& g_jniObjMapLock );
154+ return SSL_SUCCESS ;
155+ }
156+
157+ if (cur != NULL ) {
158+ cur -> obj = objPtr ;
159+ wc_UnLockMutex (& g_jniObjMapLock );
160+ return SSL_SUCCESS ;
161+ }
162+
163+ node = (WolfSSLJniObjMap * )malloc (sizeof (WolfSSLJniObjMap ));
164+ if (node == NULL ) {
165+ wc_UnLockMutex (& g_jniObjMapLock );
166+ return MEMORY_E ;
167+ }
168+ node -> ssl = ssl ;
169+ node -> obj = objPtr ;
170+ node -> next = g_jniObjMap ;
171+ g_jniObjMap = node ;
172+
173+ wc_UnLockMutex (& g_jniObjMapLock );
174+ return SSL_SUCCESS ;
175+ #endif
176+ }
177+
178+ void * wolfSSL_jni_get_jobject (WOLFSSL * ssl )
179+ {
180+ #ifdef WOLFSSL_JNI
181+ return wolfSSL_get_jobject (ssl );
182+ #else
183+ WolfSSLJniObjMap * cur ;
184+ void * obj = NULL ;
185+
186+ if (ssl == NULL || !g_jniObjMapLockInit ) {
187+ return NULL ;
188+ }
189+ if (wc_LockMutex (& g_jniObjMapLock ) != 0 ) {
190+ return NULL ;
191+ }
192+
193+ cur = g_jniObjMap ;
194+ while (cur != NULL ) {
195+ if (cur -> ssl == ssl ) {
196+ obj = cur -> obj ;
197+ break ;
198+ }
199+ cur = cur -> next ;
200+ }
201+
202+ wc_UnLockMutex (& g_jniObjMapLock );
203+ return obj ;
204+ #endif
205+ }
206+
77207/* custom native fn prototypes */
78208void NativeLoggingCallback (const int logLevel , const char * const logMessage );
79209
@@ -89,6 +219,10 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
89219
90220 /* store JavaVM */
91221 g_vm = vm ;
222+ if (wc_InitMutex (& g_jniObjMapLock ) != 0 ) {
223+ return JNI_ERR ;
224+ }
225+ g_jniObjMapLockInit = 1 ;
92226
93227 /* get JNIEnv from JavaVM */
94228 if ((* vm )-> GetEnv (vm , (void * * )& env , JNI_VERSION_1_6 ) != JNI_OK ) {
@@ -235,6 +369,7 @@ JNIEXPORT void JNICALL JNI_OnUnload(JavaVM* vm, void* reserved)
235369 g_bufferArrayMethodId = NULL ;
236370 g_bufferSetPositionMethodId = NULL ;
237371 g_verifyCallbackMethodId = NULL ;
372+ wolfSSL_jni_objmap_cleanup ();
238373}
239374
240375/**
@@ -545,6 +680,58 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_getNID_1dnQualifier
545680 return NID_dnQualifier ;
546681}
547682
683+ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_getNID_1subject_1key_1identifier
684+ (JNIEnv * jenv , jclass jcl )
685+ {
686+ (void )jenv ;
687+ (void )jcl ;
688+
689+ #ifdef WOLFSSL_CERT_EXT
690+ return NID_subject_key_identifier ;
691+ #else
692+ return 0 ;
693+ #endif
694+ }
695+
696+ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_getNID_1authority_1key_1identifier
697+ (JNIEnv * jenv , jclass jcl )
698+ {
699+ (void )jenv ;
700+ (void )jcl ;
701+
702+ #ifdef WOLFSSL_CERT_EXT
703+ return NID_authority_key_identifier ;
704+ #else
705+ return 0 ;
706+ #endif
707+ }
708+
709+ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_getNID_1crl_1distribution_1points
710+ (JNIEnv * jenv , jclass jcl )
711+ {
712+ (void )jenv ;
713+ (void )jcl ;
714+
715+ #ifdef WOLFSSL_CERT_EXT
716+ return NID_crl_distribution_points ;
717+ #else
718+ return 0 ;
719+ #endif
720+ }
721+
722+ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_getNID_1netscape_1cert_1type
723+ (JNIEnv * jenv , jclass jcl )
724+ {
725+ (void )jenv ;
726+ (void )jcl ;
727+
728+ #ifndef IGNORE_NETSCAPE_CERT_TYPE
729+ return NID_netscape_cert_type ;
730+ #else
731+ return 0 ;
732+ #endif
733+ }
734+
548735/* functions to return BulkCipherAlgorithm enum values from ./wolfssl/ssl.h */
549736JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_getBulkCipherAlgorithmEnumNULL
550737 (JNIEnv * jenv , jclass jcl )
0 commit comments