diff --git a/.gitleaksignore b/.gitleaksignore
index e0ef118e3..0d4463d73 100644
--- a/.gitleaksignore
+++ b/.gitleaksignore
@@ -13,3 +13,6 @@ a3cb543f5569a83597a4fcada367914beb55ed70:base-asymmetric-encryption/src/commonTe
c8e0b0e540e5b35e2b87be63d3866895afc2e709:base-asymmetric-encryption/src/commonMain/kotlin/io/iohk/atala/prism/apollo/utils/KMMECSecp256k1KeyPair.kt:generic-api-key:4
c8e0b0e540e5b35e2b87be63d3866895afc2e709:ecdsa/src/commonTest/kotlin/io/iohk/atala/prism/apollo/ecdsa/KMMECDSATests.kt:generic-api-key:125
4227c2c7612f2f209438746185751419f9e52efc:base-asymmetric-encryption/src/commonMain/kotlin/io/iohk/atala/prism/apollo/utils/KMMX25519KeyPair.kt:generic-api-key:4
+cdc2fd1aed19fe56bf1c0bf08c8cbb5f34a2f344:base-asymmetric-encryption/src/commonTest/kotlin/io/iohk/atala/prism/apollo/utils/GenerateECKeyPairTests.kt:generic-api-key:58
+cdc2fd1aed19fe56bf1c0bf08c8cbb5f34a2f344:base-asymmetric-encryption/src/commonTest/kotlin/io/iohk/atala/prism/apollo/utils/Secp256k1LibTests.kt:generic-api-key:34
+cdc2fd1aed19fe56bf1c0bf08c8cbb5f34a2f344:base-asymmetric-encryption/src/commonTest/kotlin/io/iohk/atala/prism/apollo/utils/Secp256k1LibTests.kt:generic-api-key:43
diff --git a/base-asymmetric-encryption/build.gradle.kts b/base-asymmetric-encryption/build.gradle.kts
index 9f94a2a46..1612012e9 100644
--- a/base-asymmetric-encryption/build.gradle.kts
+++ b/base-asymmetric-encryption/build.gradle.kts
@@ -134,6 +134,7 @@ kotlin {
val commonTest by getting {
dependencies {
implementation(kotlin("test"))
+ implementation(project(":base64"))
}
}
val jvmMain by getting {
@@ -160,8 +161,7 @@ kotlin {
dependencies {
implementation(npm("elliptic", "6.5.4"))
implementation(npm("@types/elliptic", "6.4.14"))
- implementation(npm("bip32", "2.0.6"))
- implementation(npm("bip39", "3.0.4"))
+ implementation(npm("@noble/secp256k1", "2.0.0"))
// Polyfill dependencies
implementation(npm("stream-browserify", "3.0.0"))
diff --git a/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/secp256k1/secp256k1js.kt b/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/secp256k1/secp256k1js.kt
new file mode 100644
index 000000000..a148d28ff
--- /dev/null
+++ b/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/secp256k1/secp256k1js.kt
@@ -0,0 +1,252 @@
+// Automatically generated by dukat and then slightly adjusted manually to make it compile
+@file:Suppress("ktlint")
+// @file:Suppress("INTERFACE_WITH_SUPERCLASS", "OVERRIDING_FINAL_MEMBER", "RETURN_TYPE_MISMATCH_ON_OVERRIDE", "CONFLICTING_OVERLOADS")
+@file:JsModule("@noble/secp256k1")
+/* ktlint-disable */
+package io.iohk.atala.prism.apollo.utils.external.secp256k1
+
+import kotlin.js.*
+import org.khronos.webgl.*
+import org.w3c.dom.*
+import org.w3c.dom.events.*
+import org.w3c.dom.parsing.*
+import org.w3c.dom.svg.*
+import org.w3c.dom.url.*
+import org.w3c.fetch.*
+import org.w3c.files.*
+import org.w3c.notifications.*
+import org.w3c.performance.*
+import org.w3c.workers.*
+import org.w3c.xhr.*
+import org.khronos.webgl.Uint8Array
+
+external object CURVE {
+ var p: Any
+ var n: Any
+ var a: Any
+ var b: Any
+ var Gx: Any
+ var Gy: Any
+}
+
+external interface AffinePoint {
+ var x: Any
+ var y: Any
+}
+
+external open class Point(px: Any, py: Any, pz: Any) {
+ open var px: Any
+ open var py: Any
+ open var pz: Any
+ open fun equals(other: Point): Boolean
+ open fun negate(): Point
+ open fun double(): Point
+ open fun add(other: Point): Point
+ open fun mul(n: Any, safe: Boolean = definedExternally): Point
+ open fun mulAddQUns(R: Point, u1: Any, u2: Any): Point
+ open fun toAffine(): AffinePoint
+ open fun assertValidity(): Point
+ open fun multiply(n: Any): Point
+ open fun aff(): AffinePoint
+ open fun ok(): Point
+ open fun toHex(isCompressed: Boolean = definedExternally): String
+ open fun toRawBytes(isCompressed: Boolean = definedExternally): Uint8Array
+
+ companion object {
+ var BASE: Point
+ var ZERO: Point
+ fun fromAffine(p: AffinePoint): Point
+ fun fromHex(hex: Uint8Array): Point
+ fun fromHex(hex: String): Point
+ fun fromPrivateKey(k: Uint8Array): Point
+ fun fromPrivateKey(k: String): Point
+ fun fromPrivateKey(k: Any): Point
+ }
+}
+
+external fun getPublicKey(privKey: Uint8Array, isCompressed: Boolean = definedExternally): Uint8Array
+
+external fun getPublicKey(privKey: Uint8Array): Uint8Array
+
+external fun getPublicKey(privKey: String, isCompressed: Boolean = definedExternally): Uint8Array
+
+external fun getPublicKey(privKey: String): Uint8Array
+
+external fun getPublicKey(privKey: Any, isCompressed: Boolean = definedExternally): Uint8Array
+
+external fun getPublicKey(privKey: Any): Uint8Array
+
+external open class Signature(r: Any, s: Any, recovery: Number? = definedExternally) {
+ open var r: Any
+ open var s: Any
+ open var recovery: Number?
+ open fun assertValidity(): Signature /* this */
+ open fun addRecoveryBit(rec: Number): Signature /* Signature & `T$2` */
+ open fun hasHighS(): Boolean
+ open fun recoverPublicKey(msgh: Uint8Array): Point
+ open fun recoverPublicKey(msgh: String): Point
+ open fun toCompactRawBytes(): Uint8Array
+ open fun toCompactHex(): String
+
+ companion object {
+ fun fromCompact(hex: Uint8Array): Signature
+ fun fromCompact(hex: String): Signature
+ }
+}
+
+external interface `T$0` {
+ var lowS: Boolean?
+ get() = definedExternally
+ set(value) = definedExternally
+ var extraEntropy: dynamic /* Boolean? | Uint8Array? | String? */
+ get() = definedExternally
+ set(value) = definedExternally
+}
+
+external fun signAsync(msgh: Uint8Array, priv: Uint8Array, opts: `T$0` = definedExternally): Promise
+
+external fun signAsync(msgh: Uint8Array, priv: Uint8Array): Promise
+
+external fun signAsync(msgh: Uint8Array, priv: String, opts: `T$0` = definedExternally): Promise
+
+external fun signAsync(msgh: Uint8Array, priv: String): Promise
+
+external fun signAsync(msgh: Uint8Array, priv: Any, opts: `T$0` = definedExternally): Promise
+
+external fun signAsync(msgh: Uint8Array, priv: Any): Promise
+
+external fun signAsync(msgh: String, priv: Uint8Array, opts: `T$0` = definedExternally): Promise
+
+external fun signAsync(msgh: String, priv: Uint8Array): Promise
+
+external fun signAsync(msgh: String, priv: String, opts: `T$0` = definedExternally): Promise
+
+external fun signAsync(msgh: String, priv: String): Promise
+
+external fun signAsync(msgh: String, priv: Any, opts: `T$0` = definedExternally): Promise
+
+external fun signAsync(msgh: String, priv: Any): Promise
+
+external fun sign(msgh: Uint8Array, priv: Uint8Array, opts: `T$0` = definedExternally): Signature /* Signature & `T$2` */
+
+external fun sign(msgh: Uint8Array, priv: Uint8Array): Signature /* Signature & `T$2` */
+
+external fun sign(msgh: Uint8Array, priv: String, opts: `T$0` = definedExternally): Signature /* Signature & `T$2` */
+
+external fun sign(msgh: Uint8Array, priv: String): Signature /* Signature & `T$2` */
+
+external fun sign(msgh: Uint8Array, priv: Any, opts: `T$0` = definedExternally): Signature /* Signature & `T$2` */
+
+external fun sign(msgh: Uint8Array, priv: Any): Signature /* Signature & `T$2` */
+
+external fun sign(msgh: String, priv: Uint8Array, opts: `T$0` = definedExternally): Signature /* Signature & `T$2` */
+
+external fun sign(msgh: String, priv: Uint8Array): Signature /* Signature & `T$2` */
+
+external fun sign(msgh: String, priv: String, opts: `T$0` = definedExternally): Signature /* Signature & `T$2` */
+
+external fun sign(msgh: String, priv: String): Signature /* Signature & `T$2` */
+
+external fun sign(msgh: String, priv: Any, opts: `T$0` = definedExternally): Signature /* Signature & `T$2` */
+
+external fun sign(msgh: String, priv: Any): Signature /* Signature & `T$2` */
+
+external interface SigLike {
+ var r: Any
+ var s: Any
+}
+
+external interface `T$1` {
+ var lowS: Boolean?
+ get() = definedExternally
+ set(value) = definedExternally
+}
+
+external fun verify(sig: Uint8Array, msgh: Uint8Array, pub: Uint8Array, opts: `T$1` = definedExternally): Boolean
+
+external fun verify(sig: Uint8Array, msgh: Uint8Array, pub: Uint8Array): Boolean
+
+external fun verify(sig: Uint8Array, msgh: Uint8Array, pub: String, opts: `T$1` = definedExternally): Boolean
+
+external fun verify(sig: Uint8Array, msgh: Uint8Array, pub: String): Boolean
+
+external fun verify(sig: Uint8Array, msgh: String, pub: Uint8Array, opts: `T$1` = definedExternally): Boolean
+
+external fun verify(sig: Uint8Array, msgh: String, pub: Uint8Array): Boolean
+
+external fun verify(sig: Uint8Array, msgh: String, pub: String, opts: `T$1` = definedExternally): Boolean
+
+external fun verify(sig: Uint8Array, msgh: String, pub: String): Boolean
+
+external fun verify(sig: String, msgh: Uint8Array, pub: Uint8Array, opts: `T$1` = definedExternally): Boolean
+
+external fun verify(sig: String, msgh: Uint8Array, pub: Uint8Array): Boolean
+
+external fun verify(sig: String, msgh: Uint8Array, pub: String, opts: `T$1` = definedExternally): Boolean
+
+external fun verify(sig: String, msgh: Uint8Array, pub: String): Boolean
+
+external fun verify(sig: String, msgh: String, pub: Uint8Array, opts: `T$1` = definedExternally): Boolean
+
+external fun verify(sig: String, msgh: String, pub: Uint8Array): Boolean
+
+external fun verify(sig: String, msgh: String, pub: String, opts: `T$1` = definedExternally): Boolean
+
+external fun verify(sig: String, msgh: String, pub: String): Boolean
+
+external fun verify(sig: SigLike, msgh: Uint8Array, pub: Uint8Array, opts: `T$1` = definedExternally): Boolean
+
+external fun verify(sig: SigLike, msgh: Uint8Array, pub: Uint8Array): Boolean
+
+external fun verify(sig: SigLike, msgh: Uint8Array, pub: String, opts: `T$1` = definedExternally): Boolean
+
+external fun verify(sig: SigLike, msgh: Uint8Array, pub: String): Boolean
+
+external fun verify(sig: SigLike, msgh: String, pub: Uint8Array, opts: `T$1` = definedExternally): Boolean
+
+external fun verify(sig: SigLike, msgh: String, pub: Uint8Array): Boolean
+
+external fun verify(sig: SigLike, msgh: String, pub: String, opts: `T$1` = definedExternally): Boolean
+
+external fun verify(sig: SigLike, msgh: String, pub: String): Boolean
+
+external fun getSharedSecret(privA: Uint8Array, pubB: Uint8Array, isCompressed: Boolean = definedExternally): Uint8Array
+
+external fun getSharedSecret(privA: Uint8Array, pubB: Uint8Array): Uint8Array
+
+external fun getSharedSecret(privA: Uint8Array, pubB: String, isCompressed: Boolean = definedExternally): Uint8Array
+
+external fun getSharedSecret(privA: Uint8Array, pubB: String): Uint8Array
+
+external fun getSharedSecret(privA: String, pubB: Uint8Array, isCompressed: Boolean = definedExternally): Uint8Array
+
+external fun getSharedSecret(privA: String, pubB: Uint8Array): Uint8Array
+
+external fun getSharedSecret(privA: String, pubB: String, isCompressed: Boolean = definedExternally): Uint8Array
+
+external fun getSharedSecret(privA: String, pubB: String): Uint8Array
+
+external fun hashToPrivateKey(hash: Uint8Array): Uint8Array
+
+external fun hashToPrivateKey(hash: String): Uint8Array
+
+external object etc {
+ var hexToBytes: (hex: String) -> Uint8Array
+ var bytesToHex: (b: Uint8Array) -> String
+ var concatBytes: (arrs: Uint8Array) -> Uint8Array
+ var bytesToNumberBE: (b: Uint8Array) -> Any
+ var numberToBytesBE: (num: Any) -> Uint8Array
+ var mod: (a: Any, b: Any) -> Any
+ var invert: (num: Any, md: Any) -> Any
+ var hmacSha256Async: (key: Uint8Array, msgs: Uint8Array) -> Promise
+ var hmacSha256Sync: ((key: Uint8Array, msgs: Uint8Array) -> Uint8Array)?
+ var hashToPrivateKey: Any
+ var randomBytes: (len: Number) -> Uint8Array
+}
+
+external object utils {
+ var normPrivateKeyToScalar: (p: dynamic /* Uint8Array | String | Any */) -> Any
+ var isValidPrivateKey: (key: dynamic /* Uint8Array | String */) -> Boolean
+ var randomPrivateKey: () -> Uint8Array
+ fun precompute(w: Number = definedExternally, p: Point = definedExternally): Point
+}
\ No newline at end of file
diff --git a/build.gradle.kts b/build.gradle.kts
index 3ef0f224f..73c4dd7c9 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -66,6 +66,7 @@ subprojects {
"/github/workspace/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/Curve.kt",
"/github/workspace/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/PresetCurve.kt",
"/github/workspace/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/Ellipticjs.kt",
+ "./github/workspace/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/secp256k1js.kt",
"github/workspace/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/**",
"github/workspace/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/*",
@@ -73,16 +74,18 @@ subprojects {
"github/workspace/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/Curve.kt",
"github/workspace/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/PresetCurve.kt",
"github/workspace/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/Ellipticjs.kt",
+ "./github/workspace/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/secp256k1js.kt",
"./github/workspace/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/**",
"./github/workspace/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/*",
"./github/workspace/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/BNjs.kt",
"./github/workspace/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/Curve.kt",
"./github/workspace/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/PresetCurve.kt",
- "./github/workspace/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/Ellipticjs.kt"
+ "./github/workspace/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/Ellipticjs.kt",
+ "./github/workspace/base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/secp256k1js.kt"
)
exclude {
- it.file.toString() == "BNjs.kt" || it.file.toString() == "Curve.kt" || it.file.toString() == "PresetCurve.kt" || it.file.toString() == "Ellipticjs.kt"
+ it.file.toString() == "BNjs.kt" || it.file.toString() == "Curve.kt" || it.file.toString() == "PresetCurve.kt" || it.file.toString() == "Ellipticjs.kt" || it.file.toString() == "secp256k1js.kt"
}
exclude("./base-asymmetric-encryption/src/jsMain/kotlin/io/iohk/atala/prism/apollo/utils/external/**")
exclude {