From patchwork Thu Oct 13 14:53:09 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gary R Hook X-Patchwork-Id: 9375157 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 2032060839 for ; Thu, 13 Oct 2016 15:29:48 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0F1782A122 for ; Thu, 13 Oct 2016 15:29:48 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 02C3D2A135; Thu, 13 Oct 2016 15:29:47 +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.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID 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 083A72A122 for ; Thu, 13 Oct 2016 15:29:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756006AbcJMP3o (ORCPT ); Thu, 13 Oct 2016 11:29:44 -0400 Received: from mail-cys01nam02on0084.outbound.protection.outlook.com ([104.47.37.84]:60013 "EHLO NAM02-CY1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755116AbcJMP3m (ORCPT ); Thu, 13 Oct 2016 11:29:42 -0400 X-Greylist: delayed 90445 seconds by postgrey-1.27 at vger.kernel.org; Thu, 13 Oct 2016 11:28:53 EDT 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=9Fh/yzCapckAYR8AgeHrHd2IfD+29yL7s4jw3hmqpMs=; b=iOKEXmAjiliYI/kW6kXo+6y23+IXClJKcYV2rk+fPn+ITad6aFX4lVJZPKIb1A3dIYKLG7he2vOMxciIwuMNhwbGAUIGZKKiw4RwzK3GYbuh7MnbXDORPfkOubuR3fjU0ET1TqUILrhdP5/CDXGOjhfmP7nQdq/sW6WSBAOaLeA= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Gary.Hook@amd.com; Received: from [10.236.19.42] (165.204.78.1) by CY4PR12MB1397.namprd12.prod.outlook.com (10.168.169.18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.669.12; Thu, 13 Oct 2016 14:53:15 +0000 Subject: [PATCH 3/6] crypto: ccp - Add support for RSA on the CCP From: Gary R Hook To: CC: , , Date: Thu, 13 Oct 2016 09:53:09 -0500 Message-ID: <20161013145309.19759.18493.stgit@taos> In-Reply-To: <20161013144542.19759.6924.stgit@taos> References: <20161013144542.19759.6924.stgit@taos> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Originating-IP: [165.204.78.1] X-ClientProxiedBy: CY1PR20CA0057.namprd20.prod.outlook.com (10.163.250.25) To CY4PR12MB1397.namprd12.prod.outlook.com (10.168.169.18) X-MS-Office365-Filtering-Correlation-Id: 30ce941f-f12e-4a45-66da-08d3f378a99c X-Microsoft-Exchange-Diagnostics: 1; CY4PR12MB1397; 2:cgllHJPzNbkFyEXIrWe8onai7lBAHOPu7zYGBkfs+6k2QDQ+7wfHIRmIEAAy3mO4o+IUv6zgGXJRRmuUyigBsFUxa1LdpQpBdwYGqVvNOQZRFF+dCQ+W5KRJi/ovIBJPx40tI4zspf1+NlABXEx/aujzIkZcAP/YGGnBHdYARArZc9vHSL6Qool02ueQ8IutKGvFlijbdgTygnbPbrSEng==; 3:E2Mfmojn9nETqe+smR9zQt2sjAFrYir2Zqe1pjzIj/MgtxCH+uKWNhgWeiP+5K8VDiblW3989t82/Adjrm77nn9zIfbsfeoziqz305wNTL0iiIe8Cr65+/UnBwvXAQP03npmqGl/cSUH6aK2ZGZKnA==; 25:Xrr+9cHaVl7d6iEzbLE/06KrYfzmFkfyUtaTWvQ6F1utOGPASevTokjUsuZdL/kdm5CAxqIuhD85x42mbr8gxguGlA4xV9zbDTUs1ZGsXFGtnRJe+PBwCUj3hGiid1WM+uTl+irJCtBmFdPw3x56UJuHlNsZEUUWyRyMBxxq0605kvxwNGIP9LtJWq/0+fqQOQOOOiQKLzhj4L+Jq8wwxsmiECvf/tfGT1SSud9Jon/FHZV6rf5VB8HdmZKmkAlOiij7fc6/dbcKmC8m5KwRfKDTkIAsHuyhmju8sPxL/LcO2b6Q7C9gMVrX2JoGJpzS93FHwBUpLbVt/TupKHSQyA10kbJDxgWPuWfTfN1pqIE0K9JOPTwv7TehvNy8OhzoZFe08iEBHUdYmTQMlzXm08VTSoqEkgMMywnFxK8WMF0= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY4PR12MB1397; X-Microsoft-Exchange-Diagnostics: 1; CY4PR12MB1397; 31:PoR8ErCpdujs2XE6TAgCJOJMuRPfCu/aSYOUWHPuYAV/nmwnuOUIME06GX6j1GWog0t3L0HvXxNxVoqDFOCCdqAyV8kpyB23vvPk1iPfs1LvaM4FZs6PWiPBPDUkkD06UjtbreavkgzNHSAEDThOXELPVNJKSp+ujnFGU+netI3PY/MnMigKJK7nlGqcZ6ROw/mA5vqhx8JNKA7a71qbRcTiA+r/Dfk8U2BA3pWkQVxY7knGdW3uFoBMmcHDYBsF; 20:ydFn7kdEPNbnu7isQuSPcgxD5nvhKe7U/JDQO+qeSmC4Y+R8XyIgWr698UZqCBecMAc2mcUWTwSwmUQMhN1pTc2XP+gUejeK7QTu0tkeOvb4dZxfJ/rsDgR41C77dZHutge19wdDshQ4xuey0BoJGi7tu0cLxOkGGzQhnVhxPfUdq+6EJG/i1vJ9yulNU483pX+grtexiGCVGF/HYXxahG9YgADAXm6NVdlgj086WUVK+CBsz5kcBu+pF+zETlsRBBBDg3Nm7dMLTuCpxRPwrvkoDLYT2MMJHaYpV46N3ZbD15yanUOXyt6wKS5siD8qcmXKAbQfJVGtRzs65053KxdeyJg1pddY3bumL+M3odu1RV2VugOubwCS25c2lY1MYwWJVzgtEpZVvKCQKovpYn4o8fyczH3Hu8FCYgLdu4rGHB9fkyYw85fEaXYImLhkdVx/EANyK7LP8fBA53SithwyT2E6k3fApAvdM/KPBcplIQaLXk/yTfAVX42oe6SN X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6055026); SRVR:CY4PR12MB1397; BCL:0; PCL:0; RULEID:; SRVR:CY4PR12MB1397; X-Microsoft-Exchange-Diagnostics: 1; CY4PR12MB1397; 4:+6rnyEqDuklohJ0QcHz8BszDmQBzLiwL4xyBcMHxlNGvrLxZSdNAPZcf2qLkfh36ZMNGf8uBTaDZ3XElIhtyq5REXswFphmm7R0I/gwOnE30Fv44sdk5c21JAEyJ6TeK1MW84M2NYs4UtrN5S3JazuFW3D10DHLo8Ct7Taxd4JAr2ETm5VFS/93x9UA93pIi47rkUEpTrxW1rk9iVzu3k8fUSmhBvD+WVXGHxbfbv21A+xQdkbRd9AqZ5Z1OEjbaRfci2c+X0yj8XpXX4hAzx1civhQJDtkteAhjRK3KGFZWkjeiMnDA/tfXLrsDZHHSHnxnbQloCcWoMFclUiKuFyUAHvlOMIC0C2KozLE15Ev9XJtDiOXTUo0DzfGkWFEGhgQ658o9dDb/bO39TH5IWB686Fz6ySiC5fxaalkZczGxjo2hQGkfiBUGQbXqV3w+JFw2B7I/DWLQfeOpWz2W3w== X-Forefront-PRVS: 0094E3478A X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6049001)(6009001)(7916002)(189002)(199003)(50466002)(6116002)(103116003)(4326007)(106356001)(1076002)(3846002)(9686002)(586003)(66066001)(33646002)(77096005)(7736002)(189998001)(86362001)(83506001)(7846002)(23676002)(4001350100001)(575784001)(5660300001)(97736004)(305945005)(33716001)(19580395003)(97746001)(19580405001)(81156014)(50986999)(110136003)(6916009)(92566002)(76176999)(42186005)(81166006)(47776003)(6666003)(230700001)(2950100002)(54356999)(8676002)(101416001)(68736007)(229853001)(2351001)(105586002)(2906002)(2004002); DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR12MB1397; H:[10.236.19.42]; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtDWTRQUjEyTUIxMzk3OzIzOnhaaEJyejJJc0pSUFovbEtxSExSc3k5UzEx?= =?utf-8?B?RUswaXJMQmFMeXFBK2dxWVNaeU5hYSttanBUUm9oK2hxVVNteWF2VFliZlE4?= =?utf-8?B?NThBUDZVV3ExT3VYakp3cENpak5wK1hZakVDL3FlZnpoNW5iSFM5NXl4V21x?= =?utf-8?B?SGFNK1VzbUxsVVZJNE9uMFA0c3FRcGMrcGxSWWxOYVk1ZlhpT2hVUlNqdVVB?= =?utf-8?B?REp2MFhGUFVIVC9JYlVzaTRZOTdZSGVFWEF2bUtsYUZqSzRlSkJiVk9GMnJC?= =?utf-8?B?S2RGZlNoUVVPaFVzTHNHbmJVOXZYWnAreTdsNnNkRjdIRHNUUkxlYnZ4ZjlF?= =?utf-8?B?WVJvQlA5NGE4UzFMUlJIbzhBMEYrdFBLeWpLTlBJNkd5OExpNElzZEF3THBn?= =?utf-8?B?VVowMDBUcXlBVWlqVTFIaTZKNERyNzliaDBDeVdUYmFOKzFPTjZlblVwQzdP?= =?utf-8?B?M0JCWGs2Vy9sTXlxaXpBRTZtcFBGaHk3SlV4MnBJVmFiVnJrNUVuRjhQeDhp?= =?utf-8?B?UEc4NDRUQnEyMXBBVGZDb3lrSWNKTlJ6YUZwR2Y1V0E4SEt5TVg1VjMxbVAv?= =?utf-8?B?R3AvQUdEeTFoL3k3UUZ3bFd4NkZ2S3RVbElEQzRhNlQ3WVdwUkp6R3NLMU5k?= =?utf-8?B?NWJKL2pQazJ3cHVsdllQODd5UlBnWWp0N004MUxtVlVDNDFHbTM1SmpGNFpC?= =?utf-8?B?Q0MzZWczVFlHN213bGNURHhTWmV1ZEUwRFJUVkpJRndkYTBkMG44L0tYL0Nv?= =?utf-8?B?M0pFckp2NGY2NS9saHMzUDFvRVN4ZHhrQlRJMU9kUld0b3F4SFdMQXp5Nkha?= =?utf-8?B?MHJYRkU3Tzkyb3FYOG9YN3I1ZGIxeU92ZlNBenFuV25yb2R6eW5EN1NJU21G?= =?utf-8?B?SHJhdWY2T2FzU3RIN2pKVGk2Qjh3MFBPczREbDVVQmlrNVJxRnBaUDBhUlFm?= =?utf-8?B?anFVbjlCZXdKUGRkNm9kZk4vOXBJbmZQQXVqNW53TlMvV3VVR0Eydzk5Zloz?= =?utf-8?B?YWlBYWRFV2NMMkU2WHdsNmdscUFsSElGMWU0dmwzVldHTEQrb3U4aUptN1FW?= =?utf-8?B?NVRYeVZjN3lnWFhmdmIrNjExVTJ1QVN6dmhwdU9lOC90SEFYN1d3cTJKZWNF?= =?utf-8?B?QlFvSk1oYUZoSmdTbHRiV01KZ3R2UUd3eHE4TDg1Qi9LL0tYbmNLNER5bVFx?= =?utf-8?B?bFpGcUhCU2lZRm10TmVqM1g5emxOaHVQcUQzdk9mTnZ6TE1UVlh3R0h4WG9O?= =?utf-8?B?dThMZTRZQ0JRQUhyWHd1Ym9nWTVUQW9KVWt0V0Z5dEZ4VmlIc3lnOFJtQUJX?= =?utf-8?B?Nm5OS0w1UWQzdkVVcWtZTEFhTlcydTBpMC9hdXZudElDQXpzYU01cU1pT2kv?= =?utf-8?B?OHNnb1hRTTBueUJPWDFyM3VQVStRNHlYN3krT2NTM01ISW1TaFdzQVJkWDYr?= =?utf-8?B?YkFyRVJ0cnNuK3QyWUhMblphVUhBeU1KdktXUGZqMEFsdmQ1SmNWWDE5dEdx?= =?utf-8?B?c1JzbW5xWU9jTnZkMTRzaWR3b0pDZDVNUTlDVGNBMjF0ajBRa1BEUmxiMFcv?= =?utf-8?B?ZW8wSlRSeDZja0dyQk5xTzlSTFpPS3ZGSHlSYkRiRldMd3ZqNXEvL3NlN1lB?= =?utf-8?B?ak9xUDRkWGJycytWcmMyWklVQ0RqUEsrR21mNEpBV1UwVnFUbFlxSGx5eU5l?= =?utf-8?B?bGRRVXVwUXE0ZHNnKzVnQ3ZrNVZBM3BvMWFFVGNJbWE0MkNFZmxCN1V3NWdY?= =?utf-8?Q?hFBR3tcSXxyFlS0VGcB8CcvifGihVJO+w2zCk=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY4PR12MB1397; 6:rEcr24Iax021jIffg6QbI949qwlQkwEMBrtSFze/wPgfYsURr4TneEoPb6zlZ3qg9yntB2Weh7Kfuh7hKSrVv3XTILTWjklHh1ju4jQbvl9N77Sx0WAw2kExZiYzCmFfvL0I4IF3D6zsD0Lejuxa/zOMMaPtWqKiRfGlajuquPis9q8NTQFBHk3vOf/ZcOTSdy52OuRw3qvfU6InuaweXxFlNGRdQwIPD55tnlSdMcTLsZj1cx+qK6tnDjIqAUQk8EOxXgGNJTaw1hWY2W3dtqDVl2HsI4XbQ6DSAKpl0/F8ZFBsA6t3NcyigGEv/pWchJ82i9bNTTtCTSaI9SmPYA==; 5:K/dv1poFauaGQEtP79QCRiuqAkcgNdWrD56Lc3tLyhRBwv9tabajOVP6LOTzSPGayvgOWtXGx3BMfHtOd7LQxxTZsqa6fsPKmCeCB4+yvM9f7vfH3TYC9lR0eY7hOySIGI/T/9A1PjUwHmNGGNRspA==; 24:Yd9/g3Uiheq9d2XlL8AZH9AxC3GecWFfs4xG3FzQATsac7L4DVT/RWJLRPvpdOtC55btxbpplhT0bbCcguWFu3MUCwnajP/yVbThn4vV3Qc= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY4PR12MB1397; 7:GE2o33ObXxx5DMejOykA53BWKbvp6fDkCl3cFFpSzZMyIjyu9Bs1VyeO5p6J2iWsoVSj97Xqn2370+Wn8JJeiYlGZV7DHk4zRRV00mkyJjUMLKIXONHHkDFTUFSLvcQGUx7JfEssAA4k2LrhmLVB/rccVM1QXwqPtmMSKpNUMvw+GY2JDGKwIjGRYr8EkEVqWdsg2UEpgYj0zoosj4EzLtxKYpKt2cX3ixnAPs2WQA8WKrCY/9/DB5VBxXc+CpSnqABSY8xaMWc4D2aIng72qfLAHEF+vJDfZJO0MgfzBdbSBSFGIqslt4zThN5yIzF6bw9f6fQYpyMQhPXP/zoBtKkW9S5vSMoFQesdpDrEF8o=; 20:fMvzlJxO5IyC7/1UJycZIvy6tmh1obuCYpkg/HxYJ4l895/sUWx023UuA1ezQV5mmldoPgqSbLaQ35AZvxp7F8+22W//HKeG81XUuPl6RjnyO2sWwDnA2+MB2u13SxGhcSWys56A4PqONx9c0FhZaC4C1F42VkRwz5jMLDI8Qz8vuCfmfwfxqDGDNPh+aj+r8wyCzOKzpBJA6ADkQMW5K0icyQf1jnKxoiyaHNwja/GDSuW427XWWxAciMIEIzYJ X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Oct 2016 14:53:15.4144 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR12MB1397 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 | 15 ++ drivers/crypto/ccp/ccp-crypto-rsa.c | 258 ++++++++++++++++++++++++++++++++++ drivers/crypto/ccp/ccp-crypto.h | 24 +++ drivers/crypto/ccp/ccp-dev-v3.c | 38 +++++ drivers/crypto/ccp/ccp-ops.c | 1 include/linux/ccp.h | 34 ++++ 7 files changed, 370 insertions(+), 1 deletion(-) create mode 100644 drivers/crypto/ccp/ccp-crypto-rsa.c -- To unsubscribe from this list: send the line "unsubscribe linux-crypto" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/crypto/ccp/Makefile b/drivers/crypto/ccp/Makefile index 346ceb8..23f89b7 100644 --- a/drivers/crypto/ccp/Makefile +++ b/drivers/crypto/ccp/Makefile @@ -12,4 +12,5 @@ ccp-crypto-objs := ccp-crypto-main.o \ ccp-crypto-aes.o \ ccp-crypto-aes-cmac.o \ ccp-crypto-aes-xts.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 e0380e5..f3c4c25 100644 --- a/drivers/crypto/ccp/ccp-crypto-main.c +++ b/drivers/crypto/ccp/ccp-crypto-main.c @@ -33,6 +33,10 @@ static unsigned int sha_disable; module_param(sha_disable, uint, 0444); MODULE_PARM_DESC(sha_disable, "Disable use of SHA - 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); @@ -343,6 +347,14 @@ static int ccp_register_algs(void) return ret; } + if (!rsa_disable) { + ret = ccp_register_rsa_algs(); + if (ret) { + rsa_disable = 1; + return ret; + } + } + return 0; } @@ -362,6 +374,9 @@ static void ccp_unregister_algs(void) list_del(&ablk_alg->entry); kfree(ablk_alg); } + + if (!rsa_disable) + ccp_unregister_rsa_algs(); } 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 0000000..7dab43b --- /dev/null +++ b/drivers/crypto/ccp/ccp-crypto-rsa.c @@ -0,0 +1,258 @@ +/* + * 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.d_len; + + ret = 0; + + return ret; +} + +static 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; + + if (!ctx->u.rsa.pkey.d && !ctx->u.rsa.pkey.e) + return -EINVAL; + + memset(&rctx->cmd, 0, sizeof(rctx->cmd)); + INIT_LIST_HEAD(&rctx->cmd.entry); + rctx->cmd.engine = CCP_ENGINE_RSA; + rctx->cmd.u.rsa.mode = encrypt ? CCP_RSA_ENCRYPT : CCP_RSA_DECRYPT; + + rctx->cmd.u.rsa.pkey = ctx->u.rsa.pkey; + rctx->cmd.u.rsa.key_size = ctx->u.rsa.key_len; + rctx->cmd.u.rsa.exp = &ctx->u.rsa.e_sg; + rctx->cmd.u.rsa.exp_len = ctx->u.rsa.e_len; + rctx->cmd.u.rsa.mod = &ctx->u.rsa.n_sg; + rctx->cmd.u.rsa.mod_len = ctx->u.rsa.n_len; + if (ctx->u.rsa.pkey.d) { + rctx->cmd.u.rsa.d_sg = &ctx->u.rsa.d_sg; + rctx->cmd.u.rsa.d_len = ctx->u.rsa.d_len; + } + + rctx->cmd.u.rsa.src = req->src; + rctx->cmd.u.rsa.src_len = req->src_len; + rctx->cmd.u.rsa.dst = req->dst; + rctx->cmd.u.rsa.dst_len = req->dst_len; + + 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 void ccp_free_mpi_key(struct ccp_rsa_key *key) +{ + mpi_free(key->d); + key->d = NULL; + mpi_free(key->e); + key->e = NULL; + mpi_free(key->n); + key->n = NULL; +} + +static int ccp_check_key_length(unsigned int len) +{ + /* In bits */ + if (len < 8 || len > 16384) + 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 public) +{ + struct ccp_ctx *ctx = akcipher_tfm_ctx(tfm); + struct rsa_key raw_key; + unsigned int n_size; + int ret; + + if (!ctx) + return -EINVAL; + + ccp_rsa_free_key_bufs(ctx); + memset(&raw_key, 0, sizeof(raw_key)); + + /* Code borrowed from crypto/rsa.c */ + if (public) + ret = rsa_parse_pub_key(&raw_key, key, keylen); + else + ret = rsa_parse_priv_key(&raw_key, key, keylen); + if (ret) + goto e_ret; + + ret = -EINVAL; + + ctx->u.rsa.pkey.e = mpi_read_raw_data(raw_key.e, raw_key.e_sz); + if (!ctx->u.rsa.pkey.e) + goto e_ret; + ctx->u.rsa.e_buf = mpi_get_buffer(ctx->u.rsa.pkey.e, + &ctx->u.rsa.e_len, NULL); + if (!ctx->u.rsa.e_buf) + goto e_key; + sg_init_one(&ctx->u.rsa.e_sg, ctx->u.rsa.e_buf, ctx->u.rsa.e_len); + + + ctx->u.rsa.pkey.n = mpi_read_raw_data(raw_key.n, raw_key.n_sz); + n_size = mpi_get_size(ctx->u.rsa.pkey.n); + if (ccp_check_key_length(n_size << 3)) + goto e_key; + ctx->u.rsa.key_len = n_size; + ctx->u.rsa.n_buf = mpi_get_buffer(ctx->u.rsa.pkey.n, + &ctx->u.rsa.n_len, NULL); + if (!ctx->u.rsa.n_buf) + goto e_nkey; + sg_init_one(&ctx->u.rsa.n_sg, ctx->u.rsa.n_buf, ctx->u.rsa.n_len); + + if (!public) { + ctx->u.rsa.pkey.d = mpi_read_raw_data(raw_key.d, raw_key.d_sz); + if (!ctx->u.rsa.pkey.d) + goto e_nkey; + ctx->u.rsa.d_buf = mpi_get_buffer(ctx->u.rsa.pkey.d, + &ctx->u.rsa.d_len, NULL); + if (!ctx->u.rsa.d_buf) + goto e_dkey; + sg_init_one(&ctx->u.rsa.d_sg, ctx->u.rsa.d_buf, + ctx->u.rsa.d_len); + } + + return 0; + +e_dkey: + kfree(ctx->u.rsa.n_buf); +e_nkey: + kfree(ctx->u.rsa.e_buf); +e_key: + ccp_free_mpi_key(&ctx->u.rsa.pkey); +e_ret: + return ret; +} + +static int ccp_rsa_setprivkey(struct crypto_akcipher *tfm, const void *key, + unsigned int keylen) +{ + return ccp_rsa_setkey(tfm, key, keylen, false); +} + +static int ccp_rsa_setpubkey(struct crypto_akcipher *tfm, const void *key, + unsigned int keylen) +{ + return ccp_rsa_setkey(tfm, key, keylen, true); +} + +static int ccp_rsa_init_tfm(struct crypto_akcipher *tfm) +{ + struct ccp_ctx *ctx = akcipher_tfm_ctx(tfm); + + 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 rsa = { + .encrypt = ccp_rsa_encrypt, + .decrypt = ccp_rsa_decrypt, + .sign = NULL, + .verify = NULL, + .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, + .reqsize = sizeof(struct ccp_rsa_req_ctx), + .base = { + .cra_name = "rsa", + .cra_driver_name = "rsa-ccp", + .cra_priority = 100, + .cra_module = THIS_MODULE, + .cra_ctxsize = sizeof(struct ccp_ctx), + }, +}; + +int ccp_register_rsa_algs(void) +{ + int ret; + + /* Register the RSA algorithm in standard mode + * This works for CCP v3 and later + */ + ret = crypto_register_akcipher(&rsa); + return ret; +} + +void ccp_unregister_rsa_algs(void) +{ + crypto_unregister_akcipher(&rsa); +} diff --git a/drivers/crypto/ccp/ccp-crypto.h b/drivers/crypto/ccp/ccp-crypto.h index ae442ac..4a1d206 100644 --- a/drivers/crypto/ccp/ccp-crypto.h +++ b/drivers/crypto/ccp/ccp-crypto.h @@ -22,6 +22,7 @@ #include #include #include +#include #define CCP_CRA_PRIORITY 300 @@ -155,6 +156,26 @@ struct ccp_sha_ctx { struct crypto_shash *hmac_tfm; }; +/***** RSA related defines *****/ + +struct ccp_rsa_ctx { + unsigned int key_len; /* in bytes */ + struct ccp_rsa_key pkey; + 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; +}; + struct ccp_sha_req_ctx { enum ccp_sha_type type; @@ -201,6 +222,7 @@ struct ccp_ctx { union { struct ccp_aes_ctx aes; + struct ccp_rsa_ctx rsa; struct ccp_sha_ctx sha; } u; }; @@ -214,5 +236,7 @@ int ccp_register_aes_algs(struct list_head *head); int ccp_register_aes_cmac_algs(struct list_head *head); int ccp_register_aes_xts_algs(struct list_head *head); int ccp_register_sha_algs(struct list_head *head); +int ccp_register_rsa_algs(void); +void ccp_unregister_rsa_algs(void); #endif diff --git a/drivers/crypto/ccp/ccp-dev-v3.c b/drivers/crypto/ccp/ccp-dev-v3.c index 8d2dbac..75a0978 100644 --- a/drivers/crypto/ccp/ccp-dev-v3.c +++ b/drivers/crypto/ccp/ccp-dev-v3.c @@ -20,6 +20,43 @@ #include "ccp-dev.h" +/* CCP version 3: Union to define the function field (cmd_reg1/dword0) */ +union ccp_function { + struct { + u16 size:7; + u16 encrypt:1; + u16 mode:3; + u16 type:2; + } aes; + struct { + u16 size:7; + u16 encrypt:1; + u16 rsvd:5; + } aes_xts; + struct { + u16 rsvd1:11; + u16 type:2; + } sha; + struct { + u16 size:13; + } rsa; + struct { + u16 byteswap:2; + u16 bitwise:3; + u16 rsvd:8; + } pt; + struct { + u16 rsvd:13; + } zlib; + struct { + u16 size:8; + u16 mode:3; + u16 rsvd1:1; + u16 rsvd2:1; + } ecc; + u16 raw; +}; + static u32 ccp_alloc_ksb(struct ccp_cmd_queue *cmd_q, unsigned int count) { int start; @@ -88,6 +125,7 @@ static int ccp_do_cmd(struct ccp_op *op, u32 *cr, unsigned int cr_count) * are actually available, but reading that register resets it * and you could lose some error information. */ + cmd_q->free_slots--; cr0 = (cmd_q->id << REQ0_CMD_Q_SHIFT) diff --git a/drivers/crypto/ccp/ccp-ops.c b/drivers/crypto/ccp/ccp-ops.c index 82cc637..826782d 100644 --- a/drivers/crypto/ccp/ccp-ops.c +++ b/drivers/crypto/ccp/ccp-ops.c @@ -17,6 +17,7 @@ #include #include #include +#include #include "ccp-dev.h" diff --git a/include/linux/ccp.h b/include/linux/ccp.h index 1a3e0b5..d634565 100644 --- a/include/linux/ccp.h +++ b/include/linux/ccp.h @@ -19,7 +19,8 @@ #include #include #include - +#include +#include struct ccp_device; struct ccp_cmd; @@ -293,6 +294,27 @@ struct ccp_sha_engine { * final sha cmd */ }; +/** + * ccp_rsa_type - mode of RSA operation + * + * @CCP_RSA_MODE_STD: standard mode + */ +enum ccp_rsa_mode { + CCP_RSA_ENCRYPT = 0, + CCP_RSA_DECRYPT, + CCP_RSA__LAST, +}; + +struct ccp_rsa_key { + MPI e; + MPI n; + MPI d; +}; + +#define CCP_RSA_MAXMOD (4 * 1024 / 8) +#define CCP5_RSA_MAXMOD (16 * 1024 / 8) +#define CCP5_RSA_MINMOD (512 / 8) + /***** RSA engine *****/ /** * struct ccp_rsa_engine - CCP RSA operation @@ -309,16 +331,26 @@ struct ccp_sha_engine { * - key_size, exp, exp_len, mod, mod_len, src, dst, src_len */ struct ccp_rsa_engine { + enum ccp_rsa_mode mode; u32 key_size; /* In bits */ + struct ccp_rsa_key pkey; + +/* e */ struct scatterlist *exp; u32 exp_len; /* In bytes */ +/* n */ struct scatterlist *mod; u32 mod_len; /* In bytes */ +/* d */ + struct scatterlist *d_sg; + unsigned int d_len; + struct scatterlist *src, *dst; u32 src_len; /* In bytes */ + u32 dst_len; /* In bytes */ }; /***** Passthru engine *****/