Example #1
0
        void generaEventiLettura(string pin)
        {
            try
            {
                SmartCard smc         = new SmartCard();
                string    JsonCardVal = string.Empty;

                smc.onRemoveCard += new CardEventHandler((r) => { label1.Text = "Waiting card..."; });

                if (!string.IsNullOrEmpty(pin))
                {
                    // All'inserimento del documento avvio la lettura
                    smc.onInsertCard += new CardEventHandler((r) =>
                    {
                        readCardData(smc, r, pin);
                    });
                }
                else
                {
                    smc.onInsertCard += new CardEventHandler((r) =>
                    {
                        getNis(smc, r);
                    });
                }

                smc.onRemoveCard += new CardEventHandler((r) => { smc.EndTransaction(Disposition.SCARD_LEAVE_CARD); });

                // Imposto l'interfaccia per l'invio delle notifiche. In questo modo posso interagire con
                // il form senza dover usare delle Invoke.
                smc.InterfaceForEvents = this;

                // Avvio il monitoraggio dei lettori
                smc.StartMonitoring(true);
                smc.InterfaceForEvents = this;
                Thread.Sleep(5000);
            }
            catch (Exception e1)
            {
                txtStatus.Text += "err2 " + e1.Message;
                //return e1.Message;
            }
        }
Example #2
0
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            var f = new Form1();
            // crea un aggetto SmartCard per il monitoraggio dei lettori e la connessione al chip

            SmartCard sc = new SmartCard();

            //Imposta un listener dell'evento di comunicazione con il chip
            sc.SmarCardCommunication += new SmarCardCommunicationDelegate((x, b) =>
            {
                // scrivo in debug i dati inviati e ricevuti dal chip
                System.Diagnostics.Debug.WriteLine(x.ToString() + ":" + BitConverter.ToString(b));
            });

            // Alla rimozione del documento aggiorno la label del form
            sc.onRemoveCard += new CardEventHandler((r) =>
            {
                f.label1.Text = "Appoggiare la carta sul lettore";
            });

            // All'inserimento del documento aggiorno la label e avvio la lettura
            sc.onInsertCard += new CardEventHandler((r) =>
            {
                f.label1.Text = "Lettura in corso";
                // siamo all'interno dell'event handler del form, quindi per aggiornare la label devo eseguire il Message Loop
                Application.DoEvents();

                // avvio la connessione al lettore richiedendo l'accesso esclusivo al chip
                if (!sc.Connect(r, Share.SCARD_SHARE_EXCLUSIVE, Protocol.SCARD_PROTOCOL_T1))
                {
                    System.Diagnostics.Debug.WriteLine("Errore in connessione: " + sc.LastSCardResult.ToString("X08"));
                    return;
                }

                // Creo l'oggetto EAC per l'autenticazione e la lettura, passando la smart card su cui eseguire i comandi
                EAC a = new EAC(sc);

                // Verifico se il chip è SAC
                if (a.IsSAC())
                {
                    // Effettuo l'autenticazione PACE.
                    // In un caso reale prima di avvare la connessione al chip dovrei chiedere all'utente di inserire il CAN
                    a.PACE("123456");
                }
                else
                {
                    // Per fare BAC dovrei fare la scansione dell'MRZ e applicare l'OCR all'imagine ottenuta. In questo caso ritorno errore.
                    // a.BAC(MRZbirthDate, expiryDate, passNumber)
                    f.label1.Text = "BAC non disponibile";
                    return;
                }

                // Per poter fare la chip authentication devo prima leggere il DG14
                var dg14 = a.ReadDG(DG.DG14);

                // Effettuo la chip authentication
                a.ChipAuthentication();

                // Leggo il DG2 contenente la foto
                var dg2 = a.ReadDG(DG.DG2);

                // Disconnessione dal chip
                sc.Disconnect(Disposition.SCARD_RESET_CARD);

                // Aggiorno la laber del form
                f.label1.Text = "OK!";
            });

            // Alla chiusura del Form sospendo il monitoraggio dei lettori, altrimenti l'applicazione
            // si blocca in attesa del terine del thread
            f.FormClosing += new FormClosingEventHandler((o, e) =>
            {
                sc.StopMonitoring();
            });

            // Imposto l'interfaccia per l'invio delle notifiche. In questo modo posso interagire con
            // il form senza dover usare delle Invoke.
            sc.InterfaceForEvents = f;

            // Avvio il monitoraggio dei lettori
            sc.StartMonitoring(true);

            // Visualizzo il Form informativo
            f.ShowDialog();
        }
Example #3
0
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            f = new Form1();

            f.status_.Text      = "Appoggiare la carta sul lettore"; //Status, messaggi utente
            f.status_.ForeColor = Color.Black;
            f.status_.BackColor = f.status_.BackColor;

            //CallbkRadioButt
            f.radioButtonXml.CheckedChanged  += new EventHandler(radioButtons_CheckedChanged);
            f.radioButtonCSV.CheckedChanged  += new EventHandler(radioButtons_CheckedChanged);
            f.radioButtonJSon.CheckedChanged += new EventHandler(radioButtons_CheckedChanged);
            //CallbkButt
            f.buttonExport.Click   += new EventHandler(clickExport);
            f.buttonVerifica.Click += new EventHandler(clickVerifica);


            // crea un aggetto SmartCard per il monitoraggio dei lettori e la connessione al chip
            SmartCard sc = new SmartCard();

            //Imposta un listener dell'evento di comunicazione con il chip
            sc.SmarCardCommunication += new SmarCardCommunicationDelegate((x, b) =>
            {
                // scrivo in debug i dati inviati e ricevuti dal chip
                System.Diagnostics.Debug.WriteLine(x.ToString() + ":" + BitConverter.ToString(b));
            });

            // Alla rimozione del documento aggiorno la label del form
            sc.onRemoveCard += new CardEventHandler((r) =>
            {
                f.status_.Text      = "Appoggiare la carta sul lettore";
                f.status_.ForeColor = Color.Black;
                f.status_.BackColor = f.status_.BackColor;
            });

            // All'inserimento del documento aggiorno la label e avvio la lettura
            sc.onInsertCard += new CardEventHandler((r) =>
            {
                f.status_.Text      = "Lettura in corso...";
                f.status_.ForeColor = Color.Blue;
                f.status_.BackColor = f.status_.BackColor;
                // siamo all'interno dell'event handler del form, quindi per aggiornare la label devo eseguire il Message Loop
                Application.DoEvents();

                // avvio la connessione al lettore richiedendo l'accesso esclusivo al chip
                if (!sc.Connect(r, Share.SCARD_SHARE_EXCLUSIVE, Protocol.SCARD_PROTOCOL_T1))
                {
                    System.Diagnostics.Debug.WriteLine("Errore in connessione: " + sc.LastSCardResult.ToString("X08"));
                    f.status_.Text      = "ERRORE DI CONNESSIONE! RIPROVARE...";
                    f.status_.ForeColor = Color.Red;
                    f.status_.BackColor = f.status_.BackColor;
                    return;
                }

                // Creo l'oggetto EAC per l'autenticazione e la lettura, passando la smart card su cui eseguire i comandi
                EAC a = new EAC(sc);

                // Verifico se il chip è SAC
                if (a.IsSAC())
                {
                    // Effettuo l'autenticazione PACE.
                    // In un caso reale prima di avvare la connessione al chip dovrei chiedere all'utente di inserire il CAN
                    a.PACE("123456");
                }
                else
                {
                    // Per fare BAC dovrei fare la scansione dell'MRZ e applicare l'OCR all'imagine ottenuta. In questo caso ritorno errore.
                    // a.BAC(MRZbirthDate, expiryDate, passNumber)
                    f.status_.Text      = "BAC non disponibile";
                    f.status_.ForeColor = Color.Red;
                    f.status_.BackColor = f.status_.BackColor;
                    return;
                }

                // Per poter fare la chip authentication devo prima leggere il DG14
                var dg14 = a.ReadDG(DG.DG14);

                // Effettuo la chip authentication
                a.ChipAuthentication();

                persona = new C_CIE(a); //creazione di una E_CIE

                // Disconnessione dal chip
                sc.Disconnect(Disposition.SCARD_RESET_CARD);

                //Aggiornamento interfaccia grafica
                f.nome.Text             = persona.firstName;
                f.cognome.Text          = persona.lastName;
                f.luogoNascita.Text     = persona.birthCity;
                f.provinciaNascita.Text = persona.birthProv;
                f.provincia.Text        = persona.prov;
                f.indirizzo.Text        = persona.address;
                //f.indirizzo.Text = System.Text.Encoding.UTF8.GetString(dg12);  //debug
                f.cf.Text          = persona.cf;
                f.mrz.Text         = persona.mrz;
                f.rilascio.Text    = C_CIE.getParsedData(persona.dateIssue);
                f.pictureBox.Image = persona.ret_cie_bitmap();
                f.city.Text        = persona.city;

                f.status_.Text      = "Carta Letta";
                f.status_.ForeColor = Color.Green;
                f.status_.BackColor = f.status_.BackColor;
            });

            // Alla chiusura del Form sospendo il monitoraggio dei lettori, altrimenti l'applicazione
            // si blocca in attesa del termine del thread
            f.FormClosing += new FormClosingEventHandler((o, e) =>
            {
                sc.StopMonitoring();
            });

            // Imposto l'interfaccia per l'invio delle notifiche. In questo modo posso interagire con
            // il form senza dover usare delle Invoke.
            sc.InterfaceForEvents = f;

            // Avvio il monitoraggio dei lettori
            sc.StartMonitoring(true);

            // Visualizzo il Form informativo
            f.ShowDialog();
        }