mech-ntlm.c revision 50782de8a9d5ebe11ee61496b4e695a1d3875230
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch * NTLM and NTLMv2 authentication mechanism.
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch * Copyright (c) 2004 Andrey Panin <pazke@donpac.ru>
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch * This software is released under the MIT license.
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch /* requested: */
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const unsigned char *challenge;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch /* received: */
7384b4e78eaab44693c985192276e31322155e32Stephan Boschstatic bool lm_verify_credentials(struct ntlm_auth_request *request,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const unsigned char *credentials, size_t size)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const unsigned char *client_response;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch auth_request_log_error(&request->auth_request, "lm",
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch "invalid credentials length");
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch ntlmssp_buffer_length(request->response, lm_response);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch client_response = ntlmssp_buffer_data(request->response, lm_response);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch auth_request_log_error(&request->auth_request, "ntlm",
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch "LM response length is too small");
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch ntlmssp_v1_response(credentials, request->challenge, lm_response);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch return memcmp(lm_response, client_response, LM_RESPONSE_SIZE) == 0;
7384b4e78eaab44693c985192276e31322155e32Stephan Boschlm_credentials_callback(enum passdb_result result,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const unsigned char *credentials, size_t size,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch if (lm_verify_credentials(request, credentials, size))
7384b4e78eaab44693c985192276e31322155e32Stephan Boschntlm_verify_credentials(struct ntlm_auth_request *request,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const unsigned char *credentials, size_t size)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch struct auth_request *auth_request = &request->auth_request;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const unsigned char *client_response;
65c0e43da8cfc730eeb4634f8aa384081bbfa4e7Timo Sirainen ntlmssp_buffer_length(request->response, ntlm_response);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch client_response = ntlmssp_buffer_data(request->response, ntlm_response);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch /* try LM authentication unless NTLM2 was negotiated */
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch auth_request_log_error(&request->auth_request, "ntlm",
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch "invalid credentials length");
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch if (response_length > NTLMSSP_RESPONSE_SIZE) {
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch unsigned char ntlm_v2_response[NTLMSSP_V2_RESPONSE_SIZE];
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const unsigned char *blob =
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch * Authentication target == NULL because we are acting
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch * as a standalone server, not as NT domain member.
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch return memcmp(ntlm_v2_response, client_response,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch unsigned char ntlm_response[NTLMSSP_RESPONSE_SIZE];
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const unsigned char *client_lm_response =
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch ntlmssp_buffer_data(request->response, lm_response);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch ntlmssp2_response(credentials, request->challenge,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch ntlmssp_v1_response(credentials, request->challenge,
65c0e43da8cfc730eeb4634f8aa384081bbfa4e7Timo Sirainenntlm_credentials_callback(enum passdb_result result,
65c0e43da8cfc730eeb4634f8aa384081bbfa4e7Timo Sirainen const unsigned char *credentials, size_t size,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch ret = ntlm_verify_credentials(request, credentials, size);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch /* NTLM credentials not found or didn't want to use them,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch try with LM credentials */
65c0e43da8cfc730eeb4634f8aa384081bbfa4e7Timo Sirainen auth_request_lookup_credentials(auth_request, "LANMAN",
7384b4e78eaab44693c985192276e31322155e32Stephan Boschmech_ntlm_auth_continue(struct auth_request *auth_request,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch if (!ntlmssp_check_request(ntlm_request, data_size, &error)) {
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch message = ntlmssp_create_challenge(request->pool, ntlm_request,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch request->ntlm2_negotiated = flags & NTLMSSP_NEGOTIATE_NTLM2;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch request->unicode_negotiated = flags & NTLMSSP_NEGOTIATE_UNICODE;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch auth_request_handler_reply_continue(auth_request, message,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch if (!ntlmssp_check_response(response, data_size, &error)) {
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch request->response = p_malloc(request->pool, data_size);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch memcpy(request->response, response, data_size);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch username = ntlmssp_t_str(request->response, user,
65c0e43da8cfc730eeb4634f8aa384081bbfa4e7Timo Sirainen if (!auth_request_set_username(auth_request, username, &error)) {
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch auth_request_lookup_credentials(auth_request, "NTLM",
7384b4e78eaab44693c985192276e31322155e32Stephan Boschstatic struct auth_request *mech_ntlm_auth_new(void)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch pool = pool_alloconly_create("ntlm_auth_request", 1024);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch request = p_new(pool, struct ntlm_auth_request, 1);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch .flags = MECH_SEC_DICTIONARY | MECH_SEC_ACTIVE,