Example #1
0
        public static bool validatePDF(string filename, ref MessageReport msg)
        {
            try
            {
                X509CertificateParser parser = new X509CertificateParser();

                if (certificates.Count() == 0)
                {
                    certificates.Add(parser.ReadCertificate(new FileStream(ROOT1, FileMode.Open)));
                    certificates.Add(parser.ReadCertificate(new FileStream(ROOT2, FileMode.Open)));
                    certificates.Add(parser.ReadCertificate(new FileStream(ROOT3, FileMode.Open)));
                }


                PdfReader pdfReader = new PdfReader(filename);

                AcroFields    acroFields     = pdfReader.AcroFields;
                List <String> signatureNames = acroFields.GetSignatureNames();

                msg.signaturesCount = signatureNames.Count();

                if (signatureNames.Count == 0)
                {
                    msg.StatusText = "Δεν βρέθηκαν ψηφιακές υπογραφές στο έγγραφο!";
                    return(false);
                }

                SignaturePermissions    perms   = null;
                MessageReport.Signature sigInfo = new MessageReport.Signature();


                foreach (String name in signatureNames)
                {
                    sigInfo = InspectSignature(acroFields, name, perms);
                    UpdateSignatureResults(ref sigInfo);         //produce human friendly result text

                    msg.Signatures.Add(sigInfo);
                }
                msg.StatusText = String.Format("Ο έλεγχος ολοκληρώθηκε επιτυχώς. Βρέθηκαν {0} ψηφιακές υπογραφές στο έγγραφο!", msg.signaturesCount);
                return(true);
            }
            catch
            {
                return(false);
            }
        }         //end validatePDF
        private static PdfPKCS7 VerifySignature(AcroFields fields, String name, ref MessageReport.Signature sigInfo)
        {
            sigInfo.isCoveringWholeDocument = fields.SignatureCoversWholeDocument(name);

            PdfPKCS7 pkcs7 = fields.VerifySignature(name);

            sigInfo.isIntegral = pkcs7.Verify();

            X509Certificate[] certs = pkcs7.SignCertificateChain;
            DateTime cal = pkcs7.SignDate;

            IList<VerificationException> errors = CertificateVerification.VerifyCertificates(certs, certificates, null, cal);
            if (errors == null)
                Console.WriteLine("Certificates verified against the KeyStore");
            else
                foreach (object error in errors)
                    Console.WriteLine(error);
            for (int i = 0; i < certs.Length; ++i)
            {
                X509Certificate cert = certs[i];

            }
            X509Certificate signCert = certs[0];
            X509Certificate issuerCert = (certs.Length > 1 ? certs[1] : null);

            sigInfo.Certificate = GetCertificateInfo(signCert, cal.ToLocalTime());

            sigInfo.isValidDateSigning = CheckRevocation(pkcs7, signCert, issuerCert, cal);

            sigInfo.isValidToday = CheckRevocation(pkcs7, signCert, issuerCert, DateTime.Now.AddDays(-1));

            return pkcs7;
        }
        private static void UpdateSignatureResults(ref MessageReport.Signature s)
        {
            MessageReport.Results r = new MessageReport.Results();
            string hm = string.Empty;

            r.result = false;

            hm = "Το αρχείο ";

            if (s.Certificate.isHardCertificate == false) hm += "δεν ";
            hm += "έχει υπογραφεί με χρήση πιστοποιητικού σκληρής αποθήκευσης της ΑΠΕΔ,  ";

            hm += "το οποίο ";
            if (s.isValidDateSigning == false) hm += "δεν ";
            hm += " ήταν έγκυρο κατά την ημερομηνία υπογραφής. ";

            hm += "Το αρχείο  ";
            if (s.isIntegral) hm += "δεν ";
            hm += " έχει τροποποιηθεί μετά την υπογραφή του και  ";

            if (s.isTimestampped == false) hm += "δεν ";
            hm += " φέρει ενσωματωμένη χρονοσφραγίδα. ";

            if (s.isValidDateSigning && s.isIntegral && s.isTimestampped && s.Certificate.isHardCertificate)
            {
                r.result = true;
            }

            r.resultText = hm;

            s.Results = r;
        }
        public static bool validatePDF(string filename, ref  MessageReport msg)
        {
            try
                    {

                        X509CertificateParser parser = new X509CertificateParser();

                        if (certificates.Count() == 0)
                        {
                            certificates.Add(parser.ReadCertificate(new FileStream(ROOT1, FileMode.Open)));
                            certificates.Add(parser.ReadCertificate(new FileStream(ROOT2, FileMode.Open)));
                            certificates.Add(parser.ReadCertificate(new FileStream(ROOT3, FileMode.Open)));

                        }

                        PdfReader pdfReader = new PdfReader(filename);

                        AcroFields acroFields = pdfReader.AcroFields;
                        List<String> signatureNames = acroFields.GetSignatureNames();

                        msg.signaturesCount = signatureNames.Count();

                        if (signatureNames.Count == 0)
                        {
                            msg.StatusText = "Δεν βρέθηκαν ψηφιακές υπογραφές στο έγγραφο!";
                            return false;
                        }

                        SignaturePermissions perms = null;
                        MessageReport.Signature sigInfo = new MessageReport.Signature();

                        foreach (String name in signatureNames)
                        {

                            sigInfo = InspectSignature(acroFields, name, perms);
                            UpdateSignatureResults(ref sigInfo); //produce human friendly result text

                            msg.Signatures.Add(sigInfo);

                        }
                        msg.StatusText = String.Format("Ο έλεγχος ολοκληρώθηκε επιτυχώς. Βρέθηκαν {0} ψηφιακές υπογραφές στο έγγραφο!", msg.signaturesCount);
                        return true;
                    }
                    catch
                    {
                        return false;
                    }
        }