37 lines
1.3 KiB
Plaintext
37 lines
1.3 KiB
Plaintext
|
#include <edsign.cuh>
|
||
|
#include <ed25519.cuh>
|
||
|
#include <sha512.cuh>
|
||
|
__device__ void expand_key(unsigned char* expanded, const unsigned char* secret) {
|
||
|
struct sha512_state s;
|
||
|
sha512_init(&s);
|
||
|
sha512_final(&s, secret, 32);
|
||
|
sha512_get(&s, expanded, 0, 64);
|
||
|
ed25519_prepare(expanded);
|
||
|
}
|
||
|
__device__ void pp(unsigned char* packed, const struct ed25519_pt* p) {
|
||
|
unsigned char x[F25519_SIZE], y[F25519_SIZE];
|
||
|
ed25519_unproject(x, y, p);
|
||
|
ed25519_pack(packed, x, y);
|
||
|
}
|
||
|
__device__ void sm_pack(unsigned char* r, const unsigned char* k) {
|
||
|
struct ed25519_pt p;
|
||
|
ed25519_smult(&p, &ed25519_base, k);
|
||
|
pp(r, &p);
|
||
|
}
|
||
|
__device__ void edsign_sec_to_pub(unsigned char* pub, const unsigned char* secret) {
|
||
|
unsigned char expanded[64];
|
||
|
expand_key(expanded, secret);
|
||
|
sm_pack(pub, expanded);
|
||
|
}
|
||
|
__device__ void compact_wipe(void* data, unsigned long length) {
|
||
|
volatile unsigned char* p = (volatile unsigned char*)data;
|
||
|
while (length--) {
|
||
|
*p++ = 0;
|
||
|
}
|
||
|
}
|
||
|
__device__ void ed25519_keygen(unsigned char private_key[64], unsigned char public_key[32], unsigned char random_seed[32]) {
|
||
|
edsign_sec_to_pub(public_key, random_seed);
|
||
|
memcpy(private_key, random_seed, 32);
|
||
|
memcpy(private_key + 32, public_key, 32);
|
||
|
compact_wipe(random_seed, 32);
|
||
|
}
|