📄 ic.c.bak
字号:
{
status=0x3;
poke(0x80008800,0x3,2);
goto label1;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label1;
} /*若写IC卡失败,进行相应处理*/
secerase(0x01480000); /*擦除用户信息所在的flash扇区*/
flash_w(0x8000C800,0x01480000,5*u_num); /*更新flash中的用户信息区*/
if (peek(0x8000BFFC,1)==0)
{
memcopy(0x01440000,0x8000C300,2,2); /*将RSA公钥的模长和加密指数读到内存*/
memcopy(0x01440008,0x80008818,64,2); /*将RSA公钥的密文积移到解密位置*/
poke(0x80008804,16,2); /*输入要解密数据的组数*/
inputkey(0x80008804,0x8000E000,0x80008818,0x80008804,1); /*用主密钥解密RSA公钥的积*/
memcopy(0x80008804,0x8000C308,64,2); /*将RSA公钥的积的明文移到指定位置*/
memcopy(0x01440108,0x8000C408,1,2); /*将RSA私钥模长移到内存*/
memcopy(0x0144010C,0x80008818,160,2); /*将RSA私钥的密文部分移到解密位置*/
poke(0x80008804,40,2); /*输入要解密数据的组数*/
inputkey(0x80008804,0x8000E000,0x80008818,0x80008804,1); /*用主密钥解密RSA私钥的密文部分*/
memcopy(0x80008804,0x8000C40C,160,2); /*将RSA私钥的明文移到指定位置*/
memcopy(0x0144038C,0x8000C68C,2,2); /*将SMC公钥的模长和加密指数读到内存*/
memcopy(0x01440394,0x80008818,64,2); /*将SMC公钥的密文积移到解密位置*/
poke(0x80008804,16,2); /*输入要解密数据的组数*/
inputkey(0x80008804,0x8000E000,0x80008818,0x80008804,1); /*用主密钥解密SMC公钥的积*/
memcopy(0x80008804,0x8000C694,64,2); /*将SMC公钥的明文积移到指定位置*/
}
poke(0x8000BFFC,ICID,1); /*身份验证通过,将ICID写入用户状态码*/
memcopy(0x014A0000,0x80008818,1024,2);
poke(0x80008804,256,2);
inputkey(0x80008804,0x8000E000,0x80008818,0x8000D000,1,1);
poke(0x80008804,1,2);
for(i=0;i<4;i++)
{
*(unsigned volatile int *)(0x80008808+4*i)=0xffffff;
}
inputkey(0x80008804,0x8000E000,0x80008808,0x8000EEE0,1,1);
poke(0x80008800,0,2);
status=0;
label1: return status;
}
/*清除密码卡内某个操作员信息*/
int user_delete()
{
extern int peek();
extern void poke(),memcopy(),secerase(),flash_w();
int i,j,status;
unsigned short ICID,u_num;
unsigned int data[5];
unsigned int tmp;
unsigned char temp;
/* tmp=peek(0x8000BFFC,2); //操作员权限
if (tmp!=0)
{
temp=(unsigned char)(tmp>>24);
if(temp!=0)
{
status=0x0a;
poke(0x80008800,0x0a,2);
goto label1;
}
}*/
ICID=peek(0x80008804,1); /*读出要删除的用户ICID*/
u_num=peek(0x8000BFFE,1);
for (i=0;i<u_num;i++)
{
if(ICID==peek(0x8000C800+i*20,1))
break;
}
if(i>=u_num)
{
poke(0x80008800,0x13,2);
status=0x13; /*若没有该用户,则做相应处理*/
goto label1;
}
for(j=0;j<5;j++)
{
data[j]=0xFFFFFFFF;
}
if(u_num>1)
{
memcopy(0x8000C800+(i+1)*20,0x8000C800+i*20,(u_num-1-i)*5,2); /*将被删除用户后的用户信息前移*/
memcopy(data,0x8000C800+(u_num-1)*20,5,2);
}
if(u_num==1)
{
memcopy(data,0x8000C800,5,2);
}
u_num=u_num-1;
poke(0x8000BFFE,u_num,1); /*更新用户数目*/
secerase(0x01480000); /*擦除用户信息所在的flash扇区*/
if(u_num>0)
{
flash_w(0x8000C800,0x01480000,u_num*5); /*更新flash中的用户信息区*/
}
poke(0x80008800,0,2);
status=0;
label1: return status;
}
/*本函数用于读出密钥卡或身份卡头信息内容*/
int IChead_read()
{
extern int r_IC();
extern void poke();
int status;
status=r_IC(0x0,0x80008804,800); /*从IC卡读出头信息*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label1;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label1;
} /*若读IC卡失败,进行相应处理*/
poke(0x80008800,0,2);
status=0;
label1: return status;
}
/*复位密码卡*/
int logout()
{
extern void poke();
int status;
int tmp;
if(peek(0x8000BFFC,1)==0)
{
status=0xc;
poke(0x80008800,0xc,2);
goto label1;
}
poke(0x8000BFFC,0,2);
for(tmp=0;tmp<293;tmp++)
{
poke(0x8000C300+tmp*4,0,2);
}
for(tmp=0;tmp<8;tmp++)
{
poke(0x8000E000+tmp*4,0,2);
}
poke(0x80008800,0,2);
status=0;
label1: return status;
}
/*更改密码卡密码*/
int change_passwd()
{
extern int w_IC(),peek(),inputkey();
extern void poke(),flash_w(),secerase(),memcopy();
int status;
memcopy(0x80008804,0x8000E030,4,2);
status=r_IC(0x1,0x80008804,1); /*从IC卡读出头信息*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label2;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label2;
} /*若读IC卡失败,进行相应处理*/
if (peek(0x80008804,0)==0) /*密钥IC卡*/
{
poke(0x80008804,0x01,2);
inputkey(0x80008804,0x8000E030,0x8000E000,0x80008808,0); /*用PASSWORD密钥加密口令串*/
status=w_IC(0x80008808,0x08,16); /*向IC卡写入指定长度的数据*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label2;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label2;
}
inputkey(0x80008804,0x8000E030,0x8000E020,0x80008808,0); /*用PASSWORD密钥加密口令串*/
status=w_IC(0x80008808,0x7BE,16); /*向IC卡写入指定长度的数据*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label2;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label2;
}
memcopy(0x01440008,0x80008808,64,2);
poke(0x80008804,16,2);
inputkey(0x80008804,0x8000E030,0x80008808,0x80008804,0); /*用PASSWORD密钥加密口令串*/
status=w_IC(0x80008804,0x336,256); /*将加密后的RSA公钥的积写入IC卡*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label2;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label2;
} /*若写IC卡失败,进行相应处理*/
memcopy(0x0144010c,0x80008808,160,2);
poke(0x80008804,40,2);
inputkey(0x80008804,0x8000E030,0x80008808,0x80008804,0); /*用PASSWORD密钥加密口令串*/
status=w_IC(0x80008804,0x438,640); /*将加密后的RSA私钥写入IC卡*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label2;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label2;
} /*若写IC卡失败,进行相应处理*/
memcopy(0x01440394,0x80008808,160,2);
poke(0x80008804,16,2);
inputkey(0x80008804,0x8000E030,0x80008808,0x80008804,0); /*用PASSWORD密钥加密口令串*/
status=w_IC(0x80008804,0x6BE,640); /*将加密后的RSA私钥写入IC卡*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label2;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label2;
} /*若写IC卡失败,进行相应处理*/
}
else
{
poke(0x80008804,0x01,2);
inputkey(0x80008804,0x8000E030,0x8000E000,0x80008808,0); /*用PASSWORD密钥加密口令串*/
status=w_IC(0x80008808,0x08,16); /*向IC卡写入指定长度的数据*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label2;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label2;
}
inputkey(0x80008804,0x8000E030,0x8000E020,0x80008808,0); /*用PASSWORD密钥加密口令串*/
status=w_IC(0x80008808,0x350,16); /*向IC卡写入指定长度的数据*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label2;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label2;
}
status=r_IC(0x320,0x80008808,16); /*向IC卡写入指定长度的数据*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label2;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label2;
}
poke(0x80008804,3,2);
inputkey(0x80008804,0x8000E010,0x80008808,0x80008808,1);
inputkey(0x80008804,0x8000E030,0x80008808,0x80008808,0);
status=w_IC(0x80008808,0x320,16); /*向IC卡写入指定长度的数据*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label2;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label2;
}
}
memcopy(0x8000E030,0x8000E010,4,2);
poke(0x80008800,0,2);
status=0;
label2: return status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -