📄 chap.c
字号:
/**---------------------版权 (c)----------------------------------------------------------***
*** 作者:颜章健 ***
*** 邮件:jenkinyan@163.com ***
*** ***
***---------------------File Info---------------------------------------------------------***
*** 创 建 人: 颜章健 ***
*** 创建日期: 2008-03-16 ***
*** 创建版本: ***
*** 文件描述: 挑战握手验证协议 ***
***---------------------------------------------------------------------------------------***
*** 修 订 人: ***
*** 修订日期: ***
*** 修订版本: ***
*** 修订描述 ***
***---------------------------------------------------------------------------------------**/
#include "config.h"
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
void ChapPutFrame(uint8 Code,NET_PKT *ChapData)
{
static uint8 Id = 0;
uint16 Length = 0;
uint8 head[4];
NET_PKT ChapPkt;
NET_PKT *p;
p = ChapData;
while(p != NULL)
{
Length += p->Length;
p = p->Next;
}
head[0] = Code;
head[1] = Id++;
Length = Length + 4;
head[2] = Length >> 8;
head[3] = (uint8)Length;
ChapPkt.Next = ChapData;
ChapPkt.Data = head;
ChapPkt.Length = 4;
LinkLayer.PutFrame(PPPF_CHAP,&ChapPkt);
}
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
void ChapChallenge(void)
{
uint8 Challenge[11];
NET_PKT ChapData;
uint8 i;
for(i=1; i<11 ;i++)
{
Challenge[i] = rand();
}
Challenge[0] = 10;
#ifdef DEBUG
_printf("CHAP发送挑战\r\n");
#endif
ChapData.Data = Challenge;
ChapData.Length = 11;
ChapData.Next = NULL;
ChapPutFrame(CHAPF_CHALLENGE, &ChapData);
}
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
void ChapResponse(uint8 Id)
{
MD5_CTX Context;
uint8 ValSize;
uint8 MdSum[17];
uint8 tmp = Id;
#ifdef DEBUG
{
char buf[100];
char *UserName;
uint16 v16;
uint8 NameLength;
uint8 *Rxd = LinkLayer.Rxd;
UserName = (char *)(Rxd + 1 + Rxd[0]);
v16 = Rxd[-2]; v16 <<= 8;
v16 = v16 | Rxd[-1];
NameLength = v16 - 4 - Rxd[0];
sprintf(buf,"NameLength= %d bytes\r\n",NameLength); _printf(buf);
_printf("UserName in hex is:\r\n");
while(NameLength--)
{
sprintf(buf,"0x%x ",(*UserName)); _printf(buf);
UserName++;
}
_printf("\r\n");
}
#endif
ValSize = *LinkLayer.Rxd++;
MD5Init (&Context);
MD5Update(&Context,&tmp,1);
MD5Update(&Context,(uint8 *)LinkLayer.Config.Password+1,LinkLayer.Config.Password[0]);
MD5Update(&Context,LinkLayer.Rxd,ValSize);
MD5Final (&Context,MdSum+1);
//ChapPutFrame();
}
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
void ChapPass(void)
{
NET_PKT ChapData;
uint8 Message;
Message = rand();
ChapData.Data = &Message;
ChapData.Length = 1;
ChapData.Next = NULL;
ChapPutFrame(CHAPF_SUCCESS, &ChapData);
}
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
void ChapProcess(void)
{
uint8 Code,Id;
// union {uint16 w; uint8 b[2];}len;
Code = *LinkLayer.Rxd++;
Id = *LinkLayer.Rxd++;
// len.b[1] = *LinkLayer.Rxd++;
// len.b[0] = *LinkLayer.Rxd++;
LinkLayer.Rxd += 2;
LinkLayer.Rxl -= 4;
switch(Code)
{
case CHAPF_CHALLENGE:
#ifdef DEBUG
_printf("CHAP receive challenge\r\n");
#endif
ChapResponse(Id);
break;
case CHAPF_RESPONSE:
#ifdef DEBUG
_printf("CHAP receive response\r\n");
#endif
ChapPass();
break;
case CHAPF_SUCCESS:
#ifdef DEBUG
_printf("CHAP passed\r\n");
_printf("\r\n");
_printf("PPP enter net configulation:");
#endif
LinkLayer.State = PPPS_NCP;
NcpRequest();
break;
case CHAPF_FAIL:
#ifdef DEBUG
_printf("CHAP fail\r\n");
#endif
break;
default:
#ifdef DEBUG
_printf("unkonw chap packet\r\n");
#endif
break;
}
}
/********************************************************************************************
*** 文件结束 ***
********************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -