📄 testpad03.c
字号:
debug_disps(1, tmp_str + 10, 8);
//bcd_to_asc1 ( (unsigned char*)s, tmp, 16 , 0 );
return SUCC;
}
int test_magcard(unsigned char hd_no)
{
short sRet = 0;
DevHandle hMagHandle;
unsigned char ucStatus;
ET_MAGCARD stTrk2, stTrk3;
char szDispBuf[256];
display(1, "Begin Test MagCard\n");
sRet = OpenMagcard(hd_no, EM_RECARD, 60, &hMagHandle, &ucStatus);
if (sRet != SUCC)
{
display(1, "(ucOpenMagcard):");
GetErrorMessage(sRet, szDispBuf);
display(2, "%s", szDispBuf);
}
if (ucStatus != EM_SUCCESS)
{
display(1, "(ucOpenMagcard):");
GetErrorMessage((short) ucStatus, szDispBuf);
display(2, "%s", szDispBuf);
}
display(1, "Begin ReCard\n");
sRet = Recard(hd_no, hMagHandle, 0, 0x01, &stTrk2, &stTrk3, &ucStatus);
if (sRet != SUCC)
{
display(1, "(ucRecard):");
GetErrorMessage(sRet, szDispBuf);
display(2, "%s", szDispBuf);
}
if (ucStatus != EM_SUCCESS)
{
display(1, "(ucRecard):");
GetErrorMessage((short) ucStatus, szDispBuf);
display(2, "%s", szDispBuf);
}
else
{
display(1, "Trk2Flag=%02x\n", stTrk2.ucTrkFlag);
display(2, "%s\n", stTrk2.ucTrkBuf);
display(3, "Trk3Flag=%02x\n", stTrk3.ucTrkFlag);
display(4, "%s\n", stTrk3.ucTrkBuf);
}
display(1, "Begin CloseMagcard\n");
sRet = CloseMagcard(hd_no, &hMagHandle, &ucStatus);
if (sRet != 0)
{
return FAIL;
}
/*
sRet = OpenMagcard(hd_no, 0x01, 100, &hMagHandle, &ucStatus);
if (sRet != SUCC)
{
display(1, "(ucOpenMagcard):");
GetErrorMessage(sRet, szDispBuf);
display(2, "%s", szDispBuf);
}
if (ucStatus != EM_SUCCESS)
{
display(1, "(ucOpenMagcard):");
GetErrorMessage((short) ucStatus, szDispBuf);
display(2, "%s", szDispBuf);
}
sRet = StartTrackIn(hd_no, hMagHandle, &ucStatus);
if (sRet != SUCC)
{
display(1, "(ucStartTrackIn):");
GetErrorMessage(sRet, szDispBuf);
display(2, "%s", szDispBuf);
}
if (ucStatus != EM_SUCCESS)
{
display(1, "(ucStartTrackIn):");
GetErrorMessage((short) ucStatus, szDispBuf);
display(2, "%s", szDispBuf);
}
while (1)
{
//Sleep(500);
sRet = TrackIn(hd_no, hMagHandle, &stTrk2, &stTrk3, &ucStatus);
SetPadTimeout(hd_no, 200);
if (sRet != SUCC)
{
display(1, "(ucTrackIn):");
GetErrorMessage(sRet, szDispBuf);
display(2, "%s", szDispBuf);
}
if (ucStatus == EM_ABOLISH)
{
break;
}
if (ucStatus != EM_SUCCESS)
{
//display ( 1, "(ucTrackIn):" );
GetErrorMessage((short) ucStatus, szDispBuf);
//display ( 2, "%s", szDispBuf );
}
if (ucStatus == EM_SUCCESS)
{
display(1, "Trk2Flag=%02x\n", stTrk2.ucTrkFlag);
display(2, "%s\n", stTrk2.ucTrkBuf);
display(1, "Trk3Flag=%02x\n", stTrk3.ucTrkFlag);
display(3, "%s\n", stTrk3.ucTrkBuf);
break;
}
}
sRet = CloseMagcard(hd_no, &hMagHandle, &ucStatus);
*/
display(2, "End Test MagCard\n");
return SUCC;
}
WORD TestProCard(HICC hCT)
{
unsigned short usSW1SW2;
WORD usRet;
unsigned char ucTmpBuf[255], ucLen = 0;
unsigned char ucSndBuf[255], ucRecBuf[255];
usRet = MifResetPro(hCT, IDLE, 0, ucTmpBuf, &ucLen, &usSW1SW2);
//选择文件
displays(3, 1, "Begin Select File...\n");
ucSndBuf[0] = 0x3f;
ucSndBuf[1] = 0x00;
memset(ucRecBuf, 0, sizeof(ucRecBuf));
usRet = MifExchangePro(hCT, 0, 0xa4, 0, 0x00, 0x02, ucSndBuf, 0x0, ucRecBuf, &ucLen, &usSW1SW2);
if (usRet != SUCC)
{
GetErrorMessage(usRet, ucTmpBuf);
display(2, ucTmpBuf);
}
else
{
display_ic_status();
}
//获得随机数
displays(2, 1, "Begin Get Random...\n");
memset(ucRecBuf, 0, sizeof(ucRecBuf));
usRet = MifExchangePro(hCT, 0, 0x84, 0, 0x00, 0x00, ucSndBuf, 0x04, ucRecBuf, &ucLen, &usSW1SW2);
if (usRet != SUCC)
{
GetErrorMessage(usRet, ucTmpBuf);
display(2, ucTmpBuf);
}
else
{
display_ic_status();
}
return SUCC;
}
WORD TestMifCard(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];
BuzzerMs(hCT, 5);
memset(ucKey, 0xff, sizeof(ucKey));
memset(ucCardId, 0, sizeof(ucCardId));
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);
//读数据
ucSector = 1;
PubDisplays(1, 1, "MifRead...........");
usRet = MifRead(hCT, (uchar) (4 * ucSector), ucTmpBuf, &ucStatus);
if (usRet != ICCER_OK)
{
return usRet;
}
GetMifErrMessage(ucStatus, szErrMessage);
PubDisplays(1, 1, "%s\n", szErrMessage);
for (i = 0; i < 16; i++)
{
PubDisplays(1, 1, "%02X ", ucTmpBuf[i]);
}
/*
//准备写数据
ucSector = 8;
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 0;
}
void test_pinpad(void)
{
char c = 0;
char szBuf[100];
char mac_data[512];
unsigned char ucMasterKeyID = 0;
unsigned char ucWorkKeyID = 1;
unsigned char ucMacKeyID = 1;
unsigned char ucLen = 0;
printf("Beginning test of PinPad API...\n");
c = reset_pinpad();
printf("reset pinpad status = [%c]\n", c);
//显示
c = display_752(1, "123456789");
printf("display_752 status = [%c]\n", c);
c = display_pinpad("Pls Input Pin");
printf("display_pinpad status = [%c]\n", c);
if (c == 'C')
{
return;
}
//密码输入
c = load_card_no ( "12345678" );
printf("load_card_no status = [%c]\n", c);
printf("Pls Input Key......\n");
//输入密码的超时需要在函数外面设置(缺省60s)
SetPadTimeout(1, 122000);
memset(szBuf, 0, sizeof(szBuf));
c = read_pinpad(6, 1, 1, szBuf);
if (c == 'C')
{
//通信超时退出
reset_pinpad();
}
printf("read_pinpad status = [%c]\n", c);
debug_disps(1, szBuf, 16);
//用户数据加密, 使用workkey加密
memset(szBuf, 0, sizeof(szBuf));
c = load_card_no ( "12345678" );
user_encrypt("123456", szBuf);
debug_disps(1, szBuf, 16);
c = load_master_key(0, "11111111");
printf("load_master_key status = [%c]\n", c);
//下载主密钥
c = select_master_key(0);
printf("select_master_key status = [%c]\n", c);
c = load_workkey( "\x65\x5E\xA6\x28\xCF\x62\x58\x5F" );
printf("load_workkey status = [%c]\n", c);
c = select_master_key(0);
c = load_mac_key ( "\x65\x5E\xA6\x28\xCF\x62\x58\x5F" );
printf("load_mac_key status = [%c]\n", c);
//MAC计算
memset(mac_data, 0x55, sizeof(mac_data));
c = load_mac_data(mac_data, szBuf, 248 );
printf("load_mac_data status = [%c]\n", c);
debug_disps(1, szBuf, 8);
//下载主密钥
c = EA_ucLoadKey(EM_pin_MASTERKEY, ucMasterKeyID, 8, "11111111");
printf("EA_ucLoadKey status = [%c]\n", c);
//选择主密钥
c = EA_ucSelectKey(EM_pin_MASTERKEY, ucMasterKeyID);
printf("EA_ucSelectKey status = [%c]\n", c);
//下载工作密钥
c = EA_ucLoadKey(EM_pin_WORKKEY, ucWorkKeyID, 8, "\x65\x5E\xA6\x28\xCF\x62\x58\x5F");
printf("EA_ucLoadKey status = [%c]\n", c);
//下载Mac密钥
c = EA_ucSelectKey(EM_pin_MASTERKEY, ucMasterKeyID);
c = EA_ucLoadKey(EM_pin_MACKEY, ucMacKeyID, 8, "\x65\x5E\xA6\x28\xCF\x62\x58\x5F");
printf("EA_ucLoadKey status = [%c]\n", c);
//检查密钥
c = EA_ucCheckKeyNew(EM_pin_MACKEY, ucMacKeyID);
printf("EA_ucCheckKeyNew status = [%c]\n", c);
c = EA_ucCheckKeyNew(EM_pin_MACKEY, ucMacKeyID+1);
printf("EA_ucCheckKeyNew status = [%c]\n", c);
c = EA_ucCheckKeyNew(EM_pin_WORKKEY, ucWorkKeyID);
printf("EA_ucCheckKeyNew status = [%c]\n", c);
c = EA_ucCheckKeyNew(EM_pin_WORKKEY, ucWorkKeyID+1);
printf("EA_ucCheckKeyNew status = [%c]\n", c);
//PIN输入
c = EA_ucSelectKey(EM_pin_WORKKEY, ucWorkKeyID);
EA_ucReadPinpadNew(6, EM_pin_KEYOFF, EM_pin_ENCRYPTON, &ucLen, szBuf);
printf("Input Pin [%c] Len=%d\n", c, ucLen);
debug_disps(1, szBuf, 16);
c = display_730(1, "测试结束End");
printf("display_730 status = [%c]\n", c);
return;
//关闭通讯口1
}
short test_key_system(unsigned char hd_no)
{
short ret;
unsigned char origin_key[9];
unsigned char m_key[13], tmp[16], data1[16], key_16[17];
unsigned char tmp_data[100], tmp_data1[100];
unsigned char random[50];
unsigned char tmp_str[100];
char err_str[100];
unsigned char pin_key[] = "22345678", mac_key[] = "\a\0\0\0\0\0\0\0";
unsigned char file_key[] = "\1\0\0\0\0\0\0\0";
memset(tmp_str, 0, sizeof(tmp_str));
memcpy(tmp_str, "123456", 6);
ret = Encrypt_data(hd_no, "_PWD", tmp_str, tmp_data, DES_E);
/* origin_key must be same with 750's origin_key */
memcpy(origin_key, "\x11\x45\xf9\x5b\x87\xa3\x00\xcd", 8);
memcpy(m_key, "\x01\x02\x03\x04\x05\x06\x07\x08", 8);
memcpy(data1, m_key, 8);
//DES ( origin_key, data1, data1 );
//DES ( m_key, m_key, tmp );
//只有STAR-750p STAR-752P才能使用该函数
ret = write_mast(hd_no, 1, data1, tmp);
if (ret != SUCC)
{
display(1, "(write_mast):");
GetErrorMessage(ret, err_str);
display(2, "%s", err_str);
inkey(0);
}
//DES ( m_key, mac_key, data1 );
//DES ( mac_key, mac_key, tmp );
ret = write_key(hd_no, 1, "_MAC", data1, tmp);
if (ret != SUCC)
{
display(1, "(write_key):");
GetErrorMessage(ret, err_str);
display(2, "%s", err_str);
inkey(0);
}
ret = write_user_key(hd_no, "_MAC", mac_key);
if (ret != SUCC)
{
display(1, "(write_user_key):");
GetErrorMessage(ret, err_str);
display(2, "%s", err_str);
inkey(0);
}
ret = write_user_key(hd_no, "FILE", file_key);
if (ret != SUCC)
{
display(1, "(write_user_key):");
GetErrorMessage(ret, err_str);
display(2, "%s", err_str);
inkey(0);
}
ret = del_work_key(hd_no, "PIN_");
if (ret != SUCC)
{
displays(1, 1, "(del_work_key):");
GetErrorMessage(ret, err_str);
display(2, "%s", err_str);
inkey(0);
}
//DES ( mac_key, pin_key, tmp );
ret = write_work(hd_no, "_PIN", tmp, "_MAC");
if (ret != SUCC)
{
displays(1, 1, "(write_work):");
GetErrorMessage(ret, err_str);
display(2, "%s", err_str);
inkey(0);
}
// test encrypt function
memcpy(tmp_str, "11111111", 8);
ret = Encrypt_data(hd_no, "_MAC", tmp_str, tmp_data, DES_E);
if (ret != SUCC)
{
display(1, "(Encrypt_data):");
GetErrorMessage(ret, err_str);
display(2, "%s", err_str);
inkey(0);
}
memcpy(random, "\0\0\0\0\0\0\0\0", 8);
ret = gen_MAC(hd_no, "_MAC", random, 8, tmp_str, tmp_data1);
//genmac( mac_key, random, 8, tmp_str, tmp_data);
if (memcmp(tmp_data1, tmp_data, 8))
{
return FAIL;
}
//DES ( mac_key, tmp_str, tmp_data1 );
if (memcmp(tmp_data1, tmp_data, 8))
{
return FAIL;
}
//test triple_des
cls();
displays(1, 1, "triple_des function\n");
memcpy(key_16, mac_key, 8);
memcpy(key_16 + 8, pin_key, 8);
ret = write_user_key(hd_no, "KEYL", key_16);
if (ret != SUCC)
{
display(1, "(write_user_key):");
GetErrorMessage(ret, err_str);
display(2, "%s", err_str);
return (FAIL);
}
ret = write_user_key(hd_no, "KEYR", key_16 + 8);
if (ret != SUCC)
{
displays(1, 1, "(write_user_key):");
GetErrorMessage(ret, err_str);
display(2, "%s", err_str);
return (FAIL);
}
displays(7, 1, "End Testing Key System\n");
displays(8, 1, "Press any key to continue\n");
inkey(0);
cls();
return SUCC;
}
int main(int argc, char *argv[])
{
char port_name[12];
short ret = 0;
unsigned char hd_no = 1, tmp_str[100];
unsigned int uiLen;
#ifdef _POS_
do
{
#endif
displays(1, 1, "Beginning test of Pad03...\n");
//对于7100用参数=0, 对于750,用参数=1000或=2000(750早期版本)
//SetInitDelayTime(2000);
//设置通信协议 0--ASCII 1--BCD
SetCommuMode(0);
strcpy(port_name, "COM1");
//strcpy(port_name, "/dev/ttyS1");
//InitPad(port_name);
ret = init_port(port_name, PAD9600);
if (ret != 0)
{
displays(2, 1, "PinPad Not Ready![%d]\n", ret);
goto prg_end;
}
displays(2, 1, "Open Serial port Sucessful! \n");
ret = ReadVersionPad(hd_no, tmp_str);
if (ret == 0)
{
displays(4, 1, "PinPad's Version is: ");
printf("%s\n", tmp_str);
if (!memcmp(tmp_str, "STAR-752", 8))
{
reader_type = READER_STAR752;
}
if (!memcmp(tmp_str, "STAR-750", 8))
{
reader_type = READER_STAR750;
}
if (!memcmp(tmp_str, "SCE-7100", 8))
{
reader_type = READER_STAR7100;
}
displays(8, 1, "Press any key to continue\n");
inkey(0);
cls();
}
//密码键盘
//test_pinpad();
/*
if (reader_type == READER_STAR7100)
{
//磁卡
if (test_magcard(hd_no) != 0)
{
return FAIL;
}
//读写参数
ret = WritePara(hd_no, 0, 10, "0123456789");
ret = ReadPara(hd_no, 0, 10, &uiLen, tmp_str);
}
*/
//PAD03密钥系统
//test_key_system(hd_no);
//TestMifCard(hd_no);
//TestProCard(hd_no);
//测试存储卡
//test_4442(hd_no);
//test_4428(hd_no);
//键盘测试
//test_input_key(hd_no);
//测试CPU卡
test_cpu_card(hd_no);
//显示
//test_display(hd_no);
displays(1, 1, "\nBegin test input key from PINPAD......! \n");
closecom(hd_no);
displays(7, 1, "End All Testing \n");
displays(8, 1, "Press any key to continue\n");
inkey(0);
cls();
prg_end:
#ifdef _POS_
;
} while (1);
#else
return SUCC;
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -