java - मैं जावा से ईएमवी स्मार्टकार्ड से पैन कैसे पढ़ सकता हूं?




smartcard apdu (4)

स्मार्ट कार्ड रीडर के साथ मुझे मेस्ट्रो / मास्टरकार्ड से अकाउंट नंबर पढ़ने की आवश्यकता है I मैं जावा 1.6 और उसके javax.smartcardio पैकेज का उपयोग कर रहा हूँ। मुझे एपीडीयू कमांड भेजने की ज़रूरत है जो कार्ड नंबर के लिए कार्ड नंबर पर ईएमवी आवेदन संग्रहित करेगा। समस्या यह है, मुझे एपीडीयू कमांड का निर्माण करने के लिए नियमित बाइट सरणी नहीं मिल रही है जो कि कहीं भी आवश्यक डेटा वापस करेगा ...


आपको कमांडएपीडीयू ऑब्जेक्ट का निर्माण करने की आवश्यकता है और इसे ट्रांसमिट () - कमांड पर पास करें।

आपको अपने स्मार्टकार्ड के दस्तावेज में सटीक आदेश प्राप्त करने में सक्षम होना चाहिए, लेकिन यह एक उदाहरण है:

byte[] readFile(CardChannel channel) throws CardException {
  CommandAPDU command = new CommandAPDU(0xB0, 0x60, 0x10, 0x00);
  ResponseAPDU response = channel.transmit(command);
  return response.getData();
}

क्या आपने अपने दस्तावेज में देखने का प्रयास किया था जो 0x6D00 का मतलब है? ऐसा लगता है कि इसका अर्थ हो सकता है कि ENVELOPE आदेश समर्थित नहीं है। क्या आपने टी = 1 के बजाय टी = 0 प्रोटोकॉल का उपयोग करने की कोशिश की है?

मैं अपने उदाहरण के लिए अपने कार्ड पर काम करने की उम्मीद नहीं करता। मैं नहीं जानता कि कौन से APDU मेस्ट्रो / मास्टरकार्ड का समर्थन करता है, इसलिए मैं आपको एक काम उदाहरण नहीं दे सकता।

आदेश को इस तरह की एक स्पष्ट उम्मीद की लंबाई देने का प्रयास करें:

byte[] readPan(CardChannel channel) throws CardException {
  CommandAPDU command = new CommandAPDU(0x00, 0xB2, 0x5a, 0x14, 250);
  ResponseAPDU response = channel.transmit(command);
  return response.getData();
}

यहाँ कुछ काम उदाहरण है:

CardChannel channel = card.getBasicChannel(); 

 byte[] selectMaestro={(byte)0x00, (byte)0xA4,(byte)0x04,(byte)0x00 ,(byte)0x07 ,(byte)0xA0 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x04 ,(byte)0x30 ,(byte)0x60 ,(byte)0x00};
  byte[] getProcessingOptions={(byte)0x80,(byte)0xA8,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x83,(byte)0x00,(byte)0x00};
  byte[] readRecord={(byte)0x00,(byte)0xB2,(byte)0x02,(byte)0x0C,(byte)0x00};

  ResponseAPDU r=null;

   try {
     ATR atr = card.getATR(); //reset kartice

      CommandAPDU capdu=new CommandAPDU( selectMaestro   );

       r=card.getBasicChannel().transmit( capdu );

      capdu=new CommandAPDU(getProcessingOptions);
      r=card.getBasicChannel().transmit( capdu );


      capdu=new CommandAPDU(readRecord);
      r=card.getBasicChannel().transmit( capdu );

यह मेस्ट्रो कार्ड के साथ काम करता है, मैं पैन नंबर पढ़ सकता हूं, लेकिन अब मुझे मास्टरकार्ड का पैन नंबर पढ़ने की आवश्यकता है। मुझे नहीं पता कि मुझे पढ़ने के रिकॉर्ड एपीडीयू को बदलना चाहिए या एपीडीयू का चयन करना चाहिए। APDUs से परिचित कोई भी?


atr = open();
prints(atr);

prints("[Step 1] Select 1PAY.SYS.DDF01 to get the PSE directory");
cmd = new ISOSelect(ISOSelect.SELECT_AID, EMV4_1.AID_1PAY_SYS_DDF01);
card_response = execute(cmd);
prints(card_response);
SFI = NumUtil.hex2String((byte)((1 < < 3) | 4));

// try SFI 1 record 1
prints("[Step 2] Send READ RECORD with 0 to find out where the record is");
read = new EMVReadRecord(SFI, "01", "00");
card_response = execute(read);
prints(card_response);
byte_size = NumUtil.hex2String(card_response.getStatusWord().getSw2());

prints("[Step 3] Send READ RECORD with 1C to get the PSE data");
read = new EMVReadRecord(SFI, "01", byte_size);
card_response = execute(read);
prints(card_response);
// the AID is A0000000031010
prints("[Step 4] Now that we know the AID, select the application");

cmd = new ISOSelect(ISOSelect.SELECT_AID, "A0000000031010");
card_response = execute(cmd);
prints(card_response);
prints("[Step 5] Send GET PROCESSING OPTIONS command");

cmd = new EMVGetProcessingOptions();
card_response = execute(cmd);
prints(card_response);

// SFI for the first group of AFL is 0C

prints("[Step 6] Send READ RECORD with 0 to find out where the record is");
read = new EMVReadRecord("0C", "01", "00");
card_response = execute(read);
prints(card_response);
byte_size = NumUtil.hex2String(card_response.getStatusWord().getSw2());

prints("[Step 7] Use READ RECORD with the given number of bytes to retrieve the data");
read = new EMVReadRecord("0C", "01", byte_size);
card_response = execute(read);
prints(card_response);

data = new TLV(card_response.getData());

close();




emv