From 63ac5a437ca9a44e2dd21a360617f1b8c4048780 Mon Sep 17 00:00:00 2001 From: Matas Lauzadis Date: Mon, 18 Nov 2024 09:06:47 -0500 Subject: [PATCH 01/10] Add package to checksum class files and implement MD5 --- aws-crt-kotlin/build.gradle.kts | 2 +- .../aws/sdk/kotlin/crt/util/DigestNative.kt | 3 +- .../sdk/kotlin/crt/util/hashing/CrcNative.kt | 2 + .../crt/util/hashing/HashFunctionNative.kt | 2 + .../sdk/kotlin/crt/util/hashing/Md5Native.kt | 58 +++++++++++++++++++ .../sdk/kotlin/crt/util/hashing/ShaNative.kt | 2 + .../util/hashing/HashFunctionNativeTest.kt | 2 + gradle/libs.versions.toml | 2 +- 8 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt diff --git a/aws-crt-kotlin/build.gradle.kts b/aws-crt-kotlin/build.gradle.kts index 6188d212..25bd41e2 100644 --- a/aws-crt-kotlin/build.gradle.kts +++ b/aws-crt-kotlin/build.gradle.kts @@ -100,7 +100,7 @@ kotlin { // disable "standalone" mode in simulator tests since it causes TLS issues. this means we need to manage the simulator // ourselves (booting / shutting down). FIXME: https://youtrack.jetbrains.com/issue/KT-38317 kotlin { - val simulatorDeviceName = project.findProperty("iosSimulatorDevice") as? String ?: "iPhone 15" + val simulatorDeviceName = project.findProperty("iosSimulatorDevice") as? String ?: "iPhone 16" val xcrun = "/usr/bin/xcrun" diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/DigestNative.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/DigestNative.kt index b71f644f..021ec8e6 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/DigestNative.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/DigestNative.kt @@ -2,10 +2,9 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ - package aws.sdk.kotlin.crt.util -import Sha256 +import aws.sdk.kotlin.crt.util.hashing.Sha256 /** * Utility object for various hash functions diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt index fd671e39..e930d223 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt @@ -2,6 +2,8 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ +package aws.sdk.kotlin.crt.util.hashing + import kotlinx.cinterop.* import libcrt.aws_checksums_crc32 import libcrt.aws_checksums_crc32c diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/HashFunctionNative.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/HashFunctionNative.kt index 62a66122..04ca2b36 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/HashFunctionNative.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/HashFunctionNative.kt @@ -2,6 +2,8 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ +package aws.sdk.kotlin.crt.util.hashing + /** * A function which calculates the hash of given data */ diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt new file mode 100644 index 00000000..4e5ea5c1 --- /dev/null +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt @@ -0,0 +1,58 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +package aws.sdk.kotlin.crt.util.hashing + +import aws.sdk.kotlin.crt.Allocator +import aws.sdk.kotlin.crt.awsAssertOpSuccess +import kotlinx.cinterop.addressOf +import kotlinx.cinterop.cValue +import kotlinx.cinterop.convert +import kotlinx.cinterop.pointed +import kotlinx.cinterop.reinterpret +import kotlinx.cinterop.usePinned +import libcrt.aws_byte_buf +import libcrt.aws_byte_cursor_from_array +import libcrt.aws_hash_destroy +import libcrt.aws_hash_finalize +import libcrt.aws_hash_update +import libcrt.aws_md5_new + +/** + * MD5 hash function implemented using bindings to CRT + */ +public class Md5 : HashFunction { + private var md5 = checkNotNull(aws_md5_new(Allocator.Default)) { "aws_md5_new" } + + override fun update(input: ByteArray, offset: Int, length: Int) { + val inputCursor = input.usePinned { + aws_byte_cursor_from_array(it.addressOf(offset), length.convert()) + } + + awsAssertOpSuccess(aws_hash_update(md5, inputCursor)) { + "aws_hash_update" + } + } + + override fun digest(): ByteArray { + val output = ByteArray(md5.pointed.digest_size.toInt()) + + val byteBuf = output.usePinned { + cValue { + capacity = output.size.convert() + len = 0U + buffer = it.addressOf(0).reinterpret() + } + } + + awsAssertOpSuccess(aws_hash_finalize(md5, byteBuf, 0U)) { "aws_hash_finalize" } + + return output.also { reset() } + } + + override fun reset() { + aws_hash_destroy(md5) + md5 = checkNotNull(aws_md5_new(Allocator.Default)) { "aws_md5_new" } + } +} \ No newline at end of file diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt index c8db8f9e..4ca25101 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt @@ -2,6 +2,8 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ +package aws.sdk.kotlin.crt.util.hashing + import aws.sdk.kotlin.crt.Allocator import aws.sdk.kotlin.crt.awsAssertOpSuccess import kotlinx.cinterop.* diff --git a/aws-crt-kotlin/native/test/aws/sdk/kotlin/crt/util/hashing/HashFunctionNativeTest.kt b/aws-crt-kotlin/native/test/aws/sdk/kotlin/crt/util/hashing/HashFunctionNativeTest.kt index a418112a..08911cb3 100644 --- a/aws-crt-kotlin/native/test/aws/sdk/kotlin/crt/util/hashing/HashFunctionNativeTest.kt +++ b/aws-crt-kotlin/native/test/aws/sdk/kotlin/crt/util/hashing/HashFunctionNativeTest.kt @@ -2,6 +2,8 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ +package aws.sdk.kotlin.crt.util.hashing + import aws.sdk.kotlin.crt.util.encodeToHex import kotlin.test.Test import kotlin.test.assertEquals diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2bbbb1e7..324d10f7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] kotlin-version = "2.0.21" -aws-kotlin-repo-tools-version = "0.4.14-kn" +aws-kotlin-repo-tools-version = "0.4.15-kn" # libs crt-java-version = "0.31.3" From 9938e2bf581de0c6478c95147b6979ad050ed35c Mon Sep 17 00:00:00 2001 From: Matas Lauzadis Date: Mon, 18 Nov 2024 09:10:30 -0500 Subject: [PATCH 02/10] ktlint --- .../native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt index 4e5ea5c1..1cc852d3 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt @@ -55,4 +55,4 @@ public class Md5 : HashFunction { aws_hash_destroy(md5) md5 = checkNotNull(aws_md5_new(Allocator.Default)) { "aws_md5_new" } } -} \ No newline at end of file +} From 6044551b87686189a84f3e7d5fac6b513d3d4d0e Mon Sep 17 00:00:00 2001 From: Matas Lauzadis Date: Mon, 18 Nov 2024 10:19:59 -0500 Subject: [PATCH 03/10] downgrade back to ios 15 --- aws-crt-kotlin/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-crt-kotlin/build.gradle.kts b/aws-crt-kotlin/build.gradle.kts index 25bd41e2..6188d212 100644 --- a/aws-crt-kotlin/build.gradle.kts +++ b/aws-crt-kotlin/build.gradle.kts @@ -100,7 +100,7 @@ kotlin { // disable "standalone" mode in simulator tests since it causes TLS issues. this means we need to manage the simulator // ourselves (booting / shutting down). FIXME: https://youtrack.jetbrains.com/issue/KT-38317 kotlin { - val simulatorDeviceName = project.findProperty("iosSimulatorDevice") as? String ?: "iPhone 16" + val simulatorDeviceName = project.findProperty("iosSimulatorDevice") as? String ?: "iPhone 15" val xcrun = "/usr/bin/xcrun" From b668b2967ff86378451ab31efe602660126f89c3 Mon Sep 17 00:00:00 2001 From: Matas Lauzadis Date: Mon, 18 Nov 2024 10:22:21 -0500 Subject: [PATCH 04/10] Call CRT.initRuntime in checksum functions --- .../native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt | 5 +++++ .../native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt | 5 +++++ .../native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt | 2 ++ 3 files changed, 12 insertions(+) diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt index e930d223..196427a4 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt @@ -4,6 +4,7 @@ */ package aws.sdk.kotlin.crt.util.hashing +import aws.sdk.kotlin.crt.CRT import kotlinx.cinterop.* import libcrt.aws_checksums_crc32 import libcrt.aws_checksums_crc32c @@ -20,6 +21,10 @@ internal typealias AwsChecksumsCrcFunction = ( ) -> uint32_t internal class Crc(val checksumFn: AwsChecksumsCrcFunction) : HashFunction { + init { + CRT.initRuntime { } + } + private var crc = 0U override fun update(input: ByteArray, offset: Int, length: Int) { diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt index 1cc852d3..db61f5d5 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt @@ -5,6 +5,7 @@ package aws.sdk.kotlin.crt.util.hashing import aws.sdk.kotlin.crt.Allocator +import aws.sdk.kotlin.crt.CRT import aws.sdk.kotlin.crt.awsAssertOpSuccess import kotlinx.cinterop.addressOf import kotlinx.cinterop.cValue @@ -23,6 +24,10 @@ import libcrt.aws_md5_new * MD5 hash function implemented using bindings to CRT */ public class Md5 : HashFunction { + init { + CRT.initRuntime { } + } + private var md5 = checkNotNull(aws_md5_new(Allocator.Default)) { "aws_md5_new" } override fun update(input: ByteArray, offset: Int, length: Int) { diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt index 4ca25101..4e284161 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt @@ -5,6 +5,7 @@ package aws.sdk.kotlin.crt.util.hashing import aws.sdk.kotlin.crt.Allocator +import aws.sdk.kotlin.crt.CRT import aws.sdk.kotlin.crt.awsAssertOpSuccess import kotlinx.cinterop.* import libcrt.* @@ -48,6 +49,7 @@ internal class Sha(val initializeFn: InitializeHashFn) : HashFunction { private var hash: CPointer init { + CRT.initRuntime { } hash = initializeHash() } From 943ee32ac985a4787873e32a5e5c2e593ad547b2 Mon Sep 17 00:00:00 2001 From: Matas Lauzadis Date: Mon, 18 Nov 2024 11:39:44 -0500 Subject: [PATCH 05/10] Bump plugin version --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 324d10f7..a8ed2625 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] kotlin-version = "2.0.21" -aws-kotlin-repo-tools-version = "0.4.15-kn" +aws-kotlin-repo-tools-version = "0.4.16-kn" # libs crt-java-version = "0.31.3" From 8fc034add89d7480078606902b79c2db14cd2453 Mon Sep 17 00:00:00 2001 From: Matas Lauzadis Date: Mon, 18 Nov 2024 14:01:11 -0500 Subject: [PATCH 06/10] Fix hashing of empty inputs --- .../sdk/kotlin/crt/util/hashing/CrcNative.kt | 2 ++ .../sdk/kotlin/crt/util/hashing/Md5Native.kt | 2 ++ .../sdk/kotlin/crt/util/hashing/ShaNative.kt | 2 ++ .../crt/util/hashing/HashFunctionNativeTest.kt | 17 +++++++++++++++++ 4 files changed, 23 insertions(+) diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt index 196427a4..b1b2326b 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt @@ -28,6 +28,8 @@ internal class Crc(val checksumFn: AwsChecksumsCrcFunction) : HashFunction { private var crc = 0U override fun update(input: ByteArray, offset: Int, length: Int) { + if (input.isEmpty() || length == 0) { return } + val offsetInput = input.usePinned { it.addressOf(offset) } diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt index db61f5d5..b0433203 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt @@ -31,6 +31,8 @@ public class Md5 : HashFunction { private var md5 = checkNotNull(aws_md5_new(Allocator.Default)) { "aws_md5_new" } override fun update(input: ByteArray, offset: Int, length: Int) { + if (input.isEmpty() || length == 0) { return } + val inputCursor = input.usePinned { aws_byte_cursor_from_array(it.addressOf(offset), length.convert()) } diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt index 4e284161..e1baa4e0 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt @@ -55,6 +55,8 @@ internal class Sha(val initializeFn: InitializeHashFn) : HashFunction { // aws_hash_update override fun update(input: ByteArray, offset: Int, length: Int) { + if (input.isEmpty() || length == 0) { return } + val inputCursor = input.usePinned { aws_byte_cursor_from_array(it.addressOf(offset), length.convert()) } diff --git a/aws-crt-kotlin/native/test/aws/sdk/kotlin/crt/util/hashing/HashFunctionNativeTest.kt b/aws-crt-kotlin/native/test/aws/sdk/kotlin/crt/util/hashing/HashFunctionNativeTest.kt index 08911cb3..637d6439 100644 --- a/aws-crt-kotlin/native/test/aws/sdk/kotlin/crt/util/hashing/HashFunctionNativeTest.kt +++ b/aws-crt-kotlin/native/test/aws/sdk/kotlin/crt/util/hashing/HashFunctionNativeTest.kt @@ -50,4 +50,21 @@ class HashFunctionTest { assertEquals(expected, hash.digest().encodeToHex()) } } + + @Test + fun testEmptyUpdate() { + // algorithm -> hash("") + val tests = listOf( + (Sha1() to "da39a3ee5e6b4b0d3255bfef95601890afd80709"), + (Sha256() to "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"), + (Crc32() to "00000000"), + (Crc32c() to "00000000"), + ) + + tests.forEach { (hash, expected) -> + val data = "".encodeToByteArray() + hash.update(data, 0, 0) + assertEquals(expected, hash.digest().encodeToHex()) + } + } } From e4f58d6eee4198bb27ae812abea7e32202bbe81c Mon Sep 17 00:00:00 2001 From: Matas Lauzadis Date: Mon, 18 Nov 2024 14:28:37 -0500 Subject: [PATCH 07/10] ktlint --- .../native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt | 4 +++- .../native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt | 4 +++- .../native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt index b1b2326b..c19b57dc 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt @@ -28,7 +28,9 @@ internal class Crc(val checksumFn: AwsChecksumsCrcFunction) : HashFunction { private var crc = 0U override fun update(input: ByteArray, offset: Int, length: Int) { - if (input.isEmpty() || length == 0) { return } + if (input.isEmpty() || length == 0) { + return + } val offsetInput = input.usePinned { it.addressOf(offset) diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt index b0433203..6a82ee82 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt @@ -31,7 +31,9 @@ public class Md5 : HashFunction { private var md5 = checkNotNull(aws_md5_new(Allocator.Default)) { "aws_md5_new" } override fun update(input: ByteArray, offset: Int, length: Int) { - if (input.isEmpty() || length == 0) { return } + if (input.isEmpty() || length == 0) { + return + } val inputCursor = input.usePinned { aws_byte_cursor_from_array(it.addressOf(offset), length.convert()) diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt index e1baa4e0..fe5827c0 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt @@ -55,7 +55,9 @@ internal class Sha(val initializeFn: InitializeHashFn) : HashFunction { // aws_hash_update override fun update(input: ByteArray, offset: Int, length: Int) { - if (input.isEmpty() || length == 0) { return } + if (input.isEmpty() || length == 0) { + return + } val inputCursor = input.usePinned { aws_byte_cursor_from_array(it.addressOf(offset), length.convert()) From 5757c98511c9db7002c32c5bdb2d5eacb09c4399 Mon Sep 17 00:00:00 2001 From: Matas Lauzadis Date: Mon, 18 Nov 2024 14:56:17 -0500 Subject: [PATCH 08/10] Add `WithCrt` --- .../native/src/aws/sdk/kotlin/crt/WithCrt.kt | 11 +++++++++++ .../src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt | 10 +++------- .../src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt | 7 ++----- .../src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt | 6 +++--- 4 files changed, 19 insertions(+), 15 deletions(-) create mode 100644 aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/WithCrt.kt diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/WithCrt.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/WithCrt.kt new file mode 100644 index 00000000..0708bbe3 --- /dev/null +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/WithCrt.kt @@ -0,0 +1,11 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +package aws.sdk.kotlin.crt + +public open class WithCrt() { + init { + CRT.initRuntime { } + } +} \ No newline at end of file diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt index c19b57dc..d469acbe 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt @@ -4,7 +4,7 @@ */ package aws.sdk.kotlin.crt.util.hashing -import aws.sdk.kotlin.crt.CRT +import aws.sdk.kotlin.crt.WithCrt import kotlinx.cinterop.* import libcrt.aws_checksums_crc32 import libcrt.aws_checksums_crc32c @@ -21,10 +21,6 @@ internal typealias AwsChecksumsCrcFunction = ( ) -> uint32_t internal class Crc(val checksumFn: AwsChecksumsCrcFunction) : HashFunction { - init { - CRT.initRuntime { } - } - private var crc = 0U override fun update(input: ByteArray, offset: Int, length: Int) { @@ -53,7 +49,7 @@ internal class Crc(val checksumFn: AwsChecksumsCrcFunction) : HashFunction { /** * A CRC32 [HashFunction] implemented using bindings to CRT. */ -public class Crc32 : HashFunction { +public class Crc32 : HashFunction, WithCrt() { private val crc32 = Crc(::aws_checksums_crc32) override fun update(input: ByteArray, offset: Int, length: Int) { crc32.update(input, offset, length) @@ -67,7 +63,7 @@ public class Crc32 : HashFunction { /** * A CRC32C [HashFunction] implemented using bindings to CRT. */ -public class Crc32c : HashFunction { +public class Crc32c : HashFunction, WithCrt() { private val crc32c = Crc(::aws_checksums_crc32c) override fun update(input: ByteArray, offset: Int, length: Int) { crc32c.update(input, offset, length) diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt index 6a82ee82..1f6d5768 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt @@ -6,6 +6,7 @@ package aws.sdk.kotlin.crt.util.hashing import aws.sdk.kotlin.crt.Allocator import aws.sdk.kotlin.crt.CRT +import aws.sdk.kotlin.crt.WithCrt import aws.sdk.kotlin.crt.awsAssertOpSuccess import kotlinx.cinterop.addressOf import kotlinx.cinterop.cValue @@ -23,11 +24,7 @@ import libcrt.aws_md5_new /** * MD5 hash function implemented using bindings to CRT */ -public class Md5 : HashFunction { - init { - CRT.initRuntime { } - } - +public class Md5 : HashFunction, WithCrt() { private var md5 = checkNotNull(aws_md5_new(Allocator.Default)) { "aws_md5_new" } override fun update(input: ByteArray, offset: Int, length: Int) { diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt index fe5827c0..8ef0f701 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt @@ -6,6 +6,7 @@ package aws.sdk.kotlin.crt.util.hashing import aws.sdk.kotlin.crt.Allocator import aws.sdk.kotlin.crt.CRT +import aws.sdk.kotlin.crt.WithCrt import aws.sdk.kotlin.crt.awsAssertOpSuccess import kotlinx.cinterop.* import libcrt.* @@ -20,7 +21,7 @@ internal typealias InitializeHashFn = ( /** * SHA-1 hash function implemented using bindings to CRT */ -public class Sha1 : HashFunction { +public class Sha1 : HashFunction, WithCrt() { private val sha1 = Sha(::aws_sha1_new) override fun update(input: ByteArray, offset: Int, length: Int) { sha1.update(input, offset, length) @@ -34,7 +35,7 @@ public class Sha1 : HashFunction { /** * SHA-256 hash function implemented using bindings to CRT */ -public class Sha256 : HashFunction { +public class Sha256 : HashFunction, WithCrt() { private val sha256 = Sha(::aws_sha256_new) override fun update(input: ByteArray, offset: Int, length: Int) { sha256.update(input, offset, length) @@ -49,7 +50,6 @@ internal class Sha(val initializeFn: InitializeHashFn) : HashFunction { private var hash: CPointer init { - CRT.initRuntime { } hash = initializeHash() } From 8a5669ad91029f29165275151a9aa07304eee75d Mon Sep 17 00:00:00 2001 From: Matas Lauzadis Date: Mon, 18 Nov 2024 14:57:48 -0500 Subject: [PATCH 09/10] Add KDocs --- aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/WithCrt.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/WithCrt.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/WithCrt.kt index 0708bbe3..85e0d53c 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/WithCrt.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/WithCrt.kt @@ -4,6 +4,9 @@ */ package aws.sdk.kotlin.crt +/** + * A mixin class used to ensure CRT is initialized before the class is invoked + */ public open class WithCrt() { init { CRT.initRuntime { } From c21bbe47e5f1ba2e98c704ceee7120acc186593e Mon Sep 17 00:00:00 2001 From: Matas Lauzadis Date: Mon, 18 Nov 2024 14:58:31 -0500 Subject: [PATCH 10/10] ktlint --- aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/WithCrt.kt | 6 +++--- .../src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt | 8 ++++++-- .../src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt | 5 +++-- .../src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt | 9 ++++++--- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/WithCrt.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/WithCrt.kt index 85e0d53c..737ceff0 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/WithCrt.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/WithCrt.kt @@ -7,8 +7,8 @@ package aws.sdk.kotlin.crt /** * A mixin class used to ensure CRT is initialized before the class is invoked */ -public open class WithCrt() { +public open class WithCrt { init { - CRT.initRuntime { } + CRT.initRuntime { } } -} \ No newline at end of file +} diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt index d469acbe..34a60330 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/CrcNative.kt @@ -49,7 +49,9 @@ internal class Crc(val checksumFn: AwsChecksumsCrcFunction) : HashFunction { /** * A CRC32 [HashFunction] implemented using bindings to CRT. */ -public class Crc32 : HashFunction, WithCrt() { +public class Crc32 : + WithCrt(), + HashFunction { private val crc32 = Crc(::aws_checksums_crc32) override fun update(input: ByteArray, offset: Int, length: Int) { crc32.update(input, offset, length) @@ -63,7 +65,9 @@ public class Crc32 : HashFunction, WithCrt() { /** * A CRC32C [HashFunction] implemented using bindings to CRT. */ -public class Crc32c : HashFunction, WithCrt() { +public class Crc32c : + WithCrt(), + HashFunction { private val crc32c = Crc(::aws_checksums_crc32c) override fun update(input: ByteArray, offset: Int, length: Int) { crc32c.update(input, offset, length) diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt index 1f6d5768..03e9b13a 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/Md5Native.kt @@ -5,7 +5,6 @@ package aws.sdk.kotlin.crt.util.hashing import aws.sdk.kotlin.crt.Allocator -import aws.sdk.kotlin.crt.CRT import aws.sdk.kotlin.crt.WithCrt import aws.sdk.kotlin.crt.awsAssertOpSuccess import kotlinx.cinterop.addressOf @@ -24,7 +23,9 @@ import libcrt.aws_md5_new /** * MD5 hash function implemented using bindings to CRT */ -public class Md5 : HashFunction, WithCrt() { +public class Md5 : + WithCrt(), + HashFunction { private var md5 = checkNotNull(aws_md5_new(Allocator.Default)) { "aws_md5_new" } override fun update(input: ByteArray, offset: Int, length: Int) { diff --git a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt index 8ef0f701..8db45e16 100644 --- a/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt +++ b/aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/util/hashing/ShaNative.kt @@ -5,7 +5,6 @@ package aws.sdk.kotlin.crt.util.hashing import aws.sdk.kotlin.crt.Allocator -import aws.sdk.kotlin.crt.CRT import aws.sdk.kotlin.crt.WithCrt import aws.sdk.kotlin.crt.awsAssertOpSuccess import kotlinx.cinterop.* @@ -21,7 +20,9 @@ internal typealias InitializeHashFn = ( /** * SHA-1 hash function implemented using bindings to CRT */ -public class Sha1 : HashFunction, WithCrt() { +public class Sha1 : + WithCrt(), + HashFunction { private val sha1 = Sha(::aws_sha1_new) override fun update(input: ByteArray, offset: Int, length: Int) { sha1.update(input, offset, length) @@ -35,7 +36,9 @@ public class Sha1 : HashFunction, WithCrt() { /** * SHA-256 hash function implemented using bindings to CRT */ -public class Sha256 : HashFunction, WithCrt() { +public class Sha256 : + WithCrt(), + HashFunction { private val sha256 = Sha(::aws_sha256_new) override fun update(input: ByteArray, offset: Int, length: Int) { sha256.update(input, offset, length)