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

📄 hid_usb.c

📁 HID-Ukey底层源码实现(st72651芯片) windows上层驱动
💻 C
字号:
/**************** (c) 2001  STMicroelectronics **********************

PROJECT : USB - ST7 FS
VERSION :  V 0.96
CREATION DATE :  04/05/2000
AUTHOR : MICROCONTROLLER DIVISION / ST Rousset

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
LAST MODIFICATION  :

******************************************************************************/


// #include "hidef.h"   // not used because of 'NULL' redefinition
#include "usb_lib.h"
#include "Descript.h"
#include "HID_usb.h"
#include "mcu_conf.h"
#include "usb_def.h"      
#include "UARTT0.h"

#pragma DATA_SEG CLASS_RAM
extern unsigned char Current_Operation;
#define RBC_OP_IDLE		0x00

#pragma DATA_SEG SHORT CRD_BIT_RAM
unsigned char *pUsbMessageBuffer;
unsigned char	ShiftBitFlag;

#pragma DATA_SEG	CRD_MESSAGE_BUFFER
unsigned char UsbMessageBuffer[200];

#pragma DATA_SEG	CRD_RAM
unsigned char CardStateFlag;
unsigned char CardCommandFlag;
unsigned char	ReportStatus;
unsigned char UsbMessageFlags;
unsigned char ReceiveDataLength;
unsigned char ATRBuffer[ATRLENGTH];
unsigned char IccCommandINS;
struct
	{
	unsigned char cla;
	unsigned char ins;
	unsigned char p1;
	unsigned char p2;
	unsigned char lc;
	unsigned char le;
} IccCommandHead;				      //@jin0320   


/************************************************************************/
/*ROUTINE	void HID_XfrApdu();@jin0320								*/
/*Return an error code: 0x00 == OK										*/
/************************************************************************/
#pragma CODE_SEG	CRD_ROM
void HID_XfrApdu(void)                //解析APDU命令
{
	if (bTxOutCompleteFlag) {

		CardCommandFlag = SENDINS;

		IccCommandINS = UsbMessageBuffer[INS];		// record INS

		IccCommandHead.ins = UsbMessageBuffer[INS];
		IccCommandHead.cla	= UsbMessageBuffer[CLA];
		IccCommandHead.p1	= UsbMessageBuffer[P1];
		IccCommandHead.p2 = UsbMessageBuffer[P2];
		IccCommandHead.lc = UsbMessageBuffer[Lc];

	
		if (( UsbMessageBuffer[ReportID] == 0x01 ) && ( UsbMessageBuffer[Command] == 0xFF )) {
			CardStateFlag = CARDPOWERON;		// It's a command for power on smart card
		}
		else if (( UsbMessageBuffer[ReportID] == 0x01 ) && (UsbMessageBuffer[Command] == 0xFE )) {
			CardStateFlag = CARDGETATR;			// It's a command for get ATR
		}
		else if ( UsbMessageBuffer[MessageLength] == 0x04 )	{
			UsbMessageBuffer[Lc] = 0x00;				// supply the length of lc data and le data  
			CardStateFlag = CARDCOMMAND1;		// It's a command that no LC & LE data 
		}
		else if (( UsbMessageBuffer[MessageLength] == 0x05 ) && (UsbMessageBuffer[Lc] == 0 )) {
			CardStateFlag = CARDCOMMAND1;			// It's a command that no LC & LE data 
		}
		else if ( UsbMessageBuffer[MessageLength] == 0x05 ) {
			CardStateFlag = CARDCOMMAND2;		// It's a command that no LC but have LE data to receive
		}
		else if ( UsbMessageBuffer[MessageLength] - UsbMessageBuffer[Lc] == 5 ) {
			CardStateFlag = CARDCOMMAND3;		// It's a command that have LC data to send but no LE data to receive
		}
		else {
			CardStateFlag = CARDCOMMAND4;		// It's a command that not only have LC data to send but also have LE data to receive
		}

		Reset_bTxOutCompleteFlag;							// dispatch command is complete
	}
}

/************************************************************************/
/*ROUTINE	void IFD_XfrT0();@jin0320										*/
/*Return an error code: 0x00 == OK											*/
/************************************************************************/
void IFD_XfrT0(void)
{
unsigned char tempcount;
	
if ( !bDataReadyFlag ) {														// if data is not ready
	switch ( CardStateFlag )	{

	case NOCOMMAND:
		break;

	case CARDPOWERON:
		switch ( CardCommandFlag )	{
			case SENDINS: 
				CardCommandFlag = RECEIVESW;
				CardPowerOn();																//reset card
				break;
			case RECEIVESW:
				if ( bCommunicateEndFlag ) {			// if communicate end or waiting time over
					for (tempcount = 0; tempcount!= CardDataNum; tempcount++ )
						 UsbMessageBuffer[LeData + tempcount] = ATRBuffer[tempcount];		// copy data from ATR Buffer to Message Buffer
					UsbMessageBuffer[RecDataLength] = CardDataNum;
					Set_bDataReadyFlag;														// indicate that data is ready 
					CardCommandFlag = SENDINS;  
					asm nop;
					CardStateFlag = NOCOMMAND;  
					asm nop;
				}
				break;
			default:
				break;
		}
		break;

	case CARDGETATR:
			for (tempcount=0; tempcount!=4; tempcount++)
				UsbMessageBuffer[LeData + tempcount] = ATRBuffer[tempcount];
			UsbMessageBuffer[RecDataLength] = ATRLENGTH; 
			Set_bDataReadyFlag;
			CardStateFlag = NOCOMMAND;
		break;

	case CARDCOMMAND1:		// It's a command that no LC & LE data
		switch ( CardCommandFlag ) {
			case SENDINS:
				CardSend(INSHeadLength, &UsbMessageBuffer[CLA]);						// send command head
				ReceiveDataLength = 2;																			//Receive two status bytes
				CardCommandFlag = WAITRECEIVESW;
				break;
			case WAITRECEIVESW:
				if (bCommunicateEndFlag ) {			// if communicate end or waiting time over
					UsbMessageBuffer[RecDataLength] = CardDataNum;
					Set_bDataReadyFlag;														// indicate that data is ready 
					CardCommandFlag = SENDINS;
					CardStateFlag = NOCOMMAND;
				}
				break;
			default:
				break;
		}
		break;

	case CARDCOMMAND2:								// It's a command that no LC but have LE data to receive
		switch ( CardCommandFlag ) {
			case SENDINS:
				ReceiveDataLength = UsbMessageBuffer[Lc] +2 +1;								//Receive two status bytes + 1INS + LEDATA
				CardSend(INSHeadLength, &UsbMessageBuffer[CLA]);						// send command head
				CardCommandFlag = WAITRECEIVELEDATA;
				break;
			case WAITRECEIVELEDATA:
				if (bCommunicateEndFlag ) {			// if communicate end or waiting time over
					UsbMessageBuffer[RecDataLength] = CardDataNum;
					Set_bDataReadyFlag;														// indicate that data is ready 
					CardCommandFlag = SENDINS;
					CardStateFlag = NOCOMMAND;
				}
				break;
			default:
				break;
		}
		break;

	case CARDCOMMAND3:							// It's a command that only LC data to send but no LE data to receive
		switch ( CardCommandFlag ) {
			case SENDINS:
				ReceiveDataLength = 1;																	//Receive two status bytes
				CardSend(INSHeadLength, &UsbMessageBuffer[CLA]);				// send command head
				CardCommandFlag = WAITRECEIVEINS;
				break;
			case WAITRECEIVEINS:
				if (bCommunicateEndFlag ) {			// if communicate end or waiting time over
					if ( CardDataNum == 1 ) {												// receive INS correctly
						CardCommandFlag = SENDLCDATA;
					}
					else {																				// receive INS fail
						UsbMessageBuffer[RecDataLength] = CardDataNum;
						Set_bDataReadyFlag;														// indicate that data is ready 
						CardCommandFlag = SENDINS;									// return error information
						CardStateFlag = NOCOMMAND;
					}
				}
				break;
			case SENDLCDATA:
				ReceiveDataLength = 2;
				CardSend( UsbMessageBuffer[Lc], &UsbMessageBuffer[LcData] );
				CardCommandFlag = WAITRECEIVESW;
				break;
			case WAITRECEIVESW:
				if (bCommunicateEndFlag ) {			// if communicate end or waiting time over
					UsbMessageBuffer[RecDataLength] = CardDataNum;
					Set_bDataReadyFlag;														// indicate that data is ready 
					CardCommandFlag = SENDINS;
					CardStateFlag = NOCOMMAND;
				}
				break;
			default:
				break;
		}
		break;

	case CARDCOMMAND4:													// Lc data send and le data receive
		switch ( CardCommandFlag ) {
			case SENDINS:
				ReceiveDataLength = 1;																	//Receive two status bytes
				CardSend(INSHeadLength, &UsbMessageBuffer[CLA]);				// send command head
				CardCommandFlag = WAITRECEIVEINS;
				break;
			case WAITRECEIVEINS:
				if (bCommunicateEndFlag ) {			// if communicate end or waiting time over
					if ( CardDataNum == 1 ) {												// receive INS correctly
						CardCommandFlag = SENDLCDATA;
					}
					else {																				// receive INS fail
						UsbMessageBuffer[RecDataLength] = CardDataNum;
						Set_bDataReadyFlag;														// indicate that data is ready 
						CardCommandFlag = SENDINS;									// return error information
						CardStateFlag = NOCOMMAND;
					}
				}
				break;
			case SENDLCDATA:
				ReceiveDataLength = 2;
				CardSend( UsbMessageBuffer[Lc], &UsbMessageBuffer[LcData] );
				CardCommandFlag = WAITRECEIVELEDATA;
				break;
			case WAITRECEIVELEDATA:
				if (bCommunicateEndFlag ) {			// if communicate end or waiting time over
					if ( UsbMessageBuffer[LeData] == 0x61 ) {
						UsbMessageBuffer[Lc] = UsbMessageBuffer[LeData + 1];
						UsbMessageBuffer[CLA]= 0x00;
						UsbMessageBuffer[INS] = 0xC0;
						UsbMessageBuffer[P1] = UsbMessageBuffer[P2] = 0x00;
						CardCommandFlag = SENDGETRES;
					}
					else {
						UsbMessageBuffer[RecDataLength] = CardDataNum;
						Set_bDataReadyFlag;														// indicate that data is ready 
						CardCommandFlag = SENDINS;									// return error information
						CardStateFlag = NOCOMMAND;
					}
				}
				break;
			case SENDGETRES:
				IccCommandINS = 0xC0;													// record new INS
				ReceiveDataLength = UsbMessageBuffer[Lc] + 2 + 1; // receive length = data length + 2 SW +1 INS
				CardSend(INSHeadLength, &UsbMessageBuffer[CLA]);				// send GetResponse Command
				CardCommandFlag = WAITRECEIVERES;
				break;
			case WAITRECEIVERES:
				if (bCommunicateEndFlag ) {			// if communicate end or waiting time over
					UsbMessageBuffer[RecDataLength] = CardDataNum;
					Set_bDataReadyFlag;														// indicate that data is ready 
					CardCommandFlag = SENDINS;									// return error information
					CardStateFlag = NOCOMMAND;
				}
				break;
			default:
				break;
		}
		break;

	default:
		break;
	}
}
}           


/**************** (c) 2001  STMicroelectronics **********************/    


////////////////////////////////////////////////dy
   
   
extern unsigned char MSL_Param_Buffer[]; 
 
char uic_pass_verify()                 //检验密码
 {   
    char PassBackup[10];	
    char DataLen ;   
    Set_bTxOutCompleteFlag;    
    //UsbMessageBuffer[ReportID] = 0x01;
    UsbMessageBuffer[CLA]= 0x00;
    UsbMessageBuffer[INS] = 0x20;
    UsbMessageBuffer[P1] = UsbMessageBuffer[P2] = 0x00; 
    UsbMessageBuffer[Lc] = 6;   
    
    for(DataLen = 0; DataLen < 6 ;DataLen++)
       {
         PassBackup[DataLen] = UsbMessageBuffer[Lc +1+ DataLen] = MSL_Param_Buffer[2+DataLen*2];
    
       }     
    
     
    if(pUsbMessageBuffer[0] ==0x90 && pUsbMessageBuffer[1] == 0x00)
       {
         return    APDU_Ture;   
       }
    else 
         return    APDU_False;
  }
                                    
                                    
char uic_creat_file()
 {         
 
    Set_bTxOutCompleteFlag;    
    UsbMessageBuffer[CLA]= 0x80;
    UsbMessageBuffer[INS] = 0xe0;
    UsbMessageBuffer[P1] = 0x3f;
    UsbMessageBuffer[P2] = 0x01; 
    UsbMessageBuffer[Lc] = 0x0a;
    UsbMessageBuffer[0x07] = 0x38;
    UsbMessageBuffer[0x08] = 0xff;                                  
    UsbMessageBuffer[0x09] = 0xff;
    UsbMessageBuffer[0x0a] = 0x02;
    UsbMessageBuffer[0x0b] = 0x80;
    UsbMessageBuffer[0x0c] = 0x80;
    UsbMessageBuffer[0x0d] = 0x81;
    UsbMessageBuffer[0x0e] = 0x00; 
    UsbMessageBuffer[0x0f] = 0xa1;
    UsbMessageBuffer[0x10] = 0x01; 
    
    HID_XfrApdu();
    IFD_XfrT0();
   
    if(pUsbMessageBuffer[0] ==0x90 && pUsbMessageBuffer[1] == 0x00)
       {
         return    APDU_Ture;   
       }
    else 
         return    APDU_False;
  }

                                     
///////////////////////////////////////////////////dy

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -