feat: Update authorization logic for compatibility with crypto_new; enhance key generation and public key format
This commit is contained in:
@@ -67,18 +67,37 @@ object CryptoManager {
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert seed phrase to private key (64 bytes hex string)
|
||||
* Convert seed phrase to private key (32 bytes hex string)
|
||||
*
|
||||
* ⚠️ НОВЫЙ МЕТОД (crypto_new): Использует SHA256(seedPhrase) вместо BIP39
|
||||
* Совместимо с JavaScript реализацией crypto_new/crypto.ts:
|
||||
* ```js
|
||||
* const privateKey = sha256.create().update(seed).digest().toHex().toString();
|
||||
* ```
|
||||
*/
|
||||
fun seedPhraseToPrivateKey(seedPhrase: List<String>): String {
|
||||
val mnemonicCode = MnemonicCode.INSTANCE
|
||||
val seed = MnemonicCode.toSeed(seedPhrase, "")
|
||||
// Новый метод: SHA256(seedPhrase joined by space)
|
||||
val seedString = seedPhrase.joinToString(" ")
|
||||
val digest = MessageDigest.getInstance("SHA-256")
|
||||
val hash = digest.digest(seedString.toByteArray(Charsets.UTF_8))
|
||||
|
||||
// Convert to hex string (128 characters for 64 bytes)
|
||||
return seed.joinToString("") { "%02x".format(it) }
|
||||
// Convert to hex string (64 characters for 32 bytes)
|
||||
return hash.joinToString("") { "%02x".format(it) }
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate key pair from seed phrase using secp256k1 curve
|
||||
*
|
||||
* ⚠️ НОВЫЙ МЕТОД (crypto_new):
|
||||
* - privateKey = SHA256(seedPhrase) - 32 байта
|
||||
* - publicKey = secp256k1.getPublicKey(privateKey, compressed=true) - 33 байта
|
||||
*
|
||||
* Совместимо с JavaScript реализацией crypto_new/crypto.ts:
|
||||
* ```js
|
||||
* const privateKey = sha256.create().update(seed).digest().toHex().toString();
|
||||
* const publicKey = secp256k1.getPublicKey(Buffer.from(privateKey, "hex"), true);
|
||||
* ```
|
||||
*
|
||||
* 🚀 ОПТИМИЗАЦИЯ: Кэшируем результаты для избежания повторных вычислений
|
||||
*/
|
||||
fun generateKeyPairFromSeed(seedPhrase: List<String>): KeyPairData {
|
||||
@@ -87,23 +106,27 @@ object CryptoManager {
|
||||
// Проверяем кэш
|
||||
keyPairCache[cacheKey]?.let { return it }
|
||||
|
||||
// Генерируем приватный ключ через SHA256
|
||||
val privateKeyHex = seedPhraseToPrivateKey(seedPhrase)
|
||||
val ecSpec = ECNamedCurveTable.getParameterSpec("secp256k1")
|
||||
|
||||
// Use first 32 bytes of private key for secp256k1
|
||||
val privateKeyBytes = privateKeyHex.take(64).chunked(2)
|
||||
// Преобразуем hex в bytes (32 байта)
|
||||
val privateKeyBytes = privateKeyHex.chunked(2)
|
||||
.map { it.toInt(16).toByte() }
|
||||
.toByteArray()
|
||||
|
||||
val privateKeyBigInt = BigInteger(1, privateKeyBytes)
|
||||
|
||||
// Generate public key from private key
|
||||
// Генерируем публичный ключ из приватного
|
||||
val publicKeyPoint = ecSpec.g.multiply(privateKeyBigInt)
|
||||
val publicKeyHex = publicKeyPoint.getEncoded(false)
|
||||
|
||||
// ⚡ ВАЖНО: Используем СЖАТЫЙ формат (compressed=true) - 33 байта вместо 65
|
||||
// Это совместимо с crypto_new где используется: secp256k1.getPublicKey(..., true)
|
||||
val publicKeyHex = publicKeyPoint.getEncoded(true)
|
||||
.joinToString("") { "%02x".format(it) }
|
||||
|
||||
val keyPair = KeyPairData(
|
||||
privateKey = privateKeyHex.take(64),
|
||||
privateKey = privateKeyHex,
|
||||
publicKey = publicKeyHex
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user