﻿   
    document.write('<OBJECT id="oCAPICOM" codeBase="http://download.microsoft.com/download/E/1/8/E18ED994-8005-4377-A7D7-0A8E13025B94/capicom.cab#version=2,0,0,3" classid="clsid:A996E48C-D3DC-4244-89F7-AFA33EC60679" VIEWASTEXT></OBJECT>');
    var CAPICOM_CURRENT_USER_STORE = 2;
    var CAPICOM_STORE_OPEN_READ_ONLY = 0;
    var CAPICOM_ENCODE_BASE64 = 0;
    var CAPICOM_ENCODE_BINARY = 1;
     
    var CAPICOM_INFO_SUBJECT_SIMPLE_NAME = 0;
    var CAPICOM_INFO_ISSUER_SIMPLE_NAME = 1;
    var CAPICOM_INFO_SUBJECT_EMAIL_NAME = 2;
    var CAPICOM_INFO_ISSUER_EMAIL_NAME = 3;
 
    function SelectMySignCert()
    {
       var mystore = new ActiveXObject("CAPICOM.Store");
       try
       {  
          mystore.Open(CAPICOM_CURRENT_USER_STORE,"My",CAPICOM_STORE_OPEN_READ_ONLY);
       }
       catch(e)
       {
          alert(e.message);
          return null;
       }
       var certs= mystore.Certificates;
       var mycerts= new ActiveXObject("CAPICOM.Certificates");
       for(i=1;i<=certs.Count;i++)
       {
           var issuer=certs.Item(i).IssuerName;
           if(issuer.indexOf("CN=root-tnx")<0)     //not myca
                     continue;
           var ku=certs.Item(i).KeyUsage();
          
//           if(!ku.IsDigitalSignatureEnabled)   //not sign cert
//                     continue;
            mycerts.Add(certs.Item(i));
  
       }
       
       if(mycerts.Count==0)
       {
              if(window.confirm("没有找到tnx签发的证书,\r\n请插入USBKey再按确定")==true)
                     return SelectMySignCert();
              else
                     return null;
       }
       //select cert
       else if(mycerts.Count==1)
       {
          cert=mycerts.Item(1);
       }
       else
       {
           try
           {
               var certsel= mycerts.Select("选择证书","请选择您自己的证书:",false);
               if(certsel==null)return null;
               cert = certsel.Item(1);
           }
           catch(err)
           {
             alert(err.message);
             return false;
           }
       }
       return cert;
}
       
 function FindCertification(KeySerialNumber)
    {
       var mystore = new ActiveXObject("CAPICOM.Store");
       try
       {  
          mystore.Open(CAPICOM_CURRENT_USER_STORE,"AddressBook",CAPICOM_STORE_OPEN_READ_ONLY);
       }
       catch(e)
       {
          alert(e.message);
          return null;
       }
       var certs= mystore.Certificates;
       var mycerts= new ActiveXObject("CAPICOM.Certificates");
       for(i=1;i<=certs.Count;i++)
       {
           var issuer=certs.Item(i).IssuerName;
           if(issuer.indexOf("CN=root-tnx")<0)     //not myca
                     continue;
            if(certs.Item(i).SerialNumber.toUpperCase()==KeySerialNumber.toUpperCase())
             return certs.Item(i);
  
       }
       return null;
}
 function signed(sigContent,SignedData,KeySerialNumber)
 {
       var signer = new ActiveXObject("CAPICOM.Signer");
       var cert=SelectMySignCert();
       if(!cert)
       {
          return false;
       }
       else
       {
           signer.Certificate =cert;
           var signeddata = new ActiveXObject("CAPICOM.SignedData");
           var utils = new ActiveXObject("CAPICOM.Utilities");
           signeddata.Content =sigContent;
           try
           {
               if(SignedData)
               {
                   document.getElementById(SignedData).value=signeddata.Sign(signer,true,CAPICOM_ENCODE_BASE64);
                   document.getElementById(KeySerialNumber).value=cert.SerialNumber;
               }
               else
               {
                   signeddata.Sign(signer,true,CAPICOM_ENCODE_BASE64);
               }
               return true;
               
           }
           catch(er)
           {
             alert(er.message);
             return false;
           }
       }
 }
 //公钥加密
function Encrypt(srcData,KeySerialNumber)
{  
         
         if(KeySerialNumber=="无证书")
         {
            alert("无证书用户不能对您加密过的文件进行解密，请下载该用户证书后再操作。或将主/抄送单位中“无证书”的接收人删除。");
            return null;
         }
         var  certification;
         //用其他人公钥进行加密
         if(KeySerialNumber)
         {
             certification= FindCertification(KeySerialNumber);
             
             if(certification==null)
             {
                  alert("序列号为"+KeySerialNumber+"的证书未找到,请下载证书后再操作!");
                  return null;
             }
         }
         //用自己的公钥进行加密
         else 
         {
            certification=SelectMySignCert();
            if(certification==null)
            {
              alert("证书未找到，请插入USBKey后再操作。");
              return null;
            }
         }
         
        
             var oEnvelopedData = new ActiveXObject("CAPICOM.EnvelopedData");

             oEnvelopedData.Content=srcData;

             oEnvelopedData.Algorithm.Name = 2;

             oEnvelopedData.Algorithm.KeyLength = 0;

             oEnvelopedData.Recipients.Add(certification);
           
             return oEnvelopedData.Encrypt(CAPICOM_ENCODE_BASE64);;
         
}

//私钥解密
function Decrypt(EnvelopedData)
{  
       var oEnvelopedData = new ActiveXObject("CAPICOM.EnvelopedData");
       var myCert=SelectMySignCert();
       oEnvelopedData.Recipients.Add(myCert);
       try
       {
       oEnvelopedData.Decrypt(EnvelopedData);
       }
       catch(e)
       {
       alert("数字信封打开失败.密钥不正确。");
       return false;
       }
       return oEnvelopedData.Content;
}

        function openServerFile(envelopeDate,serverFileUrl)
        {
           var key;
           if(envelopeDate)
           {
             key=Decrypt(envelopeDate);
           }
           else
           {
             key=Decrypt($("hEnvelopedData").value);
           }
           if(key==false)
           {
             return;
           }
           
           if(!serverFileUrl)
           {
             serverFileUrl=$("hServerFileUrl").value;
           }
           var fileName=serverFileUrl.substring(serverFileUrl.lastIndexOf('/')+1,serverFileUrl.lastIndexOf('.'));
           EncryptObject.DecryptClientFile(serverFileUrl,"",key,"c:\\"+fileName);
           alert("文件已保存至:"+"c:\\"+fileName);
        }

