From a034cf797ba4a7a9cd3b0e1cab6fb0bab038378b Mon Sep 17 00:00:00 2001 From: Ruby Martin Date: Mon, 27 Apr 2026 14:28:18 -0600 Subject: [PATCH] JNI: utilize outputOffset when writing data to output buffer --- jni/jni_aes.c | 12 +++++++----- jni/jni_aesctr.c | 5 +++-- jni/jni_aesecb.c | 12 +++++++----- jni/jni_aesofb.c | 15 +++++++++------ jni/jni_des3.c | 12 +++++++----- 5 files changed, 33 insertions(+), 23 deletions(-) diff --git a/jni/jni_aes.c b/jni/jni_aes.c index 149cabeb..6eef74a2 100644 --- a/jni/jni_aes.c +++ b/jni/jni_aes.c @@ -193,7 +193,7 @@ Java_com_wolfssl_wolfcrypt_Aes_native_1update_1internal__ILjava_nio_ByteBuffer_2 if (!aes || !input || !output) { ret = BAD_FUNC_ARG; /* NULL sanitizers */ } - else if (offset < 0 || length < 0) { + else if (offset < 0 || length < 0 || outputOffset < 0) { ret = BAD_FUNC_ARG; /* signed sanizizers */ } else if (((jlong)offset + (jlong)length) > @@ -205,11 +205,13 @@ Java_com_wolfssl_wolfcrypt_Aes_native_1update_1internal__ILjava_nio_ByteBuffer_2 ret = BUFFER_E; /* buffer overflow check */ } else if (opmode == AES_ENCRYPTION) { - ret = wc_AesCbcEncrypt(aes, output, input + offset, length); + ret = wc_AesCbcEncrypt(aes, output + outputOffset, + input + offset, length); LogStr("wc_AesCbcEncrypt(aes=%p, out, in, inSz) = %d\n", aes, ret); } else { - ret = wc_AesCbcDecrypt(aes, output, input + offset, length); + ret = wc_AesCbcDecrypt(aes, output + outputOffset, + input + offset, length); LogStr("wc_AesCbcDecrypt(aes=%p, out, in, inSz) = %d\n", aes, ret); } @@ -223,8 +225,8 @@ Java_com_wolfssl_wolfcrypt_Aes_native_1update_1internal__ILjava_nio_ByteBuffer_2 LogStr("input[%u]: [%p]\n", (word32)length, input + offset); LogHex((byte*) input, offset, length); - LogStr("output[%u]: [%p]\n", (word32)length, output); - LogHex((byte*) output, 0, length); + LogStr("output[%u]: [%p]\n", (word32)length, output + outputOffset); + LogHex((byte*) output, outputOffset, length); #else throwNotCompiledInException(env); ret = NOT_COMPILED_IN; diff --git a/jni/jni_aesctr.c b/jni/jni_aesctr.c index 7ba28d39..1516acb4 100644 --- a/jni/jni_aesctr.c +++ b/jni/jni_aesctr.c @@ -193,7 +193,7 @@ Java_com_wolfssl_wolfcrypt_AesCtr_native_1update_1internal__Ljava_nio_ByteBuffer if (aes == NULL || input == NULL || output == NULL) { ret = BAD_FUNC_ARG; } - else if (offset < 0 || length < 0) { + else if (offset < 0 || length < 0 || outputOffset < 0) { ret = BAD_FUNC_ARG; } else if (((jlong)offset + (jlong)length) > @@ -205,7 +205,8 @@ Java_com_wolfssl_wolfcrypt_AesCtr_native_1update_1internal__Ljava_nio_ByteBuffer ret = BUFFER_E; /* buffer overflow check */ } else { - ret = wc_AesCtrEncrypt(aes, output, input + offset, length); + ret = wc_AesCtrEncrypt(aes, output + outputOffset, + input + offset, length); LogStr("wc_AesCtrEncrypt(aes=%p, out, in, inSz) = %d\n", aes, ret); } diff --git a/jni/jni_aesecb.c b/jni/jni_aesecb.c index 04e22db5..226792a9 100644 --- a/jni/jni_aesecb.c +++ b/jni/jni_aesecb.c @@ -199,7 +199,7 @@ Java_com_wolfssl_wolfcrypt_AesEcb_native_1update_1internal__ILjava_nio_ByteBuffe if (aes == NULL || input == NULL || output == NULL) { ret = BAD_FUNC_ARG; } - else if (offset < 0 || length < 0) { + else if (offset < 0 || length < 0 || outputOffset < 0) { ret = BAD_FUNC_ARG; } else if ((length % AES_BLOCK_SIZE) != 0) { @@ -214,11 +214,13 @@ Java_com_wolfssl_wolfcrypt_AesEcb_native_1update_1internal__ILjava_nio_ByteBuffe ret = BUFFER_E; /* buffer overflow check */ } else if (opmode == AES_ENCRYPTION) { - ret = wc_AesEcbEncrypt(aes, output, input + offset, length); + ret = wc_AesEcbEncrypt(aes, output + outputOffset, + input + offset, length); LogStr("wc_AesEcbEncrypt(aes=%p, out, in, inSz) = %d\n", aes, ret); } else { - ret = wc_AesEcbDecrypt(aes, output, input + offset, length); + ret = wc_AesEcbDecrypt(aes, output + outputOffset, + input + offset, length); LogStr("wc_AesEcbDecrypt(aes=%p, out, in, inSz) = %d\n", aes, ret); } @@ -232,8 +234,8 @@ Java_com_wolfssl_wolfcrypt_AesEcb_native_1update_1internal__ILjava_nio_ByteBuffe LogStr("input[%u]: [%p]\n", (word32)length, input + offset); LogHex((byte*) input, offset, length); - LogStr("output[%u]: [%p]\n", (word32)length, output); - LogHex((byte*) output, 0, length); + LogStr("output[%u]: [%p]\n", (word32)length, output + outputOffset); + LogHex((byte*) output, outputOffset, length); #else throwNotCompiledInException(env); ret = NOT_COMPILED_IN; diff --git a/jni/jni_aesofb.c b/jni/jni_aesofb.c index ec486b27..8911256d 100644 --- a/jni/jni_aesofb.c +++ b/jni/jni_aesofb.c @@ -207,7 +207,7 @@ Java_com_wolfssl_wolfcrypt_AesOfb_native_1update_1internal__ILjava_nio_ByteBuffe if (aes == NULL || input == NULL || output == NULL) { ret = BAD_FUNC_ARG; } - else if (offset < 0 || length < 0) { + else if (offset < 0 || length < 0 || outputOffset < 0) { ret = BAD_FUNC_ARG; } else if (((jlong)offset + (jlong)length) > @@ -219,17 +219,20 @@ Java_com_wolfssl_wolfcrypt_AesOfb_native_1update_1internal__ILjava_nio_ByteBuffe ret = BUFFER_E; /* buffer overflow check */ } else if (opmode == AES_ENCRYPTION) { - ret = wc_AesOfbEncrypt(aes, output, input + offset, length); + ret = wc_AesOfbEncrypt(aes, output + outputOffset, + input + offset, length); LogStr("wc_AesOfbEncrypt(aes=%p, out, in, inSz) = %d\n", aes, ret); } else { #ifdef HAVE_AES_DECRYPT - ret = wc_AesOfbDecrypt(aes, output, input + offset, length); + ret = wc_AesOfbDecrypt(aes, output + outputOffset, + input + offset, length); LogStr("wc_AesOfbDecrypt(aes=%p, out, in, inSz) = %d\n", aes, ret); #else /* If HAVE_AES_DECRYPT not defined, fall back to encrypt * (OFB mode uses same operation for both) */ - ret = wc_AesOfbEncrypt(aes, output, input + offset, length); + ret = wc_AesOfbEncrypt(aes, output + outputOffset, + input + offset, length); LogStr("wc_AesOfbEncrypt(aes=%p, out, in, inSz) = %d\n", aes, ret); #endif } @@ -244,8 +247,8 @@ Java_com_wolfssl_wolfcrypt_AesOfb_native_1update_1internal__ILjava_nio_ByteBuffe LogStr("input[%u]: [%p]\n", (word32)length, input + offset); LogHex((byte*) input, offset, length); - LogStr("output[%u]: [%p]\n", (word32)length, output); - LogHex((byte*) output, 0, length); + LogStr("output[%u]: [%p]\n", (word32)length, output + outputOffset); + LogHex((byte*) output, outputOffset, length); #else throwNotCompiledInException(env); ret = NOT_COMPILED_IN; diff --git a/jni/jni_des3.c b/jni/jni_des3.c index 9b71ff4e..9562e572 100644 --- a/jni/jni_des3.c +++ b/jni/jni_des3.c @@ -187,7 +187,7 @@ Java_com_wolfssl_wolfcrypt_Des3_native_1update_1internal__ILjava_nio_ByteBuffer_ if (!des || !input || !output) { ret = BAD_FUNC_ARG; /* NULL sanitizers */ } - else if (offset < 0 || length < 0) { + else if (offset < 0 || length < 0 || outputOffset < 0) { ret = BAD_FUNC_ARG; /* signed sanizizers */ } else if (((jlong)offset + (jlong)length) > @@ -199,11 +199,13 @@ Java_com_wolfssl_wolfcrypt_Des3_native_1update_1internal__ILjava_nio_ByteBuffer_ ret = BUFFER_E; /* buffer overflow check */ } else if (opmode == DES_ENCRYPTION) { - ret = wc_Des3_CbcEncrypt(des, output, input + offset, length); + ret = wc_Des3_CbcEncrypt(des, output + outputOffset, + input + offset, length); LogStr("wc_Des3CbcEncrypt(des=%p, out, in, inSz) = %d\n", des, ret); } else { - ret = wc_Des3_CbcDecrypt(des, output, input + offset, length); + ret = wc_Des3_CbcDecrypt(des, output + outputOffset, + input + offset, length); LogStr("wc_Des3CbcDecrypt(des=%p, out, in, inSz) = %d\n", des, ret); } @@ -217,8 +219,8 @@ Java_com_wolfssl_wolfcrypt_Des3_native_1update_1internal__ILjava_nio_ByteBuffer_ LogStr("input[%u]: [%p]\n", (word32)length, input + offset); LogHex((byte*) input, offset, length); - LogStr("output[%u]: [%p]\n", (word32)length, output); - LogHex((byte*) output, 0, length); + LogStr("output[%u]: [%p]\n", (word32)length, output + outputOffset); + LogHex((byte*) output, outputOffset, length); #else throwNotCompiledInException(env); #endif