From patchwork Mon Feb 18 21:11:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 158651 Delivered-To: patch@linaro.org Received: by 2002:a02:48:0:0:0:0:0 with SMTP id 69csp2938772jaa; Mon, 18 Feb 2019 13:12:24 -0800 (PST) X-Google-Smtp-Source: AHgI3IYpdldDknoAHZeBBjwcq1YC7swbl+16xIitaQPTZnj+VeutO3cPANyrfd8W3wASTuPQXhQt X-Received: by 2002:a62:39c5:: with SMTP id u66mr25887361pfj.245.1550524344878; Mon, 18 Feb 2019 13:12:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1550524344; cv=none; d=google.com; s=arc-20160816; b=w6y90JHnr1pGFoEmCOzsdMpZ8lI7jBaU2Wl1bmFse+R1q7kH8XpvaegtIUQoG1ejxP 83MIu1xs8IEetJk1jTP7JuLTWOzS2PGGCum0I/o2KjEk5GRGPmHWf6nj2A1JvWZQCc7n EFkABC8uORtAPRiLg2V4l5GKtV/gXGkWjAHy/AimiOfPoMU78PGLAeG0qH7GpvX/CLiU FxQBKCtB/FwMi3vCq/4LCj/b7mN0lggq1hYyh2ISOCFeInJDsQX2PYoyKV7TX5zfWAIQ ydE1N64n1VrqABofL9B+ljlRYDBa8PJKP6OFVDm/moTDiIQu63enAI9gDS5WAqcUd3T0 StQA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from :dkim-signature:delivered-to:sender:list-help:list-post:list-archive :list-subscribe:list-unsubscribe:list-id:precedence:mailing-list :dkim-signature:domainkey-signature; bh=+ngNda9kpTZE19QLoRBzELu9DzT2KQbqCJlVtBolT/Y=; b=b1iiOIw+CUIOnPr0n7ygt2GO+oY2VQs4TTSR00sE90rg6bFUprDgfS6DV9KR1kUVlW L8+JsvyhZT4wA8KMqrGk0ATdGFeKz82zUh5C8L5lgI13dQ1TZai+tC6rg/LIerrQEXdm mZH1vObsfmCJdYRUJv8/UIiVYLhsbxIFD/d6NOJHfPtWSDTDyj/Jsk7qhCJQFwxyz+AZ EqF2D3RJFKoWLeSK5wLW6JfrtSGUCC47QTbqMqbO03MklOSiGeDXfx8Zaq04LhDGV2tV SauPazUcMNxsk96MwWdOJ8qPq600pJv21QFPg812FQ6HQT147G99TfnvfoKhNqFu1rPg AX1g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=AvPLUDzy; dkim=pass header.i=@linaro.org header.s=google header.b=x+ISccG2; spf=pass (google.com: domain of libc-alpha-return-100126-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom="libc-alpha-return-100126-patch=linaro.org@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id d1si14418337plr.145.2019.02.18.13.12.24 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 18 Feb 2019 13:12:24 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-100126-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=AvPLUDzy; dkim=pass header.i=@linaro.org header.s=google header.b=x+ISccG2; spf=pass (google.com: domain of libc-alpha-return-100126-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom="libc-alpha-return-100126-patch=linaro.org@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=Du8V/m23o5acSeWdZ9lwxnryBOjJ+Ri NU6pbZouOKVs598NGRXteQrY781KOEdtYmdLO9BmWwYvv0enMpgX+tlFjIlqOw1U Lgaer9wjaRtF+pqfZxPHLnNCvJIl3sc0QHSENjYz2PW14V9IKW6RjMS8sX/yO8KL D3mUEVNVeurY= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=M22FNFieaC0M9lzGf/Wyp6gxcnE=; b=AvPLU Dzy5jkcAZvO1DAIw1P9bGUKR4iLpIssPJlN2GzdiiY2WkTjc3RSk5rjY7gcqDhVz 1ailGMOV5wAjt2lUGvYwobRei0ylKt0VpWubxNY64mWm8aPm6BnapG6y4C7W/BMb lgnk9l5jXgORB4wHfRcqZ07m/Hdn8l1rKr+K+4= Received: (qmail 61375 invoked by alias); 18 Feb 2019 21:11:44 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 61251 invoked by uid 89); 18 Feb 2019 21:11:43 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=clock, distributed, accuracy, resp X-HELO: mail-qt1-f196.google.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references; bh=+ngNda9kpTZE19QLoRBzELu9DzT2KQbqCJlVtBolT/Y=; b=x+ISccG2CxsPVXa3MT7/dTAS5bqfdEshFnTLhMQywTzgXO56zov5Nj0ZlCMCbjKbmn DQz2pVNbhdRBaPCufFL9gJIgR4KBpDKzDxY9h1E1jB/sACuLZFSaQFeQ43ReFMaznEBB DC4LKttFVaWxSCcCjdM9sDJqJNbH7LTIQje7GRZX0M8K+1/MuHfg82Le6Z9lRp+y2T8/ 9lun5L3cFRmXBsJ5WE9ANy0S5GtJr8WfP0Eyd/hmecGFHFTnQDpt7mLwyY2OfhQj873X XRZ8P8tkZBiZhOcjVsDu4Pk+sJpBNyN9Jz4DBPUf6UIwt2/k3/Aas+tfbfmeg6zH2p6B 48Rw== Return-Path: From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH v2 4/6] Do not use HP_TIMING_NOW for random bits Date: Mon, 18 Feb 2019 18:11:26 -0300 Message-Id: <20190218211128.1869-4-adhemerval.zanella@linaro.org> In-Reply-To: <20190218211128.1869-1-adhemerval.zanella@linaro.org> References: <20190218211128.1869-1-adhemerval.zanella@linaro.org> Changes from previous version: - Change random_bits return type to uint32_t and shuffle the bits internally to avoid clock bias. --- This patch removes the HP_TIMING_BITS usage for fast random bits and replace with clock_gettime (CLOCK_MONOTONIC). It has unspecified starting time and nano-second accuracy, so its randomness is significantly better than gettimeofday. Althoug it should incur in more overhead (specially for architecture that support hp-timing), the symbol is also common implemented as a vDSO. Checked on aarch64-linux-gnu, x86_64-linux-gnu, and i686-linux-gnu. I also checked on a i686-gnu build. * include/random-bits.h: New file. * resolv/res_mkquery.c [HP_TIMING_AVAIL] (RANDOM_BITS, (__res_context_mkquery): Remove usage hp-timing usage and replace with random_bits. * resolv/res_send.c [HP_TIMING_AVAIL] (nameserver_offset): Likewise. * sysdeps/posix/tempname.c [HP_TIMING_AVAIL] (__gen_tempname): Likewise. --- include/random-bits.h | 41 ++++++++++++++++++++++++++++++++++++++++ resolv/res_mkquery.c | 19 +++---------------- resolv/res_send.c | 12 ++---------- sysdeps/posix/tempname.c | 19 +++---------------- 4 files changed, 49 insertions(+), 42 deletions(-) create mode 100644 include/random-bits.h -- 2.17.1 diff --git a/include/random-bits.h b/include/random-bits.h new file mode 100644 index 0000000000..5ab53450af --- /dev/null +++ b/include/random-bits.h @@ -0,0 +1,41 @@ +/* Fast pseudo-random bits based on clock_gettime. + Copyright (C) 2019 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef _RANDOM_BITS_H +# define _RANDOM_BITS_H + +#include +#include + +/* Provides fast pseudo-random bits through clock_gettime. It has unspecified + starting time, nano-second accuracy, its randomness is significantly better + than gettimeofday, and for mostly architectures it is implemented through + vDSO instead of a syscall. Since the source is a system clock, the upper + bits will have less entropy. */ +static inline uint32_t +random_bits (void) +{ + struct timespec tv; + __clock_gettime (CLOCK_MONOTONIC, &tv); + /* Shuffle the lower bits to minimize the clock bias. */ + uint32_t ret = tv.tv_nsec ^ tv.tv_sec; + ret ^= (ret << 24) | (ret >> 8); + return ret; +} + +#endif diff --git a/resolv/res_mkquery.c b/resolv/res_mkquery.c index 19b8b402c4..dd43d347af 100644 --- a/resolv/res_mkquery.c +++ b/resolv/res_mkquery.c @@ -82,6 +82,7 @@ * SOFTWARE. */ +#include #include #include #include @@ -92,12 +93,7 @@ #include #include #include - -#include -#include -#if HP_TIMING_AVAIL -# define RANDOM_BITS(Var) { uint64_t v64; HP_TIMING_NOW (v64); Var = v64; } -#endif +#include int __res_context_mkquery (struct resolv_context *ctx, int op, const char *dname, @@ -120,16 +116,7 @@ __res_context_mkquery (struct resolv_context *ctx, int op, const char *dname, /* We randomize the IDs every time. The old code just incremented by one after the initial randomization which still predictable if the application does multiple requests. */ - int randombits; -#ifdef RANDOM_BITS - RANDOM_BITS (randombits); -#else - struct timeval tv; - __gettimeofday (&tv, NULL); - randombits = (tv.tv_sec << 8) ^ tv.tv_usec; -#endif - - hp->id = randombits; + hp->id = random_bits (); hp->opcode = op; hp->rd = (ctx->resp->options & RES_RECURSE) != 0; hp->rcode = NOERROR; diff --git a/resolv/res_send.c b/resolv/res_send.c index fa040c1198..1b59b6080c 100644 --- a/resolv/res_send.c +++ b/resolv/res_send.c @@ -109,7 +109,7 @@ #include #include #include -#include +#include #if PACKETSZ > 65536 #define MAXPACKET PACKETSZ @@ -309,15 +309,7 @@ nameserver_offset (struct __res_state *statp) if ((offset & 1) == 0) { /* Initialization is required. */ -#if HP_TIMING_AVAIL - uint64_t ticks; - HP_TIMING_NOW (ticks); - offset = ticks; -#else - struct timeval tv; - __gettimeofday (&tv, NULL); - offset = ((tv.tv_sec << 8) ^ tv.tv_usec); -#endif + offset = random_bits (); /* The lowest bit is the most random. Preserve it. */ offset <<= 1; diff --git a/sysdeps/posix/tempname.c b/sysdeps/posix/tempname.c index 2ed39d1a42..5217cb38e1 100644 --- a/sysdeps/posix/tempname.c +++ b/sysdeps/posix/tempname.c @@ -71,22 +71,8 @@ #endif #ifdef _LIBC -# include -# if HP_TIMING_AVAIL -# define RANDOM_BITS(Var) \ - if (__glibc_unlikely (value == UINT64_C (0))) \ - { \ - /* If this is the first time this function is used initialize \ - the variable we accumulate the value in to some somewhat \ - random value. If we'd not do this programs at startup time \ - might have a reduced set of possible names, at least on slow \ - machines. */ \ - struct timeval tv; \ - __gettimeofday (&tv, NULL); \ - value = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec; \ - } \ - HP_TIMING_NOW (Var) -# endif +# include +# define RANDOM_BITS(Var) ((Var) = random_bits ()) #endif /* Use the widest available unsigned type if uint64_t is not @@ -237,6 +223,7 @@ __gen_tempname (char *tmpl, int suffixlen, int flags, int kind) } #endif value += random_time_bits ^ __getpid (); + value += random_bits () ^ __getpid (); for (count = 0; count < attempts; value += 7777, ++count) {