From 27a558f7ceadcab09396e4919487608d5662cd47 Mon Sep 17 00:00:00 2001 From: tolag3 Date: Tue, 10 Dec 2024 09:36:07 +0900 Subject: [PATCH] =?UTF-8?q?=EC=95=A0=EB=8B=88=EC=82=AC=EC=9D=B8,=20?= =?UTF-8?q?=EB=82=98=EC=9D=B4=EC=8A=A4=20=EA=B8=B0=EC=97=85=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/kcc/xxx/web/XxxController.java | 4 +- .../seed/com/gtm/base/BaseController.java | 6 +- src/main/java/seed/com/gtm/util/Nice.java | 50 + .../mediation/WebMediationController.java | 77 +- .../webapp/AnySign4PC/anySign4PCInterface.js | 47 +- .../anySign4PCInterface.js_20221209 | 6607 +++++++++++++++++ .../AnySign4PC/anySign4PCInterface.js_bak | 6607 +++++++++++++++++ src/main/webapp/AnySign4PC/ca.tar | Bin 0 -> 16896 bytes .../AnySign4PC/test/AnySign4PCTest.html | 2987 ++++++++ .../webapp/AnySign4PC/test/AnySign4PCTest.jsp | 2987 ++++++++ .../AnySign4PC/test/AnySign4PCTest_euckr.jsp | 2993 ++++++++ src/main/webapp/AnySign4PC/test/KB_qa.jsp | 1524 ++++ .../webapp/AnySign4PC/test/LGUPlus_qa.jsp | 6452 ++++++++++++++++ .../test/browserCertificate_user_guide.pdf | Bin 0 -> 252087 bytes .../AnySign4PC/test/certificate_mini.jsp | 186 + .../AnySign4PC/test/certificate_pop.jsp | 61 + .../AnySign4PC/test/certificate_wide.jsp | 153 + .../test/certificate_wide_ahnlab.jsp | 152 + .../AnySign4PC/test/certificate_wide_inca.jsp | 160 + .../test/certificate_wide_inca10.jsp | 148 + .../AnySign4PC/test/certificate_wide_kos.jsp | 144 + .../test/certificate_wide_nxkey.jsp | 144 + .../webapp/AnySign4PC/test/certselectwide.jsp | 830 +++ .../AnySign4PC/test/check_integrity.jsp | 100 + .../webapp/AnySign4PC/test/dev_server.jsp | 35 + .../AnySign4PC/test/enc_server_response.jsp | 1384 ++++ .../test/enc_server_response_20.jsp | 1422 ++++ src/main/webapp/AnySign4PC/test/fcms.jsp | 2622 +++++++ .../AnySign4PC/test/fcms_updownloadex.jsp | 479 ++ .../test/fcms_updownloadex_euckr.jsp | 481 ++ .../webapp/AnySign4PC/test/file_download.jsp | 57 + .../webapp/AnySign4PC/test/file_upload.jsp | 39 + .../AnySign4PC/test/file_upload_proxy.jsp | 44 + .../test/ibs/pub_cert/cert_register.jsp | 331 + .../test/ibs/pub_cert/cert_request.jsp | 295 + .../test/ibs/pub_cert/cert_rereg.jsp | 265 + .../test/ibs/pub_cert/user_regist.jsp | 285 + .../test/ibs/xecureca_cert/cert_register.jsp | 288 + .../test/ibs/xecureca_cert/cert_request.jsp | 295 + .../ibs/xecureca_cert/cert_request_rereg.jsp | 280 + .../test/ibs/xecureca_cert/user_regist.jsp | 328 + .../webapp/AnySign4PC/test/installAnySign.jsp | 207 + .../webapp/AnySign4PC/test/sign_result.jsp | 64 + .../webapp/AnySign4PC/test/sign_result1.jsp | 138 + .../AnySign4PC/test/sign_result1_euckr.jsp | 142 + .../webapp/AnySign4PC/test/sign_result2.jsp | 157 + .../AnySign4PC/test/sign_result2_euckr.jsp | 157 + .../webapp/AnySign4PC/test/sign_result3.jsp | 208 + .../AnySign4PC/test/sign_result3_euckr.jsp | 208 + .../webapp/AnySign4PC/test/sign_result4.jsp | 58 + .../AnySign4PC/test/sign_result4_euckr.jsp | 58 + .../AnySign4PC/test/sign_result_euckr.jsp | 64 + .../AnySign4PC/test/sign_vid_result.jsp | 297 + .../webapp/AnySign4PC/test/sign_with_vid.jsp | 357 + .../test/signfileinfo/cert/signCert.der | Bin 0 -> 1457 bytes .../test/signfileinfo/cert/signPri.key | Bin 0 -> 1300 bytes .../AnySign4PC/test/signfileinfo/test.txt | 4 + .../AnySign4PC/test/signfileinfo/test1.txt | 4 + .../AnySign4PC/test/signfileinfo/test2.txt | 4 + .../AnySign4PC/test/signfileinfo/test3.txt | 4 + .../AnySign4PC/test/signfileinfo_client.jsp | 1361 ++++ .../AnySign4PC/test/signfileinfo_server.jsp | 135 + src/main/webapp/AnySign4PC/test/test.html | 14 + .../AnySign4PC/test/user_regist_anypin.jsp | 373 + src/main/webapp/WEB-INF/decorators.xml | 3 + .../_extra/web/user/mediation/caseSignPop.jsp | 31 +- .../_extra/web/user/mediation/caseViewer.jsp | 457 +- .../web/user/mediation/caseViewer_back.jsp | 417 ++ .../user/mediation/checkMediationStep03.jsp | 44 +- .../jsp/seed/_extra/gtm/nice/niceList.jsp | 2 +- .../views/_common/_js/pdf/web/viewer.js | 3 +- src/main/webapp/WEB-INF/web.xml | 1 + 72 files changed, 45894 insertions(+), 427 deletions(-) create mode 100644 src/main/webapp/AnySign4PC/anySign4PCInterface.js_20221209 create mode 100644 src/main/webapp/AnySign4PC/anySign4PCInterface.js_bak create mode 100644 src/main/webapp/AnySign4PC/ca.tar create mode 100644 src/main/webapp/AnySign4PC/test/AnySign4PCTest.html create mode 100644 src/main/webapp/AnySign4PC/test/AnySign4PCTest.jsp create mode 100644 src/main/webapp/AnySign4PC/test/AnySign4PCTest_euckr.jsp create mode 100644 src/main/webapp/AnySign4PC/test/KB_qa.jsp create mode 100644 src/main/webapp/AnySign4PC/test/LGUPlus_qa.jsp create mode 100644 src/main/webapp/AnySign4PC/test/browserCertificate_user_guide.pdf create mode 100644 src/main/webapp/AnySign4PC/test/certificate_mini.jsp create mode 100644 src/main/webapp/AnySign4PC/test/certificate_pop.jsp create mode 100644 src/main/webapp/AnySign4PC/test/certificate_wide.jsp create mode 100644 src/main/webapp/AnySign4PC/test/certificate_wide_ahnlab.jsp create mode 100644 src/main/webapp/AnySign4PC/test/certificate_wide_inca.jsp create mode 100644 src/main/webapp/AnySign4PC/test/certificate_wide_inca10.jsp create mode 100644 src/main/webapp/AnySign4PC/test/certificate_wide_kos.jsp create mode 100644 src/main/webapp/AnySign4PC/test/certificate_wide_nxkey.jsp create mode 100644 src/main/webapp/AnySign4PC/test/certselectwide.jsp create mode 100644 src/main/webapp/AnySign4PC/test/check_integrity.jsp create mode 100644 src/main/webapp/AnySign4PC/test/dev_server.jsp create mode 100644 src/main/webapp/AnySign4PC/test/enc_server_response.jsp create mode 100644 src/main/webapp/AnySign4PC/test/enc_server_response_20.jsp create mode 100644 src/main/webapp/AnySign4PC/test/fcms.jsp create mode 100644 src/main/webapp/AnySign4PC/test/fcms_updownloadex.jsp create mode 100644 src/main/webapp/AnySign4PC/test/fcms_updownloadex_euckr.jsp create mode 100644 src/main/webapp/AnySign4PC/test/file_download.jsp create mode 100644 src/main/webapp/AnySign4PC/test/file_upload.jsp create mode 100644 src/main/webapp/AnySign4PC/test/file_upload_proxy.jsp create mode 100644 src/main/webapp/AnySign4PC/test/ibs/pub_cert/cert_register.jsp create mode 100644 src/main/webapp/AnySign4PC/test/ibs/pub_cert/cert_request.jsp create mode 100644 src/main/webapp/AnySign4PC/test/ibs/pub_cert/cert_rereg.jsp create mode 100644 src/main/webapp/AnySign4PC/test/ibs/pub_cert/user_regist.jsp create mode 100644 src/main/webapp/AnySign4PC/test/ibs/xecureca_cert/cert_register.jsp create mode 100644 src/main/webapp/AnySign4PC/test/ibs/xecureca_cert/cert_request.jsp create mode 100644 src/main/webapp/AnySign4PC/test/ibs/xecureca_cert/cert_request_rereg.jsp create mode 100644 src/main/webapp/AnySign4PC/test/ibs/xecureca_cert/user_regist.jsp create mode 100644 src/main/webapp/AnySign4PC/test/installAnySign.jsp create mode 100644 src/main/webapp/AnySign4PC/test/sign_result.jsp create mode 100644 src/main/webapp/AnySign4PC/test/sign_result1.jsp create mode 100644 src/main/webapp/AnySign4PC/test/sign_result1_euckr.jsp create mode 100644 src/main/webapp/AnySign4PC/test/sign_result2.jsp create mode 100644 src/main/webapp/AnySign4PC/test/sign_result2_euckr.jsp create mode 100644 src/main/webapp/AnySign4PC/test/sign_result3.jsp create mode 100644 src/main/webapp/AnySign4PC/test/sign_result3_euckr.jsp create mode 100644 src/main/webapp/AnySign4PC/test/sign_result4.jsp create mode 100644 src/main/webapp/AnySign4PC/test/sign_result4_euckr.jsp create mode 100644 src/main/webapp/AnySign4PC/test/sign_result_euckr.jsp create mode 100644 src/main/webapp/AnySign4PC/test/sign_vid_result.jsp create mode 100644 src/main/webapp/AnySign4PC/test/sign_with_vid.jsp create mode 100644 src/main/webapp/AnySign4PC/test/signfileinfo/cert/signCert.der create mode 100644 src/main/webapp/AnySign4PC/test/signfileinfo/cert/signPri.key create mode 100644 src/main/webapp/AnySign4PC/test/signfileinfo/test.txt create mode 100644 src/main/webapp/AnySign4PC/test/signfileinfo/test1.txt create mode 100644 src/main/webapp/AnySign4PC/test/signfileinfo/test2.txt create mode 100644 src/main/webapp/AnySign4PC/test/signfileinfo/test3.txt create mode 100644 src/main/webapp/AnySign4PC/test/signfileinfo_client.jsp create mode 100644 src/main/webapp/AnySign4PC/test/signfileinfo_server.jsp create mode 100644 src/main/webapp/AnySign4PC/test/test.html create mode 100644 src/main/webapp/AnySign4PC/test/user_regist_anypin.jsp create mode 100644 src/main/webapp/WEB-INF/jsp/_extra/web/user/mediation/caseViewer_back.jsp diff --git a/src/main/java/kcc/xxx/web/XxxController.java b/src/main/java/kcc/xxx/web/XxxController.java index 09edcd06..2c2605ee 100644 --- a/src/main/java/kcc/xxx/web/XxxController.java +++ b/src/main/java/kcc/xxx/web/XxxController.java @@ -229,8 +229,8 @@ public class XxxController { } } - @RequestMapping("/web/xxx/xxxPpurioTest.do") - public String xxxPpurioTest() { + @RequestMapping("/web/xxx/xxxAtTest.do") + public String xxxAtTest() { try { //신청인_접수확인_1 diff --git a/src/main/java/seed/com/gtm/base/BaseController.java b/src/main/java/seed/com/gtm/base/BaseController.java index 546a8efe..e53f4dbb 100644 --- a/src/main/java/seed/com/gtm/base/BaseController.java +++ b/src/main/java/seed/com/gtm/base/BaseController.java @@ -69,6 +69,7 @@ public class BaseController { } ///gtm/case/nanum/ajax/SanctnhistoryIns.do + ///gtm/case/common/ajax/NICE.do @RequestMapping(value = "/gtm/case/{pageFolder}/{pageName}/{pageAction}.do") public ModelAndView getManagerPage(HttpServletRequest request, HttpSession session, Map map, @@ -208,11 +209,12 @@ public class BaseController { params.put("data", JSPUtil.fixNull(bservice.delete(params)).toString()); }else if("NICELOOKUP".equals(type)){ Nice nice = new Nice(); - params.put("niceLookup", nice.Lookup(((String) params.get("bizno")).trim().replaceAll("-", ""))); + params.put("niceLookup", nice.Lookup2(((String) params.get("bizno")).trim().replaceAll("-", ""))); //params.put("niceLookup", nice.Lookup("1248100998")); }else if("NICESEARCH".equals(type)){ Nice nice = new Nice(); - params.put("niceSearch", nice.Search((String)params.get("niceNm"), (String)params.get("niceCnt"))); +// params.put("niceSearch", nice.Search((String)params.get("niceNm"), (String)params.get("niceCnt"))); + params.put("niceSearch", nice.Search2((String)params.get("niceNm"), (String)params.get("niceCnt"))); }else if("NANUM".equals(type)){ Nanum nanum = new Nanum(); params.put("nanumCall", nanum.NanumCall(params)); diff --git a/src/main/java/seed/com/gtm/util/Nice.java b/src/main/java/seed/com/gtm/util/Nice.java index c2946d98..8b2a7c1b 100644 --- a/src/main/java/seed/com/gtm/util/Nice.java +++ b/src/main/java/seed/com/gtm/util/Nice.java @@ -8,11 +8,14 @@ import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; +import java.net.URLEncoder; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.SimpleDateFormat; import java.util.Date; +import javax.net.ssl.HttpsURLConnection; + import org.apache.commons.codec.binary.Base64; import org.apache.ibatis.logging.Log; import org.apache.ibatis.logging.LogFactory; @@ -276,4 +279,51 @@ public class Nice { return html; } + public StringBuilder Search2(String nm, String page) throws Exception { + String encoded_query = URLEncoder.encode(nm, "UTF-8"); + String host = "https://w.datapoint.co.kr/v3.1/search/company.info?apikey=" + this.NiceApikey() + "&uid=kofair&index=SA0701&eprdatasvcstscd=07&itg_srch=" + encoded_query + "&prn_rst_cnt=20&pge_st_no=" + page + "&output=json"; + URL url = new URL(host); + StringBuilder html = new StringBuilder(); + HttpsURLConnection connection = (HttpsURLConnection)url.openConnection(); + connection.setRequestMethod("GET"); + connection.setDoInput(true); + connection.setDoOutput(true); + connection.setUseCaches(false); + new StringBuilder(); + BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8")); + + while(true) { + String line = br.readLine(); + if (line == null) { + br.close(); + return html; + } + + html.append(line.trim().replaceAll(" ||@", "")); + } + } + + public StringBuilder Lookup2(String bizno) throws Exception { + String host = "https://w.datapoint.co.kr/v2.0/lookup/lookup.info?apikey=" + this.NiceApikey() + "&uid=kofair&resgp=LP0202,LP0209,LP0212,LP0232&allsvcpdtcd=KLP&eprdatasvcstscd=07&bizno=" + bizno + "&output=json"; + URL url = new URL(host); + StringBuilder html = new StringBuilder(); + HttpsURLConnection connection = (HttpsURLConnection)url.openConnection(); + connection.setRequestMethod("GET"); + connection.setDoInput(true); + connection.setDoOutput(true); + connection.setUseCaches(false); + new StringBuilder(); + BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8")); + + while(true) { + String line = br.readLine(); + if (line == null) { + br.close(); + return html; + } + + html.append(line.trim().replaceAll(" ||@", "")); + } + } + } diff --git a/src/main/java/seed/com/user/mediation/WebMediationController.java b/src/main/java/seed/com/user/mediation/WebMediationController.java index 6e97443d..a561e0b5 100644 --- a/src/main/java/seed/com/user/mediation/WebMediationController.java +++ b/src/main/java/seed/com/user/mediation/WebMediationController.java @@ -1,5 +1,9 @@ package seed.com.user.mediation; +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; import java.text.ParseException; import java.util.ArrayList; import java.util.Date; @@ -7,6 +11,7 @@ import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.log4j.Logger; @@ -244,7 +249,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -417,7 +422,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -592,7 +597,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -789,7 +794,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -970,7 +975,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -1128,7 +1133,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -1260,7 +1265,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -1402,7 +1407,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -1553,7 +1558,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -1708,7 +1713,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -2111,7 +2116,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -2445,7 +2450,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -2884,7 +2889,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -3100,7 +3105,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -3293,7 +3298,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -3479,7 +3484,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -3702,7 +3707,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -3994,7 +3999,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -4139,7 +4144,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -4260,7 +4265,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -4468,7 +4473,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -4624,7 +4629,7 @@ public class WebMediationController { //부모메뉴 타이틀 설정한 경우 해당 글의 부모 타이틀을 가져옴 if(SeedUtils.setReplaceNull(tSiteMenuDB.get("_siteMenuParentTitle") ,"N").equals("Y")){ - String[] siteMenuTitles = siteMenuTitle.split("\\|"); + String[] siteMenuTitles = siteMenuTitle.split("//|"); tSiteMenuDB.put("_siteMenuName", siteMenuTitles[Integer.parseInt(tSiteMenuDB.get("_siteMenuDepth").toString())-1]); } @@ -4720,6 +4725,7 @@ public class WebMediationController { /* params.put("fileName", "/pdf/web/compressed.tracemonkey-pldi-09.pdf"); mav.addAllObjects(params);*/ + map.addAttribute("dataIdx", params.get("dataIdx")); mav.setViewName("_extra/web/user/mediation/caseViewer"); return mav; } @@ -4738,5 +4744,32 @@ public class WebMediationController { } return true; } + + @RequestMapping(value = "/web/user/mediation/case/pdf/pdfDownload.do") + public void downloadPdf( + HttpServletResponse response + , @RequestParam Map paramMap + ) throws IOException { + + Map fileList = fileService.caseFileOne(paramMap); + + // PDF 파일 경로 +// String pdfFilePath = "/path/to/your/pdf/file.pdf"; + String pdfFilePath = fileList.get("FILE_PATH").toString() + fileList.get("FILE_ORGNAME").toString(); + + // Content-Type 설정 + response.setContentType("application/pdf"); + + // 파일 스트림을 통해 PDF 파일을 읽고 클라이언트에게 전송 + try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(pdfFilePath)); + OutputStream out = response.getOutputStream()) { + + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = in.read(buffer)) != -1) { + out.write(buffer, 0, bytesRead); + } + } + } } diff --git a/src/main/webapp/AnySign4PC/anySign4PCInterface.js b/src/main/webapp/AnySign4PC/anySign4PCInterface.js index e9862bf8..8eeccc6a 100644 --- a/src/main/webapp/AnySign4PC/anySign4PCInterface.js +++ b/src/main/webapp/AnySign4PC/anySign4PCInterface.js @@ -24,7 +24,7 @@ function AnySignInitialize () * AnySign 기본 설정. *----------------------------------------------------------------------*/ var aProtocol = document.location.protocol; // window.location.protocol (http:) - var aDownloadURL = "//download.softforum.com/Published/AnySign/"; // CDN 경로 + var aDownloadURL = "//download.softforum.com/Published/AnySign/v"; // CDN 경로 var aPort = document.location.port; // window.location.port (port) var aHostName; @@ -58,9 +58,11 @@ function AnySignInitialize () //AnySign FCMS License 정보 var aLicense2 = ""; - if(aHostName == "it-make.co.kr") { + if(aHostName == "fairnet.kofair.or.kr") { + aLicense = "30820a3606092a864886f70d010702a0820a2730820a23020101310b300906052b0e03021a05003082039e06092a864886f70d010701a082038f0482038b313a666169726e65742e6b6f666169722e6f722e6b723a67657443657274547265652c6765744d656469614c6973742c7369676e44617461434d532c73657449644e756d2c76657269667950617373776f72642c766572696679436572742c766572696679436572744f776e65722c766572696679526f6f744361436572742c64656c65746543657274696669636174652c6368616e67654365727450617373776f72642c636865636b5046585077642c696d706f7274436572742c6578706f7274436572742c676574504658466f6c6465724c6973742c73617665436572742c626c6f636b446563436f6e7374616e742c7265717565737443657274696669636174652c72656e657743657274696669636174652c7265766f6b6543657274696669636174652c656e76656c6f7049644e756d2c676574566964496e666f2c7365744c616e67756167652c696e7374616c6c43657274696669636174652c736574497373756572436f6e766572745461626c652c736574506f6c696379436f6e766572745461626c652c656e76656c6f7065446174615769746850454d2c656e76656c6f70654461746157697468436572742c656e76656c6f706544617461576974685061737377642c6465456e76656c6f70654461746157697468436572742c6465456e76656c6f706544617461576974685061737377642c6765744c6173744c6f636174696f6e2c6c6f67696e504b4353313146726f6d496e6465782c6c6f67696e504b4353313146726f6d4e616d652c676574504b4353313144656661756c7450726f76696465722c7369676e44617461576974685046582c67657450465841636365737361626c654d656469614c6973742c7769662c66696e616c697a65504b4353313146726f6d4e616d652c696e697469616c697a65504b4353313146726f6d4e616d652c68736d4472697665724d616e616765722c636865636b50617373776f72644c656e2c67657443657274496e666f45782c6765744361636865436572744c6f636174696f6e2c626c6f636b456e632c626c6f636b44656345782c67657450465841636365737361626c654d656469614c697374496e636c75646553797374656d44726976652c676574504658466f6c6465724c697374496e636c75646553797374656d44726976652c676574466f6c6465724c697374496e636c75646553797374656d44726976652c656e76656c6f7049644e756d2c616e797369676e6c697465a0820467308204633082034ba003020102020107300d06092a864886f70d01010505003077310b3009060355040613024b52311e301c060355040a1315536f6674666f72756d20436f72706f726174696f6e3121301f06035504031318536f6674666f72756d20526f6f7420417574686f726974793125302306092a864886f70d010901161663616d617374657240736f6674666f72756d2e636f6d301e170d3034303431393030303030305a170d3333303131333030303030305a308192310b3009060355040613024b52311e301c060355040a1315536f6674666f72756d20436f72706f726174696f6e311e301c060355040b1315536563757269747920524e44204469766973696f6e311c301a06035504031313536f6674666f72756d205075626c69632043413125302306092a864886f70d010901161663616d617374657240736f6674666f72756d2e636f6d30820121300d06092a864886f70d01010105000382010e00308201090282010043340b4e1f2f30d6634c818e9fa4b35c199e0628503dbe0d1f5ad2c05890a918408dc330c991083bc7cdfc50021303c04afab4cb522d22fced11d1be6559835f1f000d466120cff97a2a80e4fdf972ac127f9bb8e8ddb84974323e4cb822c5f15b22f82da3de6ef61a0b6798ca49a85af3d8f8298912b4d26411e2e1635c081a3306931716c5e56b279c4d36068a4b645c10aa582693086e14132ba67fb03526312790261f9c641993e2ffc3fd9e8df3efebfddecd722e874d6366ad1252ac0d8bddb5674533cc2717a7342e5cfb18f8a301e7196ca33d6c3bb7e1f1e4bee34f5358af6ae0fd52a9fc3bdd4925f5eab7db6628e24738f6c882bb0aaa0e10afbf0203010001a381de3081db301f0603551d2304183016801409b5e27e7d2ac24a8f56bb67accebb93f5318fd3301d0603551d0e041604142e49ab278ae8c8af977537de8b74bb240e0d275f300e0603551d0f0101ff04040302010630120603551d130101ff040830060101ff02010030750603551d1f046e306c306aa068a06686646c6461703a2f2f6c6461702e736f6674666f72756d2e636f6d3a3338392f434e3d58656375726543524c505542432c4f553d536563757269747920524e44204469766973696f6e2c4f3d536f6674666f72756d20436f72706f726174696f6e2c433d4b52300d06092a864886f70d010105050003820101003ce700a0492b225b1665d9c73d84c34f7a5faad7b397ed49231f030e4e0e91953a607bd9006425373d490ef3ba1cf47810ca8c22fabe0c609f93823efdede64744458e910267f9f857c907318e286da6c131c9dd5fada43fd8cfdf6bd1b1b239338cea83eb6b6893b88fbcfd8e86a677b7270ad96be5a82b40569efc2dda6df4bcd642d067183186d6cace6c8f73b80f30b57acb3bcd5cbbc51307922d5edb38cb0d90c3917a8e37534183ba10f403c1c034287f39442df795050f39d78ddad97da8a43f02d7641549af9b5d68908e49faa8a1597cfed4a43baadd42c8fe4fd44c96d314df56147b8a7fa6ba65ffdee9ed3a5da52ef9ac7f9ca5afb633e1ccdf31820202308201fe020101307c3077310b3009060355040613024b52311e301c060355040a1315536f6674666f72756d20436f72706f726174696f6e3121301f06035504031318536f6674666f72756d20526f6f7420417574686f726974793125302306092a864886f70d010901161663616d617374657240736f6674666f72756d2e636f6d020107300906052b0e03021a0500a05d301806092a864886f70d010903310b06092a864886f70d010701301c06092a864886f70d010905310f170d3230303132323031333230395a302306092a864886f70d01090431160414f058169914b36e7a66be268bdd2d88f803d2347e300d06092a864886f70d01010105000482010010502dbe87e0fe01fced8a3ba1a828c377a963e2b9bcc6f52753f5c9c24700f272609e9d47be2227c9b05b222fb034d9343991712577e43033c012be833fcb9254a14769567ad149861a584e7f9eacfc8c1e1c6add678ba4f569759075073342363dca618faa21e94799d5ce438bd4df4fc866ae95d378d75245c85295a0b81a76a6cecdf042f39ef1f1d669beba8e47c31ab6de0144b3b09e636aab5db4bcf862aa7a115dd56abb77c6d8073114e3677f8a610e7db036a2a0d2dbaf5ba714e2e4fb82ff5526e5e69147a727e69dfd8d8c8bc5c33ca4594d5d400b600c973365d22f2c14487faba69037f881861ddd41c51a998a1d0cdca33428e9f798e53783" + } else if(aHostName == "it-make.co.kr") { aLicense = "30820a2306092a864886f70d010702a0820a1430820a10020101310b300906052b0e03021a05003082038b06092a864886f70d010701a082037c04820378313a69742d6d616b652e636f2e6b723a67657443657274547265652c6765744d656469614c6973742c7369676e44617461434d532c73657449644e756d2c76657269667950617373776f72642c766572696679436572742c766572696679436572744f776e65722c766572696679526f6f744361436572742c64656c65746543657274696669636174652c6368616e67654365727450617373776f72642c636865636b5046585077642c696d706f7274436572742c6578706f7274436572742c676574504658466f6c6465724c6973742c73617665436572742c626c6f636b446563436f6e7374616e742c7265717565737443657274696669636174652c72656e657743657274696669636174652c7265766f6b6543657274696669636174652c656e76656c6f7049644e756d2c676574566964496e666f2c7365744c616e67756167652c696e7374616c6c43657274696669636174652c736574497373756572436f6e766572745461626c652c736574506f6c696379436f6e766572745461626c652c656e76656c6f7065446174615769746850454d2c656e76656c6f70654461746157697468436572742c656e76656c6f706544617461576974685061737377642c6465456e76656c6f70654461746157697468436572742c6465456e76656c6f706544617461576974685061737377642c6765744c6173744c6f636174696f6e2c6c6f67696e504b4353313146726f6d496e6465782c6c6f67696e504b4353313146726f6d4e616d652c676574504b4353313144656661756c7450726f76696465722c7369676e44617461576974685046582c67657450465841636365737361626c654d656469614c6973742c7769662c66696e616c697a65504b4353313146726f6d4e616d652c696e697469616c697a65504b4353313146726f6d4e616d652c68736d4472697665724d616e616765722c636865636b50617373776f72644c656e2c67657443657274496e666f45782c6765744361636865436572744c6f636174696f6e2c626c6f636b456e632c626c6f636b44656345782c67657450465841636365737361626c654d656469614c697374496e636c75646553797374656d44726976652c676574504658466f6c6465724c697374496e636c75646553797374656d44726976652c676574466f6c6465724c697374496e636c75646553797374656d44726976652c656e76656c6f7049644e756da0820467308204633082034ba003020102020107300d06092a864886f70d01010505003077310b3009060355040613024b52311e301c060355040a1315536f6674666f72756d20436f72706f726174696f6e3121301f06035504031318536f6674666f72756d20526f6f7420417574686f726974793125302306092a864886f70d010901161663616d617374657240736f6674666f72756d2e636f6d301e170d3034303431393030303030305a170d3333303131333030303030305a308192310b3009060355040613024b52311e301c060355040a1315536f6674666f72756d20436f72706f726174696f6e311e301c060355040b1315536563757269747920524e44204469766973696f6e311c301a06035504031313536f6674666f72756d205075626c69632043413125302306092a864886f70d010901161663616d617374657240736f6674666f72756d2e636f6d30820121300d06092a864886f70d01010105000382010e00308201090282010043340b4e1f2f30d6634c818e9fa4b35c199e0628503dbe0d1f5ad2c05890a918408dc330c991083bc7cdfc50021303c04afab4cb522d22fced11d1be6559835f1f000d466120cff97a2a80e4fdf972ac127f9bb8e8ddb84974323e4cb822c5f15b22f82da3de6ef61a0b6798ca49a85af3d8f8298912b4d26411e2e1635c081a3306931716c5e56b279c4d36068a4b645c10aa582693086e14132ba67fb03526312790261f9c641993e2ffc3fd9e8df3efebfddecd722e874d6366ad1252ac0d8bddb5674533cc2717a7342e5cfb18f8a301e7196ca33d6c3bb7e1f1e4bee34f5358af6ae0fd52a9fc3bdd4925f5eab7db6628e24738f6c882bb0aaa0e10afbf0203010001a381de3081db301f0603551d2304183016801409b5e27e7d2ac24a8f56bb67accebb93f5318fd3301d0603551d0e041604142e49ab278ae8c8af977537de8b74bb240e0d275f300e0603551d0f0101ff04040302010630120603551d130101ff040830060101ff02010030750603551d1f046e306c306aa068a06686646c6461703a2f2f6c6461702e736f6674666f72756d2e636f6d3a3338392f434e3d58656375726543524c505542432c4f553d536563757269747920524e44204469766973696f6e2c4f3d536f6674666f72756d20436f72706f726174696f6e2c433d4b52300d06092a864886f70d010105050003820101003ce700a0492b225b1665d9c73d84c34f7a5faad7b397ed49231f030e4e0e91953a607bd9006425373d490ef3ba1cf47810ca8c22fabe0c609f93823efdede64744458e910267f9f857c907318e286da6c131c9dd5fada43fd8cfdf6bd1b1b239338cea83eb6b6893b88fbcfd8e86a677b7270ad96be5a82b40569efc2dda6df4bcd642d067183186d6cace6c8f73b80f30b57acb3bcd5cbbc51307922d5edb38cb0d90c3917a8e37534183ba10f403c1c034287f39442df795050f39d78ddad97da8a43f02d7641549af9b5d68908e49faa8a1597cfed4a43baadd42c8fe4fd44c96d314df56147b8a7fa6ba65ffdee9ed3a5da52ef9ac7f9ca5afb633e1ccdf31820202308201fe020101307c3077310b3009060355040613024b52311e301c060355040a1315536f6674666f72756d20436f72706f726174696f6e3121301f06035504031318536f6674666f72756d20526f6f7420417574686f726974793125302306092a864886f70d010901161663616d617374657240736f6674666f72756d2e636f6d020107300906052b0e03021a0500a05d301806092a864886f70d010903310b06092a864886f70d010701301c06092a864886f70d010905310f170d3139313130383033313134355a302306092a864886f70d0109043116041484c62d5b05a638c0068269a07c6f55575876e337300d06092a864886f70d0101010500048201000dca7d40e1ccc1255c05e9e2d15941ce80332d060b7e3c427bab2ec913e953d6cb713dd495ae2daed5ea036f1069a0321c1629020c27ca2617afb513471343a4728e1f4766926353c89b7aaea9c384bad470e98e1dccb729983d510919272e51d49d4db7f9c70a31866e2c4934a39d34f2c82ccc56615d8912aadc4574f7265050a214f73bbcc54b92e4e86cdc5b3f217957233e71e27e6bef657d1c12889876ad7ece224b123be7ffe43bbe8f3911718ec34b4f22133ffaf5bed4705e3d1e3052bc925b8cadb09eaf3e5f2e2dd793f732948d3d39eeecfbf6f7103beb6d94a999174ad29ecfea0e2df40cb91433d58281b5946b50b63ba5c166321bbfadfbb9"; - }else if(aHostName == "it-make.co.kr:8080") { + } else if(aHostName == "it-make.co.kr:8080") { aLicense = "30820a2806092a864886f70d010702a0820a1930820a15020101310b300906052b0e03021a05003082039006092a864886f70d010701a08203810482037d313a69742d6d616b652e636f2e6b723a383038303a67657443657274547265652c6765744d656469614c6973742c7369676e44617461434d532c73657449644e756d2c76657269667950617373776f72642c766572696679436572742c766572696679436572744f776e65722c766572696679526f6f744361436572742c64656c65746543657274696669636174652c6368616e67654365727450617373776f72642c636865636b5046585077642c696d706f7274436572742c6578706f7274436572742c676574504658466f6c6465724c6973742c73617665436572742c626c6f636b446563436f6e7374616e742c7265717565737443657274696669636174652c72656e657743657274696669636174652c7265766f6b6543657274696669636174652c656e76656c6f7049644e756d2c676574566964496e666f2c7365744c616e67756167652c696e7374616c6c43657274696669636174652c736574497373756572436f6e766572745461626c652c736574506f6c696379436f6e766572745461626c652c656e76656c6f7065446174615769746850454d2c656e76656c6f70654461746157697468436572742c656e76656c6f706544617461576974685061737377642c6465456e76656c6f70654461746157697468436572742c6465456e76656c6f706544617461576974685061737377642c6765744c6173744c6f636174696f6e2c6c6f67696e504b4353313146726f6d496e6465782c6c6f67696e504b4353313146726f6d4e616d652c676574504b4353313144656661756c7450726f76696465722c7369676e44617461576974685046582c67657450465841636365737361626c654d656469614c6973742c7769662c66696e616c697a65504b4353313146726f6d4e616d652c696e697469616c697a65504b4353313146726f6d4e616d652c68736d4472697665724d616e616765722c636865636b50617373776f72644c656e2c67657443657274496e666f45782c6765744361636865436572744c6f636174696f6e2c626c6f636b456e632c626c6f636b44656345782c67657450465841636365737361626c654d656469614c697374496e636c75646553797374656d44726976652c676574504658466f6c6465724c697374496e636c75646553797374656d44726976652c676574466f6c6465724c697374496e636c75646553797374656d44726976652c656e76656c6f7049644e756da0820467308204633082034ba003020102020107300d06092a864886f70d01010505003077310b3009060355040613024b52311e301c060355040a1315536f6674666f72756d20436f72706f726174696f6e3121301f06035504031318536f6674666f72756d20526f6f7420417574686f726974793125302306092a864886f70d010901161663616d617374657240736f6674666f72756d2e636f6d301e170d3034303431393030303030305a170d3333303131333030303030305a308192310b3009060355040613024b52311e301c060355040a1315536f6674666f72756d20436f72706f726174696f6e311e301c060355040b1315536563757269747920524e44204469766973696f6e311c301a06035504031313536f6674666f72756d205075626c69632043413125302306092a864886f70d010901161663616d617374657240736f6674666f72756d2e636f6d30820121300d06092a864886f70d01010105000382010e00308201090282010043340b4e1f2f30d6634c818e9fa4b35c199e0628503dbe0d1f5ad2c05890a918408dc330c991083bc7cdfc50021303c04afab4cb522d22fced11d1be6559835f1f000d466120cff97a2a80e4fdf972ac127f9bb8e8ddb84974323e4cb822c5f15b22f82da3de6ef61a0b6798ca49a85af3d8f8298912b4d26411e2e1635c081a3306931716c5e56b279c4d36068a4b645c10aa582693086e14132ba67fb03526312790261f9c641993e2ffc3fd9e8df3efebfddecd722e874d6366ad1252ac0d8bddb5674533cc2717a7342e5cfb18f8a301e7196ca33d6c3bb7e1f1e4bee34f5358af6ae0fd52a9fc3bdd4925f5eab7db6628e24738f6c882bb0aaa0e10afbf0203010001a381de3081db301f0603551d2304183016801409b5e27e7d2ac24a8f56bb67accebb93f5318fd3301d0603551d0e041604142e49ab278ae8c8af977537de8b74bb240e0d275f300e0603551d0f0101ff04040302010630120603551d130101ff040830060101ff02010030750603551d1f046e306c306aa068a06686646c6461703a2f2f6c6461702e736f6674666f72756d2e636f6d3a3338392f434e3d58656375726543524c505542432c4f553d536563757269747920524e44204469766973696f6e2c4f3d536f6674666f72756d20436f72706f726174696f6e2c433d4b52300d06092a864886f70d010105050003820101003ce700a0492b225b1665d9c73d84c34f7a5faad7b397ed49231f030e4e0e91953a607bd9006425373d490ef3ba1cf47810ca8c22fabe0c609f93823efdede64744458e910267f9f857c907318e286da6c131c9dd5fada43fd8cfdf6bd1b1b239338cea83eb6b6893b88fbcfd8e86a677b7270ad96be5a82b40569efc2dda6df4bcd642d067183186d6cace6c8f73b80f30b57acb3bcd5cbbc51307922d5edb38cb0d90c3917a8e37534183ba10f403c1c034287f39442df795050f39d78ddad97da8a43f02d7641549af9b5d68908e49faa8a1597cfed4a43baadd42c8fe4fd44c96d314df56147b8a7fa6ba65ffdee9ed3a5da52ef9ac7f9ca5afb633e1ccdf31820202308201fe020101307c3077310b3009060355040613024b52311e301c060355040a1315536f6674666f72756d20436f72706f726174696f6e3121301f06035504031318536f6674666f72756d20526f6f7420417574686f726974793125302306092a864886f70d010901161663616d617374657240736f6674666f72756d2e636f6d020107300906052b0e03021a0500a05d301806092a864886f70d010903310b06092a864886f70d010701301c06092a864886f70d010905310f170d3139313130383033313331345a302306092a864886f70d01090431160414e9b500cbc8f1691d3037bb35d9d5edff43fe98a0300d06092a864886f70d01010105000482010014c4e285a5fb913ce5a476e87d145c024af82108f7e94806e1d8dd8121c19055da1c32936d0fc6a3020c6e510ddb48986cfd59c7ab5065acedb489762ca28aa53eeecf358f1d0942ed1d72fd94dbcd6578fb3777166ae54db3cbced3360ec1371b07367ee5eb9fadfc53d6a5de30a3fb858e2f4666bb904bc987846e921d985699ebcb52196652874ffacda10862ee39d2ed3f4f399b9030d0ec4fbfbe50bbea62439ca9a5405327888c314090224ee8fa799a4afa7913943c1d3a9bbee29e114f5933e8dbd310a6e4762ff67142a6018405978ef303c8eab7af1ab8ce7389dded96ff18935fb566fec0769cc193f0218e9dd1503c8a82f57b74af8beb26f650"; } else { // localhost @@ -425,20 +427,20 @@ function AnySignInitialize () var aLimitedTrial = 3; // Default CA list. - var aCAList = "Root CA,XecurePKI51 ca,cn=CA131000010,pki50ca,pki70_test_CA"; - aCAList += ",CA131000002Test,CA131000002,CA131000010,Softforum CA 3.0"; - aCAList += ",SoftforumCA,yessignCA-OCSP,signGATE CA,signGATE CA4,SignKorea CA,SignKorea CA2,CrossCertCA,CrossCertCA2"; - aCAList += ",CrossCertCA-Test2,3280TestCAServer,NCASignCA,TradeSignCA,TradeSignCA2,yessignCA-TEST"; - aCAList += ",lotto test CA,NCATESTSign,SignGateFTCA,SignKorea Test CA,SignKorea Test CA2,TestTradeSignCA"; - aCAList += ",Softforum Demo CA,mma ca,병무청 인증기관,MND CA,signGATE FTCA02"; - aCAList += ",.ROOT.CA.KT.BCN.BU,CA974000001,setest CA,3280TestCAServer"; - aCAList += ",yessignCA-Test Class 0,yessignCA-Test Class 1,yessignCA-Test Class 2,yessignCA-Test Class 3,yessignCA-Test Class 4,TradeSignCA2009Test2,CrossCertTestCA2,1024TestCA"; - aCAList += ",yessignCA,yessignCA Class 1,yessignCA Class 2"; - aCAList += ",CA130000031T,CA131000031T,CA131100001,CA134040001,Test1024CA,subca,subca_02,MMACA001"; - //var aCAList=""; + //var aCAList = "Root CA,XecurePKI51 ca,cn=CA131000010,pki50ca,pki70_test_CA"; + //aCAList += ",CA131000002Test,CA131000002,CA131000010,Softforum CA 3.0"; + //aCAList += ",SoftforumCA,yessignCA-OCSP,signGATE CA,signGATE CA4,SignKorea CA,SignKorea CA2,CrossCertCA,CrossCertCA2"; + //aCAList += ",CrossCertCA-Test2,3280TestCAServer,NCASignCA,TradeSignCA,TradeSignCA2,yessignCA-TEST"; + //aCAList += ",lotto test CA,NCATESTSign,SignGateFTCA,SignKorea Test CA,SignKorea Test CA2,TestTradeSignCA"; + //aCAList += ",Softforum Demo CA,mma ca,병무청 인증기관,MND CA,signGATE FTCA02"; + //aCAList += ",.ROOT.CA.KT.BCN.BU,CA974000001,setest CA,3280TestCAServer"; + //aCAList += ",yessignCA-Test Class 0,yessignCA-Test Class 1,yessignCA-Test Class 2,yessignCA-Test Class 3,yessignCA-Test Class 4,TradeSignCA2009Test2,CrossCertTestCA2,1024TestCA"; + //aCAList += ",yessignCA,yessignCA Class 1,yessignCA Class 2"; + //aCAList += ",CA130000031T,CA131000031T,CA131100001,CA134040001,Test1024CA,subca,subca_02,MMACA001"; + var aCAList=""; // real //금융결제원 - aCAList += "yessignCA Class 1"; + aCAList += "yessignCA Class 3"; aCAList+=":1.2.410.200005.1.1.1"; aCAList+=":1.2.410.200005.1.1.2"; aCAList+=":1.2.410.200005.1.1.4"; @@ -451,7 +453,7 @@ function AnySignInitialize () aCAList+=":1.2.410.200005.1.1.5"; //한국정보인증 - aCAList += ",signGATE CA4"; + aCAList += ",signGATE CA6"; aCAList+=":1.2.410.200004.5.2.1.1"; aCAList+=":1.2.410.200004.5.2.1.2"; aCAList+=":1.2.410.200004.5.2.1.7.1"; @@ -464,7 +466,7 @@ function AnySignInitialize () aCAList+=":1.2.410.200004.5.2.1.7.2"; //한국증권전산(코스콤) - aCAList += ",SignKorea CA2"; + aCAList += ",SignKorea CA4"; aCAList+=":1.2.410.200004.5.1.1.5"; aCAList+=":1.2.410.200004.5.1.1.7"; aCAList+=":1.2.410.200004.5.1.1.9"; @@ -475,7 +477,7 @@ function AnySignInitialize () aCAList+=":1.2.410.200004.5.1.1.9"; //한국전자인증 - aCAList += ",CrossCertCA2"; + aCAList += ",CrossCertCA4"; aCAList+=":1.2.410.200004.5.4.1.1"; aCAList+=":1.2.410.200004.5.4.1.2"; aCAList+=":1.2.410.200004.5.4.1.101"; @@ -486,7 +488,7 @@ function AnySignInitialize () aCAList+=":1.2.410.200004.5.4.1.101"; //한국무역정보통신(KTNet) - aCAList += ",TradeSignCA2"; + aCAList += ",TradeSignCA3"; aCAList+=":1.2.410.200012.1.1.1"; aCAList+=":1.2.410.200012.1.1.3"; aCAList+=":1.2.410.200012.1.1.101"; @@ -498,8 +500,6 @@ function AnySignInitialize () aCAList+=":1.2.410.200012.1.1.101"; aCAList+=":1.2.410.200012.1.1.103"; - //이니텍(INIPASS) - aCAList += ",INIPASS CA"; // dev aCAList += ",yessignCA-Test Class 4"; aCAList += ",SignKorea Test CA5"; @@ -508,6 +508,9 @@ function AnySignInitialize () aCAList += ",TradeSignCA2009Test2"; aCAList += ",INIPASS TEST CA2"; aCAList += ",subca,subca_02"; + + //교육부 + aCAList += ",CA134100031"; // Storage 정보. var aStorage = "HARD,REMOVABLE,SMARTCERT,MOBISIGN,MPHONE,PKCS11,ICCARD,USBTOKEN,CSP,SECUREDISK"; @@ -840,7 +843,7 @@ function UnifiedPluginInterface (aBasePath, aSearchWord : "Chrome", aSearchLength : 7, aMinVersion : "24.0", - aMaxVersion : "99.0" + aMaxVersion : "199.0" }, { aName : "firefox", diff --git a/src/main/webapp/AnySign4PC/anySign4PCInterface.js_20221209 b/src/main/webapp/AnySign4PC/anySign4PCInterface.js_20221209 new file mode 100644 index 00000000..261657ae --- /dev/null +++ b/src/main/webapp/AnySign4PC/anySign4PCInterface.js_20221209 @@ -0,0 +1,6607 @@ +/*! +* AnySign, v1.0.1.21. +* +* For more information on this product, please see +* https://www.hsecure.co.kr/ +* +* Copyright (c) Hancom Secure Inc. All Rights Reserved. +* +* Date: 2019-08-21 +*/ +document.write(""); +document.write(""); +document.write(" + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+
+
+ + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + +

공통 설정

Charset + 현재 페이지 : <%=charset%>
+ [AnySign4PC/Lite <%=link_charset%>] +
Language + ko-KR + en-US +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

AnySign4PC 설정

AnySign4PC 설치 확인 및 초기화 + Version : + +
가상 키패드Transkey
v4.5.1 (2013.01.11)
+ +
XecureKeyPad
v1.0.0.2 (2016.10.19)
+ +
IncaKeyPad
2016.10.19
+ +
Openkeyboard
v1.0 (2013.07.21)
+ +
키보드 보안TouchenKey
v3.1.0.11 (2013.02.26)
+ Module Load (ActiveX/Plugin): [설치페이지] + +
nProtect KeyCrypt HTML5 + [설치파일] + +
키보드 보안AhnLab Safe Transaction
v1.3.4.393(2015.12.30)
+ + [설치파일] + +
TouchEn nxKey
v1.0.0.8 (2015.07.24)
+ [설치페이지] + +
Kings Online Security
v1.0.0.7 (2016.04.07)
+ [설치파일] + +
EzKeyTec 키보드보안
v2.2(2016.4.29.2)
+ [설치파일] + +
키보드 보안 + 가상 키패드nProtect Online Security V1.0
v1.0 (2015.12.23)
+ [설치파일] + +
보안 토큰XecureHSM v2.0.0.3 (driver: v1.1.0.1) + xhsm_install.exe + [다운로드] +
+
+ + + + + + + + + + + + + + + + + + +

AnySignLite 설정

AnySignLite 사용 유무 + +
OpenCert 사용 유무 + +
가상 키패드XecureKeyPad Lite
v1.0.0.2 (2016.09.28)
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +

XecureFreeSign 설정

XecureFreeSign 사용 유무 + +
서명 방식 + server + server-digest + client +
가상 키패드XecureKeyPad E2E
v1.0.1.0 (2017.01.17)
+ +
OpenAPI + +
+
+
+ +

XecureLink

+ + + + + + + + + + + + + +
XecureLink + 전송 +
AnySign.XecureLink KB + 전송 +
AnySign.XecureLink LGUPlus + 전송 +
+
+ +

XecureSubmit

+ + + + + +
AnySign.XecureSubmit +
+
+
+ +
+
+
+ +

XecureNavigate

+ + + + + + + + + + + + + +
XecureNavigate + 전송 +
XecureNavigate KB + 전송 +
XecureNavigate LGUPlus + 전송 +
+
+ +

BlockEnc

+ + + + + +
BlockEncEx + 전송 +
+
+ + +

SignDataCMS

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aPlain
aOption + + 0x00000000 : 기본 서명
+ + 0x00000001 : 서명확인창을 보여준다.
+ + 0x00000002 : 로그인한 인증서만 보여준다.
+ + 0x00000100 : 출력 값을 Base64로
+ + 0x00000200 : 서명 시간 추가 (SignedAttributes)
+ + 0x00001000 : 분리 서명 (No Content)
+ + 0x00800000 : SignKorea 축약서명 (PKCS1)
+ + 0x01800000 : SignKorea 축약서명 (PKCS1) + 출력값 추가(subjectRDN|certSerial|인증서값)
+ + 0x02010000 : SignKorea 풀서명 (NO CMS + SignKorea)
+ + 0x00200000 : 스마트 인증 캐쉬
+ + 0x00100000 : 인증서 위치 캐쉬
+
aDescription
aLimitedTrial
Run + +
+ +
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
Output + + SignDataCMS: + + + + SignDataAdd: + +
Reset + +
+
+
+ +

SignDataCMSWithSerial

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aSerial
aLocation
aPlain
aOption + + 0 : 기본 서명
+ + 1 : 서명확인창을 보여준다.
+
aDescription
aLimitedTrial
Run + +
+ +
+
+ +
+ +
Output + +
Send + + +
+
+
+ +

SignDataCMSWithHTMLEx

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aForm
aPlain
aCert
aOption + + 0 : 기본 서명
+ + 1 : 서명확인창을 보여준다.
+ + 4 : VID 생성
+ + 16 : IDN값을 입력받지 않는다 ""로 IDN대체 (VID입력창을 띄우지 않음)
+
aDescription
aLimitedTrial
Run + +
+ +
Output + +
+ +
Send + + +
+
+
+ +

SignDataCMSWithHTMLExAndSerial

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aSerial
aLocation
aForm
aPlain
aCert
aOption + + 0 : 기본 서명
+ + 1 : 서명확인창을 보여준다.
+ + 4 : VID 생성
+ + 16 : IDN값을 입력받지 않는다 ""로 IDN대체 (VID입력창을 띄우지 않음)
+
aDescription
aLimitedTrial
Run + +
+ +
+
+ +
+ +
Output + +
+ +
Send + + +
+
+
+ + +

SignDataWithVID

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aPlain
aCert
aOption + (공통 옵션)
+ + 0 : 기본 서명
+ + 1 : 서명확인창을 보여준다.
+ + 8 : WEB(aIdn)으로 부터 직접 VID를 입력받는다 (VID입력창 뜨지 않음)
+ + 16 : IDN값을 입력받지 않는다 ""로 IDN대체 (VID입력창을 띄우지 않음)
+
aIdn
aDescription
aLimitedTrial
Run + +
+ +
+ +
+ +
+ +
+ +
Output + +
VID Output + +
Send + + +
+
+ + +

SignDataWithVID_Serial

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aSerial
aLocation
aPlain
aCert
aOption + (공통 옵션)
+ + 0 : 기본 서명
+ + 1 : 서명확인창을 보여준다.
+ + 8 : WEB(aIdn)으로 부터 직접 VID를 입력받는다 (VID입력창 뜨지 않음)
+ + 16 : IDN값을 입력받지 않는다 ""로 대체 (VID입력창 뜨지 않음)
+
aIdn
aDescription
aLimitedTrial
Run + + +
+
+ +
+ +
Output + +
Vid Output + +
Send +
+
+ + +

MultiSignEx

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aPlain
aTotal
aDelimiter
aCertSerial
aCertLocation
aCert
Run + +
+ +
+ +
Output + +
+ +
Send + +
+
+
+ + +

SignFile

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
SignFilePath
OutFilePath
aOption + + 0x00000000 : 기본 서명
+ + 0x00000001 : 서명확인창을 보여준다.
+
aDescription
aLimitedTrial
Run + +
+ +
+
+
+
+ + +

MultiFileSign

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aSignFiles
aTotal
aDelimiter
aCertSerial
aCertLocation
Run + +
+
+
+
+ + +

EnvelopeData

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aPlain
aOption + + 1 : 인증서 사용.
+ + 2 : 비밀번호 사용.
+ + 4 : 여러개의 인증서 사용 (1과 함께 사용).
+
aPassword
aPEM + 서버 인증서 (PEM) 사용
+ +
aCertSerial
aCertLocation
aDescription
Run + +
+
+ +
+ +
Output + +
+
+
+ + +

DeEnvelopeData

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aEnvelopedData
aOption + + 1 : 인증서 사용.
+ + 2 : 비밀번호 사용.
+
aPassword
aDescription
Run + + +
Output + +
+
+
+ + +

ShowCertManager

+ + + + + +
Run + +
+ +
+
+ + +

CMP

+ + + + + + + + + + + + + + + +
Option인증서 갱신 + ShowRenewCertSaveLoc +
Run + 참조번호:
+ 인가코드:
+ 이름:
+ 주민등록번호:
+ +
+ + + + + + + + + + + + + + + + +
+
+ 인증 기관 종류: +
+ 공개키 알고리즘: +
+ 키길이: +
+ 인증서 용도: +

+
+ + + +
+ + + +
+ + + +
+
Output + +
+
+ + +

RevokeCertificate

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaType
aJobCode
aReason
aLimitedTrial
Run + +
+ +
Output + +
+
+
+ +

FileHash

+
+ + + + + + + + + + + + + + + + + + +
InputaFilePath
Algorithm + + XW_HASH_MD2
+ + XW_HASH_MD5
+ + XW_HASH_SHA1
+ + XW_HASH_RIPEMD160
+ + XW_HASH_HAS160
+ + XW_HASH_SHA256
+
Run + +
+
Output + +
+
+
+ + +

Wif

+
+ + + + + + + + + + + + + + + + + + +
InputaCert
aOption + + 0x0001 : HDD Serial(only windows)
+ + 0x0002 : Mac Address
+ + 0x0004 : IP Address
+ + 0x0100 : All User Info
+
Run + +
+
Output + + +
+
+
+ +

getKTBScanInfo

+
+ + + + + + + + + + + + + + + + + + +
InputaServerIP
aServerPort
Run + +
+
Output + +
+
+
+ +

getCertPath

+
+ + + + + + + + + + + + + +
Run + +
Output + +
Signed + +
+
+
+ +

certselectwide

+ + + + +
+ [certselectwide] +
+
+ +

SignFileInfo

+ + + + +
+ [SignFileInfo] +
+
+ +

FCMS

+ + + + +
+ [FCMS] +
+
+ +
+ +
+
+
+ + diff --git a/src/main/webapp/AnySign4PC/test/AnySign4PCTest.jsp b/src/main/webapp/AnySign4PC/test/AnySign4PCTest.jsp new file mode 100644 index 00000000..0c6ceec7 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/AnySign4PCTest.jsp @@ -0,0 +1,2987 @@ + +<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.security.*" %> +<%@ page import="java.util.Random" %> +<% request.setCharacterEncoding("utf-8"); %> +<% response.setContentType("text/html; charset=utf-8"); %> +<% + String charset = "utf-8"; + String sign_result_page = "./sign_result.jsp"; + String sign_result1_page = "./sign_result1.jsp"; + String sign_result2_page = "./sign_result2.jsp"; + String sign_result3_page = "./sign_result3.jsp"; + + String link_charset = "euc-kr"; + String link_page = "./AnySign4PCTest_euckr.jsp"; +%> + + +AnySign4PC/AnySignLite TEST + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+
+
+ + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + +

공통 설정

Charset + 현재 페이지 : <%=charset%>
+ [AnySign4PC/Lite <%=link_charset%>] +
Language + ko-KR + en-US +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

AnySign4PC 설정

AnySign4PC 설치 확인 및 초기화 + Version : + +
가상 키패드Transkey
v4.5.1 (2013.01.11)
+ +
XecureKeyPad
v1.0.0.2 (2016.10.19)
+ +
IncaKeyPad
2016.10.19
+ +
Openkeyboard
v1.0 (2013.07.21)
+ +
키보드 보안TouchenKey
v3.1.0.11 (2013.02.26)
+ Module Load (ActiveX/Plugin): [설치페이지] + +
nProtect KeyCrypt HTML5 + [설치파일] + +
키보드 보안AhnLab Safe Transaction
v1.3.4.393(2015.12.30)
+ + [설치파일] + +
TouchEn nxKey
v1.0.0.8 (2015.07.24)
+ [설치페이지] + +
Kings Online Security
v1.0.0.7 (2016.04.07)
+ [설치파일] + +
EzKeyTec 키보드보안
v2.2(2016.4.29.2)
+ [설치파일] + +
키보드 보안 + 가상 키패드nProtect Online Security V1.0
v1.0 (2015.12.23)
+ [설치파일] + +
보안 토큰XecureHSM v2.0.0.3 (driver: v1.1.0.1) + xhsm_install.exe + [다운로드] +
+
+ + + + + + + + + + + + + + + + + + +

AnySignLite 설정

AnySignLite 사용 유무 + +
OpenCert 사용 유무 + +
가상 키패드XecureKeyPad Lite
v1.0.0.2 (2016.09.28)
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +

XecureFreeSign 설정

XecureFreeSign 사용 유무 + +
서명 방식 + server + server-digest + client +
가상 키패드XecureKeyPad E2E
v1.0.1.0 (2017.01.17)
+ +
OpenAPI + +
+
+
+ +

XecureLink

+ + + + + + + + + + + + + +
XecureLink + 전송 +
AnySign.XecureLink KB + 전송 +
AnySign.XecureLink LGUPlus + 전송 +
+
+ +

XecureSubmit

+ + + + + +
AnySign.XecureSubmit +
+
+
+ +
+
+
+ +

XecureNavigate

+ + + + + + + + + + + + + +
XecureNavigate + 전송 +
XecureNavigate KB + 전송 +
XecureNavigate LGUPlus + 전송 +
+
+ +

BlockEnc

+ + + + + +
BlockEncEx + 전송 +
+
+ + +

SignDataCMS

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aPlain
aOption + + 0x00000000 : 기본 서명
+ + 0x00000001 : 서명확인창을 보여준다.
+ + 0x00000002 : 로그인한 인증서만 보여준다.
+ + 0x00000100 : 출력 값을 Base64로
+ + 0x00000200 : 서명 시간 추가 (SignedAttributes)
+ + 0x00001000 : 분리 서명 (No Content)
+ + 0x00800000 : SignKorea 축약서명 (PKCS1)
+ + 0x01800000 : SignKorea 축약서명 (PKCS1) + 출력값 추가(subjectRDN|certSerial|인증서값)
+ + 0x02010000 : SignKorea 풀서명 (NO CMS + SignKorea)
+ + 0x00200000 : 스마트 인증 캐쉬
+ + 0x00100000 : 인증서 위치 캐쉬
+
aDescription
aLimitedTrial
Run + +
+ +
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
Output + + SignDataCMS: + + + + SignDataAdd: + +
Reset + +
+
+
+ +

SignDataCMSWithSerial

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aSerial
aLocation
aPlain
aOption + + 0 : 기본 서명
+ + 1 : 서명확인창을 보여준다.
+
aDescription
aLimitedTrial
Run + +
+ +
+
+ +
+ +
Output + +
Send + + +
+
+
+ +

SignDataCMSWithHTMLEx

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aForm
aPlain
aCert
aOption + + 0 : 기본 서명
+ + 1 : 서명확인창을 보여준다.
+ + 4 : VID 생성
+ + 16 : IDN값을 입력받지 않는다 ""로 IDN대체 (VID입력창을 띄우지 않음)
+
aDescription
aLimitedTrial
Run + +
+ +
Output + +
+ +
Send + + +
+
+
+ +

SignDataCMSWithHTMLExAndSerial

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aSerial
aLocation
aForm
aPlain
aCert
aOption + + 0 : 기본 서명
+ + 1 : 서명확인창을 보여준다.
+ + 4 : VID 생성
+ + 16 : IDN값을 입력받지 않는다 ""로 IDN대체 (VID입력창을 띄우지 않음)
+
aDescription
aLimitedTrial
Run + +
+ +
+
+ +
+ +
Output + +
+ +
Send + + +
+
+
+ + +

SignDataWithVID

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aPlain
aCert
aOption + (공통 옵션)
+ + 0 : 기본 서명
+ + 1 : 서명확인창을 보여준다.
+ + 8 : WEB(aIdn)으로 부터 직접 VID를 입력받는다 (VID입력창 뜨지 않음)
+ + 16 : IDN값을 입력받지 않는다 ""로 IDN대체 (VID입력창을 띄우지 않음)
+
aIdn
aDescription
aLimitedTrial
Run + +
+ +
+ +
+ +
+ +
+ +
Output + +
VID Output + +
Send + + +
+
+ + +

SignDataWithVID_Serial

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aSerial
aLocation
aPlain
aCert
aOption + (공통 옵션)
+ + 0 : 기본 서명
+ + 1 : 서명확인창을 보여준다.
+ + 8 : WEB(aIdn)으로 부터 직접 VID를 입력받는다 (VID입력창 뜨지 않음)
+ + 16 : IDN값을 입력받지 않는다 ""로 대체 (VID입력창 뜨지 않음)
+
aIdn
aDescription
aLimitedTrial
Run + + +
+
+ +
+ +
Output + +
Vid Output + +
Send +
+
+ + +

MultiSignEx

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aPlain
aTotal
aDelimiter
aCertSerial
aCertLocation
aCert
Run + +
+ +
+ +
Output + +
+ +
Send + +
+
+
+ + +

SignFile

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
SignFilePath
OutFilePath
aOption + + 0x00000000 : 기본 서명
+ + 0x00000001 : 서명확인창을 보여준다.
+
aDescription
aLimitedTrial
Run + +
+ +
+
+
+
+ + +

MultiFileSign

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aSignFiles
aTotal
aDelimiter
aCertSerial
aCertLocation
Run + +
+
+
+
+ + +

EnvelopeData

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aPlain
aOption + + 1 : 인증서 사용.
+ + 2 : 비밀번호 사용.
+ + 4 : 여러개의 인증서 사용 (1과 함께 사용).
+
aPassword
aPEM + 서버 인증서 (PEM) 사용
+ +
aCertSerial
aCertLocation
aDescription
Run + +
+
+ +
+ +
Output + +
+
+
+ + +

DeEnvelopeData

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aEnvelopedData
aOption + + 1 : 인증서 사용.
+ + 2 : 비밀번호 사용.
+
aPassword
aDescription
Run + + +
Output + +
+
+
+ + +

ShowCertManager

+ + + + + +
Run + +
+ +
+
+ + +

CMP

+ + + + + + + + + + + + + + + +
Option인증서 갱신 + ShowRenewCertSaveLoc +
Run + 참조번호:
+ 인가코드:
+ 이름:
+ 주민등록번호:
+ +
+ + + + + + + + + + + + + + + + +
+
+ 인증 기관 종류: +
+ 공개키 알고리즘: +
+ 키길이: +
+ 인증서 용도: +

+
+ + + +
+ + + +
+ + + +
+
Output + +
+
+ + +

RevokeCertificate

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaType
aJobCode
aReason
aLimitedTrial
Run + +
+ +
Output + +
+
+
+ +

FileHash

+
+ + + + + + + + + + + + + + + + + + +
InputaFilePath
Algorithm + + XW_HASH_MD2
+ + XW_HASH_MD5
+ + XW_HASH_SHA1
+ + XW_HASH_RIPEMD160
+ + XW_HASH_HAS160
+ + XW_HASH_SHA256
+
Run + +
+
Output + +
+
+
+ + +

Wif

+
+ + + + + + + + + + + + + + + + + + +
InputaCert
aOption + + 0x0001 : HDD Serial(only windows)
+ + 0x0002 : Mac Address
+ + 0x0004 : IP Address
+ + 0x0100 : All User Info
+
Run + +
+
Output + + +
+
+
+ +

getKTBScanInfo

+
+ + + + + + + + + + + + + + + + + + +
InputaServerIP
aServerPort
Run + +
+
Output + +
+
+
+ +

getCertPath

+
+ + + + + + + + + + + + + +
Run + +
Output + +
Signed + +
+
+
+ +

certselectwide

+ + + + +
+ [certselectwide] +
+
+ +

SignFileInfo

+ + + + +
+ [SignFileInfo] +
+
+ +

FCMS

+ + + + +
+ [FCMS] +
+
+ +
+ +
+
+
+ + diff --git a/src/main/webapp/AnySign4PC/test/AnySign4PCTest_euckr.jsp b/src/main/webapp/AnySign4PC/test/AnySign4PCTest_euckr.jsp new file mode 100644 index 00000000..a22b9a90 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/AnySign4PCTest_euckr.jsp @@ -0,0 +1,2993 @@ + +<%@ page contentType="text/html; charset=euc-kr" pageEncoding="euc-kr" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.security.*" %> +<%@ page import="java.util.Random" %> +<% request.setCharacterEncoding("euc-kr"); %> +<% response.setContentType("text/html; charset=euc-kr"); %> +<% + String charset = "euc-kr"; + String sign_result_page = "./sign_result_euckr.jsp"; + String sign_result1_page = "./sign_result1_euckr.jsp"; + String sign_result2_page = "./sign_result2_euckr.jsp"; + String sign_result3_page = "./sign_result3_euckr.jsp"; + + String link_charset = "utf-8"; + String link_page = "./AnySign4PCTest.jsp"; +%> + + +AnySign4PC/AnySignLite TEST + + + + + + + + + + + + + + + + + + +<%@ include file="../transkey/includeKeyboardSecurity.jsp" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+
+
+ + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + +

Charset + : <%=charset%>
+ [AnySign4PC/Lite <%=link_charset%>] +
Language + ko-KR + en-US +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

AnySign4PC

AnySign4PC ġ Ȯ ʱȭ + Version : + +
ŰеTranskey
v4.5.1 (2013.01.11)
+ +
XecureKeyPad
v1.0.0.2 (2016.10.19)
+ +
IncaKeyPad
2016.10.19
+ +
Openkeyboard
v1.0 (2013.07.21)
+ +
Ű TouchenKey
v3.1.0.11 (2013.02.26)
+ Module Load (ActiveX/Plugin): [ġ] + +
nProtect KeyCrypt HTML5 + [ġ] + +
Ű AhnLab Safe Transaction
v1.3.4.393(2015.12.30)
+ + [ġ] + +
TouchEn nxKey
v1.0.0.8 (2015.07.24)
+ [ġ] + +
Kings Online Security
v1.0.0.7 (2016.04.07)
+ [ġ] + +
EzKeyTec Ű庸
v2.2(2016.4.29.2)
+ [ġ] + +
Ű + ŰеnProtect Online Security V1.0
v1.0 (2015.12.23)
+ [ġ] + +
ūXecureHSM v2.0.0.3 (driver: v1.1.0.1) + xhsm_install.exe + [ٿε] +
+
+ + + + + + + + + + + + + + + + + + +

AnySignLite

AnySignLite + +
OpenCert + +
ŰеXecureKeyPad Lite
v1.0.0.2 (2016.09.28)
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +

XecureFreeSign

XecureFreeSign + +
+ server + server-digest + client +
ŰеXecureKeyPad E2E
v1.0.1.0 (2017.01.17)
+ +
OpenAPI + +
+
+
+ +

XecureLink

+ + + + + + + + + + + + + +
XecureLink + +
AnySign.XecureLink KB + +
AnySign.XecureLink LGUPlus + +
+
+ +

XecureSubmit

+ + + + + +
AnySign.XecureSubmit +
+
+
+ +
+
+
+ +

XecureNavigate

+ + + + + + + + + + + + + +
XecureNavigate + +
XecureNavigate KB + +
XecureNavigate LGUPlus + +
+
+ +

BlockEnc

+ + + + + +
BlockEncEx + +
+
+ + +

SignDataCMS

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aPlain
aOption + + 0x00000000 : ⺻
+ + 0x00000001 : Ȯâ ش.
+ + 0x00000002 : α ش.
+ + 0x00000100 : Base64
+ + 0x00000200 : ð ߰ (SignedAttributes)
+ + 0x00001000 : и (No Content)
+ + 0x00800000 : SignKorea ༭ (PKCS1)
+ + 0x01800000 : SignKorea ༭ (PKCS1) + ° ߰(subjectRDN|certSerial|)
+ + 0x02010000 : SignKorea Ǯ (NO CMS + SignKorea)
+ + 0x00200000 : Ʈ ij
+ + 0x00100000 : ġ ij
+
aDescription
aLimitedTrial
Run + +
+ +
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
Output + + SignDataCMS: + + + + SignDataAdd: + +
Reset + +
+
+
+ +

SignDataCMSWithSerial

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aSerial
aLocation
aPlain
aOption + + 0 : ⺻
+ + 1 : Ȯâ ش.
+
aDescription
aLimitedTrial
Run + +
+ +
+
+ +
+ +
Output + +
Send + + +
+
+
+ +

SignDataCMSWithHTMLEx

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aForm
aPlain
aCert
aOption + + 0 : ⺻
+ + 1 : Ȯâ ش.
+ + 4 : VID
+ + 16 : IDN Է¹ ʴ´ "" IDNü (VIDԷâ )
+
aDescription
aLimitedTrial
Run + +
+ +
Output + +
+ +
Send + + +
+
+
+ +

SignDataCMSWithHTMLExAndSerial

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aSerial
aLocation
aForm
aPlain
aCert
aOption + + 0 : ⺻
+ + 1 : Ȯâ ش.
+ + 4 : VID
+ + 16 : IDN Է¹ ʴ´ "" IDNü (VIDԷâ )
+
aDescription
aLimitedTrial
Run + +
+ +
+
+ +
+ +
Output + +
+ +
Send + + +
+
+
+ + +

SignDataWithVID

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aPlain
aCert
aOption + ( ɼ)
+ + 0 : ⺻
+ + 1 : Ȯâ ش.
+ + 8 : WEB(aIdn) VID Է¹޴´ (VIDԷâ )
+ + 16 : IDN Է¹ ʴ´ "" IDNü (VIDԷâ )
+
aIdn
aDescription
aLimitedTrial
Run + +
+ +
+ +
+ +
+ +
+ +
Output + +
VID Output + +
Send + + +
+
+ + +

SignDataWithVID_Serial

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aSerial
aLocation
aPlain
aCert
aOption + ( ɼ)
+ + 0 : ⺻
+ + 1 : Ȯâ ش.
+ + 8 : WEB(aIdn) VID Է¹޴´ (VIDԷâ )
+ + 16 : IDN Է¹ ʴ´ "" ü (VIDԷâ )
+
aIdn
aDescription
aLimitedTrial
Run + + +
+
+ +
+ +
Output + +
Vid Output + +
Send +
+
+ + +

MultiSignEx

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aPlain
aTotal
aDelimiter
aCertSerial
aCertLocation
aCert
Run + +
+ +
+ +
Output + +
+ +
Send + +
+
+
+ + +

SignFile

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
SignFilePath
OutFilePath
aOption + + 0x00000000 : ⺻
+ + 0x00000001 : Ȯâ ش.
+
aDescription
aLimitedTrial
Run + +
+ +
+
+
+
+ + +

MultiFileSign

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aSignFiles
aTotal
aDelimiter
aCertSerial
aCertLocation
Run + +
+
+
+
+ + +

EnvelopeData

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aPlain
aOption + + 1 : .
+ + 2 : йȣ .
+ + 4 : (1 Բ ).
+
aPassword
aPEM + (PEM)
+ +
aCertSerial
aCertLocation
aDescription
Run + +
+
+ +
+ +
Output + +
+
+
+ + +

DeEnvelopeData

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aEnvelopedData
aOption + + 1 : .
+ + 2 : йȣ .
+
aPassword
aDescription
Run + + +
Output + +
+
+
+ + +

ShowCertManager

+ + + + + +
Run + +
+ +
+
+ + +

CMP

+ + + + + + + + + + + + + + + +
Option + ShowRenewCertSaveLoc +
Run + ȣ:
+ ΰڵ:
+ ̸:
+ ֹεϹȣ:
+ +
+ + + + + + + + + + + + + + + + +
+
+ : +
+ Ű ˰: +
+ Ű: +
+ 뵵: +

+
+ + + +
+ + + +
+ + + +
+
Output + +
+
+ + +

RevokeCertificate

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaType
aJobCode
aReason
aLimitedTrial
Run + +
+ +
Output + +
+
+
+ +

FileHash

+
+ + + + + + + + + + + + + + + + + + +
InputaFilePath
Algorithm + + XW_HASH_MD2
+ + XW_HASH_MD5
+ + XW_HASH_SHA1
+ + XW_HASH_RIPEMD160
+ + XW_HASH_HAS160
+ + XW_HASH_SHA256
+
Run + +
+
Output + +
+
+
+ + +

Wif

+
+ + + + + + + + + + + + + + + + + + +
InputaCert
aOption + + 0x0001 : HDD Serial(only windows)
+ + 0x0002 : Mac Address
+ + 0x0004 : IP Address
+ + 0x0100 : All User Info
+
Run + +
+
Output + + +
+
+
+ +

getKTBScanInfo

+
+ + + + + + + + + + + + + + + + + + +
InputaServerIP
aServerPort
Run + +
+
Output + +
+
+
+ +

getCertPath

+
+ + + + + + + + + + + + + +
Run + +
Output + +
Signed + +
+
+
+ +

certselectwide

+ + + + +
+ [certselectwide] +
+
+ +

SignFileInfo

+ + + + +
+ [SignFileInfo] +
+
+ +

FCMS

+ + + + +
+ [FCMS] +
+
+ +
+ +
+
+
+ + diff --git a/src/main/webapp/AnySign4PC/test/KB_qa.jsp b/src/main/webapp/AnySign4PC/test/KB_qa.jsp new file mode 100644 index 00000000..0158c53d --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/KB_qa.jsp @@ -0,0 +1,1524 @@ + + + +KB국민카드 + +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<%@ page language="java" extends="xecure.servlet.jsp.XecureHttpJspPage" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<%@ page import="java.util.*" %> +<%@ page import="java.security.*" %> +<%@ page import="java.util.Random" %> + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + KB국민카드 / 공지 + +
+ + + +
+ +
+ 이 메일은 KB국민카드에서 발송한 발신전용 메일입니다. +
+ 국번없이 어디서나 1588-1688(유료) + + + ARS 메뉴안내 + + + + 고객센터 + + + + KB국민카드 홈페이지 + +
+ 이메일 하단 내용 +
+ 서울특별시 종로구 새문안로3길 30 (주)KB국민카드 대표이사 김덕수 +
    +
  • 사업자등록번호 : 101-86-61717
  • +
  • 통신판매업신고 : 제2011-서울종로-0277호
  • +
  • 관광사업자등록번호 : 26004-2011-8호
  • +
+ copyrightⓒ2011 KB Kookmin Card Co.Ltd.All Rights Reserved +
    +
  • 국가고객만족도 신용카드부문 2년연속 1위(2012-2013)한국생산성본부 선정
  • +
  • 한국산업의 고객만족도 체크카드부문 3년연속 1위(2011-2013)KMAC선정
  • +
  • 한국서비스품질지수 신용카드부문 3년 연속 1위(2011-2013)한국표준협회-중앙일보 공동 선정
  • +
+ 국민을 먼저 생각합니다 KB금융그룹 +
+
+ + + + +
+ + + + +KB국민카드 e-메일명세서 + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + +
+ + +
+ +
+ + + + + +
+ + +

+ + 결제요약정보 + +

+
+ +

결제요약정보

+ + + + + + + + + + + + +
+ 결제하실 총 금액 + 결제하실 총 금액 + 3,199,702 + + 원 + +

+ 상세보기 열림 +

+
+ 카드 최소결제금액  + 433,601원  + 단, 장기카드대출(카드론) 제외. 일부결제금액이월약정(리볼빙) 등록 중 +
+ + + +
+
+ + + + + + + + + +
청구내역,미결제금액,당월결제금액
+
+ + + + + + + + + + + + +
카드 결제하실 총 금액 3,199,702
연회비/SMS 0
미결제 연체원금 0
미결제 연체이자 0
일시불 900
할부 87,352
단기카드대출(현금서비스) 0
해외이용 0
일부결제금액이월약정(리볼빙) 3,115,250
차감된 금액 3,800
+
+
+
+ + + + + + + + + + + + +
장기카드대출(카드론) 결제하실 총 금액 -
미결제금액 0
이번달 결제하실 금액 0
수수료 0
 
만기도래 금액 0
 
 
 
 
+
+
+ +
+
    + +
  • 카드 결제하실 최소금액 이상만 결제하셔도 정상적인 카드 사용이 가능합니다. 다만, 장기카드대출(카드론)의 결제일 및 결제계좌가 카드와 같은 경우 "카드 결제하실 총 금액+장기카드대출(카드론) 결제하실 금액"을 입금하셔야 정상 결제됩니다.
  • + +
  • 명세서 작성기준일 현재 장기카드대출(카드론) 결제금액이 연체된 경우 안내가 제외될 수 있습니다.
  • + +
+
+ +
+
+ + + + + + + + + + + + + +
+ 이달의 할인금액 + 이달의 할인금액 + 13,125 + 원 + + +

+ 상세보기 열림 +

+
2015년 누적할인혜택 (2015.01~2015.05)107,302원
+
+ + + + + + + + + +
이달의 할인금액
+
+ + + + + + + + + + +
스타샵 할인 0
주유할인 0
쇼핑할인 0
영화할인 0
엔터테인먼트할인 0
학원/서점/도서할인 0
의료비할인 0
통신요금할인 9,000
+
+
+
+ + + + + + + + + + +
외식할인 0
여행/레저할인 0
교통할인 0
자동이체할인 0
유류세 환급 0
기타할인 0
무이자혜택금액 4,125
   
+
+
+
+ + + + + + + + + +
+ + + + + +
카드이용한도 + 카드이용한도 500만원
+ + + + + + + + + + + + + + + + +
일시불/할부카드이용한도 범위내
해외이용 0
단기카드대출(현금서비스)월간 170만원
+
+

+ 이용안내 열림 +

+
+
+
    + +
  • 카드이용한도는 고객님의 신용도와 이용실적에 따라 수시로 변동될 수 있습니다. (현재 시점의 카드 잔여한도 조회☎1588-1688 ①→②번)
  • +
  • 해외이용한도는 국내이용한도에 실제환율(전신환매도율)이 적용된 금액으로 부여됩니다
  • +
+
+
+ + + + + +
장기카드대출(카드론) 가능금액장기카드대출(카드론) 가능금액장기카드대출(카드론)신청
+ + + + + + + + + + + + + + + + + +
이지론 100만원
작성기준일2015년 05월 22일
+
+

+ 이용안내 열림 +

+
+
+
    + +
  • 장기카드대출(카드론) 이용에 동의하여 대상자 선정시 취급이 가능하며, 인터넷, 영업점, 고객센터(1588-1688), ARS(1588-2788)를 통해 이용동의를 철회할 수 있습니다.
  • + +
  • 장기카드대출(카드론) 가능금액은 신용도 및 이용실적에 따라 변동 가능하며, 카드금융상품을 이용할 경우 신용등급에 영향이 있을 수 있습니다. (이지론 조회 및 신청: KB국민카드 홈페이지, ☎1588-2788, 모바일홈App , 이용가능시간 : 365일, 08:00~23:00)
  • +
+
+
+ + + + + + + + +
작성기준작성기준
+ + + + + + + + + + + + + + + + + + + + + + +
작성기준일 2015년 05월 22일이용기간[일시불/할부] 2015.04.22 ~ 2015.05.21
결제일 2015년 06월 05일 [단기카드대출(현금서비스)] 2015.04.07 ~ 2015.05.06
실제출금일2015년 06월 05일결제계좌 국민은행 037-21-1***-*28
+
+
    + + +
  • 카드이용대금 및 장기카드대출(카드론) 결제금액을 은행영업시간(16시) 이후 입금하실 경우 결제일 당일 결제가 되지 않아 연체료가 부과될 수 있습니다.
  • + + + + + +
  • 명세서 작성기준일이 휴무일인 경우에는 전 영업일을 작성기준일로 하며, 이 경우 이용기간은 명세서 작성일까지로 적용됩니다.
  • +
  • 명세서 작성기준일 이후 발생한 매출취소 및 선결제금액은 명세서에 반영되지 않습니다.
  • +
+
+ + + + + + + + + + +
공지사항공지사항
+
+
+
보이스피싱 피해사례 및 예방 안내
+
+ 최근 금융회사 및 공공기관을 사칭하여 신용카드 비밀번호 등 개인정보를 알아낸 뒤 ARS, 인터넷 등을 통해 장기카드대출(카드론)/ 단기카드대출(현금서비스)의 부정 취급 후 불법자금의 송금(이체)을 유도하는 범죄가 늘고 있습니다. 고객님의 정보를 철저히 관리하시고, 유출 즉시 거래 금융기관, 경찰서, 금융감독원 등에 신고(지급정지 포함)하시기 바랍니다. +
+
카드이용정지 안내 서비스
+
+ - 카드대금 및 대출금이 연체(타 금융기관 포함)되어 장ㆍ단기연체정보가 발생하는 경우 신용정보회사를 통해 금융회사 간에 해당 연체정보가 공유되어 신용등급 하락 및 신용카드 사용정지, 카드금융상품 이용 등 금융거래가 제한될 수 있습니다. +
+
+ - ‘세금체납’ 등 기타 사유로 회원님의 카드이용이 정지될 수 있으며, 카드이용이 정지 및 해제되는 경우 개인회원 표준약관 제7조 제①항 및 제⑥항에 따라 SMS 및 E-MAIL, 서면 등을 통해 안내하여 드립니다. +
+
+ - 카드이용정지 및 해제안내를 원치 않는 경우에는 인터넷 홈페이지 (www.kbcard.com > 개인 > 서비스 > 고객안심서비스 > 카드이용정지안내신청/해지), ARS(1588-1688 ①→ ⑥→ ③) 또는 가까운 KB국민카드 영업점을 통해 신청하여 주시기바랍니다. +
+
+ - KB국민카드 또는 장기카드대출(카드론) 결제대금 미납금액이 5만원 미만 소액인 경우도 6개월 이상 미납시는 부득이 카드 이용이 제한될 수 있으므로 유의하여 주시기 바랍니다. +
+
이용한도 반영시점
+
+ - KB국민은행, 우리(Woori), 스탠다드차타드은행(구 SC제일은행) 이용 고객님은 결제일 당일 야간, 이를 제외한 타행계좌는 결제일 + 1영업일에 한도 반영됩니다. +
+
+
+
+ + +
+ 다음페이지 +
+ +
+ 55명이 12개월동안 이메일 명세서를 받으면 아름드리 나무 1그루를 심는 효과가 있습니다. +
+
+ + + +

+ + 이용내역 + +

+
+

카드이용내역

+
+ 바로출금결제 바로가기 + 이용내역조회 바로가기 + 교통/자판기 이용내역 바로가기 + + 단기카드대출(현금서비스)로 결제 바로가기 + +
+ + + + + +
+ 고객님의 수수료등급은 최우수3(A) 입니다. + +

+ 수수료율 상세보기 +

+
+ +
+ + + + +
적용기준일 : 2014년11월01일 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
수수료율 표
단기카드대출
(현금서비스)
연 19.95% 
할부개월수2개월이내3개월4~5개월6~8개월9~11개월12~17개월18개월이상
수수료율연 11.65% 연 15.15% 연 16.15% 연 16.65% 연 17.05%연 17.15%연 17.25%
100원당
할부수수료
1.41원 2.47원3.30~3.97원 4.79~6.18원7.04~8.46원9.22~12.80원13.59원
일부결제금액
이월약정(리볼빙)
일시불연 18.90%단기카드대출
(현금서비스)
연 19.95%
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
연체이자율 표
구분연체이자율
일시불, 할부연 22.9~23.7%
일부결제금액이월약정(리볼빙)
/단기카드대출(현금서비스)
/장기카드대출(카드론)
연 18%미만연 22.9~23.7%
연 18%이상~23%미만연 23.9~24.7%
연23%이상연 28.5~29.3%
※ 연체이자율은 연체기간별로 차등적용
+
+
    +
  • 단기카드대출(현금서비스) 수수료 : [이용금액 × 회원등급별 수수료율) × 이용일수 / 365]
  • +
  • 단기카드대출(현금서비스)를 KB국민은행 이외 기관에서 신청 시 별도의 ATM수수료(500~800원) 추가
  • +
  • 단기카드대출(현금서비스)를 과도하게 이용하시는 경우 신용등급에 부정적 영향이 있을 수 있습니다.
  • +
  • 할부수수료 : 1회차 (할부잔액 X 할부수수료율 X 이용일수(이용일-결제일)÷365)
                     2회차 이후 (할부잔액 X 할부수수료율 ÷ 12)
  • +
  • 100원당 할부수수료는 100원을 할부 이용하신 경우, 회원님이 해당 할부 기간 동안 납부하여야 하는 할부수수료 총액을 1회차는 일할(29일-평균신용공여기간), 2회차 이후는 월할로 산출한 예시 금액입니다.
  • +
  • 할부기간은 18개월이내에서 가맹점별로 차등 적용될 수 있으며, 18개월을 초과하는 할부이용은 특정가맹점에서만 이용가능합니다.
  • +
  • 할부이용 후 90일을 초과하여 취소하는 경우, 할부 수수료가 환급되지 않습니다.
  • +
  • 장기카드대출(카드론) : 이지론 이자율은 고객님의 신용도(이용실적 및 연체경력)에 따라 연7.50 ~ 25.80%(적용일 : 2014.10.08) 가 적용되며, 취급수수료와 중도상환수수료가 없어 쉽고 편리하게, 부담 없이 신청하시고 자유롭게 상환하실 수 있습니다.
  • +
  • 대환론 취급금리 : 초기 선납비율에 따라 연 12 ~ 22%가 적용됩니다. (적용기준일: 2014.10.08)
  • +
+
+
+ + + + + + + + + +
카드이용내역카드이용내역 + 인쇄 + 인쇄미리보기 + + 엑셀파일저장 +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
카드이용내역표
이용
일자
이용
하신분
이용자
번호
구분이용하신 가맹점이용금액할부개월이번달 결제금액결제후 잔액적립
예정
포인
트리
회차원금수수료
(이자)
회차원금
15.04.27테스트KK007일시홈플러스 서울남현점 온라인마트P-3,800  -3,800   -2
15.05.15테스트KK007일시Wise Info 플러스 (05 월분 ) 900  900    
15.04.07테스트KK007할부홈플러스 서울남현점 온라인마트P128,7503240,7711,029140,771 
     무이자혜택금액     -1,029   
15.04.08테스트KK007할부GS 샵 - 덴마크유산균 197,00010218,7152,3938149,720 
     무이자혜택금액     -2,393   
15.04.09테스트KK007할부GS 샵 - (GS_150 88,0003227,866703127,866 
     무이자혜택금액     -703   
15.04.22테스트KK007RLS네이버페이-네이버(주) 61,750  61,750    
15.04.24테스트KK007RLS( 주 ) 롯데닷컴 3,000  3,000    
15.04.27테스트KK007RLS이지스(정기과금)-쿠쿠전자주식회사 21,900  21,900    
15.04.27테스트KK007RLS홈플러스 서울남현점 온라인마트P56,460  56,460   44
15.04.28테스트KK007RLS네이버페이-네이버(주) 18,000  18,000    
15.04.29테스트KK007RLS티머니서울택시 6,500  6,500    
15.05.02테스트KK007RLS티머니서울택시 5,100  5,100    
15.05.03테스트KK007RLSGS 샵 - 뉴발란스_플립 12,400  12,400    
15.05.04테스트KK007RLS티머니서울택시 3,000  3,000    
15.05.04테스트KK007RLS티머니서울택시 4,400  4,400    
15.05.04테스트KK007RLS티머니서울택시 5,900  5,900    
15.05.05테스트KK007RLS네이버페이1-네이버주식회사 20,160  20,160    
15.05.11테스트KK007RLSOLLEH 모바일자동납부 (4992) 128,510  128,510    
15.05.12테스트KK007RLSLGUPLUS 통신요금자동이체 62,610  53,610    
    LG U+ 통신요금 할인  -9,000       
15.05.15테스트KK007RLS한국세계자연기-한국세계자연기금 20,000  20,000    
15.05.21테스트KK007RLS버스00001건 1,050  1,050    
소 계 21 건    506,192  218,35742
합 계 21 건    506,192  218,35742
일부결제금액이월약정(리볼빙)이월금액 합계   2,651,70541,805   
신용카드 결제하실 총금액    3,157,89741,805   
+
+
+

+ 이용안내 열림 +

+
+
+
    +
  • 상기 이용내역은 2015년 05월 22일까지 접수된 매출전표 기준이며 이후 접수분은 다음달에 청구됩니다. 이 경우 할부매출의 수수료는 차기 결제일까지 일수만큼 계산되어 청구됩니다.
  • +
  • RLS, RCA 매출은 이번달 결제일별 이용기간동안 사용한 내역만 표시됩니다.
  • +
  • 이용자번호 KK/BB(국내), KM/BM(마스터), KV/BV(비자), KJ/BJ(JCB), KA(아멕스), KC(은련) + 카드번호 3자리
  • +
  • 구분 : 일시-일시불, 할부-할부, 연회-연회비, 현금- 단기카드대출(현금서비스), RLS- 일부결제금액이월약정(리볼빙) 일시불, RCA- 일부결제금액이월약정(리볼빙) 단기카드대출(현금서비스)
  • +
  • 정상금액과 취소금액이 일치할 경우에는 해당내역이 표시되지 않을 수 있으며, 명세서 작성기준일 이후 취소할 경우에는 명세서 표기금액과 실제 결제할 금액이 상이할 수 있습니다.
  • +
  • 정상금액과 취소금액이 불일치 하는 경우에는 자동상계처리 되지 않을 수 있으며, 이 경우 취소전표 매입일 기준 해당 결제일에 차감 청구됩니다.
  • +
  • 수협, 신협, 상호저축은행, 지방은행, 한국시티, HSBC 결제계좌를 이용하시는 경우에는 미납금액 발생 시 2~3영업일 간격으로 출금됩니다.
  • +
  • 이용가맹점에 표시되는 “P”는 ‘포인트리 스타샵(적립) 가맹점’으로 포인트리 추가적립 및 포인트리를 현금처럼 이용 가능한 가맹점을 말합니다.
  • +
  • 교통카드 이용금액은 해당 이용기간의 합산금액을 표시하며, 상세내역은 KB국민카드 홈페이지에서 조회 가능합니다.
  • +
  • 해외이용대금은 국제카드사가 정한 환율에 의해 미달러화로 환산 후, 국제카드사가 부과하는 해외서비스수수료(비자,마스타:1%, 아멕스:1.4%)가 포함되며, 회원님께 원화로 청구되는 금액은 당사 접수일의 KB국민은행 최초 고시 전신환매도율이 적용되며, 청구금액에는 해외이용수수료(0.25%)가 포함됩니다.
  • +
  • 포인트리는 청구일 익영업일에 적립되며, 회원님의 명세서 작성기준일과 매출전표 매입일이 동일한 경우에는 적립예정 포인트리가 표기되지 않을 수 있습니다.
  • +
  • 고객의 매출 취소등의 사유로 포인트리가 차감되어 마이너스 포인트리가 발생할 경우에는 향후 적립되는 포인트리와 상계하며, 카드해지, 3개월간 포인트리 미적립등의 사유발생 시 마이너스 포인트리 1점당 1원으로 계산하여 고객에게 신용카드 대금으로 청구됩니다.
  • +
  • 카드 이용내역 중 이용 가맹점 정보(실제 판매자 상호, 구매 상품명 등)는 해당 가맹점에서 제공한 정보로, 고객님께서 실제 구매하신 정보와 상이할 수 있습니다.
  • +
  • 통신요금 자동납부 가맹점명 우측 괄호 안에 전화번호 뒤 4자리를 표시하고 있습니다.
  • + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
일부결제금액이월약정(리볼빙) 상세내역일부결제금액이월약정(리볼빙) 상세내역
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
일부결제금액이월약정(리볼빙) 상세내역
구분일시불단기카드대출(현금서비스)
이월분금액2,651,7050
수수료41,8050
신규
+ 이용분
금액421,7400
수수료00
합계금액①3,073,4450
수수료②41,8050
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
일부결제금액이월약정(리볼빙) 상세내역
산출방법약정결제최소결제
결제비율③ 100.00%10.00%
금액④=①x③
(단, 최소 5만원 청구)
3,073,445307,344
수수료⑤=②41,80541,805
이번달 결제금액
⑥=④+⑤
3,115,250349,149
결제 후 잔액
⑦=①-④
02,766,101
+
+
+

이용안내 열림

+
+
+
    +
  • 이월된 금액은 일부결제금액이월약정(리볼빙) 수수료가 부과되며, 즉시 결제를 원하실 경우는 고객센터로 문의하시기 바랍니다.
  • +
+
+ + + +
+ + + + + + + + +
+ 가계부작성 +
공인인증서 소지고객만 가능합니다.
+ +
+ + + + + + +
+ 이전페이지 + + 다음페이지 +
+ +
+ + + +

+ + 서비스혜택 + +

+
+

서비스혜택

+ + + + + + +
포인트 및 마일리지 적립안내포인트 및 마일리지 적립안내
+ + + + + + + + + + + + + + + + + +
포인트 및 마일리지 적립안내
 포인트리 506
+ +
+

+ 이용안내 열림 +

+
+
+
    +
  • 적립포인트리가 1점 이상 시 스타샵 적립가맹점 및 포인트리 사은품몰(www.kbpointreemall.com)에서 사용 가능하시며, KB국민은행 영업점에서 송금수수료 및 예ㆍ적금, 대출금, 이자납부 등 금융거래에 이용하실 수 있습니다. 또한, 3만점 이상 시 신용카드 결제대금에서 차감이 가능합니다.
  • +
  • 포인트리는 매출전표 최초 청구일(결제일) 익영업일에 적립됩니다.
  • +
  • 항공 마일리지는 다른 제휴카드 마일리지와 비행기 탑승 마일리지가 합산되어 표시됩니다.
  • + +
+
+ +
+ 사은품신청 + 포인트리상세조회 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ 이전페이지 + + 다음페이지 +
+ + +
+ + + +

+ + 이벤트&안내 + +

+
+

이벤트안내

+ + + + + + + + + + + + + + + + +
+ 분야별 이용현황 + 분야별 이용현황 +
+ + + + + + + + +
+
+ + + + + + + + + +
+
+
+ + + + + + + + + + + + + + +
주유/자동차/보험 0%
의료/스포츠/뷰티 8%
항공/여행 0%
쇼핑/전자상거래 39%
생활요금(교통/통신/관리비) 10%
교육 0%
외식/공연/영화 6%
기타 38%
+
+
+
+
+
    +
  • 분야별 이용현황은 신용카드 및 체크카드 이용금액을 합산하여 작성되었으며, 고객님의 명세서 작성기준일 '전월1일~말일까지'
    이용현황입니다.
  • +
  • 이용현황 비율이 5% 미만인 경우 그래프 상 분야명이 표시되지 않습니다.
  • +
  • 기타 자세한 사항은 KB국민카드 홈페이지 카드이용내역조회에서 확인 가능합니다. + + 바로가기 + +
  • +
+
+ + + + + + + + + + + +
안내말씀안내말씀
+
+ + + + +
+
+자동화기기 카드금융거래 이용 시 유의사항 안내
+1. 자동화기기 이용 시 불법 복제된 MS카드(IC칩이 없는 신용/체크카드)에 의한 사고를 예방하기 위하여 2015년 3월부터 모든 자동화기기에서 MS카드를 이용한 장기카드대출(카드론) 또는 단기카드대출(현금서비스) 거래가 제한됨을 안내드립니다.
+2. 현재 KB국민카드 중 MS카드를 소지하고 계신 고객님께서는 반드시 IC카드로 교체하여 주시기 바랍니다.
+ +
+
+새우편번호 시행 관련 안내 말씀
+국가기초구역 체계로의 새우편번호 시행('15.8.1)으로 기존 우편번호가 6자리에서 5자리로 사용이 의무화 됨에 따라 고객님의 우편번호를 새우편번호로 일괄 전환할 예정입니다.
+아울러 새우편번호는 도로명 주소 사용을 기반으로 하고 있어 KB국민카드 고객님을 위한 이용대금명세서 등 우편물이 올바르게 배송될 수 있도록 자택 또는 직장 주소를 도로명 주소로 전환하여 주시기 바랍니다.
+※ 자세한 내용은 KB국민카드 홈페이지(www.kbcard.com) 및 고객센터(1588-1688)로 문의하시기 바랍니다.
+
+ +
+
+장기카드대출(카드론) 결제대금 자동출금 변경안내
+장기카드대출(카드론) 결제계좌가 농협, 기업, SC, 외환, 신한, 하나, 우리은행인 경우 약정납입일에 납입하실 회차별 금액보다 출금가능잔액이 적을 경우 해당 결제대금 전체가 출금되지 않았으나 시행일(2015. 3.16)부터 출금가능잔액 범위내에서 출금되오니 이용에 참고하여 주시기 바랍니다.
+
+※ 자세한 내용은 홈페이지(www.kbcard.com) 및 고객센터(1588-1688)로 문의하여 주시기 바랍니다.
+ +
+
+KB국민 굿세이브 서비스 변경안내 (시행(예정)일: 2015년 5월21일)
+- 서비스 명칭 변경: KB국민 굿세이브 서비스 → 포인트 연계 할부서비스(KB국민 굿세이브)
+- 세이브 이용가능금액: 최대70만원 → 최대 50만원 내 물품가격의 30%까지 제한
+- 세이브 이용 횟수 제한: 회원별 1회 (중복 약정 불가)
+※ 자세한 내용은 KB국민카드 홈페이지(www.kbcard.com) 새소식 게시판 또는 KB국민카드 세이브 전용 콜센터(☎1577-9900)로 문의하여 주시기 바라며, 시행일은 대내 외 사정에 의해 변경될 수 있습니다.
+
+ + + + + +
+ 도로명 주소 일괄 전환에 따른 안내
+ 도로명주소법(법률 제10987호)에 따라 기 사용중인 고객님의 지번주소를 도로명주소로 전환하였습니다. 아직 전환되지 않은 고객님께서는 홈페이지, 고객센터, 영업점을 통해 개별 전환하여 주시기 바랍니다. +
  +
+
+ + + +
+
    +
  • 명세서는 3회이상 반송 등록시 발송이 되지 않습니다. + + + + +
  • 고객센터 : ☎ 1588-1688 (전국단일망) +
+
+ + + + + + +
+ 이전페이지 +
+ +
+ + +
+ 맨위로 이동 +
+
  + +
+ 서울 종로구 새문안로 3길 30 (주)KB국민카드 사업자등록번호 101-86-61717  COPYRIGHT(C)2011 KB KOOKMIN CARD CO.,LTD. ALL RIGHTS RESERVED. +
+
+ +
+ + + + diff --git a/src/main/webapp/AnySign4PC/test/LGUPlus_qa.jsp b/src/main/webapp/AnySign4PC/test/LGUPlus_qa.jsp new file mode 100644 index 00000000..3c6a6fa5 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/LGUPlus_qa.jsp @@ -0,0 +1,6452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +LG 유플러스 이메일 청구서입니다. +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<%@ page language="java" extends="xecure.servlet.jsp.XecureHttpJspPage" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<%@ page import="java.util.*" %> +<%@ page import="java.security.*" %> +<%@ page import="java.util.Random" %> + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/AnySign4PC/test/browserCertificate_user_guide.pdf b/src/main/webapp/AnySign4PC/test/browserCertificate_user_guide.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b4ee11c5959eab619067535f5a095eaa0a114feb GIT binary patch literal 252087 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�deWvY(D?2aamHCI3K4Lx%6`KCX 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 Y6^@`Tx3t%U-6U+URKdZK<4vl60r+3R +<%@ page buffer="16kb" %> +<% + request.setCharacterEncoding("utf-8"); + response.setContentType("text/html; charset=utf-8"); + + response.setHeader("Pragma", "no-cache"); + response.setHeader("Cache-Control", "no-cache"); + response.setDateHeader("Expires", 0); + + String sign_result_page = "./sign_result.jsp"; +%> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<%@ page import="java.security.*" %> +<%@ page import="java.util.Random" %> + + + +Page Title - mini + + + + + + + + + + + + + + + + + + + + + + + + + +

설정

AnySign4PC 초기화 + +
AnySignLite 사용 유무 + +
Run + +
+

+
+
+
+전자서명 결과
+
+ + + diff --git a/src/main/webapp/AnySign4PC/test/certificate_pop.jsp b/src/main/webapp/AnySign4PC/test/certificate_pop.jsp new file mode 100644 index 00000000..b382cdcc --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/certificate_pop.jsp @@ -0,0 +1,61 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<% + response.setHeader("Pragma", "no-cache"); + response.setHeader("Cache-Control", "no-cache"); + response.setDateHeader("Expires", 0); +%> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> + + + + + + Test Page + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/AnySign4PC/test/certificate_wide.jsp b/src/main/webapp/AnySign4PC/test/certificate_wide.jsp new file mode 100644 index 00000000..7b4aa089 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/certificate_wide.jsp @@ -0,0 +1,153 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<% + response.setHeader("Pragma", "no-cache"); + response.setHeader("Cache-Control", "no-cache"); + response.setDateHeader("Expires", 0); +%> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<%@ page import="java.security.*" %> +<%@ page import="java.util.Random" %> + + + + + + +Page Title - 바닥페이지 + +<%@ include file="../transkey/includeKeyboardSecurity.jsp" %> + + + + + + + + + + + + + + + +
+
+ +
+ + +

+ +
+ +

+ + diff --git a/src/main/webapp/AnySign4PC/test/certificate_wide_ahnlab.jsp b/src/main/webapp/AnySign4PC/test/certificate_wide_ahnlab.jsp new file mode 100644 index 00000000..379440c6 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/certificate_wide_ahnlab.jsp @@ -0,0 +1,152 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<% + response.setHeader("Pragma", "no-cache"); + response.setHeader("Cache-Control", "no-cache"); + response.setDateHeader("Expires", 0); +%> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<%@ page import="java.security.*" %> +<%@ page import="java.util.Random" %> + + + + + + +Page Title - 바닥페이지 + + + + + + + + + + + +
+
+ +
+ + +

+ +
+ +

+ + diff --git a/src/main/webapp/AnySign4PC/test/certificate_wide_inca.jsp b/src/main/webapp/AnySign4PC/test/certificate_wide_inca.jsp new file mode 100644 index 00000000..0bc4c672 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/certificate_wide_inca.jsp @@ -0,0 +1,160 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<% + response.setHeader("Pragma", "no-cache"); + response.setHeader("Cache-Control", "no-cache"); + response.setDateHeader("Expires", 0); +%> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<%@ page import="java.security.*" %> +<%@ page import="java.util.Random" %> + + + + + + +Page Title - 바닥페이지 + + + + + + + + +
+
+ +
+ + +

+ +
+ +

+ + diff --git a/src/main/webapp/AnySign4PC/test/certificate_wide_inca10.jsp b/src/main/webapp/AnySign4PC/test/certificate_wide_inca10.jsp new file mode 100644 index 00000000..4644d14d --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/certificate_wide_inca10.jsp @@ -0,0 +1,148 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<% + response.setHeader("Pragma", "no-cache"); + response.setHeader("Cache-Control", "no-cache"); + response.setDateHeader("Expires", 0); +%> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<%@ page import="java.security.*" %> +<%@ page import="java.util.Random" %> + + + + + + +Page Title - 바닥페이지 + + + + + + + + + + + +
+
+ +
+ + +

+ +
+ +

+ + diff --git a/src/main/webapp/AnySign4PC/test/certificate_wide_kos.jsp b/src/main/webapp/AnySign4PC/test/certificate_wide_kos.jsp new file mode 100644 index 00000000..2222625e --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/certificate_wide_kos.jsp @@ -0,0 +1,144 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<% + response.setHeader("Pragma", "no-cache"); + response.setHeader("Cache-Control", "no-cache"); + response.setDateHeader("Expires", 0); +%> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<%@ page import="java.security.*" %> +<%@ page import="java.util.Random" %> + + + + + + +Page Title - 바닥페이지 + + + + + + + +
+
+ +
+ + +

+ +
+ +

+ + diff --git a/src/main/webapp/AnySign4PC/test/certificate_wide_nxkey.jsp b/src/main/webapp/AnySign4PC/test/certificate_wide_nxkey.jsp new file mode 100644 index 00000000..407a330a --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/certificate_wide_nxkey.jsp @@ -0,0 +1,144 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<% + response.setHeader("Pragma", "no-cache"); + response.setHeader("Cache-Control", "no-cache"); + response.setDateHeader("Expires", 0); +%> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<%@ page import="java.security.*" %> +<%@ page import="java.util.Random" %> + + + + + + +Page Title - 바닥페이지 + + + + + + + +
+
+ +
+ + +

+ +
+ +

+ + diff --git a/src/main/webapp/AnySign4PC/test/certselectwide.jsp b/src/main/webapp/AnySign4PC/test/certselectwide.jsp new file mode 100644 index 00000000..d30e8e18 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/certselectwide.jsp @@ -0,0 +1,830 @@ +<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> +<%@ page buffer="16kb" %> +<% + request.setCharacterEncoding("utf-8"); + response.setContentType("text/html; charset=utf-8"); + + response.setHeader("Pragma", "no-cache"); + response.setHeader("Cache-Control", "no-cache"); + response.setDateHeader("Expires", 0); + + String sign_result_page = "./sign_result.jsp"; +%> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<%@ page import="java.security.*" %> +<%@ page import="java.util.Random" %> + + + +Page Title - 바닥페이지 + + + + + + + + + + + + + + + +<%@ include file="../transkey/includeKeyboardSecurity.jsp" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +

공통 설정

Language + ko-KR + en-US +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

AnySign4PC 설정

AnySign4PC 설치 확인 및 초기화 + Version : + +
가상 키패드Transkey
v4.5.1 (2013.01.11)
+ +
XecureKeyPad
v1.0.0.2 (2016.10.19)
+ +
Openkeyboard
v1.0 (2013.07.21)
+ +
키보드 보안TouchenKey
v3.1.0.11 (2013.02.26)
+ Module Load (ActiveX/Plugin): [설치페이지] + +
nProtect KeyCrypt HTML5 + [설치파일] + +
키보드 보안AhnLab Safe Transaction
v1.3.4.393(2015.12.30)
+ + [설치파일] + +
TouchEn nxKey
v1.0.0.8 (2015.07.24)
+ [설치페이지] + +
Kings Online Security
v1.0.0.7 (2016.04.07)
+ [설치파일] + +
키보드 보안 + 가상 키패드nProtect Online Security V1.0
v1.0 (2015.12.23)
+ [설치파일] + +
보안 토큰XecureHSM 1.1.0.0 + http://download.softforum.co.kr/Published/XecureHSM/xhsm_install.exe + [다운로드] +
+
+ + + + + + + + + + + + + + +

AnySignLite 설정

AnySignLite 사용 유무 + +
가상 키패드XecureKeyPad Lite
v1.0.0.2 (2016.09.28)
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +

XecureFreeSign 설정

XecureFreeSign 사용 유무 + +
서명 방식 + server + server-digest + client +
가상 키패드XecureKeyPad E2E
v1.0.1.0 (2017.01.17)
+ +
OpenAPI + +
+
+
+ +

SignDataCMS

+ + + + +
+ +
+
+ +
+ +
+ + + + + +
+
+
+ +
+ + +

+ +
+ +

+
+
+ + diff --git a/src/main/webapp/AnySign4PC/test/check_integrity.jsp b/src/main/webapp/AnySign4PC/test/check_integrity.jsp new file mode 100644 index 00000000..c0d12ea7 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/check_integrity.jsp @@ -0,0 +1,100 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<%@ page import="java.security.*" %> +<%@ page import="javax.crypto.Mac" %> +<%@ page import="javax.crypto.SecretKey" %> +<%@ page import="javax.crypto.spec.SecretKeySpec" %> + +<% + XecureConfig aXecureConfig = new XecureConfig (); + SignVerifier verifier = null; + + StringBuffer aResponse = new StringBuffer (); + + String sm = request.getParameter("SIGNED"); + String integrityValue = request.getParameter("ITGTVALUE"); + String DaemonPortNumber = request.getParameter("PORTVALUE"); + + if (sm != null && sm.substring(0, 4).equalsIgnoreCase("3082")) + { + if (sm != null && sm.length() < 3100) + { + aResponse.append ("({"); + aResponse.append ("code:\"" + "-1000" + "\","); + aResponse.append ("reason:\"" + "invalid parameter" + "\","); + aResponse.append ("base:\"\""); + aResponse.append ("})"); + out.println (aResponse.toString ()); + return; + } + /* Hex encoded Data */ + verifier = new SignVerifier (aXecureConfig , sm, 0); + } + else + { + /* Base64 encoded Data */ + verifier = new SignVerifier (aXecureConfig , sm, 1); + System.out.println ("base64:" + sm); + } + + aResponse.append ("({"); + aResponse.append ("code:\"" + verifier.getLastError () + "\","); + aResponse.append ("reason:\"" + verifier.getLastErrorMsg () + "\","); + + if (verifier.getLastError() == 0) + { + aResponse.append ("plain:\"" + verifier.getVerifiedMsg_Text () + "\","); + aResponse.append ("certificatePEM:\"" + verifier.getSignerCertificate().getCertPem ().replaceAll ("\n", "") + "\","); + aResponse.append ("subjectRDN:\"" + verifier.getSignerCertificate().getSubject () + "\","); + } + else + { + aResponse.append ("base:\"\""); + aResponse.append ("})"); + out.println (aResponse.toString ()); + return; + } + + //////////////////////////////////////////////////////////////////////////////////// + // check integrity code start. + + int VerifyResult = verifier.verifyAnySignIntegrity(integrityValue,DaemonPortNumber); + + if (VerifyResult != 0) + { + // 무결성 검증 실패 + // 필요한 경우 현재 서버의 사용자 세션을 삭제하거나 서비스를 중단시키는 것을 권고한다. + // + // 서버 사용자 세션 중단코드 작성 공간 + // ------------------------------------- + // + // + // + // ------------------------------------- + + //out.println ("alert(\"Integrity Check Fail!!\");"); + aResponse.setLength(0); + aResponse.append ("({"); + aResponse.append ("code:\"" + verifier.getLastError () + "\","); + aResponse.append ("reason:\"" + verifier.getLastErrorMsg () + "\","); + aResponse.append ("base:\"\""); + aResponse.append ("})"); + out.println (aResponse.toString ()); + return; + } + else + { + //out.println ("alert(\"Integrity Check Success!!\");"); + } + + // check integrity finish. + //////////////////////////////////////////////////////////////////////////////////// + + aResponse.append ("base:\"\""); + aResponse.append ("})"); + out.println (aResponse.toString ()); +%> + diff --git a/src/main/webapp/AnySign4PC/test/dev_server.jsp b/src/main/webapp/AnySign4PC/test/dev_server.jsp new file mode 100644 index 00000000..50b97d03 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/dev_server.jsp @@ -0,0 +1,35 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> + +<% + String envData = request.getParameter("ENVDATA"); + + XecureConfig aXecureConfig = new XecureConfig (); + + if (envData == null || envData.length() == 0) + { + out.println("invalid param"); + return; + } + + if (envData.substring(0,1).equalsIgnoreCase("3") == false) + { + out.println("invalid param"); + return; + } + + EnvelopeData ed = new EnvelopeData(aXecureConfig); + String result = ed.deEnvelopeData(envData); + + if (ed.getLastError() == 0) + { + out.println(result); + } + else + { + out.println("Error:[" + ed.getLastError() + "]" + ed.getLastErrorMsg()); + } +%> diff --git a/src/main/webapp/AnySign4PC/test/enc_server_response.jsp b/src/main/webapp/AnySign4PC/test/enc_server_response.jsp new file mode 100644 index 00000000..59892511 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/enc_server_response.jsp @@ -0,0 +1,1384 @@ + + + +ENC DEMO + + + + + +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<%@ page language="java" extends="xecure.servlet.jsp.XecureHttpJspPage" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<%@ page import="java.util.*" %> +<%@ page import="java.security.*" %> +<%@ page import="java.util.Random" %> + + + + + +

RESULT 1

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ +

RESULT 2

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ +

RESULT 3

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ +

RESULT 4

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ +

RESULT 5

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ +

RESULT 6

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ +

RESULT 7

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ +

RESULT 8

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ +

RESULT 9

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ +

RESULT 10

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ +

RESULT 1

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ +

RESULT 2

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ +

RESULT 3

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ +

RESULT 4

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ +

RESULT 5

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ +

RESULT 6

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ +

RESULT 7

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ +

RESULT 8

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ +

RESULT 9

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ +

RESULT 10

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + +

+

+ + + diff --git a/src/main/webapp/AnySign4PC/test/enc_server_response_20.jsp b/src/main/webapp/AnySign4PC/test/enc_server_response_20.jsp new file mode 100644 index 00000000..4d8a179a --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/enc_server_response_20.jsp @@ -0,0 +1,1422 @@ + + + +ENC DEMO + + + + + +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<%@ page language="java" extends="xecure.servlet.jsp.XecureHttpJspPage" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<%@ page import="java.util.*" %> +<%@ page import="java.security.*" %> +<%@ page import="java.util.Random" %> + + + + + +

RESULT 1

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + + +

RESULT 2

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + + +

RESULT 3

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + + +

RESULT 4

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + + +

RESULT 5

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + + +

RESULT 6

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + + +

RESULT 7

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + + +

RESULT 8

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + + +

RESULT 9

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + + +

RESULT 10

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + + +

RESULT 1

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + + +

RESULT 2

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + + +

RESULT 3

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + + +

RESULT 4

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + + +

RESULT 5

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + + +

RESULT 6

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + + +

RESULT 7

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + + +

RESULT 8

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + + +

RESULT 9

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + + +

RESULT 10

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user MAC address : + <%=request.getSession().getAttribute("MAC") %> +
user hard serial : + <%=request.getSession().getAttribute("Serial") %> +
Client Request QueryString : +<%=((XecureHttpServletRequest)request).req.getQueryString( ) %> +
Client Request QueryString abc: +<%=((XecureHttpServletRequest)request).req.getParameter("abc" ) %> +
Client Request QueryString pop: +<%=((XecureHttpServletRequest)request).req.getParameter("pop" ) %> +
Decrypted QueryString : +<%=request.getQueryString( ) %> +
Decrypted QueryString abc : +<%=request.getParameter("abc" ) %> +
Decrypted QueryString pop : +<%=request.getParameter("pop" ) %> +
Decrypted text_field1 : +<%=request.getParameter("text_field1" ) %> + +
Decrypted text_field2 : +<%=request.getParameter("text_field2" ) %> +
+ + +

+

+ + + diff --git a/src/main/webapp/AnySign4PC/test/fcms.jsp b/src/main/webapp/AnySign4PC/test/fcms.jsp new file mode 100644 index 00000000..8ebf404d --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/fcms.jsp @@ -0,0 +1,2622 @@ + +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.security.*" %> +<%@ page import="java.util.Random" %> +<%@ page import="java.io.File" %> +<% + File file = null; + int i = 0; + File[] files = null; + +// String servletPath = request.getServletPath(); +// String realPath = request.getRealPath(servletPath); + +// file = new File (realPath); +// realPath = file.getParent() + "/download"; + + String realPath = "/home/eomjh/workspace/AnySignLite_temp/js/test/FileStore/"; + file = new File(realPath); + if (file.exists() && file.isDirectory()) + { + files = file.listFiles(); + } +%> + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+
+
+ + + + + + +
+ + + + + +
+
+ +

SignFileEx

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aLimitPassword
aInputFilePath + + 0 : 단일 파일 선택
+ + 2 : 복수 파일 선택 (Ctrl + Click)
+ + +
aOutputFilePath
aSignOption + (서명 옵션)
+ + 0x00000000 : 기본 서명
+ + 0x00000001 : 서명에 Cert Chain을 포함한다.
+ + 0x00000002 : 서명에 CRL을 포함한다.
+ + 0x00000020 : 다른 인증서로 추가 서명을 진행한다.
+ + 0x00000040 : 분리서명 (서명 파일을 생성하지 않고, 서명값을 리턴합니다)
+ + 0x00000080 : 분리서명 결과값 Base64 (기본값 Hex)
+ + 0x00001000 : 인증서 캐쉬
+ (공통 옵션)
+ + 0x00010000 : 저장할 파일 선택창을 출력하지 않는다.
+ + 0x00020000 : 저장할 파일을 임시 폴더에 저장한다.
+ + 0x00040000 : 동일한 이름의 저장 파일이 있는 경우 오류 처리한다.(기본값은 덮어쓴다)
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+ + 0x00400000 : 오류 시 다음 파일 계속 진행한다.(기본값은 종료한다)
+ + 0x00800000 : 오류 시 다음 파일 계속 진행할지 확인창을 띄운다.
+ +
aDescription
Run + + + +
+ +
Output + +
+
+
+ +

SignFileExWithSerial

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aCertSerial
aCertLocation
aLimitPassword
aInputFilePath + + 0 : 단일 파일 선택
+ + 2 : 복수 파일 선택 (Ctrl + Click)
+ + +
aOutputFilePath
aSignOption + (서명 옵션)
+ + 0x00000000 : 기본 서명
+ + 0x00000001 : 서명에 Cert Chain을 포함한다.
+ + 0x00000002 : 서명에 CRL을 포함한다.
+ + 0x00000020 : 다른 인증서로 추가 서명을 진행한다.
+ + 0x00000040 : 분리서명 (서명 파일을 생성하지 않고, 서명값을 리턴합니다)
+ + 0x00000080 : 분리서명 결과값 Base64 (기본값 Hex)
+ (공통 옵션)
+ + 0x00010000 : 저장할 파일 선택창을 출력하지 않는다.
+ + 0x00020000 : 저장할 파일을 임시 폴더에 저장한다.
+ + 0x00040000 : 동일한 이름의 저장 파일이 있는 경우 오류 처리한다.(기본값은 덮어쓴다)
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+ + 0x00400000 : 오류 시 다음 파일 계속 진행한다.(기본값은 종료한다)
+ + 0x00800000 : 오류 시 다음 파일 계속 진행할지 확인창을 띄운다.
+ +
aDescription
Run + +
Output + +
+
+
+ +

SignFileExWithVID

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aLimitPassword
aInputFilePath + + 0 : 단일 파일 선택
+ + 2 : 복수 파일 선택 (Ctrl + Click)
+ + +
aOutputFilePath
aSignOption + (서명 옵션)
+ + 0x00000000 : 기본 서명
+ + 0x00000001 : 서명에 Cert Chain을 포함한다.
+ + 0x00000002 : 서명에 CRL을 포함한다.
+ + 0x00000020 : 다른 인증서로 추가 서명을 진행한다.
+ + 0x00000040 : 분리서명 (서명 파일을 생성하지 않고, 서명값을 리턴합니다)
+ + 0x00000080 : 분리서명 결과값 Base64 (기본값 Hex)
+ (VID 옵션)
+ + 0x00000008 : WEB 으로 부터 직접 입력받는다.
+ + 0x00000010 : IDN값을 입력받지 않는다. (""로 대체)
+ (공통 옵션)
+ + 0x00010000 : 저장할 파일 선택창을 출력하지 않는다.
+ + 0x00020000 : 저장할 파일을 임시 폴더에 저장한다.
+ + 0x00040000 : 동일한 이름의 저장 파일이 있는 경우 오류 처리한다.(기본값은 덮어쓴다)
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+ + 0x00400000 : 오류 시 다음 파일 계속 진행한다.(기본값은 종료한다)
+ + 0x00800000 : 오류 시 다음 파일 계속 진행할지 확인창을 띄운다.
+ +
aIdn
aDescription
Run + + +
Output + +
VID Output + +
+
+
+ +

SignFileExWithVID_Serial

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aCertSerial
aCertLocation
aLimitPassword
aInputFilePath + + 0 : 단일 파일 선택
+ + 2 : 복수 파일 선택 (Ctrl + Click)
+ + +
aOutputFilePath
aSignOption + (서명 옵션)
+ + 0x00000000 : 기본 서명
+ + 0x00000001 : 서명에 Cert Chain을 포함한다.
+ + 0x00000002 : 서명에 CRL을 포함한다.
+ + 0x00000020 : 다른 인증서로 추가 서명을 진행한다.
+ + 0x00000040 : 분리서명 (서명 파일을 생성하지 않고, 서명값을 리턴합니다)
+ + 0x00000080 : 분리서명 결과값 Base64 (기본값 Hex)
+ (VID 옵션)
+ + 0x00000008 : WEB 으로 부터 직접 입력받는다.
+ + 0x00000010 : IDN값을 입력받지 않는다. (""로 대체)
+ (공통 옵션)
+ + 0x00010000 : 저장할 파일 선택창을 출력하지 않는다.
+ + 0x00020000 : 저장할 파일을 임시 폴더에 저장한다.
+ + 0x00040000 : 동일한 이름의 저장 파일이 있는 경우 오류 처리한다.(기본값은 덮어쓴다)
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+ + 0x00400000 : 오류 시 다음 파일 계속 진행한다.(기본값은 종료한다)
+ + 0x00800000 : 오류 시 다음 파일 계속 진행할지 확인창을 띄운다.
+ +
aIdn
aDescription
Run + +
Output + +
VID Output + +
+
+
+ +

VerifyFile

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaInputFilePath + + +
aSignedData
aVerifyOption + (검증 옵션)
+ + 0x00000000 : 기본 검증
+ + 0x00000004 : 인증서 CRL 검증을 수행한다.
+ + 0x00000010 : 분리서명 검증 (원문 파일과 서명값을 입력한다)
+ (공통 옵션)
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+ + 0x10000000 : 진행창 완료 후 검증 확인창을 띄운다.
+ + 0x20000000 : 검증 확인창에 추가 서명 버튼을 표시한다.
+
aDescription
Run + +
Output + +
+
+
+ +

VerifyAndSignFile

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aCertSerial
aCertLocation
aLimitPassword
aInputFilePath + + +
aOutputFilePath
aSignedData
aVerifyOption + (검증 옵션)
+ + 0x00000000 : 기본 검증
+ + 0x00000004 : 인증서 CRL 검증을 수행한다.
+ + 0x00000010 : 분리서명 검증 (원문 파일과 서명값을 입력한다)
+ (공통 옵션)
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+ + 0x10000000 : 진행창 완료 후 검증 확인창을 띄운다.
+ +
aSignOption + (서명 옵션)
+ + 0x00000000 : 기본 서명
+ + 0x00000001 : 서명에 Cert Chain을 포함한다.
+ + 0x00000002 : 서명에 CRL을 포함한다.
+ + 0x00000004 : 다른 인증서로 추가 서명을 진행한다.
+ + 0x00000010 : 분리서명 (서명 파일을 생성하지 않고, 서명값을 리턴합니다)
+ + 0x00000020 : 분리서명 결과값 Base64 (기본값 Hex)
+ (공통 옵션)
+ + 0x00010000 : 저장할 파일 선택창을 출력하지 않는다.
+ + 0x00020000 : 저장할 파일을 임시 폴더에 저장한다.
+ + 0x00040000 : 동일한 이름의 저장 파일이 있는 경우 오류 처리한다.(기본값은 덮어쓴다)
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+ + 0x00400000 : 오류 시 다음 파일 계속 진행한다.(기본값은 종료한다)
+ + 0x00800000 : 오류 시 다음 파일 계속 진행할지 확인창을 띄운다.
+ +
aDescription
aDescription
Run + +
Output + +
+
+
+ +

GetVerifiedFileCertInfo

+
+ + + + + + + + + + + + + + + + + + +
InputaOption + + 0 : Full (인증서의 자세한 정보)
+ + 1 : Simple (서명시간 및 인증서의 간단한 정보)
+
aIndex + + + + + + +
+ * Full
+ 0 인증서 검증 결과
   (0 - 정상, 오류코드|오류메세지)
+ 1 버전
+ 2 일련번호
+ 3 서명 알고리즘
+ 4 발급자
+ 5 다음부터 유효함
+ 6 다음까지 유효함
+ 7 발급대상
+ 8 공개키 알고리즘
+ 9 공개키
+ 10 서명
+ 11 CA 키 고유번호
+ 12 인증서 정책
+ 13 키사용
+ 14 기본 규제
+ 15 주체 대체 이름
+ 16 CRL 분배점
+ 17 사용자 알림
+ 18 CPS
+ 19 기관정보 엑세스
+
+ * Simple
+ 0 서명 시간
+ 1 인증서 상태
   (0 - 정상, 1 - 만료 예정, 2 - 만료 된)
+ 2 인증서 구분
+ 3 사용자
+ 4 발급자 구분
+ 5 유효기간
+ 6 발급자
+ 7 일련번호
+
+
Run + +
Output + +
+
+
+ +

ExtractFile

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaInputFilePath + + +
aOutputFilePath
aOption + + 0x00000000 : 기본 옵션
+ + 0x00040000 : 동일한 이름의 저장 파일이 있는 경우 오류 처리한다.(기본값은 덮어쓴다)
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+
aDescription
Run + +
Output + +
+
+
+ +

EnvelopeFileWithPEM

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaInputFilePath + + 0 : 단일 파일 선택
+ + 2 : 복수 파일 선택 (Ctrl + Click)
+ + +
aOutputFilePath
aCertPEM
aOption + + 0x00000000 : 기본 옵션
+ + 0x00010000 : 저장할 파일 선택창을 출력하지 않는다.
+ + 0x00020000 : 저장할 파일을 임시 폴더에 저장한다.
+ + 0x00040000 : 동일한 이름의 저장 파일이 있는 경우 오류 처리한다.(기본값은 덮어쓴다)
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+ + 0x00400000 : 오류 시 다음 파일 계속 진행한다.(기본값은 종료한다)
+ + 0x00800000 : 오류 시 다음 파일 계속 진행할지 확인창을 띄운다.
+
aDescription
Run + +
Output + +
+
+
+ +

EnvelopeFileWithCert

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aInputFilePath + + 0 : 단일 파일 선택
+ + 2 : 복수 파일 선택 (Ctrl + Click)
+ + +
aOutputFilePath
aOption + + 0x00000000 : 기본 옵션
+ + 0x00000004 : 여러개의 인증서로 암호화한다.
+ + 0x00010000 : 저장할 파일 선택창을 출력하지 않는다.
+ + 0x00020000 : 저장할 파일을 임시 폴더에 저장한다.
+ + 0x00040000 : 동일한 이름의 저장 파일이 있는 경우 오류 처리한다.(기본값은 덮어쓴다)
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+ + 0x00400000 : 오류 시 다음 파일 계속 진행한다.(기본값은 종료한다)
+ + 0x00800000 : 오류 시 다음 파일 계속 진행할지 확인창을 띄운다.
+
aDescription
Run + +
Output + +
+
+
+ +

EnvelopeFileWithCert_Serial

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aCertSerial
aCertLocation
aInputFilePath + + 0 : 단일 파일 선택
+ + 2 : 복수 파일 선택 (Ctrl + Click)
+ + +
aOutputFilePath
aOption + + 0x00000000 : 기본 옵션
+ + 0x00000004 : 여러개의 인증서로 암호화한다.
+ + 0x00010000 : 저장할 파일 선택창을 출력하지 않는다.
+ + 0x00020000 : 저장할 파일을 임시 폴더에 저장한다.
+ + 0x00040000 : 동일한 이름의 저장 파일이 있는 경우 오류 처리한다.(기본값은 덮어쓴다)
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+ + 0x00400000 : 오류 시 다음 파일 계속 진행한다.(기본값은 종료한다)
+ + 0x00800000 : 오류 시 다음 파일 계속 진행할지 확인창을 띄운다.
+
aDescription
Run + +
Output + +
+
+
+ +

DeEnvelopeFileWithCert

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aLimitPassword
aInputFilePath + + 0 : 단일 파일 선택
+ + 2 : 복수 파일 선택 (Ctrl + Click)
+ + +
aOutputFilePath
aOption + + 0x00000000 : 기본 옵션
+ + 0x00010000 : 저장할 파일 선택창을 출력하지 않는다.
+ + 0x00020000 : 저장할 파일을 임시 폴더에 저장한다.
+ + 0x00040000 : 동일한 이름의 저장 파일이 있는 경우 오류 처리한다.(기본값은 덮어쓴다)
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+ + 0x00400000 : 오류 시 다음 파일 계속 진행한다.(기본값은 종료한다)
+ + 0x00800000 : 오류 시 다음 파일 계속 진행할지 확인창을 띄운다.
+
aDescription
Run + +
Output + +
+
+
+ +

DeEnvelopeFileWithCert_Serial

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aCertSerial
aCertLocation
aLimitPassword
aInputFilePath + + 0 : 단일 파일 선택
+ + 2 : 복수 파일 선택 (Ctrl + Click)
+ + +
aOutputFilePath
aOption + + 0x00000000 : 기본 옵션
+ + 0x00010000 : 저장할 파일 선택창을 출력하지 않는다.
+ + 0x00020000 : 저장할 파일을 임시 폴더에 저장한다.
+ + 0x00040000 : 동일한 이름의 저장 파일이 있는 경우 오류 처리한다.(기본값은 덮어쓴다)
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+ + 0x00400000 : 오류 시 다음 파일 계속 진행한다.(기본값은 종료한다)
+ + 0x00800000 : 오류 시 다음 파일 계속 진행할지 확인창을 띄운다.
+
aDescription
Run + +
Output + +
+
+
+ +

EnvelopeFileWithPasswd

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaInputFilePath + + 0 : 단일 파일 선택
+ + 2 : 복수 파일 선택 (Ctrl + Click)
+ + +
aOutputFilePath
aPassword + +
aOption + (패스워드 입력창 옵션)
+ + 0x00000000 : WEB으로 부터 직접 입력받는다.
+ + 0x00000001 : 패스워드 입력창을 출력한다.
+ (공통 옵션)
+ + 0x00010000 : 저장할 파일 선택창을 출력하지 않는다.
+ + 0x00020000 : 저장할 파일을 임시 폴더에 저장한다.
+ + 0x00040000 : 동일한 이름의 저장 파일이 있는 경우 오류 처리한다.(기본값은 덮어쓴다)
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+ + 0x00400000 : 오류 시 다음 파일 계속 진행한다.(기본값은 종료한다)
+ + 0x00800000 : 오류 시 다음 파일 계속 진행할지 확인창을 띄운다.
+
aDescription
Run + +
Output + +
+
+
+ +

DeEnvelopeFileWithPasswd

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaInputFilePath + + 0 : 단일 파일 선택
+ + 2 : 복수 파일 선택 (Ctrl + Click)
+ + +
aOutputFilePath
aPassword + +
aOption + (패스워드 입력창 옵션)
+ + 0x00000000 : WEB으로 부터 직접 입력받는다.
+ + 0x00000001 : 패스워드 입력창을 출력한다.
+ (공통 옵션)
+ + 0x00010000 : 저장할 파일 선택창을 출력하지 않는다.
+ + 0x00020000 : 저장할 파일을 임시 폴더에 저장한다.
+ + 0x00040000 : 동일한 이름의 저장 파일이 있는 경우 오류 처리한다.(기본값은 덮어쓴다)
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+ + 0x00400000 : 오류 시 다음 파일 계속 진행한다.(기본값은 종료한다)
+ + 0x00800000 : 오류 시 다음 파일 계속 진행할지 확인창을 띄운다.
+
aDescription
Run + +
Output + +
+
+
+ +

GetEnvelopedFileInfo

+
+ + + + + + + + + + + + + + + + + + +
InputaInputFilePath + + +
aOption + + 0x00000001 : 전자봉투 타입
+ + 0x00000002 : 파일명
+ + 0x00000004 : 인증서 일련번호
+
Run + +
Output + +
+
+
+ +

UploadFile

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aPath
aQuery
aHostName
aPort
aInputFilePath + + 0 : 단일 파일 선택
+ + 2 : 복수 파일 선택 (Ctrl + Click)
+ + +
aOption + + 0x00000000 : 기본 옵션
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+ + 0x00400000 : 오류 시 다음 파일 계속 진행한다.(기본값은 종료한다)
+ + 0x00800000 : 오류 시 다음 파일 계속 진행할지 확인창을 띄운다.
+
aDescription
Run + +
Output + +
+
+
+ +

DownloadFile

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aPath
aQuery
aHostName
aPort
aTargetFilePath + + * Multi Select: Ctrl + Click
+
+ +
aDownloadPath + + +
aOption + + 0x00000000 : 기본 옵션
+ + 0x00010000 : 저장할 파일 선택창을 출력하지 않는다.
+ + 0x00020000 : 저장할 파일을 임시 폴더에 저장한다.
+ + 0x00040000 : 동일한 이름의 저장 파일이 있는 경우 오류 처리한다.(기본값은 덮어쓴다)
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+ + 0x00400000 : 오류 시 다음 파일 계속 진행한다.(기본값은 종료한다)
+ + 0x00800000 : 오류 시 다음 파일 계속 진행할지 확인창을 띄운다.
+
aDescription
Run + +
Output + +
+
+
+ +

ZipFile

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aInputFilePath + + 0 : 단일 파일 선택
+ + 2 : 복수 파일 선택 (Ctrl + Click)
+ + +
aOutputFilePath
aOption + + 0x00010000 : 저장할 파일 선택창을 출력하지 않는다.
+ + 0x00020000 : 저장할 파일을 임시 폴더에 저장한다.
+ + 0x00040000 : 동일한 이름의 저장 파일이 있는 경우 오류 처리한다.(기본값은 덮어쓴다)
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+
aDescription
Run + +
Output + +
+
+
+ +

UnZipFile

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aInputFilePath + + +
aOutputFilePath
aOption + + 0x00010000 : 저장할 파일 선택창을 출력하지 않는다.
+ + 0x00020000 : 저장할 파일을 임시 폴더에 저장한다.
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+
aDescription
Run + +
Output + +
+
+
+ +

SelectFile

+
+ + + + + + + + + + + + + + + + + + + + + + +
InputaInitPath
aFilterString + +
aOption + + 0x00000000 : 열기 모드
+ + 0x00000001 : 저장 모드
+ + 0x00000002 : 다중 파일 선택 (저장 모드인 경우 폴더 선택창을 띄운다)
+
Run + +
Output + +
+
+
+ +

GetFileInfo

+
+ + + + + + + + + + + + + + + + + + +
InputaFilePath + + +
aOption + + 0x00000001 : 크기
+ + 0x00000002 : 생성 시간
+ + 0x00000004 : 마지막 접근 시간
+ + 0x00000008 : 마지막 수정 시간
+
Run + +
Output + +
+
+
+ +

ClearTempFile

+
+ + + + + + + + + + + + + + +
InputaXgateAddress
Run + +
Output + +
+
+
+ +

GetHomeDir

+
+ + + + + + + + + +
Run + +
Output + +
+
+
+ +
+ +
+
+
+ + diff --git a/src/main/webapp/AnySign4PC/test/fcms_updownloadex.jsp b/src/main/webapp/AnySign4PC/test/fcms_updownloadex.jsp new file mode 100644 index 00000000..901a1235 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/fcms_updownloadex.jsp @@ -0,0 +1,479 @@ + +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.security.*" %> +<%@ page import="java.util.Random" %> +<%@ page import="java.io.File" %> +<% + File file = null; + int i = 0; + File[] files = null; + + String realPath = "/home/eomjh/workspace/FCMS/js/test/FileStore/"; + file = new File(realPath); + if (file.exists() && file.isDirectory()) + { + files = file.listFiles(); + } +%> + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+
+
+ + + + + + +
+ + + + + +
+
+ +

UploadFileEx

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aPath
aQuery
aHostName
aPort
aInputFilePath + + 0 : 단일 파일 선택
+ + 2 : 복수 파일 선택 (Ctrl + Click)
+ + +
aOption + + 0x00000000 : 기본 옵션
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+ + 0x00400000 : 오류 시 다음 파일 계속 진행한다.(기본값은 종료한다)
+ + 0x00800000 : 오류 시 다음 파일 계속 진행할지 확인창을 띄운다.
+
aDescription
aSID
aCharset + + utf-8
+ + euc-kr
+
Run + +
Output + +
+
+
+ +

DownloadFileEx

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aPath
aQuery
aHostName
aPort
aTargetFilePath + + * Multi Select: Ctrl + Click
+
+ +
aDownloadPath + + +
aOption + + 0x00000000 : 기본 옵션
+ + 0x00010000 : 저장할 파일 선택창을 출력하지 않는다.
+ + 0x00020000 : 저장할 파일을 임시 폴더에 저장한다.
+ + 0x00040000 : 동일한 이름의 저장 파일이 있는 경우 오류 처리한다.(기본값은 덮어쓴다)
+ + 0x00080000 : 진행창을 보이지 않는다.
+ + 0x00100000 : 성공 시 진행창을 닫는다.(오류 시는 닫지 않는다)
+ + 0x00200000 : 완료 시 진행창을 닫는다.(오류가 발생해도 닫는다)
+ + 0x00400000 : 오류 시 다음 파일 계속 진행한다.(기본값은 종료한다)
+ + 0x00800000 : 오류 시 다음 파일 계속 진행할지 확인창을 띄운다.
+
aDescription
aSID
aCharset + + utf-8
+ + euc-kr
+
Run + +
Output + +
+
+
+
+ +
+
+
+ + diff --git a/src/main/webapp/AnySign4PC/test/fcms_updownloadex_euckr.jsp b/src/main/webapp/AnySign4PC/test/fcms_updownloadex_euckr.jsp new file mode 100644 index 00000000..6e985d82 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/fcms_updownloadex_euckr.jsp @@ -0,0 +1,481 @@ + +<%@ page contentType="text/html; charset=euc-kr" pageEncoding="euc-kr" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.security.*" %> +<%@ page import="java.util.Random" %> +<%@ page import="java.io.File" %> +<% request.setCharacterEncoding("euc-kr"); %> +<% response.setContentType("text/html; charset=euc-kr"); %> +<% + File file = null; + int i = 0; + File[] files = null; + + String realPath = "/home/eomjh/workspace/FCMS/js/test/FileStore/"; + file = new File(realPath); + if (file.exists() && file.isDirectory()) + { + files = file.listFiles(); + } +%> + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+
+
+ + + + + + +
+ + + + + +
+
+ +

UploadFileEx

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aPath
aQuery
aHostName
aPort
aInputFilePath + + 0 :
+ + 2 : (Ctrl + Click)
+ + +
aOption + + 0x00000000 : ⺻ ɼ
+ + 0x00080000 : â ʴ´.
+ + 0x00100000 : â ݴ´.( ô ʴ´)
+ + 0x00200000 : Ϸ â ݴ´.( ߻ص ݴ´)
+ + 0x00400000 : Ѵ.(⺻ Ѵ)
+ + 0x00800000 : Ȯâ .
+
aDescription
aSID
aCharset + + utf-8
+ + euc-kr
+
Run + +
Output + +
+
+
+ +

DownloadFileEx

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aPath
aQuery
aHostName
aPort
aTargetFilePath + + * Multi Select: Ctrl + Click
+
+ +
aDownloadPath + + +
aOption + + 0x00000000 : ⺻ ɼ
+ + 0x00010000 : â ʴ´.
+ + 0x00020000 : ӽ Ѵ.
+ + 0x00040000 : ̸ ִ óѴ.(⺻ )
+ + 0x00080000 : â ʴ´.
+ + 0x00100000 : â ݴ´.( ô ʴ´)
+ + 0x00200000 : Ϸ â ݴ´.( ߻ص ݴ´)
+ + 0x00400000 : Ѵ.(⺻ Ѵ)
+ + 0x00800000 : Ȯâ .
+
aDescription
aSID
aCharset + + utf-8
+ + euc-kr
+
Run + +
Output + +
+
+
+
+ +
+
+
+ + diff --git a/src/main/webapp/AnySign4PC/test/file_download.jsp b/src/main/webapp/AnySign4PC/test/file_download.jsp new file mode 100644 index 00000000..c155cf67 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/file_download.jsp @@ -0,0 +1,57 @@ +<%@ page contentType="text/html; charset=euc-kr" %> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.file.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> + +<% +try{ + +////////////////////////////////////////////////////////////////////////// +//tomcat + +// out.clear(); +// out = pageContext.pushBody(); + + + XecureServlet xservlet = new XecureServlet(request, response); + // tomcat, 기타 WAS + XecureFileOutputStream file; + file = new XecureFileOutputStream(xservlet.getXecureSession(), + xservlet.request, + xservlet.response, + response.getOutputStream()); + // jeus + /* + XecureFilePrintWriter file; + file = new XecureFilePrintWriter(xservlet.getXecureSession(), + xservlet.request, + xservlet.response, + response.getWriter()); + */ + + String filePATH = "/home/eomjh/workspace/AnySignLite_temp/js/test/FileStore/" + xservlet.request.getParameter("filename"); + + file.flush(); + //file.fileDownload(); + file.fileDownload(filePATH); +} +catch(FileNotFoundException e) { + out.print ("SFE123"); + System.out.println("FileNotFoundException"); +} +catch(IOException e) { + out.print ("SFE123"); + System.out.println("IOException"); +} +catch(XecureServletConfigException e) { + out.print ("SFE123"); + System.out.println("XecureServletConfigException"); +} +catch(XecureServletException e) { + out.print ("SFE123"); + System.out.println("XecureServletException"); +} + +%> diff --git a/src/main/webapp/AnySign4PC/test/file_upload.jsp b/src/main/webapp/AnySign4PC/test/file_upload.jsp new file mode 100644 index 00000000..d773073c --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/file_upload.jsp @@ -0,0 +1,39 @@ +<%@ page contentType="text/html; charset=euc-kr" %> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.file.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> + + +<% + +session.setAttribute("session1", "s1_value"); +session.setAttribute("session2", "s2_value"); + + +String aUploadDirectory = "/home/eomjh/workspace/AnySignLite_temp/js/test/FileStore/"; + +try { + + XecureFileInputStream file; + XecureServlet xservlet = new XecureServlet(request, response); + + file = new XecureFileInputStream(xservlet.getXecureSession(), xservlet.request); + file.saveFileAt(aUploadDirectory); + + out.print ("OK"); +} +catch(XecureServletConfigException e) { + out.print ("SFE20"); +} +catch(XecureServletException e) { + out.print ("SFE21"); +} +catch(IOException e) { + out.print ("SFE22"); +} +catch(Exception e) { + out.print ("SFE23"); +} +%> diff --git a/src/main/webapp/AnySign4PC/test/file_upload_proxy.jsp b/src/main/webapp/AnySign4PC/test/file_upload_proxy.jsp new file mode 100644 index 00000000..0d4fd49a --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/file_upload_proxy.jsp @@ -0,0 +1,44 @@ +<%@ page contentType="text/html; charset=euc-kr" %> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.file.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> + + +<% +session.setAttribute("session1", "s1_value"); +session.setAttribute("session2", "s2_value"); + + +String aUploadDirectory = ""; + +try { + + XecureFileInputStream file; + XecureServlet xservlet = new XecureServlet(request, response); + + file = new XecureFileInputStream(xservlet.getXecureSession(), xservlet.request); + String name = file.getFileName(); + if (name != null) { + file.saveFileAt(aUploadDirectory); + + out.print ("OK"); + } + else { + out.print ("upload file name is null"); + } +} +catch(XecureServletConfigException e) { + out.print ("SFE20"); +} +catch(XecureServletException e) { + out.print ("SFE21"); +} +catch(IOException e) { + out.print ("SFE22"); +} +catch(Exception e) { + out.print ("SFE23"); +} +%> diff --git a/src/main/webapp/AnySign4PC/test/ibs/pub_cert/cert_register.jsp b/src/main/webapp/AnySign4PC/test/ibs/pub_cert/cert_register.jsp new file mode 100644 index 00000000..dd7adc3b --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/ibs/pub_cert/cert_register.jsp @@ -0,0 +1,331 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> + + +
+ + + +12인증서 (재)발급, 갱신등록 + + + + + + + + + + + + + + + +
+

 

+

 

+ + + + + + + + +
+ + + + + + + + + + + +
 
  
+
+ + + + + + + + + + + + +
  + + + + + +
+ + + +
+
+
+ + + + + + + + + + + + + +
  +

인증서 (재)발급, 갱신등록 +

+
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
   +

이 페이지는 금융결제원 인증기관에 사용자를 등록하고 작업을 수행합니다. 반드시 운영시스템에서는 + 이 페이지를 웹상에서 제거하고 절대 운영시스템에서는 수행하지 마십시요. 사용자 확인을 + 위해서 아래의 정보를 입력해 주십시요.

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
자동입력
개인/법인/단체 구분
+  + + + +개인 + + +  + + +법인 +
+ + 전자거래범용 + 은행/보험용
+ 신용카드결제용 + 보안메일용 + +
+
법인/단체명 ( 법인/단체일 경우 필수, 영문 필수 )
개인명 / 법인단체 세부명 ( 필수 )
영문 개인명 / 영문 법인단체 세부명 ( 옵션 )
개인 (법인단체) ID ( 필수 )
주민등록번호 ( 사업자 등록번호 ) ( 필수 )
전자우편 ( 옵션 )
핸드폰 ( 옵션 )
Fax ( 옵션 )
자택 우편번호 ( 개인 필수 )
자택 주소 ( 개인 필수 )
자택 전화 ( 개인 필수 )
회사 우편번호 ( 법인 필수 )
회사 주소 ( 법인 필수 )
회사 전화 ( 법인 필수 )
+
+

+
+ +
+
+ +
   +

 

+
   
   +

 

+
   
   
+
  
+
+
+ +  
+ + + + diff --git a/src/main/webapp/AnySign4PC/test/ibs/pub_cert/cert_request.jsp b/src/main/webapp/AnySign4PC/test/ibs/pub_cert/cert_request.jsp new file mode 100644 index 00000000..fd19b9b5 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/ibs/pub_cert/cert_request.jsp @@ -0,0 +1,295 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> + +
+ + + + + +<% + String account = request.getParameter("account"); + String ac_pwd = request.getParameter("ac_pwd"); + String pcard = request.getParameter("pcard"); + String operaterId = "internet"; + String user_policy_type = request.getParameter("user_policy_type") ; + String company_name = request.getParameter("company_name"); + String user_name = request.getParameter("user_name"); + user_name = new String(user_name.getBytes("ISO-8859-1"), "UTF-8"); + out.println( "user_name:" + user_name + "
"); + + String euser_name = request.getParameter("euser_name"); + String user_id = request.getParameter("user_id"); + String ssn = request.getParameter("ssn"); + + + + + + String policy_type ; + String user_type; +/* + if ( user_type.equals("1") ) { + policy_type = "01"; + user_id = policy_type + ssn.charAt(5) + user_id; + } + else if(user_type.equals("2")) { + policy_type = "02"; + user_id = policy_type + ssn.charAt(8) + user_id; + } + else policy_type = "06"; +*/ + + user_type = user_policy_type.substring(0, 1); + + if( user_type.equals("1") ) { + + policy_type = user_policy_type.substring(1,3); + user_id = policy_type + ssn.charAt(5) + user_id; + + + } + else if ( user_type.equals("2") ) { + + policy_type = user_policy_type.substring(1,3); + user_id = policy_type + ssn.charAt(8) + user_id; + + } + else + policy_type = user_policy_type.substring(1,2); + + String email = request.getParameter("email"); + String cell_phone = request.getParameter("cell_phone"); + String fax = request.getParameter("fax"); + String zipcode = request.getParameter("zipcode"); + String address = request.getParameter("address"); + String phone = request.getParameter("phone"); + String czipcode = request.getParameter("czipcode"); + String caddress = request.getParameter("caddress"); + String cphone = request.getParameter("cphone"); + int ra_result; + + XecureConfig xconf = new XecureConfig (); + PublicRA sfra = new PublicRA (xconf); + + ra_result = sfra.registerNewUser ( operaterId, user_type, company_name, user_name, euser_name, user_id, + ssn, policy_type, email,cell_phone, fax, zipcode, address, phone, + czipcode, caddress, cphone ); + +%> + + + +사용자 등록 확인 +<%=policy_type%> + + + + + + + + + + + + + + + + + + + + + + + + + +
+

 

+

 

+ + + + + + + + +
+ + + + + + + + + + + +
 
  
+
+ + + + + + + + + + + + +
  + + + + + +
+ + + +
+
+
+ + + + + + + + + + + + + +
  +

사용자 + 등록 확인

+
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
   
+
+

 

+ +<% + if ( ra_result == 0 ) { +%> + + + + + + + + + + + + +
사용자<%=user_name%>
계좌번호<%=account%>
등록일<%=sfra.getResponseFromRegUser("REGDATE")%>
등록번호<%=sfra.getResponseFromRegUser("REGSERIAL")%>
사용자 ID<%=sfra.getResponseFromRegUser("USERID")%>
주민등록번호<%=sfra.getResponseFromRegUser("SSN")%>
참조코드<%=sfra.getResponseFromRegUser("REFCODE")%>
인가코드<%=sfra.getResponseFromRegUser("AUTHCODE")%>
인증정책식별코드<%=sfra.getResponseFromRegUser("POLICYTYPE")%>
최상위인증기관 해쉬값<%=sfra.getResponseFromRegUser("ROOTHASH")%>
+
+<%=request.getParameter("user_name")%>'님의 사용자 정보가 금융결제원 인증기관에 등록 되었습니다.
+
+ 이제 '확인' 버튼을 누르시면 금융결제원 공인인증기관으로 부터 인증서를 발급받을 수 있습니다. +

+
+ + + +
+<% } + else { +%> +

사용자 등록에 실패했습니다.

+에러 코드 : <%=sfra.getLastError()%>
+에러 메시지 : <%=sfra.getLastErrorMsg()%>
+<%=xconf.getRaHost() + xconf.getRaPort()%> +<% } +%> + +
+
   +

 

+
   
   +

 

+
   
   
+
  
+
+
+ +  
+ + diff --git a/src/main/webapp/AnySign4PC/test/ibs/pub_cert/cert_rereg.jsp b/src/main/webapp/AnySign4PC/test/ibs/pub_cert/cert_rereg.jsp new file mode 100644 index 00000000..bfc1652a --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/ibs/pub_cert/cert_rereg.jsp @@ -0,0 +1,265 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> + + +
+ + + + +<% + String account = request.getParameter("account"); + String ac_pwd = request.getParameter("ac_pwd"); + String pcard = request.getParameter("pcard"); + String operaterId = "internet"; + //String user_type = request.getParameter("user_type") ; + String user_policy_type = request.getParameter("user_policy_type") ; + String company_name = request.getParameter("company_name"); + String user_name = request.getParameter("user_name"); + String euser_name = request.getParameter("euser_name"); + String user_id = request.getParameter("user_id"); + String ssn = request.getParameter("ssn"); + + String policy_type ; + String user_type; + +/* + if ( user_type.equals("1") ) { + policy_type = "01"; + user_id = policy_type + ssn.charAt(5) + user_id; + } + else if(user_type.equals("2")) { + policy_type = "02"; + user_id = policy_type + ssn.charAt(8) + user_id; + } + else policy_type = "06"; +*/ + + user_type = user_policy_type.substring(0, 1); + + if( user_type.equals("1") ) { + + policy_type = user_policy_type.substring(1,3); + user_id = policy_type + ssn.charAt(5) + user_id; + + + } + else if ( user_type.equals("2") ) { + + policy_type = user_policy_type.substring(1,3); + user_id = policy_type + ssn.charAt(8) + user_id; + + } + else + policy_type = user_policy_type.substring(1,2); + + String email = request.getParameter("email"); + String cell_phone = request.getParameter("cell_phone"); + String fax = request.getParameter("fax"); + String zipcode = request.getParameter("zipcode"); + String address = request.getParameter("address"); + String phone = request.getParameter("phone"); + String czipcode = request.getParameter("czipcode"); + String caddress = request.getParameter("caddress"); + String cphone = request.getParameter("cphone"); + int ra_result; + + XecureConfig xconf = new XecureConfig (); + PublicRA sfra = new PublicRA (xconf); + + ra_result = sfra.registerRenewUser ( operaterId, user_type, company_name, user_name, euser_name, user_id, + ssn, policy_type, email,cell_phone, fax, zipcode, address, phone, + czipcode, caddress, cphone ); + +%> + + + +사용자 등록 확인 + + + + + + + + + + + + + + + +
+

 

+

 

+ + + + + + + + +
+ + + + + + + + + + + +
 
  
+
+ + + + + + + + + + + + +
  + + + + + +
+ + + +
+
+
+ + + + + + + + + + + + + +
  +

사용자 + 등록 확인

+
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
   
+
+ +
+<% + if ( ra_result == 0 ) { +%> + + + + + + + + + +
사용자<%=user_name%>
등록일<%=sfra.getResponseFromRegUser("REGDATE")%>
등록번호<%=sfra.getResponseFromRegUser("REGSERIAL")%>
사용자 ID<%=sfra.getResponseFromRegUser("USERID")%>
주민등록번호<%=sfra.getResponseFromRegUser("SSN")%>
참조코드<%=sfra.getResponseFromRegUser("REFCODE")%>
인가코드<%=sfra.getResponseFromRegUser("AUTHCODE")%>
+
+<%=request.getParameter("user_name")%>'님의 사용자 정보가 금융결제원 인증기관에 등록 되었습니다.
+
+ 이제 '확인' 버튼을 누르시면 금융결제원 공인인증기관으로 부터 인증서를 재발급받을 수 있습니다. +

+
+ + + +
+<% } + else { +%> +

사용자 등록에 실패했습니다.

+에러 코드 : <%=sfra.getLastError()%>
+에러 메시지 : <%=sfra.getLastErrorMsg()%>
+<% } +%> + +

 

+
+
   +

 

+
   
   +

 

+
   
   
+
  
+
+
+ +  
+ + diff --git a/src/main/webapp/AnySign4PC/test/ibs/pub_cert/user_regist.jsp b/src/main/webapp/AnySign4PC/test/ibs/pub_cert/user_regist.jsp new file mode 100644 index 00000000..ab2014f5 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/ibs/pub_cert/user_regist.jsp @@ -0,0 +1,285 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="xecure.crypto.jni.XecureLib" %> +<%@ page import="java.io.*" %> +<%@ page import="java.util.Calendar" %> + +<% + String []nameList = { + "자신", "남편", "부인", "딸램", "아들", "막내", "장남", "장녀", + "차녀", "차남", "엄마", "아빠", "형님", "언니", "누나", "오빠", "동생", + "할아버지", "할머니", "큰아버지", "큰어머니", "삼촌", "사촌", + "매부", "매재", "매형", "제수", "제부", "고모", "고모부", + "이모", "이모부", "아저씨", "조카"}; + + java.util.Random aRandom = null; + + aRandom = (java.util.Random)application.getAttribute ("xwup.ibs.random"); + if (aRandom == null) + { + aRandom = new java.util.Random (); + application.setAttribute ("xwup.ibs.random", aRandom); + } +%> +<% + String commandType = request.getParameter("commandType"); + String operaterId = "internet"; + String user_policy_type = request.getParameter("user_policy_type") ; + String company_name = request.getParameter("company_name"); + String user_name = request.getParameter("user_name"); + + + if (commandType != null && commandType.equalsIgnoreCase ("update")) + { + boolean isError = false; + if (user_policy_type == null) + isError = true; + + if (user_name == null) + isError = true; + + if (isError) + { +%> +({"code":"-1", +"reason":"no policy or user_name or ssn", +"moreinformation":""}) +<% + return; + } + + } + + if (user_policy_type == null) + { + user_policy_type = "104"; + } + + if (user_name == null || user_name.length () == 0) + { + user_name = nameList [aRandom.nextInt (nameList.length)]; + } + else + user_name = new String(user_name.getBytes("iso8859-1"), "utf-8"); + + String euser_name = request.getParameter("euser_name"); + String user_id = request.getParameter("user_id"); + String ssn = request.getParameter("ssn"); + + String policy_type ; + String user_type; + + user_type = user_policy_type.substring(0, 1); + + if( user_type.equals("1") ) + { + if (ssn == null || ssn.length () == 0) + { + StringBuffer aBuffer = new StringBuffer (); + Calendar aCalendar = Calendar.getInstance (); + String aSSNTail = null; + aSSNTail = String.valueOf (aRandom.nextInt (2999999)); + + aBuffer.append (String.valueOf (aCalendar.get(Calendar.YEAR)).substring (2)); + + if (aCalendar.get(Calendar.MONTH) < 10) + aBuffer.append ("0"); + aBuffer.append (String.valueOf (aCalendar.get(Calendar.MONTH))); + + if (aCalendar.get(Calendar.DAY_OF_MONTH) < 10) + aBuffer.append ("0"); + aBuffer.append (String.valueOf (aCalendar.get(Calendar.DAY_OF_MONTH))); + + + if (aSSNTail.length () < 7) + { + for (int aIter = 0; aIter < 7 - aSSNTail.length (); ++aIter) + { + aBuffer.append ("0"); + } + } + aBuffer.append (aSSNTail); + + ssn = aBuffer.toString (); + + } + if (user_id == null) + user_id = ssn; + + policy_type = user_policy_type.substring(1,3); + user_id = policy_type + ssn.charAt(5) + user_id; + } + else if ( user_type.equals("2") ) + { + if (ssn == null || ssn.length () == 0) + { + StringBuffer aBuffer = new StringBuffer (); + String aSSNTail = null; + aSSNTail = "2" + String.valueOf (aRandom.nextInt (999999999)); + + if (aSSNTail.length () < 10) + { + for (int aIter = 0; aIter < 10 - aSSNTail.length (); ++aIter) + { + aBuffer.append ("0"); + } + } + aBuffer.append (aSSNTail); + + ssn = aBuffer.toString (); + } + + if (company_name == null) + company_name = ssn; + if (euser_name == null) + euser_name = ssn; + if (user_id == null) + user_id = ssn; + + policy_type = user_policy_type.substring(1,3); + user_id = policy_type + ssn.charAt(8) + user_id; + } + else + policy_type = user_policy_type.substring(1,2); + +%> +<% + + String email = "dont email me"; + String cell_phone = "dont call me"; + String fax = "dont fax me"; + String zipcode = "127-311"; + String address = "dogok dong house"; + String phone = "02-526-8000"; + String czipcode = "127-311"; + String caddress = "dogok dong"; + String cphone = "02-526-8000"; + + int ra_result = 0; + + XecureConfig xconf = new XecureConfig (); + PublicRA sfra = new PublicRA (xconf); + XecureLib jni = new XecureLib (xconf); + + String ip = null; + int port = -1; + int protocol = -1; + + String targetRA = request.getParameter ("targetRA"); + + ip = xconf.getRaHost (); + port = xconf.getRaPort (); + protocol = xconf.getRaProtocol (); + + if (targetRA != null) + { + if (targetRA.equalsIgnoreCase ("1024")) /* 1024 PublicRA Information */ + { + ip = "192.168.0.43"; + port = 25610; + protocol = 1; + } + else if (targetRA.equalsIgnoreCase ("2048")) /* 2048 PublicRA Information */ + { + ip = "192.168.0.26"; + port = 15679; + protocol = 1; + } + } + + if (commandType == null || commandType.equalsIgnoreCase ("new")) + { + ra_result = jni.registerNewUser (ip.getBytes (), + port, + protocol, + operaterId.getBytes (), + user_type.getBytes (), + (company_name == null) ? null : company_name.getBytes (), + user_name.getBytes (), + (euser_name == null) ? null : euser_name.getBytes (), + user_id.getBytes (), + ssn.getBytes (), + policy_type.getBytes (), + email.getBytes (), + cell_phone.getBytes (), + fax.getBytes (), + zipcode.getBytes (), + address.getBytes (), + phone.getBytes (), + czipcode.getBytes (), + caddress.getBytes (), + cphone.getBytes () ); + } + else if (commandType.equalsIgnoreCase ("rereg")) + { + ra_result = jni.registerRenewUser (ip.getBytes (), + port, + protocol, + operaterId.getBytes (), + user_type.getBytes (), + (company_name == null) ? null : company_name.getBytes (), + user_name.getBytes (), + (euser_name == null) ? null : euser_name.getBytes (), + user_id.getBytes (), + ssn.getBytes (), + policy_type.getBytes (), + email.getBytes (), + cell_phone.getBytes (), + fax.getBytes (), + zipcode.getBytes (), + address.getBytes (), + phone.getBytes (), + czipcode.getBytes (), + caddress.getBytes (), + cphone.getBytes () ); + } + else if (commandType.equalsIgnoreCase ("update")) + { + ra_result = jni.registerUpdateUser (ip.getBytes (), + port, + protocol, + operaterId.getBytes (), + user_type.getBytes (), + (company_name == null) ? null : company_name.getBytes (), + user_name.getBytes (), + (euser_name == null) ? null : euser_name.getBytes (), + user_id.getBytes (), + ssn.getBytes (), + policy_type.getBytes (), + email.getBytes (), + cell_phone.getBytes (), + fax.getBytes (), + zipcode.getBytes (), + address.getBytes (), + phone.getBytes (), + czipcode.getBytes (), + caddress.getBytes (), + cphone.getBytes () ); + } + + +%> +({"ssn":"<%=ssn%>", +"name":"<%=user_name%>", +"code":"<%=ra_result%>", +<% + if ( ra_result == 0 ) { +%> +"regdate":"<%=new String(jni.reguser_RegDate, "cp949")%>", +"regserial":"<%=new String(jni.reguser_RegSerial, "cp949")%>", +"userid":"<%=new String(jni.reguser_UserId, "cp949")%>", +"refcode":"<%=(jni.reguser_RefCode == null) ? "" : new String(jni.reguser_RefCode, "cp949")%>", +"authcode":"<%=(jni.reguser_AuthCode == null) ? "" : new String(jni.reguser_AuthCode, "cp949")%>", +"policytype":"<%=new String(jni.reguser_PolicyType, "cp949")%>", +"roothash":"<%=new String(jni.reguser_RootHash, "cp949")%>" +<% } + else + { +%> +"reason":"<%=new String (jni.errMsg)%>", +"moreinformation":"RA IP:<%=ip + ", RA Port:" + port%>" +<% } +%> +}) diff --git a/src/main/webapp/AnySign4PC/test/ibs/xecureca_cert/cert_register.jsp b/src/main/webapp/AnySign4PC/test/ibs/xecureca_cert/cert_register.jsp new file mode 100644 index 00000000..b7c1fc44 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/ibs/xecureca_cert/cert_register.jsp @@ -0,0 +1,288 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> + +
+ + + + + +인증서 발급 + + + + + + + + + + + + + + +
+

 

+

 

+ + + + + + + + +
+ + + + + + + + + + + +
 
  
+
+ + + + + + + + + + + + +
  + + + + + +
+ + + +
+
+
+ + + + + + + + + + + + + +
  +

인증서 발급 +

+
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
   +

이 페이지는 Xecure 인증기관에 사용자를 등록하고 작업을 수행합니다. 반드시 운영시스템에서는 + 이 페이지를 웹상에서 제거하고 절대 운영시스템에서는 수행하지 마십시요. 사용자 확인을 + 위해서 아래의 정보를 입력해 주십시요.

+
+
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
계좌번호
계좌비밀번호
패스워드카드 15번째 숫자
개인/법인/단체 구분 + 개인 + 법인 +
법인명 (필수)
개인명 / 법인단체 세부명(필수)
개인 (법인단체) ID (필수)
주민등록번호 (사업자 등록번호) (필수)
전자우편 ( 옵션 )
핸드폰 ( 옵션 )
Fax ( 옵션 )
자택 우편번호 ( 옵션 )
자택 주소 ( 옵션 )
자택 전화 ( 옵션 )
회사 우편번호 ( 옵션 )
회사 주소 ( 옵션 )
회사 전화 ( 옵션 )
인증서 용도
인증서 등급
Corp Code
org Code
orgid Code
직급(대법원)
외국인식별번호(대법원)
등기마스터번호(대법원)
임원번호(대법원)
ext3(긴법인명)
+
+

+

+
+
+ +
   +

 

+
   
   +

 

+
   
+
  
+
+
+ +  
+ + diff --git a/src/main/webapp/AnySign4PC/test/ibs/xecureca_cert/cert_request.jsp b/src/main/webapp/AnySign4PC/test/ibs/xecureca_cert/cert_request.jsp new file mode 100644 index 00000000..fb0fa824 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/ibs/xecureca_cert/cert_request.jsp @@ -0,0 +1,295 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> + +<% + String account = request.getParameter("account"); + String ac_pwd = request.getParameter("ac_pwd"); + String pcard = request.getParameter("pcard"); + String operaterId = "internet"; + String user_type = request.getParameter("user_type") ; + String company_name = request.getParameter("company_name"); + String user_name = request.getParameter("user_name"); + String user_id = request.getParameter("user_id"); + String ssn = request.getParameter("ssn"); + + String policy_type = "01"; + + String email = request.getParameter("email"); + String cell_phone = request.getParameter("cell_phone"); + String fax = request.getParameter("fax"); + String zipcode = request.getParameter("zipcode"); + String address = request.getParameter("address"); + String phone = request.getParameter("phone"); + String czipcode = request.getParameter("czipcode"); + String caddress = request.getParameter("caddress"); + String cphone = request.getParameter("cphone"); + String cert_type = request.getParameter("cert_type"); + String cert_class = request.getParameter("cert_class"); + String corp_code = request.getParameter("corp_code"); + + String org_code = request.getParameter("org_code"); + String orgid_code = request.getParameter("orgid_code"); + + String position = request.getParameter("position"); + String foreigner_id_num = request.getParameter("foreigner_id_num"); + String reg_master_num = request.getParameter("reg_master_num"); + String executive_num = request.getParameter("executive_num"); + + String ext3 = request.getParameter("ext3"); + + int ca_result; + + XecureConfig xecConfig = new XecureConfig (); + XecureCA ca_client = new XecureCA ( xecConfig ); + //XecureCA ca_client = new XecureCA ( xecConfig , "mercury.softforum.com", 2100); + + ca_result = ca_client.registerNewUser ( operaterId, user_type, company_name, + user_name, user_id, ssn, policy_type, + email,cell_phone, fax, zipcode, address, phone, + czipcode, caddress, cphone, + cert_type, cert_class, corp_code, + org_code, orgid_code, + position, foreigner_id_num, reg_master_num, executive_num, ext3); + +%> + + + +사용자 등록 확인 + + +
+ + + + + + + + + + + + + + + + + + +
+

 

+

 

+ + + + + + + + +
+ + + + + + + + + + + +
 
  
+
+ + + + + + + + + + + + +
  + + + + + +
+ + + +
+
+
+ + + + + + + + + + + + + +
  +

사용자 + 등록 확인

+
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
   
+
+

 

+ +<% + if ( ca_result == 0 ) { +%> + + + + + + + + + + + + + + + +
사용자<%=user_name%>
계좌번호<%=account%>
등록일<%=ca_client.getResponseFromRegUser("REGDATE")%>
등록번호<%=ca_client.getResponseFromRegUser("REGSERIAL")%>
사용자 ID<%=ca_client.getResponseFromRegUser("USERID")%>
주민등록번호<%=ca_client.getResponseFromRegUser("SSN")%>
사용자 이름<%=ca_client.getResponseFromRegUser("USERNAME")%>
참조코드<%=ca_client.getResponseFromRegUser("REFCODE")%>
인가코드<%=ca_client.getResponseFromRegUser("AUTHCODE")%>
인증서 용도<%=ca_client.getResponseFromRegUser("CERTTYPE")%>
인증서 등급<%=ca_client.getResponseFromRegUser("CERTCLASS")%>
CORP CORE<%=ca_client.getResponseFromRegUser("CORPCODE")%>
+
+<%=request.getParameter("user_name")%>'님의 사용자 정보가 XecureCA 인증기관에 등록 되었습니다.
+
이제 '확인' 버튼을 누르시면 XecureCA 공인인증기관으로 부터 인증서를 발급받을 수 있습니다.

+

+
+ + + +




+공개키 알고리즘
+ + +
+<% } + else { +%> +

사용자 등록에 실패했습니다.

+에러 코드 : <%=ca_client.getLastError()%>
+에러 메시지 : <%=ca_client.getLastErrorMsg()%>
+xecConfig.getXecureCaHost() : <%= xecConfig.getXecureCaHost()%>
+xecConfig.getXecureCaPort() : <%= xecConfig.getXecureCaPort()%>
+ +<% } +%> +
+
   +

 

+
   
   +

 

+
   
   
+
  
+
+
+ +  
+ + diff --git a/src/main/webapp/AnySign4PC/test/ibs/xecureca_cert/cert_request_rereg.jsp b/src/main/webapp/AnySign4PC/test/ibs/xecureca_cert/cert_request_rereg.jsp new file mode 100644 index 00000000..b6c34c79 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/ibs/xecureca_cert/cert_request_rereg.jsp @@ -0,0 +1,280 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> + +<% + String account = request.getParameter("account"); + String ac_pwd = request.getParameter("ac_pwd"); + String pcard = request.getParameter("pcard"); + String operaterId = "internet"; + String user_type = request.getParameter("user_type") ; + String company_name = request.getParameter("company_name"); + String user_name = request.getParameter("user_name"); + String user_id = request.getParameter("user_id"); + String ssn = request.getParameter("ssn"); + + String policy_type = "01"; + + String email = request.getParameter("email"); + String cell_phone = request.getParameter("cell_phone"); + String fax = request.getParameter("fax"); + String zipcode = request.getParameter("zipcode"); + String address = request.getParameter("address"); + String phone = request.getParameter("phone"); + String czipcode = request.getParameter("czipcode"); + String caddress = request.getParameter("caddress"); + String cphone = request.getParameter("cphone"); + String cert_type = request.getParameter("cert_type"); + String cert_class = request.getParameter("cert_class"); + String corp_code = request.getParameter("corp_code"); + + String org_code = request.getParameter("org_code"); + String orgid_code = request.getParameter("orgid_code"); + + String position = request.getParameter("position"); + String foreigner_id_num = request.getParameter("foreigner_id_num"); + String reg_master_num = request.getParameter("reg_master_num"); + String executive_num = request.getParameter("executive_num"); + + String ext3 = request.getParameter("ext3"); + + int ca_result; + + XecureConfig xecConfig = new XecureConfig (); + XecureCA ca_client = new XecureCA ( xecConfig ); + //XecureCA ca_client = new XecureCA ( xecConfig , "mercury.softforum.com", 2100); + + ca_result = ca_client.registerReNewUser ( operaterId, user_type, company_name, + user_name, user_id, ssn, policy_type, + email,cell_phone, fax, zipcode, address, phone, + czipcode, caddress, cphone, + cert_type, cert_class, corp_code, + org_code, orgid_code, + position, foreigner_id_num, reg_master_num, executive_num, ext3, 0); + +%> + + + +사용자 등록 확인 + + +
+ + + + + + + + + + + + + + + + + + +
+

 

+

 

+ + + + + + + + +
+ + + + + + + + + + + +
 
  
+
+ + + + + + + + + + + + +
  + + + + + +
+ + + +
+
+
+ + + + + + + + + + + + + +
  +

사용자 + 등록 확인

+
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
   
+
+

 

+ +<% + if ( ca_result == 0 ) { +%> + + + + + + + + + + + + + + + +
사용자<%=user_name%>
계좌번호<%=account%>
등록일<%=ca_client.getResponseFromRegUser("REGDATE")%>
등록번호<%=ca_client.getResponseFromRegUser("REGSERIAL")%>
사용자 ID<%=ca_client.getResponseFromRegUser("USERID")%>
주민등록번호<%=ca_client.getResponseFromRegUser("SSN")%>
사용자 이름<%=ca_client.getResponseFromRegUser("USERNAME")%>
참조코드<%=ca_client.getResponseFromRegUser("REFCODE")%>
인가코드<%=ca_client.getResponseFromRegUser("AUTHCODE")%>
인증서 용도<%=ca_client.getResponseFromRegUser("CERTTYPE")%>
인증서 등급<%=ca_client.getResponseFromRegUser("CERTCLASS")%>
CORP CORE<%=ca_client.getResponseFromRegUser("CORPCODE")%>
+
+<%=request.getParameter("user_name")%>'님의 사용자 정보가 XecureCA 인증기관에 등록 되었습니다.
+
이제 '확인' 버튼을 누르시면 XecureCA 공인인증기관으로 부터 인증서를 발급받을 수 있습니다.

+

+
+ + + +




+공개키 알고리즘
+ + +
+<% } + else { +%> +

사용자 등록에 실패했습니다.

+에러 코드 : <%=ca_client.getLastError()%>
+에러 메시지 : <%=ca_client.getLastErrorMsg()%>
+xecConfig.getXecureCaHost() : <%= xecConfig.getXecureCaHost()%>
+xecConfig.getXecureCaPort() : <%= xecConfig.getXecureCaPort()%>
+ +<% } +%> +
+
   +

 

+
   
   +

 

+
   
   
+
  
+
+
+ +  
+ + diff --git a/src/main/webapp/AnySign4PC/test/ibs/xecureca_cert/user_regist.jsp b/src/main/webapp/AnySign4PC/test/ibs/xecureca_cert/user_regist.jsp new file mode 100644 index 00000000..dd50a453 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/ibs/xecureca_cert/user_regist.jsp @@ -0,0 +1,328 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<%@ page import="java.util.Calendar" %> + +<% +response.setHeader("Cache-Control","no-store"); +response.setHeader("Pragma", "no-cache"); +response.setDateHeader("Expires", 0); +%> + +<% + String []nameList = {"자신", "남편", "부인", "딸램", "아들", "막내", "장남", "장녀", + "차녀", "차남", "엄마", "아빠", "형님", "언니", "누나", "오빠", "동생", + "할아버지", "할머니", "큰아버지", "큰어머니", "삼촌", "사촌", + "매부", "매재", "매형", "제수", "제부", "고모", "고모부", + "이모", "이모부", "아저씨", "조카"}; + + java.util.Random aRandom = null; + + aRandom = (java.util.Random)application.getAttribute ("xwup.ibs.random"); + if (aRandom == null) + { + aRandom = new java.util.Random (); + application.setAttribute ("xwup.ibs.random", aRandom); + } +%> +<% + String commandType = request.getParameter("commandType"); + String targetRA = request.getParameter ("targetRA"); + String operaterId = "internet"; + String user_policy_type = request.getParameter("user_policy_type") ; + String company_name = request.getParameter("company_name"); + String user_name = request.getParameter("user_name"); + String cert_type = request.getParameter("cert_type"); + String cert_class = request.getParameter("cert_class"); + String corp_code = request.getParameter("corp_code"); + + String org_code = request.getParameter("org_code"); + String orgid_code = request.getParameter("orgid_code"); + + String position = request.getParameter("position"); + String foreigner_id_num = request.getParameter("foreigner_id_num"); + String reg_master_num = request.getParameter("reg_master_num"); + String executive_num = request.getParameter("executive_num"); + String publicOrPrivate = request.getParameter("user_public_or_private"); + + String ext3 = request.getParameter("ext3"); + + int ca_result = 0; + XecureConfig xconf = new XecureConfig (); + XecureCA ca_client = null; + String ip = null; + int port = -1; + int caType = -1; + int caRMPType = -1; +%> + +<% + ip = xconf.getXecureCaHost (); + port = xconf.getXecureCaPort (); + + if (targetRA != null) + { + if (targetRA.equalsIgnoreCase ("1024")) /* 1024 XecureCA Information */ + { + ip = "192.168.0.26"; + port = 29210; + caType = 2; + caRMPType = 2; + } + else if (targetRA.equalsIgnoreCase ("2048")) /* 2048 XecureCA Information */ + { + if (publicOrPrivate.equals("yessignmpki")) { + ip = "192.168.0.43"; + port = 5301; + caType = 2; + caRMPType = 1; + } else { + ip = "192.168.0.4"; + port = 21200; + caType = 2; + caRMPType = 2; + } + } + } + + ca_client = new XecureCA (xconf, ip, port, caType, caRMPType); + + + if (org_code == null) + org_code = ""; + if (orgid_code == null) + orgid_code = ""; + if (corp_code == null) + corp_code = "0000"; + if (cert_class == null) + cert_class = "0000"; + if (cert_type == null) + cert_type = "0000"; + + + if (commandType != null && commandType.equalsIgnoreCase ("update")) + { + boolean isError = false; + if (user_policy_type == null) + isError = true; + + if (user_name == null) + isError = true; + + if (isError) + { +%> +({"code":"-1" +"reason":"no policy or user_name or ssn" +"moreinformation":""}) +<% + return; + } + + } + + if (user_policy_type == null) + { + user_policy_type = "104"; + } + + if (user_name == null || user_name.length () == 0) + { + user_name = nameList [aRandom.nextInt (nameList.length)]; + if (targetRA.equalsIgnoreCase("2048")) + { + while (user_name.length() < 4) + { + user_name = nameList [aRandom.nextInt (nameList.length)]; + } + } + } + else + user_name = new String(user_name.getBytes("iso8859-1"), "utf-8"); + + String euser_name = request.getParameter("euser_name"); + String user_id = request.getParameter("user_id"); + String ssn = request.getParameter("ssn"); + + String policy_type ; + String user_type; + + user_type = user_policy_type.substring(0, 1); + + if( user_type.equals("1") ) + { + if (ssn == null || ssn.length () == 0) + { + StringBuffer aBuffer = new StringBuffer (); + Calendar aCalendar = Calendar.getInstance (); + String aSSNTail = null; + aSSNTail = String.valueOf (aRandom.nextInt (2999999)); + + aBuffer.append (String.valueOf (aCalendar.get(Calendar.YEAR)).substring (2)); + + if (aCalendar.get(Calendar.MONTH) < 10) + aBuffer.append ("0"); + aBuffer.append (String.valueOf (aCalendar.get(Calendar.MONTH))); + + if (aCalendar.get(Calendar.DAY_OF_MONTH) < 10) + aBuffer.append ("0"); + aBuffer.append (String.valueOf (aCalendar.get(Calendar.DAY_OF_MONTH))); + + + if (aSSNTail.length () < 7) + { + for (int aIter = 0; aIter < 7 - aSSNTail.length (); ++aIter) + { + aBuffer.append ("0"); + } + } + aBuffer.append (aSSNTail); + + ssn = aBuffer.toString (); + + } + if (user_id == null) + user_id = ssn; + + policy_type = user_policy_type.substring(1,3); + user_id = policy_type + ssn.charAt(5) + user_id; + } + else if ( user_type.equals("2") ) + { + if (ssn == null || ssn.length () == 0) + { + StringBuffer aBuffer = new StringBuffer (); + String aSSNTail = null; + aSSNTail = "2" + String.valueOf (aRandom.nextInt (999999999)); + + if (aSSNTail.length () < 10) + { + for (int aIter = 0; aIter < 10 - aSSNTail.length (); ++aIter) + { + aBuffer.append ("0"); + } + } + aBuffer.append (aSSNTail); + + ssn = aBuffer.toString (); + } + + if (company_name == null) + company_name = ssn; + if (euser_name == null) + euser_name = ssn; + if (user_id == null) + user_id = ssn; + + policy_type = user_policy_type.substring(1,3); + user_id = policy_type + ssn.charAt(8) + user_id; + } + else + policy_type = user_policy_type.substring(1,2); + + String email = "dont email me"; + String cell_phone = "dont call me"; + String fax = "dont fax me"; + String zipcode = "127-311"; + String address = "dogok dong house"; + String phone = "02-526-8000"; + String czipcode = "127-311"; + String caddress = "dogok dong"; + String cphone = "02-526-8000"; + + +%> +({"ssn":"<%=ssn%>", +"name":"<%=user_name%>", +<% + + if (commandType == null || commandType.equalsIgnoreCase ("new")) + { + ca_result = ca_client.registerNewUser (operaterId, + user_type, + company_name, + user_name, + user_id, + ssn, + policy_type, + email, + cell_phone, + fax, + zipcode, + address, + phone, + czipcode, + caddress, + cphone, + cert_type, + cert_class, + corp_code, + org_code, + orgid_code, + position, + foreigner_id_num, + reg_master_num, + executive_num, + ext3); + } + else if (commandType.equalsIgnoreCase ("rereg")) + { + ca_result = ca_client.registerReNewUser (operaterId, + user_type, + company_name, + user_name, + user_id, + ssn, + policy_type, + email, + cell_phone, + fax, + zipcode, + address, + phone, + czipcode, + caddress, + cphone, + cert_type, + cert_class, + corp_code, + org_code, + orgid_code, + position, + foreigner_id_num, + reg_master_num, + executive_num, + ext3, + 0); + } + else if (commandType.equalsIgnoreCase ("update")) + { +%> +"code":"none", +"reason":"XecureCA does not support registration for UPDATE", +"moreinformation":"CA IP:<%=ip + ", CA Port:" + port%>" +}) +<% + return; + + } + if ( ca_result == 0 ) { +%> +"code":"0", +"regdate":"<%=ca_client.getResponseFromRegUser("REGDATE")%>", +"regserial":"<%=ca_client.getResponseFromRegUser("REGSERIAL")%>", +"userid":"<%=ca_client.getResponseFromRegUser("USERID")%>", +"refcode":"<%=ca_client.getResponseFromRegUser("REFCODE")%>", +"authcode":"<%=ca_client.getResponseFromRegUser("AUTHCODE")%>" +<% } + else + { +%> +"code":"<%=ca_client.getLastError()%>", +"reason":"<%=ca_client.getLastErrorMsg()%>", +"moreinformation":"CA IP:<%=ip + ", CA Port:" + port %>" +<% } +%> +}) diff --git a/src/main/webapp/AnySign4PC/test/installAnySign.jsp b/src/main/webapp/AnySign4PC/test/installAnySign.jsp new file mode 100644 index 00000000..f41eaa9c --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/installAnySign.jsp @@ -0,0 +1,207 @@ + +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.security.*" %> +<%@ page import="java.util.Random" %> + + + + + + + + + + + +

AnySign4PC 설치 정보

+ + ++ + + + + + + + + + + + + + + + + + + + + + +
보안 프로그램 설치 다운로드
프로그램명내용설치현황설치관리
AnySignForPCNon-ActiveX 공인인증서 전자서명을 지원해주는 프로그램입니다.
확인중..
+

+

+

+
    +
  • 운영 시스템(OS) :
  • +
  • 웹브라우저 :
  • +
  • 필요 모듈버전 :
  • + +
+
+

+ + + + + diff --git a/src/main/webapp/AnySign4PC/test/sign_result.jsp b/src/main/webapp/AnySign4PC/test/sign_result.jsp new file mode 100644 index 00000000..322ac956 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/sign_result.jsp @@ -0,0 +1,64 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> + +<% + XecureConfig aXecureConfig = new XecureConfig (); + SignVerifier verifier = null; + + StringBuffer aResponse = new StringBuffer (); +%> + +<% + String sm = request.getParameter("SIGNED"); + String vm = request.getParameter("VID"); + + if (sm != null && sm.substring(0, 4).equalsIgnoreCase("3082")) + { + /* Hex encoded Data */ + verifier = new SignVerifier (aXecureConfig , sm, 0); + } + else + { + /* Base64 encoded Data */ + verifier = new SignVerifier (aXecureConfig , sm, 1); + System.out.println ("base64:" + sm); + } + + aResponse.append ("({"); + aResponse.append ("code:\"" + verifier.getLastError () + "\","); + aResponse.append ("reason:\"" + verifier.getLastErrorMsg () + "\","); + + if (verifier.getLastError() == 0) + { + aResponse.append ("plain:\"" + verifier.getVerifiedMsg_Text () + "\","); + aResponse.append ("certificatePEM:\"" + verifier.getSignerCertificate().getCertPem ().replaceAll ("\n", "") + "\","); + aResponse.append ("subjectRDN:\"" + verifier.getSignerCertificate().getSubject () + "\","); + } + else + { + } + + if (vm != null) + { + + VidVerifier vid = new VidVerifier (aXecureConfig); + + vid.virtualIDVerifyS(vm, verifier.getSignerCertificate().getCertPem()); + + aResponse.append ("vidCode:\"" + vid.getLastError () + "\","); + aResponse.append ("vidReason:\"" + vid.getLastErrorMsg () + "\","); + + if( vid.getLastError () == 0) { + aResponse.append ("vidIDNumber:\"" + vid.getIdn () + "\","); + aResponse.append ("vidRealName:\"" + vid.getRealName () + "\","); + } + } + + aResponse.append ("base:\"\""); + aResponse.append ("})"); + out.println (aResponse.toString ()); +%> + diff --git a/src/main/webapp/AnySign4PC/test/sign_result1.jsp b/src/main/webapp/AnySign4PC/test/sign_result1.jsp new file mode 100644 index 00000000..c12e293e --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/sign_result1.jsp @@ -0,0 +1,138 @@ + +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<% + //out.println(java.nio.charset.Charset.defaultCharset().name()); + request.setCharacterEncoding("UTF-8"); + response.setContentType("text/html; charset=UTF-8"); + String aCharset = "UTF-8"; + + XecureConfig aXecureConfig = new XecureConfig (); + SignVerifier verifier = null; + + String aResult = request.getParameter("aResult"); + int aErrCode = 0; + String aErrReason = ""; + String aPlain = ""; + String aPlainHex = ""; + String aCertificate = ""; + String aSubjectRDN = ""; + + String aUserID = ""; + String aRealID = ""; + String aSerial = ""; + + String operatoId = "internet"; + String corp_code = "0000"; + + String ip = "192.168.60.60"; + int port = 30000; + int caType = 2; + int caRMPType = 2; + XecureCA ca = new XecureCA (aXecureConfig, ip, port, caType, caRMPType); + + SplitSign aSplitSign = new SplitSign(aXecureConfig); + String aRequestPlain = request.getParameter("aPlain"); + byte[] aPlainByte = null; + String aSignedData = ""; + + String[] aOptions = request.getParameterValues("aOption"); + int aOption = 0; + for (int i = 0; aOptions !=null && i < aOptions.length; i++) + { + aOption += Integer.parseInt(aOptions[i]); + } + + /* 분리 서명 검증 시 */ + if ((aOption & 0x100) == 0 && (aOption & 0x200) == 0x200 && (aOption & 0x1000) == 0x1000) + { + aPlainByte = aRequestPlain.getBytes(aCharset); + aSignedData = aSplitSign.merge(aResult, aPlainByte); + if (aSplitSign.getLastError() != 0) + { + aErrCode = aSplitSign.getLastError(); + aErrReason = aSplitSign.getLastErrorMsg(); + out.println ("분리 서명 데이터 오류
"); + out.println ("Error Code: " + aErrCode + "
"); + out.println ("Error Reason: " + aErrReason + "
"); + return; + } + + aResult = aSignedData; + } + + if (aResult == null || aResult.equals("")) + { + aErrCode = -1; + aErrReason = "invalid parameter"; + } + else if (aResult.length() < 10) + { + aErrCode = -1; + aErrReason = "invalid parameter (short)"; + } + else + { + if (aResult.substring(0, 4).equalsIgnoreCase("3082")) + { + /* Hex encoded Data */ + verifier = new SignVerifier (aXecureConfig , aResult, aCharset, 0); + } + else + { + /* Base64 encoded Data */ + verifier = new SignVerifier (aXecureConfig , aResult, aCharset, 1); + } + + if (verifier.getLastError() != 0) + { + aErrCode = verifier.getLastError(); + aErrReason = verifier.getLastErrorMsg(); + } + else + { + aPlain = verifier.getVerifiedMsg_Text(); + aCertificate = verifier.getSignerCertificate().getCertPem().replaceAll ("\n", ""); + aSubjectRDN = verifier.getSignerCertificate().getSubject(); + aSerial = verifier.getSignerCertificate().getSerial(); + + + + if(aPlain != null) { + byte[] buf = verifier.getVerifiedMsg(); + String tmp = ""; + + for (int i = 0; i < buf.length; i++) + { + tmp = Integer.toHexString(0xFF & buf[i]); + if (tmp.length() == 1) tmp = "0" + tmp; + aPlainHex += tmp; + } + } + } + + } +%> + + + + + + + +

서명값 검증 결과

+
    +
  • 오류 코드: <%=aErrCode%> +
  • 오류 메세지: <%=aErrReason%> +
  • 서명 원문: <%=aPlain%> +
  • 서명 원문(Hex): <%=aPlainHex%> +
  • User ID: <%=aUserID%> +
  • Real ID: <%=aRealID%> +
  • 서명 인증서 주체: <%=aSubjectRDN%> +
  • 서명 인증서:
    +
+ + diff --git a/src/main/webapp/AnySign4PC/test/sign_result1_euckr.jsp b/src/main/webapp/AnySign4PC/test/sign_result1_euckr.jsp new file mode 100644 index 00000000..b02d2f72 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/sign_result1_euckr.jsp @@ -0,0 +1,142 @@ + +<%@ page language="java" contentType="text/html; charset=euc-kr" pageEncoding="euc-kr"%> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<% + //out.println(java.nio.charset.Charset.defaultCharset().name()); + request.setCharacterEncoding("euc-kr"); + response.setContentType("text/html; charset=euc-kr"); + String aCharset = "euc-kr"; + + XecureConfig aXecureConfig = new XecureConfig (); + SignVerifier verifier = null; + + String aResult = request.getParameter("aResult"); + int aErrCode = 0; + String aErrReason = ""; + String aPlain = ""; + String aPlainHex = ""; + String aCertificate = ""; + String aSubjectRDN = ""; + + String aUserID = ""; + String aRealID = ""; + String aSerial = ""; + + String operatoId = "internet"; + String corp_code = "0000"; + + String ip = "192.168.60.60"; + int port = 30000; + int caType = 2; + int caRMPType = 2; + XecureCA ca = new XecureCA (aXecureConfig, ip, port, caType, caRMPType); + + SplitSign aSplitSign = new SplitSign(aXecureConfig); + String aRequestPlain = request.getParameter("aPlain"); + byte[] aPlainByte = null; + String aSignedData = ""; + + String[] aOptions = request.getParameterValues("aOption"); + int aOption = 0; + for (int i = 0; aOptions !=null && i < aOptions.length; i++) + { + aOption += Integer.parseInt(aOptions[i]); + } + + /* и */ + if ((aOption & 0x100) == 0 && (aOption & 0x200) == 0x200 && (aOption & 0x1000) == 0x1000) + { + aPlainByte = aRequestPlain.getBytes(aCharset); + aSignedData = aSplitSign.merge(aResult, aPlainByte); + if (aSplitSign.getLastError() != 0) + { + aErrCode = aSplitSign.getLastError(); + aErrReason = aSplitSign.getLastErrorMsg(); + out.println ("и
"); + out.println ("Error Code: " + aErrCode + "
"); + out.println ("Error Reason: " + aErrReason + "
"); + return; + } + + aResult = aSignedData; + } + + if (aResult == null || aResult.equals("")) + { + aErrCode = -1; + aErrReason = "invalid parameter"; + } + else if (aResult.length() < 10) + { + aErrCode = -1; + aErrReason = "invalid parameter (short)"; + } + else + { + if (aResult.substring(0, 4).equalsIgnoreCase("3082")) + { + /* Hex encoded Data */ + verifier = new SignVerifier (aXecureConfig , aResult, aCharset, 0); + } + else + { + /* Base64 encoded Data */ + verifier = new SignVerifier (aXecureConfig , aResult, aCharset, 1); + } + + if (verifier != null && verifier.getLastError() != 0) + { + aErrCode = verifier.getLastError(); + aErrReason = verifier.getLastErrorMsg(); + } + else + { + aPlain = verifier.getVerifiedMsg_Text(); + aCertificate = verifier.getSignerCertificate().getCertPem().replaceAll ("\n", ""); + aSubjectRDN = verifier.getSignerCertificate().getSubject(); + aSerial = verifier.getSignerCertificate().getSerial(); + + int result = ca.viewCertificateWithRealUserId(operatoId,aSerial,corp_code); + if(result ==1){ + aUserID = (String)ca.getResponseFromCertView("USERID",1); + aRealID = (String)ca.getResponseFromCertView("REALID",1); + } + + if(aPlain != null) { + byte[] buf = verifier.getVerifiedMsg(); + String tmp = ""; + + for (int i = 0; i < buf.length; i++) + { + tmp = Integer.toHexString(0xFF & buf[i]); + if (tmp.length() == 1) tmp = "0" + tmp; + aPlainHex += tmp; + } + } + } + + } +%> + + + + + + + +

+
    +
  • ڵ: <%=aErrCode%> +
  • ޼: <%=aErrReason%> +
  • : <%=aPlain%> +
  • (Hex): <%=aPlainHex%> +
  • User ID: <%=aUserID%> +
  • Real ID: <%=aRealID%> +
  • ü: <%=aSubjectRDN%> +
  • :
    +
+ + diff --git a/src/main/webapp/AnySign4PC/test/sign_result2.jsp b/src/main/webapp/AnySign4PC/test/sign_result2.jsp new file mode 100644 index 00000000..92a0e06f --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/sign_result2.jsp @@ -0,0 +1,157 @@ + +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<% + //out.println(java.nio.charset.Charset.defaultCharset().name()); + request.setCharacterEncoding("UTF-8"); + response.setContentType("text/html; charset=UTF-8"); + String aCharset = "UTF-8"; + + XecureConfig aXecureConfig = new XecureConfig (); + MultiSignVerifier verifier = null; + + String aResult = request.getParameter("aResult2"); + int aErrCode = 0; + String aErrReason = ""; + String aPlain = ""; + String aPlainHex = ""; + String aCertificate = ""; + String aSubjectRDN = ""; + int aSignerNum = 0; + + String aUserID = ""; + String aRealID = ""; + String aSerial = ""; + + String operatoId = "internet"; + String corp_code = "0000"; + + String ip = "192.168.60.60"; + int port = 30000; + int caType = 2; + int caRMPType = 2; + XecureCA ca = new XecureCA (aXecureConfig, ip, port, caType, caRMPType); + + SplitSign aSplitSign = new SplitSign(aXecureConfig); + String aRequestPlain = request.getParameter("aPlain"); + byte[] aPlainByte = null; + String aSignedData = ""; + + String[] aOptions = request.getParameterValues("aOption"); + int aOption = 0; + for (int i = 0; aOptions !=null && i < aOptions.length; i++) + { + aOption += Integer.parseInt(aOptions[i]); + } + + /* 분리 서명 검증 시 */ + if ((aOption & 0x100) == 0 && (aOption & 0x200) == 0x200 && (aOption & 0x1000) == 0x1000) + { + aPlainByte = aRequestPlain.getBytes(aCharset); + aSignedData = aSplitSign.merge(aResult, aPlainByte); + if (aSplitSign.getLastError() != 0) + { + aErrCode = aSplitSign.getLastError(); + aErrReason = aSplitSign.getLastErrorMsg(); + out.println ("분리 서명 데이터 오류
"); + out.println ("Error Code: " + aErrCode + "
"); + out.println ("Error Reason: " + aErrReason + "
"); + return; + } + + aResult = aSignedData; + } + + if (aResult == null || aResult.equals("")) + { + aErrCode = -1; + aErrReason = "invalid parameter"; + } + else if (aResult.length() < 10) + { + aErrCode = -1; + aErrReason = "invalid parameter (short)"; + } + else + { + if (aResult.substring(0, 4).equalsIgnoreCase("3082")) + { + /* Hex encoded Data */ + verifier = new MultiSignVerifier (aXecureConfig , aResult, aCharset); + } + else + { + /* Base64 encoded Data */ + verifier = new MultiSignVerifier (aXecureConfig , aResult, aCharset); + } + + if (verifier != null && verifier.getLastError() != 0) + { + aErrCode = verifier.getLastError(); + aErrReason = verifier.getLastErrorMsg(); + } + else + { + // 서명 원문 + aPlain = verifier.getVerifiedMsg_Text(); + + // 서명 원문(Hex) + if(aPlain != null) { + byte[] buf = verifier.getVerifiedMsg(); + String tmp = ""; + for (int i = 0; i < buf.length; i++) + { + tmp = Integer.toHexString(0xFF & buf[i]); + if (tmp.length() == 1) tmp = "0" + tmp; + aPlainHex += tmp; + } + } + + // 서명 인증서 + aSignerNum = verifier.getNumberOfSigner(); + } + } +%> + + + + + + + +

서명값 검증 결과

+
    +
  • 오류 코드: <%=aErrCode%> +
  • 오류 메세지: <%=aErrReason%> +
  • 서명 원문: <%=aPlain%> +
  • 서명 원문(Hex): <%=aPlainHex%> +
  • 서명자 수: <%=aSignerNum%> +<% + for (int i = 0; i < aSignerNum; i++) + { + aCertificate = verifier.getSignerCertificate(i).getCertPem().replaceAll ("\n", ""); + aSubjectRDN = verifier.getSignerCertificate(i).getSubject(); + aSerial = verifier.getSignerCertificate(i).getSerial(); + + int result = ca.viewCertificateWithRealUserId(operatoId,aSerial,corp_code); + if(result ==1){ + aUserID = (String)ca.getResponseFromCertView("USERID",1); + aRealID = (String)ca.getResponseFromCertView("REALID",1); + } else { + aUserID = ""; + aRealID = ""; + } +%> +
  • User ID: <%=aUserID%> +
  • Real ID: <%=aRealID%> +
  • 서명 인증서 [<%=i+1%>]: <%=aSubjectRDN%> +
    +<% + } +%> +
+ + diff --git a/src/main/webapp/AnySign4PC/test/sign_result2_euckr.jsp b/src/main/webapp/AnySign4PC/test/sign_result2_euckr.jsp new file mode 100644 index 00000000..55860042 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/sign_result2_euckr.jsp @@ -0,0 +1,157 @@ + +<%@ page language="java" contentType="text/html; charset=euc-kr" pageEncoding="euc-kr"%> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<% + //out.println(java.nio.charset.Charset.defaultCharset().name()); + request.setCharacterEncoding("euc-kr"); + response.setContentType("text/html; charset=euc-kr"); + String aCharset = "euc-kr"; + + XecureConfig aXecureConfig = new XecureConfig (); + MultiSignVerifier verifier = null; + + String aResult = request.getParameter("aResult2"); + int aErrCode = 0; + String aErrReason = ""; + String aPlain = ""; + String aPlainHex = ""; + String aCertificate = ""; + String aSubjectRDN = ""; + int aSignerNum = 0; + + String aUserID = ""; + String aRealID = ""; + String serial = ""; + + String operatoId = "internet"; + String corp_code = "0000"; + + String ip = "192.168.60.60"; + int port = 30000; + int caType = 2; + int caRMPType = 2; + XecureCA ca = new XecureCA (aXecureConfig, ip, port, caType, caRMPType); + + SplitSign aSplitSign = new SplitSign(aXecureConfig); + String aRequestPlain = request.getParameter("aPlain"); + byte[] aPlainByte = null; + String aSignedData = ""; + + String[] aOptions = request.getParameterValues("aOption"); + int aOption = 0; + for (int i = 0; aOptions !=null && i < aOptions.length; i++) + { + aOption += Integer.parseInt(aOptions[i]); + } + + /* и */ + if ((aOption & 0x100) == 0 && (aOption & 0x200) == 0x200 && (aOption & 0x1000) == 0x1000) + { + aPlainByte = aRequestPlain.getBytes(aCharset); + aSignedData = aSplitSign.merge(aResult, aPlainByte); + if (aSplitSign.getLastError() != 0) + { + aErrCode = aSplitSign.getLastError(); + aErrReason = aSplitSign.getLastErrorMsg(); + out.println ("и
"); + out.println ("Error Code: " + aErrCode + "
"); + out.println ("Error Reason: " + aErrReason + "
"); + return; + } + + aResult = aSignedData; + } + + if (aResult == null || aResult.equals("")) + { + aErrCode = -1; + aErrReason = "invalid parameter"; + } + else if (aResult.length() < 10) + { + aErrCode = -1; + aErrReason = "invalid parameter (short)"; + } + else + { + if (aResult.substring(0, 4).equalsIgnoreCase("3082")) + { + /* Hex encoded Data */ + verifier = new MultiSignVerifier (aXecureConfig , aResult, aCharset); + } + else + { + /* Base64 encoded Data */ + verifier = new MultiSignVerifier (aXecureConfig , aResult, aCharset); + } + + if (verifier != null && verifier.getLastError() != 0) + { + aErrCode = verifier.getLastError(); + aErrReason = verifier.getLastErrorMsg(); + } + else + { + // + aPlain = verifier.getVerifiedMsg_Text(); + + // (Hex) + if(aPlain != null) { + byte[] buf = verifier.getVerifiedMsg(); + String tmp = ""; + for (int i = 0; i < buf.length; i++) + { + tmp = Integer.toHexString(0xFF & buf[i]); + if (tmp.length() == 1) tmp = "0" + tmp; + aPlainHex += tmp; + } + } + + // + aSignerNum = verifier.getNumberOfSigner(); + } + } +%> + + + + + + + +

+
    +
  • ڵ: <%=aErrCode%> +
  • ޼: <%=aErrReason%> +
  • : <%=aPlain%> +
  • (Hex): <%=aPlainHex%> +
  • : <%=aSignerNum%> +<% + for (int i = 0; i < aSignerNum; i++) + { + aCertificate = verifier.getSignerCertificate(i).getCertPem().replaceAll ("\n", ""); + aSubjectRDN = verifier.getSignerCertificate(i).getSubject(); + aSerial = verifier.getSignerCertificate(i).getSerial(); + + int result = ca.viewCertificateWithRealUserId(operatoId,aSerial,corp_code); + if(result ==1){ + aUserID = (String)ca.getResponseFromCertView("USERID",1); + aRealID = (String)ca.getResponseFromCertView("REALID",1); + } else { + aUserID = ""; + aRealID = ""; + } +%> +
  • User ID: <%=aUserID%> +
  • Real ID: <%=aRealID%> +
  • [<%=i+1%>]: <%=aSubjectRDN%> +
    +<% + } +%> +
+ + diff --git a/src/main/webapp/AnySign4PC/test/sign_result3.jsp b/src/main/webapp/AnySign4PC/test/sign_result3.jsp new file mode 100644 index 00000000..4bc490d2 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/sign_result3.jsp @@ -0,0 +1,208 @@ + +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<% + //out.println(java.nio.charset.Charset.defaultCharset().name()); + request.setCharacterEncoding("UTF-8"); + response.setContentType("text/html; charset=utf-8"); + String aCharset = "UTF-8"; + + XecureConfig aXecureConfig = new XecureConfig (); + MultiSignVerifier verifier = null; + + String aSignedMsg1 = request.getParameter("aResult"); + String aSignedMsg2 = request.getParameter("aResult2"); + String aSignedMsg = request.getParameter("aSignedMsg"); + int aErrCode = 0; + String aErrReason = ""; + String aPlain = ""; + String aPlainHex = ""; + String aCertificate = ""; + String aSubjectRDN = ""; + int aSignerNum = 0; + + if (aSignedMsg1 != null && aSignedMsg1.length() > 0) + { + aSignedMsg = aSignedMsg1; + } + else if (aSignedMsg2 != null && aSignedMsg2.length() > 0) + { + aSignedMsg = aSignedMsg2; + } + + SplitSign aSplitSign = new SplitSign(aXecureConfig); + String aRequestPlain = request.getParameter("aPlain"); + byte[] aPlainByte = null; + String aSignedData = ""; + + String[] aOptions = request.getParameterValues("aOption"); + int aOption = 0; + for (int i = 0; aOptions !=null && i < aOptions.length; i++) + { + aOption += Integer.parseInt(aOptions[i]); + } + + /* 분리 서명 검증 시 */ + if ((aOption & 0x100) == 0 && (aOption & 0x200) == 0x200 && (aOption & 0x1000) == 0x1000) + { + aPlainByte = aRequestPlain.getBytes(aCharset); + aSignedData = aSplitSign.merge(aSignedMsg, aPlainByte); + if (aSplitSign.getLastError() != 0) + { + aErrCode = aSplitSign.getLastError(); + aErrReason = aSplitSign.getLastErrorMsg(); + out.println ("분리 서명 데이터 오류
"); + out.println ("Error Code: " + aErrCode + "
"); + out.println ("Error Reason: " + aErrReason + "
"); + return; + } + + aSignedMsg = aSignedData; + } + + if (aSignedMsg == null || aSignedMsg.equals("")) + { + aErrCode = -1; + aErrReason = "invalid parameter"; + } + else if (aSignedMsg.length() < 10) + { + aErrCode = -1; + aErrReason = "invalid parameter (short)"; + } + else + { + if (aSignedMsg.substring(0, 4).equalsIgnoreCase("3082")) + { + /* Hex encoded Data */ + verifier = new MultiSignVerifier (aXecureConfig , aSignedMsg, aCharset); + } + else + { + /* Base64 encoded Data */ + verifier = new MultiSignVerifier (aXecureConfig , aSignedMsg, aCharset); + } + + if (verifier != null && verifier.getLastError() != 0) + { + aErrCode = verifier.getLastError(); + aErrReason = verifier.getLastErrorMsg(); + } + else + { + // 서명 원문 + aPlain = verifier.getVerifiedMsg_Text(); + + // 서명 원문(Hex) + if(aPlain != null) { + byte[] buf = verifier.getVerifiedMsg(); + String tmp = ""; + for (int i = 0; i < buf.length; i++) + { + tmp = Integer.toHexString(0xFF & buf[i]); + if (tmp.length() == 1) tmp = "0" + tmp; + aPlainHex += tmp; + } + } + + // 서명 인증서 + aSignerNum = verifier.getNumberOfSigner(); + } + + } + + /* 식별번호 검증 */ + VidVerifier vid = null; + + String aVidMsg = request.getParameter("aVidMsg"); + String aServerIdn = request.getParameter("aServerIdn"); + int aIsVid = 0; + int aVidErrCode = 0; + String aVidErrReason = ""; + int aVidCertNum = 0; + String aVidCertSubjectRDN = ""; + String aIdn = ""; + String aRealName = ""; + + if (aVidMsg != null && aVidMsg.length() > 0 && aSignerNum > 0) + { + aIsVid = 1; + vid = new VidVerifier(aXecureConfig); + + for (int i = 0; i < aSignerNum; i++) + { + if (aServerIdn != null && aServerIdn.length() > 0) + { + // 서버측에서 식별번호 입력 시 사용 + vid.virtualIDVerifyS(aVidMsg, verifier.getSignerCertificate(i).getCertPem(), aServerIdn); + aIdn = "(서버에서 입력)"; + } + else + { + vid.virtualIDVerifyS(aVidMsg, verifier.getSignerCertificate(i).getCertPem()); + } + + if (vid != null && vid.getLastError() == 0) + { + aVidCertNum = i; + aVidCertSubjectRDN = verifier.getSignerCertificate(i).getSubject(); + aIdn += vid.getIdn(); + aRealName = vid.getRealName(); + break; + } + } + + if (vid != null && vid.getLastError() != 0) + { + aVidErrCode = vid.getLastError(); + aVidErrReason = vid.getLastErrorMsg(); + } + } +%> + + + + + + + +

서명값 검증 결과

+
    +
  • 서명값:
    +
  • 오류 코드: <%=aErrCode%> +
  • 오류 메세지: <%=aErrReason%> +
  • 서명 원문: <%=aPlain%> +
  • 서명 원문(Hex): <%=aPlainHex%> +
  • 서명자 수: <%=aSignerNum%> +<% + for (int i = 0; i < aSignerNum; i++) + { + aCertificate = verifier.getSignerCertificate(i).getCertPem().replaceAll ("\n", ""); + aSubjectRDN = verifier.getSignerCertificate(i).getSubject(); +%> +
  • 서명 인증서 [<%=i+1%>]: <%=aSubjectRDN%> +
    +<% + } +%> +
+<% + if (aIsVid == 1) { +%> +

식별번호 검증 결과

+
    +
  • 암호화된 VID:
    +
  • 오류 코드: <%=aVidErrCode%> +
  • 오류 메세지: <%=aVidErrReason%> +
  • 인증서 [<%=aVidCertNum+1%>]: <%=aVidCertSubjectRDN%> +
  • 주민등록번호(사업자 등록번호): <%=aIdn%> +
  • 사용자 실명: <%=aRealName%> +
+<% + } +%> + + \ No newline at end of file diff --git a/src/main/webapp/AnySign4PC/test/sign_result3_euckr.jsp b/src/main/webapp/AnySign4PC/test/sign_result3_euckr.jsp new file mode 100644 index 00000000..27ae075a --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/sign_result3_euckr.jsp @@ -0,0 +1,208 @@ + +<%@ page language="java" contentType="text/html; charset=euc-kr" pageEncoding="euc-kr"%> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<% + //out.println(java.nio.charset.Charset.defaultCharset().name()); + request.setCharacterEncoding("euc-kr"); + response.setContentType("text/html; charset=euc-kr"); + String aCharset = "euc-kr"; + + XecureConfig aXecureConfig = new XecureConfig (); + MultiSignVerifier verifier = null; + + String aSignedMsg1 = request.getParameter("aResult"); + String aSignedMsg2 = request.getParameter("aResult2"); + String aSignedMsg = request.getParameter("aSignedMsg"); + int aErrCode = 0; + String aErrReason = ""; + String aPlain = ""; + String aPlainHex = ""; + String aCertificate = ""; + String aSubjectRDN = ""; + int aSignerNum = 0; + + if (aSignedMsg1 != null && aSignedMsg1.length() > 0) + { + aSignedMsg = aSignedMsg1; + } + else if (aSignedMsg2 != null && aSignedMsg2.length() > 0) + { + aSignedMsg = aSignedMsg2; + } + + SplitSign aSplitSign = new SplitSign(aXecureConfig); + String aRequestPlain = request.getParameter("aPlain"); + byte[] aPlainByte = null; + String aSignedData = ""; + + String[] aOptions = request.getParameterValues("aOption"); + int aOption = 0; + for (int i = 0; aOptions !=null && i < aOptions.length; i++) + { + aOption += Integer.parseInt(aOptions[i]); + } + + /* и */ + if ((aOption & 0x100) == 0 && (aOption & 0x200) == 0x200 && (aOption & 0x1000) == 0x1000) + { + aPlainByte = aRequestPlain.getBytes(aCharset); + aSignedData = aSplitSign.merge(aSignedMsg, aPlainByte); + if (aSplitSign.getLastError() != 0) + { + aErrCode = aSplitSign.getLastError(); + aErrReason = aSplitSign.getLastErrorMsg(); + out.println ("и
"); + out.println ("Error Code: " + aErrCode + "
"); + out.println ("Error Reason: " + aErrReason + "
"); + return; + } + + aSignedMsg = aSignedData; + } + + if (aSignedMsg == null || aSignedMsg.equals("")) + { + aErrCode = -1; + aErrReason = "invalid parameter"; + } + else if (aSignedMsg.length() < 10) + { + aErrCode = -1; + aErrReason = "invalid parameter (short)"; + } + else + { + if (aSignedMsg.substring(0, 4).equalsIgnoreCase("3082")) + { + /* Hex encoded Data */ + verifier = new MultiSignVerifier (aXecureConfig , aSignedMsg, aCharset); + } + else + { + /* Base64 encoded Data */ + verifier = new MultiSignVerifier (aXecureConfig , aSignedMsg, aCharset); + } + + if (verifier != null && verifier.getLastError() != 0) + { + aErrCode = verifier.getLastError(); + aErrReason = verifier.getLastErrorMsg(); + } + else + { + // + aPlain = verifier.getVerifiedMsg_Text(); + + // (Hex) + if(aPlain != null) { + byte[] buf = verifier.getVerifiedMsg(); + String tmp = ""; + for (int i = 0; i < buf.length; i++) + { + tmp = Integer.toHexString(0xFF & buf[i]); + if (tmp.length() == 1) tmp = "0" + tmp; + aPlainHex += tmp; + } + } + + // + aSignerNum = verifier.getNumberOfSigner(); + } + + } + + /* ĺȣ */ + VidVerifier vid = null; + + String aVidMsg = request.getParameter("aVidMsg"); + String aServerIdn = request.getParameter("aServerIdn"); + int aIsVid = 0; + int aVidErrCode = 0; + String aVidErrReason = ""; + int aVidCertNum = 0; + String aVidCertSubjectRDN = ""; + String aIdn = ""; + String aRealName = ""; + + if (aVidMsg != null && aVidMsg.length() > 0 && aSignerNum > 0) + { + aIsVid = 1; + vid = new VidVerifier(aXecureConfig); + + for (int i = 0; i < aSignerNum; i++) + { + if (aServerIdn != null && aServerIdn.length() > 0) + { + // ĺȣ Է + vid.virtualIDVerifyS(aVidMsg, verifier.getSignerCertificate(i).getCertPem(), aServerIdn); + aIdn = "( Է)"; + } + else + { + vid.virtualIDVerifyS(aVidMsg, verifier.getSignerCertificate(i).getCertPem()); + } + + if (vid != null && vid.getLastError() == 0) + { + aVidCertNum = i; + aVidCertSubjectRDN = verifier.getSignerCertificate(i).getSubject(); + aIdn += vid.getIdn(); + aRealName = vid.getRealName(); + break; + } + } + + if (vid != null && vid.getLastError() != 0) + { + aVidErrCode = vid.getLastError(); + aVidErrReason = vid.getLastErrorMsg(); + } + } +%> + + + + + + + +

+
    +
  • :
    +
  • ڵ: <%=aErrCode%> +
  • ޼: <%=aErrReason%> +
  • : <%=aPlain%> +
  • (Hex): <%=aPlainHex%> +
  • : <%=aSignerNum%> +<% + for (int i = 0; i < aSignerNum; i++) + { + aCertificate = verifier.getSignerCertificate(i).getCertPem().replaceAll ("\n", ""); + aSubjectRDN = verifier.getSignerCertificate(i).getSubject(); +%> +
  • [<%=i+1%>]: <%=aSubjectRDN%> +
    +<% + } +%> +
+<% + if (aIsVid == 1) { +%> +

ĺȣ

+
    +
  • ȣȭ VID:
    +
  • ڵ: <%=aVidErrCode%> +
  • ޼: <%=aVidErrReason%> +
  • [<%=aVidCertNum+1%>]: <%=aVidCertSubjectRDN%> +
  • ֹεϹȣ( Ϲȣ): <%=aIdn%> +
  • Ǹ: <%=aRealName%> +
+<% + } +%> + + \ No newline at end of file diff --git a/src/main/webapp/AnySign4PC/test/sign_result4.jsp b/src/main/webapp/AnySign4PC/test/sign_result4.jsp new file mode 100644 index 00000000..73d10b5a --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/sign_result4.jsp @@ -0,0 +1,58 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> + +<% + //out.println(java.nio.charset.Charset.defaultCharset().name()); + request.setCharacterEncoding("UTF-8"); + response.setContentType("text/html; charset=utf-8"); + String aCharset = "UTF-8"; + + XecureConfig aXecureConfig = new XecureConfig (); + MultiSignVerifier verifier = null; + + StringBuffer aResponse = new StringBuffer (); +%> + +<% + String sm = request.getParameter("SIGNED"); + String vm = request.getParameter("VID"); + + verifier = new MultiSignVerifier (aXecureConfig , sm, aCharset); + + aResponse.append ("({"); + aResponse.append ("code:\"" + verifier.getLastError () + "\","); + aResponse.append ("reason:\"" + verifier.getLastErrorMsg () + "\","); + + if (verifier.getLastError() == 0) + { + aResponse.append ("plain:\"" + verifier.getVerifiedMsg_Text () + "\","); + aResponse.append ("certificatePEM:\"" + verifier.getSignerCertificate(0).getCertPem ().replaceAll ("\n", "") + "\","); + aResponse.append ("subjectRDN:\"" + verifier.getSignerCertificate(0).getSubject () + "\","); + } + else + { + } + + if (vm != null) + { + + VidVerifier vid = new VidVerifier (aXecureConfig); + + vid.virtualIDVerifyS(vm, verifier.getSignerCertificate(0).getCertPem()); + + aResponse.append ("vidCode:\"" + vid.getLastError () + "\","); + aResponse.append ("vidReason:\"" + vid.getLastErrorMsg () + "\","); + + if( vid.getLastError () == 0) { + aResponse.append ("vidIDNumber:\"" + vid.getIdn () + "\","); + aResponse.append ("vidRealName:\"" + vid.getRealName () + "\","); + } + } + + aResponse.append ("base:\"\""); + aResponse.append ("})"); + out.println (aResponse.toString ()); +%> diff --git a/src/main/webapp/AnySign4PC/test/sign_result4_euckr.jsp b/src/main/webapp/AnySign4PC/test/sign_result4_euckr.jsp new file mode 100644 index 00000000..f971feea --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/sign_result4_euckr.jsp @@ -0,0 +1,58 @@ +<%@ page contentType="text/html; charset=euc-kr" %> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> + +<% + //out.println(java.nio.charset.Charset.defaultCharset().name()); + request.setCharacterEncoding("euc-kr"); + response.setContentType("text/html; charset=euc-kr"); + String aCharset = "euc-kr"; + + XecureConfig aXecureConfig = new XecureConfig (); + MultiSignVerifier verifier = null; + + StringBuffer aResponse = new StringBuffer (); +%> + +<% + String sm = request.getParameter("SIGNED"); + String vm = request.getParameter("VID"); + + verifier = new MultiSignVerifier (aXecureConfig , sm, aCharset); + + aResponse.append ("({"); + aResponse.append ("code:\"" + verifier.getLastError () + "\","); + aResponse.append ("reason:\"" + verifier.getLastErrorMsg () + "\","); + + if (verifier.getLastError() == 0) + { + aResponse.append ("plain:\"" + verifier.getVerifiedMsg_Text () + "\","); + aResponse.append ("certificatePEM:\"" + verifier.getSignerCertificate(0).getCertPem ().replaceAll ("\n", "") + "\","); + aResponse.append ("subjectRDN:\"" + verifier.getSignerCertificate(0).getSubject () + "\","); + } + else + { + } + + if (vm != null) + { + + VidVerifier vid = new VidVerifier (aXecureConfig); + + vid.virtualIDVerifyS(vm, verifier.getSignerCertificate(0).getCertPem()); + + aResponse.append ("vidCode:\"" + vid.getLastError () + "\","); + aResponse.append ("vidReason:\"" + vid.getLastErrorMsg () + "\","); + + if( vid.getLastError () == 0) { + aResponse.append ("vidIDNumber:\"" + vid.getIdn () + "\","); + aResponse.append ("vidRealName:\"" + vid.getRealName () + "\","); + } + } + + aResponse.append ("base:\"\""); + aResponse.append ("})"); + out.println (aResponse.toString ()); +%> diff --git a/src/main/webapp/AnySign4PC/test/sign_result_euckr.jsp b/src/main/webapp/AnySign4PC/test/sign_result_euckr.jsp new file mode 100644 index 00000000..af33a7d8 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/sign_result_euckr.jsp @@ -0,0 +1,64 @@ +<%@ page contentType="text/html; charset=euc-kr" %> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> + +<% + XecureConfig aXecureConfig = new XecureConfig (); + SignVerifier verifier = null; + + StringBuffer aResponse = new StringBuffer (); +%> + +<% + String sm = request.getParameter("SIGNED"); + String vm = request.getParameter("VID"); + + if (sm != null && sm.substring(0, 4).equalsIgnoreCase("3082")) + { + /* Hex encoded Data */ + verifier = new SignVerifier (aXecureConfig , sm, 0); + } + else + { + /* Base64 encoded Data */ + verifier = new SignVerifier (aXecureConfig , sm, 1); + System.out.println ("base64:" + sm); + } + + aResponse.append ("({"); + aResponse.append ("code:\"" + verifier.getLastError () + "\","); + aResponse.append ("reason:\"" + verifier.getLastErrorMsg () + "\","); + + if (verifier.getLastError() == 0) + { + aResponse.append ("plain:\"" + verifier.getVerifiedMsg_Text () + "\","); + aResponse.append ("certificatePEM:\"" + verifier.getSignerCertificate().getCertPem ().replaceAll ("\n", "") + "\","); + aResponse.append ("subjectRDN:\"" + verifier.getSignerCertificate().getSubject () + "\","); + } + else + { + } + + if (vm != null) + { + + VidVerifier vid = new VidVerifier (aXecureConfig); + + vid.virtualIDVerifyS(vm, verifier.getSignerCertificate().getCertPem()); + + aResponse.append ("vidCode:\"" + vid.getLastError () + "\","); + aResponse.append ("vidReason:\"" + vid.getLastErrorMsg () + "\","); + + if( vid.getLastError () == 0) { + aResponse.append ("vidIDNumber:\"" + vid.getIdn () + "\","); + aResponse.append ("vidRealName:\"" + vid.getRealName () + "\","); + } + } + + aResponse.append ("base:\"\""); + aResponse.append ("})"); + out.println (aResponse.toString ()); +%> + diff --git a/src/main/webapp/AnySign4PC/test/sign_vid_result.jsp b/src/main/webapp/AnySign4PC/test/sign_vid_result.jsp new file mode 100644 index 00000000..bcbe9d46 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/sign_vid_result.jsp @@ -0,0 +1,297 @@ + +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<% + request.setCharacterEncoding("utf-8"); + XecureConfig aXecureConfig = new XecureConfig (System.getProperty("user.home") + "/XecureConf/xecure_servlet.conf"); + SignVerifier verifier = new SignVerifier (aXecureConfig, request.getParameter("aSignedMsg"), "utf-8"); +%> + + + + +서명 검증 결과 + + + + + +
+ + + + + + + + +
+

 

+

 

+ + + + + + + + +
+ + + + + + + + + + + +
 
  
+
+ + + + + + + + + + + + +
  + + + + + +
+
+
+ + +
+
+
+ + + + + + + + + + + + + +
  +

WebBrowser로부터 입력받은 결과입니다.

+
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  
   +

 

+
+ + + + + + + + + + + + + + + + + + + +<% + if ( nVerifierResult == 0 ) { +%> + + + + + + + + + + + + + + +<% + } else { + +%> + + + + + +<% + } +%> + + + +
Decrypted Request 'aPlain' : +
+<%=request.getParameter("aPlain") %>
+
+
Decrypted Request 'aSignedMsg' : +
+<%
+	
+	String sm = request.getParameter("aSignedMsg"); 
+	int i;
+	for ( i = 0; i < sm.length(); i+=80 ) {
+		if ( i + 80 < sm.length() ) 
+			out.println ( sm.substring( i, i+80 ) );
+		else
+			out.println ( sm.substring( i, sm.length() ));
+	}
+%>
+
+
'aVidMsg' : +
+<%
+	
+	String vm = request.getParameter("aVidMsg");
+	//out.println(vm);
+	
+	for ( i = 0; i < vm.length(); i+=80 ) {
+		if ( i + 80 < vm.length() ) 
+			out.println ( vm.substring( i, i+80 ) );
+		else
+			out.println ( vm.substring( i, vm.length() ));
+	}
+	
+%>
+
+
서명 검증 결과 +<% + int nVerifierResult = verifier.getLastError(); + if ( nVerifierResult != 0 ) { + out.println("서명문에 문제가 있습니다.
"); + out.println("오류 번호 : " + verifier.getLastError() + "
"); + } + else { + out.println("서명 확인 성공
"); + } +%> +
서명 메시지 원본 +
+<%=verifier.getVerifiedMsg_Text()%>
+
+
서명자 인증서 +
+<%=verifier.getSignerCertificate().getCertPem()%>
+
+
서명자 인증서 DN +
+1 <%=verifier.getSignerCertificate().getSubject()%>
+2 <%=verifier.getSignerCertificate().getSubject("cn")%>
+3 <%=verifier.getSignerCertificate().getIssuer("cn")%>
+4 <%=verifier.getSignerCertificate().getIssuer("o")%>
+5 <%=verifier.getSignerCertificate().getIssuer("ou")%>
+
+
오류메세지 +
+<%=verifier.getLastErrorMsg()%>
+
+
식별번호검증결과 +
+<%
+	VidVerifier vid = new VidVerifier (aXecureConfig);
+	
+	vid.virtualIDVerifyS(vm, verifier.getSignerCertificate().getCertPem());
+	//vid.virtualIDVerifyS(vm, "0");
+	
+	int	nResult = vid.getLastError();
+	if( nResult != 0) {
+		out.println("식별번호 검증에 문제가 있습니다.
"); + out.println("오류번호 : " + vid.getLastError() + "
"); + out.println("오류메세지: " + vid.getLastErrorMsg() + "
"); + + } + else { + out.println("식별번호 검증 성공
"); + out.println("주민등록번호(사업자 등록번호) : " + vid.getIdn() + "
"); + out.println("사용자 실명 : " + vid.getRealName() + "
"); + } + +%> +
+
+ + +
   +

 

+
   
   
   
+
  
+
+
+ +  
+ + diff --git a/src/main/webapp/AnySign4PC/test/sign_with_vid.jsp b/src/main/webapp/AnySign4PC/test/sign_with_vid.jsp new file mode 100644 index 00000000..70a2a03c --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/sign_with_vid.jsp @@ -0,0 +1,357 @@ + +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ page buffer="16kb"%> +<%@ page import="xecure.servlet.*"%> +<%@ page import="xecure.crypto.*"%> +<%@ page import="java.io.*"%> + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + +
  + + + + + +
+

SignDataWithVID

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aPlain
aOption + (공통 옵션)
+ + 0 : 기본 서명
+ + 1 : 서명확인창을 보여준다.
+ + 8 : WEB(aIdn)으로 부터 직접 VID를 입력받는다 (VID입력창 뜨지 않음)
+ + 16 : IDN값을 입력받지 않는다 ""로 IDN대체 (VID입력창을 띄우지 않음)
+
aIdn
aDescription
aLimitPassword
Run + + +
Output + +
VID Output + +
전송 +
+
+ +

SignDataWithVID_Serial

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputaXgateAddress
aCAList
aSerial
aLocation
aIdn
aPlain
aOption + (공통 옵션)
+ + 0 : 기본 서명
+ + 1 : 서명확인창을 보여준다.
+ + 8 : WEB(aIdn)으로 부터 직접 VID를 입력받는다 (VID입력창 뜨지 않음)
+ + 16 : IDN값을 입력받지 않는다 ""로 대체 (VID입력창 뜨지 않음)
+
aDescription
aLimitPassword
Run + + +
Output + +
Vid Output + +
전송 +
+
+ +
+ +
+
+
+ + diff --git a/src/main/webapp/AnySign4PC/test/signfileinfo/cert/signCert.der b/src/main/webapp/AnySign4PC/test/signfileinfo/cert/signCert.der new file mode 100644 index 0000000000000000000000000000000000000000..ce7e67fa6c67a9c71bc81a919855a68e0f3c840e GIT binary patch literal 1457 zcmXqLVqI&{#4>dOGZP~d6SJLek^wIpr&gOs+jm|@Ms8LHgK$G`15P&PP!={}rtBg^ z0Ruh|hl_{3GPSrkGd<5x)Ib;{!p+0un4Dacnvz+Pn&RweC~qJO5@zNRgDP}()D1~3 zE>UpKNh~f_Ff@=8=QT7oFf}qVG&KN%C@|N|$k@=t)Y8;4%AkOd#Uchm5R17BQj3c7 z^AdARJe>@M3LV^JYtrhNgjmrGbHoG0*`fKpQQ9 z?l3knXkt`C_B|sj19KB2KLb#li>Zl`k)h{MM*03M+X6?8$#1^SsT9?#|QyVg$OE@G%Lb3Mm|C~Y3kjj4)Gw=S+#Diz(d>*&jhRT^QL$qD)_ z0x}DwHwyjV;g#qw@lW7St`dXVhwZ6$tepkE*}uM9G0xiXUiWYFOODN=d`F&^?}&OK zf3JLp%#1sX?bmK!zJFS?_)GVH4U$+591ZN*xWMiL zNiiB20z;59q0NIam6?T!ae)$x!t|8Xv*A;J9`F47WS<2;^E?axcNGhdJd-+qc{#C`1iFkqr$}1I9K5JON~7VrFQBoEd>d z5im0{G9*i@ztdlQp>~7Q$_+Ut^Ila8oL^=T!WkP;_~E@rNs#KU58+o{n49}2-kYOn zv%5N9H0x(qiB?jHkDB_?l$PK1a#1Tj*hF(l{uQ{>?%pl?UvKt2-G!$)InF;ju=Pw_ z+1+2a!wf}PJ}|fbKlm_ub>~@I{=(bg?YE*NFV2oypr${M{qxlJ;H>kjOs+wKev SdYvKT<2Tz~sJ)Z>*arZJT=_8o literal 0 HcmV?d00001 diff --git a/src/main/webapp/AnySign4PC/test/signfileinfo/cert/signPri.key b/src/main/webapp/AnySign4PC/test/signfileinfo/cert/signPri.key new file mode 100644 index 0000000000000000000000000000000000000000..93e484115dadb3b4a11af7aa7caadc6f45ce227b GIT binary patch literal 1300 zcmV+v1?&1Sf&~yT8U_d|gBpyQL;(*l4g?5hTi~I!q=mWy0tf&Ef&}oxq$o0XR}UUt z-d}bdI^4TbC2MdH1|#{#s>QZ!_q};ACR5yoR=`!uK*Z2gPX_W0=)>-5^NIa68N3yU zgK3cmERK#^$6eR3IvXKo-tBkH93!V!D4C&Px>Fyg@f?^7EwB1SHykYUgb z+_#adx5BY>*FVm5NEz{ie@oW{%q^2!QGytCbMVJUa!6~|Ln0_j9PML4saEWnk)3dF zWV`QS{LKf=-BR6GBWhHlO{Ybb{v_1&AYVAgJRu}`CQ88zEhCzY)=5-F(PN(L4t9O%R` zm#?vSeV<26!gFK}sMP!M&-GtAslA>=U%mTXT!bTfvb)Yj}Y0_uLx_^ zty)%LBseMJ*-|(f9M|G_)KT%DE#vU}4Ods<-E!2%CM@I%=R$TBzz1P|y%bdzUpeB0 z+RtRxUFK95`JpV_b56Tv+qhKs?H94U9Bz z@{py4d5yw4o7?Ktz%6{@*HjrfW@ZKiH{-^KaCTDE<9goilEQ|K?6Fu8^}UacX9w4+ zsqQSUo7eK>FZMMw+1eaMm_M41h}bGZ7Zg*GHFe<<`a)i{)_wYgyVy6%pgDJH>wYdf zdM%pB3J(8Pi+})LiJ7vfrg3xy{Rabyo-FHrzC0x%$2#D?RKp&41j`w9!TCfvlT zV2m(5Di?R^a`p?fw2z$o$9KCEhppas)7yUbV_$?s}BOP zJuQj0XXxSh;pDufsETd=Y8WI|L)#v)65_cGm%^FZG4-`28M7grjB%u^D%Csz7CF>b zrRPo=aRocPq$26V<}KOs;whcTJngH%7(maucnyO#&}V&w7A^%n-3noS?AdFQY-aA# z78RXUq5A1jRcROy$B}3WLbIEDyAWk|q(azQm7IXkJKPz_)+{V#`@jzI-B_yeoczX1 zm1zn&2H^PV2_&>|jQBNlGvp*cjE4sGQ~4bX zS~v%eN9%&3|GG?~%IBTXRd`CE+A1ci>z^5l7(F$1pR^FA5&EmSX~Dwe{P0BMGk5t1 KwzFr^(mH39iH6ny literal 0 HcmV?d00001 diff --git a/src/main/webapp/AnySign4PC/test/signfileinfo/test.txt b/src/main/webapp/AnySign4PC/test/signfileinfo/test.txt new file mode 100644 index 00000000..f15f9fe4 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/signfileinfo/test.txt @@ -0,0 +1,4 @@ +테스트 파일 : test.txt +테스트 파일 : test.txt +테스트 파일 : test.txt +테스트 파일 : test.txt diff --git a/src/main/webapp/AnySign4PC/test/signfileinfo/test1.txt b/src/main/webapp/AnySign4PC/test/signfileinfo/test1.txt new file mode 100644 index 00000000..be240c40 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/signfileinfo/test1.txt @@ -0,0 +1,4 @@ +테스트 파일 : test1.txt +테스트 파일 : test1.txt +테스트 파일 : test1.txt +테스트 파일 : test1.txt diff --git a/src/main/webapp/AnySign4PC/test/signfileinfo/test2.txt b/src/main/webapp/AnySign4PC/test/signfileinfo/test2.txt new file mode 100644 index 00000000..d1fe9486 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/signfileinfo/test2.txt @@ -0,0 +1,4 @@ +테스트 파일 : test2.txt +테스트 파일 : test2.txt +테스트 파일 : test2.txt +테스트 파일 : test2.txt diff --git a/src/main/webapp/AnySign4PC/test/signfileinfo/test3.txt b/src/main/webapp/AnySign4PC/test/signfileinfo/test3.txt new file mode 100644 index 00000000..2a38514c --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/signfileinfo/test3.txt @@ -0,0 +1,4 @@ +테스트 파일 : test3.txt +테스트 파일 : test3.txt +테스트 파일 : test3.txt +테스트 파일 : test3.txt diff --git a/src/main/webapp/AnySign4PC/test/signfileinfo_client.jsp b/src/main/webapp/AnySign4PC/test/signfileinfo_client.jsp new file mode 100644 index 00000000..3950cdb0 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/signfileinfo_client.jsp @@ -0,0 +1,1361 @@ + +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ page import="java.io.*" %> +<%@ page import="java.util.*" %> +<%@ page import="java.text.SimpleDateFormat" %> +<%@ page import="java.security.MessageDigest" %> +<%@ page import="java.security.Provider" %> +<%@ page import="java.security.NoSuchAlgorithmException" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<% + int cnt = 0; + String tmpStr = ""; + + // 서명 대상 파일 경로 + String strFilePath = "/signfileinfo/test.txt"; + String strFilePath_1 = "/signfileinfo/test1.txt"; + String strFilePath_2 = "/signfileinfo/test2.txt"; + String strFilePath_3 = "/signfileinfo/test3.txt"; + + // 해쉬 알고리즘명 + String strAlgNameSha1 = "SHA1"; + String strAlgNameSha256 = "SHA256"; + + // 클라이언트 전달 변수 + String strFileInfo = ""; + String strFileHash = ""; + String strMultiFileInfo = ""; + String strMultiFileHash = ""; + + //----------------------------------------------------------------------------- + // file 0 + //----------------------------------------------------------------------------- + + // 서명 대상 파일명 추출 + cnt = 0; + tmpStr = strFilePath; + while(true){ + cnt = tmpStr.indexOf("/"); + if(cnt == -1) break; + tmpStr = tmpStr.substring(cnt+1); + } + while(true){ + cnt = tmpStr.indexOf("\\"); + if(cnt == -1) break; + tmpStr = tmpStr.substring(cnt+1); + } + String strFileName = tmpStr; + + String strFileDate = ""; + String strDigestSha1 = ""; + String strDigestSha256 = ""; + + // 파일 확인 + File f = new File(strFilePath); + if(!f.isFile()) { + out.println("File0 Not Found"); + return; + } + + //----------------------------------------------------------------------------- + // 1. 파일 -> 바이트 변환 + RandomAccessFile afile = new RandomAccessFile(strFilePath, "r"); + byte[] bytes = new byte[(int)afile.length()]; + afile.read(bytes); + afile.close(); + + //----------------------------------------------------------------------------- + // 2. 파일 마지막 수정 날짜 확인 + File file = new File(strFilePath); + Date date = new Date(file.lastModified()); + + SimpleDateFormat sdf = new SimpleDateFormat("yyMMddhhmmss"); + strFileDate = sdf.format(date); + + //----------------------------------------------------------------------------- + // 3. 파일 해쉬값 생성 + // 1) SHA-1 + XWMessageDigest xwmdSha1 = XWMessageDigest.getInstance("SHA-1"); + if(xwmdSha1 == null) + { + out.println("> not support algorithm."); + return; + } + byte[] bDigestSha1 = xwmdSha1.digest(bytes); + strDigestSha1 = Cipher.toHexString(bDigestSha1); + + // 2) SHA-256 + XWMessageDigest xwmdSha2 = XWMessageDigest.getInstance("SHA-256"); + if(xwmdSha2 == null) + { + out.println("> not support algorithm."); + return; + } + byte[] bDigestSha2 = xwmdSha2.digest(bytes); + strDigestSha256 = Cipher.toHexString(bDigestSha2); + + //----------------------------------------------------------------------------- + // file 1 + //----------------------------------------------------------------------------- + + // 서명 대상 파일명 추출 + cnt = 0; + tmpStr = strFilePath_1; + while(true){ + cnt = tmpStr.indexOf("/"); + if(cnt == -1) break; + tmpStr = tmpStr.substring(cnt+1); + } + while(true){ + cnt = tmpStr.indexOf("\\"); + if(cnt == -1) break; + tmpStr = tmpStr.substring(cnt+1); + } + String strFileName_1 = tmpStr; + + String strFileDate_1 = ""; + String strDigestSha1_1 = ""; + String strDigestSha256_1 = ""; + + // 파일 확인 + File f_1 = new File(strFilePath_1); + if(!f_1.isFile()) { + out.println("File1 Not Found"); + return; + } + + //----------------------------------------------------------------------------- + // 1. 파일 -> 바이트 변환 + RandomAccessFile afile_1 = new RandomAccessFile(strFilePath_1, "r"); + byte[] bytes_1 = new byte[(int)afile_1.length()]; + afile_1.read(bytes_1); + afile_1.close(); + + //----------------------------------------------------------------------------- + // 2. 파일 마지막 수정 날짜 확인 + File file_1 = new File(strFilePath_1); + Date date_1 = new Date(file_1.lastModified()); + + SimpleDateFormat sdf_1 = new SimpleDateFormat("yyMMddhhmmss"); + strFileDate_1 = sdf_1.format(date_1); + + //----------------------------------------------------------------------------- + // 3. 파일 해쉬값 생성 + // 1) SHA-1 + XWMessageDigest xwmdSha1_1 = XWMessageDigest.getInstance("SHA-1"); + if(xwmdSha1_1 == null) + { + out.println("> not support algorithm."); + return; + } + byte[] bDigestSha1_1 = xwmdSha1_1.digest(bytes_1); + strDigestSha1_1 = Cipher.toHexString(bDigestSha1_1); + + // 2) SHA-256 + XWMessageDigest xwmdSha2_1 = XWMessageDigest.getInstance("SHA-256"); + if(xwmdSha2_1 == null) + { + out.println("> not support algorithm."); + return; + } + byte[] bDigestSha2_1 = xwmdSha2_1.digest(bytes_1); + strDigestSha256_1 = Cipher.toHexString(bDigestSha2_1); + + //----------------------------------------------------------------------------- + // file 2 + //----------------------------------------------------------------------------- + + // 서명 대상 파일명 추출 + cnt = 0; + tmpStr = strFilePath_2; + while(true){ + cnt = tmpStr.indexOf("/"); + if(cnt == -1) break; + tmpStr = tmpStr.substring(cnt+1); + } + while(true){ + cnt = tmpStr.indexOf("\\"); + if(cnt == -1) break; + tmpStr = tmpStr.substring(cnt+1); + } + String strFileName_2 = tmpStr; + + String strFileDate_2 = ""; + String strDigestSha1_2 = ""; + String strDigestSha256_2 = ""; + + // 파일 확인 + File f_2 = new File(strFilePath_2); + if(!f_2.isFile()) { + out.println("File2 Not Found"); + return; + } + + //----------------------------------------------------------------------------- + // 1. 파일 -> 바이트 변환 + RandomAccessFile afile_2 = new RandomAccessFile(strFilePath_2, "r"); + byte[] bytes_2 = new byte[(int)afile_2.length()]; + afile_2.read(bytes_2); + afile_2.close(); + + //----------------------------------------------------------------------------- + // 2. 파일 마지막 수정 날짜 확인 + File file_2 = new File(strFilePath_2); + Date date_2 = new Date(file_2.lastModified()); + + SimpleDateFormat sdf_2 = new SimpleDateFormat("yyMMddhhmmss"); + strFileDate_2 = sdf_2.format(date_2); + + //----------------------------------------------------------------------------- + // 3. 파일 해쉬값 생성 + // 1) SHA-1 + XWMessageDigest xwmdSha1_2 = XWMessageDigest.getInstance("SHA-1"); + if(xwmdSha1_2 == null) + { + out.println("> not support algorithm."); + return; + } + byte[] bDigestSha1_2 = xwmdSha1_2.digest(bytes_2); + strDigestSha1_2 = Cipher.toHexString(bDigestSha1_2); + + // 2) SHA-256 + XWMessageDigest xwmdSha2_2 = XWMessageDigest.getInstance("SHA-256"); + if(xwmdSha2_2 == null) + { + out.println("> not support algorithm."); + return; + } + byte[] bDigestSha2_2 = xwmdSha2_2.digest(bytes_2); + strDigestSha256_2 = Cipher.toHexString(bDigestSha2_2); + + //----------------------------------------------------------------------------- + // file 3 + //----------------------------------------------------------------------------- + + // 서명 대상 파일명 추출 + cnt = 0; + tmpStr = strFilePath_3; + while(true){ + cnt = tmpStr.indexOf("/"); + if(cnt == -1) break; + tmpStr = tmpStr.substring(cnt+1); + } + while(true){ + cnt = tmpStr.indexOf("\\"); + if(cnt == -1) break; + tmpStr = tmpStr.substring(cnt+1); + } + String strFileName_3 = tmpStr; + + String strFileDate_3 = ""; + String strDigestSha1_3 = ""; + String strDigestSha256_3 = ""; + + // 파일 확인 + File f_3 = new File(strFilePath_3); + if(!f_3.isFile()) { + out.println("File3 Not Found"); + return; + } + + //----------------------------------------------------------------------------- + // 1. 파일 -> 바이트 변환 + RandomAccessFile afile_3 = new RandomAccessFile(strFilePath_3, "r"); + byte[] bytes_3 = new byte[(int)afile_3.length()]; + afile_3.read(bytes_3); + afile_3.close(); + + //----------------------------------------------------------------------------- + // 2. 파일 마지막 수정 날짜 확인 + File file_3 = new File(strFilePath_3); + Date date_3 = new Date(file_3.lastModified()); + + SimpleDateFormat sdf_3 = new SimpleDateFormat("yyMMddhhmmss"); + strFileDate_3 = sdf_3.format(date_3); + + //----------------------------------------------------------------------------- + // 3. 파일 해쉬값 생성 + // 1) SHA-1 + XWMessageDigest xwmdSha1_3 = XWMessageDigest.getInstance("SHA-1"); + if(xwmdSha1_3 == null) + { + out.println("> not support algorithm."); + return; + } + byte[] bDigestSha1_3 = xwmdSha1_3.digest(bytes_3); + strDigestSha1_3 = Cipher.toHexString(bDigestSha1_3); + + // 2) SHA-256 + XWMessageDigest xwmdSha2_3 = XWMessageDigest.getInstance("SHA-256"); + if(xwmdSha2_3 == null) + { + out.println("> not support algorithm."); + return; + } + byte[] bDigestSha2_3 = xwmdSha2_3.digest(bytes_3); + strDigestSha256_3 = Cipher.toHexString(bDigestSha2_3); + + //----------------------------------------------------------------------------- + // 클라이언트에 파일 정보 전달 + //----------------------------------------------------------------------------- + strFileInfo = strFileName + "|" + strFileDate; + strFileHash = strAlgNameSha1 + "|" + strDigestSha1 + "$" + strAlgNameSha256 + "|" + strDigestSha256; + strMultiFileInfo = strFileName_1 + "|" + strFileDate_1 + "&" + + strFileName_2 + "|" + strFileDate_2 + "&" + + strFileName_3 + "|" + strFileDate_3 + "&"; + strMultiFileHash = strAlgNameSha1 + "|" + strDigestSha1_1 + "$" + strAlgNameSha256 + "|" + strDigestSha256_1 + "&" + + strAlgNameSha1 + "|" + strDigestSha1_2 + "$" + strAlgNameSha256 + "|" + strDigestSha256_2 + "&" + + strAlgNameSha1 + "|" + strDigestSha1_3 + "$" + strAlgNameSha256 + "|" + strDigestSha256_3 + "&"; +%> + + + + + + + + + + + + + + + + + + + + + + + +<% + out.println("

XecureWeb for Multi - SignFileInfo Test (Client)

"); + out.println("
"); + out.println("

1. Server 파일 해쉬값 생성

"); + + out.println("Server Input File Name: " + strFileName + "
"); + out.println("Last Modified Date:" + strFileDate + "
"); + out.println("XWMessageDigest(sha-1):" + strDigestSha1 + "
"); + out.println("XWMessageDigest(sha-256):" + strDigestSha256 + "
"); + + out.println("
"); + out.println("Server Input File Name: " + strFileName_1 + "
"); + out.println("Last Modified Date:" + strFileDate_1 + "
"); + out.println("XWMessageDigest(sha-1):" + strDigestSha1_1 + "
"); + out.println("XWMessageDigest(sha-256):" + strDigestSha256_1 + "
"); + + out.println("
"); + out.println("Server Input File Name: " + strFileName_2 + "
"); + out.println("Last Modified Date:" + strFileDate_2 + "
"); + out.println("XWMessageDigest(sha-1):" + strDigestSha1_2 + "
"); + out.println("XWMessageDigest(sha-256):" + strDigestSha256_2 + "
"); + + out.println("
"); + out.println("Server Input File Name: " + strFileName_3 + "
"); + out.println("Last Modified Date:" + strFileDate_3 + "
"); + out.println("XWMessageDigest(sha-1):" + strDigestSha1_3 + "
"); + out.println("XWMessageDigest(sha-256):" + strDigestSha256_3 + "
"); + + out.println("
"); +%> +
+ + + + + + + + + + + + + + + +
+
+
+ + + + + + +
+ + + + + +
+ +

2. Client 서명값 생성

+
+ + +

SignFileInfo

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputXgateAddress
aCAList
aFileInfo
aFileHash
aOption + + 0x00000000 : 기본 서명
+ + 0x00000001 : 서명확인창을 보여준다.
+ + 0x00000100 : 출력 값을 Base64로
+
aDescription
aLimitPassword
Run + +
Output + +
Send + +
+
+
+ + + + +

SignFileInfoWithSerial

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputXgateAddress
aCAList
aSerial
aLocation
aFileInfo
aFileHash
aOption + + 0x00000000 : 기본 서명
+ + 0x00000001 : 서명확인창을 보여준다.
+ + 0x00000100 : 출력 값을 Base64로
+
aDescription
aLimitPassword
Run + +
Output + +
Send + +
+
+
+ + + + +

SignFileInfoWithVID

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputXgateAddress
aCAList
aIdn
aFileInfo
aFileHash
aOption + + 0x00000000 : 기본 서명
+ + 0x00000001 : 서명확인창을 보여준다.
+ + 0x00000008 : WEB(aIdn)으로 부터 직접 VID를 입력받는다 (VID입력창 뜨지 않음)
+ + 0x00000010 : IDN값을 입력받지 않는다 ""로 IDN대체 (VID입력창 뜨지 않음)
+ + 0x00000100 : 출력 값을 Base64로
+
aDescription
aLimitPassword
Run + +
Output + +
VID Output + +
Send + +
+
+
+ + + + +

SignFileInfoWithVID_Serial

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputXgateAddress
aCAList
aSerial
aLocation
aIdn
aFileInfo
aFileHash
aOption + + 0x00000000 : 기본 서명
+ + 0x00000001 : 서명확인창을 보여준다.
+ + 0x00000008 : WEB(aIdn)으로 부터 직접 VID를 입력받는다 (VID입력창 뜨지 않음)
+ + 0x00000010 : IDN값을 입력받지 않는다 ""로 IDN대체 (VID입력창 뜨지 않음)
+ + 0x00000100 : 출력 값을 Base64로
+
aDescription
aLimitPassword
Run + +
Output + +
VID Output + +
Send + +
+
+
+ + + +

MultiSignFileInfo

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputXgateAddress
aCAList
aTotal
aDelimiter
aFileInfo
aFileHash
aOption + + 0x00000000 : 기본 서명
+ + 0x00000001 : 서명확인창을 보여준다.
+ + 0x00000100 : 출력 값을 Base64로
+
aDescription
aLimitPassword
Run + +
Output + +
+
+
+ + + +

MultiSignFileInfoWithSerial

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputXgateAddress
aCAList
aSerial
aLocation
aTotal
aDelimiter
aFileInfo
aFileHash
aOption + + 0x00000000 : 기본 서명
+ + 0x00000001 : 서명확인창을 보여준다.
+ + 0x00000100 : 출력 값을 Base64로
+
aDescription
aLimitPassword
Run + +
Output + +
+
+
+ + + +

MultiSignFileInfoWithVID

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputXgateAddress
aCAList
aIdn
aTotal
aDelimiter
aFileInfo
aFileHash
aOption + + 0x00000000 : 기본 서명
+ + 0x00000001 : 서명확인창을 보여준다.
+ + 0x00000008 : WEB(aIdn)으로 부터 직접 VID를 입력받는다 (VID입력창 뜨지 않음)
+ + 0x00000010 : IDN값을 입력받지 않는다 ""로 IDN대체 (VID입력창 뜨지 않음)
+ + 0x00000100 : 출력 값을 Base64로
+
aDescription
aLimitPassword
Run + +
Output + +
VID Output + +
+
+
+ + + +

MultiSignFileInfoWithVID_Serial

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputXgateAddress
aCAList
aSerial
aLocation
aTotal
aDelimiter
aIdn
aFileInfo
aFileHash
aOption + + 0x00000000 : 기본 서명
+ + 0x00000001 : 서명확인창을 보여준다.
+ + 0x00000008 : WEB(aIdn)으로 부터 직접 VID를 입력받는다 (VID입력창 뜨지 않음)
+ + 0x00000010 : IDN값을 입력받지 않는다 ""로 IDN대체 (VID입력창 뜨지 않음)
+ + 0x00000100 : 출력 값을 Base64로
+
aDescription
aLimitPassword
Run + +
Output + +
VID Output + +
+
+
+ + +
+ +
+
+
+ + \ No newline at end of file diff --git a/src/main/webapp/AnySign4PC/test/signfileinfo_server.jsp b/src/main/webapp/AnySign4PC/test/signfileinfo_server.jsp new file mode 100644 index 00000000..dbf95478 --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/signfileinfo_server.jsp @@ -0,0 +1,135 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="xecure.crypto.jni.*" %> +<%@ page import="java.io.*" %> +<% + int err = 0; + String[] pemCerts = {}; + + // 서명 대상 파일 경로 + String strOrgFile = "/signfileinfo/test.txt"; + + // 1차 서명 파일을 저장할 경로 + String strSignFile = "/signfileinfo/test_1.sig"; + + // 2차 서명 파일을 저장할 경로 + String strSignFile2 = "/signfileinfo/test_2.sig"; + + // 2차 서명 인증서 정보 + File certpath = new File("/signfileinfo/cert/signCert.der"); + File keypath = new File("/signfileinfo/cert/signPri.key"); + String passwd = "qwer1234"; + + String signedData = request.getParameter("aSignedMsg"); + String vidMsg = request.getParameter("aVidMsg"); + + out.println("

XecureWeb for Multi - SignFileInfo Test (Server)

"); + + //----------------------------------------------------------------------------- + out.println("

1. 클라이언트 서명값

"); + if(signedData == null || signedData.length() == 0) { + out.println("invalid request"); + return; + } + out.println("Client Signed Data: " + signedData + "
"); + //----------------------------------------------------------------------------- + out.println("

2. 기존 서명 파일 삭제

"); + out.println("Delete File 1: " + strSignFile + "
"); + out.println("Delete File 2: " + strSignFile2 + "
"); + + File f1 = new File(strSignFile); + File f2 = new File(strSignFile2); + f1.delete(); + f2.delete(); + //----------------------------------------------------------------------------- + out.println("

3. 서명값 + 원본 파일 병합

"); + out.println("Original File Path: " + strOrgFile + "
"); + out.println("Merge File Path: " + strSignFile + "
"); + + XecureConfig xconfig = new XecureConfig(); + + SplitFileSign sfs = new SplitFileSign(xconfig); + byte[] bytes = new java.math.BigInteger(signedData, 16).toByteArray(); + err = sfs.merge(strSignFile, strOrgFile, bytes, pemCerts); + if (err != 0) + { + out.println("> SplitFileSign.merge error[" + sfs.getLastError() + "]"); + return; + } + out.println("> SplitFileSign.merge success
"); + //----------------------------------------------------------------------------- + out.println("

4. 병합된 서명 파일 검증

"); + out.println("Merge File Path: " + strSignFile + "
"); + + FileSignVerifier fsv = new FileSignVerifier(xconfig, strSignFile); + if (fsv.getLastError() != 0) + { + out.println("> FileSignVerifier error[" + fsv.getLastError() + "][" + fsv.getLastErrorMsg() + "]"); + return; + } + out.println("> FileSignVerifier success
"); + //----------------------------------------------------------------------------- + out.println("

5. 식별번호 검증

"); + if(vidMsg == null || vidMsg.length() == 0) { + out.println("> no input VID Data"); + } + else + { + out.println("Client VID Data: " + vidMsg + "
"); + + VidVerifier vv = new VidVerifier(xconfig); + //vv.virtualIDVerifyS(vidMsg, fsv.getSignerCertificate().getCertPem(), "1111112222222"); // 서버측에서 식별번호 입력 시 사용 + vv.virtualIDVerifyS(vidMsg, fsv.getSignerCertificate().getCertPem()); + if (vv.getLastError() != 0) + { + out.println("> VidVerifier error[" + vv.getLastError() + "][" + vv.getLastErrorMsg() + "]"); + return; + } + out.println("> VidVerifier success
"); + } + //----------------------------------------------------------------------------- + out.println("

6. 서버에서 파일 서명 (2차 서명)

"); + out.println("2nd Sign File path:" + strSignFile2 + "
"); + out.println("Cert File path:" + certpath + "
"); + out.println("Key File path:" + keypath + "
"); + out.println("Password:" + passwd + "
"); + + if (!certpath.exists() || !keypath.exists()) + { + out.println("> not exists Cert"); + return; + } + + RandomAccessFile fcert = new RandomAccessFile(certpath, "r"); + byte[] bpem = new byte[(int)fcert.length()]; + fcert.read(bpem); + fcert.close(); + + RandomAccessFile fkey = new RandomAccessFile(keypath, "r"); + byte[] bkey = new byte[(int)fkey.length()]; + fkey.read(bkey); + fkey.close(); + + byte[] bpasswd = passwd.getBytes(); + + FileSigner fs = new FileSigner(xconfig); + err = fs.signFileAddWithKey(bpem, bkey, bpasswd, strSignFile, strSignFile2); + if (err != 0) + { + out.println("> FileSigner.signFileAddWithKey error[" + fs.getLastError() + "]"); + return; + } + out.println("> FileSigner.signFileAddWithKey success"); + //----------------------------------------------------------------------------- + out.println("

7. 2차 서명 파일 검증

"); + out.println("2nd Sign File path:" + strSignFile2 + "
"); + + FileMultiSignVerifier fmsv = new FileMultiSignVerifier(xconfig, strSignFile2); + if (fmsv.getLastError() != 0) + { + out.println("> FileMultiSignVerifier error[" + fmsv.getLastError() + "]"); + return; + } + out.println("> FileMultiSignVerifier success"); +%> diff --git a/src/main/webapp/AnySign4PC/test/test.html b/src/main/webapp/AnySign4PC/test/test.html new file mode 100644 index 00000000..3db220eb --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/test.html @@ -0,0 +1,14 @@ + + + + New Document + + + + + + + + hello world + + diff --git a/src/main/webapp/AnySign4PC/test/user_regist_anypin.jsp b/src/main/webapp/AnySign4PC/test/user_regist_anypin.jsp new file mode 100644 index 00000000..36afe24f --- /dev/null +++ b/src/main/webapp/AnySign4PC/test/user_regist_anypin.jsp @@ -0,0 +1,373 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ page buffer="16kb" %> +<%@ page import="xecure.servlet.*" %> +<%@ page import="xecure.crypto.*" %> +<%@ page import="java.io.*" %> +<%@ page import="java.util.Calendar" %> + +<% +response.setHeader("Cache-Control","no-store"); +response.setHeader("Pragma", "no-cache"); +response.setDateHeader("Expires", 0); +%> + +<% + String []nameList = {"자신", "남편", "부인", "딸램", "아들", "막내", "장남", "장녀", + "차녀", "차남", "엄마", "아빠", "형님", "언니", "누나", "오빠", "동생", + "할아버지", "할머니", "큰아버지", "큰어머니", "삼촌", "사촌", + "매부", "매재", "매형", "제수", "제부", "고모", "고모부", + "이모", "이모부", "아저씨", "조카"}; + + java.util.Random aRandom = null; + + aRandom = (java.util.Random)application.getAttribute ("xwup.ibs.random"); + if (aRandom == null) + { + aRandom = new java.util.Random (); + application.setAttribute ("xwup.ibs.random", aRandom); + } +%> +<% + String commandType = request.getParameter("commandType"); + String targetRA = request.getParameter ("targetRA"); + String operaterId = "internet"; + String user_policy_type = request.getParameter("user_policy_type") ; + String company_name = request.getParameter("company_name"); + String user_name = request.getParameter("user_name"); + String cert_type = request.getParameter("cert_type"); + String cert_class = request.getParameter("cert_class"); + String corp_code = request.getParameter("corp_code"); + + String org_code = request.getParameter("org_code"); + String orgid_code = request.getParameter("orgid_code"); + + String position = request.getParameter("position"); + String foreigner_id_num = request.getParameter("foreigner_id_num"); + String reg_master_num = request.getParameter("reg_master_num"); + String executive_num = request.getParameter("executive_num"); + String publicOrPrivate = request.getParameter("user_public_or_private"); + + //String ext3 = request.getParameter("ext3"); + + int i; + int ca_result = 0; + XecureConfig xconf = new XecureConfig (); + XecureCA ca_client = null; + String ip = null; + int port = -1; + int caType = -1; + int caRMPType = -1; +%> + +<% + ip = xconf.getXecureCaHost (); + port = xconf.getXecureCaPort (); + + if (targetRA != null) + { + if (targetRA.equalsIgnoreCase ("1024")) /* 1024 XecureCA Information */ + { + ip = "192.168.0.26"; + port = 29210; + caType = 2; + caRMPType = 2; + } + else if (targetRA.equalsIgnoreCase ("2048")) /* 2048 XecureCA Information */ + { + if (publicOrPrivate.equals("yessignmpki")) { + ip = "192.168.0.43"; + port = 5301; + caType = 2; + caRMPType = 1; + } else { + //ip = "192.168.0.4"; + ip = "192.168.60.60"; + //port = 21200; + port = 30000; + caType = 2; + caRMPType = 2; + } + } + } + + ca_client = new XecureCA (xconf, ip, port, caType, caRMPType); + + + if (org_code == null) + org_code = ""; + if (orgid_code == null) + orgid_code = ""; + if (corp_code == null) + corp_code = "0000"; + if (cert_class == null) + cert_class = "0000"; + if (cert_type == null) + cert_type = "0000"; + + + if (commandType != null && commandType.equalsIgnoreCase ("update")) + { + boolean isError = false; + if (user_policy_type == null) + isError = true; + + if (user_name == null) + isError = true; + + if (isError) + { +%> +({"code":"-1" +"reason":"no policy or user_name or ssn" +"moreinformation":""}) +<% + return; + } + + } + + if (user_policy_type == null) + { + user_policy_type = "104"; + } + + if (user_name == null || user_name.length () == 0) + { + user_name = nameList [aRandom.nextInt (nameList.length)]; + if (targetRA.equalsIgnoreCase("2048")) + { + while (user_name.length() < 4) + { + user_name = nameList [aRandom.nextInt (nameList.length)]; + } + } + } + else + user_name = new String(user_name.getBytes("iso8859-1"), "utf-8"); + + String euser_name = request.getParameter("euser_name"); + String user_id = request.getParameter("user_id"); + String real_id = request.getParameter("real_id"); + String ssn = request.getParameter("ssn"); + + String policy_type ; + String user_type; + String check_real_id; + String service_code, service_key; + String cert_status; + + user_type = user_policy_type.substring(0, 1); + + if( user_type.equals("1") ) + { + if (ssn == null || ssn.length () == 0) + { + StringBuffer aBuffer = new StringBuffer (); + Calendar aCalendar = Calendar.getInstance (); + String aSSNTail = null; + aSSNTail = String.valueOf (aRandom.nextInt (2999999)); + + aBuffer.append (String.valueOf (aCalendar.get(Calendar.YEAR)).substring (2)); + + if (aCalendar.get(Calendar.MONTH) < 10) + aBuffer.append ("0"); + aBuffer.append (String.valueOf (aCalendar.get(Calendar.MONTH))); + + if (aCalendar.get(Calendar.DAY_OF_MONTH) < 10) + aBuffer.append ("0"); + aBuffer.append (String.valueOf (aCalendar.get(Calendar.DAY_OF_MONTH))); + + + if (aSSNTail.length () < 7) + { + for (int aIter = 0; aIter < 7 - aSSNTail.length (); ++aIter) + { + aBuffer.append ("0"); + } + } + aBuffer.append (aSSNTail); + + ssn = aBuffer.toString (); + + } + if (user_id == null) + user_id = ssn; + + policy_type = user_policy_type.substring(1,3); + //user_id = policy_type + ssn.charAt(5) + user_id; + + if (real_id == null) + real_id = user_id; + } + else if ( user_type.equals("2") ) + { + if (ssn == null || ssn.length () == 0) + { + StringBuffer aBuffer = new StringBuffer (); + String aSSNTail = null; + aSSNTail = "2" + String.valueOf (aRandom.nextInt (999999999)); + + if (aSSNTail.length () < 10) + { + for (int aIter = 0; aIter < 10 - aSSNTail.length (); ++aIter) + { + aBuffer.append ("0"); + } + } + aBuffer.append (aSSNTail); + + ssn = aBuffer.toString (); + } + + if (company_name == null) + company_name = ssn; + if (euser_name == null) + euser_name = ssn; + if (user_id == null) + user_id = ssn; + + policy_type = user_policy_type.substring(1,3); + //user_id = policy_type + ssn.charAt(8) + user_id; + + if (real_id == null) + real_id = user_id; + } + else + policy_type = user_policy_type.substring(1,2); + + String email = "dont email me"; + String cell_phone = "dont call me"; + String fax = "dont fax me"; + String zipcode = "127-311"; + String address = "dogok dong house"; + String phone = "02-526-8000"; + String czipcode = "127-311"; + String caddress = "dogok dong"; + String cphone = "02-526-8000"; + + +%> +({"ssn":"<%=ssn%>", +"name":"<%=user_name%>", +<% + + service_code = "2"; + service_key = user_id; + + ca_result = ca_client.viewCertificate(operaterId, service_code, service_key, corp_code, 0, 1 ); + + check_real_id = (String)ca_client.getResponseFromCertView("USERID",1); + cert_status = (String)ca_client.getResponseFromCertView("STATUS",1); + + if(cert_status.equalsIgnoreCase("10")) // 인증서 등록상태 정상인 경우는 재발급 등록 요청 + { + commandType = "rereg"; + } + else if(cert_status.equalsIgnoreCase("30") || cert_status.equalsIgnoreCase("40")) // 인증서 등록상태 폐지, 효력정지인 경우는 신규 등록 요청 + { + commandType = "new"; + } + else // 인증서 미등록인 경우는 신규 등록 요청 + { + commandType = "new"; + } + +%> +"check_real_id":"<%=check_real_id%>", +"cert_status":"<%=cert_status%>", +"commandType":"<%=commandType%>", +<% + + if (commandType == null || commandType.equalsIgnoreCase ("new")) + { + ca_result = ca_client.registerNewUser (operaterId, + user_type, + company_name, + user_name, + user_id, + ssn, + policy_type, + email, + cell_phone, + fax, + zipcode, + address, + phone, + czipcode, + caddress, + cphone, + cert_type, + cert_class, + corp_code, + org_code, + orgid_code, + position, + foreigner_id_num, + reg_master_num, + executive_num, + real_id); + } + else if (commandType.equalsIgnoreCase ("rereg")) + { + ca_result = ca_client.registerReNewUser (operaterId, + user_type, + company_name, + user_name, + user_id, + ssn, + policy_type, + email, + cell_phone, + fax, + zipcode, + address, + phone, + czipcode, + caddress, + cphone, + cert_type, + cert_class, + corp_code, + org_code, + orgid_code, + position, + foreigner_id_num, + reg_master_num, + executive_num, + real_id, + 0); + } + else if (commandType.equalsIgnoreCase ("update")) + { +%> +"code":"none", +"reason":"XecureCA does not support registration for UPDATE", +"moreinformation":"CA IP:<%=ip + ", CA Port:" + port%>" +}) +<% + return; + + } + if ( ca_result == 0 ) { + user_id = ca_client.getResponseFromRegUser("USERID"); + real_id = ca_client.getRealUserId(user_id,corp_code); +%> +"code":"0", +"ip":"<%=ip%>", +"port":"<%=port%>", +"regdate":"<%=ca_client.getResponseFromRegUser("REGDATE")%>", +"regserial":"<%=ca_client.getResponseFromRegUser("REGSERIAL")%>", +"userid":"<%=user_id%>", +"realid":"<%=real_id%>", +"refcode":"<%=ca_client.getResponseFromRegUser("REFCODE")%>", +"authcode":"<%=ca_client.getResponseFromRegUser("AUTHCODE")%>" +<% } + else + { +%> +"code":"<%=ca_client.getLastError()%>", +"reason":"<%=ca_client.getLastErrorMsg()%>", +"moreinformation":"CA IP:<%=ip + ", CA Port:" + port %>" +<% } +%> +}) diff --git a/src/main/webapp/WEB-INF/decorators.xml b/src/main/webapp/WEB-INF/decorators.xml index 5cb75977..b51eaa99 100644 --- a/src/main/webapp/WEB-INF/decorators.xml +++ b/src/main/webapp/WEB-INF/decorators.xml @@ -159,6 +159,9 @@ /web/user/mypage/case/01/168/devCiMakePop.do /web/user/siren/case/04/154/check.do */web/user/mediation/case/caseSignPop/popup.do* + /web/user/mediation/case/pdf/pdfDownload.do + /web/user/mediation/case/pdf/viewer.do + diff --git a/src/main/webapp/WEB-INF/jsp/_extra/web/user/mediation/caseSignPop.jsp b/src/main/webapp/WEB-INF/jsp/_extra/web/user/mediation/caseSignPop.jsp index 86c9d437..fb7231ee 100644 --- a/src/main/webapp/WEB-INF/jsp/_extra/web/user/mediation/caseSignPop.jsp +++ b/src/main/webapp/WEB-INF/jsp/_extra/web/user/mediation/caseSignPop.jsp @@ -40,10 +40,9 @@ + + - + @@ -119,7 +129,8 @@
- +<%-- --%> +
diff --git a/src/main/webapp/WEB-INF/jsp/_extra/web/user/mediation/caseViewer.jsp b/src/main/webapp/WEB-INF/jsp/_extra/web/user/mediation/caseViewer.jsp index 27bdd49b..31908581 100644 --- a/src/main/webapp/WEB-INF/jsp/_extra/web/user/mediation/caseViewer.jsp +++ b/src/main/webapp/WEB-INF/jsp/_extra/web/user/mediation/caseViewer.jsp @@ -2,375 +2,124 @@ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> - - - - - - - PDF 문서 VIEW - - + + + PDF Viewer - - - - + - - - - + + + + + + +
+ + 페이지 1 / --- + +
+
-
- - - - -
-
- - - -
+ + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/_extra/web/user/mediation/caseViewer_back.jsp b/src/main/webapp/WEB-INF/jsp/_extra/web/user/mediation/caseViewer_back.jsp new file mode 100644 index 00000000..2d19d800 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/_extra/web/user/mediation/caseViewer_back.jsp @@ -0,0 +1,417 @@ +<%@ page contentType="text/html;charset=utf-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + + + + + + + + PDF 문서 VIEW + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + + +
+
+
+
+
+ + +
+ +
+ +
+ + + + +
+
+
+
+ +
+ +
+ +
+ +
+ + +
+ +
+
+ +
+ +
+ + + +
+
+
+
+
+
+
+
+
+
+ + + + + + + + +
+
+
+ + +
+ + + +
+
+ + + diff --git a/src/main/webapp/WEB-INF/jsp/_extra/web/user/mediation/checkMediationStep03.jsp b/src/main/webapp/WEB-INF/jsp/_extra/web/user/mediation/checkMediationStep03.jsp index 2991c20d..0c0f5602 100644 --- a/src/main/webapp/WEB-INF/jsp/_extra/web/user/mediation/checkMediationStep03.jsp +++ b/src/main/webapp/WEB-INF/jsp/_extra/web/user/mediation/checkMediationStep03.jsp @@ -249,7 +249,7 @@ $('#commentType').val(type); var f = document.scheduleFrm; - var popOption = "width=900, height=800, resizable=no, scrollbars=no, status=no;"; + var popOption = "width=1200, height=800, resizable=no, scrollbars=yes, status=no;"; var pop = window.open('', "caseSignPop", popOption); f.target = "caseSignPop"; f.action = "/web/user/mediation/case/caseSignPop/popup.do"; @@ -350,7 +350,10 @@ @@ -375,7 +378,10 @@ @@ -391,7 +397,10 @@ @@ -413,7 +422,10 @@ @@ -425,8 +437,11 @@
-<%--
--%> - gif  ${file.fileName} (${file.regDt}, ${file.fileOwner}) + @@ -442,7 +457,10 @@ @@ -465,7 +483,7 @@ @@ -477,7 +495,7 @@ @@ -489,7 +507,7 @@ @@ -499,7 +517,7 @@ @@ -509,7 +527,7 @@ diff --git a/src/main/webapp/WEB-INF/jsp/seed/_extra/gtm/nice/niceList.jsp b/src/main/webapp/WEB-INF/jsp/seed/_extra/gtm/nice/niceList.jsp index 888b99d0..233da0c8 100644 --- a/src/main/webapp/WEB-INF/jsp/seed/_extra/gtm/nice/niceList.jsp +++ b/src/main/webapp/WEB-INF/jsp/seed/_extra/gtm/nice/niceList.jsp @@ -80,7 +80,7 @@ $("#type").val("NICESEARCH"); var param = jQuery('#frm').serialize(); url = "/gtm/case/common/ajax/NICE.do"; - XHR(url, param, function(r){ + XHR2(url, param, function(r){ //alert(r.apiKey); //alert(r.niceSearch.Search.OperationResponse.SA0701.Items.totalcount); //alert(r.niceSearch.Search.OperationResponse.SA0701.Items.Item[1].korentrnm); diff --git a/src/main/webapp/WEB-INF/views/_common/_js/pdf/web/viewer.js b/src/main/webapp/WEB-INF/views/_common/_js/pdf/web/viewer.js index 79a9facd..eff9f44e 100644 --- a/src/main/webapp/WEB-INF/views/_common/_js/pdf/web/viewer.js +++ b/src/main/webapp/WEB-INF/views/_common/_js/pdf/web/viewer.js @@ -4372,7 +4372,8 @@ var defaultOptions = { kind: OptionKind.WORKER }, workerSrc: { - value: '../build/pdf.worker.js', +// value: '../build/pdf.worker.js', + value: '/js/pdf/build/pdf.worker.js', kind: OptionKind.WORKER } }; diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index d78050dd..46354cea 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -126,6 +126,7 @@ *.woff2 *.ico *.jpg + *.properties