| /* Copyright 2017 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 "common.h" |
| #include "console.h" |
| #include "rsa.h" |
| #include "sha256.h" |
| #include "shared_mem.h" |
| #include "vboot.h" |
| |
| #define CPRINTS(format, args...) cprints(CC_VBOOT, format, ## args) |
| #define CPRINTF(format, args...) cprintf(CC_VBOOT, format, ## args) |
| |
| int vboot_is_padding_valid(const uint8_t *data, uint32_t start, uint32_t end) |
| { |
| const uint32_t *data32 = (const uint32_t *)data; |
| int i; |
| |
| if (start > end) |
| return EC_ERROR_INVAL; |
| |
| if (start % 4 || end % 4) |
| return EC_ERROR_INVAL; |
| |
| for (i = start / 4; i < end / 4; i++) { |
| if (data32[i] != 0xffffffff) |
| return EC_ERROR_INVAL; |
| } |
| |
| return EC_SUCCESS; |
| } |
| |
| int vboot_verify(const uint8_t *data, int len, |
| const struct rsa_public_key *key, const uint8_t *sig) |
| { |
| struct sha256_ctx ctx; |
| uint8_t *hash; |
| uint32_t *workbuf; |
| int err = EC_SUCCESS; |
| |
| if (SHARED_MEM_ACQUIRE_CHECK(3 * RSANUMBYTES, (char **)&workbuf)) |
| return EC_ERROR_MEMORY_ALLOCATION; |
| |
| /* Compute hash of the RW firmware */ |
| SHA256_init(&ctx); |
| SHA256_update(&ctx, data, len); |
| hash = SHA256_final(&ctx); |
| |
| /* Verify the data */ |
| if (rsa_verify(key, sig, hash, workbuf) != 1) |
| err = EC_ERROR_VBOOT_DATA_VERIFY; |
| |
| shared_mem_release(workbuf); |
| |
| return err; |
| } |