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