| OLD | NEW |
| 1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 2 * Use of this source code is governed by a BSD-style license that can be | 2 * Use of this source code is governed by a BSD-style license that can be |
| 3 * found in the LICENSE file. | 3 * found in the LICENSE file. |
| 4 * | 4 * |
| 5 * Functions for querying, manipulating and locking rollback indices | 5 * Functions for querying, manipulating and locking rollback indices |
| 6 * stored in the TPM NVRAM. | 6 * stored in the TPM NVRAM. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #ifndef VBOOT_REFERENCE_ROLLBACK_INDEX_H_ | 9 #ifndef VBOOT_REFERENCE_ROLLBACK_INDEX_H_ |
| 10 #define VBOOT_REFERENCE_ROLLBACK_INDEX_H_ | 10 #define VBOOT_REFERENCE_ROLLBACK_INDEX_H_ |
| 11 | 11 |
| 12 #include "sysincludes.h" | 12 #include "sysincludes.h" |
| 13 | 13 |
| 14 /* TODO: global variables won't work in the boot stub, since it runs | |
| 15 directly out of ROM. */ | |
| 16 extern uint16_t g_firmware_key_version; | |
| 17 extern uint16_t g_firmware_version; | |
| 18 extern uint16_t g_kernel_key_version; | |
| 19 extern uint16_t g_kernel_version; | |
| 20 | |
| 21 /* Rollback version types. */ | 14 /* Rollback version types. */ |
| 22 #define FIRMWARE_VERSIONS 0 | 15 #define FIRMWARE_VERSIONS 0 |
| 23 #define KERNEL_VERSIONS 1 | 16 #define KERNEL_VERSIONS 1 |
| 24 | 17 |
| 25 /* Initialization mode */ | 18 /* Initialization mode */ |
| 26 #define RO_RECOVERY_MODE 0 | 19 #define RO_RECOVERY_MODE 0 |
| 27 #define RO_NORMAL_MODE 1 | 20 #define RO_NORMAL_MODE 1 |
| 28 #define RW_NORMAL_MODE 2 | 21 #define RW_NORMAL_MODE 2 |
| 29 | 22 |
| 30 /* TPM NVRAM location indices. */ | 23 /* TPM NVRAM location indices. */ |
| 31 #define FIRMWARE_VERSIONS_NV_INDEX 0x1001 | 24 #define FIRMWARE_VERSIONS_NV_INDEX 0x1001 |
| 32 #define KERNEL_VERSIONS_NV_INDEX 0x1002 | 25 #define KERNEL_VERSIONS_NV_INDEX 0x1002 |
| 33 #define TPM_IS_INITIALIZED_NV_INDEX 0x1003 | 26 #define TPM_IS_INITIALIZED_NV_INDEX 0x1003 |
| 34 #define KERNEL_VERSIONS_BACKUP_NV_INDEX 0x1004 | 27 #define KERNEL_VERSIONS_BACKUP_NV_INDEX 0x1004 |
| 35 #define KERNEL_MUST_USE_BACKUP_NV_INDEX 0x1005 | 28 #define KERNEL_MUST_USE_BACKUP_NV_INDEX 0x1005 |
| 36 #define DEVELOPER_MODE_NV_INDEX 0x1006 | 29 #define DEVELOPER_MODE_NV_INDEX 0x1006 |
| 37 | 30 |
| 38 /* Unique ID to detect kernel space redefinition */ | 31 /* Unique ID to detect kernel space redefinition */ |
| 39 #define KERNEL_SPACE_UID "GRWL" /* unique ID with secret meaning */ | 32 #define KERNEL_SPACE_UID "GRWL" /* unique ID with secret meaning */ |
| 40 #define KERNEL_SPACE_UID_SIZE (sizeof(KERNEL_SPACE_UID) - 1) | 33 #define KERNEL_SPACE_UID_SIZE (sizeof(KERNEL_SPACE_UID) - 1) |
| 41 #define KERNEL_SPACE_INIT_DATA ((uint8_t*) "\0\0\0\0" KERNEL_SPACE_UID) | 34 #define KERNEL_SPACE_INIT_DATA ((uint8_t*) "\0\0\0\0" KERNEL_SPACE_UID) |
| 42 #define KERNEL_SPACE_SIZE (sizeof(uint32_t) + KERNEL_SPACE_UID_SIZE) | 35 #define KERNEL_SPACE_SIZE (sizeof(uint32_t) + KERNEL_SPACE_UID_SIZE) |
| 43 | 36 |
| 44 /* All functions return TPM_SUCCESS (zero) if successful, non-zero if error */ | 37 /* All functions return TPM_SUCCESS (zero) if successful, non-zero if error */ |
| 45 | 38 |
| 46 | |
| 47 /* | 39 /* |
| 48 | 40 |
| 49 Call from LoadFirmware() | 41 Call from LoadFirmware() |
| 50 Normal or developer mode (not recovery) | 42 Normal or developer mode (not recovery) |
| 51 Wants firmware versions | 43 Wants firmware versions |
| 52 Must send in developer flag | 44 Must send in developer flag |
| 53 | 45 |
| 54 RollbackFirmwareSetup(IN devmode, OUT firmware versions) | 46 RollbackFirmwareSetup(IN devmode) |
| 47 (maybe) RollbackFirmwareRead() |
| 55 (maybe) RollbackFirmwareWrite() | 48 (maybe) RollbackFirmwareWrite() |
| 56 RollbackFirmwareLock() | 49 RollbackFirmwareLock() |
| 57 | 50 |
| 58 Call from LoadKernel() | 51 Call from LoadKernel() |
| 59 | 52 |
| 60 RollbackKernelRecovery(IN devmode) | 53 RollbackKernelRecovery(IN devmode) |
| 61 (implies LockFirmwareVersions() inside the setup) | 54 (implies LockFirmwareVersions() inside the setup) |
| 62 | 55 |
| 63 RollbackKernelRead(OUT kernel versions) | 56 RollbackKernelRead(OUT kernel versions) |
| 64 (maybe) RollbackKernelWrite() | 57 (maybe) RollbackKernelWrite() |
| 65 RollbackKernelLock() | 58 RollbackKernelLock() |
| 66 | 59 |
| 67 Any mode | 60 Any mode |
| 68 If recovery mode, this is the first time we've been called | 61 If recovery mode, this is the first time we've been called |
| 69 Must send in developer flag | 62 Must send in developer flag |
| 70 If not recovery mode, wants kernel versions | 63 If not recovery mode, wants kernel versions |
| 71 Must send in developer and recovery flags | 64 Must send in developer and recovery flags |
| 72 */ | 65 */ |
| 73 | 66 |
| 74 /* These functions are callable from LoadFirmware(). They cannot use | 67 /* These functions are callable from LoadFirmware(). They cannot use |
| 75 * global variables. */ | 68 * global variables. */ |
| 69 |
| 76 /* Setup must be called. Pass developer_mode=nonzero if in developer | 70 /* Setup must be called. Pass developer_mode=nonzero if in developer |
| 77 * mode. */ | 71 * mode. */ |
| 78 uint32_t RollbackFirmwareSetup(int developer_mode, | 72 uint32_t RollbackFirmwareSetup(int developer_mode); |
| 79 uint16_t* key_version, uint16_t* version); | 73 /* Read and Write may be called after Setup. */ |
| 74 uint32_t RollbackFirmwareRead(uint16_t* key_version, uint16_t* version); |
| 80 /* Write may be called if the versions change */ | 75 /* Write may be called if the versions change */ |
| 81 uint32_t RollbackFirmwareWrite(uint16_t key_version, uint16_t version); | 76 uint32_t RollbackFirmwareWrite(uint16_t key_version, uint16_t version); |
| 77 |
| 82 /* Lock must be called */ | 78 /* Lock must be called */ |
| 83 uint32_t RollbackFirmwareLock(void); | 79 uint32_t RollbackFirmwareLock(void); |
| 84 | 80 |
| 85 /* These functions are callable from LoadKernel(). They may use global | 81 /* These functions are callable from LoadKernel(). They may use global |
| 86 * variables. */ | 82 * variables. */ |
| 83 |
| 87 /* Recovery may be called. If it is, this is the first time a | 84 /* Recovery may be called. If it is, this is the first time a |
| 88 * rollback function has been called this boot, so it needs to know if | 85 * rollback function has been called this boot, so it needs to know if |
| 89 * we're in developer mode. Pass developer_mode=nonzero if in developer | 86 * we're in developer mode. Pass developer_mode=nonzero if in developer |
| 90 * mode. */ | 87 * mode. */ |
| 91 uint32_t RollbackKernelRecovery(int developer_mode); | 88 uint32_t RollbackKernelRecovery(int developer_mode); |
| 89 |
| 92 /* Read and write may be called if not in developer mode. If called in | 90 /* Read and write may be called if not in developer mode. If called in |
| 93 * recovery mode, these are ignored and/or return 0 versions. */ | 91 * recovery mode, the effect is undefined. */ |
| 94 uint32_t RollbackKernelRead(uint16_t* key_version, uint16_t* version); | 92 uint32_t RollbackKernelRead(uint16_t* key_version, uint16_t* version); |
| 95 uint32_t RollbackKernelWrite(uint16_t key_version, uint16_t version); | 93 uint32_t RollbackKernelWrite(uint16_t key_version, uint16_t version); |
| 94 |
| 96 /* Lock must be called. Internally, it's ignored in recovery mode. */ | 95 /* Lock must be called. Internally, it's ignored in recovery mode. */ |
| 97 uint32_t RollbackKernelLock(void); | 96 uint32_t RollbackKernelLock(void); |
| 98 | 97 |
| 99 | |
| 100 /* SetupTPM is called on boot and on starting the RW firmware, passing the | |
| 101 * appripriate MODE and DEVELOPER_FLAG parameters. MODE can be one of | |
| 102 * RO_RECOVERY_MODE, RO_NORMAL_MODE, RW_NORMAL_MODE. DEVELOPER_FLAG is 1 when | |
| 103 * the developer switch is ON, 0 otherwise. | |
| 104 * | |
| 105 * If SetupTPM returns TPM_SUCCESS, the caller may proceed. If it returns | |
| 106 * TPM_E_MUST_REBOOT, the caller must reboot in the current mode. For all | |
| 107 * other return values, the caller must reboot in recovery mode. | |
| 108 * | |
| 109 * This function has many side effects on the TPM state. In particular, when | |
| 110 * called with mode = RECOVERY_MODE, it locks the firmware versions before | |
| 111 * returning. In all other cases, the caller is responsible for locking the | |
| 112 * firmware versions once it decides it doesn't need to update them. | |
| 113 */ | |
| 114 uint32_t SetupTPM(int mode, int developer_flag); | |
| 115 uint32_t GetStoredVersions(int type, uint16_t* key_version, uint16_t* version); | |
| 116 uint32_t WriteStoredVersions(int type, uint16_t key_version, uint16_t version); | |
| 117 uint32_t LockFirmwareVersions(void); | |
| 118 uint32_t LockKernelVersionsByLockingPP(void); | |
| 119 | |
| 120 #endif /* VBOOT_REFERENCE_ROLLBACK_INDEX_H_ */ | 98 #endif /* VBOOT_REFERENCE_ROLLBACK_INDEX_H_ */ |
| OLD | NEW |