Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions jni/include/com_wolfssl_wolfcrypt_Md5.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions jni/include/com_wolfssl_wolfcrypt_Sha.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions jni/include/com_wolfssl_wolfcrypt_Sha224.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions jni/include/com_wolfssl_wolfcrypt_Sha256.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions jni/include/com_wolfssl_wolfcrypt_Sha3.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions jni/include/com_wolfssl_wolfcrypt_Sha384.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions jni/include/com_wolfssl_wolfcrypt_Sha512.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions jni/jni_dh.c
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,7 @@ Java_com_wolfssl_wolfcrypt_Dh_wc_1DhAgree(
byte* pub = NULL;
byte* secret = NULL;
word32 privSz = 0, pubSz = 0, secretSz = 0;
word32 pSz = 0, qSz = 0, gSz = 0;
jboolean privIsCopy = JNI_FALSE;

key = (DhKey*) getNativeStruct(env, this);
Expand All @@ -463,6 +464,13 @@ Java_com_wolfssl_wolfcrypt_Dh_wc_1DhAgree(
* DH_MAX_SIZE is in bits, so convert to bytes and round up if needed. */
secretSz = (DH_MAX_SIZE + 7) / 8;

/* wc_DhAgree() does not bound its output by secretSz, and heap math
* allows p larger than DH_MAX_SIZE, so grow the buffer to fit p */
if ((key != NULL) && (wc_DhExportParamsRaw(key, NULL, &pSz, NULL, &qSz,
NULL, &gSz) == LENGTH_ONLY_E) && (pSz > secretSz)) {
secretSz = pSz;
}

secret = XMALLOC(secretSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
if (secret == NULL) {
throwOutOfMemoryException(
Expand Down
27 changes: 27 additions & 0 deletions jni/jni_md5.c
Original file line number Diff line number Diff line change
Expand Up @@ -293,3 +293,30 @@ Java_com_wolfssl_wolfcrypt_Md5_native_1final_1internal___3B(
#endif
}

JNIEXPORT void JNICALL
Java_com_wolfssl_wolfcrypt_Md5_native_1free_1internal(
JNIEnv* env, jobject this)
{
#ifndef NO_MD5
Md5* md5 = (Md5*) getNativeStruct(env, this);
if ((*env)->ExceptionOccurred(env)) {
/* getNativeStruct may throw exception, prevent throwing another */
return;
}

if (md5 != NULL) {
wc_Md5Free(md5);
#if (LIBWOLFSSL_VERSION_HEX >= 0x05008004) && \
!defined(WOLFSSL_NO_FORCE_ZERO)
wc_ForceZero(md5, sizeof(Md5));
#else
XMEMSET(md5, 0, sizeof(Md5));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude: native_free_internal() zeroes the freed digest struct with plain XMEMSET instead of wc_ForceZero. The same pattern occurs at jni_sha.c:91,115,142,167,192,1883.

Did we want to match the pattern in jni_chacha.c, jni_aescts.c, jni_aesxts.c, jni_hmac.c?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed, thanks

#endif
}

LogStr("wc_Md5Free(md5=%p)\n", md5);
#else
throwNotCompiledInException(env);
#endif
}

23 changes: 18 additions & 5 deletions jni/jni_pwdbased.c
Original file line number Diff line number Diff line change
Expand Up @@ -195,16 +195,24 @@ JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_wolfcrypt_Pwdbased_wc_1PBKDF2

if ((passBuf != NULL) && (passBufLen > 0)) {
pass = (byte*)(*env)->GetByteArrayElements(env, passBuf, &passIsCopy);
if ((*env)->ExceptionOccurred(env)) {
ret = MEMORY_E;
}
}

if (saltBuf != NULL) {
if ((ret == 0) && (saltBuf != NULL)) {
salt = (byte*)(*env)->GetByteArrayElements(env, saltBuf, NULL);
if ((*env)->ExceptionOccurred(env)) {
ret = MEMORY_E;
}
}

PRIVATE_KEY_UNLOCK();
ret = wc_PBKDF2(outKey, pass, passBufLen, salt, sBufLen,
iterations, kLen, hashType);
PRIVATE_KEY_LOCK();
if (ret == 0) {
PRIVATE_KEY_UNLOCK();
ret = wc_PBKDF2(outKey, pass, passBufLen, salt, sBufLen,
iterations, kLen, hashType);
PRIVATE_KEY_LOCK();
}
if (ret == 0) {
result = (*env)->NewByteArray(env, kLen);
if (result != NULL) {
Expand Down Expand Up @@ -242,6 +250,11 @@ JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_wolfcrypt_Pwdbased_wc_1PBKDF2
(*env)->ReleaseByteArrayElements(env, saltBuf, (jbyte*)salt, JNI_ABORT);
}

if ((*env)->ExceptionOccurred(env)) {
/* Leave the pending OutOfMemoryError in place */
return NULL;
}

if (ret != 0) {
throwWolfCryptExceptionFromError(env, ret);
return NULL;
Expand Down
67 changes: 43 additions & 24 deletions jni/jni_rsa.c
Original file line number Diff line number Diff line change
Expand Up @@ -1808,24 +1808,31 @@ Java_com_wolfssl_wolfcrypt_Rsa_wc_1RsaPSS_1Verify(
if (ret == 0) {
XMEMSET(output, 0, outputSz);

ret = wc_RsaPSS_Verify_ex(signature, signatureSz, output, outputSz,
(enum wc_HashType)hashType, mgf,
saltLen, key);
if (ret > 0) {
/* Now verify the PSS padding with the provided data */
ret = wc_RsaPSS_CheckPadding_ex(data, dataSz, output, ret,
(enum wc_HashType)hashType,
saltLen, 0);
if (ret == 0) {
if (saltLen == RSA_PSS_SALT_LEN_DEFAULT) {
/* VerifyCheck() sizes the default salt from the modulus bits */
ret = wc_RsaPSS_VerifyCheck(signature, signatureSz, output,
outputSz, data, dataSz, (enum wc_HashType)hashType, mgf, key);
if (ret > 0) {
result = JNI_TRUE;
ret = 0;
}
/* PSS decode of a bad signature fails with data dependent error
* codes, all map to false, only MEMORY_E throws */
else if (ret == MEMORY_E) {
throwWolfCryptExceptionFromError(env, ret);
}
else {
ret = wc_RsaPSS_Verify_ex(signature, signatureSz, output,
outputSz, (enum wc_HashType)hashType, mgf, saltLen, key);
if (ret > 0) {
/* Now verify the PSS padding with the provided data */
ret = wc_RsaPSS_CheckPadding_ex(data, dataSz, output, ret,
(enum wc_HashType)hashType, saltLen, 0);
if (ret == 0) {
result = JNI_TRUE;
}
}
}
else if (ret == MEMORY_E) {

/* PSS decode of a bad signature fails with data dependent error codes,
* all map to false, only MEMORY_E throws */
if (ret == MEMORY_E) {
throwWolfCryptExceptionFromError(env, ret);
}
}
Expand Down Expand Up @@ -2041,17 +2048,29 @@ Java_com_wolfssl_wolfcrypt_Rsa_wc_1RsaPSS_1CheckPadding(
if (ret == 0) {
XMEMSET(pssData, 0, pssDataSz);

/* First decrypt the signature to get PSS padded data */
ret = wc_RsaPSS_Verify_ex(signature, signatureSz, pssData, pssDataSz,
(enum wc_HashType)hashType, mgf, saltLen, key);

if (ret > 0) {
pssDataSz = ret;
/* Now check the PSS padding against the digest */
ret = wc_RsaPSS_CheckPadding_ex(digest, digestSz, pssData,
pssDataSz, (enum wc_HashType)hashType, saltLen, 0);
if (ret == 0) {
if (saltLen == RSA_PSS_SALT_LEN_DEFAULT) {
/* VerifyCheck() sizes the default salt from the modulus bits */
ret = wc_RsaPSS_VerifyCheck(signature, signatureSz, pssData,
pssDataSz, digest, digestSz, (enum wc_HashType)hashType, mgf,
key);
if (ret > 0) {
result = JNI_TRUE;
ret = 0;
}
}
else {
/* First decrypt the signature to get PSS padded data */
ret = wc_RsaPSS_Verify_ex(signature, signatureSz, pssData,
pssDataSz, (enum wc_HashType)hashType, mgf, saltLen, key);

if (ret > 0) {
pssDataSz = ret;
/* Now check the PSS padding against the digest */
ret = wc_RsaPSS_CheckPadding_ex(digest, digestSz, pssData,
pssDataSz, (enum wc_HashType)hashType, saltLen, 0);
if (ret == 0) {
result = JNI_TRUE;
}
}
}

Expand Down
Loading
Loading