Skip to content

Commit 3ddeb59

Browse files
committed
Add cert/CRL capabilities: skid, akid, dist point, netscape
1 parent ccbdc9f commit 3ddeb59

12 files changed

Lines changed: 1049 additions & 25 deletions
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDbTCCAlWgAwIBAgIUZqjaWzuAIDjJjqQW/x9Lyn5H2McwDQYJKoZIhvcNAQEL
3+
BQAwOjEUMBIGA1UEAwwLVGVzdCBDUkwgRFAxFTATBgNVBAoMDHdvbGZTU0wgVGVz
4+
dDELMAkGA1UEBhMCVVMwHhcNMjYwMjA5MTgxMTQzWhcNMjcwMjA5MTgxMTQzWjA6
5+
MRQwEgYDVQQDDAtUZXN0IENSTCBEUDEVMBMGA1UECgwMd29sZlNTTCBUZXN0MQsw
6+
CQYDVQQGEwJVUzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALP/1lo5
7+
T10/LJAck3ImKvrinzS1oubA/YP/w2NTJLzlZQtbvNPW4WhY2LcuUWOSv/VmMSpq
8+
J/mEqEn8P9CfIgtRo0z39+HJJ3aE3ClioH6fTpj284nHZnJdYQFy/9+T4DTLcuiJ
9+
VILqRotqH06JRU4mhR2hqiw7YHI76BlPJAB9pVwGbit6BKWbF5vJRy440AYNCWjs
10+
t/NEhrKnCJugaPqvyhH9ByWI8/wPeyFNXUpuEiZVg+rSYwPr0w4kVBRUVWnDxEam
11+
WKEEPSM1CdY2LJGDT6Qjm6WyVQbWppu1mz6Dg+nvw+h125PyW4Cyim6HAFj3IJcI
12+
6YcDC2lGep7PNmECAwEAAaNrMGkwCQYDVR0TBAIwADALBgNVHQ8EBAMCB4AwMAYD
13+
VR0fBCkwJzAloCOgIYYfaHR0cDovL2NybC5leGFtcGxlLmNvbS90ZXN0LmNybDAd
14+
BgNVHQ4EFgQUXEABbBfseiUjqacQWYMRluxQV+kwDQYJKoZIhvcNAQELBQADggEB
15+
AF21pa2SQXeqmDtYLvhwNWpwpt814nRfejAzlLBLpJB8nf1NE89a53U7ELbZMPNj
16+
tQC/ADNoNGFQmSaPNytXtHNslPM17kSWN+6/JFhKGcWHXgPPM4E5VOZ94H1BK4fh
17+
PMCfMMh+826Y+RK/nsi4NnlmeJy5/QdRgbDfGY4ZZECssHSIbKPP7pgxH/YzDUd/
18+
HIzf5vXeiUG7PXXJhzA38k1HRhuyxOYnsrLMYw/FsDOl/knhH9dF8f+XFVHuFfQv
19+
GH9cm+btX0gM1EaBi1huQcYYNRp2BSa2qSjIeDRg5Bs4i5BENh7wVtZDheGD0SpE
20+
3jhznnX5L4CwmLzlfQkARuU=
21+
-----END CERTIFICATE-----

examples/certs/update-certs.sh

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,37 @@ if [ $? -ne 0 ]; then
9898
fi
9999
printf "Generated ca-keyPkcs8.der\n"
100100

101+
# Generate CRL Distribution Points test cert
102+
printf "Generating test/crl-dp-cert.pem\n"
103+
mkdir -p test
104+
TMP_DIR="$(mktemp -d)"
105+
cat > "${TMP_DIR}/openssl.cnf" <<EOF
106+
[ req ]
107+
distinguished_name = dn
108+
x509_extensions = v3_req
109+
prompt = no
110+
111+
[ dn ]
112+
CN = Test CRL DP
113+
O = wolfSSL Test
114+
C = US
115+
116+
[ v3_req ]
117+
basicConstraints = CA:FALSE
118+
keyUsage = digitalSignature
119+
crlDistributionPoints = URI:http://crl.example.com/test.crl
120+
EOF
121+
122+
openssl req -new -newkey rsa:2048 -nodes -x509 -days 365 \
123+
-keyout "${TMP_DIR}/crl-dp-key.pem" -out test/crl-dp-cert.pem \
124+
-config "${TMP_DIR}/openssl.cnf" >/dev/null 2>&1
125+
if [ $? -ne 0 ]; then
126+
printf "Failed to generate test/crl-dp-cert.pem\n"
127+
rm -rf "${TMP_DIR}"
128+
exit 1
129+
fi
130+
rm -rf "${TMP_DIR}"
131+
101132
# Remove text info from intermediate certs, causes issues on Android (WRONG TAG)
102133
printf "Removing text info from intermediate certs\n"
103134
sed -i.bak -n '/-----BEGIN CERTIFICATE-----/,$p' ca-cert.pem
@@ -131,4 +162,3 @@ else
131162
fi
132163

133164
printf "\nFinished successfully\n"
134-

native/com_wolfssl_WolfSSL.c

Lines changed: 187 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
/**
@@ -545,6 +680,58 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_getNID_1dnQualifier
545680
return NID_dnQualifier;
546681
}
547682

683+
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_getNID_1subject_1key_1identifier
684+
(JNIEnv* jenv, jclass jcl)
685+
{
686+
(void)jenv;
687+
(void)jcl;
688+
689+
#ifdef WOLFSSL_CERT_EXT
690+
return NID_subject_key_identifier;
691+
#else
692+
return 0;
693+
#endif
694+
}
695+
696+
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_getNID_1authority_1key_1identifier
697+
(JNIEnv* jenv, jclass jcl)
698+
{
699+
(void)jenv;
700+
(void)jcl;
701+
702+
#ifdef WOLFSSL_CERT_EXT
703+
return NID_authority_key_identifier;
704+
#else
705+
return 0;
706+
#endif
707+
}
708+
709+
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_getNID_1crl_1distribution_1points
710+
(JNIEnv* jenv, jclass jcl)
711+
{
712+
(void)jenv;
713+
(void)jcl;
714+
715+
#ifdef WOLFSSL_CERT_EXT
716+
return NID_crl_distribution_points;
717+
#else
718+
return 0;
719+
#endif
720+
}
721+
722+
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_getNID_1netscape_1cert_1type
723+
(JNIEnv* jenv, jclass jcl)
724+
{
725+
(void)jenv;
726+
(void)jcl;
727+
728+
#ifndef IGNORE_NETSCAPE_CERT_TYPE
729+
return NID_netscape_cert_type;
730+
#else
731+
return 0;
732+
#endif
733+
}
734+
548735
/* functions to return BulkCipherAlgorithm enum values from ./wolfssl/ssl.h */
549736
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSL_getBulkCipherAlgorithmEnumNULL
550737
(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.

0 commit comments

Comments
 (0)