public CVCert(byte[] data) { ASN1Tag cert = ASN1Tag.Parse(data, false); cert.CheckTag(0x7F21); ASN1Tag certContent = cert.Child(0, 0x7F4E); Signature = cert.Child(1, 0x5F37).Data; Version = (int)new ByteArray(certContent.Child(0, 0x5F29).Data).ToUInt; Issuer = new ByteArray(certContent.Child(1, 0x42).Data).ToASCII; Name = new ByteArray(certContent.Child(3, 0x5F20).Data).ToASCII; ValidFrom = certContent.Child(5, 0x5F25).Data; Expire = certContent.Child(6, 0x5F24).Data; ASN1Tag PubKey = certContent.Child(2, 0x7F49); PubKeyAlgoOID = PubKey.Child(0, 0x06).Data; PubKeyModule = PubKey.Child(1, 0x81).Data; PubKeyExponent = PubKey.Child(2, 0x82).Data; ASN1Tag certTemplate = certContent.Child(4, 0x7F4C); CertificateTemplateOID = certTemplate.Child(0, 0x06).Data; CertificateTemplateValue = certTemplate.Child(1, 0x53).Data; RawCert = new ByteArray(data).Left((int)cert.EndPos); }
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); } }