Как заставить PSE карты читать RID или AIP или номер карты

У меня есть смарт-карта, как на изображении ниже. Карта находится в кардридере, который приклеен к серверу. Раньше он аутентифицировал пользователя, прежде чем он мог загрузить данные.

Я пытаюсь получить номер карты, серийный номер или RID смарт-карты. Я могу получить от него ATR помимо другой информации, как показано ниже.

ATR:

 3b 9f 96 c0 0a 31 fe 45 43 54 31 69 0b 01 00 01 00 00 00 00 00 00 00 0d

В этом вопросе

SmartCardIO EMV Reader, найдите мой тип карты только с номером ATR

кто-то упомянул, что AID (Application ID) = RID(Registered Application ID) || PIX (Property Application Extension)

На этой странице объясняется, какая информация имеет ATR.

https://flomio.com/forums/topic/list-of-apdu-codes/

                              Answer-To-Reset (ATR)
Init| T0| TD1| TD2| T1| Tk|  Len |      RID      | Std | Card |  RFU       | TCK
Hdr |   |    |    |   |   |      |               |     | Name |            |   
 3B | 8F| 80 | 01 | 80| 4F|  0C  | A0 00 00 03 06| 03  | 00 03| 00 00 00 00| 68

Когда я пытаюсь получить PSE, я получаю 6a86 также неверный P1/P2. Когда я пытаюсь получить PPSE, я получаю 6700 --> неправильную длину.

command               : 00 A4 04 00 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31
response without data : 6a 86
command               : 00 A4 04 00 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 00
response without data : 67 00

http://techqa.info/programming/question/36297722/SmartCardIO-EMV-Reader--find-my-card-type-with-only-the-ATR-number

Я пробовал и этот вариант:

// byte[] pseFileName = "1PAY.SYS.DDF01".getBytes(); //PSE
byte[] pseFileName = "2PAY.SYS.DDF01".getBytes(); // PPSE
CommandAPDU command = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, pseFileName);

Информация, которую я сейчас получаю:

Terminals list: [PC/SC terminal Generic Smart Card Reader Interface 0]
ATR:  3b 9f 96 c0 0a 31 fe 45 43 54 31 69 0b 01 00 01 00 00 00 00 00 00 00 0d
command               : 00 a4 02 0c 02 00 02
response without data : 90 00
command               : 00 b0 00 00 09
response with data:   : 00 00 01 98 fa 03 16 14 ad
command               : 00 a4 04 0c 06 ff 54 41 43 48 4f
response without data : 90 00
command               : 00 a4 02 0c 02 05 01
response without data : 90 00
command               : 00 b0 00 00 01
response with data:   : 04
command               : 00 22 c1 b6 0a 83 08 00 00 00 05 09 02 ff a1
response without data : 90 00
command               : 00 88 00 00 10 e9 96 79 ec 74 27 e6 50 00 00 00 05 09 02 ff a1 80
response with data:   : 32 a9 bf e6 91 18 8d c8 34 87 d8 c5 6d 78 f3 90 24 db 98 60 37 f0 05 f3 1f 22 24 65 27 90 43 ff 4f ec 4f ae 7c 2e d9 4c 6d a0 bc 14 9a af df fb 81 0b 5a 4f 4d 1d ee df 38 3b 0d dd 63 7d 22 69 77 27 5b f3 0d ce 51 a3 5c fc 7f 4a fc 8c f1 da d9 ce c7 9b a1 23 e0 e6 1d b0 73 e8 3b 4b 8a 60 38 e8 0d ad 30 80 12 ef d3 76 72 75 95 2f af 09 10 e0 37 78 25 84 2e 19 0e 2e 17 9e 9d de 34 b7

Как я могу получить номер Карты (5b) на Карте и RID и AID? Почему я могу получить PSE моей Карты?

введите здесь описание изображения

Код

import java.util.ArrayList;
import java.util.List;

import javax.smartcardio.ATR;
import javax.smartcardio.Card;
import javax.smartcardio.CardChannel;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.CommandAPDU;
import javax.smartcardio.ResponseAPDU;
import javax.smartcardio.TerminalFactory;
import javax.xml.bind.DatatypeConverter;


public class CardIdTest {

    public static void main(String[] args) {

        try {
            TerminalFactory factory = TerminalFactory.getDefault();
            List<CardTerminal> terminals;
            terminals = factory.terminals().list();
            CardTerminal terminal = terminals.get(0);
            Card card = terminal.connect("T=1");
            System.out.println("Terminals list: " + terminals);
            ATR atr = card.getATR();
            byte[] atrArray = atr.getBytes();
            String atrHex = CardIdTest.printData(atrArray);
            System.out.println("ATR: " + atrHex);
            CardChannel channel = card.getBasicChannel();

            String command1 = "00 a4 02 0c 02 00 02"; // select file
            String command2 = "00 b0 00 00 09"; // length 19 works at the end instead of 09. // read binary
            String command3 = "00 a4 04 0c 06 ff 54 41 43 48 4f";
            String command4 = "00 a4 02 0c 02 05 01"; //
            String command5 = "00 b0 00 00 01";
            String command6 = "00 22 c1 b6 0a 83 08 00 00 00 05 09 02 ff a1";
            String command7 = "00 88 00 00 10 e9 96 79 ec 74 27 e6 50 00 00 00 05 09 02 ff a1 80";

            String pseString = "00 A4 04 00 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31";
            String ppseString = "00 A4 04 00 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 00";

            List<String> list = new ArrayList<String>();
            // list.add(command1);
            // list.add(command2);
            // list.add(command3);
            // list.add(command4);
            // list.add(command5);
            // list.add(command6);
            // list.add(command7);
            list.add(pseString);
            list.add(ppseString);

            for (String item : list) {
                String commandWithoutSpace = item.replace(" ", "");
                byte[] apdu = DatatypeConverter.parseHexBinary(commandWithoutSpace);
                CommandAPDU command = new CommandAPDU(apdu);
                ResponseAPDU responseAPDU = channel.transmit(command);
                byte[] reponseData = responseAPDU.getData();
                String response = responseAPDU.toString();
                if (reponseData.length > 0) {
                    String dataHex = CardIdTest.printData(reponseData);
                    System.out.println("command               : " + item);
                    System.out.println("response with data:   :" + dataHex);

                } else {
                    byte[] bytes = responseAPDU.getBytes();
                    String responseHex = CardIdTest.printData(bytes);
                    System.out.println("command               : " + item);
                    System.out.println("response without data :" + responseHex);
                }

            }
            card.disconnect(true); // reset

        } catch (CardException e) {

            e.printStackTrace();
        }

    }


    public static String printData(byte[] byteArray) {
        StringBuilder sb = new StringBuilder();

        for (byte b : byteArray) {
            sb.append(String.format(" %02x", b));
        }
        return sb.toString();

    }

}

Изменить

У меня есть другая карта Driver card, и я могу прочитать номер карты с помощью следующего APDU

    String masterFile = "00 A4 04 0C 06 FF544143484F";
    String elementaryFile = "00 A4 02 0C 02 0520";
    String readBinary = "00 B0 00 01 10"; // B0 read binary; 01 offset 1; 10 decimal equal 16 bytes to read.

Я вставил эту карту в кард-ридер после установки программного обеспечения для карт --> нажмите анализатор --> нажмите тахограф, и я смог прочитать данные карты, такие как идентификаторы «FF544143484F», «0520». Когда я втыкаю карточку компании в кард-ридер --> программа cardpeek --> analayer --> (здесь я не нашел правильную спецификацию, так как я пробовал каждую из них в списке, и я мог просто прочитать ATR, тогда я получаю ошибку 6700)


person Mr Asker    schedule 01.07.2017    source источник
comment
Вы знаете, какой спецификации соответствует карта? Внешний вид не особо помогает, разве что карта кажется бесконтактной, что ставит некоторые знаки вопроса к информации ATR (поскольку скорее всего от драйвера, а не от карты). Поскольку аббревиатура PSE неоднозначна (Payment system environment vs. Portable Security Environment), следует более подробно описать назначение.   -  person guidot    schedule 03.07.2017
comment
@guidot: я добавил отредактированную часть ... пожалуйста, взгляните на нее. Как узнать спецификацию карты компании?   -  person Mr Asker    schedule 07.07.2017