Example header file

Each implementation of the PSA Firmware Update API must provide a header file named psa/update.h, in which the API elements in this specification are defined.

This appendix provides a example of the psa/update.h header file with all of the API elements. This can be used as a starting point or reference for an implementation.

psa/update.h

typedef /*...*/ psa_fwu_iterator_t;
typedef uint32_t psa_image_id_t;
typedef int32_t psa_status_t;
struct psa_hash_t {
    uint8_t value[PSA_FWU_MAX_DIGEST_SIZE];
};
typedef struct psa_image_info_t {
    struct psa_image_id_t image_id;
    psa_uuid_t vendor_id;
    psa_uuid_t class_id;
    struct psa_image_version_t version;
    uint8_t state;
    psa_staging_info_t staging;
    uint32_t error;
    uint8_t digest[PSA_FWU_MAX_DIGEST_SIZE];
} psa_image_info_t;
typedef struct psa_image_version_t {
    uint16_t major;
    uint16_t minor;
    uint16_t patch;
} psa_image_version_t;
typedef struct psa_staging_info_t {
    uint8_t flags;
    uint8_t metadata_format;
    size_t max_size;
    psa_hash_t key_id;
} psa_staging_info_t;
typedef struct psa_uuid_t {
    uint32_t uuid[4];
} psa_uuid_t;
#define PSA_ERROR_ALREADY_INSTALLED ((psa_status_t)-158)
#define PSA_ERROR_COMMUNICATION_FAILURE ((psa_status_t)-145)
#define PSA_ERROR_CORRUPTION_DETECTED ((psa_status_t)-151)
#define PSA_ERROR_CURRENTLY_INSTALLING ((psa_status_t)-157)
#define PSA_ERROR_DATA_CORRUPT ((psa_status_t)-152)
#define PSA_ERROR_DATA_INVALID ((psa_status_t)-153)
#define PSA_ERROR_DECRYPTION_FAILURE ((psa_status_t)-162)
#define PSA_ERROR_DEPENDENCY_NEEDED ((psa_status_t)-156)
#define PSA_ERROR_DOES_NOT_EXIST ((psa_status_t)-140)
#define PSA_ERROR_FLASH_ABUSE ((psa_status_t)-160)
#define PSA_ERROR_GENERIC_ERROR ((psa_status_t)-132)
#define PSA_ERROR_HARDWARE_FAILURE ((psa_status_t)-147)
#define PSA_ERROR_INSTALL_INTERRUPTED ((psa_status_t)-159)
#define PSA_ERROR_INSUFFICIENT_DATA ((psa_status_t)-143)
#define PSA_ERROR_INSUFFICIENT_MEMORY ((psa_status_t)-141)
#define PSA_ERROR_INSUFFICIENT_POWER ((psa_status_t)-161)
#define PSA_ERROR_INSUFFICIENT_STORAGE ((psa_status_t)-142)
#define PSA_ERROR_INVALID_ARGUMENT ((psa_status_t)-135)
#define PSA_ERROR_INVALID_SIGNATURE ((psa_status_t)-149)
#define PSA_ERROR_MISSING_MANIFEST ((psa_status_t)-163)
#define PSA_ERROR_NOT_PERMITTED ((psa_status_t)-133)
#define PSA_ERROR_NOT_SUPPORTED ((psa_status_t)-134)
#define PSA_ERROR_STORAGE_FAILURE ((psa_status_t)-146)
#define PSA_ERROR_WRONG_DEVICE ((psa_status_t)-155)
#define PSA_FWU_API_VERSION_MAJOR 0
#define PSA_FWU_API_VERSION_MINOR 7
#define PSA_FWU_MAX_BLOCK_SIZE IMPDEF
#define PSA_FWU_MAX_DIGEST_SIZE IMPDEF
#define PSA_IMAGE_CANDIDATE 1
#define PSA_IMAGE_FLAG_ENCRYPTION (0x00000002)
#define PSA_IMAGE_FLAG_VOLATILE_STAGING (0x00000001)
#define PSA_IMAGE_INSTALLED 2
#define PSA_IMAGE_PENDING_INSTALL 4
#define PSA_IMAGE_REBOOT_NEEDED 5
#define PSA_IMAGE_REJECTED 3
#define PSA_IMAGE_UNDEFINED 0
#define PSA_SUCCESS ((psa_status_t)0)
#define PSA_SUCCESS_DEPENDENCY_NEEDED ((psa_status_t)+3)
#define PSA_SUCCESS_REBOOT ((psa_status_t)+1)
#define PSA_SUCCESS_RESTART ((psa_status_t)+2)
psa_status_t psa_fwu_abort(psa_image_id_t image_id);
psa_status_t psa_fwu_accept(void);
psa_status_t psa_fwu_get_image_id(psa_fwu_iterator_t *iterator,
                                  psa_image_id_t *image_id);
void psa_fwu_get_image_id_iterator(psa_fwu_iterator_t *iterator);
bool psa_fwu_get_image_id_next(psa_fwu_iterator_t *iterator);
bool psa_fwu_get_image_id_valid(psa_fwu_iterator_t *iterator);
psa_status_t psa_fwu_install(psa_image_id_t image_id,
                             psa_image_id_t *dependency_image_id,
                             psa_image_version_t *dependency_version);
psa_status_t psa_fwu_query(psa_image_id_t image_id,
                           psa_image_info_t *info);
psa_status_t psa_fwu_request_reboot(void);
psa_status_t psa_fwu_request_rollback(uint32_t error);
psa_status_t psa_fwu_set_manifest(psa_image_id_t image_id,
                                  const void *manifest,
                                  size_t manifest_size,
                                  psa_hash_t *manifest_dependency);
psa_status_t psa_fwu_write(psa_image_id_t image_id,
                           size_t image_offset,
                           const void *block,
                           size_t block_size);