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