📄 main0.c
字号:
buf[0] = FAIL;
buf[1] = 0;
CommSend(buf, 2);
break;
}
else if(memcmp(iccrsp.SW, "\x90\x00", 2) != 0)
{
buf[0] = FAIL;
buf[1] = iccrsp.SW[0];
buf[2] = iccrsp.SW[1];
CommSend(buf, 3);
break;
}
IccSelect(IC_SAM1);
memcpy(ptmp, "\x80\x70\x00\x00\x1c", 5);
memcpy(ptmp+5, iccrsp.DAT+11, 4);
memcpy(mac1, iccrsp.DAT+11, 4);
memcpy(ptmp+9, iccrsp.DAT+4, 2);
memcpy(ptmp+11, cmddata, 12);
memcpy(ptmp+23, iccrsp.DAT+9, 2);
memcpy(ptmp+25, terminf, 8);
BuildAPDU(ptmp, 33, &icccmd);
if(!IccSendCmd(&icccmd, &iccrsp))
{
buf[0] = FAIL;
buf[1] = 1;
CommSend(buf, 2);
break;
}
else if(memcmp(iccrsp.SW, "\x90\x00", 2) != 0)
{
buf[0] = FAIL;
buf[1] = iccrsp.SW[0];
buf[2] = iccrsp.SW[1];
CommSend(buf, 3);
break;
}
IccSelect(IC_SAM2);
memcpy(ptmp, "\x80\x54\x01\x00\x0f", 5);
memcpy(ptmp+5, iccrsp.DAT, 4);
memcpy(ptmp+9, cmddata+5, 7);
memcpy(ptmp+16, iccrsp.DAT+4, 4);
ptmp[20] = 0x08;
BuildAPDU(ptmp, 21, &icccmd);
if(!IccSendCmd(&icccmd, &iccrsp))
{
buf[0] = FAIL;
buf[1] = 2;
CommSend(buf, 2);
break;
}
else if(memcmp(iccrsp.SW, "\x90\x00", 2) != 0)
{
buf[0] = FAIL;
buf[1] = iccrsp.SW[0];
buf[2] = iccrsp.SW[1];
CommSend(buf, 3);
break;
}
buf[0] = SUCCESS;
// send tac, mac2
rsplen = iccrsp.len + 3;
memcpy(buf+iccrsp.len+1, mac1, 4);
buf[iccrsp.len + 1 + 4] = iccrsp.SW[0];
buf[iccrsp.len + 2 + 4] = iccrsp.SW[1];
rsplen = iccrsp.len + 3 + 4;
CommSend(buf, rsplen); // 直接发送TAC、MAC2、SW、MAC1(MAC1排在最后)
break;
//CommSend(buf, rsplen);
//send mac1
//memcpy(buf+1, mac1, 4);
//CommSend(buf, 5);
//break;
}
else
{
buf[0] = ERRORCMD;
}
CommSend(buf, rsplen);
break;
// 针对M1卡的命令
// STX-LEN1-LEN2-CMDTYPE-SECTOR-[SECTOR[S] | BLOCK[S]]-[DATA]-ETX-LRC
case IC_M1:
// if(rfrstmin > 0) // 050511
// rfrstmin -= 1;
fwaitcmd = 0; // disable resend msg to host, 050523
m1sector = cmddata[0];
m1block = cmddata[1];
m1data = cmddata + 2;
///////////////////////////////////////
// request card!
if(!rfcardtest(snr))
{
// error
buf[0] = FAIL;
buf[1] = MI_NOTAGERR;
CommSend(buf, 2);
break;
}
if(cmdtype == CMD_GETSNR) // get card snr
{
if(len != 2)
{
buf[0] = ERRORCMDLEN;
CommSend(buf, 1);
break;
}
// copy snr to buf
buf[0] = SUCCESS;
memcpy(buf+1, snr, 4);
CommSend(buf, 5);
break;
}
if(cmdtype == CMD_AUTH) // auth card with specified key
{
if(len != 10)
{
buf[0] = ERRORCMDLEN;
CommSend(buf, 1);
break;
}
m1sector &= 0x7f; // mask the invalid msb
if(!m1block) // auth a
{
// memcpy(keya, m1data, 6);
// i = M500Auth(PICC_AUTHENT1A, snr, keya, m1sector);
i = M500Auth(PICC_AUTHENT1A, snr, m1data, m1sector);
if(MI_OK != i)
{
// fail in auth key, copy fail message to buf
// fkeyapassed = 0;
buf[0] = FAIL;
buf[1] = i;
CommSend(buf, 2);
}
else
{
// fkeyapassed = 1;
// search current key in key buffer
for(i=0; i<m1keycnt; i++)
{
if(m1sector == (m1keystatus[i] & 0x7f))
break;
}
if(i >= m1keycntmax) // not found and buffer full
i = 0;
else if(i >= m1keycnt) // not found and buffer not full
m1keycnt += 1;
else // found
;
///////////////////////////////////////////////////////
memcpy(m1keys[i], m1data, 6); // store key a
m1keystatus[i] = m1sector & 0x7f; // key a
buf[0] = SUCCESS;
CommSend(buf, 1);
}
}
else
{
// memcpy(keyb, m1data, 6);
// i = M500Auth(PICC_AUTHENT1B, snr, keyb, m1sector);
i = M500Auth(PICC_AUTHENT1B, snr, m1data, m1sector);
if(MI_OK != i)
{
// fail in auth key, copy fail message to buf
// fkeybpassed = 0;
buf[0] = FAIL;
buf[1] = i;
CommSend(buf, 2);
}
else
{
// fkeybpassed = 1;
// search current key in key buffer
for(i=0; i<m1keycnt; i++)
{
if(m1sector == (m1keystatus[i] & 0x7f))
break;
}
if(i >= m1keycntmax) // not found and buffer full
i = 0;
else if(i >= m1keycnt) // not found and buffer not full
m1keycnt += 1;
else // found
;
///////////////////////////////////////////////////////
memcpy(m1keys[i], m1data, 6); // store key b
m1keystatus[i] = m1sector | 0x80; // key b
buf[0] = SUCCESS;
CommSend(buf, 1);
}
}
break;
}
else if(cmdtype == CMD_LDKEY)
{
if((len < 10) && (len != 2))
{
buf[0] = ERRORCMDLEN;
CommSend(buf, 1);
break;
}
len -= 2;
if((len & 0x07) != 0) // len % 8
{
buf[0] = ERRORCMDLEN;
CommSend(buf, 1);
break;
}
len >>= 3; // len = len / 8;
if(len > m1keycntmax) // too much keys
{
buf[0] = ERRORCMDLEN;
CommSend(buf, 1);
break;
}
// check if there are same key sector in the data
for(i=0; i<len-1; i++)
{
unsigned char i1;
bit fsame = 0;
for(i1=i+1; i1<len; i1++)
{
if(cmddata[i<<3] > 0x7f)
{
fsame = 1;
break;
}
if(cmddata[i<<3] == cmddata[i1<<3])
{
fsame = 1;
break;
}
}
if(fsame)
break;
}
if(i < len-1) // found same sector in buffer
{
buf[0] = ERRORCMD;
CommSend(buf, 1);
break;
}
// copy to key buffer
for(i=0; i<len; i++)
{
m1sector = cmddata[0] & 0x7f;
m1block = cmddata[1];
m1data = cmddata + 2;
// store key
memcpy(m1keys[i], m1data, 6);
if(!m1block)
m1keystatus[i] = m1sector & 0x7f;
else
m1keystatus[i] = m1sector | 0x80;
cmddata += 8;
}
m1keycnt = i;
buf[0] = SUCCESS;
buf[1] = m1keycnt;
CommSend(buf, 2);
break;
}
else if(cmdtype == CMD_LDMKEY)
{
if(len != 26)
{
buf[0] = ERRORCMDLEN;
CommSend(buf, 1);
break;
}
m1keycnt = 0;
memcpy(m1keys[0], m1data, 6);
memcpy(m1keys[1], m1data, 6);
if(m1block == 0x61) // keyb
{
m1keystatus[0] = 0 | 0x80;
m1keystatus[1] = 2 | 0x80;
}
else if(m1block == 0x60) // keya
{
m1keystatus[0] = 0 & 0x7f;
m1keystatus[1] = 2 & 0x7f;
}
else
{
buf[0] = ERRORCMD;
CommSend(buf, 1);
break;
}
cmddata += 8;
m1sector = cmddata[0] & 0x7f;
m1block = cmddata[1];
m1data = cmddata + 2;
memcpy(m1keys[2], m1data, 6);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -