/* SPDX-License-Identifier: BSD-2-Clause */
/*
 * Copyright (c) 2017, Linaro Limited
 */

#ifndef __TEE_TADB_H
#define __TEE_TADB_H

#include <tee/tee_fs.h>

struct tee_tadb_ta_write;
struct tee_tadb_ta_read;

/*
 * struct tee_tadb_property
 * @uuid:	UUID of Trusted Application (TA) or Security Domain (SD)
 * @version:	Version of TA or SD
 * @custom_size:Size of customized properties, prepended to the encrypted
 *		TA binary
 * @bin_size:	Size of the binary TA
 */
struct tee_tadb_property {
	TEE_UUID uuid;
	uint32_t version;
	uint32_t custom_size;
	uint32_t bin_size;
};

struct tee_fs_rpc_operation;

struct tee_tadb_file_operations {
	TEE_Result (*open)(uint32_t file_number, int *fd);
	TEE_Result (*create)(uint32_t file_number, int *fd);
	void (*close)(int fd);
	TEE_Result (*remove)(uint32_t file_number);

	TEE_Result (*read_init)(struct tee_fs_rpc_operation *op, int fd,
				size_t pos, uint8_t **data, size_t bytes);
	TEE_Result (*read_final)(struct tee_fs_rpc_operation *op,
				size_t *bytes);

	TEE_Result (*write_init)(struct tee_fs_rpc_operation *op, int fd,
				 size_t pos, uint8_t **data, size_t len);
	TEE_Result (*write_final)(struct tee_fs_rpc_operation *op);
};

TEE_Result tee_tadb_ta_create(const struct tee_tadb_property *property,
			      struct tee_tadb_ta_write **ta);
TEE_Result tee_tadb_ta_write(struct tee_tadb_ta_write *ta, const void *buf,
			     size_t len);
void tee_tadb_ta_close_and_delete(struct tee_tadb_ta_write *ta);
TEE_Result tee_tadb_ta_close_and_commit(struct tee_tadb_ta_write *ta);

TEE_Result tee_tadb_ta_delete(const TEE_UUID *uuid);

TEE_Result tee_tadb_ta_open(const TEE_UUID *uuid, struct tee_tadb_ta_read **ta);
const struct tee_tadb_property *
tee_tadb_ta_get_property(struct tee_tadb_ta_read *ta);
TEE_Result tee_tadb_get_tag(struct tee_tadb_ta_read *ta, uint8_t *tag,
			    unsigned int *tag_len);
TEE_Result tee_tadb_ta_read(struct tee_tadb_ta_read *ta, void *buf,
			    size_t *len);
void tee_tadb_ta_close(struct tee_tadb_ta_read *ta);


#endif /*__TEE_TADB_H*/
