
#include "encrypt.h"
#include "cpuid.h"

/*
	文件加密管理

	目的：防止从芯片拷贝目标代码下载到其他板卡使用

	使用方法：
	1, 在.c文件中定义  const static u16  的变量
	2. 用 AddToEncrypt 添加到加密管理中
	3. 在合适的时候调用 CheckEncrypt 来检测是否符合加密规则
	4. 如果不符合，做...操作

*/

#define	MAX_ENCRYPT_NUM		32		// 最大支持的加密字个数

int g_encryptNum = 0;
const u16 * g_encryptList[MAX_ENCRYPT_NUM];

// 添加加密字到加密管理（必须是用 const static 定义的）
int AddToEncrypt(const u16 * pEncryptWord)
{
	if (g_encryptNum < MAX_ENCRYPT_NUM)
	{
		g_encryptList[g_encryptNum] = pEncryptWord;
		g_encryptNum++;
	}
	return g_encryptNum;
}

// 检查加密信息，结果不为0，非法
int CheckEncrypt(void)
{
	int rslt = 0;
	int i, j;
	const u16 * pEncrype;

	int idnum = sizeof(CpuId) / sizeof(u16);

	CpuId id;
	GetCpuID(&id);

	for (i = 0, j = 0; i < g_encryptNum; i++, j++)
	{
		pEncrype = g_encryptList[i];
		j %= idnum;
		if (id.wbuff[j] != *pEncrype)
		{
			if (*pEncrype == 0xffff)	// 第一次烧写，将id写入flash
			{
/*
				FLASH_Unlock();  
				FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);  
				FLASH_ProgramWord((u32)pEncrype, id.wbuff[j]);  
				FLASH_Lock();
*/
			}
			else
			{
				rslt = i+1;
				break;
			}
		}
	}
	return rslt;
}


