diff --git a/bramble-core/build.gradle b/bramble-core/build.gradle index af2d70bb945706b522fb358bc53d5e40c518920a..84f2acc874a2f156bd060706b30ca7f6dbe8c4e3 100644 --- a/bramble-core/build.gradle +++ b/bramble-core/build.gradle @@ -23,6 +23,7 @@ dependencies { testImplementation "org.jmock:jmock-legacy:2.8.2" testImplementation "org.hamcrest:hamcrest-library:1.3" testImplementation "org.hamcrest:hamcrest-core:1.3" + testImplementation "org.whispersystems:curve25519-java:0.4.1" testApt 'com.google.dagger:dagger-compiler:2.0.2' } @@ -53,6 +54,7 @@ dependencyVerification { 'org.jmock:jmock:2.8.2:jmock-2.8.2.jar:6c73cb4a2e6dbfb61fd99c9a768539c170ab6568e57846bd60dbf19596b65b16', 'org.objenesis:objenesis:2.1:objenesis-2.1.jar:c74330cc6b806c804fd37e74487b4fe5d7c2750c5e15fbc6efa13bdee1bdef80', 'org.ow2.asm:asm:5.0.4:asm-5.0.4.jar:896618ed8ae62702521a78bc7be42b7c491a08e6920a15f89a3ecdec31e9a220', + 'org.whispersystems:curve25519-java:0.4.1:curve25519-java-0.4.1.jar:7dd659d8822c06c3aea1a47f18fac9e5761e29cab8100030b877db445005f03e', ] } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/crypto/EllipticCurvePerformanceTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/EllipticCurvePerformanceTest.java index ed61badfe5c6dc8b4226d3ff6534ba371e3f644a..0909bdc4e1ec6d3389acb93bfa0bdeb6d1c478c0 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/crypto/EllipticCurvePerformanceTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/EllipticCurvePerformanceTest.java @@ -12,7 +12,6 @@ import org.spongycastle.crypto.Digest; import org.spongycastle.crypto.agreement.ECDHBasicAgreement; import org.spongycastle.crypto.agreement.ECDHCBasicAgreement; import org.spongycastle.crypto.digests.Blake2bDigest; -import org.spongycastle.crypto.ec.CustomNamedCurves; import org.spongycastle.crypto.generators.ECKeyPairGenerator; import org.spongycastle.crypto.params.ECDomainParameters; import org.spongycastle.crypto.params.ECKeyGenerationParameters; @@ -24,6 +23,8 @@ import org.spongycastle.crypto.signers.HMacDSAKCalculator; import org.spongycastle.math.ec.ECCurve; import org.spongycastle.math.ec.ECPoint; import org.spongycastle.math.ec.MontgomeryLadderMultiplier; +import org.whispersystems.curve25519.Curve25519; +import org.whispersystems.curve25519.Curve25519KeyPair; import java.math.BigInteger; import java.security.GeneralSecurityException; @@ -65,11 +66,8 @@ public class EllipticCurvePerformanceTest { runTest(name + " constant", constantTime(params)); } runTest("ours", PARAMETERS); - ECDomainParameters params = - convertParams(CustomNamedCurves.getByName("curve25519")); - runAgreementTest("curve25519 default", params); - runAgreementTest("curve25519 constant", constantTime(params)); - runEdTest(); + runCurve25519Test(); + runEd25519Test(); } private static void runTest(String name, ECDomainParameters params) { @@ -136,22 +134,24 @@ public class EllipticCurvePerformanceTest { else return new ECDHBasicAgreement(); } - private static void runAgreementTest(String name, - ECDomainParameters params) { - // Generate two key pairs using the given parameters - ECKeyPairGenerator generator = new ECKeyPairGenerator(); - generator.init(new ECKeyGenerationParameters(params, random)); - AsymmetricCipherKeyPair keyPair1 = generator.generateKeyPair(); - AsymmetricCipherKeyPair keyPair2 = generator.generateKeyPair(); - // Time some ECDH and ECDHC key agreements - long agreementMedian = runAgreementTest(keyPair1, keyPair2, false); - long agreementWithCofactorMedian = - runAgreementTest(keyPair1, keyPair2, true); - System.out.println(String.format("%s: %,d %,d N/A N/A", name, - agreementMedian, agreementWithCofactorMedian)); + private static void runCurve25519Test() { + Curve25519 curve25519 = Curve25519.getInstance("java"); + Curve25519KeyPair keyPair1 = curve25519.generateKeyPair(); + Curve25519KeyPair keyPair2 = curve25519.generateKeyPair(); + // Time some key agreements + List<Long> samples = new ArrayList<>(); + for (int i = 0; i < SAMPLES; i++) { + long start = System.nanoTime(); + curve25519.calculateAgreement(keyPair1.getPublicKey(), + keyPair2.getPrivateKey()); + samples.add(System.nanoTime() - start); + } + long agreementMedian = median(samples); + System.out.println(String.format("Curve25519: %,d - - -", + agreementMedian)); } - private static void runEdTest() throws GeneralSecurityException { + private static void runEd25519Test() throws GeneralSecurityException { KeyPair keyPair = new KeyPairGenerator().generateKeyPair(); // Time some signatures List<Long> samples = new ArrayList<>(); @@ -179,7 +179,7 @@ public class EllipticCurvePerformanceTest { samples.add(System.nanoTime() - start); } long verificationMedian = median(samples); - System.out.println(String.format("Ed25519: N/A %,d %,d", + System.out.println(String.format("Ed25519: - - %,d %,d", signatureMedian, verificationMedian)); }