aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/widgets/aooptionsdialog.cpp15
-rw-r--r--src/widgets/aooptionsdialog.h1
-rw-r--r--src/widgets/hardware_key_generate_dialog.cpp86
-rw-r--r--src/widgets/hardware_key_generate_dialog.h33
4 files changed, 133 insertions, 2 deletions
diff --git a/src/widgets/aooptionsdialog.cpp b/src/widgets/aooptionsdialog.cpp
index d9cbcb8..95b7420 100644
--- a/src/widgets/aooptionsdialog.cpp
+++ b/src/widgets/aooptionsdialog.cpp
@@ -8,8 +8,8 @@
#include "networkmanager.h"
#include "options.h"
-// Hopefully temporary.
#include "widgets/key_generate_dialog.h"
+#include "widgets/hardware_key_generate_dialog.h"
#include <QCollator>
#include <QDoubleSpinBox>
@@ -607,7 +607,7 @@ void AOOptionsDialog::setupUI()
KeyGenerateDialog keygen_dialog(this);
if (keygen_dialog.exec() == QDialog::Accepted)
{
- int err = generate_key(keygen_dialog.key_name(), keygen_dialog.key_password());
+ int err = generate_software_key(keygen_dialog.key_name(), keygen_dialog.key_password());
if (err)
{
QMessageBox::warning(this, "Error", QString("Key generation failed, code %1").arg(err));
@@ -615,6 +615,17 @@ void AOOptionsDialog::setupUI()
ao_app->keyring_model.load_keys();
}
});
+ FROM_UI(QPushButton, key_generate_hw);
+ connect(ui_key_generate_hw, &QPushButton::clicked, this, [=, this] {
+ HardwareKeyDialog hw_keygen_dialog(this);
+ if (hw_keygen_dialog.exec() == QDialog::Accepted)
+ {
+ ao_app->keyring_model.load_keys();
+ }
+ });
+
+ ui_key_generate_hw->setEnabled(keyring_hardware_available());
+
FROM_UI(QPushButton, key_delete);
FROM_UI(QTableView, keyring_table);
diff --git a/src/widgets/aooptionsdialog.h b/src/widgets/aooptionsdialog.h
index bc9f282..bd1ca0d 100644
--- a/src/widgets/aooptionsdialog.h
+++ b/src/widgets/aooptionsdialog.h
@@ -126,6 +126,7 @@ private:
// The keyring tab
QPushButton *ui_key_generate;
+ QPushButton *ui_key_generate_hw;
QPushButton *ui_key_delete;
QTableView *ui_keyring_table;
diff --git a/src/widgets/hardware_key_generate_dialog.cpp b/src/widgets/hardware_key_generate_dialog.cpp
new file mode 100644
index 0000000..cb79be9
--- /dev/null
+++ b/src/widgets/hardware_key_generate_dialog.cpp
@@ -0,0 +1,86 @@
+#include <QVBoxLayout>
+#include <QFormLayout>
+#include <QLabel>
+#include <QPushButton>
+#include <QMessageBox>
+
+#include "hardware_key_generate_dialog.h"
+#include "keyring.h"
+
+HardwareKeyDialog::HardwareKeyDialog(QWidget *parent) : QDialog(parent)
+{
+ setWindowTitle("Generate hardware key");
+ auto *layout = new QVBoxLayout(this);
+ auto *name_lbl = new QLabel("Key name:", this);
+ m_name_line = new QLineEdit(this);
+ auto *info = new QLabel("The key will remain in secure hardware and can't be exported.\n"
+ "You can protect it with a weaker secret (such as 6-digit PIN) because it can't be stolen, but you can't back up or transfer a hardware key as it's bound to this particular machine and unusable anywhere else.\n"
+ "Your platform will handle the setup.", this);
+ info->setWordWrap(true);
+ auto *buttons = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, this);
+ buttons->button(QDialogButtonBox::Ok)->setText("Set up key");
+ layout->addWidget(name_lbl);
+ layout->addWidget(m_name_line);
+ layout->addWidget(info);
+ layout->addStretch(); // Does this work?
+ layout->addWidget(buttons);
+
+ connect(buttons, &QDialogButtonBox::accepted, this, &HardwareKeyDialog::generate);
+ connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject);
+}
+
+void HardwareKeyDialog::generate()
+{
+ const QString key_name = m_name_line->text().trimmed();
+ QByteArray pin;
+
+#ifdef SOF_AO_HARDWARE_KEY_REQUIRES_PIN_UI
+ PinEntryDialog pin_dlg(key_name, this);
+ if (pin_dlg.exec() != QDialog::Accepted)
+ {
+ return;
+ }
+ pin = pin_dlg.pin();
+#endif
+
+ int keygen_err = generate_hardware_key(key_name, pin);
+ if (keygen_err)
+ {
+ QMessageBox::warning(this, "Error", QString("Key generation failed (code %1).").arg(keygen_err));
+ return;
+ }
+
+ accept();
+}
+
+PinEntryDialog::PinEntryDialog(QStringView name, QWidget *parent) : QDialog(parent)
+{
+ auto *layout = new QFormLayout(this);
+ m_pin_line = new QLineEdit(this);
+ m_confirm_pin_line = new QLineEdit(this);
+ m_buttons = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, this);
+ layout->addRow("PIN:", m_pin_line);
+ layout->addRow("Confirm PIN:", m_confirm_pin_line);
+ layout->addRow(m_buttons);
+
+ m_buttons->button(QDialogButtonBox::Ok)->setEnabled(false);
+ m_pin_line->setEchoMode(QLineEdit::Password);
+ m_confirm_pin_line->setEchoMode(QLineEdit::Password);
+ connect(m_pin_line, &QLineEdit::textChanged, this, &PinEntryDialog::validate);
+ connect(m_confirm_pin_line, &QLineEdit::textChanged, this, &PinEntryDialog::validate);
+ connect(m_buttons, &QDialogButtonBox::accepted, this, &QDialog::accept);
+ connect(m_buttons, &QDialogButtonBox::rejected, this, &QDialog::reject);
+}
+
+void PinEntryDialog::validate()
+{
+ bool valid = !m_pin_line->text().isEmpty() &&
+ (m_pin_line->text().length() >= 6) &&
+ (m_pin_line->text() == m_confirm_pin_line->text());
+ m_buttons->button(QDialogButtonBox::Ok)->setEnabled(valid);
+}
+
+QByteArray PinEntryDialog::pin() const
+{
+ return m_pin_line->text().toUtf8();
+}
diff --git a/src/widgets/hardware_key_generate_dialog.h b/src/widgets/hardware_key_generate_dialog.h
new file mode 100644
index 0000000..4988573
--- /dev/null
+++ b/src/widgets/hardware_key_generate_dialog.h
@@ -0,0 +1,33 @@
+#pragma once
+
+#include <QDialog>
+#include <QLineEdit>
+#include <QDialogButtonBox>
+#include <QByteArray>
+
+class HardwareKeyDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit HardwareKeyDialog(QWidget *parent = nullptr);
+ void generate(void);
+
+private:
+ QLineEdit *m_name_line;
+};
+
+class PinEntryDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit PinEntryDialog(QStringView name, QWidget *parent = nullptr);
+ QByteArray pin(void) const;
+
+private:
+ void validate(void);
+ QLineEdit *m_pin_line;
+ QLineEdit *m_confirm_pin_line;
+ QDialogButtonBox *m_buttons;
+};