Skip to content

Commit fa49703

Browse files
committed
Make signature verification fail on wrong signature
1 parent 15fa767 commit fa49703

File tree

24 files changed

+200
-81
lines changed

24 files changed

+200
-81
lines changed

cryptography-core/api/cryptography-core.api

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -672,10 +672,14 @@ public abstract interface class dev/whyoleg/cryptography/functions/UpdateFunctio
672672
}
673673

674674
public abstract interface class dev/whyoleg/cryptography/functions/VerifyFunction : dev/whyoleg/cryptography/functions/UpdateFunction {
675-
public fun verify (Lkotlinx/io/bytestring/ByteString;II)Z
676-
public abstract fun verify ([BII)Z
677-
public static synthetic fun verify$default (Ldev/whyoleg/cryptography/functions/VerifyFunction;Lkotlinx/io/bytestring/ByteString;IIILjava/lang/Object;)Z
678-
public static synthetic fun verify$default (Ldev/whyoleg/cryptography/functions/VerifyFunction;[BIIILjava/lang/Object;)Z
675+
public fun tryVerify (Lkotlinx/io/bytestring/ByteString;II)Z
676+
public abstract fun tryVerify ([BII)Z
677+
public static synthetic fun tryVerify$default (Ldev/whyoleg/cryptography/functions/VerifyFunction;Lkotlinx/io/bytestring/ByteString;IIILjava/lang/Object;)Z
678+
public static synthetic fun tryVerify$default (Ldev/whyoleg/cryptography/functions/VerifyFunction;[BIIILjava/lang/Object;)Z
679+
public fun verify (Lkotlinx/io/bytestring/ByteString;II)V
680+
public abstract fun verify ([BII)V
681+
public static synthetic fun verify$default (Ldev/whyoleg/cryptography/functions/VerifyFunction;Lkotlinx/io/bytestring/ByteString;IIILjava/lang/Object;)V
682+
public static synthetic fun verify$default (Ldev/whyoleg/cryptography/functions/VerifyFunction;[BIIILjava/lang/Object;)V
679683
}
680684

681685
public abstract interface class dev/whyoleg/cryptography/materials/key/EncodableKey : dev/whyoleg/cryptography/materials/key/Key {
@@ -816,14 +820,23 @@ public abstract interface class dev/whyoleg/cryptography/operations/SignatureGen
816820

817821
public abstract interface class dev/whyoleg/cryptography/operations/SignatureVerifier {
818822
public abstract fun createVerifyFunction ()Ldev/whyoleg/cryptography/functions/VerifyFunction;
823+
public fun tryVerifySignature (Lkotlinx/io/RawSource;Lkotlinx/io/bytestring/ByteString;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
824+
public fun tryVerifySignature (Lkotlinx/io/bytestring/ByteString;Lkotlinx/io/bytestring/ByteString;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
825+
public fun tryVerifySignature ([B[BLkotlin/coroutines/Continuation;)Ljava/lang/Object;
826+
public static synthetic fun tryVerifySignature$suspendImpl (Ldev/whyoleg/cryptography/operations/SignatureVerifier;Lkotlinx/io/RawSource;Lkotlinx/io/bytestring/ByteString;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
827+
public static synthetic fun tryVerifySignature$suspendImpl (Ldev/whyoleg/cryptography/operations/SignatureVerifier;Lkotlinx/io/bytestring/ByteString;Lkotlinx/io/bytestring/ByteString;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
828+
public static synthetic fun tryVerifySignature$suspendImpl (Ldev/whyoleg/cryptography/operations/SignatureVerifier;[B[BLkotlin/coroutines/Continuation;)Ljava/lang/Object;
829+
public fun tryVerifySignatureBlocking (Lkotlinx/io/RawSource;Lkotlinx/io/bytestring/ByteString;)Z
830+
public fun tryVerifySignatureBlocking (Lkotlinx/io/bytestring/ByteString;Lkotlinx/io/bytestring/ByteString;)Z
831+
public fun tryVerifySignatureBlocking ([B[B)Z
819832
public fun verifySignature (Lkotlinx/io/RawSource;Lkotlinx/io/bytestring/ByteString;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
820833
public fun verifySignature (Lkotlinx/io/bytestring/ByteString;Lkotlinx/io/bytestring/ByteString;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
821834
public fun verifySignature ([B[BLkotlin/coroutines/Continuation;)Ljava/lang/Object;
822835
public static synthetic fun verifySignature$suspendImpl (Ldev/whyoleg/cryptography/operations/SignatureVerifier;Lkotlinx/io/RawSource;Lkotlinx/io/bytestring/ByteString;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
823836
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;
824837
public static synthetic fun verifySignature$suspendImpl (Ldev/whyoleg/cryptography/operations/SignatureVerifier;[B[BLkotlin/coroutines/Continuation;)Ljava/lang/Object;
825-
public fun verifySignatureBlocking (Lkotlinx/io/RawSource;Lkotlinx/io/bytestring/ByteString;)Z
826-
public fun verifySignatureBlocking (Lkotlinx/io/bytestring/ByteString;Lkotlinx/io/bytestring/ByteString;)Z
827-
public fun verifySignatureBlocking ([B[B)Z
838+
public fun verifySignatureBlocking (Lkotlinx/io/RawSource;Lkotlinx/io/bytestring/ByteString;)V
839+
public fun verifySignatureBlocking (Lkotlinx/io/bytestring/ByteString;Lkotlinx/io/bytestring/ByteString;)V
840+
public fun verifySignatureBlocking ([B[B)V
828841
}
829842

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

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -553,8 +553,10 @@ abstract interface dev.whyoleg.cryptography.functions/UpdateFunction : kotlin/Au
553553
}
554554

555555
abstract interface dev.whyoleg.cryptography.functions/VerifyFunction : dev.whyoleg.cryptography.functions/UpdateFunction { // dev.whyoleg.cryptography.functions/VerifyFunction|null[0]
556-
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]
557-
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]
556+
abstract fun tryVerify(kotlin/ByteArray, kotlin/Int = ..., kotlin/Int = ...): kotlin/Boolean // dev.whyoleg.cryptography.functions/VerifyFunction.tryVerify|tryVerify(kotlin.ByteArray;kotlin.Int;kotlin.Int){}[0]
557+
abstract fun verify(kotlin/ByteArray, kotlin/Int = ..., kotlin/Int = ...) // dev.whyoleg.cryptography.functions/VerifyFunction.verify|verify(kotlin.ByteArray;kotlin.Int;kotlin.Int){}[0]
558+
open fun tryVerify(kotlinx.io.bytestring/ByteString, kotlin/Int = ..., kotlin/Int = ...): kotlin/Boolean // dev.whyoleg.cryptography.functions/VerifyFunction.tryVerify|tryVerify(kotlinx.io.bytestring.ByteString;kotlin.Int;kotlin.Int){}[0]
559+
open fun verify(kotlinx.io.bytestring/ByteString, kotlin/Int = ..., kotlin/Int = ...) // dev.whyoleg.cryptography.functions/VerifyFunction.verify|verify(kotlinx.io.bytestring.ByteString;kotlin.Int;kotlin.Int){}[0]
558560
}
559561

560562
abstract interface dev.whyoleg.cryptography.materials.key/Key // dev.whyoleg.cryptography.materials.key/Key|null[0]
@@ -635,12 +637,18 @@ abstract interface dev.whyoleg.cryptography.operations/SignatureGenerator { // d
635637

636638
abstract interface dev.whyoleg.cryptography.operations/SignatureVerifier { // dev.whyoleg.cryptography.operations/SignatureVerifier|null[0]
637639
abstract fun createVerifyFunction(): dev.whyoleg.cryptography.functions/VerifyFunction // dev.whyoleg.cryptography.operations/SignatureVerifier.createVerifyFunction|createVerifyFunction(){}[0]
638-
open fun verifySignatureBlocking(kotlin/ByteArray, kotlin/ByteArray): kotlin/Boolean // dev.whyoleg.cryptography.operations/SignatureVerifier.verifySignatureBlocking|verifySignatureBlocking(kotlin.ByteArray;kotlin.ByteArray){}[0]
639-
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]
640-
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]
641-
open suspend fun verifySignature(kotlin/ByteArray, kotlin/ByteArray): kotlin/Boolean // dev.whyoleg.cryptography.operations/SignatureVerifier.verifySignature|verifySignature(kotlin.ByteArray;kotlin.ByteArray){}[0]
642-
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]
643-
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]
640+
open fun tryVerifySignatureBlocking(kotlin/ByteArray, kotlin/ByteArray): kotlin/Boolean // dev.whyoleg.cryptography.operations/SignatureVerifier.tryVerifySignatureBlocking|tryVerifySignatureBlocking(kotlin.ByteArray;kotlin.ByteArray){}[0]
641+
open fun tryVerifySignatureBlocking(kotlinx.io.bytestring/ByteString, kotlinx.io.bytestring/ByteString): kotlin/Boolean // dev.whyoleg.cryptography.operations/SignatureVerifier.tryVerifySignatureBlocking|tryVerifySignatureBlocking(kotlinx.io.bytestring.ByteString;kotlinx.io.bytestring.ByteString){}[0]
642+
open fun tryVerifySignatureBlocking(kotlinx.io/RawSource, kotlinx.io.bytestring/ByteString): kotlin/Boolean // dev.whyoleg.cryptography.operations/SignatureVerifier.tryVerifySignatureBlocking|tryVerifySignatureBlocking(kotlinx.io.RawSource;kotlinx.io.bytestring.ByteString){}[0]
643+
open fun verifySignatureBlocking(kotlin/ByteArray, kotlin/ByteArray) // dev.whyoleg.cryptography.operations/SignatureVerifier.verifySignatureBlocking|verifySignatureBlocking(kotlin.ByteArray;kotlin.ByteArray){}[0]
644+
open fun verifySignatureBlocking(kotlinx.io.bytestring/ByteString, kotlinx.io.bytestring/ByteString) // dev.whyoleg.cryptography.operations/SignatureVerifier.verifySignatureBlocking|verifySignatureBlocking(kotlinx.io.bytestring.ByteString;kotlinx.io.bytestring.ByteString){}[0]
645+
open fun verifySignatureBlocking(kotlinx.io/RawSource, kotlinx.io.bytestring/ByteString) // dev.whyoleg.cryptography.operations/SignatureVerifier.verifySignatureBlocking|verifySignatureBlocking(kotlinx.io.RawSource;kotlinx.io.bytestring.ByteString){}[0]
646+
open suspend fun tryVerifySignature(kotlin/ByteArray, kotlin/ByteArray): kotlin/Boolean // dev.whyoleg.cryptography.operations/SignatureVerifier.tryVerifySignature|tryVerifySignature(kotlin.ByteArray;kotlin.ByteArray){}[0]
647+
open suspend fun tryVerifySignature(kotlinx.io.bytestring/ByteString, kotlinx.io.bytestring/ByteString): kotlin/Boolean // dev.whyoleg.cryptography.operations/SignatureVerifier.tryVerifySignature|tryVerifySignature(kotlinx.io.bytestring.ByteString;kotlinx.io.bytestring.ByteString){}[0]
648+
open suspend fun tryVerifySignature(kotlinx.io/RawSource, kotlinx.io.bytestring/ByteString): kotlin/Boolean // dev.whyoleg.cryptography.operations/SignatureVerifier.tryVerifySignature|tryVerifySignature(kotlinx.io.RawSource;kotlinx.io.bytestring.ByteString){}[0]
649+
open suspend fun verifySignature(kotlin/ByteArray, kotlin/ByteArray) // dev.whyoleg.cryptography.operations/SignatureVerifier.verifySignature|verifySignature(kotlin.ByteArray;kotlin.ByteArray){}[0]
650+
open suspend fun verifySignature(kotlinx.io.bytestring/ByteString, kotlinx.io.bytestring/ByteString) // dev.whyoleg.cryptography.operations/SignatureVerifier.verifySignature|verifySignature(kotlinx.io.bytestring.ByteString;kotlinx.io.bytestring.ByteString){}[0]
651+
open suspend fun verifySignature(kotlinx.io/RawSource, kotlinx.io.bytestring/ByteString) // dev.whyoleg.cryptography.operations/SignatureVerifier.verifySignature|verifySignature(kotlinx.io.RawSource;kotlinx.io.bytestring.ByteString){}[0]
644652
}
645653

646654
abstract interface dev.whyoleg.cryptography/CryptographyAlgorithm { // dev.whyoleg.cryptography/CryptographyAlgorithm|null[0]

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,13 @@ import dev.whyoleg.cryptography.*
88
import kotlinx.io.bytestring.*
99

1010
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 {
11+
public fun tryVerify(signature: ByteArray, startIndex: Int = 0, endIndex: Int = signature.size): Boolean
12+
public fun tryVerify(signature: ByteString, startIndex: Int = 0, endIndex: Int = signature.size): Boolean {
13+
return tryVerify(signature.asByteArray(), startIndex, endIndex)
14+
}
15+
16+
public fun verify(signature: ByteArray, startIndex: Int = 0, endIndex: Int = signature.size)
17+
public fun verify(signature: ByteString, startIndex: Int = 0, endIndex: Int = signature.size) {
1318
return verify(signature.asByteArray(), startIndex, endIndex)
1419
}
1520
}

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,26 @@ import kotlinx.io.bytestring.*
1313
public interface Hasher {
1414
public fun createHashFunction(): HashFunction
1515

16-
public suspend fun hash(data: ByteArray): ByteArray = hashBlocking(data)
16+
public suspend fun hash(data: ByteArray): ByteArray {
17+
return hashBlocking(data)
18+
}
1719

18-
public suspend fun hash(data: ByteString): ByteString = hash(data.asByteArray()).asByteString()
20+
public suspend fun hash(data: ByteString): ByteString {
21+
return hash(data.asByteArray()).asByteString()
22+
}
1923

20-
public suspend fun hash(data: RawSource): ByteString = hashBlocking(data)
24+
public suspend fun hash(data: RawSource): ByteString {
25+
return hashBlocking(data)
26+
}
2127

2228
public fun hashBlocking(data: ByteArray): ByteArray = createHashFunction().use {
2329
it.update(data)
2430
it.hashToByteArray()
2531
}
2632

27-
public fun hashBlocking(data: ByteString): ByteString = hashBlocking(data.asByteArray()).asByteString()
33+
public fun hashBlocking(data: ByteString): ByteString {
34+
return hashBlocking(data.asByteArray()).asByteString()
35+
}
2836

2937
public fun hashBlocking(data: RawSource): ByteString = createHashFunction().use {
3038
it.update(data)

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

Lines changed: 56 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,27 @@ import kotlinx.io.bytestring.*
1313
public interface SignatureGenerator {
1414
public fun createSignFunction(): SignFunction
1515

16-
public suspend fun generateSignature(data: ByteArray): ByteArray = generateSignatureBlocking(data)
17-
public suspend fun generateSignature(data: ByteString): ByteString = generateSignature(data.asByteArray()).asByteString()
18-
public suspend fun generateSignature(data: RawSource): ByteString = generateSignatureBlocking(data)
16+
public suspend fun generateSignature(data: ByteArray): ByteArray {
17+
return generateSignatureBlocking(data)
18+
}
19+
20+
public suspend fun generateSignature(data: ByteString): ByteString {
21+
return generateSignature(data.asByteArray()).asByteString()
22+
}
23+
24+
public suspend fun generateSignature(data: RawSource): ByteString {
25+
return generateSignatureBlocking(data)
26+
}
1927

2028
public fun generateSignatureBlocking(data: ByteArray): ByteArray = createSignFunction().use {
2129
it.update(data)
2230
it.signToByteArray()
2331
}
2432

25-
public fun generateSignatureBlocking(data: ByteString): ByteString = generateSignatureBlocking(data.asByteArray()).asByteString()
33+
public fun generateSignatureBlocking(data: ByteString): ByteString {
34+
return generateSignatureBlocking(data.asByteArray()).asByteString()
35+
}
36+
2637
public fun generateSignatureBlocking(data: RawSource): ByteString = createSignFunction().use {
2738
it.update(data)
2839
it.sign()
@@ -33,21 +44,54 @@ public interface SignatureGenerator {
3344
public interface SignatureVerifier {
3445
public fun createVerifyFunction(): VerifyFunction
3546

36-
public suspend fun verifySignature(data: ByteArray, signature: ByteArray): Boolean = verifySignatureBlocking(data, signature)
37-
public suspend fun verifySignature(data: ByteString, signature: ByteString): Boolean =
38-
verifySignature(data.asByteArray(), signature.asByteArray())
47+
public suspend fun tryVerifySignature(data: ByteArray, signature: ByteArray): Boolean {
48+
return tryVerifySignatureBlocking(data, signature)
49+
}
50+
51+
public suspend fun tryVerifySignature(data: ByteString, signature: ByteString): Boolean {
52+
return tryVerifySignature(data.asByteArray(), signature.asByteArray())
53+
}
54+
55+
public suspend fun tryVerifySignature(data: RawSource, signature: ByteString): Boolean {
56+
return tryVerifySignatureBlocking(data, signature)
57+
}
58+
59+
public fun tryVerifySignatureBlocking(data: ByteArray, signature: ByteArray): Boolean = createVerifyFunction().use {
60+
it.update(data)
61+
it.tryVerify(signature)
62+
}
3963

40-
public suspend fun verifySignature(data: RawSource, signature: ByteString): Boolean = verifySignatureBlocking(data, signature)
64+
public fun tryVerifySignatureBlocking(data: ByteString, signature: ByteString): Boolean {
65+
return tryVerifySignatureBlocking(data.asByteArray(), signature.asByteArray())
66+
}
4167

42-
public fun verifySignatureBlocking(data: ByteArray, signature: ByteArray): Boolean = createVerifyFunction().use {
68+
public fun tryVerifySignatureBlocking(data: RawSource, signature: ByteString): Boolean = createVerifyFunction().use {
69+
it.update(data)
70+
it.tryVerify(signature)
71+
}
72+
73+
public suspend fun verifySignature(data: ByteArray, signature: ByteArray) {
74+
return verifySignatureBlocking(data, signature)
75+
}
76+
77+
public suspend fun verifySignature(data: ByteString, signature: ByteString) {
78+
return verifySignature(data.asByteArray(), signature.asByteArray())
79+
}
80+
81+
public suspend fun verifySignature(data: RawSource, signature: ByteString) {
82+
return verifySignatureBlocking(data, signature)
83+
}
84+
85+
public fun verifySignatureBlocking(data: ByteArray, signature: ByteArray): Unit = createVerifyFunction().use {
4386
it.update(data)
4487
it.verify(signature)
4588
}
4689

47-
public fun verifySignatureBlocking(data: ByteString, signature: ByteString): Boolean =
48-
verifySignatureBlocking(data.asByteArray(), signature.asByteArray())
90+
public fun verifySignatureBlocking(data: ByteString, signature: ByteString) {
91+
return verifySignatureBlocking(data.asByteArray(), signature.asByteArray())
92+
}
4993

50-
public fun verifySignatureBlocking(data: RawSource, signature: ByteString): Boolean = createVerifyFunction().use {
94+
public fun verifySignatureBlocking(data: RawSource, signature: ByteString): Unit = createVerifyFunction().use {
5195
it.update(data)
5296
it.verify(signature)
5397
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ abstract class EcdsaCompatibilityTest(
6666
val signature = signer.generateSignature(data)
6767
logger.log { "signature.size = ${signature.size}" }
6868

69-
assertTrue(verifier.verifySignature(data, signature), "Initial Verify")
69+
assertTrue(verifier.tryVerifySignature(data, signature), "Initial Verify")
7070

7171
api.signatures.saveData(signatureParametersId, SignatureData(keyReference, data, signature))
7272
}
@@ -87,10 +87,10 @@ abstract class EcdsaCompatibilityTest(
8787
val generators = privateKeys.map { it.signatureGenerator(signatureParameters.digest, signatureParameters.signatureFormat) }
8888

8989
verifiers.forEach { verifier ->
90-
assertTrue(verifier.verifySignature(data, signature), "Verify")
90+
assertTrue(verifier.tryVerifySignature(data, signature), "Verify")
9191

9292
generators.forEach { generator ->
93-
assertTrue(verifier.verifySignature(data, generator.generateSignature(data)), "Sign-Verify")
93+
assertTrue(verifier.tryVerifySignature(data, generator.generateSignature(data)), "Sign-Verify")
9494
}
9595
}
9696
}

0 commit comments

Comments
 (0)