CAT2 Peripheral Driver Library
Random number generation (TRNG, PRNG)

Functions

__STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Prng_Init (CRYPTO_Type *base, uint32_t *lfsrSeedValues)
 This function initializes the PRNG (Pseudo Random Number Generator) parameters. More...
 
__STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Prng (CRYPTO_Type *base, uint32_t max, uint32_t *randomNum)
 This function generates a Pseudo Random Number based on the initial seed values provided in Cy_Crypto_Prng_Init(). More...
 
cy_en_crypto_status_t Cy_Crypto_Trng (CRYPTO_Type *base, uint32_t max, uint32_t *randomNum)
 This function generates a True Random Number. More...
 

Detailed Description

Function Documentation

◆ Cy_Crypto_Prng_Init()

__STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Prng_Init ( CRYPTO_Type *  base,
uint32_t *  lfsrSeedValues 
)

This function initializes the PRNG (Pseudo Random Number Generator) parameters.

Invoking this function causes a restart of the pseudo-random sequence.

Note
Invoking this function multiple times with the same set of seed values results in the same sequence of random numbers with Cy_Crypto_Prng function. To obtain a different pseudo-random sequence, pass a different set of seed values for the LFSR registers. It is recommended to use Cy_Crypto_Trng() to generate random seed values for each initialization.
Parameters
baseBase address of the Crypto block registers
lfsrSeedValuesPointer to an array of three seed values for the Linear Feedback Shift Registers - LFSR32, LFSR31 and LFSR29 respectively. Each seed value must be a non-zero, random number. Passing NULL will cause seed values to be generated internally, using the Cy_Crypto_Trng() function. In this case, ensure that Cy_Crypto_Trng() is not called from another thread until the this function returns.
Returns
cy_en_crypto_status_t
Function Usage
/* Initialization seed values for pseudo random number generator.
These can be any non-zero random numbers. Cy_Crypto_Trng function can be
used to generate the initial seed values as well. If a NULL pointer is
passed, the seed values are calculated and set internally.
*/
#define LFSR32_INITSTATE (0xd8959bc9)
#define LFSR31_INITSTATE (0x2bb911f8)
#define LFSR29_INITSTATE (0x060c31b7)
#define MAX_PRNG_VALUE (10000UL)
/* Generated random number */
uint32_t rndNum = 0;
uint32_t lfsrSeedValues[3] = {LFSR32_INITSTATE, LFSR31_INITSTATE, LFSR29_INITSTATE};
cy_en_crypto_status_t cryptoStatus;
/* Initialize the pseudo random number generator */
cryptoStatus = Cy_Crypto_Prng_Init(
CRYPTO, /* Base address of the Crypto block registers */
lfsrSeedValues); /* Seed value for the three LFSR registers */
/* ... check for errors... */
/* Generate a pseudo random number in the specified range */
cryptoStatus = Cy_Crypto_Prng(
CRYPTO, /* Base address of the Crypto block registers */
MAX_PRNG_VALUE, /* Range of random number */
&rndNum); /* Pointer to generated random number */
/* ... check for errors... */

◆ Cy_Crypto_Prng()

__STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Prng ( CRYPTO_Type *  base,
uint32_t  max,
uint32_t *  randomNum 
)

This function generates a Pseudo Random Number based on the initial seed values provided in Cy_Crypto_Prng_Init().

Parameters
baseBase address of the Crypto block registers
maxMaximum value of the generated pseudo random number. The range of the pseudo random number generated is [0, max]. The max value can be any integer between 1 and 232 - 1 (1 to 4294967295).
randomNumPointer to the generated pseudo random number. This must be a pointer to a 32-bit number.
Returns
cy_en_crypto_status_t
Function Usage
/* Initialization seed values for pseudo random number generator.
These can be any non-zero random numbers. Cy_Crypto_Trng function can be
used to generate the initial seed values as well. If a NULL pointer is
passed, the seed values are calculated and set internally.
*/
#define LFSR32_INITSTATE (0xd8959bc9)
#define LFSR31_INITSTATE (0x2bb911f8)
#define LFSR29_INITSTATE (0x060c31b7)
#define MAX_PRNG_VALUE (10000UL)
/* Generated random number */
uint32_t rndNum = 0;
uint32_t lfsrSeedValues[3] = {LFSR32_INITSTATE, LFSR31_INITSTATE, LFSR29_INITSTATE};
cy_en_crypto_status_t cryptoStatus;
/* Initialize the pseudo random number generator */
cryptoStatus = Cy_Crypto_Prng_Init(
CRYPTO, /* Base address of the Crypto block registers */
lfsrSeedValues); /* Seed value for the three LFSR registers */
/* ... check for errors... */
/* Generate a pseudo random number in the specified range */
cryptoStatus = Cy_Crypto_Prng(
CRYPTO, /* Base address of the Crypto block registers */
MAX_PRNG_VALUE, /* Range of random number */
&rndNum); /* Pointer to generated random number */
/* ... check for errors... */

◆ Cy_Crypto_Trng()

cy_en_crypto_status_t Cy_Crypto_Trng ( CRYPTO_Type *  base,
uint32_t  max,
uint32_t *  randomNum 
)

This function generates a True Random Number.

Note
True random number generation is slower than pseudo random number generation. For generating a large number of random numbers, it is recommended to use this function to obtain random seed values for PRNG and generate the random numbers by using the Cy_Crypto_Prng() function.
Parameters
baseBase address of the Crypto block registers
maxMaximum length of a random number, in the range of [1, 32] bits. The generated random number is in the range of [1, 2max].
randomNumPointer to the generated true random number. This must be a pointer to a 32-bit number.
Returns
cy_en_crypto_status_t
Function Usage
#define MAX_TRNG_BIT_SIZE (32UL)
/* Generated random number */
uint32_t rndNum = 0;
cy_en_crypto_status_t cryptoStatus;
/* Generate a true random number in the specified range */
cryptoStatus = Cy_Crypto_Trng(
CRYPTO, /* Base address of the Crypto block registers */
MAX_TRNG_BIT_SIZE, /* Range of random number */
&rndNum); /* Pointer to generated random number */
/* ... check for errors... */