secureboot.c

来自「基于h323协议的软phone」· C语言 代码 · 共 1,453 行 · 第 1/3 页

C
1,453
字号
#ifndef NOWP
#define NOWP
#endif
#include <string.h>
#include "event.h"
#include "beptimer.h"
#include "SysDep.h"
#include "stdlib.h"
#include "sockLib.h" 
#include "inetLib.h"
#include <routelib.h>

typedef enum
{
	SET_SUBMASK_STATE,
	SET_IPADDR_STATE,
	SET_GATEWAY_STATE,
	SET_FTPSERVER_STATE,
	SET_USER_STATE,
	SET_PWD_STATE,
	SET_UPDATEFILE_STATE
} UpdateState;

typedef enum
{
	UPDATE_DIGIT_EVENT,
	UPDATE_OK_KEY_EVENT,
	UPDATE_CANCEL_KEY_EVENT,
	UPDATE_TIMEOUT_EVENT,
	UPDATE_NULL_EVENT
} UpdateEvent;

typedef struct prcess_event
{
	int iEvent;
	char* pMsg;
} prcess_event;

typedef int (*f_action)(int* psState, struct prcess_event* psEvent);

typedef struct s_updateblock
{
	unsigned char * fileblock;
	int length;
	struct s_updateblock * next;
} s_updateblock;

#define SECURE_UPDATE_STATE	7
#define SECURE_UPDATE_EVENT	4
/**
* 升级函数的返回状态
*/
#define SECURE_UPDATE_OK				        0		/* 升级文件下载成功 */
#define SECURE_UPDATE_CONN_ERROR		       -1		/* 网络连接错误 */
#define SECURE_UPDATE_PASSWD_ERROR		-2		/* 用户名或者密码错误 */
#define SECURE_UPDATE_FILE_NOTEXIST		-3		/* 文件不存在 */
#define SECURE_UPDATE_NO_SPACE			-4		/* 空间不足 */
#define SECURE_UPDATE_WRITE_ERROR		-5		/* 写Flash错误*/
#define SECURE_UPDATE_INVALID_FILE		-6		/* 无效文件*/
#define SECURE_UPDATE_TOO_LONG                   -7
#define SECURE_UPDATE_ERROR_UNKNOWN	       -8		/* 未知错误 */
#define SECURE_BOORROMSIZE 400 * 1024
#define SECURE_APPSIZE          1300 * 1024

#define SECURE_SYSTEM_UPDATING			"System updating..."
#define SECURE_PLEASE_WAIT				"Please wait..."
#define SECURE_SYSTEM_REBOOTING			"Rebooting..."
#define SECURE_UPDATE_OK_AND_REBOOT1	"Ok!  Please reboot "
#define SECURE_UPDATE_OK_AND_REBOOT2	"the system."
#define SECURE_FTP_CONNECTION_ERROR		"Connection error."
#define SECURE_FTP_INVALID_ID_OR_PIN		"Invalid ID or pin."
#define SECURE_FTP_FILE_NOT_EXIST			"File not exist."
#define SECURE_FTP_SPACE_NOT_ENOUGH		"Space not enough."
#define SECURE_FTP_WRITE_ERROR			"Write error."
#define SECURE_FTP_INVALID_FILE			"Invalid file."
#define SECURE_FTP_FILE_TO_LONG			"File too long."
#define SECURE_FTP_UNKNOWN_ERROR			"Unknown error."


#define SECURE_COLLECT_IP_MAXSIZE			15

void ClearLcd( void );
void WriteLcd( char *msg, int row, int col );
extern void KeyLampMonitor( MSG_Q_ID eventQ );
extern int SpawnTask( char *taskId, FUNCPTR taskProc, char giveMsgQueue,
                int priority, int stackSize );


static int digit_index;
static char digit_set[32];
static NonWrapperMsg* msg;
static char localIPAddr[SECURE_COLLECT_IP_MAXSIZE+1];
static char localSubMask[SECURE_COLLECT_IP_MAXSIZE+1];
static char localGateway[SECURE_COLLECT_IP_MAXSIZE+1];
static char ftpServer[SECURE_COLLECT_IP_MAXSIZE+1];
static char ftpUser[20];
static char ftpPwd[10];
static char updateFile[20];

static char *keyMap[12] = 
{
	"0",
	"1",
	"2abcABC",
	"3defDEF",
	"4ghiGHI",
	"5jklJKL",
	"6mnoMNO",
	"7pqrsPQRS",
	"8tuvTUV",
	"9wxyzWXYZ",
	"*.",
	"#"
};

static char lastDigit = 100, lastIndex = 0;

static char *stateInfo[SECURE_UPDATE_STATE] = 
{
	"Subnet Mask:",
	"IP Address:",
	"Gateway:",
	"FTP Server:",
	"FTP Account:",
	"FTP Password:",
	"Update File:"
};

static int digit_timer = 0;

static int yes = 1;
static int addr_len = sizeof(struct sockaddr_in);
static char * ftp_user_cmd = "USER";
static char * ftp_pass_cmd = "PASS";
static char * ftp_type_cmd = "TYPE";
static char * ftp_port_cmd = "PORT";
static char * ftp_retr_cmd = "RETR";
static char * ftp_quit_cmd = "QUIT";
static unsigned char ftp_request[32];
static unsigned char ftp_reply[3];
static unsigned char ftp_fileblock[1024];

#if 1
#include "rebootLib.h"
#include "sysLib.h"
#endif

static void system_reboot()
{
#if 1
	printf("system rebooting...\n");
	reboot(BOOT_QUICK_AUTOBOOT);
#endif

}

static void convertString2Int(char *digit_set, unsigned int *num)
{
	char temp[4];
	temp[3] = (digit_set[12]-'0')*100+(digit_set[13]-'0')*10+(digit_set[14]-'0');
	temp[2] = (digit_set[8]-'0')*100+(digit_set[9]-'0')*10+(digit_set[10]-'0');
	temp[1] = (digit_set[4]-'0')*100+(digit_set[5]-'0')*10+(digit_set[6]-'0');
	temp[0] = (digit_set[0]-'0')*100+(digit_set[1]-'0')*10+(digit_set[2]-'0');
	*num = temp[3] + temp[2]*0x100 + temp[1]*0x10000 + temp[0]*0x1000000; 
}

/*******************************************************
* Part UPDATE_COMMON
*******************************************************/
static s_updateblock * ConstructBlockNode(void)
{
	s_updateblock * ptr_block;
	if ((ptr_block = (s_updateblock *) malloc(sizeof(s_updateblock))) == NULL)
	{
		return NULL;
	}
	if ((ptr_block -> fileblock = (unsigned char *) malloc(1024)) == NULL)
	{
		free(ptr_block);
		return NULL;
	}
	memset(ptr_block -> fileblock, 0, 1024);
	ptr_block -> length = 0;
	ptr_block -> next = NULL;
	return ptr_block;
}

static void ClearUpdateBlock(s_updateblock * ptr_updatefile)
{
	s_updateblock * p, * q;
	
	printf("Clear Update Node...\n");
	
	if (ptr_updatefile == NULL)
	{
		return;
	}
	for (p = ptr_updatefile; p != NULL; p = q)
	{
		free(p -> fileblock);
		q = p -> next;
		free(p);
	}	
	return;
}

static void CheckUpdateBlock(s_updateblock * ptr)
{
	s_updateblock * p;
	int i;
	
	for (p = ptr, i = 0; p != NULL; p = p -> next, i++)
	{
	}
	printf("There are %d blocks in the Update file\n", i);
	return;
}

static int UpdateFlashRom(s_updateblock * ptr_updatefile, int count, int fileT)
{
	s_updateblock * p;
	unsigned short * pAddr = (unsigned short *) COMPRESSED_IMAGE_ADDR;
	unsigned char * ptr;
	int offset = 0;

	CheckUpdateBlock(ptr_updatefile);

	if (fileT == 1)
	{
		if (count > SECURE_BOORROMSIZE)
		{
			printf("file too long!\n\n");
			return SECURE_UPDATE_TOO_LONG;
		}
		if ((ptr = (unsigned char *) malloc(300 * 1024)) == NULL)
		{
			printf("error malloc boot\n");
			return -1;
		}
		for (p = ptr_updatefile; p != NULL; p = p -> next)
		{
			memcpy(ptr + offset, p -> fileblock, p -> length);
			offset += p -> length;
		}
		Program_Boot_Flash_Mem((unsigned short *) ptr, offset);
		free(ptr);
	}
	else if (fileT == 2)
	{
		if (count > SECURE_APPSIZE)
		{
			printf("file too long!\n\n");
			return SECURE_UPDATE_TOO_LONG;
		}
		if (count > COMPRESSED_IMAGE_SIZE)
		{
			printf("The Version is too Large!\n");
			return SECURE_UPDATE_NO_SPACE;
		}
		
		SetVersionUpdateFlag ( 0xff );/*2004-7-12 fujiangdong update begin*/
		
		if (Erase_Version_Flash_Mem () != OK)
		{
			printf("Erase Flash ROM ERROR!\n");
			return SECURE_UPDATE_WRITE_ERROR;
		}
		for (p = ptr_updatefile; p != NULL && count > 0; p = p -> next)
		{
			if (Program_Version_Flash_Mem((unsigned short *) p -> fileblock, pAddr, p -> length) != OK)
			{
				printf("Write Flash ROM ERROR!\n");
				return SECURE_UPDATE_WRITE_ERROR;
			}
			pAddr += p -> length / 2;
			count -= p -> length / 2;
		}
             SetVersionUpdateFlag ( 0x32 );/*2004-7-12 fujiangdong update ok*/
	}
	printf("Write Flash OK.\n");

	return SECURE_UPDATE_OK;
}

int FtpCommand(int sockfd, char * cmd, const char * param)
{
	int len;
	memset(ftp_request, 0, 32);
	len = sprintf(ftp_request, "%s %s\r\n", cmd, (param == NULL)? "" : param);
	#ifdef __FTP_DEBUG
	printf("%s %s\r\n", cmd, (param == NULL)? "" : param);
	#endif
	return send(sockfd, ftp_request, len, 0);
}

int FtpRecvReply(int sockfd)
{
	int len;
	char data;
	if ((len = recv(sockfd, ftp_reply, 3, 0)) <= 0)
	{
		memset(ftp_reply, 0, sizeof(ftp_reply));
		return -1;
	}
	while (data != '\n')
	{
		if ((len = recv(sockfd, &data, 1, 0)) <= 0)
		{
			memset(ftp_reply, 0, sizeof(ftp_reply));
			return -1;
		}
	}
	return len;
}

/**
* 打开控制连接
*/
int FtpOpenCtrlConn(unsigned int server_ip)
{
	struct sockaddr_in server_addr;
	int ctrl_fd;
	struct timeval timeVal = {20, 0};
	
	#if 1
	printf("Begin FtpOpenCtrlConn\n");
	#endif
	if ((ctrl_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	{
		printf("create control socket\n");
		return SECURE_UPDATE_CONN_ERROR;
	}
	if (setsockopt(ctrl_fd, SOL_SOCKET, SO_REUSEADDR, (char *) &yes, sizeof(yes)) < 0)
	{
		close(ctrl_fd);
		printf("setsockopt ctrl socket\n");
		return SECURE_UPDATE_CONN_ERROR;
	}
	memset(&server_addr, '\0', addr_len);
	server_addr.sin_family = AF_INET;
	server_addr.sin_len = addr_len;
	server_addr.sin_port = htons(21);
	server_addr.sin_addr.s_addr = htonl(server_ip);

	printf("try connect\n");
	if (connectWithTimeout(ctrl_fd, (struct sockaddr *) &server_addr, addr_len, &timeVal) < 0)
	{
		close(ctrl_fd);
		printf("connect to ctrl\n");
		return SECURE_UPDATE_CONN_ERROR;
	}
	/**
	* Reply should be "220"
	*/
	if (FtpRecvReply(ctrl_fd) < 0 || ftp_reply[0] != '2')
	{
		close(ctrl_fd);
		printf("error while open control connection\n");
		return SECURE_UPDATE_CONN_ERROR;
	}
	else
	{
		printf("connected to server %u.%u.%u.%u\n", 
				(unsigned char) (server_ip >> 24),
				(unsigned char) (server_ip >> 16),
				(unsigned char) (server_ip >> 8),
				(unsigned char) (server_ip >> 0)
				);
	}
	return ctrl_fd;
}

/**
* 登录FTP服务器
*/
int FtpLoginServer(int ctrl_fd, const char * user, const char * pass)
{
	printf("FtpLoginServer\n");
	/**
	* Command USER
	*/
	if (FtpCommand(ctrl_fd, ftp_user_cmd, user) < 0)
	{
		printf("USER command error\n");
		return SECURE_UPDATE_CONN_ERROR;
	}
	/**
	* USER reply should be "331"
	*/
	if (FtpRecvReply(ctrl_fd) < 0 || ftp_reply[0] != '3')
	{
		if (ftp_reply[0] == '2')
		{
			printf("%.3s: user %s logging, needn't pass\n", ftp_reply, user);
			return SECURE_UPDATE_OK;
		}
		printf("error recv USER\n");
		return SECURE_UPDATE_CONN_ERROR;
	}
	else
	{
		printf("%.3s: user %s logging\n", ftp_reply, user);
	}
	/**
	* Command PASS
	*/
	if (FtpCommand(ctrl_fd, ftp_pass_cmd, pass) < 0)
	{
		printf("PASS command error\n");
		return SECURE_UPDATE_CONN_ERROR;
	}
	/**
	* PASS reply should be "230"
	*/
	for (;;)
	{
		if (FtpRecvReply(ctrl_fd) < 0)
		{
			printf("error recv PASS\n");
			return SECURE_UPDATE_CONN_ERROR;
		}
		else if (ftp_reply[0] == '2')
		{
			printf("%.3s: user %s logged in\n", ftp_reply, user);
			return SECURE_UPDATE_OK;
		}
		else if (ftp_reply[0] == '3')
		{
			printf("%.3s: user %s\n", ftp_reply, user);
			continue;
		}
		else
		{
			printf("PASS or USER error\n");
			return SECURE_UPDATE_PASSWD_ERROR;
		}
	}
}

/**
* 打开数据连接
*/
int FtpInitDataConn(unsigned int server_ip, unsigned short * ptr_port)
{
	struct sockaddr_in client_addr;
	int data_fd;
	int len = addr_len;

	printf("FtpInitDataConn\n");

	if ((data_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	{
		printf("create data socket\n");
		return SECURE_UPDATE_CONN_ERROR;
	}	
	if (setsockopt(data_fd, SOL_SOCKET, SO_REUSEADDR, (char *) &yes, sizeof(yes)) < 0)
	{
		close(data_fd);
		printf("setsockopt data socket\n");
		return SECURE_UPDATE_CONN_ERROR;
	}
	
	memset(&client_addr, '\0', addr_len);
	client_addr.sin_family = AF_INET;
	client_addr.sin_len = addr_len;
	client_addr.sin_port = 0;
	client_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	
	if (bind(data_fd, (struct sockaddr *) &client_addr, addr_len) < 0)
	{
	    	printf("bind data socket\n");
		close(data_fd);
		return SECURE_UPDATE_CONN_ERROR;
	}
	if (listen(data_fd, 1) < 0)
	{
		printf("listen on data socket\n");
		close(data_fd);
		return SECURE_UPDATE_CONN_ERROR;
	}
	if (getsockname(data_fd, (struct sockaddr *) &client_addr, &len) < 0)
	{
		printf("getsockname\n");
		close(data_fd);
		return SECURE_UPDATE_CONN_ERROR;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?