Skip to content

Commit 0b6fbb0

Browse files
authored
Implement Digest.digestInto for all modules (#108)
1 parent 6d02832 commit 0b6fbb0

File tree

16 files changed

+210
-133
lines changed

16 files changed

+210
-133
lines changed

gradle/libs.versions.toml

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,41 @@
11
[versions]
2-
androidx-test-runner = "1.5.2"
2+
androidx-test-runner = "1.5.2"
33

4-
bouncy-castle = "1.73"
4+
bouncy-castle = "1.73"
55

6-
encoding = "2.3.1"
6+
encoding = "2.3.1"
77

8-
gradle-android = "8.2.2"
9-
gradle-benchmark = "0.4.11"
10-
gradle-binary-compat = "0.16.3"
11-
gradle-kmp-configuration = "0.3.2"
12-
gradle-kotlin = "1.9.24"
13-
gradle-publish-maven = "0.29.0"
8+
gradle-android = "8.2.2"
9+
gradle-benchmark = "0.4.11"
10+
gradle-binary-compat = "0.16.3"
11+
gradle-kmp-configuration = "0.3.2"
12+
gradle-kotlin = "1.9.24"
13+
gradle-publish-maven = "0.29.0"
1414

15-
kotlincrypto-bitops = "0.1.2"
16-
kotlincrypto-core = "0.6.0"
17-
kotlincrypto-sponges = "0.3.4"
15+
kotlincrypto-bitops = "0.1.2"
16+
kotlincrypto-core = "0.6.1-SNAPSHOT"
17+
kotlincrypto-sponges = "0.3.4"
1818

1919
[libraries]
20-
gradle-kmp-configuration = { module = "io.matthewnelson:gradle-kmp-configuration-plugin", version.ref = "gradle-kmp-configuration" }
21-
gradle-kotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "gradle-kotlin" }
22-
gradle-publish-maven = { module = "com.vanniktech:gradle-maven-publish-plugin", version.ref = "gradle-publish-maven" }
23-
24-
kotlincrypto-bitops-bits = { module = "org.kotlincrypto.bitops:bits", version.ref = "kotlincrypto-bitops" }
25-
kotlincrypto-bitops-endian = { module = "org.kotlincrypto.bitops:endian", version.ref = "kotlincrypto-bitops" }
26-
kotlincrypto-core-digest = { module = "org.kotlincrypto.core:digest", version.ref = "kotlincrypto-core" }
27-
kotlincrypto-core-xof = { module = "org.kotlincrypto.core:xof", version.ref = "kotlincrypto-core" }
20+
gradle-kmp-configuration = { module = "io.matthewnelson:gradle-kmp-configuration-plugin", version.ref = "gradle-kmp-configuration" }
21+
gradle-kotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "gradle-kotlin" }
22+
gradle-publish-maven = { module = "com.vanniktech:gradle-maven-publish-plugin", version.ref = "gradle-publish-maven" }
23+
24+
kotlincrypto-bitops-bits = { module = "org.kotlincrypto.bitops:bits", version.ref = "kotlincrypto-bitops" }
25+
kotlincrypto-bitops-endian = { module = "org.kotlincrypto.bitops:endian", version.ref = "kotlincrypto-bitops" }
26+
kotlincrypto-core-digest = { module = "org.kotlincrypto.core:digest", version.ref = "kotlincrypto-core" }
27+
kotlincrypto-core-xof = { module = "org.kotlincrypto.core:xof", version.ref = "kotlincrypto-core" }
2828
kotlincrypto-sponges-keccak = { module = "org.kotlincrypto.sponges:keccak", version.ref = "kotlincrypto-sponges" }
2929

3030
# tests & tools
31-
androidx-test-runner = { module = "androidx.test:runner", version.ref = "androidx-test-runner" }
32-
benchmark-runtime = { module = "org.jetbrains.kotlinx:kotlinx-benchmark-runtime", version.ref = "gradle-benchmark" }
33-
bouncy-castle = { module = "org.bouncycastle:bcprov-ext-jdk15to18", version.ref = "bouncy-castle" }
34-
encoding-base16 = { module = "io.matthewnelson.encoding:base16", version.ref = "encoding" }
35-
encoding-base64 = { module = "io.matthewnelson.encoding:base64", version.ref = "encoding" }
31+
androidx-test-runner = { module = "androidx.test:runner", version.ref = "androidx-test-runner" }
32+
benchmark-runtime = { module = "org.jetbrains.kotlinx:kotlinx-benchmark-runtime", version.ref = "gradle-benchmark" }
33+
bouncy-castle = { module = "org.bouncycastle:bcprov-ext-jdk15to18", version.ref = "bouncy-castle" }
34+
encoding-base16 = { module = "io.matthewnelson.encoding:base16", version.ref = "encoding" }
35+
encoding-base64 = { module = "io.matthewnelson.encoding:base64", version.ref = "encoding" }
3636

3737
[plugins]
38-
android-library = { id = "com.android.library", version.ref = "gradle-android" }
39-
benchmark = { id = "org.jetbrains.kotlinx.benchmark", version.ref = "gradle-benchmark" }
40-
binary-compat = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version.ref = "gradle-binary-compat" }
41-
kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "gradle-kotlin" }
38+
android-library = { id = "com.android.library", version.ref = "gradle-android" }
39+
benchmark = { id = "org.jetbrains.kotlinx.benchmark", version.ref = "gradle-benchmark" }
40+
binary-compat = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version.ref = "gradle-binary-compat" }
41+
kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "gradle-kotlin" }

library/blake2/api/blake2.api

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,21 @@ public abstract class org/kotlincrypto/hash/blake2/BLAKE2Digest : org/kotlincryp
1717
public abstract class org/kotlincrypto/hash/blake2/BLAKE2Digest$Bit32 : org/kotlincrypto/hash/blake2/BLAKE2Digest {
1818
public synthetic fun <init> (Ljava/lang/String;IZIIIIJII[B[BLkotlin/jvm/internal/DefaultConstructorMarker;)V
1919
public synthetic fun <init> (Lorg/kotlincrypto/hash/blake2/BLAKE2Digest$Bit32;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
20-
protected fun compressProtected ([BI)V
20+
protected final fun compressProtected ([BI)V
2121
public abstract fun copy ()Lorg/kotlincrypto/hash/blake2/BLAKE2Digest$Bit32;
22-
protected fun digestProtected ([BI)[B
23-
protected fun resetProtected ()V
22+
protected final fun digestIntoProtected ([BI[BI)V
23+
protected final fun digestProtected ([BI)[B
24+
protected final fun resetProtected ()V
2425
}
2526

2627
public abstract class org/kotlincrypto/hash/blake2/BLAKE2Digest$Bit64 : org/kotlincrypto/hash/blake2/BLAKE2Digest {
2728
public synthetic fun <init> (Ljava/lang/String;IZIIIIJII[B[BLkotlin/jvm/internal/DefaultConstructorMarker;)V
2829
public synthetic fun <init> (Lorg/kotlincrypto/hash/blake2/BLAKE2Digest$Bit64;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
29-
protected fun compressProtected ([BI)V
30+
protected final fun compressProtected ([BI)V
3031
public abstract fun copy ()Lorg/kotlincrypto/hash/blake2/BLAKE2Digest$Bit64;
31-
protected fun digestProtected ([BI)[B
32-
protected fun resetProtected ()V
32+
protected final fun digestIntoProtected ([BI[BI)V
33+
protected final fun digestProtected ([BI)[B
34+
protected final fun resetProtected ()V
3335
}
3436

3537
public final class org/kotlincrypto/hash/blake2/BLAKE2b : org/kotlincrypto/hash/blake2/BLAKE2Digest$Bit64 {

library/blake2/api/blake2.klib.api

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,20 @@ sealed class org.kotlincrypto.hash.blake2/BLAKE2Digest : org.kotlincrypto.core.d
4949
constructor <init>(org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit32) // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit32.<init>|<init>(org.kotlincrypto.hash.blake2.BLAKE2Digest.Bit32){}[0]
5050

5151
abstract fun copy(): org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit32 // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit32.copy|copy(){}[0]
52-
open fun compressProtected(kotlin/ByteArray, kotlin/Int) // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit32.compressProtected|compressProtected(kotlin.ByteArray;kotlin.Int){}[0]
53-
open fun digestProtected(kotlin/ByteArray, kotlin/Int): kotlin/ByteArray // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit32.digestProtected|digestProtected(kotlin.ByteArray;kotlin.Int){}[0]
54-
open fun resetProtected() // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit32.resetProtected|resetProtected(){}[0]
52+
final fun compressProtected(kotlin/ByteArray, kotlin/Int) // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit32.compressProtected|compressProtected(kotlin.ByteArray;kotlin.Int){}[0]
53+
final fun digestIntoProtected(kotlin/ByteArray, kotlin/Int, kotlin/ByteArray, kotlin/Int) // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit32.digestIntoProtected|digestIntoProtected(kotlin.ByteArray;kotlin.Int;kotlin.ByteArray;kotlin.Int){}[0]
54+
final fun digestProtected(kotlin/ByteArray, kotlin/Int): kotlin/ByteArray // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit32.digestProtected|digestProtected(kotlin.ByteArray;kotlin.Int){}[0]
55+
final fun resetProtected() // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit32.resetProtected|resetProtected(){}[0]
5556
}
5657

5758
sealed class Bit64 : org.kotlincrypto.hash.blake2/BLAKE2Digest { // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit64|null[0]
5859
constructor <init>(kotlin/String, kotlin/Int, kotlin/Boolean, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Long, kotlin/Int, kotlin/Int, kotlin/ByteArray?, kotlin/ByteArray?) // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit64.<init>|<init>(kotlin.String;kotlin.Int;kotlin.Boolean;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Long;kotlin.Int;kotlin.Int;kotlin.ByteArray?;kotlin.ByteArray?){}[0]
5960
constructor <init>(org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit64) // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit64.<init>|<init>(org.kotlincrypto.hash.blake2.BLAKE2Digest.Bit64){}[0]
6061

6162
abstract fun copy(): org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit64 // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit64.copy|copy(){}[0]
62-
open fun compressProtected(kotlin/ByteArray, kotlin/Int) // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit64.compressProtected|compressProtected(kotlin.ByteArray;kotlin.Int){}[0]
63-
open fun digestProtected(kotlin/ByteArray, kotlin/Int): kotlin/ByteArray // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit64.digestProtected|digestProtected(kotlin.ByteArray;kotlin.Int){}[0]
64-
open fun resetProtected() // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit64.resetProtected|resetProtected(){}[0]
63+
final fun compressProtected(kotlin/ByteArray, kotlin/Int) // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit64.compressProtected|compressProtected(kotlin.ByteArray;kotlin.Int){}[0]
64+
final fun digestIntoProtected(kotlin/ByteArray, kotlin/Int, kotlin/ByteArray, kotlin/Int) // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit64.digestIntoProtected|digestIntoProtected(kotlin.ByteArray;kotlin.Int;kotlin.ByteArray;kotlin.Int){}[0]
65+
final fun digestProtected(kotlin/ByteArray, kotlin/Int): kotlin/ByteArray // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit64.digestProtected|digestProtected(kotlin.ByteArray;kotlin.Int){}[0]
66+
final fun resetProtected() // org.kotlincrypto.hash.blake2/BLAKE2Digest.Bit64.resetProtected|resetProtected(){}[0]
6567
}
6668
}

library/blake2/src/commonMain/kotlin/org/kotlincrypto/hash/blake2/BLAKE2Digest.kt

Lines changed: 38 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public sealed class BLAKE2Digest: Digest {
118118

119119
public abstract override fun copy(): Bit32
120120

121-
protected override fun compressProtected(input: ByteArray, offset: Int) {
121+
protected final override fun compressProtected(input: ByteArray, offset: Int) {
122122
val m = m
123123

124124
if (m == null) {
@@ -144,7 +144,13 @@ public sealed class BLAKE2Digest: Digest {
144144
m.populate(input, offset)
145145
}
146146

147-
protected override fun digestProtected(buf: ByteArray, bufPos: Int): ByteArray {
147+
protected final override fun digestProtected(buf: ByteArray, bufPos: Int): ByteArray {
148+
val digest = ByteArray(digestLength())
149+
digestIntoProtected(digest, 0, buf, bufPos)
150+
return digest
151+
}
152+
153+
protected final override fun digestIntoProtected(dest: ByteArray, destOffset: Int, buf: ByteArray, bufPos: Int) {
148154
var m = m
149155

150156
if (m != null) {
@@ -176,23 +182,20 @@ public sealed class BLAKE2Digest: Digest {
176182
val rem = len % Int.SIZE_BYTES
177183
val iHEnd = len / Int.SIZE_BYTES
178184

179-
val out = h.lePackIntoUnsafe(
180-
dest = ByteArray(len),
181-
destOffset = 0,
185+
h.lePackIntoUnsafe(
186+
dest = dest,
187+
destOffset = destOffset,
182188
sourceIndexStart = 0,
183189
sourceIndexEnd = iHEnd,
184190
)
185191

186-
if (rem > 0) {
187-
h[iHEnd].lePackIntoUnsafe(
188-
dest = out,
189-
destOffset = len - rem,
190-
sourceIndexStart = 0,
191-
sourceIndexEnd = rem,
192-
)
193-
}
194-
195-
return out
192+
if (rem == 0) return
193+
h[iHEnd].lePackIntoUnsafe(
194+
dest = dest,
195+
destOffset = destOffset + len - rem,
196+
sourceIndexStart = 0,
197+
sourceIndexEnd = rem,
198+
)
196199
}
197200

198201
private inline fun F(h: IntArray, m: Bit32Message, tLo: Int, tHi: Int, f0: Int, f1: Int) {
@@ -292,7 +295,7 @@ public sealed class BLAKE2Digest: Digest {
292295
return this
293296
}
294297

295-
protected override fun resetProtected() {
298+
protected final override fun resetProtected() {
296299
v.fill(0)
297300
h.initialize()
298301
m?.fill()
@@ -376,7 +379,7 @@ public sealed class BLAKE2Digest: Digest {
376379

377380
public abstract override fun copy(): Bit64
378381

379-
protected override fun compressProtected(input: ByteArray, offset: Int) {
382+
protected final override fun compressProtected(input: ByteArray, offset: Int) {
380383
val m = m
381384

382385
if (m == null) {
@@ -402,7 +405,13 @@ public sealed class BLAKE2Digest: Digest {
402405
m.populate(input, offset)
403406
}
404407

405-
protected override fun digestProtected(buf: ByteArray, bufPos: Int): ByteArray {
408+
protected final override fun digestProtected(buf: ByteArray, bufPos: Int): ByteArray {
409+
val digest = ByteArray(digestLength())
410+
digestIntoProtected(digest, 0, buf, bufPos)
411+
return digest
412+
}
413+
414+
protected final override fun digestIntoProtected(dest: ByteArray, destOffset: Int, buf: ByteArray, bufPos: Int) {
406415
var m = m
407416

408417
if (m != null) {
@@ -434,23 +443,20 @@ public sealed class BLAKE2Digest: Digest {
434443
val rem = len % Long.SIZE_BYTES
435444
val iHEnd = len / Long.SIZE_BYTES
436445

437-
val out = h.lePackIntoUnsafe(
438-
dest = ByteArray(len),
439-
destOffset = 0,
446+
h.lePackIntoUnsafe(
447+
dest = dest,
448+
destOffset = destOffset,
440449
sourceIndexStart = 0,
441450
sourceIndexEnd = iHEnd,
442451
)
443452

444-
if (rem > 0) {
445-
h[iHEnd].lePackIntoUnsafe(
446-
dest = out,
447-
destOffset = len - rem,
448-
sourceIndexStart = 0,
449-
sourceIndexEnd = rem,
450-
)
451-
}
452-
453-
return out
453+
if (rem == 0) return
454+
h[iHEnd].lePackIntoUnsafe(
455+
dest = dest,
456+
destOffset = destOffset + len - rem,
457+
sourceIndexStart = 0,
458+
sourceIndexEnd = rem,
459+
)
454460
}
455461

456462
private inline fun F(h: LongArray, m: Bit64Message, tLo: Long, tHi: Long, f0: Long, f1: Long) {
@@ -551,7 +557,7 @@ public sealed class BLAKE2Digest: Digest {
551557
return this
552558
}
553559

554-
protected override fun resetProtected() {
560+
protected final override fun resetProtected() {
555561
v.fill(0)
556562
h.initialize()
557563
m?.fill()

library/md/src/commonMain/kotlin/org/kotlincrypto/hash/md/MD5.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,12 @@ public class MD5: Digest {
106106
}
107107

108108
protected override fun digestProtected(buf: ByteArray, bufPos: Int): ByteArray {
109+
val digest = ByteArray(digestLength())
110+
digestIntoProtected(digest, 0, buf, bufPos)
111+
return digest
112+
}
113+
114+
protected override fun digestIntoProtected(dest: ByteArray, destOffset: Int, buf: ByteArray, bufPos: Int) {
109115
val (bitsLo, bitsHi) = count.final(additional = bufPos).asBits()
110116
buf[bufPos] = 0x80.toByte()
111117

@@ -118,10 +124,7 @@ public class MD5: Digest {
118124
bitsHi.lePackIntoUnsafe(buf, destOffset = 60)
119125
compressProtected(buf, 0)
120126

121-
return state.lePackIntoUnsafe(
122-
dest = ByteArray(digestLength()),
123-
destOffset = 0,
124-
)
127+
state.lePackIntoUnsafe(dest = dest, destOffset = destOffset)
125128
}
126129

127130
protected override fun resetProtected() {

library/sha1/src/commonMain/kotlin/org/kotlincrypto/hash/sha1/SHA1.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,12 @@ public class SHA1: Digest {
116116
}
117117

118118
protected override fun digestProtected(buf: ByteArray, bufPos: Int): ByteArray {
119+
val digest = ByteArray(digestLength())
120+
digestIntoProtected(digest, 0, buf, bufPos)
121+
return digest
122+
}
123+
124+
protected override fun digestIntoProtected(dest: ByteArray, destOffset: Int, buf: ByteArray, bufPos: Int) {
119125
val (bitsLo, bitsHi) = count.final(additional = bufPos).asBits()
120126
buf[bufPos] = 0x80.toByte()
121127

@@ -128,10 +134,7 @@ public class SHA1: Digest {
128134
bitsLo.bePackIntoUnsafe(buf, destOffset = 60)
129135
compressProtected(buf, 0)
130136

131-
return state.bePackIntoUnsafe(
132-
dest = ByteArray(digestLength()),
133-
destOffset = 0,
134-
)
137+
state.bePackIntoUnsafe(dest = dest, destOffset = destOffset)
135138
}
136139

137140
protected override fun resetProtected() {

library/sha2/api/sha2.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ public abstract class org/kotlincrypto/hash/sha2/Bit32Digest : org/kotlincrypto/
33
public synthetic fun <init> (Lorg/kotlincrypto/hash/sha2/Bit32Digest;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
44
protected final fun compressProtected ([BI)V
55
public abstract fun copy ()Lorg/kotlincrypto/hash/sha2/Bit32Digest;
6+
protected final fun digestIntoProtected ([BI[BI)V
67
protected final fun digestProtected ([BI)[B
78
protected final fun resetProtected ()V
89
}
@@ -12,6 +13,7 @@ public abstract class org/kotlincrypto/hash/sha2/Bit64Digest : org/kotlincrypto/
1213
public synthetic fun <init> (Lorg/kotlincrypto/hash/sha2/Bit64Digest;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
1314
protected final fun compressProtected ([BI)V
1415
public abstract fun copy ()Lorg/kotlincrypto/hash/sha2/Bit64Digest;
16+
protected final fun digestIntoProtected ([BI[BI)V
1517
protected final fun digestProtected ([BI)[B
1618
protected final fun resetProtected ()V
1719
}

library/sha2/api/sha2.klib.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ sealed class org.kotlincrypto.hash.sha2/Bit32Digest : org.kotlincrypto.core.dige
4242

4343
abstract fun copy(): org.kotlincrypto.hash.sha2/Bit32Digest // org.kotlincrypto.hash.sha2/Bit32Digest.copy|copy(){}[0]
4444
final fun compressProtected(kotlin/ByteArray, kotlin/Int) // org.kotlincrypto.hash.sha2/Bit32Digest.compressProtected|compressProtected(kotlin.ByteArray;kotlin.Int){}[0]
45+
final fun digestIntoProtected(kotlin/ByteArray, kotlin/Int, kotlin/ByteArray, kotlin/Int) // org.kotlincrypto.hash.sha2/Bit32Digest.digestIntoProtected|digestIntoProtected(kotlin.ByteArray;kotlin.Int;kotlin.ByteArray;kotlin.Int){}[0]
4546
final fun digestProtected(kotlin/ByteArray, kotlin/Int): kotlin/ByteArray // org.kotlincrypto.hash.sha2/Bit32Digest.digestProtected|digestProtected(kotlin.ByteArray;kotlin.Int){}[0]
4647
final fun resetProtected() // org.kotlincrypto.hash.sha2/Bit32Digest.resetProtected|resetProtected(){}[0]
4748
}
@@ -52,6 +53,7 @@ sealed class org.kotlincrypto.hash.sha2/Bit64Digest : org.kotlincrypto.core.dige
5253

5354
abstract fun copy(): org.kotlincrypto.hash.sha2/Bit64Digest // org.kotlincrypto.hash.sha2/Bit64Digest.copy|copy(){}[0]
5455
final fun compressProtected(kotlin/ByteArray, kotlin/Int) // org.kotlincrypto.hash.sha2/Bit64Digest.compressProtected|compressProtected(kotlin.ByteArray;kotlin.Int){}[0]
56+
final fun digestIntoProtected(kotlin/ByteArray, kotlin/Int, kotlin/ByteArray, kotlin/Int) // org.kotlincrypto.hash.sha2/Bit64Digest.digestIntoProtected|digestIntoProtected(kotlin.ByteArray;kotlin.Int;kotlin.ByteArray;kotlin.Int){}[0]
5557
final fun digestProtected(kotlin/ByteArray, kotlin/Int): kotlin/ByteArray // org.kotlincrypto.hash.sha2/Bit64Digest.digestProtected|digestProtected(kotlin.ByteArray;kotlin.Int){}[0]
5658
final fun resetProtected() // org.kotlincrypto.hash.sha2/Bit64Digest.resetProtected|resetProtected(){}[0]
5759
}

0 commit comments

Comments
 (0)