public String RecGetAllExpiryDate(int lev, byte[] p7m, ref SimplyCert firstExp, ref Hashtable SimCrtLst) { string LastErr = ""; try { int nHandle = 0, nCountSignature = 0, nCountTimeStamp = 0, nCountSignaturePDF = 0; int nHandlePDF = 0, nP7KHandle = 0; oDigest.PADES_OpenFromBuf(p7m, out nHandlePDF); if (nHandlePDF > 0) { nCountSignaturePDF = oDigest.PADES_GetSignatureCount(nHandlePDF); for (int j = 0; j < nCountSignature; j++) { int nHandleX509 = 0; Object vtCertBuf = null; oDigest.PADES_GetSignatureObject(nHandlePDF, j, out nP7KHandle); CCypher.enumHashType nEnumHashType = CCypher.enumHashType.HTC_SHA1; CCypher.enumASN1Type cct; object obj; oDigest.P7kGetSignAttribute(nP7KHandle, 0, j, "unstructuredName", out cct, out obj); string tmpHeader = obj as string; oDigest.P7kGetSignerInfo(nP7KHandle, j, out nEnumHashType, out vtCertBuf); oDigest.x509LoadFromBuf(vtCertBuf, out nHandleX509); string sRetInfo = "", Name = "", fc = "", des = "", role = "", iss = "", org = "", email = "", serial = "", vers = "", id = ""; oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_GENERAL, CCypher.enumCertInfoItem.CI_VALID_TO, out sRetInfo); DateTime dt = new DateTime(int.Parse(sRetInfo.Substring(6, 4)), int.Parse(sRetInfo.Substring(3, 2)), int.Parse(sRetInfo.Substring(0, 2))); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_GENERAL, CCypher.enumCertInfoItem.CI_VALID_FROM, out sRetInfo); DateTime dtvf = new DateTime(int.Parse(sRetInfo.Substring(6, 4)), int.Parse(sRetInfo.Substring(3, 2)), int.Parse(sRetInfo.Substring(0, 2))); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_SUBJECT, CCypher.enumCertInfoItem.CI_NAME, out Name); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_SUBJECT, CCypher.enumCertInfoItem.CI_FISCALCODE, out fc); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_ISSUER, CCypher.enumCertInfoItem.CI_NAME, out iss); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_ALL, CCypher.enumCertInfoItem.CI_DESCRIPTION, out des); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_SUBJECT, CCypher.enumCertInfoItem.CI_ROLE, out role); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_SUBJECT, CCypher.enumCertInfoItem.CI_EMAIL, out email); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_GENERAL, CCypher.enumCertInfoItem.CI_SERIALNUMBER, out serial); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_GENERAL, CCypher.enumCertInfoItem.CI_VERSION, out vers); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_GENERAL, CCypher.enumCertInfoItem.CI_ID, out id); if ((DateTime.Compare(firstExp.Expiry, dt) > 0 || j == 0) && firstExp.Type != TOK_TypeTS) { firstExp.Level = lev; firstExp.Type = TOK_TypeSign; firstExp.Name = Name; firstExp.Expiry = dt; firstExp.FiscalCode = fc; firstExp.Role = role; firstExp.Description = des; firstExp.Issuer = iss; firstExp.eMail = email; firstExp.ValidFrom = dtvf; firstExp.HeaderInfo = tmpHeader; firstExp.SerialNumber = serial; firstExp.Version = vers; firstExp.Id = id; } SimplyCert sc = new SimplyCert(); sc.Level = lev; sc.Type = TOK_TypeSign; sc.Name = Name; sc.Expiry = dt; sc.FiscalCode = fc; sc.ValidFrom = dtvf; sc.Description = des; sc.Issuer = iss; sc.Role = role; sc.eMail = email; sc.HeaderInfo = tmpHeader; sc.SerialNumber = serial; sc.Version = vers; sc.Id = id; SimCrtLst.Add((ele++).ToString(), (object)sc); oDigest.x509Free(nHandleX509); oDigest.P7kFree(nP7KHandle); // nei PDF non c'è ricorsione sui contenuti } if (nHandlePDF != 0) { oDigest.PADES_Free(nHandlePDF); } } // Inizio CAdES oDigest.P7kLoadFromBuf(p7m, 1, out nHandle); if (nHandle > 0) { oDigest.P7kGetSignatureCount(nHandle, out nCountSignature); for (int j = 0; j < nCountSignature; j++) { int nHandleX509 = 0; Object vtCertBuf = null; CCypher.enumHashType nEnumHashType = CCypher.enumHashType.HTC_SHA1; CCypher.enumASN1Type cct; object obj; oDigest.P7kGetSignAttribute(nHandle, 0, j, "unstructuredName", out cct, out obj); string tmpHeader = obj as string; oDigest.P7kGetSignerInfo(nHandle, j, out nEnumHashType, out vtCertBuf); oDigest.x509LoadFromBuf(vtCertBuf, out nHandleX509); string sRetInfo = "", Name = "", fc = "", des = "", role = "", iss = "", org = "", email = "", serial = "", vers = "", id = ""; oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_GENERAL, CCypher.enumCertInfoItem.CI_VALID_TO, out sRetInfo); DateTime dt = new DateTime(int.Parse(sRetInfo.Substring(6, 4)), int.Parse(sRetInfo.Substring(3, 2)), int.Parse(sRetInfo.Substring(0, 2))); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_GENERAL, CCypher.enumCertInfoItem.CI_VALID_FROM, out sRetInfo); DateTime dtvf = new DateTime(int.Parse(sRetInfo.Substring(6, 4)), int.Parse(sRetInfo.Substring(3, 2)), int.Parse(sRetInfo.Substring(0, 2))); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_SUBJECT, CCypher.enumCertInfoItem.CI_NAME, out Name); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_SUBJECT, CCypher.enumCertInfoItem.CI_FISCALCODE, out fc); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_ISSUER, CCypher.enumCertInfoItem.CI_NAME, out iss); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_ALL, CCypher.enumCertInfoItem.CI_DESCRIPTION, out des); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_SUBJECT, CCypher.enumCertInfoItem.CI_ROLE, out role); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_SUBJECT, CCypher.enumCertInfoItem.CI_EMAIL, out email); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_GENERAL, CCypher.enumCertInfoItem.CI_SERIALNUMBER, out serial); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_GENERAL, CCypher.enumCertInfoItem.CI_VERSION, out vers); oDigest.x509GetInfo(nHandleX509, CCypher.enumCertInfoCategory.CC_GENERAL, CCypher.enumCertInfoItem.CI_ID, out id); if ((DateTime.Compare(firstExp.Expiry, dt) > 0 || j == 0) && firstExp.Type != TOK_TypeTS) { firstExp.Level = lev; firstExp.Type = TOK_TypeSign; firstExp.Name = Name; firstExp.Expiry = dt; firstExp.FiscalCode = fc; firstExp.Role = role; firstExp.Description = des; firstExp.Issuer = iss; firstExp.eMail = email; firstExp.ValidFrom = dtvf; firstExp.HeaderInfo = tmpHeader; firstExp.SerialNumber = serial; firstExp.Version = vers; firstExp.Id = id; } SimplyCert sc = new SimplyCert(); sc.Level = lev; sc.Type = TOK_TypeSign; sc.Name = Name; sc.Expiry = dt; sc.FiscalCode = fc; sc.ValidFrom = dtvf; sc.Description = des; sc.Issuer = iss; sc.Role = role; sc.eMail = email; sc.HeaderInfo = tmpHeader; sc.SerialNumber = serial; sc.Version = vers; sc.Id = id; SimCrtLst.Add((ele++).ToString(), (object)sc); oDigest.x509Free(nHandleX509); } object OutBuf; oDigest.P7kContentReadToBuf(nHandle, out OutBuf, 0); oDigest.P7kFree(nHandle); RecGetAllExpiryDate(lev + 1, (byte[])OutBuf, ref firstExp, ref SimCrtLst); } // marche temporali oDigest.P7xLoadFromBuf(p7m, out nHandle); if (nHandle > 0) { oDigest.P7xGetTSCount(nHandle, out nCountTimeStamp); //SimCrtLst=new SimplyCert[nCountTimeStamp]; for (int j = 0; j < nCountTimeStamp && LastErr.Length == 0; j++) { int nHandleTS = 0; oDigest.P7xGetTS(nHandle, j, out nHandleTS); if (nHandleTS == 0) { int ErrCode; CCypher.enumErrorClass ErrClass; oDigest.GetLastError(out ErrClass, out ErrCode, out LastErr); } else { object DaT; oDigest.tsGetDateAndTime(nHandleTS, out DaT); DateTime dt = (DateTime)DaT; oDigest.tsGetExpieryDateAndTime(nHandleTS, out DaT); DateTime dte = (DateTime)DaT; if ((DateTime.Compare(firstExp.Expiry, dte) > 0 || j == 0) && firstExp.Type != TOK_TypeTS) { firstExp.Level = lev; firstExp.Type = TOK_TypeTS; firstExp.Name = (j + 1).ToString(); firstExp.Expiry = dte; } SimplyCert sc = new SimplyCert(); sc.Level = lev; sc.Type = TOK_TypeTS; oDigest.tsGetTSPInfo(nHandleTS, CCypher.enumCertInfoCategory.CC_SUBJECT, CCypher.enumCertInfoItem.CI_NAME, out sc.Name); oDigest.tsGetTSPInfo(nHandleTS, CCypher.enumCertInfoCategory.CC_ISSUER, CCypher.enumCertInfoItem.CI_NAME, out sc.Issuer); oDigest.tsGetTSPInfo(nHandleTS, CCypher.enumCertInfoCategory.CC_ALL, CCypher.enumCertInfoItem.CI_NAME, out sc.Description); //sc.Name=(j+1).ToString(); sc.Expiry = dte; sc.ValidFrom = dt; SimCrtLst.Add((ele++).ToString(), (object)sc); oDigest.tsFree(nHandleTS); } } object OutBuf; oDigest.P7xContentReadToBuf(nHandle, out OutBuf, 0); oDigest.P7xFree(nHandle); RecGetAllExpiryDate(lev + 1, (byte[])OutBuf, ref firstExp, ref SimCrtLst); } } catch (Exception e) { LastErr = e.Message; } return(LastErr); }