996 lines
30 KiB
C
996 lines
30 KiB
C
/* Copyright (c) 1993, Microsoft Corporation, all rights reserved
|
||
**
|
||
** ntauth.c
|
||
** Remote Access PPP Challenge Handshake Authentication Protocol
|
||
** NT Authentication routines
|
||
**
|
||
** These routines are specific to the NT platform.
|
||
**
|
||
** 11/05/93 Steve Cobb (from MikeSa's AMB authentication code)
|
||
*/
|
||
|
||
#include <nt.h>
|
||
#include <ntrtl.h>
|
||
#include <nturtl.h>
|
||
#include <ntlsa.h>
|
||
#include <ntmsv1_0.h>
|
||
|
||
#include <crypt.h>
|
||
#include <windows.h>
|
||
#include <lmcons.h>
|
||
#include <lmapibuf.h>
|
||
#include <lmaccess.h>
|
||
#include <raserror.h>
|
||
#include <string.h>
|
||
#include <stdlib.h>
|
||
|
||
#include <rasman.h>
|
||
#include <rasppp.h>
|
||
#include <pppcp.h>
|
||
#include <rtutils.h>
|
||
#include <rasauth.h>
|
||
#define INCL_CLSA
|
||
#define INCL_RASAUTHATTRIBUTES
|
||
#define INCL_HOSTWIRE
|
||
#define INCL_MISC
|
||
#include <ppputil.h>
|
||
#include "sha.h"
|
||
#include "raschap.h"
|
||
|
||
//**
|
||
//
|
||
// Call: MakeChangePasswordV1RequestAttributes
|
||
//
|
||
// Returns: NO_ERROR - Success
|
||
// Non-zero returns - Failure
|
||
//
|
||
// Description:
|
||
//
|
||
DWORD
|
||
MakeChangePasswordV1RequestAttributes(
|
||
IN CHAPWB* pwb,
|
||
IN BYTE bId,
|
||
IN PCHAR pchIdentity,
|
||
IN PBYTE Challenge,
|
||
IN PENCRYPTED_LM_OWF_PASSWORD pEncryptedLmOwfOldPassword,
|
||
IN PENCRYPTED_LM_OWF_PASSWORD pEncryptedLmOwfNewPassword,
|
||
IN PENCRYPTED_NT_OWF_PASSWORD pEncryptedNtOwfOldPassword,
|
||
IN PENCRYPTED_NT_OWF_PASSWORD pEncryptedNtOwfNewPassword,
|
||
IN WORD LenPassword,
|
||
IN WORD wFlags,
|
||
IN DWORD cbChallenge,
|
||
IN BYTE * pbChallenge
|
||
)
|
||
{
|
||
DWORD dwRetCode;
|
||
BYTE MsChapChangePw1[72+6];
|
||
BYTE MsChapChallenge[MAXCHALLENGELEN+6];
|
||
|
||
if ( pwb->pUserAttributes != NULL )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
}
|
||
|
||
//
|
||
// Allocate the appropriate amount
|
||
//
|
||
|
||
if ( ( pwb->pUserAttributes = RasAuthAttributeCreate( 3 ) ) == NULL )
|
||
{
|
||
return( GetLastError() );
|
||
}
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 0,
|
||
pwb->pUserAttributes,
|
||
raatUserName,
|
||
FALSE,
|
||
strlen( pchIdentity ),
|
||
pchIdentity );
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
//
|
||
// Build vendor specific attribute for MS-CHAP challenge
|
||
//
|
||
|
||
HostToWireFormat32( 311, MsChapChallenge ); // Vendor Id
|
||
MsChapChallenge[4] = 11; // Vendor Type
|
||
MsChapChallenge[5] = 2+(BYTE)cbChallenge; // Vendor Length
|
||
|
||
CopyMemory( MsChapChallenge+6, pbChallenge, cbChallenge );
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 1,
|
||
pwb->pUserAttributes,
|
||
raatVendorSpecific,
|
||
FALSE,
|
||
cbChallenge+6,
|
||
MsChapChallenge);
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
//
|
||
// Insert change password attribute
|
||
//
|
||
|
||
HostToWireFormat32( 311, MsChapChangePw1 ); // Vendor Id
|
||
MsChapChangePw1[4] = 3; // Vendor Type
|
||
MsChapChangePw1[5] = 72; // Vendor Length
|
||
MsChapChangePw1[6] = 5; // Code
|
||
MsChapChangePw1[7] = bId; // Identifier
|
||
|
||
CopyMemory( MsChapChangePw1+8,
|
||
pEncryptedLmOwfOldPassword,
|
||
16 );
|
||
|
||
CopyMemory( MsChapChangePw1+8+16,
|
||
pEncryptedLmOwfNewPassword,
|
||
16 );
|
||
|
||
CopyMemory( MsChapChangePw1+8+16+16,
|
||
pEncryptedNtOwfOldPassword,
|
||
16 );
|
||
|
||
CopyMemory( MsChapChangePw1+8+16+16+16,
|
||
pEncryptedNtOwfNewPassword,
|
||
16 );
|
||
|
||
HostToWireFormat16( LenPassword, MsChapChangePw1+8+16+16+16+16 );
|
||
|
||
HostToWireFormat16( wFlags, MsChapChangePw1+8+16+16+16+16+2 );
|
||
|
||
//
|
||
// Build vendor specific attribute for MS-CHAP change password 1
|
||
//
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 2,
|
||
pwb->pUserAttributes,
|
||
raatVendorSpecific,
|
||
FALSE,
|
||
72+4,
|
||
MsChapChangePw1);
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: MakeChangePasswordV2RequestAttributes
|
||
//
|
||
// Returns: NO_ERROR - Success
|
||
// Non-zero returns - Failure
|
||
//
|
||
// Description:
|
||
//
|
||
DWORD
|
||
MakeChangePasswordV2RequestAttributes(
|
||
IN CHAPWB* pwb,
|
||
IN BYTE bId,
|
||
IN CHAR* pchIdentity,
|
||
IN SAMPR_ENCRYPTED_USER_PASSWORD* pNewEncryptedWithOldNtOwf,
|
||
IN ENCRYPTED_NT_OWF_PASSWORD* pOldNtOwfEncryptedWithNewNtOwf,
|
||
IN SAMPR_ENCRYPTED_USER_PASSWORD* pNewEncryptedWithOldLmOwf,
|
||
IN ENCRYPTED_NT_OWF_PASSWORD* pOldLmOwfEncryptedWithNewNtOwf,
|
||
IN DWORD cbChallenge,
|
||
IN BYTE * pbChallenge,
|
||
IN BYTE * pbResponse,
|
||
IN WORD wFlags
|
||
)
|
||
{
|
||
DWORD dwRetCode;
|
||
BYTE MsChapChallenge[MAXCHALLENGELEN+6];
|
||
BYTE MsChapChangePw2[86+4];
|
||
BYTE NtPassword1[250+4];
|
||
BYTE NtPassword2[250+4];
|
||
BYTE NtPassword3[34+4];
|
||
BYTE LmPassword1[250+4];
|
||
BYTE LmPassword2[250+4];
|
||
BYTE LmPassword3[34+4];
|
||
|
||
if ( pwb->pUserAttributes != NULL )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
}
|
||
|
||
//
|
||
// Allocate the appropriate amount
|
||
//
|
||
|
||
pwb->pUserAttributes = RasAuthAttributeCreate( 9 );
|
||
|
||
if ( pwb->pUserAttributes == NULL )
|
||
{
|
||
return( GetLastError() );
|
||
}
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 0,
|
||
pwb->pUserAttributes,
|
||
raatUserName,
|
||
FALSE,
|
||
strlen( pchIdentity ),
|
||
pchIdentity );
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
//
|
||
// Build vendor specific attribute for MS-CHAP challenge
|
||
//
|
||
|
||
HostToWireFormat32( 311, MsChapChallenge ); // Vendor Id
|
||
MsChapChallenge[4] = 11; // Vendor Type
|
||
MsChapChallenge[5] = 2+(BYTE)cbChallenge; // Vendor Length
|
||
|
||
CopyMemory( MsChapChallenge+6, pbChallenge, cbChallenge );
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 1,
|
||
pwb->pUserAttributes,
|
||
raatVendorSpecific,
|
||
FALSE,
|
||
cbChallenge+6,
|
||
MsChapChallenge);
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
//
|
||
// Insert change password attribute
|
||
//
|
||
|
||
HostToWireFormat32( 311, MsChapChangePw2 ); // Vendor Id
|
||
MsChapChangePw2[4] = 4; // Vendor Type
|
||
MsChapChangePw2[5] = 86; // Vendor Length
|
||
MsChapChangePw2[6] = 6; // Code
|
||
MsChapChangePw2[7] = bId; // Identifier
|
||
|
||
CopyMemory( MsChapChangePw2+8,
|
||
pOldNtOwfEncryptedWithNewNtOwf,
|
||
16 );
|
||
|
||
CopyMemory( MsChapChangePw2+8+16,
|
||
pOldLmOwfEncryptedWithNewNtOwf,
|
||
16 );
|
||
|
||
CopyMemory( MsChapChangePw2+8+16+16, pbResponse, 24+24 );
|
||
|
||
HostToWireFormat16( (WORD)wFlags, MsChapChangePw2+8+16+16+24+24 );
|
||
|
||
//
|
||
// Build vendor specific attribute for MS-CHAP change password 2
|
||
//
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 2,
|
||
pwb->pUserAttributes,
|
||
raatVendorSpecific,
|
||
FALSE,
|
||
86+4,
|
||
MsChapChangePw2);
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
//
|
||
// Insert the new password attributes
|
||
//
|
||
|
||
HostToWireFormat32( 311, NtPassword1 ); // Vendor Id
|
||
NtPassword1[4] = 6; // Vendor Type
|
||
NtPassword1[5] = 249; // Vendor Length
|
||
NtPassword1[6] = 6; // Code
|
||
NtPassword1[7] = bId; // Identifier
|
||
HostToWireFormat16( (WORD)1, NtPassword1+8 ); // Sequence number
|
||
|
||
CopyMemory( NtPassword1+10, (PBYTE)pNewEncryptedWithOldNtOwf, 243 );
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 3,
|
||
pwb->pUserAttributes,
|
||
raatVendorSpecific,
|
||
FALSE,
|
||
249+4,
|
||
NtPassword1);
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
HostToWireFormat32( 311, NtPassword2 ); // Vendor Id
|
||
NtPassword2[4] = 6; // Vendor Type
|
||
NtPassword2[5] = 249; // Vendor Length
|
||
NtPassword2[6] = 6; // Code
|
||
NtPassword2[7] = bId; // Identifier
|
||
HostToWireFormat16( (WORD)2, NtPassword2+8 ); // Sequence number
|
||
|
||
CopyMemory( NtPassword2+10,
|
||
((PBYTE)pNewEncryptedWithOldNtOwf)+243,
|
||
243 );
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 4,
|
||
pwb->pUserAttributes,
|
||
raatVendorSpecific,
|
||
FALSE,
|
||
249+4,
|
||
NtPassword2 );
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
HostToWireFormat32( 311, NtPassword3 ); // Vendor Id
|
||
NtPassword3[4] = 6; // Vendor Type
|
||
NtPassword3[5] = 36; // Vendor Length
|
||
NtPassword3[6] = 6; // Code
|
||
NtPassword3[7] = bId; // Identifier
|
||
HostToWireFormat16( (WORD)3, NtPassword3+8 ); // Sequence number
|
||
|
||
CopyMemory( NtPassword3+10,
|
||
((PBYTE)pNewEncryptedWithOldNtOwf)+486,
|
||
30 );
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 5,
|
||
pwb->pUserAttributes,
|
||
raatVendorSpecific,
|
||
FALSE,
|
||
36+4,
|
||
NtPassword3 );
|
||
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
HostToWireFormat32( 311, LmPassword1 ); // Vendor Id
|
||
LmPassword1[4] = 5; // Vendor Type
|
||
LmPassword1[5] = 249; // Vendor Length
|
||
LmPassword1[6] = 6; // Code
|
||
LmPassword1[7] = bId; // Identifier
|
||
HostToWireFormat16( (WORD)1, LmPassword1+8 ); // Sequence number
|
||
|
||
CopyMemory( LmPassword1+10, pNewEncryptedWithOldLmOwf, 243 );
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 6,
|
||
pwb->pUserAttributes,
|
||
raatVendorSpecific,
|
||
FALSE,
|
||
249+4,
|
||
LmPassword1);
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
HostToWireFormat32( 311, LmPassword2 ); // Vendor Id
|
||
LmPassword2[4] = 5; // Vendor Type
|
||
LmPassword2[5] = 249; // Vendor Length
|
||
LmPassword2[6] = 6; // Code
|
||
LmPassword2[7] = bId; // Identifier
|
||
HostToWireFormat16( (WORD)2, LmPassword2+8 ); // Sequence number
|
||
|
||
CopyMemory( LmPassword2+10,
|
||
((PBYTE)pNewEncryptedWithOldLmOwf)+243,
|
||
243 );
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 7,
|
||
pwb->pUserAttributes,
|
||
raatVendorSpecific,
|
||
FALSE,
|
||
249+4,
|
||
LmPassword2 );
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
HostToWireFormat32( 311, LmPassword3 ); // Vendor Id
|
||
LmPassword3[4] = 5; // Vendor Type
|
||
LmPassword3[5] = 36; // Vendor Length
|
||
LmPassword3[6] = 6; // Code
|
||
LmPassword3[7] = bId; // Identifier
|
||
HostToWireFormat16( (WORD)3, LmPassword3+8 ); // Sequence number
|
||
|
||
CopyMemory( LmPassword3+10,
|
||
((PBYTE)pNewEncryptedWithOldLmOwf)+486,
|
||
30 );
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 8,
|
||
pwb->pUserAttributes,
|
||
raatVendorSpecific,
|
||
FALSE,
|
||
36+4,
|
||
LmPassword3 );
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: MakeChangePasswordV3RequestAttributes
|
||
//
|
||
// Returns: NO_ERROR - Success
|
||
// Non-zero returns - Failure
|
||
//
|
||
// Description:
|
||
//
|
||
DWORD
|
||
MakeChangePasswordV3RequestAttributes(
|
||
IN CHAPWB* pwb,
|
||
IN BYTE bId,
|
||
IN CHAR* pchIdentity,
|
||
IN CHANGEPW3* pchangepw3,
|
||
IN DWORD cbChallenge,
|
||
IN BYTE * pbChallenge
|
||
)
|
||
{
|
||
DWORD dwRetCode;
|
||
BYTE MsChapChallenge[MAXCHALLENGELEN+6];
|
||
BYTE MsChapChangePw3[70+4];
|
||
BYTE NtPassword1[250+4];
|
||
BYTE NtPassword2[250+4];
|
||
BYTE NtPassword3[34+4];
|
||
|
||
if ( pwb->pUserAttributes != NULL )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
}
|
||
|
||
//
|
||
// Allocate the appropriate amount
|
||
//
|
||
|
||
pwb->pUserAttributes = RasAuthAttributeCreate( 6 );
|
||
|
||
if ( pwb->pUserAttributes == NULL )
|
||
{
|
||
return( GetLastError() );
|
||
}
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 0,
|
||
pwb->pUserAttributes,
|
||
raatUserName,
|
||
FALSE,
|
||
strlen( pchIdentity ),
|
||
pchIdentity );
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
//
|
||
// Build vendor specific attribute for MS-CHAP challenge
|
||
//
|
||
|
||
HostToWireFormat32( 311, MsChapChallenge ); // Vendor Id
|
||
MsChapChallenge[4] = 11; // Vendor Type
|
||
MsChapChallenge[5] = 2+(BYTE)cbChallenge; // Vendor Length
|
||
|
||
CopyMemory( MsChapChallenge+6, pbChallenge, cbChallenge );
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 1,
|
||
pwb->pUserAttributes,
|
||
raatVendorSpecific,
|
||
FALSE,
|
||
cbChallenge+6,
|
||
MsChapChallenge);
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
//
|
||
// Insert change password attribute
|
||
//
|
||
|
||
HostToWireFormat32( 311, MsChapChangePw3 ); // Vendor Id
|
||
MsChapChangePw3[4] = 27; // Vendor Type
|
||
MsChapChangePw3[5] = 70; // Vendor Length
|
||
MsChapChangePw3[6] = 7; // Code
|
||
MsChapChangePw3[7] = bId; // Identifier
|
||
|
||
CopyMemory( MsChapChangePw3+8, pchangepw3->abEncryptedHash, 16 );
|
||
CopyMemory( MsChapChangePw3+8+16, pchangepw3->abPeerChallenge, 24 );
|
||
CopyMemory( MsChapChangePw3+8+16+24, pchangepw3->abNTResponse, 24 );
|
||
|
||
HostToWireFormat16( (WORD)0, MsChapChangePw3+8+16+24+24 );
|
||
|
||
//
|
||
// Build vendor specific attribute for MS-CHAP2-PW
|
||
//
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 2,
|
||
pwb->pUserAttributes,
|
||
raatVendorSpecific,
|
||
FALSE,
|
||
70+4,
|
||
MsChapChangePw3);
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
//
|
||
// Insert the new password attributes
|
||
//
|
||
|
||
HostToWireFormat32( 311, NtPassword1 ); // Vendor Id
|
||
NtPassword1[4] = 6; // Vendor Type
|
||
NtPassword1[5] = 249; // Vendor Length
|
||
NtPassword1[6] = 6; // Code
|
||
NtPassword1[7] = bId; // Identifier
|
||
HostToWireFormat16( (WORD)1, NtPassword1+8 ); // Sequence number
|
||
|
||
CopyMemory( NtPassword1+10, pchangepw3->abEncryptedPassword, 243 );
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 3,
|
||
pwb->pUserAttributes,
|
||
raatVendorSpecific,
|
||
FALSE,
|
||
249+4,
|
||
NtPassword1);
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
HostToWireFormat32( 311, NtPassword2 ); // Vendor Id
|
||
NtPassword2[4] = 6; // Vendor Type
|
||
NtPassword2[5] = 249; // Vendor Length
|
||
NtPassword2[6] = 6; // Code
|
||
NtPassword2[7] = bId; // Identifier
|
||
HostToWireFormat16( (WORD)2, NtPassword2+8 ); // Sequence number
|
||
|
||
CopyMemory( NtPassword2+10,
|
||
pchangepw3->abEncryptedPassword+243,
|
||
243 );
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 4,
|
||
pwb->pUserAttributes,
|
||
raatVendorSpecific,
|
||
FALSE,
|
||
249+4,
|
||
NtPassword2 );
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
HostToWireFormat32( 311, NtPassword3 ); // Vendor Id
|
||
NtPassword3[4] = 6; // Vendor Type
|
||
NtPassword3[5] = 36; // Vendor Length
|
||
NtPassword3[6] = 6; // Code
|
||
NtPassword3[7] = bId; // Identifier
|
||
HostToWireFormat16( (WORD)3, NtPassword3+8 ); // Sequence number
|
||
|
||
CopyMemory( NtPassword3+10,
|
||
pchangepw3->abEncryptedPassword+486,
|
||
30 );
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 5,
|
||
pwb->pUserAttributes,
|
||
raatVendorSpecific,
|
||
FALSE,
|
||
36+4,
|
||
NtPassword3 );
|
||
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: MakeAuthenticationRequestAttributes
|
||
//
|
||
// Returns: NO_ERROR - Success
|
||
// Non-zero returns - Failure
|
||
//
|
||
// Description:
|
||
//
|
||
DWORD
|
||
MakeAuthenticationRequestAttributes(
|
||
IN CHAPWB * pwb,
|
||
IN BOOL fMSChap,
|
||
IN BYTE bAlgorithm,
|
||
IN CHAR* szUserName,
|
||
IN BYTE* pbChallenge,
|
||
IN DWORD cbChallenge,
|
||
IN BYTE* pbResponse,
|
||
IN DWORD cbResponse,
|
||
IN BYTE bId
|
||
)
|
||
{
|
||
DWORD dwRetCode;
|
||
BYTE abResponse[MD5RESPONSELEN+1];
|
||
|
||
if ( pwb->pUserAttributes != NULL )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
}
|
||
|
||
//
|
||
// Allocate the appropriate amount
|
||
//
|
||
|
||
if ( ( pwb->pUserAttributes = RasAuthAttributeCreate( 3 ) ) == NULL )
|
||
{
|
||
return( GetLastError() );
|
||
}
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 0,
|
||
pwb->pUserAttributes,
|
||
raatUserName,
|
||
FALSE,
|
||
strlen( szUserName ),
|
||
szUserName );
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
if ( fMSChap )
|
||
{
|
||
BYTE MsChapChallenge[MAXCHALLENGELEN+6];
|
||
|
||
HostToWireFormat32( 311, MsChapChallenge ); // Vendor Id
|
||
MsChapChallenge[4] = 11; // Vendor Type
|
||
MsChapChallenge[5] = 2+(BYTE)cbChallenge; // Vendor Length
|
||
|
||
CopyMemory( MsChapChallenge+6, pbChallenge, cbChallenge );
|
||
|
||
//
|
||
// Build vendor specific attribute for MS-CHAP challenge
|
||
//
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 1,
|
||
pwb->pUserAttributes,
|
||
raatVendorSpecific,
|
||
FALSE,
|
||
cbChallenge+6,
|
||
MsChapChallenge );
|
||
}
|
||
else
|
||
{
|
||
dwRetCode = RasAuthAttributeInsert( 1,
|
||
pwb->pUserAttributes,
|
||
raatMD5CHAPChallenge,
|
||
FALSE,
|
||
cbChallenge,
|
||
pbChallenge );
|
||
}
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
if ( fMSChap && ( bAlgorithm == PPP_CHAP_DIGEST_MSEXT ) )
|
||
{
|
||
BYTE MsChapResponse[56];
|
||
|
||
HostToWireFormat32( 311, MsChapResponse ); // Vendor Id
|
||
MsChapResponse[4] = 1; // Vendor Type
|
||
MsChapResponse[5] = (BYTE)52; // Vendor Length
|
||
MsChapResponse[6] = bId; // Ident
|
||
MsChapResponse[7] = pbResponse[cbResponse-1]; // Flags
|
||
|
||
CopyMemory( MsChapResponse+8, pbResponse, cbResponse-1 );
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 2,
|
||
pwb->pUserAttributes,
|
||
raatVendorSpecific,
|
||
FALSE,
|
||
56,
|
||
MsChapResponse);
|
||
}
|
||
else if ( fMSChap && ( bAlgorithm == PPP_CHAP_DIGEST_MSEXT_NEW ) )
|
||
{
|
||
BYTE MsChap2Response[56];
|
||
|
||
HostToWireFormat32( 311, MsChap2Response ); // Vendor Id
|
||
MsChap2Response[4] = 25; // Vendor Type
|
||
MsChap2Response[5] = (BYTE)52; // Vendor Length
|
||
MsChap2Response[6] = bId; // Ident
|
||
MsChap2Response[7] = 0; // Flags
|
||
|
||
CopyMemory( MsChap2Response+8, pbResponse, cbResponse-1 );
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 2,
|
||
pwb->pUserAttributes,
|
||
raatVendorSpecific,
|
||
FALSE,
|
||
56,
|
||
MsChap2Response);
|
||
}
|
||
else
|
||
{
|
||
abResponse[0] = bId;
|
||
|
||
CopyMemory( abResponse+1, pbResponse, cbResponse );
|
||
|
||
dwRetCode = RasAuthAttributeInsert( 2,
|
||
pwb->pUserAttributes,
|
||
raatMD5CHAPPassword,
|
||
FALSE,
|
||
cbResponse+1,
|
||
abResponse );
|
||
}
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
RasAuthAttributeDestroy( pwb->pUserAttributes );
|
||
|
||
pwb->pUserAttributes = NULL;
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: GetErrorCodeFromAttributes
|
||
//
|
||
// Returns: NO_ERROR - Success
|
||
// Non-zero returns - Failure
|
||
//
|
||
// Description: Will extract the error code returned from the authentication
|
||
// provider and insert it into the reponse sent to the client
|
||
//
|
||
DWORD
|
||
GetErrorCodeFromAttributes(
|
||
IN CHAPWB* pwb
|
||
)
|
||
{
|
||
RAS_AUTH_ATTRIBUTE * pAttribute;
|
||
RAS_AUTH_ATTRIBUTE * pAttributes = pwb->pAttributesFromAuthenticator;
|
||
DWORD dwRetCode = NO_ERROR;
|
||
|
||
//
|
||
// Search for MS-CHAP Error attributes
|
||
//
|
||
|
||
pAttribute = RasAuthAttributeGetVendorSpecific( 311, 2, pAttributes );
|
||
|
||
if ( pAttribute != NULL )
|
||
{
|
||
CHAR chErrorBuffer[150];
|
||
CHAR* pszValue;
|
||
DWORD cbError = (DWORD)*(((PBYTE)(pAttribute->Value))+5);
|
||
|
||
//
|
||
// Leave one byte for NULL terminator
|
||
//
|
||
|
||
if ( cbError > sizeof( chErrorBuffer ) - 1 )
|
||
{
|
||
cbError = sizeof( chErrorBuffer ) - 1;
|
||
}
|
||
|
||
ZeroMemory( chErrorBuffer, sizeof( chErrorBuffer ) );
|
||
|
||
CopyMemory( chErrorBuffer,
|
||
(CHAR *)((PBYTE)(pAttribute->Value) + 7),
|
||
cbError );
|
||
|
||
pszValue = strstr( chErrorBuffer, "E=" );
|
||
|
||
if ( pszValue )
|
||
{
|
||
pwb->result.dwError = (DWORD )atol( pszValue + 2 );
|
||
}
|
||
|
||
pszValue = strstr( chErrorBuffer, "R=1" );
|
||
|
||
if ( pszValue )
|
||
{
|
||
pwb->dwTriesLeft = 1;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//
|
||
// If we did not get an error code attribute back then assume an
|
||
// access denied
|
||
//
|
||
|
||
TRACE("No error code attribute returned, assuming access denied");
|
||
|
||
pwb->result.dwError = ERROR_AUTHENTICATION_FAILURE;
|
||
}
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: GetEncryptedPasswordsForChangePassword2
|
||
//
|
||
// Returns: NO_ERROR - Success
|
||
// Non-zero returns - Failure
|
||
//
|
||
// Description:
|
||
//
|
||
DWORD
|
||
GetEncryptedPasswordsForChangePassword2(
|
||
IN CHAR* pszOldPassword,
|
||
IN CHAR* pszNewPassword,
|
||
OUT SAMPR_ENCRYPTED_USER_PASSWORD* pNewEncryptedWithOldNtOwf,
|
||
OUT ENCRYPTED_NT_OWF_PASSWORD* pOldNtOwfEncryptedWithNewNtOwf,
|
||
OUT SAMPR_ENCRYPTED_USER_PASSWORD* pNewEncryptedWithOldLmOwf,
|
||
OUT ENCRYPTED_NT_OWF_PASSWORD* pOldLmOwfEncryptedWithNewNtOwf,
|
||
OUT BOOLEAN* pfLmPresent )
|
||
{
|
||
DWORD dwErr;
|
||
BOOL fLmPresent;
|
||
UNICODE_STRING uniOldPassword;
|
||
UNICODE_STRING uniNewPassword;
|
||
|
||
TRACE("GetEncryptedPasswordsForChangePassword2...");
|
||
|
||
uniOldPassword.Buffer = NULL;
|
||
uniNewPassword.Buffer = NULL;
|
||
|
||
if (!RtlCreateUnicodeStringFromAsciiz(
|
||
&uniOldPassword, pszOldPassword )
|
||
|| !RtlCreateUnicodeStringFromAsciiz(
|
||
&uniNewPassword, pszNewPassword ))
|
||
{
|
||
dwErr = ERROR_NOT_ENOUGH_MEMORY;
|
||
}
|
||
else
|
||
{
|
||
dwErr =
|
||
SamiEncryptPasswords(
|
||
&uniOldPassword,
|
||
&uniNewPassword,
|
||
pNewEncryptedWithOldNtOwf,
|
||
pOldNtOwfEncryptedWithNewNtOwf,
|
||
pfLmPresent,
|
||
pNewEncryptedWithOldLmOwf,
|
||
pOldLmOwfEncryptedWithNewNtOwf );
|
||
}
|
||
|
||
/* Erase password buffers.
|
||
*/
|
||
if (uniOldPassword.Buffer)
|
||
{
|
||
ZeroMemory( uniOldPassword.Buffer,
|
||
lstrlenW( uniOldPassword.Buffer ) * sizeof( WCHAR ) );
|
||
}
|
||
|
||
if (uniNewPassword.Buffer)
|
||
{
|
||
ZeroMemory( uniNewPassword.Buffer,
|
||
lstrlenW( uniNewPassword.Buffer ) * sizeof( WCHAR ) );
|
||
}
|
||
|
||
RtlFreeUnicodeString( &uniOldPassword );
|
||
RtlFreeUnicodeString( &uniNewPassword );
|
||
|
||
TRACE1("GetEncryptedPasswordsForChangePassword2 done(%d)",dwErr);
|
||
return dwErr;
|
||
}
|