static BOOL store_sequence_for_reply | ( | struct outstanding_packet_lookup ** | list, | |
uint16 | mid, | |||
uint32 | reply_seq_num | |||
) | [static] |
smb_signing.c の 38 行で定義されています。
参照元 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.c の 72 行で定義されています。
参照元 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.c の 92 行で定義されています。
参照元 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 }
smb_signing.c の 109 行で定義されています。
参照先 smb_sign_info::allow_smb_signing・cli・smb_sign_info::doing_signing・smb_sign_info::free_signing_context・smb_sign_info::mandatory_signing・smb_sign_info::negotiated_smb_signing・cli_state::readbraw_supported・cli_state::sign_info・cli_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.c の 138 行で定義されています。
参照先 smb_sign_info::doing_signing・smb_sign_info::mandatory_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.c の 150 行で定義されています。
参照元 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.c の 162 行で定義されています。
参照元 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] |
static void null_free_signing_context | ( | struct smb_sign_info * | si | ) | [static] |
static BOOL null_set_signing | ( | struct smb_sign_info * | si | ) | [static] |
SMB signing - NULL implementation - setup the MAC key.
smb_signing.c の 195 行で定義されています。
参照先 smb_sign_info::check_incoming_message・smb_sign_info::free_signing_context・null_check_incoming_message()・null_free_signing_context()・null_sign_outgoing_message()・smb_sign_info::sign_outgoing_message・smb_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.c の 210 行で定義されています。
参照先 smb_sign_info::free_signing_context・null_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.c の 221 行で定義されています。
参照先 smb_sign_info::allow_smb_signing・smb_sign_info::doing_signing・free_signing_context()・smb_sign_info::mandatory_signing・smb_sign_info::negotiated_smb_signing・smb_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.c の 264 行で定義されています。
参照先 data_blob_::data・data_blob_::length・smb_basic_signing_context::mac_key・MD5Final()・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.c の 327 行で定義されています。
参照先 smb_sign_info::doing_signing・dump_data()・mark_packet_signed()・smb_basic_signing_context::outstanding_packet_list・smb_basic_signing_context::send_seq_num・smb_sign_info::signing_context・simple_packet_signature()・store_sequence_for_reply().
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.c の 379 行で定義されています。
参照先 smb_sign_info::doing_signing・dump_data()・get_sequence_for_reply()・smb_basic_signing_context::outstanding_packet_list・smb_sign_info::signing_context・signing_good()・simple_packet_signature().
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.c の 440 行で定義されています。
参照先 data_blob_free()・list()・smb_basic_signing_context::mac_key・smb_basic_signing_context::outstanding_packet_list・smb_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.c の 464 行で定義されています。
参照先 smb_sign_info::check_incoming_message・cli・cli_set_smb_signing_common()・client_check_incoming_message()・client_sign_outgoing_message()・data_blob_::data・data_blob()・dump_data()・dump_data_pw()・smb_sign_info::free_signing_context・data_blob_::length・set_smb_signing_real_common()・cli_state::sign_info・smb_sign_info::sign_outgoing_message・smb_sign_info::signing_context・simple_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.c の 520 行で定義されています。
参照先 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] |
static void temp_free_signing_context | ( | struct smb_sign_info * | si | ) | [static] |
smb_signing.c の 553 行で定義されています。
参照先 cli・null_set_signing()・cli_state::sign_info.
参照元 cli_initialise().
00554 { 00555 return null_set_signing(&cli->sign_info); 00556 }
smb_signing.c の 562 行で定義されています。
参照先 smb_sign_info::check_incoming_message・cli・cli_set_smb_signing_common()・smb_sign_info::free_signing_context・cli_state::sign_info・smb_sign_info::sign_outgoing_message・smb_sign_info::signing_context・temp_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.c の 577 行で定義されています。
参照先 cli・free_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.c の 586 行で定義されています。
参照先 cli・cli_state::outbuf・cli_state::sign_info・smb_sign_info::sign_outgoing_message.
参照元 cli_send_smb()・cli_session_setup_ntlmssp().
Check a packet with the current mechanism
smb_signing.c の 597 行で定義されています。
参照先 smb_sign_info::check_incoming_message・cli・free_signing_context()・cli_state::inbuf・cli_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 }
smb_signing.c の 610 行で定義されています。
参照先 cli・smb_sign_info::doing_signing・smb_basic_signing_context::outstanding_packet_list・set_sequence_can_delete_flag()・cli_state::sign_info・smb_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 }
smb_signing.c の 634 行で定義されています。
参照先 cli・smb_sign_info::doing_signing・get_sequence_for_reply()・smb_basic_signing_context::outstanding_packet_list・set_sequence_can_delete_flag()・cli_state::sign_info・smb_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.c の 664 行で定義されています。
参照先 smb_sign_info::doing_signing・dump_data()・get_sequence_for_reply()・mark_packet_signed()・smb_basic_signing_context::outstanding_packet_list・smb_basic_signing_context::send_seq_num・smb_sign_info::signing_context・simple_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.c の 706 行で定義されています。
参照先 smb_sign_info::doing_signing・dump_data()・smb_basic_signing_context::send_seq_num・smb_sign_info::signing_context・signing_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 }
smb_signing.c の 787 行で定義されています。
参照先 smb_sign_info::doing_signing・srv_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 }
smb_signing.c の 798 行で定義されています。
参照先 smb_sign_info::check_incoming_message・srv_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.c の 811 行で定義されています。
参照先 smb_sign_info::sign_outgoing_message・srv_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.c の 825 行で定義されています。
参照先 smb_sign_info::doing_signing・smb_basic_signing_context::outstanding_packet_list・smb_basic_signing_context::send_seq_num・smb_sign_info::signing_context・srv_sign_info・store_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.c の 850 行で定義されています。
参照先 smb_sign_info::doing_signing・get_sequence_for_reply()・smb_basic_signing_context::outstanding_packet_list・smb_basic_signing_context::send_seq_num・smb_sign_info::signing_context・srv_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.c の 876 行で定義されています。
参照先 smb_sign_info::allow_smb_signing・smb_sign_info::check_incoming_message・smb_sign_info::free_signing_context・smb_sign_info::mandatory_signing・smb_sign_info::negotiated_smb_signing・smb_sign_info::sign_outgoing_message・srv_sign_info・temp_check_incoming_message()・temp_free_signing_context()・temp_sign_outgoing_message().
参照元 reply_nt1().
00877 { 00878 srv_sign_info.allow_smb_signing = True; 00879 srv_sign_info.negotiated_smb_signing = True; 00880 if (lp_server_signing() == Required) 00881 srv_sign_info.mandatory_signing = True; 00882 00883 srv_sign_info.sign_outgoing_message = temp_sign_outgoing_message; 00884 srv_sign_info.check_incoming_message = temp_check_incoming_message; 00885 srv_sign_info.free_signing_context = temp_free_signing_context; 00886 }
BOOL srv_is_signing_active | ( | void | ) |
smb_signing.c の 893 行で定義されています。
参照先 smb_sign_info::doing_signing・srv_sign_info.
参照元 reply_readbraw()・reply_writebraw().
00894 { 00895 return srv_sign_info.doing_signing; 00896 }
BOOL srv_is_signing_negotiated | ( | void | ) |
smb_signing.c の 904 行で定義されています。
参照先 smb_sign_info::negotiated_smb_signing・srv_sign_info.
参照元 register_vuid().
00905 { 00906 return srv_sign_info.negotiated_smb_signing; 00907 }
BOOL srv_signing_started | ( | void | ) |
smb_signing.c の 913 行で定義されています。
参照先 smb_sign_info::doing_signing・smb_basic_signing_context::send_seq_num・smb_sign_info::signing_context・srv_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 }
smb_signing.c の 936 行で定義されています。
参照先 smb_sign_info::check_incoming_message・data_blob_::data・data_blob()・smb_sign_info::doing_signing・dump_data_pw()・smb_sign_info::free_signing_context・data_blob_::length・smb_sign_info::mandatory_signing・smb_sign_info::negotiated_smb_signing・smb_sign_info::sign_outgoing_message・smb_sign_info::signing_context・simple_free_signing_context()・srv_check_incoming_message()・srv_sign_info・srv_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] |
初期値:
{ null_sign_outgoing_message, null_check_incoming_message, null_free_signing_context, NULL, False, False, False, False }
smb_signing.c の 772 行で定義されています。
参照元 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().