On Fri, May 16, 2014 at 09:23:40PM +0200, Alexander Bluhm wrote:
> When using BSD::arc4random the perl programm can be sure that it
> works the same way everywhere.  So I would recommend to strip
> everything out of p5-BSD-arc4random that does not call the OpenBSD
> libc function.  But the API of BSD::arc4random must stay the same.

Here is the diff.  I have also removed arc4random.c so we will not
link it by accident.  Do we want it that way?

bluhm

Index: devel/p5-BSD-arc4random/Makefile
===================================================================
RCS file: /data/mirror/openbsd/cvs/ports/devel/p5-BSD-arc4random/Makefile,v
retrieving revision 1.4
diff -u -p -u -p -r1.4 Makefile
--- devel/p5-BSD-arc4random/Makefile    11 Mar 2013 10:50:13 -0000      1.4
+++ devel/p5-BSD-arc4random/Makefile    16 May 2014 19:24:48 -0000
@@ -5,7 +5,7 @@ COMMENT =               perl interface to the arc4 ra
 SHARED_ONLY =          Yes
 MODULES =              cpan
 DISTNAME =             BSD-arc4random-1.50
-REVISION =             0
+REVISION =             1
 CATEGORIES =           devel
 MAINTAINER =           Abel Abraham Camarillo Ojeda <acam...@verlet.org>
 
Index: devel/p5-BSD-arc4random/patches/patch-arc4random_c
===================================================================
RCS file: devel/p5-BSD-arc4random/patches/patch-arc4random_c
diff -N devel/p5-BSD-arc4random/patches/patch-arc4random_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ devel/p5-BSD-arc4random/patches/patch-arc4random_c  16 May 2014 19:28:31 
-0000
@@ -0,0 +1,626 @@
+$OpenBSD$
+--- arc4random.c.orig  Sun Sep 12 14:24:51 2010
++++ arc4random.c       Fri May 16 21:25:38 2014
+@@ -1,622 +0,0 @@
+-static const char __vcsid[] = "@(#) MirOS contributed arc4random.c (old)"
+-    "\n       @(#)rcsid_master: $MirOS: contrib/code/Snippets/arc4random.c,v 
1.28 2010/09/12 12:24:27 tg Exp $"
+-    ;
+-
+-/*-
+- * Arc4 random number generator for OpenBSD.
+- * Copyright 1996 David Mazieres <d...@lcs.mit.edu>.
+- *
+- * Modification and redistribution in source and binary forms is
+- * permitted provided that due credit is given to the author and the
+- * OpenBSD project by leaving this copyright notice intact.
+- */
+-
+-/*-
+- * This code is derived from section 17.1 of Applied Cryptography,
+- * second edition, which describes a stream cipher allegedly
+- * compatible with RSA Labs "RC4" cipher (the actual description of
+- * which is a trade secret).  The same algorithm is used as a stream
+- * cipher called "arcfour" in Tatu Ylonen's ssh package.
+- *
+- * Here the stream cipher has been modified always to include the time
+- * when initializing the state.  That makes it impossible to
+- * regenerate the same random sequence twice, so this can't be used
+- * for encryption, but will generate good random numbers.
+- *
+- * RC4 is a registered trademark of RSA Laboratories.
+- */
+-
+-/*-
+- * Modified by Robert Connolly from OpenBSD lib/libc/crypt/arc4random.c v1.11.
+- * This is arc4random(3) using urandom.
+- */
+-
+-/*-
+- * Copyright (c) 2008, 2009, 2010
+- *    Thorsten Glaser <t...@mirbsd.org>
+- * This is arc4random(3) made more portable,
+- * as well as arc4random_pushb(3) for Cygwin.
+- *
+- * Provided that these terms and disclaimer and all copyright notices
+- * are retained or reproduced in an accompanying document, permission
+- * is granted to deal in this work without restriction, including un-
+- * limited rights to use, publicly perform, distribute, sell, modify,
+- * merge, give away, or sublicence.
+- *
+- * This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
+- * the utmost extent permitted by applicable law, neither express nor
+- * implied; without malicious intent or gross negligence. In no event
+- * may a licensor, author or contributor be held liable for indirect,
+- * direct, other damage, loss, or other issues arising in any way out
+- * of dealing in the work, even if advised of the possibility of such
+- * damage or existence of a defect, except proven that it results out
+- * of said person's immediate fault when using the work as intended.
+- */
+-
+-#include <sys/param.h>
+-#include <sys/types.h>
+-#include <sys/time.h>
+-#if defined(HAVE_SYS_SYSCTL_H) && HAVE_SYS_SYSCTL_H
+-#include <sys/sysctl.h>
+-#endif
+-#include <fcntl.h>
+-#if defined(HAVE_STDINT_H) && HAVE_STDINT_H
+-#include <stdint.h>
+-#elif defined(USE_INTTYPES)
+-#include <inttypes.h>
+-#endif
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <string.h>
+-#include <unistd.h>
+-
+-#if defined(__CYGWIN__) || defined(WIN32)
+-#define USE_MS_CRYPTOAPI
+-#define REDEF_USCORETYPES
+-#endif
+-
+-#ifdef USE_MS_CRYPTOAPI
+-#define WIN32_WINNT 0x400
+-#define _WIN32_WINNT 0x400
+-#include <windows.h>
+-#include <wincrypt.h>
+-
+-static uint8_t w32_buf[16*16384];     /* force reseed */
+-static uint8_t w32_hklm[80];          /* registry key (MS, Admin) */
+-static uint8_t w32_hkcu[256];         /* registry key (per user) */
+-static struct timeval w32_last;               /* last time CGR was used */
+-
+-static char w32_subkey[] = "SOFTWARE\\Microsoft\\Cryptography\\RNG";
+-#endif
+-
+-#ifndef MIN
+-#define       MIN(a,b)        (((a)<(b))?(a):(b))
+-#endif
+-#ifndef MAX
+-#define       MAX(a,b)        (((a)>(b))?(a):(b))
+-#endif
+-
+-#ifdef REDEF_USCORETYPES
+-#define u_int32_t     uint32_t
+-#endif
+-
+-#ifndef _PATH_URANDOM
+-#define _PATH_URANDOM "/dev/urandom"
+-#endif
+-
+-static struct arc4_stream {
+-      uint8_t i;
+-      uint8_t j;
+-      uint8_t s[256];
+-} arc4_ctx;
+-
+-static int rs_initialized;
+-static pid_t arc4_stir_pid;
+-static int arc4_count;
+-static const char __randomdev[] = _PATH_URANDOM;
+-
+-static uint8_t arc4_getbyte(void);
+-static void stir_finish(uint8_t);
+-static void arc4_atexit(void);
+-static char arc4_writeback(uint8_t *, size_t, char);
+-
+-#ifndef arc4random_pushk
+-u_int32_t arc4random(void);
+-void arc4random_addrandom(u_char *, int);
+-void arc4random_stir(void);
+-#if defined(USE_MS_CRYPTOAPI) || defined(OPPORTUNISTIC_ROOT_PUSHB)
+-uint32_t arc4random_pushb(const void *, size_t);
+-#endif
+-#endif
+-
+-#define NEED_UNIFORM_BUF_PROTO
+-#if defined(__OpenBSD__) && defined(OpenBSD) && (OpenBSD > 200805)
+-#undef NEED_UNIFORM_BUF_PROTO
+-#elif defined(__MirBSD__) && defined(MirBSD) && (MirBSD > 0x0AA4)
+-#undef NEED_UNIFORM_BUF_PROTO
+-#endif
+-
+-#ifdef NEED_UNIFORM_BUF_PROTO
+-u_int32_t arc4random_uniform(u_int32_t);
+-void arc4random_buf(void *, size_t);
+-#endif
+-
+-static void
+-arc4_init(void)
+-{
+-      int n;
+-
+-      for (n = 0; n < 256; n++)
+-              arc4_ctx.s[n] = (uint8_t)n;
+-      arc4_ctx.i = 0;
+-      arc4_ctx.j = 0;
+-}
+-
+-static void
+-arc4_addrandom(const u_char *dat, size_t datlen)
+-{
+-      size_t n = 0;
+-      uint8_t si;
+-
+-      arc4_ctx.i--;
+-      while (n < 256) {
+-              arc4_ctx.i++;
+-              si = arc4_ctx.s[arc4_ctx.i];
+-              arc4_ctx.j = (uint8_t)(arc4_ctx.j + si + dat[n++ % datlen]);
+-              arc4_ctx.s[arc4_ctx.i] = arc4_ctx.s[arc4_ctx.j];
+-              arc4_ctx.s[arc4_ctx.j] = si;
+-      }
+-      arc4_ctx.i++;
+-      arc4_ctx.j = arc4_ctx.i;
+-}
+-
+-#if defined(USE_MS_CRYPTOAPI)
+-#define RNDEV_BYTES   128
+-#elif defined(__INTERIX)
+-#define RNDEV_BYTES   4       /* slow /dev/urandom */
+-#elif defined(__OpenBSD__)
+-#define RNDEV_BYTES   (256 - (sizeof(struct timeval) + sizeof(pid_t)))
+-#elif defined(__CYGWIN__)
+-#define RNDEV_BYTES   64      /* /dev/urandom probably CryptoAPI */
+-#elif defined(__FreeBSD__)
+-#define RNDEV_BYTES   16      /* Yarrow has few state */
+-#elif defined(__GLIBC__)
+-#define RNDEV_BYTES   16      /* requested by maintainers */
+-#else
+-#define RNDEV_BYTES   8       /* unknown OS? */
+-#endif
+-
+-static void
+-arc4_stir(void)
+-{
+-      int fd;
+-      struct {
+-              struct timeval tv;
+-              pid_t pid;
+-              u_int rnd[(RNDEV_BYTES + sizeof(u_int) - 1) / sizeof(u_int)];
+-      } rdat;
+-      size_t sz = 0;
+-
+-      gettimeofday(&rdat.tv, NULL);
+-      rdat.pid = getpid();
+-      memcpy(rdat.rnd, __vcsid, MIN(sizeof(__vcsid), sizeof(rdat.rnd)));
+-
+-#ifdef USE_MS_CRYPTOAPI
+-      if (arc4_writeback((char *)rdat.rnd, sizeof(rdat.rnd), 1))
+-              goto stir_okay;
+-#endif
+-
+-      /* /dev/urandom is a multithread interface, sysctl is not. */
+-      /* Try to use /dev/urandom before sysctl. */
+-      fd = open(__randomdev, O_RDONLY);
+-      if (fd != -1) {
+-              sz = (size_t)read(fd, rdat.rnd, sizeof(rdat.rnd));
+-              close(fd);
+-      }
+-      if (sz > sizeof(rdat.rnd))
+-              sz = 0;
+-      if (fd == -1 || sz != sizeof(rdat.rnd)) {
+-              /* /dev/urandom failed? Maybe we're in a chroot. */
+-#if /* Linux */ defined(_LINUX_SYSCTL_H) || \
+-    /* OpenBSD */ (defined(CTL_KERN) && defined(KERN_ARND))
+-              int mib[3], nmib = 3;
+-              size_t i = sz / sizeof(u_int), len;
+-
+-#ifdef _LINUX_SYSCTL_H
+-              mib[0] = CTL_KERN;
+-              mib[1] = KERN_RANDOM;
+-              mib[2] = RANDOM_UUID;
+-#else
+-              mib[0] = CTL_KERN;
+-              mib[1] = KERN_ARND;
+-              nmib = 2;
+-#endif
+-
+-              while (i < sizeof(rdat.rnd) / sizeof(u_int)) {
+-                      len = sizeof(u_int);
+-                      if (sysctl(mib, nmib, &rdat.rnd[i++], &len,
+-                          NULL, 0) == -1) {
+-                              fputs("warning: no entropy source\n", stderr);
+-                              break;
+-                      }
+-              }
+-#else
+-              /* XXX kFreeBSD doesn't seem to have KERN_ARND or so */
+-              ;
+-#endif
+-      }
+-
+-#ifdef USE_MS_CRYPTOAPI
+- stir_okay:
+-#endif
+-      fd = arc4_getbyte();
+-
+-      /*
+-       * Time to give up. If no entropy could be found then we will just
+-       * use gettimeofday and getpid.
+-       */
+-      arc4_addrandom((u_char *)&rdat, sizeof(rdat));
+-
+-      stir_finish(fd);
+-}
+-
+-static void
+-stir_finish(uint8_t av)
+-{
+-      size_t n;
+-      uint8_t tb[16];
+-
+-      arc4_stir_pid = getpid();
+-
+-      /*
+-       * Discard early keystream, as per recommendations in:
+-       * http://www.wisdom.weizmann.ac.il/~itsik/RC4/Papers/Rc4_ksa.ps
+-       * We discard 256 words. A long word is 4 bytes.
+-       * We also discard a randomly fuzzed amount.
+-       */
+-      n = 256 * 4 + (arc4_getbyte() & 0x0FU) + (av & 0xF0U);
+-      av &= 0x0FU;
+-      while (n--)
+-              arc4_getbyte();
+-      while (++n < sizeof(tb))
+-              tb[n] = arc4_getbyte();
+-      if (arc4_writeback(tb, sizeof(tb), 0))
+-              arc4_getbyte();
+-      while (av--)
+-              arc4_getbyte();
+-      arc4_count = 1600000;
+-}
+-
+-static uint8_t
+-arc4_getbyte(void)
+-{
+-      uint8_t si, sj;
+-
+-      arc4_ctx.i++;
+-      si = arc4_ctx.s[arc4_ctx.i];
+-      arc4_ctx.j = (uint8_t)(arc4_ctx.j + si);
+-      sj = arc4_ctx.s[arc4_ctx.j];
+-      arc4_ctx.s[arc4_ctx.i] = sj;
+-      arc4_ctx.s[arc4_ctx.j] = si;
+-      return (arc4_ctx.s[(si + sj) & 0xff]);
+-}
+-
+-static uint32_t
+-arc4_getword(void)
+-{
+-      uint32_t val;
+-      val = (uint32_t)arc4_getbyte() << 24;
+-      val |= (uint32_t)arc4_getbyte() << 16;
+-      val |= (uint32_t)arc4_getbyte() << 8;
+-      val |= (uint32_t)arc4_getbyte();
+-      return (val);
+-}
+-
+-void
+-arc4random_stir(void)
+-{
+-      if (!rs_initialized) {
+-              arc4_init();
+-              rs_initialized = 1;
+-              atexit(arc4_atexit);
+-      }
+-      arc4_stir();
+-}
+-
+-void
+-arc4random_addrandom(u_char *dat, int datlen)
+-{
+-      if (!rs_initialized)
+-              arc4random_stir();
+-      arc4_addrandom(dat, datlen);
+-}
+-
+-u_int32_t
+-arc4random(void)
+-{
+-      arc4_count -= 4;
+-      if (arc4_count <= 0 || !rs_initialized || arc4_stir_pid != getpid())
+-              arc4random_stir();
+-      return arc4_getword();
+-}
+-
+-/*
+- * Returns 0 if write error; 0 if do_rd and read error;
+- * 1 if !do_rd and read error but not write error;
+- * 1 if no error occured.
+- */
+-static char
+-arc4_writeback(uint8_t *buf, size_t len, char do_rd)
+-{
+-#ifdef USE_MS_CRYPTOAPI
+-      static char has_provider = 0;
+-      static HCRYPTPROV p;
+-      HKEY hKeyLM, hKeyCU;
+-      DWORD ksz;
+-      char rc = 6, has_rkey = 0, w32_a4b[16];
+-      size_t i, j, xlen;
+-      struct timeval tv;
+-
+-      for (i = 0; i < sizeof(w32_a4b); ++i)
+-              w32_a4b[i] = arc4_getbyte();
+-      for (i = arc4_getbyte() & 15; i; --i)
+-              arc4_getbyte();
+-
+-      ksz = sizeof(w32_buf);
+-      if ((/* read-write */ RegOpenKeyEx(HKEY_LOCAL_MACHINE, w32_subkey,
+-          0, KEY_QUERY_VALUE | KEY_SET_VALUE, &hKeyLM) == ERROR_SUCCESS ||
+-          /* try read-only */ RegOpenKeyEx(HKEY_LOCAL_MACHINE, w32_subkey,
+-          0, KEY_QUERY_VALUE, &hKeyLM) == ERROR_SUCCESS) && /* get value */
+-          (RegQueryValueEx(hKeyLM, "Seed", NULL, NULL, w32_buf, &ksz) ==
+-          ERROR_SUCCESS) && /* got any content? */ ksz) {
+-              /* we got HKLM key, read-write or read-only */
+-              has_rkey |= 1;
+-              /* move content to destination */
+-              memset(w32_hklm, '\0', sizeof(w32_hklm));
+-              for (i = 0; i < MAX(ksz, sizeof(w32_hklm)); ++i)
+-                      w32_hklm[i % sizeof(w32_hklm)] ^= w32_buf[i % ksz];
+-      }
+-      ksz = sizeof(w32_buf);
+-      if ((/* read-write */ RegCreateKeyEx(HKEY_CURRENT_USER, w32_subkey,
+-          0, NULL, 0, KEY_QUERY_VALUE | KEY_SET_VALUE, NULL, &hKeyCU,
+-          NULL) == ERROR_SUCCESS || /* R/O */ RegOpenKeyEx(HKEY_CURRENT_USER,
+-          w32_subkey, 0, KEY_QUERY_VALUE, &hKeyLM) == ERROR_SUCCESS) &&
+-          /* get value */ (RegQueryValueEx(hKeyLM, "Seed", NULL, NULL,
+-          w32_buf, &ksz) == ERROR_SUCCESS) && /* got any content? */ ksz) {
+-              /* we got HKCU key, created, read-write or read-only */
+-              has_rkey |= 2;
+-              /* move content to destination */
+-              memset(w32_hkcu, '\0', sizeof(w32_hkcu));
+-              for (i = 0; i < MAX(ksz, sizeof(w32_hkcu)); ++i)
+-                      w32_hkcu[i % sizeof(w32_hkcu)] ^= w32_buf[i % ksz];
+-      }
+-
+-      if (!do_rd)
+-              goto nogen_out;
+-
+-      if (has_rkey && gettimeofday(&tv, NULL) == 0) {
+-              /* we have registry key; rate-limit CryptGenRandom */
+-              if (tv.tv_sec - w32_last.tv_sec < 128 + (arc4_getbyte() & 127))
+-                      goto nogen_out;
+-              /* nope, more than 2-4 minutes, call it */
+-              w32_last.tv_sec = tv.tv_sec;
+-      }
+-
+-      if (!has_provider) {
+-              if (!CryptAcquireContext(&p, NULL, NULL, PROV_RSA_FULL, 0)) {
+-                      if ((HRESULT)GetLastError() != NTE_BAD_KEYSET)
+-                              goto nogen_out;
+-                      if (!CryptAcquireContext(&p, NULL, NULL, PROV_RSA_FULL,
+-                          CRYPT_NEWKEYSET))
+-                              goto nogen_out;
+-              }
+-              has_provider = 1;
+-      }
+-      i = 0;
+-      while (i < 256)
+-              w32_buf[i++] = arc4_getbyte();
+-      if (!CryptGenRandom(p, sizeof(w32_buf), w32_buf)) {
+-              w32_last.tv_sec = 0;
+- nogen_out:
+-              rc |= 1;
+-              memset(w32_buf, '\0', 256);
+-      }
+-      xlen = MIN(sizeof(w32_buf) - sizeof(w32_hklm) - sizeof(w32_hkcu) -
+-          sizeof(w32_a4b), len);
+-      j = xlen + sizeof(w32_hklm) + sizeof(w32_hkcu) + sizeof(w32_a4b);
+-      for (i = 0; i < MAX(j, len); ++i)
+-              w32_buf[i % j] ^= w32_hklm[i % sizeof(w32_hklm)] ^
+-                  w32_hkcu[i % sizeof(w32_hkcu)] ^ buf[i % len] ^
+-                  arc4_getbyte();
+-      if (has_rkey & 1) {
+-              if (RegSetValueEx(hKeyLM, "Seed", 0, REG_BINARY,
+-                  w32_buf, sizeof(w32_hklm)) == ERROR_SUCCESS)
+-                      rc &= ~2;
+-              RegCloseKey(hKeyLM);
+-      }
+-      if (has_rkey & 2) {
+-              if (RegSetValueEx(hKeyCU, "Seed", 0, REG_BINARY,
+-                  w32_buf + sizeof(w32_hklm), sizeof(w32_hkcu)) ==
+-                  ERROR_SUCCESS)
+-                      rc &= ~4;
+-              RegCloseKey(hKeyCU);
+-      }
+-      for (i = 0; i < sizeof(w32_a4b); ++i)
+-              w32_a4b[i] ^= w32_buf[sizeof(w32_hklm) + sizeof(w32_hkcu) + i];
+-      arc4_addrandom(w32_a4b, sizeof(w32_a4b));
+-
+-      i = sizeof(w32_hklm) + sizeof(w32_hkcu) + sizeof(w32_a4b);
+-      while (len) {
+-              j = MIN(len, xlen);
+-              memcpy(buf, w32_buf + i, j);
+-              buf += j;
+-              len -= j;
+-      }
+-
+-      memset(w32_buf, '\0', sizeof(w32_buf));
+-
+-      return (
+-          /* read error occured */
+-          (!has_rkey && (rc & 1)) ? 0 :
+-          /* don't care about write errors */
+-          !do_rd ? 1 :
+-          /* couldn't write */
+-          (rc & 6) == 6 ? 0 :
+-          /* at least one RegSetValueEx succeeded */
+-          1);
+-#elif defined(arc4random_pushk)
+-      uint32_t num;
+-
+-      num = arc4random_pushk(buf, len);
+-      memcpy(buf, &num, sizeof(num));
+-      return (do_rd ? 0 : 1);
+-#else
+-      int fd;
+-
+-      if ((fd = open(__randomdev, O_WRONLY)) != -1) {
+-              if (write(fd, buf, len) < 4)
+-                      do_rd = 1;
+-              close(fd);
+-      }
+-      return (do_rd || fd == -1 ? 0 : 1);
+-#endif
+-}
+-
+-#if defined(USE_MS_CRYPTOAPI) || defined(arc4random_pushk) || \
+-    defined(OPPORTUNISTIC_ROOT_PUSHB)
+-uint32_t
+-arc4random_pushb(const void *src, size_t len)
+-{
+-      size_t rlen;
+-      union {
+-              uint8_t buf[256];
+-              struct {
+-                      struct timeval tv;
+-                      const void *sp, *dp;
+-                      size_t sz;
+-                      uint32_t vu;
+-              } s;
+-              uint32_t xbuf;
+-      } idat;
+-      uint32_t res = 1;
+-
+-      if (!rs_initialized) {
+-              arc4_init();
+-              rs_initialized = 1;
+-      }
+-
+-      idat.s.sp = &idat;
+-      idat.s.dp = src;
+-      idat.s.sz = len;
+-      idat.s.vu = arc4_getword();
+-      gettimeofday(&idat.s.tv, NULL);
+-
+-      rlen = MAX(sizeof(idat.s), len);
+-      while (rlen--)
+-              idat.buf[rlen % sizeof(idat.buf)] ^=
+-                  ((const uint8_t *)src)[rlen % len];
+-      rlen = MIN(sizeof(idat), MAX(sizeof(idat.s), len));
+-
+-      if (arc4_writeback((void *)&idat, rlen, 1))
+-              res = 0;
+-      arc4_addrandom((void *)&idat, rlen);
+-      rlen = arc4_getbyte() & 1;
+-      if (res)
+-              res = idat.xbuf;
+-      else
+-              /* we got entropy from the kernel, so consider us stirred */
+-              stir_finish(idat.buf[5]);
+-      if (rlen)
+-              (void)arc4_getbyte();
+-      return (res ^ arc4_getword());
+-}
+-#endif
+-
+-static void
+-arc4_atexit(void)
+-{
+-      struct {
+-              pid_t spid;
+-              int cnt;
+-              uint8_t carr[240];
+-      } buf;
+-      int i = 0;
+-
+-      while (i < 240)
+-              buf.carr[i++] = arc4_getbyte();
+-      buf.spid = arc4_stir_pid;
+-      buf.cnt = arc4_count;
+-
+-      arc4_writeback((uint8_t *)&buf, sizeof(buf), 0);
+-}
+-
+-void
+-arc4random_buf(void *_buf, size_t n)
+-{
+-      uint8_t *buf = (uint8_t *)_buf;
+-
+-      if (!rs_initialized || arc4_stir_pid != getpid())
+-              arc4random_stir();
+-      buf[0] = arc4_getbyte() % 3;
+-      while (buf[0]--)
+-              (void)arc4_getbyte();
+-      while (n--) {
+-              if (--arc4_count <= 0)
+-                      arc4_stir();
+-              buf[n] = arc4_getbyte();
+-      }
+-}
+-
+-/*-
+- * Written by Damien Miller.
+- * With simplifications by Jinmei Tatuya.
+- */
+-
+-/*
+- * Calculate a uniformly distributed random number less than
+- * upper_bound avoiding "modulo bias".
+- *
+- * Uniformity is achieved by generating new random numbers
+- * until the one returned is outside the range
+- * [0, 2^32 % upper_bound[. This guarantees the selected
+- * random number will be inside the range
+- * [2^32 % upper_bound, 2^32[ which maps back to
+- * [0, upper_bound[ after reduction modulo upper_bound.
+- */
+-uint32_t
+-arc4random_uniform(uint32_t upper_bound)
+-{
+-      uint32_t r, min;
+-
+-      if (upper_bound < 2)
+-              return (0);
+-
+-#if defined(ULONG_MAX) && (ULONG_MAX > 0xFFFFFFFFUL)
+-      min = 0x100000000UL % upper_bound;
+-#else
+-      /* calculate (2^32 % upper_bound) avoiding 64-bit math */
+-      if (upper_bound > 0x80000000U)
+-              /* 2^32 - upper_bound (only one "value area") */
+-              min = 1 + ~upper_bound;
+-      else
+-              /* ((2^32 - x) % x) == (2^32 % x) when x <= 2^31 */
+-              min = (0xFFFFFFFFU - upper_bound + 1) % upper_bound;
+-#endif
+-
+-      /*
+-       * This could theoretically loop forever but each retry has
+-       * p > 0.5 (worst case, usually far better) of selecting a
+-       * number inside the range we need, so it should rarely need
+-       * to re-roll (at all).
+-       */
+-      arc4_count -= 4;
+-      if (!rs_initialized || arc4_stir_pid != getpid() || arc4_count <= 0)
+-              arc4random_stir();
+-      if (arc4_getbyte() & 1)
+-              (void)arc4_getbyte();
+-      do {
+-              r = arc4_getword();
+-      } while (r < min);
+-
+-      return (r % upper_bound);
+-}
Index: devel/p5-BSD-arc4random/patches/patch-arc4rnd_xs_c
===================================================================
RCS file: devel/p5-BSD-arc4random/patches/patch-arc4rnd_xs_c
diff -N devel/p5-BSD-arc4random/patches/patch-arc4rnd_xs_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ devel/p5-BSD-arc4random/patches/patch-arc4rnd_xs_c  16 May 2014 20:19:10 
-0000
@@ -0,0 +1,171 @@
+$OpenBSD$
+--- arc4rnd_xs.c.orig  Sun Oct 11 00:44:17 2009
++++ arc4rnd_xs.c       Fri May 16 22:18:56 2014
+@@ -54,11 +54,6 @@ __RCSID("$MirOS: contrib/hosted/tg/code/BSD::arc4rando
+ #define u_int32_t     uint32_t
+ #endif
+ 
+-#ifdef NEED_ARC4RANDOM_DECL
+-u_int32_t arc4random(void);
+-void arc4random_addrandom(u_char *, int);
+-#endif
+-
+ XS(XS_BSD__arc4random_arc4random_xs);
+ XS(XS_BSD__arc4random_arc4random_xs)
+ {
+@@ -74,142 +69,14 @@ XS(XS_BSD__arc4random_arc4random_xs)
+       XSRETURN(1);
+ }
+ 
+-XS(XS_BSD__arc4random_stir_xs);
+-XS(XS_BSD__arc4random_stir_xs)
+-{
+-      dXSARGS;
+-
+-      arc4random_stir();
+-
+-      XSRETURN_EMPTY;
+-}
+-
+-XS(XS_BSD__arc4random_arc4random_addrandom_xs);
+-XS(XS_BSD__arc4random_arc4random_addrandom_xs)
+-{
+-      dXSARGS;
+-      dXSTARG;
+-      SV *sv;
+-      char *buf;
+-      STRLEN len;
+-      uint32_t rv;
+-
+-      sv = ST(0);
+-      buf = SvPV(sv, len);
+-      arc4random_addrandom((unsigned char *)buf, (int)len);
+-      rv = arc4random();
+-      XSprePUSH;
+-      PUSHu((UV)rv);
+-
+-      XSRETURN(1);
+-}
+-
+-#ifndef HAVE_ARC4RANDOM_PUSHB
+-#define HAVE_ARC4RANDOM_PUSHB 1
+-#endif
+-
+-#if HAVE_ARC4RANDOM_PUSHB
+-XS(XS_BSD__arc4random_arc4random_pushb_xs);
+-XS(XS_BSD__arc4random_arc4random_pushb_xs)
+-{
+-      dXSARGS;
+-      dXSTARG;
+-      SV *sv;
+-      char *buf;
+-      STRLEN len;
+-      uint32_t rv;
+-
+-      sv = ST(0);
+-      buf = SvPV(sv, len);
+-      rv = arc4random_pushb((void *)buf, (size_t)len);
+-      XSprePUSH;
+-      PUSHu((UV)rv);
+-
+-      XSRETURN(1);
+-}
+-#elif defined(arc4random_pushk)
+-#define XS_BSD__arc4random_arc4random_pushb_xs \
+-      XS_BSD__arc4random_arc4random_pushk_xs
+-#else
+-#define XS_BSD__arc4random_arc4random_pushb_xs \
+-      XS_BSD__arc4random_arc4random_addrandom_xs
+-#endif
+-
+-#if defined(arc4random_pushk)
+-XS(XS_BSD__arc4random_arc4random_pushk_xs);
+-XS(XS_BSD__arc4random_arc4random_pushk_xs)
+-{
+-      dXSARGS;
+-      dXSTARG;
+-      SV *sv;
+-      char *buf;
+-      STRLEN len;
+-      uint32_t rv;
+-
+-      sv = ST(0);
+-      buf = SvPV(sv, len);
+-      rv = arc4random_pushk((void *)buf, (size_t)len);
+-      XSprePUSH;
+-      PUSHu((UV)rv);
+-
+-      XSRETURN(1);
+-}
+-#elif HAVE_ARC4RANDOM_PUSHB
+-#define XS_BSD__arc4random_arc4random_pushk_xs \
+-      XS_BSD__arc4random_arc4random_pushb_xs
+-#else
+-#define XS_BSD__arc4random_arc4random_pushk_xs \
+-      XS_BSD__arc4random_arc4random_addrandom_xs
+-#endif
+-
+-#undef HAVE_ARC4RANDOM_KINTF
+-#if HAVE_ARC4RANDOM_PUSHB || defined(arc4random_pushk)
+-#define HAVE_ARC4RANDOM_KINTF 1
+-#else
+-#define HAVE_ARC4RANDOM_KINTF 0
+-#endif
+-
+-
+-/*
+- * These may be needed because praeprocessor commands inside a
+- * macro's argument list may not work
+- */
+-
+-#if HAVE_ARC4RANDOM_PUSHB
+-#define IDT_ARC4RANDOM_PUSHB  " arc4random_pushb"
+-#else
+-#define IDT_ARC4RANDOM_PUSHB  ""
+-#endif
+-
+-#if defined(arc4random_pushk)
+-#define IDT_arc4random_pushk  " arc4random_pushk"
+-#else
+-#define IDT_arc4random_pushk  ""
+-#endif
+-
+-#if HAVE_ARC4RANDOM_KINTF
+-#define IDT_ARC4RANDOM_KINTF  " have_kintf:=1"
+-#else
+-#define IDT_ARC4RANDOM_KINTF  " have_kintf:=0"
+-#endif
+-
+ __IDSTRING(api_text, "BSD::arc4random " XS_VERSION " with {"
+     " arc4random"
+-    " arc4random_addrandom"
+-    IDT_ARC4RANDOM_PUSHB
+-    IDT_arc4random_pushk
+-    IDT_ARC4RANDOM_KINTF
+     " }");
+ 
+ 
+ /* the Perl API is not const clean */
+ static char file[] = __FILE__;
+ static char func_a4r[] = "BSD::arc4random::arc4random_xs";
+-static char func_a4add[] = "BSD::arc4random::arc4random_addrandom_xs";
+-static char func_a4rpb[] = "BSD::arc4random::arc4random_pushb_xs";
+-static char func_a4rpk[] = "BSD::arc4random::arc4random_pushk_xs";
+-static char func_astir[] = "BSD::arc4random::arc4random_stir_xs";
+-static char func_kintf[] = "BSD::arc4random::have_kintf";
+ 
+ #ifdef __cplusplus
+ extern "C"
+@@ -222,12 +89,6 @@ XS(boot_BSD__arc4random)
+       XS_VERSION_BOOTCHECK;
+ 
+       newXS(func_a4r, XS_BSD__arc4random_arc4random_xs, file);
+-      newXS(func_a4add, XS_BSD__arc4random_arc4random_addrandom_xs, file);
+-      newXS(func_a4rpb, XS_BSD__arc4random_arc4random_pushb_xs, file);
+-      newXS(func_a4rpk, XS_BSD__arc4random_arc4random_pushk_xs, file);
+-      newXS(func_astir, XS_BSD__arc4random_stir_xs, file);
+-
+-      newCONSTSUB(NULL, func_kintf, newSViv(HAVE_ARC4RANDOM_KINTF));
+ 
+       XSRETURN_YES;
+ }
Index: devel/p5-BSD-arc4random/patches/patch-lib_BSD_arc4random_pm
===================================================================
RCS file: devel/p5-BSD-arc4random/patches/patch-lib_BSD_arc4random_pm
diff -N devel/p5-BSD-arc4random/patches/patch-lib_BSD_arc4random_pm
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ devel/p5-BSD-arc4random/patches/patch-lib_BSD_arc4random_pm 16 May 2014 
20:32:25 -0000
@@ -0,0 +1,42 @@
+$OpenBSD$
+--- lib/BSD/arc4random.pm.orig Mon Jun  6 01:19:28 2011
++++ lib/BSD/arc4random.pm      Fri May 16 21:46:22 2014
+@@ -73,35 +73,24 @@ arc4random()
+ sub
+ arc4random_addrandom($)
+ {
+-      my $buf = shift;
+-
+-      lock($arcfour_lock) if $have_threadlock;
+-      return &arc4random_addrandom_xs($buf);
++      goto &arc4random;
+ }
+ 
+ sub
+ arc4random_pushb($)
+ {
+-      my $buf = shift;
+-
+-      lock($arcfour_lock) if $have_threadlock;
+-      return &arc4random_pushb_xs($buf);
++      goto &arc4random;
+ }
+ 
+ sub
+ arc4random_pushk($)
+ {
+-      my $buf = shift;
+-
+-      lock($arcfour_lock) if $have_threadlock;
+-      return &arc4random_pushk_xs($buf);
++      goto &arc4random;
+ }
+ 
+ sub
+ arc4random_stir()
+ {
+-      lock($arcfour_lock) if $have_threadlock;
+-      &arc4random_stir_xs();
+       return;
+ }
+ 

Reply via email to