Bài thực hành số 5: "Chia sẻ đối tượng giữa các Applet"

Bài thực hành số 5: "Chia sẻ đối tượng giữa các Applet" gồm 17 trang nội dung giúp bạn tham khảo và hoàn thành tốt bài thực hành của mình đạt kết quả cao.

5 Chia s đi ng giac Applet
ng ngh Java Card ng cho phép chia s đi tưng gia c Applet thông
qua chế giao din th chia s.
5.1 Giao din có th chia s
Giao din th chia s ch đơn gin là mt giao din m rng, trc tiếp hoc
gián tiếp, ca giao din javacard.framework.Shareable.
public interface Shareable {}
Giao din này khái nim tương t như giao din Remote đưc s dng bi
b phn RMI (Remote method invocation). Giao din không đnh nghĩa bt k
phương thc hoc tng nào. Mc đích duy nht ca nó là đưc m rng bi các
giao din khác và gn th các giao din đó là có các thuc tính đc bit.
Mt giao din có th chia s xác đnh mt tp hp c phương thc có sn cho
các Applet khác. Mt lp có th thc thi bt k s ng giao dinth chia s và
th m rng các lp khác thc thi giao din th chia s.
5.2 Đi ng ca giao din có th chia s
Mt đi tưng ca lp thc hin giao din có th chia s đưc gi là đi
ng giao din có th chia s (SIO shareable interface object). Đi vi bi cnh
s hu, SIO là mt đi tượng bình thưng có các tng và phương thc th
đưc truy cp. Đi vi bt k bi cnh nào khác, SIO là mt th hin ca loi giao
din có th chia s và ch c phương thc đưc xác đnh trong giao din có th
chia s thì mi có th truy cp đưc. Tt c các tng và các phương thc khác
ca SIO đưc bo v bi ng la.
5.3 Ý ng phía sau cơ chế giao din có th chia s
Applet lưu tr d liu trong các đi tưng. Chia s d liu gia các Applet
nghĩa là mt Applet cho phép mt đi tưng mà nó s hu có th dùng cho các
Applet khác, do đó chia s d liu đưc gói gn trong đi tưng.
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
Trong thế gii hưng đi tưng, mt hành vi ca đi tưng (ngoài truy cp
biến trc tiếp) đưc th hin thông qua c phương thc ca nó. Truyn tin nhn,
hoc gi phương thc, h tr các tương tác và liên lc gia các đi tưng. Cơ chế
giao din th chia s cho phép các Applet gi tin nhn b qua s giám sát ca
ng la. Mt Applet s hu to ra mt đi tưng giao din có th chia s và thc
thi các phương thc đưc xác đnh trong giao din th chia s. Các phương thc
này đi din cho giao din chung ca Applet s hu, thông qua đó mt Applet khác
th gi tin nhn t đó truy cp các dch v đưc cung cp bi Applet này.
Kch bn chia s đưc minh ha trong Hình 5.1 có th đưc mô t như mi
quan h máy khách/máy ch. Applet A (cung cp SIO) là mt máy ch và Applet
B và C (s dng SIO ca Applet A) là máy khách. Mt Applet th là mt máy
ch cho mt s Applet và là khách hàng ca các Applet khác.
Hình 5.1 chế đối ng ca giao din có th chia s
Trong ngôn ng lp tnh Java, mt giao din đnh nghĩa mt kiu tham chiếu
cha mt tp hp các ch ký và hng. Mt Applet khách xem SIO như kiu
giao din có th chia s. Loi lp ca SIO thc thi giao din có th chia s không
b tiết l. Nói cách khác, ch các phương thc đưc đnh nghĩa trong giao din có
th chia s đưc đưa ra cho Applet máy khách; các tng ví d và các phương
thc khác không đưc tiết l. Theo cách này, mt Applet máy ch có th cung cp
quyn truy cp đưc kim soáto d liu mà nó mun chia s.
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
Khi tương tác vi mt Applet khách khác, mt Applet máy ch th gi mt
vai trò khác. Điu này s yêu cu Applet máy ch tùy chnh c dch v ca nó đi
vi Applet ca máy khách mà không cn m rng. Mt Applet máy ch có th làm
như vy bng ch đnh nghĩa nhiu giao din, mi giao din ca phương thc khai
báo phù hp vi mt nhóm các Applet máy khách. Nếu các phương thc trong c
giao din là khác bit, mt Applet máy ch có th chn to các lp, mi lp thc
thi mt giao din. Nhưng các dch v thưng chng chéo; mt Applet máy ch có
th đnh nghĩa mt lp thc thi nhiu giao din. Do đó, mt SIO ca lp đó th
gi nhiu vai trò.
5.4 Ví d
Chúng ta 2 Applet: Applet ch masterApp và Applet khách slaveApp
nm trong các bi cnh khác nhau (nghĩa là chúng đưc đt trong các gói riêng
bit), gi s Applet ch mun chia s mt mng byte vi Applet khách.
Đ thc hin chia s đi tưng gia các Applet, chúng ta làm theo c bưc
sau:
c 1: To đi ng ca giao din có th chia s đưc
Đ to SIO, đu tiên Applet ch masterApp đnh nghĩa giao din có th chia
s là m rng ca javacard.framework.Shareable. đây, s đnh nghĩa
phương thc getArray dùng đ chia s đi ng
package masterPack;
import javacard.framework.Shareable;
public interface masterInterface extends Shareable{
public short getArray(byte[] array);
}
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
Tiếp theo, Applet máy ch to ra mt lp nhà cung cp dch v (mt lp nhà
cung cp dch v có th là chính lp Applet) thc thi giao din có th chia s.
Applet máy ch sau đó th to mt hoc nhiu đi tưng ca lp nhà cung cp
dch v và th chia s các đi tượng đó (SIO) vi c Applet khác trong mt bi
cnh khác. Trong Applet masterApp s ch ra cách thc thc hin ca phương thc
getArray
package masterPack;
import javacard.framework.*;
public class masterApp extends Applet implements masterInterface
{
private byte[] testArray;
private masterApp()
{
testArray = new byte[]{0x01, 0x02, 0x03, 0x04, 0x05};
}
public static void install(byte[] bArray, short bOffset,
byte bLength)
{
new masterApp().register(bArray, (short) (bOffset + 1),
bArray[bOffset]);
}
public short getArray(byte[] buf) {
short len = (short)testArray.length;
Util.arrayCopy(testArray, (short)0, buf, (short)0,
len);
return len;
}
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
}
Tc khi khách hàngth yêu cu SIO, nó phi tìm cách xác đnh máy ch.
Trong nn tng Java Card, mith Applet đưc xác đnh duy nht bi mt AID.
c 2: Yêu cu mt đi ng ca giao din có th chia s
Tc khi yêu cu SIO t mt Applet máy ch, tc tiên, mt Applet máy
khách phi đưc đi tưng AID đưc liên kết vi Applet máy ch. Đ làm điu
đó, Applet máy khách gi phương thc lookupAID trong lp JCSystem;
public static AID lookupAID
(byte[] buffer, short offset, byte length)
Applet máy khách phi biết tc các byte AID ca Applet máy ch và nó
cung cp các byte AID trong b đm tham s. Phương thc lookupAID tr v đi
ng AID do JCRE s hu ca Applet máy ch hoc tr v null nếu Applet máy
ch không được cài đt trên th.
Tiếp theo, Applet máy khách gi phương thc JCSystem.getApplet-
ShareableInterfaceObject, s dng đi ng AID đ xác đnh máy ch:
public static Shareable getAppletShareableInterfaceObject
(AID server_aid, byte parameter)
Tham s th hai trong phương thc getAppletShareableInterfaceObject
đưc din gii bi Applet máy ch. Nó có th đưc s dng đ chn SIO nếu máy
ch sn nhiu hơn mt. Ngoài ra, tham s th đưc s dng làm mã thông
báo bo mt, mang mt bí mt đưc chia s bi máy ch và máy khách.
Trong phương thc getAppletShareableInterfaceObject, JCRE tra cu
Applet máy ch bng cách so sánh server_aid vi AID ca các Applet đưc
đăng ký vi JCRE. Nếu không tìm thy Applet máy ch, JCRE tr v null. Mt
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
khác, JCRE gi phương thc getShareableInterfaceObject ca Applet máy
ch.
public Shareable
getShareableInterfaceObject(AID client_aid, byte parameter)
Lưu ý rng, trong phương thc getShareableInterfaceObject, JCRE thay
thế đi s đu tiên bng đi tưng client_aid và gi ng byte tham s đưc
cung cp bi Applet máy khách. Applet máy ch s dng c hai tham s đ xác
đnh xem có cung cp dch v cho Applet yêu cu hay không nếu thì SIOo
s xut.
Phương thc getShareableInterfaceObject đưc đnh nghĩa trong lp
Applet s javacard.framework.Applet. Vic thc thi mc đnh tr v null.
Mt lp Applet phi ghi đè phương thc này nếu nó có ý đnh chia s bt k SIO
nào. Dưi đây là cách Applet masterApp thc hin phương thc
getShareableInterfaceObject
public Shareable getShareableInterfaceObject(AID clientAID,
byte parameter) {
//xac thuc nguoi dung
if(parameter != (byte)0x00)
return null;
return this;
}
Khi đó, code đy đ ca Applet masterApp đưc viết như sau:
package masterPack;
import javacard.framework.*;
public class masterApp extends Applet implements masterInterface
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
{
private byte[] testArray;
private masterApp()
{
testArray = new byte[]{0x01, 0x02, 0x03, 0x04, 0x05};
}
public static void install(byte[] bArray, short bOffset,
byte bLength)
{
new masterApp().register(bArray, (short) (bOffset + 1),
bArray[bOffset]);
}
public void process(APDU apdu)
{
if (selectingApplet())
{
return;
}
byte[] buf = apdu.getBuffer();
apdu.setIncomingAndReceive();
switch (buf[ISO7816.OFFSET_INS])
{
case (byte)0x00:
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
}
public Shareable getShareableInterfaceObject(AID clientAID,
byte parameter) {
//xac thuc nguoi dung
if(parameter != (byte)0x00)
return null;
return this;
}
public short getArray(byte[] buf) {
short len = (short)testArray.length;
Util.arrayCopy(testArray, (short)0, buf, (short)0,
len);
return len;
}
}
c 3: S dng đi ng ca giao din có th chia s đưc
Đ cho phép máy ch tr v bt k loi giao din th chia s nào bng mt
giao din duy nht, c hai phương thc JCSystem.getAppletShareable-
InterfaceObject và Applet.getShareableInterfaceObject đu có kiu tr
v là Shareable - loi s ca tt c c đi tượng giao din th chia s. Mt
Applet khách phi cho phép SIO tr v kiu giao din con thích hp và lưu nó
trong mt tham chiếu đi tưng ca loi đó. Ví d: Applet slaveApp chuyn SIO
thành masterInterface:
masterInterface sio =
(masterInterface)(JCSystem.getAppletShareableInterfaceObject(mast
erAID, (byte)0));
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
Sau khi ng dng khách nhn đưc SIO, nó gi các phương thc giao din có
th chia s đ truy cp c dch v t máy ch. Tuy nhiên, Applet máy khách ch
th thy các phương thc đưc đnh nghĩa trong giao din có th chia s đưc.
Chng hn, trong đon code tc, mc dù sio thc s tr đến Applet
masterApp (lp Applet ca nó thc hin giao din masterInterface), tt c c
tng đi tượng và phương thc giao din không th chia s (như phương thc
process, select) đu đưc bo v bi ng la.
i đây code đy đ ca Applet slaveApp:
package slavePack;
import javacard.framework.*;
import masterPack.masterInterface;
public class slaveApp extends Applet
{
final static byte[] serverAID = new byte[]
{0x11,0x22,0x33,0x44,0x55,0x05,0x00,0x00};
public static void install(byte[] bArray, short bOffset,
byte bLength)
{
new slaveApp().register(bArray, (short) (bOffset + 1),
bArray[bOffset]);
}
public void process(APDU apdu)
{
if (selectingApplet())
{
return;
}
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
byte[] buf = apdu.getBuffer();
apdu.setIncomingAndReceive();
switch (buf[ISO7816.OFFSET_INS])
{
case (byte)0x00:
AID masterAID = JCSystem.lookupAID(serverAID,
(short)0, (byte)serverAID.length);
masterInterface sio =
(masterInterface)(JCSystem.getAppletShareableInterfaceObject(mast
erAID, (byte)0x00));
short len = sio.getArray(buf);
apdu.setOutgoingAndSend((short)0, len);
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
}
Kết qu thc thi Applet slaveApp như sau:
>> /select 1122334455050101
>> 00 A4 04 00 08 11 22 33 44 55 05 01 01 00
<< 90 00
>> /send 00000102
>> 00 00 01 02
<< 01 02 03 04 05 90 00
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
5.5 Các kiu tham s và kiu tr v trong c phương thc giao din có
th chia s
Trong ngôn ng lp tnh Java, các tham s ca phương thc và giá tr tr v
th là bt k kiu bn hoc tham chiếu nào. Nhưng trong nn tng Java Card,
vic truyn các đi tưng (bao gm c mng) làm tham s hoc tr v giá tr trong
phương thc giao dinth chia s đưc cho phép theo kiu hn chế.
Ví d: nếu Applet slaveApp ví d trên s dng mt trong c đi tưng ca
chính nó là mng array làm tham s trong phương thc getArray
AID masterAID = JCSystem.lookupAID(serverAID,
(short)0, (byte)serverAID.length);
masterInterface sio =
(masterInterface)(JCSystem.getAppletShareableInterfaceObject(mast
erAID, (byte)0x00));
//su dung mang array lam doi so co phuong thuc cua
giao dien co the chia se
byte [] array = new byte[5];
short len = sio.getArray(array);
Util.arrayCopy(array, (short)0, buf, (short)0,
len);
apdu.setOutgoingAndSend((short)0, len);
Khi đó, ng la s ngăn không cho Applet masterApp truy cp vào mng
này, kết qu là mt ngoi l s đưc tr ra:
>> /send 00000102
>> 00 00 01 02
<< 6F 00 No precise diagnosis
Tương t, nếu Applet masterApp tr v mt trong c đi tượng ca chính nó
làm giá tr tr v, tưng la s ngăn Applet slaveApp truy cp vào đi tưng này.
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
Mc dù điu này v bt tin, nhưng thc cht là tưng la Applet đang làm
ng vic ca nó.
Đ tránh vn đ này, các loi giá tr sau th đưc truyn vào trong c
phương thc giao dinth chia s i dng tham s và giá tr tr v:
- Các giá tr bn - chúng d dàng đưc truyn vào ngăn xếp. Các kiu cơ
bn đưc h tr trong nn tng Java Card là boolean, byte, short và
(tùy chn) int.
- Các tng tĩnh - các tng tĩnh công khai th truy cp đưc t bt k
bi cnh nào. Tuy nhiên, các đi tưng đưc tham chiếu bi các tng
tĩnh như vy đưc bo v bi ng la.
- Đi tưng đim nhp JCRE - phương thc ng khai ca c đi tưng
này có th đưc truy cp t bt k bi cnho.
- Mng toàn cc - Chúng có th đưc truy cp t bt k bi cnh nào. Ví
d, b đm APDU có th đưc s dng cho mc đích này.
- SIO - Phương thc giao din có th chia s ca các đi tưng này th
đưc truy cp t bt k ng cnh nào. SIO đưc tr v t máy khách cho
phép bi cnh máy ch gi li vào ng cnh máy khách đ ly mt s dch
v hoc d liu. Tuy nhiên, nhà phát trin nên cn thn đ tnh chuyn
đi ng cnh quá mc (có th làm gim đ hoàn ho) và lng sâu (deep
nesting) c chuyn đi ng cnh ( th s dng thêm không gian ngăn
xếp).
Đ hiu rõ hơn v vn đ này, chúng ta xét ví d sau: gi s trong giao din
th chia s masterInterface phương thc
public byte tinhDiem(byte diemToan, byte diemVan){
byte diemTB = (byte)((byte)((byte)(6*diemToan) +
(byte)(4*diemVan))/10);
return diemTB;
}
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
Kch bn 1: Đu tiên chúng ta xem xét trưng hp các tham s và giá tr tr
v ca phương thc tinhDiem đu là các kiu d liu bn:
package slavePack;
import javacard.framework.*;
import masterPack.masterInterface;
public class slaveApp extends Applet
{
final static byte[] serverAID = new byte[]
{0x11,0x22,0x33,0x44,0x55,0x05,0x00,0x00};
public static void install(byte[] bArray, short bOffset,
byte bLength)
{
new slaveApp().register(bArray, (short) (bOffset + 1),
bArray[bOffset]);
}
public void process(APDU apdu)
{
if (selectingApplet())
{
return;
}
byte[] buf = apdu.getBuffer();
apdu.setIncomingAndReceive();
switch (buf[ISO7816.OFFSET_INS])
{
case (byte)0x00:
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
AID masterAID = JCSystem.lookupAID(serverAID,
(short)0, (byte)serverAID.length);
masterInterface sio =
(masterInterface)(JCSystem.getAppletShareableInterfaceObject(mast
erAID, (byte)0x00));
/*su dung cac kieu du lieu so ban lam tham so va
gia tri tra ve*/
byte diemToan = (byte)0x08;
byte diemVan = (byte)0x09;
byte diemTB = sio.tinhDiem(diemToan, diemVan);
buf[0] = diemTB;
apdu.setOutgoingAndSend((short)0, (short)(1));
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
}
Kết qu thc thi Applet này như sau:
>> /select 1122334455050101
>> 00 A4 04 00 08 11 22 33 44 55 05 01 01 00
<< 90 00
>> /send 00000102
>> 00 00 01 02
<< 08 90 00
Kch bn 2: s dng các tng ca đi tưng sinhVien làm tham s và giá
tr tr v ca phương thc tinhDiem
package slavePack;
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
import javacard.framework.*;
import masterPack.masterInterface;
public class slaveApp1 extends Applet
{
final static byte[] serverAID = new byte[]
{0x11,0x22,0x33,0x44,0x55,0x05,0x00,0x00};
sinhVien sv1;
public static void install(byte[] bArray, short bOffset,
byte bLength)
{
new slaveApp().register(bArray, (short) (bOffset + 1),
bArray[bOffset]);
}
public void process(APDU apdu)
{
if (selectingApplet())
{
return;
}
byte[] buf = apdu.getBuffer();
apdu.setIncomingAndReceive();
switch (buf[ISO7816.OFFSET_INS])
{
case (byte)0x00:
AID masterAID = JCSystem.lookupAID(serverAID,
(short)0, (byte)serverAID.length);
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
masterInterface sio =
(masterInterface)(JCSystem.getAppletShareableInterfaceObject(mast
erAID, (byte)0x00));
/*su dung cac truong cua doi tuong sinhVien*/
sv1.diemToan = (byte)0x08;
sv1.diemVan = (byte)0x09;
sv1.diemTB = sio.tinhDiem(sv1.diemToan,
sv1.diemVan);
buf[0] = sv1.diemTB;
apdu.setOutgoingAndSend((short)0, (short)(1));
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
}
Theo lý thuyết trên, các tng ca đi tưng sinhVien phi là tng tĩnh
ng khai
package slavePack;
public class sinhVien {
public static byte diemToan;
public static byte diemVan;
public static byte diemTB;
}
Kết qu thc thi Applet slaveApp cũng tương t như trong kch bn 1:
>> /select 1122334455050101
>> 00 A4 04 00 08 11 22 33 44 55 05 01 01 00
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
<< 90 00
>> /send 00000102
>> 00 00 01 02
<< 08 90 00
Chúng ta th cho mt trong c trưng ca đi tưng sinhVien không phi
tng tĩnh (static). Khi đó mt thông báo li s đưc đưa ra khi thc thi Applet
slaveApp:
>> /select 1122334455050101
>> 00 A4 04 00 08 11 22 33 44 55 05 01 01 00
<< 90 00
>> /send 00000102
>> 00 00 01 02
<< 6F 00 No precise diagnosis
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
| 1/17

Preview text:

lOMoARcPSD|36451986
5 Chia sẻ đối tượng giữa các Applet
Công nghệ Java Card cũng cho phép chia sẻ đối tượng giữa các Applet thông
qua cơ chế giao diện có thể chia sẻ.
5.1 Giao diện có thể chia sẻ
Giao diện có thể chia sẻ chỉ đơn giản là một giao diện mở rộng, trực tiếp hoặc
gián tiếp, của giao diện javacard.framework.Shareable. public interface Shareable {}
Giao diện này có khái niệm tương tự như giao diện Remote được sử dụng bởi
bộ phận RMI (Remote method invocation). Giao diện không định nghĩa bất kỳ
phương thức hoặc trường nào. Mục đích duy nhất của nó là được mở rộng bởi các
giao diện khác và gắn thẻ các giao diện đó là có các thuộc tính đặc biệt.
Một giao diện có thể chia sẻ xác định một tập hợp các phương thức có sẵn cho
các Applet khác. Một lớp có thể thực thi bất kỳ số lượng giao diện có thể chia sẻ và
có thể mở rộng các lớp khác thực thi giao diện có thể chia sẻ.
5.2 Đối tượng của giao diện có thể chia sẻ
Một đối tượng của lớp thực hiện giao diện có thể chia sẻ được gọi là đối
tượng giao diện có thể chia sẻ (SIO – shareable interface object). Đối với bối cảnh
sở hữu, SIO là một đối tượng bình thường có các trường và phương thức có thể
được truy cập. Đối với bất kỳ bối cảnh nào khác, SIO là một thể hiện của loại giao
diện có thể chia sẻ và chỉ các phương thức được xác định trong giao diện có thể
chia sẻ thì mới có thể truy cập được. Tất cả các trường và các phương thức khác
của SIO được bảo vệ bởi tường lửa.
5.3 Ý tưởng phía sau cơ chế giao diện có thể chia sẻ
Applet lưu trữ dữ liệu trong các đối tượng. Chia sẻ dữ liệu giữa các Applet có
nghĩa là một Applet cho phép một đối tượng mà nó sở hữu có thể dùng cho các
Applet khác, do đó chia sẻ dữ liệu được gói gọn trong đối tượng.
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986
Trong thế giới hướng đối tượng, một hành vi của đối tượng (ngoài truy cập
biến trực tiếp) được thể hiện thông qua các phương thức của nó. Truyền tin nhắn,
hoặc gọi phương thức, hỗ trợ các tương tác và liên lạc giữa các đối tượng. Cơ chế
giao diện có thể chia sẻ cho phép các Applet gửi tin nhắn bỏ qua sự giám sát của
tường lửa. Một Applet sở hữu tạo ra một đối tượng giao diện có thể chia sẻ và thực
thi các phương thức được xác định trong giao diện có thể chia sẻ. Các phương thức
này đại diện cho giao diện chung của Applet sở hữu, thông qua đó một Applet khác
có thể gửi tin nhắn và từ đó truy cập các dịch vụ được cung cấp bởi Applet này.
Kịch bản chia sẻ được minh họa trong Hình 5.1 có thể được mô tả như mối
quan hệ máy khách/máy chủ. Applet A (cung cấp SIO) là một máy chủ và Applet
B và C (sử dụng SIO của Applet A) là máy khách. Một Applet có thể là một máy
chủ cho một số Applet và là khách hàng của các Applet khác.
Hình 5.1 Cơ chế đối tượng của giao diện có thể chia sẻ
Trong ngôn ngữ lập trình Java, một giao diện định nghĩa một kiểu tham chiếu
có chứa một tập hợp các chữ ký và hằng. Một Applet khách xem SIO như kiểu
giao diện có thể chia sẻ. Loại lớp của SIO thực thi giao diện có thể chia sẻ không
bị tiết lộ. Nói cách khác, chỉ các phương thức được định nghĩa trong giao diện có
thể chia sẻ được đưa ra cho Applet máy khách; các trường ví dụ và các phương
thức khác không được tiết lộ. Theo cách này, một Applet máy chủ có thể cung cấp
quyền truy cập được kiểm soát vào dữ liệu mà nó muốn chia sẻ.
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986
Khi tương tác với một Applet khách khác, một Applet máy chủ có thể giữ một
vai trò khác. Điều này sẽ yêu cầu Applet máy chủ tùy chỉnh các dịch vụ của nó đối
với Applet của máy khách mà không cần mở rộng. Một Applet máy chủ có thể làm
như vậy bằng cách định nghĩa nhiều giao diện, mỗi giao diện của phương thức khai
báo phù hợp với một nhóm các Applet máy khách. Nếu các phương thức trong các
giao diện là khác biệt, một Applet máy chủ có thể chọn tạo các lớp, mỗi lớp thực
thi một giao diện. Nhưng các dịch vụ thường chồng chéo; một Applet máy chủ có
thể định nghĩa một lớp thực thi nhiều giao diện. Do đó, một SIO của lớp đó có thể giữ nhiều vai trò. 5.4 Ví dụ
Chúng ta có 2 Applet: Applet chủ masterApp và Applet khách slaveApp
nằm ở trong các bối cảnh khác nhau (nghĩa là chúng được đặt trong các gói riêng
biệt), giả sử Applet chủ muốn chia sẻ một mảng byte với Applet khách.
Để thực hiện chia sẻ đối tượng giữa các Applet, chúng ta làm theo các bước sau:
Bước 1: Tạo đối tượng của giao diện có thể chia sẻ được
Để tạo SIO, đầu tiên Applet chủ masterApp định nghĩa giao diện có thể chia
sẻ là mở rộng của javacard.framework.Shareable. Ở đây, sẽ định nghĩa
phương thức getArray dùng để chia sẻ đối tượng package masterPack;
import javacard.framework.Shareable;
public interface masterInterface extends Shareable{
public short getArray(byte[] array); }
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986
Tiếp theo, Applet máy chủ tạo ra một lớp nhà cung cấp dịch vụ (một lớp nhà
cung cấp dịch vụ có thể là chính lớp Applet) thực thi giao diện có thể chia sẻ.
Applet máy chủ sau đó có thể tạo một hoặc nhiều đối tượng của lớp nhà cung cấp
dịch vụ và có thể chia sẻ các đối tượng đó (SIO) với các Applet khác trong một bối
cảnh khác. Trong Applet masterApp sẽ chỉ ra cách thức thực hiện của phương thức getArray package masterPack; import javacard.framework.*;
public class masterApp extends Applet implements masterInterface { private byte[] testArray; private masterApp() {
testArray = new byte[]{0x01, 0x02, 0x03, 0x04, 0x05}; }
public static void install(byte[] bArray, short bOffset, byte bLength) {
new masterApp().register(bArray, (short) (bOffset + 1), bArray[bOffset]); }
public short getArray(byte[] buf) {
short len = (short)testArray.length;
Util.arrayCopy(testArray, (short)0, buf, (short)0, len); return len; }
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986 }
Trước khi khách hàng có thể yêu cầu SIO, nó phải tìm cách xác định máy chủ.
Trong nền tảng Java Card, mỗi cá thể Applet được xác định duy nhất bởi một AID.
Bước 2: Yêu cầu một đối tượng của giao diện có thể chia sẻ
Trước khi yêu cầu SIO từ một Applet máy chủ, trước tiên, một Applet máy
khách phải có được đối tượng AID được liên kết với Applet máy chủ. Để làm điều
đó, Applet máy khách gọi phương thức lookupAID trong lớp JCSystem; public static AID lookupAID
(byte[] buffer, short offset, byte length)
Applet máy khách phải biết trước các byte AID của Applet máy chủ và nó
cung cấp các byte AID trong bộ đệm tham số. Phương thức lookupAID trả về đối
tượng AID do JCRE sở hữu của Applet máy chủ hoặc trả về null nếu Applet máy
chủ không được cài đặt trên thẻ.
Tiếp theo, Applet máy khách gọi phương thức JCSystem.getApplet-
ShareableInterfaceObject, sử dụng đối tượng AID để xác định máy chủ:
public static Shareable getAppletShareableInterfaceObject
(AID server_aid, byte parameter)
Tham số thứ hai trong phương thức getAppletShareableInterfaceObject
được diễn giải bởi Applet máy chủ. Nó có thể được sử dụng để chọn SIO nếu máy
chủ có sẵn nhiều hơn một. Ngoài ra, tham số có thể được sử dụng làm mã thông
báo bảo mật, mang một bí mật được chia sẻ bởi máy chủ và máy khách.
Trong phương thức getAppletShareableInterfaceObject, JCRE tra cứu
Applet máy chủ bằng cách so sánh server_aid với AID của các Applet được
đăng ký với JCRE. Nếu không tìm thấy Applet máy chủ, JCRE trả về null. Mặt
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986
khác, JCRE gọi phương thức getShareableInterfaceObject của Applet máy chủ. public Shareable
getShareableInterfaceObject(AID client_aid, byte parameter)
Lưu ý rằng, trong phương thức getShareableInterfaceObject, JCRE thay
thế đối số đầu tiên bằng đối tượng client_aid và gửi cùng byte tham số được
cung cấp bởi Applet máy khách. Applet máy chủ sử dụng cả hai tham số để xác
định xem có cung cấp dịch vụ cho Applet yêu cầu hay không và nếu có thì SIO nào sẽ xuất.
Phương thức getShareableInterfaceObject được định nghĩa trong lớp
Applet cơ sở javacard.framework.Applet. Việc thực thi mặc định trả về null.
Một lớp Applet phải ghi đè phương thức này nếu nó có ý định chia sẻ bất kỳ SIO
nào. Dưới đây là cách Applet masterApp thực hiện phương thức getShareableInterfaceObject
public Shareable getShareableInterfaceObject(AID clientAID, byte parameter) { //xac thuc nguoi dung if(parameter != (byte)0x00) return null; return this; }
Khi đó, code đầy đủ của Applet masterApp được viết như sau: package masterPack; import javacard.framework.*;
public class masterApp extends Applet implements masterInterface
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986 { private byte[] testArray; private masterApp() {
testArray = new byte[]{0x01, 0x02, 0x03, 0x04, 0x05}; }
public static void install(byte[] bArray, short bOffset, byte bLength) {
new masterApp().register(bArray, (short) (bOffset + 1), bArray[bOffset]); }
public void process(APDU apdu) { if (selectingApplet()) { return; }
byte[] buf = apdu.getBuffer(); apdu.setIncomingAndReceive();
switch (buf[ISO7816.OFFSET_INS]) { case (byte)0x00: break; default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); }
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986 }
public Shareable getShareableInterfaceObject(AID clientAID, byte parameter) { //xac thuc nguoi dung if(parameter != (byte)0x00) return null; return this; }
public short getArray(byte[] buf) {
short len = (short)testArray.length;
Util.arrayCopy(testArray, (short)0, buf, (short)0, len); return len; } }
Bước 3: Sử dụng đối tượng của giao diện có thể chia sẻ được
Để cho phép máy chủ trả về bất kỳ loại giao diện có thể chia sẻ nào bằng một
giao diện duy nhất, cả hai phương thức JCSystem.getAppletShareable-
InterfaceObject và Applet.getShareableInterfaceObject đều có kiểu trả
về là Shareable - loại cơ sở của tất cả các đối tượng giao diện có thể chia sẻ. Một
Applet khách phải cho phép SIO trả về kiểu giao diện con thích hợp và lưu nó
trong một tham chiếu đối tượng của loại đó. Ví dụ: Applet slaveApp chuyển SIO thành masterInterface: masterInterface sio =
(masterInterface)(JCSystem.getAppletShareableInterfaceObject(mast erAID, (byte)0));
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986
Sau khi ứng dụng khách nhận được SIO, nó gọi các phương thức giao diện có
thể chia sẻ để truy cập các dịch vụ từ máy chủ. Tuy nhiên, Applet máy khách chỉ
có thể thấy các phương thức được định nghĩa trong giao diện có thể chia sẻ được.
Chẳng hạn, trong đoạn code trước, mặc dù sio thực sự trỏ đến Applet
masterApp (lớp Applet của nó thực hiện giao diện masterInterface), tất cả các
trường đối tượng và phương thức giao diện không thể chia sẻ (như phương thức
process, select) đều được bảo vệ bởi tường lửa.
Dưới đây là code đầy đủ của Applet slaveApp: package slavePack; import javacard.framework.*;
import masterPack.masterInterface;
public class slaveApp extends Applet {
final static byte[] serverAID = new byte[]
{0x11,0x22,0x33,0x44,0x55,0x05,0x00,0x00};
public static void install(byte[] bArray, short bOffset, byte bLength) {
new slaveApp().register(bArray, (short) (bOffset + 1), bArray[bOffset]); }
public void process(APDU apdu) { if (selectingApplet()) { return; }
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986
byte[] buf = apdu.getBuffer(); apdu.setIncomingAndReceive();
switch (buf[ISO7816.OFFSET_INS]) { case (byte)0x00:
AID masterAID = JCSystem.lookupAID(serverAID,
(short)0, (byte)serverAID.length); masterInterface sio =
(masterInterface)(JCSystem.getAppletShareableInterfaceObject(mast erAID, (byte)0x00));
short len = sio.getArray(buf);
apdu.setOutgoingAndSend((short)0, len); break; default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); } } }
Kết quả thực thi Applet slaveApp như sau:
>> /select 1122334455050101
>> 00 A4 04 00 08 11 22 33 44 55 05 01 01 00 << 90 00 >> /send 00000102 >> 00 00 01 02 << 01 02 03 04 05 90 00
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986
5.5 Các kiểu tham số và kiểu trả về trong các phương thức giao diện có thể chia sẻ
Trong ngôn ngữ lập trình Java, các tham số của phương thức và giá trị trả về
có thể là bất kỳ kiểu cơ bản hoặc tham chiếu nào. Nhưng trong nền tảng Java Card,
việc truyền các đối tượng (bao gồm cả mảng) làm tham số hoặc trả về giá trị trong
phương thức giao diện có thể chia sẻ được cho phép theo kiểu hạn chế.
Ví dụ: nếu Applet slaveApp ở ví dụ trên sử dụng một trong các đối tượng của
chính nó là mảng array làm tham số trong phương thức getArray
AID masterAID = JCSystem.lookupAID(serverAID,
(short)0, (byte)serverAID.length); masterInterface sio =
(masterInterface)(JCSystem.getAppletShareableInterfaceObject(mast erAID, (byte)0x00));
//su dung mang array lam doi so co phuong thuc cua giao dien co the chia se byte [] array = new byte[5];
short len = sio.getArray(array);
Util.arrayCopy(array, (short)0, buf, (short)0, len);
apdu.setOutgoingAndSend((short)0, len);
Khi đó, tường lửa sẽ ngăn không cho Applet masterApp truy cập vào mảng
này, kết quả là một ngoại lệ sẽ được trả ra: >> /send 00000102 >> 00 00 01 02
<< 6F 00 No precise diagnosis
Tương tự, nếu Applet masterApp trả về một trong các đối tượng của chính nó
làm giá trị trả về, tường lửa sẽ ngăn Applet slaveApp truy cập vào đối tượng này.
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986
Mặc dù điều này có vẻ bất tiện, nhưng thực chất là tường lửa Applet đang làm công việc của nó.
Để tránh vấn đề này, các loại giá trị sau có thể được truyền vào trong các
phương thức giao diện có thể chia sẻ dưới dạng tham số và giá trị trả về:
- Các giá trị cơ bản - chúng dễ dàng được truyền vào ngăn xếp. Các kiểu cơ
bản được hỗ trợ trong nền tảng Java Card là boolean, byte, short và (tùy chọn) int.
- Các trường tĩnh - các trường tĩnh công khai có thể truy cập được từ bất kỳ
bối cảnh nào. Tuy nhiên, các đối tượng được tham chiếu bởi các trường
tĩnh như vậy được bảo vệ bởi tường lửa.
- Đối tượng điểm nhập JCRE - phương thức công khai của các đối tượng
này có thể được truy cập từ bất kỳ bối cảnh nào.
- Mảng toàn cục - Chúng có thể được truy cập từ bất kỳ bối cảnh nào. Ví
dụ, bộ đệm APDU có thể được sử dụng cho mục đích này.
- SIO - Phương thức giao diện có thể chia sẻ của các đối tượng này có thể
được truy cập từ bất kỳ ngữ cảnh nào. SIO được trả về từ máy khách cho
phép bối cảnh máy chủ gọi lại vào ngữ cảnh máy khách để lấy một số dịch
vụ hoặc dữ liệu. Tuy nhiên, nhà phát triển nên cẩn thận để tránh chuyển
đổi ngữ cảnh quá mức (có thể làm giảm độ hoàn hảo) và lồng sâu (deep
nesting) các chuyển đổi ngữ cảnh (có thể sử dụng thêm không gian ngăn xếp).
Để hiểu rõ hơn về vấn đề này, chúng ta xét ví dụ sau: giả sử trong giao diện
có thể chia sẻ masterInterface có phương thức
public byte tinhDiem(byte diemToan, byte diemVan){
byte diemTB = (byte)((byte)((byte)(6*diemToan) + (byte)(4*diemVan))/10); return diemTB; }
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986
Kịch bản 1: Đầu tiên chúng ta xem xét trường hợp các tham số và giá trị trả
về của phương thức tinhDiem đều là các kiểu dữ liệu cơ bản: package slavePack; import javacard.framework.*;
import masterPack.masterInterface;
public class slaveApp extends Applet {
final static byte[] serverAID = new byte[]
{0x11,0x22,0x33,0x44,0x55,0x05,0x00,0x00};
public static void install(byte[] bArray, short bOffset, byte bLength) {
new slaveApp().register(bArray, (short) (bOffset + 1), bArray[bOffset]); }
public void process(APDU apdu) { if (selectingApplet()) { return; }
byte[] buf = apdu.getBuffer(); apdu.setIncomingAndReceive();
switch (buf[ISO7816.OFFSET_INS]) { case (byte)0x00:
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986
AID masterAID = JCSystem.lookupAID(serverAID,
(short)0, (byte)serverAID.length); masterInterface sio =
(masterInterface)(JCSystem.getAppletShareableInterfaceObject(mast erAID, (byte)0x00));
/*su dung cac kieu du lieu so ban lam tham so va gia tri tra ve*/ byte diemToan = (byte)0x08; byte diemVan = (byte)0x09;
byte diemTB = sio.tinhDiem(diemToan, diemVan); buf[0] = diemTB;
apdu.setOutgoingAndSend((short)0, (short)(1)); break; default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); } } }
Kết quả thực thi Applet này như sau:
>> /select 1122334455050101
>> 00 A4 04 00 08 11 22 33 44 55 05 01 01 00 << 90 00 >> /send 00000102 >> 00 00 01 02 << 08 90 00
Kịch bản 2: sử dụng các trường của đối tượng sinhVien làm tham số và giá
trị trả về của phương thức tinhDiem package slavePack;
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986 import javacard.framework.*;
import masterPack.masterInterface;
public class slaveApp1 extends Applet {
final static byte[] serverAID = new byte[]
{0x11,0x22,0x33,0x44,0x55,0x05,0x00,0x00}; sinhVien sv1;
public static void install(byte[] bArray, short bOffset, byte bLength) {
new slaveApp().register(bArray, (short) (bOffset + 1), bArray[bOffset]); }
public void process(APDU apdu) { if (selectingApplet()) { return; }
byte[] buf = apdu.getBuffer(); apdu.setIncomingAndReceive();
switch (buf[ISO7816.OFFSET_INS]) { case (byte)0x00:
AID masterAID = JCSystem.lookupAID(serverAID,
(short)0, (byte)serverAID.length);
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986 masterInterface sio =
(masterInterface)(JCSystem.getAppletShareableInterfaceObject(mast erAID, (byte)0x00));
/*su dung cac truong cua doi tuong sinhVien*/ sv1.diemToan = (byte)0x08; sv1.diemVan = (byte)0x09;
sv1.diemTB = sio.tinhDiem(sv1.diemToan, sv1.diemVan); buf[0] = sv1.diemTB;
apdu.setOutgoingAndSend((short)0, (short)(1)); break; default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); } } }
Theo lý thuyết ở trên, các trường của đối tượng sinhVien phải là trường tĩnh công khai package slavePack; public class sinhVien { public static byte diemToan; public static byte diemVan; public static byte diemTB; }
Kết quả thực thi Applet slaveApp cũng tương tự như trong kịch bản 1:
>> /select 1122334455050101
>> 00 A4 04 00 08 11 22 33 44 55 05 01 01 00
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986 << 90 00 >> /send 00000102 >> 00 00 01 02 << 08 90 00
Chúng ta thử cho một trong các trường của đối tượng sinhVien không phải là
trường tĩnh (static). Khi đó một thông báo lỗi sẽ được đưa ra khi thực thi Applet slaveApp:
>> /select 1122334455050101
>> 00 A4 04 00 08 11 22 33 44 55 05 01 01 00 << 90 00 >> /send 00000102 >> 00 00 01 02
<< 6F 00 No precise diagnosis
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
Document Outline

  • 5 Chia sẻ đối tượng giữa các Applet
    • 5.1 Giao diện có thể chia sẻ
    • 5.2 Đối tượng của giao diện có thể chia sẻ
    • 5.3 Ý tưởng phía sau cơ chế giao diện có thể chia sẻ
    • 5.4 Ví dụ
    • 5.5 Các kiểu tham số và kiểu trả về trong các phương thức giao diện có thể chia sẻ