Debug Problem on Jcop Tools
Hello,
I have developed a Java Card Applet on Eclipse and I can run it through Jcop Tools' simulator. However, when I try to debug it, simulator returns 6A80 to upload command. Would you please tell me, what can be the reason of this problem?
Thanks in Advance,
Regards
Dear ankey21, thank you for your response. Restarting Eclipse could not solve the problem.
Here is apdu trace:
cm> upload -d -b 250 "D:\**.cap"
=> 80 E6 02 00 12 05 6D 79 61 70 70 08 A0 00 00 00 ......myapp.....
03 00 00 00 00 00 00 00 ........
(1556 usec)
<= 00 90 00 ...
Status: No Error
=> 80 E8 00 00 FA C4 83 01 1E D7 01 00 15 DE CA FF ................
ED 02 02 04 00 01 05 6D 79 61 70 70 05 6D 79 61 .......myapp.mya
70 70 02 00 21 00 15 00 21 00 09 00 32 04 56 00 pp..!...!...2.V.
55 4A 89 00 DD 0A 62 00 00 0C 5F B7 73 00 18 00 UJ....b..._.s...
0B 00 B2 05 01 00 04 00 32 05 02 01 07 A0 00 00 ........2.......
00 62 01 01 02 01 07 A0 00 00 00 62 02 01 02 01 .b.........b....
07 A0 00 00 00 62 01 02 00 01 06 A0 00 00 01 51 .....b.........Q
00 00 01 07 A0 00 00 00 62 00 01 03 00 09 01 05 ........b.......
4D 79 41 70 70 04 09 06 00 55 00 00 80 00 80 03 MyApp....U......
43 00 40 04 06 00 00 04 32 FF FF 04 1D 04 3C 32 [email protected].....<2
E3 32 EE 00 84 00 07 00 07 01 02 00 08 47 4D 47 .2...........GMG
72 46 56 46 66 46 95 46 D1 47 11 47 E1 47 F6 48 rFVFfF.F.G.G.G.H
04 00 84 00 08 00 07 01 00 00 0A 49 6E 49 BA 49 ...........InI.I
C4 49 D0 49 EB 4A 0C 4A 1B 4A 2D 4A 3F 4A 71 07 .I.I.J.J.J-J?Jq.
4A 89 24 03 D3 80 1A 03 ED 00 00 04 25 80 04 04 J.$.........%...
2B 00 AB 04 54 01 AE 06 04 00 64 04 54 01 AE 00 +...T.....d.T...
(864915 nsec)
<= 6A 80 j.
Status: Wrong data
jcshell: Error code: 6a80 (Wrong data)
jcshell: Wrong response APDU: 6A80
Unexpected error; aborting executionRegards,
Similar Messages
-
Hi all,
I wrote simple applet and I tried to test it with JCOP Tool (eclipse) but I get this error
cm> /term "Remote|localhost:8050"
/card -a a000000003000000 -c com.ibm.jc.CardManagerATR: 3BFA1300008131FE454A434F5034315632323196
ATR: T=1, FI=1/DI=3 (93clk/etu), N=0, IFSC=254, BWI=4/CWI=5, Hist="JCOP41V221"
cm> set-key 255/1/DES-ECB/404142434445464748494a4b4c4d4e4f 255/2/DES-ECB/404142434445464748494a4b4c4d4e4f 255/3/DES-ECB/404142434445464748494a4b4c4d4e4f
cm> init-update 255
cm> ext-auth plain
cm> delete 4422331234
cm> delete 4422331234
jcshell: Error code: 6a88 (Reference data not found)
jcshell: Wrong response APDU: 6A88
Ignoring expected error
cm> delete 0000000001
cm> delete 0000000011
cm> upload -b 250 "D:\Development\Java\projects\JavaCard\HelloWorld\bin\org\erno\jc\hello\javacard\hello.cap"
cm> install -i 0000000001 -q C9#() 0000000011 0000000001
cm> upload -b 250 "D:\Development\Java\projects\JavaCard\test\bin\org\erno\test\javacard\test.cap"
cm> install -i 4422331234 -q C9#() 4422331234 4422331234
jcshell: Error code: 6985 (Conditions of use not satisfied)
jcshell: Wrong response APDU: 6985
Unexpected error; aborting executiondoes anybody know what is wrong with it? I am new about this :-(. thanx for any help.
regards
p.s. I'm using simulator not real card.Hy,
here is the status I get when I try to run my applet
- /term "Remote|localhost:50337"
--Opening terminal
/card -a a000000003000000 -c com.ibm.jc.CardManagerresetCard with timeout: 0 (ms)
--Waiting for card...
ATR=3B FA 13 00 00 81 31 FE 45 4A 43 4F 50 34 31 56 ;.....1.EJCOP41V
32 32 31 96 221.
ATR: T=1, FI=1/DI=3 (93clk/etu), N=0, IFSC=254, BWI=4/CWI=5, Hist="JCOP41V221"
=> 00 A4 04 00 08 A0 00 00 00 03 00 00 00 00 ..............
(15538 usec)
<= 6F 10 84 08 A0 00 00 00 03 00 00 00 A5 04 9F 65 o..............e
01 FF 90 00 ....
Status: No Error
cm> set-key 255/1/DES-ECB/404142434445464748494a4b4c4d4e4f 255/2/DES-ECB/404142434445464748494a4b4c4d4e4f 255/3/DES-ECB/404142434445464748494a4b4c4d4e4f
cm> init-update 255
=> 80 50 00 00 08 D7 5D 16 84 88 87 8B B0 00 .P....].......
(4177 usec)
<= 00 00 57 F3 97 D9 7F 72 88 55 FF 02 00 00 3D 02 ..W....r.U....=.
9C 31 C7 89 90 D8 41 D7 23 6B DD B4 90 00 .1....A.#k....
Status: No Error
cm> ext-auth plain
=> 84 82 00 00 10 45 11 3E D7 C1 3E 63 40 3A 2F EF .....E.>..>c@:/.
C1 E6 93 3C 0F ...<.
(3099 usec)
<= 90 00 ..
Status: No Error
cm> delete 0000000012
=> 80 E4 00 00 07 4F 05 00 00 00 00 12 00 .....O.......
(1459 usec)
<= 6A 88 j.
Status: Reference data not found
jcshell: Error code: 6a88 (Reference data not found)
jcshell: Wrong response APDU: 6A88
Ignoring expected error
cm> delete 0000000012
=> 80 E4 00 00 07 4F 05 00 00 00 00 12 00 .....O.......
(1613 usec)
<= 6A 88 j.
Status: Reference data not found
jcshell: Error code: 6a88 (Reference data not found)
jcshell: Wrong response APDU: 6A88
Ignoring expected error
cm> upload -b 250 "D:\Development\Java\projects\JavaCard\JCErnad\bin\erno\jc\javacard\jc.cap"
=> 80 E6 02 00 12 05 00 00 00 00 12 08 A0 00 00 00 ................
03 00 00 00 00 00 00 00 ........
(3475 usec)
<= 00 90 00 ...
Status: No Error
=> 80 E8 80 00 E8 C4 81 E5 01 00 17 DE CA FF ED 02 ................
02 04 00 01 05 00 00 00 00 12 07 65 72 6E 6F 2F ...........erno/
6A 63 02 00 21 00 17 00 21 00 09 00 0B 00 1E 00 jc..!...!.......
0E 00 3D 00 0A 00 0B 00 00 00 4D 01 A3 00 00 00 ..=.......M.....
00 00 00 01 01 00 04 00 0B 01 02 01 07 A0 00 00 ................
00 62 01 01 03 00 09 01 05 00 00 00 00 12 00 08 .b..............
06 00 0E 00 00 00 80 03 00 FF 00 07 01 00 00 00 ................
1C 07 00 3D 00 01 10 18 8C 00 06 7A 05 30 8F 00 ...=.......z.0..
03 3D 8C 00 00 18 1D 04 41 18 1D 25 8B 00 01 7A .=......A..%...z
02 21 18 8B 00 02 60 03 7A 19 8B 00 04 2D 1A 04 .!....`.z....-..
25 73 00 09 00 00 00 00 00 0F 11 6D 00 8D 00 05 %s.........m....
7A 08 00 0A 00 00 00 00 00 00 00 00 00 00 05 00 z...............
1E 00 07 06 00 00 01 03 80 03 02 03 80 03 03 01 ................
00 02 00 03 80 0A 01 06 80 07 01 06 80 03 00 09 ................
00 0B 00 00 00 07 05 06 04 0A 07 07 13 00 ..............
(18434 usec)
<= 00 90 00 ...
Status: No Error
Load report:
232 bytes loaded in 0.0 seconds
effective code size on card:
+ package AID 5
+ applet AIDs 12
+ classes 17
+ methods 64
+ statics 0
+ exports 0
overall 98 bytes
cm> install -i 0000000012 -q C9#() 0000000012 0000000012
=> 80 E6 0C 00 18 05 00 00 00 00 12 05 00 00 00 00 ................
12 05 00 00 00 00 12 01 00 02 C9 00 00 00 ..............
(3280 usec)
<= 69 85 i.
Status: Conditions of use not satisfied
jcshell: Error code: 6985 (Conditions of use not satisfied)
jcshell: Wrong response APDU: 6985
Unexpected error; aborting executionthanks
regards
erno -
JCOP Tools init-update problem
Hello, everybody!!!
I wanna simulate CardManager authentication behaviour and have some problems... Below i show you excerpts from my applet and the process of sending INITIALIZE UPDATE command to it using JCOP Shell.
If somebody has an idea to deal with this issue, please help.
Here's the definition of key i've used:
byte[] secKey = new byte[] {
(byte)0x40, (byte)0x41, (byte)0x42, (byte)0x43,
(byte)0x44, (byte)0x45, (byte)0x46, (byte)0x47
};This is done inside the constructor (secKey declared as a class field).
Next, i've added method to process INITIALIZE UPDATE command:
private boolean processInitUpdate(APDU apdu) {
byte[] buffer = apdu.getBuffer();
if((buffer[ISO7816.OFFSET_CLA] != 0x80) &&
(buffer[ISO7816.OFFSET_INS] != 0x50))
return false;
byte challengeLen = buffer[ISO7816.OFFSET_LC];
byte dataRead = (byte)apdu.setIncomingAndReceive();
if((challengeLen != 0x08) || (dataRead != 0x08)) {
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
// Encrypted cryptogram buffer
byte[] cryptogram = new byte[8];
DESKey des_key = (DESKey)KeyBuilder.buildKey(
KeyBuilder.TYPE_DES, KeyBuilder.LENGTH_DES, false);
des_key.setKey(secKey, (short)0);
Cipher cipher = Cipher.getInstance(Cipher.ALG_DES_ECB_NOPAD, false);
cipher.init(des_key, Cipher.MODE_ENCRYPT);
// Encrypt the incoming challenge
cipher.doFinal(buffer, ISO7816.OFFSET_CDATA, (byte)8, cryptogram, (byte)0);
// Output data
byte[] keyDeriviation = new byte[] {
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00
byte[] keyInfo = new byte[] {
(byte)0xff, (byte)0x02
// TODO generate random
byte[] challenge = new byte[] {
(byte)0x11, (byte)0x22, (byte)0x33, (byte)0x44,
(byte)0x55, (byte)0x66, (byte)0x77, (byte)0x88
// Calculate total length of the data to be sent
short totalLen = (short)(keyDeriviation.length + keyInfo.length +
cryptogram.length + challenge.length);
apdu.setOutgoing();
apdu.setOutgoingLength(totalLen);
apdu.sendBytesLong(keyDeriviation, (short)0, (short)keyDeriviation.length);
apdu.sendBytesLong(keyInfo, (short)0, (short)keyInfo.length);
apdu.sendBytesLong(challenge, (short)0, (short)challenge.length);
apdu.sendBytesLong(cryptogram, (short)0, (short)cryptogram.length);
return true;
}This method returns true if command has been processed successfully.
I've used GlobalPlatform specification to properly parse command APDU and to generate response APDU.
Then i use JCOP Tools for Eclipse shell. I select above applet and define keys as follows:
set-key 255/1/DES-ECB/4041424344454647
set-key 255/2/DES-ECB/4041424344454647
set-key 255/3/DES-ECB/4041424344454647Then i use init-update command:
init-update 255Shell generates the following APDU command sequence:
80 50 00 00 08 C3 17 13 59 C6 0F ED ED 00We can see the challenge, generated by simulator: C3 17 13 59 C6 0F ED ED.
I got the response:
00 00 00 00 00 00 00 00 00 00 FF 02 11 22 33 44 55 66 77 88 4D 4C E8 7E 6A 04 B1 43 90 00It seems everything all right, but shell shows an error:
Status: No Error
jcshell: Error code: -5 (Authentication failed)
jcshell: Wrong response APDU: 00000000000000000000FF0211223344556677884D4CE87E6A04B1439000I think I set keys inside the shell incorrectly. I use triple-DES, but code uses simple DES. However, i use equal keysets for triple-DES so it's the same as DES.
What's wrong?
Thank you.Hello everybody, again!
At last, I solved my problem. The issue was I incorrectly generated card cryptogram data. Cryptogram must be constructed using full triple DES algorithm. After that JCOP shell processes init-update 255 successfully.
Below I'll present working code for processing INITIALIZE UPDATE command in JCOP tools, maybe this will be helpful for somebody.
private boolean processInitUpdate(APDU apdu) {
byte[] buffer = apdu.getBuffer();
// Whether this INITIALIZE UPDATE command?
if((buffer[ISO7816.OFFSET_CLA] != 0x80) &&
(buffer[ISO7816.OFFSET_INS] != 0x50))
return false;
byte challengeLen = buffer[ISO7816.OFFSET_LC];
byte dataRead = (byte)apdu.setIncomingAndReceive();
if((challengeLen != 0x08) || (dataRead != 0x08)) {
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
// TODO generate random
// Card challange
byte[] challenge = new byte[] {
(byte)0x11, (byte)0x22, (byte)0x33, (byte)0x44,
(byte)0x55, (byte)0x66, (byte)0x77, (byte)0x88
// DES Secure Channel Encryption Key (S-ENC) generation
// Deriviation data array
byte[] derivData = new byte[16];
// Secure Channel Encryption Key data array
byte[] s_enc_key = new byte[16];
// The construction of deriviation data
Util.arrayCopy(buffer, (short)(ISO7816.OFFSET_CDATA + 4), derivData, (short)12, (short)4);
Util.arrayCopy(challenge, (short)0, derivData, (short)8, (short)4);
Util.arrayCopy(buffer, ISO7816.OFFSET_CDATA, derivData, (short)4, (short)4);
Util.arrayCopy(challenge, (short)4, derivData, (short)0, (short)4);
// Construct and initialize Cipher with des_key
DESKey des_key = (DESKey)KeyBuilder.buildKey(
KeyBuilder.TYPE_DES, KeyBuilder.LENGTH_DES3_2KEY, false);
des_key.setKey(secKey, (short)0);
Cipher cipher = Cipher.getInstance(Cipher.ALG_DES_ECB_NOPAD, false);
cipher.init(des_key, Cipher.MODE_ENCRYPT);
// Generate session S-ENC key
cipher.doFinal(derivData, (byte)0, (byte)derivData.length, s_enc_key, (byte)0);
// Card Authentication Cryptogram generation
// Cryptogram data array
byte[] cryptogram = new byte[8];
// Initial vector data
byte[] initVector = new byte[] {
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00
// Construct and initialize Cipher with s_enc_key
des_key.setKey(s_enc_key, (short)0);
cipher = Cipher.getInstance(Cipher.ALG_DES_CBC_NOPAD, false);
cipher.init(des_key, Cipher.MODE_ENCRYPT, initVector, (short)0, (short)initVector.length);
// Extract host challenge from input buffer
byte[] hostChallenge = new byte[8];
Util.arrayCopy(buffer, ISO7816.OFFSET_CDATA, hostChallenge, (short)0, (short)hostChallenge.length);
// Step 1: Encrypt host challenge using ICV of binary zeroes
byte[] inputData = xorOperation(initVector, hostChallenge);
cipher.doFinal(inputData, (short)0, (short)inputData.length, cryptogram, (short)0);
// Step 2: Encrypt card challenge using results of the previous operation
inputData = xorOperation(cryptogram, challenge);
cipher.doFinal(inputData, (short)0, (short)inputData.length, cryptogram, (short)0);
// Step 3: Encrypt DES padding data using results of the previous operation
byte[] pad = new byte[] {
(byte)0x80, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00
inputData = xorOperation(cryptogram, pad);
cipher.doFinal(inputData, (short)0, (short)inputData.length, cryptogram, (short)0);
// Generate output
byte[] keyDeriviation = new byte[] {
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00
byte[] keyInfo = new byte[] {
(byte)0xff, (byte)0x01
// Calculate total length of the data to be sent
short totalLen = (short)(keyDeriviation.length + keyInfo.length +
cryptogram.length + challenge.length);
apdu.setOutgoing();
apdu.setOutgoingLength(totalLen);
apdu.sendBytesLong(keyDeriviation, (short)0, (short)keyDeriviation.length);
apdu.sendBytesLong(keyInfo, (short)0, (short)keyInfo.length);
apdu.sendBytesLong(challenge, (short)0, (short)challenge.length);
apdu.sendBytesLong(cryptogram, (short)0, (short)cryptogram.length);
return true;
private byte[] xorOperation(byte[] op1, byte[] op2) {
byte[] res = new byte[8];
if((op1.length != 8) || (op2.length != 8)) return null;
for(byte i = 0; i < res.length; i++) {
res[i] = (byte)(op1[i] ^ op2);
return res;
Regards, Eugene. -
JCOP Tools Problem Error code: 6985 (Conditions of use not satisfied)
I have a problem with the JCOP tools. I am developing a very simple applet which does nothing at all. It is a "hello world" type applet so that I can get something working. It compiles ok, however as soon as I try to run it under the emulator I get an error.
Status: Conditions of use not satisfied jcshell: Error code: 6985 (Conditions of use not satisfied) jcshell: Wrong response APDU: 6985
This always happens when the jcshell issues the install command.
The install command is:
install -i 1234567890 -t -l -d -m -p -s -b -e -q C9#(1234567890) 1234567890 1234567890
I must be doing something very basic incorrectly. I have tried searching the forums and internet and I haven't found anything. Any help would be appreciated.
The code is this:
package pt.microfil.test;
import javacard.framework.*;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;
import javacard.framework.APDU;
public class testcard extends Applet {
final static byte CLASS = (byte) 0x80; // Class of the APDU commands
final static byte INS_READ = (byte) 0x02; // instruction for the READ APDU command
// this is the text string which will send back from the ICC to the IFD
final static byte[] text = {(byte) 'e', (byte) 't', (byte) 's', (byte) ' ',
(byte) 'g', (byte) 'e', (byte) 'h', (byte) 't', (byte) 's', (byte) ' ',
(byte) 'd', (byte) 'e', (byte) 's', (byte) ' ',
(byte) 'G', (byte) 'l', (byte) 'u', (byte) 'm', (byte) 'p'};
public static void install(byte[] bArray, short bOffset, byte bLength) {
// GP-compliant JavaCard applet registration
//new testcard().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
new testcard().register();
public static void install() {
new testcard().register();
public void process(APDU apdu) {
byte[] cmd_apdu = apdu.getBuffer(); // the cmd_apdu variable is used because of performance reasons
if (cmd_apdu[ISO7816.OFFSET_CLA] == CLASS) { // it is the rigth class
switch(cmd_apdu[ISO7816.OFFSET_INS]) { // check the instruction byte
case INS_READ: // it is a READ instruction
// check if P1=P2=0
if ((cmd_apdu[ISO7816.OFFSET_P1] != 0) || (cmd_apdu[ISO7816.OFFSET_P2] != 0)) {
ISOException.throwIt(ISO7816.SW_WRONG_P1P2);
} // if
// check if P3=length of the text field
short le = (short)(cmd_apdu[ISO7816.OFFSET_LC] & 0x00FF); // calculate Le (expected length)
short len_text = (short)text.length; // the len_text variable is used because of performance reasons
if (le != len_text) {
ISOException.throwIt((short)(ISO7816.SW_CORRECT_LENGTH_00 + len_text)); // give the expected length back to the IFD
} // if
apdu.setOutgoing(); // set transmission to outgoing data
apdu.setOutgoingLength((short)len_text); // set the number of bytes to send to the IFD
apdu.sendBytesLong(text, (short)0, (short)len_text);
break;
default : // the instruction in the command apdu is not supported
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
} // switch
} // if
else { // the class in the command apdu is not supported
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
}i also found this error and i change the package name and applet id.it is not changing.now i got same error.
cm> install -i 6d796170702e617070 -q C9#() 6d797061636b616765 6d796170702e617070
jcshell: Error code: 6985 (Conditions of use not satisfied)
jcshell: Wrong response APDU: 6985
Unexpected error; aborting execution
how can i solve the problem?? -
I can not create interface [Eclipse - JCOP Tools Problem]
Hello Dear All,
I have a problem about Eclipse and I want to demonstrate it with an example.Let's say there are two applets, called A and B. I want to share a function of A applet with B applet. To do it, I create an interface(File -> New -> Other -> Interface) and then, a problem occured. For all open projects in eclipse, eclipse shows this error message: "Unsupported Java compiler: Class files with version: 50.0 [Major.minor] are not yet supported by JCOP Tools."
I worked on this situation too much however I could not solve this problem, I need your help.
(I use last version of Eclipse and JCOP Tools)
Thanks in Advance,
Kindly Regards
SelcukJCOP Tools does not support Java 6 yet. Reason is the CAP file converter. Just set the Java compiler compliancy in Eclipse to 1.5 and you should be fine.
-
Hello,
i would like to know, what scripts is JCOP tools exactly running while building Java files (generating class files) and converting them to CAP files. I.e. what does "Build autoimatically" exactly do in ECLIPSE IDE with JCOP plug-in? What .jar files are also used?
I.e. i want to be able to rebuild my Java Card projects for different version os java cards without opening the Eclipse IDE, openning projects and building them in IDE.
I would appreciate nay information.
Thanks a lot,
best regards,
newbie.Hello.
Thanks a lot lexdabear for your reply.
The post you've noticed above was very useful for me. I have solved the problem with tric.jar and also would like to add my 50 cents regarding some solutions proposed by Lillesand.
The error listed below can be simply avoided by explicitly declaring the whole name of the applet, i.e. -a 0xF3:0xF3:0xF3:0xF3:0xF3:0xA1:0xA1:0xA1:0xA1:0xA1 no.qfree.keyexport.KeyDiversification.
E:\tools\captest2>java -cp e:\eclipse\plugins\com.ibm.bluez.jcop.eclipse_3.1.2\tric.jar com.ibm.jc.apps.tric.jc.Converter
-dd e:\tools\captest2\
-cp e:\workspace\KeyExport\bin\;e:\tools\java_card_kit-2_2_2\lib\api.jar
-ep E:\tools\java_card_kit-2_2_2\api_export_files
-a 0xF3:0xF3:0xF3:0xF3:0xF3:0xA1:0xA1:0xA1:0xA1:0xA1 KeyDiversification 0xF3:0xF3:0xF3:0xF3:0xF3:0xA2:0xA2:0xA2:0xA2:0xA2 StringStorage
no.qfree.keyexport 0xF3:0xF3:0xF3:0xF3:0xF3 1 0
Error: class java.lang.RuntimeException, no such applet class LKeyDiversification; found in package no/qfree/keyexportAlso my there are some facts that i have figured out during the usage of tric.jar through command line:
1. Eclipse IDE produces slightly different .class files than i do by using
javac -source 1.3 -target 1.2 -g options during the compilation. May be it uses additional options?
2. Perhaps, as a result, a bit different CAP files are produced that the ones built automatically using Eclipse IDE GUI. Those CAP files also slightly differ in size (usually smaller tha mines). The only components that differ in size are:
Method.cap
Debug.cap.
The files produced through command line work just fine. I guess, that JCOP tools may additionally optimize the .class files to produce a bit smaller .CAP files.
3. Regarding the version information JCOP tools tric.jar produces
CAP files with version M=2, m=1 when using JC211 API, and
CAP files with version M=2, M=2 when using JC221.
I also converted the same files uding JCDKv2.2.1. It produces CAP files of version M=2, M=1.
In my opinion, all the problems that occured in the aforementioned post by Lillesand were caused by wrong usage of the JC2.2.2 export files.
I totally agree with you, lexdabear regarding choosing only one solution. In case you are using JCOP tools (through GUI or command line) you must use JCOP JC API .jar files and tric.jar converter.
If you are using JCDK, you must use its api.jar library with export files and converter from JCDK (coverter.bat).
I hope this info might be useful.
Best regards,
Eve
Edited by: Ieva on Nov 5, 2007 4:11 AM -
Hello.
I looked through the older web sites of IBM regarding the usage of JCOP tools under Linux.
I am interested in following questions:
1. Is there any separate distributon version of JCOP tools for Linux?
2. Can sample JCOP tools 3.1.2 plugin (for Windows) be used under Linux. What has to be modified? Also what additional tools have to be installed an used for communication with real cards through PC/SC readers.
3. Is JCOP simulation option available under Linux?
I'll appreciate any help.
Best regards,
newbienewbie2007 wrote:Hello.
I looked through the older web sites of IBM regarding the usage of JCOP tools under Linux.
I am interested in following questions:
1. Is there any separate distributon version of JCOP tools for Linux?
2. Can sample JCOP tools 3.1.2 plugin (for Windows) be used under Linux. What has to be modified? Also what additional tools have to be installed an used for communication with real cards through PC/SC readers.
3. Is JCOP simulation option available under Linux?
I'll appreciate any help.
Best regards,
newbieEverything should work, except for the target pack and the non-existent Linux Pegoda driver.1. The is no seperate Linux distribution. You just need a Linux distribution for Eclipse.JCOP Tools plugin should work under Linux, except for the target pack and the non-existent Pegoda driver for Linux.1. There is no seperate Linux distribution. You just need the Linux distribution for Eclipse.
2. Prior to JCOP Tools 3.1.2 the last time something was mentioned about Linux was in the release notes of 3.1.1b . In version 3.2.0 IBM added a linux_support page to the JCOP Tools user guide (see release notes and linux_support page below).
3. There shouldn't be any problems with the generic simulation. The target pack runs only with Windows though.
h1. Release Notes
h2. Version
JCOP Tools 3.1.1.b (Bärlach)
h2. What's new?
h3. 3.1.1.b
<ul><li>New simulation (fixed static obj/arr bug, fixed instance field token bug).</li>
<li>Applet privileges can now be specified in the launch configuration dialog.</li>
<li>The "exportmap" feature is now available.</li>
<li>The JCOP Performance Test Demo ("JCOP Factor") is now included.</li>
<li>Minor bug fixes.</li>
</ul>
h2. Known problems
<ul><li>Simulations do not run (Linux, MacOS X)
The Eclipse update manager does not set the execute permission bits for the simulations. You need to manually <code>chmod 755</code> those files in ECLIPSE/plugins/com.ibm.bluez.jcop.eclipse_3.1.1.x/simuls/
</li>
<li>PC/SC Support (Linux)
JCOP Tools only works with pcsc-lite 1.2.0.
</li>
</ul>
h2. Frequently Asked Questions
Please refer to the online FAQ at http://www.zurich.ibm.com/jcop/download/eclipse/faq/.
h2. Bug Reports
Please send bug reports to [email protected]. Make sure you include the following:
<ul><li>Problem description</li>
<li>Steps to reproduce</li>
<li>Eclipse version and build number (Help > About)</li>
<li>JCOP Tools version (Help > About; click on BlueZ icon)</li>
</ul>
h2. Using JCOP Tools with Linux (>= 3.2.0)
h3. ___
Overview
The current JCOP Tools release now also offer a version for the popular Linux
operating system. Both the Windows and Linux verson provide more or less the same
functionality, and JCOP application development can thus fully succeed on Linux systems.
Nevertheless, installation of the JCOP Tools differ between Windows and Linux
where the Linux version does not provide a simple installer as in case of Windows.
Additionally, the Linux version expects a properly setup Muscle PCSC installation
as soon as you want to use them together with physical, real cards. As Muscle
PCSC is still not shipped with most Linux distributions, you must download and
install them separately from the JCOP Tools.
h3. ___
Contents
h3. ___
Software Requirements
Linux distribution
The JCOP Tools simulation has been developed on a Fedora Core 6 system, but should also work in case of
many other recent Linux distributions.
Java Development Kit
The JCOP Tools have been developed and tested with the Sun JDK 1.4.2_13-b06
for Linux. Your success with other Development Kits may vary as there are
partly subtle differences across the different devlopment kits.
PCSC
The JCOP Tools use PCSC to talk with real cards on Linux. Most distributions
do not ship with Linux PCSC by default (Fedora Core 6 does), you must thus download it fromhttp://www.linuxnet.com
and install it by yourself. If you are used to software installation under Linux,
and are not afraid of compiling and installing software packages, this should
not be a hard problem. You have to download both the base PCSC package
(including PCSC daemon and client libraries) and separately the driver
for the reader you want to use. The PCSC package contains a test program
which should tell you whether your installation is set up correctly and
communicating with a card works. The JCOP Tools have been reported to
work together with Muscle PCSC version 1.3.1-7.
JPCSC
The JCOP Tools are shipped with JPCSC which you can also download athttp://www.linuxnet.com. JPCSC
is a JNI library which offers Java applications the access to PC/SC functions
by mapping their requests to an underlying native PC/SC implementation. The JCOP
Tools - mostly written in Java - thus depend on JPCSC to communicate with real cards
on Linux. JPCSC depends on a properly installed and setup PC/SC environment.
Especially, the JAVA_LIBRARY_PATH should list the directories where the
PC/SC client libraries and the native JPCSC library libjpcsc.so ( downloadable as binary from
Windows Binary Download Here )
are installed, the CLASSPATH variable should list th___
Miscellaneous
What should work
As soon as you setup your system correctly, there should only be minor differences
between using JCOP Tools on Windows or on Linux. Emulating a real JCOP,
debugging, shell, cap-file conersion should all be possible as in case of Windows.
What is missing
No drivers or tools are currently available for using JCOP30's in contactless
mode. If you need such support, please contact directly NXP
at for further assistance.
Copyright 2001,2007 IBM Corp. All rights reserved.
Edited by: lexdabear on Sep 28, 2007 4:13 PM (I hate the new edit) -
JCOP debug is crashing jcop.exe
Bonjour,
- I have a little problem using debug feature with JCOP 3.0 with Eclipse : When I set a breakpoint in my code (to follow some method's local variables) or watchpoint on a class field, I always get an error from Windows saying that "jcop.exe has encountred a problem and it's going to close". Normally, programs encountring this problem will close but this is not the case of jcop ! But even though jcop and Eclipse don't close, the debugging points I've set would not work :(
- The only debug feature that is working well is "method breakpoint"
- here you can find some detailed informations about the messages I get during the problem and also about my working environement :
* Eclipse Platform Version: 2.1.2 - Build id: 200311030802
* Microsoft Windows XP [version 5.1.2600] (Frensh , with Service Pack 2)
* JCOP Tools 3.0 - Version 1.0.3.3
* JDK : java version "1.4.2_08" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_08-b03) Java HotSpot(TM) Client VM (build 1.4.2_08-b03, mixed mode)
Rem : I tried as said on JCOP web site to use jdk 1.3.x, but I can't get the Eclipse Working well and it fails to create new JCOp project or building a project or rebuilding my workspace, etc.
* here are the information provided by the Windows error message about jcop.exe :
Module 1
jcop.exe
Image Base: 0x00400000 Image Size: 0x00000000
Checksum: 0x0005657c Time Stamp: 0x40225743
* here is another "dump" file generated by windows about this erreor :
##BEGIN
<?xml version="1.0" encoding="UTF-16"?>
<DATABASE>
<EXE NAME="jcop.exe" FILTER="GRABMI_FILTER_PRIVACY">
<MATCHING_FILE NAME="jcop.exe" SIZE="334848" CHECKSUM="0xDE1DA3EA" MODULE_TYPE="WIN32" PE_CHECKSUM="0x5657C" LINKER_VERSION="0x0" LINK_DATE="02/05/2004 14:46:27" UPTO_LINK_DATE="02/05/2004 14:46:27" />
</EXE>
<EXE NAME="kernel32.dll" FILTER="GRABMI_FILTER_THISFILEONLY">
<MATCHING_FILE NAME="kernel32.dll" SIZE="1048576" CHECKSUM="0x60165972" BIN_FILE_VERSION="5.1.2600.2180" BIN_PRODUCT_VERSION="5.1.2600.2180" PRODUCT_VERSION="5.1.2600.2180" FILE_DESCRIPTION="DLL du client API BASE Windows NT" COMPANY_NAME="Microsoft Corporation" PRODUCT_NAME="Syst�me d'exploitation Microsoft� Windows�" FILE_VERSION="5.1.2600.2180 (xpsp_sp2_rtm.040803-2158)" ORIGINAL_FILENAME="kernel32" INTERNAL_NAME="kernel32" LEGAL_COPYRIGHT="� Microsoft Corporation. Tous droits r�serv�s." VERFILEDATEHI="0x0" VERFILEDATELO="0x0" VERFILEOS="0x40004" VERFILETYPE="0x2" MODULE_TYPE="WIN32" PE_CHECKSUM="0x10626E" LINKER_VERSION="0x50001" UPTO_BIN_FILE_VERSION="5.1.2600.2180" UPTO_BIN_PRODUCT_VERSION="5.1.2600.2180" LINK_DATE="08/04/2004 07:54:15" UPTO_LINK_DATE="08/04/2004 07:54:15" VER_LANGUAGE="Fran�ais (France) [0x40c]" />
</EXE>
</DATABASE>
##END
* Message I get in JCOP Shell when I launch the Debug and the problem occurs
##BEGIN
=> 80 E8 80 4D 2E 06 13 08 0D 06 05 0C 0E 0C 05 0B ...M............
0D 07 04 0B 05 07 03 03 07 04 07 04 04 07 05 37 ...............7
03 0C 04 12 05 0C 09 0B 06 03 06 03 03 08 04 08 ................
09 03 04 00 ....
Error code: -6 (Card terminal error)
Error message: java.net.SocketException: Connection reset
jcshell: D:/eclipse/plugins/com.ibm.bluez.jcop.eclipse.targetpack_1.0.3.3/lib/scripts/sim-simul-capfile-autoinstall.jcsh[58]: Communication problems.
Ignoring expected error: Communication problems.
end
/set-var -s J 0
while ${J} < ${PKG_${I}_APP_COUNT}
install -i ${PKG_${I}_APP_${J}_INST_AID} -q EF#(C8#(0000)C7#(0000)CA#(${PKG_${I}_APP_${J}_SIM_DATA}))C9#(${PKG_${I}_APP_${J}_INST_DATA}) ${PKG_${I}_AID} ${PKG_${I}_APP_${J}_AID}
=> 80 E6 0C 00 4F 10 43 50 53 5F 41 70 70 6C 65 74 ....O.CPS_Applet
31 2E 37 50 43 4B 10 43 50 53 5F 41 70 70 6C 65 1.7PCK.CPS_Apple
74 31 2E 38 41 49 44 10 43 50 53 5F 41 70 70 6C t1.8AID.CPS_Appl
65 74 31 2E 38 41 49 44 01 00 18 EF 14 C8 02 00 et1.8AID........
00 C7 02 00 00 CA 0A 01 00 01 00 30 02 01 01 02 ...........0....
02 C9 00 00 00 .....
Error code: -6 (Card terminal error)
Error message: java.net.SocketException: Connection reset by peer: socket write error
jcshell: D:/eclipse/plugins/com.ibm.bluez.jcop.eclipse.targetpack_1.0.3.3/lib/scripts/sim-simul-capfile-autoinstall.jcsh[62]: Communication problems.
Ignoring expected error: Communication problems.
/set-var -s J ${J} + 1
end
/set-var -s J
/set-var -s I $ + 1
end
/set-var -s I
if "${SIM_DOWNLOAD}" == "GSM-03.48"
end
card-info
=> 80 F2 80 00 02 4F 00 00 .....O..
Error code: -6 (Card terminal error)
Error message: java.net.SocketException: Connection reset by peer: socket write error
jcshell: D:/eclipse/plugins/com.ibm.bluez.jcop.eclipse.targetpack_1.0.3.3/lib/scripts/sim-simul-capfile-autoinstall.jcsh[80]: Communication problems.
Ignoring expected error: Communication problems.
##END
* I want just to add that I get always the same error when using Eclipse 2.1.3 version
Best Regardsbest_003.2009 wrote:
Iam using Eclipse 3.3.0.I installed JCOP tool in my eclipse.I can create Javacard applets now and i can upload and install to card also.but i couldnt debug my applet.can anybody help me.I also tried all the solutions which i searched in the forums." I couldn't debug" is not a comprehensive bug description one can reproduce your issue. Please state step by step what you're doing and what you expect. -
JCOP Tools 3.1.1b: Debugger does not break, what am I doing wrong?
Hey everybody
I'm desperately trying to debug applets using the JCOP Tools 3.1.1b but when I start the applet in debug mode, the debugger does not break on the breakpoints I set. You might know the little ticks that appear on top of each breakpoint bullet in the editor. The strange thing is that these ticks do not even appear.
I tried various versions of eclipse (3.1.0, 3.1.1, 3.1.2) and WinXP as wells as Linux. Does anybody else have the same problem or even a solution?
Thanks
Jonashello,
here are few steps you should check:
- when you start the debug session JCOPShell will load the applet into the simulator. You have to first make sure the applet is loaded with debug info. JCOPShell should do that by default, but check on the trace that "upload" command is called with the -d option:
upload -d "G:\glut-wks\JC\bin\helloworld\helloworld.cap" - then JCOPShell will install the applet with the "install" command. At that stage only the install function (and of course the constructor of the Applet) will be called. So breakpoints located in other part of the code won't break. Check the trace because if install is not called no applet code will be running.
- after installation, applet must be first selected to get any of its code running. Use "/select |appletname". If you have a breakpoint at the beginning of the "process" method, it should break. if the Applet is not selected all future APDU will go to the cardmanager, and applet code won't be running.
hope this help :)
E. -
I just bought the JCOP tools and a javacard reader/writer and i am so much confused as per its functions one of the problems i am having
is that
(1) In Suns Javacard parkage , AIDS are in the form 0xa0:0x0:0x0:0x0:0x62:0x3:0x1:0x8:0x1 while in the JCOP
environment i noticed was in the form 01020304050601 which i assumed is in the decimal format how do i convert.
(2) i tried writing a program which compiled well , when i wanted to test it with the JCShell it came out with this
error "Not yet Connected to terminal" What could be the cause of this.
(3) I have a Gemplus GPR400 Reader/writer attached to my laptop, though the computer has located and loaded drivers for it
i still don't know how to like access the reader or download applets onto it , I don't know if the JCOP tool can download onto it>
3. JCOP requires a PC/SC reader attached if you want
to load onto one of the JCOP cards. You can also use
the simulator for debugging. It appears that your
reader might not be found, which could be related to
question 2.yeah i guess so cos when i went to services i tried starting "Smart Card Resource Manager" and "Smart Card Helper" they would not start , they always give this error "The Dependency Service or group failed to start" what can be causing this probs i am using win Xp -
Simulation using Eclipse plugin for JCOP tools
Dear All,
In search for a simulation environment for java card applet development I tried to use Eclipse plugin for JCOP tools.
The samples which comes with the JCOP tools works fine but when try to debug my applet I receive the error: Wrong Data 6A 80.
Generic JCOP v2.4.1 is selected for Java Card Simulation.
Following is the JCOP Shell screen:
cm- /term "Remote|localhost:8050"
--Opening terminal
/card -a a000000003000000 -c com.ibm.jc.CardManagerresetCard with timeout: 0 (ms)
--Waiting for card...
ATR=3B F8 13 00 00 81 31 FE 45 4A 43 4F 50 76 32 34 ;.....1.EJCOPv24
31 B7 1.
IOCTL().
ATR: T=1, FI=1/DI=3 (93clk/etu), N=0, IFSC=254, BWI=4/CWI=5, Hist="JCOPv241"
=> 00 A4 04 00 08 A0 00 00 00 03 00 00 00 00 ..............
(908058 nsec)
<= 6F 65 84 08 A0 00 00 00 03 00 00 00 A5 59 9F 65 oe...........Y.e
01 FF 9F 6E 06 47 91 92 18 00 00 73 4A 06 07 2A ...n.G.....sJ..*
86 48 86 FC 6B 01 60 0C 06 0A 2A 86 48 86 FC 6B .H..k.`...*.H..k
02 02 01 01 63 09 06 07 2A 86 48 86 FC 6B 03 64 ....c...*.H..k.d
0B 06 09 2A 86 48 86 FC 6B 04 02 15 65 0B 06 09 ...*.H..k...e...
2B 85 10 86 48 64 02 01 03 66 0C 06 0A 2B 06 01 +...Hd...f...+..
04 01 2A 02 6E 01 02 90 00 ..*.n....
Status: No Error
cm> set-key 255/1/DES-ECB/404142434445464748494a4b4c4d4e4f 255/2/DES-ECB/404142434445464748494a4b4c4d4e4f 255/3/DES-ECB/404142434445464748494a4b4c4d4e4f
cm> init-update 255
=> 80 50 00 00 08 B1 04 15 2B 41 3F 62 AB 00 .P......+A?b..
(2668 usec)
<= 00 00 F9 02 71 E3 BB AD BD CD FF 02 00 00 3D 02 ....q.........=.
9C 31 C7 89 AD 44 8E 13 17 15 2E 5A 90 00 .1...D.....Z..
Status: No Error
cm> ext-auth plain
=> 84 82 00 00 10 CE 6C DC D2 8C BE 5E 33 EC 58 D0 ......l....^3.X.
57 3A 52 D2 24 W:R.$
(2288 usec)
<= 90 00 ..
Status: No Error
cm> delete -r a00000006203010c04
=> 80 E4 00 80 0B 4F 09 A0 00 00 00 62 03 01 0C 04 .....O.....b....
00 .
(1084 usec)
<= 6A 88 j.
Status: Reference data not found
jcshell: Error code: 6a88 (Reference data not found)
jcshell: Wrong response APDU: 6A88
Ignoring expected error
cm> upload -d -b 250 "D:\JCOP\eclipse\projects\DigitalTachograph\bin\digitaltachograph\javacard\digitaltachograph.cap"
=> 80 E6 02 00 16 09 A0 00 00 00 62 03 01 0C 04 08 ..........b.....
A0 00 00 00 03 00 00 00 00 00 00 00 ............
(2100 usec)
<= 00 90 00 ...
Status: No Error
=> 80 E8 00 00 FA C4 82 84 42 01 00 25 DE CA FF ED ........B..%....
02 02 04 00 01 09 A0 00 00 00 62 03 01 0C 04 11 ..........b.....
64 69 67 69 74 61 6C 74 61 63 68 6F 67 72 61 70 digitaltachograp
68 02 00 21 00 25 00 21 00 0E 00 29 03 3E 00 CD h..!.%.!...).>..
23 D2 01 BB 04 44 00 00 09 E3 4B E5 00 11 00 05 #....D....K.....
01 A2 04 01 00 04 00 29 04 00 01 07 A0 00 00 00 .......)........
62 00 01 02 01 07 A0 00 00 00 62 01 01 02 01 07 b.........b.....
A0 00 00 00 62 01 02 02 01 07 A0 00 00 00 62 02 ....b.........b.
01 03 00 0E 01 0A A0 00 00 00 62 03 01 0C 04 01 ..........b.....
01 DF 06 00 CD 00 00 00 80 00 00 FF 00 01 00 00 ................
00 01 81 03 13 00 12 07 03 00 00 02 01 03 06 0B ................
8C 81 00 00 00 80 00 0B 00 0B 01 01 00 00 0B F9 ................
00 80 00 11 00 0F 01 01 00 10 0E A9 0D D4 0D F7 ................
0E 07 0E 18 0E 26 0E 35 0E 44 0E 50 0E 72 0E 81 .....&.5.D.P.r..
0E 90 0E 9B 0E F5 11 05 11 1A 11 50 00 80 00 05 ...........P....
00 04 01 04 00 01 13 AF 13 B5 13 BA 14 0C 13 00 ................
(6775 usec)
<= 6A 80 j.
Status: Wrong data
jcshell: Error code: 6a80 (Wrong data)
jcshell: Wrong response APDU: 6A80
Unexpected error; aborting execution
I will be very happy if you can help me. I am desperately in need of a working debugging environment.
Thanks in advance!
Kind regards,
Mehmet* Processes incoming READ_BINARY APDUs. Returns data of the currently
* selected file.
* @param apdu where the offset is carried in header bytes p1 and p2.
* @param le expected length by terminal
* @return length of the response APDU
private short processReadBinary(APDU apdu, boolean protectedApdu, short leUnprotected) {
if (!hasFileSelected()) {
ISOException.throwIt(SW_CONDITIONS_NOT_SATISFIED);
byte[] buffer = apdu.getBuffer();
// retrieve p1p2 from apdu buffer
byte p1 = buffer[OFFSET_P1];
byte p2 = buffer[OFFSET_P2];
short offset = Util.makeShort(p1, p2); // offset encoded in P1/P2, 15 lowest bit
// offset encoded in P1/P2, 15 lowest bit
// check if le != 0 <-- no response expected
if (leUnprotected == 0) {
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
if (selectedFile == null) {
ISOException.throwIt(ISO7816.SW_FILE_NOT_FOUND);
if ((selectedFile.getAccessConditions() & READ_REQUIRES_SM) == READ_REQUIRES_SM) {
if(!protectedApdu)
ISOException.throwIt(ISO7816.SW_SECURITY_STATUS_NOT_SATISFIED);
short fileSize = (short) selectedFile.getFileLength();
// check offset
if (offset >= fileSize) {
ISOException.throwIt(ISO7816.SW_INCORRECT_P1P2);
// check expected length
if ((short) (offset + leUnprotected) > fileSize) {
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
//ISOException.throwIt(SW_TAMAM);
short bufferOffset = 0;
crypto.setEncryptionStatus(isSelectedFileEncrypted());
if (protectedApdu) {
bufferOffset = crypto.getApduBufferOffsetDT(leUnprotected);
if(isSelectedFileEncrypted())
bufferOffset = crypto.getApduBufferOffset(leUnprotected);
apdu.setOutgoing();
Util.arrayCopyNonAtomic(selectedFile.getData(), offset, buffer, bufferOffset, leUnprotected);
return leUnprotected;
* Processes and UPDATE_BINARY apdu. Writes data in the currently selected
* file.
* @param apdu
* carries the offset where to write date in header bytes p1 and
* p2.
private void processUpdateBinary(APDU apdu, boolean protectedApdu) {
if (!hasFileSelected() || isLocked()) {
ISOException.throwIt(ISO7816.SW_COMMAND_NOT_ALLOWED);
if ((selectedFile.getAccessConditions() & DigitalTachograph.UPDATE_ALW) != DigitalTachograph.UPDATE_ALW) {
if ((selectedFile.getAccessConditions() & DigitalTachograph.UPDATE_REQUIRES_SM) != DigitalTachograph.UPDATE_REQUIRES_SM) {
ISOException.throwIt(ISO7816.SW_SECURITY_STATUS_NOT_SATISFIED);
return;
}else if(!protectedApdu){
ISOException.throwIt(ISO7816.SW_SECURITY_STATUS_NOT_SATISFIED);
byte[] buffer = apdu.getBuffer();
byte p1 = buffer[OFFSET_P1];
byte p2 = buffer[OFFSET_P2];
short offset = Util.makeShort(p1, p2);
short readCount = (short) (buffer[ISO7816.OFFSET_LC] & 0xff);
//if (!protectedApdu){
readCount = apdu.setIncomingAndReceive();
while (readCount > 0) {
selectedFile.writeData(offset, buffer, OFFSET_CDATA, readCount);
offset += readCount;
readCount = apdu.receiveBytes(ISO7816.OFFSET_CDATA);
private short processInternalAuthenticate(APDU apdu , boolean protectedApdu) throws CryptoException {
byte[] buffer = apdu.getBuffer();
short lc = (short) (buffer[OFFSET_LC] & 0xFF);
if (lc != (short) (KID_LENGTH * 2)) {
ISOException.throwIt(SW_WRONG_LENGTH);
if (apdu.setIncomingAndReceive() != lc) {
ISOException.throwIt(ISO7816.SW_WRONG_DATA);
// Check if VU.CHR maches the one of the selected certificate on the card
if (Util.arrayCompare(buffer, (short) (OFFSET_CDATA + KID_LENGTH), keyStore.selected_KID, (short) 0, KID_LENGTH) != 0) {
ISOException.throwIt(SW_REFERENCE_DATA_NOT_FOUND);
if (Util.arrayCopyNonAtomic(buffer, OFFSET_CDATA, Rnd1, (short) 0, (short) 8) != (short) 8) { // Receive Rnd1
ISOException.throwIt(ISO7816.SW_WRONG_DATA);
// Hash(PRnd2||K1||Rnd1||VU.CHR)
random.generateData(PRnd2, (short) 0, (short) 90);
random.generateData(K1, (short) 0, (short) 16);
crypto.shaDigest.update(PRnd2, (short) 0, (short) 90); // PRnd2
crypto.shaDigest.update(K1, (short) 0, (short) 16); // PRnd2||K1
crypto.shaDigest.doFinal(buffer, OFFSET_CDATA, lc, digest, (short) 0); //Rnd1||VU.CHR
BigNumber mod = new BigNumber((short) 128);
mod.init(keyStore.Card_PubMod, (short) 0, (short) keyStore.Card_PubMod.length, BigNumber.FORMAT_HEX);
mod.subtract(signed, (short) 0, (short) 128, BigNumber.FORMAT_HEX);
if (mod.compareTo(signed, (short) 0, (short) 128, BigNumber.FORMAT_HEX) == -1) {
mod.toBytes(signed, (short) 0, (short) 128, BigNumber.FORMAT_HEX);
// To be added: if the selected private key is considered corrupted, the processing state returned is '6400' or '6581'.
signed[0] = (byte) 0x6A;
Util.arrayCopyNonAtomic(PRnd2, (short) 0, signed, (short) 1, (short) 90);
Util.arrayCopyNonAtomic(K1, (short) 0, signed, (short) 91, (short) 16);
Util.arrayCopyNonAtomic(digest, (short) 0, signed, (short) 107, (short) 20);
signed[127] = (byte) 0xBC;
if (!keyStore.cardPrivateKey.isInitialized()) {
CryptoException.throwIt(CryptoException.ILLEGAL_VALUE);
try {
crypto.rsaSigner.init(keyStore.cardPrivateKey, Signature.MODE_SIGN);
crypto.rsaSigner.doFinal(signed, (short) 0, (short) 128, signed, (short) 0);
} catch (Exception e) {
ISOException.throwIt(SW_REFERENCE_DATA_NOT_FOUND);
if (!keyStore.selectedPublicKey.isInitialized()) {
CryptoException.throwIt(CryptoException.ILLEGAL_VALUE);
try {
crypto.rsaCipher.init(keyStore.selectedPublicKey, Cipher.MODE_ENCRYPT);
crypto.rsaCipher.doFinal(signed, (short) 0, (short) 128, signed, (short) 0);
} catch (Exception e) {
ISOException.throwIt(SW_REFERENCE_DATA_NOT_FOUND);
apdu.setOutgoing();
Util.arrayCopyNonAtomic(signed, (short) 0, buffer, (short) 0, (short) 128);
return (short) signed.length;
private void processExternalAuthenticate(APDU apdu) {
short equipmentType = 0;
if (keyStore.Selected_Cert != null) {
equipmentType = (short) keyStore.Selected_Cert.CHA[6]; // check equipment type
if (equipmentType != (short) 1 && equipmentType != (short) 2 && equipmentType != (short) 3 && equipmentType != (short) 4 && equipmentType != (short) 6) {
ISOException.throwIt(ISO7816.SW_FUNC_NOT_SUPPORTED); // Instead of 6F00 throw a more meaningfull SW in case CHA is not valid.
if (Util.arrayCompare(keyStore.Selected_Cert.CHA, (short) 0, TACHOGRAPH_AID, (short) 0, (short) 6) != 0) {
ISOException.throwIt(ISO7816.SW_FUNC_NOT_SUPPORTED);
byte[] buffer = apdu.getBuffer();
byte p1 = (byte) (buffer[OFFSET_P1] & 0xff);
byte p2 = (byte) (buffer[OFFSET_P2] & 0xff);
if (p1 != 0 || p2 != 0) {
ISOException.throwIt(SW_WRONG_P1P2);
short lc = (short) (buffer[OFFSET_LC] & 0xFF);
if (lc != (short) (128)) {
ISOException.throwIt(SW_WRONG_LENGTH);
if (apdu.setIncomingAndReceive() != lc) {
ISOException.throwIt(ISO7816.SW_WRONG_DATA);
Util.arrayCopyNonAtomic(buffer, OFFSET_CDATA, signed, (short) 0, (short) 128); // receive the cryptogram from the VU
// decrypt the encrypted message with the card private key
try {
crypto.rsaCipher.init(keyStore.cardPrivateKey, Cipher.MODE_DECRYPT);
crypto.rsaCipher.doFinal(signed, (short) 0, (short) 128, signed, (short) 0);
} catch (Exception e) {
ISOException.throwIt(SW_REFERENCE_DATA_NOT_FOUND);
// verify the signature with the VU public key
try {
crypto.rsaCipher.init(keyStore.selectedPublicKey, Signature.MODE_VERIFY); // Cipher.MODE_ENCRYPT
crypto.rsaCipher.doFinal(signed, (short) 0, (short) 128, signed, (short) 0);
} catch (Exception e) {
ISOException.throwIt(SW_REFERENCE_DATA_NOT_FOUND);
if (signed[0] != (byte) 0x6A || signed[127] != (byte) 0xBC) {
ISOException.throwIt(Util.makeShort(signed[0], signed[127]));
try {
verifyCardCertificates();
Util.arrayCopyNonAtomic(signed, (short) 1, preDigest, (short) 0, (short) 106); // accumulate preDigest
Util.arrayCopyNonAtomic(Rnd3, (short) 0, preDigest, (short) 106, (short) 8); // accumulate preDigest
Util.arrayCopyNonAtomic(keyStore.Card_Cert.CHR, (short) 0, preDigest, (short) 114, (short) 8); // accumulate preDigest
Util.arrayCopyNonAtomic(signed, (short) 91, K2, (short) 0, (short) 16); // receive K2 value
crypto.shaDigest.update(signed, (short) 1, (short) 106); // PRnd4||K2
crypto.shaDigest.update(Rnd3, (short) 0, (short) 8); // Rnd3
crypto.shaDigest.doFinal(keyStore.Card_Cert.CHR, (short) 0, (short) 8, digest, (short) 0); //||Card.CHR
} catch (Exception e) {
ISOException.throwIt(SW_TAMAM);
if (Util.arrayCompare(signed, (short) 107, digest, (short) 0, (short) 20) != 0) {
ISOException.throwIt(SW_TAMAM);
volatileState[0] |= MUTUAL_AUTHENTICATED;
try {
DTUtil.xor(K1, (short) 0, K2, (short) 0, KaKb, (short) 0, (short) 16);
Util.arrayCopyNonAtomic(Rnd3, (short) 4, SSC, (short) 0, (short) 4); // tail of Rnd3
Util.arrayCopyNonAtomic(Rnd1, (short) 4, SSC, (short) 4, (short) 4); // tail of Rnd1
} catch (Exception e) {
ISOException.throwIt(SW_TAMAM);
try {
keyStore.setKey_Ka(KaKb, (short) 0);
keyStore.setKey_Kb(KaKb, (short) 8);
keyStore.setSecureMessagingKeys(KaKb, (short) 0, KaKb, (short) 0);
} catch (Exception e) {
ISOException.throwIt(SW_TAMAM_DEGIL);
return;
private short returnPreDigest(APDU apdu) {
byte[] buffer = apdu.getBuffer();
apdu.setOutgoing();
Util.arrayCopyNonAtomic(preDigest, (short) 0, buffer, (short) 0, (short) 122);
return (short)preDigest.length;
private short returnDigest(APDU apdu) {
byte[] buffer = apdu.getBuffer();
apdu.setOutgoing();
Util.arrayCopyNonAtomic(digest, (short) 0, buffer, (short) 0, (short) 20);
return (short)digest.length;
private short returnOriginalText(APDU apdu) {
byte[] buffer = apdu.getBuffer();
apdu.setOutgoing();
Util.arrayCopyNonAtomic(signed, (short) 0, buffer, (short) 0, (short) 128);
return (short)signed.length;
private void processVerify(APDU apdu) { // Verify_CHV(Pin_Ws)
byte[] buffer = apdu.getBuffer();
// retrieve the PIN data for validation.
byte byteRead = (byte) (apdu.setIncomingAndReceive());
// the PIN data is read into the APDU buffer
// at the offset ISO7816.OFFSET_CDATA the PIN data length = byteRead
if (pin.check(buffer, ISO7816.OFFSET_CDATA, byteRead) == false) {
ISOException.throwIt(SW_VERIFICATION_FAILED);
return;
private void processPSO(APDU apdu) { // verify certificate
byte[] buffer = apdu.getBuffer();
byte p1 = (byte) (buffer[OFFSET_P1] & 0xff);
byte p2 = (byte) (buffer[OFFSET_P2] & 0xff);
short lc = (short) (buffer[ISO7816.OFFSET_LC] & 0xFF);
if (p1 == (byte) 0x00 && p2 == P2_VERIFYCERT) {
if (lc != TACHO_CERT_LENGTH) {
ISOException.throwIt(SW_WRONG_LENGTH);
if (apdu.setIncomingAndReceive() != lc) {
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
try { // copy the certificate to be verified from APDU buffer to cert object
Util.arrayCopyNonAtomic(buffer, OFFSET_CDATA, cert, (short) 0, lc);
} catch (Exception e) {
ISOException.throwIt(SW_TAMAM);
if (Util.arrayCompare(keyStore.selected_KID, (short) 0, keyStore.ERCA_KID, (short) 0, KID_LENGTH) == 0) {
keyStore.VUCA_Cert.verifyCert(cert, keyStore.selectedPublicKey, keyStore.selected_KID);
} else if (Util.arrayCompare(keyStore.selected_KID, (short) 0, keyStore.VUCA_Cert.CHR, (short) 0, KID_LENGTH) == 0) {
keyStore.VU_Cert.verifyCert(cert, keyStore.selectedPublicKey, keyStore.selected_KID);
} else {
ISOException.throwIt(SW_CERT_VERIFICATION_FAILED); // Selected keyId, with MSE, is neither ERCA_KID nor VUCA_KID
} else {
ISOException.throwIt(SW_CERT_VERIFICATION_FAILED);
return;
private short processGetChallenge(APDU apdu, boolean protectedApdu) {
byte[] buffer = apdu.getBuffer();
byte p1 = (byte) (buffer[OFFSET_P1] & 0xff);
byte p2 = (byte) (buffer[OFFSET_P2] & 0xff);
if (p1 != 0 || p2 != 0) {
ISOException.throwIt(SW_WRONG_P1P2);
random.generateData(Rnd3, (short) 0, (short) 8);
short Le = apdu.setOutgoing();
if (Le != (short) 8) {
ISOException.throwIt(SW_WRONG_LENGTH);
Util.arrayCopyNonAtomic(Rnd3, (short) 0, buffer, (short) 0, (short) 8);
return Le;
private void processMSE(APDU apdu) {
byte[] buffer = apdu.getBuffer();
if (buffer[OFFSET_P1] == (byte) 0xC1 && buffer[OFFSET_P2] == P2_DST) {
short lc = (short) (buffer[OFFSET_LC] & 0xFF);
if (lc != (short) (KID_LENGTH + 2)) {
ISOException.throwIt(SW_WRONG_LENGTH);
if (apdu.setIncomingAndReceive() != lc) {
ISOException.throwIt(ISO7816.SW_WRONG_DATA);
if (buffer[OFFSET_CDATA] != (byte) 0x83) {//check the tag of the data
ISOException.throwIt(SW_SECURE_MESSAGING_DATA_OBJECTS_MISSING);
} else if (buffer[OFFSET_CDATA + 1] != (byte) 0x08) {
ISOException.throwIt(SW_INCORRECT_DATA_OBJECT); // check if the key is already selected one
} else if (Util.arrayCompare(buffer, (short) (OFFSET_CDATA + 2), keyStore.selected_KID, (short) 0, KID_LENGTH) != 0) {
if (Util.arrayCompare(buffer, (short) (OFFSET_CDATA + 2), keyStore.ERCA_KID, (short) 0, KID_LENGTH) == 0) {// KID is EUR_KID
keyStore.selected_KID = keyStore.ERCA_KID;
keyStore.selectedPublicKey = keyStore.eurPublicKey;
keyStore.Selected_Cert = null; // ERCA public key is selected
return;
} else if (Util.arrayCompare(buffer, (short) (OFFSET_CDATA + 2), keyStore.VUCA_Cert.CHR, (short) 0, KID_LENGTH) == 0) {// KID is MSCA_KID
keyStore.Selected_Cert = keyStore.VUCA_Cert;
} else if (Util.arrayCompare(buffer, (short) (OFFSET_CDATA + 2), keyStore.VU_Cert.CHR, (short) 0, KID_LENGTH) == 0) { // KID is VU_KID
keyStore.Selected_Cert = keyStore.VU_Cert;
} else {
ISOException.throwIt(SW_REFERENCE_DATA_NOT_FOUND);
}// KID not found
keyStore.selectedPublicKey = keyStore.Selected_Cert.publicKey;
keyStore.selected_KID = keyStore.Selected_Cert.CHR;
} else { // if the KID is already set, just return
return;
} else {
ISOException.throwIt(ISO7816.SW_WRONG_P1P2);
private void processSelectFile(APDU apdu) {
byte[] buffer = apdu.getBuffer();
short lc = (short) (buffer[OFFSET_LC] & 0x00FF);
// retrieve p1p2 from apdu buffer
byte p1 = buffer[OFFSET_P1];
byte p2 = buffer[OFFSET_P2];
short p1p2 = Util.makeShort(p1, p2);
apdu.setIncomingAndReceive();
if (p1 == 4) {
if (lc == (short) TACHO_AID_LENGTH) {
if (Util.arrayCompare(buffer, (short) OFFSET_CDATA, TACHOGRAPH_AID, (short) 0, (short) TACHO_AID_LENGTH) == 0) {
selectedFile = fileSystem.getDT();
fileSystem.selectDT();
volatileState[0] |= FILE_SELECTED;
return;
} else {
ISOException.throwIt(ISO7816.SW_WRONG_DATA);
} else if (lc != 2) {
ISOException.throwIt(SW_WRONG_LENGTH);
short fid = Util.getShort(buffer, OFFSET_CDATA);
if (fileSystem.getFile(fid) != null) {
selectedFile = fileSystem.getDT();
fileSystem.selectDT();
volatileState[0] |= FILE_SELECTED;
return;
} else if (p1 == 2) {
if (lc != 2) {
ISOException.throwIt(SW_WRONG_LENGTH);
short fid = Util.getShort(buffer, OFFSET_CDATA);
if (fileSystem.getFile(fid) != null) {
selectedFile = fileSystem.getFile(fid);
volatileState[0] |= FILE_SELECTED;
return;
} else {
ISOException.throwIt(ISO7816.SW_WRONG_P1P2);
setNoFileSelected();
ISOException.throwIt(ISO7816.SW_FILE_NOT_FOUND);
public static void setNoFileSelected() {
if (hasFileSelected()) {
volatileState[0] ^= FILE_SELECTED;
public static boolean hasFileSelected() {
return (volatileState[0] & FILE_SELECTED) == FILE_SELECTED;
public static boolean hasMutuallyAuthenticated() {
return (volatileState[0] & MUTUAL_AUTHENTICATED) == MUTUAL_AUTHENTICATED;
static boolean isLocked() {
return (persistentState & LOCKED) == LOCKED;
public boolean isSelectedFileEncrypted() {
return ((selectedFile.getAccessConditions() & DigitalTachograph.ENCRYPTED) == DigitalTachograph.ENCRYPTED);
} -
Hello.
Is there any way to find jct.dll, jcpcsc.dll (those are in the jcop plug-in os/ directory) analogues for 64-bit platform?
As i know, jcop tools provides only dll's and so libraries for 32-bit platforms to communicate with the card? Are there any 64-bit compatible?
I want to use Offcard API from JCOP tools on 64-bit platform (it uses mentioned above dlls or shared objects on Linux).
Best regards,
eveline-zeveline-z wrote:
Thanks for your reply.
So, Eclipse IDE with JCOP plug-in work fine on 64-bit platform without any emulation?Yes
I mean, you had no problems with connecting to a real card through the JCShell or even using JCOP Offcard API (because those are using native dll's for 32-bit platform which reside in com.ibm.bluez.jcop.eclipse_3.1.2\os\win32\x86\ directory)?I tested only on the simulator
The "com.ibm.bluez.jcop.eclipse_3.1.2\os\win32\x86\" directory is in the folder plugins in your eclipse path.
example : c:\eclipse\plugins\com.ibm.bluez.jcop.eclipse_3.1.2\os\win32\x86\
>
>
Thanks.
Best regards,
eveline-zMaDmEd -
JCOP Tools don't detect Omnikey Cardman 3121 reader in activation
Hello,
I am trying to activate the JCOP Tools in my MacOS X, but my reader isn't detected by Eclipse / JCOP Tools.
I have installed pcsc lite 1.4.4, and used pcsctest to check if the reader is working, and it seems to be ok:
xxx:~ tuxed$ pcsctest
MUSCLE PC/SC Lite Test Program
Testing SCardEstablishContext : Command successful.
Testing SCardGetStatusChange
Please insert a working reader : Command successful.
Testing SCardListReaders : Command successful.
Reader 01: OMNIKEY CardMan 3x21 0 0
Enter the reader number : 01
Waiting for card insertion
: Command successful.
Testing SCardConnect : Command successful.
Testing SCardStatus : Command successful.
Current Reader Name : OMNIKEY CardMan 3x21 0 0
Current Reader State : 34
Current Reader Protocol : 0
Current Reader ATR Size : b
Current Reader ATR Value : 3B 67 00 00 29 20 00 6F 78 90 00
Testing SCardDisconnect : Command successful.
Testing SCardReleaseContext : Command successful.
PC/SC Test Completed Successfully !Can anyone give me any clue to solve the problem?
Thanks in advance :)I don't know about MacOS, but you can check the info about Linux:
http://forum.java.sun.com/thread.jspa?forumID=23&threadID=5221167
PC/SC Support (Linux)
JCOP Tools only works with pcsc-lite 1.2.0. -
Hi there all:
I'm having a problem with debugging a JApplet. I created a new workspace, project and applet and didn't make any changes to anything. When I try to debug the applet, I get these messages:
System Error: java.security.AccessControlException: access denied (java.lang.RuntimePermission modifyThreadGroup )
System Error: java.lang.Object java.lang.Class.newInstance0()
System Error: java.lang.Object java.lang.Class.newInstance()
System Error: java.applet.Applet sun.applet.AppletPanel.createApplet(sun.applet.AppletClassLoader)
System Error: void sun.applet.AppletPanel.runLoader()
System Error: void sun.applet.AppletPa
System Error: nel.run()
System Error: void java.lang.Thread.run()
If I change the object from a JApplet class to an Applet class, I can debug just fine.
Anyone know what's going on here?
Thanks
JeffMe again. Was doing some searching on the net about this one since I've gotten no response.
Found this at Inprise (Borland) about a debugging problem with JBuilder3 (I assume that the base of jdev is still JBuilder).
http://community.borland.com/article/0,1410,19739,00.html
To quote from their document--------
Question:
I can't seem to debug Applets with JBuilder3 Standard. If I attempt to debug my Applet
I recieve the following error:
java.security.AccessControlException: access denied (java.lang.RuntimePermission
modifyThreadGroup )
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:195)
at java.security.AccessController.checkPermission(AccessController.java:403)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
Why?
Answer:
In a nutshell this is an installation problem with JBuilder3 Standard edition.
The install for JBuilder3 Standard did not provide the file 'DebugApplet.policy'.
To resolve this problem download the file from the following URL:
http://www.borland.com/devsupport/jbuilder/downloads/DebugApplet.policy
After you have downloaded the file, copy the file to your JBuilder3\bin directory.
This will fix the problem.
You can also cut and paste the following:
(NOTE: create the file DebugApplet.policy in your JBuilder3\bin directory)
//DebugApplet.policy
// These policy permissions are needed for the AppletViewer used by sun.tools.debug.
grant {
permission java.lang.RuntimePermission "accessClassInPackage.*";
permission java.lang.RuntimePermission "modifyThread";
permission java.lang.RuntimePermission "modifyThreadGroup";
permission java.net.SocketPermission "*", "accept, connect, listen, resolve";
permission java.util.PropertyPermission "appletviewer.version", "read";
permission java.io.FilePermission "<>", "read";
permission java.security.AllPermission;
Could this be a problem in JDev3 too?
Jeff
null -
Unknown Error with JCop Tools 3.1.2
Hello All ,
I am using Eclipse program to create a javacard applet...
But there is a unknown Problem appears to me ..I don't know how to solve it.
First of All ,
My OS is Windows 7 x64 bit
My java version is : 1.6
My Eclipse version is : 3.2
My Smart Card Reader is : Omnikey ,CardMan 5321
So First of All , i added the plugin "JCOP tools 3.1.2" to the Eclipse program , and i activated the tools successfully.
and i created a new javacard project by using Basic Javacard template
Now when i want to Run ,
SO i when i set the Run options to Card Reader , and set the card reader to "OmniKey"
like this image:
[Image 1|http://img85.imageshack.us/img85/1158/runx.jpg]
-By the way , i don't understand where "Philps Pegoda Reader" came from?? -
Then when i press Run , the Eclipse program will be closed and this error appears:
[Error Image|http://img135.imageshack.us/img135/2926/errorevs.jpg]
I am not sure what is the problem ... so please some one help me here...
Thank you for your time
Edited by: ahmed30 on May 25, 2010 8:44 AMHi,
The pegoda reader is the default reader that has hard coded support (like JCOP engineering sample cards). I would say this is because NXP was founded by Phillips.
I cannot help you with the second issue. I have only used JCOP 3.1.2 for a short time (quite a while ago now) and reverted to 3.1.1.b as 3.1.2 did not add any new features and from memory did not work properly on my WIndows XP machine (32-bit). I can confirm that 3.1.1 works on XP 64-bit under a 32-bit JVM.
Is the issue when running against a card or the simulator or both?
You could try running the jcop.exe executable in the plugins\com.ibm.bluez.jcop.eclipse_<version>\simuls\nJCOP\win32\x86 directory from a command prompt to see if it is an issue with Eclipse/Java or the JCOP simulator.
Cheers,
Shane
Maybe you are looking for
-
How do I get my MacBook Pro to recognize my Toshiba external hard drive?
How do I get my MacBook Pro to recognize my Toshiba external hard drive? I'm working on transferring my music from our home computer to my new laptop and I already got all my music onto the hard drive but now, when I plug it into my MacBook Pro, it d
-
Recording from an external mixer in GB (line in)
Dear everyone, Now I have succesfully managed to record into GB from my external mixer. But the problem is that it stops recording when it has recorded about 999 seconds, or something like that. Is it possible to anything about that? Any kind of help
-
EXPERTS:- We have the only total Customer Outstainding Blances Amounts,, Vendor Outstanding balnces How to show, the reports, where wil go if the path plz give that or othe wise T-Codes plz provid that one.
-
Color space from lightroom to flickr
Can anyone help me with this question....having developed raw images in lightroom, I then may publish some of them on my flickr account. When these images are exported directly from Lightroom to Flickr, are they automatically exported in sRGB?....es
-
Hi all I am thinking of copying all of my CD's to a hard drive so that I have lossless copies if the CD colleection itself was lost or stolen. I would like to ask what the best lossless format, that is not application specific, would be? I am thinkin