core/manifest/manifest_manager.h (63 lines of code) (raw):
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
#ifndef MANIFEST_MANAGER_H_
#define MANIFEST_MANAGER_H_
#include <stddef.h>
#include <stdint.h>
#include "manifest.h"
#include "crypto/hash.h"
#include "status/rot_status.h"
/**
* Base API for managing a single set of manifests.
*/
struct manifest_manager {
/**
* Activate the pending manifest and discard the active manifest.
*
* @param manager The manifest manager to update.
*
* @return 0 if the pending manifest was successfully activated or an error if there no pending
* manifest to activate.
*/
int (*activate_pending_manifest) (const struct manifest_manager *manager);
/**
* Clear the pending manifest region in order to accept new manifest data.
*
* @param manager The manifest manager for the pending region to clear.
* @param size Size of incoming manifest
*
* @return 0 if the pending manifest region was successfully cleared or an error code.
*/
int (*clear_pending_region) (const struct manifest_manager *manager, size_t size);
/**
* Write data to the pending manifest region. This data must be written sequentially.
*
* @param manager The manifest manager for the pending region to write to.
* @param data The data that should be written.
* @param length The length of the data to write.
*
* @return 0 if the data was successfully written or an error code.
*/
int (*write_pending_data) (const struct manifest_manager *manager, const uint8_t *data,
size_t length);
/**
* After all manifest has been written to the pending area, verify that the region contains a
* valid manifest.
*
* @param manager The manifest manager to use for validation.
*
* @return 0 if the pending manifest was successfully validated or an error code.
*/
int (*verify_pending_manifest) (const struct manifest_manager *manager);
/**
* Erase all manifest data from both active and pending regions and revert to state with no
* valid manifests.
*
* @param manager The manifest manager for the manifests to clear.
*
* @return 0 if the manifests were erased or an error code.
*/
int (*clear_all_manifests) (const struct manifest_manager *manager);
int port; /**< Port identifier for the manager. */
const struct hash_engine *hash; /**< The hash engine for generating measurement data. */
};
int manifest_manager_init (struct manifest_manager *manager, const struct hash_engine *hash);
void manifest_manager_set_port (struct manifest_manager *manager, int port);
int manifest_manager_get_port (const struct manifest_manager *manager);
int manifest_manager_get_manifest_digest_measured_data (const struct manifest *active,
const struct hash_engine *hash, size_t offset, uint8_t *buffer, size_t length,
uint32_t *total_len);
int manifest_manager_hash_manifest_digest_measured_data (const struct manifest *active,
const struct hash_engine *manifest_hash, const struct hash_engine *measure_hash);
int manifest_manager_get_id_measured_data (const struct manifest *active, size_t offset,
uint8_t *buffer, size_t length, uint32_t *total_len);
int manifest_manager_hash_id_measured_data (const struct manifest *active,
const struct hash_engine *hash);
int manifest_manager_get_platform_id_measured_data (const struct manifest *active, size_t offset,
uint8_t *buffer, size_t length, uint32_t *total_len);
int manifest_manager_hash_platform_id_measured_data (const struct manifest *active,
const struct hash_engine *hash);
int manifest_manager_get_manifest_measured_data (const struct manifest_manager *manager,
const struct manifest *active, size_t offset, uint8_t *buffer, size_t length,
uint32_t *total_len);
int manifest_manager_hash_manifest_measured_data (const struct manifest_manager *manager,
const struct manifest *active, const struct hash_engine *hash);
#define MANIFEST_MANAGER_ERROR(code) ROT_ERROR (ROT_MODULE_MANIFEST_MANAGER, code)
/**
* Error codes that can be generated by a manifest manager.
*
* Note: Commented error codes have been deprecated.
*/
enum {
MANIFEST_MANAGER_INVALID_ARGUMENT = MANIFEST_MANAGER_ERROR (0x00), /**< Input parameter is null or not valid. */
MANIFEST_MANAGER_NO_MEMORY = MANIFEST_MANAGER_ERROR (0x01), /**< Memory allocation failed. */
MANIFEST_MANAGER_ACTIVATE_FAILED = MANIFEST_MANAGER_ERROR (0x02), /**< Pending manifest was not activated. */
MANIFEST_MANAGER_CLEAR_FAILED = MANIFEST_MANAGER_ERROR (0x03), /**< The pending region was not cleared. */
MANIFEST_MANAGER_WRITE_FAILED = MANIFEST_MANAGER_ERROR (0x04), /**< Data was not written to the pending region. */
MANIFEST_MANAGER_VERIFY_FAILED = MANIFEST_MANAGER_ERROR (0x05), /**< An error unrelated to verification occurred. */
MANIFEST_MANAGER_INVALID_ID = MANIFEST_MANAGER_ERROR (0x06), /**< The manifest ID is not valid. */
MANIFEST_MANAGER_NONE_PENDING = MANIFEST_MANAGER_ERROR (0x07), /**< There is no manifest pending for the operation. */
MANIFEST_MANAGER_PENDING_IN_USE = MANIFEST_MANAGER_ERROR (0x08), /**< The pending manifest is actively being used. */
MANIFEST_MANAGER_NOT_CLEARED = MANIFEST_MANAGER_ERROR (0x09), /**< Pending region was not cleared before write. */
// MANIFEST_MANAGER_OUT_OF_SPACE = MANIFEST_MANAGER_ERROR (0x0a), /**< Not enough room in the pending region for data. */
// MANIFEST_MANAGER_INCOMPLETE_WRITE = MANIFEST_MANAGER_ERROR (0x0b), /**< Not all data was written. */
MANIFEST_MANAGER_HAS_PENDING = MANIFEST_MANAGER_ERROR (0x0c), /**< A pending manifest is already present. */
MANIFEST_MANAGER_NO_TASK = MANIFEST_MANAGER_ERROR (0x0d), /**< No manager command task is running. */
MANIFEST_MANAGER_TASK_BUSY = MANIFEST_MANAGER_ERROR (0x0e), /**< The command task is busy performing an operation. */
MANIFEST_MANAGER_UNSUPPORTED_OP = MANIFEST_MANAGER_ERROR (0x0f), /**< The requested operation is not supported by the manager. */
MANIFEST_MANAGER_INCOMPATIBLE = MANIFEST_MANAGER_ERROR (0x10), /**< The pending manifest is incompatible with the system. */
MANIFEST_MANAGER_INCOMPLETE_UPDATE = MANIFEST_MANAGER_ERROR (0x11), /**< The staging flash has not been programmed with all the expected data. */
MANIFEST_MANAGER_NO_ACTIVE_MANIFEST = MANIFEST_MANAGER_ERROR (0x12), /**< No active manifest found. */
MANIFEST_MANAGER_ACTIVE_IN_USE = MANIFEST_MANAGER_ERROR (0x13), /**< The active manifest is currently being used. */
MANIFEST_MANAGER_CLEAR_ALL_FAILED = MANIFEST_MANAGER_ERROR (0x14), /**< Failed to clear the manifest data. */
MANIFEST_MANAGER_TOO_MUCH_DATA = MANIFEST_MANAGER_ERROR (0x15), /**< Too much data was sent in a single request. */
MANIFEST_MANAGER_SAME_HASH_ENGINE = MANIFEST_MANAGER_ERROR (0x16), /**< The same instance is used when hashing manifest measured data. */
};
#endif /* MANIFEST_MANAGER_H_ */