Received: by 2002:a05:6a10:1d13:0:0:0:0 with SMTP id pp19csp299769pxb; Wed, 18 Aug 2021 23:11:27 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxlUnWp+j5R+fIFFMm4Q85ppEikroYSPzchCMT8RbO4ZdQvfWRJkiHg9tXimyZSiiFzgJW4 X-Received: by 2002:a92:7b10:: with SMTP id w16mr9296991ilc.241.1629353486768; Wed, 18 Aug 2021 23:11:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629353486; cv=none; d=google.com; s=arc-20160816; b=PYlI7PqxfuBWjSrjiO6VlE1zBc1y52QpReEdUeiNqy6ZQG9+b6c4msj4iCxXnwgNmi hVgzQB64GmW51fMj185Kfu8J8lUqfR8agqev4Ised0vkC/Hb/5Zv5xTmjf08uWccn6m/ n/4LluBk5/VG+TMlk9wbJzZKHQxbYZm0zL2GxrOBUOOAxMNyjAU2WmIPeB7kZShfojsF TOjF8tgMnPhUhDKDQavD/4fPFM2d3a0bxmQlY8B4tiXQ6BS4xPSWIdwD5wZ1yWSO9j9v NweZc84/Fnhg6iSkDInEDaIHEApy2wRwp5UGJj/42zx5jMjIs4ctfh8qsCXelAZc7gcm ObGA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:to:subject:message-id:date:from:mime-version :dkim-signature; bh=TWtz3jZxkXS2QduoKRrWmOpOZ9SfqYJHozJE8Ok8xLc=; b=WgYWy4zNLuM6tQCWT+KZTXMYzmA3tf0wErQmHeJFwZE4EQVhCtRUXVswbOG8AYeb31 vJufvRpWcpPAeFfRMX0mqBzum7sDX91wCpDzqsrbOyHRaH4/klr3yetslbtc/28Fxd1m GzwhphqGfN9mFrFWppHQ0KpEv8uUoCOzMks0oVVZQl2JxsFYluFUF/BRGOigp9TYW6bA O1MLmuLgSufPXOod0/ypllF1xFS5/gxgjRU6v0SUZI3iH0UWKTMt9SGkyl6mekesLRy/ qTT4Q09KCTPrc9CjosuZYApqEiUmruQ4x2QGSTPNM6yjlm5hNyYTLNkfBBUGj18ThjKx Uy9A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Mdlh4xws; spf=pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a21si2172481iot.52.2021.08.18.23.11.04; Wed, 18 Aug 2021 23:11:26 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Mdlh4xws; spf=pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230292AbhHSGLZ (ORCPT + 99 others); Thu, 19 Aug 2021 02:11:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39980 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230016AbhHSGLY (ORCPT ); Thu, 19 Aug 2021 02:11:24 -0400 Received: from mail-wr1-x432.google.com (mail-wr1-x432.google.com [IPv6:2a00:1450:4864:20::432]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id ACBA6C061756 for ; Wed, 18 Aug 2021 23:10:48 -0700 (PDT) Received: by mail-wr1-x432.google.com with SMTP id x12so7143360wrr.11 for ; Wed, 18 Aug 2021 23:10:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=TWtz3jZxkXS2QduoKRrWmOpOZ9SfqYJHozJE8Ok8xLc=; b=Mdlh4xwsy0KoLHGUNN9YSy/ttHEaXoEe+r4W1h/ECEhPB/qhZiqJSjD8OFQRL9EANK Pq1MijWF1fJPqtRpTvHQhsgqCGBskJhwufm7Sd7GL352MRPkERXS5twyICZyw+r9W1Kw Ta0E/h8mkrqC6Ld2qC929rqaY1A51PtPBlcQZc8RIwSgJqURkBvY3WVWGeDznc2HTaQ2 fWQu0CqveEzngluBTD+Wl0C1BpluUUcMxpL5Orwz60qPHnfFUmV8G02kpf0XA1wFhTiH ZylUvc/1hqLnirO2nIAP0tkjlyejMLxEeP2+ORpnWeJRC+1ozF41uAwZyYeD1l4vxssy kizw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=TWtz3jZxkXS2QduoKRrWmOpOZ9SfqYJHozJE8Ok8xLc=; b=tm3GIgewoNjFrbZgdkymttBH8K2MfSSVgEOwQztcjFvtji3U0DhQ7ZJBt3LmnLeVi9 B7pkHFZxCkkNpZAZSIr5yk29xCbeWQYeIDk4TGYRKbDffYF8uBMRLxInxuw5S+GrkFv5 bKk5uqogKIu1DX68bGpt7sbaCZP4DsliLHm8EojECyeKe337QMOj0q3ky4lVFVg7RnDG b14CGyUhwsk3wlS9aY2SIxX5bxeLPbEY45WjHRnmXPiEjZADFkAOs+W5KBMdFnHv/SMn 6igehInQ6iQeXnWKU3MjK3JJ1Zpb/LBqkBDv43J5wTewk2O+LwlXshoPJWJvQ0pCa9I2 pWYg== X-Gm-Message-State: AOAM53063DTG25+nKgwqKTjII2ZcJ/toj/RPgoK29/GN+81HfZDrDHrH i4fICY3smpV4ggFS5wtiMOtJ2oRs3Ct6zF4BtvlduuQQ X-Received: by 2002:a5d:6991:: with SMTP id g17mr1612970wru.253.1629353447207; Wed, 18 Aug 2021 23:10:47 -0700 (PDT) MIME-Version: 1.0 From: Sandy Harris Date: Thu, 19 Aug 2021 14:10:35 +0800 Message-ID: Subject: Initialising random(4) To: Linux Crypto Mailing List , Stephan Mueller , John Denker , m@ib.tc, "Ted Ts'o" , Kees Cook , nhorman@tuxdriver.com Content-Type: multipart/mixed; boundary="0000000000006f5ad905c9e36921" Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org --0000000000006f5ad905c9e36921 Content-Type: text/plain; charset="UTF-8" This program initialises the pools in random(4) with data from /dev/urandom on the machine that does the compile. The output is different every time it runs. This is not necessary in many cases, but it is cheap, can do no harm, & may block some attacks. Eventually I'll get around to submitting patches -- add this program and do some minor fiddling with random.c and the makefile -- but quite likely not soon, so here's the code in the meanwhile. Comment solicited. --0000000000006f5ad905c9e36921 Content-Type: text/x-csrc; charset="US-ASCII"; name="gen_random_init.c" Content-Disposition: attachment; filename="gen_random_init.c" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ksiit01p0 LyoKICogUHJvZ3JhbSB0byBzZWxlY3QgcmFuZG9tIG51bWJlcnMgZm9yIGluaXRpYWxpc2luZyB0 aGluZ3MKICogaW4gdGhlIHJhbmRvbSg0KSBkcml2ZXIuCiAqIAogKiBUaGlzIGZhbGxzIHdlbGwg c2hvcnQgb2YgdGhlIGlkZWFsIHNvbHV0aW9uLCB3aGljaAogKiB3b3VsZCBnaXZlIGV2ZXJ5IGlu c3RhbGxhdGlvbiAocmF0aGVyIHRoYW4gZXZlcnkgY29tcGlsZWQKICoga2VybmVsKSBhIGRpZmZl cmVudCBzZWVkLiBGb3IgdGhhdCwgc2VlIEpvaG4gRGVua2VyJ3MKICogc3VnZ2VzdGlvbnMgYXQ6 CiAqIGh0dHA6Ly93d3cuYXY4bi5jb20vY29tcHV0ZXIvaHRtL3NlY3VyZS1yYW5kb20uaHRtI3Nl Yy1ib290LWltYWdlCiAqIE9uIHRoZSBvdGhlciBoYW5kLCB0aGlzIGlzIGVhc2llciB0byBkby4K ICoKICogTmVpdGhlciBzb3J0IG9mIHNlZWQgaXMgbmVjZXNzYXJ5IGlmCiAqICAgIGVpdGhlciAg eW91IGhhdmUgYSB0cnVzdHdvcnRoeSBoYXJkd2FyZSBSTkcKICogICAgb3IgICAgICB5b3UgaGF2 ZSBzZWN1cmUgc3RvcmVkIGRhdGEKICogSW4gdGhvc2UgY2FzZXMsIHRoZSBkZXZpY2UgY2FuIGVh c2lseSBiZSBpbml0aWFsaXNlZCB3ZWxsOwogKiB0aGUgb25seSBkaWZmaWN1bHR5IGlzIHRvIGVu c3VyZSB0aGF0IGlzIGRvbmUgZWFybHkgZW5vdWdoLgogKiBUaGlzIHByb2dyYW0gaXMgdGhlbiBq dXN0IGFub3RoZXIgbGF5ZXIgb2YgYSBkZWZlbnNlIGluIGRlcHRoLgogKiAKICogVGhlIHByb2dy YW0gYWtlcyBvbmUgb3B0aW9uYWwgc2luZ2xlLWRpZ2l0IGNvbW1hbmQtbGluZSBvcHRpb24sCiAq IGhvdyBtYW55IDUxMi1iaXQgY29udGV4dHMgdG8gaW5pdGlhbGlzZSBpbiBhZGRpdGlvbiB0byB0 aGUKICogaW5wdXQgcG9vbAogKiAgICAgIG5vIG9wdGlvbiBvciAtMCwganVzdCB0aGUgcG9vbAog KiAgICAgIC0xLCBpbml0aWFsaXNlIGEgY29udGV4dCBmb3IgU2Fsc2EgYXMgd2VsbAogKiAgICAg ICAgICAodXNlZnVsIHdpdGggY3VycmVudCBkcml2ZXIpCiAqICAgICAgLTIsIFNhbHNhIGNvbnRl eHQgcGx1cyBhIDUxMi1iaXQgaGFzaCBjb250ZXh0CiAqICAgICAgICAgIChwb3NzaWJlIGluIGZ1 dHVyZSBkcml2ZXIpCiAqCiAqIFRoZSBwcm9ncmFtOgogKgogKiAgICAgIGdldHMgaXRzIGRhdGEg ZnJvbSAvZGV2L3VyYW5kb20KICogICAgICBwcm9kdWNlcyBkaWZmZXJlbnQgb3V0cHV0IGV2ZXJ5 IHRpbWUgaXQgcnVucwogKiAgICAgIGxpbWl0cyB0aGUgcmFuZ2Ugb2YgSGFtbWluZyB3ZWlnaHRz CiAqICAgICAgZXZlcnkgYnl0ZSBoYXMgYXQgbGVhc3Qgb25lIGJpdCAxLCBvbmUgMAogKiAgICAg IG91dHB1dCBmb3JtYXR0ZWQgYXMgYW4gYXJyYXkgZGVjbGFyYXRpb24KICogICAgICBzdWl0YWJs ZSBmb3IgaW5jbHVzaW9uIGJ5IHJhbmRvbS5jCiAqICAgICAgd3JpdGVzIHRvIHN0ZG91dCwgZXhw ZWN0aW5nIG1ha2VmaWxlIHRvIHJlZGlyZWN0CiAqCiAqIG1ha2VmaWxlIHNob3VsZCBhbHNvIGRl bGV0ZSB0aGUgb3V0cHV0IGZpbGUgYWZ0ZXIgaXQgaXMKICogdXNlZCBpbiBjb21waWxhdGlvbiBv ZiByYW5kb20uYywgaWRlYWxseSB1c2luZyBhIHNlY3VyZQogKiBkZWxldGlvbiB0b29sIHN1Y2gg YXMgc2hyZWQoMSkgc3JtKDEpIG9yIHdpcGUoMSkuIEkgYW0KICogbm90IHN1cmUgd2hpY2ggd291 bGQgYmUgYmVzdC4KICogCiAqIFRoaXMgaXMgbW9yZSBzZWN1cmU7IGl0IGZvcmNlcyB0aGUgZmls ZSB0byBiZSByZWJ1aWx0CiAqIGFuZCBhIG5ldyB2ZXJzaW9uIHVzZWQgaW4gZXZlcnkgY29tcGls ZS4gSXQgYWxzbyBwcmV2ZW50cwogKiBhbiBlbmVteSBqdXN0IHJlYWRpbmcgYW4gb3V0cHV0IGZp bGUgaW4gdGhlIGJ1aWxkCiAqIGRpcmVjdG9yeSBhbmQgZ2V0dGluZyB0aGUgZGF0YSB0aGF0IGlz IGluIHVzZSBpbiB0aGUKICogY3VycmVudCBrZXJuZWwuIFRoaXMgaXMgbm90IGZ1bGwgcHJvdGVj dGlvbiBzaW5jZSB0aGV5CiAqIG1pZ2h0IGxvb2sgaW4gdGhlIGtlcm5lbCBpbWFnZSwgYnV0IGl0 IHNlZW1zIHRvIGJlIHRoZQogKiBiZXN0IHdlIGNhbiBkby4KICoKICogSW5zZXJ0aW5nIHJhbmRv bSBkYXRhIGF0IGNvbXBpbGUgdGltZSBjYW4gZG8gbm8gaGFybSBhbmQgd2lsbAogKiBtYWtlIHNv bWUgYXR0YWNrcyBjb25zaWRlcmFibHkgaGFyZGVyLiBJdCBpcyBub3QgYW4gaWRlYWwKICogc29s dXRpb24sIGFuZCBub3QgZW50aXJlbHkgbmVjZXNzYXJ5LCBidXQgY2hlYXAgYW5kIHByb2JhYmx5 CiAqIHRoZSBiZXN0IHdlIGNhbiBkbyBkdXJpbmcgdGhlIGJ1aWxkIChyYXRoZXIgdGhhbiBpbnN0 YWxsKQogKiBwcm9jZXNzLgogKgogKiBUaGlzIGlzIGNlcnRhaW5seSBkb25lIGVhcmx5IGVub3Vn aCBhbmQgdGhlIGRhdGEgaXMgcmFuZG9tCiAqIGVub3VnaCwgYnV0IGl0IGlzIG5vdCBuZWNlc3Nh cmlseSBzZWNyZXQgZW5vdWdoLgogKgogKiBJbiBzb21lIGNhc2VzIC0tIGZvciBleGFtcGxlLCBh IGZpcmV3YWxsIG1hY2hpbmUgdGhhdCBjb21waWxlcwogKiBpdHMgb3duIGtlcm5lbCAtLSB0aGlz IGFsb25lIG1pZ2h0IGJlIGVub3VnaCB0byBlbnN1cmUgc2VjdXJlCiAqIGluaXRpYWxpc2F0aW9u LCBzaW5jZSBvbmx5IGFuIGVuZW15IHdobyBhbHJlYWR5IGhhcyByb290IGNvdWxkCiAqIGRpc2Nv dmVyIHRoaXMgZGF0YS4gT2YgY291cnNlIGV2ZW4gaW4gdGhvc2UgY2FzZXMgaXQgc2hvdWxkIG5v dAogKiBiZSB1c2VkIGFsb25lLCBvbmx5IGFzIG9uZSBsYXllciBvZiBhIGRlZmVuc2UgaW4gZGVw dGguCiAqCiAqIEluIG90aGVyIGNhc2VzIC0tIGEga2VybmVsIHRoYXQgaXMgY29tcGlsZWQgb25j ZSB0aGVuIHVzZWQgaW4KICogYSBMaW51eCBkaXN0cm8gb3IgaW5zdGFsbGVkIG9uIG1hbnkgZGV2 aWNlcyAtLSB0aGlzIGlzIGxpa2VseQogKiBvZiB2ZXJ5IGxpdHRsZSB2YWx1ZS4gSXQgY29tcGxp Y2F0ZXMgYW4gYXR0YWNrIHNvbWV3aGF0LCBhbmQKICogbWlnaHQgZXZlbiBiZSB0b28gbXVjaCBm b3Igc29tZSBhdHRhY2tlcnMuIEhvd2V2ZXIgaXQgY2xlYXJseQogKiB3aWxsIG5vdCBzdG9wIGEg c2VyaW91cyBhdHRhY2tlciB3aG8gaGFzIGFjY2VzcyB0byBhbm90aGVyIGNvcHkKICogb2YgdGhl IGRpc3RybyBvciB0aGUgZGV2aWNlOyBpdCBtYXkgbm90IGV2ZW4gc2xvdyB0aGVtIGRvd24gbXVj aC4KICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8 dW5pc3RkLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8c3RkaW50Lmg+CiNpbmNsdWRl IDxjdHlwZS5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4K Cgp0eXBlZGVmIHVpbnQzMl90IHUzMiA7Ci8qCiAqIENvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24K ICovCiNkZWZpbmUgSU5QVVRfUE9PTF9CSVRTIAk0MDk2CiNkZWZpbmUgSU5QVVRfUE9PTF9XT1JE UwkoSU5QVVRfUE9PTF9CSVRTID4+IDUpCi8qCiAgICBmb3IgU2Fsc2EsIFNIQTMgb3IgYW5vdGhl ciBoYXNoCiovCiNkZWZpbmUgQ09OVEVYVF9CSVRTICAgICAgICA1MTIKI2RlZmluZSBDT05URVhU X1dPUkRTICAgICAgIChDT05URVhUX0JJVFMgPj4gNSkKLyoKICAgIGxhcmdlIGVub3VnaCBmb3Ig YW55IGV4cGVjdGVkIHVzYWdlCiAgICBtYXkgbm90IGFsbCBiZSB1c2VkCiovCiNkZWZpbmUgTUFY X1dPUkRTICAgICAgICAgICAoSU5QVVRfUE9PTF9XT1JEUyArICgyKkNPTlRFWFRfV09SRFMpKQoK dTMyIGRhdGFbTUFYX1dPUkRTXSA7CgppbnQgYWNjZXB0KHUzMikgOwppbnQgaGFtbWluZyh1MzIp Owp2b2lkIHVzYWdlKHZvaWQpIDsKCmludCB1cmFuZG9tIDsKCmludCBtYWluKGludCBhcmdjLCBj aGFyICoqYXJndikKewoJdTMyIGksIHgsICpwLCB0ZW1wLCBsYXN0LCBuX2NvbnRleHRzLCB0b3Rh bF93b3JkcywgdG90YWxfYnl0ZXMgOwogICAgY2hhciAqcHRyIDsKCWlmKCAodXJhbmRvbSA9IG9w ZW4oIi9kZXYvdXJhbmRvbSIsIE9fUkRPTkxZKSkgPT0gLTEgKSAgewoJCWZwcmludGYoc3RkZXJy LCAiZ2VuX3JhbmRvbTogbm8gL2Rldi91cmFuZG9tLCBjYW5ub3QgY29udGludWVcbiIpIDsKCQll eGl0KDEpIDsKCX0KCXN3aXRjaChhcmdjKSAgIHsgICAgICAgIAogICAgICAgIGNhc2UgMToKICAg ICAgICAgICAgLyoKICAgICAgICAgICAgICAgIGp1c3QgaW5wdXQgcG9vbAogICAgICAgICAgICAq LwogICAgICAgICAgICBuX2NvbnRleHRzID0gMCA7CiAgICAgICAgICAgIGJyZWFrIDsKICAgICAg ICBjYXNlIDI6CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICBhbHNvIHNvbWUgNTEyLWJp dCBjb250ZXh0cwogICAgICAgICAgICAgICAgb25lIGZvciBzYWxzYQogICAgICAgICAgICAgICAg bWF5YmUgYW5vdGhlciBmb3IgNTEyLWJpdCBoYXNoCiAgICAgICAgICAgICovCiAgICAgICAgICAg IHB0ciA9IGFyZ3ZbMV0gOwogICAgICAgICAgICBwdHIrKyA7CiAgICAgICAgICAgIG5fY29udGV4 dHMgPSBhdG9pKCBwdHIgKSA7CiAgICAgICAgICAgIC8vIGZwcmludGYoIHN0ZGVyciwgIm5fY29u dGV4dHMgJWRcbiIsIG5fY29udGV4dHMgKSA7CiAgICAgICAgICAgIGJyZWFrIDsKICAgICAgICBk ZWZhdWx0OgogICAgICAgICAgICB1c2FnZSgpIDsKICAgICAgICAgICAgYnJlYWsgOwogICAgfQog ICAgaWYoIChuX2NvbnRleHRzID4gMikgfHwgKG5fY29udGV4dHMgPCAwKSkgICB7CiAgICAgICAg ZnByaW50Ziggc3RkZXJyLCAiVGhpcyB2ZXJzaW9uIG9mIGdlbl9yYW5kb21faW5pdCBzdXBwb3J0 cyBvbmx5IDAsIDEgb3IgMiBjb250ZXh0c1xuIiApIDsKICAgICAgICB1c2FnZSgpIDsKICAgIH0K ICAgIHRvdGFsX3dvcmRzID0gSU5QVVRfUE9PTF9XT1JEUyArIChuX2NvbnRleHRzKkNPTlRFWFRf V09SRFMpIDsKICAgIHRvdGFsX2J5dGVzID0gdG90YWxfd29yZHMgPDwgMiA7CgkvKgoJICogSW5p dGlhbGlzZSB0aGUgcG9vbHMgd2l0aCByYW5kb20gZGF0YQoJICovCgl4ID0gcmVhZCggdXJhbmRv bSwgZGF0YSwgdG90YWxfYnl0ZXMgKSA7CglpZiggeCAhPSB0b3RhbF9ieXRlcyApCXsKCQlmcHJp bnRmKHN0ZGVyciwiZ2VuX3JhbmRvbV9pbml0OiBiaWcgcmVhZCgpIGZhaWxlZCwgY2Fubm90IGNv bnRpbnVlXG4iKSA7CiAgICAgICAgICAgICAgICBleGl0KDEpIDsKICAgIH0KCS8qCgkgKiBSZXBs YWNlIGFueSBhcnJheSBlbnRyaWVzIHRoYXQgZmFpbCBjcml0ZXJpYQoJICoKCSAqIEluIHRoZW9y eSwgdGhlIHdoaWxlIGxvb3AgaGVyZSBjb3VsZCBydW4gZm9yIHNvbWUKCSAqIHJpZGljdWxvdXNs eSBsb25nIHRpbWUsIG9yIGV2ZW4gZ28gaW5maW5pdGUKCSAqIEluIHByYWN0aWNlLCB0aGlzIGlz IGFzdHJvbm9taWNhbGx5IHVubGlrZWx5CgkgKiBnaXZlbiBhbnkgc2Vuc2libGUgZGVmaW5pdGlv biBvZiBhY2NlcHQoKSBhbmQKCSAqIGlucHV0IHRoYXQgaXMgYW55d2hlcmUgbmVhciByYW5kb20K CSAqLyAKCWZvciggaSA9IDAsIHAgPSBkYXRhIDsgaSA8IHRvdGFsX3dvcmRzIDsgaSsrLCBwKysg KQl7CgkJd2hpbGUoICFhY2NlcHQoKnApICkgICAgICB7CgkJCXggPSByZWFkKCB1cmFuZG9tLCAo Y2hhciAqKSAmdGVtcCwgNCkgOwogICAgICAgICAgICBpZiggeCAhPSA0ICkJewogICAgICAgICAg ICAgICAgZnByaW50ZihzdGRlcnIsImdlbl9yYW5kb21faW5pdDogc21hbGwgcmVhZCgpIGZhaWxl ZCwgY2Fubm90IGNvbnRpbnVlXG4iKSA7CiAgICAgICAgICAgICAgICBleGl0KDEpIDsKICAgICAg ICAgICAgfQogICAgICAgICAgICAqcCBePSB0ZW1wIDsKICAgICAgICB9CiAgICB9CiAgICAvKgog ICAgICAgIHdyaXRlIGEgZmlsZSBzdWl0YWJsZSBmb3IgaW5jbHVzaW9uCiAgICAqLwogICAgbGFz dCA9IHRvdGFsX3dvcmRzIC0gMSA7CiAgICBwcmludGYoICJzdGF0aWMgdTMyIHBvb2xzW10gPSB7 XG4iKSA7CiAgICBmb3IoIGkgPSAwLCBwID0gZGF0YSA7IGkgPCB0b3RhbF93b3JkcyA7IGkrKywg cCsrICkJewogICAgICAgIHByaW50ZigiMHglMDh4IiwgKnApIDsKICAgICAgICBpZiggaSA9PSBs YXN0ICkKICAgICAgICAgICAgIHByaW50ZigiXG59IDtcbiIpIDsKICAgICAgICBlbHNlICAgIHsK ICAgICAgICAgICAgcHV0Y2hhcignLCcpIDsKICAgICAgICAgICAgc3dpdGNoKCBpICUgOCApIHsK ICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICBwdXRjaGFyKCdcbicp IDsKICAgICAgICAgICAgICAgICAgICBicmVhayA7CiAgICAgICAgICAgICAgICBkZWZhdWx0Ogog ICAgICAgICAgICAgICAgICAgIHB1dGNoYXIoJyAnKSA7CiAgICAgICAgICAgICAgICAgICAgYnJl YWsgOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIHVzYWdlKCkKewoJZnBy aW50ZihzdGRlcnIsICJ1c2FnZTogZ2VuX3JhbmRvbSBbLTxkaWdpdD5dXG4iKSA7CglleGl0KDEp IDsKfQoKLyoKICogVGhlc2UgdGVzdHMgYXJlIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkKICoKICog V2UgY291bGQganVzdCB1c2UgdGhlIC9kZXYvdXJhbmRvbSBvdXRwdXQgJiB0YWtlIHdoYXQgY29t ZXMKICogQXJndWFibHksIHRoYXQgd291bGQgYmUgdGhlIGJlc3QgY291cnNlOwogKiAiSWYgaXQg YWluJ3QgYnJva2UsIGRvbid0IGZpeCBpdC4iCiAqCiAqIEFwcGx5aW5nIGFueSBiaWFzIGhlcmUg bWFrZXMgb3V0cHV0IHNvbWV3aGF0IGxlc3MgcmFuZG9tLAogKiBzbyBlYXNpZXIgZm9yIGFuIGVu ZW15IHRvIGd1ZXNzLgogKgogKiBIb3dldmVyLCBhIEhhbW1pbmcgd2VpZ2h0IChudW1iZXIgb2Yg Yml0cyB0aGF0IGFyZSAxKQogKiBuZWFyIDE2IGdpdmVzIHVzaW5nIG9uZSBvZiB0aGVzZSBudW1i ZXJzIGluIGFyaXRobWV0aWMKICogKCssIHhvciBvciB2YXJpb3VzIGZvcm1zIG9mIG11bHRpcGxp Y2F0aW9uKSBhIGJldHRlcgogKiBjaGFuY2Ugb2YgY2hhbmdpbmcgdGhlIG91dHB1dCBzaWduaWZp Y2FudGx5LiBUaGlzIGlzIGEKICogaGlnaGx5IGRlc2lyYWJsZSBlZmZlY3QuCiAqCiAqIENvbXBy b21pc2U6IGFwcGx5IHNvbWUgYmlhcywgYnV0IG5vdCBhIHZlcnkgc3Ryb25nIG9uZQogKi8KCiNk ZWZpbmUgTUlOICA2CiNkZWZpbmUgTUFYICgzMi1NSU4pCgppbnQgYWNjZXB0KCB1MzIgdSApCnsK ICAgICAgICBpbnQgaCwgaSA7CiAgICAgICAgY2hhciAqcCA7CgogICAgICAgIC8qIHJlamVjdCBs b3cgb3IgaGlnaCBIYW1taW5nIHdlaWdodHMgKi8KICAgICAgICBoID0gaGFtbWluZyh1KSA7CiAg ICAgICAgaWYoICggaCA8IE1JTiApIHx8ICggaCA+IE1BWCApICkKICAgICAgICAgICAgICAgIHJl dHVybigwKSA7CgogICAgICAgIC8qIGF0IGxlYXN0IG9uZSAxIGFuZCBhdCBsZWFzdCBvbmUgMCBp biBlYWNoIGJ5dGUgKi8KICAgICAgICBmb3IoIGkgPSAwLCBwID0gKGNoYXIgKikgJnUgOyBpIDwg NCA7IGkrKywgcCsrICkgICAgICAgIHsKICAgICAgICAgICAgICAgIHN3aXRjaCgqcCkgICAgICB7 CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1wwJzoKICAgICAgICAgICAgICAgICAgICAg ICAgY2FzZSAnXDI1NSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDAp IDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBicmVhayA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJl dHVybigxKSA7Cn0KCi8qCiAqIEtlcm5pZ2hhbidzIG1ldGhvZAogKiBodHRwOi8vZ3JhcGhpY3Mu c3RhbmZvcmQuZWR1L35zZWFuZGVyL2JpdGhhY2tzLmh0bWwKICovCmludCBoYW1taW5nKCB1MzIg eCApCnsKICAgICAgICBpbnQgaCA7CiAgICAgICAgZm9yIChoID0gMCA7IHggOyBoKyspCiAgICAg ICAgICB4ICY9ICh4LTEpIDsgLyogY2xlYXIgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBzZXQg Ki8KICAgICAgICByZXR1cm4oaCkgOwp9Cg== --0000000000006f5ad905c9e36921--