packages feed

crypton-2.1.3: cbits/tests/fuzz/fuzz_p256.c

/* A P-256 point as it arrives: two field elements, checked for being on the
 * curve, and then multiplied if they are. */
#include "tests/fuzz/fuzz.h"
#include "p256/p256.h"

void crypton_p256e_point_mul(const crypton_p256_int *n,
    const crypton_p256_int *ix, const crypton_p256_int *iy,
    crypton_p256_int *ox, crypton_p256_int *oy);

int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{
	uint8_t xb[P256_NBYTES], yb[P256_NBYTES], nb[P256_NBYTES];
	crypton_p256_int x, y, n, ox, oy;
	const uint8_t *p = data;
	size_t left = size;

	if (!fz_take(&p, &left, xb, sizeof xb))
		return 0;
	if (!fz_take(&p, &left, yb, sizeof yb))
		return 0;
	if (!fz_take(&p, &left, nb, sizeof nb))
		return 0;

	crypton_p256_from_bin(xb, &x);
	crypton_p256_from_bin(yb, &y);
	crypton_p256_from_bin(nb, &n);

	if (crypton_p256_is_valid_point(&x, &y)) {
		crypton_p256_mod(&crypton_SECP256r1_n, &n, &n);
		crypton_p256e_point_mul(&n, &x, &y, &ox, &oy);
	}
	return 0;
}