From 0ee1caa77bb3619040f0e89e45959d8432a4a3d5 Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Mon, 2 Feb 2015 16:21:06 -0800 Subject: [PATCH] Switch to updated Curve25519 dependency. --- build.gradle | 16 +-------- .../whispersystems/libaxolotl/ecc/Curve.java | 32 +++++++----------- libs/gradle-witness.jar | Bin 20436 -> 0 bytes 3 files changed, 14 insertions(+), 34 deletions(-) delete mode 100644 libs/gradle-witness.jar diff --git a/build.gradle b/build.gradle index 9ba1f225e..db998e8eb 100644 --- a/build.gradle +++ b/build.gradle @@ -1,21 +1,7 @@ -buildscript { - dependencies { - classpath files('libs/gradle-witness.jar') - } -} - subprojects { - apply plugin: 'witness' - ext.version_number = "1.0.1" ext.group_info = "org.whispersystems" - ext.curve25519_version = "0.1.3" - - dependencyVerification { - verify = [ - 'com.google.protobuf:protobuf-java:e0c1c64575c005601725e7c6a02cebf9e1285e888f756b2a1d73ffa8d725cc74', - ] - } + ext.curve25519_version = "0.2.1" if (JavaVersion.current().isJava8Compatible()) { allprojects { diff --git a/java/src/main/java/org/whispersystems/libaxolotl/ecc/Curve.java b/java/src/main/java/org/whispersystems/libaxolotl/ecc/Curve.java index 5d47e3aa2..9f2c202a6 100644 --- a/java/src/main/java/org/whispersystems/libaxolotl/ecc/Curve.java +++ b/java/src/main/java/org/whispersystems/libaxolotl/ecc/Curve.java @@ -16,24 +16,23 @@ */ package org.whispersystems.libaxolotl.ecc; -import org.whispersystems.curve25519.Curve25519KeyPair; -import org.whispersystems.libaxolotl.InvalidKeyException; import org.whispersystems.curve25519.Curve25519; +import org.whispersystems.curve25519.Curve25519KeyPair; +import org.whispersystems.curve25519.NoSuchProviderException; +import org.whispersystems.libaxolotl.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; +import static org.whispersystems.curve25519.Curve25519.BEST; public class Curve { public static final int DJB_TYPE = 0x05; public static boolean isNative() { - return Curve25519.isNative(); + return Curve25519.getInstance(BEST).isNative(); } public static ECKeyPair generateKeyPair() { - SecureRandom secureRandom = getSecureRandom(); - Curve25519KeyPair keyPair = Curve25519.generateKeyPair(secureRandom); + Curve25519KeyPair keyPair = Curve25519.getInstance(BEST).generateKeyPair(); return new ECKeyPair(new DjbECPublicKey(keyPair.getPublicKey()), new DjbECPrivateKey(keyPair.getPrivateKey())); @@ -66,8 +65,9 @@ public class Curve { } if (publicKey.getType() == DJB_TYPE) { - return Curve25519.calculateAgreement(((DjbECPublicKey)publicKey).getPublicKey(), - ((DjbECPrivateKey)privateKey).getPrivateKey()); + return Curve25519.getInstance(BEST) + .calculateAgreement(((DjbECPublicKey) publicKey).getPublicKey(), + ((DjbECPrivateKey) privateKey).getPrivateKey()); } else { throw new InvalidKeyException("Unknown type: " + publicKey.getType()); } @@ -77,7 +77,8 @@ public class Curve { throws InvalidKeyException { if (signingKey.getType() == DJB_TYPE) { - return Curve25519.verifySignature(((DjbECPublicKey)signingKey).getPublicKey(), message, signature); + return Curve25519.getInstance(BEST) + .verifySignature(((DjbECPublicKey) signingKey).getPublicKey(), message, signature); } else { throw new InvalidKeyException("Unknown type: " + signingKey.getType()); } @@ -87,17 +88,10 @@ public class Curve { throws InvalidKeyException { if (signingKey.getType() == DJB_TYPE) { - return Curve25519.calculateSignature(getSecureRandom(), ((DjbECPrivateKey)signingKey).getPrivateKey(), message); + return Curve25519.getInstance(BEST) + .calculateSignature(((DjbECPrivateKey) signingKey).getPrivateKey(), message); } else { throw new InvalidKeyException("Unknown type: " + signingKey.getType()); } } - - private static SecureRandom getSecureRandom() { - try { - return SecureRandom.getInstance("SHA1PRNG"); - } catch (NoSuchAlgorithmException e) { - throw new AssertionError(e); - } - } } diff --git a/libs/gradle-witness.jar b/libs/gradle-witness.jar deleted file mode 100644 index 561041d3661895d48bd396b342d9c043ecd741ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20436 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 OSn7eTVFr-R!tx*AKLw-!