From 75c4520008800f2f4cd92cb67777278b648b3e61 Mon Sep 17 00:00:00 2001 From: Matthew Fosse Date: Thu, 11 Apr 2024 18:37:28 -0700 Subject: [PATCH] pub key extraction working --- cw_bitcoin/lib/electrum_wallet.dart | 67 +++++-------------- cw_nano/lib/nano_wallet.dart | 17 +---- .../dashboard/dashboard_view_model.dart | 3 - 3 files changed, 20 insertions(+), 67 deletions(-) diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart index b1b6a86e6..8ea0d9110 100644 --- a/cw_bitcoin/lib/electrum_wallet.dart +++ b/cw_bitcoin/lib/electrum_wallet.dart @@ -1243,30 +1243,6 @@ abstract class ElectrumWalletBase return priv.signMessage(utf8.encode(message), messagePrefix: messagePrefix); } - // Uint8List? recoverPublicKey(String signature, String messageHash) { - // try { - // // Convert the signature from hex to bytes - // final signatureBytes = HEX.decode(signature); - - // // Convert the message hash from hex to bytes - // final messageHashBytes = HEX.decode(messageHash); - - // // Create a BitcoinSignature object from the signature bytes - // final bitcoinSignature = BitcoinSignatures.fromCompact(signatureBytes); - - // // Recover the public key using the signature and message hash - // final recoveredPublicKey = bitcoinSignature.recoverPublicKey(messageHashBytes); - - // // Convert the recovered public key to compressed format - // final compressedPublicKey = recoveredPublicKey.compressed; - - // return compressedPublicKey; - // } catch (e) { - // // Return null if an error occurs during the recovery process - // return null; - // } - // } - @override Future verifyMessage(String message, String signature, {String? address = null}) async { if (address == null) { @@ -1281,42 +1257,35 @@ abstract class ElectrumWalletBase // scriptBytes == hash160 (public key) String messagePrefix = '\x18Bitcoin Signed Message:\n'; - // ECDSASignature signature = ECDSASignature.fromBytes(ascii.encode(signature), generator) // final btcSigner = BitcoinVerifier.fromKeyBytes([]); // btcSigner.verifyKey.verify(signature, digest) - print("@@@@@@@@@111111111111"); - - // final messageHash = QuickCrypto.sha256Hash( - // BitcoinSignerUtils.magicMessage(utf8.encode(message), messagePrefix)); - - final messageHash = BitcoinSignerUtils.magicMessage(utf8.encode(message), messagePrefix); - - // final generator = ProjectiveECCPoint.infinity(Curves.curveSecp256k1); + final messageHash = QuickCrypto.sha256Hash( + BitcoinSignerUtils.magicMessage(utf8.encode(message), messagePrefix)); final generator = Curves.generatorSecp256k1; - - print("@@@@@@@@@@@@@@@@@@@@@"); - + final sigDecodedBytes = hex.decode(signature); print(signature); - - final sig = ECDSASignature.fromBytes(utf8.encode(signature), generator); - + final sig = ECDSASignature.fromBytes(sigDecodedBytes, generator); print("######################"); - - final sigBytes = utf8.encode(signature); - - print(sigBytes[0]); - - final pubKey = sig.recoverPublicKey(messageHash, generator, sigBytes[0]); - + // final sigBytes = utf8.encode(signature); + // print(sigBytes[0]); + final pubKey = sig.recoverPublicKey(messageHash, generator, sigDecodedBytes[0]); final recoveredPub = ECPublic.fromBytes(pubKey!.toBytes()); + print("recovered!: ${HEX.encode(pubKey.toBytes())} actual: ${hd.pubKey}"); + // final recoveredAddress = recoveredPub.toP2wpkhAddress().toAddress(network); + // final recoveredAddress = recoveredPub.toP2wshAddress().toAddress(network); + // final recoveredAddress = recoveredPub.toP2wpkhInP2sh().toAddress(network); - final recoveredAddress = recoveredPub.toP2pkhInP2sh(); + final recoveredAddress = recoveredPub.toP2wpkhAddress().toAddress(network); + print("ACTUAL: $address"); + print(recoveredPub.toHash160()); + print(recoveredPub.toP2wshInP2sh().toAddress(network)); + print(recoveredPub.toP2wpkhAddress().toAddress(network)); - print("$address $recoveredAddress"); + // print("$address $recoveredAddress"); - if (recoveredAddress.toAddress(network) == address) { + if (recoveredAddress == address) { return true; } diff --git a/cw_nano/lib/nano_wallet.dart b/cw_nano/lib/nano_wallet.dart index e05ea62c0..d9ecca5bb 100644 --- a/cw_nano/lib/nano_wallet.dart +++ b/cw_nano/lib/nano_wallet.dart @@ -505,9 +505,7 @@ abstract class NanoWalletBase // nd.NanoHelpers.hexToBytes(privateKey!), // ), // ); - // return nd.NanoSignatures.signBlock(hash(message), privateKey!); - return nd.NanoSignatures.signBlock( - "AEC75F807DCE45AFA787DE7B395BE498A885525569DD614162E0C80FD4F27EE9", privateKey!); + return nd.NanoSignatures.signBlock(hash(message), privateKey!); } @override @@ -516,17 +514,6 @@ abstract class NanoWalletBase return false; } String publicKey = NanoDerivations.addressToPublicKey(address); - // return NanoSignatures.verify(message, signature, publicKey); - - print(publicKey); - print("adasdasdadaadadada"); - - var msg = "AEC75F807DCE45AFA787DE7B395BE498A885525569DD614162E0C80FD4F27EE9"; - return nd.Signature.detachedVerify( - // nd.NanoHelpers.hexToBytes(hash(message)), - nd.NanoHelpers.hexToBytes(msg), - nd.NanoHelpers.hexToBytes(signature), - nd.NanoHelpers.hexToBytes(publicKey), - ); + return NanoSignatures.verify(message, signature, publicKey); } } diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index a9b49551e..60ee1054e 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -373,13 +373,10 @@ abstract class DashboardViewModelBase with Store { @computed bool get hasSignMessages => [ WalletType.monero, - WalletType.haven, WalletType.litecoin, WalletType.bitcoin, WalletType.bitcoinCash, WalletType.ethereum, - WalletType.nano, - WalletType.banano, ].contains(wallet.type); Future reconnect() async {