/*1* SPDX-License-Identifier: ISC2*3* Copyright (c) 2020 Todd C. Miller <[email protected]>4*5* Permission to use, copy, modify, and distribute this software for any6* purpose with or without fee is hereby granted, provided that the above7* copyright notice and this permission notice appear in all copies.8*9* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES10* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF11* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR12* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES13* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN14* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF15* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.16*/1718#include <config.h>1920#ifndef HAVE_ARC4RANDOM_BUF2122#include <stdlib.h>23#if defined(HAVE_STDINT_H)24# include <stdint.h>25#elif defined(HAVE_INTTYPES_H)26# include <inttypes.h>27#endif2829#include <sudo_compat.h>30#include <sudo_rand.h>3132#define minimum(a, b) ((a) < (b) ? (a) : (b))3334/*35* Call arc4random() repeatedly to fill buf with n bytes of random data.36*/37void38sudo_arc4random_buf(void *buf, size_t n)39{40char *cp = buf;4142while (n != 0) {43size_t m = minimum(n, 4);44uint32_t val = arc4random();4546switch (m) {47case 4:48*cp++ = (val >> 24) & 0xff;49FALLTHROUGH;50case 3:51*cp++ = (val >> 16) & 0xff;52FALLTHROUGH;53case 2:54*cp++ = (val >> 8) & 0xff;55FALLTHROUGH;56case 1:57*cp++ = val & 0xff;58break;59}60n -= m;61}62}6364#endif /* HAVE_ARC4RANDOM_BUF */656667