EVP_RAND-CTR-DRBG(7ossl)
π EVP_RAND-CTR-DRBG β the CTR DRBG glow-up
okay so this is the OpenSSL page for the CTR DRBG EVP_RAND implementation β it lives in the 7ossl manual section, and it's basically the cheat sheet for the counter-mode deterministic random bit generator. bestie, this thing generates random bits deterministically, which sounds like an oxymoron but is literally the whole point. slay.
πΈ NAME
EVP_RAND-CTR-DRBG β the CTR DRBG EVP_RAND implementation. that's it, that's the name, no notes π
β¨ DESCRIPTION
So this is the support for the counter deterministic random bit generator, and you get at it through the EVP_RAND API. periodt.
π Identity
"CTR-DRBG" is the name for this implementation β like, its government name. you use it with the EVP_RAND_fetch() function. remember it, spell it right, there is a hyphen, yes it matters π«Ά
π¦ Supported parameters
these are the parameters it fucks with, in order:
"state"(OSSL_RAND_PARAM_STATE)<integer>"strength"(OSSL_RAND_PARAM_STRENGTH)<unsigned integer>"max_request"(OSSL_RAND_PARAM_MAX_REQUEST)<unsigned integer>"reseed_requests"(OSSL_DRBG_PARAM_RESEED_REQUESTS)<unsigned integer>"reseed_time_interval"(OSSL_DRBG_PARAM_RESEED_TIME_INTERVAL)<integer>"min_entropylen"(OSSL_DRBG_PARAM_MIN_ENTROPYLEN)<unsigned integer>"max_entropylen"(OSSL_DRBG_PARAM_MAX_ENTROPYLEN)<unsigned integer>"min_noncelen"(OSSL_DRBG_PARAM_MIN_NONCELEN)<unsigned integer>"max_noncelen"(OSSL_DRBG_PARAM_MAX_NONCELEN)<unsigned integer>"max_perslen"(OSSL_DRBG_PARAM_MAX_PERSLEN)<unsigned integer>"max_adinlen"(OSSL_DRBG_PARAM_MAX_ADINLEN)<unsigned integer>"reseed_counter"(OSSL_DRBG_PARAM_RESEED_COUNTER)<unsigned integer>"properties"(OSSL_DRBG_PARAM_PROPERTIES)<UTF8 string>"cipher"(OSSL_DRBG_PARAM_CIPHER)<UTF8 string>
all of those behave exactly like the descriptions in "PARAMETERS" in EVP_RAND(3). no cap, go read that one too.
and then there's this one, the main character:
"use_derivation_function"(OSSL_DRBG_PARAM_USE_DF)<integer>β this is a Boolean (an integer pretending to be a yes/no, iconic) that says whether a derivation function should be used. nonzero value (and that's the default, so if you don't touch it, you get the derivation function) means yes, use it. a zero value means nope, no derivation function for you. π
π NOTES
to get yourself a context for CTR DRBG, you literally just call this:
EVP_RAND *rand = EVP_RAND_fetch(NULL, "CTR-DRBG", NULL);
EVP_RAND_CTX *rctx = EVP_RAND_CTX_new(rand, NULL);
like, that's the whole ritual. two lines. ate.
okay and here's a detail that's easy to miss and it's giving important: the default CTR-DRBG implementation tries to fetch the internal algorithms it needs from the provider they're built into β for example the default provider β and it does that regardless of the properties you provided. π so your properties aren't even consulted first, bestie. but β if that provider doesn't implement the required algorithms, then properties get used to go find a different implementation. so it's like, properties are the plan B, not the plan A. iykyk.
π₯ EXAMPLES
here's a full little example, look at her go:
EVP_RAND *rand;
EVP_RAND_CTX *rctx;
unsigned char bytes[100];
OSSL_PARAM params[2], *p = params;
unsigned int strength = 128;
rand = EVP_RAND_fetch(NULL, "CTR-DRBG", NULL);
rctx = EVP_RAND_CTX_new(rand, NULL);
EVP_RAND_free(rand);
*p++ = OSSL_PARAM_construct_utf8_string(OSSL_DRBG_PARAM_CIPHER,
SN_aes_256_ctr, 0);
*p = OSSL_PARAM_construct_end();
EVP_RAND_instantiate(rctx, strength, 0, NULL, 0, params);
EVP_RAND_generate(rctx, bytes, sizeof(bytes), strength, 0, NULL, 0);
EVP_RAND_CTX_free(rctx);
fetch it, wrap it in a ctx, free the raw rand (yes, immediately, that's not a mistake, the ctx keeps what it needs), build your params with SN_aes_256_ctr as the cipher, OSSL_PARAM_construct_end() to cap it off, instantiate at strength = 128, generate 100 bytes, then free the ctx. clean. π
π§ CONFORMING TO
NIST SP 800-90A and SP 800-90B β she's certified, she's standards-compliant, she showed up with receipts. π
β SEE ALSO
EVP_RAND(3)"PARAMETERS"inEVP_RAND(3)
π COPYRIGHT
Copyright 2020-2025 The OpenSSL Project Authors. All Rights Reserved.
Licensed under the Apache License 2.0 (the "License"). You may not use this file except in compliance with the License. You can obtain a copy in the file LICENSE in the source distribution or at <https://www.openssl.org/source/license.html>.
fr fr read the license before you go copying this, it's not a suggestion π«Ά
okay that's the whole page, mwah π β this was OpenSSL 3.5.6, dated 2026-04-07, and she's filed under EVP_RAND-CTR-DRBG(7ossl). go make some deterministic randomness, bestie. πβ¨
π¦ where this page comes from
- freebsd 15.1: base 15.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms