2 Unix SMB/CIFS implementation.
4 dcerpc authentication operations
6 Copyright (C) Andrew Tridgell 2003
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 wrappers for the ntlmssp_*() functions
28 static NTSTATUS dcerpc_ntlmssp_unseal(struct dcerpc_security *dcerpc_security,
30 uint8_t *data, size_t length, DATA_BLOB *sig)
32 struct ntlmssp_state *ntlmssp_state = dcerpc_security->private_data;
34 return ntlmssp_unseal_packet(ntlmssp_state, mem_ctx, data, length, sig);
37 static NTSTATUS dcerpc_ntlmssp_check_sig(struct dcerpc_security *dcerpc_security,
39 const uint8_t *data, size_t length,
42 struct ntlmssp_state *ntlmssp_state = dcerpc_security->private_data;
44 return ntlmssp_check_packet(ntlmssp_state, mem_ctx, data, length, sig);
47 static NTSTATUS dcerpc_ntlmssp_seal(struct dcerpc_security *dcerpc_security,
49 uint8_t *data, size_t length,
52 struct ntlmssp_state *ntlmssp_state = dcerpc_security->private_data;
54 return ntlmssp_seal_packet(ntlmssp_state, mem_ctx, data, length, sig);
57 static NTSTATUS dcerpc_ntlmssp_sign(struct dcerpc_security *dcerpc_security,
59 const uint8_t *data, size_t length,
62 struct ntlmssp_state *ntlmssp_state = dcerpc_security->private_data;
64 return ntlmssp_sign_packet(ntlmssp_state, mem_ctx, data, length, sig);
67 static NTSTATUS dcerpc_ntlmssp_session_key(struct dcerpc_security *dcerpc_security,
68 DATA_BLOB *session_key)
70 struct ntlmssp_state *ntlmssp_state = dcerpc_security->private_data;
72 if (!ntlmssp_state->session_key.data) {
73 return NT_STATUS_NO_USER_SESSION_KEY;
75 *session_key = ntlmssp_state->session_key;
80 static NTSTATUS dcerpc_ntlmssp_start(struct dcerpc_pipe *dce_pipe, struct dcerpc_security *dcerpc_security)
82 struct ntlmssp_state *ntlmssp_state = NULL;
85 status = ntlmssp_client_start(&ntlmssp_state);
86 if (!NT_STATUS_IS_OK(status)) {
90 status = ntlmssp_set_domain(ntlmssp_state, dcerpc_security->user.domain);
91 if (!NT_STATUS_IS_OK(status)) {
95 status = ntlmssp_set_username(ntlmssp_state, dcerpc_security->user.name);
96 if (!NT_STATUS_IS_OK(status)) {
100 status = ntlmssp_set_password(ntlmssp_state, dcerpc_security->user.password);
101 if (!NT_STATUS_IS_OK(status)) {
105 dcerpc_security->private_data = ntlmssp_state;
110 static NTSTATUS dcerpc_ntlmssp_update(struct dcerpc_security *dcerpc_security, TALLOC_CTX *out_mem_ctx,
111 const DATA_BLOB in, DATA_BLOB *out)
113 struct ntlmssp_state *ntlmssp_state = dcerpc_security->private_data;
115 return ntlmssp_update(ntlmssp_state, out_mem_ctx, in, out);
118 static void dcerpc_ntlmssp_end(struct dcerpc_security *dcerpc_security)
120 struct ntlmssp_state *ntlmssp_state = dcerpc_security->private_data;
122 ntlmssp_end(&ntlmssp_state);
124 dcerpc_security->private_data = NULL;
127 static const struct dcesrv_security_ops dcerpc_ntlmssp_security_ops = {
129 .auth_type = DCERPC_AUTH_TYPE_NTLMSSP,
130 .start = dcerpc_ntlmssp_start,
131 .update = dcerpc_ntlmssp_update,
132 .seal = dcerpc_ntlmssp_seal,
133 .sign = dcerpc_ntlmssp_sign,
134 .check_sig = dcerpc_ntlmssp_check_sig,
135 .unseal = dcerpc_ntlmssp_unseal,
136 .session_key = dcerpc_ntlmssp_session_key,
137 .end = dcerpc_ntlmssp_end
140 const struct dcesrv_security_ops *dcerpc_ntlmssp_security_get_ops(void)
142 return &dcerpc_ntlmssp_security_ops;
146 do ntlm style authentication on a dcerpc pipe
148 NTSTATUS dcerpc_bind_auth_ntlm(struct dcerpc_pipe *p,
149 const char *uuid, uint_t version,
151 const char *username,
152 const char *password)
156 status = dcerpc_bind_auth(p, DCERPC_AUTH_TYPE_NTLMSSP,