简体   繁体   中英

Java Card client-server Shareable interface returns 6F00

I've tried to create a simple Client and Server applets in java card 2.2.2 using Eclipse 3.7 SDK using the Shareable Interfaces. When the method JCSystem.getAppletShareableInterfaceObject is called it throws an exception and so the return SW sets to 6F00.

This is the Client app code ( Test_Client.java ):

    package client;

import server.Test_ServerInf;
import javacard.framework.AID;
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;
import javacard.framework.JCSystem;

public class Test_Client extends Applet {

    protected static final byte INS1 = (byte)0xE2;
    protected static final byte INS2 = (byte)0x21;

    byte[] ServerAIDbyte={(byte)0x20,(byte)0x21,(byte)0x22,(byte)0x23,(byte)0x24,(byte)0x25,(byte)0x26,(byte)0x27,(byte)0x01};
    AID ServerAID;

    private Test_Client() {
    }

    public static void install(byte bArray[], short bOffset, byte bLength)
            throws ISOException {
        new Test_Client().register();
    }

    public void process(APDU apdu) throws ISOException {
        // TODO Auto-generated method stub
        byte[] apduBuffer = apdu.getBuffer();

        byte Ins=apduBuffer[ISO7816.OFFSET_INS];
        short byteread = apdu.setIncomingAndReceive();

        if (selectingApplet())
            return;

        switch (Ins){
        case INS1:
            Ins1_Handler(apdu);
            return;
        case INS2:
            Ins2_Handler(apdu,apduBuffer);
            return;
        default:
            ISOException.throwIt(ISO7816.SW_FUNC_NOT_SUPPORTED);
        }
    }
    private void Ins1_Handler(APDU apdu){
        Test_ServerInf sio = null;
        ServerAID=JCSystem.lookupAID(ServerAIDbyte,(short) 0,(byte) ServerAIDbyte.length);
        if(ServerAID==null)
            ISOException.throwIt( (short) 0x6A82);
        ////server request
        try{
        sio=(Test_ServerInf)(JCSystem.getAppletShareableInterfaceObject(ServerAID, (byte) 0));
        }
        catch(SecurityException e)
       {
           ISOException.throwIt((short)0x12);
       }
       catch(Exception e)
       {
           ISOException.throwIt((short)0x10);
       }
        if(sio==null)
            ISOException.throwIt((short)0x6A00);

    }

    private void Ins2_Handler(APDU apdu,byte[] apduBuffer){
            Test_ServerInf sio = null;
           ////connect to server  
          ServerAID=JCSystem.lookupAID(ServerAIDbyte,(short) 0,(byte) ServerAIDbyte.length);
           if(ServerAID==null)
                ISOException.throwIt( (short) 0x6A82);
           ////server request
           try{
               sio=(Test_ServerInf)(JCSystem.getAppletShareableInterfaceObject(ServerAID, (byte) 0));
           }
           catch(SecurityException e)
           {
               ISOException.throwIt((short)0x12);
           }
           catch(Exception e)
           {
               ISOException.throwIt((short)0x10);
           }
           if(sio==null)
                ISOException.throwIt((short)0x6A00); 
    }


}

And this is Server applet code ( Test_Server.java ):

  package server;

import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISOException;
import server.Test_ServerInf;
import javacard.framework.Shareable;
import javacard.framework.AID;

public class Test_Server extends Applet implements Test_ServerInf{


    private Test_Server() {
    }

    public static void install(byte bArray[], short bOffset, byte bLength)
            throws ISOException {
        new Test_Server().register();
    }

    public void process(APDU apdu) throws ISOException {
        // TODO Auto-generated method stub

    }

    public Shareable getShareableInterfaceObject(AID clientAID, byte parameter) {
        return this;
    }

    public short method1(){
        return (short)0x01;
    }
    public short method2(){
        return (short)0x02;
    }

}

and the shareable interface file ( Test_ServerInf.java ):

package server;

import javacard.framework.Shareable;

public interface Test_ServerInf extends Shareable {

    public short method1();
    public short method2();

}

You are trying to store a reference to the shareable interface object in a member field of your client applet class:

sio = (Test_ServerInf)(JCSystem.getAppletShareableInterfaceObject(ServerAID, (byte) 0));

where sio is defined as private member of the applet class instance:

public class Test_Client extends Applet {
    private Test_ServerInf sio;

This will result in a SecurityException since the shareable interface object is owned by the server applet (ie by a different context). You are not allowed to store objects owned by other contexts in an instance field.

See Accessing Class Instance Object Fields (Section 6.2.8.3) , in Runtime Environment Specification, Java Card Platform, Version 2.2.2 :

Bytecodes: getfield , putfield

  • [...] if the object is owned by an applet in the currently active context, access is allowed.
  • Otherwise, access is denied.

I found the source of this error. I used to load and install applets using an internally developed application instead of GPShell. When I tried to load and install applets using GPShell the problem solved and everything is ok. I don't know how that application compromises the loaded package but it works fine right know (After 2 weeks of debugging).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM