diff options
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | defs.h | 2 | ||||
| -rw-r--r-- | ed448.c | 37 |
3 files changed, 25 insertions, 16 deletions
@@ -31,4 +31,4 @@ data: ge448_gen.o fe448.o sc448.o .PHONY: clean clean: - rm *.o *.out *.a + rm -rf *.o *.out *.a @@ -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 */ @@ -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; +} |
