diff --git a/tss-client-android/libs/arm64-v8a/libdkls.a b/tss-client-android/libs/arm64-v8a/libdkls.a index 4f58eef..4513ac5 100644 Binary files a/tss-client-android/libs/arm64-v8a/libdkls.a and b/tss-client-android/libs/arm64-v8a/libdkls.a differ diff --git a/tss-client-android/libs/armeabi-v7a/libdkls.a b/tss-client-android/libs/armeabi-v7a/libdkls.a index 0465909..6368964 100644 Binary files a/tss-client-android/libs/armeabi-v7a/libdkls.a and b/tss-client-android/libs/armeabi-v7a/libdkls.a differ diff --git a/tss-client-android/libs/include/dkls.h b/tss-client-android/libs/include/dkls.h index c102a4b..92efc60 100644 --- a/tss-client-android/libs/include/dkls.h +++ b/tss-client-android/libs/include/dkls.h @@ -1,78 +1,63 @@ #ifndef __DKLS_H__ #define __DKLS_H__ // Include guard -#ifdef __cplusplus // Required for C++ compiler -extern "C" { -#endif -//Includes -#include -#include -#include -#include - -//Forward declarations -struct Sigfrags; -struct Counterparties; -struct DKLSMsgComm; -struct ChaChaRng; -struct ThresholdSigner; -struct Precompute; - -//Methods -//Signature Fragments -struct Sigfrags *signature_fragments_from_string(const char *input, int *error_code); -const char *signature_fragments_to_string(struct Sigfrags *fragments, int *error_code); -void signature_fragments_free(struct Sigfrags *fragments); - -//Counterparties -struct Counterparties *counterparties_from_string(const char *parties, int *error_code); -const char *counterparties_to_string(struct Counterparties *fragments, int *error_code); -void counterparties_free(struct Counterparties *parties); - -//MsgComm -struct DKLSMsgComm *dkls_comm(int index, int parties, const char *session, - const char *(*read_msg_callback)(const char *, unsigned long long int, - unsigned long long int, - const char *), - bool (*send_msg_callback)(const char *, unsigned long long int, - unsigned long long int, const char *, - const char *), int *error_code); -void dkls_comm_free(struct DKLSMsgComm *comm); - -//Random Generator -struct ChaChaRng *random_generator(const char *state, int *error_code); -void random_generator_free(struct ChaChaRng *rng); - -//Precompute -const char *precompute_to_string(struct Precompute *precompute, int *error_code); -struct Precompute *precompute_from_string(const char *input, int *error_code); -const char *get_r_from_precompute(const char *precompute, int *error_code); -void precompute_free(struct Precompute *precompute); - -//Threshold Signer -struct ThresholdSigner * -threshold_signer(const char *session, int player_index, int parties, int threshold, - const char *share, const char *pubkey, int *error_code); -void threshold_signer_free(struct ThresholdSigner *signer); -bool threshold_signer_setup(struct ThresholdSigner *signer, struct ChaChaRng *rng, - struct DKLSMsgComm *comm); -const char * -threshold_signer_precompute(struct Counterparties *parties, struct ThresholdSigner *signer, - struct ChaChaRng *rng, struct DKLSMsgComm *comm, int *error_code); -const char * -threshold_signer_sign(struct Counterparties *counterparties, const char *msg, bool hash_only, - struct ThresholdSigner *signer, struct ChaChaRng *rng, - struct DKLSMsgComm *comm, int *error_code); - -//Utilities -int dkls_batch_size(int *error_code); -const char *dkls_hash_encode(const char *msg, int *error_code); -const char * -dkls_local_sign(const char *msg, bool hash_only, const char *precompute, int *error_code); -const char * -dkls_local_verify(const char *msg, bool hash_only, const char *r, struct Sigfrags *sig_frags, - const char *pubkey, int *error_code); -void dkls_string_free(char *ptr); -#ifdef __cplusplus -} // extern "C" -#endif + #ifdef __cplusplus // Required for C++ compiler + extern "C" { + #endif + //Includes + #include + #include + #include + #include + + //Forward declarations + struct Sigfrags; + struct Counterparties; + struct DKLSMsgComm; + struct ChaChaRng; + struct ThresholdSigner; + struct Precompute; + + //Methods + //Signature Fragments + struct Sigfrags *signature_fragments_from_string(const char* input, int* error_code); + const char* signature_fragments_to_string(struct Sigfrags* fragments, int* error_code); + void signature_fragments_free(struct Sigfrags* fragments); + + //Counterparties + struct Counterparties *counterparties_from_string(const char* parties, int* error_code); + const char* counterparties_to_string(struct Counterparties* fragments, int* error_code); + void counterparties_free(struct Counterparties* parties); + + //MsgComm + struct DKLSMsgComm* dkls_comm(int index,int parties,const char* session, + const char* (*read_msg_callback)(const char*,unsigned long long int,unsigned long long int,const char*, const void*), + bool (*send_msg_callback)(const char*,unsigned long long int,unsigned long long int,const char*,const char*, const void*), const void* parent_instance_ref, int* error_code); + const void* dkls_comm_free(struct DKLSMsgComm* comm); + + //Random Generator + struct ChaChaRng* random_generator(const char* state, int* error_code); + void random_generator_free(struct ChaChaRng* rng); + + //Precompute + const char* precompute_to_string(struct Precompute* precompute, int* error_code); + struct Precompute* precompute_from_string(const char* input, int* error_code); + const char* get_r_from_precompute(const char* precompute, int* error_code); + void precompute_free(struct Precompute* precompute); + + //Threshold Signer + struct ThresholdSigner* threshold_signer(const char* session, int player_index, int parties, int threshold, const char* share, const char* pubkey, int* error_code); + void threshold_signer_free(struct ThresholdSigner* signer); + bool threshold_signer_setup(struct ThresholdSigner* signer, struct ChaChaRng* rng, struct DKLSMsgComm* comm); + const char* threshold_signer_precompute(struct Counterparties* parties, struct ThresholdSigner* signer, struct ChaChaRng* rng, struct DKLSMsgComm* comm, int* error_code); + const char* threshold_signer_sign(struct Counterparties* counterparties, const char* msg, bool hash_only, struct ThresholdSigner* signer, struct ChaChaRng* rng, struct DKLSMsgComm* comm, int* error_code); + + //Utilities + int dkls_batch_size(int* error_code); + const char* dkls_hash_encode(const char* msg, int* error_code); + const char* dkls_local_sign(const char* msg, bool hash_only, const char* precompute, int* error_code); + const char* dkls_local_verify(const char* msg, bool hash_only, const char* r, struct Sigfrags* sig_frags, const char* pubkey, int* error_code); + void dkls_string_free(char* ptr); + #ifdef __cplusplus + } // extern "C" + #endif #endif // __DKLS_H__ diff --git a/tss-client-android/libs/x86/libdkls.a b/tss-client-android/libs/x86/libdkls.a index f9a8422..3f7c337 100644 Binary files a/tss-client-android/libs/x86/libdkls.a and b/tss-client-android/libs/x86/libdkls.a differ diff --git a/tss-client-android/libs/x86_64/libdkls.a b/tss-client-android/libs/x86_64/libdkls.a index d9933cd..3f60dfb 100644 Binary files a/tss-client-android/libs/x86_64/libdkls.a and b/tss-client-android/libs/x86_64/libdkls.a differ diff --git a/tss-client-android/src/main/cpp/jniChaChaRng.cpp b/tss-client-android/src/main/cpp/jniChaChaRng.cpp index 9eab40d..0c208bc 100644 --- a/tss-client-android/src/main/cpp/jniChaChaRng.cpp +++ b/tss-client-android/src/main/cpp/jniChaChaRng.cpp @@ -1,6 +1,3 @@ -// -// Created by grvgo on 28-07-2023. -// #include #include "include/dkls.h" #include diff --git a/tss-client-android/src/main/cpp/jniCounterparties.cpp b/tss-client-android/src/main/cpp/jniCounterparties.cpp index 614f32e..c1747f9 100644 --- a/tss-client-android/src/main/cpp/jniCounterparties.cpp +++ b/tss-client-android/src/main/cpp/jniCounterparties.cpp @@ -1,6 +1,3 @@ -// -// Created by grvgo on 28-07-2023. -// #include #include "include/dkls.h" #include diff --git a/tss-client-android/src/main/cpp/jniDKLSComm.cpp b/tss-client-android/src/main/cpp/jniDKLSComm.cpp index 1bc468c..16c0e58 100644 --- a/tss-client-android/src/main/cpp/jniDKLSComm.cpp +++ b/tss-client-android/src/main/cpp/jniDKLSComm.cpp @@ -1,6 +1,3 @@ -// -// Created by grvgo on 28-07-2023. -// #include #include "include/dkls.h" #include @@ -14,18 +11,14 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { return JNI_VERSION_1_6; } -jobject handler = nullptr; -jmethodID sendMsgCallbackID; -jmethodID readMsgCallbackID; - // Note: // readMsgCallback(session, index, remote, msg_type) -> msg_data // sendMsgCallback(session, index, recipient, msg_type, msg_data) -> Bool -const char* readMsgCallback(const char* session, unsigned long long int index, unsigned long long int remote, const char* msg_type) { +const char* readMsgCallback(const char* session, unsigned long long int index, unsigned long long int remote, const char* msg_type, const void *obj_ref) { JNIEnv *jniEnv; - if (g_vm->GetEnv((void **) &jniEnv, JNI_VERSION_1_6) != JNI_OK || handler == nullptr) { + if (g_vm->GetEnv((void **) &jniEnv, JNI_VERSION_1_6) != JNI_OK || obj_ref == nullptr) { return ""; } @@ -35,10 +28,13 @@ const char* readMsgCallback(const char* session, unsigned long long int index, u jstring jmsgType = jniEnv->NewStringUTF(msg_type); dkls_string_free(const_cast(msg_type)); - auto jparent_ref = reinterpret_cast(handler); + auto jparent_ref = reinterpret_cast(const_cast(obj_ref)); auto index_bytes = getBytesFromUnsignedLongLong(jniEnv, index); auto remote_bytes = getBytesFromUnsignedLongLong(jniEnv, remote); + auto readMsgCallbackID = reinterpret_cast(GetPointerField(jniEnv, + jparent_ref, + "read_callback_id")); auto result = (jstring) jniEnv->CallObjectMethod( jparent_ref, readMsgCallbackID, @@ -48,10 +44,10 @@ const char* readMsgCallback(const char* session, unsigned long long int index, u return res; } -bool sendMsgCallback(const char* session, unsigned long long int index, unsigned long long int remote, const char* msg_type, const char* msg_data) { +bool sendMsgCallback(const char* session, unsigned long long int index, unsigned long long int remote, const char* msg_type, const char* msg_data, const void *obj_ref) { JNIEnv *jniEnv; - if (g_vm->GetEnv((void **) &jniEnv, JNI_VERSION_1_6) != JNI_OK || handler == nullptr) { + if (g_vm->GetEnv((void **) &jniEnv, JNI_VERSION_1_6) != JNI_OK || obj_ref == nullptr) { return false; } @@ -67,7 +63,10 @@ bool sendMsgCallback(const char* session, unsigned long long int index, unsigned auto index_bytes = getBytesFromUnsignedLongLong(jniEnv, index); auto remote_bytes = getBytesFromUnsignedLongLong(jniEnv, remote); - auto jparent_ref = reinterpret_cast(handler); + auto jparent_ref = reinterpret_cast(const_cast(obj_ref)); + auto sendMsgCallbackID = reinterpret_cast(GetPointerField(jniEnv, + jparent_ref, + "send_callback_id")); auto result = jniEnv->CallBooleanMethod( jparent_ref, sendMsgCallbackID, @@ -88,20 +87,23 @@ Java_com_web3auth_tss_1client_1android_dkls_DKLSComm_jniDklsComm(JNIEnv *env, jo jthrowable dkls_error) { int errorCode = 0; int *error_ptr = &errorCode; - handler = env->NewGlobalRef(thiz); - sendMsgCallbackID = getMethodId( + jobject instance = env->NewGlobalRef(thiz); + + jmethodID sendMsgCallbackID = getMethodId( env, - thiz, + instance, send_msg_callback, send_msg_callback_sig); - readMsgCallbackID = getMethodId( + SetPointerField(env, instance, reinterpret_cast(sendMsgCallbackID), "send_callback_id"); + jmethodID readMsgCallbackID = getMethodId( env, - thiz, + instance, read_msg_callback, read_msg_callback_sig); + SetPointerField(env, instance, reinterpret_cast(readMsgCallbackID), "read_callback_id"); const char *pSession = env->GetStringUTFChars(session, JNI_FALSE); - auto *pResult = dkls_comm(index,parties,pSession,readMsgCallback,sendMsgCallback,error_ptr); + auto *pResult = dkls_comm(index,parties,pSession,readMsgCallback,sendMsgCallback,instance,error_ptr); env->ReleaseStringUTFChars(session, pSession); setErrorCode(env, dkls_error, errorCode); return reinterpret_cast(pResult); @@ -110,9 +112,11 @@ Java_com_web3auth_tss_1client_1android_dkls_DKLSComm_jniDklsComm(JNIEnv *env, jo extern "C" JNIEXPORT void JNICALL Java_com_web3auth_tss_1client_1android_dkls_DKLSComm_jniDklsCommFree(JNIEnv *env, jobject thiz) { - env->DeleteGlobalRef(handler); - handler = nullptr; jlong pObject = GetPointerField(env, thiz); auto pObj = reinterpret_cast(pObject); - dkls_comm_free(pObj); + auto instance = dkls_comm_free(pObj); + if (instance != nullptr) { + auto obj_ref = reinterpret_cast(const_cast(instance)); + env->DeleteGlobalRef(obj_ref); + } } \ No newline at end of file diff --git a/tss-client-android/src/main/cpp/jniPrecompute.cpp b/tss-client-android/src/main/cpp/jniPrecompute.cpp index 0b33a05..1993419 100644 --- a/tss-client-android/src/main/cpp/jniPrecompute.cpp +++ b/tss-client-android/src/main/cpp/jniPrecompute.cpp @@ -1,6 +1,3 @@ -// -// Created by grvgo on 28-07-2023. -// #include #include "include/dkls.h" #include diff --git a/tss-client-android/src/main/cpp/jniSignatureFragments.cpp b/tss-client-android/src/main/cpp/jniSignatureFragments.cpp index 8525c76..aaa48e1 100644 --- a/tss-client-android/src/main/cpp/jniSignatureFragments.cpp +++ b/tss-client-android/src/main/cpp/jniSignatureFragments.cpp @@ -1,6 +1,3 @@ -// -// Created by grvgo on 28-07-2023. -// #include #include "include/dkls.h" #include diff --git a/tss-client-android/src/main/cpp/jniThresholdSigner.cpp b/tss-client-android/src/main/cpp/jniThresholdSigner.cpp index 4e4570a..7611680 100644 --- a/tss-client-android/src/main/cpp/jniThresholdSigner.cpp +++ b/tss-client-android/src/main/cpp/jniThresholdSigner.cpp @@ -1,6 +1,3 @@ -// -// Created by grvgo on 28-07-2023. -// #include #include "include/dkls.h" #include diff --git a/tss-client-android/src/main/cpp/jniUtilities.cpp b/tss-client-android/src/main/cpp/jniUtilities.cpp index 4bbe24f..3c2abd3 100644 --- a/tss-client-android/src/main/cpp/jniUtilities.cpp +++ b/tss-client-android/src/main/cpp/jniUtilities.cpp @@ -1,6 +1,3 @@ -// -// Created by grvgo on 28-07-2023. -// #include #include "include/dkls.h" #include diff --git a/tss-client-android/src/main/java/com/web3auth/tss_client_android/dkls/DKLSComm.java b/tss-client-android/src/main/java/com/web3auth/tss_client_android/dkls/DKLSComm.java index 09e2e9d..bc6530a 100644 --- a/tss-client-android/src/main/java/com/web3auth/tss_client_android/dkls/DKLSComm.java +++ b/tss-client-android/src/main/java/com/web3auth/tss_client_android/dkls/DKLSComm.java @@ -20,6 +20,11 @@ public final class DKLSComm { @SuppressWarnings("all") private final long pointer; + @SuppressWarnings("unused") // linter cannot detect that this is called from the JNI + final long read_callback_id = 0; + @SuppressWarnings("unused") // linter cannot detect that this is called from the JNI + final long send_callback_id = 0; + @SuppressWarnings("unused") // linter cannot detect that this is called from the JNI private String readMsg(String session, byte[] index_bytes, byte[] remote_bytes, String msgType) { if ("ga1_worker_support".equals(msgType)) {