Skip to content

Commit 42c47d6

Browse files
committed
Add missing API, misc updates
1 parent c5f9480 commit 42c47d6

5 files changed

Lines changed: 105 additions & 39 deletions

File tree

native/com_wolfssl_WolfSSLCRL.c

Lines changed: 73 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,
@@ -778,3 +769,57 @@ JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1get_1pem
778769
return NULL;
779770
#endif
780771
}
772+
773+
JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_WolfSSLCRL_X509_1CRL_1get_1signature
774+
(JNIEnv* jenv, jclass jcl, jlong crlPtr)
775+
{
776+
#if defined(WOLFSSL_JNI_CRL_GEN_ENABLED)
777+
WOLFSSL_X509_CRL* crl = (WOLFSSL_X509_CRL*)(uintptr_t)crlPtr;
778+
const WOLFSSL_ASN1_BIT_STRING* sig = NULL;
779+
jbyteArray sigArr = NULL;
780+
jclass excClass = NULL;
781+
(void)jcl;
782+
783+
if (jenv == NULL || crl == NULL) {
784+
return NULL;
785+
}
786+
787+
wolfSSL_X509_CRL_get_signature(crl, &sig, NULL);
788+
if (sig == NULL || sig->data == NULL || sig->length <= 0) {
789+
return NULL;
790+
}
791+
792+
sigArr = (*jenv)->NewByteArray(jenv, sig->length);
793+
if (sigArr == NULL) {
794+
(*jenv)->ThrowNew(jenv, jcl,
795+
"Failed to create byte array in native X509_CRL_get_signature");
796+
return NULL;
797+
}
798+
799+
excClass = (*jenv)->FindClass(jenv, "com/wolfssl/WolfSSLJNIException");
800+
if ((*jenv)->ExceptionOccurred(jenv)) {
801+
(*jenv)->ExceptionDescribe(jenv);
802+
(*jenv)->ExceptionClear(jenv);
803+
(*jenv)->DeleteLocalRef(jenv, sigArr);
804+
return NULL;
805+
}
806+
807+
(*jenv)->SetByteArrayRegion(jenv, sigArr, 0, sig->length,
808+
(const jbyte*)sig->data);
809+
if ((*jenv)->ExceptionOccurred(jenv)) {
810+
(*jenv)->ExceptionDescribe(jenv);
811+
(*jenv)->ExceptionClear(jenv);
812+
(*jenv)->DeleteLocalRef(jenv, sigArr);
813+
(*jenv)->ThrowNew(jenv, excClass,
814+
"Failed to set byte region in native X509_CRL_get_signature");
815+
return NULL;
816+
}
817+
818+
return sigArr;
819+
#else
820+
(void)jenv;
821+
(void)jcl;
822+
(void)crlPtr;
823+
return NULL;
824+
#endif
825+
}

native/com_wolfssl_WolfSSLCRL.h

Lines changed: 8 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/java/com/wolfssl/WolfSSLCRL.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ static native int X509_CRL_sign(long crl, int keyType, byte[] keyBytes,
8888
static native String X509_CRL_get_nextUpdate(long crl);
8989
static native byte[] X509_CRL_get_der(long crl);
9090
static native byte[] X509_CRL_get_pem(long crl);
91+
static native byte[] X509_CRL_get_signature(long crl);
9192

9293
private static final class Asn1TimeData {
9394
private final byte[] paddedData;
@@ -633,6 +634,25 @@ public Date getNextUpdate() {
633634
return null;
634635
}
635636

637+
/**
638+
* Get CRL signature bytes.
639+
*
640+
* @return signature byte array or null if not available.
641+
*
642+
* @throws IllegalStateException if WolfSSLCRL has been freed.
643+
*/
644+
public byte[] getSignature() {
645+
confirmObjectIsActive();
646+
647+
synchronized (crlLock) {
648+
WolfSSLDebug.log(getClass(), WolfSSLDebug.Component.JNI,
649+
WolfSSLDebug.INFO, this.crlPtr,
650+
() -> "entered getSignature()");
651+
652+
return X509_CRL_get_signature(this.crlPtr);
653+
}
654+
}
655+
636656
@Override
637657
public String toString() {
638658
byte[] crlText = null;

src/test/com/wolfssl/test/WolfSSLCRLTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,9 @@ public void testSign_PrivateKey()
455455
/* Sign CRL */
456456
int ret = crl.sign(privKey, "SHA256");
457457
assertTrue("sign should succeed", ret >= 0);
458+
byte[] sig = crl.getSignature();
459+
assertNotNull("signature should be available after sign", sig);
460+
assertTrue("signature length should be > 0", sig.length > 0);
458461

459462
/* Test null private key */
460463
try {

src/test/com/wolfssl/test/WolfSSLTestSuite.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
WolfSSLCertificateTest.class,
3939
WolfSSLCertRequestTest.class,
4040
WolfSSLCertManagerTest.class,
41-
WolfSSLNameConstraintsTest.class
41+
WolfSSLNameConstraintsTest.class,
4242
WolfSSLCRLTest.class
4343
})
4444

0 commit comments

Comments
 (0)