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(); }
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(); }
JObject readCardData(SmartCard smc, string r, string pin) { try { smc = new SmartCard(); // 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 (!smc.Connect(r, Share.SCARD_SHARE_EXCLUSIVE, Protocol.SCARD_PROTOCOL_T1)) { System.Diagnostics.Debug.WriteLine("Errore in connessione: " + smc.LastSCardResult.ToString("X08")); label1.Text = "Errore in connessione: " + smc.LastSCardResult.ToString("X08"); JObject j = new JObject(); j.Add("Exception", "Errore in connessione: " + smc.LastSCardResult.ToString("X08")); jsonToReturn = j; return(j); } // Creo l'oggetto EAC per l'autenticazione e la lettura, passando la smart card su cui eseguire i comandi EAC a = new EAC(smc); // 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 txtStatus.Text += "chip SAC - PACE" + "\n"; a.PACE(pin); // a.PACE("641230", new DateTime(2022, 12, 30), "CA00000AA"); } else { // Per fare BAC dovrei fare la scansione dell'MRZ e applicare l'OCR all'imagine ottenuta. In questo caso ritorno errore. // a.BAC("641230", new DateTime(2022, 12, 30), "CA00000AA"); //a.BAC() // label1.Text = "BAC non disponibile"; txtStatus.Text += "chip BAC" + "\n"; } // Per poter fare la chip authentication devo prima leggere il DG14 var dg14 = a.ReadDG(DG.DG14); // Effettuo la chip authentication a.ChipAuthentication(); ASN1Tag asn = ASN1Tag.Parse(a.ReadDG(DG.DG11)); //creao il json da inviare alla webform var jsonObject = new JObject(); jsonObject.Add("nis", "?"); string nomeCognome = new ByteArray(asn.Child(1).Data).ToASCII.ToString(); jsonObject.Add("surname", nomeCognome.Split(new[] { "<<" }, StringSplitOptions.None)[0]); jsonObject.Add("name", nomeCognome.Split(new[] { "<<" }, StringSplitOptions.None)[1]); string codiceFiscale = new ByteArray(asn.Child(2).Data).ToASCII.ToString(); jsonObject.Add("fiscal_code", codiceFiscale); string residenza = new ByteArray(asn.Child(4).Data).ToASCII.ToString(); jsonObject.Add("res_addr", residenza.Split('<')[0]); jsonObject.Add("res_place", residenza.Split('<')[1]); jsonObject.Add("res_prov", residenza.Split('<')[2]); string birth = new ByteArray(asn.Child(3).Data).ToASCII.ToString(); jsonObject.Add("birth_place", birth.Split('<')[0]); jsonObject.Add("birth_prov", birth.Split('<')[1]); jsonObject.Add("birth_date", CF.GetDateFromFiscalCode(codiceFiscale)); txtStatus.Text += jsonObject.ToString(); // Leggo il DG2 contenente la foto var dg2 = a.ReadDG(DG.DG2); // Disconnessione dal chip smc.Disconnect(Disposition.SCARD_RESET_CARD); jsonToReturn = jsonObject; return(jsonObject); } catch (Exception e) { txtStatus.Text += "Eccezione: " + e.Message; JObject j = new JObject(); j.Add("Exception", e.Message); jsonToReturn = j; return(j); } }