diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2018-10-29 08:30:13 +0000 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2018-11-07 16:46:09 +0000 |
commit | f82b04f0cec7fe6af7841f73765a1d882ec41098 (patch) | |
tree | fe3ea1b79702a4113e5d6d2ed83beea75f2e9531 /main/libasr | |
parent | fc9ecaa0967212b640775caf2483f1c1244590f0 (diff) | |
download | aports-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.patch | 2 | ||||
-rw-r--r-- | main/libasr/APKBUILD | 9 | ||||
-rw-r--r-- | main/libasr/arc4random.patch | 419 |
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; |