aboutsummaryrefslogtreecommitdiffstats
path: root/main/libasr
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2018-10-29 08:30:13 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2018-11-07 16:46:09 +0000
commitf82b04f0cec7fe6af7841f73765a1d882ec41098 (patch)
treefe3ea1b79702a4113e5d6d2ed83beea75f2e9531 /main/libasr
parentfc9ecaa0967212b640775caf2483f1c1244590f0 (diff)
downloadaports-f82b04f0cec7fe6af7841f73765a1d882ec41098.tar.bz2
aports-f82b04f0cec7fe6af7841f73765a1d882ec41098.tar.xz
main/libasr: rebuild against openssl 1.1
use libbsd for arc4random
Diffstat (limited to 'main/libasr')
-rw-r--r--main/libasr/0002-Replace-missing-res_randomid-with-the-more-secure-ar.patch2
-rw-r--r--main/libasr/APKBUILD9
-rw-r--r--main/libasr/arc4random.patch419
3 files changed, 425 insertions, 5 deletions
diff --git a/main/libasr/0002-Replace-missing-res_randomid-with-the-more-secure-ar.patch b/main/libasr/0002-Replace-missing-res_randomid-with-the-more-secure-ar.patch
index 023b508b01..7383976d20 100644
--- a/main/libasr/0002-Replace-missing-res_randomid-with-the-more-secure-ar.patch
+++ b/main/libasr/0002-Replace-missing-res_randomid-with-the-more-secure-ar.patch
@@ -19,7 +19,7 @@ index 10aff04..fa0e896 100644
)
#l325
-+LIBS="-lcrypto $LIBS"
++LIBS="-lcrypto -lbsd $LIBS"
+
AC_CHECK_HEADERS([ \
crypt.h \
diff --git a/main/libasr/APKBUILD b/main/libasr/APKBUILD
index 2afb27a1aa..3c770da28b 100644
--- a/main/libasr/APKBUILD
+++ b/main/libasr/APKBUILD
@@ -2,13 +2,13 @@
# Maintainer: Francesco Colista <fcolista@alpinelinux.org>
pkgname=libasr
pkgver=1.0.2
-pkgrel=8
+pkgrel=9
pkgdesc="libasr is a free, simple and portable asynchronous resolver library"
url="https://www.opensmtpd.org"
arch="all"
license="ISC"
options="!check"
-makedepends="mdocml bison libressl-dev automake autoconf libtool"
+makedepends="mdocml bison openssl-dev automake autoconf libtool libbsd-dev"
subpackages="$pkgname-dev $pkgname-doc"
source="https://github.com/OpenSMTPD/libasr/archive/libasr-$pkgver.tar.gz
0001-Fix-NETDB_SUCCESS-value.patch
@@ -36,7 +36,8 @@ build() {
--with-Werror \
--prefix=/usr \
--mandir=/usr/share/man \
- --with-mantype=man
+ --with-mantype=man \
+ --without-Werror
make
}
@@ -47,6 +48,6 @@ package() {
sha512sums="d70d5fb5728678074f4fd3d0f925b13a8a5ac9fec7a38277f2ed0e6b3f3fe2591845d035f43ece1ee16f1fdfd7d7443140ca36f171f94f310ed821b88b82b924 libasr-1.0.2.tar.gz
aebd80ae1fd33604f547833d4244161cc8551404c61e666967062e484a30d88f597e71c9f9956a3604bf02e625d8aabd9b4669d3efad1a2a15efb2f8acd8ac03 0001-Fix-NETDB_SUCCESS-value.patch
-2bef347875b1ad4ec47a6d642e0f555f40906e19bce7684fd89c1c3c867f67fff8cf42ddd836480ee73a8b4491ef9385f84c12f39197d677d239f8ac23d740a0 0002-Replace-missing-res_randomid-with-the-more-secure-ar.patch
+1f189036d9f2cc0b7442412cf6349f5a1e567d23a05641c397ee4f5c6ac13a690afd4f5586cb645291682408664dc7582a9ca7552f7ddb6c1aca16bf49c313ef 0002-Replace-missing-res_randomid-with-the-more-secure-ar.patch
32ffc6e64d9eeb7aa37a2f4b4633ac462508f2ee7a9152b6c6b87aeebdcc89e809e839d4cc66ed49486b98d34706ff8cd86d8466663bd8712dacd99cfec64e03 0003-no-need-for-openssl-in-libasr.patch
1dca9d2f46c0d34af636469fcd3a8e6febadbbd8a39ba496562cdf17f444ea00c8f247ae6e37dda87bb841b7ecf771164968bdd78a0bd4c69b00e060b4426bb3 0004-mod_automake_bootstrap_version.patch"
diff --git a/main/libasr/arc4random.patch b/main/libasr/arc4random.patch
new file mode 100644
index 0000000000..f102726702
--- /dev/null
+++ b/main/libasr/arc4random.patch
@@ -0,0 +1,419 @@
+From 87c9d4de14d6d97b08db95ff4fcd7611508d3018 Mon Sep 17 00:00:00 2001
+From: Jonathan Curran <jonathan@curran.in>
+Date: Fri, 4 Sep 2015 12:54:21 +0000
+Subject: [PATCH] Use arc4random instead of res_randomid.
+
+arc4random implementation was copied from opensmtpd/openbsd-compat
+---
+ configure.ac | 4 +
+ openbsd-compat/NOTES | 1 +
+ openbsd-compat/arc4random.c | 294 ++++++++++++++++++++++++++++++++
+ openbsd-compat/defines.h | 9 +
+ openbsd-compat/openbsd-compat.h | 19 ++-
+ src/res_mkquery.c | 2 +-
+ src/res_send_async.c | 2 +-
+ 7 files changed, 328 insertions(+), 3 deletions(-)
+ create mode 100644 openbsd-compat/arc4random.c
+
+diff --git a/configure.ac b/configure.ac
+index 10aff04..a5e2681 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -442,6 +442,10 @@ fi
+ #l1572 (customized)
+ dnl Checks for library functions. Please keep in alphabetical order
+ AC_CHECK_FUNCS([ \
++ arc4random \
++ arc4random_buf \
++ arc4random_stir \
++ arc4random_uniform \
+ asprintf \
+ bcopy \
+ explicit_bzero \
+diff --git a/openbsd-compat/NOTES b/openbsd-compat/NOTES
+index baa60ec..869b045 100644
+--- a/openbsd-compat/NOTES
++++ b/openbsd-compat/NOTES
+@@ -1,5 +1,6 @@
+ List of files and where they come from
+
++arc4random.c portable openssh
+ clock_gettime.c handmade
+ defines.h portable openssh
+ fgetln.c part of /usr/src/usr.bin/make/util.c
+diff --git a/openbsd-compat/arc4random.c b/openbsd-compat/arc4random.c
+new file mode 100644
+index 0000000..fa0d630
+--- /dev/null
++++ b/openbsd-compat/arc4random.c
+@@ -0,0 +1,294 @@
++/* OPENBSD ORIGINAL: lib/libc/crypto/arc4random.c */
++
++/* $OpenBSD: arc4random.c,v 1.25 2013/10/01 18:34:57 markus Exp $ */
++
++/*
++ * Copyright (c) 1996, David Mazieres <dm@uun.org>
++ * Copyright (c) 2008, Damien Miller <djm@openbsd.org>
++ * Copyright (c) 2013, Markus Friedl <markus@openbsd.org>
++ *
++ * Permission to use, copy, modify, and distribute this software for any
++ * purpose with or without fee is hereby granted, provided that the above
++ * copyright notice and this permission notice appear in all copies.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
++ */
++
++/*
++ * ChaCha based random number generator for OpenBSD.
++ */
++
++#include "includes.h"
++
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++#include <sys/types.h>
++
++#ifndef HAVE_ARC4RANDOM
++
++#include <openssl/rand.h>
++#include <openssl/err.h>
++
++#include "log.h"
++
++#define KEYSTREAM_ONLY
++#include "chacha_private.h"
++
++#ifdef __GNUC__
++#define inline __inline
++#else /* !__GNUC__ */
++#define inline
++#endif /* !__GNUC__ */
++
++/* OpenSSH isn't multithreaded */
++#define _ARC4_LOCK()
++#define _ARC4_UNLOCK()
++
++#define KEYSZ 32
++#define IVSZ 8
++#define BLOCKSZ 64
++#define RSBUFSZ (16*BLOCKSZ)
++static int rs_initialized;
++static pid_t rs_stir_pid;
++static chacha_ctx rs; /* chacha context for random keystream */
++static u_char rs_buf[RSBUFSZ]; /* keystream blocks */
++static size_t rs_have; /* valid bytes at end of rs_buf */
++static size_t rs_count; /* bytes till reseed */
++
++static inline void _rs_rekey(u_char *dat, size_t datlen);
++
++static inline void
++_rs_init(u_char *buf, size_t n)
++{
++ if (n < KEYSZ + IVSZ)
++ return;
++ chacha_keysetup(&rs, buf, KEYSZ * 8, 0);
++ chacha_ivsetup(&rs, buf + KEYSZ);
++}
++
++static void
++_rs_stir(void)
++{
++ u_char rnd[KEYSZ + IVSZ];
++
++ if (RAND_bytes(rnd, sizeof(rnd)) <= 0)
++ fatal("Couldn't obtain random bytes (error %ld)",
++ ERR_get_error());
++
++ if (!rs_initialized) {
++ rs_initialized = 1;
++ _rs_init(rnd, sizeof(rnd));
++ } else
++ _rs_rekey(rnd, sizeof(rnd));
++ memset(rnd, 0, sizeof(rnd));
++
++ /* invalidate rs_buf */
++ rs_have = 0;
++ memset(rs_buf, 0, RSBUFSZ);
++
++ rs_count = 1600000;
++}
++
++static inline void
++_rs_stir_if_needed(size_t len)
++{
++ pid_t pid = getpid();
++
++ if (rs_count <= len || !rs_initialized || rs_stir_pid != pid) {
++ rs_stir_pid = pid;
++ _rs_stir();
++ } else
++ rs_count -= len;
++}
++
++static inline void
++_rs_rekey(u_char *dat, size_t datlen)
++{
++#ifndef KEYSTREAM_ONLY
++ memset(rs_buf, 0,RSBUFSZ);
++#endif
++ /* fill rs_buf with the keystream */
++ chacha_encrypt_bytes(&rs, rs_buf, rs_buf, RSBUFSZ);
++ /* mix in optional user provided data */
++ if (dat) {
++ size_t i, m;
++
++ m = MIN(datlen, KEYSZ + IVSZ);
++ for (i = 0; i < m; i++)
++ rs_buf[i] ^= dat[i];
++ }
++ /* immediately reinit for backtracking resistance */
++ _rs_init(rs_buf, KEYSZ + IVSZ);
++ memset(rs_buf, 0, KEYSZ + IVSZ);
++ rs_have = RSBUFSZ - KEYSZ - IVSZ;
++}
++
++static inline void
++_rs_random_buf(void *_buf, size_t n)
++{
++ u_char *buf = (u_char *)_buf;
++ size_t m;
++
++ _rs_stir_if_needed(n);
++ while (n > 0) {
++ if (rs_have > 0) {
++ m = MIN(n, rs_have);
++ memcpy(buf, rs_buf + RSBUFSZ - rs_have, m);
++ memset(rs_buf + RSBUFSZ - rs_have, 0, m);
++ buf += m;
++ n -= m;
++ rs_have -= m;
++ }
++ if (rs_have == 0)
++ _rs_rekey(NULL, 0);
++ }
++}
++
++static inline void
++_rs_random_u32(u_int32_t *val)
++{
++ _rs_stir_if_needed(sizeof(*val));
++ if (rs_have < sizeof(*val))
++ _rs_rekey(NULL, 0);
++ memcpy(val, rs_buf + RSBUFSZ - rs_have, sizeof(*val));
++ memset(rs_buf + RSBUFSZ - rs_have, 0, sizeof(*val));
++ rs_have -= sizeof(*val);
++ return;
++}
++
++void
++arc4random_stir(void)
++{
++ _ARC4_LOCK();
++ _rs_stir();
++ _ARC4_UNLOCK();
++}
++
++void
++arc4random_addrandom(u_char *dat, int datlen)
++{
++ int m;
++
++ _ARC4_LOCK();
++ if (!rs_initialized)
++ _rs_stir();
++ while (datlen > 0) {
++ m = MIN(datlen, KEYSZ + IVSZ);
++ _rs_rekey(dat, m);
++ dat += m;
++ datlen -= m;
++ }
++ _ARC4_UNLOCK();
++}
++
++u_int32_t
++arc4random(void)
++{
++ u_int32_t val;
++
++ _ARC4_LOCK();
++ _rs_random_u32(&val);
++ _ARC4_UNLOCK();
++ return val;
++}
++
++/*
++ * If we are providing arc4random, then we can provide a more efficient
++ * arc4random_buf().
++ */
++# ifndef HAVE_ARC4RANDOM_BUF
++void
++arc4random_buf(void *buf, size_t n)
++{
++ _ARC4_LOCK();
++ _rs_random_buf(buf, n);
++ _ARC4_UNLOCK();
++}
++# endif /* !HAVE_ARC4RANDOM_BUF */
++#endif /* !HAVE_ARC4RANDOM */
++
++/* arc4random_buf() that uses platform arc4random() */
++#if !defined(HAVE_ARC4RANDOM_BUF) && defined(HAVE_ARC4RANDOM)
++void
++arc4random_buf(void *_buf, size_t n)
++{
++ size_t i;
++ u_int32_t r = 0;
++ char *buf = (char *)_buf;
++
++ for (i = 0; i < n; i++) {
++ if (i % 4 == 0)
++ r = arc4random();
++ buf[i] = r & 0xff;
++ r >>= 8;
++ }
++ explicit_bzero(&r, sizeof(r));
++}
++#endif /* !defined(HAVE_ARC4RANDOM_BUF) && defined(HAVE_ARC4RANDOM) */
++
++#ifndef HAVE_ARC4RANDOM_UNIFORM
++/*
++ * 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.
++ */
++u_int32_t
++arc4random_uniform(u_int32_t upper_bound)
++{
++ u_int32_t r, min;
++
++ if (upper_bound < 2)
++ return 0;
++
++ /* 2**32 % x == (2**32 - x) % x */
++ min = -upper_bound % 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.
++ */
++ for (;;) {
++ r = arc4random();
++ if (r >= min)
++ break;
++ }
++
++ return r % upper_bound;
++}
++#endif /* !HAVE_ARC4RANDOM_UNIFORM */
++
++#if 0
++/*-------- Test code for i386 --------*/
++#include <stdio.h>
++#include <machine/pctr.h>
++int
++main(int argc, char **argv)
++{
++ const int iter = 1000000;
++ int i;
++ pctrval v;
++
++ v = rdtsc();
++ for (i = 0; i < iter; i++)
++ arc4random();
++ v = rdtsc() - v;
++ v /= iter;
++
++ printf("%qd cycles\n", v);
++ exit(0);
++}
++#endif
+diff --git a/openbsd-compat/defines.h b/openbsd-compat/defines.h
+index da7a42c..e79ef51 100644
+--- a/openbsd-compat/defines.h
++++ b/openbsd-compat/defines.h
+@@ -745,6 +745,15 @@ struct winsize {
+ #define INET6_ADDRSTRLEN 46
+ #endif
+
++/*
++ * Platforms that have arc4random_uniform() and not arc4random_stir()
++ * shouldn't need the latter.
++ */
++#if defined(HAVE_ARC4RANDOM) && defined(HAVE_ARC4RANDOM_UNIFORM) && \
++ !defined(HAVE_ARC4RANDOM_STIR)
++# define arc4random_stir()
++#endif
++
+ #ifndef HAVE_VA_COPY
+ # ifdef HAVE___VA_COPY
+ # define va_copy(dest, src) __va_copy(dest, src)
+diff --git a/openbsd-compat/openbsd-compat.h b/openbsd-compat/openbsd-compat.h
+index c30591c..a08502d 100644
+--- a/openbsd-compat/openbsd-compat.h
++++ b/openbsd-compat/openbsd-compat.h
+@@ -63,7 +63,24 @@ char *strsep(char **stringp, const char *delim);
+
+ #ifndef HAVE_ASPRINTF
+ int asprintf(char **, const char *, ...);
+-#endif
++#endif
++
++#ifdef HAVE_ARC4RANDOM
++# ifndef HAVE_ARC4RANDOM_STIR
++# define arc4random_stir()
++# endif
++#else
++unsigned int arc4random(void);
++void arc4random_stir(void);
++#endif /* !HAVE_ARC4RANDOM */
++
++#ifndef HAVE_ARC4RANDOM_BUF
++void arc4random_buf(void *, size_t);
++#endif
++
++#ifndef HAVE_ARC4RANDOM_UNIFORM
++u_int32_t arc4random_uniform(u_int32_t);
++#endif
+
+ /* #include <sys/types.h> XXX needed? For size_t */
+
+diff --git a/src/res_mkquery.c b/src/res_mkquery.c
+index 27ed21e..cce4029 100644
+--- a/src/res_mkquery.c
++++ b/src/res_mkquery.c
+@@ -57,7 +57,7 @@ res_mkquery(int op, const char *dname, int class, int type,
+ ac = asr_use_resolver(NULL);
+
+ memset(&h, 0, sizeof h);
+- h.id = res_randomid();
++ h.id = arc4random();
+ if (ac->ac_options & RES_RECURSE)
+ h.flags |= RD_MASK;
+ h.qdcount = 1;
+diff --git a/src/res_send_async.c b/src/res_send_async.c
+index a60aa0d..a0f4704 100644
+--- a/src/res_send_async.c
++++ b/src/res_send_async.c
+@@ -380,7 +380,7 @@ setup_query(struct asr_query *as, const char *name, const char *dom,
+ as->as.dns.obuflen = 0;
+
+ memset(&h, 0, sizeof h);
+- h.id = res_randomid();
++ h.id = arc4random();
+ if (as->as_ctx->ac_options & RES_RECURSE)
+ h.flags |= RD_MASK;
+ h.qdcount = 1;