Skip to content

Commit 96f1fdb

Browse files
authored
Merge pull request #323 from padelsbach/aia-updates
Extend AIA interface
2 parents 1e52e57 + 8df7464 commit 96f1fdb

6 files changed

Lines changed: 435 additions & 3 deletions

File tree

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDwTCCAqmgAwIBAgIUEcNoHSMtIkVhW/MmkmUEsVoJVQEwDQYJKoZIhvcNAQEL
3+
BQAwITEfMB0GA1UEAwwWd29sZnNzbC1haWEtbXVsdGktdGVzdDAeFw0yNjAxMjcw
4+
MTUwNDRaFw0yNzAxMjcwMTUwNDRaMCExHzAdBgNVBAMMFndvbGZzc2wtYWlhLW11
5+
bHRpLXRlc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpVdogPQ2I
6+
/nErbxSaNGoYhkwoj1qt+Be1/qWnvZzJ0EBOG4EdioMRIkJzP6W3HoAhkGBrueXf
7+
riN07M3XLocRfE+9C1+jZQxBGRxysns9z7K+i0pBtPN/AXV2RCSz13FFyVyLhLks
8+
2YAL9By36X9R0wsL+Nd4EAQ4ouf0GglmTmtb5rHf2GIno4xFg9tpWosiUTytwgDC
9+
K9lQEQnTnPG6E43N2bszqBc4roOPrYDnd7raNTqcv9yTHM8zwffGJuCogE/Fbr2R
10+
yVubLW28n5/O1Pb47hHuPJv6oHMZgct2SV5OB/mwVgI0eoFMSQZ35o6BpHD0C497
11+
L2IcoMi8A9rFAgMBAAGjgfAwge0wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAoQw
12+
gbAGCCsGAQUFBwEBBIGjMIGgMCIGCCsGAQUFBzABhhZodHRwOi8vMTI3LjAuMC4x
13+
OjIyMjIxMCIGCCsGAQUFBzABhhZodHRwOi8vMTI3LjAuMC4xOjIyMjIyMCkGCCsG
14+
AQUFBzAChh1odHRwOi8vd3d3LndvbGZzc2wuY29tL2NhLnBlbTArBggrBgEFBQcw
15+
AoYfaHR0cHM6Ly93d3cud29sZnNzbC5jb20vY2EyLnBlbTAdBgNVHQ4EFgQU1GNm
16+
eP/LXQk0tFaTeWoNHyLhLZkwDQYJKoZIhvcNAQELBQADggEBACwuXdKYI2Q/Vhd7
17+
TJFvKdp7BuUopQGEQ+4vR+FoesYXc9MHjZJfMqEffv1MArTeY46At/zvcTeszagi
18+
io+jjGBLOutsAf9WK3PnKMIkGGfro6btZ8QFyKiZ6unMMlqe6cGqrCrNKp8jLP3k
19+
CKZltR5c+MIPhpjoOhNDMOcPMwZBGQJWubwOb4uOu3wv7UWJk/ovKP9WJCUn6wLH
20+
soDs+MHMICkxOvDfPf+F4URVqTbzE8IvSMv38z4cAqsyEfWxr32Dg34S/NmeePFV
21+
7sSDpksvyITGsxjnQulSuUFSmldumQ6GnA4ZUXvCNdJ0zbD/Iib9ud6K05VdWYZP
22+
uyCRkjY=
23+
-----END CERTIFICATE-----
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIEcDCCA1igAwIBAgIUN5kIU1GLRP5bRKctP271p7IGFVowDQYJKoZIhvcNAQEL
3+
BQAwJDEiMCAGA1UEAwwZd29sZnNzbC1haWEtb3ZlcmZsb3ctdGVzdDAeFw0yNjAx
4+
MjcwMTU1NTBaFw0yNzAxMjcwMTU1NTBaMCQxIjAgBgNVBAMMGXdvbGZzc2wtYWlh
5+
LW92ZXJmbG93LXRlc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDS
6+
eHeAzVuCe44SU8bcyIWLwkA2AABw/ctSBWKAFEd7DYHduRr3diblHERU1Fv5JzYx
7+
JnZquj1IO/qsnSFJYDc9sQmYea89iW8KNPVXKDzdbzhpiQLZL7Yq71ICxxqVLfRr
8+
91lyAj0+Syncrp96olSpMJochVnQ6PqLcc/Gq7CMtrKn5KAN7Mn3+LdAQYU8JjRa
9+
zqEJ8fmkBKbS5watzgnkP2o5jWSpWzpDOxTdw85hju4H9m5Gmun3XVO9dEAN/dqK
10+
vklkzgQGvAMMQMIcgOzw0HxAuvsSNtjgEpIlOir0M7YiC0pYqtMO+thSCmVCvsDR
11+
/nG/iqe6YBSXh6oszGwTAgMBAAGjggGYMIIBlDAMBgNVHRMEBTADAQH/MAsGA1Ud
12+
DwQEAwIChDCCAVYGCCsGAQUFBwEBBIIBSDCCAUQwIgYIKwYBBQUHMAGGFmh0dHA6
13+
Ly8xMjcuMC4wLjE6MjIyMjAwIgYIKwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6
14+
MjIyMjEwIgYIKwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjIwIgYIKwYB
15+
BQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjMwIgYIKwYBBQUHMAGGFmh0dHA6
16+
Ly8xMjcuMC4wLjE6MjIyMjQwIgYIKwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6
17+
MjIyMjUwIgYIKwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjYwIgYIKwYB
18+
BQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjcwIgYIKwYBBQUHMAGGFmh0dHA6
19+
Ly8xMjcuMC4wLjE6MjIyMjgwHQYDVR0OBBYEFJt6TNgqMFBebotXaauIYPpUJi1S
20+
MA0GCSqGSIb3DQEBCwUAA4IBAQA5noHB343sKQqVmmLds0gC/k1UhVA5iftAGmes
21+
uRdNOOCdo2i739DmRAXggetgtatcjDfjxkrvq0Qi+geozZra6uX9FT/hgfw6kDpU
22+
HKzJFy4E0G0HTM8mtJi+aGDZL3Lts+h272eahkT1jVKGAPFugqfz7fKRsMce6eCE
23+
UD5cvtQXX16fGhBxxmUCZPnxMKcj2oNl7RliHphK6ofXuNbKjqjVQfxsTUXSQDyS
24+
ApH5w6iUnAvC5l19qYrBcCVOB6CNJ2CdmvFI//Ox8Jc56HRYYDIdVp2Q3FFA5Z4s
25+
gTLvlumVgihAekD+0zVF9q+AJ4TSbE3cqsQgHF/+p84KxWid
26+
-----END CERTIFICATE-----

native/com_wolfssl_WolfSSLCertificate.c

Lines changed: 150 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1736,6 +1736,75 @@ static int addEkuOid(JNIEnv* jenv, jobjectArray ret, int idx,
17361736
return idx;
17371737
}
17381738

1739+
#if !defined(WOLFCRYPT_ONLY) && !defined(NO_CERTS) && \
1740+
(defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) || \
1741+
defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)) && \
1742+
((LIBWOLFSSL_VERSION_HEX > 0x05008004) || \
1743+
defined(WOLFSSL_PR9728_PATCH_APPLIED))
1744+
1745+
static jobjectArray stackStringToArray(JNIEnv* jenv, jclass jcl,
1746+
WOLF_STACK_OF(WOLFSSL_STRING)* sk)
1747+
{
1748+
jobjectArray ret = NULL;
1749+
jclass stringClass = NULL;
1750+
int count;
1751+
int i;
1752+
1753+
if (jenv == NULL || sk == NULL) {
1754+
return NULL;
1755+
}
1756+
1757+
count = wolfSSL_sk_WOLFSSL_STRING_num(sk);
1758+
if (count <= 0) {
1759+
wolfSSL_X509_email_free(sk);
1760+
return NULL;
1761+
}
1762+
1763+
stringClass = (*jenv)->FindClass(jenv, "java/lang/String");
1764+
if (stringClass == NULL) {
1765+
wolfSSL_X509_email_free(sk);
1766+
return NULL;
1767+
}
1768+
1769+
ret = (*jenv)->NewObjectArray(jenv, count, stringClass, NULL);
1770+
if (ret == NULL) {
1771+
(*jenv)->DeleteLocalRef(jenv, stringClass);
1772+
wolfSSL_X509_email_free(sk);
1773+
return NULL;
1774+
}
1775+
1776+
for (i = 0; i < count; i++) {
1777+
const char* str = wolfSSL_sk_WOLFSSL_STRING_value(sk, i);
1778+
jstring jstr = (*jenv)->NewStringUTF(jenv, (str != NULL) ? str : "");
1779+
if (jstr == NULL) {
1780+
(*jenv)->DeleteLocalRef(jenv, ret);
1781+
(*jenv)->DeleteLocalRef(jenv, stringClass);
1782+
wolfSSL_X509_email_free(sk);
1783+
(*jenv)->ThrowNew(jenv, jcl,
1784+
"Failed to create String in native AIA getter");
1785+
return NULL;
1786+
}
1787+
1788+
(*jenv)->SetObjectArrayElement(jenv, ret, i, jstr);
1789+
(*jenv)->DeleteLocalRef(jenv, jstr);
1790+
if ((*jenv)->ExceptionOccurred(jenv)) {
1791+
(*jenv)->ExceptionDescribe(jenv);
1792+
(*jenv)->ExceptionClear(jenv);
1793+
(*jenv)->DeleteLocalRef(jenv, ret);
1794+
(*jenv)->DeleteLocalRef(jenv, stringClass);
1795+
wolfSSL_X509_email_free(sk);
1796+
(*jenv)->ThrowNew(jenv, jcl,
1797+
"Failed to set String[] element in native AIA getter");
1798+
return NULL;
1799+
}
1800+
}
1801+
1802+
(*jenv)->DeleteLocalRef(jenv, stringClass);
1803+
wolfSSL_X509_email_free(sk);
1804+
return ret;
1805+
}
1806+
#endif
1807+
17391808
JNIEXPORT jobjectArray JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1get_1extended_1key_1usage
17401809
(JNIEnv* jenv, jclass jcl, jlong x509Ptr)
17411810
{
@@ -1800,6 +1869,87 @@ JNIEXPORT jobjectArray JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1get_1ex
18001869
return ret;
18011870
}
18021871

1872+
JNIEXPORT jobjectArray JNICALL
1873+
Java_com_wolfssl_WolfSSLCertificate_X509_1get1_1ocsp
1874+
(JNIEnv* jenv, jclass jcl, jlong x509Ptr)
1875+
{
1876+
/* AIA API extensions were added after wolfSSL 5.8.4 in PR 9728. Version
1877+
* check must be greater than 5.8.4 or patch from PR 9728 must be applied
1878+
* and WOLFSSL_PR9728_PATCH_APPLIED defined when compiling this wrapper. */
1879+
#if !defined(WOLFCRYPT_ONLY) && !defined(NO_CERTS) && \
1880+
(defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) || \
1881+
defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)) && \
1882+
((LIBWOLFSSL_VERSION_HEX > 0x05008004) || \
1883+
defined(WOLFSSL_PR9728_PATCH_APPLIED))
1884+
WOLFSSL_X509* x509 = (WOLFSSL_X509*)(uintptr_t)x509Ptr;
1885+
WOLF_STACK_OF(WOLFSSL_STRING)* sk = NULL;
1886+
1887+
if (jenv == NULL || x509 == NULL) {
1888+
return NULL;
1889+
}
1890+
1891+
sk = wolfSSL_X509_get1_ocsp(x509);
1892+
return stackStringToArray(jenv, jcl, sk);
1893+
#else
1894+
(void)jenv;
1895+
(void)jcl;
1896+
(void)x509Ptr;
1897+
return NULL;
1898+
#endif
1899+
}
1900+
1901+
JNIEXPORT jint JNICALL
1902+
Java_com_wolfssl_WolfSSLCertificate_X509_1get_1aia_1overflow
1903+
(JNIEnv* jenv, jclass jcl, jlong x509Ptr)
1904+
{
1905+
#if !defined(WOLFCRYPT_ONLY) && !defined(NO_CERTS) && \
1906+
(defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) || \
1907+
defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)) && \
1908+
((LIBWOLFSSL_VERSION_HEX > 0x05008004) || \
1909+
defined(WOLFSSL_PR9728_PATCH_APPLIED))
1910+
WOLFSSL_X509* x509 = (WOLFSSL_X509*)(uintptr_t)x509Ptr;
1911+
(void)jcl;
1912+
1913+
if (jenv == NULL || x509 == NULL) {
1914+
return 0;
1915+
}
1916+
1917+
return (jint)wolfSSL_X509_get_aia_overflow(x509);
1918+
#else
1919+
(void)jenv;
1920+
(void)jcl;
1921+
(void)x509Ptr;
1922+
return (jint)NOT_COMPILED_IN;
1923+
#endif
1924+
}
1925+
1926+
JNIEXPORT jobjectArray JNICALL
1927+
Java_com_wolfssl_WolfSSLCertificate_X509_1get1_1ca_1issuers
1928+
(JNIEnv* jenv, jclass jcl, jlong x509Ptr)
1929+
{
1930+
#if !defined(WOLFCRYPT_ONLY) && !defined(NO_CERTS) && \
1931+
(defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) || \
1932+
defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)) && \
1933+
defined(WOLFSSL_ASN_CA_ISSUER) && \
1934+
((LIBWOLFSSL_VERSION_HEX > 0x05008004) || \
1935+
defined(WOLFSSL_PR9728_PATCH_APPLIED))
1936+
WOLFSSL_X509* x509 = (WOLFSSL_X509*)(uintptr_t)x509Ptr;
1937+
WOLF_STACK_OF(WOLFSSL_STRING)* sk = NULL;
1938+
1939+
if (jenv == NULL || x509 == NULL) {
1940+
return NULL;
1941+
}
1942+
1943+
sk = wolfSSL_X509_get1_ca_issuers(x509);
1944+
return stackStringToArray(jenv, jcl, sk);
1945+
#else
1946+
(void)jenv;
1947+
(void)jcl;
1948+
(void)x509Ptr;
1949+
return NULL;
1950+
#endif
1951+
}
1952+
18031953
JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1get_1extension
18041954
(JNIEnv* jenv, jclass jcl, jlong x509Ptr, jstring oidIn)
18051955
{
@@ -2385,4 +2535,3 @@ JNIEXPORT jlong JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1get_1ext_1d2i_
23852535
return 0;
23862536
#endif
23872537
}
2388-

native/com_wolfssl_WolfSSLCertificate.h

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

src/java/com/wolfssl/WolfSSLCertificate.java

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ public class WolfSSLCertificate implements Serializable {
103103
static native int X509_verify(long x509, byte[] pubKey, int pubKeySz);
104104
static native boolean[] X509_get_key_usage(long x509);
105105
static native String[] X509_get_extended_key_usage(long x509);
106+
static native String[] X509_get1_ocsp(long x509);
107+
static native int X509_get_aia_overflow(long x509);
108+
static native String[] X509_get1_ca_issuers(long x509);
106109
static native byte[] X509_get_extension(long x509, String oid);
107110
static native int X509_is_extension_set(long x509, String oid);
108111
static native String X509_get_next_altname(long x509);
@@ -1631,6 +1634,69 @@ public String[] getExtendedKeyUsage() throws IllegalStateException {
16311634
}
16321635
}
16331636

1637+
/**
1638+
* Get OCSP responder URIs from the certificate Authority Information
1639+
* Access (AIA) extension.
1640+
*
1641+
* @return Array of OCSP responder URIs, or null if not present.
1642+
*
1643+
* @throws IllegalStateException if WolfSSLCertificate has been freed
1644+
*/
1645+
public String[] getOcspUris() throws IllegalStateException {
1646+
1647+
confirmObjectIsActive();
1648+
1649+
synchronized (x509Lock) {
1650+
WolfSSLDebug.log(getClass(), WolfSSLDebug.Component.JNI,
1651+
WolfSSLDebug.INFO, this.x509Ptr,
1652+
() -> "entering getOcspUris()");
1653+
1654+
return X509_get1_ocsp(this.x509Ptr);
1655+
}
1656+
}
1657+
1658+
/**
1659+
* Check if AIA parsing overflowed the internal URI list.
1660+
*
1661+
* @return 1 if AIA parsing overflowed, 0 if not, or
1662+
* WolfSSL.NOT_COMPILED_IN if not available.
1663+
*
1664+
* @throws IllegalStateException if WolfSSLCertificate has been freed
1665+
*/
1666+
public int getAiaOverflow() throws IllegalStateException {
1667+
1668+
confirmObjectIsActive();
1669+
1670+
synchronized (x509Lock) {
1671+
WolfSSLDebug.log(getClass(), WolfSSLDebug.Component.JNI,
1672+
WolfSSLDebug.INFO, this.x509Ptr,
1673+
() -> "entering getAiaOverflow()");
1674+
1675+
return X509_get_aia_overflow(this.x509Ptr);
1676+
}
1677+
}
1678+
1679+
/**
1680+
* Get CA Issuer URIs from the certificate Authority Information Access
1681+
* (AIA) extension.
1682+
*
1683+
* @return Array of CA Issuer URIs, or null if not present.
1684+
*
1685+
* @throws IllegalStateException if WolfSSLCertificate has been freed
1686+
*/
1687+
public String[] getCaIssuerUris() throws IllegalStateException {
1688+
1689+
confirmObjectIsActive();
1690+
1691+
synchronized (x509Lock) {
1692+
WolfSSLDebug.log(getClass(), WolfSSLDebug.Component.JNI,
1693+
WolfSSLDebug.INFO, this.x509Ptr,
1694+
() -> "entering getCaIssuerUris()");
1695+
1696+
return X509_get1_ca_issuers(this.x509Ptr);
1697+
}
1698+
}
1699+
16341700
/**
16351701
* Get DER encoded extension value from a specified OID
16361702
*
@@ -2246,4 +2312,3 @@ protected void finalize() throws Throwable
22462312
super.finalize();
22472313
}
22482314
}
2249-

0 commit comments

Comments
 (0)