⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smartcarddlg.cpp

📁 This is a code relatesd to smart card secuiry DES/3-DES
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
	DispatchCommand(COMMAND_SUBMIT_CODE);
}

void CSmartCardDlg::OnButtonSelectFile() 
{
	DispatchCommand(COMMAND_SELECT_FILE);
}

void CSmartCardDlg::OnButtonReadFile() 
{
	DispatchCommand(COMMAND_READ_FILE);
}

void CSmartCardDlg::OnButtonSetup() 
{
	DispatchCommand(COMMAND_SETUP);
}

void CSmartCardDlg::OnButtonProgram() 
{
	DispatchCommand(COMMAND_PROGRAM);
}

bool CSmartCardDlg::DoATR()
{
	unsigned char	buf[64];
	DWORD			dwLength;

	dwLength = sizeof buf;
	return m_acos1.GetATR(buf, dwLength);
}

void CSmartCardDlg::DoStartSession() 
{
	unsigned char buf[128];
	DWORD dwLength;
	if ( m_acos1.StartSession(buf, dwLength) )
	{
		CString ccc;
		CString sss = _T("key = ");;
		for ( DWORD ii = 0; ii < dwLength; ii++ )
		{
			ccc.Format(_T("%02X "), buf[ii]);
			sss += ccc;
		}
		sss += _T("\r\n");
		AppendText(sss);
	}
}

bool CSmartCardDlg::DoSubmitCode() 
{
	unsigned char CODE[] = {'A', 'C', 'O', 'S', 'T', 'E', 'S', 'T'};
	return m_acos1.SubmitIC(CODE);
}

bool CSmartCardDlg::DoSelectFile() 
{
	unsigned char FILE_DATA[] = {0xFF, 0x03};
	return m_acos1.SelectFile(FILE_DATA);
}

void CSmartCardDlg::DoReadFile() 
{
	BOOL bEnableEncryption = m_checkEncrypt.GetCheck();
	//if ( !DoATR() )
	//{
	//	return;
	//}

	if ( !DoSubmitCode() )
	{
		return;
	}

	if ( !DoSelectFile() )
	{
		return;
	}

	unsigned char buf[128];
	DWORD dwLength;
	if ( m_acos1.ReadRecord(6, 8, buf, dwLength) )
	{
		if ( bEnableEncryption )
		{
			for ( int ii = 0; ii < 8; ii++ )
			{
				buf[ii] = SDES::Decrypt(buf[ii]);
			}
		}

		CString response;
		CString ccc;

		serialNumStruct serialNum;
		::CopyMemory(&serialNum, buf, 8);

		m_first = serialNum.first;
		m_last = serialNum.last;

		m_BtnProgram.EnableWindow(m_first <= m_last);

		CString sss;
		sss.Format(_T("%lu"), serialNum.first);
		m_EditCurrent.SetWindowText(sss);
		sss.Format(_T("%lu"), serialNum.last - serialNum.first + 1);
		m_EditRemaining.SetWindowText(sss);				

		if ( m_checkVerbose.GetCheck() )
		{
			response.Format(_T("RECORD %2d: "), 6);
			for ( DWORD ii = 0; ii < dwLength; ii++ )
			{
				ccc.Format(_T("%02X "), buf[ii]);
				response += ccc;
			}			
			AppendText(response);
		}
	}
}

void CSmartCardDlg::DoSetup() 
{
	CDlgSetup dlg;

	int nResponse = dlg.DoModal();
	if ( nResponse == IDOK )
	{
		ClearOutput();

		serialNumStruct serialNum;
		serialNum.first = dlg.m_uStartNum;
		serialNum.last	= dlg.m_uStartNum + dlg.m_uCount - 1;

		m_BtnProgram.EnableWindow(serialNum.first <= serialNum.last);

		CString			sss;

		if ( !m_acos1.OpenPort() )
		{
			CString errMsg = m_acos1.GetLastErrorMsg();
			sss.Format(_T("Error opening serial port.\n\n%s"), (LPCTSTR)errMsg);
			AfxMessageBox(sss, MB_OK | MB_ICONERROR );
			return;
		}
		Sleep(200);

		unsigned char CODE[] = {'A', 'C', 'O', 'S', 'T', 'E', 'S', 'T'};
		if ( m_acos1.SubmitIC(CODE) )
		{
			unsigned char FILE_DATA[] = {0xFF, 0x03};
			if ( m_acos1.SelectFile(FILE_DATA) )
			{
				if ( m_acos1.WriteRecord(6, (unsigned char *)&serialNum, sizeof serialNum) )
				{
					AppendText(_T("Success "));	
					DoReadFile();
				}
			}
		}			
	}

}

void CSmartCardDlg::DoProgram() 
{
	DoReadFile();
	
	if ( m_first <= m_last )
	{

		m_first++;

		serialNumStruct serialNum;
		serialNum.first = m_first;

		unsigned char CODE[] = {'A', 'C', 'O', 'S', 'T', 'E', 'S', 'T'};
		if ( m_acos1.SubmitIC(CODE) )
		{
			unsigned char FILE_DATA[] = {0xFF, 0x03};
			if ( m_acos1.SelectFile(FILE_DATA) )
			{
				if ( m_acos1.WriteRecord(6, (unsigned char *)&serialNum, 4) )
				{
					AppendText(_T("Success "));
					DoReadFile();
				}
			}
		}			
	}
	else
	{
		AfxMessageBox(_T("Serial numbers exhausted!"), MB_OK | MB_ICONWARNING );
	}
	
}

void CSmartCardDlg::OnSelchangeComboStopBits() 
{
	m_acos1.SetStopBits(m_comboStopBits.GetCurSel() + 1);
}

void CSmartCardDlg::OnButtonDumpDcb() 
{	
	if ( !m_acos1.OpenPort() )
	{
		CString	sss;
		CString errMsg = m_acos1.GetLastErrorMsg();
		sss.Format(_T("Error opening serial port.\n\n%s"), (LPCTSTR)errMsg);
		AfxMessageBox(sss, MB_OK | MB_ICONERROR );
		return;
	}

	ClearOutput();
	m_acos1.DumpDCB();
	m_acos1.ClosePort();
}

void CSmartCardDlg::OnSelchangeComboBaud() 
{
	CString sss;
	m_comboBaud.GetLBText(m_comboBaud.GetCurSel(), sss);
	_stscanf(sss, "%d", &m_iBaud);	
	m_acos1.SetBaud(m_iBaud);
}

void CSmartCardDlg::OnSelchangeComboComPort() 
{
	CString sss;

	if ( m_comboPort.GetCount() > 0 )
	{
		m_comboPort.GetLBText(m_comboPort.GetCurSel(), sss);
		_stscanf(sss, "COM%d", &m_iPort);
		m_acos1.SetPort(m_iPort);
	}
}

void CSmartCardDlg::OnDestroy() 
{
	AfxGetApp()->WriteProfileInt(s_szSectionSettings, s_szPort, m_iPort);
	AfxGetApp()->WriteProfileInt(s_szSectionSettings, s_szBaud, m_iBaud);
	AfxGetApp()->WriteProfileInt(s_szSectionSettings, s_szClearOutput, m_checkClear.GetCheck());
	AfxGetApp()->WriteProfileInt(s_szSectionSettings, s_szEncrypt, m_checkEncrypt.GetCheck());
	AfxGetApp()->WriteProfileInt(s_szSectionSettings, s_szVerbose, m_checkVerbose.GetCheck());

	CDialog::OnDestroy();	
}

void CSmartCardDlg::AppendText(LPCTSTR Text)
{
	CString msg = Text;

	msg += _T("\r\n");

	int Length = m_EditOut.GetWindowTextLength();

	m_EditOut.SetSel(Length, Length);
	m_EditOut.ReplaceSel(msg);
	m_EditOut.LineScroll( m_EditOut.GetLineCount() );
}

void CSmartCardDlg::ClearOutput()
{
	if ( m_checkClear.GetCheck() )
	{
		m_EditOut.SetWindowText(_T(""));
	}
}

void CSmartCardDlg::DispatchCommand(CommandEnum command)
{
	CString	sss;

	if ( command != COMMAND_SETUP )
	{
		ClearOutput();

		if ( !m_acos1.OpenPort() )
		{
			CString errMsg = m_acos1.GetLastErrorMsg();
			sss.Format(_T("Error opening serial port.\n\n%s"), (LPCTSTR)errMsg);
			AfxMessageBox(sss, MB_OK | MB_ICONERROR );
			return;
		}
	}

	switch ( command )
	{
		case COMMAND_ATR:
		{
			DoATR();
		}
		break;

		case COMMAND_START_SESSION:
		{
			DoStartSession();
		}
		break;

		case COMMAND_SUBMIT_CODE:
		{
			DoSubmitCode();
		}
		break;

		case COMMAND_SELECT_FILE:
		{
			DoSelectFile();
		}
		break;

		case COMMAND_READ_FILE:
		{
			DoReadFile();
		}
		break;

		case COMMAND_SETUP:
		{
			DoSetup();
		}
		break;

		case COMMAND_PROGRAM:
		{
			DoProgram();
		}
		break;

		default:
			break;
	}

	m_acos1.ClosePort();

}

void CSmartCardDlg::OnCheckEncrypt() 
{
	m_acos1.EnableEncryption(m_checkEncrypt.GetCheck() != 0);
}

void CSmartCardDlg::OnCheckVerbose() 
{
	m_acos1.SetVerbose(m_checkVerbose.GetCheck() != 0);	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -