5 #include "crypto_hash_sha512.h"
6 #include "crypto_scalarmult_curve25519.h"
7 #include "randombytes.h"
12 int crypto_sign_seed_keypair(unsigned char *pk, unsigned char *sk,
13 const unsigned char *seed)
17 crypto_hash_sha512(sk,seed,32);
22 ge_scalarmult_base(&A,sk);
25 memmove(sk, seed, 32);
26 memmove(sk + 32, pk, 32);
30 int crypto_sign_keypair(unsigned char *pk, unsigned char *sk)
32 unsigned char seed[32];
35 randombytes_buf(seed, sizeof seed);
36 ret = crypto_sign_seed_keypair(pk, sk, seed);
37 sodium_memzero(seed, sizeof seed);
42 int crypto_sign_ed25519_pk_to_curve25519(unsigned char *curve25519_pk,
43 const unsigned char *ed25519_pk)
49 if (ge_frombytes_negate_vartime(&A, ed25519_pk) != 0) {
53 fe_sub(one_minus_y, one_minus_y, A.Y);
54 fe_invert(one_minus_y, one_minus_y);
57 fe_mul(x, x, one_minus_y);
58 fe_tobytes(curve25519_pk, x);
63 int crypto_sign_ed25519_sk_to_curve25519(unsigned char *curve25519_sk,
64 const unsigned char *ed25519_sk)
66 unsigned char h[crypto_hash_sha512_BYTES];
68 crypto_hash_sha512(h, ed25519_sk,
69 crypto_sign_ed25519_SECRETKEYBYTES -
70 crypto_sign_ed25519_PUBLICKEYBYTES);
74 memcpy(curve25519_sk, h, crypto_scalarmult_curve25519_BYTES);
75 sodium_memzero(h, sizeof h);