| Updated: October 28, 2024 |
The qcrypto library API includes RNG functions.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <qcrypto/qcrypto.h>
#include <qcrypto/qcrypto_error.h>
#define RNG_BYTES 32
int main(void)
{
int ret;
qcrypto_ctx_t* qctx = NULL;
const char* personal_str = "Hello World!";
uint8_t result[RNG_BYTES];
uint8_t seed = 200;
/* Initialize the Qcrypto Library */
ret = qcrypto_init(QCRYPTO_INIT_LAZY, NULL);
if (ret != QCRYPTO_R_EOK) {
fprintf(stderr, "qcryto_init() failed (%d:%s)\n", ret, qcrypto_strerror(ret));
goto done;
}
/* Request drbg-ctr-128 */
ret = qcrypto_rng_request("drbg-ctr-128", NULL, 0, &qctx);
if (ret != QCRYPTO_R_EOK) {
fprintf(stderr, "qcrypto_rng_request() failed (%d:%s)\n", ret, qcrypto_strerror(ret));
goto done;
}
/* Initialize RNG arguments */
qcrypto_rng_args_t rargs = {
.drbg.pstr = (const uint8_t*)personal_str,
.drbg.pstrsize = sizeof(personal_str),
};
/* Initialize an RNG */
ret = qcrypto_rng_init(qctx, amp;rargs);
if (ret != QCRYPTO_R_EOK) {
fprintf(stderr, "qcrypto_rng_init() failed (%d:%s)\n", ret, qcrypto_strerror(ret));
goto done;
}
/* Seed the RNG */
ret = qcrypto_rng_seed(qctx, amp;seed, sizeof(seed));
if (ret != QCRYPTO_R_EOK) {
fprintf(stderr, "qcrypto_rng_seed() failed (%d:%s)\n", ret, qcrypto_strerror(ret));
goto done;
}
/* Extracts a random value from the RNG */
ret = qcrypto_rng_bytes(qctx, result, RNG_BYTES);
if (ret != QCRYPTO_R_EOK) {
fprintf(stderr, "qcrypto_rng_bytes() failed (%d:%s)\n", ret, qcrypto_strerror(ret));
goto done;
}
/* Print the result */
printf("The random value generated from PRNG is: ");
for (int i=0; i<RNG_BYTES; i++) {
printf("%02X", result[i]);
}
putchar('\n');
goto done;
done:
/* Release the RNG context handle */
qcrypto_release_ctx(qctx);
/* Uninitialize the Qcrypto Library */
qcrypto_uninit();
return ret;
}
#if defined(__QNXNTO__) && defined(__USESRCVERSION)
#include <sys/srcversion.h>
__SRCVERSION("$URL$ $Rev$")
#endif