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

📄 cardapp.cpp

📁 RSA C++源代码DEMO,附加DESMD5等众多算法
💻 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 + -