diff options
author | Nobuyoshi Nakada <[email protected]> | 2021-03-19 15:23:03 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2021-03-19 15:23:03 +0900 |
commit | 4ea96f1d4f8a50c204c4367c994cdbf12cd97b64 (patch) | |
tree | 2a62d8197c6ab29b376ebad61ce7f9a852d37c9a /random.c | |
parent | a85ed626f18d1014d09fb37eb0a703976c3d2b53 (diff) |
Use CommonRandom if available
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/4289
Diffstat (limited to 'random.c')
-rw-r--r-- | random.c | 21 |
1 files changed, 18 insertions, 3 deletions
@@ -495,21 +495,36 @@ fill_random_bytes_urandom(void *seed, size_t size) #if 0 #elif defined MAC_OS_X_VERSION_10_7 && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_7 -#include <Security/SecRandom.h> + +# if defined MAC_OS_X_VERSION_10_10 && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10 +# include <CommonCrypto/CommonRandom.h> +# define USE_COMMON_RANDOM 1 +# else +# include <Security/SecRandom.h> +# define USE_COMMON_RANDOM 0 +# endif static int fill_random_bytes_syscall(void *seed, size_t size, int unused) { - int status = SecRandomCopyBytes(kSecRandomDefault, size, seed); +#if USE_COMMON_RANDOM + int failed = CCRandomGenerateBytes(seed, size) != kCCSuccess; +#else + int failed = SecRandomCopyBytes(kSecRandomDefault, size, seed) != errSecSuccess; +#endif - if (status != errSecSuccess) { + if (failed) { # if 0 +# if USE_COMMON_RANDOM + /* How to get the error message? */ +# else CFStringRef s = SecCopyErrorMessageString(status, NULL); const char *m = s ? CFStringGetCStringPtr(s, kCFStringEncodingUTF8) : NULL; fprintf(stderr, "SecRandomCopyBytes failed: %d: %s\n", status, m ? m : "unknown"); if (s) CFRelease(s); # endif +# endif return -1; } return 0; |