📄 main0.c
字号:
buf[iccrsp.len + 1] = iccrsp.SW[0];
buf[iccrsp.len + 2] = iccrsp.SW[1];
rsplen = iccrsp.len + 3;
}
}
}
#endif
else if(cmdtype == CMD_PACKEDCMD)
{
if(len < 6)
buf[0] = ERRORCMDLEN;
else
{
icccmd.CLA = cmddata[0];
icccmd.INS = cmddata[1];
icccmd.P1 = cmddata[2];
icccmd.P2 = cmddata[3];
if(len > 7) // if len > 7, then lc > 0.
{
icccmd.Lc = cmddata[4];
icccmd.DAT = cmddata + 5;
if(len - icccmd.Lc == 7)
icccmd.Le = 0;
else if(len - icccmd.Lc == 8)
icccmd.Le = cmddata[5 + icccmd.Lc];
else // error cmd package
{
buf[0] = ERRORCMD;
CommSend(buf, 1);
break;
}
}
else if(len == 7) // else(len == 7) lc = 0.
{
icccmd.Lc = 0;
icccmd.Le = cmddata[4];
}
else // len = 6
{
icccmd.Lc = 0;
icccmd.Le = 0;
}
iccrsp.DAT = buf+1;
if(!IccSendCmd(&icccmd, &iccrsp))
{
// command failed
buf[0] = FAIL;
}
else
{
// command success, send command excute result
// pdu: response_data*n + response_sw*2
buf[0] = SUCCESS;
buf[iccrsp.len + 1] = iccrsp.SW[0];
buf[iccrsp.len + 2] = iccrsp.SW[1];
rsplen = iccrsp.len + 3;
}
}
}
else if(cmdtype == 2) // get isam key for hefei cmb
{
//02 00 06 00 02 87 65 43 21 03 87
unsigned char *IC_SN = buf + 300;
if(len != 6)
{
buf[0] = ERRORCMDLEN;
CommSend(buf, 1);
break;
}
memcpy(IC_SN, cmddata, 4);
iccrsp.DAT = buf + 1;
// 1st
BuildAPDU("\x00\xA4\x04\x00\x09\xa2\x00\x00\x57\x64\x62\x69\x61\x6f",
14, &icccmd);
if(!IccSendCmd(&icccmd, &iccrsp))
{
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;
}
// 2nd
BuildAPDU("\x80\x1A\x28\x01\x08\x07\x56\x71\x68\x90\x72\x89\x68",
13, &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;
}
// 3rd
memcpy(cmddata,
"\x80\xFA\x00\x00\x18\xff\xff\xff\xff\x05\x51\x0B\x00\xff\xff\xff\xff\x05\x51\x0B\x01\x07\x56\x08\x56\x05\x51\x07\x73",
29);
memcpy(cmddata+5, IC_SN, 4);
memcpy(cmddata+13, IC_SN, 4);
BuildAPDU(cmddata, 29, &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;
buf[iccrsp.len + 1] = iccrsp.SW[0];
buf[iccrsp.len + 2] = iccrsp.SW[1];
rsplen = iccrsp.len + 3;
}
else if(cmdtype == 4) // init pos for hefei cmb
{
if(len != 3)
{
buf[0] = ERRORCMDLEN;
CommSend(buf, 1);
break;
}
iccrsp.DAT = buf + 1;
IccSelect(IC_SAM1);
// 1st
BuildAPDU("\x00\xa4\x00\x00\x02\x3f\x00", 7, &icccmd);
if(!IccSendCmd(&icccmd, &iccrsp))
{
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;
}*/
// 2nd
BuildAPDU("\x00\xb0\x96\x00\x06", 5, &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;
}
// 3rd
memcpy(termsn, iccrsp.DAT, 6);
BuildAPDU("\x00\xA4\x04\x00\x09\xa0\x00\x00\x57\x64\x62\x69\x61\x6f",
14, &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;
}
// 4th
IccSelect(IC_SAM2);
BuildAPDU("\x00\xa4\x00\x00\x02\x3f\x00", 7, &icccmd);
if(!IccSendCmd(&icccmd, &iccrsp))
{
buf[0] = FAIL;
buf[1] = 3;
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;
}*/
// 5th
BuildAPDU("\x00\xA4\x04\x00\x09\xa0\x00\x00\x57\x64\x62\x69\x61\x6f",
14, &icccmd);
if(!IccSendCmd(&icccmd, &iccrsp))
{
buf[0] = FAIL;
buf[1] = 4;
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;
}
// 6th
BuildAPDU("\x00\x20\x00\x00\x03\x65\x43\x21", 8, &icccmd);
if(!IccSendCmd(&icccmd, &iccrsp))
{
buf[0] = FAIL;
buf[1] = 5;
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;
}
// 7th
BuildAPDU("\x00\xb0\x95\x00\x1e", 5, &icccmd);
if(!IccSendCmd(&icccmd, &iccrsp))
{
buf[0] = FAIL;
buf[1] = 6;
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;
}
memcpy(terminf, iccrsp.DAT+12, 8);
buf[0] = SUCCESS;
memcpy(buf+iccrsp.len+1, termsn, 6);
buf[iccrsp.len + 1 + 6] = iccrsp.SW[0];
buf[iccrsp.len + 2 + 6] = iccrsp.SW[1];
rsplen = iccrsp.len + 3 + 6;
CommSend(buf, rsplen); // 直接发送应用序列号(使用PBOC命令获得)和IC卡响应
// 状态字(sw,2bytes),和终端号6字节(终端号排在最后)
break;
//rsplen = iccrsp.len + 3;
//CommSend(buf, rsplen);
//memcpy(buf+1, termsn, 6);
//CommSend(buf, 7);
//break;
}
else if(cmdtype == 5) // pos for hefei cmb
{
//02 00 14 01 05 00 00 03 E8 05 20 04 12 31 10 10 10 03 ea
//02 00 14 FE FA FF FF FC 17 FA DF FB ED CE EF EF EF 03 EA
//02 00 14 FE FA FF FF Ff fe FA DF FB ED CE EF EF EF 03 00
unsigned char *ptmp = buf + 256 + 14 + 4;
unsigned char *mac1 = buf + 256 + 14;
if(len != 14)
{
buf[0] = ERRORCMDLEN;
CommSend(buf, 1);
break;
}
memcpy(buf+256, cmddata, len-2);
cmddata = buf+256;
IccSelect(IC_SAM2);
iccrsp.DAT = buf+1;
memcpy(ptmp, "\x80\x50\x01\x01\x0b\x01", 6);
memcpy(ptmp+6, cmddata, 4);
memcpy(ptmp+6+4, termsn, 6);
ptmp[6+4+6] = 0x0f;
BuildAPDU(ptmp, 6+4+6+1, &icccmd);
if(!IccSendCmd(&icccmd, &iccrsp))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -