Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
Copyright (c) 1989-1997 Microsoft Corporation
Module Name:
response.c
Abstract:
Contains functions that calculate the correct response to return to the server when logging on.
RtlCalculateLmResponse RtlCalculateNtResponse
Author:
David Chalmers (Davidc) 10-21-91
Revision History:
Adam Barr (AdamBa) 12-15-97 Modified from private\security\lsa\crypt\dll
--*/
#include <rdrssp.h>
NTSTATUS RtlCalculateLmResponse( IN PLM_CHALLENGE LmChallenge, IN PLM_OWF_PASSWORD LmOwfPassword, OUT PLM_RESPONSE LmResponse )
/*++
Routine Description:
Takes the challenge sent by the server and the OwfPassword generated from the password the user entered and calculates the response to return to the server.
Arguments:
LmChallenge - The challenge sent by the server
LmOwfPassword - The hashed password.
LmResponse - The response is returned here.
Return Values:
STATUS_SUCCESS - The function completed successfully. The response is in LmResponse.
STATUS_UNSUCCESSFUL - Something failed. The LmResponse is undefined. --*/
{ NTSTATUS Status; BLOCK_KEY Key; PCHAR pKey, pData;
// The first 2 keys we can get at by type-casting
Status = RtlEncryptBlock(LmChallenge, &(((PBLOCK_KEY)(LmOwfPassword->data))[0]), &(LmResponse->data[0])); if (!NT_SUCCESS(Status)) { return(Status); }
Status = RtlEncryptBlock(LmChallenge, &(((PBLOCK_KEY)(LmOwfPassword->data))[1]), &(LmResponse->data[1])); if (!NT_SUCCESS(Status)) { return(Status); }
// To get the last key we must copy the remainder of the OwfPassword
// and fill the rest of the key with 0s
pKey = &(Key.data[0]); pData = (PCHAR)&(((PBLOCK_KEY)(LmOwfPassword->data))[2]);
while (pData < (PCHAR)&(LmOwfPassword->data[2])) { *pKey++ = *pData++; }
// Zero extend
while (pKey < (PCHAR)&((&Key)[1])) { *pKey++ = 0; }
// Use the 3rd key
Status = RtlEncryptBlock(LmChallenge, &Key, &(LmResponse->data[2]));
return(Status); }
NTSTATUS RtlCalculateNtResponse( IN PNT_CHALLENGE NtChallenge, IN PNT_OWF_PASSWORD NtOwfPassword, OUT PNT_RESPONSE NtResponse ) /*++
Routine Description:
Takes the challenge sent by the server and the OwfPassword generated from the password the user entered and calculates the response to return(to the server.
Arguments:
NtChallenge - The challenge sent by the server
NtOwfPassword - The hashed password.
NtResponse - The response is returned here.
Return Values:
STATUS_SUCCESS - The function completed successfully. The response is in NtResponse.
STATUS_UNSUCCESSFUL - Something failed. The NtResponse is undefined. --*/
{
// Use the LM version until we change the definitions of any of
// these data types
return(RtlCalculateLmResponse((PLM_CHALLENGE)NtChallenge, (PLM_OWF_PASSWORD)NtOwfPassword, (PLM_RESPONSE)NtResponse)); }
|