Previous Table of Contents Next


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);
}


Previous Table of Contents Next