diff options
Diffstat (limited to '3rd_party/ed25519/sign.c')
-rw-r--r-- | 3rd_party/ed25519/sign.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/3rd_party/ed25519/sign.c b/3rd_party/ed25519/sign.c new file mode 100644 index 0000000..199a839 --- /dev/null +++ b/3rd_party/ed25519/sign.c | |||
@@ -0,0 +1,31 @@ | |||
1 | #include "ed25519.h" | ||
2 | #include "sha512.h" | ||
3 | #include "ge.h" | ||
4 | #include "sc.h" | ||
5 | |||
6 | |||
7 | void ed25519_sign(unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key, const unsigned char *private_key) { | ||
8 | sha512_context hash; | ||
9 | unsigned char hram[64]; | ||
10 | unsigned char r[64]; | ||
11 | ge_p3 R; | ||
12 | |||
13 | |||
14 | sha512_init(&hash); | ||
15 | sha512_update(&hash, private_key + 32, 32); | ||
16 | sha512_update(&hash, message, message_len); | ||
17 | sha512_final(&hash, r); | ||
18 | |||
19 | sc_reduce(r); | ||
20 | ge_scalarmult_base(&R, r); | ||
21 | ge_p3_tobytes(signature, &R); | ||
22 | |||
23 | sha512_init(&hash); | ||
24 | sha512_update(&hash, signature, 32); | ||
25 | sha512_update(&hash, public_key, 32); | ||
26 | sha512_update(&hash, message, message_len); | ||
27 | sha512_final(&hash, hram); | ||
28 | |||
29 | sc_reduce(hram); | ||
30 | sc_muladd(signature + 32, hram, private_key, r); | ||
31 | } | ||