Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sudo-project
GitHub Repository: sudo-project/sudo
Path: blob/main/lib/util/arc4random_buf.c
1532 views
1
/*
2
* SPDX-License-Identifier: ISC
3
*
4
* Copyright (c) 2020 Todd C. Miller <[email protected]>
5
*
6
* Permission to use, copy, modify, and distribute this software for any
7
* purpose with or without fee is hereby granted, provided that the above
8
* copyright notice and this permission notice appear in all copies.
9
*
10
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
*/
18
19
#include <config.h>
20
21
#ifndef HAVE_ARC4RANDOM_BUF
22
23
#include <stdlib.h>
24
#if defined(HAVE_STDINT_H)
25
# include <stdint.h>
26
#elif defined(HAVE_INTTYPES_H)
27
# include <inttypes.h>
28
#endif
29
30
#include <sudo_compat.h>
31
#include <sudo_rand.h>
32
33
#define minimum(a, b) ((a) < (b) ? (a) : (b))
34
35
/*
36
* Call arc4random() repeatedly to fill buf with n bytes of random data.
37
*/
38
void
39
sudo_arc4random_buf(void *buf, size_t n)
40
{
41
char *cp = buf;
42
43
while (n != 0) {
44
size_t m = minimum(n, 4);
45
uint32_t val = arc4random();
46
47
switch (m) {
48
case 4:
49
*cp++ = (val >> 24) & 0xff;
50
FALLTHROUGH;
51
case 3:
52
*cp++ = (val >> 16) & 0xff;
53
FALLTHROUGH;
54
case 2:
55
*cp++ = (val >> 8) & 0xff;
56
FALLTHROUGH;
57
case 1:
58
*cp++ = val & 0xff;
59
break;
60
}
61
n -= m;
62
}
63
}
64
65
#endif /* HAVE_ARC4RANDOM_BUF */
66
67