RAND_BYTES(3ossl)
π RAND_BYTES(3ossl) β the OpenSSL random-bytes glow-up
okay so real talk bestie, this is the 3ossl page from OpenSSL, and it's literally the manual for the functions that hand you actual randomness. like, the good stuff. the cryptographic kind. no cap. π₯
β¨ NAME β¨
RAND_bytes, RAND_priv_bytes, RAND_bytes_ex, RAND_priv_bytes_ex, RAND_pseudo_bytes, RAND_set1_random_provider β generate random data π²
πΈ SYNOPSIS πΈ
#include <openssl/rand.h>
int RAND_bytes(unsigned char *buf, int num);
int RAND_priv_bytes(unsigned char *buf, int num);
int RAND_bytes_ex(OSSL_LIB_CTX *ctx, unsigned char *buf, size_t num,
unsigned int strength);
int RAND_priv_bytes_ex(OSSL_LIB_CTX *ctx, unsigned char *buf, size_t num,
unsigned int strength);
int RAND_set1_random_provider(OSSL_LIB_CTX *ctx, OSSL_PROVIDER *p);
The following function has been deprecated since OpenSSL 1.1.0, and can
be hidden entirely by defining OPENSSL_API_COMPAT with a suitable
version value, see openssl_user_macros(7):
int RAND_pseudo_bytes(unsigned char *buf, int num);
β οΈ heads up:RAND_pseudo_bytesis deprecated, bestie. like, old old. you can hide it completely by definingOPENSSL_API_COMPATwith a suitable version value β seeopenssl_user_macros(7)for the receipts.
π¦ DESCRIPTION π¦
RAND_bytes() generates num random bytes using a cryptographically secure pseudo random generator (CSPRNG) and stores them in buf. and buf MUST NOT be NULL β like, do not do that, that's not the vibe. π«
RAND_priv_bytes() has the same semantics as RAND_bytes(). it's intended to be used for generating values that should remain private. if you're using the default RAND_METHOD, this function uses a separate "private" PRNG instance so that a compromise of the "public" PRNG instance will not affect the secrecy of these private values β that's the whole point, periodt. it's all described in RAND(7) and EVP_RAND(7).
RAND_bytes_ex() and RAND_priv_bytes_ex() are the same as RAND_bytes() and RAND_priv_bytes() except that they both take additional strength and ctx parameters. the bytes generated will have a security strength of at least strength bits. the DRBG used for the operation is the public or private DRBG associated with the specified ctx. that parameter can be NULL, in which case the default library context is used (see OSSL_LIB_CTX(3)). π«Ά if the default RAND_METHOD has been changed then, for compatibility reasons, the RAND_METHOD will be used in preference and the DRBG of the library context ignored. iykyk.
RAND_set1_random_provider() specifies a provider, prov, which will be used by the library context ctx for all of the generate calls above, instead of the built-in in DRBGs and entropy source. pass NULL for the provider to disable the random provider functionality β in this case, the built-in DRBGs and entropy source will be used. π
π«§ lowkey important: this call should not be considered thread safe. like, do not come for it with threads, it did not sign up for that.
π NOTES π
by default, the OpenSSL CSPRNG supports a security level of 256 bits, provided it was able to seed itself from a trusted entropy source. on all major platforms supported by OpenSSL (including the Unix-like platforms and Windows), OpenSSL is configured to automatically seed the CSPRNG on first use using the operating system's random generator. slay. β¨
if the entropy source fails or is not available, the CSPRNG will enter an error state and refuse to generate random bytes. and that's why it is so important to always check the error return value of RAND_bytes() and RAND_priv_bytes() and not take randomness for granted. π like do not assume the vibes are immaculate, check the return value, fr fr.
on other platforms, there might not be a trusted entropy source available, or OpenSSL might have been explicitly configured to use different entropy sources. if you're in doubt about the quality of the entropy source, don't hesitate to ask your operating system vendor or post a question on GitHub or the openssl-users mailing list. we love a community moment. π«Ά
π RETURN VALUES π
RAND_bytes()andRAND_priv_bytes()return1on success,-1if not supported by the current RAND method, or0on other failure. the error code can be obtained byERR_get_error(3).RAND_set1_random_provider()returns1on success and0on failure.
π SEE ALSO π
RAND_add(3), RAND_bytes(3), RAND_priv_bytes(3), ERR_get_error(3), RAND(7), EVP_RAND(7)
π HISTORY π
- π
RAND_pseudo_bytes()was deprecated in OpenSSL 1.1.0; useRAND_bytes()instead. - πΈ The
RAND_priv_bytes()function was added in OpenSSL 1.1.1. - β¨ The
RAND_bytes_ex()andRAND_priv_bytes_ex()functions were added in OpenSSL 3.0 - π The
RAND_set1_random_provider()function was added in OpenSSL 3.5
π COPYRIGHT π
Copyright 2000-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 π§ β this one's from OpenSSL 3.5.0, dated 2026-09-25, so go forth and generate ur bytes responsibly π π
π¦ where this page comes from
- opensuse-leap 16.0: openssl-3-doc 3.5.0-160000.11.1 Β· Apache-2.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms