📄 mifare1.c.bak
字号:
cmd[1] = i;
return 2;
}
i = M500ReadValue(m1block, cmd+1, m1bakblock);
if(i != MI_OK)
{
cmd[0] = FAIL;
cmd[1] = i;
return 2;
}
else
{
if(m1eptype) // msb first ep
{
epvalue = buftolong51(cmd+1);
longtobuf86(epvalue, cmd+1);
}
// success
cmd[0] = SUCCESS;
return 5;
}
}
else if(cmd[1] == CMD_DECEP)
{
uchar m1bakblock, m1eptype;
m1bakblock = m1data[0];
m1eptype = m1data[1];
m1data += 2;
m1block = (m1sector << 2) + m1block;
m1bakblock = (m1sector << 2) + m1bakblock;
if(len != 10)
{
cmd[0] = ERRORCMDLEN;
return 1;
}
epvalue = buftolong86(m1data);
i = M500ReadValue(m1block, cmd, m1bakblock);
if(i != MI_OK)
{
cmd[0] = FAIL;
cmd[1] = i;
return 2;
}
if(!m1eptype) // lsb first ep
oldepvalue = buftolong86(cmd);
else // msb first ep
oldepvalue = buftolong51(cmd);
epvalue = oldepvalue - epvalue;
if(!m1eptype) // lsb first ep
longtobuf86(epvalue, cmd);
else // msb first ep
longtobuf51(epvalue, cmd);
if(MI_OK != (i = M500WriteValue(m1block, cmd, m1bakblock)))
{
cmd[0] = FAIL;
cmd[1] = i;
return 2;
}
i = M500ReadValue(m1block, cmd+1, m1bakblock);
if(i != MI_OK)
{
cmd[0] = FAIL;
cmd[1] = i;
return 2;
}
else
{
if(m1eptype) // msb first ep
{
epvalue = buftolong51(cmd+1);
longtobuf86(epvalue, cmd+1);
}
// success
cmd[0] = SUCCESS;
return 5;
}
}
else if(cmd[1] == CMD_RDEP)
{
uchar m1bakblock, m1eptype;
m1bakblock = m1data[0];
m1eptype = m1data[1];
m1data += 2;
m1block = (m1sector << 2) + m1block;
m1bakblock = (m1sector << 2) + m1bakblock;
if(len != 6)
{
cmd[0] = ERRORCMDLEN;
return 1;
}
i = M500ReadValue(m1block, cmd+1, m1bakblock);
if(i != MI_OK)
{
cmd[0] = FAIL;
cmd[1] = i;
return 2;
}
else
{
if(m1eptype) // msb first ep
{
epvalue = buftolong51(cmd+1);
longtobuf86(epvalue, cmd+1);
}
// success
cmd[0] = SUCCESS;
return 5;
}
}
else if(cmd[1] == CMD_WREP)
{
uchar m1bakblock, m1eptype;
m1bakblock = m1data[0];
m1eptype = m1data[1];
m1data += 2;
m1block = (m1sector << 2) + m1block;
m1bakblock = (m1sector << 2) + m1bakblock;
if(len != 10)
{
cmd[0] = ERRORCMDLEN;
return 1;
}
if(m1eptype) // msb first ep
{
epvalue = buftolong86(m1data);
longtobuf51(epvalue, m1data);
}
if(MI_OK != (i = M500WriteValue(m1block, m1data, m1bakblock)))
{
cmd[0] = FAIL;
cmd[1] = i;
return 2;
}
i = M500ReadValue(m1block, cmd+1, m1bakblock);
if(i != MI_OK)
{
cmd[0] = FAIL;
cmd[1] = i;
return 2;
}
else
{
if(m1eptype) // msb first ep
{
epvalue = buftolong51(cmd+1);
longtobuf86(epvalue, cmd+1);
}
// success
cmd[0] = SUCCESS;
return 5;
}
}
// 使用philips的命令加减钱包
else if(cmd[1] == CMD_PINCEP)
{
uchar m1bakblock, m1eptype;
m1bakblock = m1data[0];
m1eptype = m1data[1];
m1data += 2;
m1block = (m1sector << 2) + m1block;
m1bakblock = (m1sector << 2) + m1bakblock;
if(len != 10)
{
cmd[0] = ERRORCMDLEN;
return 1;
}
// convert data
if(m1eptype) // msb first ep
{
epvalue = buftolong86(m1data);
longtobuf51(epvalue, m1data);
}
epstatus = M500GetEpStatus(m1block, m1bakblock);
// increment
if(epstatus & 0x01)
{
i = M500Increment(m1block, m1data, m1bakblock);
}
else if(epstatus & 0x02)
{
i = M500Increment(m1bakblock, m1data, m1block);
}
else
{
cmd[0] = FAIL;
cmd[1] = MI_VALERR;
return 2;
}
// either success or fail, i will send the ep value
if(i != MI_OK)
{
cmd[0] = FAIL;
//cmd[1] = i;
//CommSend(cmd, 2);
//break;
}
else
{
cmd[0] = SUCCESS;
}
i = M500ReadValue(m1block, cmd+1, m1bakblock);
if(i != MI_OK)
{
cmd[0] = FAIL;
cmd[1] = i;
return 2;
}
else
{
// success
if(m1eptype) // msb first ep
{
epvalue = buftolong51(cmd+1);
longtobuf86(epvalue, cmd+1);
}
return 5;
}
}
else if(cmd[1] == CMD_PDECEP)
{
uchar m1bakblock, m1eptype;
m1bakblock = m1data[0];
m1eptype = m1data[1];
m1data += 2;
m1block = (m1sector << 2) + m1block;
m1bakblock = (m1sector << 2) + m1bakblock;
if(len != 10)
{
cmd[0] = ERRORCMDLEN;
return 1;
}
// convert data
if(m1eptype) // msb first ep
{
epvalue = buftolong86(m1data);
longtobuf51(epvalue, m1data);
}
epstatus = M500GetEpStatus(m1block, m1bakblock);
// increment
if(epstatus & 0x01)
{
i = M500Decrement(m1block, m1data, m1bakblock);
}
else if(epstatus & 0x02)
{
i = M500Decrement(m1bakblock, m1data, m1block); //070207, switch bakblock and block
}
else
{
cmd[0] = FAIL;
cmd[1] = MI_VALERR;
return 2;
}
// either success or fail, i will send the ep value
if(i != MI_OK)
{
cmd[0] = FAIL;
//cmd[1] = i;
//CommSend(cmd, 2);
//break;
}
else
{
cmd[0] = SUCCESS;
}
i = M500ReadValue(m1block, cmd+1, m1bakblock);
if(i != MI_OK)
{
cmd[0] = FAIL;
cmd[1] = i;
return 2;
}
else
{
// success
if(m1eptype) // msb first ep
{
epvalue = buftolong51(cmd+1);
longtobuf86(epvalue, cmd+1);
}
// cmd[0] = SUCCESS; // see the dec operation
return 5;
}
}
else if(cmd[1] == CMD_BLOCKCOPY)
{
uchar m1bakblock;
m1bakblock = m1data[0];
m1block = (m1sector << 2) + m1block;
m1bakblock = (m1sector << 2) + m1bakblock;
if(len != 5)
{
cmd[0] = ERRORCMDLEN;
return 1;
}
i = M500Copy(m1block, m1bakblock);
if(i != MI_OK)
{
cmd[0] = FAIL;
cmd[1] = i;
return 2;
}
else
{
cmd[0] = SUCCESS;
return 1;
}
}
else
{
// error package
cmd[0] = ERRORCMD;
return 1;
}
}
bit M1Search(unsigned char *snr)
{
char atq[2];
static bit fret = 0;
unsigned char i;
static unsigned int starttime = 0;
static unsigned int hascardtime = 0;
if(GetTenTickCount() - starttime <= 50)
return fret;
starttime = GetTenTickCount();
for(i=0; i<4; i++)
{
if(M500Request(PICC_REQALL /*PICC_REQSTD*/, atq) == MI_OK)
{
if(MI_OK == M500Anticoll(snr))
{
if(MI_OK == M500Select(snr))
{
if(fret == 0)
{
if(starttime - hascardtime >= CardConfirmTime)
fret = 1;
}
return fret;
}
}
}
#ifdef WATCHDOG
ResetWDT();
#endif
}
hascardtime = starttime;
return (fret = 0);
}
long buftolong86(char *buf)
{
char invbuf[4];
invbuf[0] = buf[3];
invbuf[1] = buf[2];
invbuf[2] = buf[1];
invbuf[3] = buf[0];
return *(long *)invbuf;
}
void longtobuf86(long val, char *buf)
{
char *invbuf;
invbuf = (char *)&val;
buf[0] = invbuf[3];
buf[1] = invbuf[2];
buf[2] = invbuf[1];
buf[3] = invbuf[0];
}
long buftolong51(char *buf)
{
return *(long *)buf;
}
void longtobuf51(long val, char *buf)
{
memcpy(buf, (char *)&val, 4);
}
unsigned char M1Auth(unsigned char keyab, unsigned char *key, unsigned char sec)
{
unsigned char i;
if(keyab)
keyab = PICC_AUTHENT1B;
else
keyab = PICC_AUTHENT1A;
i = M500Auth(keyab, snr, key, sec);
if(MI_OK != i)
{
return i;
}
else
{
// search current key in key buffer
for(i=0; i<m1keycnt; i++)
{
if(sec == (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], key, 6); // store key
if(PICC_AUTHENT1A == keyab)
m1keystatus[i] = sec & 0x7f; // key a
else
m1keystatus[i] = sec | 0x80; // key b
return MI_OK;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -