1 #include <string.h>
2 #include "crypto_sign.h"
3 #include "crypto_hash_sha512.h"
4 #include "randombytes.h"
5 #include "ge25519.h"
6 
crypto_sign_seckey_expand(unsigned char * sk,const unsigned char * seed)7 int crypto_sign_seckey_expand(unsigned char *sk,const unsigned char *seed)
8 {
9   crypto_hash_sha512(sk,seed,32);
10   sk[0] &= 248;
11   sk[31] &= 63;
12   sk[31] |= 64;
13 
14   return 0;
15 }
16 
crypto_sign_seckey(unsigned char * sk)17 int crypto_sign_seckey(unsigned char *sk)
18 {
19   unsigned char seed[32];
20 
21   if (randombytes(seed,32) < 0)
22     return -1;
23 
24   crypto_sign_seckey_expand(sk,seed);
25 
26   return 0;
27 }
28 
crypto_sign_pubkey(unsigned char * pk,const unsigned char * sk)29 int crypto_sign_pubkey(unsigned char *pk,const unsigned char *sk)
30 {
31   sc25519 scsk;
32   ge25519_p3 gepk;
33 
34   sc25519_from32bytes(&scsk,sk);
35   ge25519_scalarmult_base(&gepk,&scsk);
36   ge25519_pack(pk,&gepk);
37 
38   return 0;
39 }
40 
crypto_sign_keypair(unsigned char * pk,unsigned char * sk)41 int crypto_sign_keypair(unsigned char *pk,unsigned char *sk)
42 {
43   crypto_sign_seckey(sk);
44   crypto_sign_pubkey(pk,sk);
45   return 0;
46 }
47