diff --git a/jni/c/headers/java/fr_acinq_secp256k1_Secp256k1CFunctions.h b/jni/c/headers/java/fr_acinq_secp256k1_Secp256k1CFunctions.h index 0aedea0..65c685b 100644 --- a/jni/c/headers/java/fr_acinq_secp256k1_Secp256k1CFunctions.h +++ b/jni/c/headers/java/fr_acinq_secp256k1_Secp256k1CFunctions.h @@ -35,6 +35,13 @@ extern "C" { #define fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_MUSIG_KEYAGG_CACHE_SIZE 197L #undef fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_MUSIG_SESSION_SIZE #define fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_MUSIG_SESSION_SIZE 133L + +#undef fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_FROST_SECRET_NONCE_SIZE +#define fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_FROST_SECRET_NONCE_SIZE 68L +#undef fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_FROST_AGGREGATE_SHARE_SIZE +#define fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_FROST_AGGREGATE_SHARE_SIZE 32L +#undef fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_FROST_SESSION_SIZE +#define fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_FROST_SESSION_SIZE 133L /* * Class: fr_acinq_secp256k1_Secp256k1CFunctions * Method: secp256k1_context_create diff --git a/jni/c/src/fr_acinq_secp256k1_Secp256k1CFunctions.c b/jni/c/src/fr_acinq_secp256k1_Secp256k1CFunctions.c index 2651ec9..1e9d1f4 100644 --- a/jni/c/src/fr_acinq_secp256k1_Secp256k1CFunctions.c +++ b/jni/c/src/fr_acinq_secp256k1_Secp256k1CFunctions.c @@ -1761,6 +1761,7 @@ JNIEXPORT jbyteArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256 int result = 0; + CHECKRESULT((*penv)->GetArrayLength(penv, jpublicKey) != 32, "public key must be 32 bytes"); pub = (*penv)->GetByteArrayElements(penv, jpublicKey, 0); result = secp256k1_xonly_pubkey_parse(ctx, &public_key, (unsigned char *)pub); (*penv)->ReleaseByteArrayElements(penv, jpublicKey, pub, 0); @@ -1958,8 +1959,7 @@ JNIEXPORT jbyteArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256 } if (jpubkey != NULL) { - size = (*penv)->GetArrayLength(penv, jpubkey); - CHECKRESULT(size != 32, "invalid xonly public key size"); + CHECKRESULT((*penv)->GetArrayLength(penv, jpubkey) != 32, "public key must be 32 bytes"); pubkey_ptr = (*penv)->GetByteArrayElements(penv, jpubkey, 0); result = secp256k1_xonly_pubkey_parse(ctx, &pubkey, (unsigned char *)pubkey_ptr); (*penv)->ReleaseByteArrayElements(penv, jpubkey, pubkey_ptr, 0); @@ -2071,6 +2071,7 @@ JNIEXPORT jbyteArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256 CHECKRESULT(size != 32, "invalid message size"); copy_bytes_from_java(penv, jmsg32, size, msg32); + CHECKRESULT((*penv)->GetArrayLength(penv, jpubkey) != 32, "public key must be 32 bytes"); pub = (*penv)->GetByteArrayElements(penv, jpubkey, 0); result = secp256k1_xonly_pubkey_parse(ctx, &public_key, (unsigned char *)pub); (*penv)->ReleaseByteArrayElements(penv, jpubkey, pub, 0); @@ -2169,17 +2170,17 @@ JNIEXPORT jbyteArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256 int result = 0; - copy_bytes_from_java(penv, jsecnonce, fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_MUSIG_SECRET_NONCE_SIZE, secnonce.data); + CHECKRESULT((*penv)->GetArrayLength(penv, jsecnonce) != fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_FROST_SECRET_NONCE_SIZE, "invalid secnonce size"); + copy_bytes_from_java(penv, jsecnonce, fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_FROST_SECRET_NONCE_SIZE, secnonce.data); - size = (*penv)->GetArrayLength(penv, jagg_share); - CHECKRESULT(size != sizeof(secp256k1_frost_share), "invalid agg_share size"); + CHECKRESULT((*penv)->GetArrayLength(penv, jagg_share) != fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_FROST_AGGREGATE_SHARE_SIZE, "invalid agg_share size"); in32 = (*penv)->GetByteArrayElements(penv, jagg_share, 0); result = secp256k1_frost_share_parse(ctx, &agg_share, (unsigned char *)in32); (*penv)->ReleaseByteArrayElements(penv, jagg_share, in32, 0); CHECKRESULT(!result, "secp256k1_frost_share_parse failed"); - CHECKRESULT((*penv)->GetArrayLength(penv, jsession) != fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_MUSIG_SESSION_SIZE, "invalid session size"); - copy_bytes_from_java(penv, jsession, fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_MUSIG_SESSION_SIZE, session.data); + CHECKRESULT((*penv)->GetArrayLength(penv, jsession) != fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_FROST_SESSION_SIZE, "invalid session size"); + copy_bytes_from_java(penv, jsession, fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_FROST_SESSION_SIZE, session.data); if (jtweak_cache != NULL) { @@ -2199,11 +2200,14 @@ JNIEXPORT jbyteArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256 ); CHECKRESULT(!result, "secp256k1_frost_partial_sign failed"); - jpsig = (*penv)->NewByteArray(penv, 32); - ptr = (*penv)->GetByteArrayElements(penv, jpsig, 0); - result = secp256k1_frost_partial_sig_serialize(ctx, (unsigned char *)ptr, &partial_sig); + unsigned char partial_sig_bytes[32]; + + result = secp256k1_frost_partial_sig_serialize(ctx, partial_sig_bytes, &partial_sig); CHECKRESULT(!result, "secp256k1_frost_partial_sig_serialize failed"); + jpsig = (*penv)->NewByteArray(penv, 32); + copy_bytes_to_java(penv, jpsig, 32, partial_sig_bytes); + return jpsig; } @@ -2364,7 +2368,7 @@ JNIEXPORT jbyteArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256 free_frost_partial_sigs(psigs, count); CHECKRESULT(!result, "secp256k1_frost_partial_sig_agg failed"); - jpsig = (*penv)->NewByteArray(penv, 64); - copy_bytes_to_java(penv, jpsig, 64, sig64); - return jpsig; + jbyteArray jsig = (*penv)->NewByteArray(penv, 64); + copy_bytes_to_java(penv, jsig, 64, sig64); + return jsig; } \ No newline at end of file diff --git a/tests/src/commonTest/kotlin/fr/acinq/secp256k1/FrostTest.kt b/tests/src/commonTest/kotlin/fr/acinq/secp256k1/FrostTest.kt index c3b0c59..7c7311f 100644 --- a/tests/src/commonTest/kotlin/fr/acinq/secp256k1/FrostTest.kt +++ b/tests/src/commonTest/kotlin/fr/acinq/secp256k1/FrostTest.kt @@ -481,7 +481,6 @@ class FrostTest: BaseTest() { signer.jsonObject["session"]!!.jsonPrimitive.content ) - val partialSignature = Secp256k1.frostPartialSign( secNonce, aggregateShare,