]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
libcli/smb: make smbXcli_session_dump_keys() usable for the server side
authorRalph Boehme <slow@samba.org>
Sat, 19 Jul 2025 12:26:50 +0000 (14:26 +0200)
committerVolker Lendecke <vl@samba.org>
Tue, 22 Jul 2025 14:08:36 +0000 (14:08 +0000)
By passing the individual keys directly instead of passing the wrapping state
objects, smbXcli_session_dump_keys() can later also be used by the server code.

No change in behaviour.

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
libcli/smb/smbXcli_base.c
libcli/smb/smbXcli_base.h
source3/libsmb/cliconnect.c

index 7a9dd81108ca64330ac0b3f4aef4614b5f3e2f2f..f6f60a1f78f4ec1da0b31191ae5011a566ac9052 100644 (file)
@@ -7600,54 +7600,27 @@ NTSTATUS smb2cli_parse_dyn_buffer(uint32_t dyn_offset,
        return NT_STATUS_OK;
 }
 
-void smbXcli_session_dump_keys(TALLOC_CTX *mem_ctx,
-                              struct smbXcli_session *session,
-                              DATA_BLOB session_key)
+void smbXcli_session_dump_keys(uint64_t session_id,
+                              DATA_BLOB *session_key,
+                              DATA_BLOB *signing_key,
+                              DATA_BLOB *application_key,
+                              DATA_BLOB *encryption_key,
+                              DATA_BLOB *decryption_key)
 {
-       NTSTATUS status;
-       DATA_BLOB sig = data_blob_null;
-       DATA_BLOB app = data_blob_null;
-       DATA_BLOB enc = data_blob_null;
-       DATA_BLOB dec = data_blob_null;
-       uint64_t sid = smb2cli_session_current_id(session);
-
-       status = smb2cli_session_signing_key(session, mem_ctx, &sig);
-       if (!NT_STATUS_IS_OK(status)) {
-               goto out;
-       }
-       status = smbXcli_session_application_key(session, mem_ctx, &app);
-       if (!NT_STATUS_IS_OK(status)) {
-               goto out;
-       }
-       status = smb2cli_session_encryption_key(session, mem_ctx, &enc);
-       if (!NT_STATUS_IS_OK(status)) {
-               goto out;
-       }
-       status = smb2cli_session_decryption_key(session, mem_ctx, &dec);
-       if (!NT_STATUS_IS_OK(status)) {
-               goto out;
-       }
-
        DEBUG(0, ("debug encryption: dumping generated session keys\n"));
        DEBUGADD(0, ("Session Id    "));
-       dump_data(0, (uint8_t*)&sid, sizeof(sid));
+       dump_data(0, (uint8_t*)&session_id, sizeof(session_id));
        DEBUGADD(0, ("Session Key   "));
-       dump_data(0, session_key.data, session_key.length);
+       dump_data(0, session_key->data, session_key->length);
        DEBUGADD(0, ("Signing Key   "));
-       dump_data(0, sig.data, sig.length);
+       dump_data(0, signing_key->data, signing_key->length);
        DEBUGADD(0, ("App Key       "));
-       dump_data(0, app.data, app.length);
+       dump_data(0, application_key->data, application_key->length);
 
        /* In client code, ServerIn is the encryption key */
 
        DEBUGADD(0, ("ServerIn Key  "));
-       dump_data(0, enc.data, enc.length);
+       dump_data(0, encryption_key->data, encryption_key->length);
        DEBUGADD(0, ("ServerOut Key "));
-       dump_data(0, dec.data, dec.length);
-
-out:
-       data_blob_clear_free(&sig);
-       data_blob_clear_free(&app);
-       data_blob_clear_free(&enc);
-       data_blob_clear_free(&dec);
+       dump_data(0, decryption_key->data, decryption_key->length);
 }
index d13f9643313fef611a991b056cdcffbeae5e74af..fb486a69ddfb801b5a2748714c999bb1972dfb5f 100644 (file)
@@ -530,9 +530,12 @@ struct smbXcli_session *smbXcli_session_shallow_copy(TALLOC_CTX *mem_ctx,
                                               struct smbXcli_session *src);
 bool smbXcli_session_is_guest(struct smbXcli_session *session);
 bool smbXcli_session_is_authenticated(struct smbXcli_session *session);
-void smbXcli_session_dump_keys(TALLOC_CTX *mem_ctx,
-                              struct smbXcli_session *session,
-                              DATA_BLOB session_key);
+void smbXcli_session_dump_keys(uint64_t session_id,
+                              DATA_BLOB *session_key,
+                              DATA_BLOB *signing_key,
+                              DATA_BLOB *application_key,
+                              DATA_BLOB *encryption_key,
+                              DATA_BLOB *decryption_key);
 NTSTATUS smb2cli_session_signing_key(struct smbXcli_session *session,
                                     TALLOC_CTX *mem_ctx,
                                     DATA_BLOB *key);
index 385fbfc9d250650e1b480484fba9230fe2e61171..c24f39aee13bf9657e378b7be6be19bd4e73356f 100644 (file)
@@ -1063,9 +1063,31 @@ static void cli_session_setup_gensec_ready(struct tevent_req *req)
                if (smbXcli_conn_protocol(state->cli->conn) >= PROTOCOL_SMB3_00
                    && lp_debug_encryption())
                {
-                       smbXcli_session_dump_keys(state,
-                                                 session,
-                                                 state->session_key);
+                       DATA_BLOB sig, app, enc, dec;
+
+                       status = smb2cli_session_signing_key(session, state, &sig);
+                       if (tevent_req_nterror(req, status)) {
+                               return;
+                       }
+                       status = smbXcli_session_application_key(session, state, &app);
+                       if (tevent_req_nterror(req, status)) {
+                               return;
+                       }
+                       status = smb2cli_session_encryption_key(session, state, &enc);
+                       if (tevent_req_nterror(req, status)) {
+                               return;
+                       }
+                       status = smb2cli_session_decryption_key(session, state, &dec);
+                       if (tevent_req_nterror(req, status)) {
+                               return;
+                       }
+
+                       smbXcli_session_dump_keys(smb2cli_session_current_id(session),
+                                                 &state->session_key,
+                                                 &sig,
+                                                 &app,
+                                                 &enc,
+                                                 &dec);
                }
        } else {
                struct smbXcli_session *session = state->cli->smb1.session;