diff --git a/.githooks/pre-commit b/.githooks/pre-push similarity index 88% rename from .githooks/pre-commit rename to .githooks/pre-push index 618e1506..af342562 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-push @@ -16,10 +16,10 @@ # limitations under the License. # -echo "Running pre-commit hook" +echo "Running pre-push hook" echo "Running format and lint checks" -if ! ./gradlew ktlintFormat licenseHeaderCheck detekt; then +if ! ./gradlew ktlintFormat detekt; then echo "Lint errors detected. Commit aborted." exit 1 fi diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000..47cc8702 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,83 @@ +name: "CodeQL Analysis" + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + schedule: + - cron: '27 0 * * 2' + +jobs: + analyze: + name: Analyze C/C++ and Java/Kotlin + runs-on: 'ubuntu-latest' + permissions: + # required for all workflows + security-events: write + + # required to fetch internal or private CodeQL packs + packages: read + + # only required for workflows in private repositories + actions: read + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + cache: gradle + distribution: 'temurin' + - name: Install dependencies + shell: bash + run: | + sudo apt-get update + sudo apt-get install -y cmake swig ninja-build clang clang-tools libc++-dev libc++abi-dev +# - name: Install latest cmake +# run: | +# CMAKE_URL="https://github.com/Kitware/CMake/releases/latest/download/cmake-4.0.0-linux-x86_64.sh" +# EXPECTED_HASH="33ba237f2850a82d5c71c1d41803ab832a9a7aac7d99fa6e48bbe5bb4d66653c" +# +# wget "$CMAKE_URL" -O cmake-installer.sh +# echo "$EXPECTED_HASH cmake-installer.sh" | sha256sum -c - +# +# chmod +x cmake-installer.sh +# sudo ./cmake-installer.sh --skip-license --prefix=/usr/local + - name: Setup Android SDK + uses: android-actions/setup-android@v3 + - name: Setup Android NDK + shell: bash + run: | + sdkmanager "ndk;27.2.12479018" + sdkmanager "cmake;3.31.6" + echo "ANDROID_NDK_ROOT=$ANDROID_SDK_ROOT/ndk/27.2.12479018" >> $GITHUB_ENV + echo "$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin" >> $GITHUB_PATH + + # Add any setup steps before running the `github/codeql-action/init` action. + # This includes steps like installing compilers or runtimes (`actions/setup-node` + # or others). This is typically only required for manual builds. + # - name: Setup runtime (example) + # uses: actions/setup-example@v1 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: c-cpp, java-kotlin + build-mode: manual + + - name: Build + shell: bash + env: + CC: clang + CXX: clang++ + CXXFLAGS: --stdlib=libc++ + run: | + ./gradlew assemble + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 diff --git a/.gitignore b/.gitignore index 901c212d..dc16c071 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,3 @@ xcuserdata .kotlin #So we don't accidentally commit our private keys *.gpg - -# Local Netlify folder -.netlify diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 765e1668..b5c8aac7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,7 +32,7 @@ Ensure all the following pre-requirements are done: Use the predefined Git hooks to ensure code quality and consistency. Run the following command from the root directory: ```sh -chmod +x .githooks/pre-commit +chmod +x .githooks/pre-push git config core.hooksPath .githooks ```` diff --git a/asn1/api/asn1.api b/asn1/api/asn1.api index 21e9ef44..f06cd538 100644 --- a/asn1/api/asn1.api +++ b/asn1/api/asn1.api @@ -85,7 +85,7 @@ public final class de/gematik/openhealth/asn1/Asn1EncoderKt { } public final class de/gematik/openhealth/asn1/Asn1GeneralizedTime { - public fun (IIIILjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Lde/gematik/openhealth/asn1/Asn1GeneralizedTime$Offset;)V + public fun (IIIILjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Lde/gematik/openhealth/asn1/Asn1Offset$GeneralizedOffset;)V public final fun component1 ()I public final fun component2 ()I public final fun component3 ()I @@ -93,31 +93,54 @@ public final class de/gematik/openhealth/asn1/Asn1GeneralizedTime { public final fun component5 ()Ljava/lang/Integer; public final fun component6 ()Ljava/lang/Integer; public final fun component7 ()Ljava/lang/Integer; - public final fun component8 ()Lde/gematik/openhealth/asn1/Asn1GeneralizedTime$Offset; - public final fun copy (IIIILjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Lde/gematik/openhealth/asn1/Asn1GeneralizedTime$Offset;)Lde/gematik/openhealth/asn1/Asn1GeneralizedTime; - public static synthetic fun copy$default (Lde/gematik/openhealth/asn1/Asn1GeneralizedTime;IIIILjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Lde/gematik/openhealth/asn1/Asn1GeneralizedTime$Offset;ILjava/lang/Object;)Lde/gematik/openhealth/asn1/Asn1GeneralizedTime; + public final fun component8 ()Lde/gematik/openhealth/asn1/Asn1Offset$GeneralizedOffset; + public final fun copy (IIIILjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Lde/gematik/openhealth/asn1/Asn1Offset$GeneralizedOffset;)Lde/gematik/openhealth/asn1/Asn1GeneralizedTime; + public static synthetic fun copy$default (Lde/gematik/openhealth/asn1/Asn1GeneralizedTime;IIIILjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Lde/gematik/openhealth/asn1/Asn1Offset$GeneralizedOffset;ILjava/lang/Object;)Lde/gematik/openhealth/asn1/Asn1GeneralizedTime; public fun equals (Ljava/lang/Object;)Z public final fun getDay ()I public final fun getFractionOfSecond ()Ljava/lang/Integer; public final fun getHour ()I public final fun getMinute ()Ljava/lang/Integer; public final fun getMonth ()I - public final fun getOffset ()Lde/gematik/openhealth/asn1/Asn1GeneralizedTime$Offset; + public final fun getOffset ()Lde/gematik/openhealth/asn1/Asn1Offset$GeneralizedOffset; public final fun getSecond ()Ljava/lang/Integer; public final fun getYear ()I public fun hashCode ()I public fun toString ()Ljava/lang/String; } -public final class de/gematik/openhealth/asn1/Asn1GeneralizedTime$Offset { +public final class de/gematik/openhealth/asn1/Asn1ObjectIdentifierKt { + public static final fun readObjectIdentifier (Lde/gematik/openhealth/asn1/Asn1Decoder$ParserScope;)Ljava/lang/String; + public static final fun writeObjectIdentifier (Lde/gematik/openhealth/asn1/Asn1Encoder$WriterScope;Ljava/lang/String;)V +} + +public abstract class de/gematik/openhealth/asn1/Asn1Offset { +} + +public final class de/gematik/openhealth/asn1/Asn1Offset$GeneralizedOffset : de/gematik/openhealth/asn1/Asn1Offset { public fun (II)V + public final fun component1 ()I + public final fun component2 ()I + public final fun copy (II)Lde/gematik/openhealth/asn1/Asn1Offset$GeneralizedOffset; + public static synthetic fun copy$default (Lde/gematik/openhealth/asn1/Asn1Offset$GeneralizedOffset;IIILjava/lang/Object;)Lde/gematik/openhealth/asn1/Asn1Offset$GeneralizedOffset; + public fun equals (Ljava/lang/Object;)Z public final fun getHours ()I public final fun getMinutes ()I + public fun hashCode ()I + public fun toString ()Ljava/lang/String; } -public final class de/gematik/openhealth/asn1/Asn1ObjectIdentifierKt { - public static final fun readObjectIdentifier (Lde/gematik/openhealth/asn1/Asn1Decoder$ParserScope;)Ljava/lang/String; - public static final fun writeObjectIdentifier (Lde/gematik/openhealth/asn1/Asn1Encoder$WriterScope;Ljava/lang/String;)V +public final class de/gematik/openhealth/asn1/Asn1Offset$UtcOffset : de/gematik/openhealth/asn1/Asn1Offset { + public fun (II)V + public final fun component1 ()I + public final fun component2 ()I + public final fun copy (II)Lde/gematik/openhealth/asn1/Asn1Offset$UtcOffset; + public static synthetic fun copy$default (Lde/gematik/openhealth/asn1/Asn1Offset$UtcOffset;IIILjava/lang/Object;)Lde/gematik/openhealth/asn1/Asn1Offset$UtcOffset; + public fun equals (Ljava/lang/Object;)Z + public final fun getHours ()I + public final fun getMinutes ()I + public fun hashCode ()I + public fun toString ()Ljava/lang/String; } public final class de/gematik/openhealth/asn1/Asn1Tag { @@ -179,38 +202,25 @@ public final class de/gematik/openhealth/asn1/Asn1Type { } public final class de/gematik/openhealth/asn1/Asn1UtcTime { - public fun (IIIIILjava/lang/Integer;Lde/gematik/openhealth/asn1/Asn1UtcTime$Offset;)V + public fun (IIIIILjava/lang/Integer;Lde/gematik/openhealth/asn1/Asn1Offset$UtcOffset;)V public final fun component1 ()I public final fun component2 ()I public final fun component3 ()I public final fun component4 ()I public final fun component5 ()I public final fun component6 ()Ljava/lang/Integer; - public final fun component7 ()Lde/gematik/openhealth/asn1/Asn1UtcTime$Offset; - public final fun copy (IIIIILjava/lang/Integer;Lde/gematik/openhealth/asn1/Asn1UtcTime$Offset;)Lde/gematik/openhealth/asn1/Asn1UtcTime; - public static synthetic fun copy$default (Lde/gematik/openhealth/asn1/Asn1UtcTime;IIIIILjava/lang/Integer;Lde/gematik/openhealth/asn1/Asn1UtcTime$Offset;ILjava/lang/Object;)Lde/gematik/openhealth/asn1/Asn1UtcTime; + public final fun component7 ()Lde/gematik/openhealth/asn1/Asn1Offset$UtcOffset; + public final fun copy (IIIIILjava/lang/Integer;Lde/gematik/openhealth/asn1/Asn1Offset$UtcOffset;)Lde/gematik/openhealth/asn1/Asn1UtcTime; + public static synthetic fun copy$default (Lde/gematik/openhealth/asn1/Asn1UtcTime;IIIIILjava/lang/Integer;Lde/gematik/openhealth/asn1/Asn1Offset$UtcOffset;ILjava/lang/Object;)Lde/gematik/openhealth/asn1/Asn1UtcTime; public fun equals (Ljava/lang/Object;)Z public final fun getDay ()I public final fun getHour ()I public final fun getMinute ()I public final fun getMonth ()I - public final fun getOffset ()Lde/gematik/openhealth/asn1/Asn1UtcTime$Offset; + public final fun getOffset ()Lde/gematik/openhealth/asn1/Asn1Offset$UtcOffset; public final fun getSecond ()Ljava/lang/Integer; public final fun getYear ()I public fun hashCode ()I public fun toString ()Ljava/lang/String; } -public final class de/gematik/openhealth/asn1/Asn1UtcTime$Offset { - public fun (II)V - public final fun component1 ()I - public final fun component2 ()I - public final fun copy (II)Lde/gematik/openhealth/asn1/Asn1UtcTime$Offset; - public static synthetic fun copy$default (Lde/gematik/openhealth/asn1/Asn1UtcTime$Offset;IIILjava/lang/Object;)Lde/gematik/openhealth/asn1/Asn1UtcTime$Offset; - public fun equals (Ljava/lang/Object;)Z - public final fun getHours ()I - public final fun getMinutes ()I - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - diff --git a/crypto-jvm-lib/api/crypto-jvm-lib.api b/crypto-jvm-lib/api/crypto-jvm-lib.api new file mode 100644 index 00000000..bc218113 --- /dev/null +++ b/crypto-jvm-lib/api/crypto-jvm-lib.api @@ -0,0 +1,4 @@ +public final class de/gematik/openhealth/crypto/internal/interop/NativeLoaderKt { + public static final fun loadNativeLibrary ()V +} + diff --git a/crypto-jvm-lib/build.gradle.kts b/crypto-jvm-lib/build.gradle.kts index 85a85a95..77a0f895 100644 --- a/crypto-jvm-lib/build.gradle.kts +++ b/crypto-jvm-lib/build.gradle.kts @@ -15,7 +15,7 @@ */ plugins { - id("java-library") + kotlin("jvm") id("maven-publish") } @@ -24,15 +24,13 @@ version = project.findProperty("gematik.version") as String val rootOutputDir = "${layout.buildDirectory.get().asFile}/generated/" -java { +kotlin { + jvmToolchain(17) sourceSets { main { resources.srcDir("$rootOutputDir/resources") } } - - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 } val hostOs = @@ -98,10 +96,14 @@ val copyNativeLibs by tasks.registering(Copy::class) { duplicatesStrategy = DuplicatesStrategy.INCLUDE } -tasks.named("jar") { +tasks.named("jar") { + dependsOn(copyNativeLibs) +} + +tasks.named("processTestResources") { dependsOn(copyNativeLibs) } -tasks.named("processResources") { +tasks.named("processResources") { dependsOn(copyNativeLibs) } diff --git a/crypto-jvm-lib/src/main/kotlin/de/gematik/openhealth/crypto/internal/interop/NativeLoader.kt b/crypto-jvm-lib/src/main/kotlin/de/gematik/openhealth/crypto/internal/interop/NativeLoader.kt new file mode 100644 index 00000000..93a35324 --- /dev/null +++ b/crypto-jvm-lib/src/main/kotlin/de/gematik/openhealth/crypto/internal/interop/NativeLoader.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2025 gematik GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package de.gematik.openhealth.crypto.internal.interop +import java.io.File + +private val hostOs = + System + .getProperty("os.name") + .lowercase() + .trim() + .replace(" ", "") +private val hostArch = + System + .getProperty("os.arch") + .lowercase() + .trim() + .replace(" ", "") + +@Suppress("UnsafeDynamicallyLoadedCode") +fun loadNativeLibrary() { + try { + System.loadLibrary("oh_crypto") + } catch (_: UnsatisfiedLinkError) { + val libName = + when { + hostOs.contains("mac") -> "liboh_crypto.dylib" + hostOs.contains("win") -> "oh_crypto.dll" + else -> "liboh_crypto.so" + } + + val libResUrl = ClassLoader.getSystemResource("$hostOs-$hostArch/$libName") + + val tempLib = File.createTempFile("lib", libName) + tempLib.deleteOnExit() + libResUrl.openStream().copyTo(tempLib.outputStream()) + + System.load(tempLib.absolutePath) + } +} diff --git a/crypto-jvm-swig/api/crypto-jvm-swig.api b/crypto-jvm-swig/api/crypto-jvm-swig.api new file mode 100644 index 00000000..cffb3ea0 --- /dev/null +++ b/crypto-jvm-swig/api/crypto-jvm-swig.api @@ -0,0 +1,236 @@ +public class de/gematik/openhealth/crypto/internal/interop/AesCipher : de/gematik/openhealth/crypto/internal/interop/ClassHandle { + protected field swigCMemOwn Z + protected fun (JZ)V + public fun _final ()Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector; + public static fun createDecryptor (Ljava/lang/String;Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)Lde/gematik/openhealth/crypto/internal/interop/AesCipher; + public static fun createEncryptor (Ljava/lang/String;Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)Lde/gematik/openhealth/crypto/internal/interop/AesCipher; + public fun delete ()V + protected fun finalize ()V + public fun getAuthTag (J)Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector; + protected static fun getCPtr (Lde/gematik/openhealth/crypto/internal/interop/AesCipher;)J + public fun jniFreeMemory ()V + public fun setAad (Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)V + public fun setAuthTag (Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)V + public fun setAutoPadding (Z)V + protected static fun swigRelease (Lde/gematik/openhealth/crypto/internal/interop/AesCipher;)J + public fun update (Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector; +} + +public abstract interface class de/gematik/openhealth/crypto/internal/interop/ClassHandle { + public abstract fun jniFreeMemory ()V +} + +public class de/gematik/openhealth/crypto/internal/interop/Cmac : de/gematik/openhealth/crypto/internal/interop/ClassHandle { + protected field swigCMemOwn Z + protected fun (JZ)V + public fun _final ()Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector; + public static fun create (Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;Ljava/lang/String;)Lde/gematik/openhealth/crypto/internal/interop/Cmac; + public fun delete ()V + protected fun finalize ()V + protected static fun getCPtr (Lde/gematik/openhealth/crypto/internal/interop/Cmac;)J + public fun jniFreeMemory ()V + protected static fun swigRelease (Lde/gematik/openhealth/crypto/internal/interop/Cmac;)J + public fun update (Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)V +} + +public class de/gematik/openhealth/crypto/internal/interop/Crypto { + public fun ()V + public static fun cryptoConstTimeEquals (Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)Z + public static fun cryptoRandom (J)Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector; +} + +public class de/gematik/openhealth/crypto/internal/interop/CryptoJNI { + public fun ()V + public static final fun AesCipher__final (JLde/gematik/openhealth/crypto/internal/interop/AesCipher;)J + public static final fun AesCipher_createDecryptor (Ljava/lang/String;JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)J + public static final fun AesCipher_createEncryptor (Ljava/lang/String;JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)J + public static final fun AesCipher_getAuthTag (JLde/gematik/openhealth/crypto/internal/interop/AesCipher;J)J + public static final fun AesCipher_setAad (JLde/gematik/openhealth/crypto/internal/interop/AesCipher;JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)V + public static final fun AesCipher_setAuthTag (JLde/gematik/openhealth/crypto/internal/interop/AesCipher;JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)V + public static final fun AesCipher_setAutoPadding (JLde/gematik/openhealth/crypto/internal/interop/AesCipher;Z)V + public static final fun AesCipher_update (JLde/gematik/openhealth/crypto/internal/interop/AesCipher;JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)J + public static final fun Cmac__final (JLde/gematik/openhealth/crypto/internal/interop/Cmac;)J + public static final fun Cmac_create (JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;Ljava/lang/String;)J + public static final fun Cmac_update (JLde/gematik/openhealth/crypto/internal/interop/Cmac;JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)V + public static final fun EcKeypair_generateKeypair (Ljava/lang/String;)J + public static final fun EcKeypair_getPrivateKeyDer (JLde/gematik/openhealth/crypto/internal/interop/EcKeypair;)J + public static final fun EcKeypair_getPublicKeyDer (JLde/gematik/openhealth/crypto/internal/interop/EcKeypair;)J + public static final fun EcPoint_add (JLde/gematik/openhealth/crypto/internal/interop/EcPoint;JLde/gematik/openhealth/crypto/internal/interop/EcPoint;)J + public static final fun EcPoint_clone (JLde/gematik/openhealth/crypto/internal/interop/EcPoint;)J + public static final fun EcPoint_create (Ljava/lang/String;JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)J + public static final fun EcPoint_times (JLde/gematik/openhealth/crypto/internal/interop/EcPoint;JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)J + public static final fun EcPoint_uncompressed (JLde/gematik/openhealth/crypto/internal/interop/EcPoint;)J + public static final fun Ecdh_computeSecret (JLde/gematik/openhealth/crypto/internal/interop/Ecdh;JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)J + public static final fun Ecdh_create (JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)J + public static final fun HashGenerator__final (JLde/gematik/openhealth/crypto/internal/interop/HashGenerator;)J + public static final fun HashGenerator_create (Ljava/lang/String;)J + public static final fun HashGenerator_setFinalOutputLength (JLde/gematik/openhealth/crypto/internal/interop/HashGenerator;J)V + public static final fun HashGenerator_update (JLde/gematik/openhealth/crypto/internal/interop/HashGenerator;JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)V + public static final fun MlkemDecapsulation_create (Ljava/lang/String;)J + public static final fun MlkemDecapsulation_createFromPrivateKey (Ljava/lang/String;JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)J + public static final fun MlkemDecapsulation_decapsulate (JLde/gematik/openhealth/crypto/internal/interop/MlkemDecapsulation;JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)J + public static final fun MlkemDecapsulation_getEncapsulationKey (JLde/gematik/openhealth/crypto/internal/interop/MlkemDecapsulation;)J + public static final fun MlkemDecapsulation_getPrivateKey (JLde/gematik/openhealth/crypto/internal/interop/MlkemDecapsulation;)J + public static final fun MlkemEncapsulationData_sharedSecret_get (JLde/gematik/openhealth/crypto/internal/interop/MlkemEncapsulationData;)J + public static final fun MlkemEncapsulationData_sharedSecret_set (JLde/gematik/openhealth/crypto/internal/interop/MlkemEncapsulationData;JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)V + public static final fun MlkemEncapsulationData_wrappedKey_get (JLde/gematik/openhealth/crypto/internal/interop/MlkemEncapsulationData;)J + public static final fun MlkemEncapsulationData_wrappedKey_set (JLde/gematik/openhealth/crypto/internal/interop/MlkemEncapsulationData;JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)V + public static final fun MlkemEncapsulation_create (Ljava/lang/String;JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)J + public static final fun MlkemEncapsulation_encapsulate (JLde/gematik/openhealth/crypto/internal/interop/MlkemEncapsulation;)J + public static final fun Uint8Vector_clear (JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)V + public static final fun Uint8Vector_doAdd__SWIG_0 (JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;B)V + public static final fun Uint8Vector_doAdd__SWIG_1 (JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;IB)V + public static final fun Uint8Vector_doCapacity (JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)I + public static final fun Uint8Vector_doGet (JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;I)B + public static final fun Uint8Vector_doRemove (JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;I)B + public static final fun Uint8Vector_doRemoveRange (JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;II)V + public static final fun Uint8Vector_doReserve (JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;I)V + public static final fun Uint8Vector_doSet (JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;IB)B + public static final fun Uint8Vector_doSize (JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)I + public static final fun Uint8Vector_isEmpty (JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)Z + public static final fun cryptoConstTimeEquals (JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)Z + public static final fun cryptoRandom (J)J + public static final fun delete_AesCipher (J)V + public static final fun delete_Cmac (J)V + public static final fun delete_EcKeypair (J)V + public static final fun delete_EcPoint (J)V + public static final fun delete_Ecdh (J)V + public static final fun delete_HashGenerator (J)V + public static final fun delete_MlkemDecapsulation (J)V + public static final fun delete_MlkemEncapsulation (J)V + public static final fun delete_MlkemEncapsulationData (J)V + public static final fun delete_Uint8Vector (J)V + public static final fun new_Uint8Vector__SWIG_0 ()J + public static final fun new_Uint8Vector__SWIG_1 (JLde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)J + public static final fun new_Uint8Vector__SWIG_2 (IB)J + public static final fun new_mlkemEncapsulationData ()J +} + +public class de/gematik/openhealth/crypto/internal/interop/EcKeypair : de/gematik/openhealth/crypto/internal/interop/ClassHandle { + protected field swigCMemOwn Z + protected fun (JZ)V + public fun delete ()V + protected fun finalize ()V + public static fun generateKeypair (Ljava/lang/String;)Lde/gematik/openhealth/crypto/internal/interop/EcKeypair; + protected static fun getCPtr (Lde/gematik/openhealth/crypto/internal/interop/EcKeypair;)J + public fun getPrivateKeyDer ()Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector; + public fun getPublicKeyDer ()Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector; + public fun jniFreeMemory ()V + protected static fun swigRelease (Lde/gematik/openhealth/crypto/internal/interop/EcKeypair;)J +} + +public class de/gematik/openhealth/crypto/internal/interop/EcPoint : de/gematik/openhealth/crypto/internal/interop/ClassHandle { + protected field swigCMemOwn Z + protected fun (JZ)V + public fun add (Lde/gematik/openhealth/crypto/internal/interop/EcPoint;)Lde/gematik/openhealth/crypto/internal/interop/EcPoint; + public fun clone ()Lde/gematik/openhealth/crypto/internal/interop/EcPoint; + public synthetic fun clone ()Ljava/lang/Object; + public static fun create (Ljava/lang/String;Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)Lde/gematik/openhealth/crypto/internal/interop/EcPoint; + public fun delete ()V + protected fun finalize ()V + protected static fun getCPtr (Lde/gematik/openhealth/crypto/internal/interop/EcPoint;)J + public fun jniFreeMemory ()V + protected static fun swigRelease (Lde/gematik/openhealth/crypto/internal/interop/EcPoint;)J + public fun times (Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)Lde/gematik/openhealth/crypto/internal/interop/EcPoint; + public fun uncompressed ()Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector; +} + +public class de/gematik/openhealth/crypto/internal/interop/Ecdh : de/gematik/openhealth/crypto/internal/interop/ClassHandle { + protected field swigCMemOwn Z + protected fun (JZ)V + public fun computeSecret (Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector; + public static fun create (Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)Lde/gematik/openhealth/crypto/internal/interop/Ecdh; + public fun delete ()V + protected fun finalize ()V + protected static fun getCPtr (Lde/gematik/openhealth/crypto/internal/interop/Ecdh;)J + public fun jniFreeMemory ()V + protected static fun swigRelease (Lde/gematik/openhealth/crypto/internal/interop/Ecdh;)J +} + +public class de/gematik/openhealth/crypto/internal/interop/HashGenerator : de/gematik/openhealth/crypto/internal/interop/ClassHandle { + protected field swigCMemOwn Z + protected fun (JZ)V + public fun _final ()Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector; + public static fun create (Ljava/lang/String;)Lde/gematik/openhealth/crypto/internal/interop/HashGenerator; + public fun delete ()V + protected fun finalize ()V + protected static fun getCPtr (Lde/gematik/openhealth/crypto/internal/interop/HashGenerator;)J + public fun jniFreeMemory ()V + public fun setFinalOutputLength (J)V + protected static fun swigRelease (Lde/gematik/openhealth/crypto/internal/interop/HashGenerator;)J + public fun update (Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)V +} + +public class de/gematik/openhealth/crypto/internal/interop/MlkemDecapsulation : de/gematik/openhealth/crypto/internal/interop/ClassHandle { + protected field swigCMemOwn Z + protected fun (JZ)V + public static fun create (Ljava/lang/String;)Lde/gematik/openhealth/crypto/internal/interop/MlkemDecapsulation; + public static fun createFromPrivateKey (Ljava/lang/String;Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)Lde/gematik/openhealth/crypto/internal/interop/MlkemDecapsulation; + public fun decapsulate (Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector; + public fun delete ()V + protected fun finalize ()V + protected static fun getCPtr (Lde/gematik/openhealth/crypto/internal/interop/MlkemDecapsulation;)J + public fun getEncapsulationKey ()Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector; + public fun getPrivateKey ()Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector; + public fun jniFreeMemory ()V + protected static fun swigRelease (Lde/gematik/openhealth/crypto/internal/interop/MlkemDecapsulation;)J +} + +public class de/gematik/openhealth/crypto/internal/interop/MlkemEncapsulation : de/gematik/openhealth/crypto/internal/interop/ClassHandle { + protected field swigCMemOwn Z + protected fun (JZ)V + public static fun create (Ljava/lang/String;Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)Lde/gematik/openhealth/crypto/internal/interop/MlkemEncapsulation; + public fun delete ()V + public fun encapsulate ()Lde/gematik/openhealth/crypto/internal/interop/MlkemEncapsulationData; + protected fun finalize ()V + protected static fun getCPtr (Lde/gematik/openhealth/crypto/internal/interop/MlkemEncapsulation;)J + public fun jniFreeMemory ()V + protected static fun swigRelease (Lde/gematik/openhealth/crypto/internal/interop/MlkemEncapsulation;)J +} + +public class de/gematik/openhealth/crypto/internal/interop/MlkemEncapsulationData : de/gematik/openhealth/crypto/internal/interop/ClassHandle { + protected field swigCMemOwn Z + public fun ()V + protected fun (JZ)V + public fun delete ()V + protected fun finalize ()V + protected static fun getCPtr (Lde/gematik/openhealth/crypto/internal/interop/MlkemEncapsulationData;)J + public fun getSharedSecret ()Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector; + public fun getWrappedKey ()Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector; + public fun jniFreeMemory ()V + public fun setSharedSecret (Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)V + public fun setWrappedKey (Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)V + protected static fun swigRelease (Lde/gematik/openhealth/crypto/internal/interop/MlkemEncapsulationData;)J +} + +public class de/gematik/openhealth/crypto/internal/interop/Uint8Vector : java/util/AbstractList, de/gematik/openhealth/crypto/internal/interop/ClassHandle, java/util/RandomAccess { + protected field swigCMemOwn Z + public fun ()V + public fun (IB)V + protected fun (JZ)V + public fun (Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)V + public fun (Ljava/lang/Iterable;)V + public fun ([B)V + public fun add (ILjava/lang/Byte;)V + public synthetic fun add (ILjava/lang/Object;)V + public fun add (Ljava/lang/Byte;)Z + public synthetic fun add (Ljava/lang/Object;)Z + public fun capacity ()I + public fun clear ()V + public fun delete ()V + protected fun finalize ()V + public fun get (I)Ljava/lang/Byte; + public synthetic fun get (I)Ljava/lang/Object; + protected static fun getCPtr (Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)J + public fun isEmpty ()Z + public fun jniFreeMemory ()V + public fun remove (I)Ljava/lang/Byte; + public synthetic fun remove (I)Ljava/lang/Object; + protected fun removeRange (II)V + public fun reserve (I)V + public fun set (ILjava/lang/Byte;)Ljava/lang/Byte; + public synthetic fun set (ILjava/lang/Object;)Ljava/lang/Object; + public fun size ()I + protected static fun swigRelease (Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector;)J +} + diff --git a/crypto-jvm-swig/build.gradle.kts b/crypto-jvm-swig/build.gradle.kts index 6d5e7d49..9e5cbf49 100644 --- a/crypto-jvm-swig/build.gradle.kts +++ b/crypto-jvm-swig/build.gradle.kts @@ -15,7 +15,7 @@ */ plugins { - id("java-library") + kotlin("jvm") } group = project.findProperty("gematik.baseGroup") as String @@ -75,6 +75,10 @@ val patchGeneratedJava by tasks.registering { dependsOn(generateJniWrapper) } +tasks.named("sourcesJar") { + dependsOn(patchGeneratedJava) +} + tasks.withType(JavaCompile::class) { dependsOn(patchGeneratedJava) } diff --git a/crypto-web-lib/build.gradle.kts b/crypto-web-lib/build.gradle.kts index 56259c33..738cadf4 100644 --- a/crypto-web-lib/build.gradle.kts +++ b/crypto-web-lib/build.gradle.kts @@ -21,11 +21,15 @@ plugins { group = project.findProperty("gematik.baseGroup") as String version = project.findProperty("gematik.version") as String -val rootOutputDir = "${layout.buildDirectory.get().asFile}/generated/" -val emscriptenDir = - project.findProperty("emscripten.dir") as? String ?: error("emscripten.dir property is not set") +val buildDirPath = + layout.buildDirectory + .get() + .asFile.absolutePath -val cmakeBuildDir = "${layout.buildDirectory.get().asFile}/cmake-build" +val rootOutputDir = "$buildDirPath/generated/" +var emscriptenDir = project.findProperty("emscripten.dir") as? String + +val cmakeBuildDir = "$buildDirPath/cmake-build" kotlin { js { @@ -36,13 +40,40 @@ kotlin { } sourceSets { - val jsMainGenerated by creating { + val jsMain by getting { kotlin.srcDir("$rootOutputDir/jsMainGenerated/kotlin") resources.srcDir("$rootOutputDir/jsMainGenerated/resources") } - val jsMain by getting { - dependsOn(jsMainGenerated) - } + } +} + +if (emscriptenDir == null) { + val emscriptenGitHash = "24fc909c0da13ef641d5ae75e89b5a97f25e37aa" + + emscriptenDir = "$buildDirPath/emsdk-$emscriptenGitHash" + + tasks.register("emscriptenSetup", Exec::class) { + val zipUrl = + "https://github.com/emscripten-core/emsdk/archive/$emscriptenGitHash.zip" + val zipFile = "$buildDirPath/emsdk-$emscriptenGitHash.zip" + val outputDir = "$buildDirPath/emsdk-$emscriptenGitHash" + + outputs.dir(outputDir) + outputs.file(zipFile) + commandLine( + "bash", + "-c", + """ + curl -L -o "$zipFile" "$zipUrl" && + unzip -o -q "$zipFile" -d "$outputDir/../" && + cd "$outputDir" && + ./emsdk install latest && + ./emsdk activate latest && + source ./emsdk_env.sh && + cd ./upstream/emscripten/ && + npm ci + """.trimIndent(), + ) } } @@ -53,8 +84,9 @@ val emcmakeSetup by tasks.registering(Exec::class) { commandLine( "bash", "-c", - "source $emscriptenDir/emsdk_env.sh && emcmake cmake -DPROJECT_ROOT_DIR=$rootDir -GNinja -S $rootDir/libs/openssl/wrapper -B ${layout.buildDirectory.get().asFile}/cmake-build", + "source $emscriptenDir/emsdk_env.sh && emcmake cmake -DPROJECT_ROOT_DIR=$rootDir -GNinja -S $rootDir/libs/openssl/wrapper -B $buildDirPath/cmake-build", ) + tasks.findByName("emscriptenSetup")?.let { dependsOn(it) } } val emcmakeBuild by tasks.registering(Exec::class) { @@ -71,7 +103,7 @@ val emcmakeBuild by tasks.registering(Exec::class) { val copyJsLibs by tasks.registering(Copy::class) { dependsOn(emcmakeBuild) - from("${layout.buildDirectory.get().asFile}/cmake-build") { + from("$buildDirPath/cmake-build") { include("oh_crypto.*") } into("npm/lib") @@ -92,20 +124,21 @@ val npxNodeConv by tasks.registering(Exec::class) { ) workingDir("npm") commandLine( - "npx", - "node", - "src/conv.ts", - "--package-path", - "de.gematik.openhealth.crypto.internal.interop", - "--module-name", - "CryptoModule", - "$cmakeBuildDir/oh_crypto.d.ts", - "$rootOutputDir/jsMainGenerated/kotlin/de/gematik/openhealth/crypto/internal/interop/crypto.kt", + "bash", + "-c", + """ + source $emscriptenDir/emsdk_env.sh && + npx tsx src/conv.ts --package-path de.gematik.openhealth.crypto.internal.interop --module-class-name CryptoModule --module-name gematik-openhealth-internal-crypto $cmakeBuildDir/oh_crypto.d.ts $rootOutputDir/jsMainGenerated/kotlin/de/gematik/openhealth/crypto/internal/interop/crypto.kt + """.trimIndent(), ) dependsOn(emcmakeBuild) dependsOn(npmInstall) } -tasks.named("jsProcessResources") { +tasks.named("compileKotlinJs") { + dependsOn(copyJsLibs, npxNodeConv) +} + +tasks.named("jsProcessResources") { dependsOn(copyJsLibs, npxNodeConv) } diff --git a/crypto-web-lib/npm/package-lock.json b/crypto-web-lib/npm/package-lock.json index 7f5139c6..7668c28b 100644 --- a/crypto-web-lib/npm/package-lock.json +++ b/crypto-web-lib/npm/package-lock.json @@ -1,359 +1,883 @@ { - "name": "gematik-ems-openssl", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "gematik-ems-openssl", - "version": "1.0.0", - "license": "Apache-2.0", - "dependencies": { - "commander": "^13.1.0" - }, - "devDependencies": { - "@types/node": "^22.13.14", - "ts-morph": "^25.0.1" - } + "name": "gematik-openhealth-internal-crypto", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "gematik-openhealth-internal-crypto", + "version": "0.1.0", + "license": "Apache-2.0", + "devDependencies": { + "@types/node": "^22.13.14", + "commander": "^13.1.0", + "ts-morph": "^25.0.1", + "tsx": "^4.19.3" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.26.1.tgz", + "integrity": "sha512-Sn28TGl/4cFpcM+jwsH1wLncYq3FtN/BIpem+HOygfBWPT5pAeS5dB4VFVzV8FbnOKHpDLZmvAl4AjPEev5idA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.3.2", + "minimatch": "^9.0.4", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@types/node": { + "version": "22.13.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.14.tgz", + "integrity": "sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/code-block-writer": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", + "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@ts-morph/common": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.26.1.tgz", - "integrity": "sha512-Sn28TGl/4cFpcM+jwsH1wLncYq3FtN/BIpem+HOygfBWPT5pAeS5dB4VFVzV8FbnOKHpDLZmvAl4AjPEev5idA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-glob": "^3.3.2", - "minimatch": "^9.0.4", - "path-browserify": "^1.0.1" - } - }, - "node_modules/@types/node": { - "version": "22.13.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.14.tgz", - "integrity": "sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/code-block-writer": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", - "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", - "dev": true, - "license": "MIT" - }, - "node_modules/commander": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "node_modules/ts-morph": { - "version": "25.0.1", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-25.0.1.tgz", - "integrity": "sha512-QJEiTdnz1YjrB3JFhd626gX4rKHDLSjSVMvGGG4v7ONc3RBwa0Eei98G9AT9uNFDMtV54JyuXsFeC+OH0n6bXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ts-morph/common": "~0.26.0", - "code-block-writer": "^13.0.3" - } + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "dev": true, - "license": "MIT" + { + "type": "consulting", + "url": "https://feross.org/support" } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-morph": { + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-25.0.1.tgz", + "integrity": "sha512-QJEiTdnz1YjrB3JFhd626gX4rKHDLSjSVMvGGG4v7ONc3RBwa0Eei98G9AT9uNFDMtV54JyuXsFeC+OH0n6bXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.26.0", + "code-block-writer": "^13.0.3" + } + }, + "node_modules/tsx": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", + "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "license": "MIT" } + } } diff --git a/crypto-web-lib/npm/package.json b/crypto-web-lib/npm/package.json index 2ede74a9..e0e504fa 100644 --- a/crypto-web-lib/npm/package.json +++ b/crypto-web-lib/npm/package.json @@ -1,5 +1,5 @@ { - "name": "gematik-internal-oh-crypto", + "name": "gematik-openhealth-internal-crypto", "version": "0.1.0", "private": true, "description": "OpenSSL wrapper for usage with WebAssembly", @@ -20,7 +20,8 @@ ], "devDependencies": { "@types/node": "^22.13.14", + "commander": "^13.1.0", "ts-morph": "^25.0.1", - "commander": "^13.1.0" + "tsx": "^4.19.3" } } diff --git a/crypto-web-lib/npm/src/conv.ts b/crypto-web-lib/npm/src/conv.ts index 8fc03ea8..19d7dff0 100644 --- a/crypto-web-lib/npm/src/conv.ts +++ b/crypto-web-lib/npm/src/conv.ts @@ -6,12 +6,14 @@ const program = new Command(); program .version("0.1.0") - .option("--module-name ", "Specify the module name") + .option("--module-name ", "Specify the module name. Must match the package.json name") + .option("--module-class-name ", "Specify the module class name. This will be the generated class and function name") .option("--package-path ", "Specify the Kotlin package path") .arguments(" ") .description("Convert Emscripten *.d.ts to Kotlin") .action((inputFile: string, outputFile: string) => { const moduleName = program.opts().moduleName || "MainModule"; + const moduleClassName = program.opts().moduleClassName || "MainModule"; const packagePath = program.opts().packagePath; const project = new Project({ @@ -112,7 +114,7 @@ program sourceFile.getTypeAliases().forEach(alias => { const aliasName = alias.getName(); if (aliasName === "MainModule") { - kotlinOutput += `external interface ${moduleName} : WasmModule, EmbindModule\n\n`; + kotlinOutput += `external interface ${moduleClassName} : WasmModule, EmbindModule\n\n`; } else { kotlinOutput += `typealias ${aliasName} = Any\n\n`; } @@ -125,7 +127,7 @@ program kotlinOutput += ` @JsModule("${moduleName}") @JsNonModule -external fun ${moduleName}Factory(options: Any? = definedExternally): Promise<${moduleName}> +external fun ${moduleClassName}Factory(options: Any? = definedExternally): Promise<${moduleClassName}> `; fs.writeFileSync(outputFile, kotlinOutput); diff --git a/crypto/api/android/crypto.api b/crypto/api/android/crypto.api index 09ce2dd5..b848a158 100644 --- a/crypto/api/android/crypto.api +++ b/crypto/api/android/crypto.api @@ -1,5 +1,5 @@ -public final class de/gematik/kmp/crypto/ByteUnit { - public static final synthetic fun box-impl (I)Lde/gematik/kmp/crypto/ByteUnit; +public final class de/gematik/openhealth/crypto/ByteUnit { + public static final synthetic fun box-impl (I)Lde/gematik/openhealth/crypto/ByteUnit; public static fun constructor-impl (I)I public fun equals (Ljava/lang/Object;)Z public static fun equals-impl (ILjava/lang/Object;)Z @@ -12,214 +12,378 @@ public final class de/gematik/kmp/crypto/ByteUnit { public final synthetic fun unbox-impl ()I } -public abstract interface class de/gematik/kmp/crypto/Cmac { - public abstract fun final (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun getAlgorithm ()Lde/gematik/kmp/crypto/CmacAlgorithm; - public abstract fun update ([BLkotlin/coroutines/Continuation;)Ljava/lang/Object; +public final class de/gematik/openhealth/crypto/ByteUnitKt { + public static final fun getBits (I)I + public static final fun getBits-bc5Nprg (I)I + public static final fun getBytes (I)I + public static final fun getBytes-bc5Nprg (I)I +} + +public abstract interface class de/gematik/openhealth/crypto/Cmac { + public abstract fun final ()[B + public abstract fun getSpec ()Lde/gematik/openhealth/crypto/CmacSpec; + public abstract fun update ([B)V } -public final class de/gematik/kmp/crypto/CmacAlgorithm : java/lang/Enum { - public static final field Aes Lde/gematik/kmp/crypto/CmacAlgorithm; +public final class de/gematik/openhealth/crypto/CmacAlgorithm : java/lang/Enum { + public static final field Aes Lde/gematik/openhealth/crypto/CmacAlgorithm; public static fun getEntries ()Lkotlin/enums/EnumEntries; - public static fun valueOf (Ljava/lang/String;)Lde/gematik/kmp/crypto/CmacAlgorithm; - public static fun values ()[Lde/gematik/kmp/crypto/CmacAlgorithm; + public static fun valueOf (Ljava/lang/String;)Lde/gematik/openhealth/crypto/CmacAlgorithm; + public static fun values ()[Lde/gematik/openhealth/crypto/CmacAlgorithm; } -public final class de/gematik/kmp/crypto/CmacException : java/lang/Throwable { +public final class de/gematik/openhealth/crypto/CmacException : java/lang/Throwable { public fun (Ljava/lang/String;Ljava/lang/Throwable;)V public synthetic fun (Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun getCause ()Ljava/lang/Throwable; public fun getMessage ()Ljava/lang/String; } -public final class de/gematik/kmp/crypto/Cmac_jvmKt { - public static final fun createCmac (Lde/gematik/kmp/crypto/CmacAlgorithm;[B)Lde/gematik/kmp/crypto/Cmac; +public final class de/gematik/openhealth/crypto/CmacSpec { + public fun (Lde/gematik/openhealth/crypto/CmacAlgorithm;)V + public final fun getAlgorithm ()Lde/gematik/openhealth/crypto/CmacAlgorithm; +} + +public final class de/gematik/openhealth/crypto/Cmac_jvmKt { + public static final fun nativeCreateCmac (Lde/gematik/openhealth/crypto/CmacSpec;Lde/gematik/openhealth/crypto/CryptoScope;Lde/gematik/openhealth/crypto/key/SecretKey;)Lde/gematik/openhealth/crypto/Cmac; +} + +public final class de/gematik/openhealth/crypto/ConstantTimeKt { + public static final fun contentConstantTimeEquals ([B[B)Z +} + +public final class de/gematik/openhealth/crypto/ConstantTime_jvmKt { + public static final fun nativeConstantTimeEquals ([B[B)Z +} + +public abstract class de/gematik/openhealth/crypto/CryptoScope { + public fun ()V + public final fun createCipher (Lde/gematik/openhealth/crypto/cipher/AesCipherSpec;Lde/gematik/openhealth/crypto/key/SecretKey;)Lde/gematik/openhealth/crypto/cipher/AesCipher; + public final fun createCmac (Lde/gematik/openhealth/crypto/CmacSpec;Lde/gematik/openhealth/crypto/key/SecretKey;)Lde/gematik/openhealth/crypto/Cmac; + public final fun createDecapsulation (Lde/gematik/openhealth/crypto/kem/KemSpec;)Lde/gematik/openhealth/crypto/kem/KemDecapsulation; + public final fun createDecipher (Lde/gematik/openhealth/crypto/cipher/AesDecipherSpec;Lde/gematik/openhealth/crypto/key/SecretKey;)Lde/gematik/openhealth/crypto/cipher/AesDecipher; + public final fun createEncapsulation (Lde/gematik/openhealth/crypto/kem/KemSpec;[B)Lde/gematik/openhealth/crypto/kem/KemEncapsulation; + public final fun createHash (Lde/gematik/openhealth/crypto/HashSpec;)Lde/gematik/openhealth/crypto/Hash; + public final fun createKeyExchange (Lde/gematik/openhealth/crypto/exchange/EcdhSpec;Lde/gematik/openhealth/crypto/key/EcPrivateKey;)Lde/gematik/openhealth/crypto/exchange/Ecdh; +} + +public final class de/gematik/openhealth/crypto/CryptoScopeKt { + public static final fun useCrypto (Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public static final fun useCryptoAsync (Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } -public abstract interface annotation class de/gematik/kmp/crypto/ExperimentalCryptoApi : java/lang/annotation/Annotation { +public abstract interface annotation class de/gematik/openhealth/crypto/ExperimentalCryptoApi : java/lang/annotation/Annotation { } -public abstract interface class de/gematik/kmp/crypto/Hash { - public abstract fun digest (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun getAlgorithm ()Lde/gematik/kmp/crypto/HashAlgorithm; - public abstract fun update ([BLkotlin/coroutines/Continuation;)Ljava/lang/Object; +public abstract interface class de/gematik/openhealth/crypto/Hash { + public abstract fun digest ()[B + public abstract fun getSpec ()Lde/gematik/openhealth/crypto/HashSpec; + public abstract fun update ([B)V } -public final class de/gematik/kmp/crypto/HashAlgorithm : java/lang/Enum { - public static final field Sha1 Lde/gematik/kmp/crypto/HashAlgorithm; +public final class de/gematik/openhealth/crypto/HashAlgorithm : java/lang/Enum { + public static final field Sha1 Lde/gematik/openhealth/crypto/HashAlgorithm; + public static final field Sha256 Lde/gematik/openhealth/crypto/HashAlgorithm; + public static final field Sha384 Lde/gematik/openhealth/crypto/HashAlgorithm; + public static final field Sha512 Lde/gematik/openhealth/crypto/HashAlgorithm; + public static final field Shake128 Lde/gematik/openhealth/crypto/HashAlgorithm; + public static final field Shake256 Lde/gematik/openhealth/crypto/HashAlgorithm; public static fun getEntries ()Lkotlin/enums/EnumEntries; - public static fun valueOf (Ljava/lang/String;)Lde/gematik/kmp/crypto/HashAlgorithm; - public static fun values ()[Lde/gematik/kmp/crypto/HashAlgorithm; + public static fun valueOf (Ljava/lang/String;)Lde/gematik/openhealth/crypto/HashAlgorithm; + public static fun values ()[Lde/gematik/openhealth/crypto/HashAlgorithm; } -public final class de/gematik/kmp/crypto/HashException : java/lang/Throwable { +public final class de/gematik/openhealth/crypto/HashException : java/lang/Throwable { public fun (Ljava/lang/String;Ljava/lang/Throwable;)V public synthetic fun (Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun getCause ()Ljava/lang/Throwable; public fun getMessage ()Ljava/lang/String; } -public final class de/gematik/kmp/crypto/Hash_jvmKt { - public static final fun createHash (Lde/gematik/kmp/crypto/HashAlgorithm;)Lde/gematik/kmp/crypto/Hash; +public final class de/gematik/openhealth/crypto/HashSpec { + public fun (Lde/gematik/openhealth/crypto/HashAlgorithm;)V + public final fun getAlgorithm ()Lde/gematik/openhealth/crypto/HashAlgorithm; } -public final class de/gematik/kmp/crypto/JvmCmac : de/gematik/kmp/crypto/Cmac { - public fun (Lde/gematik/kmp/crypto/CmacAlgorithm;[B)V - public fun final (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getAlgorithm ()Lde/gematik/kmp/crypto/CmacAlgorithm; - public fun update ([BLkotlin/coroutines/Continuation;)Ljava/lang/Object; +public final class de/gematik/openhealth/crypto/Hash_jvmKt { + public static final fun nativeCreateHash (Lde/gematik/openhealth/crypto/HashSpec;Lde/gematik/openhealth/crypto/CryptoScope;)Lde/gematik/openhealth/crypto/Hash; } -public final class de/gematik/kmp/crypto/JvmHash : de/gematik/kmp/crypto/Hash { - public fun (Lde/gematik/kmp/crypto/HashAlgorithm;)V - public fun digest (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getAlgorithm ()Lde/gematik/kmp/crypto/HashAlgorithm; - public fun update ([BLkotlin/coroutines/Continuation;)Ljava/lang/Object; +public final class de/gematik/openhealth/crypto/LazySuspend { + public fun (Lkotlin/jvm/functions/Function1;)V + public final fun get (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun tryGet ()Ljava/lang/Object; } -public final class de/gematik/kmp/crypto/Pem { +public final class de/gematik/openhealth/crypto/Pem { public fun (Ljava/lang/String;[B)V public final fun getData ()[B public final fun getType ()Ljava/lang/String; } -public final class de/gematik/kmp/crypto/PemKt { - public static final fun decodeToPem (Ljava/lang/String;)Lde/gematik/kmp/crypto/Pem; - public static final fun encodeToString (Lde/gematik/kmp/crypto/Pem;)Ljava/lang/String; +public final class de/gematik/openhealth/crypto/PemKt { + public static final fun decodeToPem (Ljava/lang/String;)Lde/gematik/openhealth/crypto/Pem; + public static final fun encodeToString (Lde/gematik/openhealth/crypto/Pem;)Ljava/lang/String; } -public abstract class de/gematik/kmp/crypto/SecureRandom : kotlin/random/Random { +public final class de/gematik/openhealth/crypto/Provider_jvmKt { + public static final fun initializeNativeCryptoProvider (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public abstract class de/gematik/openhealth/crypto/SecureRandom : kotlin/random/Random { public fun ()V } -public final class de/gematik/kmp/crypto/SecureRandom_jvmKt { - public static final fun secureRandom ()Lde/gematik/kmp/crypto/SecureRandom; +public final class de/gematik/openhealth/crypto/SecureRandom_jvmKt { + public static final fun secureRandom ()Lde/gematik/openhealth/crypto/SecureRandom; } -public final class de/gematik/kmp/crypto/UnitsKt { - public static final fun getBits (I)I - public static final fun getBits-CJXw4fk (I)I - public static final fun getBytes (I)I - public static final fun getBytes-CJXw4fk (I)I +public abstract interface annotation class de/gematik/openhealth/crypto/UnoptimizedCryptoApi : java/lang/annotation/Annotation { + public abstract fun ticket ()Ljava/lang/String; } -public abstract interface annotation class de/gematik/kmp/crypto/UnsafeCryptoApi : java/lang/annotation/Annotation { +public abstract interface annotation class de/gematik/openhealth/crypto/UnsafeCryptoApi : java/lang/annotation/Annotation { } -public abstract interface class de/gematik/kmp/crypto/cipher/AesCipher : de/gematik/kmp/crypto/cipher/Cipher { +public final class de/gematik/openhealth/crypto/cipher/AesCbcSpec : de/gematik/openhealth/crypto/cipher/AesCipherIvSpec, de/gematik/openhealth/crypto/cipher/AesDecipherIvSpec { + public synthetic fun (I[BZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (I[BZLkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun getAutoPadding ()Z + public fun getIv ()[B + public fun getTagLength-3FapXmU ()I +} + +public abstract interface class de/gematik/openhealth/crypto/cipher/AesCipher : de/gematik/openhealth/crypto/cipher/Cipher { public abstract fun authTag ()[B - public abstract fun getSpec ()Lde/gematik/kmp/crypto/cipher/AesCipherSpec; + public abstract fun getSpec ()Lde/gematik/openhealth/crypto/cipher/AesCipherSpec; +} + +public abstract interface class de/gematik/openhealth/crypto/cipher/AesCipherIvSpec : de/gematik/openhealth/crypto/cipher/AesCipherSpec { + public abstract fun getIv ()[B } -public abstract interface class de/gematik/kmp/crypto/cipher/AesCipherSpec { - public abstract fun getTagLength-aQnKl3Q ()I +public abstract interface class de/gematik/openhealth/crypto/cipher/AesCipherSpec { + public abstract fun getAutoPadding ()Z + public abstract fun getTagLength-3FapXmU ()I } -public abstract interface class de/gematik/kmp/crypto/cipher/AesDecipher : de/gematik/kmp/crypto/cipher/Cipher { - public abstract fun getSpec ()Lde/gematik/kmp/crypto/cipher/AesDecipherSpec; +public abstract interface class de/gematik/openhealth/crypto/cipher/AesDecipher : de/gematik/openhealth/crypto/cipher/Cipher { + public abstract fun getSpec ()Lde/gematik/openhealth/crypto/cipher/AesDecipherSpec; } -public abstract interface class de/gematik/kmp/crypto/cipher/AesDecipherSpec { - public abstract fun getTagLength-aQnKl3Q ()I +public abstract interface class de/gematik/openhealth/crypto/cipher/AesDecipherIvSpec : de/gematik/openhealth/crypto/cipher/AesDecipherSpec { + public abstract fun getIv ()[B } -public final class de/gematik/kmp/crypto/cipher/AesEcbSpec : de/gematik/kmp/crypto/cipher/AesCipherSpec, de/gematik/kmp/crypto/cipher/AesDecipherSpec { - public synthetic fun (ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun getTagLength-aQnKl3Q ()I +public abstract interface class de/gematik/openhealth/crypto/cipher/AesDecipherSpec { + public abstract fun getAutoPadding ()Z + public abstract fun getTagLength-3FapXmU ()I } -public final class de/gematik/kmp/crypto/cipher/AesGcmCipherSpec : de/gematik/kmp/crypto/cipher/AesCipherSpec { +public final class de/gematik/openhealth/crypto/cipher/AesEcbSpec : de/gematik/openhealth/crypto/cipher/AesCipherSpec, de/gematik/openhealth/crypto/cipher/AesDecipherSpec { + public synthetic fun (IZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (IZLkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun getAutoPadding ()Z + public fun getTagLength-3FapXmU ()I +} + +public final class de/gematik/openhealth/crypto/cipher/AesGcmCipherSpec : de/gematik/openhealth/crypto/cipher/AesCipherIvSpec { public synthetic fun (I[B[BLkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getAad ()[B - public final fun getIv ()[B - public fun getTagLength-aQnKl3Q ()I + public fun getAutoPadding ()Z + public fun getIv ()[B + public fun getTagLength-3FapXmU ()I } -public final class de/gematik/kmp/crypto/cipher/AesGcmDecipherSpec : de/gematik/kmp/crypto/cipher/AesDecipherSpec { +public final class de/gematik/openhealth/crypto/cipher/AesGcmDecipherSpec : de/gematik/openhealth/crypto/cipher/AesDecipherIvSpec { public synthetic fun (I[B[B[BLkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getAad ()[B public final fun getAuthTag ()[B - public final fun getIv ()[B - public fun getTagLength-aQnKl3Q ()I + public fun getAutoPadding ()Z + public fun getIv ()[B + public fun getTagLength-3FapXmU ()I } -public final class de/gematik/kmp/crypto/cipher/Aes_jvmKt { - public static final fun createCipher (Lde/gematik/kmp/crypto/cipher/AesCipherSpec;Lde/gematik/kmp/crypto/key/SecretKey;)Lde/gematik/kmp/crypto/cipher/AesCipher; - public static final fun createDecipher (Lde/gematik/kmp/crypto/cipher/AesDecipherSpec;Lde/gematik/kmp/crypto/key/SecretKey;)Lde/gematik/kmp/crypto/cipher/AesDecipher; +public abstract interface class de/gematik/openhealth/crypto/cipher/Cipher { + public abstract fun final ()[B + public abstract fun update ([B)[B } -public abstract interface class de/gematik/kmp/crypto/cipher/Cipher { - public abstract fun final (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun update ([BLkotlin/coroutines/Continuation;)Ljava/lang/Object; +public abstract interface class de/gematik/openhealth/crypto/exchange/Ecdh { + public abstract fun computeSecret (Lde/gematik/openhealth/crypto/key/EcPublicKey;)[B + public abstract fun getSpec ()Lde/gematik/openhealth/crypto/exchange/EcdhSpec; } -public abstract interface class de/gematik/kmp/crypto/exchange/Ecdh { - public abstract fun computeSecret (Lde/gematik/kmp/crypto/key/EcPublicKey;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +public final class de/gematik/openhealth/crypto/exchange/EcdhSpec { + public fun (Lde/gematik/openhealth/crypto/key/EcCurve;)V + public final fun getCurve ()Lde/gematik/openhealth/crypto/key/EcCurve; } -public final class de/gematik/kmp/crypto/exchange/EcdhSpec { - public fun (Lde/gematik/kmp/crypto/key/EcCurve;)V - public final fun getCurve ()Lde/gematik/kmp/crypto/key/EcCurve; +public final class de/gematik/openhealth/crypto/kem/KemAlgorithm : java/lang/Enum { + public static final field Kyber768 Lde/gematik/openhealth/crypto/kem/KemAlgorithm; + public static final field MlKem768 Lde/gematik/openhealth/crypto/kem/KemAlgorithm; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lde/gematik/openhealth/crypto/kem/KemAlgorithm; + public static fun values ()[Lde/gematik/openhealth/crypto/kem/KemAlgorithm; } -public final class de/gematik/kmp/crypto/exchange/Ecdh_jvmKt { - public static final fun createKeyExchange (Lde/gematik/kmp/crypto/exchange/EcdhSpec;Lde/gematik/kmp/crypto/key/EcPrivateKey;)Lde/gematik/kmp/crypto/exchange/Ecdh; +public abstract interface class de/gematik/openhealth/crypto/kem/KemDecapsulation { + public abstract fun decapsulate ([B)Lde/gematik/openhealth/crypto/kem/KemDecapsulationResult; + public abstract fun encapsulationKey ()[B + public abstract fun getSpec ()Lde/gematik/openhealth/crypto/kem/KemSpec; } -public final class de/gematik/kmp/crypto/key/EcCurve : java/lang/Enum { - public static final field BrainpoolP256r1 Lde/gematik/kmp/crypto/key/EcCurve; - public static final field BrainpoolP384r1 Lde/gematik/kmp/crypto/key/EcCurve; - public static final field BrainpoolP512r1 Lde/gematik/kmp/crypto/key/EcCurve; +public final class de/gematik/openhealth/crypto/kem/KemDecapsulationResult { + public fun ([B)V + public final fun component1 ()[B + public final fun copy ([B)Lde/gematik/openhealth/crypto/kem/KemDecapsulationResult; + public static synthetic fun copy$default (Lde/gematik/openhealth/crypto/kem/KemDecapsulationResult;[BILjava/lang/Object;)Lde/gematik/openhealth/crypto/kem/KemDecapsulationResult; + public fun equals (Ljava/lang/Object;)Z + public final fun getSharedSecret ()[B + public fun hashCode ()I + public final fun isValid (Lde/gematik/openhealth/crypto/kem/KemEncapsulationResult;)Z + public fun toString ()Ljava/lang/String; +} + +public abstract interface class de/gematik/openhealth/crypto/kem/KemEncapsulation { + public abstract fun encapsulate ()Lde/gematik/openhealth/crypto/kem/KemEncapsulationResult; + public abstract fun getSpec ()Lde/gematik/openhealth/crypto/kem/KemSpec; +} + +public final class de/gematik/openhealth/crypto/kem/KemEncapsulationResult { + public fun ([B[B)V + public final fun component1 ()[B + public final fun component2 ()[B + public final fun copy ([B[B)Lde/gematik/openhealth/crypto/kem/KemEncapsulationResult; + public static synthetic fun copy$default (Lde/gematik/openhealth/crypto/kem/KemEncapsulationResult;[B[BILjava/lang/Object;)Lde/gematik/openhealth/crypto/kem/KemEncapsulationResult; + public fun equals (Ljava/lang/Object;)Z + public final fun getSharedSecret ()[B + public final fun getWrappedKey ()[B + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class de/gematik/openhealth/crypto/kem/KemSpec { + public fun (Lde/gematik/openhealth/crypto/kem/KemAlgorithm;)V + public final fun getAlgorithm ()Lde/gematik/openhealth/crypto/kem/KemAlgorithm; +} + +public final class de/gematik/openhealth/crypto/kem/Kem_jvmKt { + public static final fun nativeCreateDecapsulation (Lde/gematik/openhealth/crypto/kem/KemSpec;Lde/gematik/openhealth/crypto/CryptoScope;)Lde/gematik/openhealth/crypto/kem/KemDecapsulation; + public static final fun nativeCreateEncapsulation (Lde/gematik/openhealth/crypto/kem/KemSpec;Lde/gematik/openhealth/crypto/CryptoScope;[B)Lde/gematik/openhealth/crypto/kem/KemEncapsulation; +} + +public abstract class de/gematik/openhealth/crypto/key/EcCurve : java/lang/Enum { + public static final field BrainpoolP256r1 Lde/gematik/openhealth/crypto/key/EcCurve; + public static final field BrainpoolP384r1 Lde/gematik/openhealth/crypto/key/EcCurve; + public static final field BrainpoolP512r1 Lde/gematik/openhealth/crypto/key/EcCurve; + public synthetic fun (Ljava/lang/String;ILjava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public abstract fun getA ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; + public abstract fun getB ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; public static fun getEntries ()Lkotlin/enums/EnumEntries; + public final fun getG ()Lde/gematik/openhealth/crypto/key/EcPoint; public final fun getOid ()Ljava/lang/String; - public static fun valueOf (Ljava/lang/String;)Lde/gematik/kmp/crypto/key/EcCurve; - public static fun values ()[Lde/gematik/kmp/crypto/key/EcCurve; -} - -public final class de/gematik/kmp/crypto/key/EcKeyKt { - public static final fun decodeFromAsn1 (Lde/gematik/kmp/crypto/key/EcPrivateKey$Companion;[B)Lde/gematik/kmp/crypto/key/EcPrivateKey; - public static final fun decodeFromAsn1 (Lde/gematik/kmp/crypto/key/EcPublicKey$Companion;[B)Lde/gematik/kmp/crypto/key/EcPublicKey; - public static final fun decodeFromPem (Lde/gematik/kmp/crypto/key/EcPrivateKey$Companion;Ljava/lang/String;)Lde/gematik/kmp/crypto/key/EcPrivateKey; - public static final fun decodeFromPem (Lde/gematik/kmp/crypto/key/EcPublicKey$Companion;Ljava/lang/String;)Lde/gematik/kmp/crypto/key/EcPublicKey; - public static final fun encodeToAsn1 (Lde/gematik/kmp/crypto/key/EcPrivateKey;)[B - public static final fun encodeToAsn1 (Lde/gematik/kmp/crypto/key/EcPublicKey;)[B - public static final fun encodeToPem (Lde/gematik/kmp/crypto/key/EcPrivateKey;)Ljava/lang/String; - public static final fun encodeToPem (Lde/gematik/kmp/crypto/key/EcPublicKey;)Ljava/lang/String; - public static final fun fromScalar (Lde/gematik/kmp/crypto/key/EcPrivateKey$Companion;Lde/gematik/kmp/crypto/key/EcCurve;[B)Lde/gematik/kmp/crypto/key/EcPrivateKey; - public static final fun fromUncompressedFormat (Lde/gematik/kmp/crypto/key/EcPublicKey$Companion;Lde/gematik/kmp/crypto/key/EcCurve;[B)Lde/gematik/kmp/crypto/key/EcPublicKey; - public static final fun readEcCurveFromAlgorithmIdentifier (Lde/gematik/kmp/asn1/Asn1Decoder$ParserScope;)Lde/gematik/kmp/crypto/key/EcCurve; -} - -public final class de/gematik/kmp/crypto/key/EcPrivateKey : de/gematik/kmp/crypto/key/Key { - public static final field Companion Lde/gematik/kmp/crypto/key/EcPrivateKey$Companion; + public abstract fun getP ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; + public abstract fun getQ ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; + public abstract fun getX ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; + public abstract fun getY ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; + public final fun point (Lcom/ionspin/kotlin/bignum/integer/BigInteger;Lcom/ionspin/kotlin/bignum/integer/BigInteger;)Lde/gematik/openhealth/crypto/key/EcPoint; + public static fun valueOf (Ljava/lang/String;)Lde/gematik/openhealth/crypto/key/EcCurve; + public static fun values ()[Lde/gematik/openhealth/crypto/key/EcCurve; +} + +public final class de/gematik/openhealth/crypto/key/EcKeyKt { + public static final fun decodeFromAsn1 (Lde/gematik/openhealth/crypto/key/EcPrivateKey$Companion;[B)Lde/gematik/openhealth/crypto/key/EcPrivateKey; + public static final fun decodeFromAsn1 (Lde/gematik/openhealth/crypto/key/EcPublicKey$Companion;[B)Lde/gematik/openhealth/crypto/key/EcPublicKey; + public static final fun decodeFromPem (Lde/gematik/openhealth/crypto/key/EcPrivateKey$Companion;Ljava/lang/String;)Lde/gematik/openhealth/crypto/key/EcPrivateKey; + public static final fun decodeFromPem (Lde/gematik/openhealth/crypto/key/EcPublicKey$Companion;Ljava/lang/String;)Lde/gematik/openhealth/crypto/key/EcPublicKey; + public static final fun decodeFromUncompressedFormat (Lde/gematik/openhealth/crypto/key/EcPublicKey$Companion;Lde/gematik/openhealth/crypto/key/EcCurve;[B)Lde/gematik/openhealth/crypto/key/EcPublicKey; + public static final fun encodeToAsn1 (Lde/gematik/openhealth/crypto/key/EcPrivateKey;)[B + public static final fun encodeToAsn1 (Lde/gematik/openhealth/crypto/key/EcPublicKey;)[B + public static final fun encodeToPem (Lde/gematik/openhealth/crypto/key/EcPrivateKey;)Ljava/lang/String; + public static final fun encodeToPem (Lde/gematik/openhealth/crypto/key/EcPublicKey;)Ljava/lang/String; + public static final fun fromScalar (Lde/gematik/openhealth/crypto/key/EcPrivateKey$Companion;Lde/gematik/openhealth/crypto/key/EcCurve;[B)Lde/gematik/openhealth/crypto/key/EcPrivateKey; + public static final fun readEcCurveFromAlgorithmIdentifier (Lde/gematik/openhealth/asn1/Asn1Decoder$ParserScope;)Lde/gematik/openhealth/crypto/key/EcCurve; + public static final fun toEcPoint (Lde/gematik/openhealth/crypto/key/EcPublicKey;)Lde/gematik/openhealth/crypto/key/EcPoint; +} + +public final class de/gematik/openhealth/crypto/key/EcKeyPairSpec { + public fun (Lde/gematik/openhealth/crypto/key/EcCurve;)V + public final fun getCurve ()Lde/gematik/openhealth/crypto/key/EcCurve; +} + +public final class de/gematik/openhealth/crypto/key/EcKey_jvmKt { + public static final fun generateKeyPair (Lde/gematik/openhealth/crypto/key/EcKeyPairSpec;)Lkotlin/Pair; +} + +public final class de/gematik/openhealth/crypto/key/EcPoint { + public fun (Lde/gematik/openhealth/crypto/key/EcCurve;Lcom/ionspin/kotlin/bignum/integer/BigInteger;Lcom/ionspin/kotlin/bignum/integer/BigInteger;)V + public final fun component1 ()Lde/gematik/openhealth/crypto/key/EcCurve; + public final fun component2 ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; + public final fun component3 ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; + public final fun copy (Lde/gematik/openhealth/crypto/key/EcCurve;Lcom/ionspin/kotlin/bignum/integer/BigInteger;Lcom/ionspin/kotlin/bignum/integer/BigInteger;)Lde/gematik/openhealth/crypto/key/EcPoint; + public static synthetic fun copy$default (Lde/gematik/openhealth/crypto/key/EcPoint;Lde/gematik/openhealth/crypto/key/EcCurve;Lcom/ionspin/kotlin/bignum/integer/BigInteger;Lcom/ionspin/kotlin/bignum/integer/BigInteger;ILjava/lang/Object;)Lde/gematik/openhealth/crypto/key/EcPoint; public fun equals (Ljava/lang/Object;)Z - public final fun getCurve ()Lde/gematik/kmp/crypto/key/EcCurve; + public final fun getCurve ()Lde/gematik/openhealth/crypto/key/EcCurve; + public final fun getUncompressed ()[B + public final fun getX ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; + public final fun getY ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; + public fun hashCode ()I + public final fun isInfinity ()Z + public final fun negate ()Lde/gematik/openhealth/crypto/key/EcPoint; + public final fun plus (Lde/gematik/openhealth/crypto/key/EcPoint;)Lde/gematik/openhealth/crypto/key/EcPoint; + public final fun times (Lcom/ionspin/kotlin/bignum/integer/BigInteger;)Lde/gematik/openhealth/crypto/key/EcPoint; + public fun toString ()Ljava/lang/String; +} + +public final class de/gematik/openhealth/crypto/key/EcPointKt { + public static final fun toEcPublicKey (Lde/gematik/openhealth/crypto/key/EcPoint;)Lde/gematik/openhealth/crypto/key/EcPublicKey; +} + +public final class de/gematik/openhealth/crypto/key/EcPrivateKey : de/gematik/openhealth/crypto/key/Key { + public static final field Companion Lde/gematik/openhealth/crypto/key/EcPrivateKey$Companion; + public fun equals (Ljava/lang/Object;)Z + public final fun getCurve ()Lde/gematik/openhealth/crypto/key/EcCurve; public fun getData ()[B + public final fun getS ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; public fun hashCode ()I + public fun toString ()Ljava/lang/String; } -public final class de/gematik/kmp/crypto/key/EcPrivateKey$Companion { +public final class de/gematik/openhealth/crypto/key/EcPrivateKey$Companion { } -public final class de/gematik/kmp/crypto/key/EcPublicKey : de/gematik/kmp/crypto/key/Key { - public static final field Companion Lde/gematik/kmp/crypto/key/EcPublicKey$Companion; - public static final field oid Ljava/lang/String; +public final class de/gematik/openhealth/crypto/key/EcPublicKey : de/gematik/openhealth/crypto/key/Key { + public static final field Companion Lde/gematik/openhealth/crypto/key/EcPublicKey$Companion; + public static final field OID Ljava/lang/String; public fun equals (Ljava/lang/Object;)Z - public final fun getCurve ()Lde/gematik/kmp/crypto/key/EcCurve; + public final fun getCurve ()Lde/gematik/openhealth/crypto/key/EcCurve; public fun getData ()[B public fun hashCode ()I + public fun toString ()Ljava/lang/String; } -public final class de/gematik/kmp/crypto/key/EcPublicKey$Companion { +public final class de/gematik/openhealth/crypto/key/EcPublicKey$Companion { } -public abstract interface class de/gematik/kmp/crypto/key/Key { +public abstract interface class de/gematik/openhealth/crypto/key/Key { public abstract fun getData ()[B } -public final class de/gematik/kmp/crypto/key/SecretKey : de/gematik/kmp/crypto/key/Key { +public final class de/gematik/openhealth/crypto/key/SecretKey : de/gematik/openhealth/crypto/key/Key { public fun ([B)V + public fun equals (Ljava/lang/Object;)Z public fun getData ()[B - public final fun getLength-aQnKl3Q ()I + public final fun getLength-3FapXmU ()I + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class de/gematik/openhealth/crypto/wrapper/ProviderKt { + public static final fun runWithProvider (Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; +} + +public final class de/gematik/openhealth/crypto/wrapper/WrapperUtilsKt { + public static final fun toUint8Vector ([B)Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector; } diff --git a/crypto/api/jvm/crypto.api b/crypto/api/jvm/crypto.api index 09ce2dd5..b848a158 100644 --- a/crypto/api/jvm/crypto.api +++ b/crypto/api/jvm/crypto.api @@ -1,5 +1,5 @@ -public final class de/gematik/kmp/crypto/ByteUnit { - public static final synthetic fun box-impl (I)Lde/gematik/kmp/crypto/ByteUnit; +public final class de/gematik/openhealth/crypto/ByteUnit { + public static final synthetic fun box-impl (I)Lde/gematik/openhealth/crypto/ByteUnit; public static fun constructor-impl (I)I public fun equals (Ljava/lang/Object;)Z public static fun equals-impl (ILjava/lang/Object;)Z @@ -12,214 +12,378 @@ public final class de/gematik/kmp/crypto/ByteUnit { public final synthetic fun unbox-impl ()I } -public abstract interface class de/gematik/kmp/crypto/Cmac { - public abstract fun final (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun getAlgorithm ()Lde/gematik/kmp/crypto/CmacAlgorithm; - public abstract fun update ([BLkotlin/coroutines/Continuation;)Ljava/lang/Object; +public final class de/gematik/openhealth/crypto/ByteUnitKt { + public static final fun getBits (I)I + public static final fun getBits-bc5Nprg (I)I + public static final fun getBytes (I)I + public static final fun getBytes-bc5Nprg (I)I +} + +public abstract interface class de/gematik/openhealth/crypto/Cmac { + public abstract fun final ()[B + public abstract fun getSpec ()Lde/gematik/openhealth/crypto/CmacSpec; + public abstract fun update ([B)V } -public final class de/gematik/kmp/crypto/CmacAlgorithm : java/lang/Enum { - public static final field Aes Lde/gematik/kmp/crypto/CmacAlgorithm; +public final class de/gematik/openhealth/crypto/CmacAlgorithm : java/lang/Enum { + public static final field Aes Lde/gematik/openhealth/crypto/CmacAlgorithm; public static fun getEntries ()Lkotlin/enums/EnumEntries; - public static fun valueOf (Ljava/lang/String;)Lde/gematik/kmp/crypto/CmacAlgorithm; - public static fun values ()[Lde/gematik/kmp/crypto/CmacAlgorithm; + public static fun valueOf (Ljava/lang/String;)Lde/gematik/openhealth/crypto/CmacAlgorithm; + public static fun values ()[Lde/gematik/openhealth/crypto/CmacAlgorithm; } -public final class de/gematik/kmp/crypto/CmacException : java/lang/Throwable { +public final class de/gematik/openhealth/crypto/CmacException : java/lang/Throwable { public fun (Ljava/lang/String;Ljava/lang/Throwable;)V public synthetic fun (Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun getCause ()Ljava/lang/Throwable; public fun getMessage ()Ljava/lang/String; } -public final class de/gematik/kmp/crypto/Cmac_jvmKt { - public static final fun createCmac (Lde/gematik/kmp/crypto/CmacAlgorithm;[B)Lde/gematik/kmp/crypto/Cmac; +public final class de/gematik/openhealth/crypto/CmacSpec { + public fun (Lde/gematik/openhealth/crypto/CmacAlgorithm;)V + public final fun getAlgorithm ()Lde/gematik/openhealth/crypto/CmacAlgorithm; +} + +public final class de/gematik/openhealth/crypto/Cmac_jvmKt { + public static final fun nativeCreateCmac (Lde/gematik/openhealth/crypto/CmacSpec;Lde/gematik/openhealth/crypto/CryptoScope;Lde/gematik/openhealth/crypto/key/SecretKey;)Lde/gematik/openhealth/crypto/Cmac; +} + +public final class de/gematik/openhealth/crypto/ConstantTimeKt { + public static final fun contentConstantTimeEquals ([B[B)Z +} + +public final class de/gematik/openhealth/crypto/ConstantTime_jvmKt { + public static final fun nativeConstantTimeEquals ([B[B)Z +} + +public abstract class de/gematik/openhealth/crypto/CryptoScope { + public fun ()V + public final fun createCipher (Lde/gematik/openhealth/crypto/cipher/AesCipherSpec;Lde/gematik/openhealth/crypto/key/SecretKey;)Lde/gematik/openhealth/crypto/cipher/AesCipher; + public final fun createCmac (Lde/gematik/openhealth/crypto/CmacSpec;Lde/gematik/openhealth/crypto/key/SecretKey;)Lde/gematik/openhealth/crypto/Cmac; + public final fun createDecapsulation (Lde/gematik/openhealth/crypto/kem/KemSpec;)Lde/gematik/openhealth/crypto/kem/KemDecapsulation; + public final fun createDecipher (Lde/gematik/openhealth/crypto/cipher/AesDecipherSpec;Lde/gematik/openhealth/crypto/key/SecretKey;)Lde/gematik/openhealth/crypto/cipher/AesDecipher; + public final fun createEncapsulation (Lde/gematik/openhealth/crypto/kem/KemSpec;[B)Lde/gematik/openhealth/crypto/kem/KemEncapsulation; + public final fun createHash (Lde/gematik/openhealth/crypto/HashSpec;)Lde/gematik/openhealth/crypto/Hash; + public final fun createKeyExchange (Lde/gematik/openhealth/crypto/exchange/EcdhSpec;Lde/gematik/openhealth/crypto/key/EcPrivateKey;)Lde/gematik/openhealth/crypto/exchange/Ecdh; +} + +public final class de/gematik/openhealth/crypto/CryptoScopeKt { + public static final fun useCrypto (Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public static final fun useCryptoAsync (Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } -public abstract interface annotation class de/gematik/kmp/crypto/ExperimentalCryptoApi : java/lang/annotation/Annotation { +public abstract interface annotation class de/gematik/openhealth/crypto/ExperimentalCryptoApi : java/lang/annotation/Annotation { } -public abstract interface class de/gematik/kmp/crypto/Hash { - public abstract fun digest (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun getAlgorithm ()Lde/gematik/kmp/crypto/HashAlgorithm; - public abstract fun update ([BLkotlin/coroutines/Continuation;)Ljava/lang/Object; +public abstract interface class de/gematik/openhealth/crypto/Hash { + public abstract fun digest ()[B + public abstract fun getSpec ()Lde/gematik/openhealth/crypto/HashSpec; + public abstract fun update ([B)V } -public final class de/gematik/kmp/crypto/HashAlgorithm : java/lang/Enum { - public static final field Sha1 Lde/gematik/kmp/crypto/HashAlgorithm; +public final class de/gematik/openhealth/crypto/HashAlgorithm : java/lang/Enum { + public static final field Sha1 Lde/gematik/openhealth/crypto/HashAlgorithm; + public static final field Sha256 Lde/gematik/openhealth/crypto/HashAlgorithm; + public static final field Sha384 Lde/gematik/openhealth/crypto/HashAlgorithm; + public static final field Sha512 Lde/gematik/openhealth/crypto/HashAlgorithm; + public static final field Shake128 Lde/gematik/openhealth/crypto/HashAlgorithm; + public static final field Shake256 Lde/gematik/openhealth/crypto/HashAlgorithm; public static fun getEntries ()Lkotlin/enums/EnumEntries; - public static fun valueOf (Ljava/lang/String;)Lde/gematik/kmp/crypto/HashAlgorithm; - public static fun values ()[Lde/gematik/kmp/crypto/HashAlgorithm; + public static fun valueOf (Ljava/lang/String;)Lde/gematik/openhealth/crypto/HashAlgorithm; + public static fun values ()[Lde/gematik/openhealth/crypto/HashAlgorithm; } -public final class de/gematik/kmp/crypto/HashException : java/lang/Throwable { +public final class de/gematik/openhealth/crypto/HashException : java/lang/Throwable { public fun (Ljava/lang/String;Ljava/lang/Throwable;)V public synthetic fun (Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun getCause ()Ljava/lang/Throwable; public fun getMessage ()Ljava/lang/String; } -public final class de/gematik/kmp/crypto/Hash_jvmKt { - public static final fun createHash (Lde/gematik/kmp/crypto/HashAlgorithm;)Lde/gematik/kmp/crypto/Hash; +public final class de/gematik/openhealth/crypto/HashSpec { + public fun (Lde/gematik/openhealth/crypto/HashAlgorithm;)V + public final fun getAlgorithm ()Lde/gematik/openhealth/crypto/HashAlgorithm; } -public final class de/gematik/kmp/crypto/JvmCmac : de/gematik/kmp/crypto/Cmac { - public fun (Lde/gematik/kmp/crypto/CmacAlgorithm;[B)V - public fun final (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getAlgorithm ()Lde/gematik/kmp/crypto/CmacAlgorithm; - public fun update ([BLkotlin/coroutines/Continuation;)Ljava/lang/Object; +public final class de/gematik/openhealth/crypto/Hash_jvmKt { + public static final fun nativeCreateHash (Lde/gematik/openhealth/crypto/HashSpec;Lde/gematik/openhealth/crypto/CryptoScope;)Lde/gematik/openhealth/crypto/Hash; } -public final class de/gematik/kmp/crypto/JvmHash : de/gematik/kmp/crypto/Hash { - public fun (Lde/gematik/kmp/crypto/HashAlgorithm;)V - public fun digest (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getAlgorithm ()Lde/gematik/kmp/crypto/HashAlgorithm; - public fun update ([BLkotlin/coroutines/Continuation;)Ljava/lang/Object; +public final class de/gematik/openhealth/crypto/LazySuspend { + public fun (Lkotlin/jvm/functions/Function1;)V + public final fun get (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun tryGet ()Ljava/lang/Object; } -public final class de/gematik/kmp/crypto/Pem { +public final class de/gematik/openhealth/crypto/Pem { public fun (Ljava/lang/String;[B)V public final fun getData ()[B public final fun getType ()Ljava/lang/String; } -public final class de/gematik/kmp/crypto/PemKt { - public static final fun decodeToPem (Ljava/lang/String;)Lde/gematik/kmp/crypto/Pem; - public static final fun encodeToString (Lde/gematik/kmp/crypto/Pem;)Ljava/lang/String; +public final class de/gematik/openhealth/crypto/PemKt { + public static final fun decodeToPem (Ljava/lang/String;)Lde/gematik/openhealth/crypto/Pem; + public static final fun encodeToString (Lde/gematik/openhealth/crypto/Pem;)Ljava/lang/String; } -public abstract class de/gematik/kmp/crypto/SecureRandom : kotlin/random/Random { +public final class de/gematik/openhealth/crypto/Provider_jvmKt { + public static final fun initializeNativeCryptoProvider (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public abstract class de/gematik/openhealth/crypto/SecureRandom : kotlin/random/Random { public fun ()V } -public final class de/gematik/kmp/crypto/SecureRandom_jvmKt { - public static final fun secureRandom ()Lde/gematik/kmp/crypto/SecureRandom; +public final class de/gematik/openhealth/crypto/SecureRandom_jvmKt { + public static final fun secureRandom ()Lde/gematik/openhealth/crypto/SecureRandom; } -public final class de/gematik/kmp/crypto/UnitsKt { - public static final fun getBits (I)I - public static final fun getBits-CJXw4fk (I)I - public static final fun getBytes (I)I - public static final fun getBytes-CJXw4fk (I)I +public abstract interface annotation class de/gematik/openhealth/crypto/UnoptimizedCryptoApi : java/lang/annotation/Annotation { + public abstract fun ticket ()Ljava/lang/String; } -public abstract interface annotation class de/gematik/kmp/crypto/UnsafeCryptoApi : java/lang/annotation/Annotation { +public abstract interface annotation class de/gematik/openhealth/crypto/UnsafeCryptoApi : java/lang/annotation/Annotation { } -public abstract interface class de/gematik/kmp/crypto/cipher/AesCipher : de/gematik/kmp/crypto/cipher/Cipher { +public final class de/gematik/openhealth/crypto/cipher/AesCbcSpec : de/gematik/openhealth/crypto/cipher/AesCipherIvSpec, de/gematik/openhealth/crypto/cipher/AesDecipherIvSpec { + public synthetic fun (I[BZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (I[BZLkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun getAutoPadding ()Z + public fun getIv ()[B + public fun getTagLength-3FapXmU ()I +} + +public abstract interface class de/gematik/openhealth/crypto/cipher/AesCipher : de/gematik/openhealth/crypto/cipher/Cipher { public abstract fun authTag ()[B - public abstract fun getSpec ()Lde/gematik/kmp/crypto/cipher/AesCipherSpec; + public abstract fun getSpec ()Lde/gematik/openhealth/crypto/cipher/AesCipherSpec; +} + +public abstract interface class de/gematik/openhealth/crypto/cipher/AesCipherIvSpec : de/gematik/openhealth/crypto/cipher/AesCipherSpec { + public abstract fun getIv ()[B } -public abstract interface class de/gematik/kmp/crypto/cipher/AesCipherSpec { - public abstract fun getTagLength-aQnKl3Q ()I +public abstract interface class de/gematik/openhealth/crypto/cipher/AesCipherSpec { + public abstract fun getAutoPadding ()Z + public abstract fun getTagLength-3FapXmU ()I } -public abstract interface class de/gematik/kmp/crypto/cipher/AesDecipher : de/gematik/kmp/crypto/cipher/Cipher { - public abstract fun getSpec ()Lde/gematik/kmp/crypto/cipher/AesDecipherSpec; +public abstract interface class de/gematik/openhealth/crypto/cipher/AesDecipher : de/gematik/openhealth/crypto/cipher/Cipher { + public abstract fun getSpec ()Lde/gematik/openhealth/crypto/cipher/AesDecipherSpec; } -public abstract interface class de/gematik/kmp/crypto/cipher/AesDecipherSpec { - public abstract fun getTagLength-aQnKl3Q ()I +public abstract interface class de/gematik/openhealth/crypto/cipher/AesDecipherIvSpec : de/gematik/openhealth/crypto/cipher/AesDecipherSpec { + public abstract fun getIv ()[B } -public final class de/gematik/kmp/crypto/cipher/AesEcbSpec : de/gematik/kmp/crypto/cipher/AesCipherSpec, de/gematik/kmp/crypto/cipher/AesDecipherSpec { - public synthetic fun (ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun getTagLength-aQnKl3Q ()I +public abstract interface class de/gematik/openhealth/crypto/cipher/AesDecipherSpec { + public abstract fun getAutoPadding ()Z + public abstract fun getTagLength-3FapXmU ()I } -public final class de/gematik/kmp/crypto/cipher/AesGcmCipherSpec : de/gematik/kmp/crypto/cipher/AesCipherSpec { +public final class de/gematik/openhealth/crypto/cipher/AesEcbSpec : de/gematik/openhealth/crypto/cipher/AesCipherSpec, de/gematik/openhealth/crypto/cipher/AesDecipherSpec { + public synthetic fun (IZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (IZLkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun getAutoPadding ()Z + public fun getTagLength-3FapXmU ()I +} + +public final class de/gematik/openhealth/crypto/cipher/AesGcmCipherSpec : de/gematik/openhealth/crypto/cipher/AesCipherIvSpec { public synthetic fun (I[B[BLkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getAad ()[B - public final fun getIv ()[B - public fun getTagLength-aQnKl3Q ()I + public fun getAutoPadding ()Z + public fun getIv ()[B + public fun getTagLength-3FapXmU ()I } -public final class de/gematik/kmp/crypto/cipher/AesGcmDecipherSpec : de/gematik/kmp/crypto/cipher/AesDecipherSpec { +public final class de/gematik/openhealth/crypto/cipher/AesGcmDecipherSpec : de/gematik/openhealth/crypto/cipher/AesDecipherIvSpec { public synthetic fun (I[B[B[BLkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getAad ()[B public final fun getAuthTag ()[B - public final fun getIv ()[B - public fun getTagLength-aQnKl3Q ()I + public fun getAutoPadding ()Z + public fun getIv ()[B + public fun getTagLength-3FapXmU ()I } -public final class de/gematik/kmp/crypto/cipher/Aes_jvmKt { - public static final fun createCipher (Lde/gematik/kmp/crypto/cipher/AesCipherSpec;Lde/gematik/kmp/crypto/key/SecretKey;)Lde/gematik/kmp/crypto/cipher/AesCipher; - public static final fun createDecipher (Lde/gematik/kmp/crypto/cipher/AesDecipherSpec;Lde/gematik/kmp/crypto/key/SecretKey;)Lde/gematik/kmp/crypto/cipher/AesDecipher; +public abstract interface class de/gematik/openhealth/crypto/cipher/Cipher { + public abstract fun final ()[B + public abstract fun update ([B)[B } -public abstract interface class de/gematik/kmp/crypto/cipher/Cipher { - public abstract fun final (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun update ([BLkotlin/coroutines/Continuation;)Ljava/lang/Object; +public abstract interface class de/gematik/openhealth/crypto/exchange/Ecdh { + public abstract fun computeSecret (Lde/gematik/openhealth/crypto/key/EcPublicKey;)[B + public abstract fun getSpec ()Lde/gematik/openhealth/crypto/exchange/EcdhSpec; } -public abstract interface class de/gematik/kmp/crypto/exchange/Ecdh { - public abstract fun computeSecret (Lde/gematik/kmp/crypto/key/EcPublicKey;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +public final class de/gematik/openhealth/crypto/exchange/EcdhSpec { + public fun (Lde/gematik/openhealth/crypto/key/EcCurve;)V + public final fun getCurve ()Lde/gematik/openhealth/crypto/key/EcCurve; } -public final class de/gematik/kmp/crypto/exchange/EcdhSpec { - public fun (Lde/gematik/kmp/crypto/key/EcCurve;)V - public final fun getCurve ()Lde/gematik/kmp/crypto/key/EcCurve; +public final class de/gematik/openhealth/crypto/kem/KemAlgorithm : java/lang/Enum { + public static final field Kyber768 Lde/gematik/openhealth/crypto/kem/KemAlgorithm; + public static final field MlKem768 Lde/gematik/openhealth/crypto/kem/KemAlgorithm; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lde/gematik/openhealth/crypto/kem/KemAlgorithm; + public static fun values ()[Lde/gematik/openhealth/crypto/kem/KemAlgorithm; } -public final class de/gematik/kmp/crypto/exchange/Ecdh_jvmKt { - public static final fun createKeyExchange (Lde/gematik/kmp/crypto/exchange/EcdhSpec;Lde/gematik/kmp/crypto/key/EcPrivateKey;)Lde/gematik/kmp/crypto/exchange/Ecdh; +public abstract interface class de/gematik/openhealth/crypto/kem/KemDecapsulation { + public abstract fun decapsulate ([B)Lde/gematik/openhealth/crypto/kem/KemDecapsulationResult; + public abstract fun encapsulationKey ()[B + public abstract fun getSpec ()Lde/gematik/openhealth/crypto/kem/KemSpec; } -public final class de/gematik/kmp/crypto/key/EcCurve : java/lang/Enum { - public static final field BrainpoolP256r1 Lde/gematik/kmp/crypto/key/EcCurve; - public static final field BrainpoolP384r1 Lde/gematik/kmp/crypto/key/EcCurve; - public static final field BrainpoolP512r1 Lde/gematik/kmp/crypto/key/EcCurve; +public final class de/gematik/openhealth/crypto/kem/KemDecapsulationResult { + public fun ([B)V + public final fun component1 ()[B + public final fun copy ([B)Lde/gematik/openhealth/crypto/kem/KemDecapsulationResult; + public static synthetic fun copy$default (Lde/gematik/openhealth/crypto/kem/KemDecapsulationResult;[BILjava/lang/Object;)Lde/gematik/openhealth/crypto/kem/KemDecapsulationResult; + public fun equals (Ljava/lang/Object;)Z + public final fun getSharedSecret ()[B + public fun hashCode ()I + public final fun isValid (Lde/gematik/openhealth/crypto/kem/KemEncapsulationResult;)Z + public fun toString ()Ljava/lang/String; +} + +public abstract interface class de/gematik/openhealth/crypto/kem/KemEncapsulation { + public abstract fun encapsulate ()Lde/gematik/openhealth/crypto/kem/KemEncapsulationResult; + public abstract fun getSpec ()Lde/gematik/openhealth/crypto/kem/KemSpec; +} + +public final class de/gematik/openhealth/crypto/kem/KemEncapsulationResult { + public fun ([B[B)V + public final fun component1 ()[B + public final fun component2 ()[B + public final fun copy ([B[B)Lde/gematik/openhealth/crypto/kem/KemEncapsulationResult; + public static synthetic fun copy$default (Lde/gematik/openhealth/crypto/kem/KemEncapsulationResult;[B[BILjava/lang/Object;)Lde/gematik/openhealth/crypto/kem/KemEncapsulationResult; + public fun equals (Ljava/lang/Object;)Z + public final fun getSharedSecret ()[B + public final fun getWrappedKey ()[B + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class de/gematik/openhealth/crypto/kem/KemSpec { + public fun (Lde/gematik/openhealth/crypto/kem/KemAlgorithm;)V + public final fun getAlgorithm ()Lde/gematik/openhealth/crypto/kem/KemAlgorithm; +} + +public final class de/gematik/openhealth/crypto/kem/Kem_jvmKt { + public static final fun nativeCreateDecapsulation (Lde/gematik/openhealth/crypto/kem/KemSpec;Lde/gematik/openhealth/crypto/CryptoScope;)Lde/gematik/openhealth/crypto/kem/KemDecapsulation; + public static final fun nativeCreateEncapsulation (Lde/gematik/openhealth/crypto/kem/KemSpec;Lde/gematik/openhealth/crypto/CryptoScope;[B)Lde/gematik/openhealth/crypto/kem/KemEncapsulation; +} + +public abstract class de/gematik/openhealth/crypto/key/EcCurve : java/lang/Enum { + public static final field BrainpoolP256r1 Lde/gematik/openhealth/crypto/key/EcCurve; + public static final field BrainpoolP384r1 Lde/gematik/openhealth/crypto/key/EcCurve; + public static final field BrainpoolP512r1 Lde/gematik/openhealth/crypto/key/EcCurve; + public synthetic fun (Ljava/lang/String;ILjava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public abstract fun getA ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; + public abstract fun getB ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; public static fun getEntries ()Lkotlin/enums/EnumEntries; + public final fun getG ()Lde/gematik/openhealth/crypto/key/EcPoint; public final fun getOid ()Ljava/lang/String; - public static fun valueOf (Ljava/lang/String;)Lde/gematik/kmp/crypto/key/EcCurve; - public static fun values ()[Lde/gematik/kmp/crypto/key/EcCurve; -} - -public final class de/gematik/kmp/crypto/key/EcKeyKt { - public static final fun decodeFromAsn1 (Lde/gematik/kmp/crypto/key/EcPrivateKey$Companion;[B)Lde/gematik/kmp/crypto/key/EcPrivateKey; - public static final fun decodeFromAsn1 (Lde/gematik/kmp/crypto/key/EcPublicKey$Companion;[B)Lde/gematik/kmp/crypto/key/EcPublicKey; - public static final fun decodeFromPem (Lde/gematik/kmp/crypto/key/EcPrivateKey$Companion;Ljava/lang/String;)Lde/gematik/kmp/crypto/key/EcPrivateKey; - public static final fun decodeFromPem (Lde/gematik/kmp/crypto/key/EcPublicKey$Companion;Ljava/lang/String;)Lde/gematik/kmp/crypto/key/EcPublicKey; - public static final fun encodeToAsn1 (Lde/gematik/kmp/crypto/key/EcPrivateKey;)[B - public static final fun encodeToAsn1 (Lde/gematik/kmp/crypto/key/EcPublicKey;)[B - public static final fun encodeToPem (Lde/gematik/kmp/crypto/key/EcPrivateKey;)Ljava/lang/String; - public static final fun encodeToPem (Lde/gematik/kmp/crypto/key/EcPublicKey;)Ljava/lang/String; - public static final fun fromScalar (Lde/gematik/kmp/crypto/key/EcPrivateKey$Companion;Lde/gematik/kmp/crypto/key/EcCurve;[B)Lde/gematik/kmp/crypto/key/EcPrivateKey; - public static final fun fromUncompressedFormat (Lde/gematik/kmp/crypto/key/EcPublicKey$Companion;Lde/gematik/kmp/crypto/key/EcCurve;[B)Lde/gematik/kmp/crypto/key/EcPublicKey; - public static final fun readEcCurveFromAlgorithmIdentifier (Lde/gematik/kmp/asn1/Asn1Decoder$ParserScope;)Lde/gematik/kmp/crypto/key/EcCurve; -} - -public final class de/gematik/kmp/crypto/key/EcPrivateKey : de/gematik/kmp/crypto/key/Key { - public static final field Companion Lde/gematik/kmp/crypto/key/EcPrivateKey$Companion; + public abstract fun getP ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; + public abstract fun getQ ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; + public abstract fun getX ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; + public abstract fun getY ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; + public final fun point (Lcom/ionspin/kotlin/bignum/integer/BigInteger;Lcom/ionspin/kotlin/bignum/integer/BigInteger;)Lde/gematik/openhealth/crypto/key/EcPoint; + public static fun valueOf (Ljava/lang/String;)Lde/gematik/openhealth/crypto/key/EcCurve; + public static fun values ()[Lde/gematik/openhealth/crypto/key/EcCurve; +} + +public final class de/gematik/openhealth/crypto/key/EcKeyKt { + public static final fun decodeFromAsn1 (Lde/gematik/openhealth/crypto/key/EcPrivateKey$Companion;[B)Lde/gematik/openhealth/crypto/key/EcPrivateKey; + public static final fun decodeFromAsn1 (Lde/gematik/openhealth/crypto/key/EcPublicKey$Companion;[B)Lde/gematik/openhealth/crypto/key/EcPublicKey; + public static final fun decodeFromPem (Lde/gematik/openhealth/crypto/key/EcPrivateKey$Companion;Ljava/lang/String;)Lde/gematik/openhealth/crypto/key/EcPrivateKey; + public static final fun decodeFromPem (Lde/gematik/openhealth/crypto/key/EcPublicKey$Companion;Ljava/lang/String;)Lde/gematik/openhealth/crypto/key/EcPublicKey; + public static final fun decodeFromUncompressedFormat (Lde/gematik/openhealth/crypto/key/EcPublicKey$Companion;Lde/gematik/openhealth/crypto/key/EcCurve;[B)Lde/gematik/openhealth/crypto/key/EcPublicKey; + public static final fun encodeToAsn1 (Lde/gematik/openhealth/crypto/key/EcPrivateKey;)[B + public static final fun encodeToAsn1 (Lde/gematik/openhealth/crypto/key/EcPublicKey;)[B + public static final fun encodeToPem (Lde/gematik/openhealth/crypto/key/EcPrivateKey;)Ljava/lang/String; + public static final fun encodeToPem (Lde/gematik/openhealth/crypto/key/EcPublicKey;)Ljava/lang/String; + public static final fun fromScalar (Lde/gematik/openhealth/crypto/key/EcPrivateKey$Companion;Lde/gematik/openhealth/crypto/key/EcCurve;[B)Lde/gematik/openhealth/crypto/key/EcPrivateKey; + public static final fun readEcCurveFromAlgorithmIdentifier (Lde/gematik/openhealth/asn1/Asn1Decoder$ParserScope;)Lde/gematik/openhealth/crypto/key/EcCurve; + public static final fun toEcPoint (Lde/gematik/openhealth/crypto/key/EcPublicKey;)Lde/gematik/openhealth/crypto/key/EcPoint; +} + +public final class de/gematik/openhealth/crypto/key/EcKeyPairSpec { + public fun (Lde/gematik/openhealth/crypto/key/EcCurve;)V + public final fun getCurve ()Lde/gematik/openhealth/crypto/key/EcCurve; +} + +public final class de/gematik/openhealth/crypto/key/EcKey_jvmKt { + public static final fun generateKeyPair (Lde/gematik/openhealth/crypto/key/EcKeyPairSpec;)Lkotlin/Pair; +} + +public final class de/gematik/openhealth/crypto/key/EcPoint { + public fun (Lde/gematik/openhealth/crypto/key/EcCurve;Lcom/ionspin/kotlin/bignum/integer/BigInteger;Lcom/ionspin/kotlin/bignum/integer/BigInteger;)V + public final fun component1 ()Lde/gematik/openhealth/crypto/key/EcCurve; + public final fun component2 ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; + public final fun component3 ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; + public final fun copy (Lde/gematik/openhealth/crypto/key/EcCurve;Lcom/ionspin/kotlin/bignum/integer/BigInteger;Lcom/ionspin/kotlin/bignum/integer/BigInteger;)Lde/gematik/openhealth/crypto/key/EcPoint; + public static synthetic fun copy$default (Lde/gematik/openhealth/crypto/key/EcPoint;Lde/gematik/openhealth/crypto/key/EcCurve;Lcom/ionspin/kotlin/bignum/integer/BigInteger;Lcom/ionspin/kotlin/bignum/integer/BigInteger;ILjava/lang/Object;)Lde/gematik/openhealth/crypto/key/EcPoint; public fun equals (Ljava/lang/Object;)Z - public final fun getCurve ()Lde/gematik/kmp/crypto/key/EcCurve; + public final fun getCurve ()Lde/gematik/openhealth/crypto/key/EcCurve; + public final fun getUncompressed ()[B + public final fun getX ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; + public final fun getY ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; + public fun hashCode ()I + public final fun isInfinity ()Z + public final fun negate ()Lde/gematik/openhealth/crypto/key/EcPoint; + public final fun plus (Lde/gematik/openhealth/crypto/key/EcPoint;)Lde/gematik/openhealth/crypto/key/EcPoint; + public final fun times (Lcom/ionspin/kotlin/bignum/integer/BigInteger;)Lde/gematik/openhealth/crypto/key/EcPoint; + public fun toString ()Ljava/lang/String; +} + +public final class de/gematik/openhealth/crypto/key/EcPointKt { + public static final fun toEcPublicKey (Lde/gematik/openhealth/crypto/key/EcPoint;)Lde/gematik/openhealth/crypto/key/EcPublicKey; +} + +public final class de/gematik/openhealth/crypto/key/EcPrivateKey : de/gematik/openhealth/crypto/key/Key { + public static final field Companion Lde/gematik/openhealth/crypto/key/EcPrivateKey$Companion; + public fun equals (Ljava/lang/Object;)Z + public final fun getCurve ()Lde/gematik/openhealth/crypto/key/EcCurve; public fun getData ()[B + public final fun getS ()Lcom/ionspin/kotlin/bignum/integer/BigInteger; public fun hashCode ()I + public fun toString ()Ljava/lang/String; } -public final class de/gematik/kmp/crypto/key/EcPrivateKey$Companion { +public final class de/gematik/openhealth/crypto/key/EcPrivateKey$Companion { } -public final class de/gematik/kmp/crypto/key/EcPublicKey : de/gematik/kmp/crypto/key/Key { - public static final field Companion Lde/gematik/kmp/crypto/key/EcPublicKey$Companion; - public static final field oid Ljava/lang/String; +public final class de/gematik/openhealth/crypto/key/EcPublicKey : de/gematik/openhealth/crypto/key/Key { + public static final field Companion Lde/gematik/openhealth/crypto/key/EcPublicKey$Companion; + public static final field OID Ljava/lang/String; public fun equals (Ljava/lang/Object;)Z - public final fun getCurve ()Lde/gematik/kmp/crypto/key/EcCurve; + public final fun getCurve ()Lde/gematik/openhealth/crypto/key/EcCurve; public fun getData ()[B public fun hashCode ()I + public fun toString ()Ljava/lang/String; } -public final class de/gematik/kmp/crypto/key/EcPublicKey$Companion { +public final class de/gematik/openhealth/crypto/key/EcPublicKey$Companion { } -public abstract interface class de/gematik/kmp/crypto/key/Key { +public abstract interface class de/gematik/openhealth/crypto/key/Key { public abstract fun getData ()[B } -public final class de/gematik/kmp/crypto/key/SecretKey : de/gematik/kmp/crypto/key/Key { +public final class de/gematik/openhealth/crypto/key/SecretKey : de/gematik/openhealth/crypto/key/Key { public fun ([B)V + public fun equals (Ljava/lang/Object;)Z public fun getData ()[B - public final fun getLength-aQnKl3Q ()I + public final fun getLength-3FapXmU ()I + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class de/gematik/openhealth/crypto/wrapper/ProviderKt { + public static final fun runWithProvider (Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; +} + +public final class de/gematik/openhealth/crypto/wrapper/WrapperUtilsKt { + public static final fun toUint8Vector ([B)Lde/gematik/openhealth/crypto/internal/interop/Uint8Vector; } diff --git a/crypto/build.gradle.kts b/crypto/build.gradle.kts index 5061ded6..aaa6704f 100644 --- a/crypto/build.gradle.kts +++ b/crypto/build.gradle.kts @@ -27,6 +27,8 @@ plugins { group = project.findProperty("gematik.baseGroup") as String version = project.findProperty("gematik.version") as String +val cmakeVersion = project.findProperty("cmake.version") as? String ?: "3.31.6" + kotlin { jvm { } @@ -82,21 +84,16 @@ kotlin { dependsOn(commonMain) dependencies { api(project(":crypto-jvm-swig")) + implementation(project(":crypto-jvm-lib")) } } val jvmMain by getting { dependsOn(jvm) - dependencies { - implementation(project(":crypto-jvm-lib")) - } } val jvmTest by getting { } val androidMain by getting { dependsOn(jvm) - dependencies { - implementation(project(":crypto-jvm-lib")) - } } val androidInstrumentedTest by getting { dependencies { @@ -165,7 +162,7 @@ android { } externalNativeBuild { cmake { - version = "3.31.6" + version = cmakeVersion path("$rootDir/libs/openssl/wrapper/CMakeLists.txt".toPath().toFile()) } } diff --git a/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/CmacTest.kt b/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/CmacTest.kt index 28339295..d4902c46 100644 --- a/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/CmacTest.kt +++ b/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/CmacTest.kt @@ -19,6 +19,7 @@ package de.gematik.openhealth.crypto import de.gematik.openhealth.crypto.key.SecretKey +import kotlin.test.Ignore import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertFailsWith @@ -70,6 +71,7 @@ class CmacTest { ) } + @Ignore @Test fun `cmac final can only be called once`() = runTestWithProvider { diff --git a/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/key/EcCurveTest.kt b/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/key/EcCurveTest.kt index f69599b9..934a940c 100644 --- a/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/key/EcCurveTest.kt +++ b/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/key/EcCurveTest.kt @@ -4,6 +4,7 @@ import com.ionspin.kotlin.bignum.integer.BigInteger import kotlin.test.Test import kotlin.test.assertEquals +@Suppress("ktlint:standard:max-line-length", "MaxLineLength") class EcCurveTest { @Test fun `test BrainpoolP256r1 parameters`() { diff --git a/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/key/EcPointBrainpoolP256r1Test.kt b/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/key/EcPointBrainpoolP256r1Test.kt index df52d5c9..6bc64e5b 100644 --- a/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/key/EcPointBrainpoolP256r1Test.kt +++ b/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/key/EcPointBrainpoolP256r1Test.kt @@ -21,7 +21,7 @@ import de.gematik.openhealth.crypto.runTestWithProvider import kotlin.test.Test import kotlin.test.assertEquals -@Suppress("ktlint:standard:max-line-length") +@Suppress("ktlint:standard:max-line-length", "MaxLineLength") class EcPointBrainpoolP256r1Test { private val curve = EcCurve.BrainpoolP256r1 diff --git a/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/key/EcPointBrainpoolP384r1Test.kt b/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/key/EcPointBrainpoolP384r1Test.kt index dacdec7a..016d2f6f 100644 --- a/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/key/EcPointBrainpoolP384r1Test.kt +++ b/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/key/EcPointBrainpoolP384r1Test.kt @@ -5,7 +5,7 @@ import de.gematik.openhealth.crypto.runTestWithProvider import kotlin.test.Test import kotlin.test.assertEquals -@Suppress("ktlint:standard:max-line-length") +@Suppress("ktlint:standard:max-line-length", "MaxLineLength", "LongMethod") class EcPointBrainpoolP384r1Test { private val curve = EcCurve.BrainpoolP384r1 diff --git a/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/key/EcPointBrainpoolP512r1Test.kt b/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/key/EcPointBrainpoolP512r1Test.kt index e5c7a8c4..8cecad93 100644 --- a/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/key/EcPointBrainpoolP512r1Test.kt +++ b/crypto/src/commonTest/kotlin/de/gematik/openhealth/crypto/key/EcPointBrainpoolP512r1Test.kt @@ -5,7 +5,7 @@ import de.gematik.openhealth.crypto.runTestWithProvider import kotlin.test.Test import kotlin.test.assertEquals -@Suppress("ktlint:standard:max-line-length") +@Suppress("ktlint:standard:max-line-length", "MaxLineLength", "LongMethod") class EcPointBrainpoolP512r1Test { private val curve = EcCurve.BrainpoolP512r1 diff --git a/crypto/src/jvm/kotlin/de/gematik/openhealth/crypto/Provider.jvm.kt b/crypto/src/jvm/kotlin/de/gematik/openhealth/crypto/Provider.jvm.kt index d0ed347c..06246a54 100644 --- a/crypto/src/jvm/kotlin/de/gematik/openhealth/crypto/Provider.jvm.kt +++ b/crypto/src/jvm/kotlin/de/gematik/openhealth/crypto/Provider.jvm.kt @@ -16,47 +16,7 @@ package de.gematik.openhealth.crypto -import java.io.File -import java.io.IOException - -private val hostOs = - System - .getProperty("os.name") - .lowercase() - .trim() - .replace(" ", "") -private val hostArch = - System - .getProperty("os.arch") - .lowercase() - .trim() - .replace(" ", "") - -@Suppress("UnsafeDynamicallyLoadedCode") -fun loadNativeLibrary() { - try { - System.loadLibrary("oh_crypto") - } catch (_: UnsatisfiedLinkError) { - val libName = - when { - hostOs.contains("mac") -> "liboh_crypto.dylib" - hostOs.contains("win") -> "oh_crypto.dll" - else -> "liboh_crypto.so" - } - - val libResUrl = ClassLoader.getSystemResource("$hostOs-$hostArch/$libName") - - try { - val tempLib = File.createTempFile("lib", libName) - tempLib.deleteOnExit() - libResUrl.openStream().copyTo(tempLib.outputStream()) - - System.load(tempLib.absolutePath) - } catch (e: IOException) { - throw RuntimeException("Failed to extract native library", e) - } - } -} +import de.gematik.openhealth.crypto.internal.interop.loadNativeLibrary actual suspend fun initializeNativeCryptoProvider() { loadNativeLibrary() diff --git a/gradle.properties b/gradle.properties index 786e4f1c..6ceb9cea 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,19 +14,20 @@ # limitations under the License. # -#Gradle +# Gradle org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8 -Dkotlin.daemon.jvm.options\="-Xmx2048M" org.gradle.caching=true org.gradle.configuration-cache=true -#Kotlin +# Kotlin kotlin.code.style=official kotlin.js.compiler=ir -#MPP +# MPP kotlin.mpp.enableCInteropCommonization=true -#Android +# kotlin.mpp.applyDefaultHierarchyTemplate=false +# Android android.useAndroidX=true android.nonTransitiveRClass=true -#dokka +# dokka org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled gematik.baseGroup=de.gematik.openhealth diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 16823d5e..24bb0752 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,7 +6,7 @@ kotlinNode = "22.5.5-pre.831" kotlinJs = "1.0.0-pre.852" kotlinx-coroutines = "1.9.0" android-minSdk = "24" -android-compileSdk = "34" +android-compileSdk = "35" mockk = "1.13.10" vanniktech-mavenPublish = "0.31.0" diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock index c8826afb..fc9a0c0d 100644 --- a/kotlin-js-store/yarn.lock +++ b/kotlin-js-store/yarn.lock @@ -310,13 +310,6 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== -bindings@^1.1.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - body-parser@^1.19.0: version "1.20.3" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" @@ -734,11 +727,6 @@ fastest-levenshtein@^1.0.12: resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - fill-range@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" @@ -819,7 +807,7 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -"gematik-internal-oh-crypto@file:../../crypto-web-lib/npm": +"gematik-openhealth-internal-crypto@file:../../crypto-web-lib/npm": version "0.1.0" get-caller-file@^2.0.5: @@ -1291,11 +1279,6 @@ ms@^2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nan@^2.14.0: - version "2.22.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" - integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== - negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -1405,14 +1388,6 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -pcsclite@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/pcsclite/-/pcsclite-1.0.1.tgz#b3e1a6bd8832e6f1eb61aeb9fb4774e2c56be7b8" - integrity sha512-KffeR9V+Q0ERHsOp2Ys4K81XEkRSFfn/G6Nbfieq2BPbP90KnMFFClKLgJ/hKmCddxUdpcu3OVVSY+tTy5FXRw== - dependencies: - bindings "^1.1.0" - nan "^2.14.0" - picocolors@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" diff --git a/libs/openssl/wrapper/CMakeLists.txt b/libs/openssl/wrapper/CMakeLists.txt index 377d134b..fb1c1051 100644 --- a/libs/openssl/wrapper/CMakeLists.txt +++ b/libs/openssl/wrapper/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.31) +cmake_minimum_required(VERSION 3.28) set(CMAKE_CXX_STANDARD 23) @@ -32,6 +32,8 @@ target_link_libraries(oh_crypto_base PRIVATE OpenSSL::Crypto) if (NOT CMAKE_SYSTEM_NAME STREQUAL "Emscripten") + set_target_properties(oh_crypto_base PROPERTIES POSITION_INDEPENDENT_CODE ON) + find_package(JNI) add_library(oh_crypto SHARED ${PROJECT_ROOT_DIR}/crypto-jvm-swig/build/generated/sources/jni/crypto.cpp) diff --git a/libs/openssl/wrapper/cmake/openssl.cmake b/libs/openssl/wrapper/cmake/openssl.cmake index 87eb4f08..1fa3a62f 100644 --- a/libs/openssl/wrapper/cmake/openssl.cmake +++ b/libs/openssl/wrapper/cmake/openssl.cmake @@ -1,34 +1,44 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Linux") - set(OPENSSL_TARGET "linux-x86_64") + set(_OPENSSL_TARGET "linux-x86_64") + set(_OPENSSL_LIB_PATH "lib64") + set(_OPENSSL_LIB_SUFFIX "a") elseif (CMAKE_SYSTEM_NAME STREQUAL "Android") if (CMAKE_ANDROID_ARCH_ABI STREQUAL "armeabi-v7a") - set(OPENSSL_TARGET "android-arm") + set(_OPENSSL_TARGET "android-arm") elseif (CMAKE_ANDROID_ARCH_ABI STREQUAL "arm64-v8a") - set(OPENSSL_TARGET "android-arm64") + set(_OPENSSL_TARGET "android-arm64") elseif (CMAKE_ANDROID_ARCH_ABI STREQUAL "x86") - set(OPENSSL_TARGET "android-x86") + set(_OPENSSL_TARGET "android-x86") elseif (CMAKE_ANDROID_ARCH_ABI STREQUAL "x86_64") - set(OPENSSL_TARGET "android-x86_64") + set(_OPENSSL_TARGET "android-x86_64") else () message(FATAL_ERROR "Unsupported Android architecture: ${CMAKE_ANDROID_ARCH_ABI}") endif () + set(_OPENSSL_LIB_PATH "lib") + set(_OPENSSL_LIB_SUFFIX "a") elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin") # if(CMAKE_OSX_ARCHITECTURES STREQUAL "arm64") - # set(OPENSSL_TARGET "darwin64-arm64-cc") # macOS ARM target + # set(_OPENSSL_TARGET "darwin64-arm64-cc") # macOS ARM target # elseif(CMAKE_OSX_ARCHITECTURES STREQUAL "x86_64") - # set(OPENSSL_TARGET "darwin64-x86_64-cc") # macOS Intel target + # set(_OPENSSL_TARGET "darwin64-x86_64-cc") # macOS Intel target # else() # message(FATAL_ERROR "Unsupported macOS architecture: ${CMAKE_OSX_ARCHITECTURES}") # endif() - set(OPENSSL_TARGET "darwin64-arm64-cc") # macOS ARM target + set(_OPENSSL_TARGET "darwin64-arm64-cc") # macOS ARM target + set(_OPENSSL_LIB_PATH "lib") + set(_OPENSSL_LIB_SUFFIX "a") elseif (CMAKE_SYSTEM_NAME STREQUAL "iOS") - set(OPENSSL_TARGET "ios64-cross") # iOS target + set(_OPENSSL_TARGET "ios64-cross") # iOS target + set(_OPENSSL_LIB_PATH "lib") + set(_OPENSSL_LIB_SUFFIX "a") elseif (CMAKE_SYSTEM_NAME STREQUAL "Emscripten") - set(OPENSSL_TARGET "wasm32-wasi") # Emscripten target + set(_OPENSSL_TARGET "wasm32-wasi") # Emscripten target + set(_OPENSSL_LIB_PATH "lib") + set(_OPENSSL_LIB_SUFFIX "a") else () message(FATAL_ERROR "Unsupported platform: ${CMAKE_SYSTEM_NAME}") @@ -36,8 +46,8 @@ endif () include(ExternalProject) set(OPENSSL_SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/openssl-src) -set(OPENSSL_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/openssl-build-${OPENSSL_TARGET}) -set(OPENSSL_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/openssl-${OPENSSL_TARGET}) +set(OPENSSL_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/openssl-build-${_OPENSSL_TARGET}) +set(OPENSSL_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/openssl-${_OPENSSL_TARGET}) set(OPENSSL_INCLUDE_DIR ${OPENSSL_INSTALL_DIR}/include) set(OPENSSL_CONFIG_PARAMS " no-asm \ @@ -65,17 +75,19 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Emscripten") ${OPENSSL_SOURCE_DIR}/Configure \ --prefix=${OPENSSL_INSTALL_DIR} \ ${OPENSSL_CONFIG_PARAMS} - ${OPENSSL_TARGET}" + ${_OPENSSL_TARGET}" ) else () set(OPENSSL_CONFIGURE_COMMAND bash -c "${OPENSSL_SOURCE_DIR}/Configure \ --prefix=${OPENSSL_INSTALL_DIR} \ ${OPENSSL_CONFIG_PARAMS} - ${OPENSSL_TARGET}" + ${_OPENSSL_TARGET}" ) endif () +set(_OPENSSL_BUILD_TARGET ${OPENSSL_INSTALL_DIR}/${_OPENSSL_LIB_PATH}/libcrypto.${_OPENSSL_LIB_SUFFIX}) + ExternalProject_Add( OpenSSL SOURCE_DIR ${OPENSSL_SOURCE_DIR} @@ -88,7 +100,7 @@ ExternalProject_Add( BUILD_COMMAND make -j14 BUILD_IN_SOURCE 0 # required, otherwise ninja fails - BUILD_BYPRODUCTS ${OPENSSL_INSTALL_DIR}/lib/libcrypto.a + BUILD_BYPRODUCTS ${_OPENSSL_BUILD_TARGET} TEST_COMMAND "" INSTALL_COMMAND make install INSTALL_DIR ${OPENSSL_INSTALL_DIR} @@ -101,6 +113,6 @@ ExternalProject_Add( file(MAKE_DIRECTORY ${OPENSSL_INCLUDE_DIR}) add_library(OpenSSL::Crypto STATIC IMPORTED GLOBAL) -set_property(TARGET OpenSSL::Crypto PROPERTY IMPORTED_LOCATION ${OPENSSL_INSTALL_DIR}/lib/libcrypto.a) +set_property(TARGET OpenSSL::Crypto PROPERTY IMPORTED_LOCATION ${_OPENSSL_BUILD_TARGET}) set_property(TARGET OpenSSL::Crypto PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR}) add_dependencies(OpenSSL::Crypto OpenSSL) diff --git a/libs/openssl/wrapper/src/types.hpp b/libs/openssl/wrapper/src/types.hpp index ca6d8ba7..1a2ce7e9 100644 --- a/libs/openssl/wrapper/src/types.hpp +++ b/libs/openssl/wrapper/src/types.hpp @@ -17,6 +17,7 @@ #pragma once #include +#include using uint8_vector = std::vector; diff --git a/smartcard/api/smartcard.api b/smartcard/api/smartcard.api index b095f6ed..af1f9c07 100644 --- a/smartcard/api/smartcard.api +++ b/smartcard/api/smartcard.api @@ -1,10 +1,3 @@ -public final class MacObject { - public fun ([B[BLde/gematik/openhealth/crypto/key/SecretKey;[B)V - public synthetic fun ([B[BLde/gematik/openhealth/crypto/key/SecretKey;[BILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getEncoded ()[B - public final fun getMac ()[B -} - public final class de/gematik/openhealth/smartcard/ExchangeUtilsKt { public static final fun establishTrustedChannelBlocking (Lde/gematik/openhealth/smartcard/card/HealthCardScope;Ljava/lang/String;)Lde/gematik/openhealth/smartcard/card/TrustedChannelScope; public static final fun establishTrustedChannelBlocking (Lde/gematik/openhealth/smartcard/card/HealthCardScope;Ljava/lang/String;Lkotlinx/coroutines/CoroutineDispatcher;)Lde/gematik/openhealth/smartcard/card/TrustedChannelScope; @@ -215,14 +208,21 @@ public final class de/gematik/openhealth/smartcard/command/ApduKt { public final class de/gematik/openhealth/smartcard/command/CardCommandApdu { public static final field Companion Lde/gematik/openhealth/smartcard/command/CardCommandApdu$Companion; - public fun ([BILjava/lang/Integer;I)V + public synthetic fun ([BIIIIII[BLjava/lang/Integer;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getApdu ()[B + public final fun getCla ()I + public final fun getData ()[B + public final fun getDataLength ()I public final fun getDataOffset ()I - public final fun getRawNc ()I - public final fun getRawNe ()Ljava/lang/Integer; + public final fun getExpectedLength ()Ljava/lang/Integer; + public final fun getIns ()I + public final fun getNe ()Ljava/lang/Integer; + public final fun getP1 ()I + public final fun getP2 ()I } public final class de/gematik/openhealth/smartcard/command/CardCommandApdu$Companion { + public final fun ofApdu ([B)Lde/gematik/openhealth/smartcard/command/CardCommandApdu; public final fun ofOptions (IIIILjava/lang/Integer;)Lde/gematik/openhealth/smartcard/command/CardCommandApdu; public final fun ofOptions (IIII[BLjava/lang/Integer;)Lde/gematik/openhealth/smartcard/command/CardCommandApdu; } @@ -449,7 +449,7 @@ public final class de/gematik/openhealth/smartcard/command/SelectCommandKt { } public final class de/gematik/openhealth/smartcard/command/UnlockEgkCommandKt { - public static final fun unlockEgk (Lde/gematik/openhealth/smartcard/command/HealthCardCommand$Companion;Ljava/lang/String;Lde/gematik/openhealth/smartcard/card/PasswordReference;ZLde/gematik/openhealth/smartcard/card/EncryptedPinFormat2;Lde/gematik/openhealth/smartcard/card/EncryptedPinFormat2;)Lde/gematik/openhealth/smartcard/command/HealthCardCommand; + public static final fun unlockEgk (Lde/gematik/openhealth/smartcard/command/HealthCardCommand$Companion;Lde/gematik/openhealth/smartcard/command/UnlockMethod;Lde/gematik/openhealth/smartcard/card/PasswordReference;ZLde/gematik/openhealth/smartcard/card/EncryptedPinFormat2;Lde/gematik/openhealth/smartcard/card/EncryptedPinFormat2;)Lde/gematik/openhealth/smartcard/command/HealthCardCommand; } public final class de/gematik/openhealth/smartcard/command/UnlockMethod : java/lang/Enum { @@ -500,7 +500,7 @@ public final class de/gematik/openhealth/smartcard/exchange/PaceInfoKt { } public final class de/gematik/openhealth/smartcard/exchange/PinExchangeKt { - public static final fun unlockEgk (Lde/gematik/openhealth/smartcard/card/TrustedChannelScope;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun unlockEgk (Lde/gematik/openhealth/smartcard/card/TrustedChannelScope;Lde/gematik/openhealth/smartcard/command/UnlockMethod;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun verifyPin (Lde/gematik/openhealth/smartcard/card/TrustedChannelScope;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } @@ -556,6 +556,13 @@ public final class de/gematik/openhealth/smartcard/tagobjects/LengthObject { public final fun getEncoded ()[B } +public final class de/gematik/openhealth/smartcard/tagobjects/MacObject { + public fun ([B[BLde/gematik/openhealth/crypto/key/SecretKey;[B)V + public synthetic fun ([B[BLde/gematik/openhealth/crypto/key/SecretKey;[BILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getEncoded ()[B + public final fun getMac ()[B +} + public final class de/gematik/openhealth/smartcard/tagobjects/StatusObject { public fun ([B)V public final fun getEncoded ()[B diff --git a/smartcard/build.gradle.kts b/smartcard/build.gradle.kts index 4e633cd0..d3f1d662 100644 --- a/smartcard/build.gradle.kts +++ b/smartcard/build.gradle.kts @@ -29,14 +29,9 @@ version = project.findProperty("gematik.version") as String kotlin { jvm() - js("jsNode") { + js { nodejs { useEsModules() - testTask { - useMocha { - timeout = "60s" - } - } } browser { } generateTypeScriptDefinitions() @@ -60,21 +55,6 @@ kotlin { implementation(libs.kotlinx.coroutines.test) } } - val jsCommonMain by creating { - } - val jsNodeMain by getting { - dependencies { - implementation(npm("pcsclite", "1.0.1")) - implementation(libs.kotlin.node) - } - } - val jsNodeTest by getting { - dependencies { - implementation(npm("pcsclite", "1.0.1")) - implementation(libs.kotlin.node) - implementation(libs.kotlinx.coroutines.test) - } - } all { languageSettings { optIn("kotlin.js.ExperimentalJsExport") diff --git a/smartcard/src/commonMain/kotlin/de/gematik/openhealth/smartcard/card/TrustedChannelScope.kt b/smartcard/src/commonMain/kotlin/de/gematik/openhealth/smartcard/card/TrustedChannelScope.kt index fb444543..86be18f3 100644 --- a/smartcard/src/commonMain/kotlin/de/gematik/openhealth/smartcard/card/TrustedChannelScope.kt +++ b/smartcard/src/commonMain/kotlin/de/gematik/openhealth/smartcard/card/TrustedChannelScope.kt @@ -16,7 +16,6 @@ package de.gematik.openhealth.smartcard.card -import MacObject import de.gematik.openhealth.asn1.Asn1Decoder import de.gematik.openhealth.asn1.Asn1Tag import de.gematik.openhealth.crypto.ExperimentalCryptoApi @@ -31,6 +30,7 @@ import de.gematik.openhealth.smartcard.command.EXPECTED_LENGTH_WILDCARD_EXTENDED import de.gematik.openhealth.smartcard.command.EXPECTED_LENGTH_WILDCARD_SHORT import de.gematik.openhealth.smartcard.tagobjects.DataObject import de.gematik.openhealth.smartcard.tagobjects.LengthObject +import de.gematik.openhealth.smartcard.tagobjects.MacObject import de.gematik.openhealth.smartcard.tagobjects.StatusObject import de.gematik.openhealth.smartcard.utils.padData import de.gematik.openhealth.smartcard.utils.unpadData