Пример #1
0
NTSTATUS ntlmssp_seal_packet(NTLMSSP_STATE *ntlmssp_state,
			     uchar *data, size_t length,
			     uchar *whole_pdu, size_t pdu_length,
			     DATA_BLOB *sig)
{	
	if (!(ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_SEAL)) {
		DEBUG(3, ("NTLMSSP Sealing not negotiated - cannot seal packet!\n"));
		return NT_STATUS_INVALID_PARAMETER;
	}

	if (!ntlmssp_state->session_key.length) {
		DEBUG(3, ("NO session key, cannot seal packet\n"));
		return NT_STATUS_NO_USER_SESSION_KEY;
	}

	DEBUG(10,("ntlmssp_seal_data: seal\n"));
	dump_data_pw("ntlmssp clear data\n", data, length);
	if (ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_NTLM2) {
		/* The order of these two operations matters - we must first seal the packet,
		   then seal the sequence number - this is becouse the send_seal_hash is not
		   constant, but is is rather updated with each iteration */
		NTSTATUS nt_status = ntlmssp_make_packet_signature(ntlmssp_state,
							data, length,
							whole_pdu, pdu_length,
							NTLMSSP_SEND, sig, False);
		if (!NT_STATUS_IS_OK(nt_status)) {
			return nt_status;
		}

		arcfour_crypt_sbox(&ntlmssp_state->send_seal_arc4_state, data, length);
		if (ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_KEY_EXCH) {
			arcfour_crypt_sbox(&ntlmssp_state->send_seal_arc4_state, sig->data+4, 8);
		}
	} else {
		uint32 crc;
		crc = crc32_calc_buffer(data, length);
		if (!msrpc_gen(sig, "dddd", NTLMSSP_SIGN_VERSION, 0, crc, ntlmssp_state->ntlmv1_seq_num)) {
			return NT_STATUS_NO_MEMORY;
		}

		/* The order of these two operations matters - we must first seal the packet,
		   then seal the sequence number - this is becouse the ntlmv1_arc4_state is not
		   constant, but is is rather updated with each iteration */
		
		dump_arc4_state("ntlmv1 arc4 state:\n", 
						&ntlmssp_state->ntlmv1_arc4_state);
		arcfour_crypt_sbox(&ntlmssp_state->ntlmv1_arc4_state, data, length);

		dump_arc4_state("ntlmv1 arc4 state:\n", 
						&ntlmssp_state->ntlmv1_arc4_state);

		arcfour_crypt_sbox(&ntlmssp_state->ntlmv1_arc4_state, sig->data+4, sig->length-4);

		ntlmssp_state->ntlmv1_seq_num++;
	}
	dump_data_pw("ntlmssp signature\n", sig->data, sig->length);
	dump_data_pw("ntlmssp sealed data\n", data, length);

	return NT_STATUS_OK;
}
Пример #2
0
NTSTATUS ntlmssp_sign_packet(NTLMSSP_STATE *ntlmssp_state,
                             const uchar *data, size_t length,
                             DATA_BLOB *sig)
{
    NTSTATUS nt_status;
    if (!ntlmssp_state->session_key.length) {
        DEBUG(3, ("NO session key, cannot check sign packet\n"));
        return NT_STATUS_NO_USER_SESSION_KEY;
    }

    nt_status = ntlmssp_make_packet_signature(ntlmssp_state, data, length, NTLMSSP_SEND, sig);

    /* increment counter on send */
    ntlmssp_state->ntlmssp_seq_num++;
    return nt_status;
}
Пример #3
0
NTSTATUS ntlmssp_check_packet(NTLMSSP_STATE *ntlmssp_state,
                              const uchar *data, size_t length,
                              const DATA_BLOB *sig)
{
    DATA_BLOB local_sig;
    NTSTATUS nt_status;

    if (!ntlmssp_state->session_key.length) {
        DEBUG(3, ("NO session key, cannot check packet signature\n"));
        return NT_STATUS_NO_USER_SESSION_KEY;
    }

    if (sig->length < 8) {
        DEBUG(0, ("NTLMSSP packet check failed due to short signature (%lu bytes)!\n",
                  (unsigned long)sig->length));
    }

    nt_status = ntlmssp_make_packet_signature(ntlmssp_state, data,
                length, NTLMSSP_RECEIVE, &local_sig);

    if (!NT_STATUS_IS_OK(nt_status)) {
        DEBUG(0, ("NTLMSSP packet check failed with %s\n", nt_errstr(nt_status)));
        return nt_status;
    }

    if (memcmp(sig->data+sig->length - 8, local_sig.data+local_sig.length - 8, 8) != 0) {
        DEBUG(5, ("BAD SIG: wanted signature of\n"));
        dump_data(5, (const char *)local_sig.data, local_sig.length);

        DEBUG(5, ("BAD SIG: got signature of\n"));
        dump_data(5, (const char *)(sig->data), sig->length);

        DEBUG(0, ("NTLMSSP packet check failed due to invalid signature!\n"));
        return NT_STATUS_ACCESS_DENIED;
    }

    /* increment counter on recieive */
    ntlmssp_state->ntlmssp_seq_num++;

    return NT_STATUS_OK;
}
Пример #4
0
NTSTATUS ntlmssp_sign_packet(NTLMSSP_STATE *ntlmssp_state,
				    const uchar *data, size_t length, 
				    const uchar *whole_pdu, size_t pdu_length, 
				    DATA_BLOB *sig) 
{
	NTSTATUS nt_status;

	if (!(ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_SIGN)) {
		DEBUG(3, ("NTLMSSP Signing not negotiated - cannot sign packet!\n"));
		return NT_STATUS_INVALID_PARAMETER;
	}

	if (!ntlmssp_state->session_key.length) {
		DEBUG(3, ("NO session key, cannot check sign packet\n"));
		return NT_STATUS_NO_USER_SESSION_KEY;
	}

	nt_status = ntlmssp_make_packet_signature(ntlmssp_state,
						data, length,
						whole_pdu, pdu_length,
						NTLMSSP_SEND, sig, True);

	return nt_status;
}
Пример #5
0
NTSTATUS ntlmssp_check_packet(NTLMSSP_STATE *ntlmssp_state,
				const uchar *data, size_t length, 
				const uchar *whole_pdu, size_t pdu_length, 
				const DATA_BLOB *sig) 
{
	DATA_BLOB local_sig;
	NTSTATUS nt_status;

	if (!ntlmssp_state->session_key.length) {
		DEBUG(3, ("NO session key, cannot check packet signature\n"));
		return NT_STATUS_NO_USER_SESSION_KEY;
	}

	if (sig->length < 8) {
		DEBUG(0, ("NTLMSSP packet check failed due to short signature (%lu bytes)!\n", 
			  (unsigned long)sig->length));
	}

	nt_status = ntlmssp_make_packet_signature(ntlmssp_state,
						data, length,
						whole_pdu, pdu_length,
						NTLMSSP_RECEIVE, &local_sig, True);
	
	if (!NT_STATUS_IS_OK(nt_status)) {
		DEBUG(0, ("NTLMSSP packet check failed with %s\n", nt_errstr(nt_status)));
		data_blob_free(&local_sig);
		return nt_status;
	}
	
	if (ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_NTLM2) {
		if (local_sig.length != sig->length ||
				memcmp(local_sig.data, sig->data, sig->length) != 0) {
			DEBUG(5, ("BAD SIG NTLM2: wanted signature of\n"));
			dump_data(5, local_sig.data, local_sig.length);

			DEBUG(5, ("BAD SIG: got signature of\n"));
			dump_data(5, sig->data, sig->length);

			DEBUG(0, ("NTLMSSP NTLM2 packet check failed due to invalid signature!\n"));
			data_blob_free(&local_sig);
			return NT_STATUS_ACCESS_DENIED;
		}
	} else {
		if (local_sig.length != sig->length ||
				memcmp(local_sig.data + 8, sig->data + 8, sig->length - 8) != 0) {
			DEBUG(5, ("BAD SIG NTLM1: wanted signature of\n"));
			dump_data(5, local_sig.data, local_sig.length);

			DEBUG(5, ("BAD SIG: got signature of\n"));
			dump_data(5, sig->data, sig->length);

			DEBUG(0, ("NTLMSSP NTLM1 packet check failed due to invalid signature!\n"));
			data_blob_free(&local_sig);
			return NT_STATUS_ACCESS_DENIED;
		}
	}
	dump_data_pw("checked ntlmssp signature\n", sig->data, sig->length);
	DEBUG(10,("ntlmssp_check_packet: NTLMSSP signature OK !\n"));

	data_blob_free(&local_sig);
	return NT_STATUS_OK;
}