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 {