diff --git a/jni/jni_chacha.c b/jni/jni_chacha.c index 614b2233..680308ae 100644 --- a/jni/jni_chacha.c +++ b/jni/jni_chacha.c @@ -72,6 +72,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Chacha_wc_1Chacha_1setIV int ret = 0; ChaCha* chacha = NULL; byte* iv = NULL; + word32 ivSz = 0; chacha = (ChaCha*)(uintptr_t)getNativeStruct(env, this); if ((*env)->ExceptionOccurred(env)) { @@ -79,8 +80,9 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Chacha_wc_1Chacha_1setIV return; } iv = getByteArray(env, iv_object); + ivSz = getByteArrayLength(env, iv_object); - if (chacha == NULL || iv == NULL) { + if (chacha == NULL || iv == NULL || ivSz != CHACHA_IV_BYTES) { ret = BAD_FUNC_ARG; } diff --git a/src/test/java/com/wolfssl/wolfcrypt/test/ChachaTest.java b/src/test/java/com/wolfssl/wolfcrypt/test/ChachaTest.java index 5ffd5527..4dc5a735 100644 --- a/src/test/java/com/wolfssl/wolfcrypt/test/ChachaTest.java +++ b/src/test/java/com/wolfssl/wolfcrypt/test/ChachaTest.java @@ -132,6 +132,22 @@ public class ChachaTest { /* test must throw */ } + /* IV shorter than 12 bytes should be rejected */ + try { + chacha.setIV(new byte[4]); + fail("IV shorter than 12 bytes should be rejected."); + } catch (WolfCryptException e) { + /* test must throw */ + } + + /* An IV longer than 12 bytes is not a valid ChaCha nonce */ + try { + chacha.setIV(new byte[16]); + fail("IV longer than 12 bytes should be rejected."); + } catch (WolfCryptException e) { + /* test must throw */ + } + chacha.setIV(IV); chacha.releaseNativeStruct(); }