📄 ntlmssp_sign.c
字号:
* Unseal data with the NTLMSSP algorithm * *//* wrappers for the ntlmssp_*() functions*/NTSTATUS gensec_ntlmssp_unseal_packet(struct gensec_security *gensec_security, TALLOC_CTX *sig_mem_ctx, uint8_t *data, size_t length, const uint8_t *whole_pdu, size_t pdu_length, const DATA_BLOB *sig){ struct gensec_ntlmssp_state *gensec_ntlmssp_state = (struct gensec_ntlmssp_state *)gensec_security->private_data; if (!gensec_ntlmssp_state->session_key.length) { DEBUG(3, ("NO session key, cannot unseal packet\n")); return NT_STATUS_NO_USER_SESSION_KEY; } dump_data_pw("ntlmssp sealed data\n", data, length); if (gensec_ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_NTLM2) { arcfour_crypt_sbox(gensec_ntlmssp_state->crypt.ntlm2.recv_seal_arcfour_state, data, length); } else { arcfour_crypt_sbox(gensec_ntlmssp_state->crypt.ntlm.arcfour_state, data, length); } dump_data_pw("ntlmssp clear data\n", data, length); return gensec_ntlmssp_check_packet(gensec_security, sig_mem_ctx, data, length, whole_pdu, pdu_length, sig);}/** Initialise the state for NTLMSSP signing.*//* TODO: make this non-public */NTSTATUS ntlmssp_sign_init(struct gensec_ntlmssp_state *gensec_ntlmssp_state){ TALLOC_CTX *mem_ctx = talloc_new(gensec_ntlmssp_state); if (!mem_ctx) { return NT_STATUS_NO_MEMORY; } DEBUG(3, ("NTLMSSP Sign/Seal - Initialising with flags:\n")); debug_ntlmssp_flags(gensec_ntlmssp_state->neg_flags); if (gensec_ntlmssp_state->session_key.length < 8) { talloc_free(mem_ctx); DEBUG(3, ("NO session key, cannot intialise signing\n")); return NT_STATUS_NO_USER_SESSION_KEY; } if (gensec_ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_NTLM2) { DATA_BLOB weak_session_key = gensec_ntlmssp_state->session_key; const char *send_sign_const; const char *send_seal_const; const char *recv_sign_const; const char *recv_seal_const; DATA_BLOB send_seal_key; DATA_BLOB recv_seal_key; switch (gensec_ntlmssp_state->role) { case NTLMSSP_CLIENT: send_sign_const = CLI_SIGN; send_seal_const = CLI_SEAL; recv_sign_const = SRV_SIGN; recv_seal_const = SRV_SEAL; break; case NTLMSSP_SERVER: send_sign_const = SRV_SIGN; send_seal_const = SRV_SEAL; recv_sign_const = CLI_SIGN; recv_seal_const = CLI_SEAL; break; default: talloc_free(mem_ctx); return NT_STATUS_INTERNAL_ERROR; } gensec_ntlmssp_state->crypt.ntlm2.send_seal_arcfour_state = talloc(gensec_ntlmssp_state, struct arcfour_state); NT_STATUS_HAVE_NO_MEMORY(gensec_ntlmssp_state->crypt.ntlm2.send_seal_arcfour_state); gensec_ntlmssp_state->crypt.ntlm2.recv_seal_arcfour_state = talloc(gensec_ntlmssp_state, struct arcfour_state); NT_STATUS_HAVE_NO_MEMORY(gensec_ntlmssp_state->crypt.ntlm2.send_seal_arcfour_state); /** Weaken NTLMSSP keys to cope with down-level clients, servers and export restrictions. We probably should have some parameters to control this, once we get NTLM2 working. */ /* Key weakening was not performed on the master key * for NTLM2 (in ntlmssp_weaken_keys()), but must be * done on the encryption subkeys only. That is why * we don't have this code for the ntlmv1 case. */ if (gensec_ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_128) { } else if (gensec_ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_56) { weak_session_key.length = 7; } else { /* forty bits */ weak_session_key.length = 5; } dump_data_pw("NTLMSSP weakend master key:\n", weak_session_key.data, weak_session_key.length); /* SEND: sign key */ calc_ntlmv2_key(gensec_ntlmssp_state, &gensec_ntlmssp_state->crypt.ntlm2.send_sign_key, gensec_ntlmssp_state->session_key, send_sign_const); dump_data_pw("NTLMSSP send sign key:\n", gensec_ntlmssp_state->crypt.ntlm2.send_sign_key.data, gensec_ntlmssp_state->crypt.ntlm2.send_sign_key.length); /* SEND: seal ARCFOUR pad */ calc_ntlmv2_key(mem_ctx, &send_seal_key, weak_session_key, send_seal_const); dump_data_pw("NTLMSSP send seal key:\n", send_seal_key.data, send_seal_key.length); arcfour_init(gensec_ntlmssp_state->crypt.ntlm2.send_seal_arcfour_state, &send_seal_key); dump_data_pw("NTLMSSP send sesl hash:\n", gensec_ntlmssp_state->crypt.ntlm2.send_seal_arcfour_state->sbox, sizeof(gensec_ntlmssp_state->crypt.ntlm2.send_seal_arcfour_state->sbox)); /* RECV: sign key */ calc_ntlmv2_key(gensec_ntlmssp_state, &gensec_ntlmssp_state->crypt.ntlm2.recv_sign_key, gensec_ntlmssp_state->session_key, recv_sign_const); dump_data_pw("NTLMSSP recv sign key:\n", gensec_ntlmssp_state->crypt.ntlm2.recv_sign_key.data, gensec_ntlmssp_state->crypt.ntlm2.recv_sign_key.length); /* RECV: seal ARCFOUR pad */ calc_ntlmv2_key(mem_ctx, &recv_seal_key, weak_session_key, recv_seal_const); dump_data_pw("NTLMSSP recv seal key:\n", recv_seal_key.data, recv_seal_key.length); arcfour_init(gensec_ntlmssp_state->crypt.ntlm2.recv_seal_arcfour_state, &recv_seal_key); dump_data_pw("NTLMSSP receive seal hash:\n", gensec_ntlmssp_state->crypt.ntlm2.recv_seal_arcfour_state->sbox, sizeof(gensec_ntlmssp_state->crypt.ntlm2.recv_seal_arcfour_state->sbox)); gensec_ntlmssp_state->crypt.ntlm2.send_seq_num = 0; gensec_ntlmssp_state->crypt.ntlm2.recv_seq_num = 0; } else { DATA_BLOB weak_session_key = ntlmssp_weakend_key(gensec_ntlmssp_state, mem_ctx); DEBUG(5, ("NTLMSSP Sign/Seal - using NTLM1\n")); gensec_ntlmssp_state->crypt.ntlm.arcfour_state = talloc(gensec_ntlmssp_state, struct arcfour_state); NT_STATUS_HAVE_NO_MEMORY(gensec_ntlmssp_state->crypt.ntlm.arcfour_state); arcfour_init(gensec_ntlmssp_state->crypt.ntlm.arcfour_state, &weak_session_key); dump_data_pw("NTLMSSP hash:\n", gensec_ntlmssp_state->crypt.ntlm.arcfour_state->sbox, sizeof(gensec_ntlmssp_state->crypt.ntlm.arcfour_state->sbox)); gensec_ntlmssp_state->crypt.ntlm.seq_num = 0; } talloc_free(mem_ctx); return NT_STATUS_OK;}size_t gensec_ntlmssp_sig_size(struct gensec_security *gensec_security, size_t data_size) { return NTLMSSP_SIG_SIZE;}NTSTATUS gensec_ntlmssp_wrap(struct gensec_security *gensec_security, TALLOC_CTX *sig_mem_ctx, const DATA_BLOB *in, DATA_BLOB *out){ DATA_BLOB sig; NTSTATUS nt_status; if (gensec_have_feature(gensec_security, GENSEC_FEATURE_SEAL)) { *out = data_blob_talloc(sig_mem_ctx, NULL, in->length + NTLMSSP_SIG_SIZE); if (!out->data) { return NT_STATUS_NO_MEMORY; } memcpy(out->data + NTLMSSP_SIG_SIZE, in->data, in->length); nt_status = gensec_ntlmssp_seal_packet(gensec_security, sig_mem_ctx, out->data + NTLMSSP_SIG_SIZE, out->length - NTLMSSP_SIG_SIZE, out->data + NTLMSSP_SIG_SIZE, out->length - NTLMSSP_SIG_SIZE, &sig); if (NT_STATUS_IS_OK(nt_status)) { memcpy(out->data, sig.data, NTLMSSP_SIG_SIZE); } return nt_status; } else if (gensec_have_feature(gensec_security, GENSEC_FEATURE_SIGN)) { *out = data_blob_talloc(sig_mem_ctx, NULL, in->length + NTLMSSP_SIG_SIZE); if (!out->data) { return NT_STATUS_NO_MEMORY; } memcpy(out->data + NTLMSSP_SIG_SIZE, in->data, in->length); nt_status = gensec_ntlmssp_sign_packet(gensec_security, sig_mem_ctx, out->data + NTLMSSP_SIG_SIZE, out->length - NTLMSSP_SIG_SIZE, out->data + NTLMSSP_SIG_SIZE, out->length - NTLMSSP_SIG_SIZE, &sig); if (NT_STATUS_IS_OK(nt_status)) { memcpy(out->data, sig.data, NTLMSSP_SIG_SIZE); } return nt_status; } else { *out = *in; return NT_STATUS_OK; }}NTSTATUS gensec_ntlmssp_unwrap(struct gensec_security *gensec_security, TALLOC_CTX *sig_mem_ctx, const DATA_BLOB *in, DATA_BLOB *out){ DATA_BLOB sig; if (gensec_have_feature(gensec_security, GENSEC_FEATURE_SEAL)) { if (in->length < NTLMSSP_SIG_SIZE) { return NT_STATUS_INVALID_PARAMETER; } sig.data = in->data; sig.length = NTLMSSP_SIG_SIZE; *out = data_blob_talloc(sig_mem_ctx, in->data + NTLMSSP_SIG_SIZE, in->length - NTLMSSP_SIG_SIZE); return gensec_ntlmssp_unseal_packet(gensec_security, sig_mem_ctx, out->data, out->length, out->data, out->length, &sig); } else if (gensec_have_feature(gensec_security, GENSEC_FEATURE_SIGN)) { if (in->length < NTLMSSP_SIG_SIZE) { return NT_STATUS_INVALID_PARAMETER; } sig.data = in->data; sig.length = NTLMSSP_SIG_SIZE; *out = data_blob_talloc(sig_mem_ctx, in->data + NTLMSSP_SIG_SIZE, in->length - NTLMSSP_SIG_SIZE); return gensec_ntlmssp_check_packet(gensec_security, sig_mem_ctx, out->data, out->length, out->data, out->length, &sig); } else { *out = *in; return NT_STATUS_OK; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -