| // Copyright 2022 The BoringSSL Authors | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // https://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| #ifndef OPENSSL_HEADER_CTRDRBG_H | |
| #define OPENSSL_HEADER_CTRDRBG_H | |
| #include <openssl/base.h> // IWYU pragma: export | |
| #if defined(__cplusplus) | |
| extern "C" { | |
| #endif | |
| // FIPS pseudo-random number generator. | |
| // CTR-DRBG state objects. | |
| // | |
| // CTR_DRBG_STATE contains the state of a FIPS AES-CTR-based pseudo-random | |
| // number generator. If BoringSSL was built in FIPS mode then this is a FIPS | |
| // Approved algorithm. BoringSSL supports CTR-DRBG both with, and without, a | |
| // derivation function. | |
| // CTR_DRBG_MIN_ENTROPY_LEN is the minimum number of bytes of input entropy | |
| // when using a derivation function. See SP 800-90Ar1, table 3. | |
| #define CTR_DRBG_MIN_ENTROPY_LEN 32 | |
| // CTR_DRBG_MAX_ENTROPY_LEN is the maximum number of bytes of input entropy | |
| // when using a derivation function. This is an implementation limitation. | |
| #define CTR_DRBG_MAX_ENTROPY_LEN 64 | |
| // CTR_DRBG_ENTROPY_LEN is a fixed amount of entropy required when not using a | |
| // derivation function. | |
| #define CTR_DRBG_ENTROPY_LEN 48 | |
| // The length of a seed, when using a derivation function. See SP 800-90Ar1, | |
| // table 3. | |
| #define CTR_DRBG_SEED_LEN (32 + CTR_DRBG_NONCE_LEN) | |
| // CTR_DRBG_NONCE_LEN is the number of bytes of input nonce. This only applies | |
| // when using a derivation function. | |
| #define CTR_DRBG_NONCE_LEN 16 | |
| // CTR_DRBG_MAX_GENERATE_LENGTH is the maximum number of bytes that can be | |
| // generated in a single call to `CTR_DRBG_generate`. | |
| #define CTR_DRBG_MAX_GENERATE_LENGTH 65536 | |
| // CTR_DRBG_new returns an initialized `CTR_DRBG_STATE`, or NULL if either | |
| // allocation failed or if `personalization_len` is invalid. This DRBG will not | |
| // use a derivation function. | |
| OPENSSL_EXPORT CTR_DRBG_STATE *CTR_DRBG_new( | |
| const uint8_t entropy[CTR_DRBG_ENTROPY_LEN], const uint8_t *personalization, | |
| size_t personalization_len); | |
| // CTR_DRBG_new_df returns an initialized `CTR_DRBG_STATE`, or NULL if either | |
| // allocation failed or if an argument is invalid. This DRBG will use a | |
| // derivation function. | |
| OPENSSL_EXPORT CTR_DRBG_STATE *CTR_DRBG_new_df( | |
| const uint8_t *entropy, size_t entropy_len, | |
| const uint8_t nonce[CTR_DRBG_NONCE_LEN], const uint8_t *personalization, | |
| size_t personalization_len); | |
| // CTR_DRBG_free frees `state` if non-NULL, or else does nothing. | |
| OPENSSL_EXPORT void CTR_DRBG_free(CTR_DRBG_STATE *state); | |
| // CTR_DRBG_reseed reseeds `drbg` given `CTR_DRBG_ENTROPY_LEN` bytes of entropy | |
| // in `entropy` and, optionally, up to `CTR_DRBG_SEED_LEN` bytes of | |
| // additional data. It returns one on success or zero on error. | |
| OPENSSL_EXPORT int CTR_DRBG_reseed(CTR_DRBG_STATE *drbg, | |
| const uint8_t entropy[CTR_DRBG_ENTROPY_LEN], | |
| const uint8_t *additional_data, | |
| size_t additional_data_len); | |
| // CTR_DRBG_reseed_ex acts like `CTR_DRBG_reseed` but with variable-length | |
| // entropy input, up to `CTR_DRBG_MAX_ENTROPY_LEN`. | |
| OPENSSL_EXPORT int CTR_DRBG_reseed_ex(CTR_DRBG_STATE *drbg, | |
| const uint8_t *entropy, | |
| size_t entropy_len, | |
| const uint8_t *additional_data, | |
| size_t additional_data_len); | |
| // CTR_DRBG_generate processes to up `CTR_DRBG_ENTROPY_LEN` bytes of additional | |
| // data (if any) and then writes `out_len` random bytes to `out`, where | |
| // `out_len` <= `CTR_DRBG_MAX_GENERATE_LENGTH`. It returns one on success or | |
| // zero on error. | |
| OPENSSL_EXPORT int CTR_DRBG_generate(CTR_DRBG_STATE *drbg, uint8_t *out, | |
| size_t out_len, | |
| const uint8_t *additional_data, | |
| size_t additional_data_len); | |
| // CTR_DRBG_clear zeroises the state of `drbg`. | |
| OPENSSL_EXPORT void CTR_DRBG_clear(CTR_DRBG_STATE *drbg); | |
| #if defined(__cplusplus) | |
| } // extern C | |
| extern "C++" { | |
| BSSL_NAMESPACE_BEGIN | |
| BORINGSSL_MAKE_DELETER(CTR_DRBG_STATE, CTR_DRBG_free) | |
| BSSL_NAMESPACE_END | |
| } // extern C++ | |
| #endif | |
| #endif // OPENSSL_HEADER_CTRDRBG_H |