mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-11-27 19:53:42 +00:00
This CL adds a new function VerifyFirmwareDriver_f() means to be a part of the RO firmware which determine which copy of the firmware to boot from. It is meant to ensure that a particular firmware is only booted if 1) it verifies successfully, 2) its version is newer or equal to current stored version. In addition, the driver function also updates the stored version if needed. Currently I am using the TLCL API with stub calls, (in fact, most of the TPM interaction is done in rollback_index.c which implements the actual version query/update API) used by the firmware. Review URL: http://codereview.chromium.org/1241002
71 lines
2.4 KiB
C
71 lines
2.4 KiB
C
/* Copyright (c) 2010 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.
|
|
*/
|
|
|
|
/* Helper functions/wrappers for memory allocations, manipulation and
|
|
* comparison.
|
|
*/
|
|
|
|
#ifndef VBOOT_REFERENCE_UTILITY_H_
|
|
#define VBOOT_REFERENCE_UTILITY_H_
|
|
|
|
#include <inttypes.h>
|
|
#include <string.h>
|
|
|
|
/* Combine [msw] and [lsw] uint16s to a uint32_t with its [msw] and
|
|
* [lsw] forming the most and least signficant 16-bit words.
|
|
*/
|
|
#define CombineUint16Pair(msw,lsw) (((msw) << 16) | \
|
|
(((lsw)) & 0xFFFF))
|
|
/* Return the minimum of (a) or (b). */
|
|
#define Min(a, b) (((a) < (b)) ? (a) : (b))
|
|
|
|
/* Allocate [size] bytes and return a pointer to the allocated memory. Abort
|
|
* on error.
|
|
*/
|
|
void* Malloc(size_t size);
|
|
|
|
/* Free memory pointed by [ptr] previously allocated by Malloc(). */
|
|
void Free(void* ptr);
|
|
|
|
/* Copy [n] bytes from [src] to [dest]. */
|
|
void* Memcpy(void* dest, const void* src, size_t n);
|
|
|
|
/* Set [n] bytes starting at [s] to [c]. */
|
|
void* Memset(void *dest, const uint8_t c, size_t n);
|
|
|
|
/* Compare [n] bytes starting at [s1] with [s2] and return 0 if they match,
|
|
* 1 if they don't. Time taken to perform the comparison is only dependent on
|
|
* [n] and not on the relationship of the match between [s1] and [s2].
|
|
*/
|
|
int SafeMemcmp(const void* s1, const void* s2, size_t n);
|
|
|
|
/* Track remaining data to be read in a buffer. */
|
|
typedef struct MemcpyState {
|
|
void* remaining_buf;
|
|
uint64_t remaining_len;
|
|
} MemcpyState;
|
|
|
|
/* Copy [len] bytes into [dst] only if there's enough data to read according
|
|
* to [state].
|
|
* On success, return [dst] and update [state].
|
|
* On failure, return NULL, set remaining len in state to -1.
|
|
*
|
|
* Useful for iterating through a binary blob to populate a struct. After the
|
|
* first failure (buffer overrun), successive calls will always fail.
|
|
*/
|
|
void* StatefulMemcpy(MemcpyState* state, void* dst, int len);
|
|
|
|
/* Like StatefulMemcpy() but copies in the opposite direction, populating
|
|
* data from [src] into the buffer encapsulated in state [state].
|
|
* On success, return [src] and update [state].
|
|
* On failure, return NULL, set remaining_len in state to -1.
|
|
*
|
|
* Useful for iterating through a structure to populate a binary blob. After the
|
|
* first failure (buffer overrun), successive calls will always fail.
|
|
*/
|
|
const void* StatefulMemcpy_r(MemcpyState* state, const void* src, int len);
|
|
|
|
#endif /* VBOOT_REFERENCE_UTILITY_H_ */
|