diff --git a/jni/jni_fips.c b/jni/jni_fips.c index 581b36dd..3497ee9c 100644 --- a/jni/jni_fips.c +++ b/jni/jni_fips.c @@ -36,13 +36,33 @@ #include #include #include + #include #include #include #include #include + + #ifdef NO_OLD_WC_NAMES + #ifndef NO_MD5 + #define MD5_DIGEST_SIZE WC_MD5_DIGEST_SIZE + #endif + #ifndef NO_SHA + #define SHA_DIGEST_SIZE WC_SHA_DIGEST_SIZE + #endif + #ifndef NO_SHA256 + #define SHA256_DIGEST_SIZE WC_SHA256_DIGEST_SIZE + #endif + #ifdef WOLFSSL_SHA384 + #define SHA384_DIGEST_SIZE WC_SHA384_DIGEST_SIZE + #endif + #ifdef WOLFSSL_SHA512 + #define SHA512_DIGEST_SIZE WC_SHA512_DIGEST_SIZE + #endif + #endif #endif #include +#include #include #include @@ -502,6 +522,82 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_getFipsVersion * ### FIPS Approved Security Methods ########################################## */ +#if defined(HAVE_FIPS) +/* Return 1 if the buffer backs at least need bytes, need must be nonnegative + * and fit in a word32 */ +static int fipsCheckDirectSz(JNIEnv* env, jobject buf, jlong need) +{ + if (need < 0 || need > (jlong)UINT32_MAX || buf == NULL || + (*env)->GetDirectBufferAddress(env, buf) == NULL) { + return 0; + } + return ((*env)->GetDirectBufferCapacity(env, buf) >= need); +} + +static int fipsCheckArraySz(JNIEnv* env, jbyteArray arr, jlong need) +{ + if (need < 0 || need > (jlong)UINT32_MAX || arr == NULL) { + return 0; + } + return ((jlong)getByteArrayLength(env, arr) >= need); +} +#endif /* HAVE_FIPS */ + +#if defined(HAVE_FIPS) && defined(HAVE_AESGCM) +/* Optional buffer variants, a need of 0 accepts any buffer including NULL */ +static int fipsCheckDirectSzOpt(JNIEnv* env, jobject buf, jlong need) +{ + if (need == 0) { + return 1; + } + return fipsCheckDirectSz(env, buf, need); +} + +static int fipsCheckArraySzOpt(JNIEnv* env, jbyteArray arr, jlong need) +{ + if (need == 0) { + return 1; + } + return fipsCheckArraySz(env, arr, need); +} +#endif /* HAVE_FIPS && HAVE_AESGCM */ + +#if defined(HAVE_FIPS) && !defined(NO_HMAC) +/* Digest size of the keyed MAC type, FIPS v1 headers have no + * wc_HmacSizeByType so the type is mapped locally there */ +static int fipsHmacDigestSz(Hmac* hmac) +{ +#if defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) + return wc_HmacSizeByType(hmac->macType); +#else + switch (hmac->macType) { + #ifndef NO_MD5 + case WC_MD5: + return MD5_DIGEST_SIZE; + #endif + #ifndef NO_SHA + case WC_SHA: + return SHA_DIGEST_SIZE; + #endif + #ifndef NO_SHA256 + case WC_SHA256: + return SHA256_DIGEST_SIZE; + #endif + #ifdef WOLFSSL_SHA384 + case WC_SHA384: + return SHA384_DIGEST_SIZE; + #endif + #ifdef WOLFSSL_SHA512 + case WC_SHA512: + return SHA512_DIGEST_SIZE; + #endif + default: + return BAD_FUNC_ARG; + } +#endif +} +#endif /* HAVE_FIPS && !NO_HMAC */ + /* * wolfCrypt FIPS API - Symmetric encrypt/decrypt Service */ @@ -529,8 +625,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesSetKey_1fips__Lcom key = getDirectBufferAddress(env, key_buffer); iv = getDirectBufferAddress(env, iv_buffer); - if (!aes || !key) + if (!aes || !fipsCheckDirectSz(env, key_buffer, size) || + (iv_buffer && !fipsCheckDirectSz(env, iv_buffer, AES_IV_SIZE))) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_AesSetKey_fips(aes, key, (word32)size, iv, dir); @@ -540,10 +638,12 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesSetKey_1fips__Lcom LogStr("AesSetKey_fips(aes=%p, key, iv, %s) = %d\n", aes, dir ? "dec" : "enc", ret); - LogStr("key[%u]: [%p]\n", (word32)size, key); - LogHex(key, 0, size); - LogStr("iv[%u]: [%p]\n", (word32)AES_BLOCK_SIZE, iv); - LogHex(iv, 0, AES_BLOCK_SIZE); + if (ret >= 0) { + LogStr("key[%u]: [%p]\n", (word32)size, key); + LogHex(key, 0, size); + LogStr("iv[%u]: [%p]\n", (word32)AES_IV_SIZE, iv); + LogHex(iv, 0, AES_IV_SIZE); + } #endif @@ -571,7 +671,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesSetKey_1fips__Lcom key = getByteArray(env, key_buffer); iv = getByteArray(env, iv_buffer); - if (aes == NULL || key == NULL) { + if (aes == NULL || key == NULL || + !fipsCheckArraySz(env, key_buffer, size) || + (iv_buffer != NULL && (iv == NULL || + !fipsCheckArraySz(env, iv_buffer, AES_IV_SIZE)))) { ret = BAD_FUNC_ARG; } else { @@ -584,10 +687,12 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesSetKey_1fips__Lcom LogStr("AesSetKey_fips(aes=%p, key, iv, %s) = %d\n", aes, dir ? "dec" : "enc", ret); - LogStr("key[%u]: [%p]\n", (word32)size, key); - LogHex(key, 0, size); - LogStr("iv[%u]: [%p]\n", (word32)AES_BLOCK_SIZE, iv); - LogHex(iv, 0, AES_BLOCK_SIZE); + if (ret >= 0) { + LogStr("key[%u]: [%p]\n", (word32)size, key); + LogHex(key, 0, size); + LogStr("iv[%u]: [%p]\n", (word32)AES_IV_SIZE, iv); + LogHex(iv, 0, AES_IV_SIZE); + } releaseByteArray(env, key_buffer, key, 1); releaseByteArray(env, iv_buffer, iv, 1); @@ -616,7 +721,7 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesGcmSetExtIV_1fips_ iv = getDirectBufferAddress(env, iv_buffer); - if (aes == NULL || iv == NULL || size < 0) { + if (aes == NULL || !fipsCheckDirectSz(env, iv_buffer, size)) { return BAD_FUNC_ARG; } @@ -627,8 +732,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesGcmSetExtIV_1fips_ #endif LogStr("AesGcmSetExtIV_fips(aes=%p, iv) = %d\n", aes, ret); - LogStr("iv[%u]: [%p]\n", (word32)size, iv); - LogHex(iv, 0, size); + if (ret >= 0) { + LogStr("iv[%u]: [%p]\n", (word32)size, iv); + LogHex(iv, 0, size); + } #endif @@ -654,7 +761,7 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesGcmSetExtIV_1fips_ iv = getByteArray(env, iv_buffer); - if (aes == NULL || iv == NULL || size < 0) { + if (aes == NULL || iv == NULL || !fipsCheckArraySz(env, iv_buffer, size)) { releaseByteArray(env, iv_buffer, iv, JNI_ABORT); return BAD_FUNC_ARG; } @@ -666,8 +773,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesGcmSetExtIV_1fips_ #endif LogStr("AesGcmSetExtIV_fips(aes=%p, iv) = %d\n", aes, ret); - LogStr("iv[%u]: [%p]\n", (word32)size, iv); - LogHex(iv, 0, size); + if (ret >= 0) { + LogStr("iv[%u]: [%p]\n", (word32)size, iv); + LogHex(iv, 0, size); + } releaseByteArray(env, iv_buffer, iv, 1); @@ -694,8 +803,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesSetIV_1fips__Lcom_ iv = getDirectBufferAddress(env, iv_buffer); - if (!aes || !iv) + if (!aes || !fipsCheckDirectSz(env, iv_buffer, AES_IV_SIZE)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_AesSetIV_fips(aes, iv); @@ -704,8 +814,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesSetIV_1fips__Lcom_ #endif LogStr("AesSetIV_fips(aes=%p, iv) = %d\n", aes, ret); - LogStr("iv[%u]: [%p]\n", (word32)AES_BLOCK_SIZE, iv); - LogHex(iv, 0, AES_BLOCK_SIZE); + if (ret >= 0) { + LogStr("iv[%u]: [%p]\n", (word32)AES_IV_SIZE, iv); + LogHex(iv, 0, AES_IV_SIZE); + } #endif @@ -730,7 +842,8 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesSetIV_1fips__Lcom_ iv = getByteArray(env, iv_buffer); - if (aes == NULL || iv == NULL) { + if (aes == NULL || iv == NULL || + !fipsCheckArraySz(env, iv_buffer, AES_IV_SIZE)) { ret = BAD_FUNC_ARG; } else { @@ -742,8 +855,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesSetIV_1fips__Lcom_ } LogStr("AesSetIV_fips(aes=%p, iv) = %d\n", aes, ret); - LogStr("iv[%u]: [%p]\n", (word32)AES_BLOCK_SIZE, iv); - LogHex(iv, 0, AES_BLOCK_SIZE); + if (ret >= 0) { + LogStr("iv[%u]: [%p]\n", (word32)AES_IV_SIZE, iv); + LogHex(iv, 0, AES_IV_SIZE); + } releaseByteArray(env, iv_buffer, iv, 1); @@ -773,8 +888,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesCbcEncrypt_1fips__ out = getDirectBufferAddress(env, out_buffer); in = getDirectBufferAddress(env, in_buffer); - if (!aes || !out || !in) + if (!aes || !fipsCheckDirectSz(env, out_buffer, size) || + !fipsCheckDirectSz(env, in_buffer, size)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_AesCbcEncrypt_fips(aes, out, in, (word32) size); @@ -783,10 +900,12 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesCbcEncrypt_1fips__ #endif LogStr("AesCbcEncrypt_fips(aes=%p, out, in) = %d\n", aes, ret); - LogStr("in[%u]: [%p]\n", (word32)size, in); - LogHex(in, 0, size); - LogStr("out[%u]: [%p]\n", (word32)size, out); - LogHex(out, 0, size); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)size, in); + LogHex(in, 0, size); + LogStr("out[%u]: [%p]\n", (word32)size, out); + LogHex(out, 0, size); + } #endif @@ -814,7 +933,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesCbcEncrypt_1fips__ out = getByteArray(env, out_buffer); in = getByteArray(env, in_buffer); - if (aes == NULL || out == NULL || in == NULL) { + if (aes == NULL || out == NULL || in == NULL || + !fipsCheckArraySz(env, out_buffer, size) || + !fipsCheckArraySz(env, in_buffer, size)) { ret = BAD_FUNC_ARG; } else { @@ -826,10 +947,12 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesCbcEncrypt_1fips__ } LogStr("AesCbcEncrypt_fips(aes=%p, out, in) = %d\n", aes, ret); - LogStr("in[%u]: [%p]\n", (word32)size, in); - LogHex(in, 0, size); - LogStr("out[%u]: [%p]\n", (word32)size, out); - LogHex(out, 0, size); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)size, in); + LogHex(in, 0, size); + LogStr("out[%u]: [%p]\n", (word32)size, out); + LogHex(out, 0, size); + } releaseByteArray(env, out_buffer, out, ret); releaseByteArray(env, in_buffer, in, 1); @@ -860,8 +983,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesCbcDecrypt_1fips__ out = getDirectBufferAddress(env, out_buffer); in = getDirectBufferAddress(env, in_buffer); - if (!aes || !out || !in) + if (!aes || !fipsCheckDirectSz(env, out_buffer, size) || + !fipsCheckDirectSz(env, in_buffer, size)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_AesCbcDecrypt_fips(aes, out, in, (word32) size); @@ -870,10 +995,12 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesCbcDecrypt_1fips__ #endif LogStr("AesCbcDecrypt_fips(aes=%p, out, in) = %d\n", aes, ret); - LogStr("in[%u]: [%p]\n", (word32)size, in); - LogHex(in, 0, size); - LogStr("out[%u]: [%p]\n", (word32)size, out); - LogHex(out, 0, size); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)size, in); + LogHex(in, 0, size); + LogStr("out[%u]: [%p]\n", (word32)size, out); + LogHex(out, 0, size); + } #endif @@ -901,7 +1028,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesCbcDecrypt_1fips__ out = getByteArray(env, out_buffer); in = getByteArray(env, in_buffer); - if (aes == NULL || out == NULL || in == NULL) { + if (aes == NULL || out == NULL || in == NULL || + !fipsCheckArraySz(env, out_buffer, size) || + !fipsCheckArraySz(env, in_buffer, size)) { ret = BAD_FUNC_ARG; } else { @@ -913,10 +1042,12 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesCbcDecrypt_1fips__ } LogStr("AesCbcDecrypt_fips(aes=%p, out, in) = %d\n", aes, ret); - LogStr("in[%u]: [%p]\n", (word32)size, in); - LogHex(in, 0, size); - LogStr("out[%u]: [%p]\n", (word32)size, out); - LogHex(out, 0, size); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)size, in); + LogHex(in, 0, size); + LogStr("out[%u]: [%p]\n", (word32)size, out); + LogHex(out, 0, size); + } releaseByteArray(env, out_buffer, out, ret); releaseByteArray(env, in_buffer, in, 1); @@ -945,8 +1076,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesGcmSetKey_1fips__L key = getDirectBufferAddress(env, key_buffer); - if (!aes || !key) + if (!aes || !fipsCheckDirectSz(env, key_buffer, size)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_AesGcmSetKey_fips(aes, key, (word32)size); @@ -955,8 +1087,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesGcmSetKey_1fips__L #endif LogStr("AesGcmSetKey_fips(aes=%p, key) = %d\n", aes, ret); - LogStr("key[%u]: [%p]\n", (word32)size, key); - LogHex(key, 0, size); + if (ret >= 0) { + LogStr("key[%u]: [%p]\n", (word32)size, key); + LogHex(key, 0, size); + } #endif @@ -982,7 +1116,8 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesGcmSetKey_1fips__L key = getByteArray(env, key_buffer); - if (aes == NULL || key == NULL) { + if (aes == NULL || key == NULL || + !fipsCheckArraySz(env, key_buffer, size)) { ret = BAD_FUNC_ARG; } else { @@ -994,8 +1129,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesGcmSetKey_1fips__L } LogStr("AesGcmSetKey_fips(aes=%p, key) = %d\n", aes, ret); - LogStr("key[%u]: [%p]\n", (word32)size, key); - LogHex(key, 0, size); + if (ret >= 0) { + LogStr("key[%u]: [%p]\n", (word32)size, key); + LogHex(key, 0, size); + } releaseByteArray(env, key_buffer, key, 1); @@ -1038,8 +1175,11 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesGcmEncrypt_1fips__ authTag = getDirectBufferAddress(env, authTag_buffer); authIn = getDirectBufferAddress(env, authIn_buffer); - if (!aes || !out || !in || (!iv && ivSz) || (!authTag && authTagSz) - || (!authIn && authInSz)) { + if (!aes || !fipsCheckDirectSz(env, out_buffer, size) || + !fipsCheckDirectSz(env, in_buffer, size) || + !fipsCheckDirectSzOpt(env, iv_buffer, ivSz) || + !fipsCheckDirectSzOpt(env, authTag_buffer, authTagSz) || + !fipsCheckDirectSzOpt(env, authIn_buffer, authInSz)) { return BAD_FUNC_ARG; } @@ -1076,16 +1216,18 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesGcmEncrypt_1fips__ LogStr( "AesGcmEncrypt_fips(aes=%p, out, in, iv, authTag, authIn) = %d\n", aes, ret); - LogStr("in[%u]: [%p]\n", (word32)size, in); - LogHex(in, 0, size); - LogStr("out[%u]: [%p]\n", (word32)size, out); - LogHex(out, 0, size); - LogStr("iv[%u]: [%p]\n", (word32)ivSz, iv); - LogHex(iv, 0, ivSz); - LogStr("authTag[%u]: [%p]\n", (word32)authTagSz, authTag); - LogHex(authTag, 0, authTagSz); - LogStr("authIn[%u]: [%p]\n", (word32)authInSz, authIn); - LogHex(authIn, 0, authInSz); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)size, in); + LogHex(in, 0, size); + LogStr("out[%u]: [%p]\n", (word32)size, out); + LogHex(out, 0, size); + LogStr("iv[%u]: [%p]\n", (word32)ivSz, iv); + LogHex(iv, 0, ivSz); + LogStr("authTag[%u]: [%p]\n", (word32)authTagSz, authTag); + LogHex(authTag, 0, authTagSz); + LogStr("authIn[%u]: [%p]\n", (word32)authInSz, authIn); + LogHex(authIn, 0, authInSz); + } #endif @@ -1126,10 +1268,13 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesGcmEncrypt_1fips__ authTag = getByteArray(env, authTag_buffer); authIn = getByteArray(env, authIn_buffer); - if (!aes || !out || !in || (!iv && ivSz) || (!authTag && authTagSz) - || (!authIn && authInSz)) { + if (!aes || !out || !in || (!iv && ivSz) || (!authTag && authTagSz) || + (!authIn && authInSz) || !fipsCheckArraySz(env, out_buffer, size) || + !fipsCheckArraySz(env, in_buffer, size) || + !fipsCheckArraySzOpt(env, iv_buffer, ivSz) || + !fipsCheckArraySzOpt(env, authTag_buffer, authTagSz) || + !fipsCheckArraySzOpt(env, authIn_buffer, authInSz)) { ret = BAD_FUNC_ARG; - } else { #if FIPS_VERSION_GT(5,0) @@ -1165,16 +1310,18 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesGcmEncrypt_1fips__ LogStr( "AesGcmEncrypt_fips(aes=%p, out, in, iv, authTag, authIn) = %d\n", aes, ret); - LogStr("in[%u]: [%p]\n", (word32)size, in); - LogHex(in, 0, size); - LogStr("out[%u]: [%p]\n", (word32)size, out); - LogHex(out, 0, size); - LogStr("iv[%u]: [%p]\n", (word32)ivSz, iv); - LogHex(iv, 0, ivSz); - LogStr("authTag[%u]: [%p]\n", (word32)authTagSz, authTag); - LogHex(authTag, 0, authTagSz); - LogStr("authIn[%u]: [%p]\n", (word32)authInSz, authIn); - LogHex(authIn, 0, authInSz); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)size, in); + LogHex(in, 0, size); + LogStr("out[%u]: [%p]\n", (word32)size, out); + LogHex(out, 0, size); + LogStr("iv[%u]: [%p]\n", (word32)ivSz, iv); + LogHex(iv, 0, ivSz); + LogStr("authTag[%u]: [%p]\n", (word32)authTagSz, authTag); + LogHex(authTag, 0, authTagSz); + LogStr("authIn[%u]: [%p]\n", (word32)authInSz, authIn); + LogHex(authIn, 0, authInSz); + } releaseByteArray(env, out_buffer, out, ret); releaseByteArray(env, in_buffer, in, 1); @@ -1216,9 +1363,13 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesGcmDecrypt_1fips__ authTag = getDirectBufferAddress(env, authTag_buffer); authIn = getDirectBufferAddress(env, authIn_buffer); - if (!aes || !out || !in || (!iv && ivSz) || (!authTag && authTagSz) - || (!authIn && authInSz)) + if (!aes || !fipsCheckDirectSz(env, out_buffer, size) || + !fipsCheckDirectSz(env, in_buffer, size) || + !fipsCheckDirectSzOpt(env, iv_buffer, ivSz) || + !fipsCheckDirectSzOpt(env, authTag_buffer, authTagSz) || + !fipsCheckDirectSzOpt(env, authIn_buffer, authInSz)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_AesGcmDecrypt_fips(aes, out, in, (word32)size, iv, @@ -1231,16 +1382,18 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesGcmDecrypt_1fips__ LogStr( "AesGcmDecrypt_fips(aes=%p, out, in, iv, authTag, authIn) = %d\n", aes, ret); - LogStr("in[%u]: [%p]\n", (word32)AES_BLOCK_SIZE, in); - LogHex(in, 0, AES_BLOCK_SIZE); - LogStr("out[%u]: [%p]\n", (word32)AES_BLOCK_SIZE, out); - LogHex(out, 0, AES_BLOCK_SIZE); - LogStr("iv[%u]: [%p]\n", (word32)ivSz, iv); - LogHex(iv, 0, ivSz); - LogStr("authTag[%u]: [%p]\n", (word32)authTagSz, authTag); - LogHex(authTag, 0, authTagSz); - LogStr("authIn[%u]: [%p]\n", (word32)authInSz, authIn); - LogHex(authIn, 0, authInSz); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)size, in); + LogHex(in, 0, size); + LogStr("out[%u]: [%p]\n", (word32)size, out); + LogHex(out, 0, size); + LogStr("iv[%u]: [%p]\n", (word32)ivSz, iv); + LogHex(iv, 0, ivSz); + LogStr("authTag[%u]: [%p]\n", (word32)authTagSz, authTag); + LogHex(authTag, 0, authTagSz); + LogStr("authIn[%u]: [%p]\n", (word32)authInSz, authIn); + LogHex(authIn, 0, authInSz); + } #endif @@ -1276,8 +1429,12 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesGcmDecrypt_1fips__ authTag = getByteArray(env, authTag_buffer); authIn = getByteArray(env, authIn_buffer); - if (!aes || !out || !in || (!iv && ivSz) || (!authTag && authTagSz) - || (!authIn && authInSz)) { + if (!aes || !out || !in || (!iv && ivSz) || (!authTag && authTagSz) || + (!authIn && authInSz) || !fipsCheckArraySz(env, out_buffer, size) || + !fipsCheckArraySz(env, in_buffer, size) || + !fipsCheckArraySzOpt(env, iv_buffer, ivSz) || + !fipsCheckArraySzOpt(env, authTag_buffer, authTagSz) || + !fipsCheckArraySzOpt(env, authIn_buffer, authInSz)) { ret = BAD_FUNC_ARG; } else { @@ -1293,16 +1450,18 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesGcmDecrypt_1fips__ LogStr( "AesGcmDecrypt_fips(aes=%p, out, in, iv, authTag, authIn) = %d\n", aes, ret); - LogStr("in[%u]: [%p]\n", (word32)AES_BLOCK_SIZE, in); - LogHex(in, 0, AES_BLOCK_SIZE); - LogStr("out[%u]: [%p]\n", (word32)AES_BLOCK_SIZE, out); - LogHex(out, 0, AES_BLOCK_SIZE); - LogStr("iv[%u]: [%p]\n", (word32)ivSz, iv); - LogHex(iv, 0, ivSz); - LogStr("authTag[%u]: [%p]\n", (word32)authTagSz, authTag); - LogHex(authTag, 0, authTagSz); - LogStr("authIn[%u]: [%p]\n", (word32)authInSz, authIn); - LogHex(authIn, 0, authInSz); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)size, in); + LogHex(in, 0, size); + LogStr("out[%u]: [%p]\n", (word32)size, out); + LogHex(out, 0, size); + LogStr("iv[%u]: [%p]\n", (word32)ivSz, iv); + LogHex(iv, 0, ivSz); + LogStr("authTag[%u]: [%p]\n", (word32)authTagSz, authTag); + LogHex(authTag, 0, authTagSz); + LogStr("authIn[%u]: [%p]\n", (word32)authInSz, authIn); + LogHex(authIn, 0, authInSz); + } releaseByteArray(env, out_buffer, out, ret); releaseByteArray(env, in_buffer, in, 1); @@ -1340,17 +1499,21 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Des3_1SetKey_1fips__L key = getDirectBufferAddress(env, key_buffer); iv = getDirectBufferAddress(env, iv_buffer); - if (!des || !key) + if (!des || !fipsCheckDirectSz(env, key_buffer, DES3_KEY_SIZE) || + (iv_buffer && !fipsCheckDirectSz(env, iv_buffer, DES_BLOCK_SIZE))) { return BAD_FUNC_ARG; + } ret = Des3_SetKey_fips(des, key, iv, dir); LogStr("Des3_SetKey_fips(des=%p, key, iv, %s) = %d\n", des, dir ? "dec" : "enc", ret); - LogStr("key[%u]: [%p]\n", (word32)DES3_KEYLEN, key); - LogHex(key, 0, DES3_KEYLEN); - LogStr("iv[%u]: [%p]\n", (word32)DES3_IVLEN, iv); - LogHex(iv, 0, DES3_IVLEN); + if (ret >= 0) { + LogStr("key[%u]: [%p]\n", (word32)DES3_KEY_SIZE, key); + LogHex(key, 0, DES3_KEY_SIZE); + LogStr("iv[%u]: [%p]\n", (word32)DES_BLOCK_SIZE, iv); + LogHex(iv, 0, DES_BLOCK_SIZE); + } #endif @@ -1380,15 +1543,23 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Des3_1SetKey_1fips__L key = getByteArray(env, key_buffer); iv = getByteArray(env, iv_buffer); - ret = (!des || !key) ? BAD_FUNC_ARG - : Des3_SetKey_fips(des, key, iv, dir); + if (!des || !key || !fipsCheckArraySz(env, key_buffer, DES3_KEY_SIZE) || + (iv_buffer && (!iv || + !fipsCheckArraySz(env, iv_buffer, DES_BLOCK_SIZE)))) { + ret = BAD_FUNC_ARG; + } + else { + ret = Des3_SetKey_fips(des, key, iv, dir); + } LogStr("Des3_SetKey_fips(des=%p, key, iv, %s) = %d\n", des, dir ? "dec" : "enc", ret); - LogStr("key[%u]: [%p]\n", (word32)DES3_KEYLEN, key); - LogHex(key, 0, DES3_KEYLEN); - LogStr("iv[%u]: [%p]\n", (word32)DES3_IVLEN, iv); - LogHex(iv, 0, DES3_IVLEN); + if (ret >= 0) { + LogStr("key[%u]: [%p]\n", (word32)DES3_KEY_SIZE, key); + LogHex(key, 0, DES3_KEY_SIZE); + LogStr("iv[%u]: [%p]\n", (word32)DES_BLOCK_SIZE, iv); + LogHex(iv, 0, DES_BLOCK_SIZE); + } releaseByteArray(env, key_buffer, key, 1); releaseByteArray(env, iv_buffer, iv, 1); @@ -1418,13 +1589,17 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Des3_1SetIV_1fips__Lc iv = getDirectBufferAddress(env, iv_buffer); - if (!des || !iv) + if (!des || !fipsCheckDirectSz(env, iv_buffer, DES_BLOCK_SIZE)) { return BAD_FUNC_ARG; + } + ret = Des3_SetIV_fips(des, iv); LogStr("Des3_SetIV_fips(des=%p, iv) = %d\n", des, ret); - LogStr("iv[%u]: [%p]\n", (word32)DES_BLOCK_SIZE, iv); - LogHex(iv, 0, DES_BLOCK_SIZE); + if (ret >= 0) { + LogStr("iv[%u]: [%p]\n", (word32)DES_BLOCK_SIZE, iv); + LogHex(iv, 0, DES_BLOCK_SIZE); + } #endif @@ -1451,12 +1626,18 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Des3_1SetIV_1fips__Lc iv = getByteArray(env, iv_buffer); - ret = (!des || !iv) ? BAD_FUNC_ARG - : Des3_SetIV_fips(des, iv); + if (!des || !iv || !fipsCheckArraySz(env, iv_buffer, DES_BLOCK_SIZE)) { + ret = BAD_FUNC_ARG; + } + else { + ret = Des3_SetIV_fips(des, iv); + } LogStr("Des3_SetIV_fips(des=%p, iv) = %d\n", des, ret); - LogStr("iv[%u]: [%p]\n", (word32)DES_BLOCK_SIZE, iv); - LogHex(iv, 0, DES_BLOCK_SIZE); + if (ret >= 0) { + LogStr("iv[%u]: [%p]\n", (word32)DES_BLOCK_SIZE, iv); + LogHex(iv, 0, DES_BLOCK_SIZE); + } releaseByteArray(env, iv_buffer, iv, 1); @@ -1488,16 +1669,20 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Des3_1CbcEncrypt_1fip out = getDirectBufferAddress(env, out_buffer); in = getDirectBufferAddress(env, in_buffer); - if (!des || !out || !in) + if (!des || !fipsCheckDirectSz(env, out_buffer, size) || + !fipsCheckDirectSz(env, in_buffer, size)) { return BAD_FUNC_ARG; + } ret = Des3_CbcEncrypt_fips(des, out, in, (word32) size); LogStr("Des3_CbcEncrypt_fips(des=%p, out, in) = %d\n", des, ret); - LogStr("in[%u]: [%p]\n", (word32)size, in); - LogHex(in, 0, size); - LogStr("out[%u]: [%p]\n", (word32)size, out); - LogHex(out, 0, size); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)size, in); + LogHex(in, 0, size); + LogStr("out[%u]: [%p]\n", (word32)size, out); + LogHex(out, 0, size); + } #endif @@ -1527,15 +1712,21 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Des3_1CbcEncrypt_1fip out = getByteArray(env, out_buffer); in = getByteArray(env, in_buffer); - ret = (!des || !out || !in) ? BAD_FUNC_ARG - : Des3_CbcEncrypt_fips(des, out, in, - (word32) size); + if (!des || !out || !in || !fipsCheckArraySz(env, out_buffer, size) || + !fipsCheckArraySz(env, in_buffer, size)) { + ret = BAD_FUNC_ARG; + } + else { + ret = Des3_CbcEncrypt_fips(des, out, in, (word32) size); + } LogStr("Des3_CbcEncrypt_fips(des=%p, out, in) = %d\n", des, ret); - LogStr("in[%u]: [%p]\n", (word32)size, in); - LogHex(in, 0, size); - LogStr("out[%u]: [%p]\n", (word32)size, out); - LogHex(out, 0, size); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)size, in); + LogHex(in, 0, size); + LogStr("out[%u]: [%p]\n", (word32)size, out); + LogHex(out, 0, size); + } releaseByteArray(env, out_buffer, out, ret); releaseByteArray(env, in_buffer, in, 1); @@ -1568,16 +1759,20 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Des3_1CbcDecrypt_1fip out = getDirectBufferAddress(env, out_buffer); in = getDirectBufferAddress(env, in_buffer); - if (!des || !out || !in) + if (!des || !fipsCheckDirectSz(env, out_buffer, size) || + !fipsCheckDirectSz(env, in_buffer, size)) { return BAD_FUNC_ARG; + } ret = Des3_CbcDecrypt_fips(des, out, in, (word32) size); LogStr("Des3_CbcDecrypt_fips(des=%p, out, in) = %d\n", des, ret); - LogStr("in[%u]: [%p]\n", (word32)size, in); - LogHex(in, 0, size); - LogStr("out[%u]: [%p]\n", (word32)size, out); - LogHex(out, 0, size); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)size, in); + LogHex(in, 0, size); + LogStr("out[%u]: [%p]\n", (word32)size, out); + LogHex(out, 0, size); + } #endif @@ -1607,14 +1802,21 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Des3_1CbcDecrypt_1fip out = getByteArray(env, out_buffer); in = getByteArray(env, in_buffer); - ret = (!des || !out || !in) ? BAD_FUNC_ARG - : Des3_CbcDecrypt_fips(des, out, in, (word32) size); + if (!des || !out || !in || !fipsCheckArraySz(env, out_buffer, size) || + !fipsCheckArraySz(env, in_buffer, size)) { + ret = BAD_FUNC_ARG; + } + else { + ret = Des3_CbcDecrypt_fips(des, out, in, (word32) size); + } LogStr("Des3_CbcDecrypt_fips(des=%p, out, in) = %d\n", des, ret); - LogStr("in[%u]: [%p]\n", (word32)size, in); - LogHex(in, 0, size); - LogStr("out[%u]: [%p]\n", (word32)size, out); - LogHex(out, 0, size); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)size, in); + LogHex(in, 0, size); + LogStr("out[%u]: [%p]\n", (word32)size, out); + LogHex(out, 0, size); + } releaseByteArray(env, out_buffer, out, ret); releaseByteArray(env, in_buffer, in, 1); @@ -1649,8 +1851,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1HmacSetKey_1fips__Lco key = getDirectBufferAddress(env, key_buffer); - if (!hmac || !key) + if (!hmac || !fipsCheckDirectSz(env, key_buffer, keySz)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_HmacSetKey_fips(hmac, type, key, (word32)keySz); @@ -1660,8 +1863,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1HmacSetKey_1fips__Lco LogStr("HmacSetKey_fips(hmac=%p, type=%d, key, keySz) = %d\n", hmac, type, ret); - LogStr("key[%u]: [%p]\n", (word32)keySz, key); - LogHex(key, 0, keySz); + if (ret >= 0) { + LogStr("key[%u]: [%p]\n", (word32)keySz, key); + LogHex(key, 0, keySz); + } #endif @@ -1687,7 +1892,8 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1HmacSetKey_1fips__Lco key = getByteArray(env, key_buffer); - if (hmac == NULL || key == NULL) { + if (hmac == NULL || key == NULL || + !fipsCheckArraySz(env, key_buffer, keySz)) { ret = BAD_FUNC_ARG; } else { @@ -1700,8 +1906,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1HmacSetKey_1fips__Lco LogStr("HmacSetKey_fips(hmac=%p, type=%d, key, keySz) = %d\n", hmac, type, ret); - LogStr("key[%u]: [%p]\n", (word32)keySz, key); - LogHex(key, 0, keySz); + if (ret >= 0) { + LogStr("key[%u]: [%p]\n", (word32)keySz, key); + LogHex(key, 0, keySz); + } releaseByteArray(env, key_buffer, key, 1); @@ -1729,8 +1937,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1HmacUpdate_1fips__Lco data = getDirectBufferAddress(env, data_buffer); - if (!hmac || !data) + if (!hmac || !fipsCheckDirectSz(env, data_buffer, len)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_HmacUpdate_fips(hmac, data, (word32)len); @@ -1739,8 +1948,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1HmacUpdate_1fips__Lco #endif LogStr("HmacUpdate_fips(hmac=%p, data, len) = %d\n", hmac, ret); - LogStr("data[%u]: [%p]\n", (word32)len, data); - LogHex(data, 0, len); + if (ret >= 0) { + LogStr("data[%u]: [%p]\n", (word32)len, data); + LogHex(data, 0, len); + } #endif @@ -1766,7 +1977,8 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1HmacUpdate_1fips__Lco data = getByteArray(env, data_buffer); - if (hmac == NULL || data == NULL) { + if (hmac == NULL || data == NULL || + !fipsCheckArraySz(env, data_buffer, len)) { ret = BAD_FUNC_ARG; } else { @@ -1778,8 +1990,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1HmacUpdate_1fips__Lco } LogStr("HmacUpdate_fips(hmac=%p, data, len) = %d\n", hmac, ret); - LogStr("data[%u]: [%p]\n", (word32)len, data); - LogHex(data, 0, len); + if (ret >= 0) { + LogStr("data[%u]: [%p]\n", (word32)len, data); + LogHex(data, 0, len); + } releaseByteArray(env, data_buffer, data, 1); @@ -1806,8 +2020,14 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1HmacFinal_1fips__Lcom hash = getDirectBufferAddress(env, hash_buffer); - if (!hmac || !hash) + if (!hmac || !hash) { return BAD_FUNC_ARG; + } + + /* hash must hold the digest of the keyed MAC type */ + if (!fipsCheckDirectSz(env, hash_buffer, fipsHmacDigestSz(hmac))) { + return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_HmacFinal_fips(hmac, hash); @@ -1840,7 +2060,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1HmacFinal_1fips__Lcom hash = getByteArray(env, hash_buffer); - if (hmac == NULL || hash == NULL) { + /* hash must hold the digest of the keyed MAC type */ + if (hmac == NULL || hash == NULL || + !fipsCheckArraySz(env, hash_buffer, fipsHmacDigestSz(hmac))) { ret = BAD_FUNC_ARG; } else { @@ -1937,8 +2159,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RNG_1GenerateBlock_1f buf = getDirectBufferAddress(env, buf_buffer); - if (!rng || !buf) + if (!rng || !fipsCheckDirectSz(env, buf_buffer, bufSz)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_RNG_GenerateBlock_fips(rng, buf, (word32)bufSz); @@ -1947,8 +2170,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RNG_1GenerateBlock_1f #endif LogStr("RNG_GenerateBlock_fips(rng=%p, buf, bufSz) = %d\n", rng, ret); - LogStr("output[%u]: [%p]\n", (word32)bufSz, buf); - LogHex(buf, 0, bufSz); + if (ret >= 0) { + LogStr("output[%u]: [%p]\n", (word32)bufSz, buf); + LogHex(buf, 0, bufSz); + } #endif @@ -1974,7 +2199,8 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RNG_1GenerateBlock_1f buf = getByteArray(env, buf_buffer); - if (rng == NULL || buf == NULL) { + if (rng == NULL || buf == NULL || + !fipsCheckArraySz(env, buf_buffer, bufSz)) { ret = BAD_FUNC_ARG; } else { @@ -1986,8 +2212,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RNG_1GenerateBlock_1f } LogStr("RNG_GenerateBlock_fips(rng=%p, buf, bufSz) = %d\n", rng, ret); - LogStr("output[%u]: [%p]\n", (word32)bufSz, buf); - LogHex(buf, 0, bufSz); + if (ret >= 0) { + LogStr("output[%u]: [%p]\n", (word32)bufSz, buf); + LogHex(buf, 0, bufSz); + } releaseByteArray(env, buf_buffer, buf, ret); @@ -2009,8 +2237,11 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RNG_1HealthTest_1fips const byte* entropyB = getDirectBufferAddress(env, entropyB_object); byte* output = getDirectBufferAddress(env, output_object); - if (!entropyA || (reseed && !entropyB) || !output) + if (!fipsCheckDirectSz(env, entropyA_object, entropyASz) || + (reseed && !fipsCheckDirectSz(env, entropyB_object, entropyBSz)) || + !fipsCheckDirectSz(env, output_object, outputSz)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_RNG_HealthTest_fips(reseed, entropyA, (word32)entropyASz, @@ -2022,12 +2253,14 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RNG_1HealthTest_1fips LogStr("RNG_HealthTest_fips(reseed=%d, entropyA, entropyASz, " "entropyB, entropyBSz, output, outputSz) = %d\n", reseed, ret); - LogStr("entropyA[%u]: [%p]\n", (word32)entropyASz, entropyA); - LogHex((byte*) entropyA, 0, entropyASz); - LogStr("entropyB[%u]: [%p]\n", (word32)entropyBSz, entropyB); - LogHex((byte*) entropyB, 0, entropyBSz); - LogStr("output[%u]: [%p]\n", (word32)outputSz, output); - LogHex(output, 0, outputSz); + if (ret >= 0) { + LogStr("entropyA[%u]: [%p]\n", (word32)entropyASz, entropyA); + LogHex((byte*) entropyA, 0, entropyASz); + LogStr("entropyB[%u]: [%p]\n", (word32)entropyBSz, entropyB); + LogHex((byte*) entropyB, 0, entropyBSz); + LogStr("output[%u]: [%p]\n", (word32)outputSz, output); + LogHex(output, 0, outputSz); + } #endif @@ -2047,7 +2280,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RNG_1HealthTest_1fips const byte* entropyB = getByteArray(env, entropyB_object); byte* output = getByteArray(env, output_object); - if (!entropyA || (reseed && !entropyB) || !output) { + if (!entropyA || (reseed && !entropyB) || !output || + !fipsCheckArraySz(env, entropyA_object, entropyASz) || + (reseed && !fipsCheckArraySz(env, entropyB_object, entropyBSz)) || + !fipsCheckArraySz(env, output_object, outputSz)) { ret = BAD_FUNC_ARG; } else { @@ -2062,12 +2298,14 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RNG_1HealthTest_1fips LogStr("RNG_HealthTest_fips(reseed=%d, entropyA, entropyASz, " "entropyB, entropyBSz, output, outputSz) = %d\n", reseed, ret); - LogStr("entropyA[%u]: [%p]\n", (word32)entropyASz, entropyA); - LogHex((byte*) entropyA, 0, entropyASz); - LogStr("entropyB[%u]: [%p]\n", (word32)entropyBSz, entropyB); - LogHex((byte*) entropyB, 0, entropyBSz); - LogStr("output[%u]: [%p]\n", (word32)outputSz, output); - LogHex(output, 0, outputSz); + if (ret >= 0) { + LogStr("entropyA[%u]: [%p]\n", (word32)entropyASz, entropyA); + LogHex((byte*) entropyA, 0, entropyASz); + LogStr("entropyB[%u]: [%p]\n", (word32)entropyBSz, entropyB); + LogHex((byte*) entropyB, 0, entropyBSz); + LogStr("output[%u]: [%p]\n", (word32)outputSz, output); + LogHex(output, 0, outputSz); + } releaseByteArray(env, entropyA_object, (byte*)entropyA, 1); releaseByteArray(env, entropyB_object, (byte*)entropyB, 1); @@ -2173,8 +2411,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaSSL_1Sign_1fips__L * Providing an rng is optional. RNG_GenerateBlock will return BAD_FUNC_ARG * on a NULL rng if an RNG is needed by RsaPad. */ - if (!in || !out) + if (!fipsCheckDirectSz(env, in_object, inLen) || + !fipsCheckDirectSz(env, out_object, outLen)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_RsaSSL_Sign_fips(in, (word32)inLen, out, (word32)outLen, @@ -2186,10 +2426,12 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaSSL_1Sign_1fips__L LogStr("RsaSSL_Sign_fips(in, inLen, out, outLen, key=%p, rng=%p) = %d\n", key, rng, ret); - LogStr("in[%u]: [%p]\n", (word32)inLen, in); - LogHex((byte*) in, 0, inLen); - LogStr("out[%u]: [%p]\n", (word32)outLen, out); - LogHex((byte*) out, 0, outLen); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)inLen, in); + LogHex((byte*) in, 0, inLen); + LogStr("out[%u]: [%p]\n", (word32)outLen, out); + LogHex((byte*) out, 0, outLen); + } #endif @@ -2208,8 +2450,6 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaSSL_1Sign_1fips___ byte* out = NULL; RsaKey* key = NULL; RNG* rng = NULL; - word32 inSz = 0; - word32 outSz = 0; key = (RsaKey*) getNativeStruct(env, rsa_object); if (key == NULL || (*env)->ExceptionOccurred(env)) { @@ -2223,14 +2463,13 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaSSL_1Sign_1fips___ return BAD_FUNC_ARG; } - in = getByteArray(env, in_object); - inSz = getByteArrayLength(env, in_object); - out = getByteArray(env, out_object); - outSz = getByteArrayLength(env, out_object); + in = getByteArray(env, in_object); + out = getByteArray(env, out_object); /* sanity check on array pointers and sizes */ if (in == NULL || out == NULL || - (inSz < (word32)inLen) || (outSz < outLen)) { + !fipsCheckArraySz(env, in_object, inLen) || + !fipsCheckArraySz(env, out_object, outLen)) { ret = BAD_FUNC_ARG; } else { @@ -2249,10 +2488,12 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaSSL_1Sign_1fips___ LogStr("RsaSSL_Sign_fips(in, inLen, out, outLen, key=%p, rng=%p) = %d\n", key, rng, ret); - LogStr("in[%u]: [%p]\n", (word32)inLen, in); - LogHex((byte*) in, 0, inLen); - LogStr("out[%u]: [%p]\n", (word32)outLen, out); - LogHex((byte*) out, 0, outLen); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)inLen, in); + LogHex((byte*) in, 0, inLen); + LogStr("out[%u]: [%p]\n", (word32)outLen, out); + LogHex((byte*) out, 0, outLen); + } releaseByteArray(env, in_object, in, 1); if (ret < 0) { @@ -2289,8 +2530,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaSSL_1Verify_1fips_ in = getDirectBufferAddress(env, in_object); out = getDirectBufferAddress(env, out_object); - if (!in || !out) + if (!fipsCheckDirectSz(env, in_object, inLen) || + !fipsCheckDirectSz(env, out_object, outLen)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_RsaSSL_Verify_fips(in, (word32)inLen, out, @@ -2302,10 +2545,12 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaSSL_1Verify_1fips_ LogStr("RsaSSL_Verify_fips(in, inLen, out, outLen, key=%p) = %d\n", key, ret); - LogStr("in[%u]: [%p]\n", (word32)inLen, in); - LogHex((byte*) in, 0, inLen); - LogStr("out[%u]: [%p]\n", (word32)outLen, out); - LogHex((byte*) out, 0, outLen); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)inLen, in); + LogHex((byte*) in, 0, inLen); + LogStr("out[%u]: [%p]\n", (word32)outLen, out); + LogHex((byte*) out, 0, outLen); + } #endif @@ -2323,8 +2568,6 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaSSL_1Verify_1fips_ byte* in = NULL; byte* out = NULL; RsaKey* key = NULL; - word32 inSz = 0; - word32 outSz = 0; key = (RsaKey*) getNativeStruct(env, rsa_object); if (key == NULL || (*env)->ExceptionOccurred(env)) { @@ -2332,14 +2575,13 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaSSL_1Verify_1fips_ return BAD_FUNC_ARG; } - in = getByteArray(env, in_object); - inSz = getByteArrayLength(env, in_object); - out = getByteArray(env, out_object); - outSz = getByteArrayLength(env, out_object); + in = getByteArray(env, in_object); + out = getByteArray(env, out_object); /* sanity check on array pointers and sizes */ if (in == NULL || out == NULL || - (inSz < (word32)inLen) || (outSz < outLen)) { + !fipsCheckArraySz(env, in_object, inLen) || + !fipsCheckArraySz(env, out_object, outLen)) { ret = BAD_FUNC_ARG; } else { @@ -2353,10 +2595,12 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaSSL_1Verify_1fips_ LogStr("RsaSSL_Verify_fips(in, inLen, out, outLen, key=%p) = %d\n", key, ret); - LogStr("in[%u]: [%p]\n", (word32)inLen, in); - LogHex((byte*) in, 0, inLen); - LogStr("out[%u]: [%p]\n", (word32)outLen, out); - LogHex((byte*) out, 0, outLen); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)inLen, in); + LogHex((byte*) in, 0, inLen); + LogStr("out[%u]: [%p]\n", (word32)outLen, out); + LogHex((byte*) out, 0, outLen); + } } releaseByteArray(env, in_object, in, 1); @@ -2413,8 +2657,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaPrivateKeyDecode_1 } input = getDirectBufferAddress(env, input_object); - if (!input) + if (!fipsCheckDirectSz(env, input_object, inSz)) { return BAD_FUNC_ARG; + } (*env)->GetLongArrayRegion(env, inOutIdx, 0, 1, &tmpIdx); if ((*env)->ExceptionOccurred(env)) { @@ -2433,8 +2678,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaPrivateKeyDecode_1 LogStr("RsaPrivateKeyDecode_fips(input, inOutIdx, key=%p, inSz) = %d\n", key, ret); - LogStr("input[%u]: [%p]\n", (word32)inSz, input); - LogHex((byte*) input, 0, inSz); + if (ret >= 0) { + LogStr("input[%u]: [%p]\n", (word32)inSz, input); + LogHex((byte*) input, 0, inSz); + } #endif @@ -2469,23 +2716,26 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaPrivateKeyDecode_1 } tmpIdx32 = (word32)tmpIdx; + if (!input || !fipsCheckArraySz(env, input_object, inSz)) { + ret = BAD_FUNC_ARG; + } + else { #if (HAVE_FIPS_VERSION >= 2) - ret = (!input || !key) - ? BAD_FUNC_ARG - : wc_RsaPrivateKeyDecode(input, &tmpIdx32, key, (word32)inSz); + ret = wc_RsaPrivateKeyDecode(input, &tmpIdx32, key, (word32)inSz); #else - ret = (!input || !key) - ? BAD_FUNC_ARG - : RsaPrivateKeyDecode_fips(input, &tmpIdx32, key, (word32)inSz); + ret = RsaPrivateKeyDecode_fips(input, &tmpIdx32, key, (word32)inSz); #endif + } tmpIdx = (jlong)tmpIdx32; (*env)->SetLongArrayRegion(env, inOutIdx, 0, 1, &tmpIdx); LogStr("RsaPrivateKeyDecode_fips(input, inOutIdx, key=%p, inSz) = %d\n", key, ret); - LogStr("input[%u]: [%p]\n", (word32)inSz, input); - LogHex((byte*) input, 0, inSz); + if (ret >= 0) { + LogStr("input[%u]: [%p]\n", (word32)inSz, input); + LogHex((byte*) input, 0, inSz); + } releaseByteArray(env, input_object, input, 1); @@ -2513,8 +2763,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaPublicKeyDecode_1f } input = getDirectBufferAddress(env, input_object); - if (!input) + if (!fipsCheckDirectSz(env, input_object, inSz)) { return BAD_FUNC_ARG; + } (*env)->GetLongArrayRegion(env, inOutIdx, 0, 1, &tmpIdx); if ((*env)->ExceptionOccurred(env)) { @@ -2533,8 +2784,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaPublicKeyDecode_1f LogStr("RsaPublicKeyDecode_fips(input, inOutIdx, key=%p, inSz) = %d\n", key, ret); - LogStr("input[%u]: [%p]\n", (word32)inSz, input); - LogHex((byte*) input, 0, inSz); + if (ret >= 0) { + LogStr("input[%u]: [%p]\n", (word32)inSz, input); + LogHex((byte*) input, 0, inSz); + } #endif @@ -2568,23 +2821,26 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaPublicKeyDecode_1f } tmpIdx32 = (word32)tmpIdx; + if (!input || !fipsCheckArraySz(env, input_object, inSz)) { + ret = BAD_FUNC_ARG; + } + else { #if (HAVE_FIPS_VERSION >= 2) - ret = (!input) - ? BAD_FUNC_ARG - : wc_RsaPublicKeyDecode(input, &tmpIdx32, key, (word32)inSz); + ret = wc_RsaPublicKeyDecode(input, &tmpIdx32, key, (word32)inSz); #else - ret = (!input) - ? BAD_FUNC_ARG - : RsaPublicKeyDecode_fips(input, &tmpIdx32, key, (word32)inSz); + ret = RsaPublicKeyDecode_fips(input, &tmpIdx32, key, (word32)inSz); #endif + } tmpIdx = (jlong)tmpIdx32; (*env)->SetLongArrayRegion(env, inOutIdx, 0, 1, &tmpIdx); LogStr("RsaPublicKeyDecode_fips(input, inOutIdx, key=%p, inSz) = %d\n", key, ret); - LogStr("input[%u]: [%p]\n", (word32)inSz, input); - LogHex((byte*) input, 0, inSz); + if (ret >= 0) { + LogStr("input[%u]: [%p]\n", (word32)inSz, input); + LogHex((byte*) input, 0, inSz); + } releaseByteArray(env, input_object, input, 1); @@ -2639,8 +2895,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1ShaUpdate_1fips__Lcom } data = getDirectBufferAddress(env, data_buffer); - if (!data) + if (!fipsCheckDirectSz(env, data_buffer, len)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_ShaUpdate_fips(sha, data, (word32)len); @@ -2649,8 +2906,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1ShaUpdate_1fips__Lcom #endif LogStr("ShaUpdate_fips(sha=%p, data, len) = %d\n", sha, ret); - LogStr("data[%u]: [%p]\n", (word32)len, data); - LogHex(data, 0, len); + if (ret >= 0) { + LogStr("data[%u]: [%p]\n", (word32)len, data); + LogHex(data, 0, len); + } #endif @@ -2675,7 +2934,7 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1ShaUpdate_1fips__Lcom data = getByteArray(env, data_buffer); - if (data == NULL) { + if (data == NULL || !fipsCheckArraySz(env, data_buffer, len)) { ret = BAD_FUNC_ARG; } else { @@ -2687,8 +2946,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1ShaUpdate_1fips__Lcom } LogStr("ShaUpdate_fips(sha=%p, data, len) = %d\n", sha, ret); - LogStr("data[%u]: [%p]\n", (word32)len, data); - LogHex(data, 0, len); + if (ret >= 0) { + LogStr("data[%u]: [%p]\n", (word32)len, data); + LogHex(data, 0, len); + } releaseByteArray(env, data_buffer, data, 1); @@ -2713,8 +2974,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1ShaFinal_1fips__Lcom_ } hash = getDirectBufferAddress(env, hash_buffer); - if (!hash) + if (!fipsCheckDirectSz(env, hash_buffer, SHA_DIGEST_SIZE)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_ShaFinal_fips(sha, hash); @@ -2723,8 +2985,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1ShaFinal_1fips__Lcom_ #endif LogStr("ShaFinal_fips(sha=%p, hash) = %d\n", sha, ret); - LogStr("hash[%u]: [%p]\n", (word32)SHA_DIGEST_SIZE, hash); - LogHex(hash, 0, SHA_DIGEST_SIZE); + if (ret >= 0) { + LogStr("hash[%u]: [%p]\n", (word32)SHA_DIGEST_SIZE, hash); + LogHex(hash, 0, SHA_DIGEST_SIZE); + } #endif @@ -2748,7 +3012,7 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1ShaFinal_1fips__Lcom_ hash = getByteArray(env, hash_buffer); - if (hash == NULL) { + if (hash == NULL || !fipsCheckArraySz(env, hash_buffer, SHA_DIGEST_SIZE)) { ret = BAD_FUNC_ARG; } else { @@ -2760,8 +3024,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1ShaFinal_1fips__Lcom_ } LogStr("ShaFinal_fips(sha=%p, hash) = %d\n", sha, ret); - LogStr("hash[%u]: [%p]\n", (word32)SHA_DIGEST_SIZE, hash); - LogHex(hash, 0, SHA_DIGEST_SIZE); + if (ret >= 0) { + LogStr("hash[%u]: [%p]\n", (word32)SHA_DIGEST_SIZE, hash); + LogHex(hash, 0, SHA_DIGEST_SIZE); + } releaseByteArray(env, hash_buffer, hash, ret); @@ -2812,8 +3078,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha256Update_1fips__L } data = getDirectBufferAddress(env, data_buffer); - if (!data) + if (!fipsCheckDirectSz(env, data_buffer, len)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_Sha256Update_fips(sha, data, (word32)len); @@ -2822,8 +3089,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha256Update_1fips__L #endif LogStr("Sha256Update_fips(sha=%p, data, len) = %d\n", sha, ret); - LogStr("data[%u]: [%p]\n", (word32)len, data); - LogHex(data, 0, len); + if (ret >= 0) { + LogStr("data[%u]: [%p]\n", (word32)len, data); + LogHex(data, 0, len); + } #endif @@ -2848,7 +3117,7 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha256Update_1fips__L data = getByteArray(env, data_buffer); - if (data == NULL) { + if (data == NULL || !fipsCheckArraySz(env, data_buffer, len)) { ret = BAD_FUNC_ARG; } else { @@ -2860,8 +3129,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha256Update_1fips__L } LogStr("Sha256Update_fips(sha=%p, data, len) = %d\n", sha, ret); - LogStr("data[%u]: [%p]\n", (word32)len, data); - LogHex(data, 0, len); + if (ret >= 0) { + LogStr("data[%u]: [%p]\n", (word32)len, data); + LogHex(data, 0, len); + } releaseByteArray(env, data_buffer, data, 1); @@ -2886,8 +3157,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha256Final_1fips__Lc } hash = getDirectBufferAddress(env, hash_buffer); - if (!hash) + if (!fipsCheckDirectSz(env, hash_buffer, SHA256_DIGEST_SIZE)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_Sha256Final_fips(sha, hash); @@ -2896,8 +3168,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha256Final_1fips__Lc #endif LogStr("Sha256Final_fips(sha=%p, hash) = %d\n", sha, ret); - LogStr("hash[%u]: [%p]\n", (word32)SHA256_DIGEST_SIZE, hash); - LogHex(hash, 0, SHA256_DIGEST_SIZE); + if (ret >= 0) { + LogStr("hash[%u]: [%p]\n", (word32)SHA256_DIGEST_SIZE, hash); + LogHex(hash, 0, SHA256_DIGEST_SIZE); + } #endif @@ -2921,7 +3195,8 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha256Final_1fips__Lc hash = getByteArray(env, hash_buffer); - if (hash == NULL) { + if (hash == NULL || + !fipsCheckArraySz(env, hash_buffer, SHA256_DIGEST_SIZE)) { ret = BAD_FUNC_ARG; } else { @@ -2933,8 +3208,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha256Final_1fips__Lc } LogStr("Sha256Final_fips(sha=%p, hash) = %d\n", sha, ret); - LogStr("hash[%u]: [%p]\n", (word32)SHA256_DIGEST_SIZE, hash); - LogHex(hash, 0, SHA256_DIGEST_SIZE); + if (ret >= 0) { + LogStr("hash[%u]: [%p]\n", (word32)SHA256_DIGEST_SIZE, hash); + LogHex(hash, 0, SHA256_DIGEST_SIZE); + } releaseByteArray(env, hash_buffer, hash, ret); @@ -2950,7 +3227,7 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1InitSha384_1fips( { jint ret = NOT_COMPILED_IN; -#if defined(HAVE_FIPS) && defined(WOLFSSL_SHA512) +#if defined(HAVE_FIPS) && defined(WOLFSSL_SHA384) wc_Sha384* sha = (wc_Sha384*) getNativeStruct(env, sha_object); if ((!sha) || ((*env)->ExceptionOccurred(env))) { @@ -2974,7 +3251,7 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha384Update_1fips__L { jint ret = NOT_COMPILED_IN; -#if defined(HAVE_FIPS) && defined(WOLFSSL_SHA512) +#if defined(HAVE_FIPS) && defined(WOLFSSL_SHA384) wc_Sha384* sha = NULL; byte* data = NULL; @@ -2985,8 +3262,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha384Update_1fips__L } data = getDirectBufferAddress(env, data_buffer); - if (!data) + if (!fipsCheckDirectSz(env, data_buffer, len)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_Sha384Update_fips(sha, data, (word32)len); @@ -2995,8 +3273,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha384Update_1fips__L #endif LogStr("Sha384Update_fips(sha=%p, data, len) = %d\n", sha, ret); - LogStr("data[%u]: [%p]\n", (word32)len, data); - LogHex(data, 0, len); + if (ret >= 0) { + LogStr("data[%u]: [%p]\n", (word32)len, data); + LogHex(data, 0, len); + } #endif @@ -3009,7 +3289,7 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha384Update_1fips__L { jint ret = NOT_COMPILED_IN; -#if defined(HAVE_FIPS) && defined(WOLFSSL_SHA512) +#if defined(HAVE_FIPS) && defined(WOLFSSL_SHA384) wc_Sha384* sha = NULL; byte* data = NULL; @@ -3021,7 +3301,7 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha384Update_1fips__L data = getByteArray(env, data_buffer); - if (data == NULL) { + if (data == NULL || !fipsCheckArraySz(env, data_buffer, len)) { ret = BAD_FUNC_ARG; } else { @@ -3033,8 +3313,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha384Update_1fips__L } LogStr("Sha384Update_fips(sha=%p, data, len) = %d\n", sha, ret); - LogStr("data[%u]: [%p]\n", (word32)len, data); - LogHex(data, 0, len); + if (ret >= 0) { + LogStr("data[%u]: [%p]\n", (word32)len, data); + LogHex(data, 0, len); + } releaseByteArray(env, data_buffer, data, 1); @@ -3048,7 +3330,7 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha384Final_1fips__Lc { jint ret = NOT_COMPILED_IN; -#if defined(HAVE_FIPS) && defined(WOLFSSL_SHA512) +#if defined(HAVE_FIPS) && defined(WOLFSSL_SHA384) wc_Sha384* sha = NULL; byte* hash = NULL; @@ -3059,8 +3341,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha384Final_1fips__Lc } hash = getDirectBufferAddress(env, hash_buffer); - if (!hash) + if (!fipsCheckDirectSz(env, hash_buffer, SHA384_DIGEST_SIZE)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_Sha384Final_fips(sha, hash); @@ -3069,8 +3352,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha384Final_1fips__Lc #endif LogStr("Sha384Final_fips(sha=%p, hash) = %d\n", sha, ret); - LogStr("hash[%u]: [%p]\n", (word32)SHA384_DIGEST_SIZE, hash); - LogHex(hash, 0, SHA384_DIGEST_SIZE); + if (ret >= 0) { + LogStr("hash[%u]: [%p]\n", (word32)SHA384_DIGEST_SIZE, hash); + LogHex(hash, 0, SHA384_DIGEST_SIZE); + } #endif @@ -3082,7 +3367,7 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha384Final_1fips__Lc { jint ret = NOT_COMPILED_IN; -#if defined(HAVE_FIPS) && defined(WOLFSSL_SHA512) +#if defined(HAVE_FIPS) && defined(WOLFSSL_SHA384) wc_Sha384* sha = NULL; byte* hash = NULL; @@ -3094,7 +3379,8 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha384Final_1fips__Lc hash = getByteArray(env, hash_buffer); - if (hash == NULL) { + if (hash == NULL || + !fipsCheckArraySz(env, hash_buffer, SHA384_DIGEST_SIZE)) { ret = BAD_FUNC_ARG; } else { @@ -3106,8 +3392,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha384Final_1fips__Lc } LogStr("Sha384Final_fips(sha=%p, hash) = %d\n", sha, ret); - LogStr("hash[%u]: [%p]\n", (word32)SHA384_DIGEST_SIZE, hash); - LogHex(hash, 0, SHA384_DIGEST_SIZE); + if (ret >= 0) { + LogStr("hash[%u]: [%p]\n", (word32)SHA384_DIGEST_SIZE, hash); + LogHex(hash, 0, SHA384_DIGEST_SIZE); + } releaseByteArray(env, hash_buffer, hash, ret); @@ -3158,8 +3446,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha512Update_1fips__L } data = getDirectBufferAddress(env, data_buffer); - if (!data) + if (!fipsCheckDirectSz(env, data_buffer, len)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_Sha512Update_fips(sha, data, (word32)len); @@ -3168,8 +3457,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha512Update_1fips__L #endif LogStr("Sha512Update_fips(sha=%p, data, len) = %d\n", sha, ret); - LogStr("data[%u]: [%p]\n", (word32)len, data); - LogHex(data, 0, len); + if (ret >= 0) { + LogStr("data[%u]: [%p]\n", (word32)len, data); + LogHex(data, 0, len); + } #endif @@ -3194,7 +3485,7 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha512Update_1fips__L data = getByteArray(env, data_buffer); - if (data == NULL) { + if (data == NULL || !fipsCheckArraySz(env, data_buffer, len)) { ret = BAD_FUNC_ARG; } else { @@ -3206,8 +3497,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha512Update_1fips__L } LogStr("Sha512Update_fips(sha=%p, data, len) = %d\n", sha, ret); - LogStr("data[%u]: [%p]\n", (word32)len, data); - LogHex(data, 0, len); + if (ret >= 0) { + LogStr("data[%u]: [%p]\n", (word32)len, data); + LogHex(data, 0, len); + } releaseByteArray(env, data_buffer, data, 1); @@ -3232,8 +3525,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha512Final_1fips__Lc } hash = getDirectBufferAddress(env, hash_buffer); - if (!hash) + if (!fipsCheckDirectSz(env, hash_buffer, SHA512_DIGEST_SIZE)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_Sha512Final_fips(sha, hash); @@ -3242,8 +3536,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha512Final_1fips__Lc #endif LogStr("Sha512Final_fips(sha=%p, hash) = %d\n", sha, ret); - LogStr("hash[%u]: [%p]\n", (word32)SHA512_DIGEST_SIZE, hash); - LogHex(hash, 0, SHA512_DIGEST_SIZE); + if (ret >= 0) { + LogStr("hash[%u]: [%p]\n", (word32)SHA512_DIGEST_SIZE, hash); + LogHex(hash, 0, SHA512_DIGEST_SIZE); + } #endif @@ -3267,7 +3563,8 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha512Final_1fips__Lc hash = getByteArray(env, hash_buffer); - if (hash == NULL) { + if (hash == NULL || + !fipsCheckArraySz(env, hash_buffer, SHA512_DIGEST_SIZE)) { ret = BAD_FUNC_ARG; } else { @@ -3279,8 +3576,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Sha512Final_1fips__Lc } LogStr("Sha512Final_fips(sha=%p, hash) = %d\n", sha, ret); - LogStr("hash[%u]: [%p]\n", (word32)SHA512_DIGEST_SIZE, hash); - LogHex(hash, 0, SHA512_DIGEST_SIZE); + if (ret >= 0) { + LogStr("hash[%u]: [%p]\n", (word32)SHA512_DIGEST_SIZE, hash); + LogHex(hash, 0, SHA512_DIGEST_SIZE); + } releaseByteArray(env, hash_buffer, hash, ret); @@ -3351,24 +3650,28 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaPublicEncrypt_1fip * Providing an rng is optional. RNG_GenerateBlock will return BAD_FUNC_ARG * on a NULL rng if an RNG is needed by RsaPad. */ - if (!in || !out) + if (!fipsCheckDirectSz(env, in_object, inLen) || + !fipsCheckDirectSz(env, out_object, outLen)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_RsaPublicEncrypt_fips(in, (word32)inLen, out, (word32)outLen, - key, rng); + key, rng); #else ret = RsaPublicEncrypt_fips(in, (word32)inLen, out, (word32)outLen, - key, rng); + key, rng); #endif LogStr( "RsaPublicEncrypt_fips(in, inLen, out, outLen, key=%p, rng=%p) = %d\n", key, rng, ret); - LogStr("in[%u]: [%p]\n", (word32)inLen, in); - LogHex((byte*) in, 0, inLen); - LogStr("out[%u]: [%p]\n", (word32)outLen, out); - LogHex((byte*) out, 0, outLen); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)inLen, in); + LogHex((byte*) in, 0, inLen); + LogStr("out[%u]: [%p]\n", (word32)outLen, out); + LogHex((byte*) out, 0, outLen); + } #endif @@ -3405,7 +3708,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaPublicEncrypt_1fip * Providing an rng is optional. RNG_GenerateBlock will return BAD_FUNC_ARG * on a NULL rng if an RNG is needed by RsaPad. */ - if (in == NULL || out == NULL) { + if (in == NULL || out == NULL || + !fipsCheckArraySz(env, in_object, inLen) || + !fipsCheckArraySz(env, out_object, outLen)) { ret = BAD_FUNC_ARG; } else { @@ -3421,10 +3726,12 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaPublicEncrypt_1fip LogStr( "RsaPublicEncrypt_fips(in, inLen, out, outLen, key=%p, rng=%p) = %d\n", key, rng, ret); - LogStr("in[%u]: [%p]\n", (word32)inLen, in); - LogHex((byte*) in, 0, inLen); - LogStr("out[%u]: [%p]\n", (word32)outLen, out); - LogHex((byte*) out, 0, outLen); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)inLen, in); + LogHex((byte*) in, 0, inLen); + LogStr("out[%u]: [%p]\n", (word32)outLen, out); + LogHex((byte*) out, 0, outLen); + } releaseByteArray(env, in_object, in, 1); releaseByteArray(env, out_object, out, ret < 0); @@ -3454,8 +3761,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaPrivateDecrypt_1fi in = getDirectBufferAddress(env, in_object); out = getDirectBufferAddress(env, out_object); - if (!in || !out) + if (!fipsCheckDirectSz(env, in_object, inLen) || + !fipsCheckDirectSz(env, out_object, outLen)) { return BAD_FUNC_ARG; + } #if FIPS_VERSION_GT(5,0) ret = wc_RsaPrivateDecrypt_fips(in, (word32)inLen, out, @@ -3467,10 +3776,12 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaPrivateDecrypt_1fi LogStr("RsaPrivateDecrypt_fips(in, inLen, out, outLen, key=%p) = %d\n", key, ret); - LogStr("in[%u]: [%p]\n", (word32)inLen, in); - LogHex((byte*) in, 0, inLen); - LogStr("out[%u]: [%p]\n", (word32)outLen, out); - LogHex((byte*) out, 0, outLen); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)inLen, in); + LogHex((byte*) in, 0, inLen); + LogStr("out[%u]: [%p]\n", (word32)outLen, out); + LogHex((byte*) out, 0, outLen); + } #endif @@ -3497,7 +3808,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaPrivateDecrypt_1fi in = getByteArray(env, in_object); out = getByteArray(env, out_object); - if (in == NULL || out == NULL) { + if (in == NULL || out == NULL || + !fipsCheckArraySz(env, in_object, inLen) || + !fipsCheckArraySz(env, out_object, outLen)) { ret = BAD_FUNC_ARG; } else { @@ -3512,10 +3825,12 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1RsaPrivateDecrypt_1fi LogStr("RsaPrivateDecrypt_fips(in, inLen, out, outLen, key=%p) = %d\n", key, ret); - LogStr("in[%u]: [%p]\n", (word32)inLen, in); - LogHex((byte*) in, 0, inLen); - LogStr("out[%u]: [%p]\n", (word32)outLen, out); - LogHex((byte*) out, 0, outLen); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)inLen, in); + LogHex((byte*) in, 0, inLen); + LogStr("out[%u]: [%p]\n", (word32)outLen, out); + LogHex((byte*) out, 0, outLen); + } releaseByteArray(env, in_object, in, 1); releaseByteArray(env, out_object, out, ret < 0); @@ -3566,8 +3881,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Md5Update__Lcom_wolfs } data = getDirectBufferAddress(env, data_buffer); - if (!data) + if (!fipsCheckDirectSz(env, data_buffer, len)) { return BAD_FUNC_ARG; + } Md5Update(md5, data, (word32)len); ret = com_wolfssl_wolfcrypt_WolfCrypt_SUCCESS; @@ -3598,16 +3914,19 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Md5Update__Lcom_wolfs } data = getByteArray(env, data_buffer); - if (!data) + if (!data || !fipsCheckArraySz(env, data_buffer, len)) { ret = BAD_FUNC_ARG; + } else { Md5Update(md5, data, (word32)len); ret = com_wolfssl_wolfcrypt_WolfCrypt_SUCCESS; } LogStr("Md5Update_fips(md5=%p, data, len) = %d\n", md5, ret); - LogStr("data[%u]: [%p]\n", (word32)len, data); - LogHex(data, 0, len); + if (ret >= 0) { + LogStr("data[%u]: [%p]\n", (word32)len, data); + LogHex(data, 0, len); + } releaseByteArray(env, data_buffer, data, 1); @@ -3632,8 +3951,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Md5Final__Lcom_wolfss } hash = getDirectBufferAddress(env, hash_buffer); - if (!hash) + if (!fipsCheckDirectSz(env, hash_buffer, MD5_DIGEST_SIZE)) { return BAD_FUNC_ARG; + } Md5Final(md5, hash); ret = com_wolfssl_wolfcrypt_WolfCrypt_SUCCESS; @@ -3663,16 +3983,19 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1Md5Final__Lcom_wolfss } hash = getByteArray(env, hash_buffer); - if (!hash) + if (!hash || !fipsCheckArraySz(env, hash_buffer, MD5_DIGEST_SIZE)) { ret = BAD_FUNC_ARG; + } else { Md5Final(md5, hash); ret = com_wolfssl_wolfcrypt_WolfCrypt_SUCCESS; } LogStr("Md5Final_fips(md5=%p, hash) = %d\n", md5, ret); - LogStr("hash[%u]: [%p]\n", (word32)MD5_DIGEST_SIZE, hash); - LogHex(hash, 0, MD5_DIGEST_SIZE); + if (ret >= 0) { + LogStr("hash[%u]: [%p]\n", (word32)MD5_DIGEST_SIZE, hash); + LogHex(hash, 0, MD5_DIGEST_SIZE); + } releaseByteArray(env, hash_buffer, hash, ret); @@ -3757,6 +4080,11 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1DhGenerateKeyPair__Lc return BAD_FUNC_ARG; } + if (!fipsCheckDirectSz(env, priv_buffer, tmpPrivSz) || + !fipsCheckDirectSz(env, pub_buffer, tmpPubSz)) { + return BAD_FUNC_ARG; + } + tmpPrivSz32 = (word32)tmpPrivSz; tmpPubSz32 = (word32)tmpPubSz; @@ -3775,10 +4103,12 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1DhGenerateKeyPair__Lc LogStr("DhGenerateKeyPair(key=%p, rng=%p, priv, privSz, pub, pubSz) = %d\n", key, rng, ret); - LogStr("priv[%u]: [%p]\n", (word32)tmpPrivSz, priv); - LogHex(priv, 0, tmpPrivSz); - LogStr("pub[%u]: [%p]\n", (word32)tmpPubSz, pub); - LogHex(pub, 0, tmpPubSz); + if (ret >= 0) { + LogStr("priv[%u]: [%p]\n", (word32)tmpPrivSz, priv); + LogHex(priv, 0, tmpPrivSz); + LogStr("pub[%u]: [%p]\n", (word32)tmpPubSz, pub); + LogHex(pub, 0, tmpPubSz); + } #endif @@ -3827,9 +4157,15 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1DhGenerateKeyPair__Lc priv = getByteArray(env, priv_buffer); pub = getByteArray(env, pub_buffer); - ret = (!priv || !pub) - ? BAD_FUNC_ARG - : wc_DhGenerateKeyPair(key, rng, priv, &tmpPrivSz32, pub, &tmpPubSz32); + if (!priv || !pub || + !fipsCheckArraySz(env, priv_buffer, tmpPrivSz) || + !fipsCheckArraySz(env, pub_buffer, tmpPubSz)) { + ret = BAD_FUNC_ARG; + } + else { + ret = wc_DhGenerateKeyPair(key, rng, priv, &tmpPrivSz32, pub, + &tmpPubSz32); + } tmpPrivSz = (jlong)tmpPrivSz32; tmpPubSz = (jlong)tmpPubSz32; @@ -3845,10 +4181,12 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1DhGenerateKeyPair__Lc LogStr("DhGenerateKeyPair(key=%p, rng=%p, priv, privSz, pub, pubSz) = %d\n", key, rng, ret); - LogStr("priv[%u]: [%p]\n", (word32)tmpPrivSz, priv); - LogHex(priv, 0, tmpPrivSz); - LogStr("pub[%u]: [%p]\n", (word32)tmpPubSz, pub); - LogHex(pub, 0, tmpPubSz); + if (ret >= 0) { + LogStr("priv[%u]: [%p]\n", (word32)tmpPrivSz, priv); + LogHex(priv, 0, tmpPrivSz); + LogStr("pub[%u]: [%p]\n", (word32)tmpPubSz, pub); + LogHex(pub, 0, tmpPubSz); + } releaseByteArray(env, priv_buffer, priv, ret < 0); releaseByteArray(env, pub_buffer, pub, ret < 0); @@ -3883,13 +4221,18 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1DhAgree__Lcom_wolfssl priv = getDirectBufferAddress(env, priv_buffer); pub = getDirectBufferAddress(env, pub_buffer); - if (!agree || !priv || !pub) + if (!agree || !fipsCheckDirectSz(env, priv_buffer, privSz) || + !fipsCheckDirectSz(env, pub_buffer, pubSz)) { return BAD_FUNC_ARG; + } (*env)->GetLongArrayRegion(env, agreeSz, 0, 1, &tmpAgreeSz); if ((*env)->ExceptionOccurred(env)) { return BAD_FUNC_ARG; } + if (!fipsCheckDirectSz(env, agree_buffer, tmpAgreeSz)) { + return BAD_FUNC_ARG; + } tmpAgreeSz32 = (word32)tmpAgreeSz; ret = wc_DhAgree(key, agree, &tmpAgreeSz32, priv, (word32)privSz, @@ -3900,12 +4243,14 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1DhAgree__Lcom_wolfssl LogStr("DhAgree(key=%p, agree, agreeSz, priv, privSz, pub, pubSz) = %d\n", key, ret); - LogStr("agree[%u]: [%p]\n", (word32)tmpAgreeSz, agree); - LogHex(agree, 0, tmpAgreeSz); - LogStr("priv[%u]: [%p]\n", (word32)privSz, priv); - LogHex(priv, 0, privSz); - LogStr("pub[%u]: [%p]\n", (word32)pubSz, pub); - LogHex(pub, 0, pubSz); + if (ret >= 0) { + LogStr("agree[%u]: [%p]\n", (word32)tmpAgreeSz, agree); + LogHex(agree, 0, tmpAgreeSz); + LogStr("priv[%u]: [%p]\n", (word32)privSz, priv); + LogHex(priv, 0, privSz); + LogStr("pub[%u]: [%p]\n", (word32)pubSz, pub); + LogHex(pub, 0, pubSz); + } #endif @@ -3943,22 +4288,30 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1DhAgree__Lcom_wolfssl priv = getByteArray(env, priv_buffer); pub = getByteArray(env, pub_buffer); - ret = (!key || !agree || !priv || !pub) - ? BAD_FUNC_ARG - : wc_DhAgree(key, agree, &tmpAgreeSz32, priv, (word32)privSz, - pub, (word32)pubSz); + if (!key || !agree || !priv || !pub || + !fipsCheckArraySz(env, agree_buffer, tmpAgreeSz) || + !fipsCheckArraySz(env, priv_buffer, privSz) || + !fipsCheckArraySz(env, pub_buffer, pubSz)) { + ret = BAD_FUNC_ARG; + } + else { + ret = wc_DhAgree(key, agree, &tmpAgreeSz32, priv, (word32)privSz, + pub, (word32)pubSz); + } tmpAgreeSz = (jlong)tmpAgreeSz32; (*env)->SetLongArrayRegion(env, agreeSz, 0, 1, &tmpAgreeSz); LogStr("DhAgree(key=%p, agree, agreeSz, priv, privSz, pub, pubSz) = %d\n", key, ret); - LogStr("agree[%u]: [%p]\n", (word32)tmpAgreeSz, agree); - LogHex(agree, 0, tmpAgreeSz); - LogStr("priv[%u]: [%p]\n", (word32)privSz, priv); - LogHex(priv, 0, privSz); - LogStr("pub[%u]: [%p]\n", (word32)pubSz, pub); - LogHex(pub, 0, pubSz); + if (ret >= 0) { + LogStr("agree[%u]: [%p]\n", (word32)tmpAgreeSz, agree); + LogHex(agree, 0, tmpAgreeSz); + LogStr("priv[%u]: [%p]\n", (word32)privSz, priv); + LogHex(priv, 0, privSz); + LogStr("pub[%u]: [%p]\n", (word32)pubSz, pub); + LogHex(pub, 0, pubSz); + } releaseByteArray(env, agree_buffer, agree, ret < 0); releaseByteArray(env, priv_buffer, priv, 1); @@ -3988,8 +4341,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1DhKeyDecode__Ljava_ni } input = getDirectBufferAddress(env, input_buffer); - if (!input) + if (!fipsCheckDirectSz(env, input_buffer, inSz)) { return BAD_FUNC_ARG; + } (*env)->GetLongArrayRegion(env, inOutIdx, 0, 1, &tmpInOutIdx); if ((*env)->ExceptionOccurred(env)) { @@ -4003,8 +4357,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1DhKeyDecode__Ljava_ni (*env)->SetLongArrayRegion(env, inOutIdx, 0, 1, &tmpInOutIdx); LogStr("DhKeyDecode(input, &inOutIdx, key=%p, inSz) = %d\n", key, ret); - LogStr("input[%u]: [%p]\n", (word32)inSz, input); - LogHex(input, 0, inSz); + if (ret >= 0) { + LogStr("input[%u]: [%p]\n", (word32)inSz, input); + LogHex(input, 0, inSz); + } #endif @@ -4036,16 +4392,21 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1DhKeyDecode___3B_3JLc tmpInOutIdx32 = (word32)tmpInOutIdx; input = getByteArray(env, input_buffer); - ret = (!input) - ? BAD_FUNC_ARG - : wc_DhKeyDecode(input, &tmpInOutIdx32, key, (word32)inSz); + if (!input || !fipsCheckArraySz(env, input_buffer, inSz)) { + ret = BAD_FUNC_ARG; + } + else { + ret = wc_DhKeyDecode(input, &tmpInOutIdx32, key, (word32)inSz); + } tmpInOutIdx = (jlong)tmpInOutIdx32; (*env)->SetLongArrayRegion(env, inOutIdx, 0, 1, &tmpInOutIdx); LogStr("DhKeyDecode(input, &inOutIdx, key=%p, inSz) = %d\n", key, ret); - LogStr("input[%u]: [%p]\n", (word32)inSz, input); - LogHex(input, 0, inSz); + if (ret >= 0) { + LogStr("input[%u]: [%p]\n", (word32)inSz, input); + LogHex(input, 0, inSz); + } releaseByteArray(env, input_buffer, input, 1); @@ -4074,16 +4435,20 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1DhSetKey__Lcom_wolfss p = getDirectBufferAddress(env, p_buffer); g = getDirectBufferAddress(env, g_buffer); - if (!p || !g) + if (!fipsCheckDirectSz(env, p_buffer, pSz) || + !fipsCheckDirectSz(env, g_buffer, gSz)) { return BAD_FUNC_ARG; + } ret = wc_DhSetKey(key, p, (word32)pSz, g, (word32)gSz); LogStr("DhSetKey(key=%p, p, pSz, g, gSz) = %d\n", key, ret); - LogStr("p[%u]: [%p]\n", (word32)pSz, p); - LogHex(p, 0, pSz); - LogStr("g[%u]: [%p]\n", (word32)gSz, g); - LogHex(g, 0, gSz); + if (ret >= 0) { + LogStr("p[%u]: [%p]\n", (word32)pSz, p); + LogHex(p, 0, pSz); + LogStr("g[%u]: [%p]\n", (word32)gSz, g); + LogHex(g, 0, gSz); + } #endif @@ -4110,15 +4475,21 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1DhSetKey__Lcom_wolfss p = getByteArray(env, p_buffer); g = getByteArray(env, g_buffer); - ret = (!p || !g) - ? BAD_FUNC_ARG - : wc_DhSetKey(key, p, (word32)pSz, g, (word32)gSz); + if (!p || !g || !fipsCheckArraySz(env, p_buffer, pSz) || + !fipsCheckArraySz(env, g_buffer, gSz)) { + ret = BAD_FUNC_ARG; + } + else { + ret = wc_DhSetKey(key, p, (word32)pSz, g, (word32)gSz); + } LogStr("DhSetKey(key=%p, p, pSz, g, gSz) = %d\n", key, ret); - LogStr("p[%u]: [%p]\n", (word32)pSz, p); - LogHex(p, 0, pSz); - LogStr("g[%u]: [%p]\n", (word32)gSz, g); - LogHex(g, 0, gSz); + if (ret >= 0) { + LogStr("p[%u]: [%p]\n", (word32)pSz, p); + LogHex(p, 0, pSz); + LogStr("g[%u]: [%p]\n", (word32)gSz, g); + LogHex(g, 0, gSz); + } releaseByteArray(env, p_buffer, p, 1); releaseByteArray(env, g_buffer, g, 1); @@ -4143,8 +4514,9 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1DhParamsLoad__Ljava_n jlong tmpPInOutSz, tmpGInOutSz; word32 tmpPInOutSz32, tmpGInOutSz32; - if (!input || !p || !g) + if (!fipsCheckDirectSz(env, input_buffer, inSz) || !p || !g) { return BAD_FUNC_ARG; + } (*env)->GetLongArrayRegion(env, pInOutSz, 0, 1, &tmpPInOutSz); if ((*env)->ExceptionOccurred(env)) { @@ -4156,6 +4528,11 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1DhParamsLoad__Ljava_n return BAD_FUNC_ARG; } + if (!fipsCheckDirectSz(env, p_buffer, tmpPInOutSz) || + !fipsCheckDirectSz(env, g_buffer, tmpGInOutSz)) { + return BAD_FUNC_ARG; + } + tmpPInOutSz32 = (word32)tmpPInOutSz; tmpGInOutSz32 = (word32)tmpGInOutSz; @@ -4173,12 +4550,14 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1DhParamsLoad__Ljava_n (*env)->SetLongArrayRegion(env, gInOutSz, 0, 1, &tmpGInOutSz); LogStr("DhParamsLoad(input, inSz, p, &pInOutSz, g, &gInOutSz) = %d\n", ret); - LogStr("input[%u]: [%p]\n", (word32)inSz, input); - LogHex(input, 0, inSz); - LogStr("p[%u]: [%p]\n", (word32)tmpPInOutSz, p); - LogHex(p, 0, tmpPInOutSz); - LogStr("g[%u]: [%p]\n", (word32)tmpGInOutSz, g); - LogHex(g, 0, tmpGInOutSz); + if (ret >= 0) { + LogStr("input[%u]: [%p]\n", (word32)inSz, input); + LogHex(input, 0, inSz); + LogStr("p[%u]: [%p]\n", (word32)tmpPInOutSz, p); + LogHex(p, 0, tmpPInOutSz); + LogStr("g[%u]: [%p]\n", (word32)tmpGInOutSz, g); + LogHex(g, 0, tmpGInOutSz); + } #endif @@ -4217,10 +4596,15 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1DhParamsLoad___3BJ_3B p = getByteArray(env, p_buffer); g = getByteArray(env, g_buffer); - ret = (!input || !p || !g) - ? BAD_FUNC_ARG - : wc_DhParamsLoad(input, (word32)inSz, p, &tmpPInOutSz32, + if (!input || !p || !g || !fipsCheckArraySz(env, input_buffer, inSz) || + !fipsCheckArraySz(env, p_buffer, tmpPInOutSz) || + !fipsCheckArraySz(env, g_buffer, tmpGInOutSz)) { + ret = BAD_FUNC_ARG; + } + else { + ret = wc_DhParamsLoad(input, (word32)inSz, p, &tmpPInOutSz32, g, &tmpGInOutSz32); + } tmpPInOutSz = (jlong)tmpPInOutSz32; tmpGInOutSz = (jlong)tmpGInOutSz32; @@ -4236,12 +4620,14 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1DhParamsLoad___3BJ_3B (*env)->SetLongArrayRegion(env, gInOutSz, 0, 1, &tmpGInOutSz); LogStr("DhParamsLoad(input, inSz, p, &pInOutSz, g, &gInOutSz) = %d\n", ret); - LogStr("input[%u]: [%p]\n", (word32)inSz, input); - LogHex(input, 0, inSz); - LogStr("p[%u]: [%p]\n", (word32)tmpPInOutSz, p); - LogHex(p, 0, tmpPInOutSz); - LogStr("g[%u]: [%p]\n", (word32)tmpGInOutSz, g); - LogHex(g, 0, tmpGInOutSz); + if (ret >= 0) { + LogStr("input[%u]: [%p]\n", (word32)inSz, input); + LogHex(input, 0, inSz); + LogStr("p[%u]: [%p]\n", (word32)tmpPInOutSz, p); + LogHex(p, 0, tmpPInOutSz); + LogStr("g[%u]: [%p]\n", (word32)tmpGInOutSz, g); + LogHex(g, 0, tmpGInOutSz); + } releaseByteArray(env, input_buffer, input, 1); releaseByteArray(env, p_buffer, p, ret < 0); @@ -4354,6 +4740,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1ecc_1shared_1secret__ if ((*env)->ExceptionOccurred(env)) { return BAD_FUNC_ARG; } + if (!fipsCheckDirectSz(env, out_buffer, tmpOutLen)) { + return BAD_FUNC_ARG; + } + tmpOutLen32 = (word32)tmpOutLen; ret = wc_ecc_shared_secret(priv, pub, out, &tmpOutLen32); @@ -4363,8 +4753,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1ecc_1shared_1secret__ LogStr("ecc_shared_secret(priv=%p, pub=%p, out, outLen) = %d\n", priv, pub, ret); - LogStr("out[%u]: [%p]\n", (word32)tmpOutLen, out); - LogHex(out, 0, tmpOutLen); + if (ret >= 0) { + LogStr("out[%u]: [%p]\n", (word32)tmpOutLen, out); + LogHex(out, 0, tmpOutLen); + } #endif @@ -4407,6 +4799,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1ecc_1shared_1secret__ releaseByteArray(env, out_buffer, out, 1); return BAD_FUNC_ARG; } + if (!fipsCheckArraySz(env, out_buffer, tmpOutLen)) { + releaseByteArray(env, out_buffer, out, 1); + return BAD_FUNC_ARG; + } tmpOutLen32 = (word32)tmpOutLen; ret = wc_ecc_shared_secret(priv, pub, out, &tmpOutLen32); @@ -4414,8 +4810,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1ecc_1shared_1secret__ tmpOutLen = (jlong)tmpOutLen32; (*env)->SetLongArrayRegion(env, outlen, 0, 1, &tmpOutLen); - LogStr("out[%u]: [%p]\n", (word32)tmpOutLen, out); - LogHex(out, 0, tmpOutLen); + if (ret >= 0) { + LogStr("out[%u]: [%p]\n", (word32)tmpOutLen, out); + LogHex(out, 0, tmpOutLen); + } } releaseByteArray(env, out_buffer, out, ret); @@ -4442,14 +4840,17 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1ecc_1import_1x963__Lj } in = getDirectBufferAddress(env, in_buffer); - if (!in) + if (!fipsCheckDirectSz(env, in_buffer, inLen)) { return BAD_FUNC_ARG; + } ret = wc_ecc_import_x963(in, (word32)inLen, key); LogStr("wc_ecc_import_x963(in, inLen, key=%p) = %d\n", key, ret); - LogStr("in[%u]: [%p]\n", (word32)inLen, in); - LogHex(in, 0, inLen); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)inLen, in); + LogHex(in, 0, inLen); + } #endif @@ -4474,12 +4875,18 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1ecc_1import_1x963___3 in = getByteArray(env, in_buffer); - ret = (!in) ? BAD_FUNC_ARG - : wc_ecc_import_x963(in, (word32)inLen, key); + if (!in || !fipsCheckArraySz(env, in_buffer, inLen)) { + ret = BAD_FUNC_ARG; + } + else { + ret = wc_ecc_import_x963(in, (word32)inLen, key); + } LogStr("wc_ecc_import_x963(in, inLen, key=%p) = %d\n", key, ret); - LogStr("in[%u]: [%p]\n", (word32)inLen, in); - LogHex(in, 0, inLen); + if (ret >= 0) { + LogStr("in[%u]: [%p]\n", (word32)inLen, in); + LogHex(in, 0, inLen); + } releaseByteArray(env, in_buffer, in, 1); @@ -4514,6 +4921,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1ecc_1export_1x963__Lc if ((*env)->ExceptionOccurred(env)) { return BAD_FUNC_ARG; } + if (!fipsCheckDirectSz(env, out_buffer, tmpOutLen)) { + return BAD_FUNC_ARG; + } + tmpOutLen32 = (word32)tmpOutLen; ret = wc_ecc_export_x963(key, out, &tmpOutLen32); @@ -4522,8 +4933,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1ecc_1export_1x963__Lc (*env)->SetLongArrayRegion(env, outLen, 0, 1, &tmpOutLen); LogStr("wc_ecc_export_x963(key=%p, out, outLen) = %d\n", key, ret); - LogStr("out[%u]: [%p]\n", (word32)tmpOutLen, out); - LogHex(out, 0, tmpOutLen); + if (ret >= 0) { + LogStr("out[%u]: [%p]\n", (word32)tmpOutLen, out); + LogHex(out, 0, tmpOutLen); + } #endif @@ -4560,6 +4973,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1ecc_1export_1x963__Lc releaseByteArray(env, out_buffer, out, 1); return BAD_FUNC_ARG; } + if (!fipsCheckArraySz(env, out_buffer, tmpOutLen)) { + releaseByteArray(env, out_buffer, out, 1); + return BAD_FUNC_ARG; + } tmpOutLen32 = (word32)tmpOutLen; ret = wc_ecc_export_x963(key, out, &tmpOutLen32); @@ -4567,8 +4984,10 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1ecc_1export_1x963__Lc tmpOutLen = (jlong)tmpOutLen32; (*env)->SetLongArrayRegion(env, outLen, 0, 1, &tmpOutLen); - LogStr("out[%u]: [%p]\n", (word32)tmpOutLen, out); - LogHex(out, 0, tmpOutLen); + if (ret >= 0) { + LogStr("out[%u]: [%p]\n", (word32)tmpOutLen, out); + LogHex(out, 0, tmpOutLen); + } } diff --git a/src/main/java/com/wolfssl/wolfcrypt/Fips.java b/src/main/java/com/wolfssl/wolfcrypt/Fips.java index 13161de1..5864a071 100644 --- a/src/main/java/com/wolfssl/wolfcrypt/Fips.java +++ b/src/main/java/com/wolfssl/wolfcrypt/Fips.java @@ -26,6 +26,11 @@ import java.nio.ByteBuffer; /** * Thin JNI wrapper for the native WolfCrypt FIPS 140-2/3 specific APIs. * + * Every buffer argument must be backed by at least the number of bytes given + * by its size argument, or by the fixed size the operation requires (block + * size, digest size). Undersized buffers and negative sizes are rejected with + * BAD_FUNC_ARG before the native call. + * * ----------------------------------------------------------------------------- * THREADING / SYNCHRONIZATION NOTE: * ----------------------------------------------------------------------------- diff --git a/src/test/java/com/wolfssl/wolfcrypt/test/fips/AesFipsTest.java b/src/test/java/com/wolfssl/wolfcrypt/test/fips/AesFipsTest.java index d0f0167a..4a989c32 100644 --- a/src/test/java/com/wolfssl/wolfcrypt/test/fips/AesFipsTest.java +++ b/src/test/java/com/wolfssl/wolfcrypt/test/fips/AesFipsTest.java @@ -25,6 +25,7 @@ import static org.junit.Assert.*; import java.nio.ByteBuffer; +import org.junit.Assume; import org.junit.BeforeClass; import org.junit.Test; import org.junit.Rule; @@ -33,7 +34,9 @@ import org.junit.rules.TestWatcher; import org.junit.runner.Description; import com.wolfssl.wolfcrypt.Aes; +import com.wolfssl.wolfcrypt.FeatureDetect; import com.wolfssl.wolfcrypt.WolfCrypt; +import com.wolfssl.wolfcrypt.WolfCryptError; import com.wolfssl.wolfcrypt.Fips; import com.wolfssl.wolfcrypt.test.Util; @@ -49,6 +52,8 @@ public class AesFipsTest extends FipsTest { private ByteBuffer aad = ByteBuffer.allocateDirect(Aes.BLOCK_SIZE); private ByteBuffer tag = ByteBuffer.allocateDirect(Aes.BLOCK_SIZE); private ByteBuffer expected = ByteBuffer.allocateDirect(Aes.BLOCK_SIZE); + private static final int BAD_FUNC_ARG = + WolfCryptError.BAD_FUNC_ARG.getCode(); @Rule(order = Integer.MIN_VALUE) public TestRule testWatcher = TimedTestWatcher.create(); @@ -58,6 +63,11 @@ public class AesFipsTest extends FipsTest { System.out.println("JNI FIPS AES Tests"); } + private static void assumeAesGcm() { + Assume.assumeTrue("AES-GCM not compiled in", + FeatureDetect.AesGcmEnabled()); + } + @Test public void setKeyShouldReturnZeroUsingByteBuffer() { key.put(Util.h2b("00112233445566778899aabbccddeeff")).rewind(); @@ -104,6 +114,69 @@ public class AesFipsTest extends FipsTest { Util.h2b("00112233445566778899aabbccddeeff"))); } + @Test + public void setKeyShouldRejectUndersizedKeyUsingByteArray() { + /* keylen claims 16 bytes but the array is only 1 byte */ + assertEquals(BAD_FUNC_ARG, Fips.AesSetKey_fips(new Aes(), + new byte[1], Aes.KEY_SIZE_128, new byte[Aes.BLOCK_SIZE], + Aes.ENCRYPT_MODE)); + } + + @Test + public void setKeyShouldRejectUndersizedKeyUsingByteBuffer() { + ByteBuffer smallKey = ByteBuffer.allocateDirect(1); + assertEquals(BAD_FUNC_ARG, Fips.AesSetKey_fips(new Aes(), smallKey, + Aes.KEY_SIZE_128, iv, Aes.ENCRYPT_MODE)); + } + + @Test + public void cbcEncryptShouldRejectUndersizedBuffersUsingByteArray() { + /* size claims a full block but out/in are only 1 byte each */ + assertEquals(BAD_FUNC_ARG, Fips.AesCbcEncrypt_fips(new Aes(), + new byte[1], new byte[1], Aes.BLOCK_SIZE)); + } + + @Test + public void cbcEncryptShouldRejectNegativeSizeUsingByteArray() { + assertEquals(BAD_FUNC_ARG, Fips.AesCbcEncrypt_fips(new Aes(), + new byte[Aes.BLOCK_SIZE], new byte[Aes.BLOCK_SIZE], -1)); + } + + @Test + public void cbcEncryptShouldRejectUndersizedBuffersUsingByteBuffer() { + ByteBuffer smallOut = ByteBuffer.allocateDirect(1); + ByteBuffer smallIn = ByteBuffer.allocateDirect(1); + assertEquals(BAD_FUNC_ARG, Fips.AesCbcEncrypt_fips(new Aes(), + smallOut, smallIn, Aes.BLOCK_SIZE)); + } + + @Test + public void gcmEncryptShouldRejectUndersizedAuthInUsingByteArray() { + assumeAesGcm(); + /* authInSz claims a full block but authIn is only 1 byte */ + assertEquals(BAD_FUNC_ARG, Fips.AesGcmEncrypt_fips(new Aes(), + new byte[Aes.BLOCK_SIZE], new byte[Aes.BLOCK_SIZE], + Aes.BLOCK_SIZE, new byte[12], 12, new byte[Aes.BLOCK_SIZE], + Aes.BLOCK_SIZE, new byte[1], Aes.BLOCK_SIZE)); + } + + @Test + public void gcmEncryptShouldRejectNullAuthTagWithSizeUsingByteBuffer() { + assumeAesGcm(); + assertEquals(BAD_FUNC_ARG, Fips.AesGcmEncrypt_fips(new Aes(), + output, input, Aes.BLOCK_SIZE, iv, 12, null, Aes.BLOCK_SIZE, + aad, Aes.BLOCK_SIZE)); + } + + @Test + public void gcmDecryptShouldRejectUndersizedBuffersUsingByteArray() { + assumeAesGcm(); + /* size claims a full block but out/in are only 1 byte each */ + assertEquals(BAD_FUNC_ARG, Fips.AesGcmDecrypt_fips(new Aes(), + new byte[1], new byte[1], Aes.BLOCK_SIZE, new byte[12], 12, + new byte[Aes.BLOCK_SIZE], Aes.BLOCK_SIZE, null, 0)); + } + @Test public void cbcEncryptDecryptShouldMatchUsingByteByffer() { String[] keys = new String[] { @@ -368,6 +441,7 @@ public class AesFipsTest extends FipsTest { @Test public void gcmEncrypShouldMatchUsingByteByffer() { + assumeAesGcm(); String[] keys = new String[] { "96f309d0f15ba970e114a9216e75a14f89e28948ce7d98bd37f0beefe36803b0", "3872431f89eba694cbc9b12d10d11b707a4248e7ff90a4bbcd271df7ff33c3a8", @@ -506,6 +580,7 @@ public class AesFipsTest extends FipsTest { @Test public void gcmEncrypShouldMatchUsingByteArray() { + assumeAesGcm(); String[] keys = new String[] { "96f309d0f15ba970e114a9216e75a14f89e28948ce7d98bd37f0beefe36803b0", "3872431f89eba694cbc9b12d10d11b707a4248e7ff90a4bbcd271df7ff33c3a8", diff --git a/src/test/java/com/wolfssl/wolfcrypt/test/fips/Des3FipsTest.java b/src/test/java/com/wolfssl/wolfcrypt/test/fips/Des3FipsTest.java index 52fd0824..40940596 100644 --- a/src/test/java/com/wolfssl/wolfcrypt/test/fips/Des3FipsTest.java +++ b/src/test/java/com/wolfssl/wolfcrypt/test/fips/Des3FipsTest.java @@ -192,4 +192,29 @@ public class Des3FipsTest extends FipsTest { assertArrayEquals(plain, vector); } } + + @Test + public void setKeyShouldRejectUndersizedKeyUsingByteArray() { + /* key must be Des3.KEY_SIZE bytes but the array is only 1 byte */ + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.Des3_SetKey_fips(new Des3(), new byte[1], null, + Des3.ENCRYPT_MODE)); + } + + @Test + public void cbcDecryptShouldRejectUndersizedBuffersUsingByteArray() { + /* size claims a full block but out/in are only 1 byte each */ + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.Des3_CbcDecrypt_fips(new Des3(), new byte[1], new byte[1], + Des3.BLOCK_SIZE)); + } + + @Test + public void setKeyShouldRejectUndersizedKeyUsingByteBuffer() { + ByteBuffer smallKey = ByteBuffer.allocateDirect(1); + + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.Des3_SetKey_fips(new Des3(), smallKey, null, + Des3.ENCRYPT_MODE)); + } } diff --git a/src/test/java/com/wolfssl/wolfcrypt/test/fips/DhFipsTest.java b/src/test/java/com/wolfssl/wolfcrypt/test/fips/DhFipsTest.java index 9916e735..4cdee9c8 100644 --- a/src/test/java/com/wolfssl/wolfcrypt/test/fips/DhFipsTest.java +++ b/src/test/java/com/wolfssl/wolfcrypt/test/fips/DhFipsTest.java @@ -38,6 +38,7 @@ import com.wolfssl.wolfcrypt.Dh; import com.wolfssl.wolfcrypt.FeatureDetect; import com.wolfssl.wolfcrypt.Rng; import com.wolfssl.wolfcrypt.WolfCrypt; +import com.wolfssl.wolfcrypt.WolfCryptError; import com.wolfssl.wolfcrypt.Fips; import com.wolfssl.wolfcrypt.test.Util; @@ -286,4 +287,83 @@ public class DhFipsTest extends FipsTest { Fips.FreeDhKey(key); } + + @Test + public void agreeShouldRejectUndersizedPrivUsingByteArray() { + Dh key = new Dh(); + long[] agreeSz = { 256 }; + + Fips.InitDhKey(key); + + /* privSz claims 256 bytes but the array is only 1 byte */ + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.DhAgree(key, new byte[256], agreeSz, new byte[1], 256, + new byte[256], 256)); + + Fips.FreeDhKey(key); + } + + @Test + public void generateKeyPairShouldRejectOversizedPrivSzUsingByteArray() { + Dh key = new Dh(); + Rng rng = new Rng(); + /* privSz claims 257 bytes but priv is only 256 bytes */ + long[] privSz = { 257 }; + long[] pubSz = { 256 }; + + Fips.InitDhKey(key); + assertEquals(WolfCrypt.SUCCESS, Fips.InitRng_fips(rng)); + + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.DhGenerateKeyPair(key, rng, new byte[256], privSz, + new byte[256], pubSz)); + + Fips.FreeDhKey(key); + Fips.FreeRng_fips(rng); + } + + @Test + public void agreeShouldRejectOversizedAgreeSzUsingByteArray() { + Dh key = new Dh(); + /* agreeSz claims 257 bytes but agree is only 256 bytes */ + long[] agreeSz = { 257 }; + + Fips.InitDhKey(key); + + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.DhAgree(key, new byte[256], agreeSz, new byte[256], 256, + new byte[256], 256)); + + Fips.FreeDhKey(key); + } + + @Test + public void agreeShouldRejectOversizedAgreeSzUsingByteBuffer() { + Dh key = new Dh(); + ByteBuffer agree = ByteBuffer.allocateDirect(256); + ByteBuffer priv = ByteBuffer.allocateDirect(256); + ByteBuffer pub = ByteBuffer.allocateDirect(256); + /* agreeSz claims 257 bytes but agree is only 256 bytes */ + long[] agreeSz = { 257 }; + + Fips.InitDhKey(key); + + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.DhAgree(key, agree, agreeSz, priv, 256, pub, 256)); + + Fips.FreeDhKey(key); + } + + @Test + public void paramsLoadShouldRejectOversizedPSzUsingByteBuffer() { + ByteBuffer input = ByteBuffer.allocateDirect(16); + ByteBuffer p = ByteBuffer.allocateDirect(16); + ByteBuffer g = ByteBuffer.allocateDirect(16); + /* pInOutSz claims 17 bytes but p is only 16 bytes */ + long[] pSz = { 17 }; + long[] gSz = { 16 }; + + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.DhParamsLoad(input, 16, p, pSz, g, gSz)); + } } diff --git a/src/test/java/com/wolfssl/wolfcrypt/test/fips/EccFipsTest.java b/src/test/java/com/wolfssl/wolfcrypt/test/fips/EccFipsTest.java index d4912977..d4adfbd3 100644 --- a/src/test/java/com/wolfssl/wolfcrypt/test/fips/EccFipsTest.java +++ b/src/test/java/com/wolfssl/wolfcrypt/test/fips/EccFipsTest.java @@ -263,4 +263,81 @@ public class EccFipsTest extends FipsTest { Fips.ecc_free(alice); Fips.FreeRng_fips(rng); } + + @Test + public void importX963ShouldRejectUndersizedInputUsingByteArray() { + Ecc key = new Ecc(); + + assertEquals(WolfCrypt.SUCCESS, Fips.ecc_init(key)); + + /* inLen claims 65 bytes but the array is only 1 byte */ + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.ecc_import_x963(new byte[1], 65, key)); + + Fips.ecc_free(key); + } + + @Test + public void sharedSecretShouldRejectOversizedOutLenUsingByteArray() { + Ecc alice = new Ecc(); + Ecc bob = new Ecc(); + /* outLen claims 65 bytes but out is only 64 bytes */ + long[] outLen = { 65 }; + + assertEquals(WolfCrypt.SUCCESS, Fips.ecc_init(alice)); + assertEquals(WolfCrypt.SUCCESS, Fips.ecc_init(bob)); + + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.ecc_shared_secret(alice, bob, new byte[64], outLen)); + + Fips.ecc_free(alice); + Fips.ecc_free(bob); + } + + @Test + public void exportX963ShouldRejectOversizedOutLenUsingByteArray() { + Ecc key = new Ecc(); + /* outLen claims 65 bytes but out is only 64 bytes */ + long[] outLen = { 65 }; + + assertEquals(WolfCrypt.SUCCESS, Fips.ecc_init(key)); + + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.ecc_export_x963(key, new byte[64], outLen)); + + Fips.ecc_free(key); + } + + @Test + public void sharedSecretShouldRejectOversizedOutLenUsingByteBuffer() { + Ecc alice = new Ecc(); + Ecc bob = new Ecc(); + ByteBuffer out = ByteBuffer.allocateDirect(64); + /* outLen claims 65 bytes but out is only 64 bytes */ + long[] outLen = { 65 }; + + assertEquals(WolfCrypt.SUCCESS, Fips.ecc_init(alice)); + assertEquals(WolfCrypt.SUCCESS, Fips.ecc_init(bob)); + + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.ecc_shared_secret(alice, bob, out, outLen)); + + Fips.ecc_free(alice); + Fips.ecc_free(bob); + } + + @Test + public void exportX963ShouldRejectOversizedOutLenUsingByteBuffer() { + Ecc key = new Ecc(); + ByteBuffer out = ByteBuffer.allocateDirect(64); + /* outLen claims 65 bytes but out is only 64 bytes */ + long[] outLen = { 65 }; + + assertEquals(WolfCrypt.SUCCESS, Fips.ecc_init(key)); + + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.ecc_export_x963(key, out, outLen)); + + Fips.ecc_free(key); + } } diff --git a/src/test/java/com/wolfssl/wolfcrypt/test/fips/HmacFipsTest.java b/src/test/java/com/wolfssl/wolfcrypt/test/fips/HmacFipsTest.java index a74dcb99..31600926 100644 --- a/src/test/java/com/wolfssl/wolfcrypt/test/fips/HmacFipsTest.java +++ b/src/test/java/com/wolfssl/wolfcrypt/test/fips/HmacFipsTest.java @@ -38,6 +38,7 @@ import com.wolfssl.wolfcrypt.Sha256; import com.wolfssl.wolfcrypt.Sha384; import com.wolfssl.wolfcrypt.Sha512; import com.wolfssl.wolfcrypt.WolfCrypt; +import com.wolfssl.wolfcrypt.WolfCryptError; import com.wolfssl.wolfcrypt.Fips; import com.wolfssl.wolfcrypt.test.Util; @@ -372,4 +373,30 @@ public class HmacFipsTest extends FipsTest { assertArrayEquals(expected, result); } } + + @Test + public void updateShouldRejectUndersizedDataUsingByteArray() { + /* len claims 16 bytes but the array is only 1 byte */ + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.HmacUpdate_fips(new Hmac(), new byte[1], 16)); + } + + @Test + public void finalShouldRejectUndersizedHashUsingByteArray() { + Hmac hmac = new Hmac(); + + assertEquals(WolfCrypt.SUCCESS, Fips.HmacSetKey_fips(hmac, + Hmac.SHA256, new byte[32], 32)); + /* hash must hold a SHA-256 digest but the array is only 1 byte */ + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.HmacFinal_fips(hmac, new byte[1])); + } + + @Test + public void updateShouldRejectUndersizedDataUsingByteBuffer() { + ByteBuffer smallData = ByteBuffer.allocateDirect(1); + + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.HmacUpdate_fips(new Hmac(), smallData, 16)); + } } diff --git a/src/test/java/com/wolfssl/wolfcrypt/test/fips/RngFipsTest.java b/src/test/java/com/wolfssl/wolfcrypt/test/fips/RngFipsTest.java index 528fa4b2..308ff1a9 100644 --- a/src/test/java/com/wolfssl/wolfcrypt/test/fips/RngFipsTest.java +++ b/src/test/java/com/wolfssl/wolfcrypt/test/fips/RngFipsTest.java @@ -34,6 +34,7 @@ import org.junit.runner.Description; import com.wolfssl.wolfcrypt.Rng; import com.wolfssl.wolfcrypt.WolfCrypt; +import com.wolfssl.wolfcrypt.WolfCryptError; import com.wolfssl.wolfcrypt.Fips; import com.wolfssl.wolfcrypt.test.Util; @@ -123,4 +124,55 @@ public class RngFipsTest extends FipsTest { inputB[i].length() / 2, expected, result[i].length() / 2)); } } + + @Test + public void healthTestShouldRejectUndersizedOutputUsingByteArray() { + /* outputSz claims 256 bytes but the array is only 1 byte */ + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.RNG_HealthTest_fips(0, new byte[48], 48, null, 0, + new byte[1], 256)); + } + + @Test + public void healthTestShouldRejectUndersizedEntropyBUsingByteArray() { + /* with reseed set, entropyB must hold entropyBSz bytes */ + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.RNG_HealthTest_fips(1, new byte[48], 48, new byte[1], 32, + new byte[256], 256)); + } + + @Test + public void healthTestShouldRejectUndersizedOutputUsingByteBuffer() { + ByteBuffer entropyA = ByteBuffer.allocateDirect(48); + ByteBuffer output = ByteBuffer.allocateDirect(1); + + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.RNG_HealthTest_fips(0, entropyA, 48, null, 0, output, 256)); + } + + @Test + public void generateBlockShouldRejectUndersizedBufferUsingByteArray() { + Rng rng = new Rng(); + + assertEquals(WolfCrypt.SUCCESS, Fips.InitRng_fips(rng)); + + /* bufSz claims 256 bytes but the array is only 1 byte */ + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.RNG_GenerateBlock_fips(rng, new byte[1], 256)); + + Fips.FreeRng_fips(rng); + } + + @Test + public void generateBlockShouldRejectNegativeSizeUsingByteBuffer() { + Rng rng = new Rng(); + ByteBuffer buf = ByteBuffer.allocateDirect(32); + + assertEquals(WolfCrypt.SUCCESS, Fips.InitRng_fips(rng)); + + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.RNG_GenerateBlock_fips(rng, buf, -1)); + + Fips.FreeRng_fips(rng); + } } diff --git a/src/test/java/com/wolfssl/wolfcrypt/test/fips/RsaFipsTest.java b/src/test/java/com/wolfssl/wolfcrypt/test/fips/RsaFipsTest.java index 5461e459..1aa5e2f0 100644 --- a/src/test/java/com/wolfssl/wolfcrypt/test/fips/RsaFipsTest.java +++ b/src/test/java/com/wolfssl/wolfcrypt/test/fips/RsaFipsTest.java @@ -37,6 +37,7 @@ import com.wolfssl.wolfcrypt.Rsa; import com.wolfssl.wolfcrypt.Rng; import com.wolfssl.wolfcrypt.Sha256; import com.wolfssl.wolfcrypt.WolfCrypt; +import com.wolfssl.wolfcrypt.WolfCryptError; import com.wolfssl.wolfcrypt.Fips; import com.wolfssl.wolfcrypt.test.Util; @@ -648,4 +649,37 @@ public class RsaFipsTest extends FipsTest { Fips.FreeRsaKey_fips(rsa); Fips.FreeRng_fips(rng); } + + @Test + public void sslSignShouldRejectNegativeOutLenUsingByteArray() { + Rsa rsa = new Rsa(); + Rng rng = new Rng(); + + assertEquals(WolfCrypt.SUCCESS, Fips.InitRsaKey_fips(rsa, null)); + assertEquals(WolfCrypt.SUCCESS, Fips.InitRng_fips(rng)); + + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.RsaSSL_Sign_fips(new byte[32], 32, new byte[256], -1, + rsa, rng)); + + Fips.FreeRsaKey_fips(rsa); + Fips.FreeRng_fips(rng); + } + + @Test + public void sslSignShouldRejectNegativeOutLenUsingByteBuffer() { + Rsa rsa = new Rsa(); + Rng rng = new Rng(); + ByteBuffer in = ByteBuffer.allocateDirect(32); + ByteBuffer out = ByteBuffer.allocateDirect(256); + + assertEquals(WolfCrypt.SUCCESS, Fips.InitRsaKey_fips(rsa, null)); + assertEquals(WolfCrypt.SUCCESS, Fips.InitRng_fips(rng)); + + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.RsaSSL_Sign_fips(in, 32, out, -1, rsa, rng)); + + Fips.FreeRsaKey_fips(rsa); + Fips.FreeRng_fips(rng); + } } diff --git a/src/test/java/com/wolfssl/wolfcrypt/test/fips/Sha256FipsTest.java b/src/test/java/com/wolfssl/wolfcrypt/test/fips/Sha256FipsTest.java index 7318a473..c7aa3fd8 100644 --- a/src/test/java/com/wolfssl/wolfcrypt/test/fips/Sha256FipsTest.java +++ b/src/test/java/com/wolfssl/wolfcrypt/test/fips/Sha256FipsTest.java @@ -34,6 +34,7 @@ import org.junit.runner.Description; import com.wolfssl.wolfcrypt.Sha256; import com.wolfssl.wolfcrypt.WolfCrypt; +import com.wolfssl.wolfcrypt.WolfCryptError; import com.wolfssl.wolfcrypt.Fips; import com.wolfssl.wolfcrypt.test.Util; @@ -117,4 +118,11 @@ public class Sha256FipsTest extends FipsTest { assertArrayEquals(expected, result); } } + + @Test + public void finalShouldRejectUndersizedHashUsingByteArray() { + /* hash must hold the digest but the array is only 1 byte */ + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.Sha256Final_fips(new Sha256(), new byte[1])); + } } diff --git a/src/test/java/com/wolfssl/wolfcrypt/test/fips/Sha384FipsTest.java b/src/test/java/com/wolfssl/wolfcrypt/test/fips/Sha384FipsTest.java index 0588ed17..a651713f 100644 --- a/src/test/java/com/wolfssl/wolfcrypt/test/fips/Sha384FipsTest.java +++ b/src/test/java/com/wolfssl/wolfcrypt/test/fips/Sha384FipsTest.java @@ -25,15 +25,19 @@ import static org.junit.Assert.*; import java.nio.ByteBuffer; +import org.junit.Assume; import org.junit.BeforeClass; import org.junit.Test; import org.junit.Rule; import org.junit.rules.TestRule; import org.junit.rules.TestWatcher; import org.junit.runner.Description; +import org.junit.runners.model.Statement; +import com.wolfssl.wolfcrypt.FeatureDetect; import com.wolfssl.wolfcrypt.Sha384; import com.wolfssl.wolfcrypt.WolfCrypt; +import com.wolfssl.wolfcrypt.WolfCryptError; import com.wolfssl.wolfcrypt.Fips; import com.wolfssl.wolfcrypt.test.Util; @@ -47,6 +51,22 @@ public class Sha384FipsTest extends FipsTest { @Rule(order = Integer.MIN_VALUE) public TestRule testWatcher = TimedTestWatcher.create(); + /* Rule to skip tests when native wolfSSL is built without SHA-384 */ + @Rule(order = Integer.MIN_VALUE + 3) + public TestRule sha384Available = new TestRule() { + @Override + public Statement apply(final Statement base, Description description) { + return new Statement() { + @Override + public void evaluate() throws Throwable { + Assume.assumeTrue("SHA-384 not compiled in native wolfSSL", + FeatureDetect.Sha384Enabled()); + base.evaluate(); + } + }; + } + }; + @BeforeClass public static void setupClass() { System.out.println("JNI FIPS SHA2-384 Tests"); @@ -127,4 +147,11 @@ public class Sha384FipsTest extends FipsTest { assertArrayEquals(expected, result); } } + + @Test + public void finalShouldRejectUndersizedHashUsingByteArray() { + /* hash must hold the digest but the array is only 1 byte */ + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.Sha384Final_fips(new Sha384(), new byte[1])); + } } diff --git a/src/test/java/com/wolfssl/wolfcrypt/test/fips/Sha512FipsTest.java b/src/test/java/com/wolfssl/wolfcrypt/test/fips/Sha512FipsTest.java index fcbf8f83..22975567 100644 --- a/src/test/java/com/wolfssl/wolfcrypt/test/fips/Sha512FipsTest.java +++ b/src/test/java/com/wolfssl/wolfcrypt/test/fips/Sha512FipsTest.java @@ -34,6 +34,7 @@ import org.junit.runner.Description; import com.wolfssl.wolfcrypt.Sha512; import com.wolfssl.wolfcrypt.WolfCrypt; +import com.wolfssl.wolfcrypt.WolfCryptError; import com.wolfssl.wolfcrypt.Fips; import com.wolfssl.wolfcrypt.test.Util; @@ -127,4 +128,11 @@ public class Sha512FipsTest extends FipsTest { assertArrayEquals(expected, result); } } + + @Test + public void finalShouldRejectUndersizedHashUsingByteArray() { + /* hash must hold the digest but the array is only 1 byte */ + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.Sha512Final_fips(new Sha512(), new byte[1])); + } } diff --git a/src/test/java/com/wolfssl/wolfcrypt/test/fips/ShaFipsTest.java b/src/test/java/com/wolfssl/wolfcrypt/test/fips/ShaFipsTest.java index 2c9d080c..aa84fa5c 100644 --- a/src/test/java/com/wolfssl/wolfcrypt/test/fips/ShaFipsTest.java +++ b/src/test/java/com/wolfssl/wolfcrypt/test/fips/ShaFipsTest.java @@ -34,6 +34,7 @@ import org.junit.runner.Description; import com.wolfssl.wolfcrypt.Sha; import com.wolfssl.wolfcrypt.WolfCrypt; +import com.wolfssl.wolfcrypt.WolfCryptError; import com.wolfssl.wolfcrypt.Fips; import com.wolfssl.wolfcrypt.test.Util; @@ -117,4 +118,25 @@ public class ShaFipsTest extends FipsTest { assertArrayEquals(expected, result); } } + + @Test + public void updateShouldRejectNegativeLenUsingByteArray() { + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.ShaUpdate_fips(new Sha(), new byte[Sha.DIGEST_SIZE], -1)); + } + + @Test + public void finalShouldRejectUndersizedHashUsingByteArray() { + /* hash must hold Sha.DIGEST_SIZE bytes but the array is only 1 byte */ + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.ShaFinal_fips(new Sha(), new byte[1])); + } + + @Test + public void finalShouldRejectUndersizedHashUsingByteBuffer() { + ByteBuffer smallHash = ByteBuffer.allocateDirect(1); + + assertEquals(WolfCryptError.BAD_FUNC_ARG.getCode(), + Fips.ShaFinal_fips(new Sha(), smallHash)); + } }