Skip to content

Commit 0ea5522

Browse files
committed
Add cert/CRL capabilities: skid, akid, dist point, netscape
1 parent dfa7848 commit 0ea5522

7 files changed

Lines changed: 1148 additions & 1 deletion

File tree

native/com_wolfssl_WolfSSL.c

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,58 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_getNID_1dnQualifier
545545
return NID_dnQualifier;
546546
}
547547

548+
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_getNID_1subject_1key_1identifier
549+
(JNIEnv* jenv, jclass jcl)
550+
{
551+
(void)jenv;
552+
(void)jcl;
553+
554+
#ifdef WOLFSSL_CERT_EXT
555+
return NID_subject_key_identifier;
556+
#else
557+
return 0;
558+
#endif
559+
}
560+
561+
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_getNID_1authority_1key_1identifier
562+
(JNIEnv* jenv, jclass jcl)
563+
{
564+
(void)jenv;
565+
(void)jcl;
566+
567+
#ifdef WOLFSSL_CERT_EXT
568+
return NID_authority_key_identifier;
569+
#else
570+
return 0;
571+
#endif
572+
}
573+
574+
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_getNID_1crl_1distribution_1points
575+
(JNIEnv* jenv, jclass jcl)
576+
{
577+
(void)jenv;
578+
(void)jcl;
579+
580+
#ifdef WOLFSSL_CERT_EXT
581+
return NID_crl_distribution_points;
582+
#else
583+
return 0;
584+
#endif
585+
}
586+
587+
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_getNID_1netscape_1cert_1type
588+
(JNIEnv* jenv, jclass jcl)
589+
{
590+
(void)jenv;
591+
(void)jcl;
592+
593+
#ifndef IGNORE_NETSCAPE_CERT_TYPE
594+
return NID_netscape_cert_type;
595+
#else
596+
return 0;
597+
#endif
598+
}
599+
548600
/* functions to return BulkCipherAlgorithm enum values from ./wolfssl/ssl.h */
549601
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_getBulkCipherAlgorithmEnumNULL
550602
(JNIEnv* jenv, jclass jcl)

native/com_wolfssl_WolfSSL.h

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

native/com_wolfssl_WolfSSLCertificate.c

Lines changed: 249 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include <wolfssl/ssl.h>
3232
#include <wolfssl/wolfcrypt/asn.h>
3333
#include <wolfssl/wolfcrypt/asn_public.h>
34+
#include <wolfssl/wolfcrypt/hash.h> /* for wc_ShaHash */
3435
#include <wolfssl/openssl/evp.h> /* for EVP_PKEY functions */
3536
#include <wolfssl/openssl/x509v3.h> /* for WOLFSSL_X509_EXTENSION */
3637
#include <wolfssl/error-ssl.h>
@@ -1937,3 +1938,251 @@ JNIEXPORT jstring JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1get_1next_1a
19371938
#endif
19381939
}
19391940

1941+
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1set_1subject_1key_1id_1from_1pubkey
1942+
(JNIEnv* jenv, jclass jcl, jlong x509Ptr)
1943+
{
1944+
#if !defined(WOLFCRYPT_ONLY) && !defined(NO_CERTS) && \
1945+
(defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
1946+
defined(WOLFSSL_CERT_EXT) && !defined(NO_SHA)
1947+
WOLFSSL_X509* x509 = (WOLFSSL_X509*)(uintptr_t)x509Ptr;
1948+
(void)jcl;
1949+
1950+
if (jenv == NULL || x509 == NULL) {
1951+
return WOLFSSL_FAILURE;
1952+
}
1953+
1954+
return wolfSSL_X509_set_subject_key_id_ex(x509);
1955+
#else
1956+
(void)jenv;
1957+
(void)jcl;
1958+
(void)x509Ptr;
1959+
return (jint)NOT_COMPILED_IN;
1960+
#endif
1961+
}
1962+
1963+
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1set_1subject_1key_1id
1964+
(JNIEnv* jenv, jclass jcl, jlong x509Ptr, jbyteArray skidBytes)
1965+
{
1966+
#if !defined(WOLFCRYPT_ONLY) && !defined(NO_CERTS) && \
1967+
(defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
1968+
defined(WOLFSSL_CERT_EXT)
1969+
WOLFSSL_X509* x509 = (WOLFSSL_X509*)(uintptr_t)x509Ptr;
1970+
byte* skid = NULL;
1971+
int skidSz = 0;
1972+
int ret;
1973+
(void)jcl;
1974+
1975+
if (jenv == NULL || x509 == NULL || skidBytes == NULL) {
1976+
return WOLFSSL_FAILURE;
1977+
}
1978+
1979+
skid = (byte*)(*jenv)->GetByteArrayElements(jenv, skidBytes, NULL);
1980+
skidSz = (*jenv)->GetArrayLength(jenv, skidBytes);
1981+
1982+
if (skid == NULL || skidSz == 0) {
1983+
return WOLFSSL_FAILURE;
1984+
}
1985+
1986+
ret = wolfSSL_X509_set_subject_key_id(x509, skid, skidSz);
1987+
1988+
(*jenv)->ReleaseByteArrayElements(jenv, skidBytes, (jbyte*)skid, JNI_ABORT);
1989+
1990+
return ret;
1991+
#else
1992+
(void)jenv;
1993+
(void)jcl;
1994+
(void)x509Ptr;
1995+
(void)skidBytes;
1996+
return (jint)NOT_COMPILED_IN;
1997+
#endif
1998+
}
1999+
2000+
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1set_1auth_1key_1id_1from_1cert
2001+
(JNIEnv* jenv, jclass jcl, jlong x509Ptr, jbyteArray issuerDerBytes)
2002+
{
2003+
#if !defined(WOLFCRYPT_ONLY) && !defined(NO_CERTS) && \
2004+
(defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
2005+
defined(WOLFSSL_CERT_EXT) && !defined(NO_SHA)
2006+
WOLFSSL_X509* x509 = (WOLFSSL_X509*)(uintptr_t)x509Ptr;
2007+
WOLFSSL_X509* issuerX509 = NULL;
2008+
byte* issuerDer = NULL;
2009+
int issuerDerSz = 0;
2010+
int ret = WOLFSSL_SUCCESS;
2011+
(void)jcl;
2012+
2013+
if (jenv == NULL || x509 == NULL || issuerDerBytes == NULL) {
2014+
return WOLFSSL_FAILURE;
2015+
}
2016+
2017+
issuerDer = (byte*)(*jenv)->GetByteArrayElements(jenv, issuerDerBytes, NULL);
2018+
issuerDerSz = (*jenv)->GetArrayLength(jenv, issuerDerBytes);
2019+
2020+
if (issuerDer == NULL || issuerDerSz == 0) {
2021+
ret = WOLFSSL_FAILURE;
2022+
}
2023+
2024+
/* Parse issuer certificate */
2025+
if (ret == WOLFSSL_SUCCESS) {
2026+
issuerX509 = wolfSSL_X509_load_certificate_buffer(issuerDer,
2027+
issuerDerSz, SSL_FILETYPE_ASN1);
2028+
if (issuerX509 == NULL) {
2029+
ret = WOLFSSL_FAILURE;
2030+
}
2031+
}
2032+
2033+
/* Use wolfSSL API to set AKID from issuer */
2034+
if (ret == WOLFSSL_SUCCESS) {
2035+
ret = wolfSSL_X509_set_authority_key_id_ex(x509, issuerX509);
2036+
}
2037+
2038+
if (issuerX509 != NULL) {
2039+
wolfSSL_X509_free(issuerX509);
2040+
}
2041+
2042+
(*jenv)->ReleaseByteArrayElements(jenv, issuerDerBytes,
2043+
(jbyte*)issuerDer, JNI_ABORT);
2044+
2045+
return ret;
2046+
#else
2047+
(void)jenv;
2048+
(void)jcl;
2049+
(void)x509Ptr;
2050+
(void)issuerDerBytes;
2051+
return (jint)NOT_COMPILED_IN;
2052+
#endif
2053+
}
2054+
2055+
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1set_1auth_1key_1id
2056+
(JNIEnv* jenv, jclass jcl, jlong x509Ptr, jbyteArray akidBytes)
2057+
{
2058+
#if !defined(WOLFCRYPT_ONLY) && !defined(NO_CERTS) && \
2059+
(defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
2060+
defined(WOLFSSL_CERT_EXT)
2061+
WOLFSSL_X509* x509 = (WOLFSSL_X509*)(uintptr_t)x509Ptr;
2062+
byte* akid = NULL;
2063+
int akidSz = 0;
2064+
int ret;
2065+
(void)jcl;
2066+
2067+
if (jenv == NULL || x509 == NULL || akidBytes == NULL) {
2068+
return WOLFSSL_FAILURE;
2069+
}
2070+
2071+
akid = (byte*)(*jenv)->GetByteArrayElements(jenv, akidBytes, NULL);
2072+
akidSz = (*jenv)->GetArrayLength(jenv, akidBytes);
2073+
2074+
if (akid == NULL || akidSz == 0) {
2075+
return WOLFSSL_FAILURE;
2076+
}
2077+
2078+
ret = wolfSSL_X509_set_authority_key_id(x509, akid, akidSz);
2079+
2080+
(*jenv)->ReleaseByteArrayElements(jenv, akidBytes, (jbyte*)akid, JNI_ABORT);
2081+
2082+
return ret;
2083+
#else
2084+
(void)jenv;
2085+
(void)jcl;
2086+
(void)x509Ptr;
2087+
(void)akidBytes;
2088+
return (jint)NOT_COMPILED_IN;
2089+
#endif
2090+
}
2091+
2092+
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1set_1ns_1cert_1type
2093+
(JNIEnv* jenv, jclass jcl, jlong x509Ptr, jint nsCertType)
2094+
{
2095+
#if !defined(WOLFCRYPT_ONLY) && !defined(NO_CERTS) && \
2096+
(defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
2097+
!defined(IGNORE_NETSCAPE_CERT_TYPE)
2098+
WOLFSSL_X509* x509 = (WOLFSSL_X509*)(uintptr_t)x509Ptr;
2099+
(void)jenv;
2100+
(void)jcl;
2101+
2102+
if (x509 == NULL) {
2103+
return WOLFSSL_FAILURE;
2104+
}
2105+
2106+
return wolfSSL_X509_set_ns_cert_type(x509, (int)nsCertType);
2107+
#else
2108+
(void)jenv;
2109+
(void)jcl;
2110+
(void)x509Ptr;
2111+
(void)nsCertType;
2112+
return (jint)NOT_COMPILED_IN;
2113+
#endif
2114+
}
2115+
2116+
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1add_1crl_1dist_1point
2117+
(JNIEnv* jenv, jclass jcl, jlong x509Ptr, jstring uriStr, jboolean isCritical)
2118+
{
2119+
#if !defined(WOLFCRYPT_ONLY) && !defined(NO_CERTS) && \
2120+
(defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
2121+
defined(WOLFSSL_CERT_EXT)
2122+
WOLFSSL_X509* x509 = (WOLFSSL_X509*)(uintptr_t)x509Ptr;
2123+
const char* uri = NULL;
2124+
int ret;
2125+
(void)jcl;
2126+
2127+
if (jenv == NULL || x509 == NULL || uriStr == NULL) {
2128+
return WOLFSSL_FAILURE;
2129+
}
2130+
2131+
uri = (*jenv)->GetStringUTFChars(jenv, uriStr, 0);
2132+
if (uri == NULL) {
2133+
return WOLFSSL_FAILURE;
2134+
}
2135+
2136+
ret = wolfSSL_X509_CRL_add_dist_point(x509, uri, isCritical ? 1 : 0);
2137+
2138+
(*jenv)->ReleaseStringUTFChars(jenv, uriStr, uri);
2139+
2140+
return ret;
2141+
#else
2142+
(void)jenv;
2143+
(void)jcl;
2144+
(void)x509Ptr;
2145+
(void)uriStr;
2146+
(void)isCritical;
2147+
return (jint)NOT_COMPILED_IN;
2148+
#endif
2149+
}
2150+
2151+
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLCertificate_X509_1set_1crl_1info
2152+
(JNIEnv* jenv, jclass jcl, jlong x509Ptr, jbyteArray crlInfoDerBytes)
2153+
{
2154+
#if !defined(WOLFCRYPT_ONLY) && !defined(NO_CERTS) && \
2155+
(defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
2156+
defined(WOLFSSL_CERT_EXT)
2157+
WOLFSSL_X509* x509 = (WOLFSSL_X509*)(uintptr_t)x509Ptr;
2158+
byte* crlInfo = NULL;
2159+
int crlInfoSz = 0;
2160+
int ret;
2161+
(void)jcl;
2162+
2163+
if (jenv == NULL || x509 == NULL || crlInfoDerBytes == NULL) {
2164+
return WOLFSSL_FAILURE;
2165+
}
2166+
2167+
crlInfo = (byte*)(*jenv)->GetByteArrayElements(jenv, crlInfoDerBytes, NULL);
2168+
crlInfoSz = (*jenv)->GetArrayLength(jenv, crlInfoDerBytes);
2169+
2170+
if (crlInfo == NULL || crlInfoSz == 0) {
2171+
return WOLFSSL_FAILURE;
2172+
}
2173+
2174+
ret = wolfSSL_X509_CRL_set_dist_points(x509, crlInfo, crlInfoSz);
2175+
2176+
(*jenv)->ReleaseByteArrayElements(jenv, crlInfoDerBytes,
2177+
(jbyte*)crlInfo, JNI_ABORT);
2178+
2179+
return ret;
2180+
#else
2181+
(void)jenv;
2182+
(void)jcl;
2183+
(void)x509Ptr;
2184+
(void)crlInfoDerBytes;
2185+
return (jint)NOT_COMPILED_IN;
2186+
#endif
2187+
}
2188+

0 commit comments

Comments
 (0)