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);
        }
Пример #2
0
        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);
        }