| /* Copyright 2016 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. |
| */ |
| |
| #ifndef VBOOT_REFERENCE_BDB_NVM_H_ |
| #define VBOOT_REFERENCE_BDB_NVM_H_ |
| |
| #include <stdint.h> |
| #include "bdb_struct.h" |
| #include "bdb_api.h" |
| |
| enum nvm_type { |
| NVM_TYPE_WP_PRIMARY, |
| NVM_TYPE_WP_SECONDARY, |
| NVM_TYPE_RW_PRIMARY, |
| NVM_TYPE_RW_SECONDARY, |
| }; |
| |
| #define NVM_RW_MAGIC 0x3052766e |
| |
| /* Size in bytes of encrypted BUC (Boot Unlock Code) */ |
| #define BUC_ENC_DIGEST_SIZE 32 |
| /* Size in bytes of HMAC of struct NVM-RW */ |
| #define NVM_HMAC_SIZE BDB_SHA256_DIGEST_SIZE |
| |
| #define NVM_RW_FLAG_BUC_PRESENT (1 << 0) |
| #define NVM_RW_FLAG_DFM_DISABLE (1 << 1) |
| #define NVM_RW_FLAG_DOSM (1 << 2) |
| |
| /* This is the minimum size of the data needed to learn the actual size */ |
| #define NVM_MIN_STRUCT_SIZE 8 |
| |
| #define NVM_HEADER_VERSION_MAJOR 1 |
| #define NVM_HEADER_VERSION_MINOR 1 |
| |
| /* Maximum number of retries for writing NVM */ |
| #define NVM_MAX_WRITE_RETRY 2 |
| |
| struct nvmrw { |
| /* Magic number to identify struct */ |
| uint32_t struct_magic; |
| |
| /* Structure version */ |
| uint8_t struct_major_version; |
| uint8_t struct_minor_version; |
| |
| /* Size of struct in bytes. 96 for version 1.0 */ |
| uint16_t struct_size; |
| |
| /* Number of updates to structure contents */ |
| uint32_t update_count; |
| |
| /* Flags: NVM_RW_FLAG_* */ |
| uint32_t flags; |
| |
| /* Minimum valid kernel data key version */ |
| uint32_t min_kernel_data_key_version; |
| |
| /* Minimum valid kernel version */ |
| uint32_t min_kernel_version; |
| |
| /* Type of BUC */ |
| uint8_t buc_type; |
| |
| uint8_t reserved0[7]; |
| |
| /* Encrypted BUC */ |
| uint8_t buc_enc_digest[BUC_ENC_DIGEST_SIZE]; |
| |
| /* SHA-256 HMAC of the struct contents. Add new fields before this. */ |
| uint8_t hmac[NVM_HMAC_SIZE]; |
| } __attribute__((packed)); |
| |
| /* |
| * List of variables stored in NVM-RW. This should be exported and used by |
| * firmware and futility to access data in NVM-RW. |
| */ |
| enum nvmrw_var { |
| NVMRW_VAR_UPDATE_COUNT, |
| NVMRW_VAR_FLAGS, |
| NVMRW_VAR_MIN_KERNEL_DATA_KEY_VERSION, |
| NVMRW_VAR_MIN_KERNEL_VERSION, |
| NVMRW_VAR_BUC_TYPE, |
| NVMRW_VAR_FLAG_BUC_PRESENT, |
| NVMRW_VAR_FLAG_DFM_DISABLE, |
| NVMRW_VAR_FLAG_DOSM, |
| }; |
| |
| /* Size of the version 1.0 */ |
| #define NVM_RW_MIN_STRUCT_SIZE 96 |
| /* 4 Kbit EEPROM divided by 4 regions (RO,RW) x (1st,2nd) = 128 KB */ |
| #define NVM_RW_MAX_STRUCT_SIZE 128 |
| |
| /* For nvm_rw_read and nvm_write */ |
| struct vba_context; |
| |
| /** |
| * Read NVM-RW contents into the context |
| * |
| * @param ctx struct vba_context |
| * @return BDB_SUCCESS or BDB_ERROR_NVM_* |
| */ |
| int nvmrw_read(struct vba_context *ctx); |
| |
| /** |
| * Write to NVM-RW from the context |
| * |
| * @param ctx struct vba_context |
| * @param type NVM_TYPE_RW_* |
| * @return BDB_SUCCESS or BDB_ERROR_NVM_* |
| */ |
| int nvmrw_write(struct vba_context *ctx, enum nvm_type type); |
| |
| /** |
| * Get a value of NVM-RW variable |
| * |
| * Callers are responsible for init and verify of ctx->nvmrw. |
| * |
| * @param ctx struct vba_context |
| * @param var Index of the variable |
| * @param val Destination where the value is stored |
| * @return BDB_SUCCESS or BDB_ERROR_NVM_* |
| */ |
| int nvmrw_get(struct vba_context *ctx, enum nvmrw_var var, uint32_t *val); |
| |
| /** |
| * Set a value in NVM-RW variable |
| * |
| * Callers are responsible for init and verify of ctx->nvmrw. |
| * |
| * @param ctx struct vba_context |
| * @param var Index of the variable |
| * @param val Value to be set |
| * @return BDB_SUCCESS or BDB_ERROR_NVM_* |
| */ |
| int nvmrw_set(struct vba_context *ctx, enum nvmrw_var var, uint32_t val); |
| |
| #endif |