📄 hid_usb.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 + -