diff --git a/app/dialogs/key_dialog.py b/app/dialogs/key_dialog.py index d21dc62..8a872df 100644 --- a/app/dialogs/key_dialog.py +++ b/app/dialogs/key_dialog.py @@ -10,7 +10,9 @@ from PySide6.QtWidgets import ( QDialogButtonBox, QApplication, QLabel, ) -from app.key_manager import KeyManager, KEY_TYPE_ED25519, KEY_TYPE_RSA, KEY_TYPE_LABELS +from app.key_manager import ( + KeyManager, KEY_TYPE_ED25519, KEY_TYPE_RSA, KEY_TYPE_LABELS, KEY_TYPE_DESCRIPTIONS, +) class GenerateKeyDialog(QDialog): @@ -22,14 +24,12 @@ class GenerateKeyDialog(QDialog): self.name_edit = QLineEdit() self.type_combo = QComboBox() - for key_type, label in KEY_TYPE_LABELS.items(): + for index, (key_type, label) in enumerate(KEY_TYPE_LABELS.items()): self.type_combo.addItem(label, key_type) - self.type_combo.setToolTip( - "Ed25519 : courbe elliptique moderne, courte et rapide — le choix par defaut.\n" - "ECDSA (P-256/384/521) : egalement sur courbe elliptique, utile si une politique\n" - "interne impose les courbes NIST.\n" - "RSA : le plus universel, a privilegier pour un serveur tres ancien." - ) + # info-bulle par entree : visible en survolant la liste deroulante + self.type_combo.setItemData( + index, KEY_TYPE_DESCRIPTIONS.get(key_type, ""), Qt.ToolTipRole + ) self.bits_spin = QSpinBox() self.bits_spin.setRange(2048, 8192) self.bits_spin.setSingleStep(1024) @@ -45,16 +45,30 @@ class GenerateKeyDialog(QDialog): form.addRow("Commentaire :", self.comment_edit) layout.addLayout(form) - self.type_combo.currentIndexChanged.connect( - lambda: self.bits_spin.setEnabled(self.type_combo.currentData() == KEY_TYPE_RSA) - ) - self.bits_spin.setEnabled(False) + # Resume du type selectionne, toujours visible : plus utile qu'une info-bulle + # qu'il faut penser a aller chercher. + self.type_help = QLabel() + self.type_help.setObjectName("statusLabel") + self.type_help.setWordWrap(True) + self.type_help.setTextFormat(Qt.PlainText) + self.type_help.setMinimumHeight(90) + self.type_help.setAlignment(Qt.AlignTop) + layout.addWidget(self.type_help) + + self.type_combo.currentIndexChanged.connect(self._on_type_changed) + self._on_type_changed() buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) buttons.accepted.connect(self.accept) buttons.rejected.connect(self.reject) layout.addWidget(buttons) + def _on_type_changed(self) -> None: + key_type = self.type_combo.currentData() + self.type_help.setText(KEY_TYPE_DESCRIPTIONS.get(key_type, "")) + # la taille en bits ne concerne que RSA + self.bits_spin.setEnabled(key_type == KEY_TYPE_RSA) + def values(self) -> dict: return dict( name=self.name_edit.text().strip() or "cle_ssh", diff --git a/app/key_manager.py b/app/key_manager.py index 4d5d789..1ea2a3d 100644 --- a/app/key_manager.py +++ b/app/key_manager.py @@ -38,6 +38,45 @@ KEY_TYPE_LABELS = { KEY_TYPE_RSA: "RSA (compatibilite maximale)", } +# Resume affiche dans le formulaire de generation, pour choisir en connaissance de cause. +# Les equivalences de robustesse suivent les recommandations du NIST (SP 800-57). +KEY_TYPE_DESCRIPTIONS = { + KEY_TYPE_ED25519: ( + "Courbe Curve25519, de la famille des courbes d'Edwards.\n" + "Robustesse equivalente a RSA 3072, pour une cle publique de 68 caracteres seulement.\n" + "Signature rapide et concue pour resister aux erreurs d'implementation. Ses parametres\n" + "sont justifies publiquement, contrairement aux courbes NIST.\n" + "Compatible OpenSSH 6.5 et plus (2014) : tout serveur actuel l'accepte." + ), + KEY_TYPE_ECDSA_P256: ( + "Courbe NIST P-256 (aussi appelee secp256r1 ou prime256v1), 256 bits.\n" + "Robustesse equivalente a RSA 3072, comme Ed25519.\n" + "Tres repandue et souvent exigee par les politiques de conformite (FIPS).\n" + "Reserve : le NIST n'a jamais explique publiquement le choix de ses parametres,\n" + "ce qui lui vaut une mefiance persistante. A retenir surtout si une regle l'impose.\n" + "Compatible OpenSSH 5.7 et plus (2011)." + ), + KEY_TYPE_ECDSA_P384: ( + "Courbe NIST P-384 (secp384r1), 384 bits.\n" + "Robustesse equivalente a RSA 7680 : un cran au-dessus de P-256.\n" + "Retenue dans les contextes qui exigent un niveau eleve (par exemple la suite CNSA).\n" + "Memes reserves que P-256 sur l'origine des parametres." + ), + KEY_TYPE_ECDSA_P521: ( + "Courbe NIST P-521 (secp521r1), 521 bits — et non 512, ce n'est pas une coquille.\n" + "Robustesse equivalente a RSA 15360, le maximum des courbes NIST.\n" + "Sensiblement plus lente, et rarement necessaire en pratique.\n" + "Memes reserves que P-256 sur l'origine des parametres." + ), + KEY_TYPE_RSA: ( + "Ce n'est pas une courbe : RSA repose sur la difficulte de factoriser de grands nombres.\n" + "Cles nettement plus volumineuses et signatures plus lentes qu'une courbe elliptique.\n" + "2048 bits = robustesse correcte, 3072 bits equivaut a Ed25519, 4096 bits par prudence.\n" + "Son interet est la compatibilite : accepte absolument partout, y compris par des\n" + "equipements anciens (vieux switchs, NAS, systemes embarques)." + ), +} + @dataclass class KeyEntry: