From 9b3619ddd7304359ee17e243923f1e47c925cb21 Mon Sep 17 00:00:00 2001 From: nagendra modadugu Date: Thu, 7 Jul 2016 19:46:41 -0700 Subject: CR50: clear SHA config register when initializing The SHA config register should be cleared, so that only required bits are set on init(). Doing so ensures that previous settings that used the engine in a different mode, e.g HMAC, do not survive. BRANCH=none BUG=chrome-os-partner:43025,chrome-os-partner:47524 TEST=build succeeds; tpmtest.py tests pass; manufacture works Change-Id: If5a79af06ea7512f19775a2f34d741b144f211f7 Signed-off-by: nagendra modadugu Reviewed-on: https://chromium-review.googlesource.com/359418 Reviewed-by: Marius Schilder Reviewed-by: Vadim Bendebury Commit-Queue: Vadim Bendebury Tested-by: Vadim Bendebury --- chip/g/dcrypto/sha256.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/chip/g/dcrypto/sha256.c b/chip/g/dcrypto/sha256.c index e3ac6642bb..e21d54b1d6 100644 --- a/chip/g/dcrypto/sha256.c +++ b/chip/g/dcrypto/sha256.c @@ -61,7 +61,8 @@ void dcrypto_sha_wait(enum sha_mode mode, uint32_t *digest) SHA256_DIGEST_SIZE; /* Stop LIVESTREAM mode. */ - GWRITE_FIELD(KEYMGR, SHA_TRIG, TRIG_STOP, 1); + GREG32(KEYMGR, SHA_TRIG) = GC_KEYMGR_SHA_TRIG_TRIG_STOP_MASK; + /* Wait for SHA DONE interrupt. */ while (!GREG32(KEYMGR, SHA_ITOP)) ; @@ -130,18 +131,24 @@ void dcrypto_sha_update(struct HASH_CTX *unused, void dcrypto_sha_init(enum sha_mode mode) { + int val; + /* Stop LIVESTREAM mode, in case final() was not called. */ - GWRITE_FIELD(KEYMGR, SHA_TRIG, TRIG_STOP, 1); + GREG32(KEYMGR, SHA_TRIG) = GC_KEYMGR_SHA_TRIG_TRIG_STOP_MASK; /* Clear interrupt status. */ GREG32(KEYMGR, SHA_ITOP) = 0; - /* SHA1 or SHA256 mode */ - GWRITE_FIELD(KEYMGR, SHA_CFG_EN, SHA1, mode == SHA1_MODE ? 1 : 0); + /* Enable streaming mode. */ - GWRITE_FIELD(KEYMGR, SHA_CFG_EN, LIVESTREAM, 1); - /* Enable the SHA DONE interrupt. */ - GWRITE_FIELD(KEYMGR, SHA_CFG_EN, INT_EN_DONE, 1); + val = GC_KEYMGR_SHA_CFG_EN_LIVESTREAM_MASK; + /* Enable SHA DONE interrupt. */ + val |= GC_KEYMGR_SHA_CFG_EN_INT_EN_DONE_MASK; + /* Select SHA mode. */ + if (mode == SHA1_MODE) + val |= GC_KEYMGR_SHA_CFG_EN_SHA1_MASK; + GREG32(KEYMGR, SHA_CFG_EN) = val; + /* Start SHA engine. */ - GWRITE_FIELD(KEYMGR, SHA_TRIG, TRIG_GO, 1); + GREG32(KEYMGR, SHA_TRIG) = GC_KEYMGR_SHA_TRIG_TRIG_GO_MASK; } static void dcrypto_sha256_init(LITE_SHA256_CTX *ctx) -- cgit v1.2.1