public static void ge_tobytes(byte[] s,ge_p2 h) { int[] recip = new int[10]; int[] x = new int[10]; int[] y = new int[10]; fe_invert.fe_invert(recip,h.Z); fe_mul.fe_mul(x,h.X,recip); fe_mul.fe_mul(y,h.Y,recip); fe_tobytes.fe_tobytes(s,y); s[31] ^= fe_isnegative.fe_isnegative(x) << 7; }
public static void ge_p3_tobytes(byte[] s,ge_p3 h) { int[] recip = new int[10]; int[] x = new int[10]; int[] y = new int[10]; fe_invert.fe_invert(recip,h.Z); fe_mul.fe_mul(x,h.X,recip); fe_mul.fe_mul(y,h.Y,recip); fe_tobytes.fe_tobytes(s,y); s[31] ^= fe_isnegative.fe_isnegative(x) << 7; }
fe_sub.fe_sub(mont_x_minus_one, mont_x, one); fe_add.fe_add(mont_x_plus_one, mont_x, one); fe_invert.fe_invert(inv_mont_x_plus_one, mont_x_plus_one); fe_mul.fe_mul(ed_y, mont_x_minus_one, inv_mont_x_plus_one); fe_tobytes.fe_tobytes(ed_pubkey, ed_y);
public static void curve25519_keygen(byte[] curve25519_pubkey_out, byte[] curve25519_privkey_in) { ge_p3 ed = new ge_p3(); /* Ed25519 pubkey point */ int[] ed_y_plus_one = new int[10]; int[] one_minus_ed_y = new int[10]; int[] inv_one_minus_ed_y = new int[10]; int[] mont_x = new int[10]; /* Perform a fixed-base multiplication of the Edwards base point, (which is efficient due to precalculated tables), then convert to the Curve25519 montgomery-format public key. In particular, convert Curve25519's "montgomery" x-coordinate into an Ed25519 "edwards" y-coordinate: mont_x = (ed_y + 1) / (1 - ed_y) with projective coordinates: mont_x = (ed_y + ed_z) / (ed_z - ed_y) NOTE: ed_y=1 is converted to mont_x=0 since fe_invert is mod-exp */ ge_scalarmult_base.ge_scalarmult_base(ed, curve25519_privkey_in); fe_add.fe_add(ed_y_plus_one, ed.Y, ed.Z); fe_sub.fe_sub(one_minus_ed_y, ed.Z, ed.Y); fe_invert.fe_invert(inv_one_minus_ed_y, one_minus_ed_y); fe_mul.fe_mul(mont_x, ed_y_plus_one, inv_one_minus_ed_y); fe_tobytes.fe_tobytes(curve25519_pubkey_out, mont_x); }
fe_cswap.fe_cswap(z2,z3,swap); fe_invert.fe_invert(z2,z2); fe_mul.fe_mul(x2,x2,z2); fe_tobytes.fe_tobytes(q,x2);