#include "crypto_sign.h" #include "crypto_verify_32.h" #include "sha512.h" #include "ge25519.h" static void get_hram(unsigned char *hram, const unsigned char *sm, const unsigned char *pk, unsigned char *playground, unsigned long long smlen) { unsigned long long i; for (i = 0;i < 32;++i) playground[i] = sm[i]; for (i = 32;i < 64;++i) playground[i] = pk[i-32]; for (i = 64;i < smlen;++i) playground[i] = sm[i]; crypto_hash_sha512(hram,playground,smlen); } int crypto_sign_publickey( unsigned char *pk, // write 32 bytes into this unsigned char *sk, // write 64 bytes into this (seed+pubkey) unsigned char *seed // 32 bytes ) { sc25519 scsk; ge25519 gepk; int i; crypto_hash_sha512(sk, seed, 32); sk[0] &= 248; sk[31] &= 127; sk[31] |= 64; sc25519_from32bytes(&scsk,sk); ge25519_scalarmult_base(&gepk, &scsk); ge25519_pack(pk, &gepk); for(i=0;i<32;i++) sk[32 + i] = pk[i]; for(i=0;i<32;i++) sk[i] = seed[i]; return 0; } int crypto_sign( unsigned char *sm,unsigned long long *smlen, const unsigned char *m,unsigned long long mlen, const unsigned char *sk ) { sc25519 sck, scs, scsk; ge25519 ger; unsigned char r[32]; unsigned char s[32]; unsigned char extsk[64]; unsigned long long i; unsigned char hmg[crypto_hash_sha512_BYTES]; unsigned char hram[crypto_hash_sha512_BYTES]; crypto_hash_sha512(extsk, sk, 32); extsk[0] &= 248; extsk[31] &= 127; extsk[31] |= 64; *smlen = mlen+64; for(i=0;i