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 18442C7EE22 for ; Thu, 11 May 2023 10:31:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237826AbjEKKbn convert rfc822-to-8bit (ORCPT ); Thu, 11 May 2023 06:31:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32970 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237909AbjEKKbR (ORCPT ); Thu, 11 May 2023 06:31:17 -0400 Received: from gloria.sntech.de (gloria.sntech.de [185.11.138.130]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C571BAD34; Thu, 11 May 2023 03:30:54 -0700 (PDT) Received: from ip5b412278.dynamic.kabel-deutschland.de ([91.65.34.120] helo=diego.localnet) by gloria.sntech.de with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1px3ZJ-0004sW-Uy; Thu, 11 May 2023 12:30:41 +0200 From: Heiko =?ISO-8859-1?Q?St=FCbner?= To: Nathan Huckleberry Cc: palmer@dabbelt.com, paul.walmsley@sifive.com, aou@eecs.berkeley.edu, herbert@gondor.apana.org.au, davem@davemloft.net, conor.dooley@microchip.com, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-crypto@vger.kernel.org, christoph.muellner@vrull.eu Subject: Re: [PATCH v4 4/4] RISC-V: crypto: add accelerated GCM GHASH implementation Date: Thu, 11 May 2023 12:30:41 +0200 Message-ID: <3540048.LM0AJKV5NW@diego> In-Reply-To: References: <20230329140642.2186644-1-heiko.stuebner@vrull.eu> <20230329140642.2186644-5-heiko.stuebner@vrull.eu> MIME-Version: 1.0 Content-Transfer-Encoding: 8BIT Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org Hi Nathan, Am Dienstag, 11. April 2023, 17:00:00 CEST schrieb Nathan Huckleberry: > On Wed, Mar 29, 2023 at 7:08 AM Heiko Stuebner wrote: > > +struct riscv64_ghash_ctx { > > + void (*ghash_func)(u64 Xi[2], const u128 Htable[16], > > + const u8 *inp, size_t len); > > + > > + /* key used by vector asm */ > > + u128 htable[16]; > > This field looks too big. The assembly only loads the first 128-byte > value from this table. OpenSSL defines the Htable field handed to the init- and the other functions as this "u128 Htable[16]" [0] . As I really like the concept of keeping in sync with openSSL, I guess I'd rather not change that. [0] https://github.com/openssl/openssl/blob/master/crypto/modes/gcm128.c#L88 > Is this copied from another implementation? There's an optimization > where you precompute the first N powers of H so that you can perform 1 > finite field reduction for every N multiplications, but it doesn't > look like that's being used here. The whole crypto-specific code comes from openSSL itself, so for now I guess I'd like to try keeping things the same. > > +#define RISCV64_ZBC_SETKEY(VARIANT, GHASH) \ > > +void gcm_init_rv64i_ ## VARIANT(u128 Htable[16], const u64 Xi[2]); \ > > +static int riscv64_zbc_ghash_setkey_ ## VARIANT(struct crypto_shash *tfm, \ > > + const u8 *key, \ > > + unsigned int keylen) \ > > +{ \ > > + struct riscv64_ghash_ctx *ctx = crypto_tfm_ctx(crypto_shash_tfm(tfm)); \ > > + const u64 k[2] = { cpu_to_be64(((const u64 *)key)[0]), \ > > + cpu_to_be64(((const u64 *)key)[1]) }; \ > > + \ > > + if (keylen != GHASH_BLOCK_SIZE) \ > > + return -EINVAL; \ > > + \ > > + memcpy(&ctx->key, key, GHASH_BLOCK_SIZE); \ > > + gcm_init_rv64i_ ## VARIANT(ctx->htable, k); \ > > + \ > > + ctx->ghash_func = gcm_ghash_rv64i_ ## GHASH; \ > > + \ > > + return 0; \ > > +} > > I'd prefer three identical functions over a macro here. Code searching > tools and compiler warnings are significantly worse with macros. done :-) > > + > > +static int riscv64_zbc_ghash_update(struct shash_desc *desc, > > + const u8 *src, unsigned int srclen) > > +{ > > + unsigned int len; > > + struct riscv64_ghash_ctx *ctx = crypto_tfm_ctx(crypto_shash_tfm(desc->tfm)); > > + struct riscv64_ghash_desc_ctx *dctx = shash_desc_ctx(desc); > > + > > + if (dctx->bytes) { > > + if (dctx->bytes + srclen < GHASH_DIGEST_SIZE) { > > + memcpy(dctx->buffer + dctx->bytes, src, > > + srclen); > > + dctx->bytes += srclen; > > + return 0; > > + } > > + memcpy(dctx->buffer + dctx->bytes, src, > > + GHASH_DIGEST_SIZE - dctx->bytes); > > + > > + ctx->ghash_func(dctx->shash, ctx->htable, > > + dctx->buffer, GHASH_DIGEST_SIZE); > > + > > + src += GHASH_DIGEST_SIZE - dctx->bytes; > > + srclen -= GHASH_DIGEST_SIZE - dctx->bytes; > > + dctx->bytes = 0; > > + } > > + len = srclen & ~(GHASH_DIGEST_SIZE - 1); > > + > > + if (len) { > > + gcm_ghash_rv64i_zbc(dctx->shash, ctx->htable, > > + src, len); > > + src += len; > > + srclen -= len; > > + } > > + > > + if (srclen) { > > + memcpy(dctx->buffer, src, srclen); > > + dctx->bytes = srclen; > > + } > > + return 0; > > +} > > + > > +static int riscv64_zbc_ghash_final(struct shash_desc *desc, u8 *out) > > +{ > > + int i; > > + struct riscv64_ghash_ctx *ctx = crypto_tfm_ctx(crypto_shash_tfm(desc->tfm)); > > + struct riscv64_ghash_desc_ctx *dctx = shash_desc_ctx(desc); > > + > > + if (dctx->bytes) { > > + for (i = dctx->bytes; i < GHASH_DIGEST_SIZE; i++) > > + dctx->buffer[i] = 0; > > + ctx->ghash_func(dctx->shash, ctx->htable, > > + dctx->buffer, GHASH_DIGEST_SIZE); > > Can we do this without an indirect call? hmm, the indirect call is in both riscv64_zbc_ghash_update() and riscv64_zbc_ghash_final() . And I found a missing one at the bottom of riscv64_zbc_ghash_update(), where gcm_ghash_rv64i_zbc() is called right now. Getting rid of the indirect call would mean duplicating both of these functions for all instances. Especially with the slightly higher complexity of the update this somehow seems not the best way to go. Thanks for your pointers Heiko 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 AD62BC7EE22 for ; Thu, 11 May 2023 10:30:59 +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=h2FzN6xE82tKUTTClXiwq9yb67jkJJY31XUpxLs4YW4=; b=XcNVXvqpWttGqh ReYOgn++bb/tUsJzI669XrNXFLVP0tgXRh1gehE9jg7Xv8JIMhsGcbCCy5gtjImcP0HmMg2+Wau7y IINhDOnYcf7ei4CYb8zFiwKOvKE0/9M9db0V8uTwFt4zLPxlSJ9OXPW18ywwfsk0l0d4Esr3Buv97 FpOZGOUGN8q6VOlHQ2A2xpoMhS+kQt8c96TZf8B1S1xJArLcPf9Am00F6lxhlWylAFqh1XGuLRoLo X5HcDG2y2q95ucOHr40UDEXOPCMO1eBqLIvUzcgN709LEN9tZCe4N3G1Np/vN3HRv7hI6wHrLsg+u a9vPuAmOK3dYSGNTNWew==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1px3ZV-008Run-2v; Thu, 11 May 2023 10:30:53 +0000 Received: from gloria.sntech.de ([185.11.138.130]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1px3ZT-008RuA-0r for linux-riscv@lists.infradead.org; Thu, 11 May 2023 10:30:52 +0000 Received: from ip5b412278.dynamic.kabel-deutschland.de ([91.65.34.120] helo=diego.localnet) by gloria.sntech.de with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1px3ZJ-0004sW-Uy; Thu, 11 May 2023 12:30:41 +0200 From: Heiko =?ISO-8859-1?Q?St=FCbner?= To: Nathan Huckleberry Cc: palmer@dabbelt.com, paul.walmsley@sifive.com, aou@eecs.berkeley.edu, herbert@gondor.apana.org.au, davem@davemloft.net, conor.dooley@microchip.com, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-crypto@vger.kernel.org, christoph.muellner@vrull.eu Subject: Re: [PATCH v4 4/4] RISC-V: crypto: add accelerated GCM GHASH implementation Date: Thu, 11 May 2023 12:30:41 +0200 Message-ID: <3540048.LM0AJKV5NW@diego> In-Reply-To: References: <20230329140642.2186644-1-heiko.stuebner@vrull.eu> <20230329140642.2186644-5-heiko.stuebner@vrull.eu> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230511_033051_302239_6910D6AF X-CRM114-Status: GOOD ( 22.50 ) 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 SGkgTmF0aGFuLAoKQW0gRGllbnN0YWcsIDExLiBBcHJpbCAyMDIzLCAxNzowMDowMCBDRVNUIHNj aHJpZWIgTmF0aGFuIEh1Y2tsZWJlcnJ5Ogo+IE9uIFdlZCwgTWFyIDI5LCAyMDIzIGF0IDc6MDji gK9BTSBIZWlrbyBTdHVlYm5lciA8aGVpa29Ac250ZWNoLmRlPiB3cm90ZToKPiA+ICtzdHJ1Y3Qg cmlzY3Y2NF9naGFzaF9jdHggewo+ID4gKyAgICAgICB2b2lkICgqZ2hhc2hfZnVuYykodTY0IFhp WzJdLCBjb25zdCB1MTI4IEh0YWJsZVsxNl0sCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAg ICBjb25zdCB1OCAqaW5wLCBzaXplX3QgbGVuKTsKPiA+ICsKPiA+ICsgICAgICAgLyoga2V5IHVz ZWQgYnkgdmVjdG9yIGFzbSAqLwo+ID4gKyAgICAgICB1MTI4IGh0YWJsZVsxNl07Cj4gCj4gVGhp cyBmaWVsZCBsb29rcyB0b28gYmlnLiBUaGUgYXNzZW1ibHkgb25seSBsb2FkcyB0aGUgZmlyc3Qg MTI4LWJ5dGUKPiB2YWx1ZSBmcm9tIHRoaXMgdGFibGUuCgpPcGVuU1NMIGRlZmluZXMgdGhlIEh0 YWJsZSBmaWVsZCBoYW5kZWQgdG8gdGhlIGluaXQtIGFuZCB0aGUgb3RoZXIKZnVuY3Rpb25zIGFz IHRoaXMgInUxMjggSHRhYmxlWzE2XSIgICAgWzBdIC4gQXMgSSByZWFsbHkgbGlrZSB0aGUgY29u Y2VwdApvZiBrZWVwaW5nIGluIHN5bmMgd2l0aCBvcGVuU1NMLCBJIGd1ZXNzIEknZCByYXRoZXIg bm90IGNoYW5nZSB0aGF0LgoKWzBdIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuc3NsL29wZW5zc2wv YmxvYi9tYXN0ZXIvY3J5cHRvL21vZGVzL2djbTEyOC5jI0w4OAoKCj4gSXMgdGhpcyBjb3BpZWQg ZnJvbSBhbm90aGVyIGltcGxlbWVudGF0aW9uPyBUaGVyZSdzIGFuIG9wdGltaXphdGlvbgo+IHdo ZXJlIHlvdSBwcmVjb21wdXRlIHRoZSBmaXJzdCBOIHBvd2VycyBvZiBIIHNvIHRoYXQgeW91IGNh biBwZXJmb3JtIDEKPiBmaW5pdGUgZmllbGQgcmVkdWN0aW9uIGZvciBldmVyeSBOIG11bHRpcGxp Y2F0aW9ucywgYnV0IGl0IGRvZXNuJ3QKPiBsb29rIGxpa2UgdGhhdCdzIGJlaW5nIHVzZWQgaGVy ZS4KClRoZSB3aG9sZSBjcnlwdG8tc3BlY2lmaWMgY29kZSBjb21lcyBmcm9tIG9wZW5TU0wgaXRz ZWxmLCBzbyBmb3Igbm93IEkKZ3Vlc3MgSSdkIGxpa2UgdG8gdHJ5IGtlZXBpbmcgdGhpbmdzIHRo ZSBzYW1lLgoKCj4gPiArI2RlZmluZSBSSVNDVjY0X1pCQ19TRVRLRVkoVkFSSUFOVCwgR0hBU0gp ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArdm9pZCBnY21faW5pdF9ydjY0aV8g IyMgVkFSSUFOVCh1MTI4IEh0YWJsZVsxNl0sIGNvbnN0IHU2NCBYaVsyXSk7ICAgICBcCj4gPiAr c3RhdGljIGludCByaXNjdjY0X3piY19naGFzaF9zZXRrZXlfICMjIFZBUklBTlQoc3RydWN0IGNy eXB0b19zaGFzaCAqdGZtLCAgICAgIFwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBjb25zdCB1OCAqa2V5LCAgICAgICAgICAgICAgIFwKPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuKSAg ICAgICAgIFwKPiA+ICt7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ICsgICAgICAgc3RydWN0IHJpc2N2NjRf Z2hhc2hfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eChjcnlwdG9fc2hhc2hfdGZtKHRmbSkpOyBc Cj4gPiArICAgICAgIGNvbnN0IHU2NCBrWzJdID0geyBjcHVfdG9fYmU2NCgoKGNvbnN0IHU2NCAq KWtleSlbMF0pLCAgICAgICAgICBcCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICBjcHVf dG9fYmU2NCgoKGNvbnN0IHU2NCAqKWtleSlbMV0pIH07ICAgICAgICBcCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCj4gPiArICAgICAgIGlmIChrZXlsZW4gIT0gR0hBU0hfQkxPQ0tfU0laRSkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIC1F SU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBcCj4gPiArICAgICAgIG1lbWNweSgmY3R4LT5rZXksIGtleSwgR0hBU0hfQkxP Q0tfU0laRSk7ICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArICAgICAgIGdjbV9pbml0X3J2 NjRpXyAjIyBWQVJJQU5UKGN0eC0+aHRhYmxlLCBrKTsgICAgICAgICAgICAgICAgICAgICBcCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCj4gPiArICAgICAgIGN0eC0+Z2hhc2hfZnVuYyA9IGdjbV9naGFz aF9ydjY0aV8gIyMgR0hBU0g7ICAgICAgICAgICAgICAgICAgICBcCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCj4gPiArICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArfQo+IAo+IEknZCBwcmVmZXIgdGhyZWUgaWRl bnRpY2FsIGZ1bmN0aW9ucyBvdmVyIGEgbWFjcm8gaGVyZS4gQ29kZSBzZWFyY2hpbmcKPiB0b29s cyBhbmQgY29tcGlsZXIgd2FybmluZ3MgYXJlIHNpZ25pZmljYW50bHkgd29yc2Ugd2l0aCBtYWNy b3MuCgpkb25lIDotKQoKCj4gPiArCj4gPiArc3RhdGljIGludCByaXNjdjY0X3piY19naGFzaF91 cGRhdGUoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc3JjbGVuKQo+ID4gK3sKPiA+ICsgICAg ICAgdW5zaWduZWQgaW50IGxlbjsKPiA+ICsgICAgICAgc3RydWN0IHJpc2N2NjRfZ2hhc2hfY3R4 ICpjdHggPSBjcnlwdG9fdGZtX2N0eChjcnlwdG9fc2hhc2hfdGZtKGRlc2MtPnRmbSkpOwo+ID4g KyAgICAgICBzdHJ1Y3QgcmlzY3Y2NF9naGFzaF9kZXNjX2N0eCAqZGN0eCA9IHNoYXNoX2Rlc2Nf Y3R4KGRlc2MpOwo+ID4gKwo+ID4gKyAgICAgICBpZiAoZGN0eC0+Ynl0ZXMpIHsKPiA+ICsgICAg ICAgICAgICAgICBpZiAoZGN0eC0+Ynl0ZXMgKyBzcmNsZW4gPCBHSEFTSF9ESUdFU1RfU0laRSkg ewo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRjdHgtPmJ1ZmZlciArIGRjdHgt PmJ5dGVzLCBzcmMsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2xlbik7 Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICBkY3R4LT5ieXRlcyArPSBzcmNsZW47Cj4gPiAr ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKPiA+ICsgICAgICAgICAgICAgICB9Cj4g PiArICAgICAgICAgICAgICAgbWVtY3B5KGRjdHgtPmJ1ZmZlciArIGRjdHgtPmJ5dGVzLCBzcmMs Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICBHSEFTSF9ESUdFU1RfU0laRSAtIGRjdHgtPmJ5 dGVzKTsKPiA+ICsKPiA+ICsgICAgICAgICAgICAgICBjdHgtPmdoYXNoX2Z1bmMoZGN0eC0+c2hh c2gsIGN0eC0+aHRhYmxlLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY3R4 LT5idWZmZXIsIEdIQVNIX0RJR0VTVF9TSVpFKTsKPiA+ICsKPiA+ICsgICAgICAgICAgICAgICBz cmMgKz0gR0hBU0hfRElHRVNUX1NJWkUgLSBkY3R4LT5ieXRlczsKPiA+ICsgICAgICAgICAgICAg ICBzcmNsZW4gLT0gR0hBU0hfRElHRVNUX1NJWkUgLSBkY3R4LT5ieXRlczsKPiA+ICsgICAgICAg ICAgICAgICBkY3R4LT5ieXRlcyA9IDA7Cj4gPiArICAgICAgIH0KPiA+ICsgICAgICAgbGVuID0g c3JjbGVuICYgfihHSEFTSF9ESUdFU1RfU0laRSAtIDEpOwo+ID4gKwo+ID4gKyAgICAgICBpZiAo bGVuKSB7Cj4gPiArICAgICAgICAgICAgICAgZ2NtX2doYXNoX3J2NjRpX3piYyhkY3R4LT5zaGFz aCwgY3R4LT5odGFibGUsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywg bGVuKTsKPiA+ICsgICAgICAgICAgICAgICBzcmMgKz0gbGVuOwo+ID4gKyAgICAgICAgICAgICAg IHNyY2xlbiAtPSBsZW47Cj4gPiArICAgICAgIH0KPiA+ICsKPiA+ICsgICAgICAgaWYgKHNyY2xl bikgewo+ID4gKyAgICAgICAgICAgICAgIG1lbWNweShkY3R4LT5idWZmZXIsIHNyYywgc3JjbGVu KTsKPiA+ICsgICAgICAgICAgICAgICBkY3R4LT5ieXRlcyA9IHNyY2xlbjsKPiA+ICsgICAgICAg fQo+ID4gKyAgICAgICByZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCByaXNj djY0X3piY19naGFzaF9maW5hbChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdTggKm91dCkKPiA+ ICt7Cj4gPiArICAgICAgIGludCBpOwo+ID4gKyAgICAgICBzdHJ1Y3QgcmlzY3Y2NF9naGFzaF9j dHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KGNyeXB0b19zaGFzaF90Zm0oZGVzYy0+dGZtKSk7Cj4g PiArICAgICAgIHN0cnVjdCByaXNjdjY0X2doYXNoX2Rlc2NfY3R4ICpkY3R4ID0gc2hhc2hfZGVz Y19jdHgoZGVzYyk7Cj4gPiArCj4gPiArICAgICAgIGlmIChkY3R4LT5ieXRlcykgewo+ID4gKyAg ICAgICAgICAgICAgIGZvciAoaSA9IGRjdHgtPmJ5dGVzOyBpIDwgR0hBU0hfRElHRVNUX1NJWkU7 IGkrKykKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGRjdHgtPmJ1ZmZlcltpXSA9IDA7Cj4g PiArICAgICAgICAgICAgICAgY3R4LT5naGFzaF9mdW5jKGRjdHgtPnNoYXNoLCBjdHgtPmh0YWJs ZSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGN0eC0+YnVmZmVyLCBHSEFT SF9ESUdFU1RfU0laRSk7Cj4gCj4gQ2FuIHdlIGRvIHRoaXMgd2l0aG91dCBhbiBpbmRpcmVjdCBj YWxsPwoKaG1tLCB0aGUgaW5kaXJlY3QgY2FsbCBpcyBpbiBib3RoIHJpc2N2NjRfemJjX2doYXNo X3VwZGF0ZSgpIGFuZApyaXNjdjY0X3piY19naGFzaF9maW5hbCgpIC4gQW5kIEkgZm91bmQgYSBt aXNzaW5nIG9uZSBhdCB0aGUgYm90dG9tCm9mIHJpc2N2NjRfemJjX2doYXNoX3VwZGF0ZSgpLCB3 aGVyZSBnY21fZ2hhc2hfcnY2NGlfemJjKCkgaXMKY2FsbGVkIHJpZ2h0IG5vdy4KCkdldHRpbmcg cmlkIG9mIHRoZSBpbmRpcmVjdCBjYWxsIHdvdWxkIG1lYW4gZHVwbGljYXRpbmcgYm90aCBvZiB0 aGVzZQpmdW5jdGlvbnMgZm9yIGFsbCBpbnN0YW5jZXMuIEVzcGVjaWFsbHkgd2l0aCB0aGUgc2xp Z2h0bHkgaGlnaGVyCmNvbXBsZXhpdHkgb2YgdGhlIHVwZGF0ZSB0aGlzIHNvbWVob3cgc2VlbXMg bm90IHRoZSBiZXN0IHdheSB0byBnby4KCgpUaGFua3MgZm9yIHlvdXIgcG9pbnRlcnMKSGVpa28K CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgt cmlzY3YgbWFpbGluZyBsaXN0CmxpbnV4LXJpc2N2QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDov L2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1yaXNjdgo=