From ac2d7c9e87f543bbfe9d7b30ea77557bcfb9a698 Mon Sep 17 00:00:00 2001 From: Dolph Flynn <96876199+DolphFlynn@users.noreply.github.com> Date: Fri, 10 Jan 2025 20:19:27 +0000 Subject: [PATCH] Convert operation dialogs to panels and use generic dialog. --- .../jwteditor/presenter/EditorPresenter.java | 62 ++----- .../EmbedCollaboratorPayloadDialog.form | 107 ------------ .../EmbedCollaboratorPayloadPanel.form | 33 ++++ ...ava => EmbedCollaboratorPayloadPanel.java} | 21 +-- .../operations/EmptyKeySigningDialog.form | 107 ------------ .../operations/EmptyKeySigningPanel.form | 33 ++++ ...gDialog.java => EmptyKeySigningPanel.java} | 26 +-- .../{EncryptDialog.form => EncryptPanel.form} | 50 +----- .../{EncryptDialog.java => EncryptPanel.java} | 46 +++-- ...alog.form => KeyConfusionAttackPanel.form} | 47 +----- ...alog.java => KeyConfusionAttackPanel.java} | 41 ++--- .../view/dialog/operations/NoneOperation.form | 33 ++++ .../{NoneDialog.java => NoneOperation.java} | 19 +-- .../view/dialog/operations/Operation.java | 35 ++++ .../{NoneDialog.form => OperationDialog.form} | 28 +--- .../dialog/operations/OperationDialog.java | 77 ++++++--- .../dialog/operations/OperationPanel.java | 56 +++++++ .../operations/PsychicSignatureDialog.form | 107 ------------ .../operations/PsychicSignaturePanel.form | 33 ++++ ...Dialog.java => PsychicSignaturePanel.java} | 21 +-- .../view/dialog/operations/SigningDialog.form | 158 ------------------ .../view/dialog/operations/SigningPanel.form | 94 +++++++++++ .../{SigningDialog.java => SigningPanel.java} | 37 ++-- 23 files changed, 496 insertions(+), 775 deletions(-) delete mode 100644 src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmbedCollaboratorPayloadDialog.form create mode 100644 src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmbedCollaboratorPayloadPanel.form rename src/main/java/com/blackberry/jwteditor/view/dialog/operations/{EmbedCollaboratorPayloadDialog.java => EmbedCollaboratorPayloadPanel.java} (74%) delete mode 100644 src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmptyKeySigningDialog.form create mode 100644 src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmptyKeySigningPanel.form rename src/main/java/com/blackberry/jwteditor/view/dialog/operations/{EmptyKeySigningDialog.java => EmptyKeySigningPanel.java} (69%) rename src/main/java/com/blackberry/jwteditor/view/dialog/operations/{EncryptDialog.form => EncryptPanel.form} (63%) rename src/main/java/com/blackberry/jwteditor/view/dialog/operations/{EncryptDialog.java => EncryptPanel.java} (85%) rename src/main/java/com/blackberry/jwteditor/view/dialog/operations/{KeyConfusionAttackDialog.form => KeyConfusionAttackPanel.form} (62%) rename src/main/java/com/blackberry/jwteditor/view/dialog/operations/{KeyConfusionAttackDialog.java => KeyConfusionAttackPanel.java} (69%) create mode 100644 src/main/java/com/blackberry/jwteditor/view/dialog/operations/NoneOperation.form rename src/main/java/com/blackberry/jwteditor/view/dialog/operations/{NoneDialog.java => NoneOperation.java} (71%) create mode 100644 src/main/java/com/blackberry/jwteditor/view/dialog/operations/Operation.java rename src/main/java/com/blackberry/jwteditor/view/dialog/operations/{NoneDialog.form => OperationDialog.form} (73%) create mode 100644 src/main/java/com/blackberry/jwteditor/view/dialog/operations/OperationPanel.java delete mode 100644 src/main/java/com/blackberry/jwteditor/view/dialog/operations/PsychicSignatureDialog.form create mode 100644 src/main/java/com/blackberry/jwteditor/view/dialog/operations/PsychicSignaturePanel.form rename src/main/java/com/blackberry/jwteditor/view/dialog/operations/{PsychicSignatureDialog.java => PsychicSignaturePanel.java} (69%) delete mode 100644 src/main/java/com/blackberry/jwteditor/view/dialog/operations/SigningDialog.form create mode 100644 src/main/java/com/blackberry/jwteditor/view/dialog/operations/SigningPanel.form rename src/main/java/com/blackberry/jwteditor/view/dialog/operations/{SigningDialog.java => SigningPanel.java} (82%) diff --git a/src/main/java/com/blackberry/jwteditor/presenter/EditorPresenter.java b/src/main/java/com/blackberry/jwteditor/presenter/EditorPresenter.java index b480008..ca143b1 100644 --- a/src/main/java/com/blackberry/jwteditor/presenter/EditorPresenter.java +++ b/src/main/java/com/blackberry/jwteditor/presenter/EditorPresenter.java @@ -45,7 +45,7 @@ import static com.blackberry.jwteditor.utils.Base64URLUtils.base64UrlEncodeJson; import static com.blackberry.jwteditor.utils.JSONUtils.isJsonCompact; import static com.blackberry.jwteditor.utils.JSONUtils.prettyPrintJSON; -import static com.blackberry.jwteditor.view.dialog.operations.SigningDialog.Mode.EMBED_JWK; +import static com.blackberry.jwteditor.view.dialog.operations.SigningPanel.Mode.EMBED_JWK; /** * Presenter class for the Editor tab @@ -208,44 +208,23 @@ public void onAttackKeyConfusionClicked() { return; } - OperationDialog dialog = new KeyConfusionAttackDialog( - view.window(), - logging, - attackKeys, - lastSigningKeys, - getJWS() - ); - - showDialogAndUpdateJWS(dialog); + showDialogAndUpdateJWS(new KeyConfusionAttackPanel(attackKeys, lastSigningKeys)); } public void onAttackSignNoneClicked() { - OperationDialog dialog = new NoneDialog(view.window(), logging, getJWS()); - - showDialogAndUpdateJWS(dialog); + showDialogAndUpdateJWS(new NoneOperation()); } public void onAttackSignEmptyKeyClicked() { - OperationDialog dialog = new EmptyKeySigningDialog(view.window(), logging, getJWS()); - - showDialogAndUpdateJWS(dialog); + showDialogAndUpdateJWS(new EmptyKeySigningPanel()); } public void onAttackPsychicSignatureClicked() { - OperationDialog dialog = new PsychicSignatureDialog(view.window(), logging, getJWS()); - - showDialogAndUpdateJWS(dialog); + showDialogAndUpdateJWS(new PsychicSignaturePanel()); } public void onAttackEmbedCollaboratorPayloadClicked() { - OperationDialog dialog = new EmbedCollaboratorPayloadDialog( - view.window(), - logging, - getJWS(), - collaboratorPayloadGenerator - ); - - showDialogAndUpdateJWS(dialog); + showDialogAndUpdateJWS(new EmbedCollaboratorPayloadPanel(collaboratorPayloadGenerator)); } public void onAttackWeakHMACSecret() { @@ -261,7 +240,7 @@ public void onAttackWeakHMACSecret() { } public void onSignClicked() { - signingDialog(SigningDialog.Mode.NORMAL); + signingDialog(SigningPanel.Mode.NORMAL); } /** @@ -269,26 +248,24 @@ public void onSignClicked() { * * @param mode mode of the signing dialog to display */ - private void signingDialog(SigningDialog.Mode mode) { + private void signingDialog(SigningPanel.Mode mode) { // Check there are signing keys in the keystore if (keysRepository.getSigningKeys().isEmpty()) { messageDialogFactory.showWarningDialog("error_title_no_signing_keys", "error_no_signing_keys"); return; } - OperationDialog signDialog = new SigningDialog( + showDialogAndUpdateJWS(new SigningPanel(keysRepository.getSigningKeys(), mode, lastSigningKeys)); + } + + private void showDialogAndUpdateJWS(Operation operation) { + OperationDialog dialog = new OperationDialog<>( view.window(), logging, - keysRepository.getSigningKeys(), - getJWS(), - mode, - lastSigningKeys + operation, + getJWS() ); - showDialogAndUpdateJWS(signDialog); - } - - private void showDialogAndUpdateJWS(OperationDialog dialog) { dialog.display(); JWS updatedJWS = dialog.getJWT(); @@ -298,9 +275,6 @@ private void showDialogAndUpdateJWS(OperationDialog dialog) { } } - /** - * Handle click events from the Verify button - */ public void onVerifyClicked() { List keys = keysRepository.getVerificationKeys(); @@ -326,11 +300,11 @@ public void onEncryptClicked() { return; } - OperationDialog encryptDialog = new EncryptDialog( + OperationDialog encryptDialog = new OperationDialog<>( view.window(), logging, - getJWS(), - keysRepository.getEncryptionKeys() + new EncryptPanel(keysRepository.getEncryptionKeys()), + getJWS() ); encryptDialog.display(); diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmbedCollaboratorPayloadDialog.form b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmbedCollaboratorPayloadDialog.form deleted file mode 100644 index 1d5de47..0000000 --- a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmbedCollaboratorPayloadDialog.form +++ /dev/null @@ -1,107 +0,0 @@ - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmbedCollaboratorPayloadPanel.form b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmbedCollaboratorPayloadPanel.form new file mode 100644 index 0000000..fa11d6a --- /dev/null +++ b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmbedCollaboratorPayloadPanel.form @@ -0,0 +1,33 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmbedCollaboratorPayloadDialog.java b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmbedCollaboratorPayloadPanel.java similarity index 74% rename from src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmbedCollaboratorPayloadDialog.java rename to src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmbedCollaboratorPayloadPanel.java index 840cecd..cc9920e 100644 --- a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmbedCollaboratorPayloadDialog.java +++ b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmbedCollaboratorPayloadPanel.java @@ -19,42 +19,39 @@ package com.blackberry.jwteditor.view.dialog.operations; import burp.api.montoya.collaborator.CollaboratorPayloadGenerator; -import burp.api.montoya.logging.Logging; import com.blackberry.jwteditor.model.jose.JWS; import com.blackberry.jwteditor.operations.Attacks; import javax.swing.*; -import java.awt.*; import static com.nimbusds.jose.HeaderParameterNames.JWK_SET_URL; import static com.nimbusds.jose.HeaderParameterNames.X_509_CERT_URL; +import static java.awt.BorderLayout.CENTER; -public class EmbedCollaboratorPayloadDialog extends OperationDialog { +public class EmbedCollaboratorPayloadPanel extends OperationPanel { private static final String[] HEADER_LOCATION_VALUES = {JWK_SET_URL, X_509_CERT_URL}; private final CollaboratorPayloadGenerator collaboratorPayloadGenerator; - private JPanel contentPane; - private JButton buttonOK; - private JButton buttonCancel; + private JPanel panel; private JComboBox comboBoxAlgorithm; - public EmbedCollaboratorPayloadDialog(Window parent, Logging logging, JWS jws, CollaboratorPayloadGenerator collaboratorPayloadGenerator) { - super(parent, logging, "embed_collaborator_payload_attack_dialog_title", jws); + public EmbedCollaboratorPayloadPanel(CollaboratorPayloadGenerator collaboratorPayloadGenerator) { + super("embed_collaborator_payload_attack_dialog_title"); this.collaboratorPayloadGenerator = collaboratorPayloadGenerator; - configureUI(contentPane, buttonOK, buttonCancel); - comboBoxAlgorithm.setModel(new DefaultComboBoxModel<>(HEADER_LOCATION_VALUES)); comboBoxAlgorithm.setSelectedIndex(0); + + add(panel, CENTER); } @Override - JWS performOperation() { + public JWS performOperation(JWS originalJwt) { String selectedLocation = (String) comboBoxAlgorithm.getSelectedItem(); return Attacks.embedCollaboratorPayload( - jwt, + originalJwt, selectedLocation, collaboratorPayloadGenerator.generatePayload().toString() ); diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmptyKeySigningDialog.form b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmptyKeySigningDialog.form deleted file mode 100644 index a461a0a..0000000 --- a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmptyKeySigningDialog.form +++ /dev/null @@ -1,107 +0,0 @@ - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmptyKeySigningPanel.form b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmptyKeySigningPanel.form new file mode 100644 index 0000000..fe0dee1 --- /dev/null +++ b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmptyKeySigningPanel.form @@ -0,0 +1,33 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmptyKeySigningDialog.java b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmptyKeySigningPanel.java similarity index 69% rename from src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmptyKeySigningDialog.java rename to src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmptyKeySigningPanel.java index 67fc6c1..629076d 100644 --- a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmptyKeySigningDialog.java +++ b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EmptyKeySigningPanel.java @@ -17,7 +17,6 @@ package com.blackberry.jwteditor.view.dialog.operations; -import burp.api.montoya.logging.Logging; import com.blackberry.jwteditor.exceptions.SigningException; import com.blackberry.jwteditor.exceptions.UnsupportedKeyException; import com.blackberry.jwteditor.model.jose.JWS; @@ -25,31 +24,34 @@ import com.nimbusds.jose.JWSAlgorithm; import javax.swing.*; -import java.awt.*; import static com.nimbusds.jose.JWSAlgorithm.*; +import static java.awt.BorderLayout.CENTER; -public class EmptyKeySigningDialog extends OperationDialog { +public class EmptyKeySigningPanel extends OperationPanel { private static final JWSAlgorithm[] ALGORITHMS = {HS256, HS384, HS512}; - private JPanel contentPane; - private JButton buttonOK; - private JButton buttonCancel; + private JPanel panel; private JComboBox comboBoxAlgorithm; - public EmptyKeySigningDialog(Window parent, Logging logging, JWS jws) { - super(parent, logging, "empty_key_signing_dialog_title", jws, "error_title_unable_to_sign"); - - configureUI(contentPane, buttonOK, buttonCancel); + public EmptyKeySigningPanel() { + super("empty_key_signing_dialog_title"); comboBoxAlgorithm.setModel(new DefaultComboBoxModel<>(ALGORITHMS)); comboBoxAlgorithm.setSelectedIndex(0); + + add(panel, CENTER); } @Override - JWS performOperation() throws SigningException, UnsupportedKeyException { + public JWS performOperation(JWS originalJwt) throws SigningException, UnsupportedKeyException { JWSAlgorithm selectedAlgorithm = (JWSAlgorithm) comboBoxAlgorithm.getSelectedItem(); - return Attacks.signWithEmptyKey(jwt, selectedAlgorithm); + return Attacks.signWithEmptyKey(originalJwt, selectedAlgorithm); + } + + @Override + public String operationFailedResourceId() { + return "error_title_unable_to_sign"; } } diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EncryptDialog.form b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EncryptPanel.form similarity index 63% rename from src/main/java/com/blackberry/jwteditor/view/dialog/operations/EncryptDialog.form rename to src/main/java/com/blackberry/jwteditor/view/dialog/operations/EncryptPanel.form index 524ee95..5533a64 100644 --- a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EncryptDialog.form +++ b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EncryptPanel.form @@ -1,6 +1,6 @@ -
- + + @@ -8,58 +8,16 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EncryptDialog.java b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EncryptPanel.java similarity index 85% rename from src/main/java/com/blackberry/jwteditor/view/dialog/operations/EncryptDialog.java rename to src/main/java/com/blackberry/jwteditor/view/dialog/operations/EncryptPanel.java index 50d710a..0d41551 100644 --- a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EncryptDialog.java +++ b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/EncryptPanel.java @@ -18,7 +18,6 @@ package com.blackberry.jwteditor.view.dialog.operations; -import burp.api.montoya.logging.Logging; import com.blackberry.jwteditor.exceptions.EncryptionException; import com.blackberry.jwteditor.model.jose.JWE; import com.blackberry.jwteditor.model.jose.JWEFactory; @@ -31,28 +30,16 @@ import java.awt.*; import java.util.List; -/** - * Encrypt dialog from the Editor tab - */ -public class EncryptDialog extends OperationDialog { - private JPanel contentPane; - private JButton buttonOK; - private JButton buttonCancel; +import static java.awt.BorderLayout.CENTER; + +public class EncryptPanel extends OperationPanel { + private JPanel panel; private JComboBox comboBoxCEK; private JComboBox comboBoxKEK; private JComboBox comboBoxEncryptionKey; - private final JWS jws; - - public EncryptDialog( - Window parent, - Logging logging, - JWS jws, - List encryptionKeys) { - super(parent, logging, "encrypt_dialog_title", null, "error_title_unable_to_encrypt"); - this.jws = jws; - - configureUI(contentPane, buttonOK, buttonCancel); + public EncryptPanel(List encryptionKeys) { + super("encrypt_dialog_title", new Dimension(600, 325)); // Convert encryptionKeys List to Array Key[] encryptionKeysArray = new Key[encryptionKeys.size()]; @@ -67,6 +54,8 @@ public EncryptDialog( // Set the encryption key to be the first value. This will trigger the event handlers setting the other two dropdowns comboBoxEncryptionKey.setSelectedIndex(0); + + add(panel, CENTER); } /** @@ -118,7 +107,7 @@ private void updateCEK() { if (cekAlgorithms.length > 0) { comboBoxCEK.setSelectedIndex(0); comboBoxCEK.setEnabled(true); - buttonOK.setEnabled(true); + fireValidityEvent(true); } else { comboBoxCEK.setEnabled(false); } @@ -126,22 +115,31 @@ private void updateCEK() { // Disable the form and the Content Encryption Algorithm dropdown if there is no Key Encryption Algorithm selected comboBoxCEK.setModel(new DefaultComboBoxModel<>()); comboBoxCEK.setEnabled(false); - buttonOK.setEnabled(false); + fireValidityEvent(false); } } else { // Disable the form and the Content Encryption Algorithm dropdown if there is no Encryption Key selected comboBoxCEK.setModel(new DefaultComboBoxModel<>()); comboBoxCEK.setEnabled(false); - buttonOK.setEnabled(false); + fireValidityEvent(false); } } + private void fireValidityEvent(boolean isValid) { + firePropertyChange(VALIDITY_EVENT, !isValid, isValid); + } + @Override - JWE performOperation() throws EncryptionException { + public JWE performOperation(JWS originalJwt) throws EncryptionException { Key selectedKey = (Key) comboBoxEncryptionKey.getSelectedItem(); JWEAlgorithm selectedKek = (JWEAlgorithm) comboBoxKEK.getSelectedItem(); EncryptionMethod selectedCek = (EncryptionMethod) comboBoxCEK.getSelectedItem(); - return JWEFactory.encrypt(jws, selectedKey, selectedKek, selectedCek); + return JWEFactory.encrypt(originalJwt, selectedKey, selectedKek, selectedCek); + } + + @Override + public String operationFailedResourceId() { + return "error_title_unable_to_encrypt"; } } diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/KeyConfusionAttackDialog.form b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/KeyConfusionAttackPanel.form similarity index 62% rename from src/main/java/com/blackberry/jwteditor/view/dialog/operations/KeyConfusionAttackDialog.form rename to src/main/java/com/blackberry/jwteditor/view/dialog/operations/KeyConfusionAttackPanel.form index 396be34..4ecaf1e 100644 --- a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/KeyConfusionAttackDialog.form +++ b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/KeyConfusionAttackPanel.form @@ -1,54 +1,13 @@ - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/KeyConfusionAttackDialog.java b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/KeyConfusionAttackPanel.java similarity index 69% rename from src/main/java/com/blackberry/jwteditor/view/dialog/operations/KeyConfusionAttackDialog.java rename to src/main/java/com/blackberry/jwteditor/view/dialog/operations/KeyConfusionAttackPanel.java index d0cacc1..f519303 100644 --- a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/KeyConfusionAttackDialog.java +++ b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/KeyConfusionAttackPanel.java @@ -18,7 +18,6 @@ package com.blackberry.jwteditor.view.dialog.operations; -import burp.api.montoya.logging.Logging; import com.blackberry.jwteditor.exceptions.PemException; import com.blackberry.jwteditor.exceptions.SigningException; import com.blackberry.jwteditor.exceptions.UnsupportedKeyException; @@ -33,34 +32,24 @@ import java.util.List; import static com.blackberry.jwteditor.view.dialog.operations.LastSigningKeys.Signer.KEY_CONFUSION; +import static com.nimbusds.jose.JWSAlgorithm.*; +import static java.awt.BorderLayout.CENTER; -/** - * Attack > HMAC Key Confusion dialog from the Editor tab - */ -public class KeyConfusionAttackDialog extends OperationDialog { - private static final JWSAlgorithm[] ALGORITHMS = {JWSAlgorithm.HS256, JWSAlgorithm.HS384, JWSAlgorithm.HS512}; +public class KeyConfusionAttackPanel extends OperationPanel { + private static final JWSAlgorithm[] ALGORITHMS = {HS256, HS384, HS512}; private final LastSigningKeys lastSigningKeys; - private JPanel contentPane; - private JButton buttonOK; - private JButton buttonCancel; + private JPanel panel; private JComboBox comboBoxSigningKey; private JComboBox comboBoxSigningAlgorithm; private JCheckBox checkBoxTrailingNewline; - public KeyConfusionAttackDialog( - Window parent, - Logging logging, - List signingKeys, - LastSigningKeys lastSigningKeys, - JWS jws) { - super(parent, logging, "key_confusion_attack_dialog_title", jws, "error_title_unable_to_sign"); + public KeyConfusionAttackPanel(List signingKeys, LastSigningKeys lastSigningKeys) { + super("key_confusion_attack_dialog_title", new Dimension(575, 275)); this.lastSigningKeys = lastSigningKeys; - configureUI(contentPane, buttonOK, buttonCancel); - int lastUsedKeyIndex = lastSigningKeys.lastKeyFor(KEY_CONFUSION).map(signingKeys::indexOf).orElse(-1); lastUsedKeyIndex = lastUsedKeyIndex == -1 ? 0 : lastUsedKeyIndex; @@ -68,15 +57,27 @@ public KeyConfusionAttackDialog( comboBoxSigningKey.setSelectedIndex(lastUsedKeyIndex); comboBoxSigningAlgorithm.setModel(new DefaultComboBoxModel<>(ALGORITHMS)); + + add(panel, CENTER); } @Override - JWS performOperation() throws SigningException, PemException, UnsupportedKeyException { + public JWS performOperation(JWS originalJwt) throws SigningException, PemException, UnsupportedKeyException { JWKKey selectedKey = (JWKKey) comboBoxSigningKey.getSelectedItem(); JWSAlgorithm selectedAlgorithm = (JWSAlgorithm) comboBoxSigningAlgorithm.getSelectedItem(); lastSigningKeys.recordKeyUse(KEY_CONFUSION, selectedKey); - return Attacks.hmacKeyConfusion(jwt, selectedKey, selectedAlgorithm, checkBoxTrailingNewline.isSelected()); + return Attacks.hmacKeyConfusion( + originalJwt, + selectedKey, + selectedAlgorithm, + checkBoxTrailingNewline.isSelected() + ); + } + + @Override + public String operationFailedResourceId() { + return "error_title_unable_to_sign"; } } diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/NoneOperation.form b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/NoneOperation.form new file mode 100644 index 0000000..c87cc5d --- /dev/null +++ b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/NoneOperation.form @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/NoneDialog.java b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/NoneOperation.java similarity index 71% rename from src/main/java/com/blackberry/jwteditor/view/dialog/operations/NoneDialog.java rename to src/main/java/com/blackberry/jwteditor/view/dialog/operations/NoneOperation.java index ea8fb63..54ee38a 100644 --- a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/NoneDialog.java +++ b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/NoneOperation.java @@ -17,33 +17,30 @@ package com.blackberry.jwteditor.view.dialog.operations; -import burp.api.montoya.logging.Logging; import com.blackberry.jwteditor.model.jose.JWS; import com.blackberry.jwteditor.operations.Attacks; import javax.swing.*; import java.awt.*; -public class NoneDialog extends OperationDialog { +public class NoneOperation extends OperationPanel { private static final String[] NONE_ALGORITHM_VALUES = {"none", "None", "NONE", "nOnE"}; - private JPanel contentPane; - private JButton buttonOK; - private JButton buttonCancel; + private JPanel panel; private JComboBox comboBoxAlgorithm; - public NoneDialog(Window parent, Logging logging, JWS jws) { - super(parent, logging, "none_attack_dialog_title", jws); - - configureUI(contentPane, buttonOK, buttonCancel); + public NoneOperation() { + super("none_attack_dialog_title"); comboBoxAlgorithm.setModel(new DefaultComboBoxModel<>(NONE_ALGORITHM_VALUES)); comboBoxAlgorithm.setSelectedIndex(0); + + add(panel, BorderLayout.CENTER); } @Override - JWS performOperation() { + public JWS performOperation(JWS originalJwt) { String selectedAlgorithm = (String) comboBoxAlgorithm.getSelectedItem(); - return Attacks.noneSigning(jwt, selectedAlgorithm); + return Attacks.noneSigning(originalJwt, selectedAlgorithm); } } diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/Operation.java b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/Operation.java new file mode 100644 index 0000000..c3869b3 --- /dev/null +++ b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/Operation.java @@ -0,0 +1,35 @@ +/* + +Copyright 2025 Dolph Flynn + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package com.blackberry.jwteditor.view.dialog.operations; + +import javax.swing.*; +import java.awt.*; + +public interface Operation { + T performOperation(U originalJwt) throws Exception; + + JPanel configPanel(); + + String titleResourceId(); + + Dimension dimension(); + + default String operationFailedResourceId() { + return "error_title_unable_to_perform_operation"; + } +} diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/NoneDialog.form b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/OperationDialog.form similarity index 73% rename from src/main/java/com/blackberry/jwteditor/view/dialog/operations/NoneDialog.form rename to src/main/java/com/blackberry/jwteditor/view/dialog/operations/OperationDialog.form index c721d4e..3bd49ea 100644 --- a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/NoneDialog.form +++ b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/OperationDialog.form @@ -1,5 +1,5 @@ -
+ @@ -65,33 +65,13 @@ - - + - + - - - - - - - - - - - - - - - - - - - - + diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/OperationDialog.java b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/OperationDialog.java index 56a64cb..aa0cdf1 100644 --- a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/OperationDialog.java +++ b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/OperationDialog.java @@ -25,38 +25,36 @@ import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import static com.blackberry.jwteditor.view.dialog.operations.OperationPanel.VALIDITY_EVENT; import static java.awt.Dialog.ModalityType.APPLICATION_MODAL; import static javax.swing.JOptionPane.WARNING_MESSAGE; -public abstract class OperationDialog extends JDialog { +public class OperationDialog extends JDialog { private final String errorTitleOperationFailed; private final Logging logging; + private final Operation operation; + private final U originalJwt; + private final JPanel panel; + private final PropertyChangeListener propertyChangeListener; - T jwt; + private JPanel contentPane; + private JPanel mainPanel; + private JButton buttonOK; + private JButton buttonCancel; - OperationDialog(Window parent, Logging logging, String titleResourceId, T jwt) { - this(parent, logging, titleResourceId, jwt, "error_title_unable_to_perform_operation"); - } + private T jwt; - OperationDialog(Window parent, Logging logging, String titleResourceId, T jwt, String errorTitleOperationFailed) { - super(parent, Utils.getResourceString(titleResourceId), APPLICATION_MODAL); + public OperationDialog(Window parent, Logging logging, Operation operation, U jwt) { + super(parent, Utils.getResourceString(operation.titleResourceId()), APPLICATION_MODAL); this.logging = logging; - this.jwt = jwt; - this.errorTitleOperationFailed = errorTitleOperationFailed; - - setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); - - addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent e) { - onCancel(); - } - }); - } + this.operation = operation; + this.originalJwt = jwt; + this.errorTitleOperationFailed = operation.operationFailedResourceId(); - void configureUI(JPanel contentPane, JButton buttonOK, JButton buttonCancel) { setContentPane(contentPane); getRootPane().setDefaultButton(buttonOK); @@ -69,9 +67,24 @@ void configureUI(JPanel contentPane, JButton buttonOK, JButton buttonCancel) { KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ); - } - abstract T performOperation() throws Exception; + setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); + + setMinimumSize(operation.dimension()); + setPreferredSize(operation.dimension()); + panel = operation.configPanel(); + propertyChangeListener = new ValidityWatcher(); + mainPanel.add(panel); + + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + onCancel(); + } + }); + + panel.addPropertyChangeListener(VALIDITY_EVENT, propertyChangeListener); + } public T getJWT() { return jwt; @@ -85,22 +98,36 @@ public void display() { void onOK() { try { - jwt = performOperation(); + jwt = operation.performOperation(originalJwt); } catch (Exception e) { String title = Utils.getResourceString(errorTitleOperationFailed); logging.logToError(title, e); - JOptionPane.showMessageDialog(this, + JOptionPane.showMessageDialog( + this, e.getMessage(), title, WARNING_MESSAGE ); jwt = null; } finally { - dispose(); + onCancel(); } } void onCancel() { dispose(); + panel.removePropertyChangeListener(VALIDITY_EVENT, propertyChangeListener); + } + + private class ValidityWatcher implements PropertyChangeListener { + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (!evt.getPropertyName().equals(VALIDITY_EVENT) || !(evt.getNewValue() instanceof Boolean)) { + return; + } + + boolean isValid = (Boolean) evt.getNewValue(); + buttonOK.setEnabled(isValid); + } } } diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/OperationPanel.java b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/OperationPanel.java new file mode 100644 index 0000000..2518f52 --- /dev/null +++ b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/OperationPanel.java @@ -0,0 +1,56 @@ +/* + +Copyright 2025 Dolph Flynn + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package com.blackberry.jwteditor.view.dialog.operations; + +import javax.swing.*; +import java.awt.*; + +abstract class OperationPanel extends JPanel implements Operation { + protected static final String VALIDITY_EVENT = "validityEvent"; + + private static final Dimension DEFAULT_DIMENSION = new Dimension(324, 184); + + private final Dimension dimension; + private final String titleResourceId; + + OperationPanel(String titleResourceId) { + this(titleResourceId, DEFAULT_DIMENSION); + } + + OperationPanel(String titleResourceId, Dimension dimension) { + super(new BorderLayout()); + + this.titleResourceId = titleResourceId; + this.dimension = dimension; + } + + @Override + public JPanel configPanel() { + return this; + } + + @Override + public String titleResourceId() { + return titleResourceId; + } + + @Override + public Dimension dimension() { + return dimension; + } +} diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/PsychicSignatureDialog.form b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/PsychicSignatureDialog.form deleted file mode 100644 index 3381724..0000000 --- a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/PsychicSignatureDialog.form +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/PsychicSignaturePanel.form b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/PsychicSignaturePanel.form new file mode 100644 index 0000000..e30bf2b --- /dev/null +++ b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/PsychicSignaturePanel.form @@ -0,0 +1,33 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/PsychicSignatureDialog.java b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/PsychicSignaturePanel.java similarity index 69% rename from src/main/java/com/blackberry/jwteditor/view/dialog/operations/PsychicSignatureDialog.java rename to src/main/java/com/blackberry/jwteditor/view/dialog/operations/PsychicSignaturePanel.java index 623bb8a..9632be1 100644 --- a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/PsychicSignatureDialog.java +++ b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/PsychicSignaturePanel.java @@ -17,36 +17,33 @@ package com.blackberry.jwteditor.view.dialog.operations; -import burp.api.montoya.logging.Logging; import com.blackberry.jwteditor.model.jose.JWS; import com.blackberry.jwteditor.operations.Attacks; import com.nimbusds.jose.JWSAlgorithm; import javax.swing.*; -import java.awt.*; import static com.nimbusds.jose.JWSAlgorithm.*; +import static java.awt.BorderLayout.CENTER; -public class PsychicSignatureDialog extends OperationDialog { +public class PsychicSignaturePanel extends OperationPanel { private static final JWSAlgorithm[] ALGORITHMS = {ES256, ES384, ES512}; - private JPanel contentPane; - private JButton buttonOK; - private JButton buttonCancel; + private JPanel panel; private JComboBox comboBoxAlgorithm; - public PsychicSignatureDialog(Window parent, Logging logging, JWS jws) { - super(parent, logging, "psychic_signature_signing_dialog_title", jws); - - configureUI(contentPane, buttonOK, buttonCancel); + public PsychicSignaturePanel() { + super("psychic_signature_signing_dialog_title"); comboBoxAlgorithm.setModel(new DefaultComboBoxModel<>(ALGORITHMS)); comboBoxAlgorithm.setSelectedIndex(0); + + add(panel, CENTER); } @Override - JWS performOperation() { + public JWS performOperation(JWS originalJwt) throws Exception { JWSAlgorithm selectedAlgorithm = (JWSAlgorithm) comboBoxAlgorithm.getSelectedItem(); - return Attacks.signWithPsychicSignature(jwt, selectedAlgorithm); + return Attacks.signWithPsychicSignature(originalJwt, selectedAlgorithm); } } diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/SigningDialog.form b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/SigningDialog.form deleted file mode 100644 index 7f6cdfa..0000000 --- a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/SigningDialog.form +++ /dev/null @@ -1,158 +0,0 @@ - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/SigningPanel.form b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/SigningPanel.form new file mode 100644 index 0000000..1f41771 --- /dev/null +++ b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/SigningPanel.form @@ -0,0 +1,94 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/SigningDialog.java b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/SigningPanel.java similarity index 82% rename from src/main/java/com/blackberry/jwteditor/view/dialog/operations/SigningDialog.java rename to src/main/java/com/blackberry/jwteditor/view/dialog/operations/SigningPanel.java index beb5567..71b6ea4 100644 --- a/src/main/java/com/blackberry/jwteditor/view/dialog/operations/SigningDialog.java +++ b/src/main/java/com/blackberry/jwteditor/view/dialog/operations/SigningPanel.java @@ -18,7 +18,6 @@ package com.blackberry.jwteditor.view.dialog.operations; -import burp.api.montoya.logging.Logging; import com.blackberry.jwteditor.exceptions.SigningException; import com.blackberry.jwteditor.model.jose.JWS; import com.blackberry.jwteditor.model.jose.JWSFactory; @@ -34,11 +33,9 @@ import java.util.List; import static com.blackberry.jwteditor.model.jose.JWSFactory.SigningUpdateMode.*; +import static java.awt.BorderLayout.CENTER; -/** - * Sign and Attack > Embedded JWK dialog from the Editor tab - */ -public class SigningDialog extends OperationDialog { +public class SigningPanel extends OperationPanel { public enum Mode { NORMAL("sign_dialog_title", Signer.NORMAL), @@ -54,9 +51,7 @@ public enum Mode { } } - private JPanel contentPane; - private JButton buttonOK; - private JButton buttonCancel; + private JPanel panel; private JComboBox comboBoxSigningKey; private JComboBox comboBoxSigningAlgorithm; private JPanel panelOptions; @@ -67,19 +62,11 @@ public enum Mode { private final Mode mode; private final LastSigningKeys lastSigningKeys; - public SigningDialog( - Window parent, - Logging logging, - List signingKeys, - JWS jws, - Mode mode, - LastSigningKeys lastSigningKeys) { - super(parent, logging, mode.titleResourceId, jws, "error_title_unable_to_sign"); + public SigningPanel(List signingKeys, Mode mode, LastSigningKeys lastSigningKeys) { + super(mode.titleResourceId, new Dimension(500, 375)); this.mode = mode; this.lastSigningKeys = lastSigningKeys; - configureUI(contentPane, buttonOK, buttonCancel); - // Convert the signingKeys from a List to an Array Key[] signingKeysArray = new Key[signingKeys.size()]; signingKeys.toArray(signingKeysArray); @@ -92,7 +79,6 @@ public SigningDialog( Key selectedKey = (Key) comboBoxSigningKey.getSelectedItem(); //noinspection ConstantConditions comboBoxSigningAlgorithm.setModel(new DefaultComboBoxModel<>(selectedKey.getSigningAlgorithms())); - buttonOK.setEnabled(true); }); int lastUsedKeyIndex = lastSigningKeys.lastKeyFor(mode.signer).map(signingKeys::indexOf).orElse(-1); @@ -103,10 +89,12 @@ public SigningDialog( if (mode != Mode.NORMAL) { panelOptions.setVisible(false); } + + add(panel, CENTER); } @Override - JWS performOperation() throws SigningException, NoSuchFieldException, IllegalAccessException { + public JWS performOperation(JWS originalJwt) throws SigningException, NoSuchFieldException, IllegalAccessException { // Get the selected signing key and algorithm JWKKey selectedKey = (JWKKey) comboBoxSigningKey.getSelectedItem(); JWSAlgorithm selectedAlgorithm = (JWSAlgorithm) comboBoxSigningAlgorithm.getSelectedItem(); @@ -125,8 +113,13 @@ JWS performOperation() throws SigningException, NoSuchFieldException, IllegalAcc } return switch (mode) { - case NORMAL -> JWSFactory.sign(selectedKey, selectedAlgorithm, signingUpdateMode, jwt); - case EMBED_JWK -> Attacks.embeddedJWK(jwt, selectedKey, selectedAlgorithm); + case NORMAL -> JWSFactory.sign(selectedKey, selectedAlgorithm, signingUpdateMode, originalJwt); + case EMBED_JWK -> Attacks.embeddedJWK(originalJwt, selectedKey, selectedAlgorithm); }; } + + @Override + public String operationFailedResourceId() { + return "error_title_unable_to_sign"; + } }