From b7e4dc0772b8a1b71f21babd8595ccb4ede5a706 Mon Sep 17 00:00:00 2001 From: Him188 Date: Sat, 15 Feb 2020 23:24:43 +0800 Subject: [PATCH] Add default values --- .../net/mamoe/mirai/utils/cryptor/ECDHJvm.kt | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/cryptor/ECDHJvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/cryptor/ECDHJvm.kt index 81846b342..1fd3da5a3 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/cryptor/ECDHJvm.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/cryptor/ECDHJvm.kt @@ -9,6 +9,7 @@ package net.mamoe.mirai.utils.cryptor +import net.mamoe.mirai.utils.io.chunkedHexToBytes import net.mamoe.mirai.utils.md5 import org.bouncycastle.jce.provider.BouncyCastleProvider import java.security.* @@ -21,12 +22,19 @@ actual typealias ECDHPrivateKey = PrivateKey actual typealias ECDHPublicKey = PublicKey actual class ECDHKeyPair( - private val delegate: KeyPair + private val delegate: KeyPair? ) { - actual val privateKey: ECDHPrivateKey get() = delegate.private - actual val publicKey: ECDHPublicKey get() = delegate.public + actual val privateKey: ECDHPrivateKey get() = delegate?.private ?: error("ECDH is not available") + actual val publicKey: ECDHPublicKey get() = delegate?.public ?: defaultPublicKey - actual val initialShareKey: ByteArray = ECDH.calculateShareKey(privateKey, initialPublicKey) + actual val initialShareKey: ByteArray = if (delegate == null) { + defaultShareKey + } else ECDH.calculateShareKey(privateKey, initialPublicKey) + + companion object { + internal val defaultPublicKey = "020b03cf3d99541f29ffec281bebbd4ea211292ac1f53d7128".chunkedHexToBytes().adjustToPublicKey() + internal val defaultShareKey = "4da0f614fc9f29c2054c77048a6566d7".chunkedHexToBytes() + } } @Suppress("FunctionName") @@ -34,22 +42,33 @@ actual fun ECDH() = ECDH(ECDH.generateKeyPair()) actual class ECDH actual constructor(actual val keyPair: ECDHKeyPair) { actual companion object { + private var isECDHAvailable = false init { - Security.addProvider(BouncyCastleProvider()) + if (kotlin.runCatching { + Security.addProvider(BouncyCastleProvider()) + }.exceptionOrNull() == null) { + isECDHAvailable = true + } } actual fun generateKeyPair(): ECDHKeyPair { - return ECDHKeyPair(KeyPairGenerator.getInstance("EC", "BC").apply { initialize(ECGenParameterSpec("secp192k1")) }.genKeyPair()) + return if (!isECDHAvailable) { + ECDHKeyPair(null) + } else ECDHKeyPair(KeyPairGenerator.getInstance("EC", "BC").apply { initialize(ECGenParameterSpec("secp192k1")) }.genKeyPair()) } actual fun calculateShareKey( privateKey: ECDHPrivateKey, publicKey: ECDHPublicKey ): ByteArray { - val instance = KeyAgreement.getInstance("ECDH", "BC") - instance.init(privateKey) - instance.doPhase(publicKey, true) - return md5(instance.generateSecret()) + return if (!isECDHAvailable) { + ECDHKeyPair.defaultShareKey + } else { + val instance = KeyAgreement.getInstance("ECDH", "BC") + instance.init(privateKey) + instance.doPhase(publicKey, true) + md5(instance.generateSecret()) + } } actual fun constructPublicKey(key: ByteArray): ECDHPublicKey {