mirror of
https://github.com/guanzhi/GmSSL.git
synced 2026-05-07 00:46:17 +08:00
86 lines
2.0 KiB
C
86 lines
2.0 KiB
C
/*
|
|
* Copyright (C) 2017 Nagravision S.A.
|
|
*/
|
|
#include "gravity.h"
|
|
#include "randombytes.h"
|
|
|
|
|
|
int crypto_sign_keypair (unsigned char *pk, unsigned char *sk) {
|
|
|
|
struct gravity_sk sk_str;
|
|
struct gravity_pk pk_str;
|
|
|
|
if (!pk || !sk) return -1;
|
|
|
|
randombytes (sk_str.seed.h, HASH_SIZE);
|
|
randombytes (sk_str.salt.h, HASH_SIZE);
|
|
|
|
gravity_gensk (&sk_str);
|
|
|
|
memcpy (sk, (void *)&sk_str, sizeof (struct gravity_sk));
|
|
|
|
gravity_genpk (&sk_str, &pk_str);
|
|
|
|
memcpy (pk, pk_str.k.h, HASH_SIZE);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int crypto_sign (unsigned char *sm,
|
|
unsigned long long *smlen,
|
|
const unsigned char *m,
|
|
unsigned long long mlen,
|
|
const unsigned char *sk) {
|
|
|
|
struct gravity_sk sk_str;
|
|
struct hash msg;
|
|
struct gravity_sign sig;
|
|
int ret;
|
|
|
|
if (!sm || !smlen || !m || !sk) return -1;
|
|
|
|
hash_to_N (&msg, m, mlen);
|
|
|
|
memcpy ((void *)&sk_str, sk, sizeof (struct gravity_sk));
|
|
|
|
memset ((uint8_t *)(&sig), 0, sizeof (struct gravity_sign));
|
|
|
|
ret = gravity_sign (&sk_str, &sig, &msg);
|
|
|
|
if (ret != GRAVITY_OK) return ret;
|
|
|
|
memcpy (sm + mlen, (uint8_t *)(&sig), sizeof (struct gravity_sign));
|
|
|
|
memmove (sm, m, mlen);
|
|
*smlen = mlen + sizeof (struct gravity_sign);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int crypto_sign_open (unsigned char *m,
|
|
unsigned long long *mlen,
|
|
const unsigned char *sm,
|
|
unsigned long long smlen,
|
|
const unsigned char *pk) {
|
|
|
|
struct gravity_pk pk_str;
|
|
struct hash msg;
|
|
struct gravity_sign sig;
|
|
|
|
if (!m || !mlen || !sm || !pk) return -1;
|
|
|
|
if (smlen < sizeof (struct gravity_sign)) return -2;
|
|
|
|
*mlen = smlen - sizeof (struct gravity_sign);
|
|
|
|
memcpy ((void *)(&pk_str), pk, HASH_SIZE);
|
|
|
|
memcpy ((void *)&sig, sm + *mlen, sizeof (struct gravity_sign));
|
|
|
|
memcpy (m, sm, *mlen);
|
|
|
|
hash_to_N (&msg, m, *mlen);
|
|
|
|
return gravity_verify (&pk_str, &sig, &msg);
|
|
}
|