/***************************************************************** / / File : ctapi.c / Author : David Corcoran / Date : September 2, 1998 / Purpose: Defines CT-API functions / License: See file LICENSE / ******************************************************************/ #include #include "defines.h" #include "ctapi.h" #include "serial.h" /* Initializes the port on which the reader resides */ int CT_init ( unsigned int Ctn, unsigned int pn ) { bool BretVal; /* Return value from IO_InitializePort() */ int IretVal; /* Return for this function */ switch( pn ) { case PORT_COM1: #ifdef SUN_SPARC BretVal = IO_InitializePort(9600,8,'E',"/dev/cua/a"); #endif #ifndef SUN_SPARC BretVal = IO_InitializePort(9600,8,'E',"/dev/cuad0"); #endif break; case PORT_COM2: #ifdef SUN_SPARC BretVal = IO_InitializePort(9600,8,'E',"/dev/cua/b"); #endif #ifndef SUN_SPARC BretVal = IO_InitializePort(9600,8,'E',"/dev/cuad1"); #endif break; case PORT_COM3: #ifdef SUN_SPARC BretVal = IO_InitializePort(9600,8,'E',"/dev/cua/c"); #endif #ifndef SUN_SPARC BretVal = IO_InitializePort(9600,8,'E',"/dev/cuad2"); #endif break; case PORT_COM4: #ifdef SUN_SPARC BretVal = IO_InitializePort(9600,8,'E',"/dev/cua/d"); #endif #ifndef SUN_SPARC BretVal = IO_InitializePort(9600,8,'E',"/dev/cuad3"); #endif break; case PORT_Printer: BretVal = IO_InitializePort(9600,8,'E',"Printer Port"); break; case PORT_Modem: BretVal = IO_InitializePort(9600,8,'E',"Modem Port"); break; default: BretVal = IO_InitializePort(9600,8,'E',"/dev/smartcard"); break; } if (BretVal != TRUE) { IretVal = ERR_MEMORY; /* Could not allocate port */ } else { IretVal = OK; } return IretVal; } /* Closes the port in which the reader resides */ int CT_close( unsigned int Ctn ) { if (IO_Close() == TRUE) { return OK; } else { return ERR_CT; } } /* Sends/Receives Data to/from the Reader */ int CT_data( unsigned int ctn, unsigned char *dad, unsigned char *sad, unsigned int lc, unsigned char *cmd, unsigned int *lr, unsigned char *rsp ) { /* Reader specific CT-BCS commands */ unsigned char pcSetMode[6] = {0x61, 0x00, 0x00, 0x10, 0x00, 0x00}; unsigned char cReset = 0x64; unsigned char cStatus = 0x65; unsigned char cActivate = 0x60; unsigned char cDeActivate = 0x6A; unsigned char BoutComm[MAX_BUFFER_SIZE]; /* Command Buffer */ unsigned char BackByte; /* Ack Byte */ unsigned char BrdrResp[3]; /* Reader Response */ unsigned char cRdrIrsp[5]; /* Ack + Size Resp */ unsigned int lctb; /* CTBCS Size */ int IretVal; /* Return Value */ int i; *lr = 0; if ( *dad == 1 ) { /* This command goes to the reader */ *sad = 1; /* Source Reader */ *dad = 2; /* Destination Host */ /* The following is NOT a CTBCS */ /*******************/ /* CT-BCS Commands */ /*******************/ /* Request ICC - Turns on the reader/card */ if ( (cmd[0] = 0x20) && (cmd[1] == 0x12) ) { IretVal = ERR_TRANS; /* Transmission Error by default */ if ( IO_UpdateReturnBlock( 5 ) ) { if ( IO_Write( cActivate ) ) { if ( IO_Read( 1, &BackByte ) ) { if ( BackByte == 0x60 ) { sleep(2); /* Wait for reader to respond */ IO_FlushBuffer(); /* Flush all chars on stream */ *lr = 0; IretVal = OK; } } } } /* Resets the Card/Terminal and returns Atr */ } else if ( (cmd[0] = 0x20) && (cmd[1] == 0x11) ) { IretVal = ERR_TRANS; /* Transmission Error by default */ if ( IO_UpdateReturnBlock( 5 ) ) { if ( IO_Write( cReset ) ) { if ( IO_Read( 4, cRdrIrsp ) ) { if ( cRdrIrsp[0] == 0x62 ) { /* Ack */ if ( IO_Read( cRdrIrsp[3], rsp ) ) { /* Read Atr */ *lr = cRdrIrsp[3] + 2; /* Size of Atr */ rsp[cRdrIrsp[3]] = 0x90; rsp[cRdrIrsp[3]+1] = 0x00; IretVal = OK; /* This set's the reader mode to T=0 It must be done here since no protocol has been negotiated after resets */ for (i=0; i