diff options
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/DatabaseSettingsWidget.cpp | 67 | ||||
-rw-r--r-- | src/gui/DatabaseSettingsWidget.h | 1 | ||||
-rw-r--r-- | src/gui/DatabaseSettingsWidget.ui | 210 |
3 files changed, 193 insertions, 85 deletions
diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp index 51c0f4183..2f4fe177d 100644 --- a/src/gui/DatabaseSettingsWidget.cpp +++ b/src/gui/DatabaseSettingsWidget.cpp @@ -26,6 +26,7 @@ #include "core/Group.h" #include "core/Metadata.h" #include "crypto/SymmetricCipher.h" +#include "crypto/kdf/Argon2Kdf.h" #include "MessageBox.h" DatabaseSettingsWidget::DatabaseSettingsWidget(QWidget* parent) @@ -42,6 +43,7 @@ DatabaseSettingsWidget::DatabaseSettingsWidget(QWidget* parent) connect(m_ui->historyMaxSizeCheckBox, SIGNAL(toggled(bool)), m_ui->historyMaxSizeSpinBox, SLOT(setEnabled(bool))); connect(m_ui->transformBenchmarkButton, SIGNAL(clicked()), SLOT(transformRoundsBenchmark())); + connect(m_ui->kdfComboBox, SIGNAL(currentIndexChanged(int)), SLOT(kdfChanged(int))); } DatabaseSettingsWidget::~DatabaseSettingsWidget() @@ -83,19 +85,29 @@ void DatabaseSettingsWidget::load(Database* db) m_ui->algorithmComboBox->setCurrentIndex(cipherIndex); } - bool blockSignals = m_ui->kdfComboBox->signalsBlocked(); + // Setup kdf combo box m_ui->kdfComboBox->blockSignals(true); - m_ui->kdfComboBox->clear(); for (auto& kdf: asConst(KeePass2::KDFS)) { m_ui->kdfComboBox->addItem(kdf.second, kdf.first.toByteArray()); } - int kdfIndex = m_ui->kdfComboBox->findData(m_db->kdf()->uuid().toByteArray()); + m_ui->kdfComboBox->blockSignals(false); + + auto kdfUuid = m_db->kdf()->uuid(); + int kdfIndex = m_ui->kdfComboBox->findData(kdfUuid.toByteArray()); if (kdfIndex > -1) { m_ui->kdfComboBox->setCurrentIndex(kdfIndex); + kdfChanged(kdfIndex); + } + + // Setup kdf parameters + auto kdf = m_db->kdf(); + m_ui->transformRoundsSpinBox->setValue(kdf->rounds()); + if (kdfUuid == KeePass2::KDF_ARGON2) { + auto argon2Kdf = kdf.staticCast<Argon2Kdf>(); + m_ui->memorySpinBox->setValue(argon2Kdf->memory()); + m_ui->parallelismSpinBox->setValue(argon2Kdf->parallelism()); } - m_ui->kdfComboBox->blockSignals(blockSignals); - m_ui->transformRoundsSpinBox->setValue(static_cast<unsigned>(m_db->kdf()->rounds())); m_ui->dbNameEdit->setFocus(); } @@ -139,8 +151,14 @@ void DatabaseSettingsWidget::save() m_db->setCipher(Uuid(m_ui->algorithmComboBox->currentData().toByteArray())); + // Save kdf parameters auto kdf = KeePass2::uuidToKdf(Uuid(m_ui->kdfComboBox->currentData().toByteArray())); - kdf->setRounds(static_cast<quint64>(qMax(0, m_ui->transformRoundsSpinBox->value()))); + kdf->setRounds(m_ui->transformRoundsSpinBox->value()); + if (kdf->uuid() == KeePass2::KDF_ARGON2) { + auto argon2Kdf = kdf.staticCast<Argon2Kdf>(); + argon2Kdf->setMemory(m_ui->memorySpinBox->value()); + argon2Kdf->setParallelism(m_ui->parallelismSpinBox->value()); + } QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); // TODO: we should probably use AsyncTask::runAndWaitForFuture() here, @@ -164,11 +182,26 @@ void DatabaseSettingsWidget::reject() void DatabaseSettingsWidget::transformRoundsBenchmark() { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - m_ui->transformRoundsSpinBox->setValue(AsyncTask::runAndWaitForFuture([this]() { - int rounds = m_db->kdf()->benchmark(1000); - QApplication::restoreOverrideCursor(); - return rounds; - })); + m_ui->transformBenchmarkButton->setEnabled(false); + + // Create a new kdf with the current parameters + auto kdf = KeePass2::uuidToKdf(Uuid(m_ui->kdfComboBox->currentData().toByteArray())); + kdf->setRounds(m_ui->transformRoundsSpinBox->value()); + if (kdf->uuid() == KeePass2::KDF_ARGON2) { + auto argon2Kdf = kdf.staticCast<Argon2Kdf>(); + argon2Kdf->setMemory(m_ui->memorySpinBox->value()); + argon2Kdf->setParallelism(m_ui->parallelismSpinBox->value()); + } + + // Determine the number of rounds required to meet 1 second delay + int rounds = AsyncTask::runAndWaitForFuture([this, kdf]() { + return kdf->benchmark(1000); + }); + + m_ui->transformRoundsSpinBox->setValue(rounds); + + QApplication::restoreOverrideCursor(); + m_ui->transformBenchmarkButton->setEnabled(true); } void DatabaseSettingsWidget::truncateHistories() @@ -178,3 +211,15 @@ void DatabaseSettingsWidget::truncateHistories() entry->truncateHistory(); } } + +void DatabaseSettingsWidget::kdfChanged(int index) +{ + Uuid id(m_ui->kdfComboBox->itemData(index).toByteArray()); + if (id == KeePass2::KDF_ARGON2) { + m_ui->memorySpinBox->setEnabled(true); + m_ui->parallelismSpinBox->setEnabled(true); + } else { + m_ui->memorySpinBox->setEnabled(false); + m_ui->parallelismSpinBox->setEnabled(false); + } +} diff --git a/src/gui/DatabaseSettingsWidget.h b/src/gui/DatabaseSettingsWidget.h index ec3d6415a..83a5eb098 100644 --- a/src/gui/DatabaseSettingsWidget.h +++ b/src/gui/DatabaseSettingsWidget.h @@ -51,6 +51,7 @@ private slots: void save(); void reject(); void transformRoundsBenchmark(); + void kdfChanged(int index); private: void truncateHistories(); diff --git a/src/gui/DatabaseSettingsWidget.ui b/src/gui/DatabaseSettingsWidget.ui index 8aaab19e7..5a6778678 100644 --- a/src/gui/DatabaseSettingsWidget.ui +++ b/src/gui/DatabaseSettingsWidget.ui @@ -2,6 +2,14 @@ <ui version="4.0"> <class>DatabaseSettingsWidget</class> <widget class="QWidget" name="DatabaseSettingsWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>1082</width> + <height>506</height> + </rect> + </property> <layout class="QVBoxLayout" name="verticalLayout" stretch="1,2,5,1"> <item> <spacer name="verticalSpacer_2"> @@ -35,39 +43,36 @@ <widget class="QWidget" name="widget" native="true"> <property name="maximumSize"> <size> - <width>800</width> + <width>400</width> <height>16777215</height> </size> </property> <layout class="QGridLayout" name="gridLayout"> - <item row="4" column="2"> + <item row="11" column="1"> + <widget class="QCheckBox" name="historyMaxSizeCheckBox"> + <property name="text"> + <string>Max. history size:</string> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QLineEdit" name="dbNameEdit"/> + </item> + <item row="7" column="2"> <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> - <widget class="QSpinBox" name="transformRoundsSpinBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <widget class="QSpinBox" name="memorySpinBox"> + <property name="suffix"> + <string> MB</string> </property> <property name="minimum"> <number>1</number> </property> <property name="maximum"> - <number>1000000000</number> + <number>1048576</number> </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="transformBenchmarkButton"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="MinimumExpanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Benchmark</string> + <property name="value"> + <number>64</number> </property> </widget> </item> @@ -80,31 +85,55 @@ </property> </widget> </item> - <item row="8" column="1"> - <widget class="QCheckBox" name="historyMaxSizeCheckBox"> + <item row="10" column="1"> + <widget class="QCheckBox" name="historyMaxItemsCheckBox"> <property name="text"> - <string>Max. history size:</string> + <string>Max. history items:</string> </property> </widget> </item> - <item row="4" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="transformRoundsLabel"> + <item row="4" column="1"> + <widget class="QLabel" name="kdfLabel"> <property name="text"> - <string>Transform rounds:</string> + <string>Key Derivation Function</string> </property> </widget> </item> - <item row="7" column="1"> - <widget class="QCheckBox" name="historyMaxItemsCheckBox"> + <item row="3" column="2"> + <widget class="QComboBox" name="algorithmComboBox"> + <item> + <property name="text"> + <string>AES: 256 Bit (default)</string> + </property> + </item> + <item> + <property name="text"> + <string>Twofish: 256 Bit</string> + </property> + </item> + </widget> + </item> + <item row="3" column="1" alignment="Qt::AlignRight"> + <widget class="QLabel" name="algorithmLabel"> <property name="text"> - <string>Max. history items:</string> + <string>Encryption Algorithm:</string> </property> </widget> </item> - <item row="0" column="2"> - <widget class="QLineEdit" name="dbNameEdit"/> + <item row="1" column="1" alignment="Qt::AlignRight"> + <widget class="QLabel" name="dbDescriptionLabel"> + <property name="text"> + <string>Database description:</string> + </property> + </widget> </item> - <item row="7" column="2"> + <item row="1" column="2"> + <widget class="QLineEdit" name="dbDescriptionEdit"/> + </item> + <item row="4" column="2"> + <widget class="QComboBox" name="kdfComboBox"/> + </item> + <item row="10" column="2"> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <widget class="QSpinBox" name="historyMaxItemsSpinBox"> @@ -121,17 +150,7 @@ </item> </layout> </item> - <item row="5" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="defaultUsernameLabel"> - <property name="text"> - <string>Default username:</string> - </property> - </widget> - </item> - <item row="1" column="2"> - <widget class="QLineEdit" name="dbDescriptionEdit"/> - </item> - <item row="8" column="2"> + <item row="11" column="2"> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QSpinBox" name="historyMaxSizeSpinBox"> @@ -155,54 +174,101 @@ </layout> </item> <item row="6" column="2"> - <widget class="QCheckBox" name="recycleBinEnabledCheckBox"> - <property name="text"> - <string>Use recycle bin</string> + <widget class="QSpinBox" name="transformRoundsSpinBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> + </property> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>1000000000</number> </property> </widget> </item> <item row="5" column="2"> + <widget class="QToolButton" name="transformBenchmarkButton"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Benchmark 1-second delay</string> + </property> + </widget> + </item> + <item row="2" column="2"> <widget class="QLineEdit" name="defaultUsernameEdit"> <property name="enabled"> <bool>true</bool> </property> </widget> </item> - <item row="1" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="dbDescriptionLabel"> + <item row="2" column="1"> + <widget class="QLabel" name="defaultUsernameLabel"> <property name="text"> - <string>Database description:</string> + <string>Default username:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> </widget> </item> - <item row="2" column="2"> - <widget class="QComboBox" name="algorithmComboBox"> - <item> - <property name="text"> - <string>AES: 256 Bit (default)</string> - </property> - </item> - <item> - <property name="text"> - <string>Twofish: 256 Bit</string> - </property> - </item> + <item row="6" column="1"> + <widget class="QLabel" name="transformRoundsLabel"> + <property name="text"> + <string>Transform rounds:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> </widget> </item> - <item row="2" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="algorithmLabel"> + <item row="7" column="1"> + <widget class="QLabel" name="memoryUsageLabel"> <property name="text"> - <string>Encryption Algorithm:</string> + <string>Memory Usage:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> </widget> </item> - <item row="3" column="2"> - <widget class="QComboBox" name="kdfComboBox"/> + <item row="8" column="1"> + <widget class="QLabel" name="parallelismLabel"> + <property name="text"> + <string>Parallelism:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> </item> - <item row="3" column="1"> - <widget class="QLabel" name="kdfLabel"> + <item row="8" column="2"> + <widget class="QSpinBox" name="parallelismSpinBox"> + <property name="suffix"> + <string> thread</string> + </property> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>128</number> + </property> + </widget> + </item> + <item row="9" column="1"> + <widget class="QCheckBox" name="recycleBinEnabledCheckBox"> <property name="text"> - <string>Key Derivation Function</string> + <string>Use recycle bin</string> </property> </widget> </item> @@ -249,10 +315,6 @@ <tabstops> <tabstop>dbNameEdit</tabstop> <tabstop>dbDescriptionEdit</tabstop> - <tabstop>transformRoundsSpinBox</tabstop> - <tabstop>transformBenchmarkButton</tabstop> - <tabstop>defaultUsernameEdit</tabstop> - <tabstop>recycleBinEnabledCheckBox</tabstop> <tabstop>historyMaxItemsCheckBox</tabstop> <tabstop>historyMaxItemsSpinBox</tabstop> <tabstop>historyMaxSizeCheckBox</tabstop> |