123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- using System;
- using System.IO;
- using System.Security.Cryptography;
- using System.Windows.Forms;
- //using KMCLIENTAXLib;
- using ClipSoft.eForm.Base.Dialog;
- namespace CLIP.eForm.Consent.UI {
- class SignatureConfig {
- //KMClientAX kmiAx = new KMClientAX();
- KMCLIENTAXLib.KMClientAX kmiAx = new KMCLIENTAXLib.KMClientAX();
- SKCOMMAXLib.SKCommAX CertManX = new SKCOMMAXLib.SKCommAX();
- public void SignAllClear() {
- try {
- int nRet;
- /*
- * 특정 DN 체계를 가진 인증서를 일괄 삭제 합니다.
- */
- //nRet = kmiAx.CertBatchDel("ou=EMR,ou=대구파티마병원,ou=의료,o=SignKorea,c=KR");
- nRet = kmiAx.CertBatchDel("ou=EMR,ou=경북대학교병원,ou=의료,o=SignKorea,c=KR");
- nRet = kmiAx.CertBatchDel("ou=EMR,ou=칠곡경북대학교병원,ou=의료,o=SignKorea,c=KR");
- //if (nRet == 0)
- //{
- // MessageBoxDlg.Show(true, "로컬 PC 인증서 일괄 삭제 실패-" + kmiAx.Error_MSG()
- // , string.Format(Properties.Resources.msg_caption_confirm)
- // , MessageBoxButtons.OK, MessageBoxIcon.Information);
- //}
- }
- catch(Exception ex) {
- MessageBoxDlg.Show(true, "인증서 삭제 실패 " + ex
- , string.Format(Properties.Resources.msg_caption_confirm)
- , MessageBoxButtons.OK, MessageBoxIcon.Information);
- }
- }
- public string SetSignServerInfo(string ip, int port, string id) {
- try {
- int nRet;
- string strRet;
- SignAllClear();
- nRet = kmiAx.kmsConnect(ip, Convert.ToInt32(port));
- if(nRet == 0) {
- MessageBoxDlg.Show(true, "kmi 서버 접속 실패-" + kmiAx.Error_MSG()
- , string.Format(Properties.Resources.msg_caption_confirm)
- , MessageBoxButtons.OK, MessageBoxIcon.Information);
- return string.Format("{0}", nRet);
- }
- strRet = kmiAx.kmsInit();
- if(strRet == "") {
- MessageBoxDlg.Show(true, "kmi 초기화 실패-" + kmiAx.Error_MSG()
- , string.Format(Properties.Resources.msg_caption_confirm)
- , MessageBoxButtons.OK, MessageBoxIcon.Information);
- kmiAx.kmsDisconnect();
- return "-1";
- }
- strRet = kmiAx.GetKeyAndCert(id);
- if(strRet == "") {
- MessageBoxDlg.Show(true, "인증서 다운로드 실패" + kmiAx.Error_MSG()
- , string.Format(Properties.Resources.msg_caption_confirm)
- , MessageBoxButtons.OK, MessageBoxIcon.Information);
- kmiAx.kmsDisconnect();
- return "-1";
- }
- kmiAx.kmsDisconnect();
- return strRet;
- }
- catch(Exception ex) {
- MessageBoxDlg.Show(true, "인증서 다운로드 실패 " + ex
- , string.Format(Properties.Resources.msg_caption_confirm)
- , MessageBoxButtons.OK, MessageBoxIcon.Information);
- return "-1";
- }
- }
- public string SignatureExec(string sCertTarget, string dn, string userName, string userId, bool dualViewer) {
- try {
- int i = 0;
- //bool checkState = true;
- //BSTR pszUserID : 인증서 DN 또는 DN의 userid
- //BSTR pszSuffix: 검색할 인증서의 DN suffix(예: ou = test,O = test,c = KR )
- //BSTR pszPassword : 인증서 비밀번호
- //long Type : 인증서 선택/ 나열 방법을 정의
- //string singKoreaDn = CertManX.SetMatchedContextExt("", "", "", 256 + 0 + 1);
- //if (!dn.Equals(singKoreaDn))
- //{
- // // 공인인증서 초기화
- // CertManX.UnsetMatchedContext();
- // checkState = false;
- //}
- //if(!checkState)
- //{
- // 공인인증서 초기화
- int passwordLimitcnt = 5;
- CertManX.UnsetMatchedContext();//암호를 새로 물음
- CertManX.SetWrongPasswordLimit(passwordLimitcnt);
- // 비밀번호 입력
- string sPassword = string.Empty;
- SignaturePasswordForm signPasswordForm = new SignaturePasswordForm(userName, userId, dualViewer);
- if(signPasswordForm.ShowDialog() == DialogResult.OK) {
- sPassword = signPasswordForm.GetPassword();
- signPasswordForm.Close();
- }
- if(string.IsNullOrEmpty(sPassword)) {
- return "-50";
- }
- bool passwordState = false;
- for(int j = 0; j < passwordLimitcnt; j++) {
- //if (CertManX.SetMatchedContextExt(dn, "ou=EMR,ou=대구파티마병원,ou=의료,o=SignKorea,c=KR", sPassword, 256 + 0 + 1) == null)
- if(CertManX.SetMatchedContextExt(dn, "", sPassword, 256 + 0 + 1) == null) {
- if(CertManX.GetLastErrorCode() == 2417) {
- i++;
- MessageBoxDlg.Show(true, "비밀번호 오류 : " + i + "회"
- , string.Format(Properties.Resources.msg_caption_confirm)
- , MessageBoxButtons.OK, MessageBoxIcon.Information);
- sPassword = string.Empty;
- if(i < passwordLimitcnt) {
- signPasswordForm = new SignaturePasswordForm(userName, userId, dualViewer);
- if(signPasswordForm.ShowDialog() == DialogResult.OK) {
- sPassword = signPasswordForm.GetPassword();
- signPasswordForm.Close();
- }
- if(string.IsNullOrEmpty(sPassword)) {
- return "-50";
- }
- }
- }
- }
- else {
- passwordState = true;
- break;
- }
- CertManX.UnsetMatchedContext();//암호를 새로 물음
- }
- // 공인인증서 비밀번호 입력 최종 실패시 리턴
- if(!passwordState) {
- return "-50";
- }
- i = 0;
- string plain;
- plain = sCertTarget;
- string signdata = CertManX.SignDataB64("", plain, 0);
- if(signdata == null) {
- MessageBoxDlg.Show(true, "SignDataB64 실패 : [" + CertManX.GetLastErrorCode() + "]" + CertManX.GetLastErrorMsg()
- , string.Format(Properties.Resources.msg_caption_confirm)
- , MessageBoxButtons.OK, MessageBoxIcon.Information);
- return "-50";
- }
- return signdata;
- }
- catch(Exception ex) {
- MessageBoxDlg.Show(true, "인증서 실행 실패 " + ex
- , string.Format(Properties.Resources.msg_caption_confirm)
- , MessageBoxButtons.OK, MessageBoxIcon.Information);
- return "-1";
- }
- }
- public string getSHA256ImageHash(String fileList, string delimiter) {
- byte[] hashValue;
- string hashStr = string.Empty;
- try {
- string[] sFullPath = fileList.Split('^');
- if(sFullPath != null && sFullPath.Length > 0) {
- FileStream fileStream = null;
- SHA256 mySHA256 = SHA256Managed.Create();
- foreach(string sPath in sFullPath) {
- // Create a fileStream for the file.
- fileStream = new FileStream(sPath, FileMode.Open);
- // Be sure it's positioned to the beginning of the stream.
- fileStream.Position = 0;
- // Compute the hash of the fileStream.
- hashValue = mySHA256.ComputeHash(fileStream);
- // Close the file.
- fileStream.Close();
- if(string.IsNullOrEmpty(delimiter)) hashStr += byteArrayToString(hashValue);
- else hashStr += string.Format("{0}{1}", byteArrayToString(hashValue), "^");
- }
- }
- if(!string.IsNullOrEmpty(hashStr) && hashStr.Length > 0) {
- hashStr = hashStr.Substring(0, hashStr.Length - 1);
- }
- }
- catch(DirectoryNotFoundException) {
- Console.WriteLine("Error: The directory specified could not be found.");
- }
- catch(IOException) {
- Console.WriteLine("Error: A file in the directory could not be accessed.");
- }
- return hashStr;
- }
- private string byteArrayToString(byte[] bStr) {
- string hexOutput = string.Empty;
- foreach(char letter in bStr) {
- // Get the integral value of the character.
- int value = Convert.ToInt32(letter);
- // Convert the decimal value to a hexadecimal value in string form.
- hexOutput += String.Format("{0:x}", value);
- }
- return hexOutput;
- }
- }
- }
|