package com.trilead.ssh2.signature; import com.trilead.ssh2.crypto.PEMDecoder; import org.apache.commons.io.IOUtils; import org.junit.Test; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.security.GeneralSecurityException; import java.security.KeyPair; import java.security.SecureRandom; import java.security.interfaces.DSAPublicKey; import java.security.interfaces.DSAPrivateKey; import java.security.KeyPairGenerator; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; /** * @author Michael Clarke */ public class DSAKeyAlgorithmTest { @Test public void testEncodeDecodePublicKey() throws GeneralSecurityException, IOException { DSAKeyAlgorithm testCase = new DSAKeyAlgorithm(); KeyPairGenerator factory = KeyPairGenerator.getInstance("DSA"); DSAPublicKey publicKey = (DSAPublicKey) factory.generateKeyPair().getPublic(); byte[] encoded = testCase.encodePublicKey(publicKey); DSAPublicKey decoded = testCase.decodePublicKey(encoded); assertEquals(publicKey, decoded); } @Test public void testEncodeDecodeSignature() throws GeneralSecurityException, IOException { DSAKeyAlgorithm testCase = new DSAKeyAlgorithm(); KeyPairGenerator factory = KeyPairGenerator.getInstance("DSA"); DSAPrivateKey privateKey = (DSAPrivateKey) factory.generateKeyPair().getPrivate(); byte[] signature = testCase.generateSignature("Sign Me".getBytes(StandardCharsets.UTF_8), privateKey, new SecureRandom()); byte[] encoded = testCase.encodeSignature(signature); byte[] decoded = testCase.decodeSignature(encoded); assertArrayEquals(signature, decoded); } @Test public void testSignAndVerify() throws GeneralSecurityException, IOException { DSAKeyAlgorithm testCase = new DSAKeyAlgorithm(); byte[] message = "Signature Test".getBytes(StandardCharsets.UTF_8); KeyPairGenerator factory = KeyPairGenerator.getInstance("DSA"); KeyPair keyPair = factory.generateKeyPair(); DSAPrivateKey privateKey = (DSAPrivateKey) keyPair.getPrivate(); DSAPublicKey publicKey = (DSAPublicKey) keyPair.getPublic(); byte[] signature = testCase.generateSignature(message, privateKey, new SecureRandom()); assertTrue(testCase.verifySignature(message, signature, publicKey)); } @Test public void testSignAndVerifyFailure() throws GeneralSecurityException, IOException { DSAKeyAlgorithm testCase = new DSAKeyAlgorithm(); byte[] message = "Signature Test 2".getBytes(StandardCharsets.UTF_8); KeyPairGenerator factory = KeyPairGenerator.getInstance("DSA"); KeyPair keyPair = factory.generateKeyPair(); DSAPrivateKey privateKey = (DSAPrivateKey) keyPair.getPrivate(); DSAPublicKey publicKey = (DSAPublicKey) keyPair.getPublic(); byte[] signature = testCase.generateSignature("Other Message".getBytes(StandardCharsets.UTF_8), privateKey, new SecureRandom()); assertFalse(testCase.verifySignature(message, signature, publicKey)); } @Test public void testParsePrivateKey() throws IOException { KeyPair oldFormat = PEMDecoder.decodeKeyPair(IOUtils.toCharArray(getClass().getResourceAsStream("dsa-testkey-unprotected.txt")), null); KeyPair newFormat = PEMDecoder.decodeKeyPair(IOUtils.toCharArray(getClass().getResourceAsStream("dsa-testkey-unprotected-newformat.txt")), null); assertEquals(oldFormat.getPublic(), newFormat.getPublic()); assertEquals(oldFormat.getPrivate(), newFormat.getPrivate()); } }