📄 commtran.c
字号:
Status=Mf500PiccAnticoll (0,snr);
if(Status==MI_OK)
{
Status=Mf500PiccSelect(snr,buf);
if(Status==MI_OK)
{
SendResponse(0x01,5,snr);
return;
}
}
SendResponse(0x80,1,buf);
break;
case 0x42: /*read m_block*/
sector_n=ComBuffer[4]>>2; /* sector no. */
block_n=ComBuffer[4]; /* block no. */
if(ComBuffer[3]==0x01)
{
key_type=PICC_AUTHENT1B;
}
key_type=PICC_AUTHENT1A;
Status=Mf500PiccAuth(key_type,sector_n,block_n);
if(Status==MI_OK)
{
Status=Mf500PiccRead(block_n,buf);
if(Status==MI_OK)
{
SendResponse(0x01,17,buf);
}
else
{
SendResponse(0x80,1,buf);
}
}
else
{
SendResponse(0x81,1,buf);
}
break;
case 0x43: /*write m_block*/
sector_n=ComBuffer[4]>>2; /* sector no. */
block_n=ComBuffer[4]; /* block no. */
if(ComBuffer[3]==0x01)
{
key_type=PICC_AUTHENT1B;
}
key_type=PICC_AUTHENT1A;
Status=Mf500PiccAuth(key_type,sector_n,block_n);
if(Status==MI_OK)
{
Status=Mf500PiccWrite(block_n,ComBuffer+5);
if(Status==MI_OK)
{
SendResponse(0x01,1,buf);
}
else
{
SendResponse(0x80,1,buf);
}
}
else
{
SendResponse(0x81,1,buf);
}
break;
case 0x39: /* write file */
//"格式 60 xx 39 (文件标识2字节)(密钥类型1字节)(起始块号)(偏移地址)(数据长度)(数据)
// 0 1 2 3 4 5 6 7 8 9--
temp[0]=ComBuffer[7];
temp[1]=ComBuffer[8];
block_n=(sector_n<<2);
len_x=(ComBuffer[6]<<4);
if((len_x+temp[0]+temp[1])>48)
{
SendResponse(0x82,1,buf);//"超界错误
return;
}
for(i=0;i<3;i++) //
{
if(flag1)
{
Status=MF1_read_key(key_type,block_n+i,TempBuffer+(i<<4),key);
}
else Status=MF1_read(key_type,block_n+i,TempBuffer+(i<<4));
if(Status!=MI_OK) break;
}
if(Status==MI_OK)
{
memcpy(TempBuffer+len_x+temp[0],ComBuffer+9,temp[1]);
for(i=0;i<3;i++) //
{
if(flag1)
{
Status=MF1_write_key(key_type,block_n+i,TempBuffer+(i<<4),key);
}
else Status=MF1_write(key_type,block_n+i,TempBuffer+(i<<4));
if(Status!=MI_OK) break;
}
}
if(Status==MI_OK) SendResponse(0x01,1,buf);
else SendResponse(0x80,1,buf);
flag1=0;
break;
case 0x3b: /* read file */
//"格式 60 xx 3b (文件标识2字节)(密钥类型1字节)(起始块号)(块数量)
// 0 1 2 3 4 5 6 7
block_n=(sector_n<<2)+ComBuffer[6];
temp[0]=ComBuffer[7];
if((ComBuffer[6]+temp[0])>3)
{
SendResponse(0x82,1,buf);
return;
}
for(i=0;i<temp[0];i++)
{
if(flag1)
{
Status=MF1_read_key(key_type,block_n+i,buf,key);
}
else Status=MF1_read(key_type,block_n+i,buf);
if(Status!=MI_OK) break;
else memcpy(ComBuffer+9+(i<<4),buf,16);
}
if(Status==MI_OK)
{
SendResponse(0x01,(temp[0]<<4)+18,buf); /* OK */
}
else
{
SendResponse(0x80,1,buf); /* read file error */
}
flag1=0;
break;
case 0xF9: /* write file */
//"格式 60 xx F9 (文件标识2字节)(密钥类型1字节)(起始块号)(偏移地址)(数据长度)(数据)
// 0 1 2 3 4 5 6 7 8 9 10--
Status=CheckMad2(buf2); /*get sector no.*/
if(Status!=MI_OK) return;
temp[0]=ComBuffer[8]; //"偏移地址
temp[1]=ComBuffer[9]; //"数据长度
LEN1=buf2[0]+buf2[0]+buf2[0];//"块数
LEN1=(LEN1<<4); //"字节数
if(((ComBuffer[7]<<4)+temp[0]+temp[1])>LEN1)
{
SendResponse(0x82,1,buf);
return;
}
LEN1=0;
LEN2=0;
for(j=1;j<=buf2[0];j++) //"一个文件多个扇区
{
sector_n=buf2[j];
block_n=(sector_n<<2);
keytest=ComBuffer[6]; //"密钥类型2(认证码标识和KEYA KEYB)
Status=Creat_key2(keytest,sector_n,ComBuffer[5],key);
if(Status!=MI_OK)
{
SendResponse(0x01,CREAT_KEY_ERROR,buf);
return ;
}
flag1=1;
if((keytest&0x0F)==0)
{
keytest=PICC_AUTHENT1A;
}
else keytest=PICC_AUTHENT1B;
if(flag1)
{
Status=MF1_authkey(keytest,key,block_n);
}
else Status=MF1_auth(keytest,sector_n,block_n);
if(Status!=MI_OK)
{
SendResponse(0x81,1,buf);
return;
}
for(i=0;i<3;i++)
{
if(flag1)
{
Status=MF1_read_key(keytest,block_n+i,TempBuffer+LEN2,key);
}
else Status=MF1_read(keytest,block_n+i,TempBuffer+LEN2);
if(Status!=MI_OK) break;
LEN2+=16;
}
if(Status!=MI_OK) break;
}
if(Status==MI_OK)
{
LEN1=(ComBuffer[7]<<4)+temp[0];//"绝对偏移地址
memcpy(TempBuffer+LEN1,ComBuffer+10,temp[1]);
LEN2=0;
for(j=1;j<=buf2[0];j++)
{
sector_n=buf2[j];
block_n=(sector_n<<2);
keytest=ComBuffer[6]; //"密钥类型2(认证码标识和KEYA KEYB )
Status=Creat_key2(keytest,sector_n,ComBuffer[5],key);//
if(Status!=MI_OK)
{
SendResponse(0x01,CREAT_KEY_ERROR,buf);
return ;
} //
flag1=1; //
keytest=(ComBuffer[6]&0x0F);
if(keytest==0)
{
keytest=PICC_AUTHENT1A;
}
else keytest=PICC_AUTHENT1B;
for(i=0;i<3;i++)
{
if(flag1)
{
Status=MF1_write_key(keytest,block_n+i,TempBuffer+LEN2,key);
}
else Status=MF1_write(keytest,block_n+i,TempBuffer+LEN2);
if(Status!=MI_OK) break;
LEN2+=16;
}
if(Status!=MI_OK) break;
}
}
if(Status==MI_OK) SendResponse(0x01,1,buf);
else SendResponse(0x80,1,buf);
flag1=0;
break;
case 0xFb: /* read file */
//"格式:要求支持一个文件占多个扇区(现在支持4个扇区)
//" 60 xx fb 文件标识(2) 密钥标识(2)开始块地址(1) 要读的块数(1)
//"现在0 1 2 3 4 5 6 7 8
//"原来0 1 2 3 4 5 6 7
Status=CheckMad2(buf2); /*get sector no.*/
if(Status!=MI_OK) return;
temp[0]=ComBuffer[7]; //"偏移地址
temp[1]=ComBuffer[8]; //"数据长度
LEN1=buf2[0]+buf2[0]+buf2[0];//"块数
if((temp[0]+temp[1])>LEN1)
{
SendResponse(0x82,1,buf);
return;
}
LEN1=0;
LEN2=0;
for(j=1;j<=buf2[0];j++) //"一个文件多个扇区
{
sector_n=buf2[j];
block_n=(sector_n<<2);
keytest=ComBuffer[6]; //"密钥类型2(认证码标识和KEYA KEYB)
Status=Creat_key2(keytest,sector_n,ComBuffer[5],key);
if(Status!=MI_OK) return;
flag1=1;
if((keytest&0x0F)==0)
{
keytest=PICC_AUTHENT1A;
}
else keytest=PICC_AUTHENT1B;
if(flag1)
{
Status=MF1_authkey(keytest,key,block_n);
}
else Status=MF1_auth(keytest,sector_n,block_n);
if(Status!=MI_OK)
{
SendResponse(0x81,1,buf);
return;
}
for(i=0;i<3;i++)
{
if(flag1)
{
Status=MF1_read_key(keytest,block_n+i,TempBuffer+LEN2,key);
}
else Status=MF1_read(keytest,block_n+i,TempBuffer+LEN2);
if(Status!=MI_OK) break;
LEN2+=16;
}
if(Status!=MI_OK) break;
}
LEN1=(temp[0]<<4);//"绝对地址
LEN2=(temp[1]<<4);//"长度
if(Status==MI_OK)
{
memcpy(ComBuffer+9,TempBuffer+LEN1,LEN2);
SendResponse(0x01,LEN2+18,buf);
}
else SendResponse(0x80,1,buf);
flag1=0;
break;
case 0x34: /* load_key */
if(ComBuffer[3]==0x01)
{
keytest=PICC_AUTHENT1B; /* KEYB */
}
else keytest=PICC_AUTHENT1A;
sector_n=ComBuffer[4]&0x0f; // so the sector is 0~15 for thr rc500
if((ComBuffer[4]==0x10)&(keytest==PICC_AUTHENT1A))
{
Status=Write_Ram_byte(0x0000,ComBuffer+5,6);
}
else if((ComBuffer[4]==0x10)&(keytest==PICC_AUTHENT1B))
{
Status=Write_Ram_byte(0x0006,ComBuffer+5,6);
}
else if((ComBuffer[4]>=0x20)&(ComBuffer[4]<=0x2f))
{
if(keytest==PICC_AUTHENT1A)
{
Status=Write_Ram_byte(0x0010,ComBuffer+5,6);
}
if(keytest==PICC_AUTHENT1B)
{
Status=Write_Ram_byte(0x0016,ComBuffer+5,6);
}
}
else Status=Mf500PcdLoadKeyE2(keytest,sector_n,ComBuffer+5);
if(Status==MI_OK)
{
SendResponse(0x01,1,buf);
}
else
{
SendResponse(0x80,1,buf);
}
break;
/******************************TIME COS COMMAND************************/
case 0x88: //T=CL;for mifare pro
switch(ComBuffer[3])//check message's head //2refrence TimeCos command
{
case 0x00: // 2 the first byte
case 0x04:
case 0x80:
case 0x84:
case 0xe0:
key_index=1; break;
default:
key_index=0;
}
if(key_index==0)
{
SendResponse(COS_CLA_ERROR,1,buf);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -