📄 ic.c
字号:
int status;
IC_addr=peek(0x80008804,2); /*读出IC卡地址*/
IC_len=peek(0x80008808,2); /*读出数据长度*/
status=w_IC(0x8000880C,IC_addr,IC_len); /*向IC卡写入指定长度的数据*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label2;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label2;
} /*若写IC卡失败,进行相应处理*/
status=0;
poke(0x80008800,0,2);
label2: return status;
}
/*本函数用于清除IC卡中的内容*/
int IC_clean()
{
extern int w_IC();
extern void poke();
int i,status;
for (i=0;i<32;i++)
{
*(unsigned volatile int *)(0x80008804+i)=0xFFFFFFFF;
}
for (i=0;i<64;i++)
{
status=w_IC(0x80008804,0+i*32,32);
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label2;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label2;
} /*若写IC卡失败,进行相应处理*/
}
status=0;
poke(0x80008800,0,2);
label2: return status;
}
/*本函数用于制操作员IC卡*/
int operatorIC_create()
{
extern int w_IC(),peek(),inputkey();
extern void poke(),flash_w(),secerase(),memcopy();
int status,i;
unsigned int u_num,addr,new_ICID;
u_num=peek(0x8000BFFE,1); /*确定现在已经存在的用户数目*/
addr=0x8000C800+u_num*20; /*确定新的用户信息应写入的地址*/
new_ICID=peek(0x80008B24,1);
if((u_num+1)>50)
{
status=0x18;
poke(0x80008800,0x18,2);
goto label2;
}
for(i=0;i<u_num;i++)
{
if(peek(0x8000C800+i*20,1)==new_ICID)
{
status=0x19;
poke(0x80008800,0x19,2);
goto label2;
}
}
memcopy(0x80008B24,addr,1,1); /*将ICID移到内存的相应位置*/
memcopy(0x80008B44,addr+4,4,2); /*将认证随机串移到内存相应位置*/
secerase(0x01480000); /*擦除用户信息所在的flash扇区*/
flash_w(0x8000C800,0x01480000,50*(u_num+1)); /*更新flash中的用户信息区*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label2;
}
if (status==0x32)
{
status=0x71;
poke(0x80008800,0x71,2);
goto label2;
} /*若写IC卡失败,进行相应处理*/
memcopy(0x8000880C,0x80008808,4,2); /*将主密钥移到加密位置*/
memcopy(0x80008B24,0x80008818,12,2); /*将用户信息移到加密位置*/
poke(0x80008804,3,2); /*输入加密数据的组数*/
inputkey(0x80008804,0x80008808,0x80008818,0x80008804,0,0);
status=w_IC(0x80008804,0x321,48); /*将加密后的用户信息存入IC卡*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label2;
}
if (status==0x32)
{
status=0x72;
poke(0x80008800,0x72,2);
goto label2;
} /*若写IC卡失败,进行相应处理*/
u_num=u_num+1; /*密码卡增加了一个用户*/
poke(0x8000BFFE,u_num,1); /*更新用户状态字*/
status=0;
poke(0x80008800,0,2);
label2: return status;
}
/*本函数用于验证用户身份*/
int log_in()
{
extern int r_IC(),w_IC(),peek(),inputkey(),erandx();
extern void poke(),memcopy(),flash_w(),secerase();
int i,j,status = 0;
unsigned short ICID,u_num;
status=r_IC(0x09,0x80008808,16); /*将主密钥读到内存中,准备解密*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label1;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label1;
}
status=r_IC(0x321,0x80008818,48); /*将用户信息读到内存中,准备解密*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label1;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label1;
} /*若读IC卡失败,进行相应处理*/
poke(0x80008804,3,2); /*输入要解密数据的组数*/
inputkey(0x80008804,0x80008808,0x80008818,0x80008804,1,0); /*用主密钥解密用户信息*/
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,0xa1,2);
status=0xa;
goto label1;
}
for (j=0;j<4;j++)
{
if(peek(0x80008824+j*4,2)!=peek(0x8000C800+i*20+4+j*4,2))
{
poke(0x80008800,0xa2,2);
status=0xa;
goto label1; /*若操作员非法,则做相应处理*/
}
}
memcopy(0x8000D004,0x80008824,4,2); /*产生16字节的随机数作为新的认证随机串*/
memcopy(0x80008824,0x8000C800+i*20+4,4,2); /*将新的认证随机串移到指定位置*/
memcopy(0x80008824,0x80008838,4,2);
memcopy(0x80008814,0x80008828,4,2);
memcopy(0x80008804,0x80008818,4,2); /*将新的用户信息移到加密位置*/
status=r_IC(0x09,0x80008808,16); /*将主密钥读到内存中,准备解密*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label1;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label1;
} /*若读IC卡失败,进行相应处理*/
poke(0x80008804,3,2); /*输入要加密的数据的组数*/
inputkey(0x80008804,0x80008808,0x80008818,0x80008804,0,0); /*用主密钥加密用户信息*/
status=w_IC(0x80008804,0x321,48); /*新的用户信息密文写入IC卡*/
if (status==0x30)
{
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公钥的密文积移到解密位置*/
status=r_IC(0x09,0x80008808,16); /*将主密钥读到内存中,准备解密*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label1;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label1;
}
poke(0x80008804,8,2); /*输入要解密数据的组数*/
inputkey(0x80008804,0x80008808,0x80008818,0x80008804,1,0); /*用主密钥解密RSA公钥的积*/
memcopy(0x80008804,0x8000C308,32,2); /*将RSA公钥的积的明文移到指定位置*/
memcopy(0x01440108,0x8000C408,1,2); /*将RSA私钥模长移到内存*/
memcopy(0x0144010C,0x80008818,160,2); /*将RSA私钥的密文部分移到解密位置*/
status=r_IC(0x09,0x80008808,16); /*将主密钥读到内存中,准备解密*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label1;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label1;
}
poke(0x80008804,40,2); /*输入要解密数据的组数*/
inputkey(0x80008804,0x80008808,0x80008818,0x80008804,1,0); /*用主密钥解密RSA私钥的密文部分*/
memcopy(0x80008804,0x8000C40C,160,2); /*将RSA私钥的明文移到指定位置*/
memcopy(0x0144038C,0x8000C68C,2,2); /*将SMC公钥的模长和加密指数读到内存*/
memcopy(0x01440394,0x80008818,64,2); /*将SMC公钥的密文积移到解密位置*/
status=r_IC(0x09,0x80008808,16); /*将主密钥读到内存中,准备解密*/
if (status==0x30)
{
status=0x3;
poke(0x80008800,0x3,2);
goto label1;
}
if (status==0x32)
{
status=0x7;
poke(0x80008800,0x7,2);
goto label1;
}
poke(0x80008804,16,2); /*输入要解密数据的组数*/
inputkey(0x80008804,0x80008808,0x80008818,0x80008804,1,0); /*用主密钥解密SMC公钥的积*/
memcopy(0x80008804,0x8000C694,64,2); /*将SMC公钥的明文积移到指定位置*/
}
poke(0x8000BFFC,ICID,1); /*身份验证通过,将ICID写入用户状态码*/
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];
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(0x1,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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -