Add tests for writing out of session key and verifications

This commit is contained in:
Paul Schaub 2022-11-07 16:21:50 +01:00
parent 137d2e7f85
commit 7326d3cf85
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311

View file

@ -4,28 +4,6 @@
package sop.cli.picocli.commands; package sop.cli.picocli.commands;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.util.Date;
import com.ginsberg.junit.exit.ExpectSystemExitWithStatus; import com.ginsberg.junit.exit.ExpectSystemExitWithStatus;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -43,6 +21,26 @@ import sop.operation.Decrypt;
import sop.util.HexUtil; import sop.util.HexUtil;
import sop.util.UTCUtil; import sop.util.UTCUtil;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.util.Date;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class DecryptCmdTest { public class DecryptCmdTest {
private Decrypt decrypt; private Decrypt decrypt;
@ -189,24 +187,32 @@ public class DecryptCmdTest {
} }
@Test @Test
public void assertSessionKeyIsProperlyWrittenToSessionKeyFile() throws SOPGPException.CannotDecrypt, SOPGPException.MissingArg, SOPGPException.BadData, IOException { public void assertSessionKeyAndVerificationsIsProperlyWrittenToSessionKeyFile() throws SOPGPException.CannotDecrypt, SOPGPException.MissingArg, SOPGPException.BadData, IOException {
byte[] key = "C7CBDAF42537776F12509B5168793C26B93294E5ABDFA73224FB0177123E9137".getBytes(StandardCharsets.UTF_8); Date signDate = UTCUtil.parseUTCDate("2022-11-07T15:01:24Z");
String keyFP = "F9E6F53F7201C60A87064EAB0B27F2B0760A1209";
String certFP = "4E2C78519512C2AE9A8BFE7EB3298EB2FBE5F51B";
Verification verification = new Verification(signDate, keyFP, certFP);
SessionKey sessionKey = SessionKey.fromString("9:C7CBDAF42537776F12509B5168793C26B93294E5ABDFA73224FB0177123E9137");
when(decrypt.ciphertext((InputStream) any())).thenReturn(new ReadyWithResult<DecryptionResult>() { when(decrypt.ciphertext((InputStream) any())).thenReturn(new ReadyWithResult<DecryptionResult>() {
@Override @Override
public DecryptionResult writeTo(OutputStream outputStream) { public DecryptionResult writeTo(OutputStream outputStream) {
return new DecryptionResult( return new DecryptionResult(
new SessionKey((byte) 9, key), sessionKey,
Collections.emptyList() Collections.singletonList(verification)
); );
} }
}); });
Path tempDir = Files.createTempDirectory("session-key-out-dir"); Path tempDir = Files.createTempDirectory("session-key-out-dir");
File tempFile = new File(tempDir.toFile(), "session-key"); File sessionKeyFile = new File(tempDir.toFile(), "session-key");
tempFile.deleteOnExit(); sessionKeyFile.deleteOnExit();
SopCLI.main(new String[] {"decrypt", "--session-key-out", tempFile.getAbsolutePath()}); File verificationsFile = new File(tempDir.toFile(), "verifications");
File keyFile = new File(tempDir.toFile(), "key.asc");
keyFile.createNewFile();
SopCLI.main(new String[] {"decrypt", "--session-key-out", sessionKeyFile.getAbsolutePath(),
"--verifications-out", verificationsFile.getAbsolutePath(), "--verify-with", keyFile.getAbsolutePath()});
ByteArrayOutputStream bytesInFile = new ByteArrayOutputStream(); ByteArrayOutputStream bytesInFile = new ByteArrayOutputStream();
try (FileInputStream fileIn = new FileInputStream(tempFile)) { try (FileInputStream fileIn = new FileInputStream(sessionKeyFile)) {
byte[] buf = new byte[32]; byte[] buf = new byte[32];
int read = fileIn.read(buf); int read = fileIn.read(buf);
while (read != -1) { while (read != -1) {
@ -215,10 +221,21 @@ public class DecryptCmdTest {
} }
} }
byte[] algAndKey = new byte[key.length + 1]; SessionKey parsedSessionKey = SessionKey.fromString(bytesInFile.toString());
algAndKey[0] = (byte) 9; assertEquals(sessionKey, parsedSessionKey);
System.arraycopy(key, 0, algAndKey, 1, key.length);
assertArrayEquals(algAndKey, bytesInFile.toByteArray()); bytesInFile = new ByteArrayOutputStream();
try (FileInputStream fileIn = new FileInputStream(verificationsFile)) {
byte[] buf = new byte[32];
int read = fileIn.read(buf);
while (read != -1) {
bytesInFile.write(buf, 0, read);
read = fileIn.read(buf);
}
}
Verification parsedVerification = Verification.fromString(bytesInFile.toString());
assertEquals(verification, parsedVerification);
} }
@Test @Test