/// <summary> /// Estrae determinati dati del certificato dal timestamp /// </summary> /// <param name="certsColl"></param> /// <returns></returns> public DocsPaVO.documento.TSInfo getTSCertInfo(ICollection certsColl) { DocsPaVO.documento.TSInfo retval = new DocsPaVO.documento.TSInfo(); try { foreach (object obj in certsColl) { retval.dataInizioValiditaCert = (DateTime)getProps("NotBefore", obj); retval.dataFineValiditaCert = (DateTime)getProps("NotAfter", obj); string issuer = (string)getProps("IssuerDN", obj).ToString(); string subject = (string)getProps("SubjectDN", obj).ToString(); DocsPaVO.documento.SubjectInfo subjectInfo = new DocsPaVO.documento.SubjectInfo(); SignedDocument sd = new SignedDocument(); sd.ParseCNIPASubjectInfo(ref subjectInfo, issuer); retval.TSANameIssuer = subjectInfo.CommonName; sd.ParseCNIPASubjectInfo(ref subjectInfo, subject); retval.TSANameSubject = subjectInfo.CommonName; break; //solo il primo } } catch {} return(retval); }
public DocsPaVO.documento.TSInfo getTSCertInfo(string base64TSR) { TimeStampResponse resp = getTsRes(Convert.FromBase64String(base64TSR)); ICollection certsColl = resp.TimeStampToken.GetCertificates("COLLECTION").GetMatches(null); DocsPaVO.documento.TSInfo retval = getTSCertInfo(certsColl); retval.TSdateTime = resp.TimeStampToken.TimeStampInfo.GenTime.ToLocalTime(); retval.TSserialNumber = resp.TimeStampToken.TimeStampInfo.SerialNumber.ToString(); retval.TSimprint = Convert.ToBase64String(resp.TimeStampToken.TimeStampInfo.TstInfo.MessageImprint.GetEncoded()); retval.TSdateTime = resp.TimeStampToken.TimeStampInfo.GenTime; retval.TSType = DocsPaVO.documento.TsType.TSR; return(retval); }
/// <summary> /// /// </summary> /// <param name="fileDoc"></param> /// <returns></returns> public static bool VerifyPadesSignature(DocsPaVO.documento.FileDocumento fileDoc) { SignedDocument si = new SignedDocument(); VerifyTimeStamp verifyTimeStamp = new VerifyTimeStamp(); string padesSignAlgorithm = null; dpaItextSharp.text.pdf.PdfReader pdfReader = null; try { pdfReader = new dpaItextSharp.text.pdf.PdfReader(fileDoc.content); } catch { return(false); } dpaItextSharp.text.pdf.AcroFields af = pdfReader.AcroFields; List <string> signNames = af.GetSignatureNames().Cast <string>().ToList <string>(); if (signNames.Count == 0) //Firma non è presente { return(false); } List <DocsPaVO.documento.SignerInfo> siList = new List <DocsPaVO.documento.SignerInfo>(); bool verResult = true; foreach (string name in signNames) { List <DocsPaVO.documento.TSInfo> tsLst = new List <DocsPaVO.documento.TSInfo>(); dpaItextSharp.text.pdf.PdfPKCS7 pk = af.VerifySignature(name); try { padesSignAlgorithm = "PADES " + pk.GetHashAlgorithm(); } catch (Exception exalg) { padesSignAlgorithm = "PADES : errore ricavando l'algo Hash:" + exalg.Message; } byte[] cert = pk.SigningCertificate.GetEncoded(); DocsPaVO.documento.SignerInfo sinfo = si.GetCertSignersInfo(cert); sinfo.SignatureAlgorithm = padesSignAlgorithm; sinfo.SigningTime = pk.SignDate; if (verResult) //fino a che è true verifica { verResult = pk.Verify(); } if (pk.TimeStampToken != null) { //Ricavo il certificato ICollection certsColl = pk.TimeStampToken.GetCertificates("COLLECTION").GetMatches(null); DocsPaVO.documento.TSInfo timeStamp = verifyTimeStamp.getTSCertInfo(certsColl); timeStamp.TSdateTime = pk.TimeStampToken.TimeStampInfo.GenTime.ToLocalTime(); timeStamp.TSserialNumber = pk.TimeStampToken.TimeStampInfo.SerialNumber.ToString(); timeStamp.TSimprint = Convert.ToBase64String(pk.TimeStampToken.TimeStampInfo.TstInfo.MessageImprint.GetEncoded()); timeStamp.TSType = DocsPaVO.documento.TsType.PADES; tsLst.Add(timeStamp); } if (tsLst.Count > 0) { sinfo.SignatureTimeStampInfo = tsLst.ToArray(); } siList.Add(sinfo); } DocsPaVO.documento.VerifySignatureResult result = new DocsPaVO.documento.VerifySignatureResult(); if (verResult) { result.StatusCode = 0; result.StatusDescription = "La Verifica OK, ma senza controllo CRL"; } else { result.StatusCode = -1; result.StatusDescription = "La Verifica di almeno un firmatario e Fallita"; } List <DocsPaVO.documento.PKCS7Document> pkcsDocs = new List <DocsPaVO.documento.PKCS7Document>(); if ((fileDoc.signatureResult != null) && (fileDoc.signatureResult.PKCS7Documents != null) && (fileDoc.signatureResult.PKCS7Documents.Length > 0)) { foreach (DocsPaVO.documento.PKCS7Document docs in fileDoc.signatureResult.PKCS7Documents) { pkcsDocs.Add(docs); } } pkcsDocs.Add(new DocsPaVO.documento.PKCS7Document { SignersInfo = siList.ToArray(), SignAlgorithm = padesSignAlgorithm, DocumentFileName = fileDoc.nomeOriginale, SignHash = "Non Disponibile per la firma PADES", SignatureType = DocsPaVO.documento.SignType.PADES }); result.PKCS7Documents = pkcsDocs.ToArray(); result.FinalDocumentName = fileDoc.name; fileDoc.signatureResult = result; return(false); }