Listing 11.2. The FlexCash card browser and editor program.
BYTE data[100], reply[100];
char string[100];
HRESULT hresult;
WORD wSW;
CString cString;
void UpdatePurseDisplay();
DWORD ApplicationFlag = 0;
void CFlexCashDlg::OnGetvalues()
{
UpdatePurseDisplay();
}
void CFlexCashDlg::OnCashloyalty()
{
DWORD amount;
BYTE bpDecLoyalty[] = {0xE1, 0x02, 0x00, 0x03};
m_LoyaltyCash.GetWindowText(cString);
sscanf((LPCTSTR)cString, "%2d", &amount);
bpDecLoyalty[3] = (BYTE)amount;
hresult = SendCardMessage(bpDecLoyalty, (BYTE)0x04);
GetSW(&wSW);
sprintf(string, "[%04x]", wSW);
m_editScardStatus.SetWindowText(string);
}
void CFlexCashDlg::UpdatePurseDisplay()
{
BYTE bpGetValues[] = {0xE1, 0x00, 0x00, 0x00};
hresult =
ExchangeCardMessage(bpGetValues, (BYTE)0x04, reply, 0x04);
if (FAILED(hresult))
throw (hresult);
else {
sprintf(string, "%3d", reply[1]);
m_PStatus.SetWindowText(string);
sprintf(string, "%3d", reply[2]);
m_BStatus.SetWindowText(string);
sprintf(string, "%3d", reply[3]);
m_VStatus.SetWindowText(string);
sprintf(string, "%3d", reply[0]);
m_SStatus.SetWindowText(string);
GetSW(&wSW);
sprintf(string, "[%04x] %02x %02x %02x %02x %02x",
wSW, reply[0], reply[1], reply[2], reply[3], reply[4]);
m_editScardStatus.SetWindowText(string);
}
}
void CFlexCashDlg::OnPerformcommand()
{
int iCurrentSelection = m_CommandList.GetCurSel();
WORD wSW, wOffset;
DWORD dwFileId, dwBytes;
BYTE key[8] = {0xad, 0x9f, 0x61, 0xfe, 0xfa, 0x20, 0xce, 0x63};
try {
switch (iCurrentSelection) {
case 0: // Create File
m_editScardStatus.SetWindowText(
"[xxxx] Create File not supported.");
break;
case 1: // Execute
hresult = Execute((WORD)0x2222, (BYTE)0x08);
if (FAILED(hresult))
throw (hresult);
else {
GetSW(&wSW);
sprintf(string,
"[%04x] Boot File Set to 0x2222.");
m_editScardStatus.SetWindowText(string);
}
break;
case 2: // Exchange Message
m_CommandArg.GetWindowText(cString);
sscanf((LPCTSTR)cString, "%2x%2x%2x%2x%2x",
&data[0],&data[1],&data[2],&data[3],&data[4]);
hresult =
ExchangeCardMessage(data, (BYTE)0x04, reply, data[4]);
if (FAILED(hresult))
throw (hresult);
else {
GetSW(&wSW);
sprintf(string, "[%04x] %02x %02x %02x %02x",
wSW, reply[0], reply[1], reply[2], reply[3]);
m_editScardStatus.SetWindowText(string);
}
break;
case 3: // Read Binary
m_CommandArg.GetWindowText(cString);
sscanf((LPCTSTR)cString, "%d", &wOffset);
hresult = ReadBinary(reply, wOffset, (BYTE)0x08);
if (FAILED(hresult))
throw (hresult);
else {
GetSW(&wSW);
sprintf(string, "[%04x] %02x %02x %02x
%02x %02x %02x %02x %02x",
wSW, reply[0], reply[1], reply[2], reply[3],
reply[4], reply[5], reply[6], reply[7]);
m_editScardStatus.SetWindowText(string);
}
break;
case 4: // Select Master File (3F00)
hresult = SelectFile((WORD)0x3F00);
if (FAILED(hresult))
throw (hresult);
else {
GetSW(&wSW);
sprintf(string,
"[%04x] Master File Selected", wSW);
m_editScardStatus.SetWindowText(string);
}
break;
case 5: // Select File
m_CommandArg.GetWindowText(cString);
sscanf((LPCTSTR)cString, "%x", &dwFileId);
hresult = SelectFile((WORD)dwFileId);
if (FAILED(hresult))
throw (hresult);
else {
GetSW(&wSW);
sprintf(string, "[%04x] File Selected", wSW);
m_editScardStatus.SetWindowText(string);
}
break;
case 6: // Set Default ATR
m_CommandArg.GetWindowText(cString);
dwBytes = cString.GetLength();
CopyMemory(data, (LPCSTR)cString, dwBytes);
hresult = SetDefaultATR(data, (BYTE)dwBytes);
if (FAILED(hresult))
throw (hresult);
else {
GetSW(&wSW);
sprintf(string, "[%04x] ATR Set.", wSW);
m_editScardStatus.SetWindowText(string);
}
break;
case 7: // Verify Key
hresult = VerifyKey((BYTE)0x00, key, (BYTE)0x08);
if (FAILED(hresult))
throw (hresult);
else {
GetSW(&wSW);
sprintf(string, "[%04x] Key Verified.", wSW);
m_editScardStatus.SetWindowText(string);
}
break;
case 8: // Write Binary
m_CommandArg.GetWindowText(cString);
dwBytes = sscanf((LPCTSTR)cString,
"%2x%2x%2x%2x%2x%2x%2x%2x",
&data[0],&data[1],&data[2],&data[3],
&data[4],&data[5],&data[6],&data[7]);
hresult = WriteBinary(data, (WORD)0, (BYTE)dwBytes);
if (FAILED(hresult))
throw (hresult);
else {
GetSW(&wSW);
sprintf(string, "[%04x] Data Written.", wSW);
m_editScardStatus.SetWindowText(string);
}
break;
default:
break;
};
}
catch (HRESULT) {
GetSW(&wSW);
sprintf(string, "[%02x/%08x]", wSW, hresult);
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, hresult,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
&string[strlen(string)], 100, NULL);
m_editScardStatus.SetWindowText(string);
}
}
void CFlexCashDlg::OnBecomeFlexCash()
{
BYTE key[8] = {0xad, 0x9f, 0x61, 0xfe, 0xfa, 0x20, 0xce, 0x63};
DO(VerifyKey((BYTE)0x00, key, (BYTE)0x08))
&& DO(Execute((WORD)0x2222, (BYTE)0x08))
&& DO(ResetCard());
sprintf(string, "[%08x] FlexCash Card Activated.", hresult);
m_editScardStatus.SetWindowText(string);
}
void CFlexCashDlg::OnBecomeJavaCard()
{
BYTE bpBecomeJavaCard[] = {0xE0, 0x00, 0x00, 0x00};
DO(SendCardMessage(bpBecomeJavaCard, (BYTE)0x04))
&& DO(ResetCard());
sprintf(string, "[%08x] Java Card Activated.", hresult);
m_editScardStatus.SetWindowText(string);
}
void CFlexCashDlg::OnReset()
{
hresult = ResetCard();
sprintf(string, "[%08x] Card Reset.", hresult);
m_editScardStatus.SetWindowText(string);
}
void CFlexCashDlg::OnChangecard()
{
BYTE bpSetApplication[] = {0xE1, 0x04, 0x00, 0x00};
char *ecash[] = {"Monitor", "E-Coins", "E-Bucks", "E-Money"};
bpSetApplication[3] = (BYTE)m_CardType.GetCurSel();
hresult = SendCardMessage(bpSetApplication, (BYTE)0x04);
m_CurrentApp.SetWindowText(ecash[bpSetApplication[3]]);
GetSW(&wSW);
sprintf(string, "[%04x] Card Set to App %d", wSW,
(DWORD)bpSetApplication[3]);
m_editScardStatus.SetWindowText(string);
}
void CFlexCashDlg::OnSpendecash()
{
DWORD amount;
BYTE bpSpendECash[] = {0xE2, 0x00, 0x00, 0x00};
m_ECashAmount.GetWindowText(cString);
sscanf((LPCTSTR)cString, "%2d", &amount);
bpSpendECash[2] = (BYTE)ApplicationFlag;
bpSpendECash[3] = (BYTE)amount;
hresult = SendCardMessage(bpSpendECash, (BYTE)0x04);
GetSW(&wSW);
sprintf(string, "[%04x]", wSW);
m_editScardStatus.SetWindowText(string);
}