JavaCard Applet Development Related Questions and Answers.
-
corleoner
- Posts: 15
- Joined: Fri Dec 11, 2015 2:22 am
- Points :92
-
Contact:
Post
by corleoner » Thu Jan 14, 2016 1:17 am
I have run into a problem for some days. I want to send out data which has the size bigger than 256.
And I use the code:
Code: Select all
private void sendData(APDU apdu) {
BUF_IN_OFFSET[0] = 0;
short remain = (short) ((short)372 - BUF_IN_OFFSET[0]);
boolean chain = remain > MAX_APDU;
short sendLen = chain ? MAX_APDU : remain;
apdu.setOutgoing();
apdu.setOutgoingLength((short)sendLen);
apdu.sendBytesLong(data, BUF_IN_OFFSET[0], sendLen);
if (chain) {
BUF_IN_OFFSET[0] += sendLen; // count the bytes sent
remain -=sendLen;
ISOException.throwIt((short)(ISO7816.SW_BYTES_REMAINING_00 + remain));
} else {
BUF_IN_OFFSET[0] = 0; // no more bytes to send
}
}
When I execute this code on my real card(support T1/T0), I got "0x90 0x00",which "0x61 0xXX is expected(XX is the remained data length). I guess the used protocol related to this problem. I m not sure!
Can anyone help me? Thanx for any help!
-
UNKNwYSHSA
- Posts: 630
- Joined: Thu May 21, 2015 4:05 am
- Points :3055
-
Contact:
Post
by UNKNwYSHSA » Wed Jan 20, 2016 11:01 pm
Remove the first line of method sendData();
My test code as following:
Code: Select all
package testOutgoingData;
import javacard.framework.*;
public class testOutgoingData extends Applet
{
private final static short MAX_APDU = 256;
private short BUF_IN_OFFSET[];
private byte data[];
public testOutgoingData() {
BUF_IN_OFFSET = JCSystem.makeTransientShortArray((short) 1, JCSystem.CLEAR_ON_DESELECT);
data = new byte[372];
for (short i = 0; i < data.length; ++i) {
data[i] = (byte)(i & 0xFF);
}
}
public static void install(byte[] bArray, short bOffset, byte bLength)
{
new testOutgoingData().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}
private void sendData(APDU apdu) {
short remain = (short) ((short)372 - BUF_IN_OFFSET[0]);
boolean chain = remain > MAX_APDU;
short sendLen = chain ? MAX_APDU : remain;
apdu.setOutgoing();
apdu.setOutgoingLength((short)sendLen);
apdu.sendBytesLong(data, BUF_IN_OFFSET[0], sendLen);
if (chain) {
BUF_IN_OFFSET[0] += sendLen; // count the bytes sent
remain -=sendLen;
ISOException.throwIt((short)(ISO7816.SW_BYTES_REMAINING_00 + remain));
} else {
BUF_IN_OFFSET[0] = 0; // no more bytes to send
}
}
public void process(APDU apdu)
{
if (selectingApplet())
{
return;
}
byte[] buf = apdu.getBuffer();
switch (buf[ISO7816.OFFSET_INS])
{
case (byte)0xC0:
sendData(apdu);
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
}
APDU commands and responses as following:
Code: Select all
Card Manager AID : A000000003000000
Card Manager state : OP_READY
Application: SELECTABLE (--------) 112233445500
Load File : LOADED (--------) 1122334455
Module : 112233445500
>> /select 112233445500
>> 00 A4 04 00 06 11 22 33 44 55 00 00
<< 90 00
>> /send 00C0000000
>> 00 C0 00 00 00
<< 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 90 00
sense and simplicity
Users browsing this forum: No registered users and 17 guests
JavaCard OS : Disclaimer
Board Disclaimer
The views and comments posted in these fora are personal and do not necessarily represent the those of the Management of JavaCard OS.
The Management of JavaCard OS does not, under any circumstances whatsoever, accept any responsibility for any advice, or recommentations, made by, or implied by, any member or guest vistor of JavaCard OS that results in any loss whatsoever in any manner to a member of JavaCard OS, or to any other person.
Furthermore, the Management of JavaCard OS is not, and cannot be, responsible for the content of any other Internet site(s) that have been linked to from JavaCard OS.