JNI: Rng changes from code review

pull/2/merge
Chris Conlon 2017-03-17 14:17:29 -06:00
parent 9e292725f7
commit f274fdce55
3 changed files with 52 additions and 36 deletions

View File

@ -36,18 +36,18 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_freeRng
/* /*
* Class: com_wolfssl_wolfcrypt_Rng * Class: com_wolfssl_wolfcrypt_Rng
* Method: rngGenerateBlock * Method: rngGenerateBlock
* Signature: (Ljava/nio/ByteBuffer;J)V * Signature: (Ljava/nio/ByteBuffer;II)V
*/ */
JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_rngGenerateBlock__Ljava_nio_ByteBuffer_2J JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_rngGenerateBlock__Ljava_nio_ByteBuffer_2II
(JNIEnv *, jobject, jobject, jlong); (JNIEnv *, jobject, jobject, jint, jint);
/* /*
* Class: com_wolfssl_wolfcrypt_Rng * Class: com_wolfssl_wolfcrypt_Rng
* Method: rngGenerateBlock * Method: rngGenerateBlock
* Signature: ([BJ)V * Signature: ([B)V
*/ */
JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_rngGenerateBlock___3BJ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_rngGenerateBlock___3B
(JNIEnv *, jobject, jbyteArray, jlong); (JNIEnv *, jobject, jbyteArray);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -54,9 +54,6 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_initRng
int ret = 0; int ret = 0;
RNG* rng = (RNG*) getNativeStruct(env, class); RNG* rng = (RNG*) getNativeStruct(env, class);
if (!rng)
throwWolfCryptExceptionFromError(env, BAD_FUNC_ARG);
ret = wc_InitRng(rng); ret = wc_InitRng(rng);
if (ret != 0) if (ret != 0)
throwWolfCryptExceptionFromError(env, ret); throwWolfCryptExceptionFromError(env, ret);
@ -76,9 +73,6 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_freeRng
int ret = 0; int ret = 0;
RNG* rng = (RNG*) getNativeStruct(env, class); RNG* rng = (RNG*) getNativeStruct(env, class);
if (!rng)
throwWolfCryptExceptionFromError(env, BAD_FUNC_ARG);
ret = wc_FreeRng(rng); ret = wc_FreeRng(rng);
if (ret != 0) if (ret != 0)
throwWolfCryptExceptionFromError(env, ret); throwWolfCryptExceptionFromError(env, ret);
@ -90,8 +84,8 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_freeRng
#endif #endif
} }
JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_rngGenerateBlock__Ljava_nio_ByteBuffer_2J JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_rngGenerateBlock__Ljava_nio_ByteBuffer_2II
(JNIEnv* env, jobject class, jobject buf_buffer, jlong bufSz) (JNIEnv* env, jobject class, jobject buf_buffer, jint position, jint sz)
{ {
#ifndef WC_NO_RNG #ifndef WC_NO_RNG
@ -99,33 +93,33 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_rngGenerateBlock__Ljava_ni
RNG* rng = (RNG*) getNativeStruct(env, class); RNG* rng = (RNG*) getNativeStruct(env, class);
byte* buf = getDirectBufferAddress(env, buf_buffer); byte* buf = getDirectBufferAddress(env, buf_buffer);
if (!rng || !buf) if (!buf) {
throwWolfCryptExceptionFromError(env, BAD_FUNC_ARG); throwWolfCryptExceptionFromError(env, BAD_FUNC_ARG);
ret = wc_RNG_GenerateBlock(rng, buf, bufSz); } else {
if (ret != 0) ret = wc_RNG_GenerateBlock(rng, buf + position, sz);
throwWolfCryptExceptionFromError(env, ret); if (ret != 0)
throwWolfCryptExceptionFromError(env, ret);
}
LogStr("wc_RNG_GenerateBlock(rng=%p, buf, bufSz) = %d\n", rng, ret); LogStr("wc_RNG_GenerateBlock(rng=%p, buf, sz) = %d\n", rng, ret);
LogStr("output[%u]: [%p]\n", (word32)bufSz, buf); LogStr("output[%u]: [%p]\n", (word32)sz, buf);
LogHex(buf, bufSz); LogHex(buf, sz);
#else #else
throwNotCompiledInException(env); throwNotCompiledInException(env);
#endif #endif
} }
JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_rngGenerateBlock___3BJ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_rngGenerateBlock___3B
(JNIEnv* env, jobject class, jbyteArray buf_buffer, jlong bufSz) (JNIEnv* env, jobject class, jbyteArray buf_buffer)
{ {
#ifndef WC_NO_RNG #ifndef WC_NO_RNG
int ret = 0; int ret = 0;
RNG* rng = (RNG*) getNativeStruct(env, class); RNG* rng = (RNG*) getNativeStruct(env, class);
byte* buf = getByteArray(env, buf_buffer); byte* buf = getByteArray(env, buf_buffer);
word32 bufSz = getByteArrayLength(env, buf_buffer);
if (!rng || !buf)
throwWolfCryptExceptionFromError(env, BAD_FUNC_ARG);
ret = wc_RNG_GenerateBlock(rng, buf, bufSz); ret = wc_RNG_GenerateBlock(rng, buf, bufSz);
if (ret != 0) if (ret != 0)

View File

@ -23,6 +23,8 @@ package com.wolfssl.wolfcrypt;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import javax.crypto.ShortBufferException;
/** /**
* Wrapper for the native WolfCrypt Rng implementation. * Wrapper for the native WolfCrypt Rng implementation.
* *
@ -38,10 +40,10 @@ public class Rng extends NativeStruct {
/* native wrappers called by public functions below */ /* native wrappers called by public functions below */
private native void initRng(); private native void initRng();
private native void freeRng(); private native void freeRng();
private native void rngGenerateBlock(ByteBuffer buf, long bufSz); private native void rngGenerateBlock(ByteBuffer buf, int position, int sz);
private native void rngGenerateBlock(byte[] buf, long bufSz); private native void rngGenerateBlock(byte[] buf);
public void init() throws IllegalStateException { public void init() {
if (state == WolfCryptState.UNINITIALIZED) { if (state == WolfCryptState.UNINITIALIZED) {
initRng(); initRng();
@ -52,7 +54,7 @@ public class Rng extends NativeStruct {
} }
} }
public void free() throws IllegalStateException { public void free() {
if (state == WolfCryptState.INITIALIZED) { if (state == WolfCryptState.INITIALIZED) {
freeRng(); freeRng();
@ -63,22 +65,42 @@ public class Rng extends NativeStruct {
} }
} }
public void generateBlock(ByteBuffer buf, long bufSz) public void generateBlock(ByteBuffer buf) {
throws IllegalStateException {
if (state == WolfCryptState.INITIALIZED) { if (state == WolfCryptState.INITIALIZED) {
rngGenerateBlock(buf, bufSz);
rngGenerateBlock(buf, buf.position(), buf.remaining());
buf.position(buf.position() + buf.remaining());
} else { } else {
throw new IllegalStateException( throw new IllegalStateException(
"Object must be initialized before use"); "Object must be initialized before use");
} }
} }
public void generateBlock(byte[] buf, long bufSz) public void generateBlock(byte[] buf) {
throws IllegalStateException {
if (state == WolfCryptState.INITIALIZED) { if (state == WolfCryptState.INITIALIZED) {
rngGenerateBlock(buf, bufSz);
rngGenerateBlock(buf);
} else {
throw new IllegalStateException(
"Object must be initialized before use");
}
}
public byte[] generateBlock(int size) {
if (state == WolfCryptState.INITIALIZED) {
byte[] buffer = new byte[size];
rngGenerateBlock(buffer);
return buffer;
} else { } else {
throw new IllegalStateException( throw new IllegalStateException(
"Object must be initialized before use"); "Object must be initialized before use");