Lines Matching refs:ht
104 struct tee_fs_htree *ht; member
109 static TEE_Result rpc_read(struct tee_fs_htree *ht, enum tee_fs_htree_type type, in rpc_read() argument
117 res = ht->stor->rpc_read_init(ht->stor_aux, &op, type, idx, vers, &p); in rpc_read()
121 res = ht->stor->rpc_read_final(&op, &bytes); in rpc_read()
132 static TEE_Result rpc_read_head(struct tee_fs_htree *ht, size_t vers, in rpc_read_head() argument
135 return rpc_read(ht, TEE_FS_HTREE_TYPE_HEAD, 0, vers, in rpc_read_head()
139 static TEE_Result rpc_read_node(struct tee_fs_htree *ht, size_t node_id, in rpc_read_node() argument
143 return rpc_read(ht, TEE_FS_HTREE_TYPE_NODE, node_id - 1, vers, in rpc_read_node()
147 static TEE_Result rpc_write(struct tee_fs_htree *ht, in rpc_write() argument
155 res = ht->stor->rpc_write_init(ht->stor_aux, &op, type, idx, vers, &p); in rpc_write()
160 return ht->stor->rpc_write_final(&op); in rpc_write()
163 static TEE_Result rpc_write_head(struct tee_fs_htree *ht, size_t vers, in rpc_write_head() argument
166 return rpc_write(ht, TEE_FS_HTREE_TYPE_HEAD, 0, vers, in rpc_write_head()
170 static TEE_Result rpc_write_node(struct tee_fs_htree *ht, size_t node_id, in rpc_write_node() argument
174 return rpc_write(ht, TEE_FS_HTREE_TYPE_NODE, node_id - 1, vers, in rpc_write_node()
202 static TEE_Result htree_traverse_post_order(struct tee_fs_htree *ht, in htree_traverse_post_order() argument
205 struct traverse_arg targ = { ht, cb, arg }; in htree_traverse_post_order()
207 return traverse_post_order(&targ, &ht->root); in htree_traverse_post_order()
217 static struct htree_node *find_closest_node(struct tee_fs_htree *ht, in find_closest_node() argument
220 struct htree_node *node = &ht->root; in find_closest_node()
246 static struct htree_node *find_node(struct tee_fs_htree *ht, size_t node_id) in find_node() argument
248 struct htree_node *node = find_closest_node(ht, node_id); in find_node()
255 static TEE_Result get_node(struct tee_fs_htree *ht, bool create, in get_node() argument
262 node = find_closest_node(ht, node_id); in get_node()
280 node = find_closest_node(ht, n); in get_node()
296 if (node->id > ht->imeta.max_node_id) in get_node()
297 ht->imeta.max_node_id = node->id; in get_node()
321 static TEE_Result init_head_from_data(struct tee_fs_htree *ht, in init_head_from_data() argument
329 res = rpc_read_node(ht, 1, idx, &ht->root.node); in init_head_from_data()
333 if (!memcmp(ht->root.node.hash, hash, in init_head_from_data()
334 sizeof(ht->root.node.hash))) { in init_head_from_data()
335 res = rpc_read_head(ht, idx, &ht->head); in init_head_from_data()
348 res = rpc_read_head(ht, idx, head + idx); in init_head_from_data()
357 res = rpc_read_node(ht, 1, idx, &ht->root.node); in init_head_from_data()
361 ht->head = head[idx]; in init_head_from_data()
364 if (ht->head.counter < min_counter) in init_head_from_data()
367 ht->root.id = 1; in init_head_from_data()
372 static TEE_Result init_tree_from_data(struct tee_fs_htree *ht) in init_tree_from_data() argument
381 while (node_id <= ht->imeta.max_node_id) { in init_tree_from_data()
382 node = find_node(ht, node_id >> 1); in init_tree_from_data()
388 res = rpc_read_node(ht, node_id, committed_version, in init_tree_from_data()
393 res = get_node(ht, true, node_id, &nc); in init_tree_from_data()
443 struct tee_fs_htree *ht, in authenc_init() argument
456 iv = ht->head.iv; in authenc_init()
457 aad_len += sizeof(ht->head.counter); in authenc_init()
480 res = crypto_authenc_init(ctx, mode, ht->fek, TEE_FS_HTREE_FEK_SIZE, iv, in authenc_init()
492 res = crypto_authenc_update_aad(ctx, mode, ht->root.node.hash, in authenc_init()
498 (void *)&ht->head.counter, in authenc_init()
499 sizeof(ht->head.counter)); in authenc_init()
504 res = crypto_authenc_update_aad(ctx, mode, ht->head.enc_fek, in authenc_init()
563 static TEE_Result verify_root(struct tee_fs_htree *ht) in verify_root() argument
568 res = tee_fs_fek_crypt(ht->uuid, TEE_MODE_DECRYPT, ht->head.enc_fek, in verify_root()
569 sizeof(ht->fek), ht->fek); in verify_root()
573 res = authenc_init(&ctx, TEE_MODE_DECRYPT, ht, NULL, sizeof(ht->imeta)); in verify_root()
577 return authenc_decrypt_final(ctx, ht->head.tag, ht->head.imeta, in verify_root()
578 sizeof(ht->imeta), &ht->imeta); in verify_root()
591 res = calc_node_hash(node, &targ->ht->imeta.meta, ctx, digest); in verify_node()
599 static TEE_Result verify_tree(struct tee_fs_htree *ht) in verify_tree() argument
608 res = htree_traverse_post_order(ht, verify_node, ctx); in verify_tree()
614 static TEE_Result init_root_node(struct tee_fs_htree *ht) in init_root_node() argument
623 ht->root.id = 1; in init_root_node()
624 ht->root.dirty = true; in init_root_node()
626 res = calc_node_hash(&ht->root, &ht->imeta.meta, ctx, in init_root_node()
627 ht->root.node.hash); in init_root_node()
638 struct tee_fs_htree *ht = *ht_arg; in create_and_sync() local
643 if (!ht) in create_and_sync()
646 res = crypto_rng_read(ht->fek, sizeof(ht->fek)); in create_and_sync()
650 res = tee_fs_fek_crypt(ht->uuid, TEE_MODE_ENCRYPT, ht->fek, in create_and_sync()
651 sizeof(ht->fek), ht->head.enc_fek); in create_and_sync()
655 res = init_root_node(ht); in create_and_sync()
659 ht->dirty = true; in create_and_sync()
681 struct tee_fs_htree *ht = calloc(1, sizeof(*ht)); in tee_fs_htree_open() local
683 if (!ht) in tee_fs_htree_open()
686 ht->uuid = uuid; in tee_fs_htree_open()
687 ht->stor = stor; in tee_fs_htree_open()
688 ht->stor_aux = stor_aux; in tee_fs_htree_open()
691 res = create_and_sync(&ht, hash, min_counter); in tee_fs_htree_open()
693 res = init_head_from_data(ht, hash, min_counter); in tee_fs_htree_open()
702 if (ht_head_is_partially_done(&ht->head)) { in tee_fs_htree_open()
703 res = create_and_sync(&ht, hash, min_counter); in tee_fs_htree_open()
708 res = verify_root(ht); in tee_fs_htree_open()
712 res = init_tree_from_data(ht); in tee_fs_htree_open()
716 res = verify_tree(ht); in tee_fs_htree_open()
720 *ht_ret = ht; in tee_fs_htree_open()
722 tee_fs_htree_close(&ht); in tee_fs_htree_open()
726 struct tee_fs_htree_meta *tee_fs_htree_get_meta(struct tee_fs_htree *ht) in tee_fs_htree_get_meta() argument
728 return &ht->imeta.meta; in tee_fs_htree_get_meta()
731 void tee_fs_htree_meta_set_dirty(struct tee_fs_htree *ht) in tee_fs_htree_meta_set_dirty() argument
733 ht->dirty = true; in tee_fs_htree_meta_set_dirty()
734 ht->root.dirty = true; in tee_fs_htree_meta_set_dirty()
745 void tee_fs_htree_close(struct tee_fs_htree **ht) in tee_fs_htree_close() argument
747 if (!*ht) in tee_fs_htree_close()
749 htree_traverse_post_order(*ht, free_node, NULL); in tee_fs_htree_close()
750 free(*ht); in tee_fs_htree_close()
751 *ht = NULL; in tee_fs_htree_close()
782 vers = !(targ->ht->head.counter & 1); in htree_sync_node_to_storage()
783 meta = &targ->ht->imeta.meta; in htree_sync_node_to_storage()
793 return rpc_write_node(targ->ht, node->id, vers, &node->node); in htree_sync_node_to_storage()
796 static TEE_Result update_root(struct tee_fs_htree *ht) in update_root() argument
801 ht->head.counter++; in update_root()
803 res = authenc_init(&ctx, TEE_MODE_ENCRYPT, ht, NULL, sizeof(ht->imeta)); in update_root()
807 return authenc_encrypt_final(ctx, ht->head.tag, &ht->imeta, in update_root()
808 sizeof(ht->imeta), &ht->head.imeta); in update_root()
815 struct tee_fs_htree *ht = *ht_arg; in tee_fs_htree_sync_to_storage() local
818 if (!ht) in tee_fs_htree_sync_to_storage()
821 if (!ht->dirty) in tee_fs_htree_sync_to_storage()
828 res = htree_traverse_post_order(ht, htree_sync_node_to_storage, ctx); in tee_fs_htree_sync_to_storage()
833 res = update_root(ht); in tee_fs_htree_sync_to_storage()
837 res = rpc_write_head(ht, ht->head.counter & 1, &ht->head); in tee_fs_htree_sync_to_storage()
841 ht->dirty = false; in tee_fs_htree_sync_to_storage()
843 memcpy(hash, ht->root.node.hash, sizeof(ht->root.node.hash)); in tee_fs_htree_sync_to_storage()
845 *counter = ht->head.counter; in tee_fs_htree_sync_to_storage()
853 static TEE_Result get_block_node(struct tee_fs_htree *ht, bool create, in get_block_node() argument
859 res = get_node(ht, create, BLOCK_NUM_TO_NODE_ID(block_num), &nd); in get_block_node()
869 struct tee_fs_htree *ht = *ht_arg; in tee_fs_htree_write_block() local
877 if (!ht) in tee_fs_htree_write_block()
880 res = get_block_node(ht, true, block_num, &node); in tee_fs_htree_write_block()
888 res = ht->stor->rpc_write_init(ht->stor_aux, &op, in tee_fs_htree_write_block()
894 res = authenc_init(&ctx, TEE_MODE_ENCRYPT, ht, &node->node, in tee_fs_htree_write_block()
895 ht->stor->block_size); in tee_fs_htree_write_block()
899 ht->stor->block_size, enc_block); in tee_fs_htree_write_block()
903 res = ht->stor->rpc_write_final(&op); in tee_fs_htree_write_block()
909 ht->dirty = true; in tee_fs_htree_write_block()
919 struct tee_fs_htree *ht = *ht_arg; in tee_fs_htree_read_block() local
928 if (!ht) in tee_fs_htree_read_block()
931 res = get_block_node(ht, false, block_num, &node); in tee_fs_htree_read_block()
936 res = ht->stor->rpc_read_init(ht->stor_aux, &op, in tee_fs_htree_read_block()
942 res = ht->stor->rpc_read_final(&op, &len); in tee_fs_htree_read_block()
945 if (len != ht->stor->block_size) { in tee_fs_htree_read_block()
950 res = authenc_init(&ctx, TEE_MODE_DECRYPT, ht, &node->node, in tee_fs_htree_read_block()
951 ht->stor->block_size); in tee_fs_htree_read_block()
956 ht->stor->block_size, block); in tee_fs_htree_read_block()
965 struct tee_fs_htree *ht = *ht_arg; in tee_fs_htree_truncate() local
969 if (!ht) in tee_fs_htree_truncate()
972 while (node_id < ht->imeta.max_node_id) { in tee_fs_htree_truncate()
973 node = find_closest_node(ht, ht->imeta.max_node_id); in tee_fs_htree_truncate()
974 assert(node && node->id == ht->imeta.max_node_id); in tee_fs_htree_truncate()
980 ht->imeta.max_node_id--; in tee_fs_htree_truncate()
981 ht->dirty = true; in tee_fs_htree_truncate()