Add compact2der() method
This commit is contained in:
		
							parent
							
								
									244673b04c
								
							
						
					
					
						commit
						08d1692932
					
				| @ -151,6 +151,14 @@ JNIEXPORT jbyteArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256 | ||||
| JNIEXPORT jbyteArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256k1_1ecdsa_1recover | ||||
|   (JNIEnv *, jclass, jlong, jbyteArray, jbyteArray, jint); | ||||
| 
 | ||||
| /*
 | ||||
|  * Class:     fr_acinq_secp256k1_Secp256k1CFunctions | ||||
|  * Method:    secp256k1_compact_to_der | ||||
|  * Signature: (J[B)[B | ||||
|  */ | ||||
| JNIEXPORT jbyteArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256k1_1compact_1to_1der | ||||
|   (JNIEnv *, jclass, jlong, jbyteArray); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| @ -687,3 +687,38 @@ JNIEXPORT jbyteArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256 | ||||
|     CHECKRESULT(!result, "secp256k1_ec_pubkey_serialize failed"); | ||||
|     return jpubkey; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Class:     fr_acinq_secp256k1_Secp256k1CFunctions | ||||
|  * Method:    secp256k1_compact_to_der | ||||
|  * Signature: (J[B)[B | ||||
|  */ | ||||
| JNIEXPORT jbyteArray JNICALL Java_fr_acinq_secp256k1_Secp256k1CFunctions_secp256k1_1compact_1to_1der | ||||
|   (JNIEnv *penv, jclass clazz, jlong jctx, jbyteArray jsig) | ||||
| { | ||||
|     secp256k1_context* ctx = (secp256k1_context *)jctx; | ||||
|     jbyte *sig; | ||||
|     secp256k1_ecdsa_signature signature;; | ||||
|     unsigned char der[73]; | ||||
|     size_t size; | ||||
|     int result = 0; | ||||
| 
 | ||||
|     if (jctx == 0) return 0; | ||||
|     if (jsig == NULL) return 0; | ||||
|     CHECKRESULT((*penv)->GetArrayLength(penv, jsig) != 64, "invalid signature size"); | ||||
| 
 | ||||
|     size = (*penv)->GetArrayLength(penv, jsig); | ||||
|     sig = (*penv)->GetByteArrayElements(penv, jsig, 0); | ||||
|     result = secp256k1_ecdsa_signature_parse_compact(ctx, &signature, (unsigned char*)sig); | ||||
|     (*penv)->ReleaseByteArrayElements(penv, jsig, sig, 0); | ||||
|     CHECKRESULT(!result, "secp256k1_ecdsa_signature_parse_compact failed"); | ||||
| 
 | ||||
|     size = 73; | ||||
|     result = secp256k1_ecdsa_signature_serialize_der(ctx, der, &size, &signature); | ||||
|     CHECKRESULT(!result, "secp256k1_ecdsa_signature_serialize_der failed"); | ||||
|     jsig = (*penv)->NewByteArray(penv, size); | ||||
|     sig = (*penv)->GetByteArrayElements(penv, jsig, 0); | ||||
|     memcpy(sig, der, size); | ||||
|     (*penv)->ReleaseByteArrayElements(penv, jsig, sig, 0); | ||||
|     return jsig; | ||||
| } | ||||
|  | ||||
| @ -64,4 +64,6 @@ public class Secp256k1CFunctions { | ||||
|     public static native byte[] secp256k1_ecdh(long ctx, byte[] seckey, byte[] pubkey); | ||||
| 
 | ||||
|     public static native byte[] secp256k1_ecdsa_recover(long ctx, byte[] sig, byte[] msg32, int recid); | ||||
| 
 | ||||
|     public static native byte[] secp256k1_compact_to_der(long ctx, byte[] sig); | ||||
| } | ||||
|  | ||||
| @ -83,4 +83,8 @@ public object NativeSecp256k1 : Secp256k1 { | ||||
|     override fun ecdsaRecover(sig: ByteArray, message: ByteArray, recid: Int): ByteArray { | ||||
|         return Secp256k1CFunctions.secp256k1_ecdsa_recover(Secp256k1Context.getContext(), sig, message, recid) | ||||
|     } | ||||
| 
 | ||||
|     override fun compact2der(sig: ByteArray): ByteArray { | ||||
|         return Secp256k1CFunctions.secp256k1_compact_to_der(Secp256k1Context.getContext(), sig) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -52,6 +52,8 @@ public interface Secp256k1 { | ||||
| 
 | ||||
|     public fun ecdsaRecover(sig: ByteArray, message: ByteArray, recid: Int): ByteArray | ||||
| 
 | ||||
|     public fun compact2der(sig: ByteArray): ByteArray | ||||
| 
 | ||||
|     public fun pubKeyCompress(pubkey: ByteArray) : ByteArray { | ||||
|         return when { | ||||
|             pubkey.size == 33 && (pubkey[0] == 2.toByte() || pubkey[0] == 3.toByte()) -> pubkey | ||||
|  | ||||
| @ -215,6 +215,18 @@ public object Secp256k1Native : Secp256k1 { | ||||
|             return serializePubkey(pubkey) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public override fun compact2der(sig: ByteArray): ByteArray { | ||||
|         require(sig.size == 64) | ||||
|         memScoped { | ||||
|             val nSig = allocSignature(sig) | ||||
|             val natOutput = allocArray<UByteVar>(73) | ||||
|             val len = alloc<size_tVar>() | ||||
|             len.value = 73.convert() | ||||
|             secp256k1_ecdsa_signature_serialize_der(ctx, natOutput, len.ptr, nSig.ptr).requireSuccess("secp256k1_ecdsa_signature_serialize_der() failed") | ||||
|             return natOutput.readBytes(len.value.toInt()) | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| internal actual fun getSecpk256k1(): Secp256k1 = Secp256k1Native | ||||
|  | ||||
| @ -255,4 +255,14 @@ class Secp256k1Test { | ||||
|         val pub1: ByteArray = Secp256k1.ecdsaRecover(sig, data, 1) | ||||
|         assertTrue(pub.contentEquals(pub0) || pub.contentEquals(pub1), "testEcdsaRecover") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun testCompactToDER() { | ||||
|         val sig: ByteArray = Hex.decode("182A108E1448DC8F1FB467D06A0F3BB8EA0533584CB954EF8DA112F1D60E39A21C66F36DA211C087F3AF88B50EDF4F9BDAA6CF5FD6817E74DCA34DB12390C6E9".toLowerCase()) //sha256hash of "testing" | ||||
|         val der: ByteArray = Secp256k1.compact2der(sig) | ||||
|         assertEquals( | ||||
|             "30440220182A108E1448DC8F1FB467D06A0F3BB8EA0533584CB954EF8DA112F1D60E39A202201C66F36DA211C087F3AF88B50EDF4F9BDAA6CF5FD6817E74DCA34DB12390C6E9", | ||||
|             Hex.encode(der).toUpperCase(), | ||||
|         ) | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user