/*******************************************************************************
*  useage: secrity.jsp 
*  supported  by  wellhope
*  Written by  
*  2003-12-12
*******************************************************************************/

var Encrypt_Lable = "LAB_USERCERT_ENC";
var Sign_Lable = "LAB_USERCERT_SIG";
var Encrypt_Key_Lable = "LAB_USERCERT_ENC";
var Sign_Key_Lable="LAB_USERCERT_SIG";

/*******************************************************************************
*函数名称：setCookie();
*函数功能：设置用户cookie;
*输入参数：var name：cookie名称，var content;
*输出参数：;
*调用模块：无;
*函数作者：;
*创建时间：2002.7.30;
*修 改 者：
*修改时间：
*******************************************************************************/
function setCookie(name,content){
    document.cookie = name+"="+content;
}

/*******************************************************************************
*函数名称：getCookie();
*函数功能：读cookie;
*输入参数：var name：cookie名称;
*输出参数：var rrn：;
*调用模块：无;
*函数作者：;
*创建时间：2002.7.30;
*修 改 者：
*修改时间：
*******************************************************************************/
function getCookie(name){
    var cookies=document.cookie;
    var start=-1;
    var end=-1;
    var rtn="";
	name+="=";
    if(cookies.length>0)
    {
        start=cookies.indexOf(name);
        if(start!=-1)
        {
            start+=name.length;
            end=cookies.indexOf(";",start);
            if(end == -1)
            {
                end =cookies.length;
            }
            rtn=cookies.substring(start,end);
        }
    }
    return rtn;
}

/*******************************************************************************
*函数名称：getRandNum();
*函数功能：产生随机数;
*输入参数：无;
*输出参数：var rand：随机数;
*调用模块：无;
*函数作者：;
*创建时间：2002.7.30;
*修 改 者：
*修改时间：
*******************************************************************************/
function getRandNum(){
    var i = 0,t = 0;
    var j = 1;
    var rand = new String("");
    var temp;
    for( i=0 ; i<4 ; i++ )
    {
        j = Math.random();
        temp = new String(j);
        t = temp.indexOf(".",0);
        temp = temp.substring(t+1,temp.length);
        rand += temp;
    }
    while(rand.length<64)
    {
        rand += "0";
    }
    if(rand.length>64)
    {
        rand=rand.substring(0,64);
    }
    return rand;
}

/*******************************************************************************
*函数名称：writeLocalFile();
*函数功能：将输入内容写入本地文件;
*输入参数：var filePath : 写入本地文件绝对路径;
*          var content : 写入文件的内容,已经编码
*输出参数：int文件写入结果;
*调用模块：
*函数作者：;
*创建时间：2003.12.12;
*修 改 者：
*修改时间：
*******************************************************************************/
function writeLocalFile(filePath,content){
    var rt = 0;
    rt = ActiveOCX.WriteFile(filePath,1,content);
    if(rt!=0)
    {
        //alert("写入本地文件"+filePath+"失败!");
        return rt;
    }
    else
    {
        return 0;
    }
}

/*******************************************************************************
*函数名称：readLocalFile();
*函数功能：读取本地文件;
*输入参数：var filePath : 读取本地文件绝对路径;
*          var flag : 是否需要对文件内容编码 0 不编码 1 编码
*输出参数：var ret : 文件内容;
*调用模块：
*函数作者：;
*创建时间：2003.12.12;
*修 改 者：
*修改时间：
*******************************************************************************/
function readLocalFile(path,flag){
    var ret = "";
    var rt = 0;
    rt = ActiveOCX.ReadFile(0,flag,path);
    if(rt!=0)
    {
        ret = "";
    }
    else
    {
        ret = ActiveOCX.outData;
    }
    return ret;
}


/*******************************************************************************
*函数名称：base64Encode();
*函数功能：对输入内容进行base64编码;
*输入参数：var content : 待编码内容;
*输出参数：var ret : 编码后的内容,返回为""时表示编码错误;
*调用模块：
*函数作者：;
*创建时间：2003.12.12;
*修 改 者：
*修改时间：
*******************************************************************************/
function base64Encode(content){
    var ret = "";
    var rt = 0;
    rt = ActiveOCX.OpkiBase64Encode(content);
    if(rt!=0)
    {
        ret = "";
    }
    else
    {
        ret = ActiveOCX.outData;
    }
    return ret;
}

/*******************************************************************************
*函数名称：base64Decode();
*函数功能：对输入内容进行base64解码;
*输入参数：var content : 待解码内容;
*输出参数：var ret : 解码后的内容,返回为""时表示编码错误;
*调用模块：
*函数作者：;
*创建时间：2003.12.12;
*修 改 者：
*修改时间：
*******************************************************************************/
function base64Decode(content){
    var ret = "";
    var rt = 0;
    rt = ActiveOCX.OpkiBase64Decode(content);
    if(rt!=0)
    {
        ret = "";
    }
    else
    {
        ret = ActiveOCX.outData;
    }
    return ret;
}

/*******************************************************************************
*函数名称：init();
*函数功能：初始化;
*输入参数：无;
*输出参数：int登录结果
*调用模块：
*函数作者：;
*创建时间：2003.12.12;
*修 改 者：
*修改时间：
*******************************************************************************/
function init(){
    var ret = 0;
    var rt = 0;
    rt = ActiveOCX.OpkiInit();
    if(rt<0)
    {
        ret = rt;
    }
    else
    {
        ret = 0;
    }
    return ret;
}

/*******************************************************************************
*函数名称：end();
*函数功能：结束安全的调用,清除内存中的相关内容;
*输入参数：无;
*输出参数：int
*调用模块：
*函数作者：;
*创建时间：2003.12.12;
*修 改 者：
*修改时间：
*******************************************************************************/
function end(){
    var ret = 0;
    var rt = 0;
    rt = ActiveOCX.OpkiEnd();
    if(rt<0)
    {
        ret = rt;
    }
    else
    {
        ret = 0;
    }
    return ret;
}

/*******************************************************************************
*函数名称：sealEnvelope();
*函数功能：数字信封加密(对称加密算法3DES);
*输入参数：var content : 加密内容;
*          var cert : 加密证书
*输出参数：var ret ：加密后的密文;
*调用模块：
*函数作者：;
*创建时间：2003.12.12;
*修 改 者：
*修改时间：
*******************************************************************************/
function sealEnvelope(content,cert){
    var ret = "";
    var rt = 0;
    rt = ActiveOCX.OpkiSealEnvelope(cert,26115,content);
    if(rt<0)
    {
        ret = "";
    }
    else
    {
        ret = ActiveOCX.outData;
    }
    return ret;
}

/*******************************************************************************
*函数名称：getCertSubject();
*函数功能：解析证书主题内容
*输入参数：var cert : 证书
*输出参数：var ret ：证书主题内容;
*调用模块：
*函数作者：;
*创建时间：2003.12.12;
*修 改 者：
*修改时间：
*******************************************************************************/
function getCertSubject(cert){
    var ret = "";
    var rt = 0;
    
    rt = ActiveOCX.OpkiGetCertInfo(cert);
    if(rt<0)
    {
        ret = "";
    }
    else
    {
        ret = ActiveOCX.Sdnou;
    }
    return ret;
}

/*******************************************************************************
*函数名称：parselabel();
*函数功能：解析标签的内容
*输入参数：var label : 待解析标签;
*          var data :  主串
*输出参数：var ret ：标签内容;
*调用模块：
*函数作者：;
*创建时间：2003.12.12;
*修 改 者：
*修改时间：
*******************************************************************************/
function parselabel( label, data ){
	var begin = 0;
	var end = 0;
	
	var startStr = "<"+label+">";
	var endStr = "</"+label+">";

	begin = data.indexOf(startStr);
	if( begin < 0 )
	{
		//alert("Parse Label "+label+" Error.");
		return "";
	}
	end=data.indexOf(endStr);
	if( end < 0 )
	{
		//alert("Parse Label "+label+" Error.");
		return "";
	}
	
	return data.substring(begin+2+label.length, end);
}

/*******************************************************************************
*函数名称：enumKey();
*函数功能：枚举本机的证书
*输入参数：
*输出参数：var ret ：全部证书列表;
*调用模块：
*函数作者：;
*创建时间：2003.12.12;
*修 改 者：
*修改时间：
*******************************************************************************/
function enumKey(){   
    var rt=0;
    rt = ActiveOCX.OpkiSetHardWare(001);
    if(rt<0)
    {
        alert("无法设置硬件类型，请关闭当前浏览器，重新访问本系统！");
        return;
    }
    rt = init();
    if(rt<0)
    {
        alert("控件初始化失败，无法完成登陆，请关闭当前浏览器，重新访问本系统！");
        return;
    }
    
    var ret = "";
    ret = ActiveOCX.EnumKey();
    return ret;
}

function updateKey(
			sign_cert,
			sign_priv_key,
			sign_cert_sn,
			crypt_cert,
			crypt_priv_key,
			crypt_cert_sn
			) {
	
	pin = base64Decode(getCookie("pin"));
    rt = init();
    if(rt<0)
    {
        return;
    }
    
	rt = ActiveOCX.OpkiUpdatePrivKey(2,"LAB_USERCERT_SIG",pin,sign_priv_key);
	if(rt!=0){
	   alert("您的电子营业执照驱动不是最新的，请到年检首页下载并安装新的电子营业执照驱动程序。");
       sec.action="../login.jsp";
       sec.submit();
		return;
	}
	
	rt = ActiveOCX.OpkiUpdatePrivKey(1,"LAB_USERCERT_ENC",pin,crypt_priv_key);
	if(rt!=0){
       alert("您的电子营业执照驱动不是最新的，请到年检首页下载并安装新的电子营业执照驱动程序。");
       sec.action="../login.jsp";
       sec.submit();
		return;
	}

   rt = ActiveOCX.OpkiWriteLabel("LAB_USERCERT_SIG_SN", 3, 1, base64Encode(sign_cert_sn));
   if (rt!=0){
       alert("您的电子营业执照驱动不是最新的，请到年检首页下载并安装新的电子营业执照驱动程序。");
       sec.action="../login.jsp";
       sec.submit();
   		return rt;
   }
   
   rt = ActiveOCX.OpkiWriteLabel("LAB_USERCERT_ENC_SN", 3, 1, base64Encode(crypt_cert_sn));
   if (rt!=0){
       alert("您的电子营业执照驱动不是最新的，请到年检首页下载并安装新的电子营业执照驱动程序。");
       sec.action="../login.jsp";
       sec.submit();
   		return rt;
   }
   
   rt = ActiveOCX.OpkiWriteLabel("LAB_USERCERT_SIG", 1, 1, sign_cert);
   if (rt!=0){
       alert("您的电子营业执照驱动不是最新的，请到年检首页下载并安装新的电子营业执照驱动程序。");
       sec.action="../login.jsp";
       sec.submit();
   		return rt;
   }
   
   rt = ActiveOCX.OpkiWriteLabel("LAB_USERCERT_ENC", 1, 1, crypt_cert);
   if (rt!=0){
       alert("您的电子营业执照驱动不是最新的，请到年检首页下载并安装新的电子营业执照驱动程序。");
       sec.action="../login.jsp";
       sec.submit();
   		return rt;
   }
   end();
   sec.updatedFlag.value="1";
   sec.pinpw.value = pin;
   login();
}
