linux/fs/cifs
Aurelien Aptel 1bb5681067 cifs: change format of CIFS_FULL_KEY_DUMP ioctl
Make CIFS_FULL_KEY_DUMP ioctl able to return variable-length keys.

* userspace needs to pass the struct size along with optional
  session_id and some space at the end to store keys
* if there is enough space kernel returns keys in the extra space and
  sets the length of each key via xyz_key_length fields

This also fixes the build error for get_user() on ARM.

Sample program:

	#include <stdlib.h>
	#include <stdio.h>
	#include <stdint.h>
	#include <sys/fcntl.h>
	#include <sys/ioctl.h>

	struct smb3_full_key_debug_info {
	        uint32_t   in_size;
	        uint64_t   session_id;
	        uint16_t   cipher_type;
	        uint8_t    session_key_length;
	        uint8_t    server_in_key_length;
	        uint8_t    server_out_key_length;
	        uint8_t    data[];
	        /*
	         * return this struct with the keys appended at the end:
	         * uint8_t session_key[session_key_length];
	         * uint8_t server_in_key[server_in_key_length];
	         * uint8_t server_out_key[server_out_key_length];
	         */
	} __attribute__((packed));

	#define CIFS_IOCTL_MAGIC 0xCF
	#define CIFS_DUMP_FULL_KEY _IOWR(CIFS_IOCTL_MAGIC, 10, struct smb3_full_key_debug_info)

	void dump(const void *p, size_t len) {
	        const char *hex = "0123456789ABCDEF";
	        const uint8_t *b = p;
	        for (int i = 0; i < len; i++)
	                printf("%c%c ", hex[(b[i]>>4)&0xf], hex[b[i]&0xf]);
	        putchar('\n');
	}

	int main(int argc, char **argv)
	{
	        struct smb3_full_key_debug_info *keys;
	        uint8_t buf[sizeof(*keys)+1024] = {0};
	        size_t off = 0;
	        int fd, rc;

	        keys = (struct smb3_full_key_debug_info *)&buf;
	        keys->in_size = sizeof(buf);

	        fd = open(argv[1], O_RDONLY);
	        if (fd < 0)
	                perror("open"), exit(1);

	        rc = ioctl(fd, CIFS_DUMP_FULL_KEY, keys);
	        if (rc < 0)
	                perror("ioctl"), exit(1);

	        printf("SessionId      ");
	        dump(&keys->session_id, 8);
	        printf("Cipher         %04x\n", keys->cipher_type);

	        printf("SessionKey     ");
	        dump(keys->data+off, keys->session_key_length);
	        off += keys->session_key_length;

	        printf("ServerIn Key   ");
	        dump(keys->data+off, keys->server_in_key_length);
	        off += keys->server_in_key_length;

	        printf("ServerOut Key  ");
	        dump(keys->data+off, keys->server_out_key_length);

	        return 0;
	}

Usage:

	$ gcc -o dumpkeys dumpkeys.c

Against Windows Server 2020 preview (with AES-256-GCM support):

	# mount.cifs //$ip/test /mnt -o "username=administrator,password=foo,vers=3.0,seal"
	# ./dumpkeys /mnt/somefile
	SessionId      0D 00 00 00 00 0C 00 00
	Cipher         0002
	SessionKey     AB CD CC 0D E4 15 05 0C 6F 3C 92 90 19 F3 0D 25
	ServerIn Key   73 C6 6A C8 6B 08 CF A2 CB 8E A5 7D 10 D1 5B DC
	ServerOut Key  6D 7E 2B A1 71 9D D7 2B 94 7B BA C4 F0 A5 A4 F8
	# umount /mnt

	With 256 bit keys:

	# echo 1 > /sys/module/cifs/parameters/require_gcm_256
	# mount.cifs //$ip/test /mnt -o "username=administrator,password=foo,vers=3.11,seal"
	# ./dumpkeys /mnt/somefile
	SessionId      09 00 00 00 00 0C 00 00
	Cipher         0004
	SessionKey     93 F5 82 3B 2F B7 2A 50 0B B9 BA 26 FB 8C 8B 03
	ServerIn Key   6C 6A 89 B2 CB 7B 78 E8 04 93 37 DA 22 53 47 DF B3 2C 5F 02 26 70 43 DB 8D 33 7B DC 66 D3 75 A9
	ServerOut Key  04 11 AA D7 52 C7 A8 0F ED E3 93 3A 65 FE 03 AD 3F 63 03 01 2B C0 1B D7 D7 E5 52 19 7F CC 46 B4

Signed-off-by: Aurelien Aptel <aaptel@suse.com>
Reviewed-by: Ronnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
2021-05-27 15:26:32 -05:00
..
asn1.c cifs: remove bogus debug code 2020-10-22 12:17:52 -05:00
cache.c cifs: Make extract_sharename function public 2020-12-14 09:16:22 -06:00
cifs_debug.c cifs: export supported mount options via new mount_params /proc file 2021-04-25 16:28:24 -05:00
cifs_debug.h cifs: Standardize logging output 2020-06-01 00:10:18 -05:00
cifs_dfs_ref.c cifs: allocate buffer in the caller of build_path_from_dentry() 2021-04-25 16:28:23 -05:00
cifs_fs_sb.h cifs: add shutdown support 2021-05-03 11:21:22 -05:00
cifs_ioctl.h cifs: change format of CIFS_FULL_KEY_DUMP ioctl 2021-05-27 15:26:32 -05:00
cifs_spnego.c cifs: switch servers depending on binding state 2019-11-25 01:16:30 -06:00
cifs_spnego.h
cifs_swn.c fs/cifs/: fix misspellings using codespell tool 2021-03-19 00:37:51 -05:00
cifs_swn.h cifs: simplify SWN code with dummy funcs instead of ifdefs 2021-04-25 16:28:22 -05:00
cifs_unicode.c Convert trailing spaces and periods in path components 2020-10-11 23:57:18 -05:00
cifs_unicode.h
cifs_uniupr.h
cifsacl.c cifs: Remove useless variable 2021-04-25 16:28:22 -05:00
cifsacl.h cifs: Fix cifsacl ACE mask for group and others. 2021-02-22 21:20:44 -06:00
cifsencrypt.c cifs: change confusing field serverName (to ip_addr) 2021-02-22 21:20:43 -06:00
cifsfs.c Fix kernel oops when CONFIG_DEBUG_ATOMIC_SLEEP is enabled. 2021-05-19 21:11:26 -05:00
cifsfs.h cifs: update internal version number 2021-04-25 23:59:27 -05:00
cifsglob.h Defer close only when lease is enabled. 2021-05-19 21:11:28 -05:00
cifspdu.h cifs: change format of CIFS_FULL_KEY_DUMP ioctl 2021-05-27 15:26:32 -05:00
cifsproto.h 10 CIFS/SMB3 changesets including some important multichannel fixes, as well as support for handle leases (deferred close) and shutdown support 2021-05-05 13:37:07 -07:00
cifsroot.c cifs: Standardize logging output 2020-06-01 00:10:18 -05:00
cifssmb.c cifs: rename the *_shroot* functions to *_cached_dir* 2021-04-25 16:28:23 -05:00
connect.c cifs: fix regression when mounting shares with prefix paths 2021-05-04 11:52:56 -05:00
dfs_cache.c cifs: constify get_normalized_path() properly 2021-04-25 16:28:23 -05:00
dfs_cache.h cifs: rename smb_vol as smb3_fs_context and move it to fs_context.h 2020-12-13 19:12:07 -06:00
dir.c 10 CIFS/SMB3 changesets including some important multichannel fixes, as well as support for handle leases (deferred close) and shutdown support 2021-05-05 13:37:07 -07:00
dns_resolve.c keys: Pass the network namespace into request_key mechanism 2019-06-27 23:02:12 +01:00
dns_resolve.h
export.c docs: fs: convert docs without extension to ReST 2019-07-31 13:31:05 -06:00
file.c Fix KASAN identified use-after-free issue. 2021-05-20 12:20:42 -05:00
fs_context.c cifs: Fix inconsistent indenting 2021-05-19 21:11:09 -05:00
fs_context.h smb3: add rasize mount parameter to improve readahead performance 2021-04-25 23:59:08 -05:00
fscache.c cifs: Make extract_sharename function public 2020-12-14 09:16:22 -06:00
fscache.h cifs: Make extract_sharename function public 2020-12-14 09:16:22 -06:00
inode.c 10 CIFS/SMB3 changesets including some important multichannel fixes, as well as support for handle leases (deferred close) and shutdown support 2021-05-05 13:37:07 -07:00
ioctl.c cifs: change format of CIFS_FULL_KEY_DUMP ioctl 2021-05-27 15:26:32 -05:00
Kconfig cifs: On cifs_reconnect, resolve the hostname again. 2021-04-07 21:29:36 -05:00
link.c fs/cifs: Fix resource leak 2021-05-04 11:53:15 -05:00
Makefile cifs: On cifs_reconnect, resolve the hostname again. 2021-04-07 21:29:36 -05:00
misc.c Fix KASAN identified use-after-free issue. 2021-05-20 12:20:42 -05:00
netlink.c cifs: Set witness notification handler for messages from userspace daemon 2020-12-14 09:16:22 -06:00
netlink.h cifs: Register generic netlink family 2020-12-14 09:16:22 -06:00
netmisc.c cifs`: handle ERRBaduid for SMB1 2020-08-02 18:00:25 -05:00
nterr.c
nterr.h
ntlmssp.h
readdir.c Merge branch 'work.inode-type-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2021-04-27 10:57:42 -07:00
rfc1002pdu.h
sess.c smb3: do not attempt multichannel to server which does not support it 2021-05-08 10:50:53 -05:00
smb1ops.c cifs: constify path argument of ->make_node() 2021-04-25 16:28:23 -05:00
smb2file.c cifs: allow unlock flock and OFD lock across fork 2020-03-22 22:49:09 -05:00
smb2glob.h cifs: Adjust key sizes and key generation routines for AES256 encryption 2021-03-26 07:49:39 -05:00
smb2inode.c cifs: rename the *_shroot* functions to *_cached_dir* 2021-04-25 16:28:23 -05:00
smb2maperror.c cifs: map STATUS_ACCOUNT_LOCKED_OUT to -EACCES 2020-10-15 23:58:14 -05:00
smb2misc.c cifs: add a timestamp to track when the lease of the cached dir was taken 2021-04-25 16:28:23 -05:00
smb2ops.c Defer close only when lease is enabled. 2021-05-19 21:11:28 -05:00
smb2pdu.c cifs: set server->cipher_type to AES-128-CCM for SMB3.0 2021-05-27 14:03:47 -05:00
smb2pdu.h SMB3: update structures for new compression protocol definitions 2021-04-25 16:28:23 -05:00
smb2proto.h cifs: add a function to get a cached dir based on its dentry 2021-04-25 16:28:23 -05:00
smb2status.h
smb2transport.c cifs: Adjust key sizes and key generation routines for AES256 encryption 2021-03-26 07:49:39 -05:00
smbdirect.c cifs: Fix fall-through warnings for Clang 2020-12-13 19:12:07 -06:00
smbdirect.h cifs: smbd: Do not schedule work to send immediate packet on every receive 2020-04-07 12:41:16 -05:00
smbencrypt.c fs: cifs: move from the crypto cipher API to the new DES library interface 2019-08-22 14:57:34 +10:00
smberr.h
smbfsctl.h smb3: add some missing definitions from MS-FSCC 2020-10-23 15:38:10 -05:00
trace.c
trace.h cifs: fix string declarations and assignments in tracepoints 2021-05-27 14:04:32 -05:00
transport.c cifs: Fix preauth hash corruption 2021-03-14 18:14:32 -05:00
unc.c cifs: don't cargo-cult strndup() 2021-04-25 16:28:23 -05:00
winucase.c Replace HTTP links with HTTPS ones: CIFS 2020-07-05 14:23:38 -06:00
xattr.c cifs: add shutdown support 2021-05-03 11:21:22 -05:00