Update 1: I installed my applet on the javacard(I used from the source code which is as accepted answer In my already question) .When I send generatedKey command via OpenSc ,It just returns 9000 as response instead of sending XORed Data! I created my project with Javacard version 2.2.1 and i am certain that my card is compattible with that version. Why expected data not recieved by OpenSc?
I want to send a random byte array including for example 24 elements to my JavaCard applet and then my applet is supposed to change that array using a specific method. For example that method XOR each elements with 0x05 and returns the result array in APDU response.
To aim the above goal I wrote the following program so far:
package keyGeneratorPackage;
import javacard.framework.*;
public class keyGeneratorPackage extends Applet {
private static final byte HW_CLA = (byte) 0x80;
private static final byte HW_INS = (byte) 0x00;
public static void install(byte[] bArray, short bOffset, byte bLength) {
new keyGeneratorPackage().register(bArray, (short) (bOffset + 1),
bArray[bOffset]);
}
public void process(APDU apdu) {
if (selectingApplet()) {
return;
}
byte[] buffer = apdu.getBuffer();
byte CLA = (byte) (buffer[ISO7816.OFFSET_CLA] & 0xFF);
byte INS = (byte) (buffer[ISO7816.OFFSET_INS] & 0xFF);
byte[] Data = new byte[] { (byte) (buffer[ISO7816.OFFSET_CDATA] & 0xFF) };
if (CLA != HW_CLA) {
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
}
switch (INS) {
case HW_INS:
getKey(apdu, Data);
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
private void getKey(APDU apdu, byte[] data) {
byte[] buffer = apdu.getBuffer();
byte[] generatedKey = generateKey(data);
short length = (short) generatedKey.length;
Util.arrayCopyNonAtomic(generatedKey, (short) 0, buffer, (short) 0,
(short) length);
apdu.setOutgoingAndSend((short) 0, length);
}
private byte[] generateKey(byte[] Data) {
byte[] key = new byte[] { (byte) 0x00 };
for (int i = 0; i < Data.length; i++) {
key[i] = (byte) (Data[i] ^ 5);
}
return key;
}
}
I must send the following APDU command after compiling and selecting my applet:
>>> 80 00 00 00 18 11 22 33 44 55 66 77 88 99 10 20 30 40 50 60 70 80 90 b1 b2 b3 b4 b5 b6 b7 26
Is there something wrong with my applet?
In method,
private void getKey( APDU apdu , byte[] data)you need to call,Remember:
So update your method like this:
}
Note:
setIncomingAndReceivemethod may only be called once in a Applet.process() method. For more detail, read setIncomingAndReceive.EDIT: There are several problems in your code. I'm mentioning all of them one by one.
Problem 1:
byte[] Data =new byte[] {(byte) (buffer[ISO7816.OFFSET_CDATA] & 0xFF)};It creates a
byte[] Dataof length 1 with value0x11.Solution:
newcreates space into persistent EEP memory forData. If you don't needDataagain you can make ittransientbyte array.Rewrite it like this (Persistent):
Or this (Transient):
Problem 2:
i) Your
generateKey()method will crash, because you are creatingbyte[] keysame as you do forbyte[] Data.ii) You may not declare
int ibecause only few cards supports it, usebyteorshort.Solution: As far as I understand what are you trying to do in the
generateKey()method, I rewrite it for you like this:The full working code is:
JavaCard: v.2.2.2
globalPlatform: v.2.1.1
Suggestion: Read this document carefully first.
APDU's I sent :
Cheers!