⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ntlmssp_sign.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
 * 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 + -