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

📄 main0.c

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