1
0
mirror of https://review.coreboot.org/flashrom.git synced 2025-11-14 03:30:41 +01:00
Files
flashrom/include/rpmc.h
Anastasia Klimchuk c09a2f5387 core: Use SPDX in headers
Change-Id: Ic24a54ab520053e49efcba02bd9fa5b8ce69b20a
Signed-off-by: Anastasia Klimchuk <aklm@flashrom.org>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/89956
Reviewed-by: Antonio Vázquez Blanco <antoniovazquezblanco@gmail.com>
Reviewed-by: Sergii Dmytruk <sergii.dmytruk@3mdeb.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
2025-11-12 11:30:28 +00:00

157 lines
4.6 KiB
C

/*
* This file is part of the flashrom project.
*
* SPDX-License-Identifier: GPL-2.0-only
* SPDX-FileCopyrightText: 2024 Matti Finder (written by Matti Finder <matti.finder@gmail.com>)
*/
#ifndef __RPMC_H__
#define __RPMC_H__ 1
#include <stdint.h>
#include "flash.h" // for flashctx
/**
* @defgroup flashrom-rpmc RPMC operations
* @{
*/
#define RPMC_OP1_MSG_HEADER_LENGTH 4
#define RPMC_SIGNATURE_LENGTH 32
#define RPMC_COUNTER_LENGTH 4
#define RPMC_KEY_DATA_LENGTH 4
#define RPMC_TAG_LENGTH 12
#define RPMC_HMAC_KEY_LENGTH 32
#define RPMC_TRUNCATED_SIG_LENGTH 28
enum rpmc_result {
RPMC_SUCCESS = 0,
RPMC_ERROR_SPI_TRANSMISSION,
RPMC_ERROR_OPENSSL,
RPMC_ERROR_TAG_MISMATCH,
RPMC_ERROR_SIGNATURE_MISMATCH,
RPMC_ERROR_INTERNAL,
RPMC_ERROR_KEY_READ,
RPMC_ERROR_HARDENING_UNSUPPORTED,
RPMC_ERROR_COUNTER_OUT_OF_RANGE,
RPMC_ERROR_ROOT_KEY_OVERWRITE,
RPMC_ERROR_COUNTER_UNINITIALIZED,
RPMC_ERROR_COUNTER_DATA_MISMATCH,
RPMC_ERROR_HMAC_KEY_REGISTER_UNINITIALIZED,
RPMC_ERROR_WRONG_SIGNATURE
};
struct rpmc_status_register {
/*
* Values:
* 0b00000000 -> Power on state
* 0b10000000 -> Success
* 0b0xxxxxx1 -> Busy
* 0b0xxxxx1x -> Error: Root key register overwrite,
* counter Address out of range,
* truncated signature mismatch
* or monotonic counter uninitialized
* 0b0xxxx1xx -> Error: Signature mismatch,
* counter address out of range,
* cmdtype out of range
* or incorrect payload size
* 0b0xxx1xxx -> Error: Hmac key register uninitialized
* 0b0xx1xxxx -> Error: Counter data mismatch
* 0b0x1xxxxx -> Fatal device error
*
* Some bits might exclude others or their meaning might be dependent
* on previous commands.
* Read JESD260 or your device's data sheet for more details.
*/
uint8_t status;
unsigned char tag[RPMC_TAG_LENGTH];
uint32_t counter_data;
unsigned char signature[RPMC_SIGNATURE_LENGTH];
};
/**
* @brief Write root key on flashchip
*
* @param[in] flash Flash context which rpmc options will be used
* @param[in] keyfile Location of 32-byte key to use
* @param[in] counter_address Address of counter (starts at 0)
*
* @return The result of the operation
*/
enum rpmc_result rpmc_write_root_key(struct flashrom_flashctx *flash,
const char *keyfile,
unsigned int counter_address);
/**
* @brief Update hmac key register
*
* @param[in] flash Flash context which rpmc options will be used
* @param[in] keyfile Location of 32-byte key to use
* @param[in] key_data 4-bytes of data to use as key data
* @param[in] counter_address Address of counter (starts at 0)
*
* @return The result of the operation
*/
enum rpmc_result rpmc_update_hmac_key(struct flashrom_flashctx *flash,
const char *keyfile,
uint32_t key_data,
unsigned int counter_address);
/**
* @brief Increment monotonic counter value
*
* @param[in] flash Flash context which rpmc options will be used
* @param[in] keyfile Location of 32-byte key to use
* @param[in] key_data 4-bytes of data to use as key data
* @param[in] counter_address Address of counter (starts at 0)
* @param[in] previous_value Previous value of counter
*
* @return The result of the operation
*/
enum rpmc_result rpmc_increment_counter(struct flashrom_flashctx *flash,
const char *keyfile,
uint32_t key_data,
unsigned int counter_address,
uint32_t previous_value);
/**
* @brief Get monotonic counter value
*
* @param[in] flash Flash context which rpmc options will be used
* @param[in] keyfile Location of 32-byte key to use
* @param[in] key_data 4-bytes of data to use as key data
* @param[in] counter_address Address of counter (starts at 0)
* @param[out] counter_value Pointer to write the counter value to
*
* @return The result of the operation
*/
enum rpmc_result rpmc_get_monotonic_counter(struct flashrom_flashctx *flash,
const char *keyfile,
uint32_t key_data,
unsigned int counter_address,
uint32_t *counter_value);
/**
* @brief Read the full JESD260 extended status register
*
* @param[in] flash Flash context which rpmc options will be used
* @param[out] status Status register to write data into
*
* @return The result of the operation
*/
enum rpmc_result rpmc_read_data(struct flashrom_flashctx *flash,
struct rpmc_status_register *status);
/**
* @brief Get a string description for rpmc result
*
* @param[in] value A rpmc result
*
* @return String description
*/
const char * rpmc_describe_result(enum rpmc_result value);
/** @} */ /* end flashrom-rpmc */
#endif /* !__RPMC_H__ */