Exemplo n.º 1
0
 public PACEAlgo(ASN1Tag tag)
 {
     // dovrei inizializzare i vari componenti in base all'OID del tag.
     // per adesso mi limito a DH_GM
     DG14Tag = tag;
     algo1   = new DHAlgo(DG14Tag);
     mapping = new GenericMapping(algo1);
 }
        public static ASN1Tag DeepChild(this ASN1Tag asn1, params int[] sequence)
        {
            ASN1Tag tag = asn1;

            foreach (var idx in sequence)
            {
                tag = tag.children[idx];
            }
            return(tag);
        }
Exemplo n.º 3
0
        public DHAlgo(ASN1Tag tag)
        {
            var paramId = new ByteArray(tag.CheckTag(0x30).Child(2, 0x02).Data).ToUInt;

            if (paramId != 2)
            {
                throw new Exception("Parametri di default : " + paramId.ToString() + " non supportati");
            }

            Prime = StandardDHParam2Prime;
            Group = StandardDHParam2Group;
            Order = StandardDHParam2Order;

            DG14Tag = tag;
        }
        public static string ToReadableString(this ASN1Tag asn1)
        {
            var data = asn1.Data.SubArray(0, Math.Min(30, asn1.Data.Length));

            if (data == null)
            {
                return("");
            }
            StringBuilder sb = new StringBuilder(data.Length * 3);

            for (int i = 0; i < data.Length; i++)
            {
                sb.Append(data[i].ToString("X02") + " ");
            }
            return(sb.ToString());
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        bool IssuedBy(X509Certificate2 cert, X509Certificate2 issuer)
        {
            try
            {
                if (!new ByteArray(cert.IssuerName.RawData).IsEqual(issuer.SubjectName.RawData))
                {
                    // verifico attributo per attributo
                    var IssuerTag  = ASN1Tag.Parse(cert.IssuerName.RawData, false);
                    var SubjectTag = ASN1Tag.Parse(issuer.SubjectName.RawData, false);
                    Dictionary <string, byte[]> IssuerComponents  = new Dictionary <string, byte[]>();
                    Dictionary <string, byte[]> SubjectComponents = new Dictionary <string, byte[]>();
                    foreach (var c in IssuerTag.children)
                    {
                        var comp = c.Child(0);
                        IssuerComponents[ASN1ObjIdDisplay.singleton.contentString(comp.Child(0))] = comp.Child(1).Data;
                    }
                    foreach (var c in SubjectTag.children)
                    {
                        var comp = c.Child(0);
                        SubjectComponents[ASN1ObjIdDisplay.singleton.contentString(comp.Child(0))] = comp.Child(1).Data;
                    }
                    string[] keys = new string[IssuerComponents.Count];
                    IssuerComponents.Keys.CopyTo(keys, 0);
                    foreach (var o in keys)
                    {
                        if (!SubjectComponents.ContainsKey(o))
                        {
                            return(false);
                        }
                        var sub = UTF8Encoding.UTF8.GetString(SubjectComponents[o]);
                        var iss = UTF8Encoding.UTF8.GetString(IssuerComponents[o]);
                        if (sub != iss)
                        {
                            return(false);
                        }
                        IssuerComponents.Remove(o);
                        SubjectComponents.Remove(o);
                    }
                    if (IssuerComponents.Count > 0 || SubjectComponents.Count > 0)
                    {
                        return(false);
                    }
                }

                var akiExt = cert.Extensions["2.5.29.35"];
                if (akiExt != null)
                {
                    ASN1Tag akiTag  = ASN1Tag.Parse(akiExt.RawData, false);
                    var     aki     = akiTag.CheckTag(0x30);
                    var     aki2Tag = ASN1Tag.Parse(aki.Data, false);
                    var     akiData = aki2Tag.CheckTag(0x80).Data;


                    var skiExt = issuer.Extensions["2.5.29.14"] as X509SubjectKeyIdentifierExtension;
                    if (skiExt == null)
                    {
                        return(false);
                    }

                    if (skiExt.SubjectKeyIdentifier != HexDump(akiData))
                    {
                        return(false);
                    }
                }

                // verifico che la firma torni
                var certTag   = ASN1Tag.Parse(cert.RawData, false);
                var signature = certTag.Child(2, 0x03).Data;
                var keyTag    = ASN1Tag.Parse(issuer.PublicKey.EncodedKeyValue.RawData);
                var module    = keyTag.Child(0, 2).Data;
                var pubExp    = keyTag.Child(1, 2).Data;

                var    rsa          = new RSA();
                var    decSignature = ByteArray.RemoveBT1(rsa.RawRsa(module, pubExp, signature));
                byte[] signedHash   = null, certHash = null;
                var    toHash       = new ByteArray(cert.RawData).Sub((int)certTag.children[0].StartPos, (int)(certTag.children[0].EndPos - certTag.children[0].StartPos));
                if (cert.SignatureAlgorithm.Value == "1.2.840.113549.1.1.5")
                {
                    signedHash = rsa.RemoveSha1(decSignature);
                    certHash   = new SHA1().Digest(toHash);
                }
                else if (cert.SignatureAlgorithm.FriendlyName == "1.2.840.113549.1.1.11")
                {
                    signedHash = rsa.RemoveSha256(decSignature);
                    certHash   = new SHA256().Digest(toHash);
                }
                else
                {
                    throw new Exception("Algoritmo non supportato");
                }
                if (!new ByteArray(signedHash).IsEqual(certHash))
                {
                    return(false);
                }
                return(true);
            }
            catch { }
            return(false);
        }
        public static byte[] MakeTag(this ASN1Tag asn1, ulong tag)
        {
            //Build tag
            byte[] newTag;
            if (tag <= 0xff)
            {
                newTag = new byte[] { (byte)tag }
            }
            ;
            else if (tag <= 0xffff)
            {
                newTag = new byte[] { (byte)(tag >> 8), (byte)(tag & 0xff) }
            }
            ;
            else if (tag <= 0xffffff)
            {
                newTag = new byte[] { (byte)(tag >> 16), (byte)((tag >> 8) & 0xff), (byte)(tag & 0xff) }
            }
            ;
            else if (tag <= 0xffffffff)
            {
                newTag = new byte[] { (byte)(tag >> 24), (byte)((tag >> 16) & 0xff), (byte)((tag >> 8) & 0xff), (byte)(tag & 0xff) }
            }
            ;
            else
            {
                throw new Exception("Tag too long");
            }

            //Build length
            var length = (ulong)asn1.Data.Length;

            byte[] newLength;
            if (length < 0x80)
            {
                newLength = new byte[] { (byte)length }
            }
            ;
            else if (length <= 0xff)
            {
                newLength = new byte[] { 0x81, (byte)length }
            }
            ;
            else if (length <= 0xffff)
            {
                newLength = new byte[] { 0x82, (byte)(length >> 8), (byte)(length & 0xff) }
            }
            ;
            else if (length <= 0xffffff)
            {
                newLength = new byte[] { 0x83, (byte)(length >> 16), (byte)((length >> 8) & 0xff), (byte)(length & 0xff) }
            }
            ;
            else if (length <= 0xffffffff)
            {
                newLength = new byte[] { 0x84, (byte)(length >> 24), (byte)((length >> 16) & 0xff), (byte)((length >> 8) & 0xff), (byte)(length & 0xff) }
            }
            ;
            else
            {
                throw new Exception("Data too long");
            }

            byte[] data = new byte[newTag.Length + newLength.Length + asn1.Data.Length];
            Array.Copy(newTag, 0, data, 0, newTag.Length);
            Array.Copy(newLength, 0, data, newTag.Length, newLength.Length);
            Array.Copy(asn1.Data, 0, data, newTag.Length + newLength.Length, asn1.Data.Length);

            return(data);
        }
Exemplo n.º 8
0
        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);
            }
        }