#ifndef _TZ_STRONGBOX_H_
#define _TZ_STRONGBOX_H_

#include <stdint.h>
#include <cmd_serializer.h>

#define SECNVM_HEADER_SIZE 77 /* RND1(32B)||RND2(32B)||index(1B) || time(12B) */

uint32_t strongbox_get_info(blob_t *hw_info);
uint32_t strongbox_self_test(blob_t *result);
uint32_t get_secnvm_provisioning_key(blob_t *wrapped_key);

uint32_t sign_secnvm_get_request(const uint32_t slot_id, const blob_t *random,
                    blob_t *header, blob_t *ssp_auth);
uint32_t verify_secnvm_get_response(const blob_t *header, const blob_t *encrypted_credential,
                    const blob_t *se_auth, blob_t *credential, uint8_t dec);
uint32_t sign_secnvm_put_request(const uint32_t slot_id, const blob_t *random, 
                    const blob_t *credential, blob_t *header,
                    blob_t *encrypted_credential, blob_t *ssp_auth, uint8_t enc);
uint32_t sign_secnvm_delete_request(const uint32_t slot_id, const blob_t *random,
                    blob_t *header, blob_t *ssp_auth);
uint32_t secnvm_get_info(blob_t *info, uint32_t *provision_status);
uint32_t secnvm_remove_applications();
uint32_t secnvm_update_fw_frag(uint32_t type, uint32_t size, uint32_t pos, blob_t *frag, uint32_t *consumed);
uint32_t secnvm_get_app_info(uint32_t channel, blob_t *info);
uint32_t secnvm_self_test(uint32_t test, blob_t *result);
uint32_t secnvm_provision(uint32_t target);
uint32_t weaver_get_config(uint32_t *slot_size, uint32_t *key_size, uint32_t *value_size);
uint32_t weaver_read(uint32_t slot, const blob_t *key, uint32_t *result,
                    blob_t *value, uint32_t *throttle, uint32_t *failure_count);
uint32_t weaver_write(uint32_t slot, const blob_t *key, const blob_t *value, uint32_t *result);
uint32_t weaver_update();

uint32_t secnvm_put_cred(uint32_t slot_id, const blob_t *cred, uint32_t sp_wrap);
uint32_t secnvm_get_cred(uint32_t slot_id, blob_t *cred);
uint32_t secnvm_delete_cred(uint32_t slot_id);
uint32_t secnvm_put_persistent_cred(uint32_t slot_id, const blob_t *cred, uint32_t sp_wrap);
uint32_t secnvm_get_persistent_cred(uint32_t slot_id, blob_t *cred);
uint32_t secnvm_delete_persistent_cred(uint32_t slot_id);
uint32_t secnvm_factory_reset();

#endif // #ifndef _TZ_STRONGBOX_H_
