From 89c614d0a1030fdaed9801086bd20cfd619d5faf Mon Sep 17 00:00:00 2001 From: Him188 Date: Wed, 19 Feb 2020 14:44:03 +0800 Subject: [PATCH] Fix ECDH curve --- .../mamoe/mirai/utils/cryptor/ECDHAndroid.kt | 6 ++++- .../net/mamoe/mirai/utils/cryptor/ECDHJvm.kt | 24 +++++++++---------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/cryptor/ECDHAndroid.kt b/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/cryptor/ECDHAndroid.kt index 89f582f46..5fe233778 100644 --- a/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/cryptor/ECDHAndroid.kt +++ b/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/cryptor/ECDHAndroid.kt @@ -12,6 +12,7 @@ package net.mamoe.mirai.utils.cryptor import android.annotation.SuppressLint import net.mamoe.mirai.utils.md5 import java.security.* +import java.security.spec.ECGenParameterSpec import java.security.spec.X509EncodedKeySpec import javax.crypto.KeyAgreement @@ -60,11 +61,14 @@ actual class ECDH actual constructor(actual val keyPair: ECDHKeyPair) { _isECDHAvailable = false } + actual fun generateKeyPair(): ECDHKeyPair { if (!isECDHAvailable) { return ECDHKeyPair.DefaultStub } - return ECDHKeyPairImpl(KeyPairGenerator.getInstance("ECDH").genKeyPair()) + return ECDHKeyPairImpl(KeyPairGenerator.getInstance("ECDH") + .also { it.initialize(ECGenParameterSpec("secp192k1")) } + .genKeyPair()) } actual fun calculateShareKey( 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 c261cb80e..a0e236b71 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 @@ -12,6 +12,7 @@ package net.mamoe.mirai.utils.cryptor import net.mamoe.mirai.utils.md5 import org.bouncycastle.jce.provider.BouncyCastleProvider import java.security.* +import java.security.spec.ECGenParameterSpec import java.security.spec.X509EncodedKeySpec import javax.crypto.KeyAgreement @@ -34,24 +35,23 @@ actual fun ECDH() = ECDH(ECDH.generateKeyPair()) actual class ECDH actual constructor(actual val keyPair: ECDHKeyPair) { actual companion object { @Suppress("ObjectPropertyName") - private val _isECDHAvailable: Boolean - actual val isECDHAvailable: Boolean get() = _isECDHAvailable + private val _isECDHAvailable: Boolean = kotlin.runCatching { + if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) != null) { + Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME) + } + Security.addProvider(BouncyCastleProvider()) + generateKeyPair() // try if it is working + }.isSuccess - init { - _isECDHAvailable = kotlin.runCatching { - if (Security.getProvider("BouncyCastle") != null) { - Security.removeProvider("BouncyCastle") - } - Security.addProvider(BouncyCastleProvider()) - generateKeyPair() // try if it is working - }.isSuccess - } + actual val isECDHAvailable: Boolean get() = _isECDHAvailable actual fun generateKeyPair(): ECDHKeyPair { if (!isECDHAvailable) { return ECDHKeyPair.DefaultStub } - return ECDHKeyPairImpl(KeyPairGenerator.getInstance("ECDH").genKeyPair()) + return ECDHKeyPairImpl(KeyPairGenerator.getInstance("ECDH") + .also { it.initialize(ECGenParameterSpec("secp192k1")) } + .genKeyPair()) } actual fun calculateShareKey(