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 | } | ||
