Beispiel #1
0
        private static VerifySignatureResult ConvertToVerifySignatureResult(EsitoVerificaStatus status, FirmaDigitale.DettaglioFirmaDigitaleType d)
        {
            VerifySignatureResult vsr = new VerifySignatureResult();
            List <DocsPaVO.documento.SignerInfo> siLst = new List <DocsPaVO.documento.SignerInfo>();

            if (d.datiFirmatari != null)
            {
                foreach (FirmaDigitale.FirmatarioType ft in d.datiFirmatari)
                {
                    DocsPaVO.documento.SignerInfo si = new DocsPaVO.documento.SignerInfo();
                    si.CertificateInfo = new DocsPaVO.documento.CertificateInfo
                    {
                        ValidFromDate               = ft.firmatario.dataInizioValiditaCert,
                        ValidToDate                 = ft.firmatario.dataFineValiditaCert,
                        RevocationDate              = ft.firmatario.dataRevocaCertificato,
                        RevocationStatus            = (int)status,
                        RevocationStatusDescription = status.ToString(),
                        IssuerName         = "CN=" + ft.firmatario.cnCertAuthority,
                        SignatureAlgorithm = "N.D."
                    };

                    si.SubjectInfo = new DocsPaVO.documento.SubjectInfo
                    {
                        CodiceFiscale  = ft.firmatario.codiceFiscale,
                        CommonName     = ft.firmatario.commonName,
                        CertId         = ft.firmatario.distinguishName,
                        Organizzazione = ft.firmatario.organizzazione,
                        SerialNumber   = ft.firmatario.serialNumber,
                    };
                    si.SignatureAlgorithm = convertOidtoString(ft.firmatario.digestAlgorithm);
                    siLst.Add(si);
                }
            }


            List <DocsPaVO.documento.PKCS7Document> p7docsLst = new List <DocsPaVO.documento.PKCS7Document>();

            DocsPaVO.documento.PKCS7Document p7doc = new DocsPaVO.documento.PKCS7Document
            {
                SignersInfo      = siLst.ToArray(),
                DocumentFileName = null,
                Level            = 0
            };
            p7docsLst.Add(p7doc);
            vsr.PKCS7Documents    = p7docsLst.ToArray();
            vsr.StatusCode        = (int)status;
            vsr.StatusDescription = status.ToString();
            vsr.CRLOnlineCheck    = true;
            return(vsr);
        }
Beispiel #2
0
        public EsitoVerifica VerificaByteEV(byte[] fileContents, string endPoint, Object[] args)
        {
            EsitoVerifica ev = new EsitoVerifica();

            string   dataVerificaString = string.Empty;
            DateTime?dataverificaDT;

            if (args.Length > 0)
            {
                dataverificaDT = args[0] as DateTime?;
                if (dataverificaDT == null)
                {
                    dataVerificaString = args[0] as string;
                    if (dataVerificaString == null)
                    {
                        ev.status = EsitoVerificaStatus.ErroreGenerico;
                        return(ev);
                    }
                }
                else
                {
                    dataVerificaString = zeniDateConverter(dataverificaDT);
                }
            }

            System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3;
            FirmaDigitale.FirmaDigitalePortTypeClient client = createClient(endPoint);

            FirmaDigitale.DocumentoType doc = new FirmaDigitale.DocumentoType();
            FirmaDigitale.DettaglioFirmaDigitaleType ret = null;
            try
            {
                sbyte?arg1 = 0;
                sbyte?arg2 = 0;
                sbyte?arg3 = 1;
                ret       = client.VerificaFirma(fileContents, arg1, arg2, dataVerificaString, arg3, out doc);
                ev.status = EsitoVerificaStatus.Valid;

                ev.content = doc.fileOriginale;
                if (ret != null)
                {
                    ev.VerifySignatureResult = ConvertToVerifySignatureResult(ev.status, ret);
                }
                ;
                return(ev);
            }
            catch (FaultException <FirmaDigitale.FaultType> f)
            {
                ev.status    = EsitoVerificaStatus.ErroreGenerico;
                ev.message   = f.Detail.userMessage;
                ev.errorCode = f.Detail.errorCode;
                return(ev);
            }

            catch (FaultException <FirmaDigitale.WarningResponseType> w)
            {
                List <string> lstW = new List <string> ();
                foreach (FirmaDigitale.WarningType s in w.Detail.WarinigFault)
                {
                    lstW.Add(Utils.SerializeObject <FirmaDigitale.WarningType>(s));

                    ev.message   = s.errorMsg;
                    ev.errorCode = s.errorCode;
                    ev.SubjectDN = s.SubjectDN;
                    ev.SubjectCN = s.SubjectCN;

                    ev.status = EsitoVerificaStatus.ErroreGenerico;

                    if (s.errorCode == "1468")
                    {
                        ev.status = EsitoVerificaStatus.SHA1NonSupportato;
                    }
                    if (s.errorCode == "1407")  // check
                    {
                        ev.status = EsitoVerificaStatus.NotTimeValid;
                    }
                    if (s.errorCode == "1408")  // check
                    {
                        ev.status = EsitoVerificaStatus.Revoked;
                        foreach (FirmaDigitale.FirmatarioType ft in w.Detail.DettaglioFirmaDigitale.datiFirmatari)
                        {
                            if (ft.firmatario.dataRevocaCertificato != DateTime.MinValue)
                            {
                                ev.dataRevocaCertificato = ft.firmatario.dataRevocaCertificato;
                            }
                        }
                    }
                }

                //TEST!!!!
                FirmaDigitale.DettaglioFirmaDigitaleType d = w.Detail.DettaglioFirmaDigitale;
                ev.content = w.Detail.Documento.fileOriginale;
                ev.VerifySignatureResult = ConvertToVerifySignatureResult(ev.status, d);;
                ev.additionalData        = lstW.ToArray();
                return(ev);
            }
        }
Beispiel #3
0
        private static VerifySignatureResult ConvertToVerifySignatureResultUsingInternalStructures(EsitoVerificaStatus status, FirmaDigitale.DettaglioFirmaDigitaleType d)
        {
            VerifySignatureResult vsr = new VerifySignatureResult();
            List <DocsPaVO.documento.SignerInfo> siLst = new List <DocsPaVO.documento.SignerInfo>();

            string verbosesgb   = ConfigurationManager.AppSettings["VERBOSEDEBUG"];
            bool   verboseDebug = false;

            Boolean.TryParse(verbosesgb, out verboseDebug);


            if (verboseDebug)
            {
                logger.Debug(d.datiGeneraliVerifica);
            }


            if (d.fileMarcatoSpecified)
            {
                if (d.dataVerificaFirmaSpecified)
                {
                    logger.InfoFormat("data verifica firma  {0}", d.dataVerificaFirma);
                }

                if (d.fileMarcato)
                {
                    logger.Debug("Marcato");
                    TSInfo ts = new TSInfo();
                    if (d.marcaDetached != null)
                    {
                        logger.Debug("marcaDetached !=null");
                        //Gestire la marca
                        //logger.DebugFormat("TSANameIssuer [{0}]", d.marcaDetached.TSANameIssuer);
                        //logger.DebugFormat("TSANameSubject [{0}]", d.marcaDetached.TSANameSubject);
                        //logger.DebugFormat("TSimprint [{0}]", d.marcaDetached.TSimprint);
                        //logger.DebugFormat("TSserialNumber [{0}]", d.marcaDetached.TSserialNumber);


                        if (!String.IsNullOrEmpty(d.marcaDetached.TSANameIssuer))
                        {
                            ts.TSANameIssuer = d.marcaDetached.TSANameIssuer;
                        }

                        if (!String.IsNullOrEmpty(d.marcaDetached.TSANameSubject))
                        {
                            ts.TSANameSubject = d.marcaDetached.TSANameSubject;
                        }

                        if (!String.IsNullOrEmpty(d.marcaDetached.TSimprint))
                        {
                            ts.TSimprint = d.marcaDetached.TSimprint;
                        }

                        if (!String.IsNullOrEmpty(d.marcaDetached.TSserialNumber))
                        {
                            ts.TSserialNumber = d.marcaDetached.TSserialNumber;
                        }


                        if (d.marcaDetached.TSdateTimeSpecified)
                        {
                            ts.TSdateTime = d.marcaDetached.TSdateTime;
                        }


                        if (d.marcaDetached.dataFineValiditaCertSpecified)
                        {
                            ts.dataFineValiditaCert = d.marcaDetached.dataFineValiditaCert;
                        }


                        if (d.marcaDetached.dataInizioValiditaCertSpecified)
                        {
                            ts.dataInizioValiditaCert = d.marcaDetached.dataInizioValiditaCert;
                        }
                    }
                    else
                    {
                        //default nel caso la try sotto desse errore
                        ts.TSANameIssuer = "Marca non Detached, dati non disponibili";

                        //se questo dato ce l'ho lo valido
                        if (d.dataVerificaFirmaSpecified)
                        {
                            ts.TSdateTime = d.dataVerificaFirma;
                        }
                    }
                }
                else
                {
                }
            }

            if (d.datiFirmatari != null)
            {
                foreach (FirmaDigitale.FirmatarioType ft in d.datiFirmatari)
                {
                    //firmatari
                    DocsPaVO.documento.SignerInfo si = ExtractSignerInfo(status, ft.firmatario, ft.marcaFirma);

                    //controfirmatari
                    if (ft.controfirmatario != null)
                    {
                        List <DocsPaVO.documento.SignerInfo> csiLst = new List <DocsPaVO.documento.SignerInfo>();
                        foreach (FirmaDigitale.FirmatarioTypeControfirmatario cft in ft.controfirmatario)
                        {
                            DocsPaVO.documento.SignerInfo csi = ExtractSignerInfo(status, cft.firma, cft.marca);
                            csi.isCountersigner = true;
                            csiLst.Add(csi);
                        }
                        if (csiLst.Count > 0)
                        {
                            si.counterSignatures = csiLst.ToArray();
                        }
                    }

                    siLst.Add(si);
                }
            }

            List <DocsPaVO.documento.PKCS7Document> p7docsLst = new List <DocsPaVO.documento.PKCS7Document>();

            DocsPaVO.documento.PKCS7Document p7doc = new DocsPaVO.documento.PKCS7Document
            {
                SignersInfo      = siLst.ToArray(),
                DocumentFileName = null,
                Level            = 0
            };
            p7docsLst.Add(p7doc);
            vsr.PKCS7Documents = p7docsLst.ToArray();
            vsr.CRLOnlineCheck = true;
            return(vsr);
        }
Beispiel #4
0
        private static VerifySignatureResult ConvertToVerifySignatureResultUsingDatiGeneraliVerifica(EsitoVerificaStatus status, FirmaDigitale.DettaglioFirmaDigitaleType d)
        {
            DeSign.deSign design       = null;
            string        verbosesgb   = ConfigurationManager.AppSettings["VERBOSEDEBUG"];
            bool          verboseDebug = false;

            Boolean.TryParse(verbosesgb, out verboseDebug);

            try
            {
                if (!String.IsNullOrEmpty(d.datiGeneraliVerifica))
                {
                    if (verboseDebug)
                    {
                        logger.InfoFormat("Risposta da infocert {0}", d.datiGeneraliVerifica);
                    }

                    design = DeSign.deSign.Deserialize(d.datiGeneraliVerifica);
                }
            }
            catch (Exception e)
            {
                logger.ErrorFormat("Errore deserializzando i dati da infocert {0} {1}", e.Message, e.StackTrace);
                return(null);
            }

            VerifySignatureResult vsr = new VerifySignatureResult();


            List <DocsPaVO.documento.SignerInfo>    siLst     = new List <SignerInfo>();
            List <DocsPaVO.documento.PKCS7Document> p7docsLst = new List <PKCS7Document>();
            string digestAlgo   = string.Empty;
            bool   badSignature = false;

            foreach (object item in design.signedData)
            {
                //trattasi di signedData
                DeSign.signedData sd = item as DeSign.signedData;
                foreach (DeSign.signer signer in sd.signer)
                {
                    DocsPaVO.documento.SignerInfo si = convertToSignerInfo(signer);

                    if (si.CertificateInfo.RevocationStatus != 0)
                    {
                        vsr.StatusCode        = si.CertificateInfo.RevocationStatus;
                        vsr.StatusDescription = si.CertificateInfo.RevocationStatusDescription;
                    }
                    digestAlgo = convertOidToString(signer.digestAlgorithm);

                    if (signer.status == "KO")
                    {
                        if (!badSignature)
                        {
                            badSignature = true;
                        }
                    }

                    siLst.Add(si);
                }
            }

            List <TSInfo> tsList = new List <TSInfo>();

            foreach (object item in design.timeStamp)
            {
                //trattasi di signedData
                DeSign.timeStamp ts  = item as DeSign.timeStamp;
                TSInfo           tsi = new TSInfo
                {
                    dataInizioValiditaCert = convertSimpleDateTime(ts.certNotBefore),
                    dataFineValiditaCert   = convertSimpleDateTime(ts.certNotAfter),
                    TSdateTime             = convertSimpleDateTime(ts.timeStampDate),
                    TSimprint      = ts.timeStampImprint,
                    TSANameIssuer  = ts.issuer.CN,
                    TSANameSubject = ts.subject.CN,
                    TSserialNumber = ts.timeStampSerial,
                    TSType         = TsType.PKCS
                };
                tsList.Add(tsi);
            }
            if (tsList.Count > 0)
            {
                vsr.DocumentTimeStampInfo = tsList.ToArray();
            }

            p7docsLst.Add(new PKCS7Document
            {
                SignersInfo      = siLst.ToArray(),
                DocumentFileName = null,
                Level            = 0
            });
            vsr.PKCS7Documents = p7docsLst.ToArray();
            vsr.CRLOnlineCheck = true;

            if ((badSignature) && (vsr.StatusCode == 0))
            {
                vsr.StatusCode = -1;
            }

            return(vsr);
        }
Beispiel #5
0
        public EsitoVerifica VerificaByteEVCompleta(byte[] fileContents, DateTime?dataverificaDT, FirmaDigitale.FirmaDigitalePortTypeClient client)
        {
            logger.Debug("INIZIO");
            logger.Debug("VERIFICA FIRMA COMPLETA");
            string verbosesgb   = ConfigurationManager.AppSettings["VERBOSEDEBUG"];
            bool   verboseDebug = false;

            Boolean.TryParse(verbosesgb, out verboseDebug);


            EsitoVerifica ev = new EsitoVerifica();

            FirmaDigitale.DettaglioFirmaDigitaleType ret = null;

            string dataVerificaString = string.Empty;


            try
            {
                if (dataverificaDT != null)
                {
                    dataVerificaString = zeniDateConverter(dataverificaDT);
                }
                else
                {
                    dataVerificaString = null;
                }
                System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Ssl3;
            }
            catch (Exception ex)
            {
                string inner = string.Empty;
                ev.status = EsitoVerificaStatus.ErroreGenerico;
                if (ex.InnerException != null)
                {
                    inner = ex.InnerException.Message;
                }
                ev.message = string.Format("{0},{1}   INNER {2} ", ex.Message, ex.StackTrace, inner);
                return(ev);
            }


            try
            {
                sbyte?controlloFirmeAnnidate = 1;
                logger.Debug("Data Verifica: " + dataVerificaString + " (" + dataverificaDT.ToString() + ")");

                FirmaDigitale.DocumentoType doc = new FirmaDigitale.DocumentoType();
                ret = client.VerificaFirmaCompleta(fileContents, dataVerificaString, controlloFirmeAnnidate, out doc);

                ev.status = EsitoVerificaStatus.Valid;

                if (ret != null)
                {
                    ev.VerifySignatureResult = ConvertToVerifySignatureResult(ev.status, ret);
                }
                ;

                if (verboseDebug)
                {
                    logger.Info(Utils.SerializeObject <EsitoVerifica>(ev));
                }
                logger.Debug("Firma OK");

                return(ev);
            }

            catch (FaultException <FirmaDigitale.FaultType> f)
            {
                ev.status    = EsitoVerificaStatus.ErroreGenerico;
                ev.message   = f.Detail.userMessage;
                ev.errorCode = f.Detail.errorCode;
                logger.Error("errore in verifica firma completa:" + ev.message);
                if (logger.IsInfoEnabled)
                {
                    logger.Info(Utils.SerializeObject <EsitoVerifica>(ev));
                }
                return(ev);
            }

            catch (FaultException <FirmaDigitale.WarningResponseType> w)
            {
                List <string> lstW = new List <string>();
                foreach (FirmaDigitale.WarningType s in w.Detail.WarningFault)
                {
                    lstW.Add(Utils.SerializeObject <FirmaDigitale.WarningType>(s));

                    ev.message   = s.errorMsg;
                    ev.errorCode = s.errorCode;
                    ev.SubjectDN = s.SubjectDN;
                    ev.SubjectCN = s.SubjectCN;

                    ev.status = EsitoVerificaStatus.ErroreGenerico;

                    if (s.errorCode == "1426")
                    {
                        ev.status = EsitoVerificaStatus.CtlNotTimeValid;
                    }
                    if (s.errorCode == "1468")
                    {
                        ev.status = EsitoVerificaStatus.SHA1NonSupportato;
                    }
                    if (s.errorCode == "1407")  // check
                    {
                        ev.status = EsitoVerificaStatus.NotTimeValid;
                    }
                    if (s.errorCode == "1408")  // check
                    {
                        ev.status = EsitoVerificaStatus.Revoked;
                        foreach (FirmaDigitale.FirmatarioType ft in w.Detail.DettaglioFirmaDigitale.datiFirmatari)
                        {
                            if (ft.firmatario.dataRevocaCertificato != DateTime.MinValue)
                            {
                                ev.dataRevocaCertificato = ft.firmatario.dataRevocaCertificato;
                            }
                        }
                    }
                }

                //TEST!!!!
                FirmaDigitale.DettaglioFirmaDigitaleType d = w.Detail.DettaglioFirmaDigitale;
                if (w.Detail.Documento != null)
                {
                    ev.content = w.Detail.Documento.fileOriginale;
                }

                ev.VerifySignatureResult = ConvertToVerifySignatureResult(ev.status, d);;
                ev.additionalData        = lstW.ToArray();

                logger.Debug("Firma verificata con warning");
                if (logger.IsInfoEnabled)
                {
                    logger.Info(Utils.SerializeObject <EsitoVerifica>(ev));
                }
                return(ev);
            }

            catch (Exception ex)
            {
                ev.status  = EsitoVerificaStatus.ErroreGenerico;
                ev.message = string.Format("{0},{1}", ex.Message, ex.StackTrace);
                logger.Error(ev.message);
                if (logger.IsInfoEnabled)
                {
                    logger.Info(Utils.SerializeObject <EsitoVerifica>(ev));
                }
                return(ev);
            }
        }
Beispiel #6
0
        private static VerifySignatureResult ConvertToVerifySignatureResult(EsitoVerificaStatus status, FirmaDigitale.DettaglioFirmaDigitaleType d)
        {
            string usedgv = ConfigurationManager.AppSettings["USEDATIGENERALIVERIFICA"];
            bool   UseDatiGeneraliVerifica = false;

            Boolean.TryParse(usedgv, out UseDatiGeneraliVerifica);

            if (!UseDatiGeneraliVerifica)
            {
                return(ConvertToVerifySignatureResultUsingInternalStructures(status, d));
            }
            else
            {
                return(ConvertToVerifySignatureResultUsingDatiGeneraliVerifica(status, d));
            }
        }