Example #1
0
int inSendRecvAPDU(BYTE *bSendData, int inSendLen, BYTE *bRecvData, int * inRecvLen, int inTimeOut, BOOL saved) {
    int inRetVal;       
    USHORT recelen = 0;
    
    MechineStatus &= (~(Status_READER_Disconnect));
    if (strcmp(gConfig.DEVICE.READER.bPORT, "Builtin") == 0) {
        inRetVal = BuiltinReader_CMDSendReceive(bSendData, inSendLen, bRecvData, inRecvLen);
    } else {        
        CTOS_RS232FlushTxBuffer(gREADERPORT.Portnum);
        CTOS_RS232FlushRxBuffer(gREADERPORT.Portnum);
        
        if(saved==TRUE) myDebugFileHex2Str((char*)__FUNCTION__,__LINE__,"send:",bSendData,inSendLen);
        if ((inRetVal = send_apdu(gREADERPORT.Portnum, bSendData, inSendLen)) != SUCCESS) {
            //SystemLogInt("inSendRecvAPDU", inRetVal, "send_apdu Fail");
            
            MechineStatus |= Status_READER_Disconnect;
            printf("[%s,%d] d_ERR_SendAPDU_ERROR \n",__FUNCTION__,__LINE__);
            return d_ERR_SendAPDU_ERROR;
        }
        //  CTOS_Delay(500);
        if ((inRetVal = recv_apdu(gREADERPORT.Portnum, bRecvData, inTimeOut)) == 0) {            
            MechineStatus |= Status_READER_Disconnect;
            printf("[%s,%d] d_ERR_RecvAPDU_ERROR \n",__FUNCTION__,__LINE__);
            return d_ERR_RecvAPDU_ERROR;
        }
        if(saved==TRUE) myDebugFileHex2Str((char*)__FUNCTION__,__LINE__,"recv:",bRecvData, inRetVal);
        
        CTOS_RS232FlushTxBuffer(gREADERPORT.Portnum);
        CTOS_RS232FlushRxBuffer(gREADERPORT.Portnum);       
    }
    // ShowSystemMemoryStatus("inSendRecvAPDU2 ");
    inRetVal = SUCCESS;
    return (inRetVal);
}
Example #2
0
File: scard.c Project: 12019/smews
int main(int argc, char *argv[]) {
	init_signals();

	if(init_terminal(&hContext,&hCard))
		return -1;
    else {
		if(open_tunnel(&tunnel) !=-1) {
			int output_len;
			raw_packet packet;
			short sw = 0x9000 ;

			printf("SCARD host adapter is now ready to accept connections\n");

			/* main loop */
			while((output_len = utun_read(&tunnel, packet.raw, MTU)) >= 0) {
				LONG card_status = 0;
				int select_ret;
				BYTE *packet_ptr;

				if(output_len == 0)
					continue;

				select_ret = utun_select(&tunnel);

				/* send the last tun input to the card */
				printf("send %d bytes\n",output_len);
				packet_ptr = packet.raw;
				do {
					unsigned char curr_len = output_len > 255 ? 255 : output_len;
					sw = send_apdu(hContext,hCard,packet_ptr,curr_len,&card_status,select_ret);
					
					if(SW1(sw) < 0x90) {
						printf("Error: %02x%02x\n",SW1(sw),SW2(sw));
						break;
					}
					
					packet_ptr += curr_len;
					output_len -= curr_len;
				} while(output_len > 0);

				/* if there is something else to send, do it now */
				if(select_ret>0) {
					memset(&packet,0,sizeof(raw_packet)); 
					continue;
				}

				/* receive data from the card (and forward it to the tun) if needed */
				while(SW2(sw)) {
					sw = recv_apdu(hContext,hCard,&tunnel,sw,&card_status);
					if(SW1(sw) < 0x90 ) {
						printf("Error: %02x%02x\n",SW1(sw),SW2(sw));
						break;
					}
				}

				if(card_status) {
					check_terminal_status(hContext,hCard);
				}
				memset(&packet,0,sizeof(raw_packet)); 
			}
		}
	}

	close_tunnel(&tunnel);
	release_terminal(&hContext,&hCard);

	return 0;
}