2012-07-02 12 views
7

पढ़ने के लिए मैं एक स्मार्ट कार्ड (German Gesundheitskarte)उपयोग पढ़ें बायनरी अधिक से 256 बाइट्स

javax.smartcardio का उपयोग कर एफई "पीडी" की definition में पढ़ने के लिए कोशिश कर रहा हूँ इसकी लंबाई 850 बाइट्स के रूप में निर्दिष्ट किया जाता है। सामग्री एक gzipped ISO5589-15 इनकोडिंग एक्सएमएल स्ट्रिंग निर्दिष्ट के रूप में here

होना चाहिए CommandAPDU जैसा कि मैंने

00 B0 00 00 00 

पहले 256 बाइट्स प्राप्त करने के लिए भेज देते हैं।

00 B0 00 FF 00 

भेजने के बाद मैं अगले 256 बाइट्स मिलता है।

लेकिन मैं बाकी कैसे प्राप्त करूं?

बाइनरी डेटा समाप्त होने पर मुझे कैसे पता चलेगा?

German Specification Part 1 | हालांकि उच्चतम बिट संकेत मिलता है कि आप किसी दिए गए SFI के साथ कुछ का चयन करना चाहते प्रयोग किया जाता है German Specification Part 2

उत्तर

8

READ BINARY APDUs ऑफसेट फ़ाइल, P1 और P2 में कोडित के लिए बाइट्स अनुमति देते हैं, और जवाब में बाइट की संख्या लंबाई के लिए Le उपयोग करते हैं, READ BINARY के लिए। पी 1 उच्च बाइट, या सबसे महत्वपूर्ण बाइट है। हालांकि पी 1 का सबसे ऊपर बिट यह इंगित करने के लिए आरक्षित है कि पी 1 में लघु फ़ाइल पहचानकर्ता भी शामिल है। यह मूल्य 0 पर रहना चाहिए यदि आप पहले से ही एक फ़ाइल पढ़ रहे हैं, एक अधिकतम 32Ki की भरपाई के साथ छोड़ - 1.

मैं चश्मा है कि आप लिंक करने के बाद नहीं पढ़ सकते हैं लेकिन पर कि READ BINARY APDU मान लें आपके कार्ड एक ही तरीके से काम करता है।

पहले 256 बाइट पढ़ने के लिए आपका आदेश सही लगता है, यह नोट करते हुए कि Le==0x00 256 बाइट्स के लिए एक पठन इंगित करता है।

पढ़ने के लिए बाइट्स ऑफसेट में शुरुआत 256, 512, आदि, incrementing P1 शुरू करते हैं, उदाहरण के लिए:

00 B0 01 00 00 
00 B0 02 00 00 
00 B0 03 00 00 

पढ़ने के लिए 256 बाइट्स में ऑफसेट 257 (0x101) शुरुआत:

00 B0 01 01 00 

ऑफसेट 600 (0x258):

00 B0 02 58 00 

अपने कोड में, आप स्टोर करने के लिए ऑफसेट जावा int उपयोग कर रहे हैं, आप आमतौर पर कुछ इस तरह के साथ P1 incrementing खत्म करेंगे:

int offset; 
int P1, P2; 

while (continueReading) 
{ 
    // ... 
    P1 = (offset >> 8) & 0xFF; 
    P2 = offset & 0x00FF; 
    // ... 
    // send APDU 
} 

कैसे एक फ़ाइल के आकार का संकेत मिलता है कार्यान्वयन पर निर्भर करता है। आम तौर पर आप ईएफ (00 A4 00 00 02 fileId) पर एक चयन द्वारा लौटाए गए फ़ाइल नियंत्रण सूचना (एफसीआई) संरचना से फ़ाइल आकार प्राप्त कर सकते हैं। फ़ाइल के आकार को फ़ाइल की सामग्री में भी एम्बेड किया जा सकता है। यदि संभव हो तो आपको फ़ाइल के आकार को बताने के लिए आपको स्टेटस शब्दों पर भरोसा नहीं करना चाहिए।


अलावा: Le, Ne और अजीब आईएनएस

यह महत्वपूर्ण है कि आप केवल वृद्धि बाइट्स की राशि है कि आप वास्तव में प्रतिक्रिया डेटा (RDATA) के भीतर प्राप्त साथ ऑफसेट। ध्यान दें कि यदि P3 = Le Le Le enc encodes, जो अधिकतम प्रतिक्रिया डेटा का आकार है। आप उससे कम प्राप्त कर सकते हैं।

तो फ़ाइल आकार 32Ki है या अधिक है तो आप अजीब आईएनएस (B7) के साथ पठित बायनरी का उपयोग करने के 32Ki उपरोक्त डेटा पढ़ने की जरूरत है। उस मामले में आरडीएटीए में ओवरहेड भी हो सकता है। जाहिर है कि - बदले में - ऑफ़सेट गणनाओं और फ़ाइल के अंत में पढ़ने के लिए गणना को प्रभावित कर सकता है।

+1

पी 3 पढ़ने के लिए बाइट्स की संख्या नहीं है। इसमें ले है, जो एपीडीयू प्रतिक्रिया में वापस आने के लिए बाइट्स की अधिकतम संख्या का एन्कोडिंग है। यह * लगभग * वही है। –

+1

इस बात पर निर्भर करता है कि आप वास्तव में कौन पूछते हैं। मैंने जीएसएम चश्मे के साथ बहुत अधिक समय बिताया, जहां 'पी 3' = लंबाई, लेकिन आप बिंदु अभी भी एक अच्छा है, ज्यादातर लोग' ले 'और यह _is_ स्पष्ट का उपयोग करते हैं। – pb2q

+1

यह आपके रुख पर हमले के रूप में नहीं था। समस्या यह है कि विनिर्देशों के कई निर्माता अंतर को समझ नहीं पाते हैं, इसलिए डिफ़ॉल्ट रूप से यह दोनों में से एक बन गया है (या कभी-कभी दोनों का मिश्रण)। –

4

ऑफसेट, P1 & P2 में है। तो आप बाइट्स के लिए P1 का भी उपयोग कर सकते हैं। उसके बाद आपको READ BINARY with an odd INS (B1) की ओर बढ़ना होगा।

तो आप सामान्य पढ़ने वाली बाइनरी का उपयोग करके 2^15 - 1 बाइट तक पढ़ सकते हैं। यह 32 किलो है - 1. और निश्चित रूप से एपीडीयू द्वारा लौटा बाइट्स के कारण अतिरिक्त कुछ बाइट्स।

मैं हमेशा निम्न विधि का उपयोग कर स्मार्ट कार्ड से फ़ाइलों को पढ़ता हूं: 1 फ़ाइल आकार निर्धारित करें, उदा। फ़ाइल आईडी (00 A4 02 00 02 ${FILE_ID}) द्वारा एक चयन के साथ लौटाए गए एफसीआई (फ़ाइल नियंत्रण सूचना) का उपयोग करके, आपको प्रतिक्रिया को पार्स करने की आवश्यकता है। फिर की संख्या से ऑफ़सेट बढ़ाएं प्रत्येक बार बाइट लौटाएं। अधिकतम फ़ाइल आकार से अधिक कभी नहीं पूछें, क्योंकि अधिकांश कार्डों का व्यवहार अलग-अलग होता है, परिभाषित नहीं किया जाता है या केवल सादा गलत होता है)।

उन्नत विषय: यदि आप READ BINARY with ODD INS का उपयोग करते हैं, तो आपको ऑफ़सेट बढ़ाने पर प्रत्येक बार DO के शीर्षलेख को प्रतिस्थापित करने की आवश्यकता होती है। उस स्थिति में अंत तक पढ़ना थोड़ा परेशान हो जाता है क्योंकि आपको Le बाइट पर शीर्षलेख का ओवरहेड जोड़ना होगा।

+1

ध्यान दें कि यह जानकारी आईएसओ 7816-4 में पाई जा सकती है। यह पेवेयर है लेकिन आम तौर पर आप लागत के बिना अवैध रूप से स्पेस पा सकते हैं, या आप अन्य libs से जानकारी निकाल सकते हैं। यदि आप वाणिज्यिक सॉफ्टवेयर बना रहे हैं, तो स्पेक खरीदें! –

0

यदि कार्ड इसका समर्थन करता है तो आप शायद विस्तारित लंबाई प्रारूप का उपयोग कर सकते हैं। यदि आप एलसी/ली फ़ील्ड में 00 निर्दिष्ट करते हैं तो आप लंबाई के लिए दो निम्नलिखित बाइट्स का उपयोग कर सकते हैं

0

आईएमओ के लिए एक छोटा सा अतिरिक्त मार्टिन बोडवेस द्वारा बड़ी फ़ाइलों को पढ़ने के बारे में बहुत उपयोगी उत्तर, और विस्तारित ले का उपयोग करने के लिए स्टाजो द्वारा सुझाव । मुझे आशा है कि यह दूसरों को कुछ समय और प्रयास बचाएगा।

लंबे पढ़ता के लिए Le उपयोग करने के लिए कोशिश कर रहा मुश्किल है:

  • विस्तारित Le बढ़ाया का उपयोग करने नियंत्रण रेखा के साथ-साथ की आवश्यकता है।
  • विस्तारित एलसी मानक के अनुसार 0 नहीं होना चाहिए, इसलिए आप ऑफ़सेट 0
  • और यदि आपका एलसी 0 नहीं है, तो आपको "बी 1" आईएनएस का उपयोग करने की आवश्यकता है।
  • बी 1 फिर सही आकारों की गणना करने के लिए थोड़ा और जटिल बनाता है, क्योंकि मार्टिन बोडवेस ने समझाया।

कि करने के लिए इसके अलावा, आप कार्ड विस्तारित नियंत्रण रेखा/Le समर्थन करता है, पहली कि क्या सब पर पता लगाने के लिए की जरूरत है; इसके बारे में जानकारी एटीआर ऐतिहासिक बाइट्स, ईएफ.एटीआर, और वर्तमान ईएफ जानकारी पर फैली हुई है।

इसलिए सिद्धांत में एक फ़ाइल से डेटा के बड़े बैचों को पढ़ने के लिए यह संभव है, लेकिन अभ्यास में यह बहुत प्रयास है, और आप पूरी फ़ाइल को एक कमांड के साथ पढ़ नहीं सकते हैं।

पढ़ने के लिए विस्तारित ले का उपयोग करने के प्रयास करने से पहले ऊपर विचार करें।

संबंधित मुद्दे