summaryrefslogtreecommitdiff
path: root/ed448.c
diff options
context:
space:
mode:
authorNagi5Yeq <nagi5yeq@gmail.com>2019-07-07 23:17:35 +0800
committerNagi5Yeq <nagi5yeq@gmail.com>2019-07-07 23:17:35 +0800
commita2907fb663651eda16cf5f82880168cc7d90e1ea (patch)
treeca513e22cd1aead9190ddfa03624cc16426391c8 /ed448.c
parent34f072f9eefbd289e8e86a28887d15503a075548 (diff)
add derive_pkHEADmaster
Diffstat (limited to 'ed448.c')
-rw-r--r--ed448.c37
1 files changed, 22 insertions, 15 deletions
diff --git a/ed448.c b/ed448.c
index 087db5b..8c84fe2 100644
--- a/ed448.c
+++ b/ed448.c
@@ -14,23 +14,9 @@ int crypto_sign_ed448_keypair(
unsigned char *sk)
{
int i;
- sc448 scsk;
- ge448 gepk;
- unsigned char extsk[114];
- sha3_ctx_t ctx;
(void)getrandom(sk, 57, 0);
- shake256_init(&ctx);
- shake_update(&ctx, sk, 57);
- shake_xof(&ctx);
- shake_out(&ctx, extsk, 114);
- extsk[56] = 0;
- extsk[55] |= 0x80;
- extsk[0] &= 0xFC;
-
- sc448_from57bytes(&scsk, extsk);
- ge448_scalarmult_base(&gepk, &scsk);
- ge448_pack(pk, &gepk);
+ crypto_sign_ed448_derive_pk(pk, sk);
for (i = 0; i < 57; i++)
sk[57 + i] = pk[i];
return 0;
@@ -122,3 +108,24 @@ int crypto_verify_57(const unsigned char *x, const unsigned char *y)
}
return (1 & ((differentbits - 1) >> 8)) - 1;
}
+
+/* derive publick key from secret key, not copy */
+int crypto_sign_ed448_derive_pk(unsigned char *pk, const unsigned char *sk)
+{
+ ge448 gepk;
+ sc448 scsk;
+ unsigned char extsk[114];
+ sha3_ctx_t ctx;
+
+ shake256_init(&ctx);
+ shake_update(&ctx, sk, 57);
+ shake_xof(&ctx);
+ shake_out(&ctx, extsk, 114);
+ extsk[56] = 0;
+ extsk[55] |= 0x80;
+ extsk[0] &= 0xFC;
+ sc448_from57bytes(&scsk, extsk);
+ ge448_scalarmult_base(&gepk, &scsk);
+ ge448_pack(pk, &gepk);
+ return 0;
+}