📄 mtestdlg.cpp
字号:
if (hCardHandle[index]>0) //enable Button4,5 visible
{
pButton4->EnableWindow(TRUE);
pButton5->EnableWindow(TRUE);
}
else
{
pButton4->EnableWindow(FALSE);
pButton5->EnableWindow(FALSE);
}
}
void CMtestDlg::OnOK()
{
// TODO: Add extra validation here
OnButton5();
}
void CMtestDlg::OnClickedOk()
{
// TODO: Add your control notification handler code here
CDialog::OnOK();
}
/*
Card Reset
0084000008SW9000
0082000008<EA57415443484441544154696D65434F53>SW9000
800E000000SW9000
80E00000073F0100FFF0FFFFSW9000
80D401001539F0FA0AFF57415443484441544154696D65434F53SW9000
80E02D000E383C00F0EF1FFFFF504B43533131SW9000
//Select ADF 2D00
00A40000022D00SW9000
//Create Key File
80E00000073F0100FFF0FFFFSW9000
//Add USER_PIN
80D401010D3AF0EF0133313233343536FFFFSW9000
//Add SO_PIN
80D401010D3BF0F00133313233343536FFFFSW9000
//Create PriKey File 0x11
80E00011073D014AF0F0F0FFSW9000
//Create PubKey File 0x26
80E00026073E0100F0F0F0FFSW9000
//*/
void CMtestDlg::OnButton6()
{
int rv;
BYTE dwLenr;
BYTE pinData[260],respData[260],pSOPINdata[8],pPINData[8];
BYTE ExtAutKey[16],sourData[50],DEST[50];
memset(pSOPINdata,0xFF,8);
memset(pPINData,0xFF,8);
//选择3F00 (MF)
//00 A4 00 00 02 3F00
memcpy(pinData,"\x3F\x00",2);
if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x00,0xA4,0x00,0x00,0x02,pinData,0x00,respData,&dwLenr)) != RV_OK)
{
AfxMessageBox("Select MF Failed !");
return;
}
//外部认证流程
//取8字节随机数
if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x00,0x84,0x00,0x00,0x00,NULL,0x08,respData,&dwLenr)) != RV_OK)
{
AfxMessageBox("Get Random Failed !");
return;
}
//3DES
memcpy(sourData,respData,8);
memcpy(ExtAutKey,"\x57\x41\x54\x43\x48\x44\x41\x54\x41\x54\x69\x6D\x65\x43\x4F\x53",16);
TripleDesEncrypt(sourData,DEST,ExtAutKey);
memcpy(pinData,DEST,8);
//外部认证
if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x00,0x82,0x00,0x00,0x08,pinData,0x00,respData,&dwLenr)) != RV_OK)
{
AfxMessageBox("EA Failed !");
return;
}
//擦除卡片
//80 0E 00 00 00
if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0x0E,0x00,0x00,0x00,pinData,0x00,respData,&dwLenr)) != RV_OK)
{
AfxMessageBox("Erase Failed !");
return;
}
//MF下创建Key文件
//80 E0 00 00 07 3F0020FFEFFFFF
memcpy(pinData,"\x3F\x00\x20\xFF\xF0\xFF\xFF",7);
if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0xE0,0x00,0x00,0x07,pinData,0x00,respData,&dwLenr)) != RV_OK)
{
AfxMessageBox("Create KEY File Failed !");
return;
}
//安装卡片主控密钥
//80 D4 01 00 15 39F00A0AFF57415443484441544154696D65434F53
memcpy(pinData,"\x39\xF0\x0A\x0A\xFF\x57\x41\x54\x43\x48\x44\x41\x54\x41\x54\x69\x6D\x65\x43\x4F\x53",21);
if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0xD4,0x01,0x00,0x15,pinData,0x00,respData,&dwLenr)) != RV_OK)
{
AfxMessageBox("Write MK Failed !");
return;
}
//创建DF 3F01
//80E02D000E383C00F0EF1FFFFF504B43533131
memcpy(pinData,"\x38\x3C\x00\xF0\xEF\x1F\xFF\xFF\x50\x4B\x43\x53\x31\x31",0x0E);
if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0xE0,0x2D,0x00,0x0E,pinData,0x00,respData,&dwLenr)) != RV_OK)
{
AfxMessageBox("Create DF Failed !");
return;
}
//选择3F01
//00 A4 00 00 02 2D00
memcpy(pinData,"\x2D\x00",2);
if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x00,0xA4,0x00,0x00,0x02,pinData,0x00,respData,&dwLenr)) != RV_OK)
{
AfxMessageBox("Select DF Failed !");
return;
}
//3F01创建KEY文件
//80 E0 00 00 07 3F0100FFEFFFFF
//80 E0 00 00 07 3F0100FFF0FFFF
memcpy(pinData,"\x3F\x01\x00\xFF\xF0\xFF\xFF",7);
if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0xE0,0x00,0x00,0x07,pinData,0x00,respData,&dwLenr)) != RV_OK)
{
AfxMessageBox("Create KEY File under DF Failed !");
return;
}
//安装3F01下主控密钥
//80 D4 01 00 15 39F00A0AFF57415443484441544154696D65434F53
memcpy(pinData,"\x39\xF0\x0A\x0A\xFF\x57\x41\x54\x43\x48\x44\x41\x54\x41\x54\x69\x6D\x65\x43\x4F\x53",21);
if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0xD4,0x01,0x00,0x15,pinData,0x00,respData,&dwLenr)) != RV_OK)
{
AfxMessageBox("Write MK File under DF Failed !");
return;
}
//安装PIN 密钥标识00,PIN值313233343536
//80 D4 01 00 0B 3AF0EFBB33313233343536
//80 D4 01 01 0D 3AF0EF0133313233343536FFFF
memcpy(pinData,"\x3A\xF0\xEF\x01\x33\x31\x32\x33\x34\x35\x36\xFF\xFF",0x0D);
if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0xD4,0x01,0x01,0x0D,pinData,0x00,respData,&dwLenr)) != RV_OK)
{
AfxMessageBox("Write PIN Failed !");
return;
}
//安装口令重装密钥 标识00 值为0123456789ABCDEF893ADFCEB3233122
//80 D4 01 00 15 38F0AAFF330123456789ABCDEF893ADFCEB3233122
//80D401010D3BF0F00133313233343536FFFF
memcpy(pinData,"\x3B\xF0\xF0\x01\x33\x31\x32\x33\x34\x35\x36\xFF\xFF",0x0D);
if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0xD4,0x01,0x01,0x0D,pinData,0x00,respData,&dwLenr)) != RV_OK)
{
AfxMessageBox("Write SO PIN Failed !");
return;
}
//建立二进制文件 文件标识0001 长度0x10 读写受PIN控制
//80E00011073D014AF0F0F0FF
memcpy(pinData,"\x3D\x01\x4A\xF0\xF0\xF0\xFF",7);
if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0xE0,0x00,0x11,0x07,pinData,0x00,respData,&dwLenr)) != RV_OK)
{
AfxMessageBox("Create Pri File Failed !");
return;
}
//80E00026073E0100F0F0F0FF
memcpy(pinData,"\x3E\x01\x00\xF0\xF0\xF0\xFF",7);
if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0xE0,0x00,0x26,0x07,pinData,0x00,respData,&dwLenr)) != RV_OK)
{
AfxMessageBox("Create Pub File Failed !");
return;
}
AfxMessageBox("发卡完毕");
}
void CMtestDlg::OnButton7()
{
int rv;
int i;
BYTE dwLenr;
BYTE pinData[260],respData[260],pSOPINdata[8],pPINData[8];
BYTE ExtAutKey[16],sourData[50],DEST[50];
BYTE CLA;
BYTE INS;
BYTE P1;
BYTE P2;
BYTE LC;
BYTE LE;
BYTE LeftKey[8];
BYTE RightKey[8];
BYTE TempKey[8];
BYTE MACData[8];
BYTE InitData[8];
BYTE Random[8];
memset(pSOPINdata,0xFF,8);
memset(pPINData,0xFF,8);
// 00A40000023F00 选择3F00
CLA = 0x00;
INS = 0xA4;
P1 = 0x00;
P2 = 0x00;
LC = 0x02;
LE = 0x00;
memcpy(pinData,"\x3F\x00",LC);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
if (rv != RV_OK)
{
return;
}
// 00A40000023F01 选择ADF 3F01
CLA = 0x00;
INS = 0xA4;
P1 = 0x00;
P2 = 0x00;
LC = 0x02;
LE = 0x00;
memcpy(pinData,"\x3F\x01",LC);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
if (rv != RV_OK)
{
return;
}
// 00A40000020001 选择透明文件 0001
CLA = 0x00;
INS = 0xA4;
P1 = 0x00;
P2 = 0x00;
LC = 0x02;
LE = 0x00;
memcpy(pinData,"\x00\x01",LC);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
if (rv != RV_OK)
{
return;
}
// 00D60000021234 写透明文件,因为没有校验PIN,所以会返回0x6982,代表没有写权限
CLA = 0x00;
INS = 0xD6;
P1 = 0x00;
P2 = 0x00;
LC = 0x02;
LE = 0x00;
memcpy(pinData,"\x12\x34",LC);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
// 00B0000010 读透明文件,因为没有校验PIN,所以会返回0x6982,代表没有读权限
CLA = 0x00;
INS = 0xB0;
P1 = 0x00;
P2 = 0x00;
LC = NULL;
LE = 0x10;
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
// 0020000006313233343536 校验PIN,校验后可以达到透明文件的读权限
CLA = 0x00;
INS = 0x20;
P1 = 0x00;
P2 = 0x00;
LC = 0x06;
LE = 0x00;
memcpy(pinData,"\x31\x32\x33\x34\x35\x36",LC);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
if (rv != RV_OK)
{
return;
}
// 00D60000021234 写透明文件,因为已经校验过PIN,所以可以写入数据
CLA = 0x00;
INS = 0xD6;
P1 = 0x00;
P2 = 0x00;
LC = 0x02;
LE = 0x00;
memcpy(pinData,"\x12\x34",LC);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
if (rv != RV_OK)
{
return;
}
// 00B0000010 读透明文件,因为已经校验过PIN,所以会读出数据
CLA = 0x00;
INS = 0xB0;
P1 = 0x00;
P2 = 0x00;
LC = NULL;
LE = 0x10;
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
if (rv != RV_OK)
{
return;
}
// 锁死PIN 做法是连续校验错误的PIN 3次
// 第一次
CLA = 0x00;
INS = 0x20;
P1 = 0x00;
P2 = 0x00;
LC = 0x06;
LE = 0x00;
memcpy(pinData,"\x31\x32\x33\x34\x35\x30",LC);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
//第二次
CLA = 0x00;
INS = 0x20;
P1 = 0x00;
P2 = 0x00;
LC = 0x06;
LE = 0x00;
memcpy(pinData,"\x31\x32\x33\x34\x35\x30",LC);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
//第三次
CLA = 0x00;
INS = 0x20;
P1 = 0x00;
P2 = 0x00;
LC = 0x06;
LE = 0x00;
memcpy(pinData,"\x31\x32\x33\x34\x35\x30",LC);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
// 0020000006313233343536 校验PIN,此时PIN已经锁死,即使校验正确的PIN也会返回0x6983,表示PIN已锁死
CLA = 0x00;
INS = 0x20;
P1 = 0x00;
P2 = 0x00;
LC = 0x06;
LE = 0x00;
memcpy(pinData,"\x31\x32\x33\x34\x35\x36",LC);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
// 重装PIN流程
// 805E000006000011112222<RP0123456789ABCDEF893ADFCEB3233122> 重装PIN,将PIN解锁并修改为000011112222,PIN标识不变
memcpy(LeftKey,"\x01\x23\x45\x67\x89\xAB\xCD\xEF",8);
memcpy(RightKey,"\x89\x3A\xDF\xCE\xB3\x23\x31\x22",8);
for (i=0;i<8;i++)
{
TempKey[i]=LeftKey[i]^RightKey[i];
}
memcpy(InitData,"\x00\x00\x00\x00\x00\x00\x00\x00",8);
MAC(InitData,(unsigned char *)"\x00\x00\x11\x11\x22\x22",6,MACData,TempKey);
CLA = 0x80;
INS = 0x5E;
P1 = 0x00;
P2 = 0x00;
LC = 0x0A;
LE = 0x00;
memcpy(pinData,"\x00\x00\x11\x11\x22\x22",6);
memcpy(pinData+6,MACData,4);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
if (rv != RV_OK)
{
return;
}
// 0020000006000011112222 校验PIN,已经将PIN重装为000011112222
CLA = 0x00;
INS = 0x20;
P1 = 0x00;
P2 = 0x00;
LC = 0x06;
LE = 0x00;
memcpy(pinData,"\x00\x00\x11\x11\x22\x22",LC);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
if (rv != RV_OK)
{
return;
}
// 更新重装密钥流程,重装密钥是可以更新的,但是更新权限受到3F01下主控的控制,必须外部认证后才能达到更新重装密钥的权限
// 0084000008 取8字节随机数
CLA = 0x00;
INS = 0x84;
P1 = 0x00;
P2 = 0x00;
LC = NULL;
LE = 0x08;
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
if (rv != RV_OK)
{
return;
}
// 0082000008<EA57415443484441544154696D65434F53> ,外部认证
memcpy(Random,respData,8);
memcpy(ExtAutKey,"\x57\x41\x54\x43\x48\x44\x41\x54\x41\x54\x69\x6D\x65\x43\x4F\x53",16);
TripleDesEncrypt(Random,DEST,ExtAutKey);
memcpy(pinData,DEST,8);
CLA = 0x00;
INS = 0x82;
P1 = 0x00;
P2 = 0x00;
LC = 0x08;
LE = 0x00;
memcpy(pinData,DEST,LC);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
if (rv != RV_OK)
{
return;
}
// 80D438001000000000000000000000000000000000 更新重装密钥为16字节0
CLA = 0x80;
INS = 0xD4;
P1 = 0x38;
P2 = 0x00;
LC = 0x10;
LE = 0x00;
memcpy(pinData,"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",LC);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
if (rv != RV_OK)
{
return;
}
// 测试更新后的重装密钥,首先锁死PIN,再解锁
// 锁死PIN 做法是连续校验错误的PIN 3次
// 第一次
CLA = 0x00;
INS = 0x20;
P1 = 0x00;
P2 = 0x00;
LC = 0x06;
LE = 0x00;
memcpy(pinData,"\x31\x32\x33\x34\x35\x30",LC);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
//第二次
CLA = 0x00;
INS = 0x20;
P1 = 0x00;
P2 = 0x00;
LC = 0x06;
LE = 0x00;
memcpy(pinData,"\x31\x32\x33\x34\x35\x30",LC);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
//第三次
CLA = 0x00;
INS = 0x20;
P1 = 0x00;
P2 = 0x00;
LC = 0x06;
LE = 0x00;
memcpy(pinData,"\x31\x32\x33\x34\x35\x30",LC);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
// 重装PIN流程
// 805E000006000011112222<RP0123456789ABCDEF893ADFCEB3233122> 重装PIN,将PIN解锁并修改为001122001122,PIN标识不变
memcpy(LeftKey,"\x00\x00\x00\x00\x00\x00\x00\x00",8);
memcpy(RightKey,"\x00\x00\x00\x00\x00\x00\x00\x00",8);
for (i=0;i<8;i++)
{
TempKey[i]=LeftKey[i]^RightKey[i];
}
memcpy(InitData,"\x00\x00\x00\x00\x00\x00\x00\x00",8);
MAC(InitData,(unsigned char *)"\x00\x11\x22\x00\x11\x22",6,MACData,TempKey);
CLA = 0x80;
INS = 0x5E;
P1 = 0x00;
P2 = 0x00;
LC = 0x0A;
LE = 0x00;
memcpy(pinData,"\x00\x11\x22\x00\x11\x22",6);
memcpy(pinData+6,MACData,4);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
if (rv != RV_OK)
{
return;
}
// 0020000006000011112222 校验PIN,已经将PIN重装为001122001122
CLA = 0x00;
INS = 0x20;
P1 = 0x00;
P2 = 0x00;
LC = 0x06;
LE = 0x00;
memcpy(pinData,"\x00\x11\x22\x00\x11\x22",LC);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
if (rv != RV_OK)
{
return;
}
// 修改PIN
// 805E01000D001122001122FF112233445566
CLA = 0x80;
INS = 0x5E;
P1 = 0x01;
P2 = 0x00;
LC = 0x0D;
LE = 0x00;
memcpy(pinData,"\x00\x11\x22\x00\x11\x22\xFF\x11\x22\x33\x44\x55\x66",LC);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
if (rv != RV_OK)
{
return;
}
// 0020000006000011112222 校验PIN,已经将PIN修改为112233445566
CLA = 0x00;
INS = 0x20;
P1 = 0x00;
P2 = 0x00;
LC = 0x06;
LE = 0x00;
memcpy(pinData,"\x11\x22\x33\x44\x55\x66",LC);
rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
if (rv != RV_OK)
{
return;
}
AfxMessageBox("测试完毕");
}
void CMtestDlg::OnButton8()
{
char buf[200];
unsigned char ii=0;
cByte=32;
cch=0;
dwState=0;
lReturn = SCardStatus(hCardHandle[index],
NULL,
&cch,
&dwState,
&dwProtocol,
bAttr,
&cByte); //get the status of a smart card in a reader
if ( SCARD_S_SUCCESS != lReturn )
{
char data[50];
data[0]=0;
strcpy(data,"status:");
sprintf(buf,"%08X \n", dwState);
strcat(data,buf);
MessageBox(data,"",MB_OK);
}
else
{
if(bAttr[4] == 0x57 && bAttr[5] == 0x44 && bAttr[6] == 0x28 && bAttr[7] == 0x2A)
{
AfxMessageBox("此卡片为握奇卡片");
}
else
{
AfxMessageBox("此卡片非握奇卡片");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -