-
Notifications
You must be signed in to change notification settings - Fork 6
/
Crypto.kt
66 lines (57 loc) · 2.24 KB
/
Crypto.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package io.numbersprotocol.starlingcapture.util
import android.security.keystore.KeyProperties
import java.io.File
import java.security.*
import java.security.spec.ECGenParameterSpec
import java.security.spec.PKCS8EncodedKeySpec
import java.security.spec.X509EncodedKeySpec
private const val SHA_256 = "SHA-256"
fun File.sha256(): String {
val digest = MessageDigest.getInstance(SHA_256)
DigestInputStream(this.inputStream(), digest).use { digestInputStream ->
val buffer = ByteArray(8192)
// Read all bytes:
@Suppress("ControlFlowWithEmptyBody")
while (digestInputStream.read(buffer, 0, buffer.size) != -1) {
}
}
return digest.digest().asHex()
}
fun String.sha256() = toByteArray(Charsets.UTF_8).sha256()
fun ByteArray.sha256(): String {
val messageDigest = MessageDigest.getInstance(SHA_256)
val digested = messageDigest.digest(this)
return digested.asHex()
}
const val androidOpenSslSignatureProvider = "AndroidOpenSSL"
fun createEcKeyPair(): KeyPair {
val keyPairGenerator = KeyPairGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_EC,
androidOpenSslSignatureProvider
)
keyPairGenerator.initialize(ECGenParameterSpec("secp256r1"))
return keyPairGenerator.generateKeyPair()
}
fun String.signWithSha256AndEcdsa(privateKey: String): String {
val keyFactory =
KeyFactory.getInstance(KeyProperties.KEY_ALGORITHM_EC, androidOpenSslSignatureProvider)
val key = keyFactory.generatePrivate(PKCS8EncodedKeySpec(privateKey.hexAsByteArray()))
val signer = Signature.getInstance("SHA256withECDSA")
.apply {
initSign(key)
update(toByteArray(Charsets.UTF_8))
}
return signer.sign().asHex()
}
@Suppress("unused")
fun String.verifyWithSha256AndEcdsa(signature: String, publicKey: String): Boolean {
val keyFactory =
KeyFactory.getInstance(KeyProperties.KEY_ALGORITHM_EC, androidOpenSslSignatureProvider)
val key = keyFactory.generatePublic(X509EncodedKeySpec(publicKey.hexAsByteArray()))
val signer = Signature.getInstance("SHA256withECDSA")
.apply {
initVerify(key)
update(toByteArray(Charsets.UTF_8))
}
return signer.verify(signature.toByteArray(Charsets.UTF_8))
}