测试Rockey 4 Smart加密锁的C语言代码

// win32Console_dog_test.cpp : Defines the entry point for the console application.
///
//
//测试Rockey 4 Smart加密锁的C语言代码
//
///
 
#include "stdafx.h"
#include <conio.h>
#include "time.h"
#include "Ry4S.h"
//--------------------------------------------------------
//define function style
void ShowERR(WORD retcode);
void HexBufferToString(char* str,BYTE* buf,int len);
char* word2cp(WORD value);                   //WORD转字符串函数
char* UnionStr(const char* A,const char* B); //合并字符串函数
char* strcat_lc(const char* A,const char* B);
char* a2u(const char* A,const char* B);
char* a3u(const char* A,const char* B,const char* C);
char* GetERR_Cn(WORD retcode);
//--------------------------------------------------------
//主程序入口函数
int main(int argc, char* argv[])
{
	printf("Hello World!\n");
	//定义变量
	bool is_2=false; //一级或二级密码开关
	is_2=true;
	//
    WORD handle, p1, p2, p3, p4, retcode;
	DWORD lp1, lp2;
	BYTE buffer[1024];//1024
	//设置密码  (试用版公开默认密码)
	//设置一级密码p1,p2
	p1 = 0xc44c;	// Rockey4Smart Demo Password1
	p2 = 0xc8f8;	// Rockey4Smart Demo Password2
	//设置二级密码p3,p4
	p3 = 0;			// Program needn't Password3, Set to 0
	p4 = 0;			// Program needn't Password4, Set to 0
	/*
	//二级试用版公开默认密码*/
	if(is_2==true)
	{
		p3 = 0x0799;
		p4 = 0xc43b;
	}
	//初始化
	memset(buffer,0,1024);
	//查找加密锁方法
	//----------------------------
	printf("查找锁中...");
    retcode = Rockey(RY_FIND, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
	if (retcode)
	{
		printf("查找锁出错: ");
		ShowERR(retcode);
		return -1;
	}
	char* hid=new char[sizeof(lp1)];
	sprintf(hid,"%08X",lp1);
	printf("找到一个加密锁,hid=%s ",hid);
	//printf("Find Rock: %08X\n", lp1);
	printf("查找锁完成!\n");
    //----------------------------
	//找到加密锁并打开	
	printf("打开锁中...");
	retcode = Rockey(RY_OPEN, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
	if (retcode)	// Error	
	{	
		printf("打开锁出错,Error Code: %d\n", retcode);		
		return -1;	
	}
	printf("打开锁完成!\n");
	//----------------------------
	//[用户存储区]写入数据
	printf("[用户存储区]写入数据中...");
	//0~499    低地址区(一,二级密码均可读写)
	//500~2000 高地址区(一级只读,二级可读写)
	if(is_2==false)
	{
		p1=0;     //pos
		p2=500;   //length 500
	}
	else
	{
        p1=0;     //pos
		p2=900;   //length 500 / 900 (=1024?)
	}
	strcpy((char*)buffer,"Hello world! Rockey4 Smart!");
	//for(int i=p1;i<p2;i++){buffer[i]=i;}
	retcode=Rockey(RY_WRITE,&handle,&lp1,&lp2,&p1,&p2,&p3,&p4,buffer);
	if(retcode)
	{
        printf("写入数据出错\n ErrorCode:%d\n,ErrorInfo:%s\n",retcode,GetERR_Cn(retcode));
		return -1;
	}
	printf("Write data:%s\n",buffer);
	printf("[用户存储区]写入数据完成!\n");
    //----------------------------
	//[用户存储区]读取数据
	printf("[用户存储区]读取数据中...");
    p1 = 0;	    // Pos	
	p2 = 500;	// Length	
	buffer[14] = 0;
	retcode = Rockey(RY_READ, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);	
	if (retcode)	// Error
	{	
		printf("读取用户存储区出错\n Error Code: %d\n", retcode);
	    return -1;
	}        
	// ==============================================================	
	printf("buffer:%s\n", buffer);
	printf("[用户存储区]读取数据完成!\n");
	//----------------------------
	//产生随机数 OK
	for(int i=0;i<10;i++)
	{
		retcode = Rockey(RY_RANDOM, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
		if (retcode)	// Error
		{	printf("产生随机数出错了\n,Error Code: %d\n", retcode);
			return -1;
		}        
		printf("生成的随机数为Random 16Hex:%04X,10Dec:%d\n", p1,p1);
		//sprintf(buffer, "%04X", p1);
	}
	//----------------------------
    //产生种子码  OK
	lp2=0x12345678;
	retcode=Rockey(RY_SEED,&handle,&lp1,&lp2,&p1,&p2,&p3,&p4,buffer);
	if(retcode) //out error
	{
        printf("产生种子码出错\n,Error code:%d\n,Error info:%s\n",retcode,GetERR_Cn(retcode));
		return -1;
	}
	printf("种子码为种码为%X\n",lp2);
	printf("子码为Seed:%04X %04X %04X %04X\n",p1,p2,p3,p4);
	if (p1==0xD03A && p2==0x94D6 && p3==0x96A9 && p4==0x7F54)
	{   //种子码正确 种为0x12345678,子码为0xD03A  0x94D6 0x96A9	0x7F54	
		printf("种子码正确,Hello World!\n");
	}
	else
	{
		printf("种子码出错了,Hello error!\n");
		return -1;
	}	
	//----------------------------
	//写入用户ID  RY_WRITE_USERID
	if(is_2==true)
	{
		lp1 = 0x88888888;
		retcode = Rockey(RY_WRITE_USERID, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
		if (retcode) // Error
		{	
			printf("写入用户ID,Error Code: %d\n", retcode);	
			return -1;
		}	
		printf("Write User ID: %08X\n", lp1);
	}
	//----------------------------
	//读取用户ID  RY_READ_USERID
	lp1 = 0;
	retcode = Rockey(RY_READ_USERID, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
	if (retcode) // Error
	{		
		printf("Error Code: %d\n", retcode);	
		return -1;	
	}
	printf("读取用户ID UID=%X\n",lp1);
	if (lp1==0x88888888)
	{
		printf("Hello world! UID=%X\n",lp1);
	}
	else      
	{
		printf("Hello DEMO!\n");
		return -1;
	}
	//----------------------------
	//设置模块字RY_SET_MODULE
	if(is_2==true)
	{
		p1 = 0;	
		p2 = 3;
		p3 = 0;
		retcode = Rockey(RY_SET_MODULE, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
		if (retcode) // Error
		{		
			printf("Error Code: %d\n", retcode);	
			return -1;	
		}
		printf("Set Moudle 0: Pass = %04X Decrease no allow\n", p2);
		//Set Moudle 0: Pass = 0x0003 Decrease no allow 不允许减少
	}
	//----------------------------
	//检查模块状态 RY_CHECK_MODULE
	p1 = 0;	
	retcode = Rockey(RY_CHECK_MODULE, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
	if (retcode) // Error
	{		
		printf("检查模块状态,Error Code: %d\n", retcode);	
		return -1;	
	}
    printf("check Moudle 0: Pass = %04X Decrease no allow\n", p2);
	printf("检查模块状态,lp1=%04X,lp2=%04X,p1=%04X,p2=%04X,p3=%04X,p4=%04X\n", lp1,lp2,p1,p2,p3,p4);
	//pass =0x0001
	if (p2) printf("检查模块状态,Hello world!\n");		
	else return -1;		 
	if (p2!=1)
	{    
		printf("Update Please!\n");
		return -1;
	} 
	if(is_2==true)//if(p3==1)	
	{     
		/*
		p1=0;    //递减模块单元 RY_DECREASE
		retcode = Rockey(RY_DECREASE, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);   
		if(retcode)         
		{         
		     printf("递减模块单元,Error Code: %d,Error info:%s\n", retcode,GetERR_Cn(retcode));
		     return -1;	
		}
		printf("递减模块单元,lp1=%04X,lp2=%04X,p1=%04X,p2=%04X,p3=%04X,p4=%04X\n", lp1,lp2,p1,p2,p3,p4);
	    */
	} 
	//----------------------------
	//加密解密一个例子
	char str[20]="bfgis_system";
	DWORD mykey=12345678;
	int slen = strlen(str);
	int n;
    // Encrypt my data  加密我的数据
	lp2 = mykey;  //产生种子码
	retcode = Rockey(RY_SEED, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
	if (retcode)	// Error
	{
		printf("Error Code: %d\n", retcode);
		return -1;
	}
	for (n=0;n<slen;n++)
	{
		str[n] = str[n] + (char)p1 + (char)p2 + (char)p3 + (char)p4;
	}
	printf("加密我的数据,Encrypted data is %s\n", str);
 
	// Decrypt my data 解密我的数据
	lp2 = mykey;  //产生种子码
	retcode = Rockey(RY_SEED, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
	if (retcode)	// Error
	{
		printf("Error Code: %d\n", retcode);
		return -1;
	}
 
	for (n=0;n<slen;n++)
	{
		str[n] = str[n] - (char)p1 - (char)p2 - (char)p3 - (char)p4;
	}
	printf("解密我的数据,Decrypted data is %s\n", str);
	//----------------------------
	//日期操作
	char *buf=new char[1024];
	SYSTEMTIME st;
	GetLocalTime(&st);
	printf("Date:%04d%02d%02d\n",st.wYear,st.wMonth,st.wDay);  //获取年月日	
	sprintf(buf,"%04d%02d%02d",st.wYear,st.wMonth,st.wDay);
	//
	lp1 = 0x20121101;  //写入UID
	retcode = Rockey(RY_WRITE_USERID, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
	if (retcode)
	{
		ShowERR(retcode);
		return -1;
	}
	printf("Write User ID: %08X\n", lp1);
 
	lp1 = 0;          //读取UID
	retcode = Rockey(RY_READ_USERID, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
	if (retcode)
	{
		ShowERR(retcode);
		return -1;
	}
	printf("Read User ID: %08X\n", lp1);
	//   	
	//if(strcmp(t_buf,t_buffer)>=0) 
	if(1)
	{
	   printf("日期操作相等ok!\n");
	}
	else
	{
       printf("期操作不等 exit!\n");
	}
	
	//----------------------------
	//关闭加密锁  OK
	printf("关闭锁中...");
	retcode = Rockey(RY_CLOSE, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
	if (retcode)
	{
		printf("关闭锁出错,Error Code: %d\n", retcode);
		return -1;
	}
	printf("关闭锁完成!\n");
    //----------------------------
	printf("暂停");
	int temp=getchar();
	return 0;
}
 
//显示错误信息函数
void ShowERR(WORD retcode)
{
	if (retcode == 0) return;
	printf("Error Code: %d,Error Info:%s\n", retcode,GetERR_Cn(retcode));
}
//16进制转字符串函数
void HexBufferToString(char* str,BYTE* buf,int len)
{
	int k;
	sprintf(str,"0x");
	for( k=0;k<len;k++)
	{
		char strTemp[20];
		sprintf(strTemp,"%02x",buf[k]);
		strcat(str,strTemp);
	}
}
 
//WORD转字符串函数 
char* word2cp(WORD value)
{
    char* s=new char[sizeof(value)];
	sprintf(s,"%d",value); 
    char* ret_s=new char[strlen(s)];
	strcpy(ret_s,s);	
	return ret_s;
}
//实现 合并字符串函数
char* UnionStr(const char* A,const char* B)
{
    int len=0;	
	len=strlen(A)+strlen(B)+1;
	char* result=new char[len];
	memset(result,0,len);	
	sprintf(result, "%s%s",A,B);	
	char* r=new char[strlen(result)+1];
	strcpy(r,result);
	//	
	return r;
}
//合并字符串函数
char* strcat_lc(const char* A,const char* B)
{
    return UnionStr(A,B);
}
//合并2参数
char* a2u(const char* A,const char* B)
{
    return strcat_lc(A,B);
}
//合并3参数
char* a3u(const char* A,const char* B,const char* C)
{
	char* t=strcat_lc(A,B);
	t=strcat_lc(t,C);
    return t;
}
//获取错误信息的中文信息函数
char* GetERR_Cn(WORD retcode)
{
    char* r=NULL;
	char* rc=word2cp(retcode);
     // 错误码
	switch(retcode)
	{
		case ERR_SUCCESS:		          //0  
			r="没有错误";
			break;
		case ERR_NO_ROCKEY:               //3
			r="没有ROCKEY";
			break;
		case ERR_INVALID_PASSWORD:        //4  
			r="有ROCKEY锁,但基本密码错";
			break;
		case ERR_INVALID_PASSWORD_OR_ID:  //5  
			r="错误的密码或硬件 ID";
			break;
		case ERR_SETID:                   //6
			r="设置硬件 ID 错";
			break;
		case ERR_INVALID_ADDR_OR_SIZE:    //7
			r="读写地址或长度有误";
			break;
		case ERR_UNKNOWN_COMMAND:         //8
			r="没有此命令";
			break;
		case ERR_NOTBELEVEL3:                 //9  
			r="内部错误";
			break;
		case ERR_READ:                        //10 
			r="读数据错";
			break;
		case ERR_WRITE:                       //11 
			r="写数据错";
			break;
		case ERR_RANDOM:                      //12 
			r="随机数错";
			break;
		case ERR_SEED:                        //13 
			r="种子码错";
			break;
		case ERR_CALCULATE:                   //14 
			r="计算错";
			break;
		case ERR_NO_OPEN:                     //15 
			r="在操作前没有打开锁";
			break;
		case ERR_OPEN_OVERFLOW:               //16 
			r="打开的锁太多(>16)";
			break;
		case ERR_NOMORE:                      //17 
			r="找不到更多的锁";
			break;
		case ERR_NEED_FIND:                   //18 
			r="没有 Find 直接用了 FindNext";
			break;
		case ERR_DECREASE:                    //19 
			r="递减错";
			break;
		case ERR_AR_BADCOMMAND:               //20 
			r="算法指令错";
			break;
		case ERR_AR_UNKNOWN_OPCODE:           //21 
			r="算法运算符错";
			break;
		case ERR_AR_WRONGBEGIN:               //22 
			r="算法第一条指令含有常数";
			break;			
		case ERR_AR_WRONG_END:                //23 
			r="算法最后一条指令含有常数";
			break;
		case ERR_AR_VALUEOVERFLOW:            //24 
			r="算法中常数值 > 63";
			break;
		case ERR_TOOMUCHTHREAD:               //25 
			r="同一个进程中打开锁的线程数 > 100";
			break;
		case ERR_INVALID_RY4S:                //30 
			r="试图对非Rockey4Smart的锁进行操作";
			break;
		case ERR_INVALID_PARAMETER:           //31 
			r="不合法的参数";
			break;
		case ERR_INVALID_TIMEVALUE:           //32 
			r="不合法的时间值";
			break;
		default:
			r=rc;
			break;	
	}
	return r;
}
//
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lst0426

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值