Skip to content

Commit 5703ad0

Browse files
committed
JNI/JSSE: fix WolfSSLX509StoreCtx.getCerts() to correctly return peer cert first, then rest of chain
1 parent ba7b482 commit 5703ad0

3 files changed

Lines changed: 10 additions & 2 deletions

File tree

native/com_wolfssl_WolfSSLX509StoreCtx.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,11 @@ JNIEXPORT jobjectArray JNICALL Java_com_wolfssl_WolfSSLX509StoreCtx_X509_1STORE_
9393
}
9494
XMEMCPY(buf, der, derSz);
9595
(*jenv)->ReleaseByteArrayElements(jenv, derArr, buf, 0);
96-
(*jenv)->SetObjectArrayElement(jenv, certArr, i, derArr);
96+
/* Reverse order, so peer cert is first in returned array,
97+
* followed by intermediates, lastly by root. Native
98+
* wolfSSL_X509_STORE_GetCerts() returns certs in order of
99+
* root to peer, but Java/JSSE expects peer to root */
100+
(*jenv)->SetObjectArrayElement(jenv, certArr, skNum-1-i, derArr);
97101
(*jenv)->DeleteLocalRef(jenv, derArr);
98102
}
99103
}

src/java/com/wolfssl/WolfSSLX509StoreCtx.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ private synchronized void confirmObjectIsActive()
7979
* Get certificates in WOLFSSL_X509_STORE_CTX as an array of
8080
* WolfSSLCertificate objects.
8181
*
82+
* The certificate chain is returned in order of peer to root, with peer
83+
* first, then any intermediates, then root last (if present).
84+
*
8285
* @return array of certificates
8386
* @throws WolfSSLException on error
8487
* @throws IllegalStateException if object has been freed

src/java/com/wolfssl/provider/jsse/WolfSSLInternalVerifyCb.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,8 @@ public int verifyCallback(int preverify_ok, long x509StorePtr) {
274274
}
275275

276276
try {
277-
/* get WolfSSLCertificate[] from x509StorePtr */
277+
/* Get WolfSSLCertificate[] from x509StorePtr, certs from
278+
* store.getCerts() should be listed in order of peer to root */
278279
WolfSSLX509StoreCtx store =
279280
new WolfSSLX509StoreCtx(x509StorePtr);
280281
certs = store.getCerts();

0 commit comments

Comments
 (0)