From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sifive.com header.i=@sifive.com header.b="nPlY+zb0" Received: from mail-pl1-x631.google.com (mail-pl1-x631.google.com [IPv6:2607:f8b0:4864:20::631]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2C94518A for ; Sun, 26 Nov 2023 23:07:26 -0800 (PST) Received: by mail-pl1-x631.google.com with SMTP id d9443c01a7336-1cf8b35a6dbso26422125ad.0 for ; Sun, 26 Nov 2023 23:07:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1701068845; x=1701673645; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=CtUiUXkF3kN/BXKzxp91tLi6KCR2x1T9PQI4Fk+ZakA=; b=nPlY+zb0tw7YGaJaMtvPpJkcLa5nMnjqj0ak+r8ipUxdKUdq4mxoiThCCfCdEVBskl AyZ2WLkBlqXCktEUjHm16kP5mQ2vipFlNvTgQG1gsW4s9iJfyzU0j4d5zDk5g8Z61vqL UYRG7J09/rd7jPvW+0tcNFCpirQDGPJ6oWcTPpy2hMMDjfs+rBBELjT4wTMyIbqkBV+l dvfPFde0ZITusi2nvcHRVovrwujeXfgRPcuZdF63d8lnK8SoF/oimRuUo0L9WhnQdHoi cobcknsJuumEuCPrjFFH767RP5YBEDjPv2NsaOhYgYPdX3oE36vnjuJJu8Rtj1Y9UWmP XJxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701068845; x=1701673645; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CtUiUXkF3kN/BXKzxp91tLi6KCR2x1T9PQI4Fk+ZakA=; b=BkAM5XRvQMDYg0AoF/3GtX7Okemnd1c6kG+pdrtiahYmWoUTmA8hjpUVFmm/4l3BnY UV7UGtNKo2sN7NYY9/zVMkqyh7eW+HLmUL5W1sSZ/Ktij2kNH2LVtn1wrRHWIqvA6mEI GQSDg5ueKFvQg/DQnHNJwHXC+moLOulTZOZC7OAhFeCeO9wDqMhsROgeat5eBWJ4ZSjX X3bBVFe0cbjZtBNzTBK4M8J6bBPekgFtd0S71TVCkrGDp4InWKcRtnylnDU6MweDhdmf EVos/Q2J8FFIiuacnK+nHEfyiqXdQ5ipzIufY9mqXnKb46ru97knWwALUn6vKfl8hSIv eEMA== X-Gm-Message-State: AOJu0YyK9bwngvxhf7ogew75GinKYbYihzZ8+P2frAkwp1GReYRIFzM9 6o9YJ4WqIsHSRo0PTZzHAsYcnQnUsDO/32AeTsSXWg== X-Google-Smtp-Source: AGHT+IFRltSyEt83zMIe016Zra5s1haP8WmUsC8LiFC12OgzYubxW56A1sWoR6JvaAeOcy6VtjPE/w== X-Received: by 2002:a17:902:d38d:b0:1cf:a4e8:d2a1 with SMTP id e13-20020a170902d38d00b001cfa4e8d2a1mr8131780pld.42.1701068845494; Sun, 26 Nov 2023 23:07:25 -0800 (PST) Received: from localhost.localdomain ([101.10.45.230]) by smtp.gmail.com with ESMTPSA id jh15-20020a170903328f00b001cfcd3a764esm1340134plb.77.2023.11.26.23.07.22 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sun, 26 Nov 2023 23:07:25 -0800 (PST) From: Jerry Shih To: paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, herbert@gondor.apana.org.au, davem@davemloft.net, conor.dooley@microchip.com, ebiggers@kernel.org, ardb@kernel.org Cc: heiko@sntech.de, phoebe.chen@sifive.com, hongrong.hsu@sifive.com, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-crypto@vger.kernel.org Subject: [PATCH v2 04/13] RISC-V: crypto: add Zvkned accelerated AES implementation Date: Mon, 27 Nov 2023 15:06:54 +0800 Message-Id: <20231127070703.1697-5-jerry.shih@sifive.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20231127070703.1697-1-jerry.shih@sifive.com> References: <20231127070703.1697-1-jerry.shih@sifive.com> Precedence: bulk X-Mailing-List: linux-crypto@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The AES implementation using the Zvkned vector crypto extension from OpenSSL(openssl/openssl#21923). Co-developed-by: Christoph Müllner Signed-off-by: Christoph Müllner Co-developed-by: Heiko Stuebner Signed-off-by: Heiko Stuebner Co-developed-by: Phoebe Chen Signed-off-by: Phoebe Chen Signed-off-by: Jerry Shih --- Changelog v2: - Do not turn on kconfig `AES_RISCV64` option by default. - Turn to use `crypto_aes_ctx` structure for aes key. - Use `Zvkned` extension for AES-128/256 key expanding. - Export riscv64_aes_* symbols for other modules. - Add `asmlinkage` qualifier for crypto asm function. - Reorder structure riscv64_aes_alg_zvkned members initialization in the order declared. --- arch/riscv/crypto/Kconfig | 11 + arch/riscv/crypto/Makefile | 11 + arch/riscv/crypto/aes-riscv64-glue.c | 151 ++++++ arch/riscv/crypto/aes-riscv64-glue.h | 18 + arch/riscv/crypto/aes-riscv64-zvkned.pl | 593 ++++++++++++++++++++++++ 5 files changed, 784 insertions(+) create mode 100644 arch/riscv/crypto/aes-riscv64-glue.c create mode 100644 arch/riscv/crypto/aes-riscv64-glue.h create mode 100644 arch/riscv/crypto/aes-riscv64-zvkned.pl diff --git a/arch/riscv/crypto/Kconfig b/arch/riscv/crypto/Kconfig index 10d60edc0110..65189d4d47b3 100644 --- a/arch/riscv/crypto/Kconfig +++ b/arch/riscv/crypto/Kconfig @@ -2,4 +2,15 @@ menu "Accelerated Cryptographic Algorithms for CPU (riscv)" +config CRYPTO_AES_RISCV64 + tristate "Ciphers: AES" + depends on 64BIT && RISCV_ISA_V + select CRYPTO_ALGAPI + select CRYPTO_LIB_AES + help + Block ciphers: AES cipher algorithms (FIPS-197) + + Architecture: riscv64 using: + - Zvkned vector crypto extension + endmenu diff --git a/arch/riscv/crypto/Makefile b/arch/riscv/crypto/Makefile index b3b6332c9f6d..90ca91d8df26 100644 --- a/arch/riscv/crypto/Makefile +++ b/arch/riscv/crypto/Makefile @@ -2,3 +2,14 @@ # # linux/arch/riscv/crypto/Makefile # + +obj-$(CONFIG_CRYPTO_AES_RISCV64) += aes-riscv64.o +aes-riscv64-y := aes-riscv64-glue.o aes-riscv64-zvkned.o + +quiet_cmd_perlasm = PERLASM $@ + cmd_perlasm = $(PERL) $(<) void $(@) + +$(obj)/aes-riscv64-zvkned.S: $(src)/aes-riscv64-zvkned.pl + $(call cmd,perlasm) + +clean-files += aes-riscv64-zvkned.S diff --git a/arch/riscv/crypto/aes-riscv64-glue.c b/arch/riscv/crypto/aes-riscv64-glue.c new file mode 100644 index 000000000000..091e368edb30 --- /dev/null +++ b/arch/riscv/crypto/aes-riscv64-glue.c @@ -0,0 +1,151 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Port of the OpenSSL AES implementation for RISC-V + * + * Copyright (C) 2023 VRULL GmbH + * Author: Heiko Stuebner + * + * Copyright (C) 2023 SiFive, Inc. + * Author: Jerry Shih + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "aes-riscv64-glue.h" + +/* aes cipher using zvkned vector crypto extension */ +asmlinkage int rv64i_zvkned_set_encrypt_key(const u8 *user_key, const int bytes, + const struct crypto_aes_ctx *key); +asmlinkage void rv64i_zvkned_encrypt(const u8 *in, u8 *out, + const struct crypto_aes_ctx *key); +asmlinkage void rv64i_zvkned_decrypt(const u8 *in, u8 *out, + const struct crypto_aes_ctx *key); + +int riscv64_aes_setkey(struct crypto_aes_ctx *ctx, const u8 *key, + unsigned int keylen) +{ + int ret; + + ret = aes_check_keylen(keylen); + if (ret < 0) + return -EINVAL; + + /* + * The RISC-V AES vector crypto key expanding doesn't support AES-192. + * Use the generic software key expanding for that case. + */ + if ((keylen == 16 || keylen == 32) && crypto_simd_usable()) { + /* + * All zvkned-based functions use encryption expanding keys for both + * encryption and decryption. + */ + kernel_vector_begin(); + rv64i_zvkned_set_encrypt_key(key, keylen, ctx); + kernel_vector_end(); + } else { + ret = aes_expandkey(ctx, key, keylen); + } + + return ret; +} +EXPORT_SYMBOL(riscv64_aes_setkey); + +void riscv64_aes_encrypt_zvkned(const struct crypto_aes_ctx *ctx, u8 *dst, + const u8 *src) +{ + if (crypto_simd_usable()) { + kernel_vector_begin(); + rv64i_zvkned_encrypt(src, dst, ctx); + kernel_vector_end(); + } else { + aes_encrypt(ctx, dst, src); + } +} +EXPORT_SYMBOL(riscv64_aes_encrypt_zvkned); + +void riscv64_aes_decrypt_zvkned(const struct crypto_aes_ctx *ctx, u8 *dst, + const u8 *src) +{ + if (crypto_simd_usable()) { + kernel_vector_begin(); + rv64i_zvkned_decrypt(src, dst, ctx); + kernel_vector_end(); + } else { + aes_decrypt(ctx, dst, src); + } +} +EXPORT_SYMBOL(riscv64_aes_decrypt_zvkned); + +static int aes_setkey(struct crypto_tfm *tfm, const u8 *key, + unsigned int keylen) +{ + struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm); + + return riscv64_aes_setkey(ctx, key, keylen); +} + +static void aes_encrypt_zvkned(struct crypto_tfm *tfm, u8 *dst, const u8 *src) +{ + const struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm); + + riscv64_aes_encrypt_zvkned(ctx, dst, src); +} + +static void aes_decrypt_zvkned(struct crypto_tfm *tfm, u8 *dst, const u8 *src) +{ + const struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm); + + riscv64_aes_decrypt_zvkned(ctx, dst, src); +} + +static struct crypto_alg riscv64_aes_alg_zvkned = { + .cra_flags = CRYPTO_ALG_TYPE_CIPHER, + .cra_blocksize = AES_BLOCK_SIZE, + .cra_ctxsize = sizeof(struct crypto_aes_ctx), + .cra_priority = 300, + .cra_name = "aes", + .cra_driver_name = "aes-riscv64-zvkned", + .cra_cipher = { + .cia_min_keysize = AES_MIN_KEY_SIZE, + .cia_max_keysize = AES_MAX_KEY_SIZE, + .cia_setkey = aes_setkey, + .cia_encrypt = aes_encrypt_zvkned, + .cia_decrypt = aes_decrypt_zvkned, + }, + .cra_module = THIS_MODULE, +}; + +static inline bool check_aes_ext(void) +{ + return riscv_isa_extension_available(NULL, ZVKNED) && + riscv_vector_vlen() >= 128; +} + +static int __init riscv64_aes_mod_init(void) +{ + if (check_aes_ext()) + return crypto_register_alg(&riscv64_aes_alg_zvkned); + + return -ENODEV; +} + +static void __exit riscv64_aes_mod_fini(void) +{ + crypto_unregister_alg(&riscv64_aes_alg_zvkned); +} + +module_init(riscv64_aes_mod_init); +module_exit(riscv64_aes_mod_fini); + +MODULE_DESCRIPTION("AES (RISC-V accelerated)"); +MODULE_AUTHOR("Heiko Stuebner "); +MODULE_LICENSE("GPL"); +MODULE_ALIAS_CRYPTO("aes"); diff --git a/arch/riscv/crypto/aes-riscv64-glue.h b/arch/riscv/crypto/aes-riscv64-glue.h new file mode 100644 index 000000000000..0416bbc4318e --- /dev/null +++ b/arch/riscv/crypto/aes-riscv64-glue.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef AES_RISCV64_GLUE_H +#define AES_RISCV64_GLUE_H + +#include +#include + +int riscv64_aes_setkey(struct crypto_aes_ctx *ctx, const u8 *key, + unsigned int keylen); + +void riscv64_aes_encrypt_zvkned(const struct crypto_aes_ctx *ctx, u8 *dst, + const u8 *src); + +void riscv64_aes_decrypt_zvkned(const struct crypto_aes_ctx *ctx, u8 *dst, + const u8 *src); + +#endif /* AES_RISCV64_GLUE_H */ diff --git a/arch/riscv/crypto/aes-riscv64-zvkned.pl b/arch/riscv/crypto/aes-riscv64-zvkned.pl new file mode 100644 index 000000000000..303e82d9f6f0 --- /dev/null +++ b/arch/riscv/crypto/aes-riscv64-zvkned.pl @@ -0,0 +1,593 @@ +#! /usr/bin/env perl +# SPDX-License-Identifier: Apache-2.0 OR BSD-2-Clause +# +# This file is dual-licensed, meaning that you can use it under your +# choice of either of the following two licenses: +# +# Copyright 2023 The OpenSSL Project Authors. All Rights Reserved. +# +# Licensed under the Apache License 2.0 (the "License"). You can obtain +# a copy in the file LICENSE in the source distribution or at +# https://www.openssl.org/source/license.html +# +# or +# +# Copyright (c) 2023, Christoph Müllner +# Copyright (c) 2023, Phoebe Chen +# Copyright (c) 2023, Jerry Shih +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# - RV64I +# - RISC-V Vector ('V') with VLEN >= 128 +# - RISC-V Vector AES block cipher extension ('Zvkned') + +use strict; +use warnings; + +use FindBin qw($Bin); +use lib "$Bin"; +use lib "$Bin/../../perlasm"; +use riscv; + +# $output is the last argument if it looks like a file (it has an extension) +# $flavour is the first argument if it doesn't look like a file +my $output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef; +my $flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef; + +$output and open STDOUT,">$output"; + +my $code=<<___; +.text +___ + +my ($V0, $V1, $V2, $V3, $V4, $V5, $V6, $V7, + $V8, $V9, $V10, $V11, $V12, $V13, $V14, $V15, + $V16, $V17, $V18, $V19, $V20, $V21, $V22, $V23, + $V24, $V25, $V26, $V27, $V28, $V29, $V30, $V31, +) = map("v$_",(0..31)); + +{ +################################################################################ +# int rv64i_zvkned_set_encrypt_key(const unsigned char *userKey, const int bytes, +# AES_KEY *key) +my ($UKEY, $BYTES, $KEYP) = ("a0", "a1", "a2"); +my ($T0) = ("t0"); + +$code .= <<___; +.p2align 3 +.globl rv64i_zvkned_set_encrypt_key +.type rv64i_zvkned_set_encrypt_key,\@function +rv64i_zvkned_set_encrypt_key: + beqz $UKEY, L_fail_m1 + beqz $KEYP, L_fail_m1 + + # Store the key length. + sw $BYTES, 480($KEYP) + + li $T0, 32 + beq $BYTES, $T0, L_set_key_256 + li $T0, 16 + beq $BYTES, $T0, L_set_key_128 + + j L_fail_m2 + +L_set_key_128: + @{[vsetivli "zero", 4, "e32", "m1", "ta", "ma"]} + + # Load the key + @{[vle32_v $V10, $UKEY]} + + # Generate keys for round 2-11 into registers v11-v20. + @{[vaeskf1_vi $V11, $V10, 1]} # v11 <- rk2 (w[ 4, 7]) + @{[vaeskf1_vi $V12, $V11, 2]} # v12 <- rk3 (w[ 8,11]) + @{[vaeskf1_vi $V13, $V12, 3]} # v13 <- rk4 (w[12,15]) + @{[vaeskf1_vi $V14, $V13, 4]} # v14 <- rk5 (w[16,19]) + @{[vaeskf1_vi $V15, $V14, 5]} # v15 <- rk6 (w[20,23]) + @{[vaeskf1_vi $V16, $V15, 6]} # v16 <- rk7 (w[24,27]) + @{[vaeskf1_vi $V17, $V16, 7]} # v17 <- rk8 (w[28,31]) + @{[vaeskf1_vi $V18, $V17, 8]} # v18 <- rk9 (w[32,35]) + @{[vaeskf1_vi $V19, $V18, 9]} # v19 <- rk10 (w[36,39]) + @{[vaeskf1_vi $V20, $V19, 10]} # v20 <- rk11 (w[40,43]) + + # Store the round keys + @{[vse32_v $V10, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V11, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V12, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V13, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V14, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V15, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V16, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V17, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V18, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V19, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V20, $KEYP]} + + li a0, 1 + ret + +L_set_key_256: + @{[vsetivli "zero", 4, "e32", "m1", "ta", "ma"]} + + # Load the key + @{[vle32_v $V10, $UKEY]} + addi $UKEY, $UKEY, 16 + @{[vle32_v $V11, $UKEY]} + + @{[vmv_v_v $V12, $V10]} + @{[vaeskf2_vi $V12, $V11, 2]} + @{[vmv_v_v $V13, $V11]} + @{[vaeskf2_vi $V13, $V12, 3]} + @{[vmv_v_v $V14, $V12]} + @{[vaeskf2_vi $V14, $V13, 4]} + @{[vmv_v_v $V15, $V13]} + @{[vaeskf2_vi $V15, $V14, 5]} + @{[vmv_v_v $V16, $V14]} + @{[vaeskf2_vi $V16, $V15, 6]} + @{[vmv_v_v $V17, $V15]} + @{[vaeskf2_vi $V17, $V16, 7]} + @{[vmv_v_v $V18, $V16]} + @{[vaeskf2_vi $V18, $V17, 8]} + @{[vmv_v_v $V19, $V17]} + @{[vaeskf2_vi $V19, $V18, 9]} + @{[vmv_v_v $V20, $V18]} + @{[vaeskf2_vi $V20, $V19, 10]} + @{[vmv_v_v $V21, $V19]} + @{[vaeskf2_vi $V21, $V20, 11]} + @{[vmv_v_v $V22, $V20]} + @{[vaeskf2_vi $V22, $V21, 12]} + @{[vmv_v_v $V23, $V21]} + @{[vaeskf2_vi $V23, $V22, 13]} + @{[vmv_v_v $V24, $V22]} + @{[vaeskf2_vi $V24, $V23, 14]} + + @{[vse32_v $V10, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V11, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V12, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V13, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V14, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V15, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V16, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V17, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V18, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V19, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V20, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V21, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V22, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V23, $KEYP]} + addi $KEYP, $KEYP, 16 + @{[vse32_v $V24, $KEYP]} + + li a0, 1 + ret +.size rv64i_zvkned_set_encrypt_key,.-rv64i_zvkned_set_encrypt_key +___ +} + +{ +################################################################################ +# void rv64i_zvkned_encrypt(const unsigned char *in, unsigned char *out, +# const AES_KEY *key); +my ($INP, $OUTP, $KEYP) = ("a0", "a1", "a2"); +my ($T0) = ("t0"); +my ($KEY_LEN) = ("a3"); + +$code .= <<___; +.p2align 3 +.globl rv64i_zvkned_encrypt +.type rv64i_zvkned_encrypt,\@function +rv64i_zvkned_encrypt: + # Load key length. + lwu $KEY_LEN, 480($KEYP) + + # Get proper routine for key length. + li $T0, 32 + beq $KEY_LEN, $T0, L_enc_256 + li $T0, 24 + beq $KEY_LEN, $T0, L_enc_192 + li $T0, 16 + beq $KEY_LEN, $T0, L_enc_128 + + j L_fail_m2 +.size rv64i_zvkned_encrypt,.-rv64i_zvkned_encrypt +___ + +$code .= <<___; +.p2align 3 +L_enc_128: + @{[vsetivli "zero", 4, "e32", "m1", "ta", "ma"]} + + @{[vle32_v $V1, $INP]} + + @{[vle32_v $V10, $KEYP]} + @{[vaesz_vs $V1, $V10]} # with round key w[ 0, 3] + addi $KEYP, $KEYP, 16 + @{[vle32_v $V11, $KEYP]} + @{[vaesem_vs $V1, $V11]} # with round key w[ 4, 7] + addi $KEYP, $KEYP, 16 + @{[vle32_v $V12, $KEYP]} + @{[vaesem_vs $V1, $V12]} # with round key w[ 8,11] + addi $KEYP, $KEYP, 16 + @{[vle32_v $V13, $KEYP]} + @{[vaesem_vs $V1, $V13]} # with round key w[12,15] + addi $KEYP, $KEYP, 16 + @{[vle32_v $V14, $KEYP]} + @{[vaesem_vs $V1, $V14]} # with round key w[16,19] + addi $KEYP, $KEYP, 16 + @{[vle32_v $V15, $KEYP]} + @{[vaesem_vs $V1, $V15]} # with round key w[20,23] + addi $KEYP, $KEYP, 16 + @{[vle32_v $V16, $KEYP]} + @{[vaesem_vs $V1, $V16]} # with round key w[24,27] + addi $KEYP, $KEYP, 16 + @{[vle32_v $V17, $KEYP]} + @{[vaesem_vs $V1, $V17]} # with round key w[28,31] + addi $KEYP, $KEYP, 16 + @{[vle32_v $V18, $KEYP]} + @{[vaesem_vs $V1, $V18]} # with round key w[32,35] + addi $KEYP, $KEYP, 16 + @{[vle32_v $V19, $KEYP]} + @{[vaesem_vs $V1, $V19]} # with round key w[36,39] + addi $KEYP, $KEYP, 16 + @{[vle32_v $V20, $KEYP]} + @{[vaesef_vs $V1, $V20]} # with round key w[40,43] + + @{[vse32_v $V1, $OUTP]} + + ret +.size L_enc_128,.-L_enc_128 +___ + +$code .= <<___; +.p2align 3 +L_enc_192: + @{[vsetivli "zero", 4, "e32", "m1", "ta", "ma"]} + + @{[vle32_v $V1, $INP]} + + @{[vle32_v $V10, $KEYP]} + @{[vaesz_vs $V1, $V10]} # with round key w[ 0, 3] + addi $KEYP, $KEYP, 16 + @{[vle32_v $V11, $KEYP]} + @{[vaesem_vs $V1, $V11]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V12, $KEYP]} + @{[vaesem_vs $V1, $V12]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V13, $KEYP]} + @{[vaesem_vs $V1, $V13]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V14, $KEYP]} + @{[vaesem_vs $V1, $V14]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V15, $KEYP]} + @{[vaesem_vs $V1, $V15]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V16, $KEYP]} + @{[vaesem_vs $V1, $V16]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V17, $KEYP]} + @{[vaesem_vs $V1, $V17]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V18, $KEYP]} + @{[vaesem_vs $V1, $V18]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V19, $KEYP]} + @{[vaesem_vs $V1, $V19]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V20, $KEYP]} + @{[vaesem_vs $V1, $V20]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V21, $KEYP]} + @{[vaesem_vs $V1, $V21]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V22, $KEYP]} + @{[vaesef_vs $V1, $V22]} + + @{[vse32_v $V1, $OUTP]} + ret +.size L_enc_192,.-L_enc_192 +___ + +$code .= <<___; +.p2align 3 +L_enc_256: + @{[vsetivli "zero", 4, "e32", "m1", "ta", "ma"]} + + @{[vle32_v $V1, $INP]} + + @{[vle32_v $V10, $KEYP]} + @{[vaesz_vs $V1, $V10]} # with round key w[ 0, 3] + addi $KEYP, $KEYP, 16 + @{[vle32_v $V11, $KEYP]} + @{[vaesem_vs $V1, $V11]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V12, $KEYP]} + @{[vaesem_vs $V1, $V12]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V13, $KEYP]} + @{[vaesem_vs $V1, $V13]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V14, $KEYP]} + @{[vaesem_vs $V1, $V14]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V15, $KEYP]} + @{[vaesem_vs $V1, $V15]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V16, $KEYP]} + @{[vaesem_vs $V1, $V16]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V17, $KEYP]} + @{[vaesem_vs $V1, $V17]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V18, $KEYP]} + @{[vaesem_vs $V1, $V18]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V19, $KEYP]} + @{[vaesem_vs $V1, $V19]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V20, $KEYP]} + @{[vaesem_vs $V1, $V20]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V21, $KEYP]} + @{[vaesem_vs $V1, $V21]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V22, $KEYP]} + @{[vaesem_vs $V1, $V22]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V23, $KEYP]} + @{[vaesem_vs $V1, $V23]} + addi $KEYP, $KEYP, 16 + @{[vle32_v $V24, $KEYP]} + @{[vaesef_vs $V1, $V24]} + + @{[vse32_v $V1, $OUTP]} + ret +.size L_enc_256,.-L_enc_256 +___ + +################################################################################ +# void rv64i_zvkned_decrypt(const unsigned char *in, unsigned char *out, +# const AES_KEY *key); +$code .= <<___; +.p2align 3 +.globl rv64i_zvkned_decrypt +.type rv64i_zvkned_decrypt,\@function +rv64i_zvkned_decrypt: + # Load key length. + lwu $KEY_LEN, 480($KEYP) + + # Get proper routine for key length. + li $T0, 32 + beq $KEY_LEN, $T0, L_dec_256 + li $T0, 24 + beq $KEY_LEN, $T0, L_dec_192 + li $T0, 16 + beq $KEY_LEN, $T0, L_dec_128 + + j L_fail_m2 +.size rv64i_zvkned_decrypt,.-rv64i_zvkned_decrypt +___ + +$code .= <<___; +.p2align 3 +L_dec_128: + @{[vsetivli "zero", 4, "e32", "m1", "ta", "ma"]} + + @{[vle32_v $V1, $INP]} + + addi $KEYP, $KEYP, 160 + @{[vle32_v $V20, $KEYP]} + @{[vaesz_vs $V1, $V20]} # with round key w[40,43] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V19, $KEYP]} + @{[vaesdm_vs $V1, $V19]} # with round key w[36,39] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V18, $KEYP]} + @{[vaesdm_vs $V1, $V18]} # with round key w[32,35] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V17, $KEYP]} + @{[vaesdm_vs $V1, $V17]} # with round key w[28,31] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V16, $KEYP]} + @{[vaesdm_vs $V1, $V16]} # with round key w[24,27] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V15, $KEYP]} + @{[vaesdm_vs $V1, $V15]} # with round key w[20,23] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V14, $KEYP]} + @{[vaesdm_vs $V1, $V14]} # with round key w[16,19] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V13, $KEYP]} + @{[vaesdm_vs $V1, $V13]} # with round key w[12,15] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V12, $KEYP]} + @{[vaesdm_vs $V1, $V12]} # with round key w[ 8,11] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V11, $KEYP]} + @{[vaesdm_vs $V1, $V11]} # with round key w[ 4, 7] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V10, $KEYP]} + @{[vaesdf_vs $V1, $V10]} # with round key w[ 0, 3] + + @{[vse32_v $V1, $OUTP]} + + ret +.size L_dec_128,.-L_dec_128 +___ + +$code .= <<___; +.p2align 3 +L_dec_192: + @{[vsetivli "zero", 4, "e32", "m1", "ta", "ma"]} + + @{[vle32_v $V1, $INP]} + + addi $KEYP, $KEYP, 192 + @{[vle32_v $V22, $KEYP]} + @{[vaesz_vs $V1, $V22]} # with round key w[48,51] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V21, $KEYP]} + @{[vaesdm_vs $V1, $V21]} # with round key w[44,47] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V20, $KEYP]} + @{[vaesdm_vs $V1, $V20]} # with round key w[40,43] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V19, $KEYP]} + @{[vaesdm_vs $V1, $V19]} # with round key w[36,39] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V18, $KEYP]} + @{[vaesdm_vs $V1, $V18]} # with round key w[32,35] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V17, $KEYP]} + @{[vaesdm_vs $V1, $V17]} # with round key w[28,31] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V16, $KEYP]} + @{[vaesdm_vs $V1, $V16]} # with round key w[24,27] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V15, $KEYP]} + @{[vaesdm_vs $V1, $V15]} # with round key w[20,23] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V14, $KEYP]} + @{[vaesdm_vs $V1, $V14]} # with round key w[16,19] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V13, $KEYP]} + @{[vaesdm_vs $V1, $V13]} # with round key w[12,15] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V12, $KEYP]} + @{[vaesdm_vs $V1, $V12]} # with round key w[ 8,11] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V11, $KEYP]} + @{[vaesdm_vs $V1, $V11]} # with round key w[ 4, 7] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V10, $KEYP]} + @{[vaesdf_vs $V1, $V10]} # with round key w[ 0, 3] + + @{[vse32_v $V1, $OUTP]} + + ret +.size L_dec_192,.-L_dec_192 +___ + +$code .= <<___; +.p2align 3 +L_dec_256: + @{[vsetivli "zero", 4, "e32", "m1", "ta", "ma"]} + + @{[vle32_v $V1, $INP]} + + addi $KEYP, $KEYP, 224 + @{[vle32_v $V24, $KEYP]} + @{[vaesz_vs $V1, $V24]} # with round key w[56,59] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V23, $KEYP]} + @{[vaesdm_vs $V1, $V23]} # with round key w[52,55] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V22, $KEYP]} + @{[vaesdm_vs $V1, $V22]} # with round key w[48,51] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V21, $KEYP]} + @{[vaesdm_vs $V1, $V21]} # with round key w[44,47] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V20, $KEYP]} + @{[vaesdm_vs $V1, $V20]} # with round key w[40,43] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V19, $KEYP]} + @{[vaesdm_vs $V1, $V19]} # with round key w[36,39] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V18, $KEYP]} + @{[vaesdm_vs $V1, $V18]} # with round key w[32,35] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V17, $KEYP]} + @{[vaesdm_vs $V1, $V17]} # with round key w[28,31] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V16, $KEYP]} + @{[vaesdm_vs $V1, $V16]} # with round key w[24,27] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V15, $KEYP]} + @{[vaesdm_vs $V1, $V15]} # with round key w[20,23] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V14, $KEYP]} + @{[vaesdm_vs $V1, $V14]} # with round key w[16,19] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V13, $KEYP]} + @{[vaesdm_vs $V1, $V13]} # with round key w[12,15] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V12, $KEYP]} + @{[vaesdm_vs $V1, $V12]} # with round key w[ 8,11] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V11, $KEYP]} + @{[vaesdm_vs $V1, $V11]} # with round key w[ 4, 7] + addi $KEYP, $KEYP, -16 + @{[vle32_v $V10, $KEYP]} + @{[vaesdf_vs $V1, $V10]} # with round key w[ 0, 3] + + @{[vse32_v $V1, $OUTP]} + + ret +.size L_dec_256,.-L_dec_256 +___ +} + +$code .= <<___; +L_fail_m1: + li a0, -1 + ret +.size L_fail_m1,.-L_fail_m1 + +L_fail_m2: + li a0, -2 + ret +.size L_fail_m2,.-L_fail_m2 + +L_end: + ret +.size L_end,.-L_end +___ + +print $code; + +close STDOUT or die "error closing STDOUT: $!"; -- 2.28.0 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 68A37C0755A for ; Mon, 27 Nov 2023 07:07:41 +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:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=QDx+kUChaapPPEL1aPYDslmcGzF1zPQWJ4ZvF32D63k=; b=TwQCUN+PQMuTU4 5qxSUwQZu4irfrglgwGww68EQJyGT0R3dlLoDRwgPYaFT4meKC9rzSKBK7dScmtmryHzcLzuV9f1x Wrzgs3dy/cf3cHg9qUV6AyEZWShkeQBj+wCGJs6vifddERIk0mDg5Z8jKRPmZ6KKLJCVT4Vinr0+R lCULn2vSScqubjrr0WyehuhnKtDGwJEmydnXU22tdVXkVJi2DB5scSERHwKTfSU6T/4UfHqMUjO+r YfHP2/zorNAVbm5Pfry+pzy5hR4DtbZrMoQONMKyZZ3+xe6Wy8H4vhkMAp+bR9rRb6bFEoS1ZL0KI iJzjB/7ZO1971bPrKY2A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1r7ViR-001esS-1Z; Mon, 27 Nov 2023 07:07:35 +0000 Received: from mail-pl1-x62a.google.com ([2607:f8b0:4864:20::62a]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1r7ViK-001epp-0r for linux-riscv@lists.infradead.org; Mon, 27 Nov 2023 07:07:32 +0000 Received: by mail-pl1-x62a.google.com with SMTP id d9443c01a7336-1ce28faa92dso28037585ad.2 for ; Sun, 26 Nov 2023 23:07:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1701068845; x=1701673645; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=CtUiUXkF3kN/BXKzxp91tLi6KCR2x1T9PQI4Fk+ZakA=; b=Jt89Vvwx1ROdi4wP0GeKwlpKfBitir6tEtR6625iKJfattpavKv+Qi4Or6tLfElwqR XFKuvZsoaZLri2iZMHre30KpLv1Ot3jFJrUTIQyUb8lbjujCvQi8YOmnxb23H31d+Jki 4UEMt+UrLAnBzVg68fWpJE1Rg4jnFMgLWJr4ay7Yq2ETllzsLBX0ZMbzsHBLvB3l6IMF htX+JM1dRkWd8PSjjngfy8BbT9B51JPGE97Gd/Ve+k/SUUQzwlTsrcuYtDlQylHKxayA 1U0N4tji6icQc2jxDec+MwC9nfhzkZckpdlrcmDgnmX1uw7XCVfpq+G23NVEqs4evS1H g+EA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701068845; x=1701673645; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CtUiUXkF3kN/BXKzxp91tLi6KCR2x1T9PQI4Fk+ZakA=; b=ZUsTMZxAu5rTmkOgHlZZIKjUQGb7kFNHyiR7ClzAkgor5ydDPyWYvIwwrRq4pO14AN bcwYudMw/yce4NYd0rOQpT6Y7BOjZMtsxOWCE9srHQB1RIhKPHxTZGULA3ai178lwRZ4 5VuyPtoglohVAxnIGhg30Bw7iFWcUuDuuT+1bwxA9k1GoQccNefpArCVfBOXO9BbACy6 2yNtcFPfl+5rmVvz7Ub95oXT+uecslVr2wSbK6WdPxb3Zevo8qiYRVLj6oJkLpgP5le2 S3pIzyXBxsyTDN3V1Ib1mAn5A49mvtZuRoVNmBIjElIaDaUwVr8YFZ1DS0ZOr84MjsQK Z5EQ== X-Gm-Message-State: AOJu0YwMgwc9rCu1TIH09J1Hdn8lnJ2Po12NVCcxxTOKK6spp4q7PYMO CN4KFobW+fFndnpGneqdkKMW0A== X-Google-Smtp-Source: AGHT+IFRltSyEt83zMIe016Zra5s1haP8WmUsC8LiFC12OgzYubxW56A1sWoR6JvaAeOcy6VtjPE/w== X-Received: by 2002:a17:902:d38d:b0:1cf:a4e8:d2a1 with SMTP id e13-20020a170902d38d00b001cfa4e8d2a1mr8131780pld.42.1701068845494; Sun, 26 Nov 2023 23:07:25 -0800 (PST) Received: from localhost.localdomain ([101.10.45.230]) by smtp.gmail.com with ESMTPSA id jh15-20020a170903328f00b001cfcd3a764esm1340134plb.77.2023.11.26.23.07.22 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sun, 26 Nov 2023 23:07:25 -0800 (PST) From: Jerry Shih To: paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, herbert@gondor.apana.org.au, davem@davemloft.net, conor.dooley@microchip.com, ebiggers@kernel.org, ardb@kernel.org Cc: heiko@sntech.de, phoebe.chen@sifive.com, hongrong.hsu@sifive.com, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-crypto@vger.kernel.org Subject: [PATCH v2 04/13] RISC-V: crypto: add Zvkned accelerated AES implementation Date: Mon, 27 Nov 2023 15:06:54 +0800 Message-Id: <20231127070703.1697-5-jerry.shih@sifive.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20231127070703.1697-1-jerry.shih@sifive.com> References: <20231127070703.1697-1-jerry.shih@sifive.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231126_230728_731939_7DAF523E X-CRM114-Status: GOOD ( 28.53 ) X-BeenThere: linux-riscv@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-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org VGhlIEFFUyBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgWnZrbmVkIHZlY3RvciBjcnlwdG8gZXh0 ZW5zaW9uIGZyb20KT3BlblNTTChvcGVuc3NsL29wZW5zc2wjMjE5MjMpLgoKQ28tZGV2ZWxvcGVk LWJ5OiBDaHJpc3RvcGggTcO8bGxuZXIgPGNocmlzdG9waC5tdWVsbG5lckB2cnVsbC5ldT4KU2ln bmVkLW9mZi1ieTogQ2hyaXN0b3BoIE3DvGxsbmVyIDxjaHJpc3RvcGgubXVlbGxuZXJAdnJ1bGwu ZXU+CkNvLWRldmVsb3BlZC1ieTogSGVpa28gU3R1ZWJuZXIgPGhlaWtvLnN0dWVibmVyQHZydWxs LmV1PgpTaWduZWQtb2ZmLWJ5OiBIZWlrbyBTdHVlYm5lciA8aGVpa28uc3R1ZWJuZXJAdnJ1bGwu ZXU+CkNvLWRldmVsb3BlZC1ieTogUGhvZWJlIENoZW4gPHBob2ViZS5jaGVuQHNpZml2ZS5jb20+ ClNpZ25lZC1vZmYtYnk6IFBob2ViZSBDaGVuIDxwaG9lYmUuY2hlbkBzaWZpdmUuY29tPgpTaWdu ZWQtb2ZmLWJ5OiBKZXJyeSBTaGloIDxqZXJyeS5zaGloQHNpZml2ZS5jb20+Ci0tLQpDaGFuZ2Vs b2cgdjI6CiAtIERvIG5vdCB0dXJuIG9uIGtjb25maWcgYEFFU19SSVNDVjY0YCBvcHRpb24gYnkg ZGVmYXVsdC4KIC0gVHVybiB0byB1c2UgYGNyeXB0b19hZXNfY3R4YCBzdHJ1Y3R1cmUgZm9yIGFl cyBrZXkuCiAtIFVzZSBgWnZrbmVkYCBleHRlbnNpb24gZm9yIEFFUy0xMjgvMjU2IGtleSBleHBh bmRpbmcuCiAtIEV4cG9ydCByaXNjdjY0X2Flc18qIHN5bWJvbHMgZm9yIG90aGVyIG1vZHVsZXMu CiAtIEFkZCBgYXNtbGlua2FnZWAgcXVhbGlmaWVyIGZvciBjcnlwdG8gYXNtIGZ1bmN0aW9uLgog LSBSZW9yZGVyIHN0cnVjdHVyZSByaXNjdjY0X2Flc19hbGdfenZrbmVkIG1lbWJlcnMgaW5pdGlh bGl6YXRpb24gaW4KICAgdGhlIG9yZGVyIGRlY2xhcmVkLgotLS0KIGFyY2gvcmlzY3YvY3J5cHRv L0tjb25maWcgICAgICAgICAgICAgICB8ICAxMSArCiBhcmNoL3Jpc2N2L2NyeXB0by9NYWtlZmls ZSAgICAgICAgICAgICAgfCAgMTEgKwogYXJjaC9yaXNjdi9jcnlwdG8vYWVzLXJpc2N2NjQtZ2x1 ZS5jICAgIHwgMTUxICsrKysrKwogYXJjaC9yaXNjdi9jcnlwdG8vYWVzLXJpc2N2NjQtZ2x1ZS5o ICAgIHwgIDE4ICsKIGFyY2gvcmlzY3YvY3J5cHRvL2Flcy1yaXNjdjY0LXp2a25lZC5wbCB8IDU5 MyArKysrKysrKysrKysrKysrKysrKysrKysKIDUgZmlsZXMgY2hhbmdlZCwgNzg0IGluc2VydGlv bnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBhcmNoL3Jpc2N2L2NyeXB0by9hZXMtcmlzY3Y2NC1n bHVlLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBhcmNoL3Jpc2N2L2NyeXB0by9hZXMtcmlzY3Y2NC1n bHVlLmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBhcmNoL3Jpc2N2L2NyeXB0by9hZXMtcmlzY3Y2NC16 dmtuZWQucGwKCmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2NyeXB0by9LY29uZmlnIGIvYXJjaC9y aXNjdi9jcnlwdG8vS2NvbmZpZwppbmRleCAxMGQ2MGVkYzAxMTAuLjY1MTg5ZDRkNDdiMyAxMDA2 NDQKLS0tIGEvYXJjaC9yaXNjdi9jcnlwdG8vS2NvbmZpZworKysgYi9hcmNoL3Jpc2N2L2NyeXB0 by9LY29uZmlnCkBAIC0yLDQgKzIsMTUgQEAKIAogbWVudSAiQWNjZWxlcmF0ZWQgQ3J5cHRvZ3Jh cGhpYyBBbGdvcml0aG1zIGZvciBDUFUgKHJpc2N2KSIKIAorY29uZmlnIENSWVBUT19BRVNfUklT Q1Y2NAorCXRyaXN0YXRlICJDaXBoZXJzOiBBRVMiCisJZGVwZW5kcyBvbiA2NEJJVCAmJiBSSVND Vl9JU0FfVgorCXNlbGVjdCBDUllQVE9fQUxHQVBJCisJc2VsZWN0IENSWVBUT19MSUJfQUVTCisJ aGVscAorCSAgQmxvY2sgY2lwaGVyczogQUVTIGNpcGhlciBhbGdvcml0aG1zIChGSVBTLTE5NykK KworCSAgQXJjaGl0ZWN0dXJlOiByaXNjdjY0IHVzaW5nOgorCSAgLSBadmtuZWQgdmVjdG9yIGNy eXB0byBleHRlbnNpb24KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9jcnlwdG8v TWFrZWZpbGUgYi9hcmNoL3Jpc2N2L2NyeXB0by9NYWtlZmlsZQppbmRleCBiM2I2MzMyYzlmNmQu LjkwY2E5MWQ4ZGYyNiAxMDA2NDQKLS0tIGEvYXJjaC9yaXNjdi9jcnlwdG8vTWFrZWZpbGUKKysr IGIvYXJjaC9yaXNjdi9jcnlwdG8vTWFrZWZpbGUKQEAgLTIsMyArMiwxNCBAQAogIwogIyBsaW51 eC9hcmNoL3Jpc2N2L2NyeXB0by9NYWtlZmlsZQogIworCitvYmotJChDT05GSUdfQ1JZUFRPX0FF U19SSVNDVjY0KSArPSBhZXMtcmlzY3Y2NC5vCithZXMtcmlzY3Y2NC15IDo9IGFlcy1yaXNjdjY0 LWdsdWUubyBhZXMtcmlzY3Y2NC16dmtuZWQubworCitxdWlldF9jbWRfcGVybGFzbSA9IFBFUkxB U00gJEAKKyAgICAgIGNtZF9wZXJsYXNtID0gJChQRVJMKSAkKDwpIHZvaWQgJChAKQorCiskKG9i aikvYWVzLXJpc2N2NjQtenZrbmVkLlM6ICQoc3JjKS9hZXMtcmlzY3Y2NC16dmtuZWQucGwKKwkk KGNhbGwgY21kLHBlcmxhc20pCisKK2NsZWFuLWZpbGVzICs9IGFlcy1yaXNjdjY0LXp2a25lZC5T CmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2NyeXB0by9hZXMtcmlzY3Y2NC1nbHVlLmMgYi9hcmNo L3Jpc2N2L2NyeXB0by9hZXMtcmlzY3Y2NC1nbHVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMDAwLi4wOTFlMzY4ZWRiMzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Jp c2N2L2NyeXB0by9hZXMtcmlzY3Y2NC1nbHVlLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8vIFNQRFgt TGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKKy8qCisgKiBQb3J0IG9mIHRoZSBPcGVu U1NMIEFFUyBpbXBsZW1lbnRhdGlvbiBmb3IgUklTQy1WCisgKgorICogQ29weXJpZ2h0IChDKSAy MDIzIFZSVUxMIEdtYkgKKyAqIEF1dGhvcjogSGVpa28gU3R1ZWJuZXIgPGhlaWtvLnN0dWVibmVy QHZydWxsLmV1PgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBTaUZpdmUsIEluYy4KKyAqIEF1 dGhvcjogSmVycnkgU2hpaCA8amVycnkuc2hpaEBzaWZpdmUuY29tPgorICovCisKKyNpbmNsdWRl IDxhc20vc2ltZC5oPgorI2luY2x1ZGUgPGFzbS92ZWN0b3IuaD4KKyNpbmNsdWRlIDxjcnlwdG8v YWVzLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2NpcGhlci5oPgorI2luY2x1ZGUgPGNy eXB0by9pbnRlcm5hbC9zaW1kLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVk ZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUg PGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJhZXMtcmlzY3Y2NC1nbHVlLmgiCisKKy8qIGFl cyBjaXBoZXIgdXNpbmcgenZrbmVkIHZlY3RvciBjcnlwdG8gZXh0ZW5zaW9uICovCithc21saW5r YWdlIGludCBydjY0aV96dmtuZWRfc2V0X2VuY3J5cHRfa2V5KGNvbnN0IHU4ICp1c2VyX2tleSwg Y29uc3QgaW50IGJ5dGVzLAorCQkJCQkgICAgY29uc3Qgc3RydWN0IGNyeXB0b19hZXNfY3R4ICpr ZXkpOworYXNtbGlua2FnZSB2b2lkIHJ2NjRpX3p2a25lZF9lbmNyeXB0KGNvbnN0IHU4ICppbiwg dTggKm91dCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBjcnlwdG9fYWVzX2N0eCAqa2V5KTsKK2Fz bWxpbmthZ2Ugdm9pZCBydjY0aV96dmtuZWRfZGVjcnlwdChjb25zdCB1OCAqaW4sIHU4ICpvdXQs CisJCQkJICAgICBjb25zdCBzdHJ1Y3QgY3J5cHRvX2Flc19jdHggKmtleSk7CisKK2ludCByaXNj djY0X2Flc19zZXRrZXkoc3RydWN0IGNyeXB0b19hZXNfY3R4ICpjdHgsIGNvbnN0IHU4ICprZXks CisJCSAgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCWludCByZXQ7CisKKwlyZXQgPSBh ZXNfY2hlY2tfa2V5bGVuKGtleWxlbik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRUlOVkFM OworCisJLyoKKwkgKiBUaGUgUklTQy1WIEFFUyB2ZWN0b3IgY3J5cHRvIGtleSBleHBhbmRpbmcg ZG9lc24ndCBzdXBwb3J0IEFFUy0xOTIuCisJICogVXNlIHRoZSBnZW5lcmljIHNvZnR3YXJlIGtl eSBleHBhbmRpbmcgZm9yIHRoYXQgY2FzZS4KKwkgKi8KKwlpZiAoKGtleWxlbiA9PSAxNiB8fCBr ZXlsZW4gPT0gMzIpICYmIGNyeXB0b19zaW1kX3VzYWJsZSgpKSB7CisJCS8qCisJCSAqIEFsbCB6 dmtuZWQtYmFzZWQgZnVuY3Rpb25zIHVzZSBlbmNyeXB0aW9uIGV4cGFuZGluZyBrZXlzIGZvciBi b3RoCisJCSAqIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24uCisJCSAqLworCQlrZXJuZWxfdmVj dG9yX2JlZ2luKCk7CisJCXJ2NjRpX3p2a25lZF9zZXRfZW5jcnlwdF9rZXkoa2V5LCBrZXlsZW4s IGN0eCk7CisJCWtlcm5lbF92ZWN0b3JfZW5kKCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gYWVzX2V4 cGFuZGtleShjdHgsIGtleSwga2V5bGVuKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JU X1NZTUJPTChyaXNjdjY0X2Flc19zZXRrZXkpOworCit2b2lkIHJpc2N2NjRfYWVzX2VuY3J5cHRf enZrbmVkKGNvbnN0IHN0cnVjdCBjcnlwdG9fYWVzX2N0eCAqY3R4LCB1OCAqZHN0LAorCQkJCWNv bnN0IHU4ICpzcmMpCit7CisJaWYgKGNyeXB0b19zaW1kX3VzYWJsZSgpKSB7CisJCWtlcm5lbF92 ZWN0b3JfYmVnaW4oKTsKKwkJcnY2NGlfenZrbmVkX2VuY3J5cHQoc3JjLCBkc3QsIGN0eCk7CisJ CWtlcm5lbF92ZWN0b3JfZW5kKCk7CisJfSBlbHNlIHsKKwkJYWVzX2VuY3J5cHQoY3R4LCBkc3Qs IHNyYyk7CisJfQorfQorRVhQT1JUX1NZTUJPTChyaXNjdjY0X2Flc19lbmNyeXB0X3p2a25lZCk7 CisKK3ZvaWQgcmlzY3Y2NF9hZXNfZGVjcnlwdF96dmtuZWQoY29uc3Qgc3RydWN0IGNyeXB0b19h ZXNfY3R4ICpjdHgsIHU4ICpkc3QsCisJCQkJY29uc3QgdTggKnNyYykKK3sKKwlpZiAoY3J5cHRv X3NpbWRfdXNhYmxlKCkpIHsKKwkJa2VybmVsX3ZlY3Rvcl9iZWdpbigpOworCQlydjY0aV96dmtu ZWRfZGVjcnlwdChzcmMsIGRzdCwgY3R4KTsKKwkJa2VybmVsX3ZlY3Rvcl9lbmQoKTsKKwl9IGVs c2UgeworCQlhZXNfZGVjcnlwdChjdHgsIGRzdCwgc3JjKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9M KHJpc2N2NjRfYWVzX2RlY3J5cHRfenZrbmVkKTsKKworc3RhdGljIGludCBhZXNfc2V0a2V5KHN0 cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksCisJCSAgICAgIHVuc2lnbmVkIGlu dCBrZXlsZW4pCit7CisJc3RydWN0IGNyeXB0b19hZXNfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0 eCh0Zm0pOworCisJcmV0dXJuIHJpc2N2NjRfYWVzX3NldGtleShjdHgsIGtleSwga2V5bGVuKTsK K30KKworc3RhdGljIHZvaWQgYWVzX2VuY3J5cHRfenZrbmVkKHN0cnVjdCBjcnlwdG9fdGZtICp0 Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCit7CisJY29uc3Qgc3RydWN0IGNyeXB0b19hZXNf Y3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCisJcmlzY3Y2NF9hZXNfZW5jcnlwdF96 dmtuZWQoY3R4LCBkc3QsIHNyYyk7Cit9CisKK3N0YXRpYyB2b2lkIGFlc19kZWNyeXB0X3p2a25l ZChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQoreworCWNv bnN0IHN0cnVjdCBjcnlwdG9fYWVzX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwor CXJpc2N2NjRfYWVzX2RlY3J5cHRfenZrbmVkKGN0eCwgZHN0LCBzcmMpOworfQorCitzdGF0aWMg c3RydWN0IGNyeXB0b19hbGcgcmlzY3Y2NF9hZXNfYWxnX3p2a25lZCA9IHsKKwkuY3JhX2ZsYWdz ID0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKKwkuY3JhX2Jsb2Nrc2l6ZSA9IEFFU19CTE9DS19T SVpFLAorCS5jcmFfY3R4c2l6ZSA9IHNpemVvZihzdHJ1Y3QgY3J5cHRvX2Flc19jdHgpLAorCS5j cmFfcHJpb3JpdHkgPSAzMDAsCisJLmNyYV9uYW1lID0gImFlcyIsCisJLmNyYV9kcml2ZXJfbmFt ZSA9ICJhZXMtcmlzY3Y2NC16dmtuZWQiLAorCS5jcmFfY2lwaGVyID0geworCQkuY2lhX21pbl9r ZXlzaXplID0gQUVTX01JTl9LRVlfU0laRSwKKwkJLmNpYV9tYXhfa2V5c2l6ZSA9IEFFU19NQVhf S0VZX1NJWkUsCisJCS5jaWFfc2V0a2V5ID0gYWVzX3NldGtleSwKKwkJLmNpYV9lbmNyeXB0ID0g YWVzX2VuY3J5cHRfenZrbmVkLAorCQkuY2lhX2RlY3J5cHQgPSBhZXNfZGVjcnlwdF96dmtuZWQs CisJfSwKKwkuY3JhX21vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGlubGluZSBi b29sIGNoZWNrX2Flc19leHQodm9pZCkKK3sKKwlyZXR1cm4gcmlzY3ZfaXNhX2V4dGVuc2lvbl9h dmFpbGFibGUoTlVMTCwgWlZLTkVEKSAmJgorCSAgICAgICByaXNjdl92ZWN0b3JfdmxlbigpID49 IDEyODsKK30KKworc3RhdGljIGludCBfX2luaXQgcmlzY3Y2NF9hZXNfbW9kX2luaXQodm9pZCkK K3sKKwlpZiAoY2hlY2tfYWVzX2V4dCgpKQorCQlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX2FsZygm cmlzY3Y2NF9hZXNfYWxnX3p2a25lZCk7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGlj IHZvaWQgX19leGl0IHJpc2N2NjRfYWVzX21vZF9maW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVn aXN0ZXJfYWxnKCZyaXNjdjY0X2Flc19hbGdfenZrbmVkKTsKK30KKworbW9kdWxlX2luaXQocmlz Y3Y2NF9hZXNfbW9kX2luaXQpOworbW9kdWxlX2V4aXQocmlzY3Y2NF9hZXNfbW9kX2ZpbmkpOwor CitNT0RVTEVfREVTQ1JJUFRJT04oIkFFUyAoUklTQy1WIGFjY2VsZXJhdGVkKSIpOworTU9EVUxF X0FVVEhPUigiSGVpa28gU3R1ZWJuZXIgPGhlaWtvLnN0dWVibmVyQHZydWxsLmV1PiIpOworTU9E VUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX0NSWVBUTygiYWVzIik7CmRpZmYgLS1n aXQgYS9hcmNoL3Jpc2N2L2NyeXB0by9hZXMtcmlzY3Y2NC1nbHVlLmggYi9hcmNoL3Jpc2N2L2Ny eXB0by9hZXMtcmlzY3Y2NC1nbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMDAwLi4wNDE2YmJjNDMxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Jpc2N2L2NyeXB0 by9hZXMtcmlzY3Y2NC1nbHVlLmgKQEAgLTAsMCArMSwxOCBAQAorLyogU1BEWC1MaWNlbnNlLUlk ZW50aWZpZXI6IEdQTC0yLjAgKi8KKworI2lmbmRlZiBBRVNfUklTQ1Y2NF9HTFVFX0gKKyNkZWZp bmUgQUVTX1JJU0NWNjRfR0xVRV9ICisKKyNpbmNsdWRlIDxjcnlwdG8vYWVzLmg+CisjaW5jbHVk ZSA8bGludXgvdHlwZXMuaD4KKworaW50IHJpc2N2NjRfYWVzX3NldGtleShzdHJ1Y3QgY3J5cHRv X2Flc19jdHggKmN0eCwgY29uc3QgdTggKmtleSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBrZXls ZW4pOworCit2b2lkIHJpc2N2NjRfYWVzX2VuY3J5cHRfenZrbmVkKGNvbnN0IHN0cnVjdCBjcnlw dG9fYWVzX2N0eCAqY3R4LCB1OCAqZHN0LAorCQkJCWNvbnN0IHU4ICpzcmMpOworCit2b2lkIHJp c2N2NjRfYWVzX2RlY3J5cHRfenZrbmVkKGNvbnN0IHN0cnVjdCBjcnlwdG9fYWVzX2N0eCAqY3R4 LCB1OCAqZHN0LAorCQkJCWNvbnN0IHU4ICpzcmMpOworCisjZW5kaWYgLyogQUVTX1JJU0NWNjRf R0xVRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2NyeXB0by9hZXMtcmlzY3Y2NC16dmtu ZWQucGwgYi9hcmNoL3Jpc2N2L2NyeXB0by9hZXMtcmlzY3Y2NC16dmtuZWQucGwKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi4zMDNlODJkOWY2ZjAKLS0tIC9kZXYvbnVs bAorKysgYi9hcmNoL3Jpc2N2L2NyeXB0by9hZXMtcmlzY3Y2NC16dmtuZWQucGwKQEAgLTAsMCAr MSw1OTMgQEAKKyMhIC91c3IvYmluL2VudiBwZXJsCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBBcGFjaGUtMi4wIE9SIEJTRC0yLUNsYXVzZQorIworIyBUaGlzIGZpbGUgaXMgZHVhbC1saWNl bnNlZCwgbWVhbmluZyB0aGF0IHlvdSBjYW4gdXNlIGl0IHVuZGVyIHlvdXIKKyMgY2hvaWNlIG9m IGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoKKyMKKyMgQ29weXJpZ2h0IDIw MjMgVGhlIE9wZW5TU0wgUHJvamVjdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIwor IyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgMi4wICh0aGUgIkxpY2Vuc2UiKS4g WW91IGNhbiBvYnRhaW4KKyMgYSBjb3B5IGluIHRoZSBmaWxlIExJQ0VOU0UgaW4gdGhlIHNvdXJj ZSBkaXN0cmlidXRpb24gb3IgYXQKKyMgaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvc291cmNlL2xp Y2Vuc2UuaHRtbAorIworIyBvcgorIworIyBDb3B5cmlnaHQgKGMpIDIwMjMsIENocmlzdG9waCBN w7xsbG5lciA8Y2hyaXN0b3BoLm11ZWxsbmVyQHZydWxsLmV1PgorIyBDb3B5cmlnaHQgKGMpIDIw MjMsIFBob2ViZSBDaGVuIDxwaG9lYmUuY2hlbkBzaWZpdmUuY29tPgorIyBDb3B5cmlnaHQgKGMp IDIwMjMsIEplcnJ5IFNoaWggPGplcnJ5LnNoaWhAc2lmaXZlLmNvbT4KKyMgQWxsIHJpZ2h0cyBy ZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBS ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly aWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93 aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0 IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9j dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry aWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hU IEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJ TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUg SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMg QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRI RSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJP Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisj IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT RUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNP RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF LgorCisjIC0gUlY2NEkKKyMgLSBSSVNDLVYgVmVjdG9yICgnVicpIHdpdGggVkxFTiA+PSAxMjgK KyMgLSBSSVNDLVYgVmVjdG9yIEFFUyBibG9jayBjaXBoZXIgZXh0ZW5zaW9uICgnWnZrbmVkJykK KwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZpbmRCaW4gcXcoJEJpbik7Cit1 c2UgbGliICIkQmluIjsKK3VzZSBsaWIgIiRCaW4vLi4vLi4vcGVybGFzbSI7Cit1c2UgcmlzY3Y7 CisKKyMgJG91dHB1dCBpcyB0aGUgbGFzdCBhcmd1bWVudCBpZiBpdCBsb29rcyBsaWtlIGEgZmls ZSAoaXQgaGFzIGFuIGV4dGVuc2lvbikKKyMgJGZsYXZvdXIgaXMgdGhlIGZpcnN0IGFyZ3VtZW50 IGlmIGl0IGRvZXNuJ3QgbG9vayBsaWtlIGEgZmlsZQorbXkgJG91dHB1dCA9ICQjQVJHViA+PSAw ICYmICRBUkdWWyQjQVJHVl0gPX4gbXxcLlx3KyR8ID8gcG9wIDogdW5kZWY7CitteSAkZmxhdm91 ciA9ICQjQVJHViA+PSAwICYmICRBUkdWWzBdICF+IG18XC58ID8gc2hpZnQgOiB1bmRlZjsKKwor JG91dHB1dCBhbmQgb3BlbiBTVERPVVQsIj4kb3V0cHV0IjsKKworbXkgJGNvZGU9PDxfX187Cisu dGV4dAorX19fCisKK215ICgkVjAsICRWMSwgJFYyLCAkVjMsICRWNCwgJFY1LCAkVjYsICRWNywK KyAgICAkVjgsICRWOSwgJFYxMCwgJFYxMSwgJFYxMiwgJFYxMywgJFYxNCwgJFYxNSwKKyAgICAk VjE2LCAkVjE3LCAkVjE4LCAkVjE5LCAkVjIwLCAkVjIxLCAkVjIyLCAkVjIzLAorICAgICRWMjQs ICRWMjUsICRWMjYsICRWMjcsICRWMjgsICRWMjksICRWMzAsICRWMzEsCispID0gbWFwKCJ2JF8i LCgwLi4zMSkpOworCit7CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBpbnQgcnY2NGlfenZr bmVkX3NldF9lbmNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICp1c2VyS2V5LCBjb25zdCBp bnQgYnl0ZXMsCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19LRVkgKmtl eSkKK215ICgkVUtFWSwgJEJZVEVTLCAkS0VZUCkgPSAoImEwIiwgImExIiwgImEyIik7CitteSAo JFQwKSA9ICgidDAiKTsKKworJGNvZGUgLj0gPDxfX187CisucDJhbGlnbiAzCisuZ2xvYmwgcnY2 NGlfenZrbmVkX3NldF9lbmNyeXB0X2tleQorLnR5cGUgcnY2NGlfenZrbmVkX3NldF9lbmNyeXB0 X2tleSxcQGZ1bmN0aW9uCitydjY0aV96dmtuZWRfc2V0X2VuY3J5cHRfa2V5OgorICAgIGJlcXog JFVLRVksIExfZmFpbF9tMQorICAgIGJlcXogJEtFWVAsIExfZmFpbF9tMQorCisgICAgIyBTdG9y ZSB0aGUga2V5IGxlbmd0aC4KKyAgICBzdyAkQllURVMsIDQ4MCgkS0VZUCkKKworICAgIGxpICRU MCwgMzIKKyAgICBiZXEgJEJZVEVTLCAkVDAsIExfc2V0X2tleV8yNTYKKyAgICBsaSAkVDAsIDE2 CisgICAgYmVxICRCWVRFUywgJFQwLCBMX3NldF9rZXlfMTI4CisKKyAgICBqIExfZmFpbF9tMgor CitMX3NldF9rZXlfMTI4OgorICAgIEB7W3ZzZXRpdmxpICJ6ZXJvIiwgNCwgImUzMiIsICJtMSIs ICJ0YSIsICJtYSJdfQorCisgICAgIyBMb2FkIHRoZSBrZXkKKyAgICBAe1t2bGUzMl92ICRWMTAs ICRVS0VZXX0KKworICAgICMgR2VuZXJhdGUga2V5cyBmb3Igcm91bmQgMi0xMSBpbnRvIHJlZ2lz dGVycyB2MTEtdjIwLgorICAgIEB7W3ZhZXNrZjFfdmkgJFYxMSwgJFYxMCwgMV19ICAgIyB2MTEg PC0gcmsyICAod1sgNCwgN10pCisgICAgQHtbdmFlc2tmMV92aSAkVjEyLCAkVjExLCAyXX0gICAj IHYxMiA8LSByazMgICh3WyA4LDExXSkKKyAgICBAe1t2YWVza2YxX3ZpICRWMTMsICRWMTIsIDNd fSAgICMgdjEzIDwtIHJrNCAgKHdbMTIsMTVdKQorICAgIEB7W3ZhZXNrZjFfdmkgJFYxNCwgJFYx MywgNF19ICAgIyB2MTQgPC0gcms1ICAod1sxNiwxOV0pCisgICAgQHtbdmFlc2tmMV92aSAkVjE1 LCAkVjE0LCA1XX0gICAjIHYxNSA8LSByazYgICh3WzIwLDIzXSkKKyAgICBAe1t2YWVza2YxX3Zp ICRWMTYsICRWMTUsIDZdfSAgICMgdjE2IDwtIHJrNyAgKHdbMjQsMjddKQorICAgIEB7W3ZhZXNr ZjFfdmkgJFYxNywgJFYxNiwgN119ICAgIyB2MTcgPC0gcms4ICAod1syOCwzMV0pCisgICAgQHtb dmFlc2tmMV92aSAkVjE4LCAkVjE3LCA4XX0gICAjIHYxOCA8LSByazkgICh3WzMyLDM1XSkKKyAg ICBAe1t2YWVza2YxX3ZpICRWMTksICRWMTgsIDldfSAgICMgdjE5IDwtIHJrMTAgKHdbMzYsMzld KQorICAgIEB7W3ZhZXNrZjFfdmkgJFYyMCwgJFYxOSwgMTBdfSAgIyB2MjAgPC0gcmsxMSAod1s0 MCw0M10pCisKKyAgICAjIFN0b3JlIHRoZSByb3VuZCBrZXlzCisgICAgQHtbdnNlMzJfdiAkVjEw LCAkS0VZUF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjEx LCAkS0VZUF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjEy LCAkS0VZUF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjEz LCAkS0VZUF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjE0 LCAkS0VZUF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjE1 LCAkS0VZUF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjE2 LCAkS0VZUF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjE3 LCAkS0VZUF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjE4 LCAkS0VZUF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjE5 LCAkS0VZUF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjIw LCAkS0VZUF19CisKKyAgICBsaSBhMCwgMQorICAgIHJldAorCitMX3NldF9rZXlfMjU2OgorICAg IEB7W3ZzZXRpdmxpICJ6ZXJvIiwgNCwgImUzMiIsICJtMSIsICJ0YSIsICJtYSJdfQorCisgICAg IyBMb2FkIHRoZSBrZXkKKyAgICBAe1t2bGUzMl92ICRWMTAsICRVS0VZXX0KKyAgICBhZGRpICRV S0VZLCAkVUtFWSwgMTYKKyAgICBAe1t2bGUzMl92ICRWMTEsICRVS0VZXX0KKworICAgIEB7W3Zt dl92X3YgJFYxMiwgJFYxMF19CisgICAgQHtbdmFlc2tmMl92aSAkVjEyLCAkVjExLCAyXX0KKyAg ICBAe1t2bXZfdl92ICRWMTMsICRWMTFdfQorICAgIEB7W3ZhZXNrZjJfdmkgJFYxMywgJFYxMiwg M119CisgICAgQHtbdm12X3ZfdiAkVjE0LCAkVjEyXX0KKyAgICBAe1t2YWVza2YyX3ZpICRWMTQs ICRWMTMsIDRdfQorICAgIEB7W3Ztdl92X3YgJFYxNSwgJFYxM119CisgICAgQHtbdmFlc2tmMl92 aSAkVjE1LCAkVjE0LCA1XX0KKyAgICBAe1t2bXZfdl92ICRWMTYsICRWMTRdfQorICAgIEB7W3Zh ZXNrZjJfdmkgJFYxNiwgJFYxNSwgNl19CisgICAgQHtbdm12X3ZfdiAkVjE3LCAkVjE1XX0KKyAg ICBAe1t2YWVza2YyX3ZpICRWMTcsICRWMTYsIDddfQorICAgIEB7W3Ztdl92X3YgJFYxOCwgJFYx Nl19CisgICAgQHtbdmFlc2tmMl92aSAkVjE4LCAkVjE3LCA4XX0KKyAgICBAe1t2bXZfdl92ICRW MTksICRWMTddfQorICAgIEB7W3ZhZXNrZjJfdmkgJFYxOSwgJFYxOCwgOV19CisgICAgQHtbdm12 X3ZfdiAkVjIwLCAkVjE4XX0KKyAgICBAe1t2YWVza2YyX3ZpICRWMjAsICRWMTksIDEwXX0KKyAg ICBAe1t2bXZfdl92ICRWMjEsICRWMTldfQorICAgIEB7W3ZhZXNrZjJfdmkgJFYyMSwgJFYyMCwg MTFdfQorICAgIEB7W3Ztdl92X3YgJFYyMiwgJFYyMF19CisgICAgQHtbdmFlc2tmMl92aSAkVjIy LCAkVjIxLCAxMl19CisgICAgQHtbdm12X3ZfdiAkVjIzLCAkVjIxXX0KKyAgICBAe1t2YWVza2Yy X3ZpICRWMjMsICRWMjIsIDEzXX0KKyAgICBAe1t2bXZfdl92ICRWMjQsICRWMjJdfQorICAgIEB7 W3ZhZXNrZjJfdmkgJFYyNCwgJFYyMywgMTRdfQorCisgICAgQHtbdnNlMzJfdiAkVjEwLCAkS0VZ UF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjExLCAkS0VZ UF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjEyLCAkS0VZ UF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjEzLCAkS0VZ UF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjE0LCAkS0VZ UF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjE1LCAkS0VZ UF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjE2LCAkS0VZ UF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjE3LCAkS0VZ UF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjE4LCAkS0VZ UF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjE5LCAkS0VZ UF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjIwLCAkS0VZ UF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjIxLCAkS0VZ UF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjIyLCAkS0VZ UF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjIzLCAkS0VZ UF19CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdnNlMzJfdiAkVjI0LCAkS0VZ UF19CisKKyAgICBsaSBhMCwgMQorICAgIHJldAorLnNpemUgcnY2NGlfenZrbmVkX3NldF9lbmNy eXB0X2tleSwuLXJ2NjRpX3p2a25lZF9zZXRfZW5jcnlwdF9rZXkKK19fXworfQorCit7CisjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIworIyB2b2lkIHJ2NjRpX3p2a25lZF9lbmNyeXB0KGNvbnN0IHVu c2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisjICAgICAgICAgICAgICAgICAg ICAgICAgICAgY29uc3QgQUVTX0tFWSAqa2V5KTsKK215ICgkSU5QLCAkT1VUUCwgJEtFWVApID0g KCJhMCIsICJhMSIsICJhMiIpOworbXkgKCRUMCkgPSAoInQwIik7CitteSAoJEtFWV9MRU4pID0g KCJhMyIpOworCiskY29kZSAuPSA8PF9fXzsKKy5wMmFsaWduIDMKKy5nbG9ibCBydjY0aV96dmtu ZWRfZW5jcnlwdAorLnR5cGUgcnY2NGlfenZrbmVkX2VuY3J5cHQsXEBmdW5jdGlvbgorcnY2NGlf enZrbmVkX2VuY3J5cHQ6CisgICAgIyBMb2FkIGtleSBsZW5ndGguCisgICAgbHd1ICRLRVlfTEVO LCA0ODAoJEtFWVApCisKKyAgICAjIEdldCBwcm9wZXIgcm91dGluZSBmb3Iga2V5IGxlbmd0aC4K KyAgICBsaSAkVDAsIDMyCisgICAgYmVxICRLRVlfTEVOLCAkVDAsIExfZW5jXzI1NgorICAgIGxp ICRUMCwgMjQKKyAgICBiZXEgJEtFWV9MRU4sICRUMCwgTF9lbmNfMTkyCisgICAgbGkgJFQwLCAx NgorICAgIGJlcSAkS0VZX0xFTiwgJFQwLCBMX2VuY18xMjgKKworICAgIGogTF9mYWlsX20yCisu c2l6ZSBydjY0aV96dmtuZWRfZW5jcnlwdCwuLXJ2NjRpX3p2a25lZF9lbmNyeXB0CitfX18KKwor JGNvZGUgLj0gPDxfX187CisucDJhbGlnbiAzCitMX2VuY18xMjg6CisgICAgQHtbdnNldGl2bGkg Inplcm8iLCA0LCAiZTMyIiwgIm0xIiwgInRhIiwgIm1hIl19CisKKyAgICBAe1t2bGUzMl92ICRW MSwgJElOUF19CisKKyAgICBAe1t2bGUzMl92ICRWMTAsICRLRVlQXX0KKyAgICBAe1t2YWVzel92 cyAkVjEsICRWMTBdfSAgICAjIHdpdGggcm91bmQga2V5IHdbIDAsIDNdCisgICAgYWRkaSAkS0VZ UCwgJEtFWVAsIDE2CisgICAgQHtbdmxlMzJfdiAkVjExLCAkS0VZUF19CisgICAgQHtbdmFlc2Vt X3ZzICRWMSwgJFYxMV19ICAgIyB3aXRoIHJvdW5kIGtleSB3WyA0LCA3XQorICAgIGFkZGkgJEtF WVAsICRLRVlQLCAxNgorICAgIEB7W3ZsZTMyX3YgJFYxMiwgJEtFWVBdfQorICAgIEB7W3ZhZXNl bV92cyAkVjEsICRWMTJdfSAgICMgd2l0aCByb3VuZCBrZXkgd1sgOCwxMV0KKyAgICBhZGRpICRL RVlQLCAkS0VZUCwgMTYKKyAgICBAe1t2bGUzMl92ICRWMTMsICRLRVlQXX0KKyAgICBAe1t2YWVz ZW1fdnMgJFYxLCAkVjEzXX0gICAjIHdpdGggcm91bmQga2V5IHdbMTIsMTVdCisgICAgYWRkaSAk S0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdmxlMzJfdiAkVjE0LCAkS0VZUF19CisgICAgQHtbdmFl c2VtX3ZzICRWMSwgJFYxNF19ICAgIyB3aXRoIHJvdW5kIGtleSB3WzE2LDE5XQorICAgIGFkZGkg JEtFWVAsICRLRVlQLCAxNgorICAgIEB7W3ZsZTMyX3YgJFYxNSwgJEtFWVBdfQorICAgIEB7W3Zh ZXNlbV92cyAkVjEsICRWMTVdfSAgICMgd2l0aCByb3VuZCBrZXkgd1syMCwyM10KKyAgICBhZGRp ICRLRVlQLCAkS0VZUCwgMTYKKyAgICBAe1t2bGUzMl92ICRWMTYsICRLRVlQXX0KKyAgICBAe1t2 YWVzZW1fdnMgJFYxLCAkVjE2XX0gICAjIHdpdGggcm91bmQga2V5IHdbMjQsMjddCisgICAgYWRk aSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdmxlMzJfdiAkVjE3LCAkS0VZUF19CisgICAgQHtb dmFlc2VtX3ZzICRWMSwgJFYxN119ICAgIyB3aXRoIHJvdW5kIGtleSB3WzI4LDMxXQorICAgIGFk ZGkgJEtFWVAsICRLRVlQLCAxNgorICAgIEB7W3ZsZTMyX3YgJFYxOCwgJEtFWVBdfQorICAgIEB7 W3ZhZXNlbV92cyAkVjEsICRWMThdfSAgICMgd2l0aCByb3VuZCBrZXkgd1szMiwzNV0KKyAgICBh ZGRpICRLRVlQLCAkS0VZUCwgMTYKKyAgICBAe1t2bGUzMl92ICRWMTksICRLRVlQXX0KKyAgICBA e1t2YWVzZW1fdnMgJFYxLCAkVjE5XX0gICAjIHdpdGggcm91bmQga2V5IHdbMzYsMzldCisgICAg YWRkaSAkS0VZUCwgJEtFWVAsIDE2CisgICAgQHtbdmxlMzJfdiAkVjIwLCAkS0VZUF19CisgICAg QHtbdmFlc2VmX3ZzICRWMSwgJFYyMF19ICAgIyB3aXRoIHJvdW5kIGtleSB3WzQwLDQzXQorCisg ICAgQHtbdnNlMzJfdiAkVjEsICRPVVRQXX0KKworICAgIHJldAorLnNpemUgTF9lbmNfMTI4LC4t TF9lbmNfMTI4CitfX18KKworJGNvZGUgLj0gPDxfX187CisucDJhbGlnbiAzCitMX2VuY18xOTI6 CisgICAgQHtbdnNldGl2bGkgInplcm8iLCA0LCAiZTMyIiwgIm0xIiwgInRhIiwgIm1hIl19CisK KyAgICBAe1t2bGUzMl92ICRWMSwgJElOUF19CisKKyAgICBAe1t2bGUzMl92ICRWMTAsICRLRVlQ XX0KKyAgICBAe1t2YWVzel92cyAkVjEsICRWMTBdfSAgICAgIyB3aXRoIHJvdW5kIGtleSB3WyAw LCAzXQorICAgIGFkZGkgJEtFWVAsICRLRVlQLCAxNgorICAgIEB7W3ZsZTMyX3YgJFYxMSwgJEtF WVBdfQorICAgIEB7W3ZhZXNlbV92cyAkVjEsICRWMTFdfQorICAgIGFkZGkgJEtFWVAsICRLRVlQ LCAxNgorICAgIEB7W3ZsZTMyX3YgJFYxMiwgJEtFWVBdfQorICAgIEB7W3ZhZXNlbV92cyAkVjEs ICRWMTJdfQorICAgIGFkZGkgJEtFWVAsICRLRVlQLCAxNgorICAgIEB7W3ZsZTMyX3YgJFYxMywg JEtFWVBdfQorICAgIEB7W3ZhZXNlbV92cyAkVjEsICRWMTNdfQorICAgIGFkZGkgJEtFWVAsICRL RVlQLCAxNgorICAgIEB7W3ZsZTMyX3YgJFYxNCwgJEtFWVBdfQorICAgIEB7W3ZhZXNlbV92cyAk VjEsICRWMTRdfQorICAgIGFkZGkgJEtFWVAsICRLRVlQLCAxNgorICAgIEB7W3ZsZTMyX3YgJFYx NSwgJEtFWVBdfQorICAgIEB7W3ZhZXNlbV92cyAkVjEsICRWMTVdfQorICAgIGFkZGkgJEtFWVAs ICRLRVlQLCAxNgorICAgIEB7W3ZsZTMyX3YgJFYxNiwgJEtFWVBdfQorICAgIEB7W3ZhZXNlbV92 cyAkVjEsICRWMTZdfQorICAgIGFkZGkgJEtFWVAsICRLRVlQLCAxNgorICAgIEB7W3ZsZTMyX3Yg JFYxNywgJEtFWVBdfQorICAgIEB7W3ZhZXNlbV92cyAkVjEsICRWMTddfQorICAgIGFkZGkgJEtF WVAsICRLRVlQLCAxNgorICAgIEB7W3ZsZTMyX3YgJFYxOCwgJEtFWVBdfQorICAgIEB7W3ZhZXNl bV92cyAkVjEsICRWMThdfQorICAgIGFkZGkgJEtFWVAsICRLRVlQLCAxNgorICAgIEB7W3ZsZTMy X3YgJFYxOSwgJEtFWVBdfQorICAgIEB7W3ZhZXNlbV92cyAkVjEsICRWMTldfQorICAgIGFkZGkg JEtFWVAsICRLRVlQLCAxNgorICAgIEB7W3ZsZTMyX3YgJFYyMCwgJEtFWVBdfQorICAgIEB7W3Zh ZXNlbV92cyAkVjEsICRWMjBdfQorICAgIGFkZGkgJEtFWVAsICRLRVlQLCAxNgorICAgIEB7W3Zs ZTMyX3YgJFYyMSwgJEtFWVBdfQorICAgIEB7W3ZhZXNlbV92cyAkVjEsICRWMjFdfQorICAgIGFk ZGkgJEtFWVAsICRLRVlQLCAxNgorICAgIEB7W3ZsZTMyX3YgJFYyMiwgJEtFWVBdfQorICAgIEB7 W3ZhZXNlZl92cyAkVjEsICRWMjJdfQorCisgICAgQHtbdnNlMzJfdiAkVjEsICRPVVRQXX0KKyAg ICByZXQKKy5zaXplIExfZW5jXzE5MiwuLUxfZW5jXzE5MgorX19fCisKKyRjb2RlIC49IDw8X19f OworLnAyYWxpZ24gMworTF9lbmNfMjU2OgorICAgIEB7W3ZzZXRpdmxpICJ6ZXJvIiwgNCwgImUz MiIsICJtMSIsICJ0YSIsICJtYSJdfQorCisgICAgQHtbdmxlMzJfdiAkVjEsICRJTlBdfQorCisg ICAgQHtbdmxlMzJfdiAkVjEwLCAkS0VZUF19CisgICAgQHtbdmFlc3pfdnMgJFYxLCAkVjEwXX0g ICAgICMgd2l0aCByb3VuZCBrZXkgd1sgMCwgM10KKyAgICBhZGRpICRLRVlQLCAkS0VZUCwgMTYK KyAgICBAe1t2bGUzMl92ICRWMTEsICRLRVlQXX0KKyAgICBAe1t2YWVzZW1fdnMgJFYxLCAkVjEx XX0KKyAgICBhZGRpICRLRVlQLCAkS0VZUCwgMTYKKyAgICBAe1t2bGUzMl92ICRWMTIsICRLRVlQ XX0KKyAgICBAe1t2YWVzZW1fdnMgJFYxLCAkVjEyXX0KKyAgICBhZGRpICRLRVlQLCAkS0VZUCwg MTYKKyAgICBAe1t2bGUzMl92ICRWMTMsICRLRVlQXX0KKyAgICBAe1t2YWVzZW1fdnMgJFYxLCAk VjEzXX0KKyAgICBhZGRpICRLRVlQLCAkS0VZUCwgMTYKKyAgICBAe1t2bGUzMl92ICRWMTQsICRL RVlQXX0KKyAgICBAe1t2YWVzZW1fdnMgJFYxLCAkVjE0XX0KKyAgICBhZGRpICRLRVlQLCAkS0VZ UCwgMTYKKyAgICBAe1t2bGUzMl92ICRWMTUsICRLRVlQXX0KKyAgICBAe1t2YWVzZW1fdnMgJFYx LCAkVjE1XX0KKyAgICBhZGRpICRLRVlQLCAkS0VZUCwgMTYKKyAgICBAe1t2bGUzMl92ICRWMTYs ICRLRVlQXX0KKyAgICBAe1t2YWVzZW1fdnMgJFYxLCAkVjE2XX0KKyAgICBhZGRpICRLRVlQLCAk S0VZUCwgMTYKKyAgICBAe1t2bGUzMl92ICRWMTcsICRLRVlQXX0KKyAgICBAe1t2YWVzZW1fdnMg JFYxLCAkVjE3XX0KKyAgICBhZGRpICRLRVlQLCAkS0VZUCwgMTYKKyAgICBAe1t2bGUzMl92ICRW MTgsICRLRVlQXX0KKyAgICBAe1t2YWVzZW1fdnMgJFYxLCAkVjE4XX0KKyAgICBhZGRpICRLRVlQ LCAkS0VZUCwgMTYKKyAgICBAe1t2bGUzMl92ICRWMTksICRLRVlQXX0KKyAgICBAe1t2YWVzZW1f dnMgJFYxLCAkVjE5XX0KKyAgICBhZGRpICRLRVlQLCAkS0VZUCwgMTYKKyAgICBAe1t2bGUzMl92 ICRWMjAsICRLRVlQXX0KKyAgICBAe1t2YWVzZW1fdnMgJFYxLCAkVjIwXX0KKyAgICBhZGRpICRL RVlQLCAkS0VZUCwgMTYKKyAgICBAe1t2bGUzMl92ICRWMjEsICRLRVlQXX0KKyAgICBAe1t2YWVz ZW1fdnMgJFYxLCAkVjIxXX0KKyAgICBhZGRpICRLRVlQLCAkS0VZUCwgMTYKKyAgICBAe1t2bGUz Ml92ICRWMjIsICRLRVlQXX0KKyAgICBAe1t2YWVzZW1fdnMgJFYxLCAkVjIyXX0KKyAgICBhZGRp ICRLRVlQLCAkS0VZUCwgMTYKKyAgICBAe1t2bGUzMl92ICRWMjMsICRLRVlQXX0KKyAgICBAe1t2 YWVzZW1fdnMgJFYxLCAkVjIzXX0KKyAgICBhZGRpICRLRVlQLCAkS0VZUCwgMTYKKyAgICBAe1t2 bGUzMl92ICRWMjQsICRLRVlQXX0KKyAgICBAe1t2YWVzZWZfdnMgJFYxLCAkVjI0XX0KKworICAg IEB7W3ZzZTMyX3YgJFYxLCAkT1VUUF19CisgICAgcmV0Cisuc2l6ZSBMX2VuY18yNTYsLi1MX2Vu Y18yNTYKK19fXworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB2b2lkIHJ2NjRpX3p2a25l ZF9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisj ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUVTX0tFWSAqa2V5KTsKKyRjb2RlIC49 IDw8X19fOworLnAyYWxpZ24gMworLmdsb2JsIHJ2NjRpX3p2a25lZF9kZWNyeXB0CisudHlwZSBy djY0aV96dmtuZWRfZGVjcnlwdCxcQGZ1bmN0aW9uCitydjY0aV96dmtuZWRfZGVjcnlwdDoKKyAg ICAjIExvYWQga2V5IGxlbmd0aC4KKyAgICBsd3UgJEtFWV9MRU4sIDQ4MCgkS0VZUCkKKworICAg ICMgR2V0IHByb3BlciByb3V0aW5lIGZvciBrZXkgbGVuZ3RoLgorICAgIGxpICRUMCwgMzIKKyAg ICBiZXEgJEtFWV9MRU4sICRUMCwgTF9kZWNfMjU2CisgICAgbGkgJFQwLCAyNAorICAgIGJlcSAk S0VZX0xFTiwgJFQwLCBMX2RlY18xOTIKKyAgICBsaSAkVDAsIDE2CisgICAgYmVxICRLRVlfTEVO LCAkVDAsIExfZGVjXzEyOAorCisgICAgaiBMX2ZhaWxfbTIKKy5zaXplIHJ2NjRpX3p2a25lZF9k ZWNyeXB0LC4tcnY2NGlfenZrbmVkX2RlY3J5cHQKK19fXworCiskY29kZSAuPSA8PF9fXzsKKy5w MmFsaWduIDMKK0xfZGVjXzEyODoKKyAgICBAe1t2c2V0aXZsaSAiemVybyIsIDQsICJlMzIiLCAi bTEiLCAidGEiLCAibWEiXX0KKworICAgIEB7W3ZsZTMyX3YgJFYxLCAkSU5QXX0KKworICAgIGFk ZGkgJEtFWVAsICRLRVlQLCAxNjAKKyAgICBAe1t2bGUzMl92ICRWMjAsICRLRVlQXX0KKyAgICBA e1t2YWVzel92cyAkVjEsICRWMjBdfSAgICAjIHdpdGggcm91bmQga2V5IHdbNDAsNDNdCisgICAg YWRkaSAkS0VZUCwgJEtFWVAsIC0xNgorICAgIEB7W3ZsZTMyX3YgJFYxOSwgJEtFWVBdfQorICAg IEB7W3ZhZXNkbV92cyAkVjEsICRWMTldfSAgICMgd2l0aCByb3VuZCBrZXkgd1szNiwzOV0KKyAg ICBhZGRpICRLRVlQLCAkS0VZUCwgLTE2CisgICAgQHtbdmxlMzJfdiAkVjE4LCAkS0VZUF19Cisg ICAgQHtbdmFlc2RtX3ZzICRWMSwgJFYxOF19ICAgIyB3aXRoIHJvdW5kIGtleSB3WzMyLDM1XQor ICAgIGFkZGkgJEtFWVAsICRLRVlQLCAtMTYKKyAgICBAe1t2bGUzMl92ICRWMTcsICRLRVlQXX0K KyAgICBAe1t2YWVzZG1fdnMgJFYxLCAkVjE3XX0gICAjIHdpdGggcm91bmQga2V5IHdbMjgsMzFd CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIC0xNgorICAgIEB7W3ZsZTMyX3YgJFYxNiwgJEtFWVBd fQorICAgIEB7W3ZhZXNkbV92cyAkVjEsICRWMTZdfSAgICMgd2l0aCByb3VuZCBrZXkgd1syNCwy N10KKyAgICBhZGRpICRLRVlQLCAkS0VZUCwgLTE2CisgICAgQHtbdmxlMzJfdiAkVjE1LCAkS0VZ UF19CisgICAgQHtbdmFlc2RtX3ZzICRWMSwgJFYxNV19ICAgIyB3aXRoIHJvdW5kIGtleSB3WzIw LDIzXQorICAgIGFkZGkgJEtFWVAsICRLRVlQLCAtMTYKKyAgICBAe1t2bGUzMl92ICRWMTQsICRL RVlQXX0KKyAgICBAe1t2YWVzZG1fdnMgJFYxLCAkVjE0XX0gICAjIHdpdGggcm91bmQga2V5IHdb MTYsMTldCisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIC0xNgorICAgIEB7W3ZsZTMyX3YgJFYxMywg JEtFWVBdfQorICAgIEB7W3ZhZXNkbV92cyAkVjEsICRWMTNdfSAgICMgd2l0aCByb3VuZCBrZXkg d1sxMiwxNV0KKyAgICBhZGRpICRLRVlQLCAkS0VZUCwgLTE2CisgICAgQHtbdmxlMzJfdiAkVjEy LCAkS0VZUF19CisgICAgQHtbdmFlc2RtX3ZzICRWMSwgJFYxMl19ICAgIyB3aXRoIHJvdW5kIGtl eSB3WyA4LDExXQorICAgIGFkZGkgJEtFWVAsICRLRVlQLCAtMTYKKyAgICBAe1t2bGUzMl92ICRW MTEsICRLRVlQXX0KKyAgICBAe1t2YWVzZG1fdnMgJFYxLCAkVjExXX0gICAjIHdpdGggcm91bmQg a2V5IHdbIDQsIDddCisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIC0xNgorICAgIEB7W3ZsZTMyX3Yg JFYxMCwgJEtFWVBdfQorICAgIEB7W3ZhZXNkZl92cyAkVjEsICRWMTBdfSAgICMgd2l0aCByb3Vu ZCBrZXkgd1sgMCwgM10KKworICAgIEB7W3ZzZTMyX3YgJFYxLCAkT1VUUF19CisKKyAgICByZXQK Ky5zaXplIExfZGVjXzEyOCwuLUxfZGVjXzEyOAorX19fCisKKyRjb2RlIC49IDw8X19fOworLnAy YWxpZ24gMworTF9kZWNfMTkyOgorICAgIEB7W3ZzZXRpdmxpICJ6ZXJvIiwgNCwgImUzMiIsICJt MSIsICJ0YSIsICJtYSJdfQorCisgICAgQHtbdmxlMzJfdiAkVjEsICRJTlBdfQorCisgICAgYWRk aSAkS0VZUCwgJEtFWVAsIDE5MgorICAgIEB7W3ZsZTMyX3YgJFYyMiwgJEtFWVBdfQorICAgIEB7 W3ZhZXN6X3ZzICRWMSwgJFYyMl19ICAgICMgd2l0aCByb3VuZCBrZXkgd1s0OCw1MV0KKyAgICBh ZGRpICRLRVlQLCAkS0VZUCwgLTE2CisgICAgQHtbdmxlMzJfdiAkVjIxLCAkS0VZUF19CisgICAg QHtbdmFlc2RtX3ZzICRWMSwgJFYyMV19ICAgIyB3aXRoIHJvdW5kIGtleSB3WzQ0LDQ3XQorICAg IGFkZGkgJEtFWVAsICRLRVlQLCAtMTYKKyAgICBAe1t2bGUzMl92ICRWMjAsICRLRVlQXX0KKyAg ICBAe1t2YWVzZG1fdnMgJFYxLCAkVjIwXX0gICAgIyB3aXRoIHJvdW5kIGtleSB3WzQwLDQzXQor ICAgIGFkZGkgJEtFWVAsICRLRVlQLCAtMTYKKyAgICBAe1t2bGUzMl92ICRWMTksICRLRVlQXX0K KyAgICBAe1t2YWVzZG1fdnMgJFYxLCAkVjE5XX0gICAjIHdpdGggcm91bmQga2V5IHdbMzYsMzld CisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIC0xNgorICAgIEB7W3ZsZTMyX3YgJFYxOCwgJEtFWVBd fQorICAgIEB7W3ZhZXNkbV92cyAkVjEsICRWMThdfSAgICMgd2l0aCByb3VuZCBrZXkgd1szMiwz NV0KKyAgICBhZGRpICRLRVlQLCAkS0VZUCwgLTE2CisgICAgQHtbdmxlMzJfdiAkVjE3LCAkS0VZ UF19CisgICAgQHtbdmFlc2RtX3ZzICRWMSwgJFYxN119ICAgIyB3aXRoIHJvdW5kIGtleSB3WzI4 LDMxXQorICAgIGFkZGkgJEtFWVAsICRLRVlQLCAtMTYKKyAgICBAe1t2bGUzMl92ICRWMTYsICRL RVlQXX0KKyAgICBAe1t2YWVzZG1fdnMgJFYxLCAkVjE2XX0gICAjIHdpdGggcm91bmQga2V5IHdb MjQsMjddCisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIC0xNgorICAgIEB7W3ZsZTMyX3YgJFYxNSwg JEtFWVBdfQorICAgIEB7W3ZhZXNkbV92cyAkVjEsICRWMTVdfSAgICMgd2l0aCByb3VuZCBrZXkg d1syMCwyM10KKyAgICBhZGRpICRLRVlQLCAkS0VZUCwgLTE2CisgICAgQHtbdmxlMzJfdiAkVjE0 LCAkS0VZUF19CisgICAgQHtbdmFlc2RtX3ZzICRWMSwgJFYxNF19ICAgIyB3aXRoIHJvdW5kIGtl eSB3WzE2LDE5XQorICAgIGFkZGkgJEtFWVAsICRLRVlQLCAtMTYKKyAgICBAe1t2bGUzMl92ICRW MTMsICRLRVlQXX0KKyAgICBAe1t2YWVzZG1fdnMgJFYxLCAkVjEzXX0gICAjIHdpdGggcm91bmQg a2V5IHdbMTIsMTVdCisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIC0xNgorICAgIEB7W3ZsZTMyX3Yg JFYxMiwgJEtFWVBdfQorICAgIEB7W3ZhZXNkbV92cyAkVjEsICRWMTJdfSAgICMgd2l0aCByb3Vu ZCBrZXkgd1sgOCwxMV0KKyAgICBhZGRpICRLRVlQLCAkS0VZUCwgLTE2CisgICAgQHtbdmxlMzJf diAkVjExLCAkS0VZUF19CisgICAgQHtbdmFlc2RtX3ZzICRWMSwgJFYxMV19ICAgIyB3aXRoIHJv dW5kIGtleSB3WyA0LCA3XQorICAgIGFkZGkgJEtFWVAsICRLRVlQLCAtMTYKKyAgICBAe1t2bGUz Ml92ICRWMTAsICRLRVlQXX0KKyAgICBAe1t2YWVzZGZfdnMgJFYxLCAkVjEwXX0gICAjIHdpdGgg cm91bmQga2V5IHdbIDAsIDNdCisKKyAgICBAe1t2c2UzMl92ICRWMSwgJE9VVFBdfQorCisgICAg cmV0Cisuc2l6ZSBMX2RlY18xOTIsLi1MX2RlY18xOTIKK19fXworCiskY29kZSAuPSA8PF9fXzsK Ky5wMmFsaWduIDMKK0xfZGVjXzI1NjoKKyAgICBAe1t2c2V0aXZsaSAiemVybyIsIDQsICJlMzIi LCAibTEiLCAidGEiLCAibWEiXX0KKworICAgIEB7W3ZsZTMyX3YgJFYxLCAkSU5QXX0KKworICAg IGFkZGkgJEtFWVAsICRLRVlQLCAyMjQKKyAgICBAe1t2bGUzMl92ICRWMjQsICRLRVlQXX0KKyAg ICBAe1t2YWVzel92cyAkVjEsICRWMjRdfSAgICAjIHdpdGggcm91bmQga2V5IHdbNTYsNTldCisg ICAgYWRkaSAkS0VZUCwgJEtFWVAsIC0xNgorICAgIEB7W3ZsZTMyX3YgJFYyMywgJEtFWVBdfQor ICAgIEB7W3ZhZXNkbV92cyAkVjEsICRWMjNdfSAgICMgd2l0aCByb3VuZCBrZXkgd1s1Miw1NV0K KyAgICBhZGRpICRLRVlQLCAkS0VZUCwgLTE2CisgICAgQHtbdmxlMzJfdiAkVjIyLCAkS0VZUF19 CisgICAgQHtbdmFlc2RtX3ZzICRWMSwgJFYyMl19ICAgICMgd2l0aCByb3VuZCBrZXkgd1s0OCw1 MV0KKyAgICBhZGRpICRLRVlQLCAkS0VZUCwgLTE2CisgICAgQHtbdmxlMzJfdiAkVjIxLCAkS0VZ UF19CisgICAgQHtbdmFlc2RtX3ZzICRWMSwgJFYyMV19ICAgIyB3aXRoIHJvdW5kIGtleSB3WzQ0 LDQ3XQorICAgIGFkZGkgJEtFWVAsICRLRVlQLCAtMTYKKyAgICBAe1t2bGUzMl92ICRWMjAsICRL RVlQXX0KKyAgICBAe1t2YWVzZG1fdnMgJFYxLCAkVjIwXX0gICAgIyB3aXRoIHJvdW5kIGtleSB3 WzQwLDQzXQorICAgIGFkZGkgJEtFWVAsICRLRVlQLCAtMTYKKyAgICBAe1t2bGUzMl92ICRWMTks ICRLRVlQXX0KKyAgICBAe1t2YWVzZG1fdnMgJFYxLCAkVjE5XX0gICAjIHdpdGggcm91bmQga2V5 IHdbMzYsMzldCisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIC0xNgorICAgIEB7W3ZsZTMyX3YgJFYx OCwgJEtFWVBdfQorICAgIEB7W3ZhZXNkbV92cyAkVjEsICRWMThdfSAgICMgd2l0aCByb3VuZCBr ZXkgd1szMiwzNV0KKyAgICBhZGRpICRLRVlQLCAkS0VZUCwgLTE2CisgICAgQHtbdmxlMzJfdiAk VjE3LCAkS0VZUF19CisgICAgQHtbdmFlc2RtX3ZzICRWMSwgJFYxN119ICAgIyB3aXRoIHJvdW5k IGtleSB3WzI4LDMxXQorICAgIGFkZGkgJEtFWVAsICRLRVlQLCAtMTYKKyAgICBAe1t2bGUzMl92 ICRWMTYsICRLRVlQXX0KKyAgICBAe1t2YWVzZG1fdnMgJFYxLCAkVjE2XX0gICAjIHdpdGggcm91 bmQga2V5IHdbMjQsMjddCisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIC0xNgorICAgIEB7W3ZsZTMy X3YgJFYxNSwgJEtFWVBdfQorICAgIEB7W3ZhZXNkbV92cyAkVjEsICRWMTVdfSAgICMgd2l0aCBy b3VuZCBrZXkgd1syMCwyM10KKyAgICBhZGRpICRLRVlQLCAkS0VZUCwgLTE2CisgICAgQHtbdmxl MzJfdiAkVjE0LCAkS0VZUF19CisgICAgQHtbdmFlc2RtX3ZzICRWMSwgJFYxNF19ICAgIyB3aXRo IHJvdW5kIGtleSB3WzE2LDE5XQorICAgIGFkZGkgJEtFWVAsICRLRVlQLCAtMTYKKyAgICBAe1t2 bGUzMl92ICRWMTMsICRLRVlQXX0KKyAgICBAe1t2YWVzZG1fdnMgJFYxLCAkVjEzXX0gICAjIHdp dGggcm91bmQga2V5IHdbMTIsMTVdCisgICAgYWRkaSAkS0VZUCwgJEtFWVAsIC0xNgorICAgIEB7 W3ZsZTMyX3YgJFYxMiwgJEtFWVBdfQorICAgIEB7W3ZhZXNkbV92cyAkVjEsICRWMTJdfSAgICMg d2l0aCByb3VuZCBrZXkgd1sgOCwxMV0KKyAgICBhZGRpICRLRVlQLCAkS0VZUCwgLTE2CisgICAg QHtbdmxlMzJfdiAkVjExLCAkS0VZUF19CisgICAgQHtbdmFlc2RtX3ZzICRWMSwgJFYxMV19ICAg IyB3aXRoIHJvdW5kIGtleSB3WyA0LCA3XQorICAgIGFkZGkgJEtFWVAsICRLRVlQLCAtMTYKKyAg ICBAe1t2bGUzMl92ICRWMTAsICRLRVlQXX0KKyAgICBAe1t2YWVzZGZfdnMgJFYxLCAkVjEwXX0g ICAjIHdpdGggcm91bmQga2V5IHdbIDAsIDNdCisKKyAgICBAe1t2c2UzMl92ICRWMSwgJE9VVFBd fQorCisgICAgcmV0Cisuc2l6ZSBMX2RlY18yNTYsLi1MX2RlY18yNTYKK19fXworfQorCiskY29k ZSAuPSA8PF9fXzsKK0xfZmFpbF9tMToKKyAgICBsaSBhMCwgLTEKKyAgICByZXQKKy5zaXplIExf ZmFpbF9tMSwuLUxfZmFpbF9tMQorCitMX2ZhaWxfbTI6CisgICAgbGkgYTAsIC0yCisgICAgcmV0 Cisuc2l6ZSBMX2ZhaWxfbTIsLi1MX2ZhaWxfbTIKKworTF9lbmQ6CisgIHJldAorLnNpemUgTF9l bmQsLi1MX2VuZAorX19fCisKK3ByaW50ICRjb2RlOworCitjbG9zZSBTVERPVVQgb3IgZGllICJl cnJvciBjbG9zaW5nIFNURE9VVDogJCEiOwotLSAKMi4yOC4wCgoKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtcmlzY3YgbWFpbGluZyBsaXN0Cmxp bnV4LXJpc2N2QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcv bWFpbG1hbi9saXN0aW5mby9saW51eC1yaXNjdgo=