| 1 | #include <string.h> |
| 2 | #include "crypto_sign.h" |
| 3 | #include "crypto_hash_sha512.h" |
| 4 | #include "ge.h" |
| 5 | #include "sc.h" |
| 6 | |
| 7 | int crypto_sign( |
| 8 | unsigned char *sm, |
| 9 | const unsigned char *m,unsigned long long mlen, |
| 10 | const unsigned char *pw,unsigned long long pwlen |
| 11 | ) |
| 12 | { |
| 13 | unsigned char az[64]; |
| 14 | unsigned char nonce[64]; |
| 15 | unsigned char hram[64]; |
| 16 | ge_p3 A, R; |
| 17 | |
| 18 | crypto_hash_sha512(az,pw,pwlen); |
| 19 | az[0] &= 248; |
| 20 | az[31] &= 63; |
| 21 | az[31] |= 64; |
| 22 | |
| 23 | memmove(sm + 64,m,mlen); |
| 24 | memmove(sm + 32,az + 32,32); |
| 25 | crypto_hash_sha512(nonce,sm + 32,mlen + 32); |
| 26 | |
| 27 | ge_scalarmult_base(&A,az); |
| 28 | ge_p3_tobytes(sm + 32,&A); |
| 29 | |
| 30 | sc_reduce(nonce); |
| 31 | ge_scalarmult_base(&R,nonce); |
| 32 | ge_p3_tobytes(sm,&R); |
| 33 | |
| 34 | crypto_hash_sha512(hram,sm,mlen + 64); |
| 35 | sc_reduce(hram); |
| 36 | sc_muladd(sm + 32,hram,az,nonce); |
| 37 | |
| 38 | return 0; |
| 39 | } |
| 40 | |