...
On Windows platforms, the BcryptGenRandomBCryptGenRandom()
function can be used to generate cryptographically strong random numbers. The Microsoft Developer Network BCryptGenRandom()
reference [MSDN] states:
The default random number provider implements an algorithm for generating random numbers that complies with the NIST SP800-90 standard, specifically the CTR_DRBG portion of that standard.
Code Block | ||||
---|---|---|---|---|
| ||||
#include <Windows.h>
#include <bcrypt.h>
#include <stdio.h>
#pragma comment(lib, "Bcrypt")
|
...
void func(void) { BCRYPT_ALG_HANDLE Prov; int Buffer; if (!BCRYPT_SUCCESS( BCryptOpenAlgorithmProvider(&Prov, BCRYPT_RNG_ALGORITHM, NULL, 0))) { /* handle error */ } if (!BCRYPT_SUCCESS(BCryptGenRandom(Prov, (PUCHAR) (&Buffer), sizeof(Buffer), 0))) { /* handle error */ } printf("Random number: %d\n", Buffer); BCryptCloseAlgorithmProvider(Prov, 0); } |
Risk Assessment
The use of the rand()
function can result in predictable random numbers.
...
Tool | Version | Checker | Description | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Astrée |
| _V
| stdlib-use-rand | Fully checked | ||||||||||
Axivion Bauhaus Suite |
| CertC-MSC30 | Supported, but no explicit checker||||||||||||
Clang |
| cert-msc30-c | Checked by clang-tidy | |||||||||||
CodeSonar |
| BADFUNC.RANDOM.RAND | Use of rand | |||||||||||
Compass/ROSE | ||||||||||||||
Coverity |
| DONTCALL | Implemented - weak support | |||||||||||
Cppcheck Premium |
| premium-cert-msc30-c | Fully implemented | |||||||||||
| CC2.MSC30 | Fully implemented | ||||||||||||
Helix QAC |
| C5022 C++5029 | ||||||||||||
Klocwork |
| CERT.MSC.STD_RAND_CALL | ||||||||||||
LDRA tool suite |
| 44 S | Enhanced enforcement | |||||||||||
Parasoft C/C++test |
| CERT_C-MSC30-a | Do not use the rand() function for generating pseudorandom numbers | |||||||||||
PC-lint Plus |
| 586 | Fully supported | |||||||||||
Polyspace Bug Finder |
| Vulnerable pseudo-random number generator | Using a cryptographically weakCERT C: Rule MSC30-C | Checks for vulnerable pseudo-random number generator | PRQA QA-C(rule fully covered) | |||||||||
RuleChecker |
| PRQA QA-C_v |
| stdlib-use-rand | Fully checked | PRQA QA-C_v | 5022 | Fully implemented
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
...
- Invocation of other dangerous functions, besides rand().
Bibliography
...