162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *   Copyright (C) 2021 Samsung Electronics Co., Ltd.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef __XATTR_H__
762306a36Sopenharmony_ci#define __XATTR_H__
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci/*
1062306a36Sopenharmony_ci * These are on-disk structures to store additional metadata into xattr to
1162306a36Sopenharmony_ci * reproduce windows filesystem semantics. And they are encoded with NDR to
1262306a36Sopenharmony_ci * compatible with samba's xattr meta format. The compatibility with samba
1362306a36Sopenharmony_ci * is important because it can lose the information(file attribute,
1462306a36Sopenharmony_ci * creation time, acls) about the existing files when switching between
1562306a36Sopenharmony_ci * ksmbd and samba.
1662306a36Sopenharmony_ci */
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci/*
1962306a36Sopenharmony_ci * Dos attribute flags used for what variable is valid.
2062306a36Sopenharmony_ci */
2162306a36Sopenharmony_cienum {
2262306a36Sopenharmony_ci	XATTR_DOSINFO_ATTRIB		= 0x00000001,
2362306a36Sopenharmony_ci	XATTR_DOSINFO_EA_SIZE		= 0x00000002,
2462306a36Sopenharmony_ci	XATTR_DOSINFO_SIZE		= 0x00000004,
2562306a36Sopenharmony_ci	XATTR_DOSINFO_ALLOC_SIZE	= 0x00000008,
2662306a36Sopenharmony_ci	XATTR_DOSINFO_CREATE_TIME	= 0x00000010,
2762306a36Sopenharmony_ci	XATTR_DOSINFO_CHANGE_TIME	= 0x00000020,
2862306a36Sopenharmony_ci	XATTR_DOSINFO_ITIME		= 0x00000040
2962306a36Sopenharmony_ci};
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci/*
3262306a36Sopenharmony_ci * Dos attribute structure which is compatible with samba's one.
3362306a36Sopenharmony_ci * Storing it into the xattr named "DOSATTRIB" separately from inode
3462306a36Sopenharmony_ci * allows ksmbd to faithfully reproduce windows filesystem semantics
3562306a36Sopenharmony_ci * on top of a POSIX filesystem.
3662306a36Sopenharmony_ci */
3762306a36Sopenharmony_cistruct xattr_dos_attrib {
3862306a36Sopenharmony_ci	__u16	version;	/* version 3 or version 4 */
3962306a36Sopenharmony_ci	__u32	flags;		/* valid flags */
4062306a36Sopenharmony_ci	__u32	attr;		/* Dos attribute */
4162306a36Sopenharmony_ci	__u32	ea_size;	/* EA size */
4262306a36Sopenharmony_ci	__u64	size;
4362306a36Sopenharmony_ci	__u64	alloc_size;
4462306a36Sopenharmony_ci	__u64	create_time;	/* File creation time */
4562306a36Sopenharmony_ci	__u64	change_time;	/* File change time */
4662306a36Sopenharmony_ci	__u64	itime;		/* Invented/Initial time */
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci/*
5062306a36Sopenharmony_ci * Enumeration is used for computing posix acl hash.
5162306a36Sopenharmony_ci */
5262306a36Sopenharmony_cienum {
5362306a36Sopenharmony_ci	SMB_ACL_TAG_INVALID = 0,
5462306a36Sopenharmony_ci	SMB_ACL_USER,
5562306a36Sopenharmony_ci	SMB_ACL_USER_OBJ,
5662306a36Sopenharmony_ci	SMB_ACL_GROUP,
5762306a36Sopenharmony_ci	SMB_ACL_GROUP_OBJ,
5862306a36Sopenharmony_ci	SMB_ACL_OTHER,
5962306a36Sopenharmony_ci	SMB_ACL_MASK
6062306a36Sopenharmony_ci};
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci#define SMB_ACL_READ			4
6362306a36Sopenharmony_ci#define SMB_ACL_WRITE			2
6462306a36Sopenharmony_ci#define SMB_ACL_EXECUTE			1
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistruct xattr_acl_entry {
6762306a36Sopenharmony_ci	int type;
6862306a36Sopenharmony_ci	uid_t uid;
6962306a36Sopenharmony_ci	gid_t gid;
7062306a36Sopenharmony_ci	mode_t perm;
7162306a36Sopenharmony_ci};
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci/*
7462306a36Sopenharmony_ci * xattr_smb_acl structure is used for computing posix acl hash.
7562306a36Sopenharmony_ci */
7662306a36Sopenharmony_cistruct xattr_smb_acl {
7762306a36Sopenharmony_ci	int count;
7862306a36Sopenharmony_ci	int next;
7962306a36Sopenharmony_ci	struct xattr_acl_entry entries[];
8062306a36Sopenharmony_ci};
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci/* 64bytes hash in xattr_ntacl is computed with sha256 */
8362306a36Sopenharmony_ci#define XATTR_SD_HASH_TYPE_SHA256	0x1
8462306a36Sopenharmony_ci#define XATTR_SD_HASH_SIZE		64
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci/*
8762306a36Sopenharmony_ci * xattr_ntacl is used for storing ntacl and hashes.
8862306a36Sopenharmony_ci * Hash is used for checking valid posix acl and ntacl in xattr.
8962306a36Sopenharmony_ci */
9062306a36Sopenharmony_cistruct xattr_ntacl {
9162306a36Sopenharmony_ci	__u16	version; /* version 4*/
9262306a36Sopenharmony_ci	void	*sd_buf;
9362306a36Sopenharmony_ci	__u32	sd_size;
9462306a36Sopenharmony_ci	__u16	hash_type; /* hash type */
9562306a36Sopenharmony_ci	__u8	desc[10]; /* posix_acl description */
9662306a36Sopenharmony_ci	__u16	desc_len;
9762306a36Sopenharmony_ci	__u64	current_time;
9862306a36Sopenharmony_ci	__u8	hash[XATTR_SD_HASH_SIZE]; /* 64bytes hash for ntacl */
9962306a36Sopenharmony_ci	__u8	posix_acl_hash[XATTR_SD_HASH_SIZE]; /* 64bytes hash for posix acl */
10062306a36Sopenharmony_ci};
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci/* DOS ATTRIBUITE XATTR PREFIX */
10362306a36Sopenharmony_ci#define DOS_ATTRIBUTE_PREFIX		"DOSATTRIB"
10462306a36Sopenharmony_ci#define DOS_ATTRIBUTE_PREFIX_LEN	(sizeof(DOS_ATTRIBUTE_PREFIX) - 1)
10562306a36Sopenharmony_ci#define XATTR_NAME_DOS_ATTRIBUTE	(XATTR_USER_PREFIX DOS_ATTRIBUTE_PREFIX)
10662306a36Sopenharmony_ci#define XATTR_NAME_DOS_ATTRIBUTE_LEN	\
10762306a36Sopenharmony_ci		(sizeof(XATTR_USER_PREFIX DOS_ATTRIBUTE_PREFIX) - 1)
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci/* STREAM XATTR PREFIX */
11062306a36Sopenharmony_ci#define STREAM_PREFIX			"DosStream."
11162306a36Sopenharmony_ci#define STREAM_PREFIX_LEN		(sizeof(STREAM_PREFIX) - 1)
11262306a36Sopenharmony_ci#define XATTR_NAME_STREAM		(XATTR_USER_PREFIX STREAM_PREFIX)
11362306a36Sopenharmony_ci#define XATTR_NAME_STREAM_LEN		(sizeof(XATTR_NAME_STREAM) - 1)
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci/* SECURITY DESCRIPTOR(NTACL) XATTR PREFIX */
11662306a36Sopenharmony_ci#define SD_PREFIX			"NTACL"
11762306a36Sopenharmony_ci#define SD_PREFIX_LEN	(sizeof(SD_PREFIX) - 1)
11862306a36Sopenharmony_ci#define XATTR_NAME_SD	(XATTR_SECURITY_PREFIX SD_PREFIX)
11962306a36Sopenharmony_ci#define XATTR_NAME_SD_LEN	\
12062306a36Sopenharmony_ci		(sizeof(XATTR_SECURITY_PREFIX SD_PREFIX) - 1)
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci#endif /* __XATTR_H__ */
123