libsmb/smb_signing.c

ソースコードを見る。

データ構造

struct  outstanding_packet_lookup
struct  smb_basic_signing_context

関数

static BOOL store_sequence_for_reply (struct outstanding_packet_lookup **list, uint16 mid, uint32 reply_seq_num)
static BOOL get_sequence_for_reply (struct outstanding_packet_lookup **list, uint16 mid, uint32 *reply_seq_num)
static BOOL set_sequence_can_delete_flag (struct outstanding_packet_lookup **list, uint16 mid, BOOL can_delete_entry)
static BOOL cli_set_smb_signing_common (struct cli_state *cli)
static BOOL set_smb_signing_real_common (struct smb_sign_info *si)
static void mark_packet_signed (char *outbuf)
static void null_sign_outgoing_message (char *outbuf, struct smb_sign_info *si)
static BOOL null_check_incoming_message (char *inbuf, struct smb_sign_info *si, BOOL must_be_ok)
static void null_free_signing_context (struct smb_sign_info *si)
static BOOL null_set_signing (struct smb_sign_info *si)
 SMB signing - NULL implementation - setup the MAC key.
static void free_signing_context (struct smb_sign_info *si)
 Free the signing context
static BOOL signing_good (char *inbuf, struct smb_sign_info *si, BOOL good, uint32 seq, BOOL must_be_ok)
static void simple_packet_signature (struct smb_basic_signing_context *data, const uchar *buf, uint32 seq_number, unsigned char calc_md5_mac[16])
static void client_sign_outgoing_message (char *outbuf, struct smb_sign_info *si)
static BOOL client_check_incoming_message (char *inbuf, struct smb_sign_info *si, BOOL must_be_ok)
static void simple_free_signing_context (struct smb_sign_info *si)
BOOL cli_simple_set_signing (struct cli_state *cli, const DATA_BLOB user_session_key, const DATA_BLOB response)
static void temp_sign_outgoing_message (char *outbuf, struct smb_sign_info *si)
static BOOL temp_check_incoming_message (char *inbuf, struct smb_sign_info *si, BOOL foo)
static void temp_free_signing_context (struct smb_sign_info *si)
BOOL cli_null_set_signing (struct cli_state *cli)
BOOL cli_temp_set_signing (struct cli_state *cli)
void cli_free_signing_context (struct cli_state *cli)
void cli_calculate_sign_mac (struct cli_state *cli)
 Sign a packet with the current mechanism
BOOL cli_check_sign_mac (struct cli_state *cli)
 Check a packet with the current mechanism
BOOL client_set_trans_sign_state_on (struct cli_state *cli, uint16 mid)
BOOL client_set_trans_sign_state_off (struct cli_state *cli, uint16 mid)
static void srv_sign_outgoing_message (char *outbuf, struct smb_sign_info *si)
static BOOL srv_check_incoming_message (char *inbuf, struct smb_sign_info *si, BOOL must_be_ok)
BOOL srv_oplock_set_signing (BOOL onoff)
BOOL srv_check_sign_mac (char *inbuf, BOOL must_be_ok)
void srv_calculate_sign_mac (char *outbuf)
void srv_defer_sign_response (uint16 mid)
void srv_cancel_sign_response (uint16 mid)
void srv_set_signing_negotiated (void)
BOOL srv_is_signing_active (void)
BOOL srv_is_signing_negotiated (void)
BOOL srv_signing_started (void)
void srv_set_signing (const DATA_BLOB user_session_key, const DATA_BLOB response)

変数

static struct smb_sign_info srv_sign_info


関数

static BOOL store_sequence_for_reply ( struct outstanding_packet_lookup **  list,
uint16  mid,
uint32  reply_seq_num 
) [static]

smb_signing.c38 行で定義されています。

参照先 list()t.

参照元 client_sign_outgoing_message()srv_defer_sign_response().

00040 {
00041         struct outstanding_packet_lookup *t;
00042 
00043         /* Ensure we only add a mid once. */
00044         for (t = *list; t; t = t->next) {
00045                 if (t->mid == mid) {
00046                         return False;
00047                 }
00048         }
00049 
00050         t = SMB_XMALLOC_P(struct outstanding_packet_lookup);
00051         ZERO_STRUCTP(t);
00052 
00053         t->mid = mid;
00054         t->reply_seq_num = reply_seq_num;
00055         t->can_delete = True;
00056 
00057         /*
00058          * Add to the *start* of the list not the end of the list.
00059          * This ensures that the *last* send sequence with this mid
00060          * is returned by preference.
00061          * This can happen if the mid wraps and one of the early
00062          * mid numbers didn't get a reply and is still lurking on
00063          * the list. JRA. Found by Fran Fabrizio <fran@cis.uab.edu>.
00064          */
00065 
00066         DLIST_ADD(*list, t);
00067         DEBUG(10,("store_sequence_for_reply: stored seq = %u mid = %u\n",
00068                         (unsigned int)reply_seq_num, (unsigned int)mid ));
00069         return True;
00070 }

static BOOL get_sequence_for_reply ( struct outstanding_packet_lookup **  list,
uint16  mid,
uint32 *  reply_seq_num 
) [static]

smb_signing.c72 行で定義されています。

参照先 list()t.

参照元 client_check_incoming_message()client_set_trans_sign_state_off()srv_cancel_sign_response()srv_sign_outgoing_message().

00074 {
00075         struct outstanding_packet_lookup *t;
00076 
00077         for (t = *list; t; t = t->next) {
00078                 if (t->mid == mid) {
00079                         *reply_seq_num = t->reply_seq_num;
00080                         DEBUG(10,("get_sequence_for_reply: found seq = %u mid = %u\n",
00081                                 (unsigned int)t->reply_seq_num, (unsigned int)t->mid ));
00082                         if (t->can_delete) {
00083                                 DLIST_REMOVE(*list, t);
00084                                 SAFE_FREE(t);
00085                         }
00086                         return True;
00087                 }
00088         }
00089         return False;
00090 }

static BOOL set_sequence_can_delete_flag ( struct outstanding_packet_lookup **  list,
uint16  mid,
BOOL  can_delete_entry 
) [static]

smb_signing.c92 行で定義されています。

参照先 list()t.

参照元 client_set_trans_sign_state_off()client_set_trans_sign_state_on().

00093 {
00094         struct outstanding_packet_lookup *t;
00095 
00096         for (t = *list; t; t = t->next) {
00097                 if (t->mid == mid) {
00098                         t->can_delete = can_delete_entry;
00099                         return True;
00100                 }
00101         }
00102         return False;
00103 }

static BOOL cli_set_smb_signing_common ( struct cli_state cli  )  [static]

smb_signing.c109 行で定義されています。

参照先 smb_sign_info::allow_smb_signingclismb_sign_info::doing_signingsmb_sign_info::free_signing_contextsmb_sign_info::mandatory_signingsmb_sign_info::negotiated_smb_signingcli_state::readbraw_supportedcli_state::sign_infocli_state::writebraw_supported.

参照元 cli_simple_set_signing()cli_temp_set_signing().

00110 {
00111         if (!cli->sign_info.allow_smb_signing) {
00112                 return False;
00113         }
00114 
00115         if (!cli->sign_info.negotiated_smb_signing 
00116             && !cli->sign_info.mandatory_signing) {
00117                 return False;
00118         }
00119 
00120         if (cli->sign_info.doing_signing) {
00121                 return False;
00122         }
00123         
00124         if (cli->sign_info.free_signing_context)
00125                 cli->sign_info.free_signing_context(&cli->sign_info);
00126 
00127         /* These calls are INCOMPATIBLE with SMB signing */
00128         cli->readbraw_supported = False;
00129         cli->writebraw_supported = False;
00130         
00131         return True;
00132 }

static BOOL set_smb_signing_real_common ( struct smb_sign_info si  )  [static]

smb_signing.c138 行で定義されています。

参照先 smb_sign_info::doing_signingsmb_sign_info::mandatory_signing.

参照元 cli_simple_set_signing().

00139 {
00140         if (si->mandatory_signing) {
00141                 DEBUG(5, ("Mandatory SMB signing enabled!\n"));
00142         }
00143 
00144         si->doing_signing = True;
00145         DEBUG(5, ("SMB signing enabled!\n"));
00146 
00147         return True;
00148 }

static void mark_packet_signed ( char *  outbuf  )  [static]

smb_signing.c150 行で定義されています。

参照元 client_sign_outgoing_message()srv_sign_outgoing_message()temp_sign_outgoing_message().

00151 {
00152         uint16 flags2;
00153         flags2 = SVAL(outbuf,smb_flg2);
00154         flags2 |= FLAGS2_SMB_SECURITY_SIGNATURES;
00155         SSVAL(outbuf,smb_flg2, flags2);
00156 }

static void null_sign_outgoing_message ( char *  outbuf,
struct smb_sign_info si 
) [static]

smb_signing.c162 行で定義されています。

参照元 null_set_signing().

00163 {
00164         /* we can't zero out the sig, as we might be trying to send a
00165            session request - which is NBT-level, not SMB level and doesn't
00166            have the field */
00167         return;
00168 }

static BOOL null_check_incoming_message ( char *  inbuf,
struct smb_sign_info si,
BOOL  must_be_ok 
) [static]

smb_signing.c174 行で定義されています。

参照元 null_set_signing().

00175 {
00176         return True;
00177 }

static void null_free_signing_context ( struct smb_sign_info si  )  [static]

smb_signing.c183 行で定義されています。

参照元 null_set_signing().

00184 {
00185         return;
00186 }

static BOOL null_set_signing ( struct smb_sign_info si  )  [static]

SMB signing - NULL implementation - setup the MAC key.

覚え書き:
Used as an initialisation only - it will not correctly shut down a real signing mechanism

smb_signing.c195 行で定義されています。

参照先 smb_sign_info::check_incoming_messagesmb_sign_info::free_signing_contextnull_check_incoming_message()null_free_signing_context()null_sign_outgoing_message()smb_sign_info::sign_outgoing_messagesmb_sign_info::signing_context.

参照元 cli_null_set_signing()free_signing_context().

00196 {
00197         si->signing_context = NULL;
00198         
00199         si->sign_outgoing_message = null_sign_outgoing_message;
00200         si->check_incoming_message = null_check_incoming_message;
00201         si->free_signing_context = null_free_signing_context;
00202 
00203         return True;
00204 }

static void free_signing_context ( struct smb_sign_info si  )  [static]

Free the signing context

smb_signing.c210 行で定義されています。

参照先 smb_sign_info::free_signing_contextnull_set_signing()smb_sign_info::signing_context.

参照元 cli_check_sign_mac()cli_free_signing_context()signing_good().

00211 {
00212         if (si->free_signing_context) {
00213                 si->free_signing_context(si);
00214                 si->signing_context = NULL;
00215         }
00216 
00217         null_set_signing(si);
00218 }

static BOOL signing_good ( char *  inbuf,
struct smb_sign_info si,
BOOL  good,
uint32  seq,
BOOL  must_be_ok 
) [static]

smb_signing.c221 行で定義されています。

参照先 smb_sign_info::allow_smb_signingsmb_sign_info::doing_signingfree_signing_context()smb_sign_info::mandatory_signingsmb_sign_info::negotiated_smb_signingsmb_sign_info::seen_valid.

参照元 client_check_incoming_message()srv_check_incoming_message().

00222 {
00223         if (good) {
00224 
00225                 if (!si->doing_signing) {
00226                         si->doing_signing = True;
00227                 }
00228                 
00229                 if (!si->seen_valid) {
00230                         si->seen_valid = True;
00231                 }
00232 
00233         } else {
00234                 if (!si->mandatory_signing && !si->seen_valid) {
00235 
00236                         if (!must_be_ok) {
00237                                 return True;
00238                         }
00239                         /* Non-mandatory signing - just turn off if this is the first bad packet.. */
00240                         DEBUG(5, ("srv_check_incoming_message: signing negotiated but not required and peer\n"
00241                                   "isn't sending correct signatures. Turning off.\n"));
00242                         si->negotiated_smb_signing = False;
00243                         si->allow_smb_signing = False;
00244                         si->doing_signing = False;
00245                         free_signing_context(si);
00246                         return True;
00247                 } else if (!must_be_ok) {
00248                         /* This packet is known to be unsigned */
00249                         return True;
00250                 } else {
00251                         /* Mandatory signing or bad packet after signing started - fail and disconnect. */
00252                         if (seq)
00253                                 DEBUG(0, ("signing_good: BAD SIG: seq %u\n", (unsigned int)seq));
00254                         return False;
00255                 }
00256         }
00257         return True;
00258 }       

static void simple_packet_signature ( struct smb_basic_signing_context data,
const uchar *  buf,
uint32  seq_number,
unsigned char  calc_md5_mac[16] 
) [static]

smb_signing.c264 行で定義されています。

参照先 data_blob_::datadata_blob_::lengthsmb_basic_signing_context::mac_keyMD5Final()MD5Init()MD5Update().

参照元 client_check_incoming_message()client_sign_outgoing_message()srv_check_incoming_message()srv_sign_outgoing_message().

00267 {
00268         const size_t offset_end_of_sig = (smb_ss_field + 8);
00269         unsigned char sequence_buf[8];
00270         struct MD5Context md5_ctx;
00271 #if 0
00272         /* JRA - apparently this is incorrect. */
00273         unsigned char key_buf[16];
00274 #endif
00275 
00276         /*
00277          * Firstly put the sequence number into the first 4 bytes.
00278          * and zero out the next 4 bytes.
00279          *
00280          * We do this here, to avoid modifying the packet.
00281          */
00282 
00283         DEBUG(10,("simple_packet_signature: sequence number %u\n", seq_number ));
00284 
00285         SIVAL(sequence_buf, 0, seq_number);
00286         SIVAL(sequence_buf, 4, 0);
00287 
00288         /* Calculate the 16 byte MAC - but don't alter the data in the
00289            incoming packet.
00290            
00291            This makes for a bit of fussing about, but it's not too bad.
00292         */
00293         MD5Init(&md5_ctx);
00294 
00295         /* intialise with the key */
00296         MD5Update(&md5_ctx, data->mac_key.data, data->mac_key.length); 
00297 #if 0
00298         /* JRA - apparently this is incorrect. */
00299         /* NB. When making and verifying SMB signatures, Windows apparently
00300                 zero-pads the key to 128 bits if it isn't long enough.
00301                 From Nalin Dahyabhai <nalin@redhat.com> */
00302         if (data->mac_key.length < sizeof(key_buf)) {
00303                 memset(key_buf, 0, sizeof(key_buf));
00304                 MD5Update(&md5_ctx, key_buf, sizeof(key_buf) - data->mac_key.length);
00305         }
00306 #endif
00307 
00308         /* copy in the first bit of the SMB header */
00309         MD5Update(&md5_ctx, buf + 4, smb_ss_field - 4);
00310 
00311         /* copy in the sequence number, instead of the signature */
00312         MD5Update(&md5_ctx, sequence_buf, sizeof(sequence_buf));
00313 
00314         /* copy in the rest of the packet in, skipping the signature */
00315         MD5Update(&md5_ctx, buf + offset_end_of_sig, 
00316                   smb_len(buf) - (offset_end_of_sig - 4));
00317 
00318         /* calculate the MD5 sig */ 
00319         MD5Final(calc_md5_mac, &md5_ctx);
00320 }

static void client_sign_outgoing_message ( char *  outbuf,
struct smb_sign_info si 
) [static]

smb_signing.c327 行で定義されています。

参照先 smb_sign_info::doing_signingdump_data()mark_packet_signed()smb_basic_signing_context::outstanding_packet_listsmb_basic_signing_context::send_seq_numsmb_sign_info::signing_contextsimple_packet_signature()store_sequence_for_reply().

参照元 cli_simple_set_signing().

00328 {
00329         unsigned char calc_md5_mac[16];
00330         struct smb_basic_signing_context *data =
00331                 (struct smb_basic_signing_context *)si->signing_context;
00332 
00333         if (!si->doing_signing)
00334                 return;
00335 
00336         /* JRA Paranioa test - we should be able to get rid of this... */
00337         if (smb_len(outbuf) < (smb_ss_field + 8 - 4)) {
00338                 DEBUG(1, ("client_sign_outgoing_message: Logic error. Can't check signature on short packet! smb_len = %u\n",
00339                                         smb_len(outbuf) ));
00340                 abort();
00341         }
00342 
00343         /* mark the packet as signed - BEFORE we sign it...*/
00344         mark_packet_signed(outbuf);
00345 
00346         simple_packet_signature(data, (const unsigned char *)outbuf,
00347                                 data->send_seq_num, calc_md5_mac);
00348 
00349         DEBUG(10, ("client_sign_outgoing_message: sent SMB signature of\n"));
00350         dump_data(10, (const char *)calc_md5_mac, 8);
00351 
00352         memcpy(&outbuf[smb_ss_field], calc_md5_mac, 8);
00353 
00354 /*      cli->outbuf[smb_ss_field+2]=0; 
00355         Uncomment this to test if the remote server actually verifies signatures...*/
00356 
00357         /* Instead of re-introducing the trans_info_conect we
00358            used to have here, we use the fact that during a
00359            SMBtrans/SMBtrans2/SMBnttrans send that the mid stays
00360            constant. This means that calling store_sequence_for_reply()
00361            will return False for all trans secondaries, as the mid is already
00362            on the stored sequence list. As the send_seqence_number must
00363            remain constant for all primary+secondary trans sends, we
00364            only increment the send sequence number when we successfully
00365            add a new entry to the outstanding sequence list. This means
00366            I can isolate the fix here rather than re-adding the trans
00367            signing on/off calls in libsmb/clitrans2.c JRA.
00368          */
00369         
00370         if (store_sequence_for_reply(&data->outstanding_packet_list, SVAL(outbuf,smb_mid), data->send_seq_num + 1)) {
00371                 data->send_seq_num += 2;
00372         }
00373 }

static BOOL client_check_incoming_message ( char *  inbuf,
struct smb_sign_info si,
BOOL  must_be_ok 
) [static]

smb_signing.c379 行で定義されています。

参照先 smb_sign_info::doing_signingdump_data()get_sequence_for_reply()smb_basic_signing_context::outstanding_packet_listsmb_sign_info::signing_contextsigning_good()simple_packet_signature().

参照元 cli_simple_set_signing().

00380 {
00381         BOOL good;
00382         uint32 reply_seq_number;
00383         unsigned char calc_md5_mac[16];
00384         unsigned char *server_sent_mac;
00385 
00386         struct smb_basic_signing_context *data =
00387                 (struct smb_basic_signing_context *)si->signing_context;
00388 
00389         if (!si->doing_signing)
00390                 return True;
00391 
00392         if (smb_len(inbuf) < (smb_ss_field + 8 - 4)) {
00393                 DEBUG(1, ("client_check_incoming_message: Can't check signature on short packet! smb_len = %u\n", smb_len(inbuf)));
00394                 return False;
00395         }
00396 
00397         if (!get_sequence_for_reply(&data->outstanding_packet_list, SVAL(inbuf, smb_mid), &reply_seq_number)) {
00398                 DEBUG(1, ("client_check_incoming_message: received message "
00399                         "with mid %u with no matching send record.\n", (unsigned int)SVAL(inbuf, smb_mid) ));
00400                 return False;
00401         }
00402 
00403         simple_packet_signature(data, (const unsigned char *)inbuf,
00404                                 reply_seq_number, calc_md5_mac);
00405 
00406         server_sent_mac = (unsigned char *)&inbuf[smb_ss_field];
00407         good = (memcmp(server_sent_mac, calc_md5_mac, 8) == 0);
00408         
00409         if (!good) {
00410                 DEBUG(5, ("client_check_incoming_message: BAD SIG: wanted SMB signature of\n"));
00411                 dump_data(5, (const char *)calc_md5_mac, 8);
00412                 
00413                 DEBUG(5, ("client_check_incoming_message: BAD SIG: got SMB signature of\n"));
00414                 dump_data(5, (const char *)server_sent_mac, 8);
00415 #if 1 /* JRATEST */
00416                 {
00417                         int i;
00418                         for (i = -5; i < 5; i++) {
00419                                 simple_packet_signature(data, (const unsigned char *)inbuf, reply_seq_number+i, calc_md5_mac);
00420                                 if (memcmp(server_sent_mac, calc_md5_mac, 8) == 0) {
00421                                         DEBUG(0,("client_check_incoming_message: out of seq. seq num %u matches. \
00422 We were expecting seq %u\n", reply_seq_number+i, reply_seq_number ));
00423                                         break;
00424                                 }
00425                         }
00426                 }
00427 #endif /* JRATEST */
00428 
00429         } else {
00430                 DEBUG(10, ("client_check_incoming_message: seq %u: got good SMB signature of\n", (unsigned int)reply_seq_number));
00431                 dump_data(10, (const char *)server_sent_mac, 8);
00432         }
00433         return signing_good(inbuf, si, good, reply_seq_number, must_be_ok);
00434 }

static void simple_free_signing_context ( struct smb_sign_info si  )  [static]

smb_signing.c440 行で定義されています。

参照先 data_blob_free()list()smb_basic_signing_context::mac_keysmb_basic_signing_context::outstanding_packet_listsmb_sign_info::signing_context.

参照元 cli_simple_set_signing()srv_set_signing().

00441 {
00442         struct smb_basic_signing_context *data =
00443                 (struct smb_basic_signing_context *)si->signing_context;
00444         struct outstanding_packet_lookup *list;
00445         struct outstanding_packet_lookup *next;
00446         
00447         for (list = data->outstanding_packet_list; list; list = next) {
00448                 next = list->next;
00449                 DLIST_REMOVE(data->outstanding_packet_list, list);
00450                 SAFE_FREE(list);
00451         }
00452 
00453         data_blob_free(&data->mac_key);
00454 
00455         SAFE_FREE(si->signing_context);
00456 
00457         return;
00458 }

BOOL cli_simple_set_signing ( struct cli_state cli,
const DATA_BLOB  user_session_key,
const DATA_BLOB  response 
)

smb_signing.c464 行で定義されています。

参照先 smb_sign_info::check_incoming_messageclicli_set_smb_signing_common()client_check_incoming_message()client_sign_outgoing_message()data_blob_::datadata_blob()dump_data()dump_data_pw()smb_sign_info::free_signing_contextdata_blob_::lengthset_smb_signing_real_common()cli_state::sign_infosmb_sign_info::sign_outgoing_messagesmb_sign_info::signing_contextsimple_free_signing_context().

参照元 cli_session_setup_blob()cli_session_setup_nt1()cli_session_setup_ntlmssp().

00467 {
00468         struct smb_basic_signing_context *data;
00469 
00470         if (!user_session_key.length)
00471                 return False;
00472 
00473         if (!cli_set_smb_signing_common(cli)) {
00474                 return False;
00475         }
00476 
00477         if (!set_smb_signing_real_common(&cli->sign_info)) {
00478                 return False;
00479         }
00480 
00481         data = SMB_XMALLOC_P(struct smb_basic_signing_context);
00482         memset(data, '\0', sizeof(*data));
00483 
00484         cli->sign_info.signing_context = data;
00485         
00486         data->mac_key = data_blob(NULL, response.length + user_session_key.length);
00487 
00488         memcpy(&data->mac_key.data[0], user_session_key.data, user_session_key.length);
00489 
00490         DEBUG(10, ("cli_simple_set_signing: user_session_key\n"));
00491         dump_data(10, (const char *)user_session_key.data, user_session_key.length);
00492 
00493         if (response.length) {
00494                 memcpy(&data->mac_key.data[user_session_key.length],response.data, response.length);
00495                 DEBUG(10, ("cli_simple_set_signing: response_data\n"));
00496                 dump_data(10, (const char *)response.data, response.length);
00497         } else {
00498                 DEBUG(10, ("cli_simple_set_signing: NULL response_data\n"));
00499         }
00500 
00501         dump_data_pw("MAC ssession key is:\n", data->mac_key.data, data->mac_key.length);
00502 
00503         /* Initialise the sequence number */
00504         data->send_seq_num = 0;
00505 
00506         /* Initialise the list of outstanding packets */
00507         data->outstanding_packet_list = NULL;
00508 
00509         cli->sign_info.sign_outgoing_message = client_sign_outgoing_message;
00510         cli->sign_info.check_incoming_message = client_check_incoming_message;
00511         cli->sign_info.free_signing_context = simple_free_signing_context;
00512 
00513         return True;
00514 }

static void temp_sign_outgoing_message ( char *  outbuf,
struct smb_sign_info si 
) [static]

smb_signing.c520 行で定義されています。

参照先 mark_packet_signed().

参照元 cli_temp_set_signing()srv_set_signing_negotiated().

00521 {
00522         /* mark the packet as signed - BEFORE we sign it...*/
00523         mark_packet_signed(outbuf);
00524 
00525         /* I wonder what BSRSPYL stands for - but this is what MS 
00526            actually sends! */
00527         memcpy(&outbuf[smb_ss_field], "BSRSPYL ", 8);
00528         return;
00529 }

static BOOL temp_check_incoming_message ( char *  inbuf,
struct smb_sign_info si,
BOOL  foo 
) [static]

smb_signing.c535 行で定義されています。

参照元 cli_temp_set_signing()srv_set_signing_negotiated().

00536 {
00537         return True;
00538 }

static void temp_free_signing_context ( struct smb_sign_info si  )  [static]

smb_signing.c544 行で定義されています。

参照元 cli_temp_set_signing()srv_set_signing_negotiated().

00545 {
00546         return;
00547 }

BOOL cli_null_set_signing ( struct cli_state cli  ) 

smb_signing.c553 行で定義されています。

参照先 clinull_set_signing()cli_state::sign_info.

参照元 cli_initialise().

00554 {
00555         return null_set_signing(&cli->sign_info);
00556 }

BOOL cli_temp_set_signing ( struct cli_state cli  ) 

smb_signing.c562 行で定義されています。

参照先 smb_sign_info::check_incoming_messageclicli_set_smb_signing_common()smb_sign_info::free_signing_contextcli_state::sign_infosmb_sign_info::sign_outgoing_messagesmb_sign_info::signing_contexttemp_check_incoming_message()temp_free_signing_context()temp_sign_outgoing_message().

参照元 cli_session_setup_ntlmssp().

00563 {
00564         if (!cli_set_smb_signing_common(cli)) {
00565                 return False;
00566         }
00567 
00568         cli->sign_info.signing_context = NULL;
00569         
00570         cli->sign_info.sign_outgoing_message = temp_sign_outgoing_message;
00571         cli->sign_info.check_incoming_message = temp_check_incoming_message;
00572         cli->sign_info.free_signing_context = temp_free_signing_context;
00573 
00574         return True;
00575 }

void cli_free_signing_context ( struct cli_state cli  ) 

smb_signing.c577 行で定義されています。

参照先 clifree_signing_context()cli_state::sign_info.

参照元 cli_shutdown().

00578 {
00579         free_signing_context(&cli->sign_info);
00580 }

void cli_calculate_sign_mac ( struct cli_state cli  ) 

Sign a packet with the current mechanism

smb_signing.c586 行で定義されています。

参照先 clicli_state::outbufcli_state::sign_infosmb_sign_info::sign_outgoing_message.

参照元 cli_send_smb()cli_session_setup_ntlmssp().

00587 {
00588         cli->sign_info.sign_outgoing_message(cli->outbuf, &cli->sign_info);
00589 }

BOOL cli_check_sign_mac ( struct cli_state cli  ) 

Check a packet with the current mechanism

戻り値:
False if we had an established signing connection which had a bad checksum, True otherwise.

smb_signing.c597 行で定義されています。

参照先 smb_sign_info::check_incoming_messageclifree_signing_context()cli_state::inbufcli_state::sign_info.

参照元 cli_receive_smb()cli_session_setup_ntlmssp().

00598 {
00599         if (!cli->sign_info.check_incoming_message(cli->inbuf, &cli->sign_info, True)) {
00600                 free_signing_context(&cli->sign_info);  
00601                 return False;
00602         }
00603         return True;
00604 }

BOOL client_set_trans_sign_state_on ( struct cli_state cli,
uint16  mid 
)

smb_signing.c610 行で定義されています。

参照先 clismb_sign_info::doing_signingsmb_basic_signing_context::outstanding_packet_listset_sequence_can_delete_flag()cli_state::sign_infosmb_sign_info::signing_context.

参照元 cli_send_nt_trans()cli_send_trans().

00611 {
00612         struct smb_sign_info *si = &cli->sign_info;
00613         struct smb_basic_signing_context *data = (struct smb_basic_signing_context *)si->signing_context;
00614 
00615         if (!si->doing_signing) {
00616                 return True;
00617         }
00618 
00619         if (!data) {
00620                 return False;
00621         }
00622 
00623         if (!set_sequence_can_delete_flag(&data->outstanding_packet_list, mid, False)) {
00624                 return False;
00625         }
00626 
00627         return True;
00628 }

BOOL client_set_trans_sign_state_off ( struct cli_state cli,
uint16  mid 
)

smb_signing.c634 行で定義されています。

参照先 clismb_sign_info::doing_signingget_sequence_for_reply()smb_basic_signing_context::outstanding_packet_listset_sequence_can_delete_flag()cli_state::sign_infosmb_sign_info::signing_context.

参照元 cli_receive_nt_trans()cli_send_nt_trans()cli_send_trans().

00635 {
00636         uint32 reply_seq_num;
00637         struct smb_sign_info *si = &cli->sign_info;
00638         struct smb_basic_signing_context *data = (struct smb_basic_signing_context *)si->signing_context;
00639 
00640         if (!si->doing_signing) {
00641                 return True;
00642         }
00643 
00644         if (!data) {
00645                 return False;
00646         }
00647 
00648         if (!set_sequence_can_delete_flag(&data->outstanding_packet_list, mid, True)) {
00649                 return False;
00650         }
00651 
00652         /* Now delete the stored mid entry. */
00653         if (!get_sequence_for_reply(&data->outstanding_packet_list, mid, &reply_seq_num)) {
00654                 return False;
00655         }
00656 
00657         return True;
00658 }

static void srv_sign_outgoing_message ( char *  outbuf,
struct smb_sign_info si 
) [static]

smb_signing.c664 行で定義されています。

参照先 smb_sign_info::doing_signingdump_data()get_sequence_for_reply()mark_packet_signed()smb_basic_signing_context::outstanding_packet_listsmb_basic_signing_context::send_seq_numsmb_sign_info::signing_contextsimple_packet_signature().

参照元 srv_set_signing().

00665 {
00666         unsigned char calc_md5_mac[16];
00667         struct smb_basic_signing_context *data =
00668                 (struct smb_basic_signing_context *)si->signing_context;
00669         uint32 send_seq_number = data->send_seq_num-1;
00670         uint16 mid;
00671 
00672         if (!si->doing_signing) {
00673                 return;
00674         }
00675 
00676         /* JRA Paranioa test - we should be able to get rid of this... */
00677         if (smb_len(outbuf) < (smb_ss_field + 8 - 4)) {
00678                 DEBUG(1, ("srv_sign_outgoing_message: Logic error. Can't send signature on short packet! smb_len = %u\n",
00679                                         smb_len(outbuf) ));
00680                 abort();
00681         }
00682 
00683         /* mark the packet as signed - BEFORE we sign it...*/
00684         mark_packet_signed(outbuf);
00685 
00686         mid = SVAL(outbuf, smb_mid);
00687 
00688         /* See if this is a reply for a deferred packet. */
00689         get_sequence_for_reply(&data->outstanding_packet_list, mid, &send_seq_number);
00690 
00691         simple_packet_signature(data, (const unsigned char *)outbuf, send_seq_number, calc_md5_mac);
00692 
00693         DEBUG(10, ("srv_sign_outgoing_message: seq %u: sent SMB signature of\n", (unsigned int)send_seq_number));
00694         dump_data(10, (const char *)calc_md5_mac, 8);
00695 
00696         memcpy(&outbuf[smb_ss_field], calc_md5_mac, 8);
00697 
00698 /*      cli->outbuf[smb_ss_field+2]=0; 
00699         Uncomment this to test if the remote client actually verifies signatures...*/
00700 }

static BOOL srv_check_incoming_message ( char *  inbuf,
struct smb_sign_info si,
BOOL  must_be_ok 
) [static]

smb_signing.c706 行で定義されています。

参照先 smb_sign_info::doing_signingdump_data()smb_basic_signing_context::send_seq_numsmb_sign_info::signing_contextsigning_good()simple_packet_signature().

参照元 srv_set_signing().

00707 {
00708         BOOL good;
00709         struct smb_basic_signing_context *data =
00710                 (struct smb_basic_signing_context *)si->signing_context;
00711         uint32 reply_seq_number = data->send_seq_num;
00712         uint32 saved_seq;
00713         unsigned char calc_md5_mac[16];
00714         unsigned char *server_sent_mac;
00715 
00716         if (!si->doing_signing)
00717                 return True;
00718 
00719         if (smb_len(inbuf) < (smb_ss_field + 8 - 4)) {
00720                 DEBUG(1, ("srv_check_incoming_message: Can't check signature on short packet! smb_len = %u\n", smb_len(inbuf)));
00721                 return False;
00722         }
00723 
00724         /* We always increment the sequence number. */
00725         data->send_seq_num += 2;
00726 
00727         saved_seq = reply_seq_number;
00728         simple_packet_signature(data, (const unsigned char *)inbuf, reply_seq_number, calc_md5_mac);
00729 
00730         server_sent_mac = (unsigned char *)&inbuf[smb_ss_field];
00731         good = (memcmp(server_sent_mac, calc_md5_mac, 8) == 0);
00732         
00733         if (!good) {
00734 
00735                 if (saved_seq) {
00736                         DEBUG(0, ("srv_check_incoming_message: BAD SIG: seq %u wanted SMB signature of\n",
00737                                         (unsigned int)saved_seq));
00738                         dump_data(5, (const char *)calc_md5_mac, 8);
00739 
00740                         DEBUG(0, ("srv_check_incoming_message: BAD SIG: seq %u got SMB signature of\n",
00741                                                 (unsigned int)reply_seq_number));
00742                         dump_data(5, (const char *)server_sent_mac, 8);
00743                 }
00744                 
00745 #if 1 /* JRATEST */
00746                 {
00747                         int i;
00748                         reply_seq_number -= 5;
00749                         for (i = 0; i < 10; i++, reply_seq_number++) {
00750                                 simple_packet_signature(data, (const unsigned char *)inbuf, reply_seq_number, calc_md5_mac);
00751                                 if (memcmp(server_sent_mac, calc_md5_mac, 8) == 0) {
00752                                         DEBUG(0,("srv_check_incoming_message: out of seq. seq num %u matches. \
00753 We were expecting seq %u\n", reply_seq_number, saved_seq ));
00754                                         break;
00755                                 }
00756                         }
00757                 }
00758 #endif /* JRATEST */
00759 
00760         } else {
00761                 DEBUG(10, ("srv_check_incoming_message: seq %u: (current is %u) got good SMB signature of\n", (unsigned int)reply_seq_number, (unsigned int)data->send_seq_num));
00762                 dump_data(10, (const char *)server_sent_mac, 8);
00763         }
00764 
00765         return (signing_good(inbuf, si, good, saved_seq, must_be_ok));
00766 }

BOOL srv_oplock_set_signing ( BOOL  onoff  ) 

smb_signing.c787 行で定義されています。

参照先 smb_sign_info::doing_signingsrv_sign_info.

参照元 process_kernel_oplock_break()process_oplock_async_level2_break_message()process_oplock_break_message().

00788 {
00789         BOOL ret = srv_sign_info.doing_signing;
00790         srv_sign_info.doing_signing = onoff;
00791         return ret;
00792 }

BOOL srv_check_sign_mac ( char *  inbuf,
BOOL  must_be_ok 
)

smb_signing.c798 行で定義されています。

参照先 smb_sign_info::check_incoming_messagesrv_sign_info.

参照元 receive_smb()sessionsetup_start_signing_engine().

00799 {
00800         /* Check if it's a session keepalive. */
00801         if(CVAL(inbuf,0) == SMBkeepalive)
00802                 return True;
00803 
00804         return srv_sign_info.check_incoming_message(inbuf, &srv_sign_info, must_be_ok);
00805 }

void srv_calculate_sign_mac ( char *  outbuf  ) 

smb_signing.c811 行で定義されています。

参照先 smb_sign_info::sign_outgoing_messagesrv_sign_info.

参照元 send_smb().

00812 {
00813         /* Check if it's a session keepalive. */
00814         /* JRA Paranioa test - do we ever generate these in the server ? */
00815         if(CVAL(outbuf,0) == SMBkeepalive)
00816                 return;
00817 
00818         srv_sign_info.sign_outgoing_message(outbuf, &srv_sign_info);
00819 }

void srv_defer_sign_response ( uint16  mid  ) 

smb_signing.c825 行で定義されています。

参照先 smb_sign_info::doing_signingsmb_basic_signing_context::outstanding_packet_listsmb_basic_signing_context::send_seq_numsmb_sign_info::signing_contextsrv_sign_infostore_sequence_for_reply().

参照元 change_notify_add_request()push_blocking_lock_request()schedule_aio_read_and_X()schedule_aio_write_and_X().

00826 {
00827         struct smb_basic_signing_context *data;
00828 
00829         if (!srv_sign_info.doing_signing)
00830                 return;
00831 
00832         data = (struct smb_basic_signing_context *)srv_sign_info.signing_context;
00833 
00834         if (!data)
00835                 return;
00836 
00837         /*
00838          * Ensure we only store this mid reply once...
00839          */
00840 
00841         store_sequence_for_reply(&data->outstanding_packet_list, mid,
00842                                  data->send_seq_num-1);
00843 }

void srv_cancel_sign_response ( uint16  mid  ) 

smb_signing.c850 行で定義されています。

参照先 smb_sign_info::doing_signingget_sequence_for_reply()smb_basic_signing_context::outstanding_packet_listsmb_basic_signing_context::send_seq_numsmb_sign_info::signing_contextsrv_sign_info.

参照元 handle_aio_read_complete()handle_aio_write_complete()process_aio_queue()reply_ntcancel().

00851 {
00852         struct smb_basic_signing_context *data;
00853         uint32 dummy_seq;
00854 
00855         if (!srv_sign_info.doing_signing)
00856                 return;
00857 
00858         data = (struct smb_basic_signing_context *)srv_sign_info.signing_context;
00859 
00860         if (!data)
00861                 return;
00862 
00863         DEBUG(10,("srv_cancel_sign_response: for mid %u\n", (unsigned int)mid ));
00864 
00865         while (get_sequence_for_reply(&data->outstanding_packet_list, mid, &dummy_seq))
00866                 ;
00867 
00868         /* cancel doesn't send a reply so doesn't burn a sequence number. */
00869         data->send_seq_num -= 1;
00870 }

void srv_set_signing_negotiated ( void   ) 

smb_signing.c876 行で定義されています。

参照先 smb_sign_info::allow_smb_signingsmb_sign_info::check_incoming_messagesmb_sign_info::free_signing_contextsmb_sign_info::mandatory_signingsmb_sign_info::negotiated_smb_signingsmb_sign_info::sign_outgoing_messagesrv_sign_infotemp_check_incoming_message()temp_free_signing_context()temp_sign_outgoing_message().

参照元 reply_nt1().

BOOL srv_is_signing_active ( void   ) 

smb_signing.c893 行で定義されています。

参照先 smb_sign_info::doing_signingsrv_sign_info.

参照元 reply_readbraw()reply_writebraw().

00894 {
00895         return srv_sign_info.doing_signing;
00896 }

BOOL srv_is_signing_negotiated ( void   ) 

smb_signing.c904 行で定義されています。

参照先 smb_sign_info::negotiated_smb_signingsrv_sign_info.

参照元 register_vuid().

00905 {
00906         return srv_sign_info.negotiated_smb_signing;
00907 }

BOOL srv_signing_started ( void   ) 

smb_signing.c913 行で定義されています。

参照先 smb_sign_info::doing_signingsmb_basic_signing_context::send_seq_numsmb_sign_info::signing_contextsrv_sign_info.

参照元 register_vuid()sessionsetup_start_signing_engine().

00914 {
00915         struct smb_basic_signing_context *data;
00916 
00917         if (!srv_sign_info.doing_signing) {
00918                 return False;
00919         }
00920 
00921         data = (struct smb_basic_signing_context *)srv_sign_info.signing_context;
00922         if (!data)
00923                 return False;
00924 
00925         if (data->send_seq_num == 0) {
00926                 return False;
00927         }
00928 
00929         return True;
00930 }

void srv_set_signing ( const DATA_BLOB  user_session_key,
const DATA_BLOB  response 
)

smb_signing.c936 行で定義されています。

参照先 smb_sign_info::check_incoming_messagedata_blob_::datadata_blob()smb_sign_info::doing_signingdump_data_pw()smb_sign_info::free_signing_contextdata_blob_::lengthsmb_sign_info::mandatory_signingsmb_sign_info::negotiated_smb_signingsmb_sign_info::sign_outgoing_messagesmb_sign_info::signing_contextsimple_free_signing_context()srv_check_incoming_message()srv_sign_infosrv_sign_outgoing_message().

参照元 register_vuid().

00937 {
00938         struct smb_basic_signing_context *data;
00939 
00940         if (!user_session_key.length)
00941                 return;
00942 
00943         if (!srv_sign_info.negotiated_smb_signing && !srv_sign_info.mandatory_signing) {
00944                 DEBUG(5,("srv_set_signing: signing negotiated = %u, mandatory_signing = %u. Not allowing smb signing.\n",
00945                         (unsigned int)srv_sign_info.negotiated_smb_signing,
00946                         (unsigned int)srv_sign_info.mandatory_signing ));
00947                 return;
00948         }
00949 
00950         /* Once we've turned on, ignore any more sessionsetups. */
00951         if (srv_sign_info.doing_signing) {
00952                 return;
00953         }
00954         
00955         if (srv_sign_info.free_signing_context)
00956                 srv_sign_info.free_signing_context(&srv_sign_info);
00957         
00958         srv_sign_info.doing_signing = True;
00959 
00960         data = SMB_XMALLOC_P(struct smb_basic_signing_context);
00961         memset(data, '\0', sizeof(*data));
00962 
00963         srv_sign_info.signing_context = data;
00964         
00965         data->mac_key = data_blob(NULL, response.length + user_session_key.length);
00966 
00967         memcpy(&data->mac_key.data[0], user_session_key.data, user_session_key.length);
00968         if (response.length)
00969                 memcpy(&data->mac_key.data[user_session_key.length],response.data, response.length);
00970 
00971         dump_data_pw("MAC ssession key is:\n", data->mac_key.data, data->mac_key.length);
00972 
00973         DEBUG(3,("srv_set_signing: turning on SMB signing: signing negotiated = %s, mandatory_signing = %s.\n",
00974                                 BOOLSTR(srv_sign_info.negotiated_smb_signing),
00975                                 BOOLSTR(srv_sign_info.mandatory_signing) ));
00976 
00977         /* Initialise the sequence number */
00978         data->send_seq_num = 0;
00979 
00980         /* Initialise the list of outstanding packets */
00981         data->outstanding_packet_list = NULL;
00982 
00983         srv_sign_info.sign_outgoing_message = srv_sign_outgoing_message;
00984         srv_sign_info.check_incoming_message = srv_check_incoming_message;
00985         srv_sign_info.free_signing_context = simple_free_signing_context;
00986 }


変数

struct smb_sign_info srv_sign_info [static]

初期値:

smb_signing.c772 行で定義されています。

参照元 srv_calculate_sign_mac()srv_cancel_sign_response()srv_check_sign_mac()srv_defer_sign_response()srv_is_signing_active()srv_is_signing_negotiated()srv_oplock_set_signing()srv_set_signing()srv_set_signing_negotiated()srv_signing_started().


Sambaに対してSat Aug 29 21:23:49 2009に生成されました。  doxygen 1.4.7