void WalletSerializer::loadWalletV1(Common::IInputStream& source, const std::string& password) { CryptoNote::CryptoContext cryptoContext; CryptoNote::BinaryInputStreamSerializer encrypted(source); encrypted(cryptoContext.iv, "iv"); generateKey(password, cryptoContext.key); std::string cipher; encrypted(cipher, "data"); std::string plain = decrypt(cipher, cryptoContext); MemoryInputStream decryptedStream(plain.data(), plain.size()); CryptoNote::BinaryInputStreamSerializer serializer(decryptedStream); loadWalletV1Keys(serializer); checkKeys(); subscribeWallets(); bool detailsSaved; serializer(detailsSaved, "has_details"); if (detailsSaved) { loadWalletV1Details(serializer); } }
void WalletLegacySerializer::deserialize(std::istream& stream, const std::string& password, std::string& cache) { StdInputStream stdStream(stream); CryptoNote::BinaryInputStreamSerializer serializerEncrypted(stdStream); serializerEncrypted.beginObject("wallet"); uint32_t version; serializerEncrypted(version, "version"); Crypto::chacha_iv iv; serializerEncrypted(iv, "iv"); std::string cipher; serializerEncrypted(cipher, "data"); serializerEncrypted.endObject(); std::string plain; decrypt(cipher, plain, iv, password); MemoryInputStream decryptedStream(plain.data(), plain.size()); CryptoNote::BinaryInputStreamSerializer serializer(decryptedStream); loadKeys(serializer); throwIfKeysMissmatch(account.getAccountKeys().viewSecretKey, account.getAccountKeys().address.viewPublicKey); if (account.getAccountKeys().spendSecretKey != NULL_SECRET_KEY) { throwIfKeysMissmatch(account.getAccountKeys().spendSecretKey, account.getAccountKeys().address.spendPublicKey); } else { if (!Crypto::check_key(account.getAccountKeys().address.spendPublicKey)) { throw std::system_error(make_error_code(CryptoNote::error::WRONG_PASSWORD)); } } bool detailsSaved; serializer(detailsSaved, "has_details"); if (detailsSaved) { if (version == 1) { transactionsCache.deserializeLegacyV1(serializer); } else { serializer(transactionsCache, "details"); } } serializer.binary(cache, "cache"); }
void WalletSerializer::deserialize(std::istream& stream, const std::string& password, std::string& cache) { cryptonote::BinaryInputStreamSerializer serializerEncrypted(stream); serializerEncrypted.beginObject("wallet"); uint32_t version; serializerEncrypted(version, "version"); crypto::chacha8_iv iv; serializerEncrypted(iv, "iv"); std::string cipher; serializerEncrypted(cipher, "data"); serializerEncrypted.endObject(); std::string plain; decrypt(cipher, plain, iv, password); std::stringstream decryptedStream(plain); cryptonote::BinaryInputStreamSerializer serializer(decryptedStream); try { loadKeys(serializer); throwIfKeysMissmatch(account.get_keys().m_view_secret_key, account.get_keys().m_account_address.m_viewPublicKey); throwIfKeysMissmatch(account.get_keys().m_spend_secret_key, account.get_keys().m_account_address.m_spendPublicKey); } catch (std::exception&) { throw std::system_error(make_error_code(cryptonote::error::WRONG_PASSWORD)); } bool detailsSaved; serializer(detailsSaved, "has_details"); if (detailsSaved) { serializer(transactionsCache, "details"); } serializer.binary(cache, "cache"); }
void WalletSerializerV1::loadWalletV1(Common::IInputStream& source, const Crypto::chacha8_key& key) { CryptoContext cryptoContext; CryptoNote::BinaryInputStreamSerializer encrypted(source); encrypted(cryptoContext.iv, "iv"); cryptoContext.key = key; std::string cipher; encrypted(cipher, "data"); std::string plain = decrypt(cipher, cryptoContext); MemoryInputStream decryptedStream(plain.data(), plain.size()); CryptoNote::BinaryInputStreamSerializer serializer(decryptedStream); loadWalletV1Keys(serializer); try { checkKeys(); } /* Remove the partially (incorrectly) parsed wallet, pass is wrong */ catch (const std::system_error &e) { m_walletsContainer.clear(); throw(e); } subscribeWallets(); bool detailsSaved; serializer(detailsSaved, "has_details"); if (detailsSaved) { loadWalletV1Details(serializer); } }