adds error callback to FIPS with jni wrappers.
parent
5c7bc8c28e
commit
b0ba01ef9a
|
@ -7,6 +7,14 @@
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: com_wolfssl_wolfcrypt_Fips
|
||||||
|
* Method: setErrorCallback
|
||||||
|
* Signature: (Lcom/wolfssl/wolfcrypt/Fips/ErrorCallback;)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Fips_setErrorCallback
|
||||||
|
(JNIEnv *, jclass, jobject);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class: com_wolfssl_wolfcrypt_Fips
|
* Class: com_wolfssl_wolfcrypt_Fips
|
||||||
* Method: AesSetKey_fips
|
* Method: AesSetKey_fips
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class com_wolfssl_wolfcrypt_Fips_ErrorCallback */
|
||||||
|
|
||||||
|
#ifndef _Included_com_wolfssl_wolfcrypt_Fips_ErrorCallback
|
||||||
|
#define _Included_com_wolfssl_wolfcrypt_Fips_ErrorCallback
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -20,7 +20,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Asn_encodeSignature(
|
||||||
|
|
||||||
if (!encoded || !hash)
|
if (!encoded || !hash)
|
||||||
throwWolfCryptException(env, "Bad method argument provided");
|
throwWolfCryptException(env, "Bad method argument provided");
|
||||||
|
else
|
||||||
setDirectBufferLimit(env, encoded_object,
|
setDirectBufferLimit(env, encoded_object,
|
||||||
wc_EncodeSignature(encoded, hash, hashSize, hashOID));
|
wc_EncodeSignature(encoded, hash, hashSize, hashOID));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
#include <com_wolfssl_wolfcrypt_WolfCrypt.h>
|
#include <com_wolfssl_wolfcrypt_WolfCrypt.h>
|
||||||
#include <com_wolfssl_wolfcrypt_Fips.h>
|
#include <com_wolfssl_wolfcrypt_Fips.h>
|
||||||
#include <wolfcrypt_jni_NativeStruct.h>
|
#include <wolfcrypt_jni_NativeStruct.h>
|
||||||
|
#include <wolfcrypt_jni_error.h>
|
||||||
|
|
||||||
#ifndef __ANDROID__
|
#ifndef __ANDROID__
|
||||||
#include <wolfssl/options.h>
|
#include <wolfssl/options.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include <wolfssl/wolfcrypt/error-crypt.h>
|
#include <wolfssl/wolfcrypt/error-crypt.h>
|
||||||
#include <wolfssl/wolfcrypt/fips_test.h>
|
#include <wolfssl/wolfcrypt/fips_test.h>
|
||||||
#include <wolfssl/wolfcrypt/aes.h>
|
#include <wolfssl/wolfcrypt/aes.h>
|
||||||
|
@ -22,6 +24,54 @@
|
||||||
/* #define WOLFCRYPT_JNI_DEBUG_ON */
|
/* #define WOLFCRYPT_JNI_DEBUG_ON */
|
||||||
#include <wolfcrypt_jni_debug.h>
|
#include <wolfcrypt_jni_debug.h>
|
||||||
|
|
||||||
|
extern JavaVM* g_vm;
|
||||||
|
static jobject g_errCb;
|
||||||
|
|
||||||
|
void NativeErrorCallback(const int ok, const int err, const char * const hash)
|
||||||
|
{
|
||||||
|
JNIEnv* env;
|
||||||
|
jclass class;
|
||||||
|
jmethodID method;
|
||||||
|
jint ret;
|
||||||
|
|
||||||
|
ret = (int) ((*g_vm)->GetEnv(g_vm, (void**) &env, JNI_VERSION_1_6));
|
||||||
|
if (ret == JNI_EDETACHED) {
|
||||||
|
#ifdef __ANDROID__
|
||||||
|
ret = (*g_vm)->AttachCurrentThread(g_vm, &env, NULL);
|
||||||
|
#else
|
||||||
|
ret = (*g_vm)->AttachCurrentThread(g_vm, (void**) &env, NULL);
|
||||||
|
#endif
|
||||||
|
if (ret) {
|
||||||
|
printf("Failed to attach JNIEnv to thread\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (ret != JNI_OK) {
|
||||||
|
printf("Unable to get JNIEnv from JavaVM\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (JNIGlobalRefType != (*env)->GetObjectRefType(env, g_errCb))
|
||||||
|
throwWolfCryptException(env, "Invalid errorCallback reference");
|
||||||
|
else if (!(class = (*env)->GetObjectClass(env, g_errCb)))
|
||||||
|
throwWolfCryptException(env, "Failed to get callback class");
|
||||||
|
else if (!(method = (*env)->GetMethodID(env, class, "errorCallback",
|
||||||
|
"(IILjava/lang/String;)V")))
|
||||||
|
throwWolfCryptException(env, "Failed to get method ID");
|
||||||
|
else
|
||||||
|
(*env)->CallVoidMethod(env, g_errCb, method, ok, err,
|
||||||
|
(*env)->NewStringUTF(env, hash));
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Fips_setErrorCallback(
|
||||||
|
JNIEnv* env, jclass class, jobject callback)
|
||||||
|
{
|
||||||
|
if ((g_errCb = (*env)->NewGlobalRef(env, callback)))
|
||||||
|
wolfCrypt_SetCb_fips(NativeErrorCallback);
|
||||||
|
else
|
||||||
|
throwWolfCryptException(env, "Failed to store global error callback");
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ### FIPS Aprooved Security Methods ##########################################
|
* ### FIPS Aprooved Security Methods ##########################################
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -12,6 +12,16 @@
|
||||||
|
|
||||||
#pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
|
#pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
|
||||||
|
|
||||||
|
JavaVM* g_vm = NULL;
|
||||||
|
|
||||||
|
/* called when native library is loaded */
|
||||||
|
jint JNI_OnLoad(JavaVM* vm, void* reserved)
|
||||||
|
{
|
||||||
|
/* store JavaVM */
|
||||||
|
g_vm = vm;
|
||||||
|
return JNI_VERSION_1_6;
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_NativeStruct_xfree(
|
JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_NativeStruct_xfree(
|
||||||
JNIEnv* env, jobject this, jlong ptr)
|
JNIEnv* env, jobject this, jlong ptr)
|
||||||
{
|
{
|
||||||
|
|
|
@ -46,8 +46,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Rsa_decodeRawPublicKey(
|
||||||
|
|
||||||
if (!key || !n || !e)
|
if (!key || !n || !e)
|
||||||
throwWolfCryptException(env, "Bad method argument provided");
|
throwWolfCryptException(env, "Bad method argument provided");
|
||||||
|
else if (wc_RsaPublicKeyDecodeRaw(n, nSize, e, eSize, key) != 0)
|
||||||
if (wc_RsaPublicKeyDecodeRaw(n, nSize, e, eSize, key) != 0)
|
|
||||||
throwWolfCryptException(env, "Failed to decode raw public key");
|
throwWolfCryptException(env, "Failed to decode raw public key");
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -15,6 +15,12 @@ public class Fips extends WolfObject {
|
||||||
private Fips() {
|
private Fips() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface ErrorCallback {
|
||||||
|
public void errorCallback(int ok, int err, String hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static native void setErrorCallback(ErrorCallback callback);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ### FIPS Aprooved Security Methods ######################################
|
* ### FIPS Aprooved Security Methods ######################################
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
package com.wolfssl.wolfcrypt.fips;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.wolfssl.wolfcrypt.Fips.ErrorCallback;
|
||||||
|
import com.wolfssl.wolfcrypt.Aes;
|
||||||
|
import com.wolfssl.wolfcrypt.Fips;
|
||||||
|
|
||||||
|
public class ErrorCallbackFipsTest {
|
||||||
|
|
||||||
|
public class MyCallback implements ErrorCallback {
|
||||||
|
@Override
|
||||||
|
public void errorCallback(int ok, int err, String hash) {
|
||||||
|
System.out.println("in my Fips callback, ok =" + ok + " err = "
|
||||||
|
+ err);
|
||||||
|
System.out.println("hash = " + hash);
|
||||||
|
|
||||||
|
if (err == -203) {
|
||||||
|
System.out
|
||||||
|
.println("In core integrity hash check failure, copy above hash");
|
||||||
|
System.out
|
||||||
|
.println("into verifyCore[] in fips_test.c and rebuild");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setErrorCallbackShouldNotRaise() {
|
||||||
|
MyCallback callback = new MyCallback();
|
||||||
|
|
||||||
|
Fips.setErrorCallback(callback);
|
||||||
|
|
||||||
|
Fips.AesSetKey_fips(new Aes(),
|
||||||
|
ByteBuffer.allocateDirect(Aes.KEY_SIZE_256), Aes.KEY_SIZE_128,
|
||||||
|
null, Aes.ENCRYPT_MODE);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue