#include <stdlib.h>
#include <string.h>
#include "libbitcoinpqc/fn_dsa.h"
#include "../../falcon/falcon.h"
extern void fn_dsa_shake256_with_entropy(void *out, size_t out_len,
const void *in1, size_t in1_len,
const void *in2, size_t in2_len,
const uint8_t *entropy, size_t entropy_len);
int fn_dsa_512_keygen(
uint8_t *pk,
uint8_t *sk,
const uint8_t *random_data,
size_t random_data_size
) {
if (!pk || !sk || !random_data || random_data_size < 128) {
return -1;
}
shake256_context rng;
shake256_init(&rng);
shake256_inject(&rng, random_data, random_data_size);
shake256_flip(&rng);
uint8_t *tmp = malloc(FALCON_TMPSIZE_KEYGEN(9));
if (!tmp) {
return -1;
}
int result = falcon_keygen_make(
&rng,
9,
sk,
FN_DSA_512_SECRET_KEY_SIZE,
pk,
FN_DSA_512_PUBLIC_KEY_SIZE,
tmp,
FALCON_TMPSIZE_KEYGEN(9)
);
memset(tmp, 0, FALCON_TMPSIZE_KEYGEN(9));
free(tmp);
return result;
}