aboutsummaryrefslogtreecommitdiffstats
path: root/jni/ed25519/sign.c
diff options
context:
space:
mode:
Diffstat (limited to 'jni/ed25519/sign.c')
-rw-r--r--jni/ed25519/sign.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/jni/ed25519/sign.c b/jni/ed25519/sign.c
new file mode 100644
index 00000000..de53742a
--- /dev/null
+++ b/jni/ed25519/sign.c
@@ -0,0 +1,41 @@
+#include <string.h>
+#include "crypto_sign.h"
+#include "crypto_hash_sha512.h"
+#include "ge.h"
+#include "sc.h"
+
+int crypto_sign(
+ unsigned char *sm,unsigned long long *smlen,
+ const unsigned char *m,unsigned long long mlen,
+ const unsigned char *sk
+)
+{
+ unsigned char pk[32];
+ unsigned char az[64];
+ unsigned char nonce[64];
+ unsigned char hram[64];
+ ge_p3 R;
+
+ memmove(pk,sk + 32,32);
+
+ crypto_hash_sha512(az,sk,32);
+ az[0] &= 248;
+ az[31] &= 63;
+ az[31] |= 64;
+
+ *smlen = mlen + 64;
+ memmove(sm + 64,m,mlen);
+ memmove(sm + 32,az + 32,32);
+ crypto_hash_sha512(nonce,sm + 32,mlen + 32);
+ memmove(sm + 32,pk,32);
+
+ sc_reduce(nonce);
+ ge_scalarmult_base(&R,nonce);
+ ge_p3_tobytes(sm,&R);
+
+ crypto_hash_sha512(hram,sm,mlen + 64);
+ sc_reduce(hram);
+ sc_muladd(sm + 32,hram,az,nonce);
+
+ return 0;
+}