151 lines
2.9 KiB
C
151 lines
2.9 KiB
C
/*++
|
||
|
||
Copyright (c) 1989-1997 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
owf.c
|
||
|
||
Abstract:
|
||
|
||
Implentation of the one-way-functions used to implement password hashing.
|
||
|
||
RtlCalculateLmOwfPassword
|
||
RtlCalculateNtOwfPassword
|
||
|
||
|
||
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
|
||
RtlCalculateLmOwfPassword(
|
||
IN PLM_PASSWORD LmPassword,
|
||
OUT PLM_OWF_PASSWORD LmOwfPassword
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Takes the passed LmPassword and performs a one-way-function on it.
|
||
The current implementation does this by using the password as a key
|
||
to encrypt a known block of text.
|
||
|
||
Arguments:
|
||
|
||
LmPassword - The password to perform the one-way-function on.
|
||
|
||
LmOwfPassword - The hashed password is returned here
|
||
|
||
Return Values:
|
||
|
||
STATUS_SUCCESS - The function was completed successfully. The hashed
|
||
password is in LmOwfPassword.
|
||
|
||
STATUS_UNSUCCESSFUL - Something failed. The LmOwfPassword is undefined.
|
||
--*/
|
||
|
||
{
|
||
NTSTATUS Status;
|
||
BLOCK_KEY Key[2];
|
||
PCHAR pKey;
|
||
|
||
// Copy the password into our key buffer and zero pad to fill the 2 keys
|
||
|
||
pKey = (PCHAR)(&Key[0]);
|
||
|
||
while (*LmPassword && (pKey < (PCHAR)(&Key[2]))) {
|
||
*pKey++ = *LmPassword++;
|
||
}
|
||
|
||
while (pKey < (PCHAR)(&Key[2])) {
|
||
*pKey++ = 0;
|
||
}
|
||
|
||
|
||
// Use the keys to encrypt the standard text
|
||
|
||
Status = RtlEncryptStdBlock(&Key[0], &(LmOwfPassword->data[0]));
|
||
|
||
if (!NT_SUCCESS(Status)) {
|
||
return(Status);
|
||
}
|
||
|
||
Status = RtlEncryptStdBlock(&Key[1], &(LmOwfPassword->data[1]));
|
||
|
||
//
|
||
// clear our copy of the cleartext password
|
||
//
|
||
|
||
pKey = (PCHAR)(&Key[0]);
|
||
|
||
while (pKey < (PCHAR)(&Key[2])) {
|
||
*pKey++ = 0;
|
||
}
|
||
|
||
return(Status);
|
||
}
|
||
|
||
|
||
|
||
|
||
NTSTATUS
|
||
RtlCalculateNtOwfPassword(
|
||
IN PNT_PASSWORD NtPassword,
|
||
OUT PNT_OWF_PASSWORD NtOwfPassword
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Takes the passed NtPassword and performs a one-way-function on it.
|
||
Uses the RSA MD4 function
|
||
|
||
Arguments:
|
||
|
||
NtPassword - The password to perform the one-way-function on.
|
||
|
||
NtOwfPassword - The hashed password is returned here
|
||
|
||
Return Values:
|
||
|
||
STATUS_SUCCESS - The function was completed successfully. The hashed
|
||
password is in NtOwfPassword.
|
||
--*/
|
||
|
||
{
|
||
MD4_CTX MD4_Context;
|
||
|
||
|
||
MD4Init(&MD4_Context);
|
||
|
||
MD4Update(&MD4_Context, (PCHAR)NtPassword->Buffer, NtPassword->Length);
|
||
|
||
MD4Final(&MD4_Context);
|
||
|
||
|
||
// Copy the digest into our return data area
|
||
|
||
ASSERT(sizeof(*NtOwfPassword) == sizeof(MD4_Context.digest));
|
||
|
||
RtlMoveMemory((PVOID)NtOwfPassword, (PVOID)MD4_Context.digest,
|
||
sizeof(*NtOwfPassword));
|
||
|
||
return(STATUS_SUCCESS);
|
||
}
|
||
|
||
|