private IntPtr buildCrl() { string crlCache = prepareCrlCache(); if (crlCache == null) { return(IntPtr.Zero); } IntPtr pCrlContext = openCRL(crlCache); if (IntPtr.Zero == pCrlContext) { _errMsg = Win32.Win32.ShowWin32Error(Marshal.GetLastWin32Error()); return(IntPtr.Zero); } Win32.Win32.CRL_CONTEXT crlContext = (Win32.Win32.CRL_CONTEXT)Marshal.PtrToStructure(pCrlContext, typeof(Win32.Win32.CRL_CONTEXT)); Win32.Win32.CRL_INFO crlInfo = (Win32.Win32.CRL_INFO)Marshal.PtrToStructure(crlContext.pCrlInfo, typeof(Win32.Win32.CRL_INFO)); DateTime crlUpdate = DateTime.FromFileTime(((long)crlInfo.NextUpdate.dwHighDateTime << 32) + (long)crlInfo.NextUpdate.dwLowDateTime); if (crlUpdate < DateTime.Now) { Win32.Win32.CertFreeCRLContext(pCrlContext); NetTool.CacheUrlResource(_crlUrl, crlCache); if (!File.Exists(crlCache)) { _errMsg = String.Format("無法讀取載憑證廢止清單=>{0}", crlCache); return(IntPtr.Zero); } pCrlContext = openCRL(crlCache); if (IntPtr.Zero == pCrlContext) { _errMsg = Win32.Win32.ShowWin32Error(Marshal.GetLastWin32Error()); return(IntPtr.Zero); } } return(pCrlContext); }
private bool isCertNotRevoked(IntPtr pCert, string crlUrl) { if (String.IsNullOrEmpty(crlUrl)) { return(false); } bool bResult = false; string crlCache; Uri uri = new Uri(crlUrl); crlCache = Path.Combine(Logger.LogPath, Uri.UnescapeDataString(uri.Segments[uri.Segments.Length - 1])); if (!File.Exists(crlCache)) { downloadCRL(crlUrl, crlCache); } if (!File.Exists(crlCache)) { _log.Message = String.Format("無法下載憑證廢止清單=>{0}", crlUrl); return(false); } IntPtr pCrlContext; #region 取得憑證廢止清單 pCrlContext = openCRL(crlCache); if (IntPtr.Zero == pCrlContext) { _log.Message = ShowWin32Error(Marshal.GetLastWin32Error()); return(false); } Win32.Win32.CRL_CONTEXT crlContext = (Win32.Win32.CRL_CONTEXT)Marshal.PtrToStructure(pCrlContext, typeof(Win32.Win32.CRL_CONTEXT)); Win32.Win32.CRL_INFO crlInfo = (Win32.Win32.CRL_INFO)Marshal.PtrToStructure(crlContext.pCrlInfo, typeof(Win32.Win32.CRL_INFO)); DateTime crlUpdate = DateTime.FromFileTime(((long)crlInfo.NextUpdate.dwHighDateTime << 32) + (long)crlInfo.NextUpdate.dwLowDateTime); if (crlUpdate < DateTime.Now) { Win32.Win32.CertFreeCRLContext(pCrlContext); downloadCRL(crlUrl, crlCache); if (!File.Exists(crlCache)) { _log.Message = String.Format("無法讀取載憑證廢止清單=>{0}", crlCache); return(false); } pCrlContext = openCRL(crlCache); if (IntPtr.Zero == pCrlContext) { _log.Message = ShowWin32Error(Marshal.GetLastWin32Error()); return(false); } } #endregion IntPtr pCrlEntry = IntPtr.Zero; bResult = Win32.Win32.CertFindCertificateInCRL(pCert, pCrlContext, 0, IntPtr.Zero, ref pCrlEntry); if (bResult) { if (IntPtr.Zero != pCrlEntry) { _log.Message = "憑證已撤銷!"; bResult = false; } } Win32.Win32.CertFreeCRLContext(pCrlContext); return(bResult); }