From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CAEF5C433F5 for ; Mon, 9 May 2022 19:20:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240527AbiEITYT (ORCPT ); Mon, 9 May 2022 15:24:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57786 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240537AbiEITYR (ORCPT ); Mon, 9 May 2022 15:24:17 -0400 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 57B24245796 for ; Mon, 9 May 2022 12:20:18 -0700 (PDT) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-2f16f3a7c34so127309897b3.17 for ; Mon, 09 May 2022 12:20:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:message-id:mime-version:subject:from:to:cc :content-transfer-encoding; bh=H6QqIh+pI17Kk15/gtJ53p2UAO94Xn8dwVwMH5QlY3k=; b=aZd5gr74deqM0PWU/lTsKqXLMnEU65bjkdfRXqd8IAoV4e2yTN0Lc6cT8ljEWulBDy Xe7b/5PhZbbMwEgi+P0B23R4CjJ9xPKwiw80+c+NzKzgGRYqmU3K395ycca6WLi5eSTj wrDuVjkynlnh6oJX3w9QlPiOsXuWO/DtOo0ao738l9PsiLadtKHtBgI7SxWq80alDH00 niCt4VFfXXbbj/mlX26d0Mlg8hwJ1tImpq8pmSeK/PgsTuSDitJaobJPIqcBJly3dD9U q9+xhZdPKCXejuKLaWy5snj96wMKZZaS8Yqvair1sZdQjm/hr6aKOEOX+mKklKneV3Yd h45g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc :content-transfer-encoding; bh=H6QqIh+pI17Kk15/gtJ53p2UAO94Xn8dwVwMH5QlY3k=; b=uYjYojfLnwzFnS4LutaQtcIv06uLB9GwsNnMHXivyuCryu6Ot5pn9lQG+/QmscYygt OKSf3jQIO4lNhLHmgnZsykUfYlFMKqAXuUrMkJR0y5KqCu6kpyhiZRGhTMnfsK5AoWiH VpcAulGfqqTfAZY7irJK+MrSTJbsnnCRb4u+GYTFeaiY7KuHphFeB7sYxSUwfXml92Dl bGnKHkTwxSIWJjKlnn6juNz2BRu1PmI+LTtpOZWoQPyC1l5qRTMtw/CJmiuVRG3Mgi+B P/jPCF/kkh+cFLbPLC87Oz7O4w98QIvrXW4Ih17/QEGhLppH2GRXiSiYvVaE851qyfvK T+Pw== X-Gm-Message-State: AOAM533059cWvCG94JNYQCstIBTQl+jC7vXYsTRGGU47eIs2B1DHDcbc 7rtwS8inzxykfhjek6hfPdjH2M6hD0HHmrAO8+60VIYBSQRp2CfhPq+/Gf5vRifcdYbHZdNZF5B Vvh1u0o2YiXmGge0F4QrrUoXtmCXauLRQy1B141E6nt1rGaZLyTXcnJa0UjcfnwAHHhA= X-Google-Smtp-Source: ABdhPJyrf244tD9QmISI/73P96aZPF8Hub18aiV5tm/9iMdpU9npSqAqFJxLhjCSPjKaxcMF94TNF+TrQw== X-Received: from nhuck.c.googlers.com ([fda3:e722:ac3:cc00:14:4d90:c0a8:39cc]) (user=nhuck job=sendgmr) by 2002:a0d:eb4b:0:b0:2f8:9089:3ad4 with SMTP id u72-20020a0deb4b000000b002f890893ad4mr15479867ywe.65.1652124017396; Mon, 09 May 2022 12:20:17 -0700 (PDT) Date: Mon, 9 May 2022 19:10:58 +0000 Message-Id: <20220509191107.3556468-1-nhuck@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.36.0.512.ge40c2bad7a-goog Subject: [PATCH v7 0/9] crypto: HCTR2 support From: Nathan Huckleberry To: linux-crypto@vger.kernel.org Cc: linux-fscrypt@vger.kernel.org, Herbert Xu , "David S. Miller" , linux-arm-kernel@lists.infradead.org, Paul Crowley , Eric Biggers , Sami Tolvanen , Ard Biesheuvel , Nathan Huckleberry Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org HCTR2 is a length-preserving encryption mode that is efficient on processors with instructions to accelerate AES and carryless multiplication, e.g. x86 processors with AES-NI and CLMUL, and ARM processors with the ARMv8 Crypto Extensions. HCTR2 is specified in https://ia.cr/2021/1441 "Length-preserving encryption with HCTR2" which shows that if AES is secure and HCTR2 is instantiated with AES, then HCTR2 is secure. Reference code and test vectors are at https://github.com/google/hctr2. As a length-preserving encryption mode, HCTR2 is suitable for applications such as storage encryption where ciphertext expansion is not possible, and thus authenticated encryption cannot be used. Currently, such applications usually use XTS, or in some cases Adiantum. XTS has the disadvantage that it is a narrow-block mode: a bitflip will only change 16 bytes in the resulting ciphertext or plaintext. This reveals more information to an attacker than necessary. HCTR2 is a wide-block mode, so it provides a stronger security property: a bitflip will change the entire message. HCTR2 is somewhat similar to Adiantum, which is also a wide-block mode. However, HCTR2 is designed to take advantage of existing crypto instructions, while Adiantum targets devices without such hardware support. Adiantum is also designed with longer messages in mind, while HCTR2 is designed to be efficient even on short messages. The first intended use of this mode in the kernel is for the encryption of filenames, where for efficiency reasons encryption must be fully deterministic (only one ciphertext for each plaintext) and the existing CBC solution leaks more information than necessary for filenames with common prefixes. HCTR2 uses two passes of an =CE=B5-almost-=E2=88=86-universal hash function= called POLYVAL and one pass of a block cipher mode called XCTR. POLYVAL is a polynomial hash designed for efficiency on modern processors and was originally specified for use in AES-GCM-SIV (RFC 8452). XCTR mode is a variant of CTR mode that is more efficient on little-endian machines. This patchset adds HCTR2 to Linux's crypto API, including generic implementations of XCTR and POLYVAL, hardware accelerated implementations of XCTR and POLYVAL for both x86-64 and ARM64, a templated implementation of HCTR2, and an fscrypt policy for using HCTR2 for filename encryption. Changes in v7: * Added/modified some comments in ARM64 XCTR/CTR implementation * Various small style fixes Changes in v6: * Split ARM64 XCTR/CTR refactoring into separate patch * Allow simd POLYVAL implementations to be preempted * Fix uninitialized bug in HCTR2 * Fix streamcipher name handling bug in HCTR2 * Various small style fixes Changes in v5: * Refactor HCTR2 tweak hashing * Remove non-AVX x86-64 XCTR implementation * Combine arm64 CTR and XCTR modes * Comment and alias CTR and XCTR modes * Move generic fallback code for simd POLYVAL into polyval-generic.c * Various small style fixes Changes in v4: * Small style fixes in generic POLYVAL and XCTR * Move HCTR2 hash exporting/importing to helper functions * Rewrite montgomery reduction for x86-64 POLYVAL * Rewrite partial block handling for x86-64 POLYVAL * Optimize x86-64 POLYVAL loop handling * Remove ahash wrapper from x86-64 POLYVAL * Add simd-unavailable handling to x86-64 POLYVAL * Rewrite montgomery reduction for ARM64 POLYVAL * Rewrite partial block handling for ARM64 POLYVAL * Optimize ARM64 POLYVAL loop handling * Remove ahash wrapper from ARM64 POLYVAL * Add simd-unavailable handling to ARM64 POLYVAL Changes in v3: * Improve testvec coverage for XCTR, POLYVAL and HCTR2 * Fix endianness bug in xctr.c * Fix alignment issues in polyval-generic.c * Optimize hctr2.c by exporting/importing hash states * Fix blockcipher name derivation in hctr2.c * Move x86-64 XCTR implementation into aes_ctrby8_avx-x86_64.S * Reuse ARM64 CTR mode tail handling in ARM64 XCTR * Fix x86-64 POLYVAL comments * Fix x86-64 POLYVAL key_powers type to match asm * Fix ARM64 POLYVAL comments * Fix ARM64 POLYVAL key_powers type to match asm * Add XTS + HCTR2 policy to fscrypt Nathan Huckleberry (9): crypto: xctr - Add XCTR support crypto: polyval - Add POLYVAL support crypto: hctr2 - Add HCTR2 support crypto: x86/aesni-xctr: Add accelerated implementation of XCTR crypto: arm64/aes-xctr: Add accelerated implementation of XCTR crypto: arm64/aes-xctr: Improve readability of XCTR and CTR modes crypto: x86/polyval: Add PCLMULQDQ accelerated implementation of POLYVAL crypto: arm64/polyval: Add PMULL accelerated implementation of POLYVAL fscrypt: Add HCTR2 support for filename encryption Documentation/filesystems/fscrypt.rst | 22 +- arch/arm64/crypto/Kconfig | 9 +- arch/arm64/crypto/Makefile | 3 + arch/arm64/crypto/aes-glue.c | 82 +- arch/arm64/crypto/aes-modes.S | 338 +++-- arch/arm64/crypto/polyval-ce-core.S | 361 ++++++ arch/arm64/crypto/polyval-ce-glue.c | 193 +++ arch/x86/crypto/Makefile | 3 + arch/x86/crypto/aes_ctrby8_avx-x86_64.S | 232 ++-- arch/x86/crypto/aesni-intel_glue.c | 114 +- arch/x86/crypto/polyval-clmulni_asm.S | 321 +++++ arch/x86/crypto/polyval-clmulni_glue.c | 203 +++ crypto/Kconfig | 39 +- crypto/Makefile | 3 + crypto/hctr2.c | 581 +++++++++ crypto/polyval-generic.c | 245 ++++ crypto/tcrypt.c | 10 + crypto/testmgr.c | 20 + crypto/testmgr.h | 1536 +++++++++++++++++++++++ crypto/xctr.c | 191 +++ fs/crypto/fscrypt_private.h | 2 +- fs/crypto/keysetup.c | 7 + fs/crypto/policy.c | 14 +- include/crypto/polyval.h | 22 + include/uapi/linux/fscrypt.h | 3 +- 25 files changed, 4355 insertions(+), 199 deletions(-) create mode 100644 arch/arm64/crypto/polyval-ce-core.S create mode 100644 arch/arm64/crypto/polyval-ce-glue.c create mode 100644 arch/x86/crypto/polyval-clmulni_asm.S create mode 100644 arch/x86/crypto/polyval-clmulni_glue.c create mode 100644 crypto/hctr2.c create mode 100644 crypto/polyval-generic.c create mode 100644 crypto/xctr.c create mode 100644 include/crypto/polyval.h --=20 2.36.0.512.ge40c2bad7a-goog From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 40E87C433F5 for ; Mon, 9 May 2022 19:21:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:From:Subject:Mime-Version: Message-Id:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To: References:List-Owner; bh=9Eyc3Wim6U+/rO5fHxSH43SMH3S8VZdsUSNX5yicQoc=; b=ZBF NeXaYAMuqFdpnuNkNEYR8N4fpPuPrqfpUoGPn1ggAoC0TTS0J/Gcz7eTBls6zKda5Nc3dCY/w2l9J 404Cg/H6MHXJHpzMyFj16Z8F/axlrWBYsCwml40Lp5PGX/sqap1c7BJFmQrAAgQoqsWcdlMV53OPp XWzptkdMPMEMQYFIBDBRPVZ3Pg+r6vZ9vrpMf6EuNissc9NANSaHoUtqO0p9dKbylgFOSN/MPa6eO tlqA89uycATcQ1h2Q22tqi36UXXwdDGsxBozkggi+hoClen0dS4aGxkG5LcMxdFYqsI1qw7J22ayd zRCIo/ZC+cDRFsP4whgW8OqiT8WvnTg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1no8vj-00Fz7e-D8; Mon, 09 May 2022 19:20:27 +0000 Received: from mail-yw1-x1149.google.com ([2607:f8b0:4864:20::1149]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1no8vf-00Fz4x-9T for linux-arm-kernel@lists.infradead.org; Mon, 09 May 2022 19:20:25 +0000 Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-2f4e17a5809so127924797b3.2 for ; Mon, 09 May 2022 12:20:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:message-id:mime-version:subject:from:to:cc :content-transfer-encoding; bh=H6QqIh+pI17Kk15/gtJ53p2UAO94Xn8dwVwMH5QlY3k=; b=aZd5gr74deqM0PWU/lTsKqXLMnEU65bjkdfRXqd8IAoV4e2yTN0Lc6cT8ljEWulBDy Xe7b/5PhZbbMwEgi+P0B23R4CjJ9xPKwiw80+c+NzKzgGRYqmU3K395ycca6WLi5eSTj wrDuVjkynlnh6oJX3w9QlPiOsXuWO/DtOo0ao738l9PsiLadtKHtBgI7SxWq80alDH00 niCt4VFfXXbbj/mlX26d0Mlg8hwJ1tImpq8pmSeK/PgsTuSDitJaobJPIqcBJly3dD9U q9+xhZdPKCXejuKLaWy5snj96wMKZZaS8Yqvair1sZdQjm/hr6aKOEOX+mKklKneV3Yd h45g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc :content-transfer-encoding; bh=H6QqIh+pI17Kk15/gtJ53p2UAO94Xn8dwVwMH5QlY3k=; b=JgWL0g4Aj9q89m7QpW88BuYr9wSTTm61QdQP5Bbxc1Lfk2pc8rL1e9CZ3SeOmYtDzA qSW1Zp9JL0VeSE2GPbv+wKsTxWJNmxYSqJzYI7tX6zerp/eS4cgvnWpQ4StnMA5egByG ov4MlU9tQ4Z3CYXQ9qrbhFlzjZRxceXEKZRlvQ5mKJJY9AzvPkWPn2Hiqqwmk82+I866 Vww1b/5dO1rhw2Sc8q4HyLwkjZ888l5fIYGUCuI6NAB1BtVmaJno1dO7pXmr0BEHN596 FZAmjFaftUFtL4MZ/RcVJ7NBE59T/ggIpuoQKihdusxy6j7s3IJgJItfCMkZ6NR/ooUt CF8Q== X-Gm-Message-State: AOAM5300N1ejxj6YW6hyCCPdyol9v73yjIQ9wA//gB5CXK+2pKmyLMVc d7wNzTFOwJ7yuwTihGYDwflGhc/bpA== X-Google-Smtp-Source: ABdhPJyrf244tD9QmISI/73P96aZPF8Hub18aiV5tm/9iMdpU9npSqAqFJxLhjCSPjKaxcMF94TNF+TrQw== X-Received: from nhuck.c.googlers.com ([fda3:e722:ac3:cc00:14:4d90:c0a8:39cc]) (user=nhuck job=sendgmr) by 2002:a0d:eb4b:0:b0:2f8:9089:3ad4 with SMTP id u72-20020a0deb4b000000b002f890893ad4mr15479867ywe.65.1652124017396; Mon, 09 May 2022 12:20:17 -0700 (PDT) Date: Mon, 9 May 2022 19:10:58 +0000 Message-Id: <20220509191107.3556468-1-nhuck@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.36.0.512.ge40c2bad7a-goog Subject: [PATCH v7 0/9] crypto: HCTR2 support From: Nathan Huckleberry To: linux-crypto@vger.kernel.org Cc: linux-fscrypt@vger.kernel.org, Herbert Xu , "David S. Miller" , linux-arm-kernel@lists.infradead.org, Paul Crowley , Eric Biggers , Sami Tolvanen , Ard Biesheuvel , Nathan Huckleberry X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220509_122023_375496_5F707F14 X-CRM114-Status: GOOD ( 19.05 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SENUUjIgaXMgYSBsZW5ndGgtcHJlc2VydmluZyBlbmNyeXB0aW9uIG1vZGUgdGhhdCBpcyBlZmZp Y2llbnQgb24KcHJvY2Vzc29ycyB3aXRoIGluc3RydWN0aW9ucyB0byBhY2NlbGVyYXRlIEFFUyBh bmQgY2FycnlsZXNzCm11bHRpcGxpY2F0aW9uLCBlLmcuIHg4NiBwcm9jZXNzb3JzIHdpdGggQUVT LU5JIGFuZCBDTE1VTCwgYW5kIEFSTQpwcm9jZXNzb3JzIHdpdGggdGhlIEFSTXY4IENyeXB0byBF eHRlbnNpb25zLgoKSENUUjIgaXMgc3BlY2lmaWVkIGluIGh0dHBzOi8vaWEuY3IvMjAyMS8xNDQx ICJMZW5ndGgtcHJlc2VydmluZyBlbmNyeXB0aW9uCndpdGggSENUUjIiIHdoaWNoIHNob3dzIHRo YXQgaWYgQUVTIGlzIHNlY3VyZSBhbmQgSENUUjIgaXMgaW5zdGFudGlhdGVkCndpdGggQUVTLCB0 aGVuIEhDVFIyIGlzIHNlY3VyZS4gIFJlZmVyZW5jZSBjb2RlIGFuZCB0ZXN0IHZlY3RvcnMgYXJl IGF0Cmh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvaGN0cjIuCgpBcyBhIGxlbmd0aC1wcmVzZXJ2 aW5nIGVuY3J5cHRpb24gbW9kZSwgSENUUjIgaXMgc3VpdGFibGUgZm9yIGFwcGxpY2F0aW9ucwpz dWNoIGFzIHN0b3JhZ2UgZW5jcnlwdGlvbiB3aGVyZSBjaXBoZXJ0ZXh0IGV4cGFuc2lvbiBpcyBu b3QgcG9zc2libGUsIGFuZAp0aHVzIGF1dGhlbnRpY2F0ZWQgZW5jcnlwdGlvbiBjYW5ub3QgYmUg dXNlZC4gIEN1cnJlbnRseSwgc3VjaCBhcHBsaWNhdGlvbnMKdXN1YWxseSB1c2UgWFRTLCBvciBp biBzb21lIGNhc2VzIEFkaWFudHVtLiAgWFRTIGhhcyB0aGUgZGlzYWR2YW50YWdlIHRoYXQKaXQg aXMgYSBuYXJyb3ctYmxvY2sgbW9kZTogYSBiaXRmbGlwIHdpbGwgb25seSBjaGFuZ2UgMTYgYnl0 ZXMgaW4gdGhlCnJlc3VsdGluZyBjaXBoZXJ0ZXh0IG9yIHBsYWludGV4dC4gIFRoaXMgcmV2ZWFs cyBtb3JlIGluZm9ybWF0aW9uIHRvIGFuCmF0dGFja2VyIHRoYW4gbmVjZXNzYXJ5LgoKSENUUjIg aXMgYSB3aWRlLWJsb2NrIG1vZGUsIHNvIGl0IHByb3ZpZGVzIGEgc3Ryb25nZXIgc2VjdXJpdHkg cHJvcGVydHk6IGEKYml0ZmxpcCB3aWxsIGNoYW5nZSB0aGUgZW50aXJlIG1lc3NhZ2UuICBIQ1RS MiBpcyBzb21ld2hhdCBzaW1pbGFyIHRvCkFkaWFudHVtLCB3aGljaCBpcyBhbHNvIGEgd2lkZS1i bG9jayBtb2RlLiAgSG93ZXZlciwgSENUUjIgaXMgZGVzaWduZWQgdG8KdGFrZSBhZHZhbnRhZ2Ug b2YgZXhpc3RpbmcgY3J5cHRvIGluc3RydWN0aW9ucywgd2hpbGUgQWRpYW50dW0gdGFyZ2V0cwpk ZXZpY2VzIHdpdGhvdXQgc3VjaCBoYXJkd2FyZSBzdXBwb3J0LiAgQWRpYW50dW0gaXMgYWxzbyBk ZXNpZ25lZCB3aXRoCmxvbmdlciBtZXNzYWdlcyBpbiBtaW5kLCB3aGlsZSBIQ1RSMiBpcyBkZXNp Z25lZCB0byBiZSBlZmZpY2llbnQgZXZlbiBvbgpzaG9ydCBtZXNzYWdlcy4KClRoZSBmaXJzdCBp bnRlbmRlZCB1c2Ugb2YgdGhpcyBtb2RlIGluIHRoZSBrZXJuZWwgaXMgZm9yIHRoZSBlbmNyeXB0 aW9uIG9mCmZpbGVuYW1lcywgd2hlcmUgZm9yIGVmZmljaWVuY3kgcmVhc29ucyBlbmNyeXB0aW9u IG11c3QgYmUgZnVsbHkKZGV0ZXJtaW5pc3RpYyAob25seSBvbmUgY2lwaGVydGV4dCBmb3IgZWFj aCBwbGFpbnRleHQpIGFuZCB0aGUgZXhpc3RpbmcgQ0JDCnNvbHV0aW9uIGxlYWtzIG1vcmUgaW5m b3JtYXRpb24gdGhhbiBuZWNlc3NhcnkgZm9yIGZpbGVuYW1lcyB3aXRoIGNvbW1vbgpwcmVmaXhl cy4KCkhDVFIyIHVzZXMgdHdvIHBhc3NlcyBvZiBhbiDOtS1hbG1vc3Qt4oiGLXVuaXZlcnNhbCBo YXNoIGZ1bmN0aW9uIGNhbGxlZApQT0xZVkFMIGFuZCBvbmUgcGFzcyBvZiBhIGJsb2NrIGNpcGhl ciBtb2RlIGNhbGxlZCBYQ1RSLiAgUE9MWVZBTCBpcyBhCnBvbHlub21pYWwgaGFzaCBkZXNpZ25l ZCBmb3IgZWZmaWNpZW5jeSBvbiBtb2Rlcm4gcHJvY2Vzc29ycyBhbmQgd2FzCm9yaWdpbmFsbHkg c3BlY2lmaWVkIGZvciB1c2UgaW4gQUVTLUdDTS1TSVYgKFJGQyA4NDUyKS4gIFhDVFIgbW9kZSBp cyBhCnZhcmlhbnQgb2YgQ1RSIG1vZGUgdGhhdCBpcyBtb3JlIGVmZmljaWVudCBvbiBsaXR0bGUt ZW5kaWFuIG1hY2hpbmVzLgoKVGhpcyBwYXRjaHNldCBhZGRzIEhDVFIyIHRvIExpbnV4J3MgY3J5 cHRvIEFQSSwgaW5jbHVkaW5nIGdlbmVyaWMKaW1wbGVtZW50YXRpb25zIG9mIFhDVFIgYW5kIFBP TFlWQUwsIGhhcmR3YXJlIGFjY2VsZXJhdGVkIGltcGxlbWVudGF0aW9ucwpvZiBYQ1RSIGFuZCBQ T0xZVkFMIGZvciBib3RoIHg4Ni02NCBhbmQgQVJNNjQsIGEgdGVtcGxhdGVkIGltcGxlbWVudGF0 aW9uCm9mIEhDVFIyLCBhbmQgYW4gZnNjcnlwdCBwb2xpY3kgZm9yIHVzaW5nIEhDVFIyIGZvciBm aWxlbmFtZSBlbmNyeXB0aW9uLgoKQ2hhbmdlcyBpbiB2NzoKICogQWRkZWQvbW9kaWZpZWQgc29t ZSBjb21tZW50cyBpbiBBUk02NCBYQ1RSL0NUUiBpbXBsZW1lbnRhdGlvbgogKiBWYXJpb3VzIHNt YWxsIHN0eWxlIGZpeGVzCgpDaGFuZ2VzIGluIHY2OgogKiBTcGxpdCBBUk02NCBYQ1RSL0NUUiBy ZWZhY3RvcmluZyBpbnRvIHNlcGFyYXRlIHBhdGNoCiAqIEFsbG93IHNpbWQgUE9MWVZBTCBpbXBs ZW1lbnRhdGlvbnMgdG8gYmUgcHJlZW1wdGVkCiAqIEZpeCB1bmluaXRpYWxpemVkIGJ1ZyBpbiBI Q1RSMgogKiBGaXggc3RyZWFtY2lwaGVyIG5hbWUgaGFuZGxpbmcgYnVnIGluIEhDVFIyCiAqIFZh cmlvdXMgc21hbGwgc3R5bGUgZml4ZXMKCkNoYW5nZXMgaW4gdjU6CiAqIFJlZmFjdG9yIEhDVFIy IHR3ZWFrIGhhc2hpbmcKICogUmVtb3ZlIG5vbi1BVlggeDg2LTY0IFhDVFIgaW1wbGVtZW50YXRp b24KICogQ29tYmluZSBhcm02NCBDVFIgYW5kIFhDVFIgbW9kZXMKICogQ29tbWVudCBhbmQgYWxp YXMgQ1RSIGFuZCBYQ1RSIG1vZGVzCiAqIE1vdmUgZ2VuZXJpYyBmYWxsYmFjayBjb2RlIGZvciBz aW1kIFBPTFlWQUwgaW50byBwb2x5dmFsLWdlbmVyaWMuYwogKiBWYXJpb3VzIHNtYWxsIHN0eWxl IGZpeGVzCgpDaGFuZ2VzIGluIHY0OgogKiBTbWFsbCBzdHlsZSBmaXhlcyBpbiBnZW5lcmljIFBP TFlWQUwgYW5kIFhDVFIKICogTW92ZSBIQ1RSMiBoYXNoIGV4cG9ydGluZy9pbXBvcnRpbmcgdG8g aGVscGVyIGZ1bmN0aW9ucwogKiBSZXdyaXRlIG1vbnRnb21lcnkgcmVkdWN0aW9uIGZvciB4ODYt NjQgUE9MWVZBTAogKiBSZXdyaXRlIHBhcnRpYWwgYmxvY2sgaGFuZGxpbmcgZm9yIHg4Ni02NCBQ T0xZVkFMCiAqIE9wdGltaXplIHg4Ni02NCBQT0xZVkFMIGxvb3AgaGFuZGxpbmcKICogUmVtb3Zl IGFoYXNoIHdyYXBwZXIgZnJvbSB4ODYtNjQgUE9MWVZBTAogKiBBZGQgc2ltZC11bmF2YWlsYWJs ZSBoYW5kbGluZyB0byB4ODYtNjQgUE9MWVZBTAogKiBSZXdyaXRlIG1vbnRnb21lcnkgcmVkdWN0 aW9uIGZvciBBUk02NCBQT0xZVkFMCiAqIFJld3JpdGUgcGFydGlhbCBibG9jayBoYW5kbGluZyBm b3IgQVJNNjQgUE9MWVZBTAogKiBPcHRpbWl6ZSBBUk02NCBQT0xZVkFMIGxvb3AgaGFuZGxpbmcK ICogUmVtb3ZlIGFoYXNoIHdyYXBwZXIgZnJvbSBBUk02NCBQT0xZVkFMCiAqIEFkZCBzaW1kLXVu YXZhaWxhYmxlIGhhbmRsaW5nIHRvIEFSTTY0IFBPTFlWQUwKCkNoYW5nZXMgaW4gdjM6CiAqIElt cHJvdmUgdGVzdHZlYyBjb3ZlcmFnZSBmb3IgWENUUiwgUE9MWVZBTCBhbmQgSENUUjIKICogRml4 IGVuZGlhbm5lc3MgYnVnIGluIHhjdHIuYwogKiBGaXggYWxpZ25tZW50IGlzc3VlcyBpbiBwb2x5 dmFsLWdlbmVyaWMuYwogKiBPcHRpbWl6ZSBoY3RyMi5jIGJ5IGV4cG9ydGluZy9pbXBvcnRpbmcg aGFzaCBzdGF0ZXMKICogRml4IGJsb2NrY2lwaGVyIG5hbWUgZGVyaXZhdGlvbiBpbiBoY3RyMi5j CiAqIE1vdmUgeDg2LTY0IFhDVFIgaW1wbGVtZW50YXRpb24gaW50byBhZXNfY3RyYnk4X2F2eC14 ODZfNjQuUwogKiBSZXVzZSBBUk02NCBDVFIgbW9kZSB0YWlsIGhhbmRsaW5nIGluIEFSTTY0IFhD VFIKICogRml4IHg4Ni02NCBQT0xZVkFMIGNvbW1lbnRzCiAqIEZpeCB4ODYtNjQgUE9MWVZBTCBr ZXlfcG93ZXJzIHR5cGUgdG8gbWF0Y2ggYXNtCiAqIEZpeCBBUk02NCBQT0xZVkFMIGNvbW1lbnRz CiAqIEZpeCBBUk02NCBQT0xZVkFMIGtleV9wb3dlcnMgdHlwZSB0byBtYXRjaCBhc20KICogQWRk IFhUUyArIEhDVFIyIHBvbGljeSB0byBmc2NyeXB0CgpOYXRoYW4gSHVja2xlYmVycnkgKDkpOgog IGNyeXB0bzogeGN0ciAtIEFkZCBYQ1RSIHN1cHBvcnQKICBjcnlwdG86IHBvbHl2YWwgLSBBZGQg UE9MWVZBTCBzdXBwb3J0CiAgY3J5cHRvOiBoY3RyMiAtIEFkZCBIQ1RSMiBzdXBwb3J0CiAgY3J5 cHRvOiB4ODYvYWVzbmkteGN0cjogQWRkIGFjY2VsZXJhdGVkIGltcGxlbWVudGF0aW9uIG9mIFhD VFIKICBjcnlwdG86IGFybTY0L2Flcy14Y3RyOiBBZGQgYWNjZWxlcmF0ZWQgaW1wbGVtZW50YXRp b24gb2YgWENUUgogIGNyeXB0bzogYXJtNjQvYWVzLXhjdHI6IEltcHJvdmUgcmVhZGFiaWxpdHkg b2YgWENUUiBhbmQgQ1RSIG1vZGVzCiAgY3J5cHRvOiB4ODYvcG9seXZhbDogQWRkIFBDTE1VTFFE USBhY2NlbGVyYXRlZCBpbXBsZW1lbnRhdGlvbiBvZgogICAgUE9MWVZBTAogIGNyeXB0bzogYXJt NjQvcG9seXZhbDogQWRkIFBNVUxMIGFjY2VsZXJhdGVkIGltcGxlbWVudGF0aW9uIG9mIFBPTFlW QUwKICBmc2NyeXB0OiBBZGQgSENUUjIgc3VwcG9ydCBmb3IgZmlsZW5hbWUgZW5jcnlwdGlvbgoK IERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZnNjcnlwdC5yc3QgICB8ICAgMjIgKy0KIGFyY2gv YXJtNjQvY3J5cHRvL0tjb25maWcgICAgICAgICAgICAgICB8ICAgIDkgKy0KIGFyY2gvYXJtNjQv Y3J5cHRvL01ha2VmaWxlICAgICAgICAgICAgICB8ICAgIDMgKwogYXJjaC9hcm02NC9jcnlwdG8v YWVzLWdsdWUuYyAgICAgICAgICAgIHwgICA4MiArLQogYXJjaC9hcm02NC9jcnlwdG8vYWVzLW1v ZGVzLlMgICAgICAgICAgIHwgIDMzOCArKystLQogYXJjaC9hcm02NC9jcnlwdG8vcG9seXZhbC1j ZS1jb3JlLlMgICAgIHwgIDM2MSArKysrKysKIGFyY2gvYXJtNjQvY3J5cHRvL3BvbHl2YWwtY2Ut Z2x1ZS5jICAgICB8ICAxOTMgKysrCiBhcmNoL3g4Ni9jcnlwdG8vTWFrZWZpbGUgICAgICAgICAg ICAgICAgfCAgICAzICsKIGFyY2gveDg2L2NyeXB0by9hZXNfY3RyYnk4X2F2eC14ODZfNjQuUyB8 ICAyMzIgKystLQogYXJjaC94ODYvY3J5cHRvL2Flc25pLWludGVsX2dsdWUuYyAgICAgIHwgIDEx NCArLQogYXJjaC94ODYvY3J5cHRvL3BvbHl2YWwtY2xtdWxuaV9hc20uUyAgIHwgIDMyMSArKysr KwogYXJjaC94ODYvY3J5cHRvL3BvbHl2YWwtY2xtdWxuaV9nbHVlLmMgIHwgIDIwMyArKysKIGNy eXB0by9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMzkgKy0KIGNyeXB0by9N YWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDMgKwogY3J5cHRvL2hjdHIyLmMg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDU4MSArKysrKysrKysKIGNyeXB0by9wb2x5dmFs LWdlbmVyaWMuYyAgICAgICAgICAgICAgICB8ICAyNDUgKysrKwogY3J5cHRvL3RjcnlwdC5jICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAxMCArCiBjcnlwdG8vdGVzdG1nci5jICAgICAgICAg ICAgICAgICAgICAgICAgfCAgIDIwICsKIGNyeXB0by90ZXN0bWdyLmggICAgICAgICAgICAgICAg ICAgICAgICB8IDE1MzYgKysrKysrKysrKysrKysrKysrKysrKysKIGNyeXB0by94Y3RyLmMgICAg ICAgICAgICAgICAgICAgICAgICAgICB8ICAxOTEgKysrCiBmcy9jcnlwdG8vZnNjcnlwdF9wcml2 YXRlLmggICAgICAgICAgICAgfCAgICAyICstCiBmcy9jcnlwdG8va2V5c2V0dXAuYyAgICAgICAg ICAgICAgICAgICAgfCAgICA3ICsKIGZzL2NyeXB0by9wb2xpY3kuYyAgICAgICAgICAgICAgICAg ICAgICB8ICAgMTQgKy0KIGluY2x1ZGUvY3J5cHRvL3BvbHl2YWwuaCAgICAgICAgICAgICAgICB8 ICAgMjIgKwogaW5jbHVkZS91YXBpL2xpbnV4L2ZzY3J5cHQuaCAgICAgICAgICAgIHwgICAgMyAr LQogMjUgZmlsZXMgY2hhbmdlZCwgNDM1NSBpbnNlcnRpb25zKCspLCAxOTkgZGVsZXRpb25zKC0p CiBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9jcnlwdG8vcG9seXZhbC1jZS1jb3JlLlMK IGNyZWF0ZSBtb2RlIDEwMDY0NCBhcmNoL2FybTY0L2NyeXB0by9wb2x5dmFsLWNlLWdsdWUuYwog Y3JlYXRlIG1vZGUgMTAwNjQ0IGFyY2gveDg2L2NyeXB0by9wb2x5dmFsLWNsbXVsbmlfYXNtLlMK IGNyZWF0ZSBtb2RlIDEwMDY0NCBhcmNoL3g4Ni9jcnlwdG8vcG9seXZhbC1jbG11bG5pX2dsdWUu YwogY3JlYXRlIG1vZGUgMTAwNjQ0IGNyeXB0by9oY3RyMi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQg Y3J5cHRvL3BvbHl2YWwtZ2VuZXJpYy5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgY3J5cHRvL3hjdHIu YwogY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvY3J5cHRvL3BvbHl2YWwuaAoKLS0gCjIuMzYu MC41MTIuZ2U0MGMyYmFkN2EtZ29vZwoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1r ZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWls bWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK