JNI: non-FIPS wrapper for RNG

pull/2/merge
Chris Conlon 2017-03-16 13:21:30 -06:00
parent 85af1fffbf
commit 9e292725f7
3 changed files with 186 additions and 0 deletions

View File

@ -17,6 +17,38 @@ extern "C" {
JNIEXPORT jlong JNICALL Java_com_wolfssl_wolfcrypt_Rng_mallocNativeStruct JNIEXPORT jlong JNICALL Java_com_wolfssl_wolfcrypt_Rng_mallocNativeStruct
(JNIEnv *, jobject); (JNIEnv *, jobject);
/*
* Class: com_wolfssl_wolfcrypt_Rng
* Method: initRng
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_initRng
(JNIEnv *, jobject);
/*
* Class: com_wolfssl_wolfcrypt_Rng
* Method: freeRng
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_freeRng
(JNIEnv *, jobject);
/*
* Class: com_wolfssl_wolfcrypt_Rng
* Method: rngGenerateBlock
* Signature: (Ljava/nio/ByteBuffer;J)V
*/
JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_rngGenerateBlock__Ljava_nio_ByteBuffer_2J
(JNIEnv *, jobject, jobject, jlong);
/*
* Class: com_wolfssl_wolfcrypt_Rng
* Method: rngGenerateBlock
* Signature: ([BJ)V
*/
JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_rngGenerateBlock___3BJ
(JNIEnv *, jobject, jbyteArray, jlong);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -23,9 +23,11 @@
#include <wolfssl/options.h> #include <wolfssl/options.h>
#endif #endif
#include <wolfssl/wolfcrypt/random.h> #include <wolfssl/wolfcrypt/random.h>
#include <wolfssl/wolfcrypt/error-crypt.h>
#include <com_wolfssl_wolfcrypt_Rng.h> #include <com_wolfssl_wolfcrypt_Rng.h>
#include <wolfcrypt_jni_error.h> #include <wolfcrypt_jni_error.h>
#include <wolfcrypt_jni_NativeStruct.h>
/* #define WOLFCRYPT_JNI_DEBUG_ON */ /* #define WOLFCRYPT_JNI_DEBUG_ON */
@ -43,3 +45,100 @@ JNIEXPORT jlong JNICALL Java_com_wolfssl_wolfcrypt_Rng_mallocNativeStruct(
return (jlong) rng; return (jlong) rng;
} }
JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_initRng
(JNIEnv* env, jobject class)
{
#ifndef WC_NO_RNG
int ret = 0;
RNG* rng = (RNG*) getNativeStruct(env, class);
if (!rng)
throwWolfCryptExceptionFromError(env, BAD_FUNC_ARG);
ret = wc_InitRng(rng);
if (ret != 0)
throwWolfCryptExceptionFromError(env, ret);
LogStr("wc_InitRng(rng=%p) = %d\n", rng, ret);
#else
throwNotCompiledInException(env);
#endif
}
JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_freeRng
(JNIEnv* env, jobject class)
{
#ifndef WC_NO_RNG
int ret = 0;
RNG* rng = (RNG*) getNativeStruct(env, class);
if (!rng)
throwWolfCryptExceptionFromError(env, BAD_FUNC_ARG);
ret = wc_FreeRng(rng);
if (ret != 0)
throwWolfCryptExceptionFromError(env, ret);
LogStr("wc_FreeRng(rng=%p) = %d\n", rng, ret);
#else
throwNotCompiledInException(env);
#endif
}
JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_rngGenerateBlock__Ljava_nio_ByteBuffer_2J
(JNIEnv* env, jobject class, jobject buf_buffer, jlong bufSz)
{
#ifndef WC_NO_RNG
int ret = 0;
RNG* rng = (RNG*) getNativeStruct(env, class);
byte* buf = getDirectBufferAddress(env, buf_buffer);
if (!rng || !buf)
throwWolfCryptExceptionFromError(env, BAD_FUNC_ARG);
ret = wc_RNG_GenerateBlock(rng, buf, bufSz);
if (ret != 0)
throwWolfCryptExceptionFromError(env, ret);
LogStr("wc_RNG_GenerateBlock(rng=%p, buf, bufSz) = %d\n", rng, ret);
LogStr("output[%u]: [%p]\n", (word32)bufSz, buf);
LogHex(buf, bufSz);
#else
throwNotCompiledInException(env);
#endif
}
JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rng_rngGenerateBlock___3BJ
(JNIEnv* env, jobject class, jbyteArray buf_buffer, jlong bufSz)
{
#ifndef WC_NO_RNG
int ret = 0;
RNG* rng = (RNG*) getNativeStruct(env, class);
byte* buf = getByteArray(env, buf_buffer);
if (!rng || !buf)
throwWolfCryptExceptionFromError(env, BAD_FUNC_ARG);
ret = wc_RNG_GenerateBlock(rng, buf, bufSz);
if (ret != 0)
throwWolfCryptExceptionFromError(env, ret);
LogStr("wc_RNG_GenerateBlock(rng=%p, buf, bufSz) = %d\n", rng, ret);
LogStr("output[%u]: [%p]\n", (word32)bufSz, buf);
LogHex(buf, bufSz);
releaseByteArray(env, buf_buffer, buf, ret);
#else
throwNotCompiledInException(env);
#endif
}

View File

@ -21,6 +21,8 @@
package com.wolfssl.wolfcrypt; package com.wolfssl.wolfcrypt;
import java.nio.ByteBuffer;
/** /**
* Wrapper for the native WolfCrypt Rng implementation. * Wrapper for the native WolfCrypt Rng implementation.
* *
@ -30,4 +32,57 @@ package com.wolfssl.wolfcrypt;
public class Rng extends NativeStruct { public class Rng extends NativeStruct {
protected native long mallocNativeStruct() throws OutOfMemoryError; protected native long mallocNativeStruct() throws OutOfMemoryError;
private WolfCryptState state = WolfCryptState.UNINITIALIZED;
/* native wrappers called by public functions below */
private native void initRng();
private native void freeRng();
private native void rngGenerateBlock(ByteBuffer buf, long bufSz);
private native void rngGenerateBlock(byte[] buf, long bufSz);
public void init() throws IllegalStateException {
if (state == WolfCryptState.UNINITIALIZED) {
initRng();
state = WolfCryptState.INITIALIZED;
} else {
throw new IllegalStateException(
"Object has already been initialized");
}
}
public void free() throws IllegalStateException {
if (state == WolfCryptState.INITIALIZED) {
freeRng();
state = WolfCryptState.UNINITIALIZED;
} else {
throw new IllegalStateException(
"Object has been freed");
}
}
public void generateBlock(ByteBuffer buf, long bufSz)
throws IllegalStateException {
if (state == WolfCryptState.INITIALIZED) {
rngGenerateBlock(buf, bufSz);
} else {
throw new IllegalStateException(
"Object must be initialized before use");
}
}
public void generateBlock(byte[] buf, long bufSz)
throws IllegalStateException {
if (state == WolfCryptState.INITIALIZED) {
rngGenerateBlock(buf, bufSz);
} else {
throw new IllegalStateException(
"Object must be initialized before use");
}
}
} }