smb3.1.1: add new module load parm enable_gcm_256
authorSteve French <stfrench@microsoft.com>
Thu, 15 Oct 2020 01:24:09 +0000 (20:24 -0500)
committerSteve French <stfrench@microsoft.com>
Fri, 16 Oct 2020 04:58:15 +0000 (23:58 -0500)
Add new module load parameter enable_gcm_256. If set, then add
AES-256-GCM (strongest encryption type) to the list of encryption
types requested. Put it in the list as the second choice (since
AES-128-GCM is faster and much more broadly supported by
SMB3 servers).  To make this stronger encryption type, GCM-256,
required (the first and only choice, you would use module parameter
"require_gcm_256."

Reviewed-by: Ronnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/cifsfs.c
fs/cifs/cifsglob.h
fs/cifs/smb2pdu.c
fs/cifs/smb2pdu.h

index 462dbbd..472cb77 100644 (file)
@@ -71,6 +71,7 @@ bool enable_oplocks = true;
 bool linuxExtEnabled = true;
 bool lookupCacheEnabled = true;
 bool disable_legacy_dialects; /* false by default */
+bool enable_gcm_256;  /* false by default, change when more servers support it */
 bool require_gcm_256; /* false by default */
 unsigned int global_secflags = CIFSSEC_DEF;
 /* unsigned int ntlmv2_support = 0; */
@@ -105,6 +106,9 @@ MODULE_PARM_DESC(slow_rsp_threshold, "Amount of time (in seconds) to wait "
 module_param(enable_oplocks, bool, 0644);
 MODULE_PARM_DESC(enable_oplocks, "Enable or disable oplocks. Default: y/Y/1");
 
+module_param(enable_gcm_256, bool, 0644);
+MODULE_PARM_DESC(enable_gcm_256, "Enable requesting strongest (256 bit) GCM encryption. Default: n/N/0");
+
 module_param(require_gcm_256, bool, 0644);
 MODULE_PARM_DESC(require_gcm_256, "Require strongest (256 bit) GCM encryption. Default: n/N/0");
 
index ec21af8..a1a1a16 100644 (file)
@@ -1956,6 +1956,7 @@ extern bool lookupCacheEnabled;
 extern unsigned int global_secflags;   /* if on, session setup sent
                                with more secure ntlmssp2 challenge/resp */
 extern unsigned int sign_CIFS_PDUs;  /* enable smb packet signing */
+extern bool enable_gcm_256; /* allow optional negotiate of strongest signing (aes-gcm-256) */
 extern bool require_gcm_256; /* require use of strongest signing (aes-gcm-256) */
 extern bool linuxExtEnabled;/*enable Linux/Unix CIFS extensions*/
 extern unsigned int CIFSMaxBufSize;  /* max size not including hdr */
index fcae1e3..8cfc312 100644 (file)
@@ -453,6 +453,12 @@ build_encrypt_ctxt(struct smb2_encryption_neg_context *pneg_ctxt)
                pneg_ctxt->DataLength = cpu_to_le16(4); /* Cipher Count + 1 cipher */
                pneg_ctxt->CipherCount = cpu_to_le16(1);
                pneg_ctxt->Ciphers[0] = SMB2_ENCRYPTION_AES256_GCM;
+       } else if (enable_gcm_256) {
+               pneg_ctxt->DataLength = cpu_to_le16(8); /* Cipher Count + 3 ciphers */
+               pneg_ctxt->CipherCount = cpu_to_le16(3);
+               pneg_ctxt->Ciphers[0] = SMB2_ENCRYPTION_AES128_GCM;
+               pneg_ctxt->Ciphers[1] = SMB2_ENCRYPTION_AES256_GCM;
+               pneg_ctxt->Ciphers[2] = SMB2_ENCRYPTION_AES128_CCM;
        } else {
                pneg_ctxt->DataLength = cpu_to_le16(6); /* Cipher Count + 2 ciphers */
                pneg_ctxt->CipherCount = cpu_to_le16(2);
index 5932fc0..6f65f1c 100644 (file)
@@ -361,8 +361,9 @@ struct smb2_encryption_neg_context {
        __le16  ContextType; /* 2 */
        __le16  DataLength;
        __le32  Reserved;
-       __le16  CipherCount; /* AES-128-GCM and AES-128-CCM */
-       __le16  Ciphers[2];
+       /* CipherCount usally 2, but can be 3 when AES256-GCM enabled */
+       __le16  CipherCount; /* AES128-GCM and AES128-CCM by default */
+       __le16  Ciphers[3];
 } __packed;
 
 /* See MS-SMB2 2.2.3.1.3 */