/* * Generates |outlen| random bytes and stores them in |out|. It will * using the given |drbg| to generate the bytes. * * Requires that drbg->lock is already locked for write, if non-null. * * Returns 1 on success 0 on failure. */ int RAND_DRBG_bytes(RAND_DRBG *drbg, unsigned char *out, size_t outlen) { unsigned char *additional = NULL; size_t additional_len; size_t chunk; size_t ret; additional_len = rand_drbg_get_additional_data(&additional, drbg->max_adinlen); for ( ; outlen > 0; outlen -= chunk, out += chunk) { chunk = outlen; if (chunk > drbg->max_request) chunk = drbg->max_request; ret = RAND_DRBG_generate(drbg, out, chunk, 0, additional, additional_len); if (!ret) goto err; } ret = 1; err: if (additional_len != 0) OPENSSL_secure_clear_free(additional, additional_len); return ret; }
/* * Generates |outlen| random bytes and stores them in |out|. It will * using the given |drbg| to generate the bytes. * * Requires that drbg->lock is already locked for write, if non-null. * * Returns 1 on success 0 on failure. */ int RAND_DRBG_bytes(RAND_DRBG *drbg, unsigned char *out, size_t outlen) { unsigned char *additional = NULL; size_t additional_len; size_t chunk; size_t ret = 0; if (drbg->adin_pool == NULL) { if (drbg->type == 0) goto err; drbg->adin_pool = rand_pool_new(0, 0, drbg->max_adinlen); if (drbg->adin_pool == NULL) goto err; } additional_len = rand_drbg_get_additional_data(drbg->adin_pool, &additional); for ( ; outlen > 0; outlen -= chunk, out += chunk) { chunk = outlen; if (chunk > drbg->max_request) chunk = drbg->max_request; ret = RAND_DRBG_generate(drbg, out, chunk, 0, additional, additional_len); if (!ret) goto err; } ret = 1; err: if (additional != NULL) rand_drbg_cleanup_additional_data(drbg->adin_pool, additional); return ret; }