首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取PCSC异常0x8010002f

获取PCSC异常0x8010002f
EN

Stack Overflow用户
提问于 2015-03-12 17:12:19
回答 1查看 2.8K关注 0票数 0
代码语言:javascript
复制
/**
 * 
 */
package testing;

import javacard.framework.APDU;
import javacard.framework.ISO7816;
import javacard.framework.Applet;
import javacard.framework.ISOException;
import javacard.framework.OwnerPIN;
import javacard.framework.Util;
/**
 * @author amitp
 *
 */
public class Testing extends Applet {

    final static byte CLASS_ONE                 = (byte) 0x00;
    final static byte CLASS_TWO                 = (byte) 0xA0;
    final static byte INS_VERIFY                = (byte) 0x20;  
    final static byte INS_SEL_APPLET            = (byte) 0x04;
    final static byte SELECT                    = (byte) 0xA4;


    final static byte[] PIN_NO      = { (byte) 0x11, (byte) 0x22,(byte) 0x33,(byte) 0x44};
    final static byte[] APPLET_ID      = { (byte) 0XAA,(byte)0XBB,(byte)0XCC,(byte)0XDD,(byte) 0XEE }; 

    final static short RES_FIRST_CMD      =  0x6099;
    final static short SW_AUTHENTICATION_METHOD_BLOCKED  =  0x1300;
     static OwnerPIN pin;

    public static void install(byte[] bArray, short bOffset, byte bLength) {
        // GP-compliant JavaCard applet registration
        pin = new OwnerPIN((byte) 0X03,(byte) 0x04);
        pin.update(PIN_NO, (short) 0, (byte) 0x04);
        new testing.Testing().register(bArray, (short) (bOffset + 1),
                bArray[bOffset]);
    }

    public void process(APDU apdu) {
        // Good practice: Return 9000 on SELECT
        if (selectingApplet()) {
            return;
        }

        byte[] buf = apdu.getBuffer();
        switch (buf[ISO7816.OFFSET_INS]) {
        case (byte) 0xA4:
            if(buf[ISO7816.OFFSET_CLA]!=(byte) 0xA0)
                ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
            else
            {
                short byte_read=(short)(apdu.setIncomingAndReceive());
                byte x = Util.arrayCompare(buf, ISO7816.OFFSET_CDATA, APPLET_ID, (short)0 , byte_read);
                if(x!= (byte) 0x00)
                {
                    ISOException.throwIt(ISO7816.SW_FILE_NOT_FOUND);
                }
                else
                {
                    ISOException.throwIt(RES_FIRST_CMD);
                }
            }

            break;
        case (byte) 0x20:
            varify(apdu);
        break;
        default:
            // good practice: If you don't know the INStruction, say so:
            ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
        }
    }
    private void varify(APDU apdu)
    {
        if(pin.getTriesRemaining()==0)
            ISOException.throwIt(SW_AUTHENTICATION_METHOD_BLOCKED);
        byte[] buffer = apdu.getBuffer();
        //short len_of_LC_byte = buffer[ISO7816.OFFSET_LC];
        //if( len_of_LC_byte !=5)
            //ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
        byte byte_read=(byte)(apdu.setIncomingAndReceive());
        if(pin.check(buffer, ISO7816.OFFSET_CDATA,byte_read)== false)
            ISOException.throwIt(ISO7816.SW_SECURITY_STATUS_NOT_SATISFIED);


    }
}

我正在使用JCOP工具,所以在java中加载它,card.It成功地加载到卡中,但是当我在上面发送命令时,Select给出了9000,而其他命令给出了;

代码语言:javascript
复制
jcshell: Error code: -7fefffd1 (0x8010002F)
jcshell: Command failed: SCardTransmit(): 0x8010002f, PCSC failed with 0x8010002F: 0x2F (Warning,--,(SCard))

当我使用Gpshell时,我会收到如下错误:

代码语言:javascript
复制
send_APDU() returns 0x8010002F (A communications error with the smart card has been detected. Retry the operation. 

在调试模式下,所有的结果都很好。有人能告诉我我做错了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-30 06:07:20

我在is 7816-3中发现,"Sw1 =60是空字节,它不要求对数据传输采取任何行动“。这是通讯错误的原因..。当我尝试9000时,相同的代码在模拟器和真正的card...thanks中都很好用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29016120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档