JavaCard的连接中断的耗时处理

问题描述 投票:2回答:1

我写一个Java卡2.2.1小程序做输入数据有些沉重的数学处理并将结果返回到计算机。我的代码有许多forwhile循环。问题是,当我打电话从PC卡,该卡的连接不会等待卡来完成所有的过程,并与PC / SC协议返回错误。我用PCSC library在C#中,从PC卡沟通,并得到这个错误:已检测到与智能卡通信错误。

若要重现该问题,我已经准备了一个测试小程序与一些虚拟的计算:

package my.testapplet;

import javacard.framework.*;

public class TestApplet extends Applet
{

    public static void install(byte[] bArray, short bOffset, byte bLength) 
    {
        new TestApplet().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
    }

    public void process(APDU apdu)
    {
        if (selectingApplet())
        {
            return;
        }

        byte[] buf = apdu.getBuffer();
        short result = 0;
        if (buf[ISO7816.OFFSET_CLA] == ISO7816.CLA_ISO7816) {
            switch (buf[ISO7816.OFFSET_INS])
            {
            case (byte)0x00:
                {
                    short temp1 = 0;
                    short temp2, temp3 = 0;
                    while(temp1 < 30000) {
                        temp1++;
                        temp2 = 0;
                        while(temp2 < 30000) {
                            temp2++;
                            if(temp2 > 0) {
                                temp3 = (short)(temp1 * 2 + 1);
                            }
                        }
                    }
                    result = 100;
                }
                break;
            default:
                ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
            }

            buf[0] = (byte) (result & 0xff);
            buf[1] = (byte) (result >>> 8);

            apdu.setOutgoingAndSend((short) 0, (short) 2);
        } else {
            ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
        }
    }

}

我已经测试了3种不同的Java卡型号该applet(来自不同供应商),都具有相同的结果。此外,我必须注意,在运行Java卡仿真代码的时候是没有问题的。一个真实的物理Java卡上出现问题。这似乎在Java卡假的虚拟机检测到运行的代码,无限循环的一些循环,并断开连接。

我对这个问题不知道。具备Java卡上的任何一个类似的经验?为什么会出现Java卡上的这种行为以及如何解决它的任何想法?有Java卡上的任何特殊指令/配置禁用此行为,等待Java卡准备并返回结果?

smartcard javacard
1个回答
3
投票

WTX(等待时间扩展)是必要的,通知其将不得不等待,如无反应又是即将到来的读者,否则确实会超时并断开连接。 WTX不能在APDU层中可以看出,因为它在较低的水平T = 0,T = 1和T = CL协议的水平操作。可以看出有类似作用的TLS心跳或其他信息,以保持传输层活着。标准的等待时间可以通过ATR进行配置,通过的方式。

较新的卡一般将能够自动处理,即使不要求功能实现WTX。较旧的卡一般只针对可能会比完全不再特定的API调用启用WTX扩展。显然,RSA密钥对生成是这里的主要罪犯,但其他的操作,如在垃圾收集启动和安装小应用程序也可以使用WTX。

如果你有一个较长的运行方法,那么你可能需要自己定期发布WTX。你想发出WTX相对较小的时期,让更多的细粒度控制 - 如果你能估计它正确地花费的时间。最好你协议包括细粒度APDU的为好,让WTX用尽可能少。作为M. Mahdipour已经发现,发行WTX可能导致读卡器等天长地久,所以它也不是完全没有风险的问题(见下面的评论)。

不管怎样,使得Java卡发送低水平WTX消息的方法是静态APDU.waitExtension()方法。

© www.soinside.com 2019 - 2024. All rights reserved.