public static int curve25519_sign(Sha512 sha512provider, byte[] signature_out,
byte[] curve25519_privkey,
byte[] msg, int msg_len,
byte[] random)
{
ge_p3 ed_pubkey_point = new ge_p3();
byte[] ed_pubkey = new byte[32];
byte[] sigbuf = new byte[msg_len + 128];
byte sign_bit = 0;
ge_scalarmult_base.ge_scalarmult_base(ed_pubkey_point, curve25519_privkey);
ge_p3_tobytes.ge_p3_tobytes(ed_pubkey, ed_pubkey_point);
sign_bit = (byte)(ed_pubkey[31] & 0x80);
sign_modified.crypto_sign_modified(sha512provider, sigbuf, msg, msg_len, curve25519_privkey,
ed_pubkey, random);
System.arraycopy(sigbuf, 0, signature_out, 0, 64);
signature_out[63] &= 0x7F;
signature_out[63] |= sign_bit;
return 0;
}