Random number generator (RNG)
QNX SDP8.0QNX OS System Security GuideAPIConfiguration
The qcrypto library API includes RNG functions.
See the library reference for detailed descriptions of the following functions:
RNG examples
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <qcrypto/qcrypto.h>
#include <qcrypto/qcrypto_error.h>
#define RNG_BYTES 32
int main(int argc, char *argv[])
{
int ret;
qcrypto_ctx_t *qctx = NULL;
const char *personal_str = "Hello World!";
uint8_t result[RNG_BYTES];
uint8_t seed[16] = {0};
bool quiet = false;
/* 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, &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, 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 */
if ((argc > 1) && (strcmp(argv[1], "test") == 0)) {
quiet = true;
}
if (!quiet) {
printf("The random value generated from PRNG is: ");
for (int i=0; i<RNG_BYTES; i++) {
printf("%02X", result[i]);
}
putchar('\n');
}
printf("\n %s", "Success! A random value has been generated from PRNG! \n");
goto done;
done:
/* Release the RNG context handle */
qcrypto_release_ctx(qctx);
/* Uninitialize the Qcrypto Library */
qcrypto_uninit();
return ret;
}
Page updated: