From patchwork Tue Mar 25 09:58:21 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Przemyslaw Marczak X-Patchwork-Id: 333356 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 1BFD614008A for ; Tue, 25 Mar 2014 20:59:41 +1100 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 4DE864B61F; Tue, 25 Mar 2014 10:59:24 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id QpuICG29HnQ9; Tue, 25 Mar 2014 10:59:24 +0100 (CET) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 2FF184B622; Tue, 25 Mar 2014 10:59:06 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id A59F24B5E9 for ; Tue, 25 Mar 2014 10:58:57 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id XQsJpqYiTy53 for ; Tue, 25 Mar 2014 10:58:54 +0100 (CET) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by theia.denx.de (Postfix) with ESMTPS id 87B824B5EC for ; Tue, 25 Mar 2014 10:58:51 +0100 (CET) Received: from eucpsbgm1.samsung.com (unknown [203.254.199.244]) by mailout1.w1.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N2Z007GOL1XY460@mailout1.w1.samsung.com> for u-boot@lists.denx.de; Tue, 25 Mar 2014 09:58:45 +0000 (GMT) X-AuditID: cbfec7f4-b7f796d000005a13-62-53315355a351 Received: from eusync2.samsung.com ( [203.254.199.212]) by eucpsbgm1.samsung.com (EUCPMTA) with SMTP id 0E.19.23059.55351335; Tue, 25 Mar 2014 09:58:45 +0000 (GMT) Received: from AMDC1186.digital.local ([106.116.147.185]) by eusync2.samsung.com (Oracle Communications Messaging Server 7u4-23.01(7.0.4.23.0) 64bit (built Aug 10 2011)) with ESMTPA id <0N2Z00GO5L1SXE30@eusync2.samsung.com>; Tue, 25 Mar 2014 09:58:45 +0000 (GMT) From: Przemyslaw Marczak To: u-boot@lists.denx.de Date: Tue, 25 Mar 2014 10:58:21 +0100 Message-id: <1395741502-9782-3-git-send-email-p.marczak@samsung.com> X-Mailer: git-send-email 1.9.0 In-reply-to: <1395741502-9782-1-git-send-email-p.marczak@samsung.com> References: <1395741502-9782-1-git-send-email-p.marczak@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFupmluLIzCtJLcpLzFFi42I5/e/4Fd3QYMNgg69rLSxO/XnMaPHq3yV2 ixu/2lgt3jzczGjx9vQGdouOIy2MFjsu32CxWPdkLavF5MXzmS3e7u1ktzj65RqbA7fHtIkf mT3O3tnB6NG3ZRWjx/Eb25k8DuxtYQtgjeKySUnNySxLLdK3S+DKePSyhbXgkkLF5lkfWRsY d0t1MXJySAiYSOy6f5oJwhaTuHBvPVsXIxeHkMBSRok53esYIZw+Jokf7w+wglSxCRhI7Ll0 hhnEFhGQkPjVf5URxGYW6GSWeNRU0MXIwSEskChxdXs1SJhFQFVi7rVXLCA2r4CLxPuW96wQ y+QkpvxewA5icwq4Snyc8IQJYtcMRome5h2MExh5FzAyrGIUTS1NLihOSs811CtOzC0uzUvX S87P3cQICcAvOxgXH7M6xCjAwajEwxthbBAsxJpYVlyZe4hRgoNZSYT3SIBhsBBvSmJlVWpR fnxRaU5q8SFGJg5OqQZG9qybn95Kc//dIBCs2q51KXnDud52AcVb3NLeW384Zv2ds+9N4txF 3R+Flu4ycT325OlWLqnUTaInnnd9eiv4WcYt1XB25mS921uZTSJMpQ4d5GatLsgJrDu7KD5q YsJKkbpFG068+PbdUjSYcXrh7I8hM9O/8JS6+7Dl7bG8sV4riml9SLOSEktxRqKhFnNRcSIA NvAHuR4CAAA= Cc: Akshay Saraswat , Piotr Wilczek , Jaehoon Chung , ARUN MANKUZHI , Przemyslaw Marczak , Tom Rini Subject: [U-Boot] [PATCH v5 3/4] drivers: crypto: ace_sha: add implementation of hardware based lib rand X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.11 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de This patch adds implementation of rand library based on hardware random number generator of security subsystem in Exynos SOC. This library includes: - srand() - used for seed hardware block - rand() - returns random number - rand_r() - the same as above with given seed which depends on CONFIG_EXYNOS_ACE_SHA and CONFIG_LIB_HW_RAND. Signed-off-by: Przemyslaw Marczak cc: Akshay Saraswat cc: ARUN MANKUZHI cc: Minkyu Kang Cc: Michael Walle Cc: Tom Rini Cc: Masahiro Yamada --- Changes v2: - none Changes v3: - add implementation of rand library to ace_sha - add proper ifdef for ace_sha SHA functions - move cpu refer change to new commit Changes v4: - remove unused variables Changes v5: - none --- drivers/crypto/ace_sha.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++- drivers/crypto/ace_sha.h | 8 ++++-- 2 files changed, 77 insertions(+), 4 deletions(-) diff --git a/drivers/crypto/ace_sha.c b/drivers/crypto/ace_sha.c index acbafde..ed4f541 100644 --- a/drivers/crypto/ace_sha.c +++ b/drivers/crypto/ace_sha.c @@ -5,10 +5,12 @@ * SPDX-License-Identifier: GPL-2.0+ */ #include +#include "ace_sha.h" + +#ifdef CONFIG_SHA_HW_ACCEL #include #include #include -#include "ace_sha.h" /* SHA1 value for the message of zero length */ static const unsigned char sha1_digest_emptymsg[SHA1_SUM_LEN] = { @@ -111,3 +113,72 @@ void hw_sha1(const unsigned char *pbuf, unsigned int buf_len, if (ace_sha_hash_digest(pbuf, buf_len, pout, ACE_SHA_TYPE_SHA1)) debug("ACE was not setup properly or it is faulty\n"); } +#endif /* CONFIG_SHA_HW_ACCEL */ + +#ifdef CONFIG_LIB_HW_RAND +static unsigned int seed_done; + +void srand(unsigned int seed) +{ + struct exynos_ace_sfr *reg = + (struct exynos_ace_sfr *)samsung_get_base_ace_sfr(); + int i, status; + + /* Seed data */ + for (i = 0; i < ACE_HASH_PRNG_REG_NUM; i++) + writel(seed << i, ®->hash_seed[i]); + + /* Wait for seed setup done */ + while (1) { + status = readl(®->hash_status); + if ((status & ACE_HASH_SEEDSETTING_MASK) || + (status & ACE_HASH_PRNGERROR_MASK)) + break; + } + + seed_done = 1; +} + +unsigned int rand(void) +{ + struct exynos_ace_sfr *reg = + (struct exynos_ace_sfr *)samsung_get_base_ace_sfr(); + int i, status; + unsigned int seed = (unsigned int)&status; + unsigned int ret = 0; + + if (!seed_done) + srand(seed); + + /* Start PRNG */ + writel(ACE_HASH_ENGSEL_PRNG | ACE_HASH_STARTBIT_ON, ®->hash_control); + + /* Wait for PRNG done */ + while (1) { + status = readl(®->hash_status); + if (status & ACE_HASH_PRNGDONE_MASK) + break; + if (status & ACE_HASH_PRNGERROR_MASK) { + seed_done = 0; + return 0; + } + } + + /* Clear Done IRQ */ + writel(ACE_HASH_PRNGDONE_MASK, ®->hash_status); + + /* Read a PRNG result */ + for (i = 0; i < ACE_HASH_PRNG_REG_NUM; i++) + ret += readl(®->hash_prng[i]); + + seed_done = 0; + return ret; +} + +unsigned int rand_r(unsigned int *seedp) +{ + srand(*seedp); + + return rand(); +} +#endif /* CONFIG_LIB_HW_RAND */ diff --git a/drivers/crypto/ace_sha.h b/drivers/crypto/ace_sha.h index a426d52..f1097f7 100644 --- a/drivers/crypto/ace_sha.h +++ b/drivers/crypto/ace_sha.h @@ -72,9 +72,10 @@ struct exynos_ace_sfr { unsigned char res12[0x30]; unsigned int hash_result[8]; unsigned char res13[0x20]; - unsigned int hash_seed[8]; - unsigned int hash_prng[8]; - unsigned char res14[0x180]; + unsigned int hash_seed[5]; + unsigned char res14[12]; + unsigned int hash_prng[5]; + unsigned char res15[0x18c]; unsigned int pka_sfr[5]; /* base + 0x700 */ }; @@ -291,6 +292,7 @@ struct exynos_ace_sfr { #define ACE_HASH_PRNGERROR_MASK (1 << 7) #define ACE_HASH_PRNGERROR_OFF (0 << 7) #define ACE_HASH_PRNGERROR_ON (1 << 7) +#define ACE_HASH_PRNG_REG_NUM 5 #define ACE_SHA_TYPE_SHA1 1 #define ACE_SHA_TYPE_SHA256 2