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 A2E41C433F5 for ; Wed, 4 May 2022 00:18:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230071AbiEDAWM (ORCPT ); Tue, 3 May 2022 20:22:12 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55036 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238802AbiEDAWL (ORCPT ); Tue, 3 May 2022 20:22:11 -0400 Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C2CC042EFE for ; Tue, 3 May 2022 17:18:37 -0700 (PDT) Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-2d7eaa730d9so102467b3.13 for ; Tue, 03 May 2022 17:18:37 -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=mj48fHHaUDuN4yy8hcAAY5+2UaHiNilq4RJZoBQ5Oc8=; b=IxvLtmaP7cvO5HZ/GJvfdOkQpkyZAbERyP59coJGc8rt2yYoH0VHDayFN9sBvUh07Z qG1YCvior3FsOeftw4ZD+keFM+Srk35Q4qUpZ7UaDNTNGI1cK927Fd28vXC40EViZBO0 pdjr8gT/oM03+TCQ0yK3MiJx7p59E2Qb5DdsULSi908yjq/onn0wLcfpv+LtueKVnHFO 3YkZUFyoBswcnIUF6Y67nppP1oANT4rapYToJRYg9Mg3cbsAfs6gBmQtE8ijT/voi6do i5+kr7yv6wZv+uSSdjS+M1qokxDd+3Lm4EBMtNQUWy0/a2nLAS+ZOSmW+11SOtLBcPPZ 2KpA== 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=mj48fHHaUDuN4yy8hcAAY5+2UaHiNilq4RJZoBQ5Oc8=; b=chcEQsss8X4x0+bVMTWSgMA0biQ06R3LodjpyKycClpXDsqb9B9zjNuKHU7Jh9YKCU gJi62s2og6VoDTrpBXq/sicTRFl/4n1OZAwU5FJS2Wpvo9QdQLMFZWSwcSs6nknZeX+X S1CUT11Ew2CbNyMkzgtZjH6EnVPdoCgMbZ7dxQdcWEzZKknwfB58oLOi+fxsSpuadC7k OMTvRH0R8qFbBiXTZ4V9GrTNgW3HJ7nFiPuc8MulkmJ543VTW1OmYfn/D9bPWc2PVS6k TEVr536pXuwyugYV3etPVN91zfM/Rh75rW/w68ZdpHb2Msu5q5Lc+yobfnnHWLBGhnID MvLQ== X-Gm-Message-State: AOAM531tJu4LCMnIY6wUPDjRr0YOuq38560VQX9ljdGWfL7t8Dzj+ALO AhHLM4QA72rg9QLu+3Q8SksGkZi7QpOLUHWq3dOGsZqXadMCIn/4mhocweKs7bJAhGIjfISG76L ickOB7C5Wuqvpn6Rnk8tJhNw8OKiLnPzstFoaDQhZ0rjHjkGZLVc5MQhb/BTyHe8rRIc= X-Google-Smtp-Source: ABdhPJzyviXe6qjst27FZ+09lb/P0J0M7uqcA3q8ZW1YkTXItQepJ2CwdKdeFAlRuJCoFlXgcTx3IYRmqQ== X-Received: from nhuck.c.googlers.com ([fda3:e722:ac3:cc00:14:4d90:c0a8:39cc]) (user=nhuck job=sendgmr) by 2002:a0d:ddc6:0:b0:2f8:a506:a5c0 with SMTP id g189-20020a0dddc6000000b002f8a506a5c0mr18521523ywe.140.1651623515866; Tue, 03 May 2022 17:18:35 -0700 (PDT) Date: Wed, 4 May 2022 00:18:14 +0000 Message-Id: <20220504001823.2483834-1-nhuck@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.36.0.464.gb9c8b46e94-goog Subject: [PATCH v6 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 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 | 64 +- arch/arm64/crypto/aes-modes.S | 309 +++-- arch/arm64/crypto/polyval-ce-core.S | 367 ++++++ arch/arm64/crypto/polyval-ce-glue.c | 190 +++ 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 | 331 +++++ arch/x86/crypto/polyval-clmulni_glue.c | 202 +++ 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, 4321 insertions(+), 198 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.464.gb9c8b46e94-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 CF4DAC433F5 for ; Wed, 4 May 2022 00:20:03 +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=WF8hf22mi3ktBphlD/XOIrpdVhXl/C4XWLMjB1fpvTw=; b=E69 KGXWO15VEChMLu/tm745wDrKXRthmfsXHW2X797RYZc2KcJMh4I/Cd/huAORLD+Y2Lu0t/G86zlCy 8HESFZkvJnLKkLPxO2MB15+rlWTFUYQ6B0gUvrJUMg3yqxM46KddtCUArU5cV7IlmJxyyePNVE2Yl 3kWUKmCyVw+m2nKa14EHOBFT5h+mlOwzGYjOUMireXEFJ5kJfE3ePzDGpjXd1n6ifPg7FQvkqOJOE cQ5uhgQAWi5cy8qxRO+uCF4AiahK3u3r+ImYnDXc8zb8fTTKIk6ItKtMBMEN8DD9KYa81anTz6doW FRXe9pheMWiyQrOv76ZKADAHC+dGP9A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nm2jA-0089PV-Ic; Wed, 04 May 2022 00:18:48 +0000 Received: from mail-yb1-xb49.google.com ([2607:f8b0:4864:20::b49]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nm2j6-0089N8-JU for linux-arm-kernel@lists.infradead.org; Wed, 04 May 2022 00:18:46 +0000 Received: by mail-yb1-xb49.google.com with SMTP id h14-20020a25e20e000000b006484e4a1da2so16969300ybe.9 for ; Tue, 03 May 2022 17:18:36 -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=mj48fHHaUDuN4yy8hcAAY5+2UaHiNilq4RJZoBQ5Oc8=; b=IxvLtmaP7cvO5HZ/GJvfdOkQpkyZAbERyP59coJGc8rt2yYoH0VHDayFN9sBvUh07Z qG1YCvior3FsOeftw4ZD+keFM+Srk35Q4qUpZ7UaDNTNGI1cK927Fd28vXC40EViZBO0 pdjr8gT/oM03+TCQ0yK3MiJx7p59E2Qb5DdsULSi908yjq/onn0wLcfpv+LtueKVnHFO 3YkZUFyoBswcnIUF6Y67nppP1oANT4rapYToJRYg9Mg3cbsAfs6gBmQtE8ijT/voi6do i5+kr7yv6wZv+uSSdjS+M1qokxDd+3Lm4EBMtNQUWy0/a2nLAS+ZOSmW+11SOtLBcPPZ 2KpA== 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=mj48fHHaUDuN4yy8hcAAY5+2UaHiNilq4RJZoBQ5Oc8=; b=bpC2L24/PED9xMUAvOJTBpvZfQ8zhf2fn4nQZEPYriQlcRvuVny/Ter9HJCDG1yg94 659KfeAe3CH8+dd/+eOyxge9y+LVDZXy6CPyezt02xyGuNwefy1KgUKts2p5CyhWGnlj hx/qKIf01bHLkP0wS7WnGUCzWG0CUsa2mnX/Kfy4Z4PU7sztzZd49W15H07VvWn6PlPn StCt0jaQRBM4uViNtvbRp2XiW2eLqgJKjH2t/7gTMFIMvY0S7cylPFDFDZhGHdMHRY2j 7CBjg6NHxpzC3CypapgWXqNp1JsTHI15REQJwEz+ISLM6nJuAHHvp1EVXNw2S80KPHA3 n9GQ== X-Gm-Message-State: AOAM532dJihn0aAHpOBe6EFntIBq4Y14F58OwOwpcLh1MhlI7BL5y0SS 6JIQtx79im2lWKsw9Dg6XoC/4C3dgg== X-Google-Smtp-Source: ABdhPJzyviXe6qjst27FZ+09lb/P0J0M7uqcA3q8ZW1YkTXItQepJ2CwdKdeFAlRuJCoFlXgcTx3IYRmqQ== X-Received: from nhuck.c.googlers.com ([fda3:e722:ac3:cc00:14:4d90:c0a8:39cc]) (user=nhuck job=sendgmr) by 2002:a0d:ddc6:0:b0:2f8:a506:a5c0 with SMTP id g189-20020a0dddc6000000b002f8a506a5c0mr18521523ywe.140.1651623515866; Tue, 03 May 2022 17:18:35 -0700 (PDT) Date: Wed, 4 May 2022 00:18:14 +0000 Message-Id: <20220504001823.2483834-1-nhuck@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.36.0.464.gb9c8b46e94-goog Subject: [PATCH v6 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-20220503_171844_679090_A3AC7D79 X-CRM114-Status: GOOD ( 18.97 ) 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 aWxlbmFtZSBlbmNyeXB0aW9uLgoKQ2hhbmdlcyBpbiB2NjoKICogU3BsaXQgQVJNNjQgWENUUi9D VFIgcmVmYWN0b3JpbmcgaW50byBzZXBhcmF0ZSBwYXRjaAogKiBBbGxvdyBzaW1kIFBPTFlWQUwg aW1wbGVtZW50YXRpb25zIHRvIGJlIHByZWVtcHRlZAogKiBGaXggdW5pbml0aWFsaXplZCBidWcg aW4gSENUUjIKICogRml4IHN0cmVhbWNpcGhlciBuYW1lIGhhbmRsaW5nIGJ1ZyBpbiBIQ1RSMgog KiBWYXJpb3VzIHNtYWxsIHN0eWxlIGZpeGVzCgpDaGFuZ2VzIGluIHY1OgogKiBSZWZhY3RvciBI Q1RSMiB0d2VhayBoYXNoaW5nCiAqIFJlbW92ZSBub24tQVZYIHg4Ni02NCBYQ1RSIGltcGxlbWVu dGF0aW9uCiAqIENvbWJpbmUgYXJtNjQgQ1RSIGFuZCBYQ1RSIG1vZGVzCiAqIENvbW1lbnQgYW5k IGFsaWFzIENUUiBhbmQgWENUUiBtb2RlcwogKiBNb3ZlIGdlbmVyaWMgZmFsbGJhY2sgY29kZSBm b3Igc2ltZCBQT0xZVkFMIGludG8gcG9seXZhbC1nZW5lcmljLmMKICogVmFyaW91cyBzbWFsbCBz dHlsZSBmaXhlcwoKQ2hhbmdlcyBpbiB2NDoKICogU21hbGwgc3R5bGUgZml4ZXMgaW4gZ2VuZXJp YyBQT0xZVkFMIGFuZCBYQ1RSCiAqIE1vdmUgSENUUjIgaGFzaCBleHBvcnRpbmcvaW1wb3J0aW5n IHRvIGhlbHBlciBmdW5jdGlvbnMKICogUmV3cml0ZSBtb250Z29tZXJ5IHJlZHVjdGlvbiBmb3Ig eDg2LTY0IFBPTFlWQUwKICogUmV3cml0ZSBwYXJ0aWFsIGJsb2NrIGhhbmRsaW5nIGZvciB4ODYt NjQgUE9MWVZBTAogKiBPcHRpbWl6ZSB4ODYtNjQgUE9MWVZBTCBsb29wIGhhbmRsaW5nCiAqIFJl bW92ZSBhaGFzaCB3cmFwcGVyIGZyb20geDg2LTY0IFBPTFlWQUwKICogQWRkIHNpbWQtdW5hdmFp bGFibGUgaGFuZGxpbmcgdG8geDg2LTY0IFBPTFlWQUwKICogUmV3cml0ZSBtb250Z29tZXJ5IHJl ZHVjdGlvbiBmb3IgQVJNNjQgUE9MWVZBTAogKiBSZXdyaXRlIHBhcnRpYWwgYmxvY2sgaGFuZGxp bmcgZm9yIEFSTTY0IFBPTFlWQUwKICogT3B0aW1pemUgQVJNNjQgUE9MWVZBTCBsb29wIGhhbmRs aW5nCiAqIFJlbW92ZSBhaGFzaCB3cmFwcGVyIGZyb20gQVJNNjQgUE9MWVZBTAogKiBBZGQgc2lt ZC11bmF2YWlsYWJsZSBoYW5kbGluZyB0byBBUk02NCBQT0xZVkFMCgpDaGFuZ2VzIGluIHYzOgog KiBJbXByb3ZlIHRlc3R2ZWMgY292ZXJhZ2UgZm9yIFhDVFIsIFBPTFlWQUwgYW5kIEhDVFIyCiAq IEZpeCBlbmRpYW5uZXNzIGJ1ZyBpbiB4Y3RyLmMKICogRml4IGFsaWdubWVudCBpc3N1ZXMgaW4g cG9seXZhbC1nZW5lcmljLmMKICogT3B0aW1pemUgaGN0cjIuYyBieSBleHBvcnRpbmcvaW1wb3J0 aW5nIGhhc2ggc3RhdGVzCiAqIEZpeCBibG9ja2NpcGhlciBuYW1lIGRlcml2YXRpb24gaW4gaGN0 cjIuYwogKiBNb3ZlIHg4Ni02NCBYQ1RSIGltcGxlbWVudGF0aW9uIGludG8gYWVzX2N0cmJ5OF9h dngteDg2XzY0LlMKICogUmV1c2UgQVJNNjQgQ1RSIG1vZGUgdGFpbCBoYW5kbGluZyBpbiBBUk02 NCBYQ1RSCiAqIEZpeCB4ODYtNjQgUE9MWVZBTCBjb21tZW50cwogKiBGaXggeDg2LTY0IFBPTFlW QUwga2V5X3Bvd2VycyB0eXBlIHRvIG1hdGNoIGFzbQogKiBGaXggQVJNNjQgUE9MWVZBTCBjb21t ZW50cwogKiBGaXggQVJNNjQgUE9MWVZBTCBrZXlfcG93ZXJzIHR5cGUgdG8gbWF0Y2ggYXNtCiAq IEFkZCBYVFMgKyBIQ1RSMiBwb2xpY3kgdG8gZnNjcnlwdAoKTmF0aGFuIEh1Y2tsZWJlcnJ5ICg5 KToKICBjcnlwdG86IHhjdHIgLSBBZGQgWENUUiBzdXBwb3J0CiAgY3J5cHRvOiBwb2x5dmFsIC0g QWRkIFBPTFlWQUwgc3VwcG9ydAogIGNyeXB0bzogaGN0cjIgLSBBZGQgSENUUjIgc3VwcG9ydAog IGNyeXB0bzogeDg2L2Flc25pLXhjdHI6IEFkZCBhY2NlbGVyYXRlZCBpbXBsZW1lbnRhdGlvbiBv ZiBYQ1RSCiAgY3J5cHRvOiBhcm02NC9hZXMteGN0cjogQWRkIGFjY2VsZXJhdGVkIGltcGxlbWVu dGF0aW9uIG9mIFhDVFIKICBjcnlwdG86IGFybTY0L2Flcy14Y3RyOiBJbXByb3ZlIHJlYWRhYmls aXR5IG9mIFhDVFIgYW5kIENUUiBtb2RlcwogIGNyeXB0bzogeDg2L3BvbHl2YWw6IEFkZCBQQ0xN VUxRRFEgYWNjZWxlcmF0ZWQgaW1wbGVtZW50YXRpb24gb2YKICAgIFBPTFlWQUwKICBjcnlwdG86 IGFybTY0L3BvbHl2YWw6IEFkZCBQTVVMTCBhY2NlbGVyYXRlZCBpbXBsZW1lbnRhdGlvbiBvZiBQ T0xZVkFMCiAgZnNjcnlwdDogQWRkIEhDVFIyIHN1cHBvcnQgZm9yIGZpbGVuYW1lIGVuY3J5cHRp b24KCiBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2ZzY3J5cHQucnN0ICAgfCAgIDIyICstCiBh cmNoL2FybTY0L2NyeXB0by9LY29uZmlnICAgICAgICAgICAgICAgfCAgICA5ICstCiBhcmNoL2Fy bTY0L2NyeXB0by9NYWtlZmlsZSAgICAgICAgICAgICAgfCAgICAzICsKIGFyY2gvYXJtNjQvY3J5 cHRvL2Flcy1nbHVlLmMgICAgICAgICAgICB8ICAgNjQgKy0KIGFyY2gvYXJtNjQvY3J5cHRvL2Fl cy1tb2Rlcy5TICAgICAgICAgICB8ICAzMDkgKysrLS0KIGFyY2gvYXJtNjQvY3J5cHRvL3BvbHl2 YWwtY2UtY29yZS5TICAgICB8ICAzNjcgKysrKysrCiBhcmNoL2FybTY0L2NyeXB0by9wb2x5dmFs LWNlLWdsdWUuYyAgICAgfCAgMTkwICsrKwogYXJjaC94ODYvY3J5cHRvL01ha2VmaWxlICAgICAg ICAgICAgICAgIHwgICAgMyArCiBhcmNoL3g4Ni9jcnlwdG8vYWVzX2N0cmJ5OF9hdngteDg2XzY0 LlMgfCAgMjMyICsrLS0KIGFyY2gveDg2L2NyeXB0by9hZXNuaS1pbnRlbF9nbHVlLmMgICAgICB8 ICAxMTQgKy0KIGFyY2gveDg2L2NyeXB0by9wb2x5dmFsLWNsbXVsbmlfYXNtLlMgICB8ICAzMzEg KysrKysKIGFyY2gveDg2L2NyeXB0by9wb2x5dmFsLWNsbXVsbmlfZ2x1ZS5jICB8ICAyMDIgKysr CiBjcnlwdG8vS2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDM5ICstCiBjcnlw dG8vTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAzICsKIGNyeXB0by9oY3Ry Mi5jICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1ODEgKysrKysrKysrCiBjcnlwdG8vcG9s eXZhbC1nZW5lcmljLmMgICAgICAgICAgICAgICAgfCAgMjQ1ICsrKysKIGNyeXB0by90Y3J5cHQu YyAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTAgKwogY3J5cHRvL3Rlc3RtZ3IuYyAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAyMCArCiBjcnlwdG8vdGVzdG1nci5oICAgICAgICAgICAg ICAgICAgICAgICAgfCAxNTM2ICsrKysrKysrKysrKysrKysrKysrKysrCiBjcnlwdG8veGN0ci5j ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTkxICsrKwogZnMvY3J5cHRvL2ZzY3J5cHRf cHJpdmF0ZS5oICAgICAgICAgICAgIHwgICAgMiArLQogZnMvY3J5cHRvL2tleXNldHVwLmMgICAg ICAgICAgICAgICAgICAgIHwgICAgNyArCiBmcy9jcnlwdG8vcG9saWN5LmMgICAgICAgICAgICAg ICAgICAgICAgfCAgIDE0ICstCiBpbmNsdWRlL2NyeXB0by9wb2x5dmFsLmggICAgICAgICAgICAg ICAgfCAgIDIyICsKIGluY2x1ZGUvdWFwaS9saW51eC9mc2NyeXB0LmggICAgICAgICAgICB8ICAg IDMgKy0KIDI1IGZpbGVzIGNoYW5nZWQsIDQzMjEgaW5zZXJ0aW9ucygrKSwgMTk4IGRlbGV0aW9u cygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGFyY2gvYXJtNjQvY3J5cHRvL3BvbHl2YWwtY2UtY29y ZS5TCiBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9jcnlwdG8vcG9seXZhbC1jZS1nbHVl LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBhcmNoL3g4Ni9jcnlwdG8vcG9seXZhbC1jbG11bG5pX2Fz bS5TCiBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC94ODYvY3J5cHRvL3BvbHl2YWwtY2xtdWxuaV9n bHVlLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBjcnlwdG8vaGN0cjIuYwogY3JlYXRlIG1vZGUgMTAw NjQ0IGNyeXB0by9wb2x5dmFsLWdlbmVyaWMuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGNyeXB0by94 Y3RyLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBpbmNsdWRlL2NyeXB0by9wb2x5dmFsLmgKCi0tIAoy LjM2LjAuNDY0LmdiOWM4YjQ2ZTk0LWdvb2cKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1h cm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcv bWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==