Improve pointer handling logic
This commit is contained in:
		
							parent
							
								
									41ddd40691
								
							
						
					
					
						commit
						32ee077995
					
				| @ -270,10 +270,10 @@ JNIEXPORT jbyteArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256 | |||||||
| /*
 | /*
 | ||||||
|  * Class:     fr_acinq_secp256k1_Secp256k1CFunctions |  * Class:     fr_acinq_secp256k1_Secp256k1CFunctions | ||||||
|  * Method:    secp256k1_frost_shares_gen |  * Method:    secp256k1_frost_shares_gen | ||||||
|  * Signature: (J[BII[[B)[[[B |  * Signature: (J[B[BII[[B)[[[B | ||||||
|  */ |  */ | ||||||
| JNIEXPORT jobjectArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256k1_1frost_1shares_1gen | JNIEXPORT jobjectArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256k1_1frost_1shares_1gen | ||||||
|   (JNIEnv *, jclass, jlong, jbyteArray, jint, jint, jobjectArray); |   (JNIEnv *, jclass, jlong, jbyteArray, jbyteArray, jint, jint, jobjectArray); | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Class:     fr_acinq_secp256k1_Secp256k1CFunctions |  * Class:     fr_acinq_secp256k1_Secp256k1CFunctions | ||||||
|  | |||||||
| @ -1354,13 +1354,14 @@ JNIEXPORT jbyteArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256 | |||||||
|  * Method:    secp256k1_frost_shares_gen |  * Method:    secp256k1_frost_shares_gen | ||||||
|  * Signature: (J[B[BII[[B)[[[B |  * Signature: (J[B[BII[[B)[[[B | ||||||
|  */ |  */ | ||||||
| JNIEXPORT jobjectArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256k1_1frost_1shares_1gen(JNIEnv *penv, jclass clazz, jlong jctx, jbyteArray jseed32, jint jthreshold, jint jn_participants, jobjectArray jids33) | JNIEXPORT jobjectArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256k1_1frost_1shares_1gen | ||||||
|  |   (JNIEnv *penv, jclass clazz, jlong jctx, jbyteArray jpok64, jbyteArray jseed32, jint jthreshold, jint jn_participants, jobjectArray jids33) | ||||||
| { | { | ||||||
|   secp256k1_context *ctx = (secp256k1_context *)jctx; |   secp256k1_context *ctx = (secp256k1_context *)jctx; | ||||||
| 
 | 
 | ||||||
|   secp256k1_frost_share *shares; |   secp256k1_frost_share *shares; | ||||||
|   secp256k1_pubkey* vss_commitment; |   secp256k1_pubkey* vss_commitment; | ||||||
|   unsigned char pok64[64]; |   jbyte* pok64; | ||||||
| 
 | 
 | ||||||
|   size_t size; |   size_t size; | ||||||
| 
 | 
 | ||||||
| @ -1388,36 +1389,40 @@ JNIEXPORT jobjectArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp2 | |||||||
| 
 | 
 | ||||||
|   size = (*penv)->GetArrayLength(penv, jids33); |   size = (*penv)->GetArrayLength(penv, jids33); | ||||||
|   CHECKRESULT(size != jn_participants, "invalid ids33 size"); |   CHECKRESULT(size != jn_participants, "invalid ids33 size"); | ||||||
|  | 
 | ||||||
|  |   CHECKRESULT((*penv)->GetArrayLength(penv, jpok64) != 64, "pok64 length must be 64 bytes"); | ||||||
|  | 
 | ||||||
|  |   shares = calloc(jn_participants, sizeof(secp256k1_frost_share*)); | ||||||
|  |   vss_commitment = calloc(jthreshold, sizeof(secp256k1_pubkey*)); | ||||||
|  | 
 | ||||||
|   for (i = 0; i < jn_participants; i++) |   for (i = 0; i < jn_participants; i++) | ||||||
|   { |   { | ||||||
|     jbyteArray id33 = (jbyteArray)(*penv)->GetObjectArrayElement(penv, jids33, i); |     jbyteArray id33 = (jbyteArray)(*penv)->GetObjectArrayElement(penv, jids33, i); | ||||||
|     // TODO: Check id33 size is 33...
 |     // TODO: Check id33 size is 33...
 | ||||||
|     ids33[i] = (*penv)->GetByteArrayElements(penv, id33, 0); |     ids33[i] = (*penv)->GetByteArrayElements(penv, id33, 0); // TODO: use setElement
 | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   int result = 0; |   int result = 0; | ||||||
| 
 | 
 | ||||||
|  |   pok64 = (*penv)->GetByteArrayElements(penv, jpok64, 0); | ||||||
|   result = secp256k1_frost_shares_gen( |   result = secp256k1_frost_shares_gen( | ||||||
|     ctx, |     ctx, | ||||||
|     shares, |     shares, | ||||||
|     vss_commitment, |     vss_commitment, | ||||||
|     pok64, |     (unsigned char *) pok64, | ||||||
|     seed32, |     seed32, | ||||||
|     jthreshold, |     jthreshold, | ||||||
|     jn_participants, |     jn_participants, | ||||||
|     ids33 |     ids33 | ||||||
|   ); |   ); | ||||||
| 
 |   (*penv)->ReleaseByteArrayElements(penv, jpok64, pok64, 0); | ||||||
|   (*penv)->ReleaseByteArrayElements(penv, jseed32, seed32, 0); |  | ||||||
|   CHECKRESULT(!result, "secp256k1_frost_shares_gen failed"); |   CHECKRESULT(!result, "secp256k1_frost_shares_gen failed"); | ||||||
| 
 | 
 | ||||||
|   jbyte* jpok64; |   jobjectArray output = (*penv)->NewObjectArray(penv, 2, jobjectArray, NULL); | ||||||
| 
 |  | ||||||
|   jobjectArray output = (*penv)->NewObjectArray(penv, 3, jobjectArray, NULL); |  | ||||||
| 
 | 
 | ||||||
|   output[0] = (*penv)->NewObjectArray(penv, jn_participants, jbyteArray, NULL); |   output[0] = (*penv)->NewObjectArray(penv, jn_participants, jbyteArray, NULL); | ||||||
|  | 
 | ||||||
|   output[1] = (*penv)->NewObjectArray(penv, jthreshold, jbyteArray, NULL); |   output[1] = (*penv)->NewObjectArray(penv, jthreshold, jbyteArray, NULL); | ||||||
|   output[2] = (*penv)->NewObjectArray(penv, 1, jbyteArray, NULL); |  | ||||||
| 
 | 
 | ||||||
|   // TODO: Copy over the required data...
 |   // TODO: Copy over the required data...
 | ||||||
|   return output; |   return output; | ||||||
| @ -1576,22 +1581,20 @@ JNIEXPORT jint JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256k1_1fr | |||||||
| 
 | 
 | ||||||
|   CHECKRESULT(jthreshold <= 0, "threshold can't be 0"); |   CHECKRESULT(jthreshold <= 0, "threshold can't be 0"); | ||||||
| 
 | 
 | ||||||
|   share = calloc(1, sizeof(secp256k1_frost_share)); |  | ||||||
|   size = (*penv)->GetArrayLength(penv, jshare); |   size = (*penv)->GetArrayLength(penv, jshare); | ||||||
|   CHECKRESULT1(size != sizeof(secp256k1_frost_share), "invalid share size", free(&share)); |   CHECKRESULT1(size != sizeof(secp256k1_frost_share), "invalid share size", free(&share)); | ||||||
|   in32 = (*penv)->GetByteArrayElements(penv, jshare, 0); |   in32 = (*penv)->GetByteArrayElements(penv, jshare, 0); | ||||||
|   result = secp256k1_frost_share_parse(ctx, share, (unsigned char *)in32); |   result = secp256k1_frost_share_parse(ctx, &share, (unsigned char *)in32); | ||||||
|   (*penv)->ReleaseByteArrayElements(penv, jshare, in32, 0); |   (*penv)->ReleaseByteArrayElements(penv, jshare, in32, 0); | ||||||
|   CHECKRESULT1(!result, "secp256k1_frost_share_parse failed", free(&share)); |   CHECKRESULT1(!result, "secp256k1_frost_share_parse failed", free(&share)); | ||||||
| 
 | 
 | ||||||
|   id33 = (*penv)->GetByteArrayElements(penv, jid33, 0); |   id33 = (*penv)->GetByteArrayElements(penv, jid33, 0); | ||||||
| 
 | 
 | ||||||
|   vss_commitment = calloc(1, sizeof(secp256k1_pubkey)); |  | ||||||
|   jpub = (jbyteArray)(*penv)->GetObjectArrayElement(penv, jvss_commitment, i); |   jpub = (jbyteArray)(*penv)->GetObjectArrayElement(penv, jvss_commitment, i); | ||||||
|   size = (*penv)->GetArrayLength(penv, jpub); |   size = (*penv)->GetArrayLength(penv, jpub); | ||||||
|   CHECKRESULT1((size != 33) && (size != 65), "invalid public key size", free_pubkeys(pubkeys, count)); |   CHECKRESULT1((size != 33) && (size != 65), "invalid public key size", free_pubkeys(pubkeys, count)); | ||||||
|   jpub = (*penv)->GetByteArrayElements(penv, jpub, 0); |   jpub = (*penv)->GetByteArrayElements(penv, jpub, 0); | ||||||
|   result = secp256k1_ec_pubkey_parse(ctx, vss_commitment, (unsigned char *)jpub, size); |   result = secp256k1_ec_pubkey_parse(ctx, &vss_commitment, (unsigned char *)jpub, size); | ||||||
|   (*penv)->ReleaseByteArrayElements(penv, jpub, jpub, 0); |   (*penv)->ReleaseByteArrayElements(penv, jpub, jpub, 0); | ||||||
|   CHECKRESULT1(!result, "secp256k1_ec_pubkey_parse failed", free(vss_commitment)); |   CHECKRESULT1(!result, "secp256k1_ec_pubkey_parse failed", free(vss_commitment)); | ||||||
| 
 | 
 | ||||||
| @ -1876,11 +1879,10 @@ JNIEXPORT jbyteArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256 | |||||||
|   copy_bytes_from_java(penv, jsession_id32, size, session_id32); |   copy_bytes_from_java(penv, jsession_id32, size, session_id32); | ||||||
| 
 | 
 | ||||||
|   if (jshare != NULL) { |   if (jshare != NULL) { | ||||||
|     share = calloc(1, sizeof(secp256k1_frost_share)); |  | ||||||
|     size = (*penv)->GetArrayLength(penv, jshare); |     size = (*penv)->GetArrayLength(penv, jshare); | ||||||
|     //      TODO:  CHECKRESULT1(size != fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_MUSIG_PUBLIC_NONCE_SIZE, "invalid public nonce size", free_nonces(pubnonces, count));
 |     //      TODO:  CHECKRESULT1(size != fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_MUSIG_PUBLIC_NONCE_SIZE, "invalid public nonce size", free_nonces(pubnonces, count));
 | ||||||
|     in32 = (*penv)->GetByteArrayElements(penv, jshare, 0); |     in32 = (*penv)->GetByteArrayElements(penv, jshare, 0); | ||||||
|     result = secp256k1_frost_share_parse(ctx, share, (unsigned char *)in32); |     result = secp256k1_frost_share_parse(ctx, &share, (unsigned char *)in32); | ||||||
|     (*penv)->ReleaseByteArrayElements(penv, jshare, in32, 0); |     (*penv)->ReleaseByteArrayElements(penv, jshare, in32, 0); | ||||||
|     //  TODO: CHECKRESULT1(!result, "secp256k1_frost_share_parse failed", free_shares(shares, count));
 |     //  TODO: CHECKRESULT1(!result, "secp256k1_frost_share_parse failed", free_shares(shares, count));
 | ||||||
| 
 | 
 | ||||||
| @ -2096,13 +2098,12 @@ JNIEXPORT jbyteArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256 | |||||||
| 
 | 
 | ||||||
|   copy_bytes_from_java(penv, jsecnonce, fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_MUSIG_SECRET_NONCE_SIZE, secnonce.data); |   copy_bytes_from_java(penv, jsecnonce, fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_MUSIG_SECRET_NONCE_SIZE, secnonce.data); | ||||||
| 
 | 
 | ||||||
|   agg_share = calloc(1, sizeof(secp256k1_frost_share)); |  | ||||||
|   size = (*penv)->GetArrayLength(penv, jagg_share); |   size = (*penv)->GetArrayLength(penv, jagg_share); | ||||||
|   CHECKRESULT1(size != sizeof(secp256k1_frost_share), "invalid agg_share size", free_shares(shares, count)); |   CHECKRESULT(size != sizeof(secp256k1_frost_share), "invalid agg_share size"); | ||||||
|   in32 = (*penv)->GetByteArrayElements(penv, jagg_share, 0); |   in32 = (*penv)->GetByteArrayElements(penv, jagg_share, 0); | ||||||
|   result = secp256k1_frost_share_parse(ctx, agg_share, (unsigned char *)in32); |   result = secp256k1_frost_share_parse(ctx, &agg_share, (unsigned char *)in32); | ||||||
|   (*penv)->ReleaseByteArrayElements(penv, jagg_share, in32, 0); |   (*penv)->ReleaseByteArrayElements(penv, jagg_share, in32, 0); | ||||||
|   CHECKRESULT1(!result, "secp256k1_frost_share_parse failed", free_shares(shares, count)); |   CHECKRESULT(!result, "secp256k1_frost_share_parse failed"); | ||||||
| 
 | 
 | ||||||
|   CHECKRESULT((*penv)->GetArrayLength(penv, jsession) != fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_MUSIG_SESSION_SIZE, "invalid session size"); |   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); |   copy_bytes_from_java(penv, jsession, fr_acinq_secp256k1_Secp256k1CFunctions_SECP256K1_MUSIG_SESSION_SIZE, session.data); | ||||||
|  | |||||||
| @ -134,7 +134,7 @@ public class Secp256k1CFunctions { | |||||||
|      *      [1] vss_commitment: pointer to the VSS commitment |      *      [1] vss_commitment: pointer to the VSS commitment | ||||||
|      *      [2] pok64: pointer to the proof of knowledge |      *      [2] pok64: pointer to the proof of knowledge | ||||||
|      */ |      */ | ||||||
|     public static native byte[][][] secp256k1_frost_shares_gen(long ctx, byte[] seed32, int threshold, int total_signers, byte[][] ids33); |     public static native byte[][][] secp256k1_frost_shares_gen(long ctx, byte[] pok64, byte[] seed32, int threshold, int total_signers, byte[][] ids33); | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      *  Aggregates shares |      *  Aggregates shares | ||||||
|  | |||||||
| @ -135,8 +135,11 @@ public object NativeSecp256k1 : Secp256k1 { | |||||||
|         totalSigners: Int, |         totalSigners: Int, | ||||||
|         ids33: Array<ByteArray> |         ids33: Array<ByteArray> | ||||||
|     ): Triple<Array<ByteArray>, Array<ByteArray>, ByteArray> { |     ): Triple<Array<ByteArray>, Array<ByteArray>, ByteArray> { | ||||||
|  |         val pok64 = ByteArray(64) | ||||||
|  | 
 | ||||||
|         val result = Secp256k1CFunctions.secp256k1_frost_shares_gen( |         val result = Secp256k1CFunctions.secp256k1_frost_shares_gen( | ||||||
|             Secp256k1Context.getContext(), |             Secp256k1Context.getContext(), | ||||||
|  |             pok64, | ||||||
|             seed32, |             seed32, | ||||||
|             threshold, |             threshold, | ||||||
|             totalSigners, |             totalSigners, | ||||||
| @ -146,7 +149,7 @@ public object NativeSecp256k1 : Secp256k1 { | |||||||
|         return Triple( |         return Triple( | ||||||
|             result[0], |             result[0], | ||||||
|             result[1], |             result[1], | ||||||
|             result[2].first() // This is bad code... |             pok64 | ||||||
|         ) |         ) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user