diff options
author | Vadim Bendebury <vbendeb@chromium.org> | 2015-11-20 15:11:56 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2015-11-23 19:23:43 -0800 |
commit | 824d9e7a86a218dd0c4a0fc68930a0c283e6e82b (patch) | |
tree | af330b1a43058fabfdbae6b84ddd375bff87d538 | |
parent | c13c653934bbd24acb1f8dec8f61ffe927d1abb2 (diff) | |
download | chrome-ec-824d9e7a86a218dd0c4a0fc68930a0c283e6e82b.tar.gz |
cr50: move key ladder initialization into its own files
This is required to be able to consolidate hardware and software hash
implementations.
BRANCH=none
BUG=chrome-os-partner:43025
TEST=the device still boots up.
Change-Id: If420541427bb316b97bc20a21fd3fd8a57708244
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/313654
Reviewed-by: Nagendra Modadugu <ngm@google.com>
-rw-r--r-- | chip/g/build.mk | 1 | ||||
-rw-r--r-- | chip/g/loader/hw_sha256.c | 35 | ||||
-rw-r--r-- | chip/g/loader/hw_sha256.h | 2 | ||||
-rw-r--r-- | chip/g/loader/key_ladder.c | 45 | ||||
-rw-r--r-- | chip/g/loader/key_ladder.h | 14 | ||||
-rw-r--r-- | chip/g/loader/launch.c | 5 |
6 files changed, 63 insertions, 39 deletions
diff --git a/chip/g/build.mk b/chip/g/build.mk index d28ff1b5ef..9b0f6da6b2 100644 --- a/chip/g/build.mk +++ b/chip/g/build.mk @@ -41,6 +41,7 @@ chip-$(CONFIG_FLASH)+=flash.o ifneq ($(CONFIG_CUSTOMIZED_RO),) custom-ro_objs-y = chip/g/clock.o custom-ro_objs-y += chip/g/loader/hw_sha256.o +custom-ro_objs-y += chip/g/loader/key_ladder.o custom-ro_objs-y += chip/g/loader/launch.o custom-ro_objs-y += chip/g/loader/main.o custom-ro_objs-y += chip/g/loader/rom_flash.o diff --git a/chip/g/loader/hw_sha256.c b/chip/g/loader/hw_sha256.c index af6ce8de5c..fb930f7d17 100644 --- a/chip/g/loader/hw_sha256.c +++ b/chip/g/loader/hw_sha256.c @@ -73,38 +73,3 @@ void hwSHA256(const void *data, size_t n, uint32_t *digest) _sha_write(data, n); _sha_wait(digest); } - -void hwKeyLadderStep(uint32_t cert, const uint32_t *input) -{ - uint32_t flags; - - GREG32(KEYMGR, SHA_ITOP) = 0; /* clear status. */ - - VERBOSE("Cert %2u: ", cert); - - GWRITE_FIELD(KEYMGR, SHA_USE_CERT, INDEX, cert); - GWRITE_FIELD(KEYMGR, SHA_USE_CERT, ENABLE, 1); - GWRITE_FIELD(KEYMGR, SHA_CFG_EN, INT_EN_DONE, 1); - GWRITE_FIELD(KEYMGR, SHA_TRIG, TRIG_GO, 1); - - if (input) { - int i; - - for (i = 0; i < 8; ++i) - GREG32(KEYMGR, SHA_INPUT_FIFO) = *input++; - - GWRITE_FIELD(KEYMGR, SHA_TRIG, TRIG_STOP, 1); - } - - while (!GREG32(KEYMGR, SHA_ITOP)) - ; - - GREG32(KEYMGR, SHA_ITOP) = 0; /* Clear status. */ - - flags = GREG32(KEYMGR, HKEY_ERR_FLAGS); - if (flags) - debug_printf("Cert %2u: fail %x\n", cert, flags); - else - VERBOSE("flags %x\n", flags); -} - diff --git a/chip/g/loader/hw_sha256.h b/chip/g/loader/hw_sha256.h index 0940efae40..b52af6f857 100644 --- a/chip/g/loader/hw_sha256.h +++ b/chip/g/loader/hw_sha256.h @@ -22,6 +22,4 @@ const uint8_t *hwSHA256_final(hwSHA256_CTX *ctx); void hwSHA256(const void *data, size_t len, uint32_t *digest); -void hwKeyLadderStep(uint32_t certificate, const uint32_t *input); - #endif /* __EC_CHIP_G_LOADER_HW_SHA256_H */ diff --git a/chip/g/loader/key_ladder.c b/chip/g/loader/key_ladder.c new file mode 100644 index 0000000000..71ed200ef2 --- /dev/null +++ b/chip/g/loader/key_ladder.c @@ -0,0 +1,45 @@ +/* Copyright 2015 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "key_ladder.h" +#include "debug_printf.h" +#include "registers.h" +/* #include "setup.h" */ + +#include "dcrypto.h" + +void key_ladder_step(uint32_t cert, const uint32_t *input) +{ + uint32_t flags; + + GREG32(KEYMGR, SHA_ITOP) = 0; /* Clear status. */ + + VERBOSE("Cert %2u: ", cert); + + GWRITE_FIELD(KEYMGR, SHA_USE_CERT, INDEX, cert); + GWRITE_FIELD(KEYMGR, SHA_USE_CERT, ENABLE, 1); + GWRITE_FIELD(KEYMGR, SHA_CFG_EN, INT_EN_DONE, 1); + GWRITE_FIELD(KEYMGR, SHA_TRIG, TRIG_GO, 1); + + if (input) { + int i; + + for (i = 0; i < 8; ++i) + GREG32(KEYMGR, SHA_INPUT_FIFO) = *input++; + + GWRITE_FIELD(KEYMGR, SHA_TRIG, TRIG_STOP, 1); + } + + while (!GREG32(KEYMGR, SHA_ITOP)) + ; + + GREG32(KEYMGR, SHA_ITOP) = 0; /* Clear status. */ + + flags = GREG32(KEYMGR, HKEY_ERR_FLAGS); + if (flags) + debug_printf("Cert %2u: fail %x\n", cert, flags); + else + VERBOSE("flags %x\n", flags); +} diff --git a/chip/g/loader/key_ladder.h b/chip/g/loader/key_ladder.h new file mode 100644 index 0000000000..778dc04aea --- /dev/null +++ b/chip/g/loader/key_ladder.h @@ -0,0 +1,14 @@ +/* Copyright 2015 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef __EC_CHIP_G_LOADER_KEY_LADDER_H +#define __EC_CHIP_G_LOADER_KEY_LADDER_H + +#include <inttypes.h> +#include <stddef.h> + +void key_ladder_step(uint32_t certificate, const uint32_t *input); + +#endif /* ! __EC_CHIP_G_LOADER_KEY_LADDER_H */ diff --git a/chip/g/loader/launch.c b/chip/g/loader/launch.c index 54d75e8dd1..5ef3ba8c62 100644 --- a/chip/g/loader/launch.c +++ b/chip/g/loader/launch.c @@ -5,11 +5,12 @@ #include "debug_printf.h" #include "hw_sha256.h" +#include "key_ladder.h" #include "registers.h" #include "rom_flash.h" #include "setup.h" -#include "verify.h" #include "uart.h" +#include "verify.h" #include "util/signer/common/signed_header.h" @@ -204,7 +205,7 @@ void tryLaunch(uint32_t adr, size_t max_size) GREG32(KEYMGR, FWR_VLD) = 2; GREG32(KEYMGR, FWR_LOCK) = 1; - hwKeyLadderStep(40, FAKE_rom_hash); + key_ladder_step(40, FAKE_rom_hash); /* TODO: do cert #40 and lock in ROM? */ GREG32(GLOBALSEC, HIDE_ROM) = 1; |