Skip to content

Commit ee502c4

Browse files
committed
Add missing API, misc updates
1 parent f53a19b commit ee502c4

11 files changed

Lines changed: 388 additions & 77 deletions

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ ifeq ($(LIBDIR),)
1717
LIBDIR=lib
1818
endif
1919

20-
2120
all: build
2221

22+
.PHONY: build
2323
build: java.sh build.xml
24-
@cflags=""; \
24+
@cflags=""; \
2525
if [ "$(ENABLE_PATCHES)" = "1" ]; then \
2626
if [ -n "$(PATCH_DEFINES)" ]; then \
2727
defines="$(PATCH_DEFINES)"; \

java.sh

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,21 @@ gcc -Wall -c $fpic $CFLAGS ./native/com_wolfssl_WolfSSLCRL.c -o ./native/com_wol
129129
gcc -Wall -c $fpic $CFLAGS ./native/com_wolfssl_WolfSSLX509Name.c -o ./native/com_wolfssl_WolfSSLX509Name.o $javaIncludes
130130
gcc -Wall -c $fpic $CFLAGS ./native/com_wolfssl_WolfSSLX509StoreCtx.c -o ./native/com_wolfssl_WolfSSLX509StoreCtx.o $javaIncludes
131131
gcc -Wall -c $fpic $CFLAGS ./native/com_wolfssl_WolfSSLNameConstraints.c -o ./native/com_wolfssl_WolfSSLNameConstraints.o $javaIncludes
132-
gcc -Wall $javaLibs $CFLAGS -o ./lib/$jniLibName ./native/com_wolfssl_WolfSSL.o ./native/com_wolfssl_WolfSSLSession.o ./native/com_wolfssl_WolfSSLContext.o ./native/com_wolfssl_WolfCryptRSA.o ./native/com_wolfssl_WolfCryptECC.o ./native/com_wolfssl_WolfCryptEccKey.o ./native/com_wolfssl_WolfSSLCertManager.o ./native/com_wolfssl_WolfSSLCertRequest.o ./native/com_wolfssl_WolfSSLCertificate.o ./native/com_wolfssl_WolfSSLX509Name.o ./native/com_wolfssl_WolfSSLX509StoreCtx.o ./native/com_wolfssl_WolfSSLNameConstraints.o -L$WOLFSSL_INSTALL_DIR/lib -L$WOLFSSL_INSTALL_DIR/lib64 -l$WOLFSSL_LIBNAME
133-
gcc -Wall $javaLibs $CFLAGS -o ./lib/$jniLibName ./native/com_wolfssl_WolfSSL.o ./native/com_wolfssl_WolfSSLSession.o ./native/com_wolfssl_WolfSSLContext.o ./native/com_wolfssl_WolfCryptRSA.o ./native/com_wolfssl_WolfCryptECC.o ./native/com_wolfssl_WolfCryptEccKey.o ./native/com_wolfssl_WolfSSLCertManager.o ./native/com_wolfssl_WolfSSLCertRequest.o ./native/com_wolfssl_WolfSSLCertificate.o ./native/com_wolfssl_WolfSSLCRL.o ./native/com_wolfssl_WolfSSLX509Name.o ./native/com_wolfssl_WolfSSLX509StoreCtx.o -L$WOLFSSL_INSTALL_DIR/lib -L$WOLFSSL_INSTALL_DIR/lib64 -l$WOLFSSL_LIBNAME
132+
gcc -Wall $javaLibs $CFLAGS -o ./lib/$jniLibName \
133+
./native/com_wolfssl_WolfSSL.o \
134+
./native/com_wolfssl_WolfSSLSession.o \
135+
./native/com_wolfssl_WolfSSLContext.o \
136+
./native/com_wolfssl_WolfCryptRSA.o \
137+
./native/com_wolfssl_WolfCryptECC.o \
138+
./native/com_wolfssl_WolfCryptEccKey.o \
139+
./native/com_wolfssl_WolfSSLCertManager.o \
140+
./native/com_wolfssl_WolfSSLCertRequest.o \
141+
./native/com_wolfssl_WolfSSLCertificate.o \
142+
./native/com_wolfssl_WolfSSLCRL.o \
143+
./native/com_wolfssl_WolfSSLX509Name.o \
144+
./native/com_wolfssl_WolfSSLX509StoreCtx.o \
145+
./native/com_wolfssl_WolfSSLNameConstraints.o \
146+
-L$WOLFSSL_INSTALL_DIR/lib -L$WOLFSSL_INSTALL_DIR/lib64 -l$WOLFSSL_LIBNAME
134147
if [ $? != 0 ]; then
135148
echo "Error creating native JNI library"
136149
exit 1

native/com_wolfssl_WolfSSL.c

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
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;
7475
static 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 */
78208
void 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
/**

native/com_wolfssl_WolfSSLCRL.c

Lines changed: 93 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -248,11 +248,14 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1add_1revoked
248248
{
249249
#if defined(WOLFSSL_JNI_CRL_GEN_ENABLED)
250250
WOLFSSL_X509_CRL* crl = (WOLFSSL_X509_CRL*)(uintptr_t)crlPtr;
251+
WOLFSSL_X509_REVOKED revoked;
252+
WOLFSSL_ASN1_INTEGER* serialInt = NULL;
251253
byte* serialBuf = NULL;
252-
byte* dateBuf = NULL;
253254
int serialSz = 0;
254255
int ret = WOLFSSL_SUCCESS;
255256
(void)jcl;
257+
(void)revDate;
258+
(void)dateFmt;
256259

257260
if (jenv == NULL || crl == NULL || serial == NULL) {
258261
return WOLFSSL_FAILURE;
@@ -264,24 +267,24 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1add_1revoked
264267
ret = WOLFSSL_FAILURE;
265268
}
266269
else {
267-
if (revDate != NULL) {
268-
dateBuf = (byte*)(*jenv)->GetByteArrayElements(jenv, revDate, NULL);
269-
if (dateBuf == NULL) {
270-
ret = WOLFSSL_FAILURE;
271-
}
270+
serialInt = wolfSSL_ASN1_INTEGER_new();
271+
if (serialInt == NULL) {
272+
ret = MEMORY_E;
272273
}
273-
if (ret != WOLFSSL_FAILURE) {
274-
ret = wolfSSL_X509_CRL_add_revoked(crl, serialBuf, serialSz,
275-
dateBuf, (unsigned char)dateFmt);
276-
}
277-
if (dateBuf != NULL) {
278-
(*jenv)->ReleaseByteArrayElements(jenv, revDate, (jbyte*)dateBuf,
279-
JNI_ABORT);
274+
else {
275+
serialInt->data = (unsigned char*)serialBuf;
276+
serialInt->dataMax = (unsigned int)serialSz;
277+
serialInt->length = serialSz;
278+
serialInt->isDynamic = 0;
279+
serialInt->type = 0;
280+
revoked.serialNumber = serialInt;
281+
ret = wolfSSL_X509_CRL_add_revoked(crl, &revoked);
280282
}
281283
}
282284

283285
(*jenv)->ReleaseByteArrayElements(jenv, serial, (jbyte*)serialBuf,
284286
JNI_ABORT);
287+
wolfSSL_ASN1_INTEGER_free(serialInt);
285288

286289
return ret;
287290
#else
@@ -302,10 +305,11 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1add_1revoked_1cert
302305
#if defined(WOLFSSL_JNI_CRL_GEN_ENABLED)
303306
WOLFSSL_X509_CRL* crl = (WOLFSSL_X509_CRL*)(uintptr_t)crlPtr;
304307
byte* certBuf = NULL;
305-
byte* dateBuf = NULL;
306308
int certSz = 0;
307309
int ret = WOLFSSL_SUCCESS;
308310
(void)jcl;
311+
(void)revDate;
312+
(void)dateFmt;
309313

310314
if (jenv == NULL || crl == NULL || certDer == NULL) {
311315
return WOLFSSL_FAILURE;
@@ -317,20 +321,7 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1add_1revoked_1cert
317321
ret = WOLFSSL_FAILURE;
318322
}
319323
else {
320-
if (revDate != NULL) {
321-
dateBuf = (byte*)(*jenv)->GetByteArrayElements(jenv, revDate, NULL);
322-
if (dateBuf == NULL) {
323-
ret = WOLFSSL_FAILURE;
324-
}
325-
}
326-
if (ret != WOLFSSL_FAILURE) {
327-
ret = wolfSSL_X509_CRL_add_revoked_cert(crl, certBuf, certSz,
328-
dateBuf, (unsigned char)dateFmt);
329-
}
330-
if (dateBuf != NULL) {
331-
(*jenv)->ReleaseByteArrayElements(jenv, revDate, (jbyte*)dateBuf,
332-
JNI_ABORT);
333-
}
324+
ret = wolfSSL_X509_CRL_add_revoked_cert(crl, certBuf, certSz);
334325
}
335326

336327
(*jenv)->ReleaseByteArrayElements(jenv, certDer, (jbyte*)certBuf,
@@ -416,6 +407,7 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1sign
416407
}
417408
else {
418409
XMEMSET(derBuf, 0, derSz);
410+
ret = WOLFSSL_SUCCESS;
419411
}
420412
}
421413
/* convert PEM to DER */
@@ -424,6 +416,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1sign
424416
if (ret <= 0 || ret != derSz) {
425417
ret = WOLFSSL_FAILURE;
426418
}
419+
else {
420+
ret = WOLFSSL_SUCCESS;
421+
}
427422
}
428423
}
429424
}
@@ -778,3 +773,73 @@ JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1get_1pem
778773
return NULL;
779774
#endif
780775
}
776+
777+
JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1get_1signature
778+
(JNIEnv* jenv, jclass jcl, jlong crlPtr)
779+
{
780+
#if defined(WOLFSSL_JNI_CRL_GEN_ENABLED)
781+
WOLFSSL_X509_CRL* crl = (WOLFSSL_X509_CRL*)(uintptr_t)crlPtr;
782+
int sigSz = 0;
783+
unsigned char* sigBuf = NULL;
784+
jbyteArray sigArr = NULL;
785+
jclass excClass = NULL;
786+
(void)jcl;
787+
788+
if (jenv == NULL || crl == NULL) {
789+
return NULL;
790+
}
791+
792+
if (wolfSSL_X509_CRL_get_signature(crl, NULL, &sigSz) != WOLFSSL_SUCCESS ||
793+
sigSz <= 0) {
794+
return NULL;
795+
}
796+
797+
sigArr = (*jenv)->NewByteArray(jenv, sigSz);
798+
if (sigArr == NULL) {
799+
(*jenv)->ThrowNew(jenv, jcl,
800+
"Failed to create byte array in native X509_CRL_get_signature");
801+
return NULL;
802+
}
803+
804+
sigBuf = (unsigned char*)XMALLOC(sigSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
805+
if (sigBuf == NULL) {
806+
(*jenv)->DeleteLocalRef(jenv, sigArr);
807+
return NULL;
808+
}
809+
810+
if (wolfSSL_X509_CRL_get_signature(crl, sigBuf, &sigSz)
811+
!= WOLFSSL_SUCCESS) {
812+
(*jenv)->DeleteLocalRef(jenv, sigArr);
813+
XFREE(sigBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
814+
return NULL;
815+
}
816+
817+
excClass = (*jenv)->FindClass(jenv, "com/wolfssl/WolfSSLJNIException");
818+
if ((*jenv)->ExceptionOccurred(jenv)) {
819+
(*jenv)->ExceptionDescribe(jenv);
820+
(*jenv)->ExceptionClear(jenv);
821+
(*jenv)->DeleteLocalRef(jenv, sigArr);
822+
XFREE(sigBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
823+
return NULL;
824+
}
825+
826+
(*jenv)->SetByteArrayRegion(jenv, sigArr, 0, sigSz,
827+
(const jbyte*)sigBuf);
828+
XFREE(sigBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
829+
if ((*jenv)->ExceptionOccurred(jenv)) {
830+
(*jenv)->ExceptionDescribe(jenv);
831+
(*jenv)->ExceptionClear(jenv);
832+
(*jenv)->DeleteLocalRef(jenv, sigArr);
833+
(*jenv)->ThrowNew(jenv, excClass,
834+
"Failed to set byte region in native X509_CRL_get_signature");
835+
return NULL;
836+
}
837+
838+
return sigArr;
839+
#else
840+
(void)jenv;
841+
(void)jcl;
842+
(void)crlPtr;
843+
return NULL;
844+
#endif
845+
}

0 commit comments

Comments
 (0)