diff options
author | Moxie Marlinspike <moxie@thoughtcrime.org> | 2015-01-08 13:48:49 -0800 |
---|---|---|
committer | Moxie Marlinspike <moxie@thoughtcrime.org> | 2015-01-08 14:09:01 -0800 |
commit | 6445ea5f13850f42c3952bd06a2369317683ed88 (patch) | |
tree | f2bb37c8cf4710ff6a6a37a3e7e702c5a21ca504 /src/main/java/org/whispersystems/libaxolotl/ecc | |
parent | a4d8f7f6a4c4e9e89db35f299e558dceee2362a1 (diff) |
Break project up into Java and Android build/test.
Diffstat (limited to '')
-rw-r--r-- | java/src/main/java/org/whispersystems/libaxolotl/ecc/Curve.java (renamed from src/main/java/org/whispersystems/libaxolotl/ecc/Curve.java) | 43 | ||||
-rw-r--r-- | java/src/main/java/org/whispersystems/libaxolotl/ecc/DjbECPrivateKey.java (renamed from src/main/java/org/whispersystems/libaxolotl/ecc/DjbECPrivateKey.java) | 0 | ||||
-rw-r--r-- | java/src/main/java/org/whispersystems/libaxolotl/ecc/DjbECPublicKey.java (renamed from src/main/java/org/whispersystems/libaxolotl/ecc/DjbECPublicKey.java) | 0 | ||||
-rw-r--r-- | java/src/main/java/org/whispersystems/libaxolotl/ecc/ECKeyPair.java (renamed from src/main/java/org/whispersystems/libaxolotl/ecc/ECKeyPair.java) | 0 | ||||
-rw-r--r-- | java/src/main/java/org/whispersystems/libaxolotl/ecc/ECPrivateKey.java (renamed from src/main/java/org/whispersystems/libaxolotl/ecc/ECPrivateKey.java) | 0 | ||||
-rw-r--r-- | java/src/main/java/org/whispersystems/libaxolotl/ecc/ECPublicKey.java (renamed from src/main/java/org/whispersystems/libaxolotl/ecc/ECPublicKey.java) | 0 | ||||
-rw-r--r-- | src/main/java/org/whispersystems/libaxolotl/ecc/Curve25519.java | 98 |
7 files changed, 34 insertions, 107 deletions
diff --git a/src/main/java/org/whispersystems/libaxolotl/ecc/Curve.java b/java/src/main/java/org/whispersystems/libaxolotl/ecc/Curve.java index 66b8cc3a..5d47e3aa 100644 --- a/src/main/java/org/whispersystems/libaxolotl/ecc/Curve.java +++ b/java/src/main/java/org/whispersystems/libaxolotl/ecc/Curve.java @@ -16,25 +16,41 @@ */ package org.whispersystems.libaxolotl.ecc; +import org.whispersystems.curve25519.Curve25519KeyPair; import org.whispersystems.libaxolotl.InvalidKeyException; +import org.whispersystems.curve25519.Curve25519; + +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; public class Curve { public static final int DJB_TYPE = 0x05; + public static boolean isNative() { + return Curve25519.isNative(); + } + public static ECKeyPair generateKeyPair() { - return Curve25519.generateKeyPair(); + SecureRandom secureRandom = getSecureRandom(); + Curve25519KeyPair keyPair = Curve25519.generateKeyPair(secureRandom); + + return new ECKeyPair(new DjbECPublicKey(keyPair.getPublicKey()), + new DjbECPrivateKey(keyPair.getPrivateKey())); } public static ECPublicKey decodePoint(byte[] bytes, int offset) throws InvalidKeyException { - int type = bytes[offset]; + int type = bytes[offset] & 0xFF; - if (type == DJB_TYPE) { - return Curve25519.decodePoint(bytes, offset); - } else { - throw new InvalidKeyException("Unknown key type: " + type); + switch (type) { + case Curve.DJB_TYPE: + byte[] keyBytes = new byte[32]; + System.arraycopy(bytes, offset+1, keyBytes, 0, keyBytes.length); + return new DjbECPublicKey(keyBytes); + default: + throw new InvalidKeyException("Bad key type: " + type); } } @@ -50,7 +66,8 @@ public class Curve { } if (publicKey.getType() == DJB_TYPE) { - return Curve25519.calculateAgreement(publicKey, privateKey); + return Curve25519.calculateAgreement(((DjbECPublicKey)publicKey).getPublicKey(), + ((DjbECPrivateKey)privateKey).getPrivateKey()); } else { throw new InvalidKeyException("Unknown type: " + publicKey.getType()); } @@ -60,7 +77,7 @@ public class Curve { throws InvalidKeyException { if (signingKey.getType() == DJB_TYPE) { - return Curve25519.verifySignature(signingKey, message, signature); + return Curve25519.verifySignature(((DjbECPublicKey)signingKey).getPublicKey(), message, signature); } else { throw new InvalidKeyException("Unknown type: " + signingKey.getType()); } @@ -70,9 +87,17 @@ public class Curve { throws InvalidKeyException { if (signingKey.getType() == DJB_TYPE) { - return Curve25519.calculateSignature(signingKey, message); + return Curve25519.calculateSignature(getSecureRandom(), ((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/src/main/java/org/whispersystems/libaxolotl/ecc/DjbECPrivateKey.java b/java/src/main/java/org/whispersystems/libaxolotl/ecc/DjbECPrivateKey.java index ecb55b4e..ecb55b4e 100644 --- a/src/main/java/org/whispersystems/libaxolotl/ecc/DjbECPrivateKey.java +++ b/java/src/main/java/org/whispersystems/libaxolotl/ecc/DjbECPrivateKey.java diff --git a/src/main/java/org/whispersystems/libaxolotl/ecc/DjbECPublicKey.java b/java/src/main/java/org/whispersystems/libaxolotl/ecc/DjbECPublicKey.java index 9f66d439..9f66d439 100644 --- a/src/main/java/org/whispersystems/libaxolotl/ecc/DjbECPublicKey.java +++ b/java/src/main/java/org/whispersystems/libaxolotl/ecc/DjbECPublicKey.java diff --git a/src/main/java/org/whispersystems/libaxolotl/ecc/ECKeyPair.java b/java/src/main/java/org/whispersystems/libaxolotl/ecc/ECKeyPair.java index bcaec927..bcaec927 100644 --- a/src/main/java/org/whispersystems/libaxolotl/ecc/ECKeyPair.java +++ b/java/src/main/java/org/whispersystems/libaxolotl/ecc/ECKeyPair.java diff --git a/src/main/java/org/whispersystems/libaxolotl/ecc/ECPrivateKey.java b/java/src/main/java/org/whispersystems/libaxolotl/ecc/ECPrivateKey.java index 922057de..922057de 100644 --- a/src/main/java/org/whispersystems/libaxolotl/ecc/ECPrivateKey.java +++ b/java/src/main/java/org/whispersystems/libaxolotl/ecc/ECPrivateKey.java diff --git a/src/main/java/org/whispersystems/libaxolotl/ecc/ECPublicKey.java b/java/src/main/java/org/whispersystems/libaxolotl/ecc/ECPublicKey.java index 12576807..12576807 100644 --- a/src/main/java/org/whispersystems/libaxolotl/ecc/ECPublicKey.java +++ b/java/src/main/java/org/whispersystems/libaxolotl/ecc/ECPublicKey.java diff --git a/src/main/java/org/whispersystems/libaxolotl/ecc/Curve25519.java b/src/main/java/org/whispersystems/libaxolotl/ecc/Curve25519.java deleted file mode 100644 index 685a4a11..00000000 --- a/src/main/java/org/whispersystems/libaxolotl/ecc/Curve25519.java +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Copyright (C) 2013 Open Whisper Systems - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ -package org.whispersystems.libaxolotl.ecc; - -import org.whispersystems.libaxolotl.InvalidKeyException; - -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; - -public class Curve25519 { - - static { - System.loadLibrary("curve25519"); - - try { - random = SecureRandom.getInstance("SHA1PRNG"); - } catch (NoSuchAlgorithmException e) { - throw new AssertionError(e); - } - } - - private static final SecureRandom random; - - private static native byte[] calculateAgreement(byte[] ourPrivate, byte[] theirPublic); - private static native byte[] generatePublicKey(byte[] privateKey); - private static native byte[] generatePrivateKey(byte[] random); - - private static native byte[] calculateSignature(byte[] random, byte[] privateKey, byte[] message); - private static native boolean verifySignature(byte[] publicKey, byte[] message, byte[] signature); - - public static ECKeyPair generateKeyPair() { - byte[] privateKey = generatePrivateKey(); - byte[] publicKey = generatePublicKey(privateKey); - - return new ECKeyPair(new DjbECPublicKey(publicKey), new DjbECPrivateKey(privateKey)); - } - - static byte[] calculateAgreement(ECPublicKey publicKey, ECPrivateKey privateKey) { - return calculateAgreement(((DjbECPrivateKey)privateKey).getPrivateKey(), - ((DjbECPublicKey)publicKey).getPublicKey()); - } - - static byte[] calculateSignature(ECPrivateKey privateKey, byte[] message) { - byte[] random = getRandom(64); - return calculateSignature(random, ((DjbECPrivateKey)privateKey).getPrivateKey(), message); - } - - static boolean verifySignature(ECPublicKey publicKey, byte[] message, byte[] signature) { - return verifySignature(((DjbECPublicKey)publicKey).getPublicKey(), message, signature); - } - - static ECPublicKey decodePoint(byte[] encoded, int offset) - throws InvalidKeyException - { - int type = encoded[offset] & 0xFF; - byte[] keyBytes = new byte[32]; - System.arraycopy(encoded, offset+1, keyBytes, 0, keyBytes.length); - - if (type != Curve.DJB_TYPE) { - throw new InvalidKeyException("Bad key type: " + type); - } - - return new DjbECPublicKey(keyBytes); - } - - private static byte[] generatePrivateKey() { - byte[] privateKey = new byte[32]; - random.nextBytes(privateKey); - - return generatePrivateKey(privateKey); - } - - private static byte[] getRandom(int size) { - try { - byte[] random = new byte[size]; - SecureRandom.getInstance("SHA1PRNG").nextBytes(random); - - return random; - } catch (NoSuchAlgorithmException e) { - throw new AssertionError(e); - } - } - -} |