Giáo trình "APDU mở rộng (Extended APDU)"

Giáo trình có 5 trang, bao gồm các kiến thức cơ bản liên quan: "APDU mở rộng (Extended APDU)" giúp bạn ôn luyện và nắm vững kiến thức môn học. Mời bạn đọc đón xem!

 

APDU m rng (Extended APDU)
Tính năng APDU mở rng từ tng Java Card v2.2.2 tr đi, cho phép các
nhà phát triển Applet tn dng chức năng APDU mở rộng, như được định nghĩa
trong đặc t ISO 7816. APDU m rng cho phép một lượng ln d liệu được gi
đến thẻ, được x một cách thích hợp được gi tr li thiết b đầu cui, theo
cách hiệu qu hơn.
Khi làm việc vi khi d liu ln, nếu s dụng APDU thông
thường, các nhà phát triển phi gi nhiu ln, nhưng với APDU m rng thì ch
vi mt ln trao đổi là xong.
APDU m rng li thế khi x một lượng thông tin ln. dụ, các ng
dụng như xác minh chữ ký, xác minh sinh trắc học, lưu trữ truy xuất hình nh
thể đưc tính năng này. Vic trin khai APDU m rộng thể d dàng được
thc hin nếu giao thc truyn tải bản T = 1, trong khi các applet đưc phát
trin cho th T = 0 s cn s cn thận và logic đặc biệt để hoạt động chính xác.
Trong hu hết các trường hợp, phương thức setIncomingAndReceive đủ để
đọc s byte d liệu vào bộ đệm APDU như được ch định trong trường Lc. Tuy
nhiên, đối vi mt lệnh APDU nhiều d liệu hơn mức thể phù hợp vi b
đệm APDU, phương thức setIncomingAndReceive cn theo sau bi mt hoc
nhiu lnh gọi đến phương thức receiveBytes:
public short receiveBytes(short bOff) throws APDUException
Đối vi d liu lệnh APDU dài, Applet th x d liu tng phần và sau
đó gọi phương thc receiveBytes đ đọc d liu b sung vào bộ đệm APDU.
Với phương thức receiveBytes, phần vào b đệm APDU nơi dữ liệu được
nhận thể đưc ch định. Điều này cho phép Applet kiểm soát cách sử dng b
đệm APDU trong quá trình x dữ liệu đến. dụ, như trong hình 1, Applet
th đã xử lý d liu t cuc gọi trước đó đến phương thức setIncomingAndReceive
hoặc phương thức receiveBytes, ngoi tr một vài byte.
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
Hình 1 - Gọi phương thức receiveBytes
Applet thể di chuyển các byte này vào đầu b đệm sau đó nhận nhóm
tiếp theo để được gắn vào các byte vẫn còn trong bộ đệm. Tính năng này rt
quan trọng trong trường hp d liệu được đọc trên các yêu cầu phương thức cn
đưc x lý toàn bộ.
Giống như phương thức setIncomingAndReceive, phương thức
receiveBytes được đảm bo tr v đồng b, ly ra càng nhiều byte càng tt. Tuy
nhiên, tùy thuộc vào số ng byte mà máy ch s gửi dưới dng một lô tùy
thuộc vào vic trin khai JCRE, c hai phương thức th đọc được ít byte hơn
không gian có sẵn trong b đệm APDU.
Như một quy tc chung, c phương thc setIncomingAndReceive và phương
thc receiveBytes đều được tối ưu hóa. Nếu toàn bộ d liu lệnh phù hợp trong
b đm APDU bắt đầu phn ISO7816.OFFSET_CDATA (= 5), mt lnh gi ca
phương thức setIncomingAndReceive s đủ đ nhn tt c d liệu. Viêc gọi đến
phương thức receiveBytes là không cn thiết. Hu hết các lệnh APDU thuc loi
này.
Theo tiêu chuẩn ca lp javacard.framework.APDU thì độ dài của b đệm
APDU ti thiu phi t 133 bytes (5 bytes tiêu đ 128 bytes d liệu). Khi đó,
chúng ta cần s dng phương thc receiveBytes. Nếu các byte còn lại va vi
không gian sẵn phần được ch định trong b đệm APDU, phương thc
receiveBytes được đm bo tr v vi tt c d liệu còn lại. Mặt khác, phương
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
thức đọc nhiu byte s phợp vi b đệm thể ít hơn. Các Applet cần gi
receiveBytes nhiu ln, x hoc nhập các byte trong b đệm d liu APDU
vi mi cuc gọi, cho đến khi tt c d liệu sẵn được đọc. (
Lưu ý: B đệm
APDU ca th JCOP chúng ta đang dùng là 261 byte
)
Ví dụ sau bao hàm phương thức receiveBytes bên trong vòng lặp while:
package BaiTH1;
import javacard.framework.*;
import javacardx.apdu.ExtendedLength;
public class Bai5_ExtendedApdu extends Applet implements
ExtendedLength
{
private static byte temp[];
private final static short MAX_SIZE = (short)1024;
private final static byte INS_NHAP = (byte)0x01;
private final static byte INS_XUAT = (byte)0x02;
private static short dataLen;
public static void install(byte[] bArray, short bOffset, byte
bLength)
{
new Bai5_ExtendedApdu().register(bArray, (short) (bOffset + 1),
bArray[bOffset]);
temp = new byte[MAX_SIZE];
}
public void process(APDU apdu)
{
if (selectingApplet())
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
{
return;
}
byte[] buf = apdu.getBuffer();
short recvLen = apdu.setIncomingAndReceive();
short pointer = 0; //vi tri con tro trong temp
switch (buf[ISO7816.OFFSET_INS])
{
case INS_NHAP: // nhan du lieu gui tu may tinh
//lay ra do dai du lieu gui xuong
dataLen = apdu.getIncomingLength();
if (dataLen > MAX_SIZE)
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
//lay ra vi tri bat dau data
short dataOffset = apdu.getOffsetCdata();
pointer = 0;
while (recvLen > 0)
{
//copy du lieu nhan duoc tu apdu buffer vao mang temp
Util.arrayCopy(buf, dataOffset, temp, pointer,
recvLen);
pointer += recvLen;
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
//tiep tuc nhan du lieu va ghi vao apdu buffer tai vi
tri dataOffset
recvLen = apdu.receiveBytes(dataOffset);
}
break;
case INS_XUAT: //gui du lieu len may tinh
short toSend = dataLen;
short le = apdu.setOutgoing(); // do dai du lieu toi da gui
len may tinh
apdu.setOutgoingLength(toSend);
short sendLen = 0;
pointer = 0;
while(toSend > 0)
{
sendLen = (toSend > le)?le:toSend;
apdu.sendBytesLong(temp, pointer,sendLen);
toSend -= sendLen;
pointer += sendLen;
}
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
}
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)
lOMoARcPSD|36451986
| 1/5

Preview text:

lOMoARcPSD|36451986
APDU mở rộng (Extended APDU)
Tính năng APDU mở rộng có từ tảng Java Card v2.2.2 trở đi, cho phép các
nhà phát triển Applet tận dụng chức năng APDU mở rộng, như được định nghĩa
trong đặc tả ISO 7816. APDU mở rộng cho phép một lượng lớn dữ liệu được gửi
đến thẻ, được xử lý một cách thích hợp và được gửi trở lại thiết bị đầu cuối, theo
cách hiệu quả hơn. Khi làm việc với khối dữ liệu lớn, nếu sử dụng APDU thông
thường, các nhà phát triển phải gửi nhiều lần, nhưng với APDU mở rộng thì chỉ
với một lần trao đổi là xong.

APDU mở rộng có lợi thế khi xử lý một lượng thông tin lớn. Ví dụ, các ứng
dụng như xác minh chữ ký, xác minh sinh trắc học, lưu trữ và truy xuất hình ảnh
có thể được tính năng này. Việc triển khai APDU mở rộng có thể dễ dàng được
thực hiện nếu giao thức truyền tải cơ bản là T = 1, trong khi các applet được phát
triển cho thẻ T = 0 sẽ cần sự cẩn thận và logic đặc biệt để hoạt động chính xác.
Trong hầu hết các trường hợp, phương thức setIncomingAndReceive đủ để
đọc số byte dữ liệu vào bộ đệm APDU như được chỉ định trong trường Lc. Tuy
nhiên, đối với một lệnh APDU có nhiều dữ liệu hơn mức có thể phù hợp với bộ
đệm APDU, phương thức setIncomingAndReceive cần theo sau bởi một hoặc
nhiều lệnh gọi đến phương thức receiveBytes:
public short receiveBytes(short bOff) throws APDUException
Đối với dữ liệu lệnh APDU dài, Applet có thể xử lý dữ liệu từng phần và sau
đó gọi phương thức receiveBytes để đọc dữ liệu bổ sung vào bộ đệm APDU.
Với phương thức receiveBytes, phần bù vào bộ đệm APDU nơi dữ liệu được
nhận có thể được chỉ định. Điều này cho phép Applet kiểm soát cách sử dụng bộ
đệm APDU trong quá trình xử lý dữ liệu đến. Ví dụ, như trong hình 1, Applet có
thể đã xử lý dữ liệu từ cuộc gọi trước đó đến phương thức setIncomingAndReceive
hoặc phương thức receiveBytes, ngoại trừ một vài byte.
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986
Hình 1 - Gọi phương thức receiveBytes
Applet có thể di chuyển các byte này vào đầu bộ đệm và sau đó nhận nhóm
tiếp theo để nó được gắn vào các byte vẫn còn trong bộ đệm. Tính năng này rất
quan trọng trong trường hợp dữ liệu được đọc trên các yêu cầu phương thức cần được xử lý toàn bộ. Giống
như phương thức setIncomingAndReceive, phương thức
receiveBytes được đảm bảo trả về đồng bộ, lấy ra càng nhiều byte càng tốt. Tuy
nhiên, tùy thuộc vào số lượng byte mà máy chủ sẽ gửi dưới dạng một lô và tùy
thuộc vào việc triển khai JCRE, cả hai phương thức có thể đọc được ít byte hơn
không gian có sẵn trong bộ đệm APDU.
Như một quy tắc chung, cả phương thức setIncomingAndReceive và phương
thức receiveBytes đều được tối ưu hóa. Nếu toàn bộ dữ liệu lệnh phù hợp trong
bộ đệm APDU bắt đầu ở phần bù ISO7816.OFFSET_CDATA (= 5), một lệnh gọi của
phương thức setIncomingAndReceive sẽ đủ để nhận tất cả dữ liệu. Viêc gọi đến
phương thức receiveBytes là không cần thiết. Hầu hết các lệnh APDU thuộc loại này.
Theo tiêu chuẩn của lớp javacard.framework.APDU thì độ dài của bộ đệm
APDU tối thiểu phải từ 133 bytes (5 bytes tiêu đề và 128 bytes dữ liệu). Khi đó,
chúng ta cần sử dụng phương thức receiveBytes. Nếu các byte còn lại vừa với
không gian có sẵn ở phần bù được chỉ định trong bộ đệm APDU, phương thức
receiveBytes được đảm bảo trả về với tất cả dữ liệu còn lại. Mặt khác, phương
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986
thức đọc nhiều byte sẽ phù hợp với bộ đệm và có thể ít hơn. Các Applet cần gọi
receiveBytes nhiều lần, xử lý hoặc nhập các byte trong bộ đệm dữ liệu APDU
với mỗi cuộc gọi, cho đến khi tất cả dữ liệu có sẵn được đọc. (Lưu ý: Bộ đệm
APDU của thẻ JCOP chúng ta đang dùng là 261 byte)
Ví dụ sau bao hàm phương thức receiveBytes bên trong vòng lặp while: package BaiTH1; import javacard.framework.*;
import javacardx.apdu.ExtendedLength; public class Bai5_ExtendedApdu extends Applet implements ExtendedLength { private static byte temp[];
private final static short MAX_SIZE = (short)1024;
private final static byte INS_NHAP = (byte)0x01;
private final static byte INS_XUAT = (byte)0x02; private static short dataLen;
public static void install(byte[] bArray, short bOffset, byte bLength) {
new Bai5_ExtendedApdu().register(bArray, (short) (bOffset + 1), bArray[bOffset]); temp = new byte[MAX_SIZE]; }
public void process(APDU apdu) { if (selectingApplet())
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986 { return; }
byte[] buf = apdu.getBuffer();
short recvLen = apdu.setIncomingAndReceive();
short pointer = 0; //vi tri con tro trong temp
switch (buf[ISO7816.OFFSET_INS]) {
case INS_NHAP: // nhan du lieu gui tu may tinh
//lay ra do dai du lieu gui xuong
dataLen = apdu.getIncomingLength(); if (dataLen > MAX_SIZE)
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH); //lay ra vi tri bat dau data
short dataOffset = apdu.getOffsetCdata(); pointer = 0; while (recvLen > 0) {
//copy du lieu nhan duoc tu apdu buffer vao mang temp Util.arrayCopy(buf, dataOffset, temp, pointer, recvLen); pointer += recvLen;
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com) lOMoARcPSD|36451986
//tiep tuc nhan du lieu va ghi vao apdu buffer tai vi tri dataOffset
recvLen = apdu.receiveBytes(dataOffset); } break;
case INS_XUAT: //gui du lieu len may tinh short toSend = dataLen;
short le = apdu.setOutgoing(); // do dai du lieu toi da gui len may tinh
apdu.setOutgoingLength(toSend); short sendLen = 0; pointer = 0; while(toSend > 0) {
sendLen = (toSend > le)?le:toSend;
apdu.sendBytesLong(temp, pointer,sendLen); toSend -= sendLen; pointer += sendLen; } break; default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); } } }
Downloaded by Linh Chi ??ng (chithcsttst101@gmail.com)