Skip to content

Commit 435d8fb

Browse files
committed
Merge remote-tracking branch 'upstream/master' into testing-fixes
2 parents 10348e6 + bbb0153 commit 435d8fb

24 files changed

Lines changed: 2993 additions & 96 deletions

CLAUDE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
- All tests should pass without problems
1010

1111
# Code Style
12-
- Keep lines under 80 characters maximum length
12+
- Maximum line length is 80 characters. Only break/wrap lines that would exceed 80 characters
1313
- MUST only use multi-line comments, no "//" style ones
1414
- MUST remove all trailing white space
1515
- Use 4 spaces for one tab, no hard tabs

examples/certs/test/crl-decode.der

474 Bytes
Binary file not shown.

examples/certs/test/crl-decode.pem

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
-----BEGIN X509 CRL-----
2+
MIIB1jCBvwIBATANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJVUzEQMA4GA1UE
3+
CAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEVMBMGA1UECgwMd29sZlNTTCBJ
4+
bmMuMRkwFwYDVQQLDBBEZXZlbG9wbWVudCBUZXN0MRgwFgYDVQQDDA93b2xmU1NM
5+
IFRlc3QgQ0EXDTI2MDIxOTAwMzYyMloXDTM2MDIxNzAwMzYyMlqgDjAMMAoGA1Ud
6+
FAQDAgEBMA0GCSqGSIb3DQEBCwUAA4IBAQCvwOGtRd31ztiKj6SPIe3Oo0bW0MC+
7+
bBqd5oCpupUR9qEdV391PNT2F/h6P61asKJbj5ItPoFAKjOKmCFm6UvJp24ypxmr
8+
n3pbvjFH+ki77+3fyzvZmkbyQC5vrdb8X9dEvwk3/z98x9QB47d2zVyQLMG9ZEHT
9+
uTQXL9liz8V1q2BHy3V8/wwsPJhZTm3sViayixQA80YOtp1+7K08GnOhvAr78Vqd
10+
CvN4lY3GUkzgjt6n4gFSrsahIAyGb7hZ9opSQBAO/SMg1P6J85bYshTWSiD6aLCY
11+
uUxLGPkJSEKdqQph/vAr4JifZQIaIHY9oP4HmDHw8ChFlvz571YHyDLV
12+
-----END X509 CRL-----

examples/certs/update-certs.sh

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,62 @@ rm intermediate/ca-int-ecc-cert.pem.bak
148148
rm intermediate/server-int-cert.pem.bak
149149
rm intermediate/server-int-ecc-cert.pem.bak
150150

151+
# Generate test CRL (PEM and DER) for WolfSSLCRL decode testing.
152+
# Creates a self-signed CA, revokes a dummy serial, produces CRL in
153+
# both PEM and DER formats under test/.
154+
printf "\nGenerating test CRL for CRL decode testing...\n"
155+
TMP_DIR="$(mktemp -d)"
156+
157+
# CA key + self-signed cert
158+
openssl genrsa -out "${TMP_DIR}/crl-test-ca-key.pem" 2048 2>/dev/null
159+
openssl req -x509 -new -nodes \
160+
-key "${TMP_DIR}/crl-test-ca-key.pem" \
161+
-sha256 -days 3650 \
162+
-subj "/C=US/ST=Montana/L=Bozeman/O=wolfSSL Inc./OU=Development Test/CN=wolfSSL Test CA" \
163+
-out "${TMP_DIR}/crl-test-ca-cert.pem" 2>/dev/null
164+
165+
# CRL index / database files required by openssl ca
166+
touch "${TMP_DIR}/index.txt"
167+
echo "01" > "${TMP_DIR}/crlnumber"
168+
169+
cat > "${TMP_DIR}/openssl-ca.cnf" <<EOF
170+
[ ca ]
171+
default_ca = CA_default
172+
173+
[ CA_default ]
174+
database = ${TMP_DIR}/index.txt
175+
crlnumber = ${TMP_DIR}/crlnumber
176+
default_md = sha256
177+
default_crl_days = 3650
178+
179+
[ crl_ext ]
180+
authorityKeyIdentifier = keyid:always
181+
EOF
182+
183+
# Generate CRL with empty revocation list. Decode tests only need to parse
184+
# the CRL structure (issuer, signature, dates, etc.), not iterate entries.
185+
openssl ca -gencrl \
186+
-keyfile "${TMP_DIR}/crl-test-ca-key.pem" \
187+
-cert "${TMP_DIR}/crl-test-ca-cert.pem" \
188+
-config "${TMP_DIR}/openssl-ca.cnf" \
189+
-out test/crl-decode.pem 2>/dev/null
190+
if [ $? -ne 0 ]; then
191+
printf "Failed to generate test/crl-decode.pem\n"
192+
rm -rf "${TMP_DIR}"
193+
exit 1
194+
fi
195+
196+
# Convert PEM CRL to DER
197+
openssl crl -in test/crl-decode.pem -outform DER \
198+
-out test/crl-decode.der 2>/dev/null
199+
if [ $? -ne 0 ]; then
200+
printf "Failed to generate test/crl-decode.der\n"
201+
rm -rf "${TMP_DIR}"
202+
exit 1
203+
fi
204+
rm -rf "${TMP_DIR}"
205+
printf "Generated test/crl-decode.pem and test/crl-decode.der\n"
206+
151207
# Generate SAN test certificates for WolfSSLAltName testing
152208
printf "\nGenerating SAN test certificates...\n"
153209
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"

native/com_wolfssl_WolfCryptRSA.c

Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
#include <wolfssl/options.h>
2727
#endif
2828
#include <wolfssl/wolfcrypt/rsa.h>
29+
#include <wolfssl/wolfcrypt/hash.h>
30+
#include <wolfssl/wolfcrypt/error-crypt.h>
2931

3032
#include "com_wolfssl_WolfCryptRSA.h"
3133

@@ -214,6 +216,189 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfCryptRSA_doEnc
214216
return ret;
215217
}
216218

219+
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfCryptRSA_doPssSign
220+
(JNIEnv* jenv, jobject jcl, jobject in, jlong inSz, jobject out, jintArray outSz, jint hash, jint mgf, jobject keyDer, jlong keySz)
221+
{
222+
#ifdef WC_RSA_PSS
223+
int ret;
224+
WC_RNG rng;
225+
RsaKey myKey;
226+
int rngInit = 0;
227+
int keyInit = 0;
228+
unsigned int idx = 0;
229+
unsigned int tmpOut;
230+
unsigned char* inBuf = NULL;
231+
unsigned char* outBuf = NULL;
232+
unsigned char* keyBuf = NULL;
233+
enum wc_HashType hashType;
234+
(void)jcl;
235+
236+
if ((inSz < 0) || (keySz < 0)) {
237+
return -1;
238+
}
239+
240+
inBuf = (*jenv)->GetDirectBufferAddress(jenv, in);
241+
if (inBuf == NULL) {
242+
printf("problem getting in buffer address\n");
243+
return -1;
244+
}
245+
246+
outBuf = (*jenv)->GetDirectBufferAddress(jenv, out);
247+
if (outBuf == NULL) {
248+
printf("problem getting out buffer address\n");
249+
return -1;
250+
}
251+
252+
keyBuf = (*jenv)->GetDirectBufferAddress(jenv, keyDer);
253+
if (keyBuf == NULL) {
254+
printf("problem getting key buffer address\n");
255+
return -1;
256+
}
257+
258+
hashType = wc_OidGetHash(hash);
259+
if (hashType == WC_HASH_TYPE_NONE) {
260+
printf("doPssSign: unsupported hash OID %d\n", hash);
261+
return -1;
262+
}
263+
264+
/* get output buffer size */
265+
(*jenv)->GetIntArrayRegion(jenv, outSz, 0, 1, (jint*)&tmpOut);
266+
267+
ret = wc_InitRng(&rng);
268+
if (ret != 0) {
269+
printf("wc_InitRng failed, ret = %d\n", ret);
270+
return ret;
271+
}
272+
rngInit = 1;
273+
274+
ret = wc_InitRsaKey(&myKey, NULL);
275+
if (ret != 0) {
276+
printf("wc_InitRsaKey failed, ret = %d\n", ret);
277+
wc_FreeRng(&rng);
278+
return ret;
279+
}
280+
keyInit = 1;
281+
282+
ret = wc_RsaPrivateKeyDecode(keyBuf, &idx, &myKey, (unsigned int)keySz);
283+
if (ret == 0) {
284+
285+
ret = wc_RsaPSS_Sign(inBuf, (unsigned int)inSz, outBuf, tmpOut,
286+
hashType, mgf, &myKey, &rng);
287+
if (ret > 0) {
288+
tmpOut = ret;
289+
(*jenv)->SetIntArrayRegion(jenv, outSz, 0, 1, (jint*)&tmpOut);
290+
ret = 0;
291+
}
292+
} else {
293+
printf("wc_RsaPrivateKeyDecode failed, ret = %d\n", ret);
294+
}
295+
296+
if (keyInit) {
297+
wc_FreeRsaKey(&myKey);
298+
}
299+
if (rngInit) {
300+
wc_FreeRng(&rng);
301+
}
302+
303+
return ret;
304+
#else
305+
(void)jenv;
306+
(void)jcl;
307+
(void)in;
308+
(void)inSz;
309+
(void)out;
310+
(void)outSz;
311+
(void)hash;
312+
(void)mgf;
313+
(void)keyDer;
314+
(void)keySz;
315+
return (jint)NOT_COMPILED_IN;
316+
#endif /* WC_RSA_PSS */
317+
}
318+
319+
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfCryptRSA_doPssVerify
320+
(JNIEnv* jenv, jobject jcl, jobject sig, jlong sigSz, jobject out, jlong outSz, jint hash, jint mgf, jobject keyDer, jlong keySz)
321+
{
322+
#ifdef WC_RSA_PSS
323+
int ret;
324+
RsaKey myKey;
325+
unsigned int idx = 0;
326+
unsigned char* sigBuf = NULL;
327+
unsigned char* outBuf = NULL;
328+
unsigned char* keyBuf = NULL;
329+
enum wc_HashType hashType;
330+
(void)jcl;
331+
332+
if ((sigSz < 0) || (keySz < 0) || (outSz < 0)) {
333+
return -1;
334+
}
335+
336+
sigBuf = (*jenv)->GetDirectBufferAddress(jenv, sig);
337+
if (sigBuf == NULL) {
338+
printf("problem getting sig buffer address\n");
339+
return -1;
340+
}
341+
342+
outBuf = (*jenv)->GetDirectBufferAddress(jenv, out);
343+
if (outBuf == NULL) {
344+
printf("problem getting out buffer address\n");
345+
return -1;
346+
}
347+
348+
keyBuf = (*jenv)->GetDirectBufferAddress(jenv, keyDer);
349+
if (keyBuf == NULL) {
350+
printf("problem getting key buffer address\n");
351+
return -1;
352+
}
353+
354+
hashType = wc_OidGetHash(hash);
355+
if (hashType == WC_HASH_TYPE_NONE) {
356+
printf("doPssVerify: unsupported hash OID %d\n", hash);
357+
return -1;
358+
}
359+
360+
ret = wc_InitRsaKey(&myKey, NULL);
361+
if (ret != 0) {
362+
printf("wc_InitRsaKey failed, ret = %d\n", ret);
363+
return ret;
364+
}
365+
366+
/* Try private key decode first (sign check receives the server private),
367+
* fall back to public key decode (verify receives the peer public) */
368+
ret = wc_RsaPrivateKeyDecode(keyBuf, &idx, &myKey, (unsigned int)keySz);
369+
if (ret != 0) {
370+
idx = 0;
371+
ret = wc_RsaPublicKeyDecode(keyBuf, &idx, &myKey, (unsigned int)keySz);
372+
}
373+
374+
if (ret == 0) {
375+
ret = wc_RsaPSS_Verify(sigBuf, (unsigned int)sigSz, outBuf,
376+
(unsigned int)outSz, hashType, mgf, &myKey);
377+
if (ret < 0) {
378+
printf("wc_RsaPSS_Verify failed, ret = %d\n", ret);
379+
}
380+
} else {
381+
printf("RSA key decode failed, ret = %d\n", ret);
382+
}
383+
384+
wc_FreeRsaKey(&myKey);
385+
386+
return ret;
387+
#else
388+
(void)jenv;
389+
(void)jcl;
390+
(void)sig;
391+
(void)sigSz;
392+
(void)out;
393+
(void)outSz;
394+
(void)hash;
395+
(void)mgf;
396+
(void)keyDer;
397+
(void)keySz;
398+
return (jint)NOT_COMPILED_IN;
399+
#endif /* WC_RSA_PSS */
400+
}
401+
217402
JNIEXPORT jint JNICALL Java_com_wolfssl_WolfCryptRSA_doDec
218403
(JNIEnv* jenv, jobject jcl, jobject in, jlong inSz, jobject out,
219404
jlong outSz, jobject keyDer, jlong keySz)

native/com_wolfssl_WolfCryptRSA.h

Lines changed: 16 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)