2 Unix SMB/CIFS implementation.
4 Copyright (C) Andrew Tridgell 2004
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 #include "smb_server/smb_server.h"
22 #include "libcli/raw/libcliraw.h"
23 #include "libcli/raw/raw_proto.h"
24 #include "param/param.h"
28 sign an outgoing packet
30 void smbsrv_sign_packet(struct smbsrv_request
*req
)
33 /* enable this when packet signing is preventing you working out why valgrind
34 says that data is uninitialised */
35 file_save("pkt.dat", req
->out
.buffer
, req
->out
.size
);
38 switch (req
->smb_conn
->signing
.signing_state
) {
39 case SMB_SIGNING_ENGINE_OFF
:
42 case SMB_SIGNING_ENGINE_BSRSPYL
:
43 /* mark the packet as signed - BEFORE we sign it...*/
44 mark_packet_signed(&req
->out
);
46 /* I wonder what BSRSPYL stands for - but this is what MS
48 memcpy((req
->out
.hdr
+ HDR_SS_FIELD
), "BSRSPYL ", 8);
51 case SMB_SIGNING_ENGINE_ON
:
53 sign_outgoing_message(&req
->out
,
54 &req
->smb_conn
->signing
.mac_key
,
64 setup the signing key for a connection. Called after authentication succeeds
67 bool smbsrv_setup_signing(struct smbsrv_connection
*smb_conn
,
68 DATA_BLOB
*session_key
,
71 if (!set_smb_signing_common(&smb_conn
->signing
)) {
74 return smbcli_simple_set_signing(smb_conn
,
75 &smb_conn
->signing
, session_key
, response
);
78 bool smbsrv_init_signing(struct smbsrv_connection
*smb_conn
)
80 smb_conn
->signing
.mac_key
= data_blob(NULL
, 0);
81 if (!smbcli_set_signing_off(&smb_conn
->signing
)) {
85 smb_conn
->signing
.allow_smb_signing
86 = lpcfg_server_signing_allowed(smb_conn
->lp_ctx
,
87 &smb_conn
->signing
.mandatory_signing
);
92 allocate a sequence number to a request
94 static void req_signing_alloc_seq_num(struct smbsrv_request
*req
)
96 req
->seq_num
= req
->smb_conn
->signing
.next_seq_num
;
98 if (req
->smb_conn
->signing
.signing_state
!= SMB_SIGNING_ENGINE_OFF
) {
99 req
->smb_conn
->signing
.next_seq_num
+= 2;
104 called for requests that do not produce a reply of their own
106 void smbsrv_signing_no_reply(struct smbsrv_request
*req
)
108 if (req
->smb_conn
->signing
.signing_state
!= SMB_SIGNING_ENGINE_OFF
) {
109 req
->smb_conn
->signing
.next_seq_num
--;
113 /***********************************************************
114 SMB signing - Simple implementation - check a MAC sent by client
115 ************************************************************/
117 * Check a packet supplied by the server.
118 * @return false if we had an established signing connection
119 * which had a back checksum, true otherwise
121 bool smbsrv_signing_check_incoming(struct smbsrv_request
*req
)
125 req_signing_alloc_seq_num(req
);
127 switch (req
->smb_conn
->signing
.signing_state
)
129 case SMB_SIGNING_ENGINE_OFF
:
131 case SMB_SIGNING_ENGINE_BSRSPYL
:
132 case SMB_SIGNING_ENGINE_ON
:
134 if (req
->in
.size
< (HDR_SS_FIELD
+ 8)) {
137 good
= check_signed_incoming_message(&req
->in
,
138 &req
->smb_conn
->signing
.mac_key
,
141 return signing_good(&req
->smb_conn
->signing
,
142 req
->seq_num
+1, good
);