DESFire 卡上的信用值文件时出现 0x9E 参数错误
I got 0x9E parameter error while Credit value file on DESFire card
我现在使用 DESFire 卡上的值文件。我使用以下命令在我的 DESFire 卡中创建了一个值文件:
byte[] cmdCreateValueFile = new byte[]{
//cmd
(byte)0xCC,
//file no
(byte)0x01,
//com.sett.
(byte)0x00 ,
//access rights
(byte)0x44 , (byte)0x44,
//lower limit
(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,
//upper limit
(byte)0x00 ,(byte)0x0F ,(byte)0x42 ,(byte)0x40 ,
//initial value
(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,
//limited credit enabled
(byte)0x00
};
然后我用这个命令记入文件的值:
//select my app first
...
doAuthenticate(); //authenticate with key #4 of my application
//credit in value file
tagResponse_cmdcredit = isodep.transceive(Utils.wrapMessage(
(byte)0x0C, new byte[]{(byte) 0x01 ,
//data
(byte)0x00,(byte)0x00, (byte)0x03 , (byte)0xE8}));
Log.d("credittttttttttt", "111 "+Utils.bytesToHex(tagResponse_cmdcredit));
//do commit transaction
tagResponse_cmdCommitTransaction = isodep.transceive(Utils.wrapMessage(
(byte)0xC7, null));
Log.d("committtttttttt", "111 "+Utils.bytesToHex(tagResponse_cmdCommitTransaction));
我的 wrapMessage 辅助方法如下所示:
public static byte[] wrapMessage (byte command, byte[] parameters) throws Exception {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
stream.write((byte) 0x90);
stream.write(command);
stream.write((byte) 0x00);
stream.write((byte) 0x00);
if (parameters != null) {
stream.write((byte) parameters.length);
stream.write(parameters);
}
stream.write((byte) 0x00);
byte[] b = stream.toByteArray();
return b;
}
但我收到 91 9E
错误。可能是什么问题?
编辑:
我发现我的错误!我没有注意到在创建值文件命令中初始化的 MSB 和 LSB 值。如果下限为 0x00 0x00 0x00 0x00(零)并且上限值为 0x0F 0x42 0x40(1000 000),则必须是这样的:
tagResponse_cmdcreateValueFile = isodep.transceive(Utils.wrapMessage((byte)0xCC, new byte[]{(byte)0x01,
//com.sett.
(byte)0x00 ,
//access rights
(byte)0x44 , (byte)0x44,
//lower limit
(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,
//upper limit
(byte)0x40 ,(byte)0x42 ,(byte)0x0F ,(byte)0x00 ,
//initial value
(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,
//limited credit enabled
(byte)0x00}));
我发现了我的错误!根据 DESFire 文档,该值始终表示为 LSB first.
比如我想要1000的credit,我需要通过
(byte)0xE8, (byte)0x03, (byte)0x00, (byte)0x00
而不是 0x00 0x00 0x03 0xE8
(其中 03E8
是十进制的 1000)。当以 MSB 在前传递值时,这将导致十进制值 -402456576(带符号的 4 字节整数),这将高于上限。
我现在使用 DESFire 卡上的值文件。我使用以下命令在我的 DESFire 卡中创建了一个值文件:
byte[] cmdCreateValueFile = new byte[]{
//cmd
(byte)0xCC,
//file no
(byte)0x01,
//com.sett.
(byte)0x00 ,
//access rights
(byte)0x44 , (byte)0x44,
//lower limit
(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,
//upper limit
(byte)0x00 ,(byte)0x0F ,(byte)0x42 ,(byte)0x40 ,
//initial value
(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,
//limited credit enabled
(byte)0x00
};
然后我用这个命令记入文件的值:
//select my app first
...
doAuthenticate(); //authenticate with key #4 of my application
//credit in value file
tagResponse_cmdcredit = isodep.transceive(Utils.wrapMessage(
(byte)0x0C, new byte[]{(byte) 0x01 ,
//data
(byte)0x00,(byte)0x00, (byte)0x03 , (byte)0xE8}));
Log.d("credittttttttttt", "111 "+Utils.bytesToHex(tagResponse_cmdcredit));
//do commit transaction
tagResponse_cmdCommitTransaction = isodep.transceive(Utils.wrapMessage(
(byte)0xC7, null));
Log.d("committtttttttt", "111 "+Utils.bytesToHex(tagResponse_cmdCommitTransaction));
我的 wrapMessage 辅助方法如下所示:
public static byte[] wrapMessage (byte command, byte[] parameters) throws Exception {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
stream.write((byte) 0x90);
stream.write(command);
stream.write((byte) 0x00);
stream.write((byte) 0x00);
if (parameters != null) {
stream.write((byte) parameters.length);
stream.write(parameters);
}
stream.write((byte) 0x00);
byte[] b = stream.toByteArray();
return b;
}
但我收到 91 9E
错误。可能是什么问题?
编辑: 我发现我的错误!我没有注意到在创建值文件命令中初始化的 MSB 和 LSB 值。如果下限为 0x00 0x00 0x00 0x00(零)并且上限值为 0x0F 0x42 0x40(1000 000),则必须是这样的:
tagResponse_cmdcreateValueFile = isodep.transceive(Utils.wrapMessage((byte)0xCC, new byte[]{(byte)0x01,
//com.sett.
(byte)0x00 ,
//access rights
(byte)0x44 , (byte)0x44,
//lower limit
(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,
//upper limit
(byte)0x40 ,(byte)0x42 ,(byte)0x0F ,(byte)0x00 ,
//initial value
(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,
//limited credit enabled
(byte)0x00}));
我发现了我的错误!根据 DESFire 文档,该值始终表示为 LSB first.
比如我想要1000的credit,我需要通过
(byte)0xE8, (byte)0x03, (byte)0x00, (byte)0x00
而不是 0x00 0x00 0x03 0xE8
(其中 03E8
是十进制的 1000)。当以 MSB 在前传递值时,这将导致十进制值 -402456576(带符号的 4 字节整数),这将高于上限。