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!
Môn: Kỹ thuật phần mềm (8480103)
Trường: Học viện kỹ thuật quân sự
Thông tin:
Tác giả:
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)