Skip to content

Commit 644d53f

Browse files
committed
Support MD4 (legacy)
1 parent 1d0f98f commit 644d53f

File tree

13 files changed

+34
-5
lines changed

13 files changed

+34
-5
lines changed

build-logic/src/main/kotlin/ckbuild/tests/GenerateProviderTestsTask.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ abstract class GenerateProviderTestsTask : DefaultTask() {
7979
"HkdfTestvectorsTest",
8080

8181
"DigestTest",
82+
"Md4CompatibilityTest",
8283
"Md5CompatibilityTest",
8384
"Sha1CompatibilityTest",
8485
"Sha224CompatibilityTest",

cryptography-core/api/cryptography-core.api

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,10 @@ public final class dev/whyoleg/cryptography/algorithms/HMAC$Key$Format : java/la
455455
public static fun values ()[Ldev/whyoleg/cryptography/algorithms/HMAC$Key$Format;
456456
}
457457

458+
public final class dev/whyoleg/cryptography/algorithms/MD4 : dev/whyoleg/cryptography/CryptographyAlgorithmId {
459+
public static final field INSTANCE Ldev/whyoleg/cryptography/algorithms/MD4;
460+
}
461+
458462
public final class dev/whyoleg/cryptography/algorithms/MD5 : dev/whyoleg/cryptography/CryptographyAlgorithmId {
459463
public static final field INSTANCE Ldev/whyoleg/cryptography/algorithms/MD5;
460464
}

cryptography-core/api/cryptography-core.klib.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -826,6 +826,8 @@ open class dev.whyoleg.cryptography/CryptographyException : kotlin/RuntimeExcept
826826
constructor <init>(kotlin/Throwable?) // dev.whyoleg.cryptography/CryptographyException.<init>|<init>(kotlin.Throwable?){}[0]
827827
}
828828

829+
final object dev.whyoleg.cryptography.algorithms/MD4 : dev.whyoleg.cryptography/CryptographyAlgorithmId<dev.whyoleg.cryptography.algorithms/Digest> // dev.whyoleg.cryptography.algorithms/MD4|null[0]
830+
829831
final object dev.whyoleg.cryptography.algorithms/MD5 : dev.whyoleg.cryptography/CryptographyAlgorithmId<dev.whyoleg.cryptography.algorithms/Digest> // dev.whyoleg.cryptography.algorithms/MD5|null[0]
830832

831833
final object dev.whyoleg.cryptography.algorithms/RIPEMD160 : dev.whyoleg.cryptography/CryptographyAlgorithmId<dev.whyoleg.cryptography.algorithms/Digest> // dev.whyoleg.cryptography.algorithms/RIPEMD160|null[0]

cryptography-core/src/commonMain/kotlin/algorithms/Digest.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2023-2024 Oleg Yukhnevich. Use of this source code is governed by the Apache 2.0 license.
2+
* Copyright (c) 2023-2025 Oleg Yukhnevich. Use of this source code is governed by the Apache 2.0 license.
33
*/
44

55
@file:OptIn(CryptographyProviderApi::class)
@@ -16,6 +16,9 @@ public interface Digest : CryptographyAlgorithm {
1616
public fun hasher(): Hasher
1717
}
1818

19+
@DelicateCryptographyApi
20+
public object MD4 : CryptographyAlgorithmId<Digest>("MD4")
21+
1922
@DelicateCryptographyApi
2023
public object MD5 : CryptographyAlgorithmId<Digest>("MD5")
2124

cryptography-providers/apple/src/commonMain/kotlin/AppleCryptographyProvider.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ internal object AppleCryptographyProvider : CryptographyProvider() {
1717

1818
@Suppress("UNCHECKED_CAST")
1919
override fun <A : CryptographyAlgorithm> getOrNull(identifier: CryptographyAlgorithmId<A>): A? = when (identifier) {
20+
MD4 -> CCDigest(CCHashAlgorithm.MD4, MD4)
2021
MD5 -> CCDigest(CCHashAlgorithm.MD5, MD5)
2122
SHA1 -> CCDigest(CCHashAlgorithm.SHA1, SHA1)
2223
SHA224 -> CCDigest(CCHashAlgorithm.SHA224, SHA224)

cryptography-providers/apple/src/commonMain/kotlin/algorithms/CCHashAlgorithm.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2023-2024 Oleg Yukhnevich. Use of this source code is governed by the Apache 2.0 license.
2+
* Copyright (c) 2023-2025 Oleg Yukhnevich. Use of this source code is governed by the Apache 2.0 license.
33
*/
44

55
package dev.whyoleg.cryptography.providers.apple.algorithms
@@ -68,4 +68,13 @@ internal abstract class CCHashAlgorithm<CTX : CPointed> {
6868
override fun ccUpdate(context: CPointer<CC_MD5_CTX>, data: CValuesRef<ByteVar>, dataLength: CC_LONG): Int =
6969
CC_MD5_Update(context, data, dataLength)
7070
}
71+
72+
object MD4 : CCHashAlgorithm<CC_MD4_CTX>() {
73+
override val digestSize: Int get() = CC_MD4_DIGEST_LENGTH
74+
override fun alloc(): CPointer<CC_MD4_CTX> = nativeHeap.alloc<CC_MD4_CTX>().ptr
75+
override fun ccInit(context: CPointer<CC_MD4_CTX>): Int = CC_MD4_Init(context)
76+
override fun ccFinal(context: CPointer<CC_MD4_CTX>, digest: CValuesRef<UByteVar>): Int = CC_MD4_Final(digest, context)
77+
override fun ccUpdate(context: CPointer<CC_MD4_CTX>, data: CValuesRef<ByteVar>, dataLength: CC_LONG): Int =
78+
CC_MD4_Update(context, data, dataLength)
79+
}
7180
}

cryptography-providers/jdk/src/jvmMain/kotlin/JdkCryptographyProvider.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ internal class JdkCryptographyProvider(provider: Provider?) : CryptographyProvid
109109
@Suppress("UNCHECKED_CAST")
110110
override fun <A : CryptographyAlgorithm> getOrNull(identifier: CryptographyAlgorithmId<A>): A? = cache.getOrPut(identifier) {
111111
when (identifier) {
112+
MD4 -> JdkDigest(state, "MD4", MD4)
112113
MD5 -> JdkDigest(state, "MD5", MD5)
113114
SHA1 -> JdkDigest(state, "SHA-1", SHA1)
114115
SHA224 -> JdkDigest(state, "SHA-224", SHA224)

cryptography-providers/openssl3/api/src/commonMain/kotlin/Openssl3CryptographyProvider.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ internal object Openssl3CryptographyProvider : CryptographyProvider() {
1919

2020
@Suppress("UNCHECKED_CAST")
2121
override fun <A : CryptographyAlgorithm> getOrNull(identifier: CryptographyAlgorithmId<A>): A? = when (identifier) {
22+
MD4 -> Openssl3Digest("MD4", MD4)
2223
MD5 -> Openssl3Digest("MD5", MD5)
2324
SHA1 -> Openssl3Digest("SHA1", SHA1)
2425
SHA224 -> Openssl3Digest("SHA224", SHA224)

cryptography-providers/tests/src/commonMain/kotlin/TestUtils.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ suspend inline fun <KF : KeyFormat, K : EncodableKey<KF>> KeyDecoder<KF, K>.deco
7171
}
7272

7373
fun digest(name: String): CryptographyAlgorithmId<Digest> = when (name) {
74+
MD4.name -> MD4
7475
MD5.name -> MD5
7576
SHA1.name -> SHA1
7677
SHA224.name -> SHA224

cryptography-providers/tests/src/commonMain/kotlin/compatibility/DigestCompatibilityTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import kotlinx.io.bytestring.*
1313

1414
private const val maxDataSize = 10000
1515

16+
abstract class Md4CompatibilityTest(provider: CryptographyProvider) : DigestCompatibilityTest(MD4, provider)
1617
abstract class Md5CompatibilityTest(provider: CryptographyProvider) : DigestCompatibilityTest(MD5, provider)
1718
abstract class Sha1CompatibilityTest(provider: CryptographyProvider) : DigestCompatibilityTest(SHA1, provider)
1819

0 commit comments

Comments
 (0)