Merge changes I8d60efc5,Ie291ea87

* changes:
  SignApk - change signature of readPassword to use char[] instead
  SignApk - use existing password mechanism when using keystore
This commit is contained in:
Treehugger Robot
2021-12-22 06:23:19 +00:00
committed by Gerrit Code Review

View File

@@ -204,26 +204,23 @@ class SignApk {
* If a console doesn't exist, reads the password from stdin * If a console doesn't exist, reads the password from stdin
* If a console exists, reads the password from console and returns it as a string. * If a console exists, reads the password from console and returns it as a string.
* *
* @param keyFile The file containing the private key. Used to prompt the user. * @param keyFileName Name of the file containing the private key. Used to prompt the user.
*/ */
private static String readPassword(File keyFile) { private static char[] readPassword(String keyFileName) {
Console console; Console console;
char[] pwd;
if ((console = System.console()) == null) { if ((console = System.console()) == null) {
System.out.print("Enter password for " + keyFile + " (password will not be hidden): "); System.out.print(
"Enter password for " + keyFileName + " (password will not be hidden): ");
System.out.flush(); System.out.flush();
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
try { try {
return stdin.readLine(); String result = stdin.readLine();
return result == null ? null : result.toCharArray();
} catch (IOException ex) { } catch (IOException ex) {
return null; return null;
} }
} else { } else {
if ((pwd = console.readPassword("[%s]", "Enter password for " + keyFile)) != null) { return console.readPassword("[%s]", "Enter password for " + keyFileName);
return String.valueOf(pwd);
} else {
return null;
}
} }
} }
@@ -246,11 +243,8 @@ class SignApk {
return null; return null;
} }
char[] password = readPassword(keyFile).toCharArray();
SecretKeyFactory skFactory = SecretKeyFactory.getInstance(epkInfo.getAlgName()); SecretKeyFactory skFactory = SecretKeyFactory.getInstance(epkInfo.getAlgName());
Key key = skFactory.generateSecret(new PBEKeySpec(password)); Key key = skFactory.generateSecret(new PBEKeySpec(readPassword(keyFile.getPath())));
Cipher cipher = Cipher.getInstance(epkInfo.getAlgName()); Cipher cipher = Cipher.getInstance(epkInfo.getAlgName());
cipher.init(Cipher.DECRYPT_MODE, key, epkInfo.getAlgParameters()); cipher.init(Cipher.DECRYPT_MODE, key, epkInfo.getAlgParameters());
@@ -305,10 +299,10 @@ class SignApk {
/** Get a PKCS#11 private key from keyStore */ /** Get a PKCS#11 private key from keyStore */
private static PrivateKey loadPrivateKeyFromKeyStore( private static PrivateKey loadPrivateKeyFromKeyStore(
final KeyStore keyStore, final String keyName, final String password) final KeyStore keyStore, final String keyName)
throws CertificateException, KeyStoreException, NoSuchAlgorithmException, throws CertificateException, KeyStoreException, NoSuchAlgorithmException,
UnrecoverableKeyException, UnrecoverableEntryException { UnrecoverableKeyException, UnrecoverableEntryException {
final Key key = keyStore.getKey(keyName, password == null ? null : password.toCharArray()); final Key key = keyStore.getKey(keyName, readPassword(keyName));
final PrivateKeyEntry privateKeyEntry = (PrivateKeyEntry) keyStore.getEntry(keyName, null); final PrivateKeyEntry privateKeyEntry = (PrivateKeyEntry) keyStore.getEntry(keyName, null);
if (privateKeyEntry == null) { if (privateKeyEntry == null) {
throw new Error( throw new Error(
@@ -1201,10 +1195,8 @@ class SignApk {
if (keyStore == null) { if (keyStore == null) {
privateKey[i] = readPrivateKey(new File(args[argNum])); privateKey[i] = readPrivateKey(new File(args[argNum]));
} else { } else {
String[] splits = args[argNum].split(":", 2); final String keyAlias = args[argNum];
final String keyAlias = splits[0]; privateKey[i] = loadPrivateKeyFromKeyStore(keyStore, keyAlias);
final String password = splits.length > 1 ? splits[1] : null;
privateKey[i] = loadPrivateKeyFromKeyStore(keyStore, keyAlias, password);
} }
} }
inputJar = new JarFile(new File(inputFilename), false); // Don't verify. inputJar = new JarFile(new File(inputFilename), false); // Don't verify.