#include #include #include __device__ __forceinline__ void expand_key(unsigned char* expanded, const unsigned char* secret) { struct sha512_state s; memcpy(&s, &sha512_initial_state, sizeof(s)); sha512_final(&s, secret); sha512_get(&s, expanded); expanded[0] &= 0xf8; expanded[31] &= 0x7f; expanded[31] |= 0x40; } __device__ __forceinline__ void sm_pack(unsigned char* r, const unsigned char* k) { struct ed25519_pt p; ed25519_smult(&p, k); unsigned char x[32], y[32]; ed25519_unproject(x, y, &p); ed25519_pack(r, x, y); } __device__ void ed25519_keygen(unsigned char private_key[64], unsigned char public_key[32], unsigned char random_seed[32]) { unsigned char expanded[64]; expand_key(expanded, random_seed); sm_pack(public_key, expanded); memcpy(private_key, random_seed, 32); memcpy(private_key + 32, public_key, 32); }