/**************************************************** * * @Title: secure.jsp * * @Description: 基于PSI的客户端函数调用 * * @Author: 2003/05/20 Jreey Cheng Creat. * * Copyright(c) 2003 Wellhope Inc.All rights reserved. * *****************************************************/ /***************************************************** * 函数名称:getCookie(); * 函数功能:客户端从cookie中得到服务方的信息; * 输入参数:cookie中标识名; * 输出参数:得到标识名对应的值; *******************************************************/ function getCookie(name) { var cookies = document.cookie; var start = -1; var end = -1; var rvalue = null; if(cookies.length>0) { start = cookies.indexOf(name); if(start!=-1) { start += name.length+1; end = cookies.indexOf(";",start); if(end ==-1) { end = cookies.length; } rvalue = cookies.substring(start,end); } } rvalue=replaceChars(rvalue,"%0D","\r"); rvalue=replaceChars(rvalue,"%0A","\n"); rvalue=replaceChars(rvalue,"%2F","/"); rvalue=replaceChars(rvalue,"%2B","+"); rvalue=replaceChars(rvalue,"%3D","="); return rvalue; } /***************************************************** * 函数名称:replaceChars; * 函数功能:替换字符串中的相应字符串; *******************************************************/ function replaceChars(entry,orgStr,replaceStr) { temp = "" + entry; while (temp.indexOf(orgStr)>-1) { pos= temp.indexOf(orgStr); temp = "" + (temp.substring(0, pos) + replaceStr + temp.substring((pos + orgStr.length), temp.length)); } return temp; } /***************************************************** * 函数名称:Base64Encode; * 函数功能:Base64加密; * 输入参数:输入加密数据; * 输出参数:加密后的数据; *******************************************************/ function Base64Encode(inData) { var outData=""; outData=PSIAtv.Base64Encode(inData); return outData; } /***************************************************** * 函数名称:Base64Decode; * 函数功能:Base64解密; * 输入参数:输入加密的数据; * 输出参数:解密后的数据; *******************************************************/ function Base64Decode(inData) { var outData=""; outData=PSIAtv.Base64Encode(inData); return outData; } /***************************************************** * 函数名称:getCert(); * 函数功能:获取用户证书; * 输入参数:certType:1:加密证书,2:签名证书; * 输出参数:用户证书; *******************************************************/ function getCert(certType) { var outCert=""; outCert=PSIAtv.GetCert(certType); return outCert; } /***************************************************** * 函数名称:checkCert(); * 函数功能:验证证书; * 输入参数:cert:证书信息; * 输出参数:True or False; *******************************************************/ function checkCert(cert) { var flag=false; flag=PSIAtv.CheckCert(cert); return flag; } /***************************************************** * 函数名称:sealEnvelope(); * 函数功能:构造数字信封; *******************************************************/ function sealEnvelope(cert,algo,inData) { var outData=""; outData=PSIAtv.SealEnvelope(cert,algo,inData); return outData; } /***************************************************** * 函数名称:sealEnvelopeEx(); * 函数功能:批量构造数字信封; * 说明:每个证书信息间用"|"隔开,最后不要以"|"结束 *******************************************************/ function sealEnvelopeEx(certs,certsize,algo,inData) { var outData=""; outData=PSIAtv.SealEnvelopeEx(certs,certsize,algo,inData); return outData; } /***************************************************** * 函数名称:openEnvelope(); * 函数功能:拆解数字信封; *******************************************************/ function openEnvelope(inData) { var outData=""; outData=PSIAtv.OpenEnvelope(inData); return outData; } /***************************************************** * 函数名称:signData(); * 函数功能:数字签名; *******************************************************/ function signData(inData, algo, type) { var outData=""; outData=PSIAtv.SignData(inData, algo, type); return outData; } /***************************************************** * 函数名称:verifySign(); * 函数功能:数字签名验签; *******************************************************/ function verifySign(cert,originalData,signedData, algo, type) { var outData=""; outData=PSIAtv.VerifySign(cert, originalData, signedData, algo, type); return outData; } /***************************************************** * 函数名称:genRandom(); * 函数功能:生成随机数; *******************************************************/ function genRandom(size) { var outData=""; outData=PSIAtv.GenRandom(size); return outData; } /***************************************************** * 函数名称:symmEncrypt(); * 函数功能:对称加密; *******************************************************/ function symmEncrypt(i_symmAlgo,i_symmkey,i_indata) { var outData=""; outData=PSIAtv.SymmEncrypt(i_symmAlgo,i_symmkey,i_indata); return outData; } /***************************************************** * 函数名称:symmDecrypt(); * 函数功能:对称解密; *******************************************************/ function symmDecrypt(i_symmAlgo,i_symmkey,i_indata) { var outData=""; outData=PSIAtv.SymmDecrypt(i_symmAlgo,i_symmkey,i_indata); return outData; } /***************************************************** * 函数名称:getCertFromLDAP(); * 函数功能:从LDAP服务器获取证书信息; *******************************************************/ function getCertFromLDAP(searchType,certType,searchValue) { var outData=""; outData=PSIAtv.GetCertFromLDAP(searchType,certType,searchValue); return outData; } /***************************************************** * 函数名称:getAndSaveCRL(); * 函数功能:从LDAP服务器获取CRL信息,并保存到本地; *******************************************************/ function getAndSaveCRL() { var flag=false; flag=PSIAtv.GetCertFromLDAP(searchType,certType,searchValue); return flag; } /***************************************************** * 函数名称:exchangeCert(); * 函数功能:服务器和客户端双方交换证书; *******************************************************/ function exchangeCert() { var serverCert,randStr,randSign,serverSign,clientCert,clientSign; var flag=false; serverCert = getCookie("serverCert"); if(serverCert!=null) { alert("成功得到服务器证书信息:"+serverCert); flag=checkCert(serverCert); if(flag) { alert("服务器证书验证通过!"); } else { alert("服务器证书验证不通过!"); return; } randStr=getCookie("randnum"); if(randStr!=null) { alert("成功得到服务器随机数信息!"); randSign=getCookie("randnumSign"); if(randSign!=null) { alert("成功得到服务器对随机数签名!"); } else { alert("无法得到服务器对随机数签名!"); return; } flag=verifySign(serverCert,randStr,randSign); if(flag) { alert("服务器签名验证成功!"); } else { alert("服务器签名验证失败!"); return; } clientCert=document.forms[0].clientCert.value; if(clientCert !="") { alert("开始对随机数进行签名!"); randStr="12345" clientSign=signData(randStr); if(clientSign!="") { alert("成功对随机数进行客户端签名!"); document.forms[0].randnum.value = randStr; document.forms[0].randnumSign.value = clientSign; document.forms[0].submit(); } else { alert("客户端数据签名失败!"); } } else { alert("获取客户端用户证书失败!"); } } else { alert("没有得到服务器随机数"); } } else { alert("没有得到服务器证书"); } } function readCert(kind) { var clientCert=""; if (kind == 1) { clientCert=getCert(1); }else { clientCert=getCert(2); } return clientCert; } function testFile() { var readData=""; var flag; var curStatus; readData=PSIAtv.ReadFromFile(); curStatus=PSIAtv.CurStatus; if(curStatus==0) { alert("读取的文件内容(已编码):"+readData); alert("开始把读取的内容写入文件!"); flag=PSIAtv.WriteToFile("",readData); curStatus=PSIAtv.CurStatus; if(flag) { alert("保存文件成功!"); } else { alert("文件保存出现异常错误!错误代码:"+curStatus); } } else { alert("文件读取失败!错误代码:"+curStatus); } /* //与WinCE进行交互性测试,WinCE端控件没有错误代码提示 if(readData.length>0) { alert("读取的文件内容(已编码):"+readData); alert("开始把读取的内容写入文件!"); flag=parent.frames("client_server").PSIAtv.WriteToFile("",readData); if(flag) { alert("保存文件成功!"); } else { alert("文件保存出现异常错误!"); } } else { alert("文件读取失败!"); } */ } function testSymm() { var readData=""; var symmKey=""; var encData=""; var outData=""; var algoStr=""; var algo=26115; var keySize=24; readData=document.test.data.value; if(readData=="") { alert("请输入需要加密的内容!"); document.test.data.focus(); return; } algoStr=document.test.algo.value; alert("您选择的算法是:"+algoStr); switch(algoStr) { case "3DES": algo=26115; keySize=24; break; case "RC4": algo=26625; keySize=16; break; } alert("开始加密内容信息......"); symmKey=genRandom(keySize); alert("生成的随机对称密钥(已编码)为:"+symmKey); encData=symmEncrypt(algo,symmKey,readData); alert("加密后的密文数据为:"+encData); alert("开始进行解密操作......"); document.test.data.value="symmKey="+symmKey+",encData="+encData; outData=symmDecrypt(algo,symmKey,encData); alert("解密后的原文数据为:"+outData); } function testLDAP() { var searchType=0; var certType=0; var searchValue=""; var outCert=""; searchType=document.test.searchType.value; certType=document.test.certType.value; searchValue=document.test.searchValue.value; alert("开始从LDAP服务器查询所需要的证书信息!"); alert("查询类型:"+searchType+",证书类型:"+certType+",查询值:"+searchValue); outCert=getCertFromLDAP(searchType,certType,searchValue); if(outCert.length>0) { alert("从LDAP服务器成功取得查询证书:"+outCert); } else { alert("从LDAP服务器查询证书失败!"); } }