#include <string.h>
#include "libbitcoinpqc/slh_dsa.h"
#include <stdio.h>
#include "../../sphincsplus/ref/api.h"
#include "../../sphincsplus/ref/randombytes.h"
#include "../../sphincsplus/ref/params.h"
#define SLH_DSA_DEBUG 0
#define DEBUG_PRINT(fmt, ...) \
do { if (SLH_DSA_DEBUG) printf(fmt, ##__VA_ARGS__); } while (0)
extern void slh_dsa_init_random_source(const uint8_t *random_data, size_t random_data_size);
extern void slh_dsa_setup_custom_random(void);
extern void slh_dsa_restore_original_random(void);
int slh_dsa_sha2_128s_sign(
uint8_t *sig,
size_t *siglen,
const uint8_t *m,
size_t mlen,
const uint8_t *sk
) {
if (!sig || !siglen || !m || !sk) {
return -1;
}
DEBUG_PRINT("SLH-DSA sign: Starting to sign message of length %zu\n", mlen);
uint8_t deterministic_seed[64];
if (slh_dsa_derandomize(deterministic_seed, m, mlen, sk) != 0) {
return -1;
}
slh_dsa_init_random_source(deterministic_seed, sizeof(deterministic_seed));
slh_dsa_setup_custom_random();
DEBUG_PRINT("SLH-DSA sign: Using deterministic signing\n");
int result = crypto_sign_signature(sig, siglen, m, mlen, sk);
DEBUG_PRINT("SLH-DSA sign: signature result = %d, length = %zu\n", result, *siglen);
slh_dsa_restore_original_random();
return result;
}