package com.trilead.ssh2.signature; import com.trilead.ssh2.crypto.PEMDecoder; import net.i2p.crypto.eddsa.EdDSAPrivateKey; import net.i2p.crypto.eddsa.EdDSAPublicKey; import net.i2p.crypto.eddsa.EdDSASecurityProvider; 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.KeyPairGenerator; import java.security.SecureRandom; 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 ED25519KeyAlgorithmTest { @Test public void testEncodeDecodePublicKey() throws GeneralSecurityException, IOException { ED25519KeyAlgorithm testCase = new ED25519KeyAlgorithm(); KeyPairGenerator factory = KeyPairGenerator.getInstance("EdDSA", new EdDSASecurityProvider()); EdDSAPublicKey publicKey = (EdDSAPublicKey) factory.generateKeyPair().getPublic(); byte[] encoded = testCase.encodePublicKey(publicKey); EdDSAPublicKey decoded = testCase.decodePublicKey(encoded); assertEquals(publicKey, decoded); } @Test public void testEncodeDecodeSignature() throws GeneralSecurityException, IOException { ED25519KeyAlgorithm testCase = new ED25519KeyAlgorithm(); KeyPairGenerator factory = KeyPairGenerator.getInstance("EdDSA", new EdDSASecurityProvider()); EdDSAPrivateKey privateKey = (EdDSAPrivateKey) 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 { ED25519KeyAlgorithm testCase = new ED25519KeyAlgorithm(); byte[] message = "Signature Test".getBytes(StandardCharsets.UTF_8); KeyPairGenerator factory = KeyPairGenerator.getInstance("EdDSA", new EdDSASecurityProvider()); KeyPair keyPair = factory.generateKeyPair(); EdDSAPrivateKey privateKey = (EdDSAPrivateKey) keyPair.getPrivate(); EdDSAPublicKey publicKey = (EdDSAPublicKey) keyPair.getPublic(); byte[] signature = testCase.generateSignature(message, privateKey, new SecureRandom()); assertTrue(testCase.verifySignature(message, signature, publicKey)); } @Test public void testSignAndVerifyFailure() throws GeneralSecurityException, IOException { ED25519KeyAlgorithm testCase = new ED25519KeyAlgorithm(); byte[] message = "Signature Test 2".getBytes(StandardCharsets.UTF_8); KeyPairGenerator factory = KeyPairGenerator.getInstance("EdDSA", new EdDSASecurityProvider()); KeyPair keyPair = factory.generateKeyPair(); EdDSAPrivateKey privateKey = (EdDSAPrivateKey) keyPair.getPrivate(); EdDSAPublicKey publicKey = (EdDSAPublicKey) 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 expected = PEMDecoder.decodeKeyPair(IOUtils.toCharArray(getClass().getResourceAsStream("ed25519-testkey-unprotected.txt")), null); KeyPair actual = PEMDecoder.decodeKeyPair(IOUtils.toCharArray(getClass().getResourceAsStream("ed25519-testkey-protected.txt")), "password"); assertEquals(expected.getPrivate(), actual.getPrivate()); assertEquals(expected.getPublic(), actual.getPublic()); } }