2014-07-02 17:37:23 +02:00
|
|
|
/* Copyright (c) 2013 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.
|
|
|
|
*
|
|
|
|
* Functions for querying, manipulating and locking rollback indices
|
|
|
|
* stored in the TPM NVRAM.
|
|
|
|
*/
|
|
|
|
|
2014-07-16 04:47:32 +02:00
|
|
|
#ifndef ANTIROLLBACK_H_
|
|
|
|
#define ANTIROLLBACK_H_
|
2014-07-02 17:37:23 +02:00
|
|
|
|
2014-07-16 04:47:32 +02:00
|
|
|
#include "tpm_lite/tss_constants.h"
|
2014-07-02 17:37:23 +02:00
|
|
|
|
2014-12-04 02:35:53 +01:00
|
|
|
struct vb2_context;
|
2015-01-31 03:45:27 +01:00
|
|
|
enum vb2_pcr_digest;
|
2014-12-04 02:35:53 +01:00
|
|
|
|
2014-07-02 17:37:23 +02:00
|
|
|
/* TPM NVRAM location indices. */
|
|
|
|
#define FIRMWARE_NV_INDEX 0x1007
|
2014-09-29 22:02:29 +02:00
|
|
|
#define KERNEL_NV_INDEX 0x1008
|
|
|
|
/* This is just an opaque space for backup purposes */
|
|
|
|
#define BACKUP_NV_INDEX 0x1009
|
2014-07-02 17:37:23 +02:00
|
|
|
|
|
|
|
/* Structure definitions for TPM spaces */
|
|
|
|
|
|
|
|
/* Flags for firmware space */
|
2014-07-16 04:47:32 +02:00
|
|
|
|
2014-07-02 17:37:23 +02:00
|
|
|
/*
|
|
|
|
* 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 */
|
|
|
|
|
2014-07-16 04:47:32 +02:00
|
|
|
uint32_t antirollback_read_space_firmware(struct vb2_context *ctx);
|
2014-07-02 17:37:23 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Write may be called if the versions change.
|
|
|
|
*/
|
2014-07-16 04:47:32 +02:00
|
|
|
uint32_t antirollback_write_space_firmware(struct vb2_context *ctx);
|
2014-07-02 17:37:23 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Lock must be called.
|
|
|
|
*/
|
2014-07-16 04:47:32 +02:00
|
|
|
uint32_t antirollback_lock_space_firmware(void);
|
2014-07-02 17:37:23 +02:00
|
|
|
|
|
|
|
/****************************************************************************/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The following functions are internal apis, listed here for use by unit tests
|
|
|
|
* only.
|
|
|
|
*/
|
|
|
|
|
2015-01-31 03:45:27 +01:00
|
|
|
/**
|
|
|
|
* Ask vboot for a digest and extend a TPM PCR with it.
|
|
|
|
*/
|
|
|
|
uint32_t tpm_extend_pcr(struct vb2_context *ctx, int pcr,
|
|
|
|
enum vb2_pcr_digest which_digest);
|
|
|
|
|
2014-07-02 17:37:23 +02:00
|
|
|
/**
|
|
|
|
* Issue a TPM_Clear and reenable/reactivate the TPM.
|
|
|
|
*/
|
2014-07-16 04:47:32 +02:00
|
|
|
uint32_t tpm_clear_and_reenable(void);
|
2014-07-02 17:37:23 +02:00
|
|
|
|
|
|
|
/**
|
2014-07-16 04:47:32 +02:00
|
|
|
* Like tlcl_write(), but checks for write errors due to hitting the 64-write
|
2014-07-02 17:37:23 +02:00
|
|
|
* limit and clears the TPM when that happens. This can only happen when the
|
|
|
|
* TPM is unowned, so it is OK to clear it (and we really have no choice).
|
|
|
|
* This is not expected to happen frequently, but it could happen.
|
|
|
|
*/
|
2014-07-16 04:47:32 +02:00
|
|
|
uint32_t safe_write(uint32_t index, const void *data, uint32_t length);
|
2014-07-02 17:37:23 +02:00
|
|
|
|
|
|
|
/**
|
2014-07-16 04:47:32 +02:00
|
|
|
* Similarly to safe_write(), this ensures we don't fail a DefineSpace because
|
2014-07-02 17:37:23 +02:00
|
|
|
* we hit the TPM write limit. This is even less likely to happen than with
|
|
|
|
* writes because we only define spaces once at initialization, but we'd rather
|
|
|
|
* be paranoid about this.
|
|
|
|
*/
|
2014-07-16 04:47:32 +02:00
|
|
|
uint32_t safe_define_space(uint32_t index, uint32_t perm, uint32_t size);
|
2014-07-02 17:37:23 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Perform one-time initializations.
|
|
|
|
*
|
|
|
|
* Create the NVRAM spaces, and set their initial values as needed. Sets the
|
|
|
|
* nvLocked bit and ensures the physical presence command is enabled and
|
|
|
|
* locked.
|
|
|
|
*/
|
2014-07-16 04:47:32 +02:00
|
|
|
uint32_t factory_initialize_tpm(struct vb2_context *ctx);
|
2014-07-02 17:37:23 +02:00
|
|
|
|
|
|
|
/**
|
2014-07-16 04:47:32 +02:00
|
|
|
* Start the TPM and establish the root of trust for the antirollback mechanism.
|
2014-07-02 17:37:23 +02:00
|
|
|
*/
|
2014-07-16 04:47:32 +02:00
|
|
|
uint32_t setup_tpm(struct vb2_context *ctx);
|
2014-07-02 17:37:23 +02:00
|
|
|
|
2014-07-16 04:47:32 +02:00
|
|
|
#endif /* ANTIROLLBACK_H_ */
|