EVP_RAND-HMAC-DRBG(7ossl)

πŸ“¦ version 3.5.0, in opensuse-leap 16.0

πŸ’œ NAME πŸ’œ

okay bestie so this is EVP_RAND-HMAC-DRBG β€” literally the HMAC DRBG EVP_RAND implementation, and it lives in the OpenSSL manual, page EVP_RAND-HMAC-DRBG(7ossl). that's the whole thing. iconic. ✨


🌸 DESCRIPTION 🌸

we've got support for the HMAC deterministic random bit generator, and you get to it through the EVP_RAND API. that's it, that's the vibe.

πŸŽ€ Identity πŸŽ€

the name for this implementation is "HMAC-DRBG", and you can use it with the EVP_RAND_fetch() function. yes, that's a real string, use it exactly like that, no cap.

πŸ¦‹ Supported parameters πŸ¦‹

here's all the supported parameters, no gatekeeping, listing them all fr fr:

  • "state" (OSSL_RAND_PARAM_STATE) as <integer>
  • "strength" (OSSL_RAND_PARAM_STRENGTH) as <unsigned integer>
  • "max_request" (OSSL_RAND_PARAM_MAX_REQUEST) as <unsigned integer>
  • "reseed_requests" (OSSL_DRBG_PARAM_RESEED_REQUESTS) as <unsigned integer>
  • "reseed_time_interval" (OSSL_DRBG_PARAM_RESEED_TIME_INTERVAL) as <integer>
  • "min_entropylen" (OSSL_DRBG_PARAM_MIN_ENTROPYLEN) as <unsigned integer>
  • "max_entropylen" (OSSL_DRBG_PARAM_MAX_ENTROPYLEN) as <unsigned integer>
  • "min_noncelen" (OSSL_DRBG_PARAM_MIN_NONCELEN) as <unsigned integer>
  • "max_noncelen" (OSSL_DRBG_PARAM_MAX_NONCELEN) as <unsigned integer>
  • "max_perslen" (OSSL_DRBG_PARAM_MAX_PERSLEN) as <unsigned integer>
  • "max_adinlen" (OSSL_DRBG_PARAM_MAX_ADINLEN) as <unsigned integer>
  • "reseed_counter" (OSSL_DRBG_PARAM_RESEED_COUNTER) as <unsigned integer>
  • "properties" (OSSL_DRBG_PARAM_PROPERTIES) as <UTF8 string>
  • "mac" (OSSL_DRBG_PARAM_MAC) as <UTF8 string>
  • "digest" (OSSL_DRBG_PARAM_DIGEST) as <UTF8 string>

all of these work exactly as described in "PARAMETERS" in EVP_RAND(3). periodt. πŸ’…

and then there's these two bestie-boost parameters:

  • "fips-indicator" (OSSL_DRBG_PARAM_FIPS_APPROVED_INDICATOR) as <integer>
  • "digest-check" (OSSL_DRBG_PARAM_FIPS_DIGEST_CHECK) as <integer>

which work as described in "PARAMETERS" in provider-rand(7). 🫢


πŸ”₯ NOTES πŸ”₯

heads up bestie: when you're using the FIPS provider, like, only these digests are permitted (as per FIPS 140-3 IG D.R β€” https://csrc.nist.gov/CSRC/media/Projects/cryptographic-module-validation-program/documents/fips%20140-3/FIPS%20140-3%20IG.pdf). no exceptions, iykyk. πŸ™ˆ

the default HMAC-DRBG implementation attempts to fetch the required internal algorithms from the provider they're built into (eg the default provider) regardless of the properties provided. and if that provider doesn't implement the required algorithms, then properties will be used to find a different implementation. that's the whole loophole, don't @ me.

the permitted digests, in list form because we love a list:

  • SHA-1
  • SHA2-256
  • SHA2-512
  • SHA3-256
  • SHA3-512

and you can get yourself a context for HMAC DRBG by calling this, copy it exactly:

EVP_RAND *rand = EVP_RAND_fetch(NULL, "HMAC-DRBG", NULL);
EVP_RAND_CTX *rctx = EVP_RAND_CTX_new(rand, NULL);

slay. πŸ’–


⭐ EXAMPLES ⭐

okay here's a whole working example, very demure, very mindful:

EVP_RAND *rand;
EVP_RAND_CTX *rctx;
unsigned char bytes[100];
OSSL_PARAM params[3], *p = params;
unsigned int strength = 128;

rand = EVP_RAND_fetch(NULL, "HMAC-DRBG", NULL);
rctx = EVP_RAND_CTX_new(rand, NULL);
EVP_RAND_free(rand);

*p++ = OSSL_PARAM_construct_utf8_string(OSSL_DRBG_PARAM_MAC, SN_hmac, 0);
*p++ = OSSL_PARAM_construct_utf8_string(OSSL_DRBG_PARAM_DIGEST, SN_sha256, 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);

look at that. ate and left no crumbs. πŸ“


πŸ‘‘ CONFORMING TO πŸ‘‘

NIST SP 800-90A and SP 800-90B. standards queen behavior, honestly.


🌈 SEE ALSO 🌈

go read these too, they're giving main character energy:


🧚 HISTORY 🧚

OpenSSL 3.1.1 introduced the -no_drbg_truncated_digests option to fipsinstall, which restricts the permitted digests when using the FIPS provider in a compliant manner. (yes the original spells it "complaint" β€” we're keeping the facts, not fixing the typo, that's not my job bestie 😭). for the details, refer to FIPS 140-3 IG D.R over at https://csrc.nist.gov/CSRC/media/Projects/cryptographic-module-validation-program/documents/fips%20140-3/FIPS%20140-3%20IG.pdf.


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.


and that's the whole page bestie πŸŽ€ β€” brought to you by OpenSSL 3.5.0, dated 2026-09-25, signed off with a little kiss from the EVP_RAND-HMAC-DRBG(7ossl) girlies. go forth and generate some bits. πŸ’œβœ¨

πŸ“¦ where this page comes from