Update corpora to include ml-kem seed corpus

Reviewed-by: Viktor Dukhovni <viktor@openssl.org>
Reviewed-by: Tim Hudson <tjh@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/26657)
This commit is contained in:
Neil Horman 2025-02-06 08:37:49 -05:00 committed by Tomas Mraz
parent f440e816d0
commit f0be0521d1
2 changed files with 20 additions and 39 deletions

@ -1 +1 @@
Subproject commit 9f7667061314ecf9a287ce1c9702073ca1e345e3 Subproject commit 93072ea488b1d9035e0ae29c7d6c5fab8f3471af

View file

@ -20,40 +20,6 @@
#include "internal/nelem.h" #include "internal/nelem.h"
#include "fuzzer.h" #include "fuzzer.h"
/**
* @brief Consumes a 16-bit unsigned integer from a buffer.
*
* This function extracts a 16-bit unsigned integer from the given buffer
* while ensuring proper alignment. It adjusts the buffer pointer to the
* next 16-bit boundary, extracts the value, advances the pointer, and
* updates the remaining buffer length.
*
* @param buf Pointer to the input buffer.
* @param len Pointer to the size of the remaining buffer; updated after consumption.
* @param val Pointer to store the extracted 16-bit value.
*
* @return Pointer to the updated buffer position after reading the value,
* or NULL if the buffer does not contain enough data.
*/
static uint8_t *consume_uint16t(const uint8_t *buf, size_t *len, uint16_t *val)
{
uint8_t *buf_idx = (uint8_t *)buf;
if (*len < (sizeof(uint16_t) * 2))
return NULL;
/*
* Align the buffer to the next 16 bit boundary
*/
buf_idx = (buf_idx + (sizeof(uint16_t) - 1));
buf_idx = (uint8_t *)((uintptr_t)buf_idx & (uintptr_t)(~(sizeof(uint16_t) - 1)));
*val = (uint16_t)*buf_idx;
/* advance the buffer pointer */
buf_idx += sizeof(uint16_t);
/* compute our remaining length */
*len -= (buf_idx - buf);
return buf_idx;
}
/** /**
* @brief Consumes an 8-bit unsigned integer from a buffer. * @brief Consumes an 8-bit unsigned integer from a buffer.
* *
@ -99,7 +65,13 @@ static int select_keytype_and_size(uint8_t **buf, size_t *len,
uint16_t keysize; uint16_t keysize;
uint16_t modulus = 6; uint16_t modulus = 6;
*buf = consume_uint16t(*buf, len, &keysize); /*
* Note: We don't really care about endianess here, we just
* want a random 16 bit value
*/
*buf = (uint8_t *)OPENSSL_load_u16_le(&keysize, *buf);
*len -= sizeof(uint16_t);
if (*buf == NULL) if (*buf == NULL)
return 0; return 0;
@ -137,9 +109,10 @@ static int select_keytype_and_size(uint8_t **buf, size_t *len,
case 4: case 4:
/* Select valid alg, but bogus size */ /* Select valid alg, but bogus size */
*keytype = "ML-KEM-1024"; *keytype = "ML-KEM-1024";
*buf = consume_uint16t(*buf, len, &keysize); *buf = (uint8_t *)OPENSSL_load_u16_le(&keysize, *buf);
*len -= sizeof(uint16_t);
*keylen = (size_t)keysize; *keylen = (size_t)keysize;
*keylen %= 2048; /* size to our key buffer */ *keylen %= 1024; /* size to our key buffer */
break; break;
default: default:
*keytype = NULL; *keytype = NULL;
@ -170,7 +143,7 @@ static void create_mlkem_raw_key(uint8_t **buf, size_t *len,
EVP_PKEY *pubkey; EVP_PKEY *pubkey;
char *keytype = NULL; char *keytype = NULL;
size_t keylen = 0; size_t keylen = 0;
uint8_t key[2048]; uint8_t key[4096];
int pub = 0; int pub = 0;
if (!select_keytype_and_size(buf, len, &keytype, &keylen, 0)) if (!select_keytype_and_size(buf, len, &keytype, &keylen, 0))
@ -179,9 +152,14 @@ static void create_mlkem_raw_key(uint8_t **buf, size_t *len,
/* /*
* Select public or private key creation based on the low order * Select public or private key creation based on the low order
* bit of the next buffer value * bit of the next buffer value
* Note that keylen as returned from select_keytype_and_size is
* a public key length, private keys for ML-KEM are always double
* the size plus 32, so make that adjustment here
*/ */
if ((*buf)[0] & 0x1) if ((*buf)[0] & 0x1)
pub = 1; pub = 1;
else
keylen = (keylen * 2) + 32;
/* /*
* libfuzzer provides by default up to 4096 bit input * libfuzzer provides by default up to 4096 bit input
@ -236,6 +214,9 @@ static void keygen_mlkem_real_key(uint8_t **buf, size_t *len,
again: again:
/* /*
* Only generate valid key types and lengths * Only generate valid key types and lengths
* Note, no adjustment is made to keylen here, as
* the provider is responsible for selecting the keys and sizes
* for us during the EVP_PKEY_keygen call
*/ */
if (!select_keytype_and_size(buf, len, &keytype, &keylen, 1)) if (!select_keytype_and_size(buf, len, &keytype, &keylen, 1))
return; return;