Skip to content

Commit 7307cd7

Browse files
committed
Support incremental signature generation and verification via SignFunction/VerifyFunction
1 parent 8d285ce commit 7307cd7

File tree

23 files changed

+796
-183
lines changed

23 files changed

+796
-183
lines changed

cryptography-core/api/cryptography-core.api

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,16 @@ public abstract interface class dev/whyoleg/cryptography/functions/HashFunction
655655
public abstract fun reset ()V
656656
}
657657

658+
public abstract interface class dev/whyoleg/cryptography/functions/SignFunction : dev/whyoleg/cryptography/functions/UpdateFunction {
659+
public abstract fun reset ()V
660+
public fun sign ()Lkotlinx/io/bytestring/ByteString;
661+
public abstract fun signIntoByteArray ([BI)I
662+
public static synthetic fun signIntoByteArray$default (Ldev/whyoleg/cryptography/functions/SignFunction;[BIILjava/lang/Object;)I
663+
public abstract fun signToByteArray ()[B
664+
}
665+
658666
public abstract interface class dev/whyoleg/cryptography/functions/UpdateFunction : java/lang/AutoCloseable {
667+
public fun update (Lkotlinx/io/RawSource;)V
659668
public fun update (Lkotlinx/io/bytestring/ByteString;II)V
660669
public abstract fun update ([BII)V
661670
public static synthetic fun update$default (Ldev/whyoleg/cryptography/functions/UpdateFunction;Lkotlinx/io/bytestring/ByteString;IIILjava/lang/Object;)V
@@ -664,6 +673,14 @@ public abstract interface class dev/whyoleg/cryptography/functions/UpdateFunctio
664673
public fun updatingSource (Lkotlinx/io/RawSource;)Lkotlinx/io/RawSource;
665674
}
666675

676+
public abstract interface class dev/whyoleg/cryptography/functions/VerifyFunction : dev/whyoleg/cryptography/functions/UpdateFunction {
677+
public abstract fun reset ()V
678+
public fun verify (Lkotlinx/io/bytestring/ByteString;II)Z
679+
public abstract fun verify ([BII)Z
680+
public static synthetic fun verify$default (Ldev/whyoleg/cryptography/functions/VerifyFunction;Lkotlinx/io/bytestring/ByteString;IIILjava/lang/Object;)Z
681+
public static synthetic fun verify$default (Ldev/whyoleg/cryptography/functions/VerifyFunction;[BIIILjava/lang/Object;)Z
682+
}
683+
667684
public abstract interface class dev/whyoleg/cryptography/materials/key/EncodableKey : dev/whyoleg/cryptography/materials/key/Key {
668685
public fun encodeTo (Ldev/whyoleg/cryptography/materials/key/KeyFormat;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
669686
public static synthetic fun encodeTo$suspendImpl (Ldev/whyoleg/cryptography/materials/key/EncodableKey;Ldev/whyoleg/cryptography/materials/key/KeyFormat;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
@@ -788,20 +805,28 @@ public abstract interface class dev/whyoleg/cryptography/operations/SharedSecret
788805
}
789806

790807
public abstract interface class dev/whyoleg/cryptography/operations/SignatureGenerator {
808+
public abstract fun createSignFunction ()Ldev/whyoleg/cryptography/functions/SignFunction;
809+
public fun generateSignature (Lkotlinx/io/RawSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
791810
public fun generateSignature (Lkotlinx/io/bytestring/ByteString;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
792811
public fun generateSignature ([BLkotlin/coroutines/Continuation;)Ljava/lang/Object;
812+
public static synthetic fun generateSignature$suspendImpl (Ldev/whyoleg/cryptography/operations/SignatureGenerator;Lkotlinx/io/RawSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
793813
public static synthetic fun generateSignature$suspendImpl (Ldev/whyoleg/cryptography/operations/SignatureGenerator;Lkotlinx/io/bytestring/ByteString;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
794814
public static synthetic fun generateSignature$suspendImpl (Ldev/whyoleg/cryptography/operations/SignatureGenerator;[BLkotlin/coroutines/Continuation;)Ljava/lang/Object;
815+
public fun generateSignatureBlocking (Lkotlinx/io/RawSource;)Lkotlinx/io/bytestring/ByteString;
795816
public fun generateSignatureBlocking (Lkotlinx/io/bytestring/ByteString;)Lkotlinx/io/bytestring/ByteString;
796-
public abstract fun generateSignatureBlocking ([B)[B
817+
public fun generateSignatureBlocking ([B)[B
797818
}
798819

799820
public abstract interface class dev/whyoleg/cryptography/operations/SignatureVerifier {
821+
public abstract fun createVerifyFunction ()Ldev/whyoleg/cryptography/functions/VerifyFunction;
822+
public fun verifySignature (Lkotlinx/io/RawSource;Lkotlinx/io/bytestring/ByteString;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
800823
public fun verifySignature (Lkotlinx/io/bytestring/ByteString;Lkotlinx/io/bytestring/ByteString;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
801824
public fun verifySignature ([B[BLkotlin/coroutines/Continuation;)Ljava/lang/Object;
825+
public static synthetic fun verifySignature$suspendImpl (Ldev/whyoleg/cryptography/operations/SignatureVerifier;Lkotlinx/io/RawSource;Lkotlinx/io/bytestring/ByteString;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
802826
public static synthetic fun verifySignature$suspendImpl (Ldev/whyoleg/cryptography/operations/SignatureVerifier;Lkotlinx/io/bytestring/ByteString;Lkotlinx/io/bytestring/ByteString;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
803827
public static synthetic fun verifySignature$suspendImpl (Ldev/whyoleg/cryptography/operations/SignatureVerifier;[B[BLkotlin/coroutines/Continuation;)Ljava/lang/Object;
828+
public fun verifySignatureBlocking (Lkotlinx/io/RawSource;Lkotlinx/io/bytestring/ByteString;)Z
804829
public fun verifySignatureBlocking (Lkotlinx/io/bytestring/ByteString;Lkotlinx/io/bytestring/ByteString;)Z
805-
public abstract fun verifySignatureBlocking ([B[B)Z
830+
public fun verifySignatureBlocking ([B[B)Z
806831
}
807832

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

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -539,13 +539,27 @@ abstract interface dev.whyoleg.cryptography.functions/HashFunction : dev.whyoleg
539539
open fun hash(): kotlinx.io.bytestring/ByteString // dev.whyoleg.cryptography.functions/HashFunction.hash|hash(){}[0]
540540
}
541541

542+
abstract interface dev.whyoleg.cryptography.functions/SignFunction : dev.whyoleg.cryptography.functions/UpdateFunction { // dev.whyoleg.cryptography.functions/SignFunction|null[0]
543+
abstract fun reset() // dev.whyoleg.cryptography.functions/SignFunction.reset|reset(){}[0]
544+
abstract fun signIntoByteArray(kotlin/ByteArray, kotlin/Int = ...): kotlin/Int // dev.whyoleg.cryptography.functions/SignFunction.signIntoByteArray|signIntoByteArray(kotlin.ByteArray;kotlin.Int){}[0]
545+
abstract fun signToByteArray(): kotlin/ByteArray // dev.whyoleg.cryptography.functions/SignFunction.signToByteArray|signToByteArray(){}[0]
546+
open fun sign(): kotlinx.io.bytestring/ByteString // dev.whyoleg.cryptography.functions/SignFunction.sign|sign(){}[0]
547+
}
548+
542549
abstract interface dev.whyoleg.cryptography.functions/UpdateFunction : kotlin/AutoCloseable { // dev.whyoleg.cryptography.functions/UpdateFunction|null[0]
543550
abstract fun update(kotlin/ByteArray, kotlin/Int = ..., kotlin/Int = ...) // dev.whyoleg.cryptography.functions/UpdateFunction.update|update(kotlin.ByteArray;kotlin.Int;kotlin.Int){}[0]
544551
open fun update(kotlinx.io.bytestring/ByteString, kotlin/Int = ..., kotlin/Int = ...) // dev.whyoleg.cryptography.functions/UpdateFunction.update|update(kotlinx.io.bytestring.ByteString;kotlin.Int;kotlin.Int){}[0]
552+
open fun update(kotlinx.io/RawSource) // dev.whyoleg.cryptography.functions/UpdateFunction.update|update(kotlinx.io.RawSource){}[0]
545553
open fun updatingSink(kotlinx.io/RawSink): kotlinx.io/RawSink // dev.whyoleg.cryptography.functions/UpdateFunction.updatingSink|updatingSink(kotlinx.io.RawSink){}[0]
546554
open fun updatingSource(kotlinx.io/RawSource): kotlinx.io/RawSource // dev.whyoleg.cryptography.functions/UpdateFunction.updatingSource|updatingSource(kotlinx.io.RawSource){}[0]
547555
}
548556

557+
abstract interface dev.whyoleg.cryptography.functions/VerifyFunction : dev.whyoleg.cryptography.functions/UpdateFunction { // dev.whyoleg.cryptography.functions/VerifyFunction|null[0]
558+
abstract fun reset() // dev.whyoleg.cryptography.functions/VerifyFunction.reset|reset(){}[0]
559+
abstract fun verify(kotlin/ByteArray, kotlin/Int = ..., kotlin/Int = ...): kotlin/Boolean // dev.whyoleg.cryptography.functions/VerifyFunction.verify|verify(kotlin.ByteArray;kotlin.Int;kotlin.Int){}[0]
560+
open fun verify(kotlinx.io.bytestring/ByteString, kotlin/Int = ..., kotlin/Int = ...): kotlin/Boolean // dev.whyoleg.cryptography.functions/VerifyFunction.verify|verify(kotlinx.io.bytestring.ByteString;kotlin.Int;kotlin.Int){}[0]
561+
}
562+
549563
abstract interface dev.whyoleg.cryptography.materials.key/Key // dev.whyoleg.cryptography.materials.key/Key|null[0]
550564

551565
abstract interface dev.whyoleg.cryptography.materials.key/KeyFormat { // dev.whyoleg.cryptography.materials.key/KeyFormat|null[0]
@@ -613,17 +627,23 @@ abstract interface dev.whyoleg.cryptography.operations/SecretDerivation { // dev
613627
}
614628

615629
abstract interface dev.whyoleg.cryptography.operations/SignatureGenerator { // dev.whyoleg.cryptography.operations/SignatureGenerator|null[0]
616-
abstract fun generateSignatureBlocking(kotlin/ByteArray): kotlin/ByteArray // dev.whyoleg.cryptography.operations/SignatureGenerator.generateSignatureBlocking|generateSignatureBlocking(kotlin.ByteArray){}[0]
630+
abstract fun createSignFunction(): dev.whyoleg.cryptography.functions/SignFunction // dev.whyoleg.cryptography.operations/SignatureGenerator.createSignFunction|createSignFunction(){}[0]
631+
open fun generateSignatureBlocking(kotlin/ByteArray): kotlin/ByteArray // dev.whyoleg.cryptography.operations/SignatureGenerator.generateSignatureBlocking|generateSignatureBlocking(kotlin.ByteArray){}[0]
617632
open fun generateSignatureBlocking(kotlinx.io.bytestring/ByteString): kotlinx.io.bytestring/ByteString // dev.whyoleg.cryptography.operations/SignatureGenerator.generateSignatureBlocking|generateSignatureBlocking(kotlinx.io.bytestring.ByteString){}[0]
633+
open fun generateSignatureBlocking(kotlinx.io/RawSource): kotlinx.io.bytestring/ByteString // dev.whyoleg.cryptography.operations/SignatureGenerator.generateSignatureBlocking|generateSignatureBlocking(kotlinx.io.RawSource){}[0]
618634
open suspend fun generateSignature(kotlin/ByteArray): kotlin/ByteArray // dev.whyoleg.cryptography.operations/SignatureGenerator.generateSignature|generateSignature(kotlin.ByteArray){}[0]
619635
open suspend fun generateSignature(kotlinx.io.bytestring/ByteString): kotlinx.io.bytestring/ByteString // dev.whyoleg.cryptography.operations/SignatureGenerator.generateSignature|generateSignature(kotlinx.io.bytestring.ByteString){}[0]
636+
open suspend fun generateSignature(kotlinx.io/RawSource): kotlinx.io.bytestring/ByteString // dev.whyoleg.cryptography.operations/SignatureGenerator.generateSignature|generateSignature(kotlinx.io.RawSource){}[0]
620637
}
621638

622639
abstract interface dev.whyoleg.cryptography.operations/SignatureVerifier { // dev.whyoleg.cryptography.operations/SignatureVerifier|null[0]
623-
abstract fun verifySignatureBlocking(kotlin/ByteArray, kotlin/ByteArray): kotlin/Boolean // dev.whyoleg.cryptography.operations/SignatureVerifier.verifySignatureBlocking|verifySignatureBlocking(kotlin.ByteArray;kotlin.ByteArray){}[0]
640+
abstract fun createVerifyFunction(): dev.whyoleg.cryptography.functions/VerifyFunction // dev.whyoleg.cryptography.operations/SignatureVerifier.createVerifyFunction|createVerifyFunction(){}[0]
641+
open fun verifySignatureBlocking(kotlin/ByteArray, kotlin/ByteArray): kotlin/Boolean // dev.whyoleg.cryptography.operations/SignatureVerifier.verifySignatureBlocking|verifySignatureBlocking(kotlin.ByteArray;kotlin.ByteArray){}[0]
624642
open fun verifySignatureBlocking(kotlinx.io.bytestring/ByteString, kotlinx.io.bytestring/ByteString): kotlin/Boolean // dev.whyoleg.cryptography.operations/SignatureVerifier.verifySignatureBlocking|verifySignatureBlocking(kotlinx.io.bytestring.ByteString;kotlinx.io.bytestring.ByteString){}[0]
643+
open fun verifySignatureBlocking(kotlinx.io/RawSource, kotlinx.io.bytestring/ByteString): kotlin/Boolean // dev.whyoleg.cryptography.operations/SignatureVerifier.verifySignatureBlocking|verifySignatureBlocking(kotlinx.io.RawSource;kotlinx.io.bytestring.ByteString){}[0]
625644
open suspend fun verifySignature(kotlin/ByteArray, kotlin/ByteArray): kotlin/Boolean // dev.whyoleg.cryptography.operations/SignatureVerifier.verifySignature|verifySignature(kotlin.ByteArray;kotlin.ByteArray){}[0]
626645
open suspend fun verifySignature(kotlinx.io.bytestring/ByteString, kotlinx.io.bytestring/ByteString): kotlin/Boolean // dev.whyoleg.cryptography.operations/SignatureVerifier.verifySignature|verifySignature(kotlinx.io.bytestring.ByteString;kotlinx.io.bytestring.ByteString){}[0]
646+
open suspend fun verifySignature(kotlinx.io/RawSource, kotlinx.io.bytestring/ByteString): kotlin/Boolean // dev.whyoleg.cryptography.operations/SignatureVerifier.verifySignature|verifySignature(kotlinx.io.RawSource;kotlinx.io.bytestring.ByteString){}[0]
627647
}
628648

629649
abstract interface dev.whyoleg.cryptography/CryptographyAlgorithm { // dev.whyoleg.cryptography/CryptographyAlgorithm|null[0]
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
* Copyright (c) 2024 Oleg Yukhnevich. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package dev.whyoleg.cryptography.functions
6+
7+
import dev.whyoleg.cryptography.*
8+
import kotlinx.io.bytestring.*
9+
10+
public interface SignFunction : UpdateFunction {
11+
public fun signIntoByteArray(destination: ByteArray, destinationOffset: Int = 0): Int
12+
public fun signToByteArray(): ByteArray
13+
public fun sign(): ByteString = signToByteArray().asByteString()
14+
public fun reset()
15+
}

cryptography-core/src/commonMain/kotlin/functions/UpdateFunction.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ public interface UpdateFunction : AutoCloseable {
1515
update(source.asByteArray(), startIndex, endIndex)
1616
}
1717

18+
public fun update(source: RawSource) {
19+
updatingSource(source).buffered().transferTo(discardingSink())
20+
}
21+
1822
public fun updatingSource(source: RawSource): RawSource = UpdatingSource(this, source)
1923
public fun updatingSink(sink: RawSink): RawSink = UpdatingSink(this, sink)
2024
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
* Copyright (c) 2024 Oleg Yukhnevich. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package dev.whyoleg.cryptography.functions
6+
7+
import dev.whyoleg.cryptography.*
8+
import kotlinx.io.bytestring.*
9+
10+
public interface VerifyFunction : UpdateFunction {
11+
public fun verify(signature: ByteArray, startIndex: Int = 0, endIndex: Int = signature.size): Boolean
12+
public fun verify(signature: ByteString, startIndex: Int = 0, endIndex: Int = signature.size): Boolean =
13+
verify(signature.asByteArray(), startIndex, endIndex)
14+
15+
public fun reset()
16+
}

cryptography-core/src/commonMain/kotlin/operations/Hasher.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public interface Hasher {
2727
public fun hashBlocking(data: ByteString): ByteString = hashBlocking(data.asByteArray()).asByteString()
2828

2929
public fun hashBlocking(data: RawSource): ByteString = createHashFunction().use {
30-
it.updatingSource(data).buffered().transferTo(discardingSink())
30+
it.update(data)
3131
it.hash()
3232
}
3333
}

cryptography-core/src/commonMain/kotlin/operations/Signature.kt

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,50 @@
55
package dev.whyoleg.cryptography.operations
66

77
import dev.whyoleg.cryptography.*
8+
import dev.whyoleg.cryptography.functions.*
9+
import kotlinx.io.*
810
import kotlinx.io.bytestring.*
911

1012
@SubclassOptInRequired(CryptographyProviderApi::class)
1113
public interface SignatureGenerator {
12-
public suspend fun generateSignature(data: ByteArray): ByteArray = generateSignatureBlocking(data)
13-
public fun generateSignatureBlocking(data: ByteArray): ByteArray
14+
public fun createSignFunction(): SignFunction
1415

16+
public suspend fun generateSignature(data: ByteArray): ByteArray = generateSignatureBlocking(data)
1517
public suspend fun generateSignature(data: ByteString): ByteString = generateSignature(data.asByteArray()).asByteString()
18+
public suspend fun generateSignature(data: RawSource): ByteString = generateSignatureBlocking(data)
19+
20+
public fun generateSignatureBlocking(data: ByteArray): ByteArray = createSignFunction().use {
21+
it.update(data)
22+
it.signToByteArray()
23+
}
24+
1625
public fun generateSignatureBlocking(data: ByteString): ByteString = generateSignatureBlocking(data.asByteArray()).asByteString()
26+
public fun generateSignatureBlocking(data: RawSource): ByteString = createSignFunction().use {
27+
it.update(data)
28+
it.sign()
29+
}
1730
}
1831

1932
@SubclassOptInRequired(CryptographyProviderApi::class)
2033
public interface SignatureVerifier {
21-
public suspend fun verifySignature(data: ByteArray, signature: ByteArray): Boolean = verifySignatureBlocking(data, signature)
22-
public fun verifySignatureBlocking(data: ByteArray, signature: ByteArray): Boolean
34+
public fun createVerifyFunction(): VerifyFunction
2335

36+
public suspend fun verifySignature(data: ByteArray, signature: ByteArray): Boolean = verifySignatureBlocking(data, signature)
2437
public suspend fun verifySignature(data: ByteString, signature: ByteString): Boolean =
2538
verifySignature(data.asByteArray(), signature.asByteArray())
2639

40+
public suspend fun verifySignature(data: RawSource, signature: ByteString): Boolean = verifySignatureBlocking(data, signature)
41+
42+
public fun verifySignatureBlocking(data: ByteArray, signature: ByteArray): Boolean = createVerifyFunction().use {
43+
it.update(data)
44+
it.verify(signature)
45+
}
46+
2747
public fun verifySignatureBlocking(data: ByteString, signature: ByteString): Boolean =
2848
verifySignatureBlocking(data.asByteArray(), signature.asByteArray())
49+
50+
public fun verifySignatureBlocking(data: RawSource, signature: ByteString): Boolean = createVerifyFunction().use {
51+
it.update(data)
52+
it.verify(signature)
53+
}
2954
}

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

Lines changed: 58 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ package dev.whyoleg.cryptography.providers.apple.algorithms
66

77
import dev.whyoleg.cryptography.*
88
import dev.whyoleg.cryptography.algorithms.*
9-
9+
import dev.whyoleg.cryptography.functions.*
1010
import dev.whyoleg.cryptography.materials.key.*
1111
import dev.whyoleg.cryptography.operations.*
1212
import dev.whyoleg.cryptography.providers.apple.internal.*
@@ -83,21 +83,64 @@ private class HmacSignature(
8383
private val key: ByteArray,
8484
private val digestSize: Int,
8585
) : SignatureGenerator, SignatureVerifier {
86-
override fun generateSignatureBlocking(data: ByteArray): ByteArray {
87-
val macOutput = ByteArray(digestSize)
88-
@OptIn(UnsafeNumber::class)
89-
CCHmac(
90-
algorithm = hmacAlgorithm,
91-
key = key.refTo(0),
92-
keyLength = key.size.convert(),
93-
data = data.fixEmpty().refTo(0),
94-
dataLength = data.size.convert(),
95-
macOut = macOutput.refTo(0)
96-
)
97-
return macOutput
86+
private fun createFunction() = HmacFunction(
87+
hmacAlgorithm = hmacAlgorithm,
88+
key = key,
89+
digestSize = digestSize,
90+
context = Resource(nativeHeap.alloc<CCHmacContext>().ptr, nativeHeap::free)
91+
)
92+
93+
override fun createSignFunction(): SignFunction = createFunction()
94+
override fun createVerifyFunction(): VerifyFunction = createFunction()
95+
}
96+
97+
private class HmacFunction(
98+
private val hmacAlgorithm: CCHmacAlgorithm,
99+
private val key: ByteArray,
100+
private val digestSize: Int,
101+
private val context: Resource<CPointer<CCHmacContext>>,
102+
) : SignFunction, VerifyFunction, SafeCloseable(SafeCloseAction(context, AutoCloseable::close)) {
103+
init {
104+
reset()
105+
}
106+
107+
@OptIn(UnsafeNumber::class)
108+
override fun update(source: ByteArray, startIndex: Int, endIndex: Int) {
109+
checkBounds(source.size, startIndex, endIndex)
110+
111+
val context = context.access()
112+
source.usePinned {
113+
CCHmacUpdate(context, it.safeAddressOf(startIndex), (endIndex - startIndex).convert())
114+
}
115+
}
116+
117+
override fun signIntoByteArray(destination: ByteArray, destinationOffset: Int): Int {
118+
checkBounds(destination.size, destinationOffset, destinationOffset + digestSize)
119+
120+
val context = context.access()
121+
destination.usePinned {
122+
CCHmacFinal(context, it.safeAddressOf(destinationOffset))
123+
}
124+
reset()
125+
return digestSize
98126
}
99127

100-
override fun verifySignatureBlocking(data: ByteArray, signature: ByteArray): Boolean {
101-
return generateSignatureBlocking(data).contentEquals(signature)
128+
override fun signToByteArray(): ByteArray {
129+
val output = ByteArray(digestSize)
130+
signIntoByteArray(output)
131+
return output
132+
}
133+
134+
override fun verify(signature: ByteArray, startIndex: Int, endIndex: Int): Boolean {
135+
checkBounds(signature.size, startIndex, endIndex)
136+
return signToByteArray().contentEquals(signature.copyOfRange(startIndex, endIndex))
137+
}
138+
139+
@OptIn(UnsafeNumber::class)
140+
override fun reset() {
141+
val context = context.access()
142+
key.usePinned {
143+
CCHmacInit(context, hmacAlgorithm, it.safeAddressOf(0), key.size.convert())
144+
}
102145
}
103146
}

0 commit comments

Comments
 (0)