⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap.c

📁 在S3C2440上运行的"电子日历“(支持平年,闰年,星期自动调整). 开发环境是RVDS2.2
💻 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 + -