Pure Java and JNI backed Curve25519 implementation.
Go to file
ceokot 5fb0228fef
Expose method to convert a public key from curve25519 to ed25519 (#1)
* Expose method to convert a public key from curve25519 to ed25519

* Update provider

Co-authored-by: charles <charles@oxen.io>
2022-07-28 13:29:25 +10:00
android Add Curve25519.generateKeyPair(byte[]) 2019-07-18 10:33:00 +10:00
common Expose method to convert a public key from curve25519 to ed25519 (#1) 2022-07-28 13:29:25 +10:00
gradle/wrapper Add Curve25519.generateKeyPair(byte[]) 2019-07-18 10:33:00 +10:00
j2me Add Curve25519.generateKeyPair(byte[]) 2019-07-18 10:33:00 +10:00
java Expose method to convert a public key from curve25519 to ed25519 (#1) 2022-07-28 13:29:25 +10:00
tests Undo unnecessary changes 2019-08-19 15:02:19 +10:00
.gitignore Add license information. 2015-01-08 15:33:41 -08:00
LICENSE Update headers, add LICENSE file 2016-05-02 13:44:19 -07:00
README.md Updated README 2015-02-03 10:20:08 -08:00
build.gradle Expose method to convert a public key from curve25519 to ed25519 (#1) 2022-07-28 13:29:25 +10:00
gradlew Move over to gradle for all building. 2015-01-08 14:32:17 -08:00
gradlew.bat Move over to gradle for all building. 2015-01-08 14:32:17 -08:00
settings.gradle Refactored into provider model for initial support of J2ME. 2015-01-10 21:31:00 -08:00

README.md

curve25519-java

A Java Curve25519 implementation that is backed by native code when available, and pure Java when a native library is not available. There is also a J2ME build variant.

Installing

To use on Android:

dependencies {
  compile 'org.whispersystems:curve25519-android:(latest version number here)'
}

To use from pure Java:

<dependency>
  <groupId>org.whispersystems</groupId>
  <artifactId>curve25519-java</artifactId>
  <version>(latest version number here)</version>
</dependency>

To use from J2ME:

<dependency>
  <groupId>org.whispersystems</groupId>
  <artifactId>curve25519-j2me</artifactId>
  <version>(latest version number here)</version>
</dependency>

The Android artifact is an AAR that contains an NDK-backed native implementation, while the Java artifact is a JAR that only contains the pure-Java Curve25519 provider.

Using

Obtaining an instance

The caller needs to specify a provider when obtaining a Curve25519 instance. There are four built in providers:

  1. Curve25519.NATIVE -- This is a JNI backed provider.
  2. Curve25519.JAVA -- This is a pure Java 7 backed provider.
  3. Curve25519.J2ME -- This is a J2ME compatible provider.
  4. Curve25519.BEST -- This is a provider that attempts to use NATIVE, but falls back to JAVA if the former is unavailable.

The caller specifies a provider during instance creation:

Curve25519 cipher = Curve25519.getInstance(Curve25519.BEST);

Since J2ME doesn't have built-in SecureRandom support, J2ME users need to supply their own source of SecureRandom by implementing the SecureRandomProvider interface and passing it in:

Curve25519 cipher = Curve25519.getInstance(Curve25519.J2ME, new MySecureRandomProvider());

Generating a Curve25519 keypair:

Curve25519KeyPair keyPair = Curve25519.getInstance(Curve25519.BEST).generateKeyPair();

Calculating a shared secret:

Curve25519 cipher       = Curve25519.getInstance(Curve25519.BEST);
byte[]     sharedSecret = cipher.calculateAgreement(publicKey, privateKey);

Calculating a signature:

Curve25519 cipher    = Curve25519.getInstance(Curve25519.BEST);
byte[]     signature = cipher.calculateSignature(secureRandom, privateKey, message);

Verifying a signature:

Curve25519 cipher         = Curve25519.getInstance(Curve25519.BEST);
boolean    validSignature = cipher.verifySignature(publicKey, message, signature);

License

Copyright 2015 Open Whisper Systems

Licensed under the GPLv3: http://www.gnu.org/licenses/gpl-3.0.html