diff options
author | nagendra modadugu <ngm@google.com> | 2016-07-07 19:46:41 -0700 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2016-07-09 01:25:07 +0000 |
commit | 9b3619ddd7304359ee17e243923f1e47c925cb21 (patch) | |
tree | 47b5232313cfa57ecc3021f2a399581124007ec5 | |
parent | 93fd0594c920d8794711b47c80eb057ed0f72317 (diff) | |
download | chrome-ec-9b3619ddd7304359ee17e243923f1e47c925cb21.tar.gz |
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 <ngm@google.com>
Reviewed-on: https://chromium-review.googlesource.com/359418
Reviewed-by: Marius Schilder <mschilder@chromium.org>
Reviewed-by: Vadim Bendebury <vbendeb@chromium.org>
Commit-Queue: Vadim Bendebury <vbendeb@chromium.org>
Tested-by: Vadim Bendebury <vbendeb@chromium.org>
-rw-r--r-- | chip/g/dcrypto/sha256.c | 23 |
1 files 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) |