2020-09-30 17:17:25 +02:00

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;
}