Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/openssh/src/openbsd-compat/arc4random.c |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /* OPENBSD ORIGINAL: lib/libc/crypto/arc4random.c */ | - | ||||||||||||||||||
2 | - | |||||||||||||||||||
3 | /* $OpenBSD: arc4random.c,v 1.25 2013/10/01 18:34:57 markus Exp $ */ | - | ||||||||||||||||||
4 | - | |||||||||||||||||||
5 | /* | - | ||||||||||||||||||
6 | * Copyright (c) 1996, David Mazieres <dm@uun.org> | - | ||||||||||||||||||
7 | * Copyright (c) 2008, Damien Miller <djm@openbsd.org> | - | ||||||||||||||||||
8 | * Copyright (c) 2013, Markus Friedl <markus@openbsd.org> | - | ||||||||||||||||||
9 | * | - | ||||||||||||||||||
10 | * Permission to use, copy, modify, and distribute this software for any | - | ||||||||||||||||||
11 | * purpose with or without fee is hereby granted, provided that the above | - | ||||||||||||||||||
12 | * copyright notice and this permission notice appear in all copies. | - | ||||||||||||||||||
13 | * | - | ||||||||||||||||||
14 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | - | ||||||||||||||||||
15 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | - | ||||||||||||||||||
16 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | - | ||||||||||||||||||
17 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | - | ||||||||||||||||||
18 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | - | ||||||||||||||||||
19 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | - | ||||||||||||||||||
20 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | - | ||||||||||||||||||
21 | */ | - | ||||||||||||||||||
22 | - | |||||||||||||||||||
23 | /* | - | ||||||||||||||||||
24 | * ChaCha based random number generator for OpenBSD. | - | ||||||||||||||||||
25 | */ | - | ||||||||||||||||||
26 | - | |||||||||||||||||||
27 | #include "includes.h" | - | ||||||||||||||||||
28 | - | |||||||||||||||||||
29 | #include <sys/types.h> | - | ||||||||||||||||||
30 | - | |||||||||||||||||||
31 | #include <fcntl.h> | - | ||||||||||||||||||
32 | #include <stdlib.h> | - | ||||||||||||||||||
33 | #include <string.h> | - | ||||||||||||||||||
34 | #include <unistd.h> | - | ||||||||||||||||||
35 | - | |||||||||||||||||||
36 | #ifdef HAVE_SYS_RANDOM_H | - | ||||||||||||||||||
37 | # include <sys/random.h> | - | ||||||||||||||||||
38 | #endif | - | ||||||||||||||||||
39 | - | |||||||||||||||||||
40 | #ifndef HAVE_ARC4RANDOM | - | ||||||||||||||||||
41 | - | |||||||||||||||||||
42 | #ifdef WITH_OPENSSL | - | ||||||||||||||||||
43 | #include <openssl/rand.h> | - | ||||||||||||||||||
44 | #include <openssl/err.h> | - | ||||||||||||||||||
45 | #endif | - | ||||||||||||||||||
46 | - | |||||||||||||||||||
47 | #include "log.h" | - | ||||||||||||||||||
48 | - | |||||||||||||||||||
49 | #define KEYSTREAM_ONLY | - | ||||||||||||||||||
50 | #include "chacha_private.h" | - | ||||||||||||||||||
51 | - | |||||||||||||||||||
52 | #ifdef __GNUC__ | - | ||||||||||||||||||
53 | #define inline __inline | - | ||||||||||||||||||
54 | #else /* !__GNUC__ */ | - | ||||||||||||||||||
55 | #define inline | - | ||||||||||||||||||
56 | #endif /* !__GNUC__ */ | - | ||||||||||||||||||
57 | - | |||||||||||||||||||
58 | /* OpenSSH isn't multithreaded */ | - | ||||||||||||||||||
59 | #define _ARC4_LOCK() | - | ||||||||||||||||||
60 | #define _ARC4_UNLOCK() | - | ||||||||||||||||||
61 | - | |||||||||||||||||||
62 | #define KEYSZ 32 | - | ||||||||||||||||||
63 | #define IVSZ 8 | - | ||||||||||||||||||
64 | #define BLOCKSZ 64 | - | ||||||||||||||||||
65 | #define RSBUFSZ (16*BLOCKSZ) | - | ||||||||||||||||||
66 | static int rs_initialized; | - | ||||||||||||||||||
67 | static pid_t rs_stir_pid; | - | ||||||||||||||||||
68 | static chacha_ctx rs; /* chacha context for random keystream */ | - | ||||||||||||||||||
69 | static u_char rs_buf[RSBUFSZ]; /* keystream blocks */ | - | ||||||||||||||||||
70 | static size_t rs_have; /* valid bytes at end of rs_buf */ | - | ||||||||||||||||||
71 | static size_t rs_count; /* bytes till reseed */ | - | ||||||||||||||||||
72 | - | |||||||||||||||||||
73 | static inline void _rs_rekey(u_char *dat, size_t datlen); | - | ||||||||||||||||||
74 | - | |||||||||||||||||||
75 | static inline void | - | ||||||||||||||||||
76 | _rs_init(u_char *buf, size_t n) | - | ||||||||||||||||||
77 | { | - | ||||||||||||||||||
78 | if (n < KEYSZ + IVSZ)
| 0-3033 | ||||||||||||||||||
79 | return; never executed: return; | 0 | ||||||||||||||||||
80 | chacha_keysetup(&rs, buf, KEYSZ * 8, 0); | - | ||||||||||||||||||
81 | chacha_ivsetup(&rs, buf + KEYSZ); | - | ||||||||||||||||||
82 | } executed 3033 times by 4 tests: end of block Executed by:
| 3033 | ||||||||||||||||||
83 | - | |||||||||||||||||||
84 | #ifndef WITH_OPENSSL | - | ||||||||||||||||||
85 | # ifndef SSH_RANDOM_DEV | - | ||||||||||||||||||
86 | # define SSH_RANDOM_DEV "/dev/urandom" | - | ||||||||||||||||||
87 | # endif /* SSH_RANDOM_DEV */ | - | ||||||||||||||||||
88 | static void | - | ||||||||||||||||||
89 | getrnd(u_char *s, size_t len) | - | ||||||||||||||||||
90 | { | - | ||||||||||||||||||
91 | int fd; | - | ||||||||||||||||||
92 | ssize_t r; | - | ||||||||||||||||||
93 | size_t o = 0; | - | ||||||||||||||||||
94 | - | |||||||||||||||||||
95 | #ifdef HAVE_GETRANDOM | - | ||||||||||||||||||
96 | if ((r = getrandom(s, len, 0)) > 0 && (size_t)r == len) | - | ||||||||||||||||||
97 | return; | - | ||||||||||||||||||
98 | #endif /* HAVE_GETRANDOM */ | - | ||||||||||||||||||
99 | - | |||||||||||||||||||
100 | if ((fd = open(SSH_RANDOM_DEV, O_RDONLY)) == -1) | - | ||||||||||||||||||
101 | fatal("Couldn't open %s: %s", SSH_RANDOM_DEV, strerror(errno)); | - | ||||||||||||||||||
102 | while (o < len) { | - | ||||||||||||||||||
103 | r = read(fd, s + o, len - o); | - | ||||||||||||||||||
104 | if (r < 0) { | - | ||||||||||||||||||
105 | if (errno == EAGAIN || errno == EINTR || | - | ||||||||||||||||||
106 | errno == EWOULDBLOCK) | - | ||||||||||||||||||
107 | continue; | - | ||||||||||||||||||
108 | fatal("read %s: %s", SSH_RANDOM_DEV, strerror(errno)); | - | ||||||||||||||||||
109 | } | - | ||||||||||||||||||
110 | o += r; | - | ||||||||||||||||||
111 | } | - | ||||||||||||||||||
112 | close(fd); | - | ||||||||||||||||||
113 | } | - | ||||||||||||||||||
114 | #endif /* WITH_OPENSSL */ | - | ||||||||||||||||||
115 | - | |||||||||||||||||||
116 | static void | - | ||||||||||||||||||
117 | _rs_stir(void) | - | ||||||||||||||||||
118 | { | - | ||||||||||||||||||
119 | u_char rnd[KEYSZ + IVSZ]; | - | ||||||||||||||||||
120 | - | |||||||||||||||||||
121 | #ifdef WITH_OPENSSL | - | ||||||||||||||||||
122 | if (RAND_bytes(rnd, sizeof(rnd)) <= 0)
| 0-11 | ||||||||||||||||||
123 | fatal("Couldn't obtain random bytes (error 0x%lx)", never executed: fatal("Couldn't obtain random bytes (error 0x%lx)", (unsigned long)ERR_get_error()); | 0 | ||||||||||||||||||
124 | (unsigned long)ERR_get_error()); never executed: fatal("Couldn't obtain random bytes (error 0x%lx)", (unsigned long)ERR_get_error()); | 0 | ||||||||||||||||||
125 | #else | - | ||||||||||||||||||
126 | getrnd(rnd, sizeof(rnd)); | - | ||||||||||||||||||
127 | #endif | - | ||||||||||||||||||
128 | - | |||||||||||||||||||
129 | if (!rs_initialized) {
| 1-10 | ||||||||||||||||||
130 | rs_initialized = 1; | - | ||||||||||||||||||
131 | _rs_init(rnd, sizeof(rnd)); | - | ||||||||||||||||||
132 | } else executed 10 times by 4 tests: end of block Executed by:
| 10 | ||||||||||||||||||
133 | _rs_rekey(rnd, sizeof(rnd)); executed 1 time by 1 test: _rs_rekey(rnd, sizeof(rnd)); Executed by:
| 1 | ||||||||||||||||||
134 | explicit_bzero(rnd, sizeof(rnd)); | - | ||||||||||||||||||
135 | - | |||||||||||||||||||
136 | /* invalidate rs_buf */ | - | ||||||||||||||||||
137 | rs_have = 0; | - | ||||||||||||||||||
138 | memset(rs_buf, 0, RSBUFSZ); | - | ||||||||||||||||||
139 | - | |||||||||||||||||||
140 | rs_count = 1600000; | - | ||||||||||||||||||
141 | } executed 11 times by 4 tests: end of block Executed by:
| 11 | ||||||||||||||||||
142 | - | |||||||||||||||||||
143 | static inline void | - | ||||||||||||||||||
144 | _rs_stir_if_needed(size_t len) | - | ||||||||||||||||||
145 | { | - | ||||||||||||||||||
146 | pid_t pid = getpid(); | - | ||||||||||||||||||
147 | - | |||||||||||||||||||
148 | if (rs_count <= len || !rs_initialized || rs_stir_pid != pid) {
| 0-739066 | ||||||||||||||||||
149 | rs_stir_pid = pid; | - | ||||||||||||||||||
150 | _rs_stir(); | - | ||||||||||||||||||
151 | } else executed 11 times by 4 tests: end of block Executed by:
| 11 | ||||||||||||||||||
152 | rs_count -= len; executed 739066 times by 4 tests: rs_count -= len; Executed by:
| 739066 | ||||||||||||||||||
153 | } | - | ||||||||||||||||||
154 | - | |||||||||||||||||||
155 | static inline void | - | ||||||||||||||||||
156 | _rs_rekey(u_char *dat, size_t datlen) | - | ||||||||||||||||||
157 | { | - | ||||||||||||||||||
158 | #ifndef KEYSTREAM_ONLY | - | ||||||||||||||||||
159 | memset(rs_buf, 0,RSBUFSZ); | - | ||||||||||||||||||
160 | #endif | - | ||||||||||||||||||
161 | /* fill rs_buf with the keystream */ | - | ||||||||||||||||||
162 | chacha_encrypt_bytes(&rs, rs_buf, rs_buf, RSBUFSZ); | - | ||||||||||||||||||
163 | /* mix in optional user provided data */ | - | ||||||||||||||||||
164 | if (dat) {
| 1-3022 | ||||||||||||||||||
165 | size_t i, m; | - | ||||||||||||||||||
166 | - | |||||||||||||||||||
167 | m = MIN(datlen, KEYSZ + IVSZ);
| 0-1 | ||||||||||||||||||
168 | for (i = 0; i < m; i++)
| 1-40 | ||||||||||||||||||
169 | rs_buf[i] ^= dat[i]; executed 40 times by 1 test: rs_buf[i] ^= dat[i]; Executed by:
| 40 | ||||||||||||||||||
170 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||||||||
171 | /* immediately reinit for backtracking resistance */ | - | ||||||||||||||||||
172 | _rs_init(rs_buf, KEYSZ + IVSZ); | - | ||||||||||||||||||
173 | memset(rs_buf, 0, KEYSZ + IVSZ); | - | ||||||||||||||||||
174 | rs_have = RSBUFSZ - KEYSZ - IVSZ; | - | ||||||||||||||||||
175 | } executed 3023 times by 4 tests: end of block Executed by:
| 3023 | ||||||||||||||||||
176 | - | |||||||||||||||||||
177 | static inline void | - | ||||||||||||||||||
178 | _rs_random_buf(void *_buf, size_t n) | - | ||||||||||||||||||
179 | { | - | ||||||||||||||||||
180 | u_char *buf = (u_char *)_buf; | - | ||||||||||||||||||
181 | size_t m; | - | ||||||||||||||||||
182 | - | |||||||||||||||||||
183 | _rs_stir_if_needed(n); | - | ||||||||||||||||||
184 | while (n > 0) {
| 27008-27142 | ||||||||||||||||||
185 | if (rs_have > 0) {
| 124-27018 | ||||||||||||||||||
186 | m = MIN(n, rs_have);
| 107-26911 | ||||||||||||||||||
187 | memcpy(buf, rs_buf + RSBUFSZ - rs_have, m); | - | ||||||||||||||||||
188 | memset(rs_buf + RSBUFSZ - rs_have, 0, m); | - | ||||||||||||||||||
189 | buf += m; | - | ||||||||||||||||||
190 | n -= m; | - | ||||||||||||||||||
191 | rs_have -= m; | - | ||||||||||||||||||
192 | } executed 27018 times by 4 tests: end of block Executed by:
| 27018 | ||||||||||||||||||
193 | if (rs_have == 0)
| 231-26911 | ||||||||||||||||||
194 | _rs_rekey(NULL, 0); executed 231 times by 4 tests: _rs_rekey( ((void *)0) , 0); Executed by:
| 231 | ||||||||||||||||||
195 | } executed 27142 times by 4 tests: end of block Executed by:
| 27142 | ||||||||||||||||||
196 | } executed 27008 times by 4 tests: end of block Executed by:
| 27008 | ||||||||||||||||||
197 | - | |||||||||||||||||||
198 | static inline void | - | ||||||||||||||||||
199 | _rs_random_u32(u_int32_t *val) | - | ||||||||||||||||||
200 | { | - | ||||||||||||||||||
201 | _rs_stir_if_needed(sizeof(*val)); | - | ||||||||||||||||||
202 | if (rs_have < sizeof(*val))
| 2791-709278 | ||||||||||||||||||
203 | _rs_rekey(NULL, 0); executed 2791 times by 2 tests: _rs_rekey( ((void *)0) , 0); Executed by:
| 2791 | ||||||||||||||||||
204 | memcpy(val, rs_buf + RSBUFSZ - rs_have, sizeof(*val)); | - | ||||||||||||||||||
205 | memset(rs_buf + RSBUFSZ - rs_have, 0, sizeof(*val)); | - | ||||||||||||||||||
206 | rs_have -= sizeof(*val); | - | ||||||||||||||||||
207 | return; executed 712069 times by 2 tests: return; Executed by:
| 712069 | ||||||||||||||||||
208 | } | - | ||||||||||||||||||
209 | - | |||||||||||||||||||
210 | void | - | ||||||||||||||||||
211 | arc4random_stir(void) | - | ||||||||||||||||||
212 | { | - | ||||||||||||||||||
213 | _ARC4_LOCK(); | - | ||||||||||||||||||
214 | _rs_stir(); | - | ||||||||||||||||||
215 | _ARC4_UNLOCK(); | - | ||||||||||||||||||
216 | } never executed: end of block | 0 | ||||||||||||||||||
217 | - | |||||||||||||||||||
218 | void | - | ||||||||||||||||||
219 | arc4random_addrandom(u_char *dat, int datlen) | - | ||||||||||||||||||
220 | { | - | ||||||||||||||||||
221 | int m; | - | ||||||||||||||||||
222 | - | |||||||||||||||||||
223 | _ARC4_LOCK(); | - | ||||||||||||||||||
224 | if (!rs_initialized)
| 0 | ||||||||||||||||||
225 | _rs_stir(); never executed: _rs_stir(); | 0 | ||||||||||||||||||
226 | while (datlen > 0) {
| 0 | ||||||||||||||||||
227 | m = MIN(datlen, KEYSZ + IVSZ);
| 0 | ||||||||||||||||||
228 | _rs_rekey(dat, m); | - | ||||||||||||||||||
229 | dat += m; | - | ||||||||||||||||||
230 | datlen -= m; | - | ||||||||||||||||||
231 | } never executed: end of block | 0 | ||||||||||||||||||
232 | _ARC4_UNLOCK(); | - | ||||||||||||||||||
233 | } never executed: end of block | 0 | ||||||||||||||||||
234 | - | |||||||||||||||||||
235 | u_int32_t | - | ||||||||||||||||||
236 | arc4random(void) | - | ||||||||||||||||||
237 | { | - | ||||||||||||||||||
238 | u_int32_t val; | - | ||||||||||||||||||
239 | - | |||||||||||||||||||
240 | _ARC4_LOCK(); | - | ||||||||||||||||||
241 | _rs_random_u32(&val); | - | ||||||||||||||||||
242 | _ARC4_UNLOCK(); | - | ||||||||||||||||||
243 | return val; executed 712069 times by 2 tests: return val; Executed by:
| 712069 | ||||||||||||||||||
244 | } | - | ||||||||||||||||||
245 | - | |||||||||||||||||||
246 | /* | - | ||||||||||||||||||
247 | * If we are providing arc4random, then we can provide a more efficient | - | ||||||||||||||||||
248 | * arc4random_buf(). | - | ||||||||||||||||||
249 | */ | - | ||||||||||||||||||
250 | # ifndef HAVE_ARC4RANDOM_BUF | - | ||||||||||||||||||
251 | void | - | ||||||||||||||||||
252 | arc4random_buf(void *buf, size_t n) | - | ||||||||||||||||||
253 | { | - | ||||||||||||||||||
254 | _ARC4_LOCK(); | - | ||||||||||||||||||
255 | _rs_random_buf(buf, n); | - | ||||||||||||||||||
256 | _ARC4_UNLOCK(); | - | ||||||||||||||||||
257 | } executed 27008 times by 4 tests: end of block Executed by:
| 27008 | ||||||||||||||||||
258 | # endif /* !HAVE_ARC4RANDOM_BUF */ | - | ||||||||||||||||||
259 | #endif /* !HAVE_ARC4RANDOM */ | - | ||||||||||||||||||
260 | - | |||||||||||||||||||
261 | /* arc4random_buf() that uses platform arc4random() */ | - | ||||||||||||||||||
262 | #if !defined(HAVE_ARC4RANDOM_BUF) && defined(HAVE_ARC4RANDOM) | - | ||||||||||||||||||
263 | void | - | ||||||||||||||||||
264 | arc4random_buf(void *_buf, size_t n) | - | ||||||||||||||||||
265 | { | - | ||||||||||||||||||
266 | size_t i; | - | ||||||||||||||||||
267 | u_int32_t r = 0; | - | ||||||||||||||||||
268 | char *buf = (char *)_buf; | - | ||||||||||||||||||
269 | - | |||||||||||||||||||
270 | for (i = 0; i < n; i++) { | - | ||||||||||||||||||
271 | if (i % 4 == 0) | - | ||||||||||||||||||
272 | r = arc4random(); | - | ||||||||||||||||||
273 | buf[i] = r & 0xff; | - | ||||||||||||||||||
274 | r >>= 8; | - | ||||||||||||||||||
275 | } | - | ||||||||||||||||||
276 | explicit_bzero(&r, sizeof(r)); | - | ||||||||||||||||||
277 | } | - | ||||||||||||||||||
278 | #endif /* !defined(HAVE_ARC4RANDOM_BUF) && defined(HAVE_ARC4RANDOM) */ | - | ||||||||||||||||||
279 | - | |||||||||||||||||||
280 | #ifndef HAVE_ARC4RANDOM_UNIFORM | - | ||||||||||||||||||
281 | /* | - | ||||||||||||||||||
282 | * Calculate a uniformly distributed random number less than upper_bound | - | ||||||||||||||||||
283 | * avoiding "modulo bias". | - | ||||||||||||||||||
284 | * | - | ||||||||||||||||||
285 | * Uniformity is achieved by generating new random numbers until the one | - | ||||||||||||||||||
286 | * returned is outside the range [0, 2**32 % upper_bound). This | - | ||||||||||||||||||
287 | * guarantees the selected random number will be inside | - | ||||||||||||||||||
288 | * [2**32 % upper_bound, 2**32) which maps back to [0, upper_bound) | - | ||||||||||||||||||
289 | * after reduction modulo upper_bound. | - | ||||||||||||||||||
290 | */ | - | ||||||||||||||||||
291 | u_int32_t | - | ||||||||||||||||||
292 | arc4random_uniform(u_int32_t upper_bound) | - | ||||||||||||||||||
293 | { | - | ||||||||||||||||||
294 | u_int32_t r, min; | - | ||||||||||||||||||
295 | - | |||||||||||||||||||
296 | if (upper_bound < 2)
| 0-580289 | ||||||||||||||||||
297 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
298 | - | |||||||||||||||||||
299 | /* 2**32 % x == (2**32 - x) % x */ | - | ||||||||||||||||||
300 | min = -upper_bound % upper_bound; | - | ||||||||||||||||||
301 | - | |||||||||||||||||||
302 | /* | - | ||||||||||||||||||
303 | * This could theoretically loop forever but each retry has | - | ||||||||||||||||||
304 | * p > 0.5 (worst case, usually far better) of selecting a | - | ||||||||||||||||||
305 | * number inside the range we need, so it should rarely need | - | ||||||||||||||||||
306 | * to re-roll. | - | ||||||||||||||||||
307 | */ | - | ||||||||||||||||||
308 | for (;;) { | - | ||||||||||||||||||
309 | r = arc4random(); | - | ||||||||||||||||||
310 | if (r >= min)
| 0-580289 | ||||||||||||||||||
311 | break; executed 580289 times by 1 test: break; Executed by:
| 580289 | ||||||||||||||||||
312 | } never executed: end of block | 0 | ||||||||||||||||||
313 | - | |||||||||||||||||||
314 | return r % upper_bound; executed 580289 times by 1 test: return r % upper_bound; Executed by:
| 580289 | ||||||||||||||||||
315 | } | - | ||||||||||||||||||
316 | #endif /* !HAVE_ARC4RANDOM_UNIFORM */ | - | ||||||||||||||||||
317 | - | |||||||||||||||||||
318 | #if 0 | - | ||||||||||||||||||
319 | /*-------- Test code for i386 --------*/ | - | ||||||||||||||||||
320 | #include <stdio.h> | - | ||||||||||||||||||
321 | #include <machine/pctr.h> | - | ||||||||||||||||||
322 | int | - | ||||||||||||||||||
323 | main(int argc, char **argv) | - | ||||||||||||||||||
324 | { | - | ||||||||||||||||||
325 | const int iter = 1000000; | - | ||||||||||||||||||
326 | int i; | - | ||||||||||||||||||
327 | pctrval v; | - | ||||||||||||||||||
328 | - | |||||||||||||||||||
329 | v = rdtsc(); | - | ||||||||||||||||||
330 | for (i = 0; i < iter; i++) | - | ||||||||||||||||||
331 | arc4random(); | - | ||||||||||||||||||
332 | v = rdtsc() - v; | - | ||||||||||||||||||
333 | v /= iter; | - | ||||||||||||||||||
334 | - | |||||||||||||||||||
335 | printf("%qd cycles\n", v); | - | ||||||||||||||||||
336 | exit(0); | - | ||||||||||||||||||
337 | } | - | ||||||||||||||||||
338 | #endif | - | ||||||||||||||||||
Source code | Switch to Preprocessed file |