diff --git a/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/ArmorTest.java b/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/ArmorCmdTest.java similarity index 99% rename from pgpainless-cli/src/test/java/org/pgpainless/cli/commands/ArmorTest.java rename to pgpainless-cli/src/test/java/org/pgpainless/cli/commands/ArmorCmdTest.java index c4644319..711796e6 100644 --- a/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/ArmorTest.java +++ b/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/ArmorCmdTest.java @@ -25,7 +25,7 @@ import org.junit.jupiter.api.Test; import org.pgpainless.PGPainless; import org.pgpainless.cli.PGPainlessCLI; -public class ArmorTest { +public class ArmorCmdTest { private static PrintStream originalSout; diff --git a/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/DearmorTest.java b/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/DearmorCmdTest.java similarity index 99% rename from pgpainless-cli/src/test/java/org/pgpainless/cli/commands/DearmorTest.java rename to pgpainless-cli/src/test/java/org/pgpainless/cli/commands/DearmorCmdTest.java index 4dc43822..a49f4db1 100644 --- a/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/DearmorTest.java +++ b/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/DearmorCmdTest.java @@ -25,7 +25,7 @@ import org.junit.jupiter.api.Test; import org.pgpainless.PGPainless; import org.pgpainless.cli.PGPainlessCLI; -public class DearmorTest { +public class DearmorCmdTest { private PrintStream originalSout; diff --git a/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/ExtractCertTest.java b/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/ExtractCertCmdTest.java similarity index 98% rename from pgpainless-cli/src/test/java/org/pgpainless/cli/commands/ExtractCertTest.java rename to pgpainless-cli/src/test/java/org/pgpainless/cli/commands/ExtractCertCmdTest.java index 6f746445..1d20fb0e 100644 --- a/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/ExtractCertTest.java +++ b/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/ExtractCertCmdTest.java @@ -23,7 +23,7 @@ import org.pgpainless.PGPainless; import org.pgpainless.cli.PGPainlessCLI; import org.pgpainless.key.info.KeyRingInfo; -public class ExtractCertTest { +public class ExtractCertCmdTest { @Test @FailOnSystemExit diff --git a/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/GenerateCertCmdTest.java b/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/GenerateCertCmdTest.java new file mode 100644 index 00000000..8534decb --- /dev/null +++ b/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/GenerateCertCmdTest.java @@ -0,0 +1,114 @@ +// SPDX-FileCopyrightText: 2021 Paul Schaub +// +// SPDX-License-Identifier: Apache-2.0 + +package org.pgpainless.cli.commands; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.pgpainless.cli.TestUtils.ARMOR_PRIVATE_KEY_HEADER_BYTES; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; + +import com.ginsberg.junit.exit.FailOnSystemExit; +import org.bouncycastle.openpgp.PGPException; +import org.bouncycastle.openpgp.PGPSecretKey; +import org.bouncycastle.openpgp.PGPSecretKeyRing; +import org.bouncycastle.openpgp.operator.PBESecretKeyDecryptor; +import org.junit.jupiter.api.Test; +import org.pgpainless.PGPainless; +import org.pgpainless.cli.PGPainlessCLI; +import org.pgpainless.key.info.KeyInfo; +import org.pgpainless.key.info.KeyRingInfo; +import org.pgpainless.key.protection.UnlockSecretKey; +import org.pgpainless.util.Passphrase; + +public class GenerateCertCmdTest { + + @Test + @FailOnSystemExit + public void testKeyGeneration() throws IOException, PGPException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + System.setOut(new PrintStream(out)); + PGPainlessCLI.execute("generate-key", "--armor", "Juliet Capulet "); + + PGPSecretKeyRing secretKeys = PGPainless.readKeyRing().secretKeyRing(out.toByteArray()); + KeyRingInfo info = PGPainless.inspectKeyRing(secretKeys); + assertTrue(info.isFullyDecrypted()); + assertTrue(info.isUserIdValid("Juliet Capulet ")); + + for (PGPSecretKey key : secretKeys) { + assertTrue(testPassphrase(key, null)); + } + + byte[] outBegin = new byte[37]; + System.arraycopy(out.toByteArray(), 0, outBegin, 0, 37); + assertArrayEquals(outBegin, ARMOR_PRIVATE_KEY_HEADER_BYTES); + } + + @Test + @FailOnSystemExit + public void testGenerateKeyWithPassword() throws IOException, PGPException { + PrintStream orig = System.out; + try { + // Write password to file + Path tempDir = Files.createTempDirectory("genkey"); + File passwordFile = new File(tempDir.toFile(), "password"); + passwordFile.createNewFile(); + passwordFile.deleteOnExit(); + FileOutputStream fileOut = new FileOutputStream(passwordFile); + fileOut.write("sw0rdf1sh".getBytes(StandardCharsets.UTF_8)); + fileOut.flush(); + fileOut.close(); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + System.setOut(new PrintStream(out)); + PGPainlessCLI.execute("generate-key", "Juliet Capulet ", + "--with-key-password", passwordFile.getAbsolutePath()); + + PGPSecretKeyRing secretKeys = PGPainless.readKeyRing().secretKeyRing(out.toByteArray()); + KeyRingInfo info = PGPainless.inspectKeyRing(secretKeys); + assertFalse(info.isFullyDecrypted()); + assertTrue(info.isFullyEncrypted()); + + for (PGPSecretKey key : secretKeys) { + assertTrue(testPassphrase(key, "sw0rdf1sh")); + } + } finally { + System.setOut(orig); + } + } + + private boolean testPassphrase(PGPSecretKey key, String passphrase) throws PGPException { + if (KeyInfo.isEncrypted(key)) { + UnlockSecretKey.unlockSecretKey(key, Passphrase.fromPassword(passphrase)); + } else { + if (passphrase != null) { + return false; + } + UnlockSecretKey.unlockSecretKey(key, (PBESecretKeyDecryptor) null); + } + return true; + } + + @Test + @FailOnSystemExit + public void testNoArmor() { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + System.setOut(new PrintStream(out)); + PGPainlessCLI.execute("generate-key", "--no-armor", "Test "); + + byte[] outBegin = new byte[37]; + System.arraycopy(out.toByteArray(), 0, outBegin, 0, 37); + assertFalse(Arrays.equals(outBegin, ARMOR_PRIVATE_KEY_HEADER_BYTES)); + } +} diff --git a/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/GenerateCertTest.java b/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/GenerateCertTest.java deleted file mode 100644 index 4c0e5fa1..00000000 --- a/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/GenerateCertTest.java +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Paul Schaub -// -// SPDX-License-Identifier: Apache-2.0 - -package org.pgpainless.cli.commands; - -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.pgpainless.cli.TestUtils.ARMOR_PRIVATE_KEY_HEADER_BYTES; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.PrintStream; -import java.util.Arrays; - -import com.ginsberg.junit.exit.FailOnSystemExit; -import org.bouncycastle.openpgp.PGPSecretKeyRing; -import org.junit.jupiter.api.Test; -import org.pgpainless.PGPainless; -import org.pgpainless.cli.PGPainlessCLI; -import org.pgpainless.key.info.KeyRingInfo; - -public class GenerateCertTest { - - @Test - @FailOnSystemExit - public void testKeyGeneration() throws IOException { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - System.setOut(new PrintStream(out)); - PGPainlessCLI.execute("generate-key", "--armor", "Juliet Capulet "); - - PGPSecretKeyRing secretKeys = PGPainless.readKeyRing().secretKeyRing(out.toByteArray()); - KeyRingInfo info = PGPainless.inspectKeyRing(secretKeys); - assertTrue(info.isUserIdValid("Juliet Capulet ")); - - byte[] outBegin = new byte[37]; - System.arraycopy(out.toByteArray(), 0, outBegin, 0, 37); - assertArrayEquals(outBegin, ARMOR_PRIVATE_KEY_HEADER_BYTES); - } - - @Test - @FailOnSystemExit - public void testNoArmor() { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - System.setOut(new PrintStream(out)); - PGPainlessCLI.execute("generate-key", "--no-armor", "Test "); - - byte[] outBegin = new byte[37]; - System.arraycopy(out.toByteArray(), 0, outBegin, 0, 37); - assertFalse(Arrays.equals(outBegin, ARMOR_PRIVATE_KEY_HEADER_BYTES)); - } -} diff --git a/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/InlineDetachTest.java b/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/InlineDetachCmdTest.java similarity index 99% rename from pgpainless-cli/src/test/java/org/pgpainless/cli/commands/InlineDetachTest.java rename to pgpainless-cli/src/test/java/org/pgpainless/cli/commands/InlineDetachCmdTest.java index 07a212fc..aed4c581 100644 --- a/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/InlineDetachTest.java +++ b/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/InlineDetachCmdTest.java @@ -28,7 +28,7 @@ import org.pgpainless.cli.PGPainlessCLI; import org.pgpainless.cli.TestUtils; import sop.exception.SOPGPException; -public class InlineDetachTest { +public class InlineDetachCmdTest { private PrintStream originalSout; private static File tempDir; diff --git a/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/EncryptDecryptTest.java b/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/RoundTripEncryptDecryptCmdTest.java similarity index 98% rename from pgpainless-cli/src/test/java/org/pgpainless/cli/commands/EncryptDecryptTest.java rename to pgpainless-cli/src/test/java/org/pgpainless/cli/commands/RoundTripEncryptDecryptCmdTest.java index 4e655864..dba9f47b 100644 --- a/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/EncryptDecryptTest.java +++ b/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/RoundTripEncryptDecryptCmdTest.java @@ -24,7 +24,7 @@ import org.junit.jupiter.api.Test; import org.pgpainless.cli.PGPainlessCLI; import org.pgpainless.cli.TestUtils; -public class EncryptDecryptTest { +public class RoundTripEncryptDecryptCmdTest { private static File tempDir; private static PrintStream originalSout; diff --git a/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/SignVerifyTest.java b/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/RoundTripSignVerifyCmdTest.java similarity index 99% rename from pgpainless-cli/src/test/java/org/pgpainless/cli/commands/SignVerifyTest.java rename to pgpainless-cli/src/test/java/org/pgpainless/cli/commands/RoundTripSignVerifyCmdTest.java index c207db4e..0fce1273 100644 --- a/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/SignVerifyTest.java +++ b/pgpainless-cli/src/test/java/org/pgpainless/cli/commands/RoundTripSignVerifyCmdTest.java @@ -39,7 +39,7 @@ import org.pgpainless.key.OpenPgpV4Fingerprint; import org.pgpainless.key.info.KeyRingInfo; import org.pgpainless.key.util.KeyRingUtils; -public class SignVerifyTest { +public class RoundTripSignVerifyCmdTest { private static File tempDir; private static PrintStream originalSout;