• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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