auth:creds: Add cli_credentials_(get|set)_smb_encryption()
authorAndreas Schneider <asn@samba.org>
Thu, 28 May 2020 14:10:52 +0000 (16:10 +0200)
committerAndreas Schneider <asn@cryptomilk.org>
Wed, 19 Aug 2020 16:22:41 +0000 (16:22 +0000)
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
auth/credentials/credentials.c
auth/credentials/credentials.h
auth/credentials/credentials_internal.h

index dc5d51f1424f459bb193c0072a43e496052c88f3..9168b92d3ecc4da4d65360cfdda21f384ee4fcbe 100644 (file)
@@ -51,6 +51,7 @@ _PUBLIC_ struct cli_credentials *cli_credentials_init(TALLOC_CTX *mem_ctx)
         * the same value here.
         */
        cred->ipc_signing_state = SMB_SIGNING_REQUIRED;
+       cred->encryption_state = SMB_ENCRYPTION_DEFAULT;
 
        return cred;
 }
@@ -942,6 +943,12 @@ _PUBLIC_ void cli_credentials_set_conf(struct cli_credentials *cred,
                cred->ipc_signing_state = lpcfg_client_ipc_signing(lp_ctx);
                cred->ipc_signing_state_obtained = CRED_SMB_CONF;
        }
+
+       if (cred->encryption_state_obtained <= CRED_SMB_CONF) {
+               /* Will be set to default for invalid smb.conf values */
+               cred->encryption_state = lpcfg_client_smb_encrypt(lp_ctx);
+               cred->encryption_state_obtained = CRED_SMB_CONF;
+       }
 }
 
 /**
@@ -1401,6 +1408,44 @@ cli_credentials_get_smb_ipc_signing(struct cli_credentials *creds)
        return creds->ipc_signing_state;
 }
 
+/**
+ * @brief Set the SMB encryption state to request for a SMB connection.
+ *
+ * @param[in]  creds  The credentials structure to update.
+ *
+ * @param[in]  encryption_state  The encryption state to set.
+ *
+ * @param obtained  This way the described encryption state was specified.
+ *
+ * @return true if we could set the encryption state, false otherwise.
+ */
+_PUBLIC_ bool cli_credentials_set_smb_encryption(struct cli_credentials *creds,
+                                                enum smb_encryption_setting encryption_state,
+                                                enum credentials_obtained obtained)
+{
+       if (obtained >= creds->encryption_state_obtained) {
+               creds->encryption_state_obtained = obtained;
+               creds->encryption_state = encryption_state;
+               return true;
+       }
+
+       return false;
+}
+
+/**
+ * @brief Obtain the SMB encryption state from a credentials structure.
+ *
+ * @param[in]  creds  The credential structure to obtain the SMB encryption state
+ *                    from.
+ *
+ * @return The SMB singing state.
+ */
+_PUBLIC_ enum smb_encryption_setting
+cli_credentials_get_smb_encryption(struct cli_credentials *creds)
+{
+       return creds->encryption_state;
+}
+
 /**
  * Encrypt a data blob using the session key and the negotiated encryption
  * algorithm
index 2333b991526b8ab7002232f0365b7d1c83cee205..1a3e611fee84ae0e59879dae19e47783023ed192 100644 (file)
@@ -39,6 +39,7 @@ struct smb_krb5_context;
 struct keytab_container;
 struct db_context;
 enum smb_signing_setting;
+enum smb_encryption_setting;
 
 /* In order of priority */
 enum credentials_obtained { 
@@ -303,6 +304,12 @@ bool cli_credentials_set_smb_ipc_signing(struct cli_credentials *cred,
 enum smb_signing_setting
 cli_credentials_get_smb_ipc_signing(struct cli_credentials *cred);
 
+bool cli_credentials_set_smb_encryption(struct cli_credentials *cred,
+                                       enum smb_encryption_setting encryption_state,
+                                       enum credentials_obtained obtained);
+enum smb_encryption_setting
+cli_credentials_get_smb_encryption(struct cli_credentials *cred);
+
 /**
  * Return attached NETLOGON credentials 
  */
index 54e8271471fe9c682960f74a3d2ed7207f8fddfc..3b86b7424481c227e4a1a50a606bde69039b22ff 100644 (file)
@@ -39,6 +39,7 @@ struct cli_credentials {
        enum credentials_obtained server_gss_creds_obtained;
        enum credentials_obtained signing_state_obtained;
        enum credentials_obtained ipc_signing_state_obtained;
+       enum credentials_obtained encryption_state_obtained;
 
        /* Threshold values (essentially a MAX() over a number of the
         * above) for the ccache and GSS credentials, to ensure we
@@ -124,6 +125,8 @@ struct cli_credentials {
        enum smb_signing_setting signing_state;
 
        enum smb_signing_setting ipc_signing_state;
+
+       enum smb_encryption_setting encryption_state;
 };
 
 #endif /* __CREDENTIALS_INTERNAL_H__ */