127 lines
3.2 KiB
C++
127 lines
3.2 KiB
C++
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
pap.cpp
|
|
|
|
Abstract:
|
|
|
|
Password authentication protocol.
|
|
|
|
Revision History:
|
|
|
|
07-26-00 vadimg created
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
|
|
/***************************************************************************\
|
|
* PapBegin
|
|
*
|
|
\***************************************************************************/
|
|
|
|
DWORD PapBegin(VOID)
|
|
{
|
|
gAp.State = PS_Initial;
|
|
return NO_ERROR;
|
|
}
|
|
|
|
/***************************************************************************\
|
|
* PapEnd
|
|
*
|
|
\***************************************************************************/
|
|
|
|
DWORD PapEnd(VOID)
|
|
{
|
|
return NO_ERROR;
|
|
}
|
|
|
|
/***************************************************************************\
|
|
* PapMakeRequestMessage
|
|
*
|
|
\***************************************************************************/
|
|
|
|
VOID PapMakeRequestMessage(PPP_CONFIG *pSendBuf)
|
|
{
|
|
BYTE *pcbPeerId;
|
|
BYTE *pcbPassword;
|
|
WORD wLength;
|
|
CHAR szAccount[DNLEN + 1 + UNLEN + 1];
|
|
char *p = szAccount;
|
|
|
|
if (gInfo.szDomain[0] != '\0') {
|
|
p = str_add(p, gInfo.szDomain);
|
|
p = str_add(p, "\\");
|
|
}
|
|
str_add(p, gInfo.szUsername);
|
|
|
|
pcbPeerId = pSendBuf->Data;
|
|
*pcbPeerId = (BYTE)strlen(szAccount);
|
|
strcpy((char*)(pcbPeerId + 1), szAccount);
|
|
|
|
pcbPassword = pcbPeerId + 1 + *pcbPeerId;
|
|
*pcbPassword = (BYTE)strlen(gInfo.szPassword);
|
|
strcpy((char*)(pcbPassword + 1), gInfo.szPassword);
|
|
|
|
pSendBuf->Code = (BYTE)PAPCODE_Req;
|
|
pSendBuf->Id = GetId();
|
|
|
|
wLength = (WORD)(PPP_CONFIG_HDR_LEN + 1 + *pcbPeerId + 1 + *pcbPassword);
|
|
HostToWireFormat16(wLength, pSendBuf->Length);
|
|
}
|
|
|
|
/***************************************************************************\
|
|
* PapMakeMessage
|
|
*
|
|
\***************************************************************************/
|
|
|
|
DWORD PapMakeMessage(PPP_CONFIG *pRecvBuf)
|
|
{
|
|
PPP_PACKET *pSendPacket = GetSendPacket();
|
|
PPP_CONFIG *pSendConfig = (PPP_CONFIG*)pSendPacket->Data;
|
|
|
|
if (pRecvBuf == NULL && gAp.State != PS_Initial) {
|
|
gAp.State = PS_Initial;
|
|
}
|
|
|
|
switch (gAp.State) {
|
|
case PS_Initial:
|
|
PapMakeRequestMessage(pSendConfig);
|
|
gAp.Action = AP_SendWithTimeout;
|
|
gAp.State = PS_RequestSent;
|
|
break;
|
|
|
|
case PS_RequestSent:
|
|
if (pRecvBuf->Code == PAPCODE_Ack) {
|
|
gInfo.dwError = 0;
|
|
gAp.Action = AP_Done;
|
|
gAp.State = PS_Done;
|
|
} else if (pRecvBuf->Code == PAPCODE_Nak) {
|
|
gInfo.dwError = ERROR_AUTHENTICATION_FAILURE;
|
|
gAp.Action = AP_Done;
|
|
gAp.State = PS_Done;
|
|
} else {
|
|
gAp.Action = AP_NoAction;
|
|
}
|
|
}
|
|
|
|
return NO_ERROR;
|
|
}
|
|
|
|
/***************************************************************************\
|
|
* GetPapInfo
|
|
*
|
|
\***************************************************************************/
|
|
|
|
VOID GetPapInfo(PPP_CP_INFO *pInfo)
|
|
{
|
|
ZeroMemory(pInfo, sizeof(PPP_CP_INFO));
|
|
pInfo->Protocol = PPP_PAP_PROTOCOL;
|
|
pInfo->Recognize = MAX_PAP_CODE;
|
|
pInfo->CP_Begin = PapBegin;
|
|
pInfo->CP_End = PapEnd;
|
|
pInfo->CP_MakeMessage = PapMakeMessage;
|
|
}
|
|
|