Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp257291ybl; Tue, 10 Dec 2019 22:22:55 -0800 (PST) X-Google-Smtp-Source: APXvYqznqF0vrPGRKgy/93x3VdESB+kHpMJSC2O/LwFqizF7Ep00bKx7KeMH2JTBtEi9o14ShX5X X-Received: by 2002:a9d:73c4:: with SMTP id m4mr1074338otk.87.1576045374945; Tue, 10 Dec 2019 22:22:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576045374; cv=none; d=google.com; s=arc-20160816; b=oOG6VHpd9ORdOrqMowExbn4MUTyhFwd+u/pIl/ZkBzeJQM80wXBVPGX2//02hzX7j8 JH9000prMMKHxnn2VDGG/ml7FbphhIikrRK0KepCGJYTjAWMFJbkgbTb79GQ4Nse32cu 2y49/xDafzItuntqv6R2drytKlBnAniGE+3zgIhxj9ZfioMkzUmY/4aI0o5zOaH86bKB uNCYfNnUHAi5RXfz6Givs+z6pD6vDZQdEhpfGrJJmAUG3x9fdzW1S7s6kTvz1DSfxyj9 cxzNDH5Hoyt9xKRwt3VdrEFNyo69RF8m5ZFXKMJHGql2Bys9O08fSycBPoDF5g/T5+p/ 6xcg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-language:in-reply-to:mime-version :user-agent:date:message-id:from:references:cc:to:subject :dkim-signature; bh=xIsAmOPt/Bk3TdkQXacN4fKNRyb3fHMDAiXhit8kKco=; b=K013LoobqNgz4lKGaAeHSu24EwSIDGBBHFPqlOdKVGjcrJij1GiJlsxxiCI0dNXrfE DH6Xoi/QkrNrsNnmoJG6hbN4gcoA+yR0rCU9WQVE7QB7yXOJoePww1XcbglCfaV1iAwO 5NM0LaN7oCJlGJOcahQLR0bZIkM9oMbUz8ALeGTPOUs+zMhxS87tAtrJyIhRGCby4pj0 X9dvY9SfRh2GiPMXrz921ViDAfQwu/MBU7JKnXEZelhjxOroT8zOfoEbXk2PFYdEZUBL S9sAXT6i0hd5jElgC967hOHOWKpEy1BEbNjxzpArBoISkHiQRPgiNOOTU2igVEzP5bvN tI5A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=U9frAd9y; spf=pass (google.com: best guess record for domain of linux-crypto-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d68si574110oib.194.2019.12.10.22.22.35; Tue, 10 Dec 2019 22:22:54 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-crypto-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=U9frAd9y; spf=pass (google.com: best guess record for domain of linux-crypto-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726451AbfLKGWe (ORCPT + 99 others); Wed, 11 Dec 2019 01:22:34 -0500 Received: from lelv0143.ext.ti.com ([198.47.23.248]:49630 "EHLO lelv0143.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726357AbfLKGWe (ORCPT ); Wed, 11 Dec 2019 01:22:34 -0500 Received: from fllv0035.itg.ti.com ([10.64.41.0]) by lelv0143.ext.ti.com (8.15.2/8.15.2) with ESMTP id xBB6MSSH103080; Wed, 11 Dec 2019 00:22:28 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1576045348; bh=xIsAmOPt/Bk3TdkQXacN4fKNRyb3fHMDAiXhit8kKco=; h=Subject:To:CC:References:From:Date:In-Reply-To; b=U9frAd9yUR3j81cJZpRjJfbCSfJoRGUIv6YH52R4wYVChn4AIyyLnc6PylZAYLnj9 eFY+T3L4sy7HafLYz4pec6K0bF7un4tD05EtII0RzOYGSM6tv0UQYP7rMZNvQ3t55D he0dEnQrC6P8qKRod9bcbnwxb5570jXoMAIonPJQ= Received: from DFLE100.ent.ti.com (dfle100.ent.ti.com [10.64.6.21]) by fllv0035.itg.ti.com (8.15.2/8.15.2) with ESMTP id xBB6MSmi040800; Wed, 11 Dec 2019 00:22:28 -0600 Received: from DFLE112.ent.ti.com (10.64.6.33) by DFLE100.ent.ti.com (10.64.6.21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1847.3; Wed, 11 Dec 2019 00:22:27 -0600 Received: from lelv0327.itg.ti.com (10.180.67.183) by DFLE112.ent.ti.com (10.64.6.33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1847.3 via Frontend Transport; Wed, 11 Dec 2019 00:22:27 -0600 Received: from [10.24.69.174] (ileax41-snat.itg.ti.com [10.172.224.153]) by lelv0327.itg.ti.com (8.15.2/8.15.2) with ESMTP id xBB6MPnf063359; Wed, 11 Dec 2019 00:22:26 -0600 Subject: Re: aes_expandkey giving wrong expanded keys over crypto_aes_expand_key(older deprecated implementation under aes_generic) To: Ard Biesheuvel CC: "open list:HARDWARE RANDOM NUMBER GENERATOR CORE" , "Kristo, Tero" , Herbert Xu References: <82a75666-3cb7-e33d-d873-1aad5581a13c@ti.com> <2a124fcf-9bdc-7305-1d0b-6482ffffe3c5@ti.com> From: Keerthy X-Pep-Version: 2.0 Message-ID: Date: Wed, 11 Dec 2019 11:52:41 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.2.1 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------FF35AB608D0C104CC8B86B70" Content-Language: en-US X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Sender: linux-crypto-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org --------------FF35AB608D0C104CC8B86B70 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable On 10/12/19 7:23 pm, Ard Biesheuvel wrote: > On Tue, 10 Dec 2019 at 12:04, Keerthy wrote: >> >> >> >> On 10/12/19 3:37 pm, Ard Biesheuvel wrote: >>> On Tue, 10 Dec 2019 at 11:06, Keerthy wrote: >>>> >>>> >>>> >>>> On 10/12/19 3:31 pm, Ard Biesheuvel wrote: >>>>> Hello Keerthy, >>>>> >>>>> On Tue, 10 Dec 2019 at 10:35, Keerthy wrote: >>>>>> >>>>>> Hi Ard, >>>>>> >>>>>> I am not sure if am the first one to report this. It seems like >>>>>> aes_expandkey is giving me different expansion over what i get wit= h the >>>>>> older crypto_aes_expand_key which was removed with the below commi= t: >>>>>> >>>>>> commit 5bb12d7825adf0e80b849a273834f3131a6cc4e1 >>>>>> Author: Ard Biesheuvel >>>>>> Date: Tue Jul 2 21:41:33 2019 +0200 >>>>>> >>>>>> crypto: aes-generic - drop key expansion routine in favor of l= ibrary >>>>>> version >>>>>> >>>>>> The key that is being expanded is from the crypto aes(cbc) testsui= te: >>>>>> >>>>>> }, { /* From NIST SP800-38A */ >>>>>> .key =3D "\x8e\x73\xb0\xf7\xda\x0e\x64\x52" >>>>>> "\xc8\x10\xf3\x2b\x80\x90\x79\xe5" >>>>>> "\x62\xf8\xea\xd2\x52\x2c\x6b\x7b", >>>>>> .klen =3D 24, >>>>>> >>>>>> >>>>>> The older version crypto_aes_expand_key output that passes the cbc= (aes) >>>>>> decryption test: >>> ... >>>>>> >>>>>> The difference is between 52nd index through 59. >>>>>> >>>>>> Any ideas if this is expected? >>>>>> >>>>> >>>>> Yes, this is expected. This particular test vector uses a 192 bit k= ey, >>>>> so those values are DC/ignored. >>>> >>>> Thanks for the quick response. However with the new implementation >>>> decryption test case fails for me with wrong result. >>> >>> Can you share more details please? Platform, endianness, etc .. >> >> Ard, >> >> I am trying to get aes working on a yet to be upstream TI HW crypto >> Accelerator SA2UL. It is little endian. >> >> I had posted a series earlier this year: >> >> https://lkml.org/lkml/2019/6/28/20 >> >> The device expects the inverse key for decryption. >> >=20 > Could you elaborate? There is no such thing as an inverse *key*, only > an inverse *key schedule* which is used for the Equivalent Inverse > Cipher. Sorry i was a bit unclear. >=20 > AES-192 expands the 24 byte key to 13 round keys consisting of 4 > 32-bit words each, and so the algorithm does not actually use the > contents of slots 52 and up in this case. >=20 >> In the earlier working version i was copying the ctx.key_enc[48] to >> ctx.key_enc[53] index of the ctx.key_enc array as the 24 bytes of >> decryption key to my hardware. >> >> Now as told earlier the 52nd & 53rd words are changed and hence i end = up >> in wrong result. >> >> Fail: >> >> ctx.key_dec[48] =3D 0xf7b0738e & ctx.key_enc[48] =3D 0x6fa08be9 >> ctx.key_dec[49] =3D 0x52640eda & ctx.key_enc[49] =3D 0x3c778c44 >> ctx.key_dec[50] =3D 0x2bf310c8 & ctx.key_enc[50] =3D 0x472cc8e >> ctx.key_dec[51] =3D 0xe5799080 & ctx.key_enc[51] =3D 0x2220001 >> ctx.key_dec[52] =3D 0x13eaf950 & ctx.key_enc[52] =3D 0x13eaf850 >> ctx.key_dec[53] =3D 0xffff8000 & ctx.key_enc[53] =3D 0xffff8000 >> >> Pass: >> >> ctx.key_dec[48] =3D 0xf7b0738e & ctx.key_enc[48] =3D 0x6fa08be9 >> ctx.key_dec[49] =3D 0x52640eda & ctx.key_enc[49] =3D 0x3c778c44 >> ctx.key_dec[50] =3D 0x2bf310c8 & ctx.key_enc[50] =3D 0x472cc8e >> ctx.key_dec[51] =3D 0xe5799080 & ctx.key_enc[51] =3D 0x2220001 >> ctx.key_dec[52] =3D 0x105127e8 & ctx.key_enc[52] =3D 0x68342d29 >> ctx.key_dec[53] =3D 0xffff8000 & ctx.key_enc[53] =3D 0xddd31195 >> >=20 > The old code does the following for AES-192 >=20 > #define loop6(i) do { \ > t =3D ror32(t, 8); \ > t =3D ls_box(t) ^ rco_tab[i]; \ > t ^=3D ctx->key_enc[6 * i]; \ > ctx->key_enc[6 * i + 6] =3D t; \ > t ^=3D ctx->key_enc[6 * i + 1]; \ > ctx->key_enc[6 * i + 7] =3D t; \ > t ^=3D ctx->key_enc[6 * i + 2]; \ > ctx->key_enc[6 * i + 8] =3D t; \ > t ^=3D ctx->key_enc[6 * i + 3]; \ > ctx->key_enc[6 * i + 9] =3D t; \ > t ^=3D ctx->key_enc[6 * i + 4]; \ > ctx->key_enc[6 * i + 10] =3D t; \ > t ^=3D ctx->key_enc[6 * i + 5]; \ > ctx->key_enc[6 * i + 11] =3D t; \ > } while (0) >=20 > case AES_KEYSIZE_192: > ctx->key_enc[4] =3D get_unaligned_le32(in_key + 16); > t =3D ctx->key_enc[5] =3D get_unaligned_le32(in_key + 20); > for (i =3D 0; i < 8; ++i) > loop6(i); > break; >=20 > so while it happens to populate slots 52 and 53 as well (when i =3D=3D = 7), > the AES spec does not actually cover this, given that those values are > not actually used in the computation (and I am at a loss understanding > why it should make a difference in your case). >=20 > In any case, you can work around this by calculating the missing > values in your driver's expand_key() routine, >=20 > ctx.key_enc[52] =3D ctx.key_enc[51] ^ ctx.key_enc[46]; > ctx.key_enc[53] =3D ctx.key_enc[52] ^ ctx.key_enc[47]; Thanks a lot for the detailed explanation. Thanks a lot Ard. The above work around gets it working on my hardware for 24 byte keys. I will dig more details on that. Best Regards, Keerthy >=20 --------------FF35AB608D0C104CC8B86B70 Content-Type: application/pgp-keys; name="pEpkey.asc" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="pEpkey.asc" -----BEGIN PGP PUBLIC KEY BLOCK----- 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 Xpo=3D =3DNfsW -----END PGP PUBLIC KEY BLOCK----- --------------FF35AB608D0C104CC8B86B70--