安装参数 JavaCard
Install parameters JavaCard
我正在尝试使用 GPSshell 中的 -instParam 选项为我的智能卡提供 PIN。我找到了一些示例,但不知道如何使用给定的 PIN 初始化 OwnerPIN 对象。据我所知,我的小程序的安装方法有一个 LV 编码结构,但我该如何解析它。我尝试了 BERTLV 对象,但在安装小程序时出现 "Conditions not satisfied" 错误。
我有:
public static void install(byte[] bArray, short bOffset, byte bLength)
{
new MYPinCard(bArray, bOffset, bLength);
}
private MYPinCard(byte[] bArray, short bOffset, byte bLength)
{
m_pin = new OwnerPIN(PIN_TRY_LIMIT, MAX_PIN_SIZE);
byte iLen = bArray[bOffset]; // aid length
short iOffset = (short) (bOffset+iLen+1);
iLen = bArray[iOffset]; // application privileges length
iOffset = (short) (iOffset+iLen+1);
iLen = bArray[iOffset]; // application specific parameters length
iOffset++;
try
{
m_pin.update(bArray, iOffset, iLen);
}
catch (PINException e)
{
ISOException.throwIt((short)0x6AAA);
}
testdata = new byte[iLen];
Util.arrayCopy(bArray, bOffset, testdata, (short)0, iLen);
register();
}
private void getInstallParams(APDU apdu)
{
try
{
byte[] buffer = apdu.getBuffer();
// inform the JCRE that the applet has data to return
short le = apdu.setOutgoing();
// set the actual number of the outgoing data bytes
apdu.setOutgoingLength(((short)testdata.length));
apdu.sendBytesLong(testdata, (short)0, (short)testdata.length);
}
catch (APDUException e)
{
ISOException.throwIt(SW_APDU_EXCEPTION);
}
catch (TransactionException e)
{
ISOException.throwIt(SW_TRANSACTION_EXCEPTION);
}
catch (ArrayIndexOutOfBoundsException e)
{
ISOException.throwIt(SW_AIOOB_EXCEPTION);
}
catch (NullPointerException e)
{
ISOException.throwIt(SW_NULLPOINTER_EXCEPTION);
}
}
使用 getInstallParams() 方法,我可以检索字节。对于我的 PIN,它是 2 个字节的值,但我不知道如何处理这些字节。
有什么提示吗?
我一遍又一遍地使用这个模板,它很管用(只要你有最多 127 个字节的参数):
public static void install(byte[] bArray, short bOffset, byte bLength) {
byte aidLength = bArray[bOffset];
short controlLength = (short)(bArray[(short)(bOffset+1+aidLength)]&(short)0x00FF);
short dataLength = (short)(bArray[(short)(bOffset+1+aidLength+1+controlLength)]&(short)0x00FF);
new MyPinCard(bArray, (short) (bOffset+1+aidLength+1+controlLength+1), dataLength).register(bArray, (short) (bOffset + 1), aidLength);
}
private MyPinCard(byte[] bArray, short bOffset, short bLength) {
if(bLength!=(short)(2)) {
ISOException.throwIt(ISO7816.SW_WRONG_DATA);
}
// ....
m_pin = new OwnerPIN(PIN_TRY_LIMIT, (byte)2);
m_pin.update(bArray, bOffset, (byte)2);
// ....
}
注意 &(short)0x00FF
部分正确处理负值字节。
注意上面的代码没有检查install()
的bLength
参数,这是错误的,应该修正:)
我正在尝试使用 GPSshell 中的 -instParam 选项为我的智能卡提供 PIN。我找到了一些示例,但不知道如何使用给定的 PIN 初始化 OwnerPIN 对象。据我所知,我的小程序的安装方法有一个 LV 编码结构,但我该如何解析它。我尝试了 BERTLV 对象,但在安装小程序时出现 "Conditions not satisfied" 错误。 我有:
public static void install(byte[] bArray, short bOffset, byte bLength)
{
new MYPinCard(bArray, bOffset, bLength);
}
private MYPinCard(byte[] bArray, short bOffset, byte bLength)
{
m_pin = new OwnerPIN(PIN_TRY_LIMIT, MAX_PIN_SIZE);
byte iLen = bArray[bOffset]; // aid length
short iOffset = (short) (bOffset+iLen+1);
iLen = bArray[iOffset]; // application privileges length
iOffset = (short) (iOffset+iLen+1);
iLen = bArray[iOffset]; // application specific parameters length
iOffset++;
try
{
m_pin.update(bArray, iOffset, iLen);
}
catch (PINException e)
{
ISOException.throwIt((short)0x6AAA);
}
testdata = new byte[iLen];
Util.arrayCopy(bArray, bOffset, testdata, (short)0, iLen);
register();
}
private void getInstallParams(APDU apdu)
{
try
{
byte[] buffer = apdu.getBuffer();
// inform the JCRE that the applet has data to return
short le = apdu.setOutgoing();
// set the actual number of the outgoing data bytes
apdu.setOutgoingLength(((short)testdata.length));
apdu.sendBytesLong(testdata, (short)0, (short)testdata.length);
}
catch (APDUException e)
{
ISOException.throwIt(SW_APDU_EXCEPTION);
}
catch (TransactionException e)
{
ISOException.throwIt(SW_TRANSACTION_EXCEPTION);
}
catch (ArrayIndexOutOfBoundsException e)
{
ISOException.throwIt(SW_AIOOB_EXCEPTION);
}
catch (NullPointerException e)
{
ISOException.throwIt(SW_NULLPOINTER_EXCEPTION);
}
}
使用 getInstallParams() 方法,我可以检索字节。对于我的 PIN,它是 2 个字节的值,但我不知道如何处理这些字节。
有什么提示吗?
我一遍又一遍地使用这个模板,它很管用(只要你有最多 127 个字节的参数):
public static void install(byte[] bArray, short bOffset, byte bLength) {
byte aidLength = bArray[bOffset];
short controlLength = (short)(bArray[(short)(bOffset+1+aidLength)]&(short)0x00FF);
short dataLength = (short)(bArray[(short)(bOffset+1+aidLength+1+controlLength)]&(short)0x00FF);
new MyPinCard(bArray, (short) (bOffset+1+aidLength+1+controlLength+1), dataLength).register(bArray, (short) (bOffset + 1), aidLength);
}
private MyPinCard(byte[] bArray, short bOffset, short bLength) {
if(bLength!=(short)(2)) {
ISOException.throwIt(ISO7816.SW_WRONG_DATA);
}
// ....
m_pin = new OwnerPIN(PIN_TRY_LIMIT, (byte)2);
m_pin.update(bArray, bOffset, (byte)2);
// ....
}
注意 &(short)0x00FF
部分正确处理负值字节。
注意上面的代码没有检查install()
的bLength
参数,这是错误的,应该修正:)