使用c#对Gemalto .net智能卡进行引脚验证

时间:2013-05-30 09:22:00

标签: c# .net verification smartcard gemalto

我正在尝试使用c#验证并更改gemalto .net卡的图钉。但当我试图验证时,使用 -

byte cla_verify = 0;
byte p2_pinReference = 0x80;
CardCommandAPDU quickVerify = new CardCommandAPDU(cla_verify, 0x20, 0x00, p2_pinReference, CardHex.ToByteArray("FFFFFFFFFFFFFFFF"));
CardResponseAPDU aRespAPDU = aCard.SendCommand(quickVerify);

它正在返回 - SW 27033 (RSP 6999)

任何想法。 我做错了什么?

4 个答案:

答案 0 :(得分:1)

状态字69XX表示:不允许命令。

我查看了NET Smartcard Framework SDK内提供的 NETSmartcardFramework.chm 。不知道使用什么CLA,INS,P1,dan P2和Lc。相反,PIN验证已经包含在PIN类中。

要验证PIN值,您可以使用

// PIN Class members
// PIN.Verify Method

public void Verify(byte[],int,int);
public void Verify(string);

但在此之前,您需要使用构造函数PIN(byte[],int,int,int)PIN(string,int)初始化PIN,并检查PIN isBlocked()isVerified()

一些有趣的文章和指南:

答案 1 :(得分:1)

请注意,虽然您的PIN参考说明了特定参考,但P2中的标识符零表示:"卡应知道所寻址的PIN"。这可能需要额外的先前发送的命令,如SET模式下的管理安全环境,或某个安全环境对象或类似物。特别是对于以下更改参考数据,我建议明确说明ID。

答案 2 :(得分:0)

PIN验证已解释here。您可以尝试使用此代码而不是您的代码。对我来说很好看。

答案 3 :(得分:0)

您想验证PIN发送APDU,对。查找文档IDPrime .NET智能卡 - 集成指南(APDU编码和Hivecodes)。根据该文档,方法verifyPIN的APDU(参见表16 - V5的Hivecodes)应该如下所示(角色USER = 0x01和PIN = 1234的示例):

80C200001BD800056F00C04B4E7FBD506B00044D53434D010000000431323334

说明:

APDU = APDU标头+ APDU有效负载

APDU标题等于 80C20000 1B ,其中:

  • 80C20000 - 始终相同
  • 1B(十六进制) - 27(十进制)是1字节有效负载 长度。

APDU有效载荷相等 D8 0005 6F 00C04B4E 7FBD 506B 0004 4D53434D 01 00000004 31323334 其中:

  • D8 - 无需改变
  • 0005 - 服务端口号(2字节)
  • 6F - 无需改变
  • 00C04B4E - 服务命名空间Hivecode(4个字节)
  • 7FBD - 服务类型Hivecode(2个字节)
  • 506B - 方法Hivecode,对于VeryfiyPin方法是506B(参见doc)
  • 0004 - 服务名称长度(0004)
  • 4D53434D - UTF8编码的服务名称(服务名称 - MSCM(4D53434D))
  • 01 - 用户角色(USER = 0x01,ADMIN = 0x02,EVERYONE = 0x03)
  • 00000004 - 数据大小(此时PIN长度等于4)
  • 31323334 - PIN的十六进制值= 1234

如果PIN正确,你应该得到9000作为回应。

PIN = 12345的另一个例子:

80C200001CD800056F00C04B4E7FBD506B00044D53434D01000000053132333435
相关问题