package qora.crypto;
import java.util.Arrays;
import utils.Pair;
public class Ed25519 {
private native static byte[] createKeyPairN(byte[] seed);
private native static byte[] signN(byte[] privateKey, byte[] publicKey, byte[] message, int messageLength);
private native static int verifyN(byte[] signature, byte[] message, int messageLength, byte[] publicKey);
public static boolean load()
{
try
{
String arch = System.getProperty("os.arch").toLowerCase();
String os = System.getProperty("os.name").toLowerCase();
//WINDOWS
if(os.contains("windows"))
{
//32BIT
if(arch.contains("x86") || arch.contains("i386"))
{
System.loadLibrary("Qora25519.windows.x86");
}
//64BIT
else
{
System.loadLibrary("Qora25519.windows.x64");
}
}
//LINUX
if(os.contains("linux"))
{
//32BIT
if(arch.contains("x86") || arch.contains("i386"))
{
System.loadLibrary("Qora25519.linux.x86");
}
//64BIT
else
{
System.loadLibrary("Qora25519.linux.x64");
}
}
//OSX
if(os.contains("mac"))
{
System.loadLibrary("Qora25519.mac");
}
}
catch(Exception e)
{
return false;
}
return true;
}
public static Pair<byte[], byte[]> createKeyPair(byte[] seed)
{
byte[] rawPair = createKeyPairN(seed);
byte[] privateKey = Arrays.copyOfRange(rawPair, 0, 64);
byte[] publicKey = Arrays.copyOfRange(rawPair, 64, 96);
return new Pair<byte[], byte[]>(privateKey, publicKey);
}
public static byte[] sign(Pair<byte[],byte[]> keyPair, byte[] message)
{
return signN(keyPair.getA(), keyPair.getB(), message, message.length);
}
public static boolean verify(byte[] signature, byte[] message, byte[] publicKey)
{
int valid = verifyN(signature, message, message.length, publicKey);
return valid == 1;
}
}