0x6f00 приведение к ошибке Javacard Shareable Interface

smartcard javacard

631 просмотра

2 ответа

1614 Репутация автора

Я пытался использовать SIO (Shareable Interface Objects) для двух разных пакетов, чтобы в будущем обновить бизнес-логику моего апплета. Я использую eclipse и запускаю два разных приложения JavaCard: ClientSIOApplet и ServerSIOApplet. Существует пакет с именем appClient в ClientSIOApplet и один с именем appServer в ServerSIOApplet. Кроме того, ClientApplet.java и ServerAppBankInterface.java являются классами в appClient, а ServerAppBankInterface.java и ServerApplet.java находятся в appServer. Вы можете увидеть исходный код ниже:

ClientApplet.java в appClient

package appClient;

import javacard.framework.AID;
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;
import javacard.framework.JCSystem;
import javacard.framework.Shareable;
import javacard.framework.Util;

public class ClientApplet extends Applet {

    Shareable  sio;

    byte[] serverAID = {(byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04, (byte)0x05, (byte)0x01};

    public ClientApplet() {
        // TODO Auto-generated constructor stub

    }

    public static void install(byte[] bArray, short bOffset, byte bLength) {
        // GP-compliant JavaCard applet registration
        new ClientApplet().register(bArray, (short) (bOffset + 1),
                bArray[bOffset]);       
    }

    public void process(APDU apdu) {
        // Good practice: Return 9000 on SELECT
        if (selectingApplet()) {
            return;
        }
        byte[] buf = apdu.getBuffer();      
        byte cla = buf[ISO7816.OFFSET_CLA];

        if (( cla != ISO7816.CLA_ISO7816) && (cla != (byte) 0x10))
            ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);

        switch (buf[ISO7816.OFFSET_INS]) {
        case (byte) 0x00:


             AID svrAid = JCSystem.lookupAID(serverAID, 
                                     (short)0, 
                                     (byte)serverAID.length);

            if(svrAid == null) {
                // Cannot find the serverAID AID
                ISOException.throwIt((short)0x0010);
            }

            /*sio = JCSystem.getAppletShareableInterfaceObject(svrAid, (byte)0);
            if (sio == null) ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
            if (! (sio instanceof SharedArray))
                ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
            SharedArray theSharedArray = (SharedArray) sio;
            final byte[] sa = theSharedArray.getSharedArray();*/

            //ISOException.throwIt(ISO7816.SW_COMMAND_NOT_ALLOWED);

            sio = JCSystem.getAppletShareableInterfaceObject(svrAid, (byte)0);


            if(sio == null){
                ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
            }


            /*if (! (sio instanceof ServerAppBankInterface))
                ISOException.throwIt(ISO7816.SW_FILE_INVALID);*/

            try{
                ServerAppBankInterface bankInterface = (ServerAppBankInterface) sio;
            }catch(Exception ex){
                ISOException.throwIt(ISO7816.SW_WRONG_P1P2);
            }


                        break;
        //default:
            // good practice: If you don't know the INStruction, say so:
            //ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
        }
    }

}

ServerAppBankInterface.java в appClient

package appClient;

import javacard.framework.Shareable;

public interface ServerAppBankInterface extends Shareable{
    //public void saveMoneyInBank(short amount);
    public short getSavedMoneyInBank();
}

ServerApplet.java в appServer

package appServer;

import javacard.framework.AID;
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;
import javacard.framework.Shareable;


public class ServerApplet extends Applet implements ServerAppBankInterface{



    public ServerApplet(byte[] bArray, short bOffset, byte bLength){

        register(bArray, (short) (bOffset + 1), bArray[bOffset]);

        /*final byte[] sa = new byte[] { 'm' };
        sharedArray = new SharedArrayImpl(sa);*/
    }

    public Shareable getShareableInterfaceObject(AID clientID, byte parameter){

        byte[] tempAID = {(byte)0x05, (byte)0x04, (byte)0x03, (byte)0x02, (byte)0x01, (byte)0x01};

        if((clientID.equals(tempAID,
                (short)0,
                (byte)tempAID.length)) == false)
            return  null;
        else
            return this;
            //return sharedArray;
            //return serverAppBankObject;
            //return (ServerAppBankInterface) this;
            //return (Shareable) this;

    }

    public boolean select()
    {
         return true;
    }

    public static void install(byte[] bArray, short bOffset, byte bLength) {
        // GP-compliant JavaCard applet registration
        new ServerApplet(bArray, bOffset, bLength);
    }

    public void process(APDU apdu) {
        // Good practice: Return 9000 on SELECT

        byte[] buf = apdu.getBuffer();
        switch (buf[ISO7816.OFFSET_INS]) {
        case (byte) 0x00:
            break;
        default:
            // good practice: If you don't know the INStruction, say so:
            ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
        }
    }

    public short getSavedMoneyInBank() {
        // TODO Auto-generated method stub
        return 0;
    }



}

ServerAppBankInterface.java в appServer

package appServer;

import javacard.framework.Shareable;

public interface ServerAppBankInterface extends Shareable{
    //public void saveMoneyInBank(short amount);
    public short getSavedMoneyInBank();
}

Проблема в:

У меня проблема с приведением интерфейса в строке:

ServerAppBankInterface bankInterface = (ServerAppBankInterface) sio;

в ClientApplet.java

Если я удаляю Try-Catch в этой строке, я получаю ошибку 0x6F00,

Автор: BzH Источник Размещён: 28.02.2014 05:39

Ответы (2)


3 плюса

31900 Репутация автора

Решение

Серверный апплет предоставляет разделяемый интерфейс типа

appServer.ServerApplet <- appServer.ServerAppBankInterface <- javacard.framework.Shareable

но когда вы получаете этот разделяемый интерфейсный объект в своем клиентском апплете, вы пытаетесь привести его к

appClient.ServerAppBankInterface <- javacard.framework.Shareable

Хотя интерфейсы appServer.ServerAppBankInterfaceи appClient.ServerAppBankInterfaceимеют похожее имя и предоставляют методы с одинаковыми именами, эти два интерфейса не являются одинаковыми и не наследуются друг от друга. Поэтому вы не можете бросать между ними.

Итак, вы пытаетесь привести полученный экземпляр общего объекта к несвязанному типу. Таким образом, приведение не выполняется, и возникает исключение (необработанное).

Чтобы решить эту проблему, вам нужно привести полученный совместно используемый объект в ваш клиентский апплет appServer.ServerAppBankInterface.

Автор: Michael Roland Размещён: 01.03.2014 08:45

0 плюса

115 Репутация автора

Вот обновленный код, он отлично работает на моем конце на JCIDE

пакет appServer

  1. ServerAppel.java

    пакет appServer; импорт javacard.framework.AID;

    импорт javacard.framework.APDU;

    импорт javacard.framework.Applet;

    импорт javacard.framework.ISO7816;

    импорт javacard.framework.ISOException;

    импорт javacard.framework.Shareable;

    Открытый класс ServerApplet расширяет Апплет реализует ServerAppBankInterface {

    public ServerApplet(byte[] bArray, short bOffset, byte bLength){
    
        register(bArray, (short) (bOffset + 1), bArray[bOffset]);
    
    }
    
    public Shareable getShareableInterfaceObject(AID clientID, byte parameter){
    
        byte[] tempAID = {(byte)0xA0, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01,(byte)0xAA};
    
        if((clientID.equals(tempAID,
                (short)0,
                (byte)tempAID.length)) == false)
            return  null;
        else
            return this;
    }
    
    public boolean select()
    {
         return true;
    }
    
    public static void install(byte[] bArray, short bOffset, byte bLength) {
        // GP-compliant JavaCard applet registration
        new ServerApplet(bArray, bOffset, bLength);
    }
    
    public void process(APDU apdu) {
        // Good practice: Return 9000 on SELECT
    
        byte[] buf = apdu.getBuffer();
        switch (buf[ISO7816.OFFSET_INS]) {
        case (byte) 0x00:
            break;
        default:
            // good practice: If you don't know the INStruction, say so:
            ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
        }
    }
    
    public short getSavedMoneyInBank() {
        // TODO Auto-generated method stub
        return 0;
    }
    

    }

  2. ServerAppBankInterface.java

    пакет appServer;

    импорт javacard.framework.Shareable;

    открытый интерфейс ServerAppBankInterface extends Shareable {// public void saveMoneyInBank (short amount); public short getSavedMoneyInBank (); }

пакет appClient

1. Клиент Апплет

package appClient ;

import appServer.*;
import javacard.framework.AID;
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;
import javacard.framework.JCSystem;
import javacard.framework.Shareable;
import javacard.framework.Util;

public class ClientApplet extends Applet 
{

    ServerAppBankInterface  sio;

    byte[] serverAID = {(byte)0xA0, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x02,(byte)0xBB};

    public ClientApplet() {
        // TODO Auto-generated constructor stub

    }

    public static void install(byte[] bArray, short bOffset, byte bLength) {
        // GP-compliant JavaCard applet registration
        new ClientApplet().register(bArray, (short) (bOffset + 1),
                bArray[bOffset]);       
    }

    public void process(APDU apdu) {
        // Good practice: Return 9000 on SELECT
        if (selectingApplet()) {
            return;
        }
        byte[] buf = apdu.getBuffer();      
        byte cla = buf[ISO7816.OFFSET_CLA];

        if (( cla != ISO7816.CLA_ISO7816) && (cla != (byte) 0x10))
            ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);

        switch (buf[ISO7816.OFFSET_INS]) {
        case (byte) 0x00:


             AID svrAid = JCSystem.lookupAID(serverAID, 
                                     (short)0, 
                                     (byte)serverAID.length);

            if(svrAid == null) {
                // Cannot find the serverAID AID
                ISOException.throwIt((short)0x0010);
            }


            sio = (ServerAppBankInterface)JCSystem.getAppletShareableInterfaceObject(svrAid, (byte)0);


            if(sio == null){
                ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
            }


            ServerAppBankInterface bankInterface = (ServerAppBankInterface) sio;
            bankInterface.getSavedMoneyInBank();

            break;
        default:
            // good practice: If you don't know the INStruction, say so:
            ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
        }
    }


}
Автор: Ujjwal Roy Размещён: 25.07.2019 11:29
Вопросы из категории :
32x32