feat: enhance profile fetching and update mechanisms in ProtocolManager and MainScreen
This commit is contained in:
@@ -108,36 +108,47 @@ object CryptoManager {
|
||||
/**
|
||||
* Convert seed phrase to private key (32 bytes hex string)
|
||||
*
|
||||
* ⚠️ НОВЫЙ МЕТОД (crypto_new): Использует SHA256(seedPhrase) вместо BIP39
|
||||
* Совместимо с JavaScript реализацией crypto_new/crypto.ts:
|
||||
* Алгоритм (совместим с Desktop desktop-rosetta):
|
||||
* 1. BIP39 mnemonicToSeed(phrase, "") → 64 байта (PBKDF2-SHA512, 2048 итераций)
|
||||
* 2. Конвертация seed в hex-строку (128 символов)
|
||||
* 3. SHA256(hexSeed) → 32 байта privateKey
|
||||
*
|
||||
* Desktop эквивалент (SetPassword.tsx + crypto.ts):
|
||||
* ```js
|
||||
* const privateKey = sha256.create().update(seed).digest().toHex().toString();
|
||||
* let seed = await mnemonicToSeed(phrase); // BIP39 → 64 bytes
|
||||
* let hex = Buffer.from(seed).toString('hex'); // → 128-char hex string
|
||||
* let keypair = await generateKeyPairFromSeed(hex); // SHA256(hex) → privateKey
|
||||
* ```
|
||||
*/
|
||||
fun seedPhraseToPrivateKey(seedPhrase: List<String>): String {
|
||||
// Новый метод: SHA256(seedPhrase joined by space)
|
||||
val seedString = seedPhrase.joinToString(" ")
|
||||
val digest = MessageDigest.getInstance("SHA-256")
|
||||
val hash = digest.digest(seedString.toByteArray(Charsets.UTF_8))
|
||||
// Step 1: BIP39 mnemonicToSeed — PBKDF2-SHA512 with 2048 iterations
|
||||
// passphrase = "" (empty), salt = "mnemonic" + passphrase
|
||||
val bip39Seed = MnemonicCode.toSeed(seedPhrase, "")
|
||||
|
||||
// Step 2: Convert to hex string (128 chars for 64 bytes)
|
||||
val hexSeed = bip39Seed.joinToString("") { "%02x".format(it) }
|
||||
|
||||
// Step 3: SHA256(hexSeed) — matches Desktop's sha256.create().update(hex).digest()
|
||||
val digest = MessageDigest.getInstance("SHA-256")
|
||||
val hash = digest.digest(hexSeed.toByteArray(Charsets.UTF_8))
|
||||
|
||||
// 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 байта
|
||||
* Алгоритм (совместим с Desktop desktop-rosetta):
|
||||
* - privateKey = SHA256(hex(BIP39_seed(mnemonic))) - 32 байта
|
||||
* - publicKey = secp256k1.getPublicKey(privateKey, compressed=true) - 33 байта
|
||||
*
|
||||
* Совместимо с JavaScript реализацией crypto_new/crypto.ts:
|
||||
* Desktop эквивалент (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 {
|
||||
val cacheKey = seedPhrase.joinToString(" ")
|
||||
|
||||
Reference in New Issue
Block a user