diff --git a/README.md b/README.md index 509f361..40e0834 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # curve25519-java A Java Curve25519 implementation that is backed by native code when available, and -pure Java when a native library is not available. +pure Java when a native library is not available. There is also a J2ME build variant. ## Installing @@ -23,35 +23,72 @@ To use from pure Java: ``` +To use from J2ME: + +``` + + org.whispersystems + curve25519-j2me + (latest version number here) + +``` + + 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. +1. `Curve25519.JAVA` -- This is a pure Java 7 backed provider. +1. `Curve25519.J2ME` -- This is a J2ME compatible provider. +1. `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: ``` -SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); -Curve25519KeyPair keyPair = Curve25519.generateKeyPair(secureRandom); +Curve25519KeyPair keyPair = Curve25519.getInstance(Curve25519.BEST).generateKeyPair(); ``` ### Calculating a shared secret: ``` -byte[] sharedSecret = Curve25519.calculateAgreement(publicKey, privateKey); +Curve25519 cipher = Curve25519.getInstance(Curve25519.BEST); +byte[] sharedSecret = cipher.calculateAgreement(publicKey, privateKey); ``` ### Calculating a signature: ``` -SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); -byte[] signature = Curve25519.calculateSignature(secureRandom, privateKey, message); +Curve25519 cipher = Curve25519.getInstance(Curve25519.BEST); +byte[] signature = cipher.calculateSignature(secureRandom, privateKey, message); ``` ### Verifying a signature: ``` -boolean validSignature = Curve25519.verifySignature(publicKey, message, signature); +Curve25519 cipher = Curve25519.getInstance(Curve25519.BEST); +boolean validSignature = cipher.verifySignature(publicKey, message, signature); ``` ## License