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
2 changes: 2 additions & 0 deletions jni/include/wolfcrypt_jni_NativeStruct.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ word32 getDirectBufferLimit(JNIEnv* env, jobject buffer);
void setDirectBufferLimit(JNIEnv* env, jobject buffer, jint limit);

byte* getByteArray(JNIEnv* env, jbyteArray array);
byte* getByteArrayIsCopy(JNIEnv* env, jbyteArray array, jboolean* isCopy);
void zeroizeByteArrayCopy(byte* buf, word32 sz, jboolean isCopy);
void releaseByteArray(JNIEnv* env, jbyteArray array, byte* elements, jint abort);
word32 getByteArrayLength(JNIEnv* env, jbyteArray array);
void initializeNativeStruct(JNIEnv* env, jobject obj);
Expand Down
5 changes: 4 additions & 1 deletion jni/jni_aesccm.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_AesCcm_wc_1AesCcmSetKey
Aes* aes = NULL;
const byte* key = NULL;
word32 keyLen = 0;
jboolean keyIsCopy = JNI_FALSE;

aes = (Aes*) getNativeStruct(env, this);
if ((*env)->ExceptionOccurred(env)) {
Expand All @@ -125,7 +126,8 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_AesCcm_wc_1AesCcmSetKey
}

if (keyArr != NULL) {
key = (const byte*)(*env)->GetByteArrayElements(env, keyArr, NULL);
key = (const byte*)(*env)->GetByteArrayElements(env, keyArr,
&keyIsCopy);
keyLen = (*env)->GetArrayLength(env, keyArr);
}

Expand All @@ -138,6 +140,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_AesCcm_wc_1AesCcmSetKey
}

if (keyArr != NULL) {
zeroizeByteArrayCopy((byte*)key, keyLen, keyIsCopy);
(*env)->ReleaseByteArrayElements(env, keyArr, (jbyte*)key, JNI_ABORT);
}

Expand Down
16 changes: 11 additions & 5 deletions jni/jni_aescmac.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,14 +112,15 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_AesCmac_wc_1CmacSetKey(
Cmac* cmac = NULL;
byte* key = NULL;
word32 keySz = 0;
jboolean keyIsCopy = JNI_FALSE;

cmac = (Cmac*) getNativeStruct(env, this);
if ((*env)->ExceptionOccurred(env)) {
/* getNativeStruct may throw exception, prevent throwing another */
return;
}

key = getByteArray(env, key_object);
key = getByteArrayIsCopy(env, key_object, &keyIsCopy);
keySz = getByteArrayLength(env, key_object);

if (!cmac || !key) {
Expand All @@ -134,6 +135,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_AesCmac_wc_1CmacSetKey(

LogStr("wc_InitCmac(cmac=%p, key, %d) = %d\n", cmac, keySz, ret);

zeroizeByteArrayCopy(key, keySz, keyIsCopy);
releaseByteArray(env, key_object, key, JNI_ABORT);
#else
throwNotCompiledInException(env);
Expand Down Expand Up @@ -300,9 +302,11 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_AesCmac_wc_1AesCmacGenerate(
byte* key = NULL;
byte* mac = NULL;
word32 actualDataSz, actualKeySz, actualMacArraySz;
jboolean keyIsCopy = JNI_FALSE;

data = getByteArray(env, data_object);
key = getByteArray(env, key_object);
key = getByteArrayIsCopy(env, key_object, &keyIsCopy);
actualKeySz = getByteArrayLength(env, key_object);
mac = getByteArray(env, mac_object);

if (data == NULL || key == NULL || mac == NULL) {
Expand All @@ -312,7 +316,6 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_AesCmac_wc_1AesCmacGenerate(
if (ret == 0) {
/* Validate size parameters against actual array sizes */
actualDataSz = getByteArrayLength(env, data_object);
actualKeySz = getByteArrayLength(env, key_object);
actualMacArraySz = getByteArrayLength(env, mac_object);

if (dataSz < 0 || keySz < 0 || macSz < 0 ||
Expand Down Expand Up @@ -352,6 +355,7 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_AesCmac_wc_1AesCmacGenerate(
data, dataSz, key, keySz, ret);

releaseByteArray(env, data_object, data, JNI_ABORT);
zeroizeByteArrayCopy(key, actualKeySz, keyIsCopy);
releaseByteArray(env, key_object, key, JNI_ABORT);
releaseByteArray(env, mac_object, mac, JNI_ABORT);

Expand All @@ -372,10 +376,12 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_AesCmac_wc_1AesCmacVerify(
byte* data = NULL;
byte* key = NULL;
word32 actualMacSz, actualDataSz, actualKeySz;
jboolean keyIsCopy = JNI_FALSE;

mac = getByteArray(env, mac_object);
data = getByteArray(env, data_object);
key = getByteArray(env, key_object);
key = getByteArrayIsCopy(env, key_object, &keyIsCopy);
actualKeySz = getByteArrayLength(env, key_object);

if (mac == NULL || data == NULL || key == NULL) {
ret = BAD_FUNC_ARG;
Expand All @@ -385,7 +391,6 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_AesCmac_wc_1AesCmacVerify(
/* Validate size parameters against actual array sizes */
actualMacSz = getByteArrayLength(env, mac_object);
actualDataSz = getByteArrayLength(env, data_object);
actualKeySz = getByteArrayLength(env, key_object);

if (macSz < 0 || dataSz < 0 || keySz < 0 ||
(word32)macSz > actualMacSz ||
Expand All @@ -405,6 +410,7 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_AesCmac_wc_1AesCmacVerify(

releaseByteArray(env, mac_object, mac, JNI_ABORT);
releaseByteArray(env, data_object, data, JNI_ABORT);
zeroizeByteArrayCopy(key, actualKeySz, keyIsCopy);
releaseByteArray(env, key_object, key, JNI_ABORT);

return ret;
Expand Down
5 changes: 4 additions & 1 deletion jni/jni_aesgcm.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_AesGcm_wc_1AesGcmSetKey
Aes* aes = NULL;
const byte* key = NULL;
word32 keyLen = 0;
jboolean keyIsCopy = JNI_FALSE;

aes = (Aes*) getNativeStruct(env, this);
if ((*env)->ExceptionOccurred(env)) {
Expand All @@ -125,7 +126,8 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_AesGcm_wc_1AesGcmSetKey
}

if (keyArr != NULL) {
key = (const byte*)(*env)->GetByteArrayElements(env, keyArr, NULL);
key = (const byte*)(*env)->GetByteArrayElements(env, keyArr,
&keyIsCopy);
keyLen = (*env)->GetArrayLength(env, keyArr);
}

Expand All @@ -138,6 +140,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_AesGcm_wc_1AesGcmSetKey
}

if (keyArr != NULL) {
zeroizeByteArrayCopy((byte*)key, keyLen, keyIsCopy);
(*env)->ReleaseByteArrayElements(env, keyArr, (jbyte*)key, JNI_ABORT);
}

Expand Down
16 changes: 11 additions & 5 deletions jni/jni_aesgmac.c
Original file line number Diff line number Diff line change
Expand Up @@ -111,14 +111,15 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_AesGmac_wc_1GmacSetKey(
Gmac* gmac = NULL;
byte* key = NULL;
word32 keySz = 0;
jboolean keyIsCopy = JNI_FALSE;

gmac = (Gmac*) getNativeStruct(env, this);
if ((*env)->ExceptionOccurred(env)) {
/* getNativeStruct may throw exception, prevent throwing another */
return;
}

key = getByteArray(env, key_object);
key = getByteArrayIsCopy(env, key_object, &keyIsCopy);
keySz = getByteArrayLength(env, key_object);

if (!gmac || !key) {
Expand All @@ -133,6 +134,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_AesGmac_wc_1GmacSetKey(

LogStr("wc_GmacSetKey(gmac=%p, key, %d) = %d\n", gmac, keySz, ret);

zeroizeByteArrayCopy(key, keySz, keyIsCopy);
releaseByteArray(env, key_object, key, JNI_ABORT);
#else
throwNotCompiledInException(env);
Expand Down Expand Up @@ -220,8 +222,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_AesGmac_wc_1Gmac(
byte* authIn = NULL;
byte* authTag = NULL;
word32 keySz = 0, ivSz = 0, authInSz = 0, authTagSz = 0;
jboolean keyIsCopy = JNI_FALSE;

key = getByteArray(env, key_object);
key = getByteArrayIsCopy(env, key_object, &keyIsCopy);
keySz = getByteArrayLength(env, key_object);
iv = getByteArray(env, iv_object);
authIn = getByteArray(env, authIn_object);
authTag = getByteArray(env, authTag_object);
Expand All @@ -234,7 +238,6 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_AesGmac_wc_1Gmac(
}

if (ret == 0) {
keySz = getByteArrayLength(env, key_object);
ivSz = getByteArrayLength(env, iv_object);
authInSz = getByteArrayLength(env, authIn_object);
authTagSz = getByteArrayLength(env, authTag_object);
Expand Down Expand Up @@ -269,6 +272,7 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_AesGmac_wc_1Gmac(
"authInSz=%d, authTag=%p, authTagSz=%d, ret=%d\n",
key, keySz, iv, ivSz, authIn, authInSz, authTag, authTagSz, ret);

zeroizeByteArrayCopy(key, keySz, keyIsCopy);
releaseByteArray(env, key_object, key, JNI_ABORT);
releaseByteArray(env, iv_object, iv, JNI_ABORT);
releaseByteArray(env, authIn_object, authIn, JNI_ABORT);
Expand All @@ -295,8 +299,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_AesGmac_wc_1GmacVerify(
byte* authIn = NULL;
byte* authTag = NULL;
word32 keySz = 0, ivSz = 0, authInSz = 0, authTagSz = 0;
jboolean keyIsCopy = JNI_FALSE;

key = getByteArray(env, key_object);
key = getByteArrayIsCopy(env, key_object, &keyIsCopy);
keySz = getByteArrayLength(env, key_object);
iv = getByteArray(env, iv_object);
authIn = getByteArray(env, authIn_object);
authTag = getByteArray(env, authTag_object);
Expand All @@ -309,7 +315,6 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_AesGmac_wc_1GmacVerify(
}

if (ret == 0) {
keySz = getByteArrayLength(env, key_object);
ivSz = getByteArrayLength(env, iv_object);
authInSz = getByteArrayLength(env, authIn_object);
authTagSz = getByteArrayLength(env, authTag_object);
Expand Down Expand Up @@ -344,6 +349,7 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_AesGmac_wc_1GmacVerify(
"authInSz=%d, authTag=%p, authTagSz=%d, ret=%d\n",
key, keySz, iv, ivSz, authIn, authInSz, authTag, authTagSz, ret);

zeroizeByteArrayCopy(key, keySz, keyIsCopy);
releaseByteArray(env, key_object, key, JNI_ABORT);
releaseByteArray(env, iv_object, iv, JNI_ABORT);
releaseByteArray(env, authIn_object, authIn, JNI_ABORT);
Expand Down
8 changes: 6 additions & 2 deletions jni/jni_curve25519.c
Original file line number Diff line number Diff line change
Expand Up @@ -159,13 +159,14 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Curve25519_wc_1curve25519_1imp
byte* priv = NULL;
byte* pub = NULL;
word32 privSz = 0, pubSz = 0;
jboolean privIsCopy = JNI_FALSE;

curve25519 = (curve25519_key*) getNativeStruct(env, this);
if ((*env)->ExceptionOccurred(env)) {
/* getNativeStruct may throw exception, prevent throwing another */
return;
}
priv = getByteArray(env, priv_object);
priv = getByteArrayIsCopy(env, priv_object, &privIsCopy);
privSz = getByteArrayLength(env, priv_object);
pub = getByteArray(env, pub_object);
pubSz = getByteArrayLength(env, pub_object);
Expand All @@ -184,6 +185,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Curve25519_wc_1curve25519_1imp

LogStr("wc_curve25519_import_private_key(curve25519=%p) = %d\n", curve25519, ret);

zeroizeByteArrayCopy(priv, privSz, privIsCopy);
releaseByteArray(env, priv_object, priv, JNI_ABORT);
releaseByteArray(env, pub_object, pub, JNI_ABORT);
#else
Expand All @@ -199,13 +201,14 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Curve25519_wc_1curve25519_1imp
curve25519_key* curve25519 = NULL;
byte* priv = NULL;
word32 privSz = 0;
jboolean privIsCopy = JNI_FALSE;

curve25519 = (curve25519_key*) getNativeStruct(env, this);
if ((*env)->ExceptionOccurred(env)) {
/* getNativeStruct may throw exception, prevent throwing another */
return;
}
priv = getByteArray(env, priv_object);
priv = getByteArrayIsCopy(env, priv_object, &privIsCopy);
privSz = getByteArrayLength(env, priv_object);

/* pub may be null if only importing private key */
Expand All @@ -221,6 +224,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Curve25519_wc_1curve25519_1imp

LogStr("wc_curve25519_import_private_key(curve25519=%p) = %d\n", curve25519, ret);

zeroizeByteArrayCopy(priv, privSz, privIsCopy);
releaseByteArray(env, priv_object, priv, JNI_ABORT);
#else
throwNotCompiledInException(env);
Expand Down
6 changes: 5 additions & 1 deletion jni/jni_des3.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,14 +69,17 @@ Java_com_wolfssl_wolfcrypt_Des3_native_1set_1key_1internal(
Des3* des = NULL;
byte* key = NULL;
byte* iv = NULL;
word32 keySz = 0;
jboolean keyIsCopy = JNI_FALSE;

des = (Des3*) getNativeStruct(env, this);
if ((*env)->ExceptionOccurred(env)) {
/* getNativeStruct may throw exception, prevent throwing another */
return;
}

key = getByteArray(env, key_object);
key = getByteArrayIsCopy(env, key_object, &keyIsCopy);
keySz = getByteArrayLength(env, key_object);
iv = getByteArray(env, iv_object);

ret = (!des || !key) /* iv is optional */
Expand All @@ -88,6 +91,7 @@ Java_com_wolfssl_wolfcrypt_Des3_native_1set_1key_1internal(

LogStr("wc_Des3SetKey(Des3=%p, key, iv, opmode) = %d\n", des, ret);

zeroizeByteArrayCopy(key, keySz, keyIsCopy);
releaseByteArray(env, key_object, key, JNI_ABORT);
releaseByteArray(env, iv_object, iv, JNI_ABORT);
#else
Expand Down
14 changes: 11 additions & 3 deletions jni/jni_dh.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include <wolfssl/version.h>
#include <wolfssl/wolfcrypt/dh.h>
#include <wolfssl/wolfcrypt/asn_public.h>
#include <wolfssl/wolfcrypt/memory.h>

#include <com_wolfssl_wolfcrypt_Dh.h>
#include <wolfcrypt_jni_NativeStruct.h>
Expand Down Expand Up @@ -399,14 +400,15 @@ Java_com_wolfssl_wolfcrypt_Dh_wc_1DhAgree(
byte* pub = NULL;
byte* secret = NULL;
word32 privSz = 0, pubSz = 0, secretSz = 0;
jboolean privIsCopy = JNI_FALSE;

key = (DhKey*) getNativeStruct(env, this);
if ((*env)->ExceptionOccurred(env)) {
/* getNativeStruct may throw exception, prevent throwing another */
return NULL;
}

priv = getByteArray(env, priv_object);
priv = getByteArrayIsCopy(env, priv_object, &privIsCopy);
privSz = getByteArrayLength(env, priv_object);
pub = getByteArray(env, pub_object);
pubSz = getByteArrayLength(env, pub_object);
Expand All @@ -420,6 +422,7 @@ Java_com_wolfssl_wolfcrypt_Dh_wc_1DhAgree(
throwOutOfMemoryException(
env, "Failed to allocate shared secret buffer");

zeroizeByteArrayCopy(priv, privSz, privIsCopy);
releaseByteArray(env, priv_object, priv, JNI_ABORT);
releaseByteArray(env, pub_object, pub, JNI_ABORT);

Expand Down Expand Up @@ -464,6 +467,7 @@ Java_com_wolfssl_wolfcrypt_Dh_wc_1DhAgree(
XFREE(secret, NULL, DYNAMIC_TYPE_TMP_BUFFER);
}

zeroizeByteArrayCopy(priv, privSz, privIsCopy);
releaseByteArray(env, priv_object, priv, JNI_ABORT);
releaseByteArray(env, pub_object, pub, JNI_ABORT);
#else
Expand Down Expand Up @@ -783,6 +787,7 @@ Java_com_wolfssl_wolfcrypt_Dh_wc_1DhImportKeyPair(
byte* p = NULL;
byte* g = NULL;
word32 privSz = 0, pubSz = 0, pSz = 0, gSz = 0;
jboolean privIsCopy = JNI_FALSE;

key = (DhKey*) getNativeStruct(env, this);
if ((*env)->ExceptionOccurred(env)) {
Expand Down Expand Up @@ -814,7 +819,7 @@ Java_com_wolfssl_wolfcrypt_Dh_wc_1DhImportKeyPair(
if (ret == 0) {
/* Get private key if provided */
if (priv_object != NULL) {
priv = getByteArray(env, priv_object);
priv = getByteArrayIsCopy(env, priv_object, &privIsCopy);
privSz = getByteArrayLength(env, priv_object);
}

Expand All @@ -835,6 +840,7 @@ Java_com_wolfssl_wolfcrypt_Dh_wc_1DhImportKeyPair(
releaseByteArray(env, p_object, p, JNI_ABORT);
releaseByteArray(env, g_object, g, JNI_ABORT);
if (priv_object != NULL) {
zeroizeByteArrayCopy(priv, privSz, privIsCopy);
releaseByteArray(env, priv_object, priv, JNI_ABORT);
}
if (pub_object != NULL) {
Expand Down Expand Up @@ -1126,6 +1132,7 @@ Java_com_wolfssl_wolfcrypt_Dh_wc_1DhPrivateKeyDecode(
byte* pkcs8 = NULL;
word32 pkcs8Sz = 0;
word32 idx = 0;
jboolean pkcs8IsCopy = JNI_FALSE;

key = (DhKey*) getNativeStruct(env, this);
if ((*env)->ExceptionOccurred(env)) {
Expand All @@ -1138,7 +1145,7 @@ Java_com_wolfssl_wolfcrypt_Dh_wc_1DhPrivateKeyDecode(
return NULL;
}

pkcs8 = getByteArray(env, pkcs8_object);
pkcs8 = getByteArrayIsCopy(env, pkcs8_object, &pkcs8IsCopy);
pkcs8Sz = getByteArrayLength(env, pkcs8_object);

if (pkcs8 == NULL) {
Expand Down Expand Up @@ -1166,6 +1173,7 @@ Java_com_wolfssl_wolfcrypt_Dh_wc_1DhPrivateKeyDecode(

LogStr("wc_DhKeyDecode(pkcs8=%p, key=%p) = %d\n", pkcs8, key, ret);

zeroizeByteArrayCopy(pkcs8, pkcs8Sz, pkcs8IsCopy);
releaseByteArray(env, pkcs8_object, pkcs8, JNI_ABORT);

if (ret != 0) {
Expand Down
Loading
Loading