static int pefs_node_lookup_key(struct pefs_mount *pm, struct vnode *lvp, struct vnode *ldvp, struct ucred *cred, struct pefs_tkey *ptk) { char *namebuf; char *encname; int error, encname_len, name_len; namebuf = malloc((MAXNAMLEN + 1)*2, M_PEFSBUF, M_WAITOK | M_ZERO); encname = namebuf + MAXNAMLEN + 1; encname_len = MAXNAMLEN + 1; error = pefs_node_lookup_name(lvp, ldvp, cred, encname, &encname_len); if (error != 0) { free(namebuf, M_PEFSBUF); return (error); } PEFSDEBUG("pefs_node_lookup_key: encname=%.*s\n", encname_len, encname); name_len = pefs_name_decrypt(NULL, pefs_rootkey(pm), ptk, encname, encname_len, namebuf, MAXNAMLEN + 1); if (name_len > 0) pefs_key_ref(ptk->ptk_key); else PEFSDEBUG("pefs_node_lookup_key: not found: %.*s\n", encname_len, encname); free(namebuf, M_PEFSBUF); return (error); }
struct pefs_dircache_entry * pefs_dircache_insert(struct pefs_dircache *pd, struct pefs_tkey *ptk, char const *name, size_t name_len, char const *encname, size_t encname_len) { struct pefs_dircache_listhead *head; struct pefs_dircache_entry *pde; MPASS(ptk->ptk_key != NULL); sx_assert(&pd->pd_lock, SA_XLOCKED); if (name_len == 0 || name_len >= sizeof(pde->pde_name) || encname_len == 0 || encname_len >= sizeof(pde->pde_encname)) panic("pefs: invalid file name length: %zd/%zd", name_len, encname_len); pde = uma_zalloc(dircache_entry_zone, M_WAITOK | M_ZERO); pde->pde_dircache = pd; pde->pde_tkey = *ptk; pefs_key_ref(pde->pde_tkey.ptk_key); pde->pde_namelen = name_len; memcpy(pde->pde_name, name, name_len); pde->pde_name[name_len] = '\0'; pde->pde_namehash = dircache_hashname(pd, pde->pde_name, pde->pde_namelen); pde->pde_encnamelen = encname_len; memcpy(pde->pde_encname, encname, encname_len); pde->pde_encname[encname_len] = '\0'; pde->pde_encnamehash = dircache_hashname(pd, pde->pde_encname, pde->pde_encnamelen); /* Insert into list and set pge_gen */ dircache_update(pde, 0); mtx_lock(&dircache_mtx); head = &dircache_tbl[pde->pde_namehash & pefs_dircache_hashmask]; LIST_INSERT_HEAD(head, pde, pde_hash_entry); head = &dircache_enctbl[pde->pde_encnamehash & pefs_dircache_hashmask]; LIST_INSERT_HEAD(head, pde, pde_enchash_entry); dircache_entries++; mtx_unlock(&dircache_mtx); PEFSDEBUG("pefs_dircache_insert: hash=%x enchash=%x: %s -> %s\n", pde->pde_namehash, pde->pde_encnamehash, pde->pde_name, pde->pde_encname); return (pde); }
static int pefs_node_init_knownkey(struct mount *mp, struct pefs_node *pn, void *context) { struct pefs_tkey *ptk = context; MPASS((pn->pn_flags & PN_HASKEY) == 0); if (ptk != NULL && ptk->ptk_key != NULL) { pn->pn_tkey = *ptk; pefs_key_ref(pn->pn_tkey.ptk_key); pn->pn_flags |= PN_HASKEY; } return (0); }