From 1538c32d65152d1792e6d2404f2018c9db29ab19 Mon Sep 17 00:00:00 2001 From: Kenny Root Date: Sat, 4 Apr 2015 17:17:58 -0700 Subject: Add Ed25519 host key support --- .../trilead/ssh2/signature/Ed25519VerifyTest.java | 70 ++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 sshlib/src/test/java/com/trilead/ssh2/signature/Ed25519VerifyTest.java (limited to 'sshlib/src/test/java/com/trilead/ssh2/signature/Ed25519VerifyTest.java') diff --git a/sshlib/src/test/java/com/trilead/ssh2/signature/Ed25519VerifyTest.java b/sshlib/src/test/java/com/trilead/ssh2/signature/Ed25519VerifyTest.java new file mode 100644 index 0000000..f256f91 --- /dev/null +++ b/sshlib/src/test/java/com/trilead/ssh2/signature/Ed25519VerifyTest.java @@ -0,0 +1,70 @@ +package com.trilead.ssh2.signature; + +import com.trilead.ssh2.crypto.key.Ed25519PrivateKey; +import com.trilead.ssh2.crypto.key.Ed25519PublicKey; +import net.i2p.crypto.eddsa.spec.EdDSANamedCurveSpec; +import net.i2p.crypto.eddsa.spec.EdDSANamedCurveTable; +import net.i2p.crypto.eddsa.spec.EdDSAPrivateKeySpec; +import org.junit.Test; + +import javax.xml.bind.DatatypeConverter; +import java.security.MessageDigest; + +import static org.junit.Assert.*; + +/** + * Created by kenny on 1/24/16. + */ +public class Ed25519VerifyTest { + /* Test vectors from draft-josefsson-eddsa-ed25519-03 */ + private static final byte[] SECRET_KEY = toByteArray("833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42"); + private static final byte[] PUBLIC_KEY = toByteArray("ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf"); + private static final byte[] MESSAGE = toByteArray("616263"); + private static final byte[] SIGNATURE = toByteArray("dc2a4459e7369633a52b1bf277839a00201009a3efbf3ecb69bea2186c26b58909351fc9ac90b3ecfdfbc7c66431e0303dca179c138ac17ad9bef1177331a704"); + + private static byte[] toByteArray(String s) { + return DatatypeConverter.parseHexBinary(s); + } + + @Test + public void verifies() throws Exception { + Ed25519PublicKey pubKey = Ed25519PublicKey.getInstance(PUBLIC_KEY); + MessageDigest md = MessageDigest.getInstance("SHA-512"); + assertTrue(Ed25519Verify.verifySignature(md.digest(MESSAGE), SIGNATURE, pubKey)); + } + + @Test + public void noVerificationForInvalidData() throws Exception { + Ed25519PublicKey pubKey = Ed25519PublicKey.getInstance(PUBLIC_KEY); + MessageDigest md = MessageDigest.getInstance("SHA-512"); + assertFalse(Ed25519Verify.verifySignature(md.digest(new byte[1]), SIGNATURE, pubKey)); + } + + @Test + public void signs() throws Exception { + Ed25519PrivateKey privKey = Ed25519PrivateKey.getInstance(SECRET_KEY); + MessageDigest md = MessageDigest.getInstance("SHA-512"); + assertArrayEquals(SIGNATURE, Ed25519Verify.generateSignature(md.digest(MESSAGE), privKey)); + } + + @Test + public void publicKeyCalculatedCorrectly() throws Exception { + EdDSANamedCurveSpec spec = EdDSANamedCurveTable.getByName("ed25519-sha-512"); + EdDSAPrivateKeySpec privKeySpec = new EdDSAPrivateKeySpec(SECRET_KEY, spec); + byte[] pubKeyBytes = privKeySpec.getA().toByteArray(); + assertArrayEquals(PUBLIC_KEY, pubKeyBytes); + } + + @Test + public void loopbackSuccess() throws Exception { + Ed25519PrivateKey privKey = Ed25519PrivateKey.getInstance(SECRET_KEY); + Ed25519PublicKey pubKey = Ed25519PublicKey.getInstance(PUBLIC_KEY); + MessageDigest md = MessageDigest.getInstance("SHA-512"); + + byte[] message = new byte[] { (byte) 0xA5, (byte) 0x5A }; + byte[] digest = md.digest(message); + + byte[] sig = Ed25519Verify.generateSignature(digest, privKey); + assertTrue(Ed25519Verify.verifySignature(digest, sig, pubKey)); + } +} \ No newline at end of file -- cgit v1.2.3