void printPrivateKeys(CryptoNote::WalletGreen &wallet, bool viewWallet) { auto privateViewKey = wallet.getViewKey().secretKey; if (viewWallet) { std::cout << SuccessMsg("Private view key:") << std::endl << SuccessMsg(Common::podToHex(privateViewKey)) << std::endl; return; } auto privateSpendKey = wallet.getAddressSpendKey(0).secretKey; Crypto::SecretKey derivedPrivateViewKey; CryptoNote::AccountBase::generateViewFromSpend(privateSpendKey, derivedPrivateViewKey); const bool deterministicPrivateKeys = derivedPrivateViewKey == privateViewKey; std::cout << SuccessMsg("Private spend key:") << std::endl << SuccessMsg(Common::podToHex(privateSpendKey)) << std::endl << std::endl << SuccessMsg("Private view key:") << std::endl << SuccessMsg(Common::podToHex(privateViewKey)) << std::endl; if (deterministicPrivateKeys) { std::string mnemonicSeed; Crypto::ElectrumWords::bytes_to_words(privateSpendKey, mnemonicSeed, "English"); std::cout << std::endl << SuccessMsg("Mnemonic seed:") << std::endl << SuccessMsg(mnemonicSeed) << std::endl; } std::cout << std::endl << SuccessMsg("GUI Importable Private Key:") << std::endl << SuccessMsg(getGUIPrivateKey(wallet)) << std::endl; }
std::string getGUIPrivateKey(CryptoNote::WalletGreen &wallet) { auto viewKey = wallet.getViewKey(); auto spendKey = wallet.getAddressSpendKey(0); CryptoNote::AccountPublicAddress addr { spendKey.publicKey, viewKey.publicKey, }; CryptoNote::AccountKeys keys { addr, spendKey.secretKey, viewKey.secretKey, }; return Tools::Base58::encode_addr ( CryptoNote::parameters::CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX, std::string(reinterpret_cast<char*>(&keys), sizeof(keys)) ); }
std::shared_ptr<WalletInfo> openWallet(CryptoNote::WalletGreen &wallet, Config &config) { const std::string walletFileName = getExistingWalletFileName(config); bool initial = true; while (true) { std::string walletPass; /* Only use the command line pass once, otherwise we will infinite loop if it is incorrect */ if (initial && config.passGiven) { walletPass = config.walletPass; } else { walletPass = getWalletPassword(false, "Enter password: "******"Your view only wallet ") << InformationMsg(walletAddress) << InformationMsg(" has been successfully opened!") << std::endl << std::endl; viewWalletMsg(); viewWallet = true; } else { std::cout << std::endl << InformationMsg("Your wallet ") << InformationMsg(walletAddress) << InformationMsg(" has been successfully opened!") << std::endl << std::endl; } return std::make_shared<WalletInfo>( walletFileName, walletPass, walletAddress, viewWallet, wallet ); } catch (const std::system_error& e) { bool handled = false; switch (e.code().value()) { case CryptoNote::error::WRONG_PASSWORD: { std::cout << std::endl << WarningMsg("Incorrect password! Try again.") << std::endl << std::endl; handled = true; break; } case CryptoNote::error::WRONG_VERSION: { std::stringstream msg; msg << "Could not open wallet file! It doesn't appear " << "to be a valid wallet!" << std::endl << "Ensure you are opening a wallet file, and the " << "file has not gotten corrupted." << std::endl << "Try reimporting via keys, and always close " << WalletConfig::walletName << " with the exit " << "command to prevent corruption." << std::endl; std::cout << WarningMsg(msg.str()) << std::endl; return nullptr; } } if (handled) { continue; } const std::string alreadyOpenMsg = "MemoryMappedFile::open: The process cannot access the file " "because it is being used by another process."; const std::string errorMsg = e.what(); /* The message actually has a \r\n on the end but i'd prefer to keep just the raw string in the source so check the it starts with instead */ if (boost::starts_with(errorMsg, alreadyOpenMsg)) { std::cout << WarningMsg("Could not open wallet! It is already " "open in another process.") << std::endl << WarningMsg("Check with a task manager that you " "don't have ") << WalletConfig::walletName << WarningMsg(" open twice.") << std::endl << WarningMsg("Also check you don't have another " "wallet program open, such as a GUI " "wallet or ") << WarningMsg(WalletConfig::walletdName) << WarningMsg(".") << std::endl << std::endl; return nullptr; } else { std::cout << "Unexpected error: " << errorMsg << std::endl; std::cout << "Please report this error message and what " << "you did to cause it." << std::endl << std::endl; return nullptr; } } } }