⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main0.c

📁 mifarea卡程序mifarea卡程序mifarea卡程序
💻 C
📖 第 1 页 / 共 5 页
字号:
                            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 + -