获取处理选项以获取数据库卡(pscs-sharp)
GET PROCESSING OPTIONS To get Data Bank Card (pscs-sharp)
就我而言,我使用的是 pcsc-sharp 项目。
我要揭穿我的所作所为
- Select AID(在本例中为 Visa 卡)
请求:00 A4 04 00 A0000000031010 00
var array_byte = StringToByteArray("A0000000031010"); //VISA
var contextFactory = ContextFactory.Instance;
using (var ctx = contextFactory.Establish(SCardScope.System)) {
using (var isoReader = new IsoReader(ctx, "HID Global OMNIKEY 3x21 Smart Card Reader 0", SCardShareMode.Shared, SCardProtocol.Any, false)) {
var apdu = new CommandApdu(IsoCase.Case4Short, isoReader.ActiveProtocol) {
CLA = 0x00, // Class
Instruction = InstructionCode.SelectFile, //0xA4
P1 = 0x04, // Parameter 1
P2 = 0x00, // Parameter 2,
Data = array_byte,
Le = 0x00 // Expected length of the returned data
};
var response = isoReader.Transmit(apdu);
Console.WriteLine("SW1 SW2 = {0:X2} {1:X2}", response.SW1, response.SW2);
Console.WriteLine(response.HasData ? BitConverter.ToString(response.GetData()) : "No data");
Console.ReadKey();
}
}
结果:
SW1 SW2 = 90 00
6F-43-84-07-A0-00-00-00-03-10-10-A5-38-50-0C-56-49-53-41-20-43-52-45-44-49-54-4F-87-01-01-9F-38-03-9F-1A-02-5F-2D-08-65-73-70-74-65-6E-66-72-9F-12-0F-43-52-45-44-4F-4D-41-54-49-43-20-56-49-53-41-9F-11-01-01
我检查响应中的标签“9F38”(PDOL):
03-9F-1A-02
如果我是对的,这个 PDOL 翻译成这样:
- 03 -> 字节长
- 9F-1A -> 标签终端国家代码
- 02 -> 要返回的字段值的长度
我正在尝试这样做:
- 获取处理选项
请求:80 A8 00 00 8302 00
var array_byte = StringToByteArray("8302");
var contextFactory = ContextFactory.Instance;
using (var ctx = contextFactory.Establish(SCardScope.System)) {
using (var isoReader = new IsoReader(ctx, "HID Global OMNIKEY 3x21 Smart Card Reader 0", SCardShareMode.Shared, SCardProtocol.Any, false)) {
var apdu = new CommandApdu(IsoCase.Case4Short, isoReader.ActiveProtocol) {
CLA = 0x80, // Class
Instruction = InstructionCode.GetProcessingOption, //0xA8
P1 = 0x00, // Parameter 1
P2 = 0x00, // Parameter 2,
Data = array_byte,
Le = 0x00 // Expected length of the returned data
};
var response = isoReader.Transmit(apdu);
Console.WriteLine("SW1 SW2 = {0:X2} {1:X2}", response.SW1, response.SW2);
Console.WriteLine(response.HasData ? BitConverter.ToString(response.GetData()) : "No data");
Console.ReadKey();
}
}
结果:
SW1 SW2 = 6D 00
No data
我测试了不同的数据(8302、8300、83020000),但我总是得到 6D 00 响应。我还测试了一个 apdu 工具 pyResMan 来执行这个,但结果相同。
我提到了这个 link get processing options 但我仍然有疑问。
我不确定我的 APDU 命令做错了什么,o 我遗漏了什么,但我需要执行 GPO 来获取 AFL 并读取我需要的所有卡数据(PAN,有效期等...)。
提前致谢。问候。
终于,我找到了解决方案,我需要在执行 GPO 之前 select AID。 (必须的,直接执行GPO是不行的)
- 请求援助 --> 00 A4 04 00 A0000000031010 00
- 请求 GPO --> 80 A8 00 00 8302 00
在那之后,我能够得到 GPO 响应。
希望对您有所帮助
就我而言,我使用的是 pcsc-sharp 项目。
我要揭穿我的所作所为
- Select AID(在本例中为 Visa 卡)
请求:00 A4 04 00 A0000000031010 00
var array_byte = StringToByteArray("A0000000031010"); //VISA
var contextFactory = ContextFactory.Instance;
using (var ctx = contextFactory.Establish(SCardScope.System)) {
using (var isoReader = new IsoReader(ctx, "HID Global OMNIKEY 3x21 Smart Card Reader 0", SCardShareMode.Shared, SCardProtocol.Any, false)) {
var apdu = new CommandApdu(IsoCase.Case4Short, isoReader.ActiveProtocol) {
CLA = 0x00, // Class
Instruction = InstructionCode.SelectFile, //0xA4
P1 = 0x04, // Parameter 1
P2 = 0x00, // Parameter 2,
Data = array_byte,
Le = 0x00 // Expected length of the returned data
};
var response = isoReader.Transmit(apdu);
Console.WriteLine("SW1 SW2 = {0:X2} {1:X2}", response.SW1, response.SW2);
Console.WriteLine(response.HasData ? BitConverter.ToString(response.GetData()) : "No data");
Console.ReadKey();
}
}
结果:
SW1 SW2 = 90 00
6F-43-84-07-A0-00-00-00-03-10-10-A5-38-50-0C-56-49-53-41-20-43-52-45-44-49-54-4F-87-01-01-9F-38-03-9F-1A-02-5F-2D-08-65-73-70-74-65-6E-66-72-9F-12-0F-43-52-45-44-4F-4D-41-54-49-43-20-56-49-53-41-9F-11-01-01
我检查响应中的标签“9F38”(PDOL):
03-9F-1A-02
如果我是对的,这个 PDOL 翻译成这样:
- 03 -> 字节长
- 9F-1A -> 标签终端国家代码
- 02 -> 要返回的字段值的长度
我正在尝试这样做:
- 获取处理选项
请求:80 A8 00 00 8302 00
var array_byte = StringToByteArray("8302");
var contextFactory = ContextFactory.Instance;
using (var ctx = contextFactory.Establish(SCardScope.System)) {
using (var isoReader = new IsoReader(ctx, "HID Global OMNIKEY 3x21 Smart Card Reader 0", SCardShareMode.Shared, SCardProtocol.Any, false)) {
var apdu = new CommandApdu(IsoCase.Case4Short, isoReader.ActiveProtocol) {
CLA = 0x80, // Class
Instruction = InstructionCode.GetProcessingOption, //0xA8
P1 = 0x00, // Parameter 1
P2 = 0x00, // Parameter 2,
Data = array_byte,
Le = 0x00 // Expected length of the returned data
};
var response = isoReader.Transmit(apdu);
Console.WriteLine("SW1 SW2 = {0:X2} {1:X2}", response.SW1, response.SW2);
Console.WriteLine(response.HasData ? BitConverter.ToString(response.GetData()) : "No data");
Console.ReadKey();
}
}
结果:
SW1 SW2 = 6D 00
No data
我测试了不同的数据(8302、8300、83020000),但我总是得到 6D 00 响应。我还测试了一个 apdu 工具 pyResMan 来执行这个,但结果相同。
我提到了这个 link get processing options 但我仍然有疑问。
我不确定我的 APDU 命令做错了什么,o 我遗漏了什么,但我需要执行 GPO 来获取 AFL 并读取我需要的所有卡数据(PAN,有效期等...)。
提前致谢。问候。
终于,我找到了解决方案,我需要在执行 GPO 之前 select AID。 (必须的,直接执行GPO是不行的)
- 请求援助 --> 00 A4 04 00 A0000000031010 00
- 请求 GPO --> 80 A8 00 00 8302 00
在那之后,我能够得到 GPO 响应。
希望对您有所帮助