Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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);
}