JNI: non-FIPS wrapper for RNG
parent
85af1fffbf
commit
9e292725f7
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue