Skip to content

Commit 08f8516

Browse files
elribonazohamada147
andcommitted
fix: Invalid signature integer: negative on JS platform (#158)
Signed-off-by: Francisco Javier Ribó Labrador <[email protected]> Co-authored-by: Ahmed Moussa <[email protected]>
1 parent 8180fa8 commit 08f8516

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

apollo/src/jsMain/kotlin/io/iohk/atala/prism/apollo/secp256k1/Secp256k1Lib.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,11 @@ actual class Secp256k1Lib actual constructor() {
6767
} catch (e: dynamic) {
6868
secp256k1.Signature.fromCompact(jsSignatureByteArray)
6969
}
70-
return signature.normalizeS()
70+
return if (signature.hasHighS()) {
71+
signature.normalizeS()
72+
} else {
73+
signature
74+
}
7175
}
7276

7377
/**
@@ -88,8 +92,12 @@ actual class Secp256k1Lib actual constructor() {
8892
if (secp256k1.verify(normalised, sha.asUint8Array(), publicKey.asUint8Array(), {})) {
8993
return true
9094
}
91-
val transcoded = transcodeSignatureToBitcoin(normalised.toCompactRawBytes().asByteArray())
92-
return secp256k1.verify(transcoded, sha.asUint8Array(), publicKey.asUint8Array(), {})
95+
return try {
96+
val transcoded = transcodeSignatureToBitcoin(normalised.toCompactRawBytes().asByteArray())
97+
secp256k1.verify(transcoded, sha.asUint8Array(), publicKey.asUint8Array(), {})
98+
} catch (e: dynamic) {
99+
secp256k1.verify(normalised, sha.asUint8Array(), publicKey.asUint8Array(), {})
100+
}
93101
}
94102

95103
private fun transcodeSignatureToBitcoin(signature: ByteArray): SignatureType {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package io.iohk.atala.prism.apollo.utils
2+
3+
import io.iohk.atala.prism.apollo.derivation.Mnemonic
4+
import kotlin.test.Test
5+
import kotlin.test.assertEquals
6+
7+
class Secp256k1LibTestJS {
8+
9+
@Test
10+
fun testCreateApolloSignatureAndVerify() {
11+
val mnemonics = Mnemonic.Companion.createRandomMnemonics()
12+
val seed = Mnemonic.Companion.createSeed(mnemonics)
13+
val secret = seed.slice(0..31).toTypedArray()
14+
val sk = KMMECSecp256k1PrivateKey.Companion.secp256k1FromByteArray(secret.toByteArray())
15+
val pk = sk.getPublicKey()
16+
val data = "Data 0002".encodeToByteArray()
17+
val signature = sk.sign(data)
18+
val verified = pk.verify(signature, data)
19+
assertEquals(
20+
verified,
21+
true
22+
)
23+
}
24+
}

0 commit comments

Comments
 (0)