High Definition (HD) protected content playback requires secure counters that are updated at regular interval while the protected content is playing. To support similar use-cases, define space for secure counters in TPM NVRAM and initialize them. These counters are defined once during the factory initialization stage. Also add VBOOT_DEFINE_WIDEVINE_COUNTERS config item to enable these secure counters only on the mainboard where they are required/used. BUG=b:205261728 TEST=Build and boot to OS in guybrush. Ensure that the secure counters are defined successfully in TPM NVRAM space. tlcl_define_space: response is 0 tlcl_define_space: response is 0 tlcl_define_space: response is 0 tlcl_define_space: response is 0 On reboot if forced to redefine the space, it is identified as already defined. tlcl_define_space: response is 14c define_space():219: define_space: Secure Counter space already exists tlcl_define_space: response is 14c define_space():219: define_space: Secure Counter space already exists tlcl_define_space: response is 14c define_space():219: define_space: Secure Counter space already exists tlcl_define_space: response is 14c define_space():219: define_space: Secure Counter space already exists Change-Id: I915fbdada60e242d911b748ad5dc28028de9b657 Signed-off-by: Karthikeyan Ramasubramanian <kramasub@google.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/59476 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Raul Rangel <rrangel@chromium.org> Reviewed-by: Julius Werner <jwerner@chromium.org>
103 lines
3.5 KiB
C
103 lines
3.5 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause */
|
|
|
|
/*
|
|
* Functions for querying, manipulating and locking rollback indices
|
|
* stored in the TPM NVRAM.
|
|
*/
|
|
|
|
#ifndef ANTIROLLBACK_H_
|
|
#define ANTIROLLBACK_H_
|
|
|
|
#include <types.h>
|
|
#include <security/tpm/tspi.h>
|
|
#include <vb2_sha.h>
|
|
|
|
struct vb2_context;
|
|
enum vb2_pcr_digest;
|
|
|
|
/* TPM NVRAM location indices. */
|
|
#define FIRMWARE_NV_INDEX 0x1007
|
|
#define KERNEL_NV_INDEX 0x1008
|
|
/* 0x1009 used to be used as a backup space. Think of conflicts if you
|
|
* want to use 0x1009 for something else. */
|
|
#define BACKUP_NV_INDEX 0x1009
|
|
#define FWMP_NV_INDEX 0x100a
|
|
/* 0x100b: Hash of MRC_CACHE training data for recovery boot */
|
|
#define MRC_REC_HASH_NV_INDEX 0x100b
|
|
/* 0x100c: OOBE autoconfig public key hashes */
|
|
/* 0x100d: Hash of MRC_CACHE training data for non-recovery boot */
|
|
#define MRC_RW_HASH_NV_INDEX 0x100d
|
|
#define HASH_NV_SIZE VB2_SHA256_DIGEST_SIZE
|
|
#define ENT_ROLLBACK_COUNTER_INDEX 0x100e
|
|
/* Widevine Secure Counter space */
|
|
#define WIDEVINE_COUNTER_NV_INDEX(n) (0x3000 + (n))
|
|
#define NUM_WIDEVINE_COUNTERS 4
|
|
#define WIDEVINE_COUNTER_NAME "Widevine Secure Counter"
|
|
#define WIDEVINE_COUNTER_SIZE sizeof(uint64_t)
|
|
/* Zero-Touch Enrollment related spaces */
|
|
#define ZTE_BOARD_ID_NV_INDEX 0x3fff00
|
|
#define ZTE_RMA_SN_BITS_INDEX 0x3fff01
|
|
#define ZTE_RMA_BYTES_COUNTER_INDEX 0x3fff04
|
|
|
|
/* Structure definitions for TPM spaces */
|
|
|
|
/* Flags for firmware space */
|
|
|
|
/*
|
|
* Last boot was developer mode. TPM ownership is cleared when transitioning
|
|
* to/from developer mode.
|
|
*/
|
|
#define FLAG_LAST_BOOT_DEVELOPER 0x01
|
|
|
|
/* All functions return TPM_SUCCESS (zero) if successful, non-zero if error */
|
|
|
|
uint32_t antirollback_read_space_firmware(struct vb2_context *ctx);
|
|
|
|
/**
|
|
* Write may be called if the versions change.
|
|
*/
|
|
uint32_t antirollback_write_space_firmware(struct vb2_context *ctx);
|
|
|
|
/**
|
|
* Read and write kernel space in TPM.
|
|
*/
|
|
uint32_t antirollback_read_space_kernel(struct vb2_context *ctx);
|
|
uint32_t antirollback_write_space_kernel(struct vb2_context *ctx);
|
|
|
|
/**
|
|
* Lock must be called.
|
|
*/
|
|
uint32_t antirollback_lock_space_firmware(void);
|
|
|
|
/*
|
|
* Read MRC hash data from TPM.
|
|
* @param index index into TPM NVRAM where hash is stored The index
|
|
* can be set to either MRC_REC_HASH_NV_INDEX or
|
|
* MRC_RW_HASH_NV_INDEX depending upon whether we are
|
|
* booting in recovery or normal mode.
|
|
* @param data pointer to buffer where hash from TPM read into
|
|
* @param size size of buffer
|
|
*/
|
|
uint32_t antirollback_read_space_mrc_hash(uint32_t index, uint8_t *data, uint32_t size);
|
|
/*
|
|
* Write new hash data to MRC space in TPM.\
|
|
* @param index index into TPM NVRAM where hash is stored The index
|
|
* can be set to either MRC_REC_HASH_NV_INDEX or
|
|
* MRC_RW_HASH_NV_INDEX depending upon whether we are
|
|
* booting in recovery or normal mode.
|
|
* @param data pointer to buffer of hash value to be written
|
|
* @param size size of buffer
|
|
*/
|
|
uint32_t antirollback_write_space_mrc_hash(uint32_t index, const uint8_t *data,
|
|
uint32_t size);
|
|
/*
|
|
* Lock down MRC hash space in TPM.
|
|
* @param index index into TPM NVRAM where hash is stored The index
|
|
* can be set to either MRC_REC_HASH_NV_INDEX or
|
|
* MRC_RW_HASH_NV_INDEX depending upon whether we are
|
|
* booting in recovery or normal mode.
|
|
*/
|
|
uint32_t antirollback_lock_space_mrc_hash(uint32_t index);
|
|
|
|
#endif /* ANTIROLLBACK_H_ */
|