#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mldsa_native.h>
#include "expected_test_vectors.h"
#define MLDSA_PK_BYTES MLDSA_PUBLICKEYBYTES(MLD_CONFIG_PARAMETER_SET)
#define MLDSA_SK_BYTES MLDSA_SECRETKEYBYTES(MLD_CONFIG_PARAMETER_SET)
#define MLDSA_SIG_BYTES MLDSA_BYTES(MLD_CONFIG_PARAMETER_SET)
#define CHECK(x) \
do \
{ \
int rc; \
rc = (x); \
if (!rc) \
{ \
fprintf(stderr, "ERROR (%s,%d)\n", __FILE__, __LINE__); \
return 1; \
} \
} while (0)
#if !defined(MLD_CONFIG_NO_KEYPAIR_API)
static int example_keygen(void)
{
uint8_t pk[MLDSA_PK_BYTES];
uint8_t sk[MLDSA_SK_BYTES];
printf("Generating keypair... ");
CHECK(mldsa_keypair_internal(pk, sk, test_vector_rnd) == 0);
CHECK(memcmp(pk, test_vector_pk, MLDSA_PK_BYTES) == 0);
CHECK(memcmp(sk, test_vector_sk, MLDSA_SK_BYTES) == 0);
printf("DONE\n");
return 0;
}
#else
static int example_keygen(void)
{
printf("Generating keypair... SKIPPED (keygen API disabled)\n");
return 0;
}
#endif
#if !defined(MLD_CONFIG_NO_SIGN_API)
static int example_sign(void)
{
uint8_t sig[MLDSA_SIG_BYTES];
size_t siglen;
uint8_t pre[TEST_VECTOR_CTX_LEN + 2];
printf("Signing message... ");
pre[0] = 0;
pre[1] = TEST_VECTOR_CTX_LEN;
memcpy(pre + 2, TEST_VECTOR_CTX, TEST_VECTOR_CTX_LEN);
CHECK(mldsa_signature_internal(sig, &siglen, (const uint8_t *)TEST_VECTOR_MSG,
TEST_VECTOR_MSG_LEN, pre, sizeof(pre),
test_vector_rnd, test_vector_sk, 0) == 0);
CHECK(siglen == sizeof(test_vector_sig));
CHECK(memcmp(sig, test_vector_sig, siglen) == 0);
printf("DONE\n");
return 0;
}
#else
static int example_sign(void)
{
printf("Signing message... SKIPPED (sign API disabled)\n");
return 0;
}
#endif
#if !defined(MLD_CONFIG_NO_VERIFY_API)
static int example_verify(void)
{
printf("Verifying signature... ");
CHECK(mldsa_verify(test_vector_sig, sizeof(test_vector_sig),
(const uint8_t *)TEST_VECTOR_MSG, TEST_VECTOR_MSG_LEN,
(const uint8_t *)TEST_VECTOR_CTX, TEST_VECTOR_CTX_LEN,
test_vector_pk) == 0);
printf("DONE\n");
return 0;
}
#else
static int example_verify(void)
{
printf("Verifying signature... SKIPPED (verify API disabled)\n");
return 0;
}
#endif
int main(void)
{
int r = 0;
printf("ML-DSA-%d Deterministic Example\n", MLD_CONFIG_PARAMETER_SET);
printf("======================\n\n");
printf("Message: %s\n", TEST_VECTOR_MSG);
printf("Context: %s\n\n", TEST_VECTOR_CTX);
r |= example_keygen();
r |= example_sign();
r |= example_verify();
if (r)
{
return 1;
}
printf("\nAll tests passed! ML-DSA signature verification successful.\n");
return 0;
}