Получение исключения PCSC 0x8010002f

/**
 * 
 */
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. Он успешно загружается на карту, но когда я отправляю на него команду, Select APPLET дает 9000, но дает другую команду;

jcshell: Error code: -7fefffd1 (0x8010002F)
jcshell: Command failed: SCardTransmit(): 0x8010002f, PCSC failed with 0x8010002F: 0x2F (Warning,--,(SCard))

и когда я использую Gpshell, я получаю сообщение об ошибке, например:

send_APDU() returns 0x8010002F (A communications error with the smart card has been detected. Retry the operation. 

В режиме отладки все идет хорошо. Может ли кто-нибудь сказать мне, где я делаю ошибку???


person Arjun    schedule 12.03.2015    source источник
comment
Мне нужно вернуть какое-то проприетарное слово состояния, я думаю, что могу вернуть любое 2-байтовое значение.   -  person Arjun    schedule 12.03.2015
comment
Почему вы называете pin = new OwnerPIN((byte) 0X03,(byte) 0X0a); каждый раз, когда выбирается ваш апплет?! У вас очень скоро закончится EEPROM.   -  person vojta    schedule 13.03.2015
comment
Вы должны вызвать apdu.setIncomingAndReceive(), прежде чем прикасаться к части данных вашего APDU.   -  person vojta    schedule 13.03.2015
comment
Привет, Войта, Могу ли я поставить строки pin = new OwnerPIN ((byte) 0X03, (byte) 0X0a); pin.update(PIN_NO, (короткий) 0, (байт) 0x08); внутри метода установки? это было бы хорошо?   -  person Arjun    schedule 13.03.2015
comment
Не могли бы вы уточнить еще немного? Для APDU A0A40000023F00 я хочу вернуть какой-то проприетарный sw1sw2, поэтому я просто проверяю его с помощью функции arraycompare и возвращаю то, что мне нужно.   -  person Arjun    schedule 13.03.2015
comment
да, вы должны создать свой экземпляр PIN-кода только один раз, метод установки подходит. Вы определенно не хотите сбрасывать счетчик PIN-кода и значение каждый раз, когда ваш апплет выбран.   -  person vojta    schedule 13.03.2015
comment
Вы должны вызвать apdu.setIncomingAndReceive() перед касанием CDATA APDU. Это механизм безопасности. Вы должны проверить CLA, затем INS, затем P1P2 и после этого вы должны вызвать apdu.setIncomingAndReceive(), чтобы начать работу с частью данных.   -  person vojta    schedule 13.03.2015
comment
Хорошо, я попробую это. Я надеюсь, что это сработает для меня .. Спасибо   -  person Arjun    schedule 14.03.2015
comment
все еще получаю ту же ошибку...   -  person Arjun    schedule 16.03.2015
comment
Не могли бы вы обновить свой код в своем вопросе?   -  person vojta    schedule 16.03.2015
comment
код отредактирован... пожалуйста, проверьте vojta   -  person Arjun    schedule 17.03.2015
comment
привет Войта, любое обновление, пожалуйста..   -  person Arjun    schedule 20.03.2015
comment
Строка ISOException.throwIt((short) 0x6099); недоступен, верно?   -  person vojta    schedule 25.03.2015
comment
И метод varify тоже? Пожалуйста, удалите весь ненужный код... И выложите весь исходный код вашего апплета.   -  person vojta    schedule 25.03.2015
comment
vojta, теперь загрузите сюда весь код. Пожалуйста, проверьте, почему получение send_APDU() возвращает 0x8010002F (обнаружена ошибка связи со смарт-картой. Повторите операцию.   -  person Arjun    schedule 25.03.2015
comment
Не могли бы вы также опубликовать конкретный APDU, который возвращает ошибку?   -  person vojta    schedule 25.03.2015
comment
После команды установки я сначала выбираю апплет, он дает 9000, но когда я запускаю здесь A0A4000005aabbccddee, я получаю эту ошибку...   -  person Arjun    schedule 25.03.2015
comment
если хотите, я могу поделиться своим скриптом gpshell вместе с логом   -  person Arjun    schedule 25.03.2015
comment
Я протестировал ваш апплет, и он отлично работает на моем компьютере как в эмуляторе, так и на реальной карте JCOP... Когда я отправляю A0A4000005aabbccddee, он возвращает 6099, как и ожидалось. Должна быть проблема с картридером. Пожалуйста, попробуйте еще раз с другим устройством чтения карт, если это возможно.   -  person vojta    schedule 26.03.2015
comment
Вы также должны реализовать AppletEvent и в методе удаления установить для всех ваших статических полей значение null, иначе вы не сможете удалить свой апплет с карты...   -  person vojta    schedule 26.03.2015
comment
Я нашел в ISO7816-3, Sw1 = 60 является НУЛЕВЫМ байтом, он не требует никаких действий при передаче данных. это было причиной ошибки связи.. когда я попробовал 9000, тот же код хорошо работает в симуляторе и на реальной карте... спасибо Войта за вашу поддержку   -  person Arjun    schedule 30.03.2015


Ответы (1)


Я нашел в ISO7816-3: «Sw1 = 60 — это байт NULL, он не требует никаких действий при передаче данных». это было причиной ошибки связи.. когда я попробовал 9000, тот же код хорошо работает в симуляторе и на реальной карте... спасибо за все

person Arjun    schedule 30.03.2015