mech-ntlm.c revision 9abfe876fa81576f130f3f82f622ae936c21a716
/*
* NTLM and NTLMv2 authentication mechanism.
*
* Copyright (c) 2004 Andrey Panin <pazke@donpac.ru>
*
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*/
#include "common.h"
#include "mech.h"
#include "passdb.h"
#include "str.h"
#include "buffer.h"
#include "hex-binary.h"
#include "safe-memset.h"
#include "ntlm.h"
struct ntlm_auth_request {
struct auth_request auth_request;
/* requested: */
const unsigned char *challenge;
/* received: */
struct ntlmssp_response *response;
};
static void
lm_credentials_callback(const char *credentials,
struct auth_request *auth_request)
{
struct ntlm_auth_request *auth =
(struct ntlm_auth_request *)auth_request;
const unsigned char *client_response;
unsigned char lm_response[LM_RESPONSE_SIZE];
unsigned char hash[LM_HASH_SIZE];
int ret;
if (credentials == NULL) {
return;
}
}
static void
ntlm_credentials_callback(const char *credentials,
struct auth_request *auth_request)
{
struct ntlm_auth_request *auth =
(struct ntlm_auth_request *)auth_request;
const unsigned char *client_response;
unsigned char hash[NTLMSSP_HASH_SIZE];
unsigned int response_length;
int ret;
if (credentials == NULL) {
return;
}
if (response_length > NTLMSSP_RESPONSE_SIZE) {
unsigned char ntlm_v2_response[NTLMSSP_V2_RESPONSE_SIZE];
const unsigned char *blob =
/*
* Authentication target == NULL because we are acting
* as a standalone server, not as NT domain member.
*/
NTLMSSP_V2_RESPONSE_SIZE) == 0;
} else {
unsigned char ntlm_response[NTLMSSP_RESPONSE_SIZE];
NTLMSSP_RESPONSE_SIZE) == 0;
}
}
static int
{
struct ntlm_auth_request *auth =
(struct ntlm_auth_request *)auth_request;
struct auth_client_request_reply reply;
const char *error;
const struct ntlmssp_request *request =
(struct ntlmssp_request *)data;
const struct ntlmssp_challenge *message;
if (verbose) {
i_info("ntlm(%s): invalid NTLM request, %s",
error);
}
return TRUE;
}
&message_size);
} else {
const struct ntlmssp_response *response =
(struct ntlmssp_response *)data;
char *username;
if (verbose) {
i_info("ntlm(%s): invalid NTLM response, %s",
error);
}
return TRUE;
}
if (verbose) {
i_info("ntlm(%s): %s",
}
return TRUE;
}
}
return TRUE;
}
static int
struct auth_client_request_new *request,
const unsigned char *data __attr_unused__,
{
struct auth_client_request_reply reply;
return TRUE;
}
static void
{
}
static struct auth_request *mech_ntlm_auth_new(void)
{
struct ntlm_auth_request *auth;
return &auth->auth_request;
}
const struct mech_module mech_ntlm = {
"NTLM",
};