1 #ifndef OPENSSL_NO_ENGINE 2 /* OpenSSL has ENGINE support so include all of this. */ 3 #ifdef _WIN32 4 #include <Wincrypt.h> 5 #else 6 #include <fcntl.h> 7 #include <unistd.h> 8 /* for defined(BSD) */ 9 #ifndef __MVS__ 10 #include <sys/param.h> 11 #endif 12 13 #ifdef BSD 14 /* for SYS_getentropy */ 15 #include <sys/syscall.h> 16 #endif 17 18 #ifdef __APPLE__ 19 #include <sys/random.h> 20 /* To support weak linking we need to declare this as a weak import even if 21 * it's not present in sys/random (e.g. macOS < 10.12). */ 22 extern int getentropy(void *buffer, size_t size) __attribute((weak_import)); 23 #endif 24 25 #ifdef __linux__ 26 /* for SYS_getrandom */ 27 #include <sys/syscall.h> 28 #ifndef GRND_NONBLOCK 29 #define GRND_NONBLOCK 0x0001 30 #endif /* GRND_NONBLOCK */ 31 32 #ifndef SYS_getrandom 33 /* We only bother to define the constants for platforms where we ship 34 * wheels, since that's the predominant way you get a situation where 35 * you don't have SYS_getrandom at compile time but do have the syscall 36 * at runtime */ 37 #if defined(__x86_64__) 38 #define SYS_getrandom 318 39 #elif defined(__i386__) 40 #define SYS_getrandom 355 41 #elif defined(__aarch64__) 42 #define SYS_getrandom 278 43 #endif 44 #endif 45 #endif /* __linux__ */ 46 #endif /* _WIN32 */ 47 48 #define CRYPTOGRAPHY_OSRANDOM_ENGINE_CRYPTGENRANDOM 1 49 #define CRYPTOGRAPHY_OSRANDOM_ENGINE_GETENTROPY 2 50 #define CRYPTOGRAPHY_OSRANDOM_ENGINE_GETRANDOM 3 51 #define CRYPTOGRAPHY_OSRANDOM_ENGINE_DEV_URANDOM 4 52 53 #ifndef CRYPTOGRAPHY_OSRANDOM_ENGINE 54 #if defined(_WIN32) 55 /* Windows */ 56 #define CRYPTOGRAPHY_OSRANDOM_ENGINE CRYPTOGRAPHY_OSRANDOM_ENGINE_CRYPTGENRANDOM 57 #elif defined(BSD) && defined(SYS_getentropy) 58 /* OpenBSD 5.6+ & macOS with SYS_getentropy defined, although < 10.12 will fallback 59 * to urandom */ 60 #define CRYPTOGRAPHY_OSRANDOM_ENGINE CRYPTOGRAPHY_OSRANDOM_ENGINE_GETENTROPY 61 #elif defined(__linux__) && defined(SYS_getrandom) 62 /* Linux 3.17+ */ 63 #define CRYPTOGRAPHY_OSRANDOM_ENGINE CRYPTOGRAPHY_OSRANDOM_ENGINE_GETRANDOM 64 #else 65 /* Keep this as last entry, fall back to /dev/urandom */ 66 #define CRYPTOGRAPHY_OSRANDOM_ENGINE CRYPTOGRAPHY_OSRANDOM_ENGINE_DEV_URANDOM 67 #endif 68 #endif /* CRYPTOGRAPHY_OSRANDOM_ENGINE */ 69 70 /* Fallbacks need /dev/urandom helper functions. */ 71 #if CRYPTOGRAPHY_OSRANDOM_ENGINE == CRYPTOGRAPHY_OSRANDOM_ENGINE_GETRANDOM || \ 72 CRYPTOGRAPHY_OSRANDOM_ENGINE == CRYPTOGRAPHY_OSRANDOM_ENGINE_DEV_URANDOM || \ 73 (CRYPTOGRAPHY_OSRANDOM_ENGINE == CRYPTOGRAPHY_OSRANDOM_ENGINE_GETENTROPY && \ 74 defined(__APPLE__)) 75 #define CRYPTOGRAPHY_OSRANDOM_NEEDS_DEV_URANDOM 1 76 #endif 77 78 enum { 79 CRYPTOGRAPHY_OSRANDOM_GETRANDOM_INIT_FAILED = -2, 80 CRYPTOGRAPHY_OSRANDOM_GETRANDOM_NOT_INIT, 81 CRYPTOGRAPHY_OSRANDOM_GETRANDOM_FALLBACK, 82 CRYPTOGRAPHY_OSRANDOM_GETRANDOM_WORKS 83 }; 84 85 enum { 86 CRYPTOGRAPHY_OSRANDOM_GETENTROPY_NOT_INIT, 87 CRYPTOGRAPHY_OSRANDOM_GETENTROPY_FALLBACK, 88 CRYPTOGRAPHY_OSRANDOM_GETENTROPY_WORKS 89 }; 90 91 /* engine ctrl */ 92 #define CRYPTOGRAPHY_OSRANDOM_GET_IMPLEMENTATION ENGINE_CMD_BASE 93 94 /* error reporting */ 95 static void ERR_load_Cryptography_OSRandom_strings(void); 96 static void ERR_Cryptography_OSRandom_error(int function, int reason, 97 char *file, int line); 98 99 #define CRYPTOGRAPHY_OSRANDOM_F_INIT 100 100 #define CRYPTOGRAPHY_OSRANDOM_F_RAND_BYTES 101 101 #define CRYPTOGRAPHY_OSRANDOM_F_FINISH 102 102 #define CRYPTOGRAPHY_OSRANDOM_F_DEV_URANDOM_FD 300 103 #define CRYPTOGRAPHY_OSRANDOM_F_DEV_URANDOM_READ 301 104 105 #define CRYPTOGRAPHY_OSRANDOM_R_CRYPTACQUIRECONTEXT 100 106 #define CRYPTOGRAPHY_OSRANDOM_R_CRYPTGENRANDOM 101 107 #define CRYPTOGRAPHY_OSRANDOM_R_CRYPTRELEASECONTEXT 102 108 109 #define CRYPTOGRAPHY_OSRANDOM_R_GETENTROPY_FAILED 200 110 111 #define CRYPTOGRAPHY_OSRANDOM_R_DEV_URANDOM_OPEN_FAILED 300 112 #define CRYPTOGRAPHY_OSRANDOM_R_DEV_URANDOM_READ_FAILED 301 113 114 #define CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_INIT_FAILED 400 115 #define CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_INIT_FAILED_UNEXPECTED 402 116 #define CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_FAILED 403 117 #define CRYPTOGRAPHY_OSRANDOM_R_GETRANDOM_NOT_INIT 404 118 #endif 119