📄 sam.c
字号:
#include "Hardware.h"
#include "MfErrNo.h"
#include "MfRc500.h"
#include <string.h>
#include "MFREG.h"
#include "PCDUTILS.h"
/***********************************************************************/
extern void W_DOG(void);
extern void SendResponse(uchar status,uchar len,uchar *datapr);
extern uchar I_receive1(uchar *ch);
extern void I_send1(uchar I_data);
extern uchar idata snr[5];
extern uchar xdata ComBuffer[MAXLEN];
extern uchar xdata Auth_code[48];
uchar idata sw1,sw2;
uchar idata rec_bytelen;
void I_send(uchar I_data)
{
I_send1(I_data);
}
char I_receive()
{
char ch;
I_receive1(&ch);
return ch;
}
void Power_on()
{
uint idata i,j;
RST1=0;
IO1=1;
for(i=0;i<200;i++)
{
W_DOG();
for(j=0;j<30;j++)
{
;
}
}
RST1=1;
SleepMs(100);
//SetBitMask(RegTxControl,0x03);
}
void Power_off()
{
//PON=1;
//mifs_close_rf(); /*2002007.17*/
//ClearBitMask(RegTxControl,0x03);
SleepMs(50);
}
void Reset1()
{
uint i,j;
IO1=1;
RST1=0;
for(i=0;i<400;i++)
{
W_DOG();
for(j=0;j<30;j++)
{
;
}
}
RST1=1;
}
/***************************************************/
/* SelectADF
/***************************************************/
uchar SelectADF(uchar *dir)
{
uchar temp_buf[2],i,j;
W_DOG();
I_send(0x00);
I_send(0xa4);
I_send(0x00);
I_send(0x00);
I_send(0x02);
sw1=I_receive();
for(i=0;i<60;i++)
{
;
}
I_send(dir[0]);
I_send(dir[1]);
sw1=I_receive();
sw2=I_receive();
if(sw1!=0x61)
{
if((sw1==0x90)&&(sw2==0x00)) return MI_OK;
else
{
return SAM_ADF_ERROR;
}
}
for(i=0;i<60;i++)
{
;
}
j=sw2+2;
I_send(0x00);
I_send(0xc0);
I_send(0x00);
I_send(0x00);
I_send(sw2);
sw1=I_receive();
for(i=0;i<j;i++)
{
temp_buf[0]=I_receive();
}
return MI_OK;
}
/*
卡片的认证码区格式:
0-1:城市代码 2-3:发行流水号低2字节
4-43:10个认证码
44-47:认证码区的校验码
key_index分成2个部分,低4位为DES加密密钥标识(0-15,当为0时使用认证密钥计算扇区密钥)
高4位为认证密钥标识(1-10)
key_id1为认证密钥标识,
key_id2为加密密钥标识。
*/
uchar Creat_key(uchar keymode,uchar sector_nr,uchar key_index,uchar* new_key )
{
uchar idata buf[13],i;
uchar key_no,key_id1,key_id2;
W_DOG();
key_no=(sector_nr<<1);
if(keymode!=0x00) //11.20 0x00-->0x60
{
key_no+=1;
keymode=PICC_AUTHENT1B;
}
else keymode=PICC_AUTHENT1A; //11.20
key_id1=(key_index&0xF0)>>4;
key_id2=(key_index&0x0F);
i=key_id1<<2;
memcpy(buf,Auth_code,2);
memcpy(buf+2,snr,4);
memcpy(buf+6,Auth_code+2,2);
memcpy(buf+8,Auth_code+i,4);
buf[12]=key_no;
I_send(0x80);
I_send(0xfc);
I_send(key_id2);
I_send(key_id1);
I_send(0x0d);
sw1=I_receive();
for(i=0;i<60;i++)
{
;
}
for(i=0;i<13;i++)
{
I_send(buf[i]);
}
sw1=I_receive();
sw2=I_receive();
if(sw1!=0x61)
{
SendResponse(0x89,1,buf);
return SAM_CYPRT_ERROR;
}
for(i=0;i<60;i++)
{
;
}
I_send(0x00);
I_send(0xc0);
I_send(0x00);
I_send(0x00);
I_send(6);
//Receive INS
sw1=I_receive();
buf[0]=I_receive();
buf[1]=I_receive();
buf[2]=I_receive();
buf[3]=I_receive();
buf[4]=I_receive();
buf[5]=I_receive();
buf[6]=I_receive();
buf[7]=I_receive();
memcpy(new_key,buf,6);
return MI_OK;
}
uchar Creat_key2(uchar keymode,uchar sector_nr,uchar key_index,uchar* new_key)
{
uchar xdata buf[13],i;
uchar key_no,key_id1,key_id2;
W_DOG();
key_no=(sector_nr<<1);
//keymode"分成两部分:前4位为认证码标识,后4位为KEYA/KEYB标识"
i=(keymode&0xf0)>>2; //"取认证码标识"
if((keymode&0x0f)!=0)
{
key_no+=1; //KEYB
keymode=PICC_AUTHENT1B;
}
else keymode=PICC_AUTHENT1A;
key_id1=(key_index&0xF0)>>4;
key_id2=(key_index&0x0F);
memcpy(buf,Auth_code,2);
memcpy(buf+2,snr,4);
memcpy(buf+6,Auth_code+2,2);
memcpy(buf+8,Auth_code+i,4);
buf[12]=key_no;
I_send(0x80);
I_send(0xfc);
I_send(key_id2);
I_send(key_id1);
I_send(0x0d);
sw1=I_receive();
for(i=0;i<60;i++)
{
;
}
for(i=0;i<13;i++)
{
I_send(buf[i]);
}
sw1=I_receive();
sw2=I_receive();
if(sw1!=0x61)
{
SendResponse(0x89,1,buf);
return SAM_CYPRT_ERROR;
}
for(i=0;i<60;i++)
{
;
}
I_send(0x00);
I_send(0xc0);
I_send(0x00);
I_send(0x00);
I_send(6);
//Receive INS
sw1=I_receive();
buf[0]=I_receive();
buf[1]=I_receive();
buf[2]=I_receive();
buf[3]=I_receive();
buf[4]=I_receive();
buf[5]=I_receive();
buf[6]=I_receive();
buf[7]=I_receive();
memcpy(new_key,buf,6);
return MI_OK;
}
uchar picc_b_rats (uchar *ats_part)
{
uchar status;
uchar snd_buf[2];
W_DOG();
snd_buf[0] = cmdRATS;
snd_buf[1] = 0x00;
status=Mf500PiccExchangeBlock(snd_buf ,4 ,ats_part , &rec_bytelen,1, 4);
return status ;
}
uchar deselect()
{
uchar status=0;
uchar idata buf[14];
W_DOG();
buf[0]=0xc2;
status=Mf500PiccExchangeBlock(buf,3,buf, &rec_bytelen, 1,5);
return status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -