From patchwork Wed Jun 21 22:48:01 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gary R Hook X-Patchwork-Id: 9803127 X-Patchwork-Delegate: herbert@gondor.apana.org.au Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 22A426038C for ; Wed, 21 Jun 2017 22:48:17 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F21552818E for ; Wed, 21 Jun 2017 22:48:16 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E689C28372; Wed, 21 Jun 2017 22:48:16 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BFD852818E for ; Wed, 21 Jun 2017 22:48:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752105AbdFUWsP (ORCPT ); Wed, 21 Jun 2017 18:48:15 -0400 Received: from mail-cys01nam02on0060.outbound.protection.outlook.com ([104.47.37.60]:16256 "EHLO NAM02-CY1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751755AbdFUWsN (ORCPT ); Wed, 21 Jun 2017 18:48:13 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector1-amd-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=DWv92OwyKAD7jGPunZKU0TO5Ew6SU8SeosSST/mrxtM=; b=vuuf3fX6DafPerXy5KpeuKpiy3MAKMhmnGPMrdnm1hMdytbIL7fn6dDxXoPN/tvoz+f6ICKLe5hctpfsR5lTzkboZ3mJFd4va6LJvK3b8o8nBd51rzrf8LeScXyPHv7BUm9TEwmXsdz46VDaoIkzgpd6SR8h8VbA2G00ZEGYmis= Authentication-Results: amd.com; dkim=none (message not signed) header.d=none;amd.com; dmarc=none action=none header.from=amd.com; Received: from taos.amd.com (165.204.77.1) by MWHPR12MB1328.namprd12.prod.outlook.com (10.169.205.141) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1199.15; Wed, 21 Jun 2017 22:48:10 +0000 Subject: [PATCH 3/4] crypto: ccp - Add support for RSA on the CCP From: Gary R Hook To: linux-crypto@vger.kernel.org Cc: thomas.lendacky@amd.com, herbert@gondor.apana.org.au, davem@davemloft.net Date: Wed, 21 Jun 2017 17:48:01 -0500 Message-ID: <20170621224801.15132.99552.stgit@taos.amd.com> In-Reply-To: <20170621224655.15132.20473.stgit@taos.amd.com> References: <20170621224655.15132.20473.stgit@taos.amd.com> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: MWHPR06CA0020.namprd06.prod.outlook.com (10.174.172.161) To MWHPR12MB1328.namprd12.prod.outlook.com (10.169.205.141) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 9ffe11a7-02e0-45b9-d3b3-08d4b8f797f3 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(48565401081)(201703131423075)(201703031133081); SRVR:MWHPR12MB1328; X-Microsoft-Exchange-Diagnostics: 1; MWHPR12MB1328; 3:jJvNSxJetYF2VIT+87u2BAUVNFLgumKNXwNcjRsMy2dnzZtklopZilCYeLUqV0ZL5O7hscDco1x9sZRfumqhAriVuNDQE+NEYOW97nL6k/mqgSgtdF1vd9B4wdtGaJL+tTHoWITxs6Wtu2YJ+kNSOr1ZSmt3HLr0e1B4l2bLunORjkc7UhHtJFOwUdkUNiVRZ9oMNlkShwf5SW0x2m8Mk73vq/uKsdgg34h1Y5wQ3QY0zI8b2ZYjTcmaipSDIIzvNWY8SPzMUc+eOjeMDcE+MOMCqtbwdJAtiZuw22oZdXWY1bk9HEoSIDsV51ZRGNFo+w73+T892mBNz8rDGkVYj87Z8jWVEeVfu2eZN5gEVNw=; 25:y2BWAXkFrwkDdMSorDzC/PaxVrIdFtKdp5tRHQ9RoSz9KwW9y2pHsQkNJL94/0IK0b7lRUaDjUcZ62oyID+1XT2zE7LYcWGtuURA97yrrEYICrrMYUpr3/g+I1+6slW9R51+C1t7Rm857tLefwX8zqdWjv+uXWDmNnrVqIvqwf0BfXEsXLG5zC2S71/joY/OrB/98mKnRiLmFrSRrAQnB/FZ01uT4NSwMwmYfzc0TqB4cy3JzLW4mv5KN8R8iGU+EOmUQVMEx0QOoMTKhjYoWbQjy8Q5ufkCIbPi5PI71cSV626sj4jNWR89sdZf+yAyRdnIfjOF8iuXRCSkN2aI57k34TKbOboEzgF2V6uzjYbZ8DmT9Ogq/sGH1We7CEvG6yP0a749M5CDhz9M1Lb+P2aj9isxk46MoVsBxi8IY/Ip58wDj4A+L2NXr3yI3YzTy9XWbDBqX35muhRulkvxQ9LXHTEo/dBzN2MRiIzN+EY= X-MS-TrafficTypeDiagnostic: MWHPR12MB1328: X-Microsoft-Exchange-Diagnostics: 1; MWHPR12MB1328; 31:W40d20PyL6wxVzpVlF26Geguk/UU8ynI/q9RPhH3AxZ33yNYvAXBidRuNiJdKeyp/YEor2ylNBPRLCt6iDL3TeG7vWbtvoU/uN3E7/jdPzXmTRYTjcf4Fe2lvV4PFPgizMzos4+4Baw1ipI89Q8kO+daj3/u/045+YVMTZ7rybcEJU3SYmwGPgQOvV6sJE/peojbsUW7IX0HE/cwsY9qJ2l+/B1yPvjBB1AAiiFs7+Q=; 20:3phKdgWlsZm0SEBHtY99FBhH63V8eA7Lb4GIDqDNVs3AyXg3BSxnPx3246bvcg97944kWL60A6k7Os4Y4eEU0fhP8Jl0sHRCHWhzXdpBrydCDivdlxZEd3dQhHPGjW8Xa/Ya+AwaW1dVUy5La2VDGIONC+mPMWL4cuwc4JzbOXFu82cQeZAD9BiCv/r4cIxP5AyDvBcDBMtBcsM3l3FLbrGOSB0QaPxe2orp8zspIeBc+NNtk6C1QW+0Q9AoCduRYbvhgVrFN0Z9peEIGHTMov+ODZOqj8GIi1l1Cb0prOkRLvbm4ruHsHK/dBaQFNV1axzZqhdujzZmCohjaCgXmmhlhjh0EJivLGwfyBNOlL6bV5Ad7HClD3RYxOfNVVYh0zXoc+9dWAvMpi3brSAB9goHHF/La8vAHdQnN+y84rSNJemBUtSinEvnGcaAAWZ3uBbbeNallTw2liQGMnRX1TnDrhbolCdyf/LdYf9BUscYtNm3tXffampoT2cNUhyS X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001)(100000703101)(100105400095)(93006095)(93001095)(6055026)(6041248)(20161123560025)(20161123562025)(20161123555025)(20161123564025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:MWHPR12MB1328; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:MWHPR12MB1328; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtNV0hQUjEyTUIxMzI4OzQ6R1hHQkRGUFdnL1o3YWZFWlJCdU9MVlE4QmJU?= =?utf-8?B?c3lkc1FMKzQwOFNaSXhjMlp5bm1xSXlvQTR3WkZ3cmRPUko5Z2MyVysySi9t?= =?utf-8?B?eURXTksyb3VaT056R3N3SU41eWd1RFJhcXlNektXTlFvUUZjMWFQZG8zUVov?= =?utf-8?B?WFhYbElHUE53TUk1c1VURDEzVWVTMHI0Y01MZExnQUhMWWVLKzc5ck9DVjFD?= =?utf-8?B?UWxZd3B6Qk9iUzJKQVVuTFlLVmorRGZ0VHZvVXVGY24zVmZHVTJ6RFFJaG02?= =?utf-8?B?OVMrNVk0OWhhOWdhVnJFNFkrZUpPbFNyNGQ5Z0E5emRYYmNnNnJBLzBBNDJP?= =?utf-8?B?ZC9UVDlYVEV5eHhJcUxqK3NHeTJWOHNKUVc3dmJBZ1laZmVsU3RhVTJIUzc3?= =?utf-8?B?Z2RIaGJiRUxjQkl0cW50TXFzQStJdHRMcHZ1YytCK1JneUV4T3dUTXFISVB5?= =?utf-8?B?L2JhMys3SmlFSEhUcWxIRm9rZ3VIRjZTeldjcFJ0L3AyaUJlYkZON29LWHIr?= =?utf-8?B?UHdTd3M5MWtEMlN5NGRqTW5QbUdSS0JTYmw5cWJmNTN6VHd3NXJrVnhWTHcw?= =?utf-8?B?c0tXU3gzMm0wSEFaWmFlREg5WkUzZ2hIS1JUZ1dLaW5LdEs3ZmtzczBkSHVi?= =?utf-8?B?R1hqaEVLV1BybXZRcmpiTVNQd1VVWDBxZjJDVWM5emlkbFRxK0lha2kzZXZY?= =?utf-8?B?UWxLcFEyMUROU2ttMENsOTBTRWhZOXRoUHdGODFEcUNZN2Y5bzNZVVZ1a1pT?= =?utf-8?B?NURUeFpTN0xLcUd6R1hYZkdIcnhGZjhsNWJLMWx1QVRyL2RRdnhRTlVqVmVL?= =?utf-8?B?c1FiZDNzc1ZWVS93ZW5HS1daa3ZCbnNMaTlMRXg0M2JURzBmQzgzVm5IbkZE?= =?utf-8?B?ZnpmZTY0TWhGNkppOGt5OGUrMXpxeHdSLzArS0xGL1JnejI2dDl0S1Yyd3lX?= =?utf-8?B?bzYydzNnRXp3bUtNYTJXTFZBR056NENSK2NFU2VwK0REOFd1T0VIRUhwVmR0?= =?utf-8?B?aFlKQmd1ZVk3aUREYnpsdzU5ZGxNVU41c2YycGhmNVh3OUN1ajRxOVBTaFVU?= =?utf-8?B?YjNIdU9Hb2V3UEw0WlFMNlEzaDBIOGlER2N6K0VyZEg1dXpaQ0NOT0xTdXZz?= =?utf-8?B?VE5BYXU3YlRVM2NScWNGaXRjR2lIYjk2ZlA5TnlxbXRsdzdNcnM4VWFrVzZJ?= =?utf-8?B?dnExY2l5WTNPWUIrdGhHUUtEM3p2UWRJemZ6MVYyK081cmNacmxCL0d5Qmh5?= =?utf-8?B?UTJ3QXJ5RlY5dW1KRmVvWUxkZmZXWGRKUm9yWEd1TDNmVWVYcVpLaTZFbGUr?= =?utf-8?B?Y2F3VFppMDdoOVVZTUFDQ2NXbHJhTE5hanhPVklaQWFSalFnazBmV05KTmdZ?= =?utf-8?B?NTNGWTJXN0UrcDhUZ1VmQmt5QlNjWjRlblJ1bytadS85SkNvOEFtUnc3RGVi?= =?utf-8?B?MzNrcnBPS3EwZDcwOHNBeTNkcjdzd3R6Q0svdTRabDNIUGpEa3lHdEdIM0cx?= =?utf-8?B?aUkyREtWOFpIRDIrZzRjMllwT1pRdFg2MjlGenptSE9IYkhacnJoZzRWWERv?= =?utf-8?B?cVZrblMwcm9jL1FHRUFtTWtYUzlER0JLYTdCNVhFWU5IYi9sL3hsU2hoNHJ1?= =?utf-8?Q?BkF6pcu1yXD4Z+169gJ?= X-Forefront-PRVS: 0345CFD558 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(979002)(6009001)(39840400002)(39860400002)(39850400002)(39450400003)(39410400002)(39400400002)(4001350100001)(189998001)(103116003)(55016002)(25786009)(38730400002)(53936002)(50466002)(23676002)(8676002)(81166006)(110136004)(6916009)(2950100002)(6666003)(50986999)(76176999)(54356999)(2351001)(2361001)(5660300001)(42186005)(7736002)(4326008)(6116002)(3846002)(230700001)(1076002)(33646002)(53416004)(72206003)(305945005)(97746001)(83506001)(2906002)(478600001)(86362001)(47776003)(66066001)(2004002)(969003)(989001)(999001)(1009001)(1019001); DIR:OUT; SFP:1101; SCL:1; SRVR:MWHPR12MB1328; H:taos.amd.com; FPR:; SPF:None; MLV:ovrnspm; PTR:InfoNoRecords; LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtNV0hQUjEyTUIxMzI4OzIzOm9XYzFPUVVoelpxWXJWMGdBR3RxSVdRZGFy?= =?utf-8?B?S1cwcVhZQTdMejRFUUhudHpzL0dDZGsrMEJENkNKeVV6eWpBVGpickk1RytT?= =?utf-8?B?QmhycE43dG8vZEw0dmUva1d4TVdDTnNLc2daYUtJdFVKQTcrSkplWTRySVBF?= =?utf-8?B?NCtZL2lwWElBb1JzZ25WM1pkS3NLOWY5RWR6SjJlV1p0QVg3Rmt1SCt4dDFL?= =?utf-8?B?QjNNZjQ5Ykd1L0QzSUd5SGxTUkJHYklYVzB0eUJqbHZickROSVR4SEdSL3BP?= =?utf-8?B?OC9vMlczbEpNNGxoazE0a1FHTXJOVXVYQ0pETXVUVmY0T3l2bnZTT0c1blYr?= =?utf-8?B?RDFrV21UTHVwSGdKOWpuOHhGNEhESjMzbjU0d3hZVFBIYVI0WVdrWkYwaldq?= =?utf-8?B?MW5HSzZtOWRLOXhzL2NncndjTHg2OEFNclJIUjBtN3FJa1Bvdjg3VmZhSHRk?= =?utf-8?B?empHVzllVHBsd2Z0QVB2NCtEaFNyRnBiU1Fyd0hSbXQ0NUo2ZUNkbjVIZEVB?= =?utf-8?B?SnpOQmNoUnYycjEvOUkzT3hOeXVGR2I0Wnp1RnM2OFF4NzdKaWtUV3VQQnlp?= =?utf-8?B?bml5Y0t1VFMzNGRjaHBvVlljV01ZZnZTL24xTWpacjNlTkg0MHRjVTVJTmFw?= =?utf-8?B?Tm0wREdSVDBoUTlveWk0S2w0U0pCc2FvTnBFaElnQ3V4L2hQTC9qdXhVdlBj?= =?utf-8?B?LzhGR3kwVDZHTjNta09XRlpIQnhSUDRrTXl6enhqUTkzQktyNkxlbldNZ0Fi?= =?utf-8?B?V0ZSV3BhYmFTRTFCWGxjNk11ZHpJcng2K1p6bGgwa203YS9OeFdFdnA2SHdJ?= =?utf-8?B?anZySWZ0ZFdiRHhweFlwUkhCS2hQVS8wa2xMVGcxMVUwTUN2L1R3TFpuZitV?= =?utf-8?B?cVJFR1BqMUJLelJuWVYxKzNILzZRSDl0RDRJOSt0N3JiOTFiSW1OQjAzQkdw?= =?utf-8?B?d3MvZy9rbks3cDhtczJja1ZaVkNjQXNmbnNNdHBQWFhsdmltYnZnNUU1S0dJ?= =?utf-8?B?TmJnNHZlK1dpN3dBQlJOclA0eWthbXJIcDVpbldHMGVZV3RrZTBjMGh3S2Iv?= =?utf-8?B?ZWQ3TGNEQjFIVk1VemxsSkhvbHlWRGJxZEU1STAwbG0yOHBOUUE4WXgvRWFP?= =?utf-8?B?dGEzamdSQ3NYN0N0ODNOdWt6OFdFNTA2YjFGTHVkdUJjUUtLbE0vamFjZFdE?= =?utf-8?B?YmFpdytJOUVhWGdoL25ta3BlZDdkMEkxeUlKMFJmMlBYVEhMZkNMNFZyNVBu?= =?utf-8?B?cDhFWDhhQkhCZ0Vlb2s4NXZIUnhmNTg4cGdzTmpGc0NoT0J2cEJXWit5K2xm?= =?utf-8?B?dHJpelZaZ0J6dGhVUVRRdlRLekZKU1ljbi9JOGJPMDZBOEJYUlNBVlBVZGVn?= =?utf-8?B?YmxWSDJ0dFlqVWtPTC8rWEFva0l5MEQvR0ZYNm8zNkIyZ0tjZ0VuM044a1ZR?= =?utf-8?B?S2dIOU80V2dFdEltaDZ3Sm96Z0NzaU1VeUROZzlLM3YvK0xGajd5UWRIN2lI?= =?utf-8?B?WmVHSUxuazRqbkhKOWlFTENNVGV3Y0ZlUURuLzcwaUtkNXNjVkZnakJmbmNk?= =?utf-8?B?L0h2NFlwcThGV0VUT3NyZXphRS9ya1ZHRHdGVDQ0bC9QUHlwK0pFQzBEbmo0?= =?utf-8?B?MW5BT3BSN0lYU2pTL3RnOVBLUGxFOEREc0hRWTh2TUJzOFg5cjQzVzV1REM3?= =?utf-8?B?R1pQaEd1eXRGdTA2VHBjQ1Q3a3cwc2xweXhwMm95MFVGZ1NpZms5OE5YeDZu?= =?utf-8?B?bmhRdGFmQkFuYjZkSGpzZz09?= X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtNV0hQUjEyTUIxMzI4OzY6MzQ1aHF3aE5tRVpLNlBkcjYwSkVOa0VBSXUr?= =?utf-8?B?VXUweDdjcXpHc1FMS3NzemtRU09ZbDJwWXQrNm1iZUk2M3lyOVVqa0NDcnJY?= =?utf-8?B?MEllVVVpQzBuaXcvcUpVeUYvWWdUU0JaT0taWTFlMXl3UitVVkVibytKMkpS?= =?utf-8?B?Wm9zQ2NaOU52SHVya0ZUOEVuVytNN2srZnJ4VnlxT2t4OGtPMEJJSVJVZ05V?= =?utf-8?B?S1RKV1NYQ2pSb0ZWK0JyeWFMSFlhdVlTWW5KZm8vaXBrL3IyTW1UTmF2Qyt1?= =?utf-8?B?U1ppRmZHb25lcEUvRDAyckxjUjNmUTFmUEhkNUpRMmh5SnlQSjZtbEFxL2pt?= =?utf-8?B?QkhTdmVVVlQ2Z1lGRmdlNjgrV1BTWmd6VU9NMHhzTm5xWnpEbFJhcTBURWZ2?= =?utf-8?B?cDcyenhIVzBpZXJBSXpQL0Z3SlhXdGhCZG8vamVhdkg4Z1N5VGZqK05taFZj?= =?utf-8?B?bVk1cWc2TGgvOWlVNWhHczhuaURndDRETHNSNVArSGlwdG90UFE4R3NBSU95?= =?utf-8?B?WkU0UzdpSzhuRkFZaFFlWnBrZDJwRnBKOEViejNVYnE4RkNUS0trT0dvVU1F?= =?utf-8?B?SzcwUFc3ZUw3MEdRYlhFa3ZYbktQRlRDRmdYQTlJd01nN045ci8rR1NBUUs5?= =?utf-8?B?NFM5aklrQWkxNW9mNU1BQVpicTBEMWJCTjBHSEpuVEQvK1I1UENUcnNkMkdS?= =?utf-8?B?MUloT0IwTGNJaS9udTIzUEo5eW5ycS9ndHV0QUVPVHRTWkxGdys5eVpiZUEw?= =?utf-8?B?aDVjWXN0VzNqK0xWWkIxQWNTa0EvcUVwdko3OGp5emNFR2ZrTHRPb0hsQThX?= =?utf-8?B?Tysva3hmV0JjQ01jS3BYa3ZEODRBY3pMOFFCUzlFMVdDSnI0M1JJL1FpSGY0?= =?utf-8?B?RGR1ZmpjenltQmNRZEg0YlZSd3pQcnJ6T2JGdEJicTlYV0QvRllxcnk4a29Y?= =?utf-8?B?MzVpdDF4Rm8wa1BxZjdTcEtzdjA2d1gyb0J4TU9PM2lIa3pFTmpnUm9jejZC?= =?utf-8?B?V0cwdWJtY21QT05yYTdudFhSdnpNdG5HNDRnTTJ3L0NaN1RrTzQ3SHR3ODhN?= =?utf-8?B?SGtEQm9jVlNrK2ZkSklBcTNtVVdpYm1IOGkwZzdsazRISHl4bFczQTQ4RTBR?= =?utf-8?B?NXd5SUcrV0FWRVhEdTBIQlJ3VjhYOWI5MVAxQWlhSWFXdnhlemZxV2tmY3hv?= =?utf-8?B?K0dMekFoSzFRYndEQS9acTVFNTFBeTFFb0E2cG0wNGxtem9rR0poREgra0F5?= =?utf-8?B?WW5uaStlVjNBcG1KUS85WlhvOTFkOEhzQktSbXVhaVZBWFcza01XYk9MYjdo?= =?utf-8?B?c1hxdWtoL2ZURmJiOURFdG5XY2ZkVFFsOWdQRFdEbHMzek1Mc0lNdjFoa1I4?= =?utf-8?Q?ry3d4cq?= X-Microsoft-Exchange-Diagnostics: 1; MWHPR12MB1328; 5:04VgQTFTL5vknd7Zp8BEs0B/LoCi1OQfBLnCXDD0dhcyoqV7ZQ7SB422N3ktq5P+lxR0apV0drLbIjD4YTeV2UNZ/YH+xuunbwzl55apMpgOcuPDupXBFNUE/tpWjZ59Dtr/B47CIRLxo2DFHEyt7prl4f1Utnw6wY+wMhTqnCAaMB8882BLrR49DGk/wVTUvTJkcYjVWQwMf2qVDus+EUMLDkUw88ZJacozHd9GvTuCXOe6WeMxuZyr/+3csApVE8jQ/iBaW+y1Flu5a3CFlo+OTnHo8Rx1LRaMmC6CSElMdNkj5zGra0WBzKQiBv220sBm4GtA+yBe7UsCjFbXLL1Xtnx2jUl0aERox6zrtIVpEyTrvvJTJ0iZiI0gcKzz4rJhv4C2RRt6NDaJb0ZwBpKsjtKQLlRAJjG31FxIClp2AY9fUxmar7PV9X6QhbRsY0UJtcZXeI7miueT7k3G34NsufxUFzOWWUQ8Im31n5r9GRhPKTkeFdiUz/4tkT5/; 24:o4Eis5TShIxlc54y4NgJGnJ02FprkP9PjX/p5saqAXooja8/yZIo+vwLASZZUpFs0FVk3r0WNJxrT5+TZ10SgZLQmQMBuI8X/r2kSgdkFAs= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; MWHPR12MB1328; 7:G5n+Gzz962aYDsnoeAUeKgtc2s+IWcw16sHIC1Ugq6Iw/s3A7DfWYVqTCSqb+eJGewso92VNNZHot/Yyszu5byKC0OoRusS0uJslutLcoS27qU3ttg+tvJHvLfFtgIoG/ZJlVk17VIH+V7kB5FnNgjIozkfbAjyMKv5ieDC22MZAJQ8TiuflMLwE46t4+awhn33Lh/l0mNMp6eDjw4OHnIY8eWZ769MEw88WJ5pR+ATP4yhew1vyASxANPRpRsC0PUb6LCHfsUPEjtxmRfDmzsxtAVKiYP83G4O1d7k+s+meMr+5tAAxsLfgpTQqrtFaQ57DVyxZoA4x/8VAUPpeIgoaLXVRXlFOGKx5lgK6UQaE9JzfI6BPv43/L2sffZsngUoK9PAmM7hAkjSdPyeToxo5NB3U6Fm9lmVOVVDLFvOAbGMVn71Xt+VCOCV1sAdkEqe2A+RFv/XhSH/ANd9Y8E+GtvqWQejE1TnLiL+Pbuve6yeCzhWg1GRNjFWM4XIaxml6isQJVlgguNga4KPPtmFpevA9ox8Fn69/4N34VkPJgM8OM7WGUgSptnzwUMktflTBs/Q/CrqonB43pmsy2efmicSJQ9lFFjXz+Mr1p/+6mGrmP6afkQ9MCJw2PS2RopTrlgwH3GWAjBpZFLruT4+Q4GynPYDyZRqC3HLs43oZz0wXttnuloLiKoeOoU168nzMKV0hUZAiCoHXZOucwfq+lMzGDo3Vc6Cvu34F8fapUKAiHrhXXa4NyjPw4HtHetHq/NcAG/OFCWh+wpYBi8l0/H6byt8+uq/sx4EU3Wc= X-Microsoft-Exchange-Diagnostics: 1; MWHPR12MB1328; 20:yls8NDkJanUrCiXPfYXq1bTbitv9UI7DVAujVTMavDaRqZBfQc77vzkPo5Qoj9zg/Wt1jJ7cslf8xna4sRTt++4Qcg0jYVSGqyZAJWqT+g1z1wc5e1xIr9MSbNFCdCJD9Bd2PoRFjDFCgxeoJfipwSHUAeWFFKHMNj3MBoBBVtN8aRQOtDRFQSFpm+ZdPTKlycQ/cYF8u/u+AncW6ZjBtRUn5HLzKr4wNso+4opFYKMh/wbtNcXr4t/HkwZ0peds X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Jun 2017 22:48:10.6385 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR12MB1328 Sender: linux-crypto-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Wire up the v3 CCP as a cipher provider. Signed-off-by: Gary R Hook --- drivers/crypto/ccp/Makefile | 1 drivers/crypto/ccp/ccp-crypto-main.c | 21 ++ drivers/crypto/ccp/ccp-crypto-rsa.c | 286 ++++++++++++++++++++++++++++++++++ drivers/crypto/ccp/ccp-crypto.h | 31 ++++ drivers/crypto/ccp/ccp-debugfs.c | 1 drivers/crypto/ccp/ccp-dev.c | 1 drivers/crypto/ccp/ccp-ops.c | 2 include/linux/ccp.h | 1 8 files changed, 341 insertions(+), 3 deletions(-) create mode 100644 drivers/crypto/ccp/ccp-crypto-rsa.c diff --git a/drivers/crypto/ccp/Makefile b/drivers/crypto/ccp/Makefile index 59493fd3a751..439bc2fcb464 100644 --- a/drivers/crypto/ccp/Makefile +++ b/drivers/crypto/ccp/Makefile @@ -15,4 +15,5 @@ ccp-crypto-objs := ccp-crypto-main.o \ ccp-crypto-aes-xts.o \ ccp-crypto-aes-galois.o \ ccp-crypto-des3.o \ + ccp-crypto-rsa.o \ ccp-crypto-sha.o diff --git a/drivers/crypto/ccp/ccp-crypto-main.c b/drivers/crypto/ccp/ccp-crypto-main.c index 8dccbddabef1..dd7d00c680e7 100644 --- a/drivers/crypto/ccp/ccp-crypto-main.c +++ b/drivers/crypto/ccp/ccp-crypto-main.c @@ -17,6 +17,7 @@ #include #include #include +#include #include "ccp-crypto.h" @@ -37,10 +38,15 @@ module_param(des3_disable, uint, 0444); MODULE_PARM_DESC(des3_disable, "Disable use of 3DES - any non-zero value"); +static unsigned int rsa_disable; +module_param(rsa_disable, uint, 0444); +MODULE_PARM_DESC(rsa_disable, "Disable use of RSA - any non-zero value"); + /* List heads for the supported algorithms */ static LIST_HEAD(hash_algs); static LIST_HEAD(cipher_algs); static LIST_HEAD(aead_algs); +static LIST_HEAD(akcipher_algs); /* For any tfm, requests for that tfm must be returned on the order * received. With multiple queues available, the CCP can process more @@ -358,6 +364,14 @@ static int ccp_register_algs(void) return ret; } + if (!rsa_disable) { + ret = ccp_register_rsa_algs(&akcipher_algs); + if (ret) { + rsa_disable = 1; + return ret; + } + } + return 0; } @@ -366,6 +380,7 @@ static void ccp_unregister_algs(void) struct ccp_crypto_ahash_alg *ahash_alg, *ahash_tmp; struct ccp_crypto_ablkcipher_alg *ablk_alg, *ablk_tmp; struct ccp_crypto_aead *aead_alg, *aead_tmp; + struct ccp_crypto_akcipher_alg *akc_alg, *akc_tmp; list_for_each_entry_safe(ahash_alg, ahash_tmp, &hash_algs, entry) { crypto_unregister_ahash(&ahash_alg->alg); @@ -384,6 +399,12 @@ static void ccp_unregister_algs(void) list_del(&aead_alg->entry); kfree(aead_alg); } + + list_for_each_entry_safe(akc_alg, akc_tmp, &akcipher_algs, entry) { + crypto_unregister_akcipher(&akc_alg->alg); + list_del(&akc_alg->entry); + kfree(akc_alg); + } } static int ccp_crypto_init(void) diff --git a/drivers/crypto/ccp/ccp-crypto-rsa.c b/drivers/crypto/ccp/ccp-crypto-rsa.c new file mode 100644 index 000000000000..4a2a71463594 --- /dev/null +++ b/drivers/crypto/ccp/ccp-crypto-rsa.c @@ -0,0 +1,286 @@ +/* + * AMD Cryptographic Coprocessor (CCP) RSA crypto API support + * + * Copyright (C) 2016 Advanced Micro Devices, Inc. + * + * Author: Gary R Hook + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ccp-crypto.h" + +static inline struct akcipher_request *akcipher_request_cast( + struct crypto_async_request *req) +{ + return container_of(req, struct akcipher_request, base); +} + +static int ccp_rsa_complete(struct crypto_async_request *async_req, int ret) +{ + struct akcipher_request *req = akcipher_request_cast(async_req); + struct ccp_rsa_req_ctx *rctx = akcipher_request_ctx(req); + + if (!ret) + req->dst_len = rctx->cmd.u.rsa.key_size >> 3; + + ret = 0; + + return ret; +} + +static unsigned int ccp_rsa_maxsize(struct crypto_akcipher *tfm) +{ + return CCP_RSA_MAXMOD; +} + +static int ccp_rsa_crypt(struct akcipher_request *req, bool encrypt) +{ + struct crypto_akcipher *tfm = crypto_akcipher_reqtfm(req); + struct ccp_ctx *ctx = akcipher_tfm_ctx(tfm); + struct ccp_rsa_req_ctx *rctx = akcipher_request_ctx(req); + int ret = 0; + + memset(&rctx->cmd, 0, sizeof(rctx->cmd)); + INIT_LIST_HEAD(&rctx->cmd.entry); + rctx->cmd.engine = CCP_ENGINE_RSA; + + rctx->cmd.u.rsa.key_size = ctx->u.rsa.key_len; /* in bits */ + if (encrypt) { + rctx->cmd.u.rsa.exp = &ctx->u.rsa.e_sg; + rctx->cmd.u.rsa.exp_len = ctx->u.rsa.e_len; + } else { + rctx->cmd.u.rsa.exp = &ctx->u.rsa.d_sg; + rctx->cmd.u.rsa.exp_len = ctx->u.rsa.d_len; + } + rctx->cmd.u.rsa.mod = &ctx->u.rsa.n_sg; + rctx->cmd.u.rsa.mod_len = ctx->u.rsa.n_len; + rctx->cmd.u.rsa.src = req->src; + rctx->cmd.u.rsa.src_len = req->src_len; + rctx->cmd.u.rsa.dst = req->dst; + + ret = ccp_crypto_enqueue_request(&req->base, &rctx->cmd); + + return ret; +} + +static int ccp_rsa_encrypt(struct akcipher_request *req) +{ + return ccp_rsa_crypt(req, true); +} + +static int ccp_rsa_decrypt(struct akcipher_request *req) +{ + return ccp_rsa_crypt(req, false); +} + +static int ccp_check_key_length(unsigned int len) +{ + /* In bits */ + if (len < 8 || len > 4096) + return -EINVAL; + return 0; +} + +static void ccp_rsa_free_key_bufs(struct ccp_ctx *ctx) +{ + /* Clean up old key data */ + kfree(ctx->u.rsa.e_buf); + ctx->u.rsa.e_buf = NULL; + ctx->u.rsa.e_len = 0; + kfree(ctx->u.rsa.n_buf); + ctx->u.rsa.n_buf = NULL; + ctx->u.rsa.n_len = 0; + kfree(ctx->u.rsa.d_buf); + ctx->u.rsa.d_buf = NULL; + ctx->u.rsa.d_len = 0; +} + +static int ccp_rsa_setkey(struct crypto_akcipher *tfm, const void *key, + unsigned int keylen, bool private) +{ + struct ccp_ctx *ctx = akcipher_tfm_ctx(tfm); + struct rsa_key raw_key; + int key_len, i; + int ret; + + ccp_rsa_free_key_bufs(ctx); + memset(&raw_key, 0, sizeof(raw_key)); + + /* Code borrowed from crypto/rsa.c */ + if (private) + ret = rsa_parse_priv_key(&raw_key, key, keylen); + else + ret = rsa_parse_pub_key(&raw_key, key, keylen); + if (ret) + goto e_key; + + /* Remove leading zeroes from the modulus (n) */ + key_len = 0; + for (i = 0; i < raw_key.n_sz; i++) + if (raw_key.n[i]) { + key_len = raw_key.n_sz - i; + break; + } + ctx->u.rsa.key_len = key_len << 3; /* bits */ + if (ccp_check_key_length(ctx->u.rsa.key_len)) { + ret = -EINVAL; + goto e_key; + } + ctx->u.rsa.n_len = key_len; + sg_init_one(&ctx->u.rsa.n_sg, raw_key.n + i, key_len); + + /* Remove leading zeroes from the public key (e) */ + key_len = 0; + for (i = 0; i < raw_key.e_sz; i++) + if (raw_key.e[i]) { + key_len = raw_key.e_sz - i; + break; + } + ctx->u.rsa.e_len = key_len; + sg_init_one(&ctx->u.rsa.e_sg, raw_key.e + i, key_len); + + if (private) { + /* Remove leading zeroes from the private key (d) */ + key_len = 0; + for (i = 0; i < raw_key.d_sz; i++) + if (raw_key.d[i]) { + key_len = raw_key.d_sz - i; + break; + } + ctx->u.rsa.d_len = key_len; + sg_init_one(&ctx->u.rsa.d_sg, raw_key.d + i, key_len); + } + + return 0; + +e_key: + return ret; +} + +static int ccp_rsa_setprivkey(struct crypto_akcipher *tfm, const void *key, + unsigned int keylen) +{ + return ccp_rsa_setkey(tfm, key, keylen, true); +} + +static int ccp_rsa_setpubkey(struct crypto_akcipher *tfm, const void *key, + unsigned int keylen) +{ + return ccp_rsa_setkey(tfm, key, keylen, false); +} + +static int ccp_rsa_init_tfm(struct crypto_akcipher *tfm) +{ + struct ccp_ctx *ctx = akcipher_tfm_ctx(tfm); + + akcipher_set_reqsize(tfm, sizeof(struct ccp_rsa_req_ctx)); + ctx->complete = ccp_rsa_complete; + + return 0; +} + +static void ccp_rsa_exit_tfm(struct crypto_akcipher *tfm) +{ + struct ccp_ctx *ctx = crypto_tfm_ctx(&tfm->base); + + ccp_rsa_free_key_bufs(ctx); +} + +static struct akcipher_alg ccp_rsa_defaults = { + .encrypt = ccp_rsa_encrypt, + .decrypt = ccp_rsa_decrypt, + .sign = ccp_rsa_decrypt, + .verify = ccp_rsa_encrypt, + .set_pub_key = ccp_rsa_setpubkey, + .set_priv_key = ccp_rsa_setprivkey, + .max_size = ccp_rsa_maxsize, + .init = ccp_rsa_init_tfm, + .exit = ccp_rsa_exit_tfm, + .base = { + .cra_name = "rsa", + .cra_driver_name = "rsa-ccp", + .cra_priority = CCP_CRA_PRIORITY, + .cra_module = THIS_MODULE, + .cra_ctxsize = 2 * sizeof(struct ccp_ctx), + }, +}; + +struct ccp_rsa_def { + unsigned int version; + const char *name; + const char *driver_name; + unsigned int reqsize; + struct akcipher_alg *alg_defaults; +}; + +static struct ccp_rsa_def rsa_algs[] = { + { + .version = CCP_VERSION(3, 0), + .name = "rsa", + .driver_name = "rsa-ccp", + .reqsize = sizeof(struct ccp_rsa_req_ctx), + .alg_defaults = &ccp_rsa_defaults, + } +}; + +int ccp_register_rsa_alg(struct list_head *head, const struct ccp_rsa_def *def) +{ + struct ccp_crypto_akcipher_alg *ccp_alg; + struct akcipher_alg *alg; + int ret; + + ccp_alg = kzalloc(sizeof(*ccp_alg), GFP_KERNEL); + if (!ccp_alg) + return -ENOMEM; + + INIT_LIST_HEAD(&ccp_alg->entry); + + alg = &ccp_alg->alg; + *alg = *def->alg_defaults; + snprintf(alg->base.cra_name, CRYPTO_MAX_ALG_NAME, "%s", def->name); + snprintf(alg->base.cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s", + def->driver_name); + ret = crypto_register_akcipher(alg); + if (ret) { + pr_err("%s akcipher algorithm registration error (%d)\n", + alg->base.cra_name, ret); + kfree(ccp_alg); + return ret; + } + + list_add(&ccp_alg->entry, head); + + return 0; +} + +int ccp_register_rsa_algs(struct list_head *head) +{ + int i, ret; + unsigned int ccpversion = ccp_version(); + + /* Register the RSA algorithm in standard mode + * This works for CCP v3 and later + */ + for (i = 0; i < ARRAY_SIZE(rsa_algs); i++) { + if (rsa_algs[i].version > ccpversion) + continue; + ret = ccp_register_rsa_alg(head, &rsa_algs[i]); + if (ret) + return ret; + } + + return 0; +} diff --git a/drivers/crypto/ccp/ccp-crypto.h b/drivers/crypto/ccp/ccp-crypto.h index dd5bf15f06e5..5d592ecc9af5 100644 --- a/drivers/crypto/ccp/ccp-crypto.h +++ b/drivers/crypto/ccp/ccp-crypto.h @@ -24,6 +24,8 @@ #include #include #include +#include +#include #define CCP_LOG_LEVEL KERN_INFO @@ -58,6 +60,12 @@ struct ccp_crypto_ahash_alg { struct ahash_alg alg; }; +struct ccp_crypto_akcipher_alg { + struct list_head entry; + + struct akcipher_alg alg; +}; + static inline struct ccp_crypto_ablkcipher_alg * ccp_crypto_ablkcipher_alg(struct crypto_tfm *tfm) { @@ -227,12 +235,34 @@ struct ccp_sha_exp_ctx { u8 buf[MAX_SHA_BLOCK_SIZE]; }; +/***** RSA related defines *****/ + +struct ccp_rsa_ctx { + unsigned int key_len; /* in bits */ + struct scatterlist e_sg; + u8 *e_buf; + unsigned int e_len; + struct scatterlist n_sg; + u8 *n_buf; + unsigned int n_len; + struct scatterlist d_sg; + u8 *d_buf; + unsigned int d_len; +}; + +struct ccp_rsa_req_ctx { + struct ccp_cmd cmd; +}; + +#define CCP_RSA_MAXMOD (4 * 1024 / 8) + /***** Common Context Structure *****/ struct ccp_ctx { int (*complete)(struct crypto_async_request *req, int ret); union { struct ccp_aes_ctx aes; + struct ccp_rsa_ctx rsa; struct ccp_sha_ctx sha; struct ccp_des3_ctx des3; } u; @@ -249,5 +279,6 @@ struct scatterlist *ccp_crypto_sg_table_add(struct sg_table *table, int ccp_register_aes_aeads(struct list_head *head); int ccp_register_sha_algs(struct list_head *head); int ccp_register_des3_algs(struct list_head *head); +int ccp_register_rsa_algs(struct list_head *head); #endif diff --git a/drivers/crypto/ccp/ccp-debugfs.c b/drivers/crypto/ccp/ccp-debugfs.c index 99aba1622613..88191c45ca7d 100644 --- a/drivers/crypto/ccp/ccp-debugfs.c +++ b/drivers/crypto/ccp/ccp-debugfs.c @@ -291,7 +291,6 @@ void ccp5_debugfs_setup(struct ccp_device *ccp) struct dentry *debugfs_q_instance; struct dentry *debugfs_q_stats; unsigned long flags; - int rc = 0; int i; if (!debugfs_initialized()) diff --git a/drivers/crypto/ccp/ccp-dev.c b/drivers/crypto/ccp/ccp-dev.c index 2506b5025700..67cbb3e76888 100644 --- a/drivers/crypto/ccp/ccp-dev.c +++ b/drivers/crypto/ccp/ccp-dev.c @@ -415,6 +415,7 @@ static void ccp_do_cmd_complete(unsigned long data) struct ccp_cmd *cmd = tdata->cmd; cmd->callback(cmd->data, cmd->ret); + complete(&tdata->completion); } diff --git a/drivers/crypto/ccp/ccp-ops.c b/drivers/crypto/ccp/ccp-ops.c index 11155e52c52c..2cdd15a92178 100644 --- a/drivers/crypto/ccp/ccp-ops.c +++ b/drivers/crypto/ccp/ccp-ops.c @@ -1786,7 +1786,7 @@ static int ccp_run_rsa_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) if (ret) goto e_exp; - if (cmd_q->ccp->vdata->version < CCP_VERSION(4, 0)) { + if (cmd_q->ccp->vdata->version < CCP_VERSION(5, 0)) { /* The RSA exponent may span multiple (32-byte) KSB entries and * must be in little endian format. Reverse copy each 32-byte * chunk of the exponent (En chunk to E0 chunk, E(n-1) chunk to diff --git a/include/linux/ccp.h b/include/linux/ccp.h index 3285c944194a..c03ee844a99d 100644 --- a/include/linux/ccp.h +++ b/include/linux/ccp.h @@ -20,7 +20,6 @@ #include #include - struct ccp_device; struct ccp_cmd;