📄 testmif.c
字号:
/******************************************************************************
*
* TEST711F.C V2.3.0.0
*
*
* Author :- Shen Qun
* System :- Windowns, STAR POS, UNIX
* Last modified :- 2004-07-24, 2005-08-26
* Card type :- MIFER1卡,MIFPRO卡
* Code :-
*
* Copyright : Copyright 2000
* notice : All rights reserved.
******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "LD_Reader.h"
#ifdef _POS_
#include "main.h"
#endif
HICC hiCC;
#ifndef _POS_
void PubDisplays(char dln, char dlc, char *pszFmt, ...)
{
va_list ap;
int arg;
va_start (ap, pszFmt); /* Variable argument begin */
arg = va_arg(ap,int);
printf( pszFmt, arg );
va_end (ap); /* Variable argument end */
}
#else
void PubDisplays(char dln, char dlc, char *pszFmt, ...)
{
char szDispStr[500];
va_list VarList;
va_start(VarList, pszFmt);
vsprintf(szDispStr, pszFmt, VarList);
va_end(VarList);
displays(dln, dlc, "%s", szDispStr);
return;
}
#endif
int TestCpuCard_711F(HICC hCT)
{
WORD usStatus,usRet, usRetLen=0;
int i;
unsigned char ucResp[100], data[100];
unsigned char ucRespLen;
//usRet = ICCTransmitAsc711F(hCT, 0, (unsigned char*)"00A40000023F00", 7, data, &usRetLen);
//PubDisplays(1, 1, "\nTestCpuCard_711F Enter (Must Using Reader 711F)\n" );
//CPU卡上电复位
usRet = SAM_ICCPowerUp(hCT, ucResp, &ucRespLen);
if ( usRet != 0) {
PubDisplays(1, 1, "Reset Err %02X\n", usRet );
return -1;
}
for ( i=0; i<ucRespLen; i++ )
PubDisplays(1, 1, "%02X ", ucResp[i] );
PubDisplays(1, 1, "\n" );
for ( i=0; i<ucRespLen; i++ )
PubDisplays(1, 1, "%2c ", ucResp[i] );
//获得随机数
usRet = SAM_ICCOutGoing(hCT, 0x00, 0x84, 0, 0, 8, data, &usStatus);
PubDisplays(1, 1, "\nGet Random 00 84 00 00 08 \n" );
PubDisplays(1, 1, "Outgoing SW=%04X\n", usStatus );
//选择文件
data [0] = 0x3f;
data [1] = 0x00;
usRet = SAM_ICCInComing(hCT, 0, 0xa4, 0,0, 2, data, &usStatus);
PubDisplays(1, 1, "Select File 3F00 00 A4 00 02 3f 00 \n" );
PubDisplays(1, 1, "Incoming SW=%04X\n", usStatus );
if ( HIBYTE(usStatus) == 0x61 ) {
usRet = SAM_ICCOutGoing(hCT, 0x00, 0xc0, 0, 0, LOBYTE(usStatus), data, &usStatus );
PubDisplays(1, 1, "Outgoing SW=%04X\n", usStatus );
}
//usRet = ICCTransmitAsc711F(hCT, 0, (unsigned char*)"00A40000023F00", 7, data, &usRetLen);
PubDisplays(1, 1, "TestCpuCard_711F Exit\n" );
return 0;
}
uchar IncSector(HICC hiCC, ulong ulAmount, uchar ucBlock)
{
unsigned char ucStatus, ucTmpBuf[5];
WORD usRet;
if(ucBlock<0||ucBlock>63) return 124;
LongToCharIntel(ulAmount, ucTmpBuf);
usRet = MifIncrement(hiCC, ucBlock, ucTmpBuf, &ucStatus);
if (usRet != ICCER_OK) return 255;
if (ucStatus != 0 ) return ucStatus;
usRet = MifTransfer(hiCC, ucBlock, &ucStatus);
if (usRet != ICCER_OK) return 255;
if (ucStatus != 0 ) return ucStatus;
return 0;
}
uchar DecSector(HICC hiCC, ulong ulAmount, uchar ucBlock)
{
unsigned char ucStatus, ucTmpBuf[5];
WORD usRet;
if(ucBlock<0||ucBlock>63) return 124;
LongToCharIntel(ulAmount, ucTmpBuf);
usRet = MifDecrement(hiCC, ucBlock, ucTmpBuf, &ucStatus);
if (usRet != ICCER_OK) return 255;
if (ucStatus != 0 ) return ucStatus;
usRet = MifTransfer(hiCC, ucBlock, &ucStatus);
if (usRet != ICCER_OK) return 255;
if (ucStatus != 0 ) return ucStatus;
return 0;
}
WORD TestMif_711FTypeB(HICC hCT)
{
WORD usRet;
unsigned char ucStatus, ucLen = 0;
unsigned char ucTmpBuf[17], ucCardId[5];
unsigned char ucCid=0;
unsigned char ucProtocolType;
unsigned short usSw1Sw2;
char szErrMessage[100];
int i;
usRet = MifTypeSelect(hCT, 1, &ucStatus);
if (usRet != ICCER_OK ) return usRet;
GetMifErrMessage(ucStatus, szErrMessage);
PubDisplays(1, 1, "%s\n", szErrMessage);
usRet = MifRequestB(hCT, IDLE, 0, 0, ucTmpBuf, &ucLen, &ucStatus);
if (usRet != ICCER_OK ) return usRet;
GetMifErrMessage(ucStatus, szErrMessage);
PubDisplays(1, 1, "%s\n", szErrMessage);
ucProtocolType = ucTmpBuf[10] & 0x01;
for ( i=0; i<ucLen; i++ )
PubDisplays(1, 1, "%02X ", ucTmpBuf[i] );
PubDisplays(1, 1, "\n" );
memcpy(ucCardId, ucTmpBuf+1, 4);
/*
usRet = MifSlotMarker(hCT, 1, ucCardId, &ucLen, &ucStatus);
if (usRet != ICCER_OK ) return usRet;
GetMifErrMessage(ucStatus, szErrMessage);
PubDisplays(1, 1, ("%s\n", szErrMessage);
*/
usRet = MifPiccAttrib(hCT, ucCardId, 0, 7, ucProtocolType, ucCid, ucTmpBuf, &ucLen, &ucStatus);
if (usRet != ICCER_OK ) return usRet;
GetMifErrMessage(ucStatus, szErrMessage);
PubDisplays(1, 1, "%s\n", szErrMessage);
/*
usRet = MifDeselectB(hCT, ucCid, &ucStatus);
if (usRet != ICCER_OK ) return usRet;
GetMifErrMessage(ucStatus, szErrMessage);
PubDisplays(1, 1, "%s\n", szErrMessage);
*/
usRet = MifExchangeB(hCT, ucCid, 0x00, 0x84, 0x00, 0x00, 0, ucTmpBuf, 8, ucTmpBuf, &ucLen, &usSw1Sw2);
if (usRet != ICCER_OK ) return usRet;
GetMifErrMessage(ucStatus, szErrMessage);
PubDisplays(1, 1, "\nGet Random 00 84 00 00 08 \n" );
PubDisplays(1, 1, "%s SW1SW2 = %x\n", szErrMessage, usSw1Sw2);
ucTmpBuf[0] = 0x3f;
ucTmpBuf[1] = 0x00;
usRet = MifExchangeB(hCT, ucCid, 0x00, 0xA4, 0x00, 0x00, 2, ucTmpBuf, 0, ucTmpBuf, &ucLen, &usSw1Sw2);
if (usRet != ICCER_OK ) return usRet;
GetMifErrMessage(ucStatus, szErrMessage);
PubDisplays(1, 1, "Select File 3F00 00 A4 00 02 3f 00 \n" );
PubDisplays(1, 1, "%s SW1SW2 = %x\n", szErrMessage, usSw1Sw2);
return usRet;
}
WORD TestMif_711F(HICC hCT)
{
int i;
unsigned char ucCardType[4], ucKey[10], ucSector=1, ucCardId[4];
unsigned char ucStatus, ucSize;
WORD usRet;
unsigned char ucTmpBuf[17];
char szErrMessage[100];
memset(ucKey, 0xf1, sizeof(ucKey));
for( i=0; i<2; i++ ){
//完成在天线范围内的TYPE A卡的激活操作
usRet = MifRequest(hCT, 0, ucCardType, &ucStatus);
if (ucStatus == 0 )
break;
}
//防冲突处理,在被激活的多张卡片中选择一张卡
PubDisplays(1, 1, "MifAnticoll.......");
usRet = MifAnticoll(hCT, ucCardId, &ucStatus);
if (usRet != ICCER_OK ) return usRet;
GetMifErrMessage(ucStatus, szErrMessage);
PubDisplays(1, 1, "%s\n", szErrMessage);
//选择指定卡号的卡
PubDisplays(1, 1, "MifSelect.........");
usRet = MifSelect(hCT, ucCardId, &ucSize, &ucStatus);
if (usRet != ICCER_OK ) return usRet;
GetMifErrMessage(ucStatus, szErrMessage);
PubDisplays(1, 1, "%s\n", szErrMessage);
//KEYA密钥地址=ucSector
//KEYB密钥地址=ucSector+0x10
//选择指定的地址的存储密钥
PubDisplays(1, 1, "MifLoadkey........");
usRet = MifLoadkey(hCT, ucSector, ucKey, &ucStatus);
if (usRet != ICCER_OK ) return usRet;
GetMifErrMessage(ucStatus, szErrMessage);
PubDisplays(1, 1, "%s\n", szErrMessage);
//选择指定地址的存储密钥认证卡片
PubDisplays(1, 1, "MifAuth...........");
usRet = MifAuth(hCT, ucSector, ucSector, &ucStatus);
if (usRet != ICCER_OK ) return usRet;
GetMifErrMessage(ucStatus, szErrMessage);
PubDisplays(1, 1, "%s\n", szErrMessage);
//根据提供的密钥对指定的扇区进行认证
PubDisplays(1, 1, "MifAuthToRam...... " );
usRet = MifAuthToRam(hCT, ucSector, KEYA, ucKey, &ucStatus);
if (usRet != ICCER_OK ) return usRet;
GetMifErrMessage(ucStatus, szErrMessage);
PubDisplays(1, 1, "%s\n", szErrMessage);
//准备写数据
for(i=0; i<16; i++ )
ucTmpBuf[i] = i;
PubDisplays(1, 1, "MifWrite...... " );
usRet = MifWrite(hCT, (uchar)(4*ucSector+1), ucTmpBuf, &ucStatus);
if (usRet != ICCER_OK ) return usRet;
GetMifErrMessage(ucStatus, szErrMessage);
PubDisplays(1, 1, "%s\n", szErrMessage);
//读数据
PubDisplays(1, 1, "MifRead...........");
usRet = MifRead(hCT, (uchar)(4*ucSector+1), ucTmpBuf, &ucStatus);
if (usRet != ICCER_OK ) return usRet;
GetMifErrMessage(ucStatus, szErrMessage);
PubDisplays(1, 1, "%s\n", szErrMessage);
//准备数值块
PubDisplays(1, 1, "MifWrite..........");
memcpy(ucTmpBuf, "\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\xff\x00\xff", 16 );
usRet = MifWrite(hCT, (uchar)(4*ucSector+1), ucTmpBuf, &ucStatus);
if (usRet != ICCER_OK ) return usRet;
GetMifErrMessage(ucStatus, szErrMessage);
PubDisplays(1, 1, "%s\n", szErrMessage);
PubDisplays(1, 1, "IncSector10.......");
ucStatus = IncSector(hCT, 10, (uchar)(4*ucSector+1));
GetMifErrMessage(ucStatus, szErrMessage);
PubDisplays(1, 1, "%s\n", szErrMessage);
//读数据
usRet = MifRead(hCT, (uchar)(4*ucSector+1), ucTmpBuf, &ucStatus);
if (usRet != ICCER_OK ) return usRet;
for ( i=0; i<16; i++ )
PubDisplays(1, 1, "%02X ", ucTmpBuf[i] );
PubDisplays(1, 1, "\nDecSector9........");
ucStatus = DecSector(hCT, 9, (uchar)(4*ucSector+1));
GetMifErrMessage(ucStatus, szErrMessage);
PubDisplays(1, 1, "%s\n", szErrMessage);
//读数据
usRet = MifRead(hCT, (uchar)(4*ucSector+1), ucTmpBuf, &ucStatus);
if (usRet != ICCER_OK ) return usRet;
for ( i=0; i<16; i++ )
PubDisplays(1, 1, "%02X ", ucTmpBuf[i] );
return usRet;
}
void main(void)
{
HICC hCT;
WORD usRet = 0;
//建立物理端口(COM1)与读写器711F之间通讯的逻辑句柄
usRet = Mif_PortInit("COM1", &hCT, 28800);
if ( usRet != 0 )
{
PubDisplays(1, 1, "Mif_PortInit Error %x", usRet );
usRet = Mif_Close ( hCT );
return ;
}
//SetReadWriteDelay(100,0);
TestMif_711F(hCT);
usRet = SetLed(hCT, 0, 1);
usRet = SetLed(hCT, 0, 0);
usRet = SetLed(hCT, 1, 1);
usRet = SetLed(hCT, 1, 0);
usRet = BuzzerMs(hCT, 4);
if ( usRet != 0 )
{
PubDisplays(1, 1, "BuzzerMs Error %x", usRet );
usRet = Mif_Close ( hCT );
return ;
}
//TestMif_711FTypeB(hCT);
//TestCpuCard_711F(hCT);
//TestMif_711F(hCT);
usRet = Mif_Close ( hCT );
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -