我正在尝试使用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)
。
任何想法。 我做错了什么?
答案 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 ,其中:
APDU有效载荷相等 D8 0005 6F 00C04B4E 7FBD 506B 0004 4D53434D 01 00000004 31323334 其中:
如果PIN正确,你应该得到9000作为回应。
PIN = 12345的另一个例子:
80C200001CD800056F00C04B4E7FBD506B00044D53434D01000000053132333435