mech-ntlm.c revision 7bafda1813454621e03615e83d55bccfa7cc56bd
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina/*
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina * NTLM and NTLMv2 authentication mechanism.
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina *
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina * Copyright (c) 2004 Andrey Panin <pazke@donpac.ru>
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina *
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina * This software is released under the MIT license.
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina */
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina#include "auth-common.h"
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina#include "mech.h"
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina#include "passdb.h"
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina#include "str.h"
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina#include "buffer.h"
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina#include "hex-binary.h"
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina#include "safe-memset.h"
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina#include "ntlm.h"
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březinastruct ntlm_auth_request {
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina struct auth_request auth_request;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina pool_t pool;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina /* requested: */
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina bool ntlm2_negotiated;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina bool unicode_negotiated;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina const unsigned char *challenge;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina /* received: */
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina struct ntlmssp_response *response;
50c9d542e8bf641412debaa82a4dcf67ddb72258Lukas Slebodnik};
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březinastatic bool lm_verify_credentials(struct ntlm_auth_request *request,
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina const unsigned char *credentials, size_t size)
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina{
bbc34d5a6e84d6c337bd89a22d33e365eb466226Pavel Březina const unsigned char *client_response;
28ebfa4373d1e7ce45b5d70a3619df1c074a661ePavel Březina unsigned char lm_response[LM_RESPONSE_SIZE];
3a5ea81007bd38ce511c37f65cc45d4b6b95ec44Pavel Březina unsigned int response_length;
641d684ee88c6540a4cf1d74d258614f615699fePavel Březina
641d684ee88c6540a4cf1d74d258614f615699fePavel Březina if (size != LM_HASH_SIZE) {
bbc34d5a6e84d6c337bd89a22d33e365eb466226Pavel Březina auth_request_log_error(&request->auth_request, "lm",
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech "invalid credentials length");
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech return FALSE;
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech }
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech response_length =
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech ntlmssp_buffer_length(request->response, lm_response);
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech client_response = ntlmssp_buffer_data(request->response, lm_response);
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech if (response_length < LM_RESPONSE_SIZE) {
fd04b25eaa5cd105da4122854d8bc1e702760e60Jakub Hrozek auth_request_log_error(&request->auth_request, "ntlm",
b0e8c1802557645e2ff6a88c54c520b0f0ff9ebbPetr Cech "LM response length is too small");
b0e8c1802557645e2ff6a88c54c520b0f0ff9ebbPetr Cech return FALSE;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina }
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek ntlmssp_v1_response(credentials, request->challenge, lm_response);
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek return memcmp(lm_response, client_response, LM_RESPONSE_SIZE) == 0;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina}
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozekstatic void
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozeklm_credentials_callback(enum passdb_result result,
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek const unsigned char *credentials, size_t size,
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina struct auth_request *auth_request)
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina{
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina struct ntlm_auth_request *request =
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina (struct ntlm_auth_request *)auth_request;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina switch (result) {
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina case PASSDB_RESULT_OK:
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina if (lm_verify_credentials(request, credentials, size))
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina auth_request_success(auth_request, NULL, 0);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina else
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina auth_request_fail(auth_request);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina break;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina case PASSDB_RESULT_INTERNAL_FAILURE:
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina auth_request_internal_failure(auth_request);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina break;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina default:
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina auth_request_fail(auth_request);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina break;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina }
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina}
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březinastatic int
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březinantlm_verify_credentials(struct ntlm_auth_request *request,
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina const unsigned char *credentials, size_t size)
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina{
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina struct auth_request *auth_request = &request->auth_request;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina const unsigned char *client_response;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina unsigned int response_length;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
e87b2a6e94c1066b3044fe683825ff5b4f8716c2Pavel Březina response_length =
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina ntlmssp_buffer_length(request->response, ntlm_response);
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech client_response = ntlmssp_buffer_data(request->response, ntlm_response);
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech if (response_length == 0) {
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech /* try LM authentication unless NTLM2 was negotiated */
641d684ee88c6540a4cf1d74d258614f615699fePavel Březina return request->ntlm2_negotiated ? -1 : 0;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina }
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina if (size != NTLMSSP_HASH_SIZE) {
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina auth_request_log_error(&request->auth_request, "ntlm",
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina "invalid credentials length");
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina return -1;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina }
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina if (response_length > NTLMSSP_RESPONSE_SIZE) {
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina unsigned char ntlm_v2_response[NTLMSSP_V2_RESPONSE_SIZE];
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina const unsigned char *blob =
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina client_response + NTLMSSP_V2_RESPONSE_SIZE;
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina /*
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina * Authentication target == NULL because we are acting
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina * as a standalone server, not as NT domain member.
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina */
54ed1b1214dbf9da1f481e8d193c81ce4312516bPavel Březina ntlmssp_v2_response(auth_request->user, NULL,
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina credentials, request->challenge, blob,
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina response_length - NTLMSSP_V2_RESPONSE_SIZE,
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina ntlm_v2_response);
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina return memcmp(ntlm_v2_response, client_response,
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina NTLMSSP_V2_RESPONSE_SIZE) == 0 ? 1 : -1;
e87b2a6e94c1066b3044fe683825ff5b4f8716c2Pavel Březina } else {
e87b2a6e94c1066b3044fe683825ff5b4f8716c2Pavel Březina unsigned char ntlm_response[NTLMSSP_RESPONSE_SIZE];
e87b2a6e94c1066b3044fe683825ff5b4f8716c2Pavel Březina const unsigned char *client_lm_response =
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina ntlmssp_buffer_data(request->response, lm_response);
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina if (request->ntlm2_negotiated)
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina ntlmssp2_response(credentials, request->challenge,
360a4be4266d6a72be99dfd252623dc0527f5b84Pavel Březina client_lm_response,
3a5ea81007bd38ce511c37f65cc45d4b6b95ec44Pavel Březina ntlm_response);
3a5ea81007bd38ce511c37f65cc45d4b6b95ec44Pavel Březina else
3a5ea81007bd38ce511c37f65cc45d4b6b95ec44Pavel Březina ntlmssp_v1_response(credentials, request->challenge,
3a5ea81007bd38ce511c37f65cc45d4b6b95ec44Pavel Březina ntlm_response);
3a5ea81007bd38ce511c37f65cc45d4b6b95ec44Pavel Březina
3a5ea81007bd38ce511c37f65cc45d4b6b95ec44Pavel Březina return memcmp(ntlm_response, client_response,
3a5ea81007bd38ce511c37f65cc45d4b6b95ec44Pavel Březina NTLMSSP_RESPONSE_SIZE) == 0 ? 1 : -1;
3a5ea81007bd38ce511c37f65cc45d4b6b95ec44Pavel Březina }
3a5ea81007bd38ce511c37f65cc45d4b6b95ec44Pavel Březina}
3a5ea81007bd38ce511c37f65cc45d4b6b95ec44Pavel Březina
3a5ea81007bd38ce511c37f65cc45d4b6b95ec44Pavel Březinastatic void
3a5ea81007bd38ce511c37f65cc45d4b6b95ec44Pavel Březinantlm_credentials_callback(enum passdb_result result,
3a5ea81007bd38ce511c37f65cc45d4b6b95ec44Pavel Březina const unsigned char *credentials, size_t size,
641d684ee88c6540a4cf1d74d258614f615699fePavel Březina struct auth_request *auth_request)
641d684ee88c6540a4cf1d74d258614f615699fePavel Březina{
641d684ee88c6540a4cf1d74d258614f615699fePavel Březina struct ntlm_auth_request *request =
641d684ee88c6540a4cf1d74d258614f615699fePavel Březina (struct ntlm_auth_request *)auth_request;
641d684ee88c6540a4cf1d74d258614f615699fePavel Březina int ret;
641d684ee88c6540a4cf1d74d258614f615699fePavel Březina
641d684ee88c6540a4cf1d74d258614f615699fePavel Březina switch (result) {
e87b2a6e94c1066b3044fe683825ff5b4f8716c2Pavel Březina case PASSDB_RESULT_OK:
e87b2a6e94c1066b3044fe683825ff5b4f8716c2Pavel Březina ret = ntlm_verify_credentials(request, credentials, size);
e87b2a6e94c1066b3044fe683825ff5b4f8716c2Pavel Březina if (ret > 0) {
641d684ee88c6540a4cf1d74d258614f615699fePavel Březina auth_request_success(auth_request, NULL, 0);
641d684ee88c6540a4cf1d74d258614f615699fePavel Březina return;
641d684ee88c6540a4cf1d74d258614f615699fePavel Březina }
641d684ee88c6540a4cf1d74d258614f615699fePavel Březina if (ret < 0) {
641d684ee88c6540a4cf1d74d258614f615699fePavel Březina auth_request_fail(auth_request);
71965bb18407ff45ada9e47cb6def086e48663c6Pavel Březina return;
71965bb18407ff45ada9e47cb6def086e48663c6Pavel Březina }
71965bb18407ff45ada9e47cb6def086e48663c6Pavel Březina break;
71965bb18407ff45ada9e47cb6def086e48663c6Pavel Březina case PASSDB_RESULT_INTERNAL_FAILURE:
71965bb18407ff45ada9e47cb6def086e48663c6Pavel Březina auth_request_internal_failure(auth_request);
71965bb18407ff45ada9e47cb6def086e48663c6Pavel Březina return;
71965bb18407ff45ada9e47cb6def086e48663c6Pavel Březina default:
71965bb18407ff45ada9e47cb6def086e48663c6Pavel Březina break;
71965bb18407ff45ada9e47cb6def086e48663c6Pavel Březina }
71965bb18407ff45ada9e47cb6def086e48663c6Pavel Březina
71965bb18407ff45ada9e47cb6def086e48663c6Pavel Březina /* NTLM credentials not found or didn't want to use them,
71965bb18407ff45ada9e47cb6def086e48663c6Pavel Březina try with LM credentials */
71965bb18407ff45ada9e47cb6def086e48663c6Pavel Březina auth_request_lookup_credentials(auth_request, "LANMAN",
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech lm_credentials_callback);
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech}
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cechstatic void
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cechmech_ntlm_auth_continue(struct auth_request *auth_request,
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech const unsigned char *data, size_t data_size)
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech{
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina struct ntlm_auth_request *request =
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina (struct ntlm_auth_request *)auth_request;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina const char *error;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina if (!request->challenge) {
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina const struct ntlmssp_request *ntlm_request =
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina (const struct ntlmssp_request *)data;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina const struct ntlmssp_challenge *message;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina size_t message_size;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina uint32_t flags;
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech if (!ntlmssp_check_request(ntlm_request, data_size, &error)) {
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina auth_request_log_info(auth_request, "ntlm",
df9e9a1f9b7dc255eb62c390163c25917b08f5a2Lukas Slebodnik "invalid NTLM request: %s", error);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina auth_request_fail(auth_request);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina return;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina }
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech message = ntlmssp_create_challenge(request->pool, ntlm_request,
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech &message_size);
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech flags = read_le32(&message->flags);
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech request->ntlm2_negotiated = flags & NTLMSSP_NEGOTIATE_NTLM2;
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech request->unicode_negotiated = flags & NTLMSSP_NEGOTIATE_UNICODE;
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech request->challenge = message->challenge;
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech
c4d4fe1603420fe8f3d256a3a446974699563ff3Petr Cech auth_request->callback(auth_request,
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina AUTH_CLIENT_RESULT_CONTINUE,
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina message, message_size);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina } else {
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina const struct ntlmssp_response *response =
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina (const struct ntlmssp_response *)data;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina const char *username;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina if (!ntlmssp_check_response(response, data_size, &error)) {
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina auth_request_log_info(auth_request, "ntlm",
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina "invalid NTLM response: %s", error);
6c2e507bd1571f9c7e26c5c9d60753b29fb75578Jakub Hrozek auth_request_fail(auth_request);
6c2e507bd1571f9c7e26c5c9d60753b29fb75578Jakub Hrozek return;
6c2e507bd1571f9c7e26c5c9d60753b29fb75578Jakub Hrozek }
6c2e507bd1571f9c7e26c5c9d60753b29fb75578Jakub Hrozek
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina request->response = p_malloc(request->pool, data_size);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina memcpy(request->response, response, data_size);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina username = ntlmssp_t_str(request->response, user,
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina request->unicode_negotiated);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina
6c2e507bd1571f9c7e26c5c9d60753b29fb75578Jakub Hrozek if (!auth_request_set_username(auth_request, username, &error)) {
6c2e507bd1571f9c7e26c5c9d60753b29fb75578Jakub Hrozek auth_request_log_info(auth_request, "ntlm",
6c2e507bd1571f9c7e26c5c9d60753b29fb75578Jakub Hrozek "%s", error);
6c2e507bd1571f9c7e26c5c9d60753b29fb75578Jakub Hrozek auth_request_fail(auth_request);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina return;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina }
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina auth_request_lookup_credentials(auth_request, "NTLM",
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina ntlm_credentials_callback);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina }
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina}
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březinastatic struct auth_request *mech_ntlm_auth_new(void)
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina{
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina struct ntlm_auth_request *request;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina pool_t pool;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina pool = pool_alloconly_create("ntlm_auth_request", 1024);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina request = p_new(pool, struct ntlm_auth_request, 1);
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina request->pool = pool;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina request->auth_request.pool = pool;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina return &request->auth_request;
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina}
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březinaconst struct mech_module mech_ntlm = {
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina "NTLM",
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina .flags = MECH_SEC_DICTIONARY | MECH_SEC_ACTIVE,
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina .passdb_need = MECH_PASSDB_NEED_LOOKUP_CREDENTIALS,
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina mech_ntlm_auth_new,
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina mech_generic_auth_initial,
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina mech_ntlm_auth_continue,
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina mech_generic_auth_free
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina};
3688374991afb34bbaf2b7843683fc13dd77879dPavel Březina