That makes sense to me as a heavy perl user; presumably the pure-perl version can still be installed from CPAN if desired.

On 12 Oct 2016, at 11:46, Alexander Bluhm wrote:

Hi,

My idea of the p5-BSD-arc4random port in OpenBSD is to keep the API
of the BSD::arc4random Perl module, but use our libc functions
internally.  This has been done with BSD::arc4random::arc4random()
a while ago, but BSD::arc4random::arc4random_bytes() and
BSD::arc4random::arc4random_uniform() still use a pure Perl
implementation.  I think that should be replaced with our
arc4random_buf(3) and arc4random_uniform(3) in libc.

Any objections if I take maintainer?  Most of the code is contained
in my patches anyway.

ok?

bluhm

Index: devel/p5-BSD-arc4random/Makefile
===================================================================
RCS file: /data/mirror/openbsd/cvs/ports/devel/p5-BSD-arc4random/Makefile,v
retrieving revision 1.8
diff -u -p -r1.8 Makefile
--- devel/p5-BSD-arc4random/Makefile    20 Mar 2016 19:56:13 -0000      1.8
+++ devel/p5-BSD-arc4random/Makefile    12 Oct 2016 15:40:29 -0000
@@ -4,9 +4,9 @@ COMMENT =               perl interface to the arc4 ra

 MODULES =              cpan
 DISTNAME =             BSD-arc4random-1.50
-REVISION =             3
+REVISION =             4
 CATEGORIES =           devel
-MAINTAINER =           Abel Abraham Camarillo Ojeda <acam...@verlet.org>
+MAINTAINER =           Alexander Bluhm <bl...@openbsd.org>

 # MirOS Licence
 PERMIT_PACKAGE_CDROM = Yes
Index: devel/p5-BSD-arc4random/patches/patch-MANIFEST
===================================================================
RCS file: devel/p5-BSD-arc4random/patches/patch-MANIFEST
diff -N devel/p5-BSD-arc4random/patches/patch-MANIFEST
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ devel/p5-BSD-arc4random/patches/patch-MANIFEST 12 Oct 2016 12:50:31 -0000
@@ -0,0 +1,15 @@
+$OpenBSD$
+
+The file arc4random.c is removed in post-extract as everything is
+implemented in OpenBSD libc.  Avoid a build warning about manifest.
+
+--- MANIFEST.orig      Sun May 17 15:05:04 2009
++++ MANIFEST   Wed Oct 12 14:09:10 2016
+@@ -3,7 +3,6 @@ META.yml
+ Makefile.PL
+ README
+ TODO
+-arc4random.c
+ arc4rnd_xs.c
+ lib/BSD/arc4random.pm
+ t/check.t
Index: devel/p5-BSD-arc4random/patches/patch-arc4rnd_xs_c
===================================================================
RCS file: /data/mirror/openbsd/cvs/ports/devel/p5-BSD-arc4random/patches/patch-arc4rnd_xs_c,v
retrieving revision 1.1
diff -u -p -r1.1 patch-arc4rnd_xs_c
--- devel/p5-BSD-arc4random/patches/patch-arc4rnd_xs_c 16 May 2014 23:08:31 -0000 1.1 +++ devel/p5-BSD-arc4random/patches/patch-arc4rnd_xs_c 12 Oct 2016 15:34:36 -0000
@@ -1,10 +1,43 @@
 $OpenBSD: patch-arc4rnd_xs_c,v 1.1 2014/05/16 23:08:31 bluhm Exp $
+
+Implement Perl XS wrapper for OpenBSD libc arc4random(3),
+arc4random_buf(3), arc4random_uniform(3), remove everything else.
+
 --- 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
++++ arc4rnd_xs.c       Wed Oct 12 17:33:31 2016
+@@ -1,4 +1,5 @@
+ /*-
++ * Copyright (c) 2016 Alexander Bluhm <bl...@openbsd.org>
+  * Copyright (c) 2008, 2009
+  *    Thorsten Glaser <t...@mirbsd.org>
+  *
+@@ -18,15 +19,8 @@
+  * of said person's immediate fault when using the work as intended.
+  */
+
+-#include <sys/types.h>
+ #include <stdlib.h>
+
+-#if defined(HAVE_STDINT_H) && HAVE_STDINT_H
+-#include <stdint.h>
+-#elif defined(USE_INTTYPES)
+-#include <inttypes.h>
+-#endif
+-
+ #include "EXTERN.h"
+ #include "perl.h"
+ #include "XSUB.h"
+@@ -48,17 +42,8 @@
+ #define __RCSID(x)                    __IDSTRING(rcsid,x)
  #endif

+-__RCSID("$MirOS: contrib/hosted/tg/code/BSD::arc4random/arc4rnd_xs.c,v 1.5 2009/10/10 22:43:53 tg Exp $");
++__RCSID("$OpenBSD$");
+
+-#ifdef REDEF_USCORETYPES
+-#define u_int32_t     uint32_t
+-#endif
+-
 -#ifdef NEED_ARC4RANDOM_DECL
 -u_int32_t arc4random(void);
 -void arc4random_addrandom(u_char *, int);
@@ -13,14 +46,16 @@ $OpenBSD: patch-arc4rnd_xs_c,v 1.1 2014/
  XS(XS_BSD__arc4random_arc4random_xs);
  XS(XS_BSD__arc4random_arc4random_xs)
  {
-@@ -74,142 +69,14 @@ XS(XS_BSD__arc4random_arc4random_xs)
+@@ -74,142 +59,62 @@ XS(XS_BSD__arc4random_arc4random_xs)
        XSRETURN(1);
  }

 -XS(XS_BSD__arc4random_stir_xs);
 -XS(XS_BSD__arc4random_stir_xs)
--{
--      dXSARGS;
++XS(XS_BSD__arc4random_arc4random_uniform_xs);
++XS(XS_BSD__arc4random_arc4random_uniform_xs)
+ {
+       dXSARGS;
 -
 -      arc4random_stir();
 -
@@ -31,19 +66,22 @@ $OpenBSD: patch-arc4rnd_xs_c,v 1.1 2014/
 -XS(XS_BSD__arc4random_arc4random_addrandom_xs)
 -{
 -      dXSARGS;
--      dXSTARG;
--      SV *sv;
+       dXSTARG;
+       SV *sv;
 -      char *buf;
 -      STRLEN len;
--      uint32_t rv;
--
--      sv = ST(0);
++      uint32_t upper_bound;
+       uint32_t rv;
+
+       sv = ST(0);
 -      buf = SvPV(sv, len);
 -      arc4random_addrandom((unsigned char *)buf, (int)len);
 -      rv = arc4random();
 -      XSprePUSH;
 -      PUSHu((UV)rv);
--
++      upper_bound = SvUV(sv);
++      rv = arc4random_uniform(upper_bound);
+
 -      XSRETURN(1);
 -}
 -
@@ -65,11 +103,11 @@ $OpenBSD: patch-arc4rnd_xs_c,v 1.1 2014/
 -      sv = ST(0);
 -      buf = SvPV(sv, len);
 -      rv = arc4random_pushb((void *)buf, (size_t)len);
--      XSprePUSH;
--      PUSHu((UV)rv);
--
--      XSRETURN(1);
--}
+       XSprePUSH;
+       PUSHu((UV)rv);
+
+       XSRETURN(1);
+ }
 -#elif defined(arc4random_pushk)
 -#define XS_BSD__arc4random_arc4random_pushb_xs \
 -      XS_BSD__arc4random_arc4random_pushk_xs
@@ -77,26 +115,39 @@ $OpenBSD: patch-arc4rnd_xs_c,v 1.1 2014/
 -#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;
++XS(XS_BSD__arc4random_arc4random_buf_xs);
++XS(XS_BSD__arc4random_arc4random_buf_xs)
+ {
+       dXSARGS;
+       dXSTARG;
+       SV *sv;
+       char *buf;
 -      STRLEN len;
 -      uint32_t rv;
--
--      sv = ST(0);
++      size_t nbytes;
+
+       sv = ST(0);
 -      buf = SvPV(sv, len);
 -      rv = arc4random_pushk((void *)buf, (size_t)len);
--      XSprePUSH;
++      nbytes = SvUV(sv);
++      sv = sv_newmortal();
++      if (nbytes == SIZE_T_MAX)
++              nbytes--;
++      Newx(buf, nbytes + 1, char);
++      arc4random_buf(buf, nbytes);
++      buf[nbytes] = '\0';
++      sv_usepvn_flags(sv, buf, nbytes, SV_SMAGIC | SV_HAS_TRAILING_NUL);
++
+       XSprePUSH;
 -      PUSHu((UV)rv);
--
--      XSRETURN(1);
--}
++      PUSHs(sv);
+
+       XSRETURN(1);
+ }
 -#elif HAVE_ARC4RANDOM_PUSHB
 -#define XS_BSD__arc4random_arc4random_pushk_xs \
 -      XS_BSD__arc4random_arc4random_pushb_xs
@@ -104,7 +155,7 @@ $OpenBSD: patch-arc4rnd_xs_c,v 1.1 2014/
 -#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
@@ -142,6 +193,8 @@ $OpenBSD: patch-arc4rnd_xs_c,v 1.1 2014/
 -    IDT_ARC4RANDOM_PUSHB
 -    IDT_arc4random_pushk
 -    IDT_ARC4RANDOM_KINTF
++    " arc4random_uniform"
++    " arc4random_buf"
      " }");

@@ -153,10 +206,12 @@ $OpenBSD: patch-arc4rnd_xs_c,v 1.1 2014/
 -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";
++static char func_a4r_uniform[] = "BSD::arc4random::arc4random_uniform_xs";
++static char func_a4r_buf[] = "BSD::arc4random::arc4random_buf_xs";

  #ifdef __cplusplus
  extern "C"
-@@ -222,12 +89,6 @@ XS(boot_BSD__arc4random)
+@@ -222,12 +127,8 @@ XS(boot_BSD__arc4random)
        XS_VERSION_BOOTCHECK;

        newXS(func_a4r, XS_BSD__arc4random_arc4random_xs, file);
@@ -166,6 +221,8 @@ $OpenBSD: patch-arc4rnd_xs_c,v 1.1 2014/
 -      newXS(func_astir, XS_BSD__arc4random_stir_xs, file);
 -
 -      newCONSTSUB(NULL, func_kintf, newSViv(HAVE_ARC4RANDOM_KINTF));
++ newXS(func_a4r_uniform, XS_BSD__arc4random_arc4random_uniform_xs, file);
++      newXS(func_a4r_buf, XS_BSD__arc4random_arc4random_buf_xs, file);

        XSRETURN_YES;
  }
Index: devel/p5-BSD-arc4random/patches/patch-lib_BSD_arc4random_pm
===================================================================
RCS file: /data/mirror/openbsd/cvs/ports/devel/p5-BSD-arc4random/patches/patch-lib_BSD_arc4random_pm,v
retrieving revision 1.1
diff -u -p -r1.1 patch-lib_BSD_arc4random_pm
--- devel/p5-BSD-arc4random/patches/patch-lib_BSD_arc4random_pm 16 May 2014 23:08:31 -0000 1.1 +++ devel/p5-BSD-arc4random/patches/patch-lib_BSD_arc4random_pm 12 Oct 2016 15:34:32 -0000
@@ -1,7 +1,23 @@
$OpenBSD: patch-lib_BSD_arc4random_pm,v 1.1 2014/05/16 23:08:31 bluhm Exp $
+
+Do nothing special for arc4random_addrandom(), arc4random_pushb(),
+arc4random_pushk(), arc4random_stir(), they are not implemented in
+OpenBSD libc.
+
+Replace the pure Perl arc4random_bytes(), arc4random_uniform()
+implementation with arc4random_buf(3), arc4random_uniform(3) Perl
+XS wrapper for OpenBSD libc functions.
+
 --- 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()
++++ lib/BSD/arc4random.pm      Wed Oct 12 17:34:11 2016
+@@ -1,5 +1,6 @@
+ # $MirOS: contrib/hosted/tg/code/BSD::arc4random/lib/BSD/arc4random.pm,v 1.10 2011/06/05 23:19:04 tg Exp $
+ #-
++# Copyright (c) 2016 Alexander Bluhm <bl...@openbsd.org>
+ # Copyright (c) 2008, 2009, 2010, 2011
+ #     Thorsten Glaser <t...@mirbsd.org>
+ # Copyright (c) 2009
+@@ -73,35 +74,24 @@ arc4random()
  sub
  arc4random_addrandom($)
  {
@@ -40,3 +56,88 @@ $OpenBSD: patch-lib_BSD_arc4random_pm,v
        return;
  }

+@@ -109,80 +99,18 @@ sub
+ arc4random_bytes($;$)
+ {
+       my ($len, $buf) = @_;
+-      my $val;
+-      my $vleft = 0;
+-      my $rv = '';
+-      my $idx = 0;
+
+-      if (defined($buf)) {
+-              $val = arc4random_pushb($buf);
+-              $vleft = 4;
+-      }
+-      while (($len - $idx) >= 4) {
+-              if ($vleft < 4) {
+-                      $val = arc4random();
+-                      $vleft = 4;
+-              }
+-              vec($rv, $idx / 4, 32) = $val;
+-              $idx += 4;
+-              $vleft = 0;
+-      }
+-      while ($idx < $len) {
+-              if ($vleft == 0) {
+-                      $val = arc4random();
+-                      $vleft = 4;
+-              }
+-              vec($rv, $idx, 8) = $val & 0xFF;
+-              $idx++;
+-              $val >>= 8;
+-              $vleft--;
+-      }
+-      return $rv;
++      lock($arcfour_lock) if $have_threadlock;
++      return &arc4random_buf_xs($len);
+ }
+
+-# Perl implementation of arc4random_uniform(3)
+-# C implementation contributed by d...@openbsd.org, jinmei_tat...@isc.org
+-#
+-# 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
+-# [2**32 % upper_bound, 2**32) which maps back to [0, upper_bound)
+-# after reduction modulo upper_bound.
+-
+ sub
+ arc4random_uniform($)
+ {
+       my $upper_bound = shift;
+-      my $r;
+-      my $min;
+
+-      return 0 unless defined($upper_bound);
+-      # convert upper_bound to 32-bit UV (unsigned integer value)
+-      $upper_bound &= 0xFFFFFFFF;
+-      return 0 if $upper_bound < 2 || $upper_bound > 0xFFFFFFFF;
+-
+-      # Calculate (2**32 % upper_bound) avoiding 64-bit math
+-      if ($upper_bound > 0x80000000) {
+-              # 2**32 - upper_bound (only one "value area")
+-              $min = 1 + (~$upper_bound & 0xFFFFFFFF);
+-      } else {
+-              # (2**32 - x) % x == 2**32 % x when x <= 2**31
+-              $min = (0xFFFFFFFF - $upper_bound + 1) % $upper_bound;
+-      }
+-
+-      # 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.
+-      while (1) {
+-              $r = arc4random();
+-              last if $r >= $min;
+-      }
+-
+-      return ($r % $upper_bound);
++      lock($arcfour_lock) if $have_threadlock;
++      return &arc4random_uniform_xs($upper_bound);
+ }
+
+ # private implementation for a tied $RANDOM variable
Index: devel/p5-BSD-arc4random/pkg/PLIST
===================================================================
RCS file: /data/mirror/openbsd/cvs/ports/devel/p5-BSD-arc4random/pkg/PLIST,v
retrieving revision 1.3
diff -u -p -r1.3 PLIST
--- devel/p5-BSD-arc4random/pkg/PLIST   20 Mar 2015 22:47:40 -0000      1.3
+++ devel/p5-BSD-arc4random/pkg/PLIST   12 Oct 2016 11:57:41 -0000
@@ -2,7 +2,6 @@
 ${P5ARCH}/
 ${P5ARCH}/BSD/
 ${P5ARCH}/BSD/arc4random.pm
-${P5ARCH}/BSD/arc4random.pm.orig
 ${P5ARCH}/auto/
 ${P5ARCH}/auto/BSD/
 ${P5ARCH}/auto/BSD/arc4random/




devin
--
contact info: https://nacredata.com/devin

• Amazing Tie-Dye Tee-shirts: https://www.icedyedesigns.com
• Art/Poetry/Environment: https://secure.extinctionwitness.org/support
• Support progressive climate politics: https://secure.voteclimatepac.org/donate/

Reply via email to