summaryrefslogtreecommitdiff
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
parent34f072f9eefbd289e8e86a28887d15503a075548 (diff)
add derive_pkHEADmaster
-rw-r--r--Makefile2
-rw-r--r--defs.h2
-rw-r--r--ed448.c37
3 files changed, 25 insertions, 16 deletions
diff --git a/Makefile b/Makefile
index 4b1c189..9aef485 100644
--- a/Makefile
+++ b/Makefile
@@ -31,4 +31,4 @@ data: ge448_gen.o fe448.o sc448.o
.PHONY: clean
clean:
- rm *.o *.out *.a
+ rm -rf *.o *.out *.a
diff --git a/defs.h b/defs.h
index 4222a11..4fc95eb 100644
--- a/defs.h
+++ b/defs.h
@@ -17,6 +17,8 @@ int crypto_sign_ed448_detached(unsigned char *sign, unsigned long long *smlen, c
int crypto_sign_ed448_open_detached(const unsigned char *m, unsigned long long mlen, const unsigned char *sign, const unsigned char *pk);
+int crypto_sign_ed448_derive_pk(unsigned char *pk, const unsigned char *sk);
+
int crypto_verify_57(const unsigned char *x, const unsigned char *y);
#endif /* DEFS_H */
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;
+}