﻿/**
 * @Author Lion Shooray 2006-12-20 iTruschina. Co.,Ltd
 * @Version 1.0
 */

if(!IsValidBrowser())
{
	//alert("很抱歉，我们暂时不支持您所使用的浏览器！\n请用Microsoft Internet Explorer 5.0或以上版本！");
	//history.back();
}

/**
 * InstallCert 安装CA颁发下来的证书
 * @param certChain: 包含用户证书及证书链的Base64格式P7字符串
 */
function InstallCert(certChain) {
	try {
		cenroll.DeleteRequestCert = false;
		cenroll.WriteCertToCSP = true;
		cenroll.acceptPKCS7(certChain);
		return true;
	} catch(e) {
		if(-2147023673 == e.number) {
			alert("您取消了我们为您颁发的数字证书安装，证书安装失败！\n在您还未离开本页面前，您还可以点击“安装数字证书”按钮安装。");
			return false;
		} else {
			alert("安装证书发生错误！\n错误原因：" + e.description + "\n错误代码：" + toHex(e.number));
			return false;
		}
	}
}

/**
 * FindProviders 查询本地计算机的加密服务提供者，并显示在指定的<select>中
 * @param cryptoProv: 加密服务提供者<select>对象
 */
function FindProviders(cryptoProv) {
	//code by Lion Shooray(XuRui), iTrusChina Co., Ltd
	//2005-12-28
	var i = 0;
	var providerType, providerName, el;
	providerType = 1; //The default value for this property is 1
	
	try {
		while(true) {
			providerName = "";
			cenroll.ProviderType = providerType;
			try {
				providerName = cenroll.enumProviders(i, 0);
			} catch(e) {
				
				return;
			}
			
			if(providerName.length == 0) {
				break;
			} else {
				var el = document.createElement("option");
				el.text = providerName;
				el.value = providerType;
				
				//if(el.text == "Microsoft Base Cryptographic Provider v1.0"
				//|| el.text == "Microsoft Enhanced Cryptographic Provider v1.0"
				//|| el.text == "iTruschina Primary Cryptographic Service Provider")
				if(true) {
					cryptoProv.add(el);
					if(el.text == "Rainbow iKey 1000 RSA Cryptographic Service Provider") {
						cryptoProv.selectedIndex = i;
					}
				}
				i++;
			}
		}
	} catch(e) {
		//do something
		alert("在获取您计算机的加密服务提供者的过程中发生错误！\n错误原因：" + e.description + "，错误代码：" + toHex(e.number));
	}
}

/**
 * CreateP10 产生密钥对，生成CSR证书申请请求，被DoKeyGen调用
 * @param keyflags: 密钥对产生的标记
 * @return 证书申请请求CSR
 */
function CreateP10(keyflags) {
	//code by Lion Shooray(XuRui), iTrusChina Co., Ltd
	//2005-12-28
	var createP10 = "";	
	try {
		cenroll.GenKeyFlags = 0x04000000 | keyflags; //1024bits
		createP10 = cenroll.createPKCS10("CN=itrus_cert_enroll", "1.3.6.1.5.5.7.3.2");
		if(createP10.length > 0) {
			return createP10;
		} else {
			alert("您的浏览器在产生密钥对时失败，操作被取消！");
			return "";
		}
	} catch (e) {
		if(-2147023673 == e.number) {
			//alert("由于您不允许本站点为您请求证书，所以本次数字证书申请被取消！");
			return "";
		} else {//1024位密钥对生成失败，尝试512位
			try {
				cenroll.GenKeyFlags = 0x02000000 | keyflags; //512bits
				createP10 = cenroll.createPKCS10("CN=itrus_cert_enroll", "1.3.6.1.5.5.7.3.2");
				if(createP10.length > 0) {
					return createP10;
				} else {
					alert("您的浏览器在产生密钥对时失败，操作被取消！");
					return "";
				}
			} catch(e) {
				if(-2147023673 == e.number) {
					//alert("由于您不允许本站点为您请求证书，所以本次数字证书申请被取消！");
					return "";
				} else {
					//1024位和512位密钥对都产生失败，将错误报告给用户
					alert("在证书请求过程中发生错误！\n错误原因：" + e.description + "\n错误代码：" + toHex(e.number));
					return "";
				}
			}
		}
	}
}

var initXenroll = false;
 
/**
 * DoKeyGen 产生密钥对，生成CSR证书申请请求
 * @param cryptoProv: 加密服务提供者<select>对象
 * @param crypt_exportable: 私钥是否允许导出，true:允许，false:不允许
 * @return 证书申请请求CSR
 */

function DoKeyGen(cryptoProv, crypt_exportable) {
	//code by Lion Shooray(XuRui), iTrusChina Co., Ltd
	//2005-12-28 create
	//2006-6-19 modify
	//2006-12-18 modify
	var reqtextvalue, keyflags;
	keyflags = 0;
	var CRYPT_EXPORTABLE       = 0x00000001; //允许私钥被导出
	var CRYPT_USER_PROTECTED   = 0x00000002; //强私钥保护

	//keyflags = keyflags | CRYPT_USER_PROTECTED;

	if(crypt_exportable){
		keyflags = keyflags | CRYPT_EXPORTABLE;
	}

	try {
		if(!initXenroll) {
			if(IsValidBrowser) {
				
				index = cryptoProv.selectedIndex;
				cenroll.ProviderName = cryptoProv(index).text;
				cenroll.ProviderType = cryptoProv(index).value;
			} else {
				cenroll.ProviderType = 1;
				cenroll.ProviderName = "Microsoft Base Cryptographic Provider v1.0";
			}
			cenroll.HashAlgorithm = "MD5";
			cenroll.KeySpec = 1;
			initXenroll = true;
		}
		
		reqtextvalue = CreateP10(keyflags);
		if(reqtextvalue.length == 0) {
			//产生密钥对失败，没有取到公钥
			return "";
		} else {
			return reqtextvalue;
		}
	}
	catch(e) {
		alert("Microsoft XEnroll在产生密钥对时失败！\n错误原因：" + e.description + "\n错误编号：" + toHex(e.number));
		return "";
	}
}
/**
 * IsValidBrowser 判断是否IE浏览器
 * @return true:是IE，false:不是IE
 */
function IsValidBrowser() {
	var iePos = navigator.userAgent.indexOf("MSIE");
	if(iePos == -1) {
		//不是IE
		return false;
	} else {
		var endStr = navigator.userAgent.substring(iePos + 4, navigator.userAgent.length);
		var ieVersion = parseInt(endStr);
		//alert("IE Version = " + ieVersion);
		if(ieVersion < 4) {
			return false;
		} else {
			return true;
		}
	}
}
