/** * @Author Lion Shooray 2007-7-24 iTruschina Co., Ltd. * @Version 2.5 */ //global const var INPUT_BASE64 = 0x1; var INPUT_HEX = 0x2; var OUTPUT_BASE64 = 0x4; var OUTPUT_HEX = 0x8; /** * JSDateAdd Javascript 计算给定日期+天数 * @param theDate: 给定日期,Date类型 * @param days: 整型 * @return 计算结果,Date类型 */ function JSDateAdd(theDate, days) { var dateValue = theDate.valueOf() dateValue += days * 1000 * 60 * 60 * 24; var newDate = new Date(dateValue); return newDate; } /** * JSDateDiffByDays Javascript 计算两个日期之间的间隔天数 * @param date1: 给定日期1,Date类型 * @param date2: 给定日期2,Date类型 * @return 天数,整型 */ function JSDateDiffByDays(date1, date2) { var mill = date1.valueOf() - date2.valueOf(); var millStr = new String(mill / 1000 / 60 /60 / 24) return parseInt(millStr); } /** * filterCerts 根据所设置条件过滤证书 * @param arrayIssuerDN(optional) Array() or string,缺省为"",证书的颁发者字符串和字符串数组,支持多个CA时使用字符串数组 * @param dateFlag(optional) 缺省为0,0表示所有证书,1表示处于有效期内的证书,2表示待更新证书,3表示未生效或已过期证书 * @param serialNumber(optional) 缺省为"",证书序列号(微软格式) * @return Array(), PTALib.Certificate */ function filterCerts(arrayIssuerDN, dateFlag, serialNumber) { var m_certs = new Array(); var i = 0; if(typeof(arrayIssuerDN) == "undefined") { arrayIssuerDN = new Array(""); } else if(typeof(arrayIssuerDN) == "string") { arrayIssuerDN = new Array(arrayIssuerDN); } if(typeof(serialNumber) == "undefined") serialNumber = ""; if ((serialNumber.length % 2) == 1) //当序列号首位为0时,此时windows将把此零省了,造成序列号少了一位,所有在这里需要将此零补起 { serialNumber = "0" + serialNumber; } if(parseInt(serialNumber.substr(0,1),16) > 7) //windows在处理证书的时候,当在证书首位大于7的时候,会在读入证书是在前面加两个 "0" serialNumber = "00" + serialNumber; // alert(serialNumber); serialNumber=serialNumber.toLowerCase(); //证书比较是要区分大小写的,而且是全部为小写 for(i = 0; i < arrayIssuerDN.length; i++){ var CertFilter = iTrusPTA.Filter; CertFilter.Clear(); CertFilter.Issuer = arrayIssuerDN[i]; CertFilter.SerialNumber = serialNumber; var t_Certs = iTrusPTA.MyCertificates; //临时变量 var now = new Date(); if(parseInt(t_Certs.Count) > 0) { //找到了证书 for(var j = 1; j <= parseInt(t_Certs.Count) ; j++) { var validFrom = new Date(t_Certs(j).validFrom); var validTo = new Date(t_Certs(j).validTo); switch (dateFlag){ case 0://所有证书 m_certs.push(t_Certs(j)); break; case 1://处于有效期内的证书 //validFrom validTo // now if(validFrom < now && now < validTo) m_certs.push(t_Certs(j)); break; case 2://待更新证书 //validFrom validTo-30 validTo // now if(JSDateAdd(validTo, -30) < now && now < validTo) m_certs.push(t_Certs(j)); break; case 3://未生效或已过期证书 // validFrom validTo // now now if(now < validFrom || validTo < now) m_certs.push(t_Certs(j)); break; default://缺省当作所有证书处理 m_certs.push(t_Certs(j)); break; } } } } return m_certs; } /** * signLogonData 登录签名 * @param certList 证书列表对象 * @return 成功返回签名值,失败返回"" */ function signLogonData(signer, inputToSign) { try { var signedData; var ptaVersion = iTrusPTA.Version; if(ptaVersion == null){ //PTA Version = 1.0.0.3 signedData = signer.SignMessage(inputToSign.value, OUTPUT_BASE64); } else { //PTA Version > 2 if(inputToSign.value.indexOf("LOGONDATA:") == -1) inputToSign.value = "LOGONDATA:" + inputToSign.value; signedData = signer.SignLogonData(inputToSign.value, OUTPUT_BASE64); } return signedData; } catch (e) { if(-2147483135 == e.number) { //用户取消签名 } else if(e.number == -2146885621) { alert("您不拥有证书“" + CurCert.CommonName + "”的私钥,签名失败。"); return ""; } else { alert("PTA签名时发生错误\n错误号: " + e.number + "\n错误描述: " + e.description); return ""; } } } /** * verifySignature 验证签名 * @param strToSign: 原文 * @param base64StrSignature: 签名值 * @return 成功: 返回签名证书对象,失败: 返回null */ function verifySignature(strToSign, base64StrSignature){ try{ var signCert = iTrusPTA.VerifySignature(strToSign, base64StrSignature, INPUT_BASE64); alert("签名验证成功。签名者为“" + signCert.CommonName + "”。"); return true; } catch(e) { if(e.number == -2146893818) alert("签名验证失败。\n签名值与原文不匹配,内容已遭篡改。"); else alert("PTA模块发生错误\n错误号: " + e.number + "\n错误描述: " + e.description); return false; } } /** * signMessage 数字签名 * @param plainText: 原文 * @param signCert 用于签名的证书对象,可以使用GetSingleCertificate函数获得证书对象 * ,或者使用SelectSingleCertificate函数选择