diff --git a/build.gradle.kts b/build.gradle.kts index 3a4e5cb..6eef144 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -24,7 +24,7 @@ buildscript { allprojects { group = "fr.acinq.secp256k1" - version = "0.2.0-1.4-M3" + version = "0.2.1-1.4-M3" repositories { jcenter() diff --git a/src/nativeMain/kotlin/fr/acinq/secp256k1/Secp256k1Native.kt b/src/nativeMain/kotlin/fr/acinq/secp256k1/Secp256k1Native.kt index 95bc3cc..1e2b95f 100644 --- a/src/nativeMain/kotlin/fr/acinq/secp256k1/Secp256k1Native.kt +++ b/src/nativeMain/kotlin/fr/acinq/secp256k1/Secp256k1Native.kt @@ -18,10 +18,10 @@ public object Secp256k1Native : Secp256k1 { val sig = alloc() val nativeBytes = toNat(input) - val result = when (input.size) { - 64 -> secp256k1_ecdsa_signature_parse_compact(ctx, sig.ptr, nativeBytes) - in 70..73 -> secp256k1_ecdsa_signature_parse_der(ctx, sig.ptr, nativeBytes, input.size.convert()) - else -> throw Secp256k1Exception("Unknown signature format") + val result = when { + input.size == 64 -> secp256k1_ecdsa_signature_parse_compact(ctx, sig.ptr, nativeBytes) + input.size < 64 -> throw Secp256k1Exception("Unknown signature format") + else -> secp256k1_ecdsa_signature_parse_der(ctx, sig.ptr, nativeBytes, input.size.convert()) } result.requireSuccess("cannot parse signature (size = ${input.size} sig = ${Hex.encode(input)}") return sig diff --git a/tests/src/commonTest/kotlin/fr/acinq/secp256k1/Secp256k1Test.kt b/tests/src/commonTest/kotlin/fr/acinq/secp256k1/Secp256k1Test.kt index 884c7ab..2bdb3ef 100644 --- a/tests/src/commonTest/kotlin/fr/acinq/secp256k1/Secp256k1Test.kt +++ b/tests/src/commonTest/kotlin/fr/acinq/secp256k1/Secp256k1Test.kt @@ -1,5 +1,6 @@ package fr.acinq.secp256k1 +import kotlin.random.Random import kotlin.test.* @@ -265,4 +266,24 @@ class Secp256k1Test { Hex.encode(der).toUpperCase(), ) } + + @Test + fun testFormatConversion() { + val random = Random.Default + + fun randomBytes(length: Int): ByteArray { + val buffer = ByteArray(length) + random.nextBytes(buffer) + return buffer + } + + repeat(200) { + val priv = randomBytes(32) + val pub = Secp256k1.pubkeyCreate(priv) + val data = randomBytes(32) + val sig = Secp256k1.sign(data, priv) + val der = Secp256k1.compact2der(sig) + Secp256k1.verify(der, data, pub) + } + } }