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/