xref: /optee_os/core/include/tee/fs_dirfile.h (revision 623b9bd4ec219aa5d6a4eaec16d341e54ff658a9)
11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */
2d7767217SJens Wiklander /*
3d7767217SJens Wiklander  * Copyright (c) 2017, Linaro Limited
4d7767217SJens Wiklander  */
5d7767217SJens Wiklander 
6d7767217SJens Wiklander #ifndef __TEE_FS_DIRFILE_H
7d7767217SJens Wiklander #define __TEE_FS_DIRFILE_H
8d7767217SJens Wiklander 
9d7767217SJens Wiklander #include <tee/tee_fs.h>
10d7767217SJens Wiklander #include <tee/fs_htree.h>
11d7767217SJens Wiklander 
12d7767217SJens Wiklander struct tee_fs_dirfile_dirh;
13d7767217SJens Wiklander 
14d7767217SJens Wiklander /**
15d7767217SJens Wiklander  * struct tee_fs_dirfile_fileh - file handle
16d7767217SJens Wiklander  * @file_number:	sequence number of a file
17d7767217SJens Wiklander  * @hash:		hash of file, to be supplied to tee_fs_htree_open()
18d7767217SJens Wiklander  * @idx:		index of the file handle in the dirfile
19d7767217SJens Wiklander  */
20d7767217SJens Wiklander struct tee_fs_dirfile_fileh {
21d7767217SJens Wiklander 	uint32_t file_number;
22d7767217SJens Wiklander 	uint8_t hash[TEE_FS_HTREE_HASH_SIZE];
23d7767217SJens Wiklander 	int idx;
24d7767217SJens Wiklander };
25d7767217SJens Wiklander 
26d7767217SJens Wiklander /**
27d7767217SJens Wiklander  * struct tee_fs_dirfile_operations - file interface supplied by user of this
28d7767217SJens Wiklander  * interface
29d7767217SJens Wiklander  * @open:		opens a file
30d7767217SJens Wiklander  * @close:		closes a file, changes are discarded unless
31d7767217SJens Wiklander  *			@commit_writes is called before
32d7767217SJens Wiklander  * @read:		reads from an open file
33d7767217SJens Wiklander  * @write:		writes to an open file
34d7767217SJens Wiklander  * @commit_writes:	commits changes since the file was opened
35d7767217SJens Wiklander  */
36d7767217SJens Wiklander struct tee_fs_dirfile_operations {
37*623b9bd4SJens Wiklander 	TEE_Result (*open)(bool create, uint8_t *hash, uint32_t min_counter,
38*623b9bd4SJens Wiklander 			   const TEE_UUID *uuid,
39d7767217SJens Wiklander 			   struct tee_fs_dirfile_fileh *dfh,
40d7767217SJens Wiklander 			   struct tee_file_handle **fh);
41d7767217SJens Wiklander 	void (*close)(struct tee_file_handle *fh);
42b2284b11SJens Wiklander 	TEE_Result (*read)(struct tee_file_handle *fh, size_t pos, void *buf,
43b2284b11SJens Wiklander 			   size_t *len);
44d7767217SJens Wiklander 	TEE_Result (*write)(struct tee_file_handle *fh, size_t pos,
45d7767217SJens Wiklander 			    const void *buf, size_t len);
46*623b9bd4SJens Wiklander 	TEE_Result (*commit_writes)(struct tee_file_handle *fh, uint8_t *hash,
47*623b9bd4SJens Wiklander 				    uint32_t *counter);
48d7767217SJens Wiklander };
49d7767217SJens Wiklander 
50d7767217SJens Wiklander /**
51d7767217SJens Wiklander  * tee_fs_dirfile_open() - opens a dirfile handle
52a4ed7bafSJens Wiklander  * @create:	true if a new dirfile is to be created, else the dirfile
53a4ed7bafSJens Wiklander  *		is read opened and verified
54a4ed7bafSJens Wiklander  * @hash:	hash of underlying file
55*623b9bd4SJens Wiklander  * @min_counter: the smallest accepted value in struct htree_image.counter
56d7767217SJens Wiklander  * @fops:	file interface
57d7767217SJens Wiklander  * @dirh:	returned dirfile handle
58d7767217SJens Wiklander  */
59*623b9bd4SJens Wiklander TEE_Result tee_fs_dirfile_open(bool create, uint8_t *hash, uint32_t min_counter,
60a4ed7bafSJens Wiklander 			       const struct tee_fs_dirfile_operations *fops,
61d7767217SJens Wiklander 			       struct tee_fs_dirfile_dirh **dirh);
62d7767217SJens Wiklander /**
63d7767217SJens Wiklander  * tee_fs_dirfile_close() - closes a dirfile handle
64d7767217SJens Wiklander  * @dirh:	dirfile handle
65d7767217SJens Wiklander  *
66d7767217SJens Wiklander  * All changes since last call to tee_fs_dirfile_commit_writes() are
67d7767217SJens Wiklander  * discarded.
68d7767217SJens Wiklander  */
69d7767217SJens Wiklander void tee_fs_dirfile_close(struct tee_fs_dirfile_dirh *dirh);
70d7767217SJens Wiklander 
71d7767217SJens Wiklander /**
72d7767217SJens Wiklander  * tee_fs_dirfile_commit_writes() - commit updates of dirfile
73d7767217SJens Wiklander  * @dirh:	dirfile handle
74a4ed7bafSJens Wiklander  * @hash:	hash of underlying file is copied here if not NULL
75*623b9bd4SJens Wiklander  * @counter:	version counter of underlying file is copied here if not NULL
76d7767217SJens Wiklander  */
77a4ed7bafSJens Wiklander TEE_Result tee_fs_dirfile_commit_writes(struct tee_fs_dirfile_dirh *dirh,
78*623b9bd4SJens Wiklander 					uint8_t *hash, uint32_t *counter);
79d7767217SJens Wiklander 
80d7767217SJens Wiklander /**
81d7767217SJens Wiklander  * tee_fs_dirfile_get_tmp() - get a temporary file handle
82d7767217SJens Wiklander  * @dirh:	dirfile handle
83d7767217SJens Wiklander  * @dfh:	returned temporary file handle
84d7767217SJens Wiklander  *
85d7767217SJens Wiklander  * Note, nothing is queued up as changes to the dirfile with this function.
86d7767217SJens Wiklander  */
87d7767217SJens Wiklander TEE_Result tee_fs_dirfile_get_tmp(struct tee_fs_dirfile_dirh *dirh,
88d7767217SJens Wiklander 				  struct tee_fs_dirfile_fileh *dfh);
89d7767217SJens Wiklander 
90d7767217SJens Wiklander /**
91d7767217SJens Wiklander  * tee_fs_dirfile_find() - find a file handle
92d7767217SJens Wiklander  * @dirh:	dirfile handle
93fd108c3eSJens Wiklander  * @uuid:	uuid of requesting TA
94d7767217SJens Wiklander  * @oid:	object id
95d7767217SJens Wiklander  * @oidlen:	length of object id
96d7767217SJens Wiklander  * @dfh:	returned file handle
97d7767217SJens Wiklander  */
98d7767217SJens Wiklander TEE_Result tee_fs_dirfile_find(struct tee_fs_dirfile_dirh *dirh,
99fd108c3eSJens Wiklander 			       const TEE_UUID *uuid, const void *oid,
100fd108c3eSJens Wiklander 			       size_t oidlen, struct tee_fs_dirfile_fileh *dfh);
101d7767217SJens Wiklander 
102d7767217SJens Wiklander /**
103d7767217SJens Wiklander  * tee_fs_dirfile_fileh_to_fname() - get string representation of file handle
104d7767217SJens Wiklander  * @dfh:	file handle
105d7767217SJens Wiklander  * @fname:	buffer
106d7767217SJens Wiklander  * @fnlen:	length of buffer, updated to used length
107d7767217SJens Wiklander  */
108d7767217SJens Wiklander TEE_Result tee_fs_dirfile_fileh_to_fname(const struct tee_fs_dirfile_fileh *dfh,
109d7767217SJens Wiklander 					 char *fname, size_t *fnlen);
110d7767217SJens Wiklander 
111d7767217SJens Wiklander /**
112d7767217SJens Wiklander  * tee_fs_dirfile_rename() - changes/supplies file handle object id
113d7767217SJens Wiklander  * @dirh:	dirfile handle
114fd108c3eSJens Wiklander  * @uuid:	uuid of requesting TA
115d7767217SJens Wiklander  * @dfh:	file handle
116d7767217SJens Wiklander  * @oid:	object id
117d7767217SJens Wiklander  * @oidlen:	length of object id
118d7767217SJens Wiklander  *
119d7767217SJens Wiklander  * If the supplied object id already is used by another file is that file
120d7767217SJens Wiklander  * removed from the dirfile.
121d7767217SJens Wiklander  */
122d7767217SJens Wiklander TEE_Result tee_fs_dirfile_rename(struct tee_fs_dirfile_dirh *dirh,
123fd108c3eSJens Wiklander 				 const TEE_UUID *uuid,
124d7767217SJens Wiklander 				 struct tee_fs_dirfile_fileh *dfh,
125d7767217SJens Wiklander 				 const void *oid, size_t oidlen);
126d7767217SJens Wiklander 
127d7767217SJens Wiklander /**
128d7767217SJens Wiklander  * tee_fs_dirfile_remove() - remove file
129d7767217SJens Wiklander  * @dirh:	dirfile handle
130d7767217SJens Wiklander  * @dfh:	file handle
131d7767217SJens Wiklander  */
132d7767217SJens Wiklander TEE_Result tee_fs_dirfile_remove(struct tee_fs_dirfile_dirh *dirh,
133d7767217SJens Wiklander 				 const struct tee_fs_dirfile_fileh *dfh);
134d7767217SJens Wiklander 
135d7767217SJens Wiklander /**
136d7767217SJens Wiklander  * tee_fs_dirfile_update_hash() - update hash of file handle
137d7767217SJens Wiklander  * @dirh:	filefile handle
138d7767217SJens Wiklander  * @dfh:	file handle
139d7767217SJens Wiklander  */
140d7767217SJens Wiklander TEE_Result tee_fs_dirfile_update_hash(struct tee_fs_dirfile_dirh *dirh,
141d7767217SJens Wiklander 				      const struct tee_fs_dirfile_fileh *dfh);
142d7767217SJens Wiklander 
143d7767217SJens Wiklander /**
144d7767217SJens Wiklander  * tee_fs_dirfile_get_next() - get object id of next file
145d7767217SJens Wiklander  * @dirh:	dirfile handle
146fd108c3eSJens Wiklander  * @uuid:	uuid of requesting TA
147d7767217SJens Wiklander  * @idx:	pointer to index
148d7767217SJens Wiklander  * @oid:	object id
149d7767217SJens Wiklander  * @oidlen:	length of object id
150d7767217SJens Wiklander  *
151d7767217SJens Wiklander  * If @idx contains -1 the first object id is returned, *@idx is updated
152d7767217SJens Wiklander  * with the index of the file.
153d7767217SJens Wiklander  */
154d7767217SJens Wiklander TEE_Result tee_fs_dirfile_get_next(struct tee_fs_dirfile_dirh *dirh,
155fd108c3eSJens Wiklander 				   const TEE_UUID *uuid, int *idx, void *oid,
156fd108c3eSJens Wiklander 				   size_t *oidlen);
157d7767217SJens Wiklander 
158d7767217SJens Wiklander #endif /*__TEE_FS_DIRFILE_H*/
159