📄 commtran.c
字号:
#include <string.h>
#include "Hardware.h"
#include "MfRc500.h"
#include "RcComm.h"
#include "PcdShare.h"
#include "PcdUtils.h"
#include "MfReg.h"
#include "cardhead.h"
#include "MfErrNo.h"
#include <intrins.h>
#include "x5045.h"
#include "newcard.h"
char code * code send_option[3]={ (char *)I_send4,
(char *)I_send1,
(char *)I_1send56k
};
char code * code rec_option[3]={ (char *)I_receive4,
(char *)I_receive1,
(char *)I_1Rda56k,
};
uchar xdata ComBuffer[MAXLEN];
uchar xdata TempBuffer[MAXLEN];
uchar xdata MADMessage[32];
uchar xdata Auth_code[48];
uchar xdata CosBuffer[80];
uchar idata GPB;
uchar idata snr[5];
static uchar code version_number[11]="JK105B_V1.0";
uchar xdata buf2[16];
extern uchar Block_Index;
extern uchar idata sw1,sw2;
extern uchar idata rec_bytelen;
ulong idata money2 _at_ 0x30;
ulong xdata money1 ;
uchar len_x;
uchar len_y;
uint F;
uchar idata D;
uchar idata Baudrate=0x00;
uchar xdata slot1_baud=0xff;
/****************************************************************/
extern unsigned char ResetAllCard(void);
extern unsigned char RfSwitchOff(void);
extern unsigned char InitPcd(void);
extern char OpenRC(void);
extern void CloseRC(void);
extern char PcdReadE2(unsigned short startaddr,
unsigned char length,
unsigned char * DataBuffer);
extern void ModifyBaudrate12(void); // pps comand /
/***************************************************************************************************/
void CommTransact(void)
{
uchar Status,flag1=0;
uchar idata key_type,keytest;
uchar idata i,j,key_index,cardsequ,k;
uchar idata len_index,LEN1,LEN2;
uchar idata sector_n,block_n,flag=0;
uchar idata block_ob,Requestmode,piccvaluecmd;
uchar xdata buf[25],key[6],temp[4];
uchar ICProtol;
uint RAM_address;
uchar xdata wdtkey[6];
uint xdata freq;
if(flag)
{
Status=cpucard_send(0x00,(void *)(send_option[0]));
Status=cpucard_rec(&sw1,(void *)(rec_option[cardsequ]));
block_n=ResetAllCard();
block_n=RfSwitchOff();
block_n=InitPcd();
block_n=OpenRC();
CloseRC();
block_n=PcdReadE2(00,10,buf);
}
if((ComBuffer[2]==0x39)||(ComBuffer[2]==0x3b)||(ComBuffer[2]==0x52)
||(ComBuffer[2]==0x54)||(ComBuffer[2]==0x56)
||(ComBuffer[2]==0x60)) //readfile writefile decrement increment
{
Status=CheckMad(§or_n); /*get sector no.*/
if(Status!=MI_OK) return;
//"当ComBuffer[5]==0时,直接使用KEYSET1的密钥认证
//"当ComBuffer[5]!=0时, 使用SAM卡导出密钥认证
if((ComBuffer[2]==0x39)||(ComBuffer[2]==0x60)) //writefile and increment
keytest=0x04; //KEYB
else keytest=0x00; //KEYA
if(ComBuffer[5]!=0x00)
{
Status=Creat_key(keytest,sector_n,ComBuffer[5],key);
flag1=1;
if(Status!=MI_OK) return;
}
if(keytest==0x04)
{
key_type=PICC_AUTHENT1B;
}
else key_type=PICC_AUTHENT1A;
block_n=sector_n<<2;
if(flag1)
{
Status=MF1_authkey(key_type,key,block_n);
}
else Status=MF1_auth(key_type,sector_n,block_n);
if(Status!=MI_OK)
{
SendResponse(0x81,1,buf);
return;
}
}
if((ComBuffer[2]==0x51)||(ComBuffer[2]==0x53)||(ComBuffer[2]==0x55)||ComBuffer[2]==0x59)
{ /*" 格式:3-密钥类型 4-扇区号 */
if(ComBuffer[3]==0x01)
{
keytest=PICC_AUTHENT1B;
}
else keytest=PICC_AUTHENT1A;
sector_n=ComBuffer[4];
block_n=sector_n<<2;
Status=MF1_auth(keytest,sector_n,block_n);
if(Status!=MI_OK)
{
SendResponse(0x81,1,buf);
return;
}
}
switch(ComBuffer[2])
{
case 0x35: /* open reader */
Power_on();
SleepMs(100);
SendResponse(0x01,1,buf);
break;
case 0x36: /* close reader */
Power_off();
SleepMs(10);
SendResponse(0x01,1,buf);
SetBaud(Baud115200);
break;
case 0x37: /* Select ADF */
if(ComBuffer[1]==3)
{
buf[0]=ComBuffer[3];
buf[1]=ComBuffer[4];
}
else
{
buf[0]=0x10;
buf[1]=0x03;
}
Status=SelectADF(buf);
SleepMs(10);
if(Status==MI_OK) SendResponse(0x01,1,buf);
else SendResponse(0x91,1,buf); /*ADF error*/
break;
case 0x31: // opencard
if(ComBuffer[4]==0x00)
{
key_index=0xF0;
}
else
{
if(ComBuffer[3]==0x26)
{
key_index=0;
}
else key_index=1;
}
Status=OpenCard(key_index);
if(Status!=MI_OK) return;
Read_Ram(0x0000,wdtkey,6); //read key from dog's E2ROM
Status=MF1_authkey(PICC_AUTHENT1A,wdtkey,0);
if(Status!=MI_OK)
{
SendResponse(0x81,6,snr); // authentication error
return;
}
for(i=1;i<3;i++) //get mad message
{
Status=MF1_read_key(PICC_AUTHENT1A,i,MADMessage+((i-1)<<4),wdtkey);
if(Status!=MI_OK) break;
}
if(Status==MI_OK)
{
Status=MF1_read_key(PICC_AUTHENT1A,3,buf,wdtkey);
if(Status==MI_OK)
{
GPB=buf[9];
Read_Ram(0x0010,wdtkey,6);
Status=MF1_authkey(PICC_AUTHENT1A,wdtkey,60); //2003.1.15
if(Status==MI_OK)
{
for(i=0;i<3;i++)
{
Status=MF1_read_key(PICC_AUTHENT1A,60+i,Auth_code+(i<<4),wdtkey);
if(Status!=MI_OK) break;
}
}
}
}
if(Status==MI_OK) SendResponse(0x01,6,snr);
else SendResponse(0x80,6,snr);
break;
case 0xF1: //"为浙江作的程序,认证码区的由标识来确定,要求
//"使用loadkey方式将32-47(KEYSET1)密钥下载
//"格式:60 05 f1 (卡片打开方式1字节(all或idle))(多卡标志1字节)(认证码区标识2字节)
// 0 1 2 3 4 5 6
if(ComBuffer[4]==0x00)
{
key_index=0xF0;
}
else
{
if(ComBuffer[3]==0x26)
{
key_index=0;
}
else key_index=1;
}
Status=OpenCard(key_index);
if(Status!=MI_OK) return;
Read_Ram(0x0000,wdtkey,6); //read key from dog's E2ROM 2003.1.15
Status=MF1_authkey(PICC_AUTHENT1A,wdtkey,0); //
if(Status!=MI_OK)
{
SendResponse(0x81,6,snr); // authentication error */
return;
}
for(i=1;i<3;i++) //get mad message*/
{
Status=MF1_read_key(PICC_AUTHENT1A,i,MADMessage+((i-1)<<4),wdtkey);
if(Status!=MI_OK) break;
}
if(Status==MI_OK)
{
Status=MF1_read_key(PICC_AUTHENT1A,3,buf,wdtkey);
if(Status==MI_OK)
{
GPB=buf[9];
//"取认证码区地址
ComBuffer[3]=ComBuffer[5];
ComBuffer[4]=ComBuffer[6];
Status=CheckMad3(§or_n);
if(Status!=MI_OK) return;
Read_Ram(0x0010,wdtkey,6);
Status=MF1_authkey(PICC_AUTHENT1A,wdtkey,60); //2003.1.15
if(Status==MI_OK)
{
block_n=(sector_n<<2);
for(i=0;i<3;i++)
{
Status=MF1_read_key(PICC_AUTHENT1A,block_n+i,Auth_code+(i<<4),wdtkey);
if(Status!=MI_OK) break;
}
}
}
}
if(Status==MI_OK) SendResponse(0x01,6,snr);
else SendResponse(0x80,6,snr);
break;
case 0x38: /* close card */
Status=Mf500PiccHalt();
if(Status==MI_OK)
{
SendResponse(0x01,1,buf);
}
else
{
SendResponse(0x80,1,buf);
}
break;
case 0xc1: /* change baudrate */
SendResponse(0x01,1,buf);
SetBaud(ComBuffer[3]);
break;
case 0x32: /* read block */
sector_n=ComBuffer[4]>>2; /* sector no. */
block_n=ComBuffer[4]; /* block no. */
if(ComBuffer[3]==0x01)
{
key_type=PICC_AUTHENT1B;
}
else key_type=PICC_AUTHENT1A;
Status=MF1_auth(key_type,sector_n,block_n);
if(Status==MI_OPEN_ERROR)
{
SendResponse(0x00,1,buf);
return;
}
if(Status==MI_AUTH_ERROR)
{
SendResponse(0x81,1,buf);
return;
}
Status=MF1_read(key_type,block_n,buf);
if(Status==MI_OK)
{
SendResponse(0x01,17,buf);
}
else
{
SendResponse(0x80,1,buf);
}
break;
case 0x33: // write block
sector_n=ComBuffer[4]>>2; // sector no.
block_n=ComBuffer[4]; // block no.
if(ComBuffer[3]==0x01)
{
key_type=PICC_AUTHENT1B;
}
else key_type=PICC_AUTHENT1A;
Status=MF1_auth(key_type,sector_n,block_n);
if(Status==MI_OPEN_ERROR)
{
SendResponse(0x00,1,buf);
return;
}
if(Status==MI_AUTH_ERROR)
{
SendResponse(0x81,1,buf);
return;
}
Status=MF1_write(key_type,block_n,ComBuffer+5);
if(Status==MI_OK)
{
SendResponse(0x01,1,buf);
}
else
{
SendResponse(0x80,1,buf);
}
break;
case 0x41: /*open more cards*/
for(i=0;i<10;i++)
{
Status=Mf500PiccRequest(PICC_REQIDL,buf);
if(Status==MI_OK) break;
}
if(Status!=MI_OK)
{
SendResponse(0x00,1,buf);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -