📄 main0.c
字号:
memcpy(m1keys[3], m1data, 6);
if(m1block == 0x61) // keyb
{
m1keystatus[2] = 1 | 0x80;
m1keystatus[3] = 3 | 0x80;
}
else if(m1block == 0x60) // keya
{
m1keystatus[2] = 1 & 0x7f;
m1keystatus[3] = 3 & 0x7f;
}
else
{
buf[0] = ERRORCMD;
CommSend(buf, 1);
break;
}
cmddata += 8;
m1sector = cmddata[0] & 0x7f;
m1block = cmddata[1];
m1data = cmddata + 2;
for(i=4; i<8; i++)
{
memcpy(m1keys[i], m1data, 6);
if(m1block == 0x61)
m1keystatus[i] = i | 0x80;
else // if(m1block == 0x60)
m1keystatus[i] = i & 0x7f;
}
m1keycnt = 8;
buf[0] = SUCCESS;
buf[1] = 1;
CommSend(buf, 2);
break;
}
// 其他命令,首先作认证
// search key for current sector
m1keyidx = 0xff;
fkeypassed = 0;
for(i=0; i<m1keycnt; i++)
{
if(m1sector == (m1keystatus[i] & 0x7f))
{
m1keyidx = i;
break;
}
}
if(m1keyidx == 0xff)
{
buf[0] = FAIL;
buf[1] = MI_NOTAUTHERR;
CommSend(buf, 2);
break;
}
if((m1keystatus[m1keyidx] & 0x80) == 0x80) // key b
{
if(MI_OK == M500Auth(PICC_AUTHENT1B, snr, m1keys[m1keyidx], m1sector))
fkeypassed = 1;
else if(MI_OK == M500Auth(PICC_AUTHENT1B, snr, m1keys[m1keyidx], m1sector))
fkeypassed = 1;
else if(MI_OK == M500Auth(PICC_AUTHENT1B, snr, m1keys[m1keyidx], m1sector))
fkeypassed = 1;
}
else // key a
{
if(MI_OK == M500Auth(PICC_AUTHENT1A, snr, m1keys[m1keyidx], m1sector))
fkeypassed = 1;
else if(MI_OK == M500Auth(PICC_AUTHENT1A, snr, m1keys[m1keyidx], m1sector))
fkeypassed = 1;
else if(MI_OK == M500Auth(PICC_AUTHENT1A, snr, m1keys[m1keyidx], m1sector))
fkeypassed = 1;
}
if(!fkeypassed)
{
buf[0] = FAIL;
buf[1] = MI_AUTHERR;
CommSend(buf, 2);
break;
}
if(cmdtype == CMD_READ) // READ M1 CARD
{
if(len != 4)
{
buf[0] = ERRORCMDLEN;
CommSend(buf, 1);
break;
}
if(m1block == ALLBLOCK)
{
if((i = M500Read((m1sector<<2), buf+1)) != MI_OK)
{
// error
buf[0] = FAIL;
buf[1] = i;
CommSend(buf, 2);
}
else if((i = M500Read((m1sector<<2) + 1, buf+1+16)) != MI_OK)
{
// error
buf[0] = FAIL;
buf[1] = i;
CommSend(buf, 2);
}
else if((i = M500Read((m1sector<<2) + 2, buf+1+16+16)) != MI_OK)
{
// error
buf[0] = FAIL;
buf[1] = i;
CommSend(buf, 2);
}
else
{
// success
buf[0] = SUCCESS;
CommSend(buf, 49);
}
}
else
{
if((i = M500Read((m1sector<<2) + m1block, buf+1)) != MI_OK)
{
// read error
buf[0] = FAIL;
buf[1] = i;
CommSend(buf, 2);
}
else
{
buf[0] = SUCCESS;
CommSend(buf, 17);
// CommSend(buf, 17);////////////////////////////////////
}
}
}
else if(cmdtype == CMD_WRITE)
{
if(len != 20)
{
buf[0] = ERRORCMDLEN;
CommSend(buf, 1);
break;
}
if((i = M500Write((m1sector<<2) + m1block, m1data)) != MI_OK)
{
buf[0] = FAIL;
buf[1] = i;
CommSend(buf, 2);
}
else if((i = M500Read((m1sector<<2) + m1block, buf+1)) != MI_OK) // read back
{
buf[0] = FAIL;
buf[1] = i;
CommSend(buf, 2);
}
else
{
buf[0] = SUCCESS;
CommSend(buf, 17);
}
}
// 钱包 ////////////////////////////////////////////
else if(cmdtype == CMD_INCEP)
{
uchar m1bakblock, m1eptype;
m1bakblock = m1data[0];
m1eptype = m1data[1];
m1data += 2;
m1block = (m1sector << 2) + m1block;
m1bakblock = (m1sector << 2) + m1bakblock;
if(len != 10)
{
buf[0] = ERRORCMDLEN;
CommSend(buf, 1);
break;
}
epvalue = buftolong86(m1data);
i = M500ReadValue(m1block, buf, m1bakblock);
if(i != MI_OK)
{
// error
buf[0] = FAIL;
buf[1] = i;
CommSend(buf, 2);
break;
}
if(!m1eptype) // lsb first ep
oldepvalue = buftolong86(buf);
else // msb first ep
oldepvalue = buftolong51(buf);
epvalue += oldepvalue;
#if 0
// 对溢出进行判断
if((oldepvalue > 0) && (epvalue < 0))
{
// error 溢出
}
#endif
if(!m1eptype) // lsb first ep
longtobuf86(epvalue, buf);
else // msb first ep
longtobuf51(epvalue, buf);
if(MI_OK != (i = M500WriteValue(m1block, buf, m1bakblock)))
{
// error
buf[0] = FAIL;
buf[1] = i;
CommSend(buf, 2);
break;
}
i = M500ReadValue(m1block, buf+1, m1bakblock);
if(i != MI_OK)
{
buf[0] = FAIL;
buf[1] = i;
CommSend(buf, 2);
break;
}
else
{
if(m1eptype) // msb first ep
{
epvalue = buftolong51(buf+1);
longtobuf86(epvalue, buf+1);
}
// success
buf[0] = SUCCESS;
CommSend(buf, 5);
break;
}
}
else if(cmdtype == CMD_DECEP)
{
uchar m1bakblock, m1eptype;
m1bakblock = m1data[0];
m1eptype = m1data[1];
m1data += 2;
m1block = (m1sector << 2) + m1block;
m1bakblock = (m1sector << 2) + m1bakblock;
if(len != 10)
{
buf[0] = ERRORCMDLEN;
CommSend(buf, 1);
break;
}
epvalue = buftolong86(m1data);
i = M500ReadValue(m1block, buf, m1bakblock);
if(i != MI_OK)
{
buf[0] = FAIL;
buf[1] = i;
CommSend(buf, 2);
break;
}
if(!m1eptype) // lsb first ep
oldepvalue = buftolong86(buf);
else // msb first ep
oldepvalue = buftolong51(buf);
#if 0
// 判断钱包余额是否不够用
if(epvalue > oldepvalue)
{
;
}
#endif
epvalue = oldepvalue - epvalue;
if(!m1eptype) // lsb first ep
longtobuf86(epvalue, buf);
else // msb first ep
longtobuf51(epvalue, buf);
if(MI_OK != (i = M500WriteValue(m1block, buf, m1bakblock)))
{
buf[0] = FAIL;
buf[1] = i;
CommSend(buf, 2);
break;
}
i = M500ReadValue(m1block, buf+1, m1bakblock);
if(i != MI_OK)
{
buf[0] = FAIL;
buf[1] = i;
CommSend(buf, 2);
}
else
{
if(m1eptype) // msb first ep
{
epvalue = buftolong51(buf+1);
longtobuf86(epvalue, buf+1);
}
// success
buf[0] = SUCCESS;
CommSend(buf, 5);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -