mirror of https://github.com/lianthony/NT4.0
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.
152 lines
3.3 KiB
152 lines
3.3 KiB
/*++
|
|
|
|
Copyright (c) 1991-1993 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
OwfCrypt.c
|
|
|
|
Abstract:
|
|
|
|
Only contains PortUasDecryptNtOwfPwdWithIndex().
|
|
|
|
Author:
|
|
|
|
David Chalmers (Davidc) 10-21-91
|
|
|
|
Revision History:
|
|
|
|
21-Oct-1991 DavidC
|
|
[DavidC created the general-purpose version of this code.]
|
|
18-Mar-1992 JohnRo
|
|
Swiped DavidC's code and made it part of PortUAS (at DavidC's
|
|
request).
|
|
22-Jul-1993 JohnRo
|
|
Made changes suggested by PC-LINT 5.0
|
|
|
|
--*/
|
|
|
|
|
|
// These must be included first:
|
|
|
|
#include <nt.h>
|
|
// Don't complain about "unneeded" includes of this file:
|
|
/*lint -efile(764,ntrtl.h) */
|
|
#include <ntrtl.h>
|
|
#include <windef.h> // DWORD, etc.
|
|
#include <lmcons.h> // NET_API_STATUS.
|
|
|
|
// These may be included in any order:
|
|
|
|
#include <crypt.h> // PENCRYPTED_LM_OWF_PASSWORD, etc.
|
|
#include <netdebug.h> // DBGSTATIC.
|
|
#include <netlibnt.h> // NetpNtStatusToApiStatus().
|
|
#include <portuasp.h> // My prototype.
|
|
|
|
|
|
|
|
DBGSTATIC VOID
|
|
KeysFromIndex(
|
|
IN LPDWORD Index,
|
|
OUT BLOCK_KEY Key[2])
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Helper function - generates 2 keys from an index value
|
|
|
|
--*/
|
|
|
|
{
|
|
PCHAR pKey, pIndex;
|
|
PCHAR IndexStart = (PCHAR)&(Index[0]);
|
|
PCHAR IndexEnd = (PCHAR)&(Index[1]);
|
|
PCHAR KeyStart = (PCHAR)&(Key[0]);
|
|
PCHAR KeyEnd = (PCHAR)&(Key[1]);
|
|
|
|
IndexEnd -= 2; // Temp LM hack
|
|
|
|
// Calculate the keys by concatenating the index with itself
|
|
|
|
//
|
|
// To be compatible with Lanman we do this concatenation in the first
|
|
// key only, then copy the first key to the second.
|
|
//
|
|
|
|
pKey = KeyStart;
|
|
pIndex = IndexStart;
|
|
|
|
while (pKey < KeyEnd) {
|
|
|
|
*pKey++ = *pIndex++;
|
|
|
|
if (pIndex == IndexEnd) {
|
|
|
|
// Start at beginning of index again
|
|
pIndex = IndexStart;
|
|
}
|
|
}
|
|
|
|
Key[1] = Key[0];
|
|
}
|
|
|
|
|
|
NET_API_STATUS
|
|
//RtlDecryptLmOwfPwdWithIndex(
|
|
PortUasDecryptLmOwfPwdWithIndex(
|
|
IN LPVOID lpEncryptedLmOwfPassword,
|
|
IN LPDWORD lpIndex,
|
|
OUT LPVOID lpLmOwfPassword
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Decrypts an OwfPassword with an index
|
|
|
|
Arguments:
|
|
|
|
EncryptedLmOwfPassword - The encrypted OwfPassword to be decrypted
|
|
|
|
INDEX - value to be used as decryption key
|
|
|
|
LmOwfPassword - Decrypted OwfPassword is returned here
|
|
|
|
|
|
Return Values:
|
|
|
|
NO_ERROR - The function completed successfully. The decrypted
|
|
OwfPassword is in LmOwfPassword
|
|
|
|
Other values - Something failed. The LmOwfPassword is undefined.
|
|
|
|
--*/
|
|
{
|
|
PENCRYPTED_LM_OWF_PASSWORD EncryptedLmOwfPassword = lpEncryptedLmOwfPassword;
|
|
LPDWORD Index = lpIndex;
|
|
PLM_OWF_PASSWORD LmOwfPassword = lpLmOwfPassword;
|
|
NTSTATUS Status;
|
|
BLOCK_KEY Key[2];
|
|
|
|
NetpAssert( sizeof( CRYPT_INDEX ) == sizeof( DWORD ) );
|
|
|
|
// Calculate the keys
|
|
|
|
KeysFromIndex(Index, &(Key[0]));
|
|
|
|
// Use the keys
|
|
|
|
Status = RtlDecryptBlock(&(EncryptedLmOwfPassword->data[0]),
|
|
&(Key[0]),
|
|
(PCLEAR_BLOCK) (LPVOID) &(LmOwfPassword->data[0]));
|
|
if (!NT_SUCCESS(Status)) {
|
|
return(NetpNtStatusToApiStatus(Status));
|
|
}
|
|
|
|
Status = RtlDecryptBlock(&(EncryptedLmOwfPassword->data[1]),
|
|
&(Key[1]),
|
|
(PCLEAR_BLOCK) (LPVOID) &(LmOwfPassword->data[1]));
|
|
|
|
return(NetpNtStatusToApiStatus(Status));
|
|
}
|