Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/keepassxreboot/keepassxc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/DatabaseSettingsWidget.cpp67
-rw-r--r--src/gui/DatabaseSettingsWidget.h1
-rw-r--r--src/gui/DatabaseSettingsWidget.ui210
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>