📄 cardapp.cpp
字号:
/*
* Card Application Class
*
* Writen by Alfred Meng
*
* Oct. 15, 1999
*
*@ident "CARDAPP V1.0"
*/
#include <stdio.h>
#include <process.h>
#include "string.h"
#include "cardapp.h"
#include "cardutil.h"
#include "gdcmd.h"
/////////////////////////////////////////////
// PCCTIW32.DLL interface
/////////////////////////////////////////////
#ifdef __PCCTI_DLL_CALL
int TSICALL (* TSI_Init)( unsigned TSIFAR *hCT, unsigned uiPortId,
unsigned uiMode);
int TSICALL (* TSI_Close)( unsigned hCT);
int TSICALL (* TSI_CreateHandle)( unsigned TSIFAR *hCard, unsigned hCT,
unsigned uiDest);
int TSICALL (* TSI_DeleteHandle)( unsigned hCard);
int TSICALL (* TSI_Display)( unsigned hCT, struct sDisplay TSIFAR *sDisp);
int TSICALL (* TSI_ICCStatus)( unsigned hCard);
int TSICALL (* TSI_EjectICC)( unsigned hCard,
const struct sDisplay TSIFAR *sDisp, unsigned uiSignal);
int TSICALL (* TSI_RequestICC)( unsigned hCard,
const struct sDisplay TSIFAR *sDisp, struct sResponse TSIFAR *sResp);
int TSICALL (* TSI_CTType)( unsigned hCT, struct sCTType TSIFAR *sCTType);
int TSICALL (* TSI_Send)( unsigned hCard,
struct sCommand TSIFAR *sCmd,
struct sResponse TSIFAR* sResp);
char TSIFAR * TSICALL (* TSI_GetMsg)( int iErrode);
#endif
/////////////////////////////////////////////
int regdata(THDF *df,char *data)
/*
* get Register DF data
*/
{
memcpy(data,df->dfid,FIDLEN);
data[FIDLEN] = df->aidlen;
memcpy(data+FIDLEN+1,df->aid,df->aidlen);
return (FIDLEN+1+df->aidlen);
}
TCardApp::TCardApp()
{
sResp.uiBufSize = sizeof( Resp );
sResp.ucpResp = Resp;
sDisp.ucTime = 0xff;
sDisp.szDispTxt = "Insert Card";
sDisp.uiDataLen = 0;
sDisp.ucpDiscrData = NULL;
port = E_NOTOPEN;
hCard = 0;
debug = 0; // off
tOpened = 0;
dstream = NULL;
assign(GDCommand,TOTAL_CMD); // Using G&D Command as default
__hPCCTIW32__ = NULL;
}
bool TCardApp::LoadAPI()
{
#ifdef __PCCTI_DLL_CALL
if ((__hPCCTIW32__ = LoadLibrary("pcctiw32.dll")) == NULL ) return false;
(void *)TSI_Init = (void *)GetProcAddress(__hPCCTIW32__,"TSI_Init");
(void *)TSI_Close = (void *)GetProcAddress(__hPCCTIW32__,"TSI_Close");
(void *)TSI_CreateHandle = (void *)GetProcAddress(__hPCCTIW32__,"TSI_CreateHandle");
(void *)TSI_DeleteHandle = (void *)GetProcAddress(__hPCCTIW32__,"TSI_DeleteHandle");
(void *)TSI_Display = (void *)GetProcAddress(__hPCCTIW32__,"TSI_Display");
(void *)TSI_ICCStatus = (void *)GetProcAddress(__hPCCTIW32__,"TSI_ICCStatus");
(void *)TSI_EjectICC = (void *)GetProcAddress(__hPCCTIW32__,"TSI_EjectICC");
(void *)TSI_RequestICC = (void *)GetProcAddress(__hPCCTIW32__,"TSI_RequestICC");
(void *)TSI_CTType = (void *)GetProcAddress(__hPCCTIW32__,"TSI_CTType");
(void *)TSI_Send = (void *)GetProcAddress(__hPCCTIW32__,"TSI_Send");
(void *)TSI_GetMsg = (void *)GetProcAddress(__hPCCTIW32__,"TSI_GetMsg");
#endif
return true;
}
TCardApp::~TCardApp()
{
if (tOpened ==1)
closeterm();
inspector(0);
}
int TCardApp::openterm(short aport)
{
#ifdef __PCCTI_DLL_CALL
if (!LoadAPI()) return -1;
#endif
port = aport;
rc = TSI_Init( &hCT, port, TSI_EXCLUSIVE); //TSI_EXCLUSIVE
if( rc!= TSI_OK) {
port = E_NOTOPEN;
return rc;
}
hPlug[0] = hPlug[1] = 0;
rc = TSI_CreateHandle( &hICC, hCT, TSI_ICC1);
hCard = hICC; /* default handler */
tOpened = 1;
return rc;
}
int TCardApp::opensam(int pos)
{
unsigned mode[2] = {TSI_ICC2,TSI_ICC3};
return TSI_CreateHandle( &hPlug[pos-1], hCT, mode[pos-1]);
}
int TCardApp::selectICC(int icc,bool reqATR)
{
if ( icc == IC_ICC ) hCard = hICC;
else if ( icc == IC_PLUG0 ) hCard = hPlug[0];
else hCard = hPlug[1];
if(reqATR) RequestATR();
return rc;
}
void TCardApp::dispmsg(char *msg )
{
sDisp.szDispTxt = msg;
TSI_Display(hCT,&sDisp);
}
int TCardApp::closeterm()
{
if ( tOpened == 0 ) return 0;
sDisp.szDispTxt = "Pls Remove Card";
TSI_Display(hCT,&sDisp);
if( TSI_ICCStatus( hICC ) == TSI_OK)
TSI_EjectICC( hICC, &sDisp, TSI_EJECT_KEEP_ICC|TSI_EJECT_BEEP);
if ( hPlug[0] > 0 ) TSI_DeleteHandle( hPlug[0] );
if ( hPlug[1] > 0 ) TSI_DeleteHandle( hPlug[1] );
if ( hICC > 0 ) TSI_DeleteHandle( hICC);
hICC = hPlug[0] = hPlug[1] = 0;
port = E_NOTOPEN;
TSI_Close( hCT);
#ifdef __PCCTI_DLL_CALL
if (__hPCCTIW32__) {
FreeLibrary(__hPCCTIW32__);
__hPCCTIW32__ = NULL;
}
#endif
tOpened = 0;
return 0;
}
int TCardApp::hascard()
{
return TSI_ICCStatus( hCard);
}
int TCardApp::RequestATR()
{
if ( hCard == hICC ) dispmsg("Insert Card");
rc = TSI_RequestICC( hCard, &sDisp, &sResp);
RespLen = sResp.uiRespLen;
SW1 = SW2 = 0x00;
return(RespLen);
}
int TCardApp::ejectcard(bool beep)
{
if ( !beep ) return TSI_EjectICC( hCard, &sDisp, TSI_EJECT_KEEP_ICC);
else return TSI_EjectICC( hCard, &sDisp, TSI_EJECT_KEEP_ICC|TSI_EJECT_BEEP);
}
int TCardApp::getResp()
{
TAPDU apdu;
apdu.len =5;
memcpy(apdu.apdu,"\x00\xc0\x00\x00",4);
apdu.apdu[4] = SW2;
return sendapdu(&apdu);
}
char TCardApp::TermType() const
{
TCTType ct;
TSI_CTType(hCT, &ct);
return ct.uiType;
}
int TCardApp::sendapdu(TAPDU *cmd)
{
int cid;
char s_buf[BUF_SIZE];
char r_buf[BUF_SIZE];
if ( cmd == NULL ) return -1;
__wrong_le:
sCmd.ucpCmd = cmd->apdu;
sCmd.uiCmdLen = cmd->len;
sCmd.uiSW = sCmd.uiSWMask = 0x00;
sCmd.uiMinLen = 0x02;
rc = TSI_Send( hCard, &sCmd, &sResp);
RespLen = sResp.uiRespLen;
SW1 = Resp[RespLen-2];
SW2 = Resp[RespLen-1];
RespLen -= 2;
Resp[RespLen]= '\0';
// just for DLL call
// Sleep(20);
/*
if (debug) {
cid = findbyCI(cmd->apdu[0],cmd->apdu[1]);
if ( cid != INVAILD_CMD ) strcpy(r_buf,findName(cid));
else strcpy(r_buf,"...");
// APDU
bcd2ascb((char *)cmd->apdu,(char *)s_buf,cmd->len);
sprintf(debug_buf,"%-16s: %s",r_buf, s_buf);
fprintf(dstream,"\n%s\n",debug_buf);
// RESP
if ( RespLen > 0 ) {
bcd2ascb((char *)Resp,(char *)r_buf,RespLen);
sprintf(debug_buf,"%-16s: %s %02X %02X"," ",r_buf,SW1,SW2);
} else sprintf(debug_buf,"%-16s: %02X %02X"," ",SW1,SW2);
fprintf(dstream,"%s\n",debug_buf);
}
*/
if ( SW1 == 0x6C ) { // wrong Le
cmd->apdu[cmd->len-1] = SW2;
goto __wrong_le;
}
if ( SW1== 0x61 ) {
static TAPDU Rapdu;
Rapdu.len =5;
memcpy(Rapdu.apdu,"\x00\xc0\x00\x00",4);
Rapdu.apdu[0] = __iso_cla;
Rapdu.apdu[4] = SW2;
rc = sendapdu(&Rapdu);
}
memcpy(&__apdu,cmd, sizeof(TAPDU));
return rc;
}
char * TCardApp::GetError() const
{
return TSI_GetMsg( rc );
}
int TCardApp::inspector(int onoff, char *fname)
{
debug = onoff;
if ( debug ) { // open
if ( fname!=NULL ) {
if (dstream!=NULL) return -1; // opened already
dstream = ::fopen(fname,"w");
if (dstream == NULL ) return -1;
}
} else { // close
if (dstream) ::fclose(dstream);
dstream = NULL;
}
return 1;
}
char *TCardApp::pickmsg()
{
if (debug) return debug_buf;
else return NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -