From b1502f692a4901733498c50cf6118322a7193733 Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Wed, 28 Jun 2023 09:16:10 -0400 Subject: [PATCH 1/2] GP-3591 correct create function issue when entry point part of an existing function --- .../main/java/ghidra/app/cmd/function/CreateFunctionCmd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/cmd/function/CreateFunctionCmd.java b/Ghidra/Features/Base/src/main/java/ghidra/app/cmd/function/CreateFunctionCmd.java index 0ab818fc98..4d2dd15f2d 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/cmd/function/CreateFunctionCmd.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/cmd/function/CreateFunctionCmd.java @@ -331,7 +331,7 @@ public class CreateFunctionCmd extends BackgroundCommand { Map bodyChangeMap = new HashMap<>(); // If I ain't got nobody left after extracting overlapping functions - if (body.isEmpty()) { + if (body.isEmpty() || !body.contains(entry)) { // try subtracting this body from existing functions // need to compute a bodyChangeMap if affecting other functions // in case creation of this function fails From 899772973a9c65b4ead0b52b1c655499b8c30824 Mon Sep 17 00:00:00 2001 From: Dan <46821332+nsadeveloper789@users.noreply.github.com> Date: Thu, 29 Jun 2023 17:05:47 -0400 Subject: [PATCH 2/2] GP-3295: Add askPassword to GhidraScript API. --- .../Base/ghidra_scripts/AskScript.java | 5 ++ .../java/ghidra/app/script/GhidraScript.java | 57 +++++++++++++++++++ .../crypto/CachedPasswordProvider.java | 21 +++---- .../crypto/CmdLinePasswordProvider.java | 15 ++--- .../CryptoProviderSessionChildImpl.java | 5 +- .../gfilesystem/crypto/CryptoProviders.java | 11 ++-- .../gfilesystem/crypto/CryptoSession.java | 5 +- .../gfilesystem/crypto/PasswordProvider.java | 3 +- .../crypto/PopupGUIPasswordProvider.java | 13 +++-- .../crypto/CachedPasswordProviderTest.java | 5 +- .../crypto/CmdLinePasswordProviderTest.java | 9 +-- .../formats/sevenzip/SevenZipFileSystem.java | 9 ++- .../framework/generic/auth/Password.java} | 26 ++++----- 13 files changed, 127 insertions(+), 57 deletions(-) rename Ghidra/{Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/PasswordValue.java => Framework/Generic/src/main/java/ghidra/framework/generic/auth/Password.java} (76%) diff --git a/Ghidra/Features/Base/ghidra_scripts/AskScript.java b/Ghidra/Features/Base/ghidra_scripts/AskScript.java index 3fe0fddc6a..6c4d478cd1 100644 --- a/Ghidra/Features/Base/ghidra_scripts/AskScript.java +++ b/Ghidra/Features/Base/ghidra_scripts/AskScript.java @@ -23,6 +23,7 @@ import java.util.Arrays; import java.util.List; import ghidra.app.script.GhidraScript; +import ghidra.framework.generic.auth.Password; import ghidra.framework.model.DomainFile; import ghidra.framework.model.DomainFolder; import ghidra.program.model.address.Address; @@ -117,6 +118,10 @@ public class AskScript extends GhidraScript { boolean yesOrNo = askYesNo("yes or no", "is this a yes/no question?"); println("Yes or No? " + yesOrNo); + try (Password password = askPassword("Password", null)) { + println("Password has %d characters".formatted(password.getPasswordChars().length)); + // try-with-resources ensures buffer is zeroed out before garbage collected + } } catch (IllegalArgumentException iae) { Msg.warn(this, "Error during headless processing: " + iae.toString()); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/script/GhidraScript.java b/Ghidra/Features/Base/src/main/java/ghidra/app/script/GhidraScript.java index ee1ae2f703..4d8c6ecd34 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/script/GhidraScript.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/script/GhidraScript.java @@ -22,6 +22,7 @@ import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import docking.widgets.OptionDialog; +import docking.widgets.PasswordDialog; import docking.widgets.dialogs.MultiLineMessageDialog; import docking.widgets.filechooser.GhidraFileChooser; import docking.widgets.filechooser.GhidraFileChooserMode; @@ -47,6 +48,7 @@ import ghidra.framework.Application; import ghidra.framework.client.*; import ghidra.framework.cmd.BackgroundCommand; import ghidra.framework.cmd.Command; +import ghidra.framework.generic.auth.Password; import ghidra.framework.main.DataTreeDialog; import ghidra.framework.model.*; import ghidra.framework.options.OptionType; @@ -2977,6 +2979,61 @@ public abstract class GhidraScript extends FlatProgramAPI { return choice; } + /** + * Returns a {@link Password}, using the String input parameters for guidance. This method can + * only be used in headed mode. + *

+ * In the GUI environment, this method displays a password popup dialog that prompts the user + * for a secret, usually a password or other credential. There is no pre-population of the + * input. If the user cancels the dialog, it is immediately disposed, and any input to that + * dialog is cleared from memory. If the user completes the dialog, then the secret is returned + * in a wrapped buffer. The buffer can be cleared by calling {@link Secret#close()}; however, it + * is meant to be used in a {@code try-with-resources} block. The pattern does not guarantee + * protection of the secret, but it will help you avoid some typical pitfalls: + * + *

+	 * String user = askString("Login", "Username:");
+	 * Project project;
+	 * try (Secret secret = askSecret("Login", "Password:")) {
+	 * 	if (secret == null) {
+	 * 		return; // User cancelled
+	 * 	}
+	 * 	project = doLoginAndOpenProject(user, secret.buffer());
+	 * }
+	 * 
+ * + * The buffer will be zero-filled upon leaving the {@code try-with-resources} block. If, in the + * sample, the {@code doLoginAndOpenProject} method or any part of its implementation needs to + * retain the secret, it must make a copy. It is then the implementation's responsibility to + * protect its copy. + * + * @param title the title of the dialog + * @param serverType the server type, i.e., its protocol or URL schema + * @param serverName the host name of the server + * @param prompt the prompt to the left of the input field, or null to display "Password:" + * @return the password + * @throws CancelledException if the user cancels + * @throws ImproperUseException if in headless mode + */ + public Password askPassword(String title, String prompt) throws CancelledException { + if (isRunningHeadless()) { + throw new ImproperUseException( + "The askPassword() method can only be used when running headed Ghidra."); + } + PasswordDialog dialog = + new PasswordDialog(title, null, null, prompt, null, null); + try { + state.getTool().showDialog(dialog); + if (!dialog.okWasPressed()) { + throw new CancelledException("User cancelled password prompt."); + } + return Password.wrap(dialog.getPassword()); + } + finally { + dialog.dispose(); + } + } + /** * Parses a choice from a string. * diff --git a/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CachedPasswordProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CachedPasswordProvider.java index 7ce6e04778..1838e5ce0f 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CachedPasswordProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CachedPasswordProvider.java @@ -18,6 +18,7 @@ package ghidra.formats.gfilesystem.crypto; import java.util.*; import ghidra.formats.gfilesystem.FSRL; +import ghidra.framework.generic.auth.Password; /** * Caches passwords used to unlock a file. @@ -34,10 +35,10 @@ public class CachedPasswordProvider implements PasswordProvider { * Adds a password / file combo to the cache. * * @param fsrl {@link FSRL} file - * @param password password to unlock the file. Specified PasswordValue is + * @param password password to unlock the file. Specified {@link Password} is * only copied, clearing is still callers responsibility */ - public synchronized void addPassword(FSRL fsrl, PasswordValue password) { + public synchronized void addPassword(FSRL fsrl, Password password) { CryptoRec rec = new CryptoRec(); rec.fsrl = fsrl; rec.value = password.clone(); @@ -95,7 +96,7 @@ public class CachedPasswordProvider implements PasswordProvider { } @Override - public synchronized Iterator getPasswordsFor(FSRL fsrl, String prompt, + public synchronized Iterator getPasswordsFor(FSRL fsrl, String prompt, Session session) { Set uniqueFoundRecs = new LinkedHashSet<>(); uniqueFoundRecs.addAll(values.getOrDefault(fsrl.toString(), Collections.emptyList())); @@ -105,7 +106,7 @@ public class CachedPasswordProvider implements PasswordProvider { uniqueFoundRecs.addAll(values.getOrDefault(fsrl.getMD5(), Collections.emptyList())); } - List results = new ArrayList<>(); + List results = new ArrayList<>(); for (CryptoRec rec : uniqueFoundRecs) { results.add(rec.value); } @@ -117,13 +118,13 @@ public class CachedPasswordProvider implements PasswordProvider { private static class CryptoRec { FSRL fsrl; - PasswordValue value; + Password value; } - private class CloningPasswordIterator implements Iterator { - Iterator delegate; + private class CloningPasswordIterator implements Iterator { + Iterator delegate; - CloningPasswordIterator(Iterator it) { + CloningPasswordIterator(Iterator it) { this.delegate = it; } @@ -133,8 +134,8 @@ public class CachedPasswordProvider implements PasswordProvider { } @Override - public PasswordValue next() { - PasswordValue result = delegate.next(); + public Password next() { + Password result = delegate.next(); return result.clone(); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CmdLinePasswordProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CmdLinePasswordProvider.java index 87e65872c8..cf34ed6ff1 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CmdLinePasswordProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CmdLinePasswordProvider.java @@ -23,6 +23,7 @@ import java.util.*; import org.apache.commons.io.FilenameUtils; import ghidra.formats.gfilesystem.FSRL; +import ghidra.framework.generic.auth.Password; import ghidra.util.Msg; import utilities.util.FileUtilities; @@ -51,7 +52,7 @@ public class CmdLinePasswordProvider implements PasswordProvider { public static final String CMDLINE_PASSWORD_PROVIDER_PROPERTY_NAME = "filesystem.passwords"; @Override - public Iterator getPasswordsFor(FSRL fsrl, String prompt, Session session) { + public Iterator getPasswordsFor(FSRL fsrl, String prompt, Session session) { String propertyValue = System.getProperty(CMDLINE_PASSWORD_PROVIDER_PROPERTY_NAME); if (propertyValue == null) { return Collections.emptyIterator(); @@ -60,8 +61,8 @@ public class CmdLinePasswordProvider implements PasswordProvider { return load(passwordFile, fsrl).iterator(); } - private List load(File f, FSRL fsrl) { - List result = new ArrayList<>(); + private List load(File f, FSRL fsrl) { + List result = new ArrayList<>(); try { for (String s : FileUtilities.getLines(f)) { String[] fields = s.split("\t"); @@ -73,7 +74,7 @@ public class CmdLinePasswordProvider implements PasswordProvider { if (fileIdStr == null) { // no file identifier string, always matches - result.add(PasswordValue.wrap(password.toCharArray())); + result.add(Password.wrap(password.toCharArray())); continue; } @@ -82,7 +83,7 @@ public class CmdLinePasswordProvider implements PasswordProvider { FSRL currentFSRL = FSRL.fromString(fileIdStr); // was a fsrl string, only test as fsrl if (currentFSRL.isEquivalent(fsrl)) { - result.add(PasswordValue.wrap(password.toCharArray())); + result.add(Password.wrap(password.toCharArray())); } continue; } @@ -93,14 +94,14 @@ public class CmdLinePasswordProvider implements PasswordProvider { if (!nameOnly.equals(fileIdStr)) { // was a path str, only test against path component if (fileIdStr.equals(fsrl.getPath())) { - result.add(PasswordValue.wrap(password.toCharArray())); + result.add(Password.wrap(password.toCharArray())); } continue; } // was a plain name, only test against name component if (nameOnly.equals(fsrl.getName())) { - result.add(PasswordValue.wrap(password.toCharArray())); + result.add(Password.wrap(password.toCharArray())); continue; } // no matches, try next line diff --git a/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CryptoProviderSessionChildImpl.java b/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CryptoProviderSessionChildImpl.java index 13a55dea4c..e1b57636ab 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CryptoProviderSessionChildImpl.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CryptoProviderSessionChildImpl.java @@ -18,6 +18,7 @@ package ghidra.formats.gfilesystem.crypto; import java.util.Iterator; import ghidra.formats.gfilesystem.FSRL; +import ghidra.framework.generic.auth.Password; /** * A stub implementation of CryptoSession that relies on a parent instance. @@ -41,12 +42,12 @@ public class CryptoProviderSessionChildImpl implements CryptoSession { } @Override - public Iterator getPasswordsFor(FSRL fsrl, String prompt) { + public Iterator getPasswordsFor(FSRL fsrl, String prompt) { return parentSession.getPasswordsFor(fsrl, prompt); } @Override - public void addSuccessfulPassword(FSRL fsrl, PasswordValue password) { + public void addSuccessfulPassword(FSRL fsrl, Password password) { parentSession.addSuccessfulPassword(fsrl, password); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CryptoProviders.java b/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CryptoProviders.java index 345510d300..8ddd0afdb5 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CryptoProviders.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CryptoProviders.java @@ -21,6 +21,7 @@ import java.util.function.Supplier; import java.util.stream.Collectors; import ghidra.formats.gfilesystem.FSRL; +import ghidra.framework.generic.auth.Password; /** * Registry of {@link CryptoProvider crypto providers} and {@link #newSession() session creator}. @@ -122,7 +123,7 @@ public class CryptoProviders { } @Override - public void addSuccessfulPassword(FSRL fsrl, PasswordValue password) { + public void addSuccessfulPassword(FSRL fsrl, Password password) { cachedCryptoProvider.addPassword(fsrl, password); } @@ -159,16 +160,16 @@ public class CryptoProviders { } @Override - public Iterator getPasswordsFor(FSRL fsrl, String prompt) { + public Iterator getPasswordsFor(FSRL fsrl, String prompt) { return new PasswordIterator(providers, fsrl, prompt); } /** * Union iterator of all password providers */ - class PasswordIterator implements Iterator { + class PasswordIterator implements Iterator { private List providers; - private Iterator currentIt; + private Iterator currentIt; private String prompt; private FSRL fsrl; @@ -194,7 +195,7 @@ public class CryptoProviders { } @Override - public PasswordValue next() { + public Password next() { return currentIt.next(); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CryptoSession.java b/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CryptoSession.java index c5ca55c1fa..2e33c7cd88 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CryptoSession.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/CryptoSession.java @@ -19,6 +19,7 @@ import java.io.Closeable; import java.util.Iterator; import ghidra.formats.gfilesystem.FSRL; +import ghidra.framework.generic.auth.Password; /** * Provides the caller with the ability to perform crypto querying operations @@ -42,7 +43,7 @@ public interface CryptoSession extends Closeable { * @param prompt optional prompt that may be displayed to a user * @return {@link Iterator} of possible passwords */ - Iterator getPasswordsFor(FSRL fsrl, String prompt); + Iterator getPasswordsFor(FSRL fsrl, String prompt); /** * Pushes a known good password into a cache for later re-retrieval. @@ -50,7 +51,7 @@ public interface CryptoSession extends Closeable { * @param fsrl {@link FSRL} path to the file that was unlocked by the password * @param password the good password */ - void addSuccessfulPassword(FSRL fsrl, PasswordValue password); + void addSuccessfulPassword(FSRL fsrl, Password password); /** * Returns true if this session has been closed. diff --git a/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/PasswordProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/PasswordProvider.java index ec08de8dc4..bbfbf10bcf 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/PasswordProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/PasswordProvider.java @@ -18,6 +18,7 @@ package ghidra.formats.gfilesystem.crypto; import java.util.Iterator; import ghidra.formats.gfilesystem.FSRL; +import ghidra.framework.generic.auth.Password; /** * Instances of this interface provide passwords to decrypt files. @@ -47,5 +48,5 @@ public interface PasswordProvider extends CryptoProvider { * related queries * @return {@link Iterator} of possible passwords */ - Iterator getPasswordsFor(FSRL fsrl, String prompt, Session session); + Iterator getPasswordsFor(FSRL fsrl, String prompt, Session session); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/PopupGUIPasswordProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/PopupGUIPasswordProvider.java index a8939b6e08..cbcd5dd180 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/PopupGUIPasswordProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/PopupGUIPasswordProvider.java @@ -22,6 +22,7 @@ import java.awt.Component; import docking.DockingWindowManager; import ghidra.formats.gfilesystem.FSRL; import ghidra.formats.gfilesystem.crypto.PasswordDialog.RESULT_STATE; +import ghidra.framework.generic.auth.Password; /** * Pops up up a GUI dialog prompting the user to enter a password for the specified file. @@ -36,7 +37,7 @@ import ghidra.formats.gfilesystem.crypto.PasswordDialog.RESULT_STATE; public class PopupGUIPasswordProvider implements PasswordProvider { @Override - public Iterator getPasswordsFor(FSRL fsrl, String prompt, Session session) { + public Iterator getPasswordsFor(FSRL fsrl, String prompt, Session session) { return new PasswordIterator(session, fsrl, prompt); } @@ -44,11 +45,11 @@ public class PopupGUIPasswordProvider implements PasswordProvider { boolean cancelAll; } - class PasswordIterator implements Iterator { + class PasswordIterator implements Iterator { private SessionState sessionState; private FSRL fsrl; private boolean cancelled; - private PasswordValue password; + private Password password; private String prompt; private int tryCount; @@ -73,7 +74,7 @@ public class PopupGUIPasswordProvider implements PasswordProvider { DockingWindowManager.showDialog(rootFrame, pwdDialog); cancelled = pwdDialog.resultState == RESULT_STATE.CANCELED; - password = cancelled ? null : PasswordValue.wrap(pwdDialog.passwordField.getPassword()); + password = cancelled ? null : Password.wrap(pwdDialog.passwordField.getPassword()); sessionState.cancelAll |= cancelled && pwdDialog.cancelledAll; pwdDialog.dispose(); } @@ -90,8 +91,8 @@ public class PopupGUIPasswordProvider implements PasswordProvider { } @Override - public PasswordValue next() { - PasswordValue result = password; + public Password next() { + Password result = password; password = null; return result; } diff --git a/Ghidra/Features/Base/src/test/java/ghidra/formats/gfilesystem/crypto/CachedPasswordProviderTest.java b/Ghidra/Features/Base/src/test/java/ghidra/formats/gfilesystem/crypto/CachedPasswordProviderTest.java index dd4248f357..18495a9c48 100644 --- a/Ghidra/Features/Base/src/test/java/ghidra/formats/gfilesystem/crypto/CachedPasswordProviderTest.java +++ b/Ghidra/Features/Base/src/test/java/ghidra/formats/gfilesystem/crypto/CachedPasswordProviderTest.java @@ -25,12 +25,13 @@ import org.junit.*; import generic.test.AbstractGenericTest; import ghidra.formats.gfilesystem.FSRL; +import ghidra.framework.generic.auth.Password; import util.CollectionUtils; public class CachedPasswordProviderTest extends AbstractGenericTest { private CryptoProviders cryptoProviders = CryptoProviders.getInstance(); - private List getPasswords(CryptoSession cryptoSession, String fsrlStr) + private List getPasswords(CryptoSession cryptoSession, String fsrlStr) throws MalformedURLException { return CollectionUtils .asList(cryptoSession.getPasswordsFor(FSRL.fromString(fsrlStr), "badbeef")); @@ -60,7 +61,7 @@ public class CachedPasswordProviderTest extends AbstractGenericTest { // shouldn't match passwords: file1.txt to file2.txt cryptoSession.addSuccessfulPassword(FSRL.fromString("file:///fake/path/file1.txt"), - PasswordValue.wrap("password_for_file2.txt".toCharArray())); + Password.wrap("password_for_file2.txt".toCharArray())); assertEquals(1, getPasswords(cryptoSession, "file:///fake/path/file1.txt").size()); assertEquals(0, getPasswords(cryptoSession, "file:///fake/path/file2.txt").size()); diff --git a/Ghidra/Features/Base/src/test/java/ghidra/formats/gfilesystem/crypto/CmdLinePasswordProviderTest.java b/Ghidra/Features/Base/src/test/java/ghidra/formats/gfilesystem/crypto/CmdLinePasswordProviderTest.java index c32c01fc69..28ddeb908c 100644 --- a/Ghidra/Features/Base/src/test/java/ghidra/formats/gfilesystem/crypto/CmdLinePasswordProviderTest.java +++ b/Ghidra/Features/Base/src/test/java/ghidra/formats/gfilesystem/crypto/CmdLinePasswordProviderTest.java @@ -26,6 +26,7 @@ import org.junit.*; import generic.test.AbstractGenericTest; import ghidra.formats.gfilesystem.FSRL; +import ghidra.framework.generic.auth.Password; import util.CollectionUtils; import utilities.util.FileUtilities; @@ -33,7 +34,7 @@ public class CmdLinePasswordProviderTest extends AbstractGenericTest { private CryptoProviders cryptoProviders = CryptoProviders.getInstance(); - private List getPasswords(CryptoSession cryptoSession, String fsrlStr) + private List getPasswords(CryptoSession cryptoSession, String fsrlStr) throws MalformedURLException { return CollectionUtils .asList(cryptoSession.getPasswordsFor(FSRL.fromString(fsrlStr), "badbeef")); @@ -76,7 +77,7 @@ public class CmdLinePasswordProviderTest extends AbstractGenericTest { System.setProperty(CmdLinePasswordProvider.CMDLINE_PASSWORD_PROVIDER_PROPERTY_NAME, pwdFile.getPath()); try (CryptoSession cryptoSession = cryptoProviders.newSession()) { - List pwdList = + List pwdList = getPasswords(cryptoSession, "file:///fake/path/file1.txt"); assertEquals(2, pwdList.size()); @@ -93,12 +94,12 @@ public class CmdLinePasswordProviderTest extends AbstractGenericTest { System.setProperty(CmdLinePasswordProvider.CMDLINE_PASSWORD_PROVIDER_PROPERTY_NAME, pwdFile.getPath()); try (CryptoSession cryptoSession = cryptoProviders.newSession()) { - List pwdList = + List pwdList = getPasswords(cryptoSession, "file:///not_matching/path/file1.txt"); assertEquals(0, pwdList.size()); - List list2 = getPasswords(cryptoSession, "file:///path/to/a/file1.txt"); + List list2 = getPasswords(cryptoSession, "file:///path/to/a/file1.txt"); assertEquals(1, list2.size()); } } diff --git a/Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/sevenzip/SevenZipFileSystem.java b/Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/sevenzip/SevenZipFileSystem.java index 0064f236dc..259afd7064 100644 --- a/Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/sevenzip/SevenZipFileSystem.java +++ b/Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/sevenzip/SevenZipFileSystem.java @@ -18,10 +18,9 @@ package ghidra.file.formats.sevenzip; import static ghidra.formats.gfilesystem.fileinfo.FileAttributeType.*; -import java.util.*; - import java.io.Closeable; import java.io.IOException; +import java.util.*; import org.apache.commons.io.FilenameUtils; @@ -31,9 +30,9 @@ import ghidra.formats.gfilesystem.FileCache.FileCacheEntry; import ghidra.formats.gfilesystem.FileCache.FileCacheEntryBuilder; import ghidra.formats.gfilesystem.annotations.FileSystemInfo; import ghidra.formats.gfilesystem.crypto.CryptoSession; -import ghidra.formats.gfilesystem.crypto.PasswordValue; import ghidra.formats.gfilesystem.fileinfo.FileAttributes; import ghidra.formats.gfilesystem.fileinfo.FileType; +import ghidra.framework.generic.auth.Password; import ghidra.util.Msg; import ghidra.util.exception.CancelledException; import ghidra.util.exception.CryptoException; @@ -141,9 +140,9 @@ public class SevenZipFileSystem implements GFileSystem { String prompt = passwords.isEmpty() ? fsrl.getContainer().getName() : String.format("%s in %s", file.getName(), fsrl.getContainer().getName()); - for (Iterator pwIt = + for (Iterator pwIt = cryptoSession.getPasswordsFor(fsrl.getContainer(), prompt); pwIt.hasNext();) { - try (PasswordValue passwordValue = pwIt.next()) { + try (Password passwordValue = pwIt.next()) { monitor.setMessage("Testing password for " + file.getName()); String password = String.valueOf(passwordValue.getPasswordChars()); // we are forced to use strings by 7zip's api diff --git a/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/PasswordValue.java b/Ghidra/Framework/Generic/src/main/java/ghidra/framework/generic/auth/Password.java similarity index 76% rename from Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/PasswordValue.java rename to Ghidra/Framework/Generic/src/main/java/ghidra/framework/generic/auth/Password.java index a1cfadce88..aa1b661d0c 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/crypto/PasswordValue.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/framework/generic/auth/Password.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ghidra.formats.gfilesystem.crypto; +package ghidra.framework.generic.auth; import java.io.Closeable; import java.util.Arrays; @@ -23,44 +23,44 @@ import java.util.Arrays; *

* {@link #close() Closing} an instance will clear the characters of the char array. */ -public class PasswordValue implements Closeable { +public class Password implements Closeable { /** - * Creates a new PasswordValue using a copy the specified characters. + * Creates a new {@code Password} using a copy the specified characters. * * @param password password characters - * @return new PasswordValue instance + * @return new {@code Password} instance */ - public static PasswordValue copyOf(char[] password) { - PasswordValue result = new PasswordValue(); + public static Password copyOf(char[] password) { + Password result = new Password(); result.password = new char[password.length]; System.arraycopy(password, 0, result.password, 0, password.length); return result; } /** - * Creates a new PasswordValue by wrapping the specified character array. + * Creates a new {@code Password} by wrapping the specified character array. *

* The new instance will take ownership of the char array, and * clear it when the instance is {@link #close() closed}. * * @param password password characters - * @return new PasswordValue instance + * @return new {@code Password} instance */ - public static PasswordValue wrap(char[] password) { - PasswordValue result = new PasswordValue(); + public static Password wrap(char[] password) { + Password result = new Password(); result.password = password; return result; } private char[] password; - private PasswordValue() { + private Password() { // empty } @Override - public PasswordValue clone() { + public Password clone() { return copyOf(password); } @@ -101,7 +101,7 @@ public class PasswordValue implements Closeable { if (getClass() != obj.getClass()) { return false; } - PasswordValue other = (PasswordValue) obj; + Password other = (Password) obj; return Arrays.equals(password, other.password); }