Allow adjusting number of rounds for the key derivation function

This commit is contained in:
stoffu 2018-07-06 18:39:58 +09:00
parent 45781ab4a1
commit c840e2b664
No known key found for this signature in database
GPG key ID: 41DAB8343A9EC012
7 changed files with 56 additions and 21 deletions

View file

@ -243,7 +243,7 @@ ApplicationWindow {
// console.log("opening wallet at: ", wallet_path, "with password: ", appWindow.walletPassword); // console.log("opening wallet at: ", wallet_path, "with password: ", appWindow.walletPassword);
console.log("opening wallet at: ", wallet_path, ", network type: ", persistentSettings.nettype == NetworkType.MAINNET ? "mainnet" : persistentSettings.nettype == NetworkType.TESTNET ? "testnet" : "stagenet"); console.log("opening wallet at: ", wallet_path, ", network type: ", persistentSettings.nettype == NetworkType.MAINNET ? "mainnet" : persistentSettings.nettype == NetworkType.TESTNET ? "testnet" : "stagenet");
walletManager.openWalletAsync(wallet_path, walletPassword, walletManager.openWalletAsync(wallet_path, walletPassword,
persistentSettings.nettype); persistentSettings.nettype, persistentSettings.kdfRounds);
} }
// Hide titlebar based on persistentSettings.customDecorations // Hide titlebar based on persistentSettings.customDecorations
@ -1026,6 +1026,7 @@ ApplicationWindow {
property bool segregatePreForkOutputs: true property bool segregatePreForkOutputs: true
property bool keyReuseMitigation2: true property bool keyReuseMitigation2: true
property int segregationHeight: 0 property int segregationHeight: 0
property int kdfRounds: 1
} }
// Information dialog // Information dialog

View file

@ -188,7 +188,7 @@ Rectangle {
walletManager.closeWallet(); walletManager.closeWallet();
walletManager.clearWalletCache(persistentSettings.wallet_path); walletManager.clearWalletCache(persistentSettings.wallet_path);
walletManager.openWalletAsync(persistentSettings.wallet_path, appWindow.walletPassword, walletManager.openWalletAsync(persistentSettings.wallet_path, appWindow.walletPassword,
persistentSettings.nettype); persistentSettings.nettype, persistentSettings.kdfRounds);
} }
confirmationDialog.onRejectedCallback = null; confirmationDialog.onRejectedCallback = null;

View file

@ -25,7 +25,7 @@ WalletManager *WalletManager::instance()
} }
Wallet *WalletManager::createWallet(const QString &path, const QString &password, Wallet *WalletManager::createWallet(const QString &path, const QString &password,
const QString &language, NetworkType::Type nettype) const QString &language, NetworkType::Type nettype, quint64 kdfRounds)
{ {
QMutexLocker locker(&m_mutex); QMutexLocker locker(&m_mutex);
if (m_currentWallet) { if (m_currentWallet) {
@ -33,12 +33,12 @@ Wallet *WalletManager::createWallet(const QString &path, const QString &password
delete m_currentWallet; delete m_currentWallet;
} }
Monero::Wallet * w = m_pimpl->createWallet(path.toStdString(), password.toStdString(), Monero::Wallet * w = m_pimpl->createWallet(path.toStdString(), password.toStdString(),
language.toStdString(), static_cast<Monero::NetworkType>(nettype)); language.toStdString(), static_cast<Monero::NetworkType>(nettype), kdfRounds);
m_currentWallet = new Wallet(w); m_currentWallet = new Wallet(w);
return m_currentWallet; return m_currentWallet;
} }
Wallet *WalletManager::openWallet(const QString &path, const QString &password, NetworkType::Type nettype) Wallet *WalletManager::openWallet(const QString &path, const QString &password, NetworkType::Type nettype, quint64 kdfRounds)
{ {
QMutexLocker locker(&m_mutex); QMutexLocker locker(&m_mutex);
if (m_currentWallet) { if (m_currentWallet) {
@ -48,7 +48,7 @@ Wallet *WalletManager::openWallet(const QString &path, const QString &password,
qDebug("%s: opening wallet at %s, nettype = %d ", qDebug("%s: opening wallet at %s, nettype = %d ",
__PRETTY_FUNCTION__, qPrintable(path), nettype); __PRETTY_FUNCTION__, qPrintable(path), nettype);
Monero::Wallet * w = m_pimpl->openWallet(path.toStdString(), password.toStdString(), static_cast<Monero::NetworkType>(nettype)); Monero::Wallet * w = m_pimpl->openWallet(path.toStdString(), password.toStdString(), static_cast<Monero::NetworkType>(nettype), kdfRounds);
qDebug("%s: opened wallet: %s, status: %d", __PRETTY_FUNCTION__, w->address(0, 0).c_str(), w->status()); qDebug("%s: opened wallet: %s, status: %d", __PRETTY_FUNCTION__, w->address(0, 0).c_str(), w->status());
m_currentWallet = new Wallet(w); m_currentWallet = new Wallet(w);
@ -60,10 +60,10 @@ Wallet *WalletManager::openWallet(const QString &path, const QString &password,
return m_currentWallet; return m_currentWallet;
} }
void WalletManager::openWalletAsync(const QString &path, const QString &password, NetworkType::Type nettype) void WalletManager::openWalletAsync(const QString &path, const QString &password, NetworkType::Type nettype, quint64 kdfRounds)
{ {
QFuture<Wallet*> future = QtConcurrent::run(this, &WalletManager::openWallet, QFuture<Wallet*> future = QtConcurrent::run(this, &WalletManager::openWallet,
path, password, nettype); path, password, nettype, kdfRounds);
QFutureWatcher<Wallet*> * watcher = new QFutureWatcher<Wallet*>(); QFutureWatcher<Wallet*> * watcher = new QFutureWatcher<Wallet*>();
connect(watcher, &QFutureWatcher<Wallet*>::finished, connect(watcher, &QFutureWatcher<Wallet*>::finished,
@ -76,21 +76,21 @@ void WalletManager::openWalletAsync(const QString &path, const QString &password
} }
Wallet *WalletManager::recoveryWallet(const QString &path, const QString &memo, NetworkType::Type nettype, quint64 restoreHeight) Wallet *WalletManager::recoveryWallet(const QString &path, const QString &memo, NetworkType::Type nettype, quint64 restoreHeight, quint64 kdfRounds)
{ {
QMutexLocker locker(&m_mutex); QMutexLocker locker(&m_mutex);
if (m_currentWallet) { if (m_currentWallet) {
qDebug() << "Closing open m_currentWallet" << m_currentWallet; qDebug() << "Closing open m_currentWallet" << m_currentWallet;
delete m_currentWallet; delete m_currentWallet;
} }
Monero::Wallet * w = m_pimpl->recoveryWallet(path.toStdString(), memo.toStdString(), static_cast<Monero::NetworkType>(nettype), restoreHeight); Monero::Wallet * w = m_pimpl->recoveryWallet(path.toStdString(), "", memo.toStdString(), static_cast<Monero::NetworkType>(nettype), restoreHeight, kdfRounds);
m_currentWallet = new Wallet(w); m_currentWallet = new Wallet(w);
return m_currentWallet; return m_currentWallet;
} }
Wallet *WalletManager::createWalletFromKeys(const QString &path, const QString &language, NetworkType::Type nettype, Wallet *WalletManager::createWalletFromKeys(const QString &path, const QString &language, NetworkType::Type nettype,
const QString &address, const QString &viewkey, const QString &spendkey, const QString &address, const QString &viewkey, const QString &spendkey,
quint64 restoreHeight) quint64 restoreHeight, quint64 kdfRounds)
{ {
QMutexLocker locker(&m_mutex); QMutexLocker locker(&m_mutex);
if (m_currentWallet) { if (m_currentWallet) {
@ -98,8 +98,8 @@ Wallet *WalletManager::createWalletFromKeys(const QString &path, const QString &
delete m_currentWallet; delete m_currentWallet;
m_currentWallet = NULL; m_currentWallet = NULL;
} }
Monero::Wallet * w = m_pimpl->createWalletFromKeys(path.toStdString(), language.toStdString(), static_cast<Monero::NetworkType>(nettype), restoreHeight, Monero::Wallet * w = m_pimpl->createWalletFromKeys(path.toStdString(), "", language.toStdString(), static_cast<Monero::NetworkType>(nettype), restoreHeight,
address.toStdString(), viewkey.toStdString(), spendkey.toStdString()); address.toStdString(), viewkey.toStdString(), spendkey.toStdString(), kdfRounds);
m_currentWallet = new Wallet(w); m_currentWallet = new Wallet(w);
return m_currentWallet; return m_currentWallet;
} }

View file

@ -33,7 +33,7 @@ public:
static WalletManager * instance(); static WalletManager * instance();
// wizard: createWallet path; // wizard: createWallet path;
Q_INVOKABLE Wallet * createWallet(const QString &path, const QString &password, Q_INVOKABLE Wallet * createWallet(const QString &path, const QString &password,
const QString &language, NetworkType::Type nettype = NetworkType::MAINNET); const QString &language, NetworkType::Type nettype = NetworkType::MAINNET, quint64 kdfRounds = 1);
/*! /*!
* \brief openWallet - opens wallet by given path * \brief openWallet - opens wallet by given path
@ -42,17 +42,17 @@ public:
* \param nettype - type of network the wallet is running on * \param nettype - type of network the wallet is running on
* \return wallet object pointer * \return wallet object pointer
*/ */
Q_INVOKABLE Wallet * openWallet(const QString &path, const QString &password, NetworkType::Type nettype = NetworkType::MAINNET); Q_INVOKABLE Wallet * openWallet(const QString &path, const QString &password, NetworkType::Type nettype = NetworkType::MAINNET, quint64 kdfRounds = 1);
/*! /*!
* \brief openWalletAsync - asynchronous version of "openWallet". Returns immediately. "walletOpened" signal * \brief openWalletAsync - asynchronous version of "openWallet". Returns immediately. "walletOpened" signal
* emitted when wallet opened; * emitted when wallet opened;
*/ */
Q_INVOKABLE void openWalletAsync(const QString &path, const QString &password, NetworkType::Type nettype = NetworkType::MAINNET); Q_INVOKABLE void openWalletAsync(const QString &path, const QString &password, NetworkType::Type nettype = NetworkType::MAINNET, quint64 kdfRounds = 1);
// wizard: recoveryWallet path; hint: internally it recorvers wallet and set password = "" // wizard: recoveryWallet path; hint: internally it recorvers wallet and set password = ""
Q_INVOKABLE Wallet * recoveryWallet(const QString &path, const QString &memo, Q_INVOKABLE Wallet * recoveryWallet(const QString &path, const QString &memo,
NetworkType::Type nettype = NetworkType::MAINNET, quint64 restoreHeight = 0); NetworkType::Type nettype = NetworkType::MAINNET, quint64 restoreHeight = 0, quint64 kdfRounds = 1);
Q_INVOKABLE Wallet * createWalletFromKeys(const QString &path, Q_INVOKABLE Wallet * createWalletFromKeys(const QString &path,
const QString &language, const QString &language,
@ -60,7 +60,8 @@ public:
const QString &address, const QString &address,
const QString &viewkey, const QString &viewkey,
const QString &spendkey = "", const QString &spendkey = "",
quint64 restoreHeight = 0); quint64 restoreHeight = 0,
quint64 kdfRounds = 1);
Q_INVOKABLE Wallet * createWalletFromDevice(const QString &path, Q_INVOKABLE Wallet * createWalletFromDevice(const QString &path,
const QString &password, const QString &password,

View file

@ -86,8 +86,9 @@ ColumnLayout {
var tmp_wallet_filename = oshelper.temporaryFilename(); var tmp_wallet_filename = oshelper.temporaryFilename();
console.log("Creating temporary wallet", tmp_wallet_filename) console.log("Creating temporary wallet", tmp_wallet_filename)
var nettype = appWindow.persistentSettings.nettype; var nettype = appWindow.persistentSettings.nettype;
var kdfRounds = appWindow.persistentSettings.kdfRounds;
var wallet = walletManager.createWallet(tmp_wallet_filename, "", settingsObject.wallet_language, var wallet = walletManager.createWallet(tmp_wallet_filename, "", settingsObject.wallet_language,
nettype) nettype, kdfRounds)
uiItem.wordsTextItem.memoText = wallet.seed uiItem.wordsTextItem.memoText = wallet.seed
// saving wallet in "global" settings object // saving wallet in "global" settings object
// TODO: wallet should have a property pointing to the file where it stored or loaded from // TODO: wallet should have a property pointing to the file where it stored or loaded from

View file

@ -28,6 +28,7 @@
import QtQuick 2.2 import QtQuick 2.2
import QtQml 2.2 import QtQml 2.2
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import moneroComponents.NetworkType 1.0 import moneroComponents.NetworkType 1.0
import "../components" import "../components"
@ -355,5 +356,35 @@ ColumnLayout {
} }
} }
} }
RowLayout {
Layout.leftMargin: wizardLeftMargin
Layout.rightMargin: wizardRightMargin
Layout.topMargin: 50 * scaleRatio
Layout.alignment: Qt.AlignHCenter
Layout.fillWidth: true
visible: showAdvancedCheckbox.checked
Text {
font.family: "Arial"
font.pixelSize: 16 * scaleRatio
color: "#4A4949"
text: qsTr("Number of KDF rounds:") + translationManager.emptyString
}
TextField {
id: kdfRoundsText
font.family: "Arial"
font.pixelSize: 16 * scaleRatio
Layout.preferredWidth: 60
horizontalAlignment: TextInput.AlignRight
selectByMouse: true
color: "#4A4949"
text: persistentSettings.kdfRounds
validator: IntValidator { bottom: 1 }
onTextEdited: {
kdfRoundsText.text = persistentSettings.kdfRounds = parseInt(kdfRoundsText.text) >= 1 ? parseInt(kdfRoundsText.text) : 1;
}
}
}
} }

View file

@ -77,6 +77,7 @@ ColumnLayout {
function recoveryWallet(settingsObject, fromSeed) { function recoveryWallet(settingsObject, fromSeed) {
var nettype = appWindow.persistentSettings.nettype; var nettype = appWindow.persistentSettings.nettype;
var kdfRounds = appWindow.persistentSettings.kdfRounds;
var restoreHeight = settingsObject.restore_height; var restoreHeight = settingsObject.restore_height;
var tmp_wallet_filename = oshelper.temporaryFilename() var tmp_wallet_filename = oshelper.temporaryFilename()
console.log("Creating temporary wallet", tmp_wallet_filename) console.log("Creating temporary wallet", tmp_wallet_filename)
@ -89,11 +90,11 @@ ColumnLayout {
// From seed or keys // From seed or keys
if(fromSeed) if(fromSeed)
var wallet = walletManager.recoveryWallet(tmp_wallet_filename, settingsObject.words, nettype, restoreHeight) var wallet = walletManager.recoveryWallet(tmp_wallet_filename, settingsObject.words, nettype, restoreHeight, kdfRounds)
else else
var wallet = walletManager.createWalletFromKeys(tmp_wallet_filename, settingsObject.wallet_language, nettype, var wallet = walletManager.createWalletFromKeys(tmp_wallet_filename, settingsObject.wallet_language, nettype,
settingsObject.recover_address, settingsObject.recover_viewkey, settingsObject.recover_address, settingsObject.recover_viewkey,
settingsObject.recover_spendkey, restoreHeight) settingsObject.recover_spendkey, restoreHeight, kdfRounds)
var success = wallet.status === Wallet.Status_Ok; var success = wallet.status === Wallet.Status_Ok;