EVP_RAND-CTR-DRBG(7ossl)

πŸ“¦
version 15.1 Β· 3 versions
, in freebsd 15.1

πŸ’… 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


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