cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

smb2pdu.h (13808B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 *   Copyright (C) 2016 Namjae Jeon <linkinjeon@kernel.org>
      4 *   Copyright (C) 2018 Samsung Electronics Co., Ltd.
      5 */
      6
      7#ifndef _SMB2PDU_H
      8#define _SMB2PDU_H
      9
     10#include "ntlmssp.h"
     11#include "smbacl.h"
     12
     13/*Create Action Flags*/
     14#define FILE_SUPERSEDED                0x00000000
     15#define FILE_OPENED            0x00000001
     16#define FILE_CREATED           0x00000002
     17#define FILE_OVERWRITTEN       0x00000003
     18
     19/* SMB2 Max Credits */
     20#define SMB2_MAX_CREDITS		8192
     21
     22/* BB FIXME - analyze following length BB */
     23#define MAX_SMB2_HDR_SIZE 0x78 /* 4 len + 64 hdr + (2*24 wct) + 2 bct + 2 pad */
     24
     25#define SMB21_DEFAULT_IOSIZE	(1024 * 1024)
     26#define SMB3_DEFAULT_TRANS_SIZE	(1024 * 1024)
     27#define SMB3_MIN_IOSIZE	(64 * 1024)
     28#define SMB3_MAX_IOSIZE	(8 * 1024 * 1024)
     29
     30/*
     31 *	Definitions for SMB2 Protocol Data Units (network frames)
     32 *
     33 *  See MS-SMB2.PDF specification for protocol details.
     34 *  The Naming convention is the lower case version of the SMB2
     35 *  command code name for the struct. Note that structures must be packed.
     36 *
     37 */
     38
     39struct preauth_integrity_info {
     40	/* PreAuth integrity Hash ID */
     41	__le16			Preauth_HashId;
     42	/* PreAuth integrity Hash Value */
     43	__u8			Preauth_HashValue[SMB2_PREAUTH_HASH_SIZE];
     44};
     45
     46/* offset is sizeof smb2_negotiate_rsp but rounded up to 8 bytes. */
     47#ifdef CONFIG_SMB_SERVER_KERBEROS5
     48/* sizeof(struct smb2_negotiate_rsp) =
     49 * header(64) + response(64) + GSS_LENGTH(96) + GSS_PADDING(0)
     50 */
     51#define OFFSET_OF_NEG_CONTEXT	0xe0
     52#else
     53/* sizeof(struct smb2_negotiate_rsp) =
     54 * header(64) + response(64) + GSS_LENGTH(74) + GSS_PADDING(6)
     55 */
     56#define OFFSET_OF_NEG_CONTEXT	0xd0
     57#endif
     58
     59#define SMB2_SESSION_EXPIRED		(0)
     60#define SMB2_SESSION_IN_PROGRESS	BIT(0)
     61#define SMB2_SESSION_VALID		BIT(1)
     62
     63struct create_durable_req_v2 {
     64	struct create_context ccontext;
     65	__u8   Name[8];
     66	__le32 Timeout;
     67	__le32 Flags;
     68	__u8 Reserved[8];
     69	__u8 CreateGuid[16];
     70} __packed;
     71
     72struct create_durable_reconn_req {
     73	struct create_context ccontext;
     74	__u8   Name[8];
     75	union {
     76		__u8  Reserved[16];
     77		struct {
     78			__u64 PersistentFileId;
     79			__u64 VolatileFileId;
     80		} Fid;
     81	} Data;
     82} __packed;
     83
     84struct create_durable_reconn_v2_req {
     85	struct create_context ccontext;
     86	__u8   Name[8];
     87	struct {
     88		__u64 PersistentFileId;
     89		__u64 VolatileFileId;
     90	} Fid;
     91	__u8 CreateGuid[16];
     92	__le32 Flags;
     93} __packed;
     94
     95struct create_app_inst_id {
     96	struct create_context ccontext;
     97	__u8 Name[8];
     98	__u8 Reserved[8];
     99	__u8 AppInstanceId[16];
    100} __packed;
    101
    102struct create_app_inst_id_vers {
    103	struct create_context ccontext;
    104	__u8 Name[8];
    105	__u8 Reserved[2];
    106	__u8 Padding[4];
    107	__le64 AppInstanceVersionHigh;
    108	__le64 AppInstanceVersionLow;
    109} __packed;
    110
    111struct create_mxac_req {
    112	struct create_context ccontext;
    113	__u8   Name[8];
    114	__le64 Timestamp;
    115} __packed;
    116
    117struct create_alloc_size_req {
    118	struct create_context ccontext;
    119	__u8   Name[8];
    120	__le64 AllocationSize;
    121} __packed;
    122
    123struct create_durable_rsp {
    124	struct create_context ccontext;
    125	__u8   Name[8];
    126	union {
    127		__u8  Reserved[8];
    128		__u64 data;
    129	} Data;
    130} __packed;
    131
    132struct create_durable_v2_rsp {
    133	struct create_context ccontext;
    134	__u8   Name[8];
    135	__le32 Timeout;
    136	__le32 Flags;
    137} __packed;
    138
    139struct create_mxac_rsp {
    140	struct create_context ccontext;
    141	__u8   Name[8];
    142	__le32 QueryStatus;
    143	__le32 MaximalAccess;
    144} __packed;
    145
    146struct create_disk_id_rsp {
    147	struct create_context ccontext;
    148	__u8   Name[8];
    149	__le64 DiskFileId;
    150	__le64 VolumeId;
    151	__u8  Reserved[16];
    152} __packed;
    153
    154/* equivalent of the contents of SMB3.1.1 POSIX open context response */
    155struct create_posix_rsp {
    156	struct create_context ccontext;
    157	__u8    Name[16];
    158	__le32 nlink;
    159	__le32 reparse_tag;
    160	__le32 mode;
    161	u8 SidBuffer[40];
    162} __packed;
    163
    164struct smb2_buffer_desc_v1 {
    165	__le64 offset;
    166	__le32 token;
    167	__le32 length;
    168} __packed;
    169
    170#define SMB2_0_IOCTL_IS_FSCTL 0x00000001
    171
    172struct smb_sockaddr_in {
    173	__be16 Port;
    174	__be32 IPv4address;
    175	__u8 Reserved[8];
    176} __packed;
    177
    178struct smb_sockaddr_in6 {
    179	__be16 Port;
    180	__be32 FlowInfo;
    181	__u8 IPv6address[16];
    182	__be32 ScopeId;
    183} __packed;
    184
    185#define INTERNETWORK	0x0002
    186#define INTERNETWORKV6	0x0017
    187
    188struct sockaddr_storage_rsp {
    189	__le16 Family;
    190	union {
    191		struct smb_sockaddr_in addr4;
    192		struct smb_sockaddr_in6 addr6;
    193	};
    194} __packed;
    195
    196#define RSS_CAPABLE	0x00000001
    197#define RDMA_CAPABLE	0x00000002
    198
    199struct network_interface_info_ioctl_rsp {
    200	__le32 Next; /* next interface. zero if this is last one */
    201	__le32 IfIndex;
    202	__le32 Capability; /* RSS or RDMA Capable */
    203	__le32 Reserved;
    204	__le64 LinkSpeed;
    205	char	SockAddr_Storage[128];
    206} __packed;
    207
    208struct file_object_buf_type1_ioctl_rsp {
    209	__u8 ObjectId[16];
    210	__u8 BirthVolumeId[16];
    211	__u8 BirthObjectId[16];
    212	__u8 DomainId[16];
    213} __packed;
    214
    215struct resume_key_ioctl_rsp {
    216	__u64 ResumeKey[3];
    217	__le32 ContextLength;
    218	__u8 Context[4]; /* ignored, Windows sets to 4 bytes of zero */
    219} __packed;
    220
    221struct copychunk_ioctl_req {
    222	__le64 ResumeKey[3];
    223	__le32 ChunkCount;
    224	__le32 Reserved;
    225	__u8 Chunks[1]; /* array of srv_copychunk */
    226} __packed;
    227
    228struct srv_copychunk {
    229	__le64 SourceOffset;
    230	__le64 TargetOffset;
    231	__le32 Length;
    232	__le32 Reserved;
    233} __packed;
    234
    235struct copychunk_ioctl_rsp {
    236	__le32 ChunksWritten;
    237	__le32 ChunkBytesWritten;
    238	__le32 TotalBytesWritten;
    239} __packed;
    240
    241struct file_sparse {
    242	__u8	SetSparse;
    243} __packed;
    244
    245/* FILE Info response size */
    246#define FILE_DIRECTORY_INFORMATION_SIZE       1
    247#define FILE_FULL_DIRECTORY_INFORMATION_SIZE  2
    248#define FILE_BOTH_DIRECTORY_INFORMATION_SIZE  3
    249#define FILE_BASIC_INFORMATION_SIZE           40
    250#define FILE_STANDARD_INFORMATION_SIZE        24
    251#define FILE_INTERNAL_INFORMATION_SIZE        8
    252#define FILE_EA_INFORMATION_SIZE              4
    253#define FILE_ACCESS_INFORMATION_SIZE          4
    254#define FILE_NAME_INFORMATION_SIZE            9
    255#define FILE_RENAME_INFORMATION_SIZE          10
    256#define FILE_LINK_INFORMATION_SIZE            11
    257#define FILE_NAMES_INFORMATION_SIZE           12
    258#define FILE_DISPOSITION_INFORMATION_SIZE     13
    259#define FILE_POSITION_INFORMATION_SIZE        14
    260#define FILE_FULL_EA_INFORMATION_SIZE         15
    261#define FILE_MODE_INFORMATION_SIZE            4
    262#define FILE_ALIGNMENT_INFORMATION_SIZE       4
    263#define FILE_ALL_INFORMATION_SIZE             104
    264#define FILE_ALLOCATION_INFORMATION_SIZE      19
    265#define FILE_END_OF_FILE_INFORMATION_SIZE     20
    266#define FILE_ALTERNATE_NAME_INFORMATION_SIZE  8
    267#define FILE_STREAM_INFORMATION_SIZE          32
    268#define FILE_PIPE_INFORMATION_SIZE            23
    269#define FILE_PIPE_LOCAL_INFORMATION_SIZE      24
    270#define FILE_PIPE_REMOTE_INFORMATION_SIZE     25
    271#define FILE_MAILSLOT_QUERY_INFORMATION_SIZE  26
    272#define FILE_MAILSLOT_SET_INFORMATION_SIZE    27
    273#define FILE_COMPRESSION_INFORMATION_SIZE     16
    274#define FILE_OBJECT_ID_INFORMATION_SIZE       29
    275/* Number 30 not defined in documents */
    276#define FILE_MOVE_CLUSTER_INFORMATION_SIZE    31
    277#define FILE_QUOTA_INFORMATION_SIZE           32
    278#define FILE_REPARSE_POINT_INFORMATION_SIZE   33
    279#define FILE_NETWORK_OPEN_INFORMATION_SIZE    56
    280#define FILE_ATTRIBUTE_TAG_INFORMATION_SIZE   8
    281
    282/* FS Info response  size */
    283#define FS_DEVICE_INFORMATION_SIZE     8
    284#define FS_ATTRIBUTE_INFORMATION_SIZE  16
    285#define FS_VOLUME_INFORMATION_SIZE     24
    286#define FS_SIZE_INFORMATION_SIZE       24
    287#define FS_FULL_SIZE_INFORMATION_SIZE  32
    288#define FS_SECTOR_SIZE_INFORMATION_SIZE 28
    289#define FS_OBJECT_ID_INFORMATION_SIZE 64
    290#define FS_CONTROL_INFORMATION_SIZE 48
    291#define FS_POSIX_INFORMATION_SIZE 56
    292
    293/* FS_ATTRIBUTE_File_System_Name */
    294#define FS_TYPE_SUPPORT_SIZE   44
    295struct fs_type_info {
    296	char		*fs_name;
    297	long		magic_number;
    298} __packed;
    299
    300/*
    301 *	PDU query infolevel structure definitions
    302 *	BB consider moving to a different header
    303 */
    304
    305struct smb2_file_access_info {
    306	__le32 AccessFlags;
    307} __packed;
    308
    309struct smb2_file_alignment_info {
    310	__le32 AlignmentRequirement;
    311} __packed;
    312
    313struct smb2_file_basic_info { /* data block encoding of response to level 18 */
    314	__le64 CreationTime;	/* Beginning of FILE_BASIC_INFO equivalent */
    315	__le64 LastAccessTime;
    316	__le64 LastWriteTime;
    317	__le64 ChangeTime;
    318	__le32 Attributes;
    319	__u32  Pad1;		/* End of FILE_BASIC_INFO_INFO equivalent */
    320} __packed;
    321
    322struct smb2_file_alt_name_info {
    323	__le32 FileNameLength;
    324	char FileName[];
    325} __packed;
    326
    327struct smb2_file_stream_info {
    328	__le32  NextEntryOffset;
    329	__le32  StreamNameLength;
    330	__le64 StreamSize;
    331	__le64 StreamAllocationSize;
    332	char   StreamName[];
    333} __packed;
    334
    335struct smb2_file_ntwrk_info {
    336	__le64 CreationTime;
    337	__le64 LastAccessTime;
    338	__le64 LastWriteTime;
    339	__le64 ChangeTime;
    340	__le64 AllocationSize;
    341	__le64 EndOfFile;
    342	__le32 Attributes;
    343	__le32 Reserved;
    344} __packed;
    345
    346struct smb2_file_standard_info {
    347	__le64 AllocationSize;
    348	__le64 EndOfFile;
    349	__le32 NumberOfLinks;	/* hard links */
    350	__u8   DeletePending;
    351	__u8   Directory;
    352	__le16 Reserved;
    353} __packed; /* level 18 Query */
    354
    355struct smb2_file_ea_info {
    356	__le32 EASize;
    357} __packed;
    358
    359struct smb2_file_alloc_info {
    360	__le64 AllocationSize;
    361} __packed;
    362
    363struct smb2_file_disposition_info {
    364	__u8 DeletePending;
    365} __packed;
    366
    367struct smb2_file_pos_info {
    368	__le64 CurrentByteOffset;
    369} __packed;
    370
    371#define FILE_MODE_INFO_MASK cpu_to_le32(0x0000100e)
    372
    373struct smb2_file_mode_info {
    374	__le32 Mode;
    375} __packed;
    376
    377#define COMPRESSION_FORMAT_NONE 0x0000
    378#define COMPRESSION_FORMAT_LZNT1 0x0002
    379
    380struct smb2_file_comp_info {
    381	__le64 CompressedFileSize;
    382	__le16 CompressionFormat;
    383	__u8 CompressionUnitShift;
    384	__u8 ChunkShift;
    385	__u8 ClusterShift;
    386	__u8 Reserved[3];
    387} __packed;
    388
    389struct smb2_file_attr_tag_info {
    390	__le32 FileAttributes;
    391	__le32 ReparseTag;
    392} __packed;
    393
    394#define SL_RESTART_SCAN	0x00000001
    395#define SL_RETURN_SINGLE_ENTRY	0x00000002
    396#define SL_INDEX_SPECIFIED	0x00000004
    397
    398struct smb2_ea_info_req {
    399	__le32 NextEntryOffset;
    400	__u8   EaNameLength;
    401	char name[1];
    402} __packed; /* level 15 Query */
    403
    404struct smb2_ea_info {
    405	__le32 NextEntryOffset;
    406	__u8   Flags;
    407	__u8   EaNameLength;
    408	__le16 EaValueLength;
    409	char name[1];
    410	/* optionally followed by value */
    411} __packed; /* level 15 Query */
    412
    413struct create_ea_buf_req {
    414	struct create_context ccontext;
    415	__u8   Name[8];
    416	struct smb2_ea_info ea;
    417} __packed;
    418
    419struct create_sd_buf_req {
    420	struct create_context ccontext;
    421	__u8   Name[8];
    422	struct smb_ntsd ntsd;
    423} __packed;
    424
    425struct smb2_posix_info {
    426	__le32 NextEntryOffset;
    427	__u32 Ignored;
    428	__le64 CreationTime;
    429	__le64 LastAccessTime;
    430	__le64 LastWriteTime;
    431	__le64 ChangeTime;
    432	__le64 EndOfFile;
    433	__le64 AllocationSize;
    434	__le32 DosAttributes;
    435	__le64 Inode;
    436	__le32 DeviceId;
    437	__le32 Zero;
    438	/* beginning of POSIX Create Context Response */
    439	__le32 HardLinks;
    440	__le32 ReparseTag;
    441	__le32 Mode;
    442	u8 SidBuffer[40];
    443	__le32 name_len;
    444	u8 name[1];
    445	/*
    446	 * var sized owner SID
    447	 * var sized group SID
    448	 * le32 filenamelength
    449	 * u8  filename[]
    450	 */
    451} __packed;
    452
    453/* functions */
    454void init_smb2_1_server(struct ksmbd_conn *conn);
    455void init_smb3_0_server(struct ksmbd_conn *conn);
    456void init_smb3_02_server(struct ksmbd_conn *conn);
    457int init_smb3_11_server(struct ksmbd_conn *conn);
    458
    459void init_smb2_max_read_size(unsigned int sz);
    460void init_smb2_max_write_size(unsigned int sz);
    461void init_smb2_max_trans_size(unsigned int sz);
    462void init_smb2_max_credits(unsigned int sz);
    463
    464bool is_smb2_neg_cmd(struct ksmbd_work *work);
    465bool is_smb2_rsp(struct ksmbd_work *work);
    466
    467u16 get_smb2_cmd_val(struct ksmbd_work *work);
    468void set_smb2_rsp_status(struct ksmbd_work *work, __le32 err);
    469int init_smb2_rsp_hdr(struct ksmbd_work *work);
    470int smb2_allocate_rsp_buf(struct ksmbd_work *work);
    471bool is_chained_smb2_message(struct ksmbd_work *work);
    472int init_smb2_neg_rsp(struct ksmbd_work *work);
    473void smb2_set_err_rsp(struct ksmbd_work *work);
    474int smb2_check_user_session(struct ksmbd_work *work);
    475int smb2_get_ksmbd_tcon(struct ksmbd_work *work);
    476bool smb2_is_sign_req(struct ksmbd_work *work, unsigned int command);
    477int smb2_check_sign_req(struct ksmbd_work *work);
    478void smb2_set_sign_rsp(struct ksmbd_work *work);
    479int smb3_check_sign_req(struct ksmbd_work *work);
    480void smb3_set_sign_rsp(struct ksmbd_work *work);
    481int find_matching_smb2_dialect(int start_index, __le16 *cli_dialects,
    482			       __le16 dialects_count);
    483struct file_lock *smb_flock_init(struct file *f);
    484int setup_async_work(struct ksmbd_work *work, void (*fn)(void **),
    485		     void **arg);
    486void smb2_send_interim_resp(struct ksmbd_work *work, __le32 status);
    487struct channel *lookup_chann_list(struct ksmbd_session *sess,
    488				  struct ksmbd_conn *conn);
    489void smb3_preauth_hash_rsp(struct ksmbd_work *work);
    490bool smb3_is_transform_hdr(void *buf);
    491int smb3_decrypt_req(struct ksmbd_work *work);
    492int smb3_encrypt_resp(struct ksmbd_work *work);
    493bool smb3_11_final_sess_setup_resp(struct ksmbd_work *work);
    494int smb2_set_rsp_credits(struct ksmbd_work *work);
    495
    496/* smb2 misc functions */
    497int ksmbd_smb2_check_message(struct ksmbd_work *work);
    498
    499/* smb2 command handlers */
    500int smb2_handle_negotiate(struct ksmbd_work *work);
    501int smb2_negotiate_request(struct ksmbd_work *work);
    502int smb2_sess_setup(struct ksmbd_work *work);
    503int smb2_tree_connect(struct ksmbd_work *work);
    504int smb2_tree_disconnect(struct ksmbd_work *work);
    505int smb2_session_logoff(struct ksmbd_work *work);
    506int smb2_open(struct ksmbd_work *work);
    507int smb2_query_info(struct ksmbd_work *work);
    508int smb2_query_dir(struct ksmbd_work *work);
    509int smb2_close(struct ksmbd_work *work);
    510int smb2_echo(struct ksmbd_work *work);
    511int smb2_set_info(struct ksmbd_work *work);
    512int smb2_read(struct ksmbd_work *work);
    513int smb2_write(struct ksmbd_work *work);
    514int smb2_flush(struct ksmbd_work *work);
    515int smb2_cancel(struct ksmbd_work *work);
    516int smb2_lock(struct ksmbd_work *work);
    517int smb2_ioctl(struct ksmbd_work *work);
    518int smb2_oplock_break(struct ksmbd_work *work);
    519int smb2_notify(struct ksmbd_work *ksmbd_work);
    520
    521/*
    522 * Get the body of the smb2 message excluding the 4 byte rfc1002 headers
    523 * from request/response buffer.
    524 */
    525static inline void *smb2_get_msg(void *buf)
    526{
    527	return buf + 4;
    528}
    529
    530#endif	/* _SMB2PDU_H */