Class X25519
Algorithm map.
generatePrivateKey(SecureRandom, byte[])— 32 random bytes followed byclampPrivateKey(byte[])(RFC 7748 sec. 5 clamping: clear bits 254..255 then 0..2, set bit 254).generatePublicKey(byte[], int, byte[], int)/scalarMultBase(byte[], int, byte[], int)— computed ask * Bon the birationally-equivalentedwards25519curve viaEd25519.scalarMultBaseYZ(Friend, byte[], int, int[], int[])(a signed multi-comb in extended Edwards coordinates), then converted to the curve25519ucoordinate using the RFC 7748 sec. 4.1 birational mapu = (1 + Y) / (1 - Y)whereY = y / z.scalarMult(byte[], int, byte[], int, byte[], int)(key agreement) — Montgomery ladder on XZ-only projective coordinates per RFC 7748 sec. 5, with per-bit constant-timecswap; theA24 = (A + 2) / 4curve constant is precomputed fromA = 486662. The final three doublings correspond to the always-cleared low bits of the scalar; these clear the cofactor to ensure a non-twist result.calculateAgreement(byte[], int, byte[], int, byte[], int)—scalarMult(byte[], int, byte[], int, byte[], int)followed by the RFC 7748 sec. 6.1 all-zero rejection.
Side-channel scope. Secret-scalar operations are written to be
constant-time at the Java level: the Montgomery ladder in
scalarMult(byte[], int, byte[], int, byte[], int) performs identical field operations per bit with
branchless cswap; scalarMultBase(byte[], int, byte[], int) routes through the
Ed25519 signed-comb, which walks all precomputed entries with mask-based
cmov rather than a secret-indexed array load and applies
conditional negation by XOR-with-mask; the final modular inverse uses
constant-time Mod.modOddInverse. The all-zero rejection in
calculateAgreement(byte[], int, byte[], int, byte[], int) runs an OR-accumulator and only leaks the
RFC-mandated public rejection criterion. This is sufficient against a
remote network timing attacker but is not a substitute for a constant-time
native implementation against a co-located cache-line-resolution
adversary — JVM-level timing variance from JIT, GC and cache
eviction is not addressable in pure Java.
-
Nested Class Summary
Nested Classes -
Field Summary
Fields -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic booleancalculateAgreement(byte[] k, int kOff, byte[] u, int uOff, byte[] r, int rOff) static voidclampPrivateKey(byte[] k) static voidgeneratePrivateKey(SecureRandom random, byte[] k) static voidgeneratePublicKey(byte[] k, int kOff, byte[] r, int rOff) static voidstatic voidscalarMult(byte[] k, int kOff, byte[] u, int uOff, byte[] r, int rOff) static voidscalarMultBase(byte[] k, int kOff, byte[] r, int rOff)
-
Field Details
-
POINT_SIZE
public static final int POINT_SIZE- See Also:
-
SCALAR_SIZE
public static final int SCALAR_SIZE- See Also:
-
-
Constructor Details
-
X25519
public X25519()
-
-
Method Details
-
calculateAgreement
public static boolean calculateAgreement(byte[] k, int kOff, byte[] u, int uOff, byte[] r, int rOff) -
clampPrivateKey
public static void clampPrivateKey(byte[] k) -
generatePrivateKey
-
generatePublicKey
public static void generatePublicKey(byte[] k, int kOff, byte[] r, int rOff) -
precompute
public static void precompute() -
scalarMult
public static void scalarMult(byte[] k, int kOff, byte[] u, int uOff, byte[] r, int rOff) -
scalarMultBase
public static void scalarMultBase(byte[] k, int kOff, byte[] r, int rOff)
-