xref: /optee_os/core/tee/tee_rpmb_fs.c (revision 2570cd0b8d773a181df1ddf8db266aa39a96518e)
1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3  * Copyright (c) 2014, STMicroelectronics International N.V.
4  */
5 
6 #include <assert.h>
7 #include <crypto/crypto.h>
8 #include <kernel/huk_subkey.h>
9 #include <kernel/misc.h>
10 #include <kernel/msg_param.h>
11 #include <kernel/mutex.h>
12 #include <kernel/panic.h>
13 #include <kernel/tee_common.h>
14 #include <kernel/tee_common_otp.h>
15 #include <kernel/tee_misc.h>
16 #include <kernel/thread.h>
17 #include <mempool.h>
18 #include <mm/core_memprot.h>
19 #include <mm/mobj.h>
20 #include <mm/tee_mm.h>
21 #include <optee_rpc_cmd.h>
22 #include <stdlib.h>
23 #include <string_ext.h>
24 #include <string.h>
25 #include <sys/queue.h>
26 #include <tee/tee_fs.h>
27 #include <tee/tee_fs_key_manager.h>
28 #include <tee/tee_pobj.h>
29 #include <tee/tee_svc_storage.h>
30 #include <trace.h>
31 #include <util.h>
32 
33 #define RPMB_STORAGE_START_ADDRESS      0
34 #define RPMB_FS_FAT_START_ADDRESS       512
35 #define RPMB_BLOCK_SIZE_SHIFT           8
36 #define RPMB_CID_PRV_OFFSET             9
37 #define RPMB_CID_CRC_OFFSET             15
38 
39 #define RPMB_FS_MAGIC                   0x52504D42
40 #define FS_VERSION                      2
41 
42 #define FILE_IS_ACTIVE                  (1u << 0)
43 #define FILE_IS_LAST_ENTRY              (1u << 1)
44 
45 #define TEE_RPMB_FS_FILENAME_LENGTH 224
46 
47 #define TMP_BLOCK_SIZE			4096U
48 
49 #define RPMB_MAX_RETRIES		10
50 
51 /**
52  * Utilized when caching is enabled, i.e., when CFG_RPMB_FS_CACHE_ENTRIES > 0.
53  * Cache size + the number of entries that are repeatedly read in and buffered
54  * once the cache is full.
55  */
56 #define RPMB_BUF_MAX_ENTRIES (CFG_RPMB_FS_CACHE_ENTRIES + \
57 			      CFG_RPMB_FS_RD_ENTRIES)
58 
59 /**
60  * FS parameters: Information often used by internal functions.
61  * fat_start_address will be set by rpmb_fs_setup().
62  * rpmb_fs_parameters can be read by any other function.
63  */
64 struct rpmb_fs_parameters {
65 	uint32_t fat_start_address;
66 	uint32_t max_rpmb_address;
67 };
68 
69 /**
70  * File entry for a single file in a RPMB_FS partition.
71  */
72 struct rpmb_fat_entry {
73 	uint32_t start_address;
74 	uint32_t data_size;
75 	uint32_t flags;
76 	uint32_t write_counter;
77 	uint8_t fek[TEE_FS_KM_FEK_SIZE];
78 	char filename[TEE_RPMB_FS_FILENAME_LENGTH];
79 };
80 
81 /**
82  * Structure that describes buffered/cached FAT FS entries in RPMB storage.
83  * This structure is used in functions traversing the FAT FS.
84  */
85 struct rpmb_fat_entry_dir {
86 	/*
87 	 * Buffer storing the FAT FS entries read in from RPMB storage. It
88 	 * includes the optional cache entries (CFG_RPMB_FS_CACHE_ENTRIES)
89 	 * and entries temporary read for current FAT FS traversal
90 	 * (CFG_RPMB_FS_RD_ENTRIES) when not found from cached entries.
91 	 */
92 	struct rpmb_fat_entry *rpmb_fat_entry_buf;
93 	/* Current index of FAT FS entry to read from buffer. */
94 	uint32_t idx_curr;
95 	/* Total number of FAT FS entries in buffer. */
96 	uint32_t num_buffered;
97 	/* Total number of FAT FS entries read during traversal. */
98 	uint32_t num_total_read;
99 	/* Indicates that last FAT FS entry was read. */
100 	bool last_reached;
101 };
102 
103 /**
104  * FAT entry context with reference to a FAT entry and its
105  * location in RPMB.
106  */
107 struct rpmb_file_handle {
108 	struct rpmb_fat_entry fat_entry;
109 	const TEE_UUID *uuid;
110 	char filename[TEE_RPMB_FS_FILENAME_LENGTH];
111 	/* Address for current entry in RPMB */
112 	uint32_t rpmb_fat_address;
113 };
114 
115 /**
116  * RPMB_FS partition data
117  */
118 struct rpmb_fs_partition {
119 	uint32_t rpmb_fs_magic;
120 	uint32_t fs_version;
121 	uint32_t write_counter;
122 	uint32_t fat_start_address;
123 	/* Do not use reserved[] for other purpose than partition data. */
124 	uint8_t reserved[112];
125 };
126 
127 /**
128  * A node in a list of directory entries.
129  */
130 struct tee_rpmb_fs_dirent {
131 	struct tee_fs_dirent entry;
132 	SIMPLEQ_ENTRY(tee_rpmb_fs_dirent) link;
133 };
134 
135 /**
136  * The RPMB directory representation. It contains a queue of
137  * RPMB directory entries: 'next'.
138  * The current pointer points to the last directory entry
139  * returned by readdir().
140  */
141 struct tee_fs_dir {
142 	struct tee_rpmb_fs_dirent *current;
143 	/* */
144 	SIMPLEQ_HEAD(next_head, tee_rpmb_fs_dirent) next;
145 };
146 
147 static struct rpmb_fs_parameters *fs_par;
148 static struct rpmb_fat_entry_dir *fat_entry_dir;
149 
150 /*
151  * Lower interface to RPMB device
152  */
153 
154 #define RPMB_DATA_OFFSET            (RPMB_STUFF_DATA_SIZE + RPMB_KEY_MAC_SIZE)
155 #define RPMB_MAC_PROTECT_DATA_SIZE  (RPMB_DATA_FRAME_SIZE - RPMB_DATA_OFFSET)
156 
157 #define RPMB_MSG_TYPE_REQ_AUTH_KEY_PROGRAM          0x0001
158 #define RPMB_MSG_TYPE_REQ_WRITE_COUNTER_VAL_READ    0x0002
159 #define RPMB_MSG_TYPE_REQ_AUTH_DATA_WRITE           0x0003
160 #define RPMB_MSG_TYPE_REQ_AUTH_DATA_READ            0x0004
161 #define RPMB_MSG_TYPE_REQ_RESULT_READ               0x0005
162 #define RPMB_MSG_TYPE_RESP_AUTH_KEY_PROGRAM         0x0100
163 #define RPMB_MSG_TYPE_RESP_WRITE_COUNTER_VAL_READ   0x0200
164 #define RPMB_MSG_TYPE_RESP_AUTH_DATA_WRITE          0x0300
165 #define RPMB_MSG_TYPE_RESP_AUTH_DATA_READ           0x0400
166 
167 #define RPMB_STUFF_DATA_SIZE                        196
168 #define RPMB_KEY_MAC_SIZE                           32
169 #define RPMB_DATA_SIZE                              256
170 #define RPMB_NONCE_SIZE                             16
171 #define RPMB_DATA_FRAME_SIZE                        512
172 
173 #define RPMB_RESULT_OK                              0x00
174 #define RPMB_RESULT_GENERAL_FAILURE                 0x01
175 #define RPMB_RESULT_AUTH_FAILURE                    0x02
176 #define RPMB_RESULT_COUNTER_FAILURE                 0x03
177 #define RPMB_RESULT_ADDRESS_FAILURE                 0x04
178 #define RPMB_RESULT_WRITE_FAILURE                   0x05
179 #define RPMB_RESULT_READ_FAILURE                    0x06
180 #define RPMB_RESULT_AUTH_KEY_NOT_PROGRAMMED         0x07
181 #define RPMB_RESULT_MASK                            0x3F
182 #define RPMB_RESULT_WR_CNT_EXPIRED                  0x80
183 
184 /* RPMB internal commands */
185 #define RPMB_CMD_DATA_REQ      0x00
186 #define RPMB_CMD_GET_DEV_INFO  0x01
187 
188 #define RPMB_SIZE_SINGLE (128 * 1024)
189 
190 /* Error codes for get_dev_info request/response. */
191 #define RPMB_CMD_GET_DEV_INFO_RET_OK     0x00
192 #define RPMB_CMD_GET_DEV_INFO_RET_ERROR  0x01
193 
194 struct rpmb_data_frame {
195 	uint8_t stuff_bytes[RPMB_STUFF_DATA_SIZE];
196 	uint8_t key_mac[RPMB_KEY_MAC_SIZE];
197 	uint8_t data[RPMB_DATA_SIZE];
198 	uint8_t nonce[RPMB_NONCE_SIZE];
199 	uint8_t write_counter[4];
200 	uint8_t address[2];
201 	uint8_t block_count[2];
202 	uint8_t op_result[2];
203 	uint8_t msg_type[2];
204 };
205 
206 struct rpmb_req {
207 	uint16_t cmd;
208 	uint16_t dev_id;
209 	uint16_t block_count;
210 	/* variable length of data */
211 	/* uint8_t data[]; REMOVED! */
212 };
213 
214 #define TEE_RPMB_REQ_DATA(req) \
215 		((void *)((struct rpmb_req *)(req) + 1))
216 
217 struct rpmb_raw_data {
218 	uint16_t msg_type;
219 	uint16_t *op_result;
220 	uint16_t *block_count;
221 	uint16_t *blk_idx;
222 	uint32_t *write_counter;
223 	uint8_t *nonce;
224 	uint8_t *key_mac;
225 	uint8_t *data;
226 	/* data length to read or write */
227 	uint32_t len;
228 	/* Byte address offset in the first block involved */
229 	uint8_t byte_offset;
230 };
231 
232 #define RPMB_EMMC_CID_SIZE 16
233 struct rpmb_dev_info {
234 	uint8_t cid[RPMB_EMMC_CID_SIZE];
235 	/* EXT CSD-slice 168 "RPMB Size" */
236 	uint8_t rpmb_size_mult;
237 	/* EXT CSD-slice 222 "Reliable Write Sector Count" */
238 	uint8_t rel_wr_sec_c;
239 	/* Check the ret code and accept the data only if it is OK. */
240 	uint8_t ret_code;
241 };
242 
243 /*
244  * Struct for rpmb context data.
245  *
246  * @key              RPMB key.
247  * @cid              eMMC card ID.
248  * @wr_cnt           Current write counter.
249  * @max_blk_idx      The highest block index supported by current device.
250  * @rel_wr_blkcnt    Max number of data blocks for each reliable write.
251  * @dev_id           Device ID of the eMMC device.
252  * @wr_cnt_synced    Flag indicating if write counter is synced to RPMB.
253  * @key_derived      Flag indicating if key has been generated.
254  * @key_verified     Flag indicating the key generated is verified ok.
255  * @dev_info_synced  Flag indicating if dev info has been retrieved from RPMB.
256  */
257 struct tee_rpmb_ctx {
258 	uint8_t key[RPMB_KEY_MAC_SIZE];
259 	uint8_t cid[RPMB_EMMC_CID_SIZE];
260 	uint32_t wr_cnt;
261 	uint16_t max_blk_idx;
262 	uint16_t rel_wr_blkcnt;
263 	uint16_t dev_id;
264 	bool wr_cnt_synced;
265 	bool key_derived;
266 	bool key_verified;
267 	bool dev_info_synced;
268 };
269 
270 static struct tee_rpmb_ctx *rpmb_ctx;
271 
272 /* If set to true, don't try to access RPMB until rebooted */
273 static bool rpmb_dead;
274 
275 /*
276  * Mutex to serialize the operations exported by this file.
277  * It protects rpmb_ctx and prevents overlapping operations on eMMC devices with
278  * different IDs.
279  */
280 static struct mutex rpmb_mutex = MUTEX_INITIALIZER;
281 
282 #ifdef CFG_RPMB_TESTKEY
283 
284 static const uint8_t rpmb_test_key[RPMB_KEY_MAC_SIZE] = {
285 	0xD3, 0xEB, 0x3E, 0xC3, 0x6E, 0x33, 0x4C, 0x9F,
286 	0x98, 0x8C, 0xE2, 0xC0, 0xB8, 0x59, 0x54, 0x61,
287 	0x0D, 0x2B, 0xCF, 0x86, 0x64, 0x84, 0x4D, 0xF2,
288 	0xAB, 0x56, 0xE6, 0xC6, 0x1B, 0xB7, 0x01, 0xE4
289 };
290 
291 static TEE_Result tee_rpmb_key_gen(uint16_t dev_id __unused,
292 				   uint8_t *key, uint32_t len)
293 {
294 	TEE_Result res = TEE_SUCCESS;
295 
296 	if (!key || RPMB_KEY_MAC_SIZE != len) {
297 		res = TEE_ERROR_BAD_PARAMETERS;
298 		goto out;
299 	}
300 
301 	DMSG("RPMB: Using test key");
302 	memcpy(key, rpmb_test_key, RPMB_KEY_MAC_SIZE);
303 
304 out:
305 	return res;
306 }
307 
308 #else /* !CFG_RPMB_TESTKEY */
309 
310 static TEE_Result tee_rpmb_key_gen(uint16_t dev_id __unused,
311 				   uint8_t *key, uint32_t len)
312 {
313 	uint8_t message[RPMB_EMMC_CID_SIZE];
314 
315 	if (!key || RPMB_KEY_MAC_SIZE != len)
316 		return TEE_ERROR_BAD_PARAMETERS;
317 
318 	IMSG("RPMB: Using generated key");
319 
320 	/*
321 	 * PRV/CRC would be changed when doing eMMC FFU
322 	 * The following fields should be masked off when deriving RPMB key
323 	 *
324 	 * CID [55: 48]: PRV (Product revision)
325 	 * CID [07: 01]: CRC (CRC7 checksum)
326 	 * CID [00]: not used
327 	 */
328 	memcpy(message, rpmb_ctx->cid, RPMB_EMMC_CID_SIZE);
329 	memset(message + RPMB_CID_PRV_OFFSET, 0, 1);
330 	memset(message + RPMB_CID_CRC_OFFSET, 0, 1);
331 	return huk_subkey_derive(HUK_SUBKEY_RPMB, message, sizeof(message),
332 				 key, len);
333 }
334 
335 #endif /* !CFG_RPMB_TESTKEY */
336 
337 static void u32_to_bytes(uint32_t u32, uint8_t *bytes)
338 {
339 	*bytes = (uint8_t) (u32 >> 24);
340 	*(bytes + 1) = (uint8_t) (u32 >> 16);
341 	*(bytes + 2) = (uint8_t) (u32 >> 8);
342 	*(bytes + 3) = (uint8_t) u32;
343 }
344 
345 static void bytes_to_u32(uint8_t *bytes, uint32_t *u32)
346 {
347 	*u32 = (uint32_t) ((*(bytes) << 24) +
348 			   (*(bytes + 1) << 16) +
349 			   (*(bytes + 2) << 8) + (*(bytes + 3)));
350 }
351 
352 static void u16_to_bytes(uint16_t u16, uint8_t *bytes)
353 {
354 	*bytes = (uint8_t) (u16 >> 8);
355 	*(bytes + 1) = (uint8_t) u16;
356 }
357 
358 static void bytes_to_u16(uint8_t *bytes, uint16_t *u16)
359 {
360 	*u16 = (uint16_t) ((*bytes << 8) + *(bytes + 1));
361 }
362 
363 static void get_op_result_bits(uint8_t *bytes, uint8_t *res)
364 {
365 	*res = *(bytes + 1) & RPMB_RESULT_MASK;
366 }
367 
368 static TEE_Result tee_rpmb_mac_calc(uint8_t *mac, uint32_t macsize,
369 				    uint8_t *key, uint32_t keysize,
370 				    struct rpmb_data_frame *datafrms,
371 				    uint16_t blkcnt)
372 {
373 	TEE_Result res = TEE_ERROR_GENERIC;
374 	int i;
375 	void *ctx = NULL;
376 
377 	if (!mac || !key || !datafrms)
378 		return TEE_ERROR_BAD_PARAMETERS;
379 
380 	res = crypto_mac_alloc_ctx(&ctx, TEE_ALG_HMAC_SHA256);
381 	if (res)
382 		return res;
383 
384 	res = crypto_mac_init(ctx, key, keysize);
385 	if (res != TEE_SUCCESS)
386 		goto func_exit;
387 
388 	for (i = 0; i < blkcnt; i++) {
389 		res = crypto_mac_update(ctx, datafrms[i].data,
390 					RPMB_MAC_PROTECT_DATA_SIZE);
391 		if (res != TEE_SUCCESS)
392 			goto func_exit;
393 	}
394 
395 	res = crypto_mac_final(ctx, mac, macsize);
396 	if (res != TEE_SUCCESS)
397 		goto func_exit;
398 
399 	res = TEE_SUCCESS;
400 
401 func_exit:
402 	crypto_mac_free_ctx(ctx);
403 	return res;
404 }
405 
406 struct tee_rpmb_mem {
407 	struct mobj *phreq_mobj;
408 	struct mobj *phresp_mobj;
409 	size_t req_size;
410 	size_t resp_size;
411 };
412 
413 static void tee_rpmb_free(struct tee_rpmb_mem *mem)
414 {
415 	if (!mem)
416 		return;
417 
418 	if (mem->phreq_mobj) {
419 		thread_rpc_free_payload(mem->phreq_mobj);
420 		mem->phreq_mobj = NULL;
421 	}
422 	if (mem->phresp_mobj) {
423 		thread_rpc_free_payload(mem->phresp_mobj);
424 		mem->phresp_mobj = NULL;
425 	}
426 }
427 
428 
429 static TEE_Result tee_rpmb_alloc(size_t req_size, size_t resp_size,
430 		struct tee_rpmb_mem *mem, void **req, void **resp)
431 {
432 	TEE_Result res = TEE_SUCCESS;
433 	size_t req_s = ROUNDUP(req_size, sizeof(uint32_t));
434 	size_t resp_s = ROUNDUP(resp_size, sizeof(uint32_t));
435 
436 	if (!mem)
437 		return TEE_ERROR_BAD_PARAMETERS;
438 
439 	memset(mem, 0, sizeof(*mem));
440 
441 	mem->phreq_mobj = thread_rpc_alloc_payload(req_s);
442 	mem->phresp_mobj = thread_rpc_alloc_payload(resp_s);
443 
444 	if (!mem->phreq_mobj || !mem->phresp_mobj) {
445 		res = TEE_ERROR_OUT_OF_MEMORY;
446 		goto out;
447 	}
448 
449 	*req = mobj_get_va(mem->phreq_mobj, 0);
450 	*resp = mobj_get_va(mem->phresp_mobj, 0);
451 	if (!*req || !*resp) {
452 		res = TEE_ERROR_GENERIC;
453 		goto out;
454 	}
455 
456 	mem->req_size = req_size;
457 	mem->resp_size = resp_size;
458 
459 out:
460 	if (res != TEE_SUCCESS)
461 		tee_rpmb_free(mem);
462 	return res;
463 }
464 
465 static TEE_Result tee_rpmb_invoke(struct tee_rpmb_mem *mem)
466 {
467 	struct thread_param params[2] = {
468 		[0] = THREAD_PARAM_MEMREF(IN, mem->phreq_mobj, 0,
469 					  mem->req_size),
470 		[1] = THREAD_PARAM_MEMREF(OUT, mem->phresp_mobj, 0,
471 					  mem->resp_size),
472 	};
473 
474 	return thread_rpc_cmd(OPTEE_RPC_CMD_RPMB, 2, params);
475 }
476 
477 static bool is_zero(const uint8_t *buf, size_t size)
478 {
479 	size_t i;
480 
481 	for (i = 0; i < size; i++)
482 		if (buf[i])
483 			return false;
484 	return true;
485 }
486 
487 static TEE_Result encrypt_block(uint8_t *out, const uint8_t *in,
488 				uint16_t blk_idx, const uint8_t *fek,
489 				const TEE_UUID *uuid)
490 {
491 	return tee_fs_crypt_block(uuid, out, in, RPMB_DATA_SIZE,
492 				  blk_idx, fek, TEE_MODE_ENCRYPT);
493 }
494 
495 static TEE_Result decrypt_block(uint8_t *out, const uint8_t *in,
496 				uint16_t blk_idx, const uint8_t *fek,
497 				const TEE_UUID *uuid)
498 {
499 	return tee_fs_crypt_block(uuid, out, in, RPMB_DATA_SIZE,
500 				  blk_idx, fek, TEE_MODE_DECRYPT);
501 }
502 
503 /* Decrypt/copy at most one block of data */
504 static TEE_Result decrypt(uint8_t *out, const struct rpmb_data_frame *frm,
505 			  size_t size, size_t offset,
506 			  uint16_t blk_idx __maybe_unused, const uint8_t *fek,
507 			  const TEE_UUID *uuid)
508 {
509 	uint8_t *tmp __maybe_unused;
510 	TEE_Result res = TEE_SUCCESS;
511 
512 
513 	if ((size + offset < size) || (size + offset > RPMB_DATA_SIZE))
514 		panic("invalid size or offset");
515 
516 	if (!fek) {
517 		/* Block is not encrypted (not a file data block) */
518 		memcpy(out, frm->data + offset, size);
519 	} else if (is_zero(fek, TEE_FS_KM_FEK_SIZE)) {
520 		/* The file was created with encryption disabled */
521 		return TEE_ERROR_SECURITY;
522 	} else {
523 		/* Block is encrypted */
524 		if (size < RPMB_DATA_SIZE) {
525 			/*
526 			 * Since output buffer is not large enough to hold one
527 			 * block we must allocate a temporary buffer.
528 			 */
529 			tmp = malloc(RPMB_DATA_SIZE);
530 			if (!tmp)
531 				return TEE_ERROR_OUT_OF_MEMORY;
532 			res = decrypt_block(tmp, frm->data, blk_idx, fek, uuid);
533 			if (res == TEE_SUCCESS)
534 				memcpy(out, tmp + offset, size);
535 			free(tmp);
536 		} else {
537 			res = decrypt_block(out, frm->data, blk_idx, fek, uuid);
538 		}
539 	}
540 
541 	return res;
542 }
543 
544 static TEE_Result tee_rpmb_req_pack(struct rpmb_req *req,
545 				    struct rpmb_raw_data *rawdata,
546 				    uint16_t nbr_frms, uint16_t dev_id,
547 				    const uint8_t *fek, const TEE_UUID *uuid)
548 {
549 	TEE_Result res = TEE_ERROR_GENERIC;
550 	int i;
551 	struct rpmb_data_frame *datafrm;
552 
553 	if (!req || !rawdata || !nbr_frms)
554 		return TEE_ERROR_BAD_PARAMETERS;
555 
556 	/*
557 	 * Check write blockcount is not bigger than reliable write
558 	 * blockcount.
559 	 */
560 	if ((rawdata->msg_type == RPMB_MSG_TYPE_REQ_AUTH_DATA_WRITE) &&
561 	    (nbr_frms > rpmb_ctx->rel_wr_blkcnt)) {
562 		DMSG("wr_blkcnt(%d) > rel_wr_blkcnt(%d)", nbr_frms,
563 		     rpmb_ctx->rel_wr_blkcnt);
564 		return TEE_ERROR_GENERIC;
565 	}
566 
567 	req->cmd = RPMB_CMD_DATA_REQ;
568 	req->dev_id = dev_id;
569 
570 	/* Allocate memory for construct all data packets and calculate MAC. */
571 	datafrm = calloc(nbr_frms, RPMB_DATA_FRAME_SIZE);
572 	if (!datafrm)
573 		return TEE_ERROR_OUT_OF_MEMORY;
574 
575 	for (i = 0; i < nbr_frms; i++) {
576 		u16_to_bytes(rawdata->msg_type, datafrm[i].msg_type);
577 
578 		if (rawdata->block_count)
579 			u16_to_bytes(*rawdata->block_count,
580 				     datafrm[i].block_count);
581 
582 		if (rawdata->blk_idx) {
583 			/* Check the block index is within range. */
584 			if ((*rawdata->blk_idx + nbr_frms - 1) >
585 			    rpmb_ctx->max_blk_idx) {
586 				res = TEE_ERROR_GENERIC;
587 				goto func_exit;
588 			}
589 			u16_to_bytes(*rawdata->blk_idx, datafrm[i].address);
590 		}
591 
592 		if (rawdata->write_counter)
593 			u32_to_bytes(*rawdata->write_counter,
594 				     datafrm[i].write_counter);
595 
596 		if (rawdata->nonce)
597 			memcpy(datafrm[i].nonce, rawdata->nonce,
598 			       RPMB_NONCE_SIZE);
599 
600 		if (rawdata->data) {
601 			if (fek) {
602 				res = encrypt_block(datafrm[i].data,
603 						    rawdata->data +
604 						    (i * RPMB_DATA_SIZE),
605 						    *rawdata->blk_idx + i,
606 						    fek, uuid);
607 				if (res != TEE_SUCCESS)
608 					goto func_exit;
609 			} else {
610 				memcpy(datafrm[i].data,
611 				       rawdata->data + (i * RPMB_DATA_SIZE),
612 				       RPMB_DATA_SIZE);
613 			}
614 		}
615 	}
616 
617 	if (rawdata->key_mac) {
618 		if (rawdata->msg_type == RPMB_MSG_TYPE_REQ_AUTH_DATA_WRITE) {
619 			res =
620 			    tee_rpmb_mac_calc(rawdata->key_mac,
621 					      RPMB_KEY_MAC_SIZE, rpmb_ctx->key,
622 					      RPMB_KEY_MAC_SIZE, datafrm,
623 					      nbr_frms);
624 			if (res != TEE_SUCCESS)
625 				goto func_exit;
626 		}
627 		memcpy(datafrm[nbr_frms - 1].key_mac,
628 		       rawdata->key_mac, RPMB_KEY_MAC_SIZE);
629 	}
630 
631 	memcpy(TEE_RPMB_REQ_DATA(req), datafrm,
632 	       nbr_frms * RPMB_DATA_FRAME_SIZE);
633 
634 #ifdef CFG_RPMB_FS_DEBUG_DATA
635 	for (i = 0; i < nbr_frms; i++) {
636 		DMSG("Dumping data frame %d:", i);
637 		DHEXDUMP((uint8_t *)&datafrm[i] + RPMB_STUFF_DATA_SIZE,
638 			 512 - RPMB_STUFF_DATA_SIZE);
639 	}
640 #endif
641 
642 	res = TEE_SUCCESS;
643 func_exit:
644 	free(datafrm);
645 	return res;
646 }
647 
648 static TEE_Result data_cpy_mac_calc_1b(struct rpmb_raw_data *rawdata,
649 				       struct rpmb_data_frame *frm,
650 				       const uint8_t *fek, const TEE_UUID *uuid)
651 {
652 	TEE_Result res;
653 	uint8_t *data;
654 	uint16_t idx;
655 
656 	if (rawdata->len + rawdata->byte_offset > RPMB_DATA_SIZE)
657 		return TEE_ERROR_BAD_PARAMETERS;
658 
659 	res = tee_rpmb_mac_calc(rawdata->key_mac, RPMB_KEY_MAC_SIZE,
660 				rpmb_ctx->key, RPMB_KEY_MAC_SIZE, frm, 1);
661 	if (res != TEE_SUCCESS)
662 		return res;
663 
664 	data = rawdata->data;
665 	bytes_to_u16(frm->address, &idx);
666 
667 	res = decrypt(data, frm, rawdata->len, rawdata->byte_offset, idx, fek,
668 		      uuid);
669 	return res;
670 }
671 
672 static TEE_Result tee_rpmb_data_cpy_mac_calc(struct rpmb_data_frame *datafrm,
673 					     struct rpmb_raw_data *rawdata,
674 					     uint16_t nbr_frms,
675 					     struct rpmb_data_frame *lastfrm,
676 					     const uint8_t *fek,
677 					     const TEE_UUID *uuid)
678 {
679 	TEE_Result res = TEE_ERROR_GENERIC;
680 	int i;
681 	void *ctx = NULL;
682 	uint16_t offset;
683 	uint32_t size;
684 	uint8_t *data;
685 	uint16_t start_idx;
686 	struct rpmb_data_frame localfrm;
687 
688 	if (!datafrm || !rawdata || !nbr_frms || !lastfrm)
689 		return TEE_ERROR_BAD_PARAMETERS;
690 
691 	if (nbr_frms == 1)
692 		return data_cpy_mac_calc_1b(rawdata, lastfrm, fek, uuid);
693 
694 	/* nbr_frms > 1 */
695 
696 	data = rawdata->data;
697 
698 	res = crypto_mac_alloc_ctx(&ctx, TEE_ALG_HMAC_SHA256);
699 	if (res)
700 		goto func_exit;
701 
702 	res = crypto_mac_init(ctx, rpmb_ctx->key, RPMB_KEY_MAC_SIZE);
703 	if (res != TEE_SUCCESS)
704 		goto func_exit;
705 
706 	/*
707 	 * Note: JEDEC JESD84-B51: "In every packet the address is the start
708 	 * address of the full access (not address of the individual half a
709 	 * sector)"
710 	 */
711 	bytes_to_u16(lastfrm->address, &start_idx);
712 
713 	for (i = 0; i < (nbr_frms - 1); i++) {
714 
715 		/*
716 		 * By working on a local copy of the RPMB frame, we ensure that
717 		 * the data can not be modified after the MAC is computed but
718 		 * before the payload is decrypted/copied to the output buffer.
719 		 */
720 		memcpy(&localfrm, &datafrm[i], RPMB_DATA_FRAME_SIZE);
721 
722 		res = crypto_mac_update(ctx, localfrm.data,
723 					RPMB_MAC_PROTECT_DATA_SIZE);
724 		if (res != TEE_SUCCESS)
725 			goto func_exit;
726 
727 		if (i == 0) {
728 			/* First block */
729 			offset = rawdata->byte_offset;
730 			size = RPMB_DATA_SIZE - offset;
731 		} else {
732 			/* Middle blocks */
733 			size = RPMB_DATA_SIZE;
734 			offset = 0;
735 		}
736 
737 		res = decrypt(data, &localfrm, size, offset, start_idx + i,
738 			      fek, uuid);
739 		if (res != TEE_SUCCESS)
740 			goto func_exit;
741 
742 		data += size;
743 	}
744 
745 	/* Last block */
746 	size = (rawdata->len + rawdata->byte_offset) % RPMB_DATA_SIZE;
747 	if (size == 0)
748 		size = RPMB_DATA_SIZE;
749 	res = decrypt(data, lastfrm, size, 0, start_idx + nbr_frms - 1, fek,
750 		      uuid);
751 	if (res != TEE_SUCCESS)
752 		goto func_exit;
753 
754 	/* Update MAC against the last block */
755 	res = crypto_mac_update(ctx, lastfrm->data, RPMB_MAC_PROTECT_DATA_SIZE);
756 	if (res != TEE_SUCCESS)
757 		goto func_exit;
758 
759 	res = crypto_mac_final(ctx, rawdata->key_mac, RPMB_KEY_MAC_SIZE);
760 	if (res != TEE_SUCCESS)
761 		goto func_exit;
762 
763 	res = TEE_SUCCESS;
764 
765 func_exit:
766 	crypto_mac_free_ctx(ctx);
767 	return res;
768 }
769 
770 static TEE_Result tee_rpmb_resp_unpack_verify(struct rpmb_data_frame *datafrm,
771 					      struct rpmb_raw_data *rawdata,
772 					      uint16_t nbr_frms,
773 					      const uint8_t *fek,
774 					      const TEE_UUID *uuid)
775 {
776 	TEE_Result res = TEE_ERROR_GENERIC;
777 	uint16_t msg_type;
778 	uint32_t wr_cnt;
779 	uint16_t blk_idx;
780 	uint8_t op_result;
781 	struct rpmb_data_frame lastfrm;
782 
783 	if (!datafrm || !rawdata || !nbr_frms)
784 		return TEE_ERROR_BAD_PARAMETERS;
785 
786 #ifdef CFG_RPMB_FS_DEBUG_DATA
787 	for (uint32_t i = 0; i < nbr_frms; i++) {
788 		DMSG("Dumping data frame %d:", i);
789 		DHEXDUMP((uint8_t *)&datafrm[i] + RPMB_STUFF_DATA_SIZE,
790 			 512 - RPMB_STUFF_DATA_SIZE);
791 	}
792 #endif
793 
794 	/* Make sure the last data packet can't be modified once verified */
795 	memcpy(&lastfrm, &datafrm[nbr_frms - 1], RPMB_DATA_FRAME_SIZE);
796 
797 	/* Handle operation result and translate to TEEC error code. */
798 	get_op_result_bits(lastfrm.op_result, &op_result);
799 	if (op_result == RPMB_RESULT_AUTH_KEY_NOT_PROGRAMMED)
800 		return TEE_ERROR_ITEM_NOT_FOUND;
801 	if (op_result != RPMB_RESULT_OK)
802 		return TEE_ERROR_GENERIC;
803 
804 	/* Check the response msg_type. */
805 	bytes_to_u16(lastfrm.msg_type, &msg_type);
806 	if (msg_type != rawdata->msg_type) {
807 		DMSG("Unexpected msg_type (0x%04x != 0x%04x)", msg_type,
808 		     rawdata->msg_type);
809 		return TEE_ERROR_GENERIC;
810 	}
811 
812 	if (rawdata->blk_idx) {
813 		bytes_to_u16(lastfrm.address, &blk_idx);
814 		if (blk_idx != *rawdata->blk_idx) {
815 			DMSG("Unexpected block index");
816 			return TEE_ERROR_GENERIC;
817 		}
818 	}
819 
820 	if (rawdata->write_counter) {
821 		wr_cnt = *rawdata->write_counter;
822 		bytes_to_u32(lastfrm.write_counter, rawdata->write_counter);
823 		if (msg_type == RPMB_MSG_TYPE_RESP_AUTH_DATA_WRITE) {
824 			/* Verify the write counter is incremented by 1 */
825 			if (*rawdata->write_counter != wr_cnt + 1) {
826 				DMSG("Counter mismatched (0x%04x/0x%04x)",
827 				     *rawdata->write_counter, wr_cnt + 1);
828 				return TEE_ERROR_SECURITY;
829 			}
830 			rpmb_ctx->wr_cnt++;
831 		}
832 	}
833 
834 	if (rawdata->nonce) {
835 		if (buf_compare_ct(rawdata->nonce, lastfrm.nonce,
836 				   RPMB_NONCE_SIZE) != 0) {
837 			DMSG("Nonce mismatched");
838 			return TEE_ERROR_SECURITY;
839 		}
840 	}
841 
842 	if (rawdata->key_mac) {
843 		if (msg_type == RPMB_MSG_TYPE_RESP_AUTH_DATA_READ) {
844 			if (!rawdata->data)
845 				return TEE_ERROR_GENERIC;
846 
847 			res = tee_rpmb_data_cpy_mac_calc(datafrm, rawdata,
848 							 nbr_frms, &lastfrm,
849 							 fek, uuid);
850 
851 			if (res != TEE_SUCCESS)
852 				return res;
853 		} else {
854 			/*
855 			 * There should be only one data frame for
856 			 * other msg types.
857 			 */
858 			if (nbr_frms != 1)
859 				return TEE_ERROR_GENERIC;
860 
861 			res = tee_rpmb_mac_calc(rawdata->key_mac,
862 						RPMB_KEY_MAC_SIZE,
863 						rpmb_ctx->key,
864 						RPMB_KEY_MAC_SIZE,
865 						&lastfrm, 1);
866 
867 			if (res != TEE_SUCCESS)
868 				return res;
869 		}
870 
871 #ifndef CFG_RPMB_FS_NO_MAC
872 		if (consttime_memcmp(rawdata->key_mac,
873 				     (datafrm + nbr_frms - 1)->key_mac,
874 				     RPMB_KEY_MAC_SIZE) != 0) {
875 			DMSG("MAC mismatched:");
876 #ifdef CFG_RPMB_FS_DEBUG_DATA
877 			DHEXDUMP((uint8_t *)rawdata->key_mac, 32);
878 #endif
879 			return TEE_ERROR_SECURITY;
880 		}
881 #endif /* !CFG_RPMB_FS_NO_MAC */
882 	}
883 
884 	return TEE_SUCCESS;
885 }
886 
887 static TEE_Result tee_rpmb_get_dev_info(uint16_t dev_id,
888 					struct rpmb_dev_info *dev_info)
889 {
890 	TEE_Result res = TEE_ERROR_GENERIC;
891 	struct tee_rpmb_mem mem;
892 	struct rpmb_dev_info *di;
893 	struct rpmb_req *req = NULL;
894 	uint8_t *resp = NULL;
895 	uint32_t req_size;
896 	uint32_t resp_size;
897 
898 	if (!dev_info)
899 		return TEE_ERROR_BAD_PARAMETERS;
900 
901 	req_size = sizeof(struct rpmb_req);
902 	resp_size = sizeof(struct rpmb_dev_info);
903 	res = tee_rpmb_alloc(req_size, resp_size, &mem,
904 			     (void *)&req, (void *)&resp);
905 	if (res != TEE_SUCCESS)
906 		goto func_exit;
907 
908 	req->cmd = RPMB_CMD_GET_DEV_INFO;
909 	req->dev_id = dev_id;
910 
911 	di = (struct rpmb_dev_info *)resp;
912 	di->ret_code = RPMB_CMD_GET_DEV_INFO_RET_ERROR;
913 
914 	res = tee_rpmb_invoke(&mem);
915 	if (res != TEE_SUCCESS)
916 		goto func_exit;
917 
918 	if (di->ret_code != RPMB_CMD_GET_DEV_INFO_RET_OK) {
919 		res = TEE_ERROR_GENERIC;
920 		goto func_exit;
921 	}
922 
923 	memcpy((uint8_t *)dev_info, resp, sizeof(struct rpmb_dev_info));
924 
925 #ifdef CFG_RPMB_FS_DEBUG_DATA
926 	DMSG("Dumping dev_info:");
927 	DHEXDUMP((uint8_t *)dev_info, sizeof(struct rpmb_dev_info));
928 #endif
929 
930 	res = TEE_SUCCESS;
931 
932 func_exit:
933 	tee_rpmb_free(&mem);
934 	return res;
935 }
936 
937 static TEE_Result tee_rpmb_init_read_wr_cnt(uint16_t dev_id,
938 					    uint32_t *wr_cnt,
939 					    uint16_t *op_result)
940 {
941 	TEE_Result res = TEE_ERROR_GENERIC;
942 	struct tee_rpmb_mem mem;
943 	uint16_t msg_type;
944 	uint8_t nonce[RPMB_NONCE_SIZE];
945 	uint8_t hmac[RPMB_KEY_MAC_SIZE];
946 	struct rpmb_req *req = NULL;
947 	struct rpmb_data_frame *resp = NULL;
948 	struct rpmb_raw_data rawdata;
949 	uint32_t req_size;
950 	uint32_t resp_size;
951 
952 	if (!wr_cnt)
953 		return TEE_ERROR_BAD_PARAMETERS;
954 
955 	req_size = sizeof(struct rpmb_req) + RPMB_DATA_FRAME_SIZE;
956 	resp_size = RPMB_DATA_FRAME_SIZE;
957 	res = tee_rpmb_alloc(req_size, resp_size, &mem,
958 			     (void *)&req, (void *)&resp);
959 	if (res != TEE_SUCCESS)
960 		goto func_exit;
961 
962 	res = crypto_rng_read(nonce, RPMB_NONCE_SIZE);
963 	if (res != TEE_SUCCESS)
964 		goto func_exit;
965 
966 	msg_type = RPMB_MSG_TYPE_REQ_WRITE_COUNTER_VAL_READ;
967 
968 	memset(&rawdata, 0x00, sizeof(struct rpmb_raw_data));
969 	rawdata.msg_type = msg_type;
970 	rawdata.nonce = nonce;
971 
972 	res = tee_rpmb_req_pack(req, &rawdata, 1, dev_id, NULL, NULL);
973 	if (res != TEE_SUCCESS)
974 		goto func_exit;
975 
976 	res = tee_rpmb_invoke(&mem);
977 	if (res != TEE_SUCCESS)
978 		goto func_exit;
979 
980 	msg_type = RPMB_MSG_TYPE_RESP_WRITE_COUNTER_VAL_READ;
981 
982 	memset(&rawdata, 0x00, sizeof(struct rpmb_raw_data));
983 	rawdata.msg_type = msg_type;
984 	rawdata.op_result = op_result;
985 	rawdata.write_counter = wr_cnt;
986 	rawdata.nonce = nonce;
987 	rawdata.key_mac = hmac;
988 
989 	res = tee_rpmb_resp_unpack_verify(resp, &rawdata, 1, NULL, NULL);
990 	if (res != TEE_SUCCESS)
991 		goto func_exit;
992 
993 	res = TEE_SUCCESS;
994 
995 func_exit:
996 	tee_rpmb_free(&mem);
997 	return res;
998 }
999 
1000 static TEE_Result tee_rpmb_verify_key_sync_counter(uint16_t dev_id)
1001 {
1002 	uint16_t op_result = 0;
1003 	TEE_Result res = TEE_ERROR_GENERIC;
1004 
1005 	res = tee_rpmb_init_read_wr_cnt(dev_id, &rpmb_ctx->wr_cnt,
1006 					&op_result);
1007 
1008 	if (res == TEE_SUCCESS) {
1009 		rpmb_ctx->key_verified = true;
1010 		rpmb_ctx->wr_cnt_synced = true;
1011 	} else
1012 		EMSG("Verify key returning 0x%x", res);
1013 	return res;
1014 }
1015 
1016 #ifdef CFG_RPMB_WRITE_KEY
1017 static TEE_Result tee_rpmb_write_key(uint16_t dev_id)
1018 {
1019 	TEE_Result res = TEE_ERROR_GENERIC;
1020 	struct tee_rpmb_mem mem = { 0 };
1021 	uint16_t msg_type;
1022 	struct rpmb_req *req = NULL;
1023 	struct rpmb_data_frame *resp = NULL;
1024 	struct rpmb_raw_data rawdata;
1025 	uint32_t req_size;
1026 	uint32_t resp_size;
1027 
1028 	req_size = sizeof(struct rpmb_req) + RPMB_DATA_FRAME_SIZE;
1029 	resp_size = RPMB_DATA_FRAME_SIZE;
1030 	res = tee_rpmb_alloc(req_size, resp_size, &mem,
1031 			     (void *)&req, (void *)&resp);
1032 	if (res != TEE_SUCCESS)
1033 		goto func_exit;
1034 
1035 	msg_type = RPMB_MSG_TYPE_REQ_AUTH_KEY_PROGRAM;
1036 
1037 	memset(&rawdata, 0x00, sizeof(struct rpmb_raw_data));
1038 	rawdata.msg_type = msg_type;
1039 	rawdata.key_mac = rpmb_ctx->key;
1040 
1041 	res = tee_rpmb_req_pack(req, &rawdata, 1, dev_id, NULL, NULL);
1042 	if (res != TEE_SUCCESS)
1043 		goto func_exit;
1044 
1045 	res = tee_rpmb_invoke(&mem);
1046 	if (res != TEE_SUCCESS)
1047 		goto func_exit;
1048 
1049 	msg_type = RPMB_MSG_TYPE_RESP_AUTH_KEY_PROGRAM;
1050 
1051 	memset(&rawdata, 0x00, sizeof(struct rpmb_raw_data));
1052 	rawdata.msg_type = msg_type;
1053 
1054 	res = tee_rpmb_resp_unpack_verify(resp, &rawdata, 1, NULL, NULL);
1055 	if (res != TEE_SUCCESS)
1056 		goto func_exit;
1057 
1058 	res = TEE_SUCCESS;
1059 
1060 func_exit:
1061 	tee_rpmb_free(&mem);
1062 	return res;
1063 }
1064 
1065 static TEE_Result tee_rpmb_write_and_verify_key(uint16_t dev_id)
1066 {
1067 	TEE_Result res;
1068 
1069 	if (!plat_rpmb_key_is_ready()) {
1070 		DMSG("RPMB INIT: platform indicates RPMB key is not ready");
1071 		return TEE_ERROR_BAD_STATE;
1072 	}
1073 
1074 	DMSG("RPMB INIT: Writing Key value:");
1075 	DHEXDUMP(rpmb_ctx->key, RPMB_KEY_MAC_SIZE);
1076 
1077 	res = tee_rpmb_write_key(dev_id);
1078 	if (res == TEE_SUCCESS) {
1079 		DMSG("RPMB INIT: Verifying Key");
1080 		res = tee_rpmb_verify_key_sync_counter(dev_id);
1081 	}
1082 	return res;
1083 }
1084 #else
1085 static TEE_Result tee_rpmb_write_and_verify_key(uint16_t dev_id __unused)
1086 {
1087 	DMSG("RPMB INIT: CFG_RPMB_WRITE_KEY is not set");
1088 	return TEE_ERROR_BAD_STATE;
1089 }
1090 #endif
1091 
1092 /* This function must never return TEE_SUCCESS if rpmb_ctx == NULL */
1093 static TEE_Result tee_rpmb_init(uint16_t dev_id)
1094 {
1095 	TEE_Result res = TEE_SUCCESS;
1096 	struct rpmb_dev_info dev_info;
1097 	uint32_t nblocks = 0;
1098 
1099 	if (rpmb_dead)
1100 		return TEE_ERROR_COMMUNICATION;
1101 
1102 	if (!rpmb_ctx) {
1103 		rpmb_ctx = calloc(1, sizeof(struct tee_rpmb_ctx));
1104 		if (!rpmb_ctx)
1105 			return TEE_ERROR_OUT_OF_MEMORY;
1106 	} else if (rpmb_ctx->dev_id != dev_id) {
1107 		memset(rpmb_ctx, 0x00, sizeof(struct tee_rpmb_ctx));
1108 	}
1109 
1110 	rpmb_ctx->dev_id = dev_id;
1111 
1112 	if (!rpmb_ctx->dev_info_synced) {
1113 		DMSG("RPMB: Syncing device information");
1114 
1115 		dev_info.rpmb_size_mult = 0;
1116 		dev_info.rel_wr_sec_c = 0;
1117 		res = tee_rpmb_get_dev_info(dev_id, &dev_info);
1118 		if (res != TEE_SUCCESS)
1119 			goto func_exit;
1120 
1121 		DMSG("RPMB: RPMB size is %d*128 KB", dev_info.rpmb_size_mult);
1122 		DMSG("RPMB: Reliable Write Sector Count is %d",
1123 		     dev_info.rel_wr_sec_c);
1124 
1125 		if (dev_info.rpmb_size_mult == 0) {
1126 			res = TEE_ERROR_GENERIC;
1127 			goto func_exit;
1128 		}
1129 
1130 		if (MUL_OVERFLOW(dev_info.rpmb_size_mult,
1131 				 RPMB_SIZE_SINGLE / RPMB_DATA_SIZE, &nblocks) ||
1132 		    SUB_OVERFLOW(nblocks, 1, &rpmb_ctx->max_blk_idx)) {
1133 			res = TEE_ERROR_BAD_PARAMETERS;
1134 			goto func_exit;
1135 		}
1136 
1137 		memcpy(rpmb_ctx->cid, dev_info.cid, RPMB_EMMC_CID_SIZE);
1138 
1139 #ifdef RPMB_DRIVER_MULTIPLE_WRITE_FIXED
1140 		rpmb_ctx->rel_wr_blkcnt = dev_info.rel_wr_sec_c * 2;
1141 #else
1142 		rpmb_ctx->rel_wr_blkcnt = 1;
1143 #endif
1144 
1145 		rpmb_ctx->dev_info_synced = true;
1146 	}
1147 
1148 	if (!rpmb_ctx->key_derived) {
1149 		DMSG("RPMB INIT: Deriving key");
1150 
1151 		res = tee_rpmb_key_gen(dev_id, rpmb_ctx->key,
1152 				       RPMB_KEY_MAC_SIZE);
1153 		if (res != TEE_SUCCESS) {
1154 			EMSG("RPMB INIT: Deriving key failed with error 0x%x",
1155 				res);
1156 			goto func_exit;
1157 		}
1158 
1159 		rpmb_ctx->key_derived = true;
1160 	}
1161 
1162 	/* Perform a write counter read to verify if the key is ok. */
1163 	if (!rpmb_ctx->wr_cnt_synced || !rpmb_ctx->key_verified) {
1164 		DMSG("RPMB INIT: Verifying Key");
1165 
1166 		res = tee_rpmb_verify_key_sync_counter(dev_id);
1167 		if (res == TEE_ERROR_ITEM_NOT_FOUND &&
1168 			!rpmb_ctx->key_verified) {
1169 			/*
1170 			 * Need to write the key here and verify it.
1171 			 */
1172 			DMSG("RPMB INIT: Auth key not yet written");
1173 			res = tee_rpmb_write_and_verify_key(dev_id);
1174 		} else if (res != TEE_SUCCESS) {
1175 			EMSG("Verify key failed!");
1176 			EMSG("Make sure key here matches device key");
1177 		}
1178 	}
1179 
1180 func_exit:
1181 	return res;
1182 }
1183 
1184 /*
1185  * Read RPMB data in bytes.
1186  *
1187  * @dev_id     Device ID of the eMMC device.
1188  * @addr       Byte address of data.
1189  * @data       Pointer to the data.
1190  * @len        Size of data in bytes.
1191  * @fek        Encrypted File Encryption Key or NULL.
1192  */
1193 static TEE_Result tee_rpmb_read(uint16_t dev_id, uint32_t addr, uint8_t *data,
1194 				uint32_t len, const uint8_t *fek,
1195 				const TEE_UUID *uuid)
1196 {
1197 	TEE_Result res = TEE_ERROR_GENERIC;
1198 	struct tee_rpmb_mem mem = { 0 };
1199 	uint16_t msg_type;
1200 	uint8_t nonce[RPMB_NONCE_SIZE];
1201 	uint8_t hmac[RPMB_KEY_MAC_SIZE];
1202 	struct rpmb_req *req = NULL;
1203 	struct rpmb_data_frame *resp = NULL;
1204 	struct rpmb_raw_data rawdata;
1205 	uint32_t req_size;
1206 	uint32_t resp_size;
1207 	uint16_t blk_idx;
1208 	uint16_t blkcnt;
1209 	uint8_t byte_offset;
1210 
1211 	if (!data || !len)
1212 		return TEE_ERROR_BAD_PARAMETERS;
1213 
1214 	blk_idx = addr / RPMB_DATA_SIZE;
1215 	byte_offset = addr % RPMB_DATA_SIZE;
1216 
1217 	if (len + byte_offset + RPMB_DATA_SIZE < RPMB_DATA_SIZE) {
1218 		/* Overflow */
1219 		return TEE_ERROR_BAD_PARAMETERS;
1220 	}
1221 	blkcnt =
1222 	    ROUNDUP(len + byte_offset, RPMB_DATA_SIZE) / RPMB_DATA_SIZE;
1223 	res = tee_rpmb_init(dev_id);
1224 	if (res != TEE_SUCCESS)
1225 		goto func_exit;
1226 
1227 	req_size = sizeof(struct rpmb_req) + RPMB_DATA_FRAME_SIZE;
1228 	resp_size = RPMB_DATA_FRAME_SIZE * blkcnt;
1229 	res = tee_rpmb_alloc(req_size, resp_size, &mem,
1230 			     (void *)&req, (void *)&resp);
1231 	if (res != TEE_SUCCESS)
1232 		goto func_exit;
1233 
1234 	msg_type = RPMB_MSG_TYPE_REQ_AUTH_DATA_READ;
1235 	res = crypto_rng_read(nonce, RPMB_NONCE_SIZE);
1236 	if (res != TEE_SUCCESS)
1237 		goto func_exit;
1238 
1239 	memset(&rawdata, 0x00, sizeof(struct rpmb_raw_data));
1240 	rawdata.msg_type = msg_type;
1241 	rawdata.nonce = nonce;
1242 	rawdata.blk_idx = &blk_idx;
1243 	res = tee_rpmb_req_pack(req, &rawdata, 1, dev_id, NULL, NULL);
1244 	if (res != TEE_SUCCESS)
1245 		goto func_exit;
1246 
1247 	req->block_count = blkcnt;
1248 
1249 	DMSG("Read %u block%s at index %u", blkcnt, ((blkcnt > 1) ? "s" : ""),
1250 	     blk_idx);
1251 
1252 	res = tee_rpmb_invoke(&mem);
1253 	if (res != TEE_SUCCESS)
1254 		goto func_exit;
1255 
1256 	msg_type = RPMB_MSG_TYPE_RESP_AUTH_DATA_READ;
1257 
1258 	memset(&rawdata, 0x00, sizeof(struct rpmb_raw_data));
1259 	rawdata.msg_type = msg_type;
1260 	rawdata.block_count = &blkcnt;
1261 	rawdata.blk_idx = &blk_idx;
1262 	rawdata.nonce = nonce;
1263 	rawdata.key_mac = hmac;
1264 	rawdata.data = data;
1265 
1266 	rawdata.len = len;
1267 	rawdata.byte_offset = byte_offset;
1268 
1269 	res = tee_rpmb_resp_unpack_verify(resp, &rawdata, blkcnt, fek, uuid);
1270 	if (res != TEE_SUCCESS)
1271 		goto func_exit;
1272 
1273 	res = TEE_SUCCESS;
1274 
1275 func_exit:
1276 	tee_rpmb_free(&mem);
1277 	return res;
1278 }
1279 
1280 static TEE_Result write_req(uint16_t dev_id, uint16_t blk_idx,
1281 			    const void *data_blks, uint16_t blkcnt,
1282 			    const uint8_t *fek, const TEE_UUID *uuid,
1283 			    struct tee_rpmb_mem *mem, void  *req, void *resp)
1284 {
1285 	TEE_Result res = TEE_SUCCESS;
1286 	uint8_t hmac[RPMB_KEY_MAC_SIZE] = { };
1287 	uint32_t wr_cnt = rpmb_ctx->wr_cnt;
1288 	struct rpmb_raw_data rawdata = { };
1289 	size_t retry_count = 0;
1290 
1291 	assert(mem->req_size <=
1292 	       sizeof(struct rpmb_req) + blkcnt * RPMB_DATA_FRAME_SIZE);
1293 	assert(mem->resp_size <= RPMB_DATA_FRAME_SIZE);
1294 
1295 	while (true) {
1296 		memset(req, 0, mem->req_size);
1297 		memset(resp, 0, mem->resp_size);
1298 
1299 		memset(&rawdata, 0, sizeof(struct rpmb_raw_data));
1300 		rawdata.msg_type = RPMB_MSG_TYPE_REQ_AUTH_DATA_WRITE;
1301 		rawdata.block_count = &blkcnt;
1302 		rawdata.blk_idx = &blk_idx;
1303 		rawdata.write_counter = &wr_cnt;
1304 		rawdata.key_mac = hmac;
1305 		rawdata.data = (uint8_t *)data_blks;
1306 
1307 		res = tee_rpmb_req_pack(req, &rawdata, blkcnt, dev_id, fek,
1308 					uuid);
1309 		if (res) {
1310 			/*
1311 			 * If we haven't tried to send a request yet we can
1312 			 * allow a failure here since there's no chance of
1313 			 * an intercepted request with a valid write
1314 			 * counter.
1315 			 */
1316 			if (!retry_count)
1317 				return res;
1318 
1319 			retry_count++;
1320 			if (retry_count >= RPMB_MAX_RETRIES)
1321 				goto out_of_retries;
1322 
1323 			DMSG("Request pack failed, retrying %zu", retry_count);
1324 			continue;
1325 		}
1326 
1327 		res = tee_rpmb_invoke(mem);
1328 		if (res != TEE_SUCCESS) {
1329 			retry_count++;
1330 			if (retry_count >= RPMB_MAX_RETRIES)
1331 				goto out_of_retries;
1332 			/*
1333 			 * To force wr_cnt sync next time, as it might get
1334 			 * out of sync due to inconsistent operation result!
1335 			 */
1336 			rpmb_ctx->wr_cnt_synced = false;
1337 			DMSG("Write invoke failed, retrying %zu", retry_count);
1338 			continue;
1339 		}
1340 
1341 		memset(&rawdata, 0, sizeof(struct rpmb_raw_data));
1342 		rawdata.msg_type = RPMB_MSG_TYPE_RESP_AUTH_DATA_WRITE;
1343 		rawdata.block_count = &blkcnt;
1344 		rawdata.blk_idx = &blk_idx;
1345 		rawdata.write_counter = &wr_cnt;
1346 		rawdata.key_mac = hmac;
1347 
1348 		res = tee_rpmb_resp_unpack_verify(resp, &rawdata, 1, NULL,
1349 						  NULL);
1350 		if (res != TEE_SUCCESS) {
1351 			retry_count++;
1352 			if (retry_count >= RPMB_MAX_RETRIES)
1353 				goto out_of_retries;
1354 			/*
1355 			 * To force wr_cnt sync next time, as it might get
1356 			 * out of sync due to inconsistent operation result!
1357 			 */
1358 			rpmb_ctx->wr_cnt_synced = false;
1359 			DMSG("Write resp unpack verify failed, retrying %zu",
1360 			     retry_count);
1361 			continue;
1362 		}
1363 
1364 		return TEE_SUCCESS;
1365 	}
1366 
1367 out_of_retries:
1368 	rpmb_dead = true;
1369 	/*
1370 	 * We're using this error code to cause an eventuall calling TA to
1371 	 * panic since we don't know if the data to be written has been
1372 	 * committed to storage or not.
1373 	 */
1374 	return TEE_ERROR_COMMUNICATION;
1375 }
1376 
1377 static TEE_Result tee_rpmb_write_blk(uint16_t dev_id, uint16_t blk_idx,
1378 				     const uint8_t *data_blks, uint16_t blkcnt,
1379 				     const uint8_t *fek, const TEE_UUID *uuid)
1380 {
1381 	TEE_Result res;
1382 	struct tee_rpmb_mem mem;
1383 	struct rpmb_req *req = NULL;
1384 	struct rpmb_data_frame *resp = NULL;
1385 	uint32_t req_size;
1386 	uint32_t resp_size;
1387 	uint32_t nbr_writes;
1388 	uint16_t tmp_blkcnt;
1389 	uint16_t tmp_blk_idx;
1390 	uint16_t i;
1391 
1392 	DMSG("Write %u block%s at index %u", blkcnt, ((blkcnt > 1) ? "s" : ""),
1393 	     blk_idx);
1394 
1395 	if (!data_blks || !blkcnt)
1396 		return TEE_ERROR_BAD_PARAMETERS;
1397 
1398 	res = tee_rpmb_init(dev_id);
1399 	if (res != TEE_SUCCESS)
1400 		return res;
1401 
1402 	/*
1403 	 * We need to split data when block count
1404 	 * is bigger than reliable block write count.
1405 	 */
1406 	if (blkcnt < rpmb_ctx->rel_wr_blkcnt)
1407 		req_size = sizeof(struct rpmb_req) +
1408 		    RPMB_DATA_FRAME_SIZE * blkcnt;
1409 	else
1410 		req_size = sizeof(struct rpmb_req) +
1411 		    RPMB_DATA_FRAME_SIZE * rpmb_ctx->rel_wr_blkcnt;
1412 
1413 	resp_size = RPMB_DATA_FRAME_SIZE;
1414 	res = tee_rpmb_alloc(req_size, resp_size, &mem,
1415 			     (void *)&req, (void *)&resp);
1416 	if (res != TEE_SUCCESS)
1417 		return res;
1418 
1419 	nbr_writes = blkcnt / rpmb_ctx->rel_wr_blkcnt;
1420 	if (blkcnt % rpmb_ctx->rel_wr_blkcnt > 0)
1421 		nbr_writes += 1;
1422 
1423 	tmp_blkcnt = rpmb_ctx->rel_wr_blkcnt;
1424 	tmp_blk_idx = blk_idx;
1425 	for (i = 0; i < nbr_writes; i++) {
1426 		size_t offs = i * rpmb_ctx->rel_wr_blkcnt * RPMB_DATA_SIZE;
1427 
1428 		/*
1429 		 * To handle the last write of block count which is
1430 		 * equal or smaller than reliable write block count.
1431 		 */
1432 		if (i == nbr_writes - 1)
1433 			tmp_blkcnt = blkcnt - rpmb_ctx->rel_wr_blkcnt *
1434 			    (nbr_writes - 1);
1435 
1436 		res = write_req(dev_id, tmp_blk_idx, data_blks + offs,
1437 				tmp_blkcnt, fek, uuid, &mem, req, resp);
1438 		if (res)
1439 			goto out;
1440 
1441 
1442 		tmp_blk_idx += tmp_blkcnt;
1443 	}
1444 
1445 out:
1446 	tee_rpmb_free(&mem);
1447 	return res;
1448 }
1449 
1450 static bool tee_rpmb_write_is_atomic(uint16_t dev_id __unused, uint32_t addr,
1451 				     uint32_t len)
1452 {
1453 	uint8_t byte_offset = addr % RPMB_DATA_SIZE;
1454 	uint16_t blkcnt = ROUNDUP(len + byte_offset,
1455 				  RPMB_DATA_SIZE) / RPMB_DATA_SIZE;
1456 
1457 	return (blkcnt <= rpmb_ctx->rel_wr_blkcnt);
1458 }
1459 
1460 /*
1461  * Write RPMB data in bytes.
1462  *
1463  * @dev_id     Device ID of the eMMC device.
1464  * @addr       Byte address of data.
1465  * @data       Pointer to the data.
1466  * @len        Size of data in bytes.
1467  * @fek        Encrypted File Encryption Key or NULL.
1468  */
1469 static TEE_Result tee_rpmb_write(uint16_t dev_id, uint32_t addr,
1470 				 const uint8_t *data, uint32_t len,
1471 				 const uint8_t *fek, const TEE_UUID *uuid)
1472 {
1473 	TEE_Result res = TEE_ERROR_GENERIC;
1474 	uint8_t *data_tmp = NULL;
1475 	uint16_t blk_idx;
1476 	uint16_t blkcnt;
1477 	uint8_t byte_offset;
1478 
1479 	blk_idx = addr / RPMB_DATA_SIZE;
1480 	byte_offset = addr % RPMB_DATA_SIZE;
1481 
1482 	blkcnt =
1483 	    ROUNDUP(len + byte_offset, RPMB_DATA_SIZE) / RPMB_DATA_SIZE;
1484 
1485 	if (byte_offset == 0 && (len % RPMB_DATA_SIZE) == 0) {
1486 		res = tee_rpmb_write_blk(dev_id, blk_idx, data, blkcnt, fek,
1487 					 uuid);
1488 		if (res != TEE_SUCCESS)
1489 			goto func_exit;
1490 	} else {
1491 		data_tmp = calloc(blkcnt, RPMB_DATA_SIZE);
1492 		if (!data_tmp) {
1493 			res = TEE_ERROR_OUT_OF_MEMORY;
1494 			goto func_exit;
1495 		}
1496 
1497 		/* Read the complete blocks */
1498 		res = tee_rpmb_read(dev_id, blk_idx * RPMB_DATA_SIZE, data_tmp,
1499 				    blkcnt * RPMB_DATA_SIZE, fek, uuid);
1500 		if (res != TEE_SUCCESS)
1501 			goto func_exit;
1502 
1503 		/* Partial update of the data blocks */
1504 		memcpy(data_tmp + byte_offset, data, len);
1505 
1506 		res = tee_rpmb_write_blk(dev_id, blk_idx, data_tmp, blkcnt,
1507 					 fek, uuid);
1508 		if (res != TEE_SUCCESS)
1509 			goto func_exit;
1510 	}
1511 
1512 	res = TEE_SUCCESS;
1513 
1514 func_exit:
1515 	free(data_tmp);
1516 	return res;
1517 }
1518 
1519 /*
1520  * Read the RPMB write counter.
1521  *
1522  * @dev_id     Device ID of the eMMC device.
1523  * @counter    Pointer to the counter.
1524  */
1525 static TEE_Result tee_rpmb_get_write_counter(uint16_t dev_id,
1526 					     uint32_t *counter)
1527 {
1528 	TEE_Result res = TEE_SUCCESS;
1529 
1530 	if (!counter)
1531 		return TEE_ERROR_BAD_PARAMETERS;
1532 
1533 	if (rpmb_dead)
1534 		return TEE_ERROR_COMMUNICATION;
1535 
1536 	if (!rpmb_ctx || !rpmb_ctx->wr_cnt_synced) {
1537 		res = tee_rpmb_init(dev_id);
1538 		if (res != TEE_SUCCESS)
1539 			goto func_exit;
1540 	}
1541 
1542 	*counter = rpmb_ctx->wr_cnt;
1543 
1544 func_exit:
1545 	return res;
1546 }
1547 
1548 /*
1549  * Read the RPMB max block.
1550  *
1551  * @dev_id     Device ID of the eMMC device.
1552  * @counter    Pointer to receive the max block.
1553  */
1554 static TEE_Result tee_rpmb_get_max_block(uint16_t dev_id, uint32_t *max_block)
1555 {
1556 	TEE_Result res = TEE_SUCCESS;
1557 
1558 	if (!max_block)
1559 		return TEE_ERROR_BAD_PARAMETERS;
1560 
1561 	if (rpmb_dead)
1562 		return TEE_ERROR_COMMUNICATION;
1563 
1564 	if (!rpmb_ctx || !rpmb_ctx->dev_info_synced) {
1565 		res = tee_rpmb_init(dev_id);
1566 		if (res != TEE_SUCCESS)
1567 			goto func_exit;
1568 	}
1569 
1570 	*max_block = rpmb_ctx->max_blk_idx;
1571 
1572 func_exit:
1573 	return res;
1574 }
1575 
1576 /*
1577  * End of lower interface to RPMB device
1578  */
1579 
1580 static TEE_Result get_fat_start_address(uint32_t *addr);
1581 static TEE_Result rpmb_fs_setup(void);
1582 
1583 /**
1584  * fat_entry_dir_free: Free the FAT entry dir.
1585  */
1586 static void fat_entry_dir_free(void)
1587 {
1588 	if (fat_entry_dir) {
1589 		free(fat_entry_dir->rpmb_fat_entry_buf);
1590 		free(fat_entry_dir);
1591 		fat_entry_dir = NULL;
1592 	}
1593 }
1594 
1595 /**
1596  * fat_entry_dir_init: Initialize the FAT FS entry buffer/cache
1597  * This function must be called before reading FAT FS entries using the
1598  * function fat_entry_dir_get_next. This initializes the buffer/cache with the
1599  * first FAT FS entries.
1600  */
1601 static TEE_Result fat_entry_dir_init(void)
1602 {
1603 	TEE_Result res = TEE_ERROR_GENERIC;
1604 	struct rpmb_fat_entry *fe = NULL;
1605 	uint32_t fat_address = 0;
1606 	uint32_t num_elems_read = 0;
1607 
1608 	if (fat_entry_dir)
1609 		return TEE_SUCCESS;
1610 
1611 	res = rpmb_fs_setup();
1612 	if (res)
1613 		return res;
1614 
1615 	res = get_fat_start_address(&fat_address);
1616 	if (res)
1617 		return res;
1618 
1619 	fat_entry_dir = calloc(1, sizeof(struct rpmb_fat_entry_dir));
1620 	if (!fat_entry_dir)
1621 		return TEE_ERROR_OUT_OF_MEMORY;
1622 
1623 	/*
1624 	 * If caching is enabled, read in up to the maximum cache size, but
1625 	 * never more than the single read in size. Otherwise, read in as many
1626 	 * entries fit into the temporary buffer.
1627 	 */
1628 	if (CFG_RPMB_FS_CACHE_ENTRIES)
1629 		num_elems_read = MIN(CFG_RPMB_FS_CACHE_ENTRIES,
1630 				     CFG_RPMB_FS_RD_ENTRIES);
1631 	else
1632 		num_elems_read = CFG_RPMB_FS_RD_ENTRIES;
1633 
1634 	/*
1635 	 * Allocate memory for the FAT FS entries to read in.
1636 	 */
1637 	fe = calloc(num_elems_read, sizeof(struct rpmb_fat_entry));
1638 	if (!fe) {
1639 		res = TEE_ERROR_OUT_OF_MEMORY;
1640 		goto out;
1641 	}
1642 
1643 	res = tee_rpmb_read(CFG_RPMB_FS_DEV_ID, fat_address, (uint8_t *)fe,
1644 			    num_elems_read * sizeof(*fe), NULL, NULL);
1645 	if (res)
1646 		goto out;
1647 
1648 	fat_entry_dir->rpmb_fat_entry_buf = fe;
1649 
1650 	/*
1651 	 * We use this variable when getting next entries from the buffer/cache
1652 	 * to see whether we have to read in more entries from storage.
1653 	 */
1654 	fat_entry_dir->num_buffered = num_elems_read;
1655 
1656 	return TEE_SUCCESS;
1657 out:
1658 	fat_entry_dir_free();
1659 	free(fe);
1660 	return res;
1661 }
1662 
1663 /**
1664  * fat_entry_dir_deinit: If caching is enabled, free the temporary buffer for
1665  * FAT FS entries in case the cache was too small. Keep the elements in the
1666  * cache. Reset the counter variables to start the next traversal from fresh
1667  * from the first cached entry. If caching is disabled, just free the
1668  * temporary buffer by calling fat_entry_dir_free and return.
1669  */
1670 static void fat_entry_dir_deinit(void)
1671 {
1672 	struct rpmb_fat_entry *fe = NULL;
1673 
1674 	if (!fat_entry_dir)
1675 		return;
1676 
1677 	if (!CFG_RPMB_FS_CACHE_ENTRIES) {
1678 		fat_entry_dir_free();
1679 		return;
1680 	}
1681 
1682 	fe = fat_entry_dir->rpmb_fat_entry_buf;
1683 	fat_entry_dir->idx_curr = 0;
1684 	fat_entry_dir->num_total_read = 0;
1685 	fat_entry_dir->last_reached = false;
1686 
1687 	if (fat_entry_dir->num_buffered > CFG_RPMB_FS_CACHE_ENTRIES) {
1688 		fat_entry_dir->num_buffered = CFG_RPMB_FS_CACHE_ENTRIES;
1689 
1690 		fe = realloc(fe, fat_entry_dir->num_buffered * sizeof(*fe));
1691 
1692 		/*
1693 		 * In case realloc fails, we are on the safe side if we destroy
1694 		 * the whole structure. Upon the next init, the cache has to be
1695 		 * re-established, but this case should not happen in practice.
1696 		 */
1697 		if (!fe)
1698 			fat_entry_dir_free();
1699 		else
1700 			fat_entry_dir->rpmb_fat_entry_buf = fe;
1701 	}
1702 }
1703 
1704 /**
1705  * fat_entry_dir_update: Updates a persisted FAT FS entry in the cache.
1706  * This function updates the FAT entry fat_entry that was written to address
1707  * fat_address onto RPMB storage in the cache.
1708  */
1709 static TEE_Result __maybe_unused fat_entry_dir_update
1710 					(struct rpmb_fat_entry *fat_entry,
1711 					 uint32_t fat_address)
1712 {
1713 	uint32_t fat_entry_buf_idx = 0;
1714 	/* Use a temp var to avoid compiler warning if caching disabled. */
1715 	uint32_t max_cache_entries = CFG_RPMB_FS_CACHE_ENTRIES;
1716 
1717 	assert(!((fat_address - RPMB_FS_FAT_START_ADDRESS) %
1718 	       sizeof(struct rpmb_fat_entry)));
1719 
1720 	/* Nothing to update if the cache is not initialized. */
1721 	if (!fat_entry_dir)
1722 		return TEE_SUCCESS;
1723 
1724 	fat_entry_buf_idx = (fat_address - RPMB_FS_FAT_START_ADDRESS) /
1725 			     sizeof(struct rpmb_fat_entry);
1726 
1727 	/* Only need to write if index points to an entry in cache. */
1728 	if (fat_entry_buf_idx < fat_entry_dir->num_buffered &&
1729 	    fat_entry_buf_idx < max_cache_entries) {
1730 		memcpy(fat_entry_dir->rpmb_fat_entry_buf + fat_entry_buf_idx,
1731 		       fat_entry, sizeof(struct rpmb_fat_entry));
1732 	}
1733 
1734 	return TEE_SUCCESS;
1735 }
1736 
1737 /**
1738  * fat_entry_dir_get_next: Get next FAT FS entry.
1739  * Read either from cache/buffer, or by reading from RPMB storage if the
1740  * elements in the buffer/cache are fully read. When reading in from RPMB
1741  * storage, the buffer is overwritten in case caching is disabled.
1742  * In case caching is enabled, the cache is either further filled, or a
1743  * temporary buffer populated if the cache is already full.
1744  * The FAT FS entry is written to fat_entry. The respective address in RPMB
1745  * storage is written to fat_address, if not NULL. When the last FAT FS entry
1746  * was previously read, the function indicates this case by writing a NULL
1747  * pointer to fat_entry.
1748  * Returns a value different TEE_SUCCESS if the next FAT FS entry could not be
1749  * retrieved.
1750  */
1751 static TEE_Result fat_entry_dir_get_next(struct rpmb_fat_entry **fat_entry,
1752 					 uint32_t *fat_address)
1753 {
1754 	TEE_Result res = TEE_ERROR_GENERIC;
1755 	struct rpmb_fat_entry *fe = NULL;
1756 	uint32_t num_elems_read = 0;
1757 	uint32_t fat_address_local = 0;
1758 
1759 	assert(fat_entry_dir && fat_entry);
1760 
1761 	/* Don't read further if we previously read the last FAT FS entry. */
1762 	if (fat_entry_dir->last_reached) {
1763 		*fat_entry = NULL;
1764 		return TEE_SUCCESS;
1765 	}
1766 
1767 	fe = fat_entry_dir->rpmb_fat_entry_buf;
1768 
1769 	/* Determine address of FAT FS entry in RPMB storage. */
1770 	fat_address_local = RPMB_FS_FAT_START_ADDRESS +
1771 			(fat_entry_dir->num_total_read *
1772 			sizeof(struct rpmb_fat_entry));
1773 
1774 	/*
1775 	 * We've read all so-far buffered elements, so we need to
1776 	 * read in more entries from RPMB storage.
1777 	 */
1778 	if (fat_entry_dir->idx_curr >= fat_entry_dir->num_buffered) {
1779 		/*
1780 		 * This is the case where we do not cache entries, so just read
1781 		 * in next set of FAT FS entries into the buffer.
1782 		 * Goto the end of the when statement if that is done.
1783 		 */
1784 		if (!CFG_RPMB_FS_CACHE_ENTRIES) {
1785 			num_elems_read = CFG_RPMB_FS_RD_ENTRIES;
1786 			fat_entry_dir->idx_curr = 0;
1787 
1788 			res = tee_rpmb_read(CFG_RPMB_FS_DEV_ID,
1789 					    fat_address_local, (uint8_t *)fe,
1790 					    num_elems_read * sizeof(*fe), NULL,
1791 					    NULL);
1792 			if (res)
1793 				return res;
1794 			goto post_read_in;
1795 		}
1796 
1797 		/*
1798 		 * We cache FAT FS entries, and the buffer is not completely
1799 		 * filled. Further keep on extending the buffer up to its max
1800 		 * size by reading in from RPMB.
1801 		 */
1802 		if (fat_entry_dir->num_total_read < RPMB_BUF_MAX_ENTRIES) {
1803 			/*
1804 			 * Read at most as many elements as fit in the buffer
1805 			 * and no more than the defined number of entries to
1806 			 * read in at once.
1807 			 */
1808 			num_elems_read = MIN(RPMB_BUF_MAX_ENTRIES -
1809 					     fat_entry_dir->num_total_read,
1810 					     (uint32_t)CFG_RPMB_FS_RD_ENTRIES);
1811 
1812 			/*
1813 			 * Expand the buffer to fit in the additional entries.
1814 			 */
1815 			fe = realloc(fe,
1816 				     (fat_entry_dir->num_buffered +
1817 				      num_elems_read) * sizeof(*fe));
1818 			if (!fe)
1819 				return TEE_ERROR_OUT_OF_MEMORY;
1820 
1821 			fat_entry_dir->rpmb_fat_entry_buf = fe;
1822 
1823 			/* Read in to the next free slot in the buffer/cache. */
1824 			res = tee_rpmb_read(CFG_RPMB_FS_DEV_ID,
1825 					    fat_address_local,
1826 					    (uint8_t *)(fe +
1827 					    fat_entry_dir->num_total_read),
1828 					    num_elems_read * sizeof(*fe),
1829 					    NULL, NULL);
1830 			if (res)
1831 				return res;
1832 
1833 			fat_entry_dir->num_buffered += num_elems_read;
1834 		} else {
1835 			/*
1836 			 * This happens when we have read as many elements as
1837 			 * can possibly fit into the buffer.
1838 			 * As the first part of the buffer serves as our cache,
1839 			 * we only overwrite the last part that serves as our
1840 			 * temporary buffer used to iteratively read in entries
1841 			 * when the cache is full. Read in the temporary buffer
1842 			 * maximum size.
1843 			 */
1844 			num_elems_read = CFG_RPMB_FS_RD_ENTRIES;
1845 			/* Reset index to beginning of the temporary buffer. */
1846 			fat_entry_dir->idx_curr = CFG_RPMB_FS_CACHE_ENTRIES;
1847 
1848 			/* Read in elements after the end of the cache. */
1849 			res = tee_rpmb_read(CFG_RPMB_FS_DEV_ID,
1850 					    fat_address_local,
1851 					    (uint8_t *)(fe +
1852 					    fat_entry_dir->idx_curr),
1853 					    num_elems_read * sizeof(*fe),
1854 					    NULL, NULL);
1855 			if (res)
1856 				return res;
1857 		}
1858 	}
1859 
1860 post_read_in:
1861 	if (fat_address)
1862 		*fat_address = fat_address_local;
1863 
1864 	*fat_entry = fe + fat_entry_dir->idx_curr;
1865 
1866 	fat_entry_dir->idx_curr++;
1867 	fat_entry_dir->num_total_read++;
1868 
1869 	/*
1870 	 * Indicate last entry was read.
1871 	 * Ensures we return a zero value for fat_entry on next invocation.
1872 	 */
1873 	if ((*fat_entry)->flags & FILE_IS_LAST_ENTRY)
1874 		fat_entry_dir->last_reached = true;
1875 
1876 	return TEE_SUCCESS;
1877 }
1878 
1879 #if (TRACE_LEVEL >= TRACE_FLOW)
1880 static void dump_fat(void)
1881 {
1882 	TEE_Result res = TEE_ERROR_SECURITY;
1883 	struct rpmb_fat_entry *fe = NULL;
1884 
1885 	if (!fs_par)
1886 		return;
1887 
1888 	if (fat_entry_dir_init())
1889 		return;
1890 
1891 	while (true) {
1892 		res = fat_entry_dir_get_next(&fe, NULL);
1893 		if (res || !fe)
1894 			break;
1895 
1896 		FMSG("flags %#"PRIx32", size %"PRIu32", address %#"PRIx32
1897 		     ", filename '%s'",
1898 		     fe->flags, fe->data_size, fe->start_address, fe->filename);
1899 	}
1900 
1901 	fat_entry_dir_deinit();
1902 }
1903 #else
1904 static void dump_fat(void)
1905 {
1906 }
1907 #endif
1908 
1909 #if (TRACE_LEVEL >= TRACE_DEBUG)
1910 static void dump_fh(struct rpmb_file_handle *fh)
1911 {
1912 	DMSG("fh->filename=%s", fh->filename);
1913 	DMSG("fh->rpmb_fat_address=%u", fh->rpmb_fat_address);
1914 	DMSG("fh->fat_entry.start_address=%u", fh->fat_entry.start_address);
1915 	DMSG("fh->fat_entry.data_size=%u", fh->fat_entry.data_size);
1916 }
1917 #else
1918 static void dump_fh(struct rpmb_file_handle *fh __unused)
1919 {
1920 }
1921 #endif
1922 
1923 static struct rpmb_file_handle *alloc_file_handle(struct tee_pobj *po,
1924 						  bool temporary)
1925 {
1926 	struct rpmb_file_handle *fh = NULL;
1927 
1928 	fh = calloc(1, sizeof(struct rpmb_file_handle));
1929 	if (!fh)
1930 		return NULL;
1931 
1932 	if (po)
1933 		tee_svc_storage_create_filename(fh->filename,
1934 						sizeof(fh->filename), po,
1935 						temporary);
1936 
1937 	return fh;
1938 }
1939 
1940 /**
1941  * write_fat_entry: Store info in a fat_entry to RPMB.
1942  */
1943 static TEE_Result write_fat_entry(struct rpmb_file_handle *fh,
1944 				  bool update_write_counter)
1945 {
1946 	TEE_Result res = TEE_ERROR_GENERIC;
1947 
1948 	/* Protect partition data. */
1949 	if (fh->rpmb_fat_address < sizeof(struct rpmb_fs_partition)) {
1950 		res = TEE_ERROR_ACCESS_CONFLICT;
1951 		goto out;
1952 	}
1953 
1954 	if (fh->rpmb_fat_address % sizeof(struct rpmb_fat_entry) != 0) {
1955 		res = TEE_ERROR_BAD_PARAMETERS;
1956 		goto out;
1957 	}
1958 
1959 	if (update_write_counter) {
1960 		res = tee_rpmb_get_write_counter(CFG_RPMB_FS_DEV_ID,
1961 						 &fh->fat_entry.write_counter);
1962 		if (res)
1963 			goto out;
1964 	}
1965 
1966 	res = tee_rpmb_write(CFG_RPMB_FS_DEV_ID, fh->rpmb_fat_address,
1967 			     (uint8_t *)&fh->fat_entry,
1968 			     sizeof(struct rpmb_fat_entry), NULL, NULL);
1969 
1970 	dump_fat();
1971 
1972 	/* If caching enabled, update a successfully written entry in cache. */
1973 	if (CFG_RPMB_FS_CACHE_ENTRIES && !res)
1974 		res = fat_entry_dir_update(&fh->fat_entry,
1975 					   fh->rpmb_fat_address);
1976 
1977 out:
1978 	return res;
1979 }
1980 
1981 /**
1982  * rpmb_fs_setup: Setup RPMB FS.
1983  * Set initial partition and FS values and write to RPMB.
1984  * Store frequently used data in RAM.
1985  */
1986 static TEE_Result rpmb_fs_setup(void)
1987 {
1988 	TEE_Result res = TEE_ERROR_GENERIC;
1989 	struct rpmb_fs_partition *partition_data = NULL;
1990 	struct rpmb_file_handle *fh = NULL;
1991 	uint32_t max_rpmb_block = 0;
1992 
1993 	if (fs_par) {
1994 		res = TEE_SUCCESS;
1995 		goto out;
1996 	}
1997 
1998 	res = tee_rpmb_get_max_block(CFG_RPMB_FS_DEV_ID, &max_rpmb_block);
1999 	if (res != TEE_SUCCESS)
2000 		goto out;
2001 
2002 	/*
2003 	 * We're going to read a full block in order to have a full block
2004 	 * for the dummy write below.
2005 	 */
2006 	COMPILE_TIME_ASSERT(sizeof(struct rpmb_fs_partition) <=
2007 			    RPMB_DATA_SIZE);
2008 	partition_data = calloc(1, RPMB_DATA_SIZE);
2009 	if (!partition_data) {
2010 		res = TEE_ERROR_OUT_OF_MEMORY;
2011 		goto out;
2012 	}
2013 
2014 	res = tee_rpmb_read(CFG_RPMB_FS_DEV_ID, RPMB_STORAGE_START_ADDRESS,
2015 			    (uint8_t *)partition_data, RPMB_DATA_SIZE,
2016 			    NULL, NULL);
2017 	if (res != TEE_SUCCESS)
2018 		goto out;
2019 	/*
2020 	 * Perform a write in order to increase the write counter. This
2021 	 * prevents late usage (replay attack) of a previously blocked
2022 	 * request with a valid write counter value.
2023 	 */
2024 	res = tee_rpmb_write(CFG_RPMB_FS_DEV_ID, RPMB_STORAGE_START_ADDRESS,
2025 			     (uint8_t *)partition_data, RPMB_DATA_SIZE,
2026 			     NULL, NULL);
2027 	if (res != TEE_SUCCESS)
2028 		goto out;
2029 	/*
2030 	 * We're reading again in case a stale request was committed
2031 	 * instead of the one issued above. If this succeeds we're in sync
2032 	 * with the RPMB block since there are no other possible stale
2033 	 * blocks with valid write counters available.
2034 	 */
2035 	res = tee_rpmb_read(CFG_RPMB_FS_DEV_ID, RPMB_STORAGE_START_ADDRESS,
2036 			    (uint8_t *)partition_data,
2037 			    sizeof(struct rpmb_fs_partition), NULL, NULL);
2038 	if (res != TEE_SUCCESS)
2039 		goto out;
2040 
2041 #ifndef CFG_RPMB_RESET_FAT
2042 	if (partition_data->rpmb_fs_magic == RPMB_FS_MAGIC) {
2043 		if (partition_data->fs_version == FS_VERSION) {
2044 			res = TEE_SUCCESS;
2045 			goto store_fs_par;
2046 		} else {
2047 			EMSG("Wrong software is in use.");
2048 			res = TEE_ERROR_ACCESS_DENIED;
2049 			goto out;
2050 		}
2051 	}
2052 #else
2053 	EMSG("**** Clearing Storage ****");
2054 #endif
2055 
2056 	/* Setup new partition data. */
2057 	partition_data->rpmb_fs_magic = RPMB_FS_MAGIC;
2058 	partition_data->fs_version = FS_VERSION;
2059 	partition_data->fat_start_address = RPMB_FS_FAT_START_ADDRESS;
2060 
2061 	/* Initial FAT entry with FILE_IS_LAST_ENTRY flag set. */
2062 	fh = alloc_file_handle(NULL, false);
2063 	if (!fh) {
2064 		res = TEE_ERROR_OUT_OF_MEMORY;
2065 		goto out;
2066 	}
2067 	fh->fat_entry.flags = FILE_IS_LAST_ENTRY;
2068 	fh->rpmb_fat_address = partition_data->fat_start_address;
2069 
2070 	/* Write init FAT entry and partition data to RPMB. */
2071 	res = write_fat_entry(fh, true);
2072 	if (res != TEE_SUCCESS)
2073 		goto out;
2074 
2075 	res =
2076 	    tee_rpmb_get_write_counter(CFG_RPMB_FS_DEV_ID,
2077 				       &partition_data->write_counter);
2078 	if (res != TEE_SUCCESS)
2079 		goto out;
2080 	res = tee_rpmb_write(CFG_RPMB_FS_DEV_ID, RPMB_STORAGE_START_ADDRESS,
2081 			     (uint8_t *)partition_data,
2082 			     sizeof(struct rpmb_fs_partition), NULL, NULL);
2083 
2084 #ifndef CFG_RPMB_RESET_FAT
2085 store_fs_par:
2086 #endif
2087 
2088 	/* Store FAT start address. */
2089 	fs_par = calloc(1, sizeof(struct rpmb_fs_parameters));
2090 	if (!fs_par) {
2091 		res = TEE_ERROR_OUT_OF_MEMORY;
2092 		goto out;
2093 	}
2094 
2095 	fs_par->fat_start_address = partition_data->fat_start_address;
2096 	fs_par->max_rpmb_address = max_rpmb_block << RPMB_BLOCK_SIZE_SHIFT;
2097 
2098 	dump_fat();
2099 
2100 out:
2101 	free(fh);
2102 	free(partition_data);
2103 	return res;
2104 }
2105 
2106 /**
2107  * get_fat_start_address:
2108  * FAT start_address from fs_par.
2109  */
2110 static TEE_Result get_fat_start_address(uint32_t *addr)
2111 {
2112 	if (!fs_par)
2113 		return TEE_ERROR_NO_DATA;
2114 
2115 	*addr = fs_par->fat_start_address;
2116 
2117 	return TEE_SUCCESS;
2118 }
2119 
2120 /**
2121  * read_fat: Read FAT entries
2122  * Return matching FAT entry for read, rm rename and stat.
2123  * Build up memory pool and return matching entry for write operation.
2124  * "Last FAT entry" can be returned during write.
2125  */
2126 static TEE_Result read_fat(struct rpmb_file_handle *fh, tee_mm_pool_t *p)
2127 {
2128 	TEE_Result res = TEE_ERROR_GENERIC;
2129 	tee_mm_entry_t *mm = NULL;
2130 	struct rpmb_fat_entry *fe = NULL;
2131 	uint32_t fat_address;
2132 	bool entry_found = false;
2133 	bool expand_fat = false;
2134 	struct rpmb_file_handle last_fh;
2135 
2136 	DMSG("fat_address %d", fh->rpmb_fat_address);
2137 
2138 	res = fat_entry_dir_init();
2139 	if (res)
2140 		goto out;
2141 
2142 	/*
2143 	 * The pool is used to represent the current RPMB layout. To find
2144 	 * a slot for the file tee_mm_alloc is called on the pool. Thus
2145 	 * if it is not NULL the entire FAT must be traversed to fill in
2146 	 * the pool.
2147 	 */
2148 	while (true) {
2149 		res = fat_entry_dir_get_next(&fe, &fat_address);
2150 		if (res || !fe)
2151 			break;
2152 
2153 		/*
2154 		 * Look for an entry, matching filenames. (read, rm,
2155 		 * rename and stat.). Only store first filename match.
2156 		 */
2157 		if ((!strcmp(fh->filename, fe->filename)) &&
2158 		    (fe->flags & FILE_IS_ACTIVE) && !entry_found) {
2159 			entry_found = true;
2160 			fh->rpmb_fat_address = fat_address;
2161 			memcpy(&fh->fat_entry, fe, sizeof(*fe));
2162 			if (!p)
2163 				break;
2164 		}
2165 
2166 		/* Add existing files to memory pool. (write) */
2167 		if (p) {
2168 			if ((fe->flags & FILE_IS_ACTIVE) && fe->data_size > 0) {
2169 
2170 				mm = tee_mm_alloc2(p, fe->start_address,
2171 						   fe->data_size);
2172 				if (!mm) {
2173 					res = TEE_ERROR_OUT_OF_MEMORY;
2174 					goto out;
2175 				}
2176 			}
2177 
2178 			/* Unused FAT entries can be reused (write) */
2179 			if (((fe->flags & FILE_IS_ACTIVE) == 0) &&
2180 			    fh->rpmb_fat_address == 0) {
2181 				fh->rpmb_fat_address = fat_address;
2182 				memcpy(&fh->fat_entry, fe,
2183 				       sizeof(struct rpmb_fat_entry));
2184 			}
2185 
2186 			if (((fe->flags & FILE_IS_LAST_ENTRY) != 0) &&
2187 			    fh->rpmb_fat_address == fat_address) {
2188 
2189 				/*
2190 				 * If the last entry was reached and was chosen
2191 				 * by the previous check, then the FAT needs to
2192 				 * be expanded.
2193 				 * fh->rpmb_fat_address is the address chosen
2194 				 * to store the files FAT entry and fat_address
2195 				 * is the current FAT entry address being
2196 				 * compared.
2197 				 */
2198 				expand_fat = true;
2199 			}
2200 		}
2201 	}
2202 
2203 	if (res)
2204 		goto out;
2205 	/*
2206 	 * Represent the FAT table in the pool.
2207 	 */
2208 	if (p) {
2209 		/*
2210 		 * Since fat_address is the start of the last entry it needs to
2211 		 * be moved up by an entry.
2212 		 */
2213 		fat_address += sizeof(struct rpmb_fat_entry);
2214 
2215 		/* Make room for yet a FAT entry and add to memory pool. */
2216 		if (expand_fat)
2217 			fat_address += sizeof(struct rpmb_fat_entry);
2218 
2219 		mm = tee_mm_alloc2(p, RPMB_STORAGE_START_ADDRESS, fat_address);
2220 		if (!mm) {
2221 			res = TEE_ERROR_OUT_OF_MEMORY;
2222 			goto out;
2223 		}
2224 
2225 		if (expand_fat) {
2226 			/*
2227 			 * Point fat_address to the beginning of the new
2228 			 * entry.
2229 			 */
2230 			fat_address -= sizeof(struct rpmb_fat_entry);
2231 			memset(&last_fh, 0, sizeof(last_fh));
2232 			last_fh.fat_entry.flags = FILE_IS_LAST_ENTRY;
2233 			last_fh.rpmb_fat_address = fat_address;
2234 			res = write_fat_entry(&last_fh, true);
2235 			if (res != TEE_SUCCESS)
2236 				goto out;
2237 		}
2238 	}
2239 
2240 	if (!fh->rpmb_fat_address)
2241 		res = TEE_ERROR_ITEM_NOT_FOUND;
2242 
2243 out:
2244 	fat_entry_dir_deinit();
2245 	return res;
2246 }
2247 
2248 static TEE_Result generate_fek(struct rpmb_fat_entry *fe, const TEE_UUID *uuid)
2249 {
2250 	TEE_Result res;
2251 
2252 again:
2253 	res = tee_fs_generate_fek(uuid, fe->fek, sizeof(fe->fek));
2254 	if (res != TEE_SUCCESS)
2255 		return res;
2256 
2257 	if (is_zero(fe->fek, sizeof(fe->fek)))
2258 		goto again;
2259 
2260 	return res;
2261 }
2262 
2263 static TEE_Result rpmb_fs_open_internal(struct rpmb_file_handle *fh,
2264 					const TEE_UUID *uuid, bool create)
2265 {
2266 	tee_mm_pool_t p;
2267 	bool pool_result;
2268 	TEE_Result res = TEE_ERROR_GENERIC;
2269 
2270 	/* We need to do setup in order to make sure fs_par is filled in */
2271 	res = rpmb_fs_setup();
2272 	if (res != TEE_SUCCESS)
2273 		goto out;
2274 
2275 	fh->uuid = uuid;
2276 	if (create) {
2277 		/* Upper memory allocation must be used for RPMB_FS. */
2278 		pool_result = tee_mm_init(&p,
2279 					  RPMB_STORAGE_START_ADDRESS,
2280 					  fs_par->max_rpmb_address,
2281 					  RPMB_BLOCK_SIZE_SHIFT,
2282 					  TEE_MM_POOL_HI_ALLOC);
2283 
2284 		if (!pool_result) {
2285 			res = TEE_ERROR_OUT_OF_MEMORY;
2286 			goto out;
2287 		}
2288 
2289 		res = read_fat(fh, &p);
2290 		tee_mm_final(&p);
2291 		if (res != TEE_SUCCESS)
2292 			goto out;
2293 	} else {
2294 		res = read_fat(fh, NULL);
2295 		if (res != TEE_SUCCESS)
2296 			goto out;
2297 	}
2298 
2299 	/*
2300 	 * If this is opened with create and the entry found was not active
2301 	 * then this is a new file and the FAT entry must be written
2302 	 */
2303 	if (create) {
2304 		if ((fh->fat_entry.flags & FILE_IS_ACTIVE) == 0) {
2305 			memset(&fh->fat_entry, 0,
2306 				sizeof(struct rpmb_fat_entry));
2307 			memcpy(fh->fat_entry.filename, fh->filename,
2308 				strlen(fh->filename));
2309 			/* Start address and size are 0 */
2310 			fh->fat_entry.flags = FILE_IS_ACTIVE;
2311 
2312 			res = generate_fek(&fh->fat_entry, uuid);
2313 			if (res != TEE_SUCCESS)
2314 				goto out;
2315 			DMSG("GENERATE FEK key: %p",
2316 			     (void *)fh->fat_entry.fek);
2317 			DHEXDUMP(fh->fat_entry.fek, sizeof(fh->fat_entry.fek));
2318 
2319 			res = write_fat_entry(fh, true);
2320 			if (res != TEE_SUCCESS)
2321 				goto out;
2322 		}
2323 	}
2324 
2325 	res = TEE_SUCCESS;
2326 
2327 out:
2328 	return res;
2329 }
2330 
2331 static void rpmb_fs_close(struct tee_file_handle **tfh)
2332 {
2333 	struct rpmb_file_handle *fh = (struct rpmb_file_handle *)*tfh;
2334 
2335 	free(fh);
2336 	*tfh = NULL;
2337 }
2338 
2339 static TEE_Result rpmb_fs_read(struct tee_file_handle *tfh, size_t pos,
2340 			       void *buf, size_t *len)
2341 {
2342 	TEE_Result res;
2343 	struct rpmb_file_handle *fh = (struct rpmb_file_handle *)tfh;
2344 	size_t size = *len;
2345 
2346 	if (!size)
2347 		return TEE_SUCCESS;
2348 
2349 	mutex_lock(&rpmb_mutex);
2350 
2351 	dump_fh(fh);
2352 
2353 	res = read_fat(fh, NULL);
2354 	if (res != TEE_SUCCESS)
2355 		goto out;
2356 
2357 	if (pos >= fh->fat_entry.data_size) {
2358 		*len = 0;
2359 		goto out;
2360 	}
2361 
2362 	size = MIN(size, fh->fat_entry.data_size - pos);
2363 	if (size) {
2364 		res = tee_rpmb_read(CFG_RPMB_FS_DEV_ID,
2365 				    fh->fat_entry.start_address + pos, buf,
2366 				    size, fh->fat_entry.fek, fh->uuid);
2367 		if (res != TEE_SUCCESS)
2368 			goto out;
2369 	}
2370 	*len = size;
2371 
2372 out:
2373 	mutex_unlock(&rpmb_mutex);
2374 	return res;
2375 }
2376 
2377 static TEE_Result update_write_helper(struct rpmb_file_handle *fh,
2378 				      size_t pos, const void *buf,
2379 				      size_t size, uintptr_t new_fat,
2380 				      size_t new_size)
2381 {
2382 	uintptr_t old_fat = fh->fat_entry.start_address;
2383 	size_t old_size = fh->fat_entry.data_size;
2384 	const uint8_t *rem_buf = buf;
2385 	size_t rem_size = size;
2386 	uint8_t *blk_buf = NULL;
2387 	size_t blk_offset = 0;
2388 	size_t blk_size = 0;
2389 	TEE_Result res = TEE_SUCCESS;
2390 
2391 	blk_buf = mempool_alloc(mempool_default, TMP_BLOCK_SIZE);
2392 	if (!blk_buf)
2393 		return TEE_ERROR_OUT_OF_MEMORY;
2394 
2395 	while (blk_offset < new_size) {
2396 		uint8_t *copy_dst = blk_buf;
2397 		size_t copy_size = 0;
2398 		size_t rd_size = 0;
2399 
2400 		blk_size = MIN(TMP_BLOCK_SIZE, new_size - blk_offset);
2401 		memset(blk_buf, 0, blk_size);
2402 
2403 		/* Possibly read old RPMB data in temporary buffer */
2404 		if (blk_offset < pos && blk_offset < old_size) {
2405 			rd_size = MIN(blk_size, old_size - blk_offset);
2406 
2407 			res = tee_rpmb_read(CFG_RPMB_FS_DEV_ID,
2408 					    old_fat + blk_offset, blk_buf,
2409 					    rd_size, fh->fat_entry.fek,
2410 					    fh->uuid);
2411 			if (res != TEE_SUCCESS)
2412 				break;
2413 		}
2414 
2415 		/* Possibly update data in temporary buffer */
2416 		if ((blk_offset + TMP_BLOCK_SIZE > pos) &&
2417 		    (blk_offset < pos + size)) {
2418 			size_t offset = 0;
2419 
2420 			copy_dst = blk_buf;
2421 			copy_size = TMP_BLOCK_SIZE;
2422 
2423 			if (blk_offset < pos) {
2424 				offset = pos - blk_offset;
2425 
2426 				copy_dst += offset;
2427 				copy_size -= offset;
2428 			}
2429 			copy_size = MIN(copy_size, rem_size);
2430 
2431 			memcpy(copy_dst, rem_buf, copy_size);
2432 			rem_buf += copy_size;
2433 			rem_size -= copy_size;
2434 		}
2435 
2436 		/* Write temporary buffer to new RPMB destination */
2437 		res = tee_rpmb_write(CFG_RPMB_FS_DEV_ID, new_fat + blk_offset,
2438 				     blk_buf, blk_size,
2439 				     fh->fat_entry.fek, fh->uuid);
2440 		if (res != TEE_SUCCESS)
2441 			break;
2442 
2443 		blk_offset += blk_size;
2444 	}
2445 
2446 	mempool_free(mempool_default, blk_buf);
2447 
2448 	return res;
2449 }
2450 
2451 static TEE_Result rpmb_fs_write_primitive(struct rpmb_file_handle *fh,
2452 					  size_t pos, const void *buf,
2453 					  size_t size)
2454 {
2455 	TEE_Result res = TEE_ERROR_GENERIC;
2456 	tee_mm_pool_t p = { };
2457 	bool pool_result = false;
2458 	size_t end = 0;
2459 	uint32_t start_addr = 0;
2460 
2461 	if (!size)
2462 		return TEE_SUCCESS;
2463 
2464 	if (!fs_par) {
2465 		res = TEE_ERROR_GENERIC;
2466 		goto out;
2467 	}
2468 
2469 	dump_fh(fh);
2470 
2471 	/* Upper memory allocation must be used for RPMB_FS. */
2472 	pool_result = tee_mm_init(&p,
2473 				  RPMB_STORAGE_START_ADDRESS,
2474 				  fs_par->max_rpmb_address,
2475 				  RPMB_BLOCK_SIZE_SHIFT,
2476 				  TEE_MM_POOL_HI_ALLOC);
2477 	if (!pool_result) {
2478 		res = TEE_ERROR_OUT_OF_MEMORY;
2479 		goto out;
2480 	}
2481 
2482 	res = read_fat(fh, &p);
2483 	if (res != TEE_SUCCESS)
2484 		goto out;
2485 
2486 	if (fh->fat_entry.flags & FILE_IS_LAST_ENTRY)
2487 		panic("invalid last entry flag");
2488 
2489 	if (ADD_OVERFLOW(pos, size, &end)) {
2490 		res = TEE_ERROR_BAD_PARAMETERS;
2491 		goto out;
2492 	}
2493 	if (ADD_OVERFLOW(fh->fat_entry.start_address, pos, &start_addr)) {
2494 		res = TEE_ERROR_BAD_PARAMETERS;
2495 		goto out;
2496 	}
2497 
2498 	if (end <= fh->fat_entry.data_size &&
2499 	    tee_rpmb_write_is_atomic(CFG_RPMB_FS_DEV_ID, start_addr, size)) {
2500 
2501 		DMSG("Updating data in-place");
2502 		res = tee_rpmb_write(CFG_RPMB_FS_DEV_ID, start_addr, buf,
2503 				     size, fh->fat_entry.fek, fh->uuid);
2504 	} else {
2505 		/*
2506 		 * File must be extended, or update cannot be atomic: allocate,
2507 		 * read, update, write.
2508 		 */
2509 		size_t new_size = MAX(end, fh->fat_entry.data_size);
2510 		tee_mm_entry_t *mm = tee_mm_alloc(&p, new_size);
2511 		uintptr_t new_fat_entry = 0;
2512 
2513 		DMSG("Need to re-allocate");
2514 		if (!mm) {
2515 			DMSG("RPMB: No space left");
2516 			res = TEE_ERROR_STORAGE_NO_SPACE;
2517 			goto out;
2518 		}
2519 
2520 		new_fat_entry = tee_mm_get_smem(mm);
2521 
2522 		res = update_write_helper(fh, pos, buf, size,
2523 					  new_fat_entry, new_size);
2524 		if (res == TEE_SUCCESS) {
2525 			fh->fat_entry.data_size = new_size;
2526 			fh->fat_entry.start_address = new_fat_entry;
2527 
2528 			res = write_fat_entry(fh, true);
2529 		}
2530 	}
2531 
2532 out:
2533 	if (pool_result)
2534 		tee_mm_final(&p);
2535 
2536 	return res;
2537 }
2538 
2539 static TEE_Result rpmb_fs_write(struct tee_file_handle *tfh, size_t pos,
2540 				const void *buf, size_t size)
2541 {
2542 	TEE_Result res;
2543 
2544 	mutex_lock(&rpmb_mutex);
2545 	res = rpmb_fs_write_primitive((struct rpmb_file_handle *)tfh, pos,
2546 				      buf, size);
2547 	mutex_unlock(&rpmb_mutex);
2548 
2549 	return res;
2550 }
2551 
2552 static TEE_Result rpmb_fs_remove_internal(struct rpmb_file_handle *fh)
2553 {
2554 	TEE_Result res;
2555 
2556 	res = read_fat(fh, NULL);
2557 	if (res)
2558 		return res;
2559 
2560 	/* Clear this file entry. */
2561 	memset(&fh->fat_entry, 0, sizeof(struct rpmb_fat_entry));
2562 	return write_fat_entry(fh, false);
2563 }
2564 
2565 static TEE_Result rpmb_fs_remove(struct tee_pobj *po)
2566 {
2567 	TEE_Result res;
2568 	struct rpmb_file_handle *fh = alloc_file_handle(po, po->temporary);
2569 
2570 	if (!fh)
2571 		return TEE_ERROR_OUT_OF_MEMORY;
2572 
2573 	mutex_lock(&rpmb_mutex);
2574 
2575 	res = rpmb_fs_remove_internal(fh);
2576 
2577 	mutex_unlock(&rpmb_mutex);
2578 
2579 	free(fh);
2580 	return res;
2581 }
2582 
2583 static  TEE_Result rpmb_fs_rename_internal(struct tee_pobj *old,
2584 					   struct tee_pobj *new,
2585 					   bool overwrite)
2586 {
2587 	TEE_Result res = TEE_ERROR_GENERIC;
2588 	struct rpmb_file_handle *fh_old = NULL;
2589 	struct rpmb_file_handle *fh_new = NULL;
2590 
2591 	if (!old) {
2592 		res = TEE_ERROR_BAD_PARAMETERS;
2593 		goto out;
2594 	}
2595 
2596 	if (new)
2597 		fh_old = alloc_file_handle(old, old->temporary);
2598 	else
2599 		fh_old = alloc_file_handle(old, true);
2600 	if (!fh_old) {
2601 		res = TEE_ERROR_OUT_OF_MEMORY;
2602 		goto out;
2603 	}
2604 
2605 	if (new)
2606 		fh_new = alloc_file_handle(new, new->temporary);
2607 	else
2608 		fh_new = alloc_file_handle(old, false);
2609 	if (!fh_new) {
2610 		res = TEE_ERROR_OUT_OF_MEMORY;
2611 		goto out;
2612 	}
2613 
2614 	res = read_fat(fh_old, NULL);
2615 	if (res != TEE_SUCCESS)
2616 		goto out;
2617 
2618 	res = read_fat(fh_new, NULL);
2619 	if (res == TEE_SUCCESS) {
2620 		if (!overwrite) {
2621 			res = TEE_ERROR_ACCESS_CONFLICT;
2622 			goto out;
2623 		}
2624 
2625 		/* Clear this file entry. */
2626 		memset(&fh_new->fat_entry, 0, sizeof(struct rpmb_fat_entry));
2627 		res = write_fat_entry(fh_new, false);
2628 		if (res != TEE_SUCCESS)
2629 			goto out;
2630 	}
2631 
2632 	memset(fh_old->fat_entry.filename, 0, TEE_RPMB_FS_FILENAME_LENGTH);
2633 	memcpy(fh_old->fat_entry.filename, fh_new->filename,
2634 	       strlen(fh_new->filename));
2635 
2636 	res = write_fat_entry(fh_old, false);
2637 
2638 out:
2639 	free(fh_old);
2640 	free(fh_new);
2641 
2642 	return res;
2643 }
2644 
2645 static  TEE_Result rpmb_fs_rename(struct tee_pobj *old, struct tee_pobj *new,
2646 				  bool overwrite)
2647 {
2648 	TEE_Result res;
2649 
2650 	mutex_lock(&rpmb_mutex);
2651 	res = rpmb_fs_rename_internal(old, new, overwrite);
2652 	mutex_unlock(&rpmb_mutex);
2653 
2654 	return res;
2655 }
2656 
2657 static TEE_Result rpmb_fs_truncate(struct tee_file_handle *tfh, size_t length)
2658 {
2659 	struct rpmb_file_handle *fh = (struct rpmb_file_handle *)tfh;
2660 	tee_mm_pool_t p;
2661 	bool pool_result = false;
2662 	tee_mm_entry_t *mm;
2663 	uint32_t newsize;
2664 	uint8_t *newbuf = NULL;
2665 	uintptr_t newaddr;
2666 	TEE_Result res = TEE_ERROR_GENERIC;
2667 
2668 	mutex_lock(&rpmb_mutex);
2669 
2670 	if (length > INT32_MAX) {
2671 		res = TEE_ERROR_BAD_PARAMETERS;
2672 		goto out;
2673 	}
2674 	newsize = length;
2675 
2676 	res = read_fat(fh, NULL);
2677 	if (res != TEE_SUCCESS)
2678 		goto out;
2679 
2680 	if (newsize > fh->fat_entry.data_size) {
2681 		/* Extend file */
2682 
2683 		pool_result = tee_mm_init(&p,
2684 					  RPMB_STORAGE_START_ADDRESS,
2685 					  fs_par->max_rpmb_address,
2686 					  RPMB_BLOCK_SIZE_SHIFT,
2687 					  TEE_MM_POOL_HI_ALLOC);
2688 		if (!pool_result) {
2689 			res = TEE_ERROR_OUT_OF_MEMORY;
2690 			goto out;
2691 		}
2692 		res = read_fat(fh, &p);
2693 		if (res != TEE_SUCCESS)
2694 			goto out;
2695 
2696 		mm = tee_mm_alloc(&p, newsize);
2697 		newbuf = calloc(1, newsize);
2698 		if (!mm || !newbuf) {
2699 			res = TEE_ERROR_OUT_OF_MEMORY;
2700 			goto out;
2701 		}
2702 
2703 		if (fh->fat_entry.data_size) {
2704 			res = tee_rpmb_read(CFG_RPMB_FS_DEV_ID,
2705 					    fh->fat_entry.start_address,
2706 					    newbuf, fh->fat_entry.data_size,
2707 					    fh->fat_entry.fek, fh->uuid);
2708 			if (res != TEE_SUCCESS)
2709 				goto out;
2710 		}
2711 
2712 		newaddr = tee_mm_get_smem(mm);
2713 		res = tee_rpmb_write(CFG_RPMB_FS_DEV_ID, newaddr, newbuf,
2714 				     newsize, fh->fat_entry.fek, fh->uuid);
2715 		if (res != TEE_SUCCESS)
2716 			goto out;
2717 
2718 	} else {
2719 		/* Don't change file location */
2720 		newaddr = fh->fat_entry.start_address;
2721 	}
2722 
2723 	/* fh->pos is unchanged */
2724 	fh->fat_entry.data_size = newsize;
2725 	fh->fat_entry.start_address = newaddr;
2726 	res = write_fat_entry(fh, true);
2727 
2728 out:
2729 	mutex_unlock(&rpmb_mutex);
2730 	if (pool_result)
2731 		tee_mm_final(&p);
2732 	if (newbuf)
2733 		free(newbuf);
2734 
2735 	return res;
2736 }
2737 
2738 static void rpmb_fs_dir_free(struct tee_fs_dir *dir)
2739 {
2740 	struct tee_rpmb_fs_dirent *e;
2741 
2742 	if (!dir)
2743 		return;
2744 
2745 	free(dir->current);
2746 
2747 	while ((e = SIMPLEQ_FIRST(&dir->next))) {
2748 		SIMPLEQ_REMOVE_HEAD(&dir->next, link);
2749 		free(e);
2750 	}
2751 }
2752 
2753 static TEE_Result rpmb_fs_dir_populate(const char *path,
2754 				       struct tee_fs_dir *dir)
2755 {
2756 	struct tee_rpmb_fs_dirent *current = NULL;
2757 	struct rpmb_fat_entry *fe = NULL;
2758 	uint32_t fat_address;
2759 	uint32_t filelen;
2760 	char *filename;
2761 	bool matched;
2762 	struct tee_rpmb_fs_dirent *next = NULL;
2763 	uint32_t pathlen;
2764 	TEE_Result res = TEE_ERROR_GENERIC;
2765 	char temp;
2766 
2767 	mutex_lock(&rpmb_mutex);
2768 
2769 	res = fat_entry_dir_init();
2770 	if (res)
2771 		goto out;
2772 
2773 	pathlen = strlen(path);
2774 
2775 	while (true) {
2776 		res = fat_entry_dir_get_next(&fe, &fat_address);
2777 		if (res || !fe)
2778 			break;
2779 
2780 		filename = fe->filename;
2781 		if (fe->flags & FILE_IS_ACTIVE) {
2782 			matched = false;
2783 			filelen = strlen(filename);
2784 			if (filelen > pathlen) {
2785 				temp = filename[pathlen];
2786 				filename[pathlen] = '\0';
2787 				if (strcmp(filename, path) == 0)
2788 					matched = true;
2789 
2790 				filename[pathlen] = temp;
2791 			}
2792 
2793 			if (matched) {
2794 				next = malloc(sizeof(*next));
2795 				if (!next) {
2796 					res = TEE_ERROR_OUT_OF_MEMORY;
2797 					goto out;
2798 				}
2799 
2800 				next->entry.oidlen = tee_hs2b((uint8_t *)
2801 						&filename[pathlen],
2802 						next->entry.oid,
2803 						filelen - pathlen,
2804 						sizeof(next->entry.oid));
2805 				if (next->entry.oidlen) {
2806 					SIMPLEQ_INSERT_TAIL(&dir->next,
2807 							    next, link);
2808 					current = next;
2809 				} else {
2810 					free(next);
2811 					next = NULL;
2812 				}
2813 			}
2814 		}
2815 	}
2816 
2817 	if (res)
2818 		goto out;
2819 
2820 	if (current)
2821 		res = TEE_SUCCESS;
2822 	else
2823 		res = TEE_ERROR_ITEM_NOT_FOUND; /* No directories were found. */
2824 
2825 out:
2826 	mutex_unlock(&rpmb_mutex);
2827 	fat_entry_dir_deinit();
2828 	if (res)
2829 		rpmb_fs_dir_free(dir);
2830 
2831 	return res;
2832 }
2833 
2834 static TEE_Result rpmb_fs_opendir(const TEE_UUID *uuid, struct tee_fs_dir **dir)
2835 {
2836 	uint32_t len;
2837 	char path_local[TEE_RPMB_FS_FILENAME_LENGTH];
2838 	TEE_Result res = TEE_ERROR_GENERIC;
2839 	struct tee_fs_dir *rpmb_dir = NULL;
2840 
2841 	if (!uuid || !dir) {
2842 		res = TEE_ERROR_BAD_PARAMETERS;
2843 		goto out;
2844 	}
2845 
2846 	memset(path_local, 0, sizeof(path_local));
2847 	if (tee_svc_storage_create_dirname(path_local, sizeof(path_local) - 1,
2848 					   uuid) != TEE_SUCCESS) {
2849 		res = TEE_ERROR_BAD_PARAMETERS;
2850 		goto out;
2851 	}
2852 	len = strlen(path_local);
2853 
2854 	/* Add a slash to correctly match the full directory name. */
2855 	if (path_local[len - 1] != '/')
2856 		path_local[len] = '/';
2857 
2858 	rpmb_dir = calloc(1, sizeof(*rpmb_dir));
2859 	if (!rpmb_dir) {
2860 		res = TEE_ERROR_OUT_OF_MEMORY;
2861 		goto out;
2862 	}
2863 	SIMPLEQ_INIT(&rpmb_dir->next);
2864 
2865 	res = rpmb_fs_dir_populate(path_local, rpmb_dir);
2866 	if (res != TEE_SUCCESS) {
2867 		free(rpmb_dir);
2868 		rpmb_dir = NULL;
2869 		goto out;
2870 	}
2871 
2872 	*dir = rpmb_dir;
2873 
2874 out:
2875 	return res;
2876 }
2877 
2878 static TEE_Result rpmb_fs_readdir(struct tee_fs_dir *dir,
2879 				  struct tee_fs_dirent **ent)
2880 {
2881 	if (!dir)
2882 		return TEE_ERROR_GENERIC;
2883 
2884 	free(dir->current);
2885 
2886 	dir->current = SIMPLEQ_FIRST(&dir->next);
2887 	if (!dir->current)
2888 		return TEE_ERROR_ITEM_NOT_FOUND;
2889 
2890 	SIMPLEQ_REMOVE_HEAD(&dir->next, link);
2891 
2892 	*ent = &dir->current->entry;
2893 	return TEE_SUCCESS;
2894 }
2895 
2896 static void rpmb_fs_closedir(struct tee_fs_dir *dir)
2897 {
2898 	if (dir) {
2899 		rpmb_fs_dir_free(dir);
2900 		free(dir);
2901 	}
2902 }
2903 
2904 static TEE_Result rpmb_fs_open(struct tee_pobj *po, size_t *size,
2905 			       struct tee_file_handle **ret_fh)
2906 {
2907 	TEE_Result res;
2908 	struct rpmb_file_handle *fh = alloc_file_handle(po, po->temporary);
2909 
2910 	if (!fh)
2911 		return TEE_ERROR_OUT_OF_MEMORY;
2912 
2913 	mutex_lock(&rpmb_mutex);
2914 
2915 	res = rpmb_fs_open_internal(fh, &po->uuid, false);
2916 	if (!res && size)
2917 		*size = fh->fat_entry.data_size;
2918 
2919 	mutex_unlock(&rpmb_mutex);
2920 
2921 	if (res)
2922 		free(fh);
2923 	else
2924 		*ret_fh = (struct tee_file_handle *)fh;
2925 
2926 	return res;
2927 }
2928 
2929 static TEE_Result rpmb_fs_create(struct tee_pobj *po, bool overwrite,
2930 				 const void *head, size_t head_size,
2931 				 const void *attr, size_t attr_size,
2932 				 const void *data, size_t data_size,
2933 				 struct tee_file_handle **ret_fh)
2934 {
2935 	TEE_Result res;
2936 	size_t pos = 0;
2937 	struct rpmb_file_handle *fh = alloc_file_handle(po, po->temporary);
2938 
2939 	if (!fh)
2940 		return TEE_ERROR_OUT_OF_MEMORY;
2941 
2942 	mutex_lock(&rpmb_mutex);
2943 	res = rpmb_fs_open_internal(fh, &po->uuid, true);
2944 	if (res)
2945 		goto out;
2946 
2947 	if (head && head_size) {
2948 		res = rpmb_fs_write_primitive(fh, pos, head, head_size);
2949 		if (res)
2950 			goto out;
2951 		pos += head_size;
2952 	}
2953 
2954 	if (attr && attr_size) {
2955 		res = rpmb_fs_write_primitive(fh, pos, attr, attr_size);
2956 		if (res)
2957 			goto out;
2958 		pos += attr_size;
2959 	}
2960 
2961 	if (data && data_size) {
2962 		res = rpmb_fs_write_primitive(fh, pos, data, data_size);
2963 		if (res)
2964 			goto out;
2965 	}
2966 
2967 	if (po->temporary) {
2968 		/*
2969 		 * If it's a temporary filename (which it normally is)
2970 		 * rename into the final filename now that the file is
2971 		 * fully initialized.
2972 		 */
2973 		po->temporary = false;
2974 		res = rpmb_fs_rename_internal(po, NULL, overwrite);
2975 		if (res) {
2976 			po->temporary = true;
2977 			goto out;
2978 		}
2979 		/* Update file handle after rename. */
2980 		tee_svc_storage_create_filename(fh->filename,
2981 						sizeof(fh->filename),
2982 						po, false);
2983 	}
2984 
2985 out:
2986 	if (res) {
2987 		rpmb_fs_remove_internal(fh);
2988 		free(fh);
2989 	} else {
2990 		*ret_fh = (struct tee_file_handle *)fh;
2991 	}
2992 	mutex_unlock(&rpmb_mutex);
2993 
2994 	return res;
2995 }
2996 
2997 const struct tee_file_operations rpmb_fs_ops = {
2998 	.open = rpmb_fs_open,
2999 	.create = rpmb_fs_create,
3000 	.close = rpmb_fs_close,
3001 	.read = rpmb_fs_read,
3002 	.write = rpmb_fs_write,
3003 	.truncate = rpmb_fs_truncate,
3004 	.rename = rpmb_fs_rename,
3005 	.remove = rpmb_fs_remove,
3006 	.opendir = rpmb_fs_opendir,
3007 	.closedir = rpmb_fs_closedir,
3008 	.readdir = rpmb_fs_readdir,
3009 };
3010 
3011 TEE_Result tee_rpmb_fs_raw_open(const char *fname, bool create,
3012 				struct tee_file_handle **ret_fh)
3013 {
3014 	TEE_Result res;
3015 	struct rpmb_file_handle *fh = calloc(1, sizeof(*fh));
3016 	static const TEE_UUID uuid = { 0 };
3017 
3018 	if (!fh)
3019 		return TEE_ERROR_OUT_OF_MEMORY;
3020 
3021 	snprintf(fh->filename, sizeof(fh->filename), "/%s", fname);
3022 
3023 	mutex_lock(&rpmb_mutex);
3024 
3025 	res = rpmb_fs_open_internal(fh, &uuid, create);
3026 
3027 	mutex_unlock(&rpmb_mutex);
3028 
3029 	if (res) {
3030 		if (create)
3031 			rpmb_fs_remove_internal(fh);
3032 		free(fh);
3033 	} else {
3034 		*ret_fh = (struct tee_file_handle *)fh;
3035 	}
3036 
3037 	return res;
3038 }
3039 
3040 bool __weak plat_rpmb_key_is_ready(void)
3041 {
3042 	return true;
3043 }
3044