#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "libbitcoinpqc/fn_dsa.h"
#include "../../falcon/falcon.h"
#define FN_DSA_DEBUG 0
#define DEBUG_PRINT(fmt, ...) \
do { if (FN_DSA_DEBUG) printf(fmt, ##__VA_ARGS__); } while (0)
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_sign(
uint8_t *sig,
size_t *siglen,
const uint8_t *m,
size_t mlen,
const uint8_t *sk
) {
if (!sig || !siglen || !m || !sk) {
DEBUG_PRINT("FN-DSA sign: Invalid arguments\n");
return -1;
}
shake256_context rng;
shake256_init(&rng);
shake256_inject(&rng, sk, FN_DSA_512_SECRET_KEY_SIZE);
shake256_inject(&rng, m, mlen);
shake256_flip(&rng);
size_t tmp_size = FALCON_TMPSIZE_SIGNDYN(9);
uint8_t *tmp = malloc(tmp_size);
if (!tmp) {
DEBUG_PRINT("FN-DSA sign: Memory allocation failed\n");
return -1;
}
DEBUG_PRINT("FN-DSA sign: Calling falcon_sign_dyn\n");
int result = falcon_sign_dyn(
&rng, sig, siglen, FALCON_SIG_COMPRESSED, sk, FN_DSA_512_SECRET_KEY_SIZE, m, mlen, tmp, tmp_size );
DEBUG_PRINT("FN-DSA sign: Created signature of length %zu, result %d\n",
*siglen, result);
memset(tmp, 0, tmp_size);
free(tmp);
return result;
}