/* DF-3388: generate wgkeys.bin = resp_pub || priv0_raw || NPEERS × peer_raw */
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <time.h>
#include <unistd.h>
#include <crypto/curve25519/curve25519.h>

#define NPEERS	128

static void
randbuf(uint8_t *p, size_t n)
{
	size_t i;
	for (i = 0; i < n; i++)
		p[i] = (uint8_t)(random() & 0xff);
}

int
main(void)
{
	uint8_t priv[32], pub[32], base[32] = { 9 };
	FILE *f;
	int i;

	srandom(time(NULL) ^ getpid());
	f = fopen("/tmp/wgkeys.bin", "wb");
	if (!f) {
		perror("fopen");
		return 1;
	}
	randbuf(priv, 32);
	priv[0] &= 248; priv[31] &= 127; priv[31] |= 64;	/* clamp */
	curve25519(pub, priv, base);
	fwrite(pub, 32, 1, f);
	fwrite(priv, 32, 1, f);		/* already clamped (idempotent) */
	for (i = 0; i < NPEERS; i++) {
		randbuf(priv, 32);
		fwrite(priv, 32, 1, f);
	}
	fclose(f);
	printf("wrote /tmp/wgkeys.bin\n");
	return 0;
}
