blob: 63f20c09df37050acef175545a0eaa7764d11c91 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
#ifndef OPENTITAN_SW_DEVICE_SCA_LIB_PRNG_H_
#define OPENTITAN_SW_DEVICE_SCA_LIB_PRNG_H_
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
/**
* @file
* @brief PRNG for side-channel analysis.
*
* This library provides a Mersenne Twister PRNG that can be used to generate
* random plaintexts on the device. Generating random plaintexts on the device
* eliminates the overhead of sending them from the host and can significantly
* improve capture rate. The host must use the same PRNG to be able to compute
* the plaintext and the ciphertext of each trace.
*
* TODO(alphan): Replace this with a more efficient PRNG after updating
* host-side code.
*/
/**
* Initializes the random number generator.
*
* @param seed Seed to initalize with.
*/
void prng_seed(uint32_t seed);
/**
* Generates a random byte.
*
* The behavior of this function matches the behavior of `random.randint(0,
* 255)` in python, which is used by ChipWhisperer's `ktp.next()`.
*
* @return A random byte.
*/
uint8_t prng_rand_byte(void);
/**
* Fills a buffer with random bytes.
*
* The behavior of this function matches the behavior of `random.randint(0,
* 255)` in python, which is used by ChipWhisperer's `ktp.next()`.
*
* @param[out] buffer A buffer.
* @param buffer_len Size of the buffer.
*
* @return A random byte.
*/
void prng_rand_bytes(uint8_t *buffer, size_t buffer_len);
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
#endif // OPENTITAN_SW_DEVICE_SCA_LIB_PRNG_H_