📄 card.c
字号:
#include <string.h>
#include "Hardware.h"
#include <absacc.h>
#include "RcComm.h"
#include "PcdShare.h"
#include "PcdUtils.h"
#include "MfReg.h"
#include "MfRc500.h"
#include "MfErrNo.h"
#include <intrins.h>
extern void W_DOG(void);
extern void SendMsError(void);
extern void SendResponse(uchar status,uchar len,uchar *datapr);
extern uchar picc_b_rats (uchar *ats_part);
extern uchar xdata Auth_code[48];
extern uchar xdata MADMessage[32];
extern uchar xdata ComBuffer[MAXLEN];
extern uchar idata GPB;
extern uchar idata snr[5];
uchar Block_Index;
uchar Open_next(void);
/********************************************************************
* Function: OpenCard *
* *
* input: *
* output: snr *
********************************************************************/
uchar OpenCard(uchar ins_type)
{
uchar Status,buf[4],i0,ins_mark;
W_DOG();
if(ins_type==1)
{
ins_mark=PICC_REQALL;
}
else ins_mark=PICC_REQIDL;
for(i0=0;i0<6;i0++)
{
Status=Mf500PiccRequest(ins_mark,buf); // ins_mark
if(Status==MI_OK) break;
}
if(Status!=MI_OK)
{
SendResponse(0x00,1,buf); /* no card */
return Status;
}
Status=Mf500PiccAnticoll (0,snr);
if(Status==MI_OK)
{
Status=Mf500PiccSelect(snr,buf);
if(Status==MI_OK)
{
snr[4]=buf[0];
if(snr[4]==0x20) //mifare pro
{
Status=picc_b_rats (buf); //comand request ATS 2002.11.26
if(Status!=MI_OK)
{
SendResponse(0x80,1,buf);
return Status;
}
Block_Index=0;
SendResponse(0x01,6,snr);
return MIF_PRO;
}
if(ins_type==0xF0) return MI_OK;
Status=Mf500PiccHalt();
for(i0=0;i0<6;i0++)
{
Status=Mf500PiccRequest(PICC_REQIDL,buf);
if(Status==MI_OK)
{
Status=Mf500PiccAnticoll (0,buf);
if(Status==MI_OK)
{
if(memcmp(snr,buf,4)!=0) break; /*if snr(4byte) is different from
buf(4byte) break*/
Status=Mf500PiccSelect(buf,buf);
Status=Mf500PiccHalt();
Status=MI_SINGLE_CARD;
}
}
}
if(Status==MI_OK)
{
SendResponse(0x02,1,buf); /* any card */
return MI_ANY_CARD;
}
else
{
Status=Open_next();
if(Status!=MI_OK) SendResponse(0x00,1,buf);
return Status;
}
}
}
SendResponse(0x80,1,buf);
return Status;
}
/********************************************************************
* Function: Open_next
* *
* input: *
* output: status *
********************************************************************/
uchar Open_next(void)
{
uchar Status,buf[4],i5;
W_DOG();
Status=Mf500PiccHalt();
for(i5=0;i5<6;i5++)
{
Status=Mf500PiccRequest(PICC_REQALL,buf);
if(Status==MI_OK) break;
}
if(Status==MI_OK)
{
Status=Mf500PiccSelect(snr,buf);
if(Status==MI_OK) return MI_OK;
}
return MI_OPEN_ERROR;
}
uchar MF1_auth(uchar keytype_set,uchar sector_no,uchar block_no)
{
uchar Status;
W_DOG();
block_no=sector_no<<2;
Status=Mf500PiccAuth(keytype_set,sector_no,block_no);//key in RAM to auth
if(Status==MI_OK) return MI_OK;
Status=Open_next();
if(Status!=MI_OK)
{
return MI_OPEN_ERROR;
}
Status=Mf500PiccAuth(keytype_set,sector_no,block_no);
if(Status!=MI_OK) return MI_AUTH_ERROR;
return MI_OK;
}
uchar MF1_authkey(char key_type,char *key,char block_n)
{
uchar idata Status,buf4[12];
W_DOG();
Status=Mf500HostCodeKey(key,buf4);
if(Status!=MI_OK)
{
SendResponse(0x81,1,buf4);
return MI_HOSTCODE_ERROR;
}
Status=Mf500PiccAuthKey(key_type,snr,buf4,block_n);
if(Status==MI_OK) return MI_OK;
Status=Open_next();
if(Status!=MI_OK)
{
return MI_OPEN_ERROR;
}
Status=Mf500PiccAuthKey(key_type,snr,buf4,block_n);
if(Status!=MI_OK) return MI_AUTH_ERROR;
return MI_OK;
}
uchar MF1_read_key(uchar keytype_set,uchar block_n,uchar *databuf,char *key)
{
uchar Status,sector_n,i2;
W_DOG();
sector_n=(block_n>>2);
Status=Mf500PiccRead(block_n,databuf);
if(Status!=MI_OK)
{
for(i2=0;i2<3;i2++)
{
Status=Open_next();
if(Status!=MI_OK)
{
Status=MI_OPEN_ERROR;
continue;
}
Status=MF1_authkey(keytype_set,key,block_n);
if(Status!=MI_OK)
{
Status=MI_AUTH_ERROR;
continue;
}
Status=Mf500PiccRead(block_n,databuf);
if(Status==MI_OK) break;
}
}
return Status;
}
uchar MF1_write_key(uchar keytype_set,uchar block_n,uchar *databuf,char *key)
{
uchar Status,sector_n,i3;
W_DOG();
sector_n=(block_n>>2);
Status=Mf500PiccWrite(block_n,databuf);
if(Status!=MI_OK)
{
for(i3=0;i3<3;i3++)
{
Status=Open_next();
if(Status!=MI_OK)
{
Status=MI_OPEN_ERROR;
continue;
}
Status=MF1_authkey(keytype_set,key,block_n);
if(Status!=MI_OK)
{
Status=MI_AUTH_ERROR;
continue;
}
Status=Mf500PiccWrite(block_n,databuf);
if(Status==MI_OK) break;
}
}
return Status;
}
uchar MF1_read(uchar keytype_set,uchar block_n,uchar *databuf)
{
uchar Status,sector_n,i2;
W_DOG();
sector_n=(block_n>>2);
Status=Mf500PiccRead(block_n,databuf);
if(Status!=MI_OK)
{
for(i2=0;i2<3;i2++)
{
Status=Open_next();
if(Status!=MI_OK)
{
Status=MI_OPEN_ERROR;
continue;
}
Status=Mf500PiccAuth(keytype_set,sector_n,block_n);
if(Status!=MI_OK)
{
Status=MI_AUTH_ERROR;
continue;
}
Status=Mf500PiccRead(block_n,databuf);
if(Status==MI_OK) break;
}
}
return Status;
}
uchar MF1_write(uchar keytype_set,uchar block_n,uchar *databuf)
{
uchar Status,sector_n,i3;
W_DOG();
sector_n=(block_n>>2);
Status=Mf500PiccWrite(block_n,databuf);
if(Status!=MI_OK)
{
for(i3=0;i3<3;i3++)
{
Status=Open_next();
if(Status!=MI_OK)
{
Status=MI_OPEN_ERROR;
continue;
}
Status=Mf500PiccAuth(keytype_set,sector_n,block_n);
if(Status!=MI_OK)
{
Status=MI_AUTH_ERROR;
continue;
}
Status=Mf500PiccWrite(block_n,databuf);
if(Status==MI_OK) break;
}
}
return Status;
}
uchar CheckMad(uchar *sec_no)
{
uchar i,buf[2];
W_DOG();
if(GPB==0x69)
{ /* non-personalized card */
SendResponse(0x84,1,buf);
return MI_GPB_ERROR;
}
if((GPB&&0x01)==0x00)
{ /* not MAD */
SendResponse(0x83,1,buf);
return MI_NO_MAD;
}
for(i=2;i<32;i=i+2)
{
if(memcmp(ComBuffer+3,MADMessage+i,2)==0)
break;
}
if(i<32)
{
*sec_no=i>>1;
return MI_OK;
}
SendResponse(0x85,1,buf);
return MI_MAD_ERROR;
}
//"检测同一文件名的多个扇区
uchar CheckMad2(uchar *s_array)
{
uchar i,buf[2];
uchar j;
W_DOG();
if(GPB==0x69)
{ // non-personalized card
SendResponse(0x84,1,buf);
return MI_GPB_ERROR;
}
if((GPB&&0x01)==0x00)
{ // not MAD
SendResponse(0x83,1,buf);
return MI_NO_MAD;
}
j=0;
for(i=2;i<32;i=i+2)
{
if(memcmp(ComBuffer+3,MADMessage+i,2)==0)
{
j++;
s_array[j]=(i>>1);
}
}
if(j>0)
{
s_array[0]=j;
return MI_OK;
}
SendResponse(0x85,1,buf);
return MI_MAD_ERROR;
}
//"使用于对认证码区的定位
uchar CheckMad3(uchar *sec_no)
{
uchar i;
W_DOG();
if(GPB==0x69)
{ // non-personalized card
SendResponse(0x84,6,snr);
return MI_GPB_ERROR;
}
if((GPB&&0x01)==0x00)
{ // not MAD
SendResponse(0x83,6,snr);
return MI_NO_MAD;
}
for(i=2;i<32;i=i+2)
{
if(memcmp(ComBuffer+3,MADMessage+i,2)==0)
break;
}
if(i<32)
{
*sec_no=i>>1;
return MI_OK;
}
SendResponse(0x85,6,snr);
return MI_MAD_ERROR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -