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