예제 #1
0
        public static bool  IsOldCard()
        {
            int comHandle = OpenUsb();

            GetConfig(comHandle);


            SetConfig(comHandle);

            int    ret1;
            string uid;

            GetUID(comHandle, out ret1, out uid);
            if (string.IsNullOrEmpty(uid))
            {
                GetUID(comHandle, out ret1, out uid);
            }
            if (string.IsNullOrEmpty(uid))
            {
                throw new Exception("无法获取uid");
            }

            ISO14443A_BLOCKPARAM block = new ISO14443A_BLOCKPARAM();

            block.block   = new byte[0xd0];
            block.uid.uid = new byte[10];
            block.key     = new byte[protocol.HFREADER_ISO14443A_LEN_M1_KEY];
            block.num     = 1;

            block.addr = 0;
            if (protocol.tagMode == 0)
            {
                block.keyType = 0x60;
                //memcpy(block.key, block1Key, HFREADER_ISO14443A_LEN_M1_KEY);
                Array.Copy(protocol.block1Key, block.key, protocol.HFREADER_ISO14443A_LEN_M1_KEY);
            }
            else
            {
                block.keyType = 0x61;
                //memcpy(block.key, block1Key + HFREADER_ISO14443A_LEN_M1BLOCK - HFREADER_ISO14443A_LEN_M1_KEY, HFREADER_ISO14443A_LEN_M1_KEY);
                Array.Copy(protocol.block1Key, protocol.HFREADER_ISO14443A_LEN_M1BLOCK - protocol.HFREADER_ISO14443A_LEN_M1_KEY, block.key, 0, protocol.HFREADER_ISO14443A_LEN_M1_KEY);
            }
            protocol.iso14443AAuthReadM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
            if (block.result.flag > 0)
            {
                return(false);
            }
            CloseUsb(comHandle);

            return(true);
        }
예제 #2
0
 public static extern int iso14443AAuthWriteM1Block(int h, ushort srcAddr, ushort targetAddr, ref ISO14443A_BLOCKPARAM pBlock, IntPtr pTxFrame, IntPtr pRxFrame);
예제 #3
0
        public static string UnLock()
        {
            string ret       = "";
            int    comHandle = OpenUsb();

            GetConfig(comHandle);


            SetConfig(comHandle);

            int    ret1;
            string uid;

            GetUID(comHandle, out ret1, out uid);
            if (string.IsNullOrEmpty(uid))
            {
                GetUID(comHandle, out ret1, out uid);
            }

            int  err       = 0;
            uint errorCode = 0;

            ISO14443A_BLOCKPARAM block = new ISO14443A_BLOCKPARAM();

            block.block   = new byte[0xd0];
            block.uid.uid = new byte[10];
            block.key     = new byte[protocol.HFREADER_ISO14443A_LEN_M1_KEY];

            if (protocol.tagMode == 0)
            {
                block.key = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };

                block.keyType = 0x60;
            }
            else
            {
                Array.Copy(protocol.block16Key, protocol.HFREADER_ISO14443A_LEN_M1BLOCK - protocol.HFREADER_ISO14443A_LEN_M1_KEY, block.key, 0, protocol.HFREADER_ISO14443A_LEN_M1_KEY);

                block.keyType = 0x61;
            }
            block.addr = 16;
            block.num  = 1;
            protocol.iso14443AAuthReadM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);

            //err = readerAuthReadM1Block(comHandle, 0, 1, &block, NULL, NULL);
            errorCode = block.result.errType;
            //saveLog(QString("Resume readerAuthReadM1Block:err=%1 errorCode=%2").arg(err, 2, 16, QLatin1Char('0')).arg(errorCode, 2, 16, QLatin1Char('0')));
            if (block.result.flag == 0)
            {
                //恢复卡
                block.block[8] = 0x55;

                protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                errorCode = block.result.errType;
                //saveLog(QString("Resume readerAuthWriteM1Block:err=%1 errorCode=%2").arg(err, 2, 16, QLatin1Char('0')).arg(errorCode, 2, 16, QLatin1Char('0')));
                if (block.result.flag == 0)
                {
                    ret = "解冻卡成功!";
                }
                else
                {
                    throw new Exception("解冻卡失败!");
                }
            }
            else
            {
                throw new Exception("读取冻结信息失败!");
            }

            ret1 = CloseUsb(comHandle);
            Trace.WriteLine("leave resume");

            return(ret);
        }
예제 #4
0
        public static string QuitCard()
        {
            int comHandle = OpenUsb();

            GetConfig(comHandle);


            SetConfig(comHandle);

            int    ret1;
            string uid;

            GetUID(comHandle, out ret1, out uid);
            if (string.IsNullOrEmpty(uid))
            {
                GetUID(comHandle, out ret1, out uid);
            }

            string ret       = uid;
            int    err       = 0;
            uint   errorCode = 0;

            byte[] defauleKey          = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
            ISO14443A_BLOCKPARAM block = new ISO14443A_BLOCKPARAM();

            block.block   = new byte[0xd0];
            block.key     = new byte[protocol.HFREADER_ISO14443A_LEN_M1_KEY];
            block.uid.uid = new byte[10];
            block.num     = 1;
            Array.Copy(defauleKey, block.block, protocol.HFREADER_ISO14443A_LEN_M1BLOCK);

            block.addr = 3;
            if (protocol.tagMode == 0)
            {
                block.keyType = 0x60;
                Array.Copy(protocol.block1Key, block.key, protocol.HFREADER_ISO14443A_LEN_M1_KEY);
            }
            else
            {
                block.keyType = 0x61;
                Array.Copy(protocol.block1Key, protocol.HFREADER_ISO14443A_LEN_M1BLOCK - protocol.HFREADER_ISO14443A_LEN_M1_KEY, block.key, 0, protocol.HFREADER_ISO14443A_LEN_M1_KEY);
            }
            protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
            errorCode = block.result.errType;
            //saveLog(QString("Quit readerAuthWriteM1Block:err=%1 errorCode=%2").arg(err, 2, 16, QLatin1Char('0')).arg(errorCode, 2, 16, QLatin1Char('0')));
            if (block.result.flag == 0)
            {
                block.addr = 19;
                if (protocol.tagMode == 0)
                {
                    block.keyType = 0x60;
                    Array.Copy(protocol.block16Key, block.key, protocol.HFREADER_ISO14443A_LEN_M1_KEY);
                }
                else
                {
                    block.keyType = 0x61;
                    Array.Copy(protocol.block16Key, protocol.HFREADER_ISO14443A_LEN_M1BLOCK - protocol.HFREADER_ISO14443A_LEN_M1_KEY, block.key, 0, protocol.HFREADER_ISO14443A_LEN_M1_KEY);
                }

                protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                errorCode = block.result.errType;
                //saveLog(QString("Quit readerAuthWriteM1Block:err=%1 errorCode=%2").arg(err, 2, 16, QLatin1Char('0')).arg(errorCode, 2, 16, QLatin1Char('0')));
                if (block.result.flag == 0)
                {
                    block.addr = 35;
                    if (protocol.tagMode == 0)
                    {
                        block.keyType = 0x60;
                        Array.Copy(protocol.block32Key, block.key, protocol.HFREADER_ISO14443A_LEN_M1_KEY);
                    }
                    else
                    {
                        block.keyType = 0x61;
                        Array.Copy(protocol.block32Key, protocol.HFREADER_ISO14443A_LEN_M1BLOCK - protocol.HFREADER_ISO14443A_LEN_M1_KEY, block.key, 0, protocol.HFREADER_ISO14443A_LEN_M1_KEY);
                    }

                    protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                    errorCode = block.result.errType;
                    //saveLog(QString("Quit readerAuthWriteM1Block:err=%1 errorCode=%2").arg(err, 2, 16, QLatin1Char('0')).arg(errorCode, 2, 16, QLatin1Char('0')));
                    if (block.result.flag != 0)
                    {
                        throw new Exception("恢复卡金额区密码失败!");
                        err = 1;
                    }
                }
                else
                {
                    throw new Exception("恢复卡用户密码区密码失败!");
                    err = 1;
                }
            }
            else
            {
                throw new Exception("恢复卡号区密码失败");
                err = 1;
            }

            if (err == 0)
            {
                block         = new ISO14443A_BLOCKPARAM();
                block.block   = new byte[0xd0];
                block.key     = new byte[] { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
                block.uid.uid = new byte[10];

                block.keyType = 0x60;
                block.num     = 1;

                block.addr = 1;
                protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                block.addr = 2;
                protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                errorCode = block.result.errType;
                //saveLog(QString("Quit readerAuthWriteM1Block:err=%1 errorCode=%2").arg(err, 2, 16, QLatin1Char('0')).arg(errorCode, 2, 16, QLatin1Char('0')));
                if (block.result.flag == 0)
                {
                    block.addr = 16;
                    protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                    block.addr = 17;
                    protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                    block.addr = 18;
                    protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                    errorCode = block.result.errType;
                    //saveLog(QString("Quit readerAuthWriteM1Block:err=%1 errorCode=%2").arg(err, 2, 16, QLatin1Char('0')).arg(errorCode, 2, 16, QLatin1Char('0')));
                    if (block.result.flag == 0)
                    {
                        block.addr = 32;
                        protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                        block.addr = 33;
                        protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                        block.addr = 34;
                        protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                        errorCode = block.result.errType;
                        //saveLog(QString("Quit readerAuthWriteM1Block:err=%1 errorCode=%2").arg(err, 2, 16, QLatin1Char('0')).arg(errorCode, 2, 16, QLatin1Char('0')));
                        if (block.result.flag != 0)
                        {
                            throw new Exception("恢复卡金额区失败!");
                        }
                    }
                    else
                    {
                        throw new Exception("恢复卡用户密码区失败!");
                    }
                }
                else
                {
                    throw new Exception("恢复卡号区失败");
                }
            }

            ret1 = CloseUsb(comHandle);
            Trace.WriteLine("leave QuitCard:" + ret);

            return(ret);
        }
예제 #5
0
        public static string ChangePassword(string userpass, bool pKeyCheck)
        {
            Trace.WriteLine("enter ChangePassword");

            int comHandle = OpenUsb();

            GetConfig(comHandle);


            SetConfig(comHandle);

            int    ret1;
            string uid;

            GetUID(comHandle, out ret1, out uid);
            if (string.IsNullOrEmpty(uid))
            {
                GetUID(comHandle, out ret1, out uid);
            }
            if (string.IsNullOrEmpty(uid))
            {
                throw new Exception("无法获取uid");
            }

            byte[] p = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };

            byte[] pwd = new byte[protocol.HFREADER_ISO14443A_LEN_M1_KEY];
            Array.Copy(p, 0, pwd, 0, Math.Min(p.Length, protocol.HFREADER_ISO14443A_LEN_M1_KEY));

            if (comHandle > 0)
            {
                byte[] pTxFrame = new byte[0x400];
                byte[] pRxFrame = new byte[0x400];

                ISO14443A_BLOCKPARAM block = new ISO14443A_BLOCKPARAM();
                block.uid     = new ISO14443A_UID();
                block.uid.uid = new byte[10];
                block.block   = new byte[0xd0];

                block.num = 1;

                block.key = new byte[protocol.HFREADER_ISO14443A_LEN_M1_KEY];

                if (protocol.tagMode == 0)
                {
                    Array.Copy(protocol.block16Key, block.key, protocol.HFREADER_ISO14443A_LEN_M1_KEY);
                    block.keyType = 0x60;
                }
                else
                {
                    Array.Copy(protocol.block16Key, protocol.HFREADER_ISO14443A_LEN_M1BLOCK - protocol.HFREADER_ISO14443A_LEN_M1_KEY, block.key, 0, protocol.HFREADER_ISO14443A_LEN_M1_KEY);
                    block.keyType = 0x61;
                }



                block.addr = 16;
                protocol.iso14443AAuthReadM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                if (block.result.flag > 0)
                {
                    throw new Exception("读取卡状态失败!");
                }
                else
                {
                    int pos = 0;

                    block.block[pos++] = 0xFF;
                    block.block[pos++] = 0xFF;
                    byte[] bpass = getpassbyteFromeText(userpass);
                    bpass.CopyTo(block.block, pos);
                    pos += protocol.USER_PASSWORD_LENGTH;
                    pos++;
                    if (pKeyCheck)
                    {
                        block.block[pos++] = 0xAA;
                    }
                    else
                    {
                        block.block[pos++] = 0x55;
                    }

                    protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                    if (block.result.flag == 0)
                    {
                    }
                    else
                    {
                        throw new Exception("写用户密码失败!");
                        //QMessageBox::information(this, QString(tr("提示")), QString(tr("写用户密码失败!")));
                    }
                }
            }
            else
            {
                throw new Exception("初始化HFreader失败!");
            }
            ret1 = CloseUsb(comHandle);
            Trace.WriteLine("leave ChangePassword:" + uid);


            return(uid);
        }
예제 #6
0
        public static string Charge(int chargeMoney)
        {
            //获取充值金额
            string retCharge = chargeMoney.ToString();

            if (chargeMoney >= 0)
            {
                int comHandle = OpenUsb();
                GetConfig(comHandle);


                SetConfig(comHandle);

                int    ret1;
                string uid;
                GetUID(comHandle, out ret1, out uid);
                if (string.IsNullOrEmpty(uid))
                {
                    GetUID(comHandle, out ret1, out uid);
                }

                int err       = 0;
                int errorCode = 0;

                ISO14443A_BLOCKPARAM block = new ISO14443A_BLOCKPARAM();
                block.block   = new byte[0xd0];
                block.uid.uid = new byte[10];
                block.addr    = 32;
                block.num     = 1;

                block.key = new byte[protocol.HFREADER_ISO14443A_LEN_M1_KEY];

                if (protocol.tagMode == 0)
                {
                    Array.Copy(protocol.block32Key, block.key, protocol.HFREADER_ISO14443A_LEN_M1_KEY);
                    block.keyType = 0x60;
                }
                else
                {
                    Array.Copy(protocol.block32Key, protocol.HFREADER_ISO14443A_LEN_M1BLOCK - protocol.HFREADER_ISO14443A_LEN_M1_KEY, block.key, 0, protocol.HFREADER_ISO14443A_LEN_M1_KEY);
                    block.keyType = 0x61;
                }
                byte[] pTxFrame = new byte[0x400];
                byte[] pRxFrame = new byte[0x400];

                protocol.iso14443AAuthReadM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                errorCode = (int)block.result.errType;
                //saveLog(QString("Charge readerAuthWriteM1Block:err=%1 errorCode=%2").arg(err, 2, 16, QLatin1Char('0')).arg(errorCode, 2, 16, QLatin1Char('0')));
                if (block.result.flag == 0)
                {
                    //扣费
                    int d = Marshal.ReadInt32(block.block, 0);

                    if (d > 0)
                    {
                        int m1 = chargeMoney;
                        errorCode = 0;

                        d -= m1;

                        Marshal.WriteInt32(block.block, 0, d);
                        Marshal.WriteInt32(block.block, 4, ~d);
                        if (protocol.tagMode == 1)
                        {
                            Marshal.WriteInt32(block.block, 8, d);
                            block.block[12] = 0x20;
                            block.block[13] = 0xDF;
                            block.block[14] = 0x20;
                            block.block[15] = 0xDF;
                        }

                        protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                        errorCode = (int)block.result.errType;
                        //saveLog(QString("Charge readerAuthWriteM1Block:err=%1 errorCode=%2").arg(err, 2, 16, QLatin1Char('0')).arg(errorCode, 2, 16, QLatin1Char('0')));
                        if (block.result.flag == 0)
                        {
                            float f = d / 100.0f;
                            retCharge = "扣费成功!" + f.ToString();
                        }
                        else
                        {
                            throw new Exception("扣费失败!");
                        }
                    }
                    else
                    {
                        throw new Exception("欠费卡,请充值!");
                    }
                }
                ret1 = CloseUsb(comHandle);
            }
            else
            {
                throw new Exception("扣费金额不可以是0元!");
            }
            Trace.WriteLine("leave consump:" + retCharge);

            return(retCharge);
        }
예제 #7
0
        public static string NewCard(string cardid, string userpass, bool pKeyCheck)
        {
            Trace.WriteLine("enter NewCard");
            string retCard   = cardid;
            int    comHandle = OpenUsb();

            GetConfig(comHandle);


            SetConfig(comHandle);

            int    ret1;
            string uid;

            GetUID(comHandle, out ret1, out uid);
            if (string.IsNullOrEmpty(uid))
            {
                GetUID(comHandle, out ret1, out uid);
            }
            if (string.IsNullOrEmpty(uid))
            {
                throw new Exception("无法获取uid");
            }

            byte[] p = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };

            byte[] pwd = new byte[protocol.HFREADER_ISO14443A_LEN_M1_KEY];
            Array.Copy(p, 0, pwd, 0, Math.Min(p.Length, protocol.HFREADER_ISO14443A_LEN_M1_KEY));

            if (comHandle > 0)
            {
                byte[] pTxFrame = new byte[0x400];
                byte[] pRxFrame = new byte[0x400];

                ISO14443A_BLOCKPARAM block = new ISO14443A_BLOCKPARAM();
                block.uid     = new ISO14443A_UID();
                block.uid.uid = new byte[10];
                block.key     = new byte[protocol.HFREADER_ISO14443A_LEN_M1_KEY];
                pwd.CopyTo(block.key, 0);
                block.keyType = 0x60;
                block.num     = 1;

                block.addr = 1;
                byte[] bcard = gethexFromeText(cardid);
                block.block = new byte[0xd0];
                bcard.CopyTo(block.block, 0);

                int ret = 0;
                protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                if (block.result.flag == 0)
                {
                    int pos = 0;
                    block.addr         = 16;
                    block.block[pos++] = 0xFF;
                    block.block[pos++] = 0xFF;
                    byte[] bpass = getpassbyteFromeText(userpass);
                    bpass.CopyTo(block.block, pos);
                    pos += protocol.USER_PASSWORD_LENGTH;
                    block.block[pos++] = 0x55;
                    if (pKeyCheck)
                    {
                        block.block[pos++] = 0xAA;
                    }
                    else
                    {
                        block.block[pos++] = 0x55;
                    }
                    block.block[pos++] = 0x01;
                    block.block[pos++] = 0x64;
                    block.block[pos++] = 0xFF;
                    block.block[pos++] = 0xFF;
                    block.block[pos++] = 0xFF;
                    block.block[pos++] = 0xFF;
                    pTxFrame           = new byte[0x400];
                    pRxFrame           = new byte[0x400];

                    protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                    if (block.result.flag == 0)
                    {
                        pos        = 0;
                        block.addr = 32;
                        if (protocol.tagMode == 0)
                        {
                            block.block[pos++] = 0x00;
                            block.block[pos++] = 0x00;
                            block.block[pos++] = 0x00;
                            block.block[pos++] = 0x00;
                            block.block[pos++] = 0xFF;
                            block.block[pos++] = 0xFF;
                            block.block[pos++] = 0xFF;
                            block.block[pos++] = 0xFF;
                            block.block[pos++] = 0xFF;
                            block.block[pos++] = 0xFF;
                            block.block[pos++] = 0xFF;
                            block.block[pos++] = 0xFF;
                            block.block[pos++] = 0xFF;
                            block.block[pos++] = 0xFF;
                            block.block[pos++] = 0xFF;
                            block.block[pos++] = 0xFF;
                        }
                        else
                        {
                            block.block[pos++] = 0x00;
                            block.block[pos++] = 0x00;
                            block.block[pos++] = 0x00;
                            block.block[pos++] = 0x00;
                            block.block[pos++] = 0xFF;
                            block.block[pos++] = 0xFF;
                            block.block[pos++] = 0xFF;
                            block.block[pos++] = 0xFF;
                            block.block[pos++] = 0x00;
                            block.block[pos++] = 0x00;
                            block.block[pos++] = 0x00;
                            block.block[pos++] = 0x00;
                            block.block[pos++] = 0x20;
                            block.block[pos++] = 0xDF;
                            block.block[pos++] = 0x20;
                            block.block[pos++] = 0xDF;
                        }
                        pTxFrame = new byte[0x400];
                        pRxFrame = new byte[0x400];

                        protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                        if (block.result.flag != 0)
                        {
                            throw new Exception("写金额失败!");                 //QMessageBox::information(this, QString(tr("提示")), QString(tr("写金额失败!")));
                            ret = 1;
                        }
                    }
                    else
                    {
                        throw new Exception("写用户密码失败!");
                        //QMessageBox::information(this, QString(tr("提示")), QString(tr("写用户密码失败!")));
                        ret = 1;
                    }
                }
                else
                {
                    throw new Exception("写卡号失败!");
                    //QMessageBox::information(this, QString(tr("提示")), QString(tr("写卡号失败!")));
                    ret = 1;
                }


                if (ret == 0)
                {
                    pwd.CopyTo(block.key, 0);
                    block.keyType = 0x60;
                    block.num     = 1;

                    block.addr = 3;
                    Array.Copy(protocol.block1Key, 0, block.block, 0, protocol.HFREADER_ISO14443A_LEN_M1BLOCK);
                    pTxFrame = new byte[0x400];
                    pRxFrame = new byte[0x400];

                    protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                    if (block.result.flag != 0)
                    {
                        throw new Exception("修改卡号区密码失败!");
                        //QMessageBox::information(this, QString(tr("提示")), QString(tr("修改卡号区密码失败!")));
                        ret = 1;
                    }
                    else
                    {
                        block.addr = 19;
                        Array.Copy(protocol.block16Key, 0, block.block, 0, protocol.HFREADER_ISO14443A_LEN_M1BLOCK);
                        pTxFrame = new byte[0x400];
                        pRxFrame = new byte[0x400];
                        protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                        if (block.result.flag != 0)
                        {
                            throw new Exception("修改用户密码区密码失败!");
                            //QMessageBox::information(this, QString(tr("提示")), QString(tr("修改用户密码区密码失败!")));
                            ret = 1;
                        }
                        else
                        {
                            block.addr = 35;
                            Array.Copy(protocol.block32Key, 0, block.block, 0, protocol.HFREADER_ISO14443A_LEN_M1BLOCK);
                            pTxFrame = new byte[0x400];
                            pRxFrame = new byte[0x400];
                            protocol.iso14443AAuthWriteM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
                            if (block.result.flag != 0)
                            {
                                throw new Exception("修改金额区密码失败!");
                                //QMessageBox::information(this, QString(tr("提示")), QString(tr("修改金额区密码失败!")));
                                ret = 1;
                            }
                        }
                    }
                }
            }
            else
            {
                throw new Exception("初始化HFreader失败!");
            }
            ret1 = CloseUsb(comHandle);
            Trace.WriteLine("leave NewCard:" + retCard);


            return(retCard);
        }
예제 #8
0
        public static CardInfo ReadCardInfo()
        {
            string cardId;
            bool   bLockCard;
            bool   enableKey;
            int    money;
            int    factoryType;
            string softVersion;
            string userPass;

            int comHandle = OpenUsb();

            GetConfig(comHandle);


            SetConfig(comHandle);

            int    ret1;
            string uid;

            GetUID(comHandle, out ret1, out uid);
            if (string.IsNullOrEmpty(uid))
            {
                GetUID(comHandle, out ret1, out uid);
            }
            if (string.IsNullOrEmpty(uid))
            {
                throw new Exception("无法获取uid");
            }

            ISO14443A_BLOCKPARAM block = new ISO14443A_BLOCKPARAM();

            block.block   = new byte[0xd0];
            block.uid.uid = new byte[10];
            block.key     = new byte[protocol.HFREADER_ISO14443A_LEN_M1_KEY];
            block.num     = 1;

            block.addr = 1;
            if (protocol.tagMode == 0)
            {
                block.keyType = 0x60;
                //memcpy(block.key, block1Key, HFREADER_ISO14443A_LEN_M1_KEY);
                Array.Copy(protocol.block1Key, block.key, protocol.HFREADER_ISO14443A_LEN_M1_KEY);
            }
            else
            {
                block.keyType = 0x61;
                //memcpy(block.key, block1Key + HFREADER_ISO14443A_LEN_M1BLOCK - HFREADER_ISO14443A_LEN_M1_KEY, HFREADER_ISO14443A_LEN_M1_KEY);
                Array.Copy(protocol.block1Key, protocol.HFREADER_ISO14443A_LEN_M1BLOCK - protocol.HFREADER_ISO14443A_LEN_M1_KEY, block.key, 0, protocol.HFREADER_ISO14443A_LEN_M1_KEY);
            }
            protocol.iso14443AAuthReadM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
            if (block.result.flag > 0)
            {
                throw new Exception("读取卡号失败!");
            }
            else
            {
                cardId = getTextFromeHex(block.block, protocol.HFREADER_ISO14443A_LEN_M1BLOCK);
                //int i = 0;
                //for(i = 0; i < HFREADER_ISO14443A_LEN_M1BLOCK; i++)
                //{
                //    if(block.block[i] > 9)
                //    {
                //        if(bDisplayErrorInf)
                //        {
                //            QMessageBox::information(this, QString(tr("提示")), QString(tr("卡号错误,请先退卡!")));
                //        }
                //        return -2;
                //    }
                //}
                //getTextFromeDec(block.block, HFREADER_ISO14443A_LEN_M1BLOCK, cardId);
            }


            block.addr = 16;
            if (protocol.tagMode == 0)
            {
                block.keyType = 0x60;
                //memcpy(block.key, block16Key, HFREADER_ISO14443A_LEN_M1_KEY);
                Array.Copy(protocol.block16Key, block.key, protocol.HFREADER_ISO14443A_LEN_M1_KEY);
            }
            else
            {
                block.keyType = 0x61;
                //emcpy(block.key, block16Key + HFREADER_ISO14443A_LEN_M1BLOCK - HFREADER_ISO14443A_LEN_M1_KEY, HFREADER_ISO14443A_LEN_M1_KEY);
                Array.Copy(protocol.block16Key, protocol.HFREADER_ISO14443A_LEN_M1BLOCK - protocol.HFREADER_ISO14443A_LEN_M1_KEY, block.key, 0, protocol.HFREADER_ISO14443A_LEN_M1_KEY);
            }
            protocol.iso14443AAuthReadM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
            if (block.result.flag > 0)
            {
                throw new Exception("读取卡状态失败!");
            }
            else
            {
                userPass = getUserPassFromHex(block.block, 8);
                if (block.block[8] == 0xAA)
                {
                    bLockCard = true;
                }
                else
                {
                    bLockCard = false;
                }

                if (block.block[9] == 0xAA)
                {
                    enableKey = true;
                }
                else
                {
                    enableKey = false;
                }
                factoryType = block.block[10];
                softVersion = (Convert.ToInt32(block.block[11]) / 100f).ToString("0.00");
            }

            block.addr = 32;
            if (protocol.tagMode == 0)
            {
                block.keyType = 0x60;
                //memcpy(block.key, block32Key, HFREADER_ISO14443A_LEN_M1_KEY);
                Array.Copy(protocol.block32Key, block.key, protocol.HFREADER_ISO14443A_LEN_M1_KEY);
            }
            else
            {
                block.keyType = 0x61;
                //memcpy(block.key, block32Key + HFREADER_ISO14443A_LEN_M1BLOCK - HFREADER_ISO14443A_LEN_M1_KEY, HFREADER_ISO14443A_LEN_M1_KEY);
                Array.Copy(protocol.block32Key, protocol.HFREADER_ISO14443A_LEN_M1BLOCK - protocol.HFREADER_ISO14443A_LEN_M1_KEY, block.key, 0, protocol.HFREADER_ISO14443A_LEN_M1_KEY);
            }
            protocol.iso14443AAuthReadM1Block(comHandle, 0, 1, ref block, IntPtr.Zero, IntPtr.Zero);
            if (block.result.flag > 0)
            {
                throw new Exception("读取卡余额失败!");
            }
            else
            {
                int  money1 = block.block[0] + (block.block[1] << 8) + (block.block[2] << 16) + (block.block[3] << 24);
                int  money2 = block.block[4] + (block.block[5] << 8) + (block.block[6] << 16) + (block.block[7] << 24);
                int  money3 = block.block[8] + (block.block[9] << 8) + (block.block[10] << 16) + (block.block[11] << 24);
                byte addr1  = block.block[12];
                byte addr2  = block.block[13];
                byte addr3  = block.block[14];
                byte addr4  = block.block[15];


                //UCHAR moneyArray[4] = {0};
                //unsigned int d1 = 0, d2 = 0, d3 = 0;
                //UCHAR addr1 = 0, addr2 = 0, addr3 = 0, addr4 = 0;
                //float m = 0;

                //memcpy(moneyArray, block.block + 0, 4);
                //d1 = *((unsigned int *)(moneyArray));
                //memcpy(moneyArray, block.block + 4, 4);
                //d2 = *((unsigned int *)(moneyArray));
                //memcpy(moneyArray, block.block + 8, 4);
                //d3 = *((unsigned int *)(moneyArray));
                //byte addr1 = block.block[12];
                //byte addr2 = block.block[13];
                //byte addr3 = block.block[14];
                //byte addr4 = block.block[15];

                if (protocol.tagMode == 0)
                {
                    if (money1 != (~money2))
                    {
                        throw new Exception("金额错误,请先退卡!");
                    }
                }
                else
                {
                    //unsigned int d22 = ~d2;
                    //UCHAR addr22 = ~addr2;
                    if ((money1 != (~money2)) || (money1 != money3) || (addr1 != 0x20) || (addr2 != 0xdf) || (addr3 != 0x20) || (addr4 != 0xdf))
                    {
                        throw new Exception("金额错误,请先退卡!");
                    }
                }
                money = money1;
            }
            CloseUsb(comHandle);
            CardInfo info = new CardInfo()
            {
                cardId      = cardId,
                money       = money,
                bLockCard   = bLockCard,
                enableKey   = enableKey,
                factoryType = factoryType,
                softVersion = softVersion,
                userPass    = userPass,
            };

            return(info);
        }