Προγραμματισμός

Έξυπνες κάρτες και το πλαίσιο OpenCard

Την προηγουμενη Προγραμματιστής Java στήλη, "Έξυπνες κάρτες: Ένα αστάρι", έδωσε μια γενική επισκόπηση των έξυπνων καρτών και του τρόπου λειτουργίας τους. Περιέλαβε μια ενότητα σχετικά με τα πρότυπα έξυπνων καρτών, που εισήγαγε την έννοια του OpenCard. Όπως περιγράφεται στο πρώτο άρθρο, το OpenCard είναι ένα ανοιχτό πρότυπο που παρέχει διαλειτουργικότητα εφαρμογών έξυπνης κάρτας σε NCs, τερματικά POS, επιτραπέζιους υπολογιστές, φορητούς υπολογιστές, set top και PDA. Το OpenCard μπορεί να παρέχει 100% καθαρές εφαρμογές έξυπνης κάρτας Java. Οι εφαρμογές έξυπνων καρτών συχνά δεν είναι καθαρές επειδή επικοινωνούν με εξωτερική συσκευή ή χρησιμοποιούν βιβλιοθήκες στον πελάτη. Σε αυτό το άρθρο θα παρέχουμε δύο υλοποιήσεις σε δύο διαφορετικούς αναγνώστες καρτών, δείχνοντας πώς θα προσθέσετε υποστήριξη για αναγνώστες καρτών στο OpenCard. Ελπίζουμε ότι τα λιμάνια για Litronic, Gemplus, Schlumberger, Bull, Toshiba και SCM θα είναι σύντομα διαθέσιμα, φιλοφρονήσεις του OpenCard και JavaWorld.

Εισαγωγή

Για να χρησιμοποιήσετε μια έξυπνη κάρτα, πρέπει να είστε σε θέση να διαβάσετε την κάρτα και να επικοινωνήσετε μαζί της χρησιμοποιώντας μια εφαρμογή. Το OpenCard παρέχει ένα πλαίσιο για αυτό καθορίζοντας διεπαφές που πρέπει να εφαρμοστούν. Το πλαίσιο OpenCard καθορίζει πολλές από αυτές τις διεπαφές. Μόλις υλοποιηθούν αυτές οι διεπαφές, μπορείτε να χρησιμοποιήσετε άλλες υπηρεσίες στα ανώτερα επίπεδα του API. Για παράδειγμα, με έναν σωστά διασυνδεδεμένο αναγνώστη, το OpenCard μπορεί να ξεκινήσει έναν παράγοντα κάρτας Java κάθε φορά που τοποθετείται η κάρτα. Ο πράκτορας της κάρτας μπορεί στη συνέχεια να επικοινωνήσει με εφαρμογές στην έξυπνη κάρτα μέσω του τερματικού της κάρτας στο πλαίσιο μιας συνεδρίας.

Αυτό το άρθρο θα σας διδάξει πώς να συνδέσετε τα τερματικά καρτών με το OpenCard. Τα μελλοντικά άρθρα θα συζητήσουν πώς να γράψετε έναν πράκτορα. Παρέχεται μια μικρή δοκιμαστική εφαρμογή, η οποία λαμβάνει τη συμβολοσειρά ATR (Απάντηση σε Επαναφορά). Το ATR είναι θεμελιώδες για τις έξυπνες κάρτες. Θα πάρουμε το κιτ ανάπτυξης OpenCard και θα εξηγήσουμε τις υλοποιήσεις για δύο διαφορετικούς αναγνώστες έξυπνων καρτών χρησιμοποιώντας το Card Terminal Interface. Οι τεχνικές που συζητούνται στο άρθρο για την ενδυνάμωση των αναγνωστών, την έναρξη των συνεδριών καρτών και τη χρήση των μονάδων δεδομένων πρωτοκόλλου και των μονάδων δεδομένων πρωτοκόλλου εφαρμογών μπορούν να επαναχρησιμοποιηθούν για τους περισσότερους αναγνώστες στην αγορά.

Αν και δεν είναι απαραίτητο να χρησιμοποιήσετε το OpenCard για τη δημιουργία 100% καθαρών εφαρμογών έξυπνης κάρτας Java, χωρίς αυτό οι προγραμματιστές αναγκάζονται να χρησιμοποιούν οικιακές διεπαφές σε έξυπνες κάρτες. (Για μια λεπτομερή εξήγηση του τι σημαίνει πραγματικά 100% καθαρός, ανατρέξτε στην ενότητα Πόροι.) Το OpenCard παρέχει επίσης στους προγραμματιστές μια διεπαφή για PC / SC (μια διεπαφή εφαρμογής έξυπνης κάρτας που αναπτύχθηκε από τη Microsoft και άλλους για επικοινωνία με έξυπνες κάρτες από το Win32 πλατφόρμες για υπολογιστές) για χρήση υπαρχουσών συσκευών σε πλατφόρμες Win32. Διαβάστε παρακάτω και μάθετε πώς να χρησιμοποιείτε έξυπνες κάρτες με το πρόγραμμα περιήγησής σας.

Αρχιτεκτονική OpenCard: Μια επισκόπηση

Το OpenCard παρέχει μια αρχιτεκτονική για την ανάπτυξη εφαρμογών σε Java που χρησιμοποιούν έξυπνες κάρτες ή άλλες συσκευές συμβατές με ISO 7816 σε διαφορετικές πλατφόρμες στόχους, όπως Windows, υπολογιστές δικτύου, σταθμοί εργασίας Unix, Webtops, set tops και ούτω καθεξής. Το OpenCard Framework παρέχει μια διεπαφή προγραμματισμού εφαρμογών (API), η οποία σας επιτρέπει να εγγράψετε κάρτες, να αναζητάτε κάρτες σε αναγνώστες και, προαιρετικά, να εκκινείτε πράκτορες Java όταν εισάγονται κάρτες στη συσκευή ανάγνωσης. Η αρχιτεκτονική του OpenCard απεικονίζεται στο Σχήμα 1.

Η αρχιτεκτονική του OpenCard Framework αποτελείται από το Κάρτα τερματικό, ο CardAgent, οι Πράκτορες και / ή εφαρμογές που αλληλεπιδρούν με αυτά τα στοιχεία. Το OpenCard αποτελείται από τέσσερα πακέτα Java με το πρόθεμα ανοιχτή κάρτα:

  1. εφαρμογή
  2. Οο
  3. μέσο
  4. τερματικό

Το τερματικό πακέτο στο OpenCard

Τα πακέτα opencard.application και opencard.io παρέχει το API υψηλού επιπέδου που χρησιμοποιείται από τον προγραμματιστή εφαρμογών. Οι υπηρεσίες που απαιτούνται από το API υψηλού επιπέδου εκτελούνται από τάξεις στο opencard.agent και opencard.terminal πακέτα. ο opencard.agent Το πακέτο αφαιρεί τη λειτουργικότητα της έξυπνης κάρτας μέσω του CardAgent. Πακέτο opencard.terminal αφαιρεί τα τερματικά καρτών (επίσης γνωστά ως αναγνώστες καρτών). Κατανόηση της δομής του opencard.terminal απαιτείται πακέτο για την κατανόηση των δειγμάτων υλοποίησης των τερματικών καρτών που παρέχονται σε αυτό το άρθρο.

Ένα τερματικό κάρτας αφαιρεί τη συσκευή που χρησιμοποιείται σε ένα σύστημα υπολογιστή για επικοινωνία με μια έξυπνη κάρτα. ο opencard.terminal Το πακέτο περιέχει τάξεις για την αναπαράσταση του υλικού τερματικού κάρτας, την αλληλεπίδραση με τον χρήστη και τη διαχείριση πόρων τερματικού κάρτας. Δεν έχουν όλοι οι αναγνώστες αυτές τις ικανότητες. Κατά την εφαρμογή ενός προγράμματος ανάγνωσης που δεν έχει καταχώριση πληκτρολογίου, θα χρησιμοποιήσουμε το UserInteractionHandler.

Αναπαράσταση τερματικού κάρτας

Κάθε τερματικό κάρτας αντιπροσωπεύεται από μια παρουσία κλάσης Κάρτα τερματικό που ορίζει το αφηρημένο τερματικό κάρτας συμβατό με OpenCard. Ένα τερματικό κάρτας μπορεί να έχει μία ή περισσότερες υποδοχές για έξυπνες κάρτες και προαιρετικά μια οθόνη και ένα πληκτρολόγιο ή ένα πληκτρολόγιο PIN. Οι υποδοχές ενός τερματικού κάρτας αντιπροσωπεύονται από παρουσίες της αφηρημένης κλάσης Θυρίδα, η οποία προσφέρει μεθόδους αναμονής για την εισαγωγή μιας κάρτας, την επικοινωνία με την κάρτα και την εξαγωγή της (εάν είναι δυνατόν).

Αλληλεπίδραση χρήστη

Η χρήση έξυπνης κάρτας απαιτεί αλληλεπίδραση με τον χρήστη - για επαλήθευση κατόχου κάρτας. Η διεπαφή Αλληλεπίδραση χρήστη παρέχει αυτή τη λειτουργικότητα. Παρέχει μεθόδους για να γράψετε ένα μήνυμα στην οθόνη και να λάβετε είσοδο από τον χρήστη. Τα τερματικά καρτών που δεν υποστηρίζουν όλες τις δυνατότητες αλληλεπίδρασης χρήστη μπορούν να κάνουν χρήση του UserInteractionHandler, το οποίο εφαρμόζει ένα Αλληλεπίδραση χρήστη ως γραφική διεπαφή χρήστη που βασίζεται στην αφηρημένη εργαλειοθήκη παραθύρου (AWT).

Διαχείριση πόρων

Οι κάρτες και οι συσκευές ανάγνωσης καρτών απαιτούν διαχείριση πόρων, έτσι ώστε οι πράκτορες να μπορούν να έχουν το επίπεδο ελέγχου πρόσβασης που χρειάζονται. Η διαχείριση πόρων προβλέπει την κοινή χρήση των τερματικών καρτών και των καρτών που εισάγονται σε αυτά μεταξύ των πρακτόρων του συστήματος. Για παράδειγμα, ας υποθέσουμε ότι χρησιμοποιείτε την έξυπνη κάρτα σας για να υπογράψετε ένα έγγραφο ταυτόχρονα με το μήνυμα ηλεκτρονικού ταχυδρομείου υψηλής προτεραιότητας που πρέπει να αποκωδικοποιηθεί χρησιμοποιώντας την έξυπνη κάρτα σας. Η διαχείριση των πόρων ρυθμίζει την πρόσβαση στο Κάρτα τερματικό και τη σωστή θύρα.

Η διαχείριση πόρων για τερματικά καρτών επιτυγχάνεται από το CardTerminalRegistry τάξη του OpenCard. Υπάρχει μόνο μία περίπτωση CardTerminalRegistry: το μητρώο τερματικών καρτών σε όλο το σύστημα. Το μητρώο τερματικών καρτών σε όλο το σύστημα παρακολουθεί τα τερματικά καρτών που είναι εγκατεστημένα στο σύστημα. Το μητρώο τερματικών καρτών μπορεί να διαμορφωθεί από ιδιότητες κατά την εκκίνηση του συστήματος ή δυναμικά κανω ΕΓΓΡΑΦΗ και καταργήστε την εγγραφή μεθόδους για δυναμική προσθήκη ή κατάργηση τερματικών καρτών από το μητρώο.

Κατά την εγγραφή ενός τερματικού κάρτας, α CardTerminalFactory απαιτείται για τη δημιουργία μιας παρουσίας της αντίστοιχης κλάσης εφαρμογής για το τερματικό της κάρτας. Το εργοστάσιο τερματικού κάρτας χρησιμοποιεί το όνομα τύπου και τον τύπο σύνδεσης του τερματικού κάρτας για να προσδιορίσει το Κάρτα τερματικό τάξη για δημιουργία. Η έννοια ενός εργοστασίου τερματικών καρτών επιτρέπει στον κατασκευαστή τερματικών καρτών να ορίσει μια αντιστοίχιση μεταξύ φιλικών προς το χρήστη ονομάτων τύπου και ονόματος ονόματος κλάσης.

Εφαρμογή δείγματος: τερματικό κάρτας IBM

Σε αυτήν την ενότητα, θα περιγράψουμε την ενσωμάτωση του τερματικού κάρτας IBM 5948 στο OpenCard. Το τερματικό κάρτας IBM 5948 διαθέτει μία υποδοχή για έξυπνες κάρτες, μια οθόνη LCD και ένα πληκτρολόγιο PIN. Συνδέεται στο σταθμό εργασίας ή στον υπολογιστή μέσω σειριακής θύρας. Περισσότερες πληροφορίες για αυτόν τον αναγνώστη είναι διαθέσιμες στο

Πόροι

Ενότητα.

Για να αποκτήσετε πρόσβαση σε ένα τερματικό κάρτας μέσα από το OpenCard, μια εφαρμογή και για τις δύο αφηρημένες τάξεις Κάρτα τερματικό και Θυρίδα πρέπει να παρέχονται. Αυτά έχουν ονομαστεί IBM5948CardTerminal και Υποδοχή IBM5948, αντίστοιχα. Επιπλέον, ένα κατάλληλο CardTerminalFactory ονομάστηκε IBMCardTerminalFactory απατείται. Η εφαρμογή τερματικού αποτελείται από πακέτο com.ibm.zurich.smartcard.terminal.ibm5948. Το σχήμα 2 απεικονίζει τις σχέσεις κληρονομιάς μεταξύ των τάξεων του opencard.terminal, τις τάξεις Java και την εφαρμογή τερματικού. Το διάγραμμα τάξης περιέχει επίσης κλάση IBM5948Driver, η οποία δεν εφαρμόζει καμία αφηρημένη κλάση του OpenCard, αλλά χρησιμεύει ως διεπαφή Java στη βιβλιοθήκη τερματικού προγράμματος οδήγησης που είναι γραμμένη στο C.

Υποθέτουμε ότι το τερματικό είναι ήδη συνδεδεμένο με το σταθμό εργασίας ή τον υπολογιστή και ότι η σειριακή θύρα έχει ρυθμιστεί ώστε να λειτουργεί με το τερματικό. Στην επόμενη ενότητα, περιγράφουμε το σχεδιασμό και την εφαρμογή του προγράμματος οδήγησης, του τερματικού, της υποδοχής και του τερματικού κάρτας. Παρέχεται επίσης η διαμόρφωση του μητρώου τερματικών καρτών.

Το πρόγραμμα οδήγησης τερματικού κάρτας

Το τερματικό της κάρτας αποστέλλεται με ένα πρόγραμμα οδήγησης που είναι διαθέσιμο ως βιβλιοθήκη δυναμικής σύνδεσης (DLL). Το DLL διαθέτει C API που προσφέρει τις λειτουργίες CT_init, CT_δεδομένα, και CT_κλείσιμο:

  • Η λειτουργία CT_init χρησιμοποιείται για το άνοιγμα μιας σύνδεσης σε ένα τερματικό κάρτας που είναι συνδεδεμένο σε μια συγκεκριμένη σειριακή θύρα. Μετά την πραγματοποίηση της σύνδεσης, οι μονάδες δεδομένων πρωτοκόλλου (PDU) μπορούν να ανταλλάσσονται με το τερματικό της κάρτας και οι APU μπορούν να ανταλλάσσονται με την έξυπνη κάρτα που είναι συνδεδεμένη στην υποδοχή του τερματικού μέσω του CT_δεδομένα λειτουργία.

  • ο CT_δεδομένα Η κλήση χρησιμοποιείται για την αποστολή ενός PDU και για την ανάκτηση της απόκρισης από το τερματικό ή την έξυπνη κάρτα, αντίστοιχα.

  • ο CT_κλείσιμο Η λειτουργία χρησιμοποιείται για να κλείσει η σύνδεση στο τερματικό της κάρτας και να απελευθερωθούν τυχόν πόροι.

Η επιτυχία ή η αποτυχία και των τριών κλήσεων API υποδεικνύεται από τον κωδικό επιστροφής.

Το Java API

Παρόμοια με το C API, ορίζουμε ένα Java API για το πρόγραμμα οδήγησης τερματικού κάρτας. Το Java API για το τερματικό κάρτας αποτελείται από κλάση IBM5948Driver, η οποία έχει εγγενείς μεθόδους που καλούν το C API. Αποφασίσαμε να εφαρμόσουμε όσο το δυνατόν περισσότερη λειτουργικότητα στην Java και να γράψουμε μόνο κώδικα "κόλλα" στο C. Στην πραγματικότητα, οι παράμετροι του ctInit και ctΚλείστε Η μέθοδος μόλις μεταβιβάζεται στην αντίστοιχη συνάρτηση C API. Δεδομένου ότι οι συστοιχίες οργανώνονται διαφορετικά σε C και Java, πρέπει να αντιμετωπίζονται με κλήσεις στο Java Native Interface (JNI) API της εικονικής μηχανής. Οι εγγενείς μέθοδοι επιστρέφουν τον κωδικό επιστροφής του C API. Η εφαρμογή του ctData Η μέθοδος φαίνεται παρακάτω:

JNIEXPORT jint JNICALL Java_com_ibm_zurich_smartcard_terminal_ibm5948_IBM5948Driver_ctData (JNIEnv * env, jobject that, jbyte destination, jbyteArray command, jint commandLength, jbyteArray Respons, jint rc responsMax) χωρίς υπογραφή char sad = HOST; χωρίς υπογραφή char dad = προορισμός; σύντομη απόκριση χωρίς υπογραφήLength = (σύντομη απλή υπογραφή) απόκρισηMax; unsigned char * commandArray; unsigned char * ResponsArray; jclass cls = (* env) -> GetObjectClass (env, that); jfieldID fid; jint ctn; fid = (* env) -> GetFieldID (env, cls, "ctNumber", "I"); if (fid == NULL) {επιστροφή (CT_ERR_HTSI); } ctn = (* env) -> GetIntField (env, that, fid); commandArray = (unsigned char *) (* env) -> GetByteArrayElements (env, εντολή, 0); ResponsArray = (χωρίς υπογραφή char *) (* env) -> GetByteArrayElements (env, απόκριση, 0); rc = CT_DATA (ctn, & dad, & sad, commandLength, commandArray, & ResponsLength, responseArray); (* env) -> ReleaseByteArrayElements (env, command, (sign char *) commandArray, 0); (* env) -> ReleaseByteArrayElements (env, απόκριση, (υπογεγραμμένο char *) απόκρισηArray, 0); fid = (* env) -> GetFieldID (env, cls, "responseLength", "I"); if (fid == NULL) {επιστροφή (CT_ERR_HTSI); } (* env) -> SetIntField (env, that, fid, responseLength); επιστροφή rc; } 

Οι εγγενείς μέθοδοι που περιγράφονται παραπάνω μιμούνται το C API στην Java. Ο λόγος για αυτό ήταν να έχουμε όσο το δυνατόν λιγότερο κώδικα C για συντήρηση. Πάνω από τις εγγενείς μεθόδους, οι οποίες είναι ιδιωτικές, τις μεθόδους μέσα σε αυτό, δεδομένα, και Κλείσε εφαρμόζονται. Καλούν τις εγγενείς μεθόδους και ρίχνουν μια εξαίρεση εάν ο κωδικός επιστροφής υποδεικνύει σφάλμα. Στην περίπτωση της μεθόδου δεδομένων, ο πίνακας byte απόκρισης επιστρέφεται με την επιτυχή ολοκλήρωση της κλήσης εγγενούς μεθόδου. Το παρακάτω παράδειγμα δείχνει τη μέθοδο δεδομένων:

συγχρονισμένα byte [] δεδομένα (προορισμός byte, byte [] pdu) ρίχνει CardTerminalException {int rc = ctData (προορισμός, pdu, pdu.length, απόκριση, απόκριση.length); if (rc == CT_OK) {byte [] αποτέλεσμα = νέο byte [απόκριση μήκους]; System.arraycopy (απόκριση, 0, αποτέλεσμα, 0, μήκος απόκρισης); αποτέλεσμα επιστροφής; } αλλιώς ρίξτε νέο CardTerminalException (rc2String (rc)); } 

Προκειμένου να διατηρηθεί η διαχείριση μνήμης εντός Java, μια απόκριση buffer για την απάντηση από το τερματικό εκχωρείται μία φορά και μεταβιβάζεται στον εγγενή κώδικα. Δεδομένου ότι το C API δεν εισέρχεται ξανά, οι μέθοδοι του IBM5948Driver πρέπει να δηλωθεί συγχρονισμένη.

Εφαρμογή του τερματικού κάρτας

Το τερματικό της κάρτας ελέγχεται με την υποβολή PDU ελέγχου στη μέθοδο δεδομένων του IBM5948Driver. Η μορφή των PDU ελέγχου είναι συμβατή με ISO 7816-4. Αυτό μας επιτρέπει να αναπτύξουμε τάξη opencard.agent.CommandPDU για την κατασκευή των PDU και opencard.agent.ResponsePDU για να χειριστείτε τις απαντήσεις.

ο IBM5948CardTerminal τάξη επεκτείνει τάξη Κάρτα τερματικό. Ο κατασκευαστής αρχικοποιεί την σούπερ τάξη και δημιουργεί το πρόγραμμα οδήγησης. Στη συνέχεια, ενεργοποιεί τον πίνακα για να κρατήσει τους κουλοχέρηδες και δημιουργεί μια παρουσία του Υποδοχή IBM5948 να αντιπροσωπεύει τη μόνη υποδοχή του τερματικού κάρτας IBM 5948.

$config[zx-auto] not found$config[zx-overlay] not found