﻿/**
 * @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 = "";
	}
		
	for(i = 0; i < arrayIssuerDN.length; i++){
		var CertFilter = iTrusPTA.Filter;
		CertFilter.Clear();
		CertFilter.Subject = 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 证书列表<select>对象
 * @param inputToSign: 用于签名登陆的被签名<input>对象
 * @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函数选择<select>中列出的证书
 * @return 成功: 返回签名值，失败: 返回""
 */
function signMessage(plainText, signCert) {
	var signedStr;
	var signCert;
	try{
		signedStr = signCert.SignMessage(plainText, OUTPUT_BASE64);
	} catch(e) {
		if(e.number == -2147483135)
			return "";//User canceled
		else if(e.number == -2146885621)
			alert("您不拥有证书“" + signCert.CommonName + "”的私钥，签名失败。");
		else
			alert("PTA模块发生错误\n错误号: " + e.number + "\n错误描述: " + e.description);
		return "";
	}
	return signedStr;
}

/**
 * signCSR 更新证书时需要调用，对更新证书的CSR
 * @param objOldCert(mandatory) 要更新的证书对象（PTALib.Certificate）
 * @param csr(mandatory) 证书签名请求
 */
function signCSR(objOldCert, csr) {
	try {
		var signedData = "";
		var ptaVersion = iTrusPTA.Version;
		if(ptaVersion == null){ 
			//PTA Version = 1.0.0.3
			signedData = objOldCert.SignMessage("LOGONDATA:" + csr, OUTPUT_BASE64);
		} else {
			//PTA Version > 2
			signedData = objOldCert.SignLogonData("LOGONDATA:" + csr, OUTPUT_BASE64);
		}
		return signedData;
	} catch (e) {
		if(-2147483135 == e.number) {
			//用户取消签名
			return "";
		}	else if(e.number == -2146885621) {
			alert("您不拥有证书“" + objOldCert.CommonName + "”的私钥，签名失败。");
			return "";
		} else {
			alert("PTA签名时发生错误\n错误号: " + e.number + "\n错误描述: " + e.description);
			return "";
		}
	}
}
