Howto generata a openplatform.exp within JCOP Tools?

Hi Guys,
I am trying to compile and load the coolkey applet (http://directory.fedoraproject.org/wiki/BuildCoolKeyApplet) into a Cyberflex 64k card.
The cap files need to be transformed with a byte code verifier before the card can load them.
The byte code verfifier needs all .exp files from all incuded libraries. Thus I need the openplatform.exp file.
I tried the one from http://www.globalplatform.org/specifications/archived/card-tech-201.zip but i am ending up with an error on install_for_install.
I think maybee the JCOP tools have a slightly different version and I would like to have an openplatform.ext out of my build environment which is used for the applet.
Can anybody tell me how I can generate such an exp file from the global platorm stuff included in the JCOP tools?
Regards,
Fabian

Hi,
I am using the one from http://www.trusted-logic.com/down.php
If I call without arguments it looks like this:
java -jar captransf.jar  -s -noint  coolkey.cap
Cannot find export file for imported package a0:0:0:0:62:0:1
Please provide the correct export file on the command lineTo get the muscle applet working (which does not use openplatform) I've used this line with success:
java -jar captransf.jar -s -noint "api21\javacard\framework\javacard\framework.exp" "api21\javacard\security\javacard\security.exp"  "api21\java\lang\javacard\lang.exp"  "api21\javacardx\crypto\javacard\crypto.exp" musclecard.exp  musclecard.cap???

Similar Messages

  • Getting started with JCOP Tools

    I have a working Eclipse + JCOP Tools installation, activated. I now also have a Cardman reader (drivers loaded) and some blank JCOP30 cards. I read through the Eclipse embedded JCOP help page, but couldn't find the answers to some simple questions:
    1. How can I see a list of connected readers to ensure my reader hardware is recognized? I read earlier on the forums about a "Launch Configuration page". How do I access this page?
    2. The JCOP Shell seems to be working... my cards are blank and /terminal does show "Slot empty" or "Card present" so I presume the interface is running fine. My cards are totally blank. Can I still read any useful info from them such as vendor strings, version#, etc?
    3. Do the JCOP Tools 3.1.2 come with a sample project? Since I've never used this environment, I would love to see an example of working code that can be simulated or loaded onto a physical card. It would help me "learn by example"
    If there is sample code, where can I find it? I tried to use Eclipse's import from archive but didn't find anything resembling samples within jcop tools. Any example you know of would be great.

    Here is the ATR and cplc output for my card. So far I know with certainty it's JCOP30-something and it supports T=CL.
    But I'm not even sure which Java Card and Global Platform it supports! The "JCOP version map" from the 2003 specs document says JC 2.1.1 and GP 2.0.1, but http://www-306.ibm.com/software/wireless/wecos/jcop30.html says these cards are JC 2.2.1 and GP 2.1.1. Yikes! Which do I have?
    cm>  /atr
    resetCard with timeout: 0 (ms)
    --Waiting for card...
    ATR=3B 86 80 01 4A 43 4F 50 33 30 12                   ;...JCOP30.
    ATR: T=0, T=1, Hist="JCOP30"
    cm>  get-cplc
    => 80 CA 9F 7F 00                                     .....
    (11274 usec)
    <= 9F 7F 2A 40 70 95 16 40 51 30 84 30 1A 61 12 00    ..*@[email protected]..
        69 00 90 95 59 40 70 61 19 00 00 00 00 06 31 13    [email protected].
        30 36 39 30 30 00 00 00 00 00 00 00 00 90 00       06900..........
    Status: No Error
      IC Fabricator                      : 4070
      IC Type                            : 9516
      Operating System ID                : 4051
      Operating System release date      : 3084 (25.3.2003)
      Operating System release level     : 301A
      IC Fabrication Date                : 6112 (22.4.2006)
      IC Serial Number                   : 00690090
      IC Batch Identifier                : 9559
      IC Module Fabricator               : 4070
      IC Module Packaging Date           : 6119 (29.4.2006)
      ICC Manufacturer                   : 0000
      IC Embedding Date                  : 0000
      IC Pre-Personalizer                : 0631
      IC Pre-Perso. Equipment Date       : 1330 (26.11.2001)
      IC Pre-Perso. Equipment ID         : 36393030
      IC Personalizer                    : 0000
      IC Personalization Date            : 0000
      IC Perso. Equipment ID             : 00000000

  • JCOP tools ANT script generation

    Hello,
    does JCOP tools plug-in within Eclipse IDE provide facilities for automatic Ant .xml script generation for building the project (i.e. compilation and convertion) like it provides for javadoc generation?
    I can write compilation .xml script for Ant on my own. But what about the convertion to CAP files?
    Best regards,
    Eve

    I do not know of any possibility/task/facility that generates you an ant script. Ant itself is a way to automatize tasks. So I am afraid you need to dive into ant. It's worth it.

  • JCOP tools without GUI

    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

  • JCOP tools??

    hi,
    i�m trying to develop with the JCOP tools but i would like to have more information about APIs (java) and the diferences between packages included in the CD (JCOP 30,10,21id,21sim...).I�ve used the documentation in the CD,JCOP xx technical briefs, but i still have some questions about it.
    My application is a simulation relying on cryptographic services,public key, digital signature and security certificates.Wich JCOP can i use in my implementation?
    Where can i find the visa openplatform api to use it?
    thank a lot,
    waiting for your response,Javier.

    I find it hard to believe you read the JCOPOverview.pdf that came with the kit and you don't know which cards to use. J-10 only has DES, j-20/30 contain DES and RSA. How can you not see that ?
    Go to GlobalPlatform.org and download the older version, 2.0.1. You can also download the 2.1 version to see the visa op APIs but they are deprecated.

  • 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 tool (jcshell ) vs gpshell *mutual_authentication() returns 0x80302000

    I think that jcop tool and gpshell are two technique to upload applet inside the card , M i right? or these both are any real big difference????????
    In Jcop i used following command to upload a cap file inside the java card
    cm>  /terminal "PCSC|SCM Microsystems Inc. SCL010 Contactless Reader 0"
    --Opening terminal
    <div class="jive-quote"> /card -a a000000003000000 -c com.ibm.jc.CardManager</div>
    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
    Status: No Error
    cm>  delete a0010203040506070809
                                               j.
    cm>  delete a00102030405060708
                                              j.
    cm>  upload "C:\Documents and Settings\amit pathak\workspace\jcop\bin\jcop\javacard\jcop.cap"
    cm>  install -i a0010203040506070809 -q C9#() a00102030405060708 a0010203040506070809
    Status: No Error
    cm>  card-info
    => 80 F2 80 00 02 4F 00 00                            .....O..
    (8301 usec)
    <= 08 A0 00 00 00 03 00 00 00 01 9E 90 00             .............
    Status: No Error
    => 80 F2 40 00 02 4F 00 00                            [email protected]..
    (279151 usec)
    <= 07 A0 00 00 02 47 10 01 07 00 0A A0 01 02 03 04    .....G..........
        05 06 07 08 09 07 00 90 00                         .........
    Status: No Error
    => 80 F2 10 00 02 4F 00 00                            .....O..
    (24089 usec)
    <= 07 A0 00 00 00 03 53 50 01 00 01 08 A0 00 00 00    ......SP........
        03 53 50 41 08 44 65 6D 6F 49 4C 4A 41 01 00 01    .SPA.DemoILJA...
        07 A0 00 00 02 47 10 01 09 A0 01 02 03 04 05 06    .....G..........
        07 08 01 00 01 0A A0 01 02 03 04 05 06 07 08 09    ................
        90 00                                              ..
    Status: No Error
    Card Manager AID   :  A000000003000000
    Card Manager state :  OP_READY
        Application:  SELECTABLE (--------) A0000002471001 
        Application:  SELECTABLE (--------) A0010203040506070809
        Load File  :      LOADED (--------) A0000000035350   (Security Domain)
         Module    :                        A000000003535041
        Load File  :      LOADED (--------) "DemoILJA"     
         Module    :                        A0000002471001
        Load File  :      LOADED (--------) A00102030405060708
         Module    :                        A0010203040506070809
    cm>  \select a0010203040506070809
    jcshell: Backslash only in quotes allowed
    cm>  /select a0010203040506070809
    => 00 A4 04 00 0A A0 01 02 03 04 05 06 07 08 09 00    ................
    (5891 usec)
    <= 90 00                                              ..
    Status: No Error
    cm>  /send 8002000003
    => 80 02 00 00 03                                     .....
    (6023 usec)
    <= 01 02 03 90 00                                     .....
    Status: No Error
    basically jcop tool automatically write these commands on the shell when uploading cap file in the card...
    when i try gpshell to upload cap file i got this error like:-
    D:\amit pathak\all in one (java)\GPShell-1.4.4\GPShell-1.4.4>GPShell.exe list.tx
    t
    mode_201
    enable_trace
    establish_context
    card_connect
    select -AID a0000000030000
    Command --> 00A4040007A0000000030000
    Wrapped command --> 00A4040007A0000000030000
    Response <-- 6F198408A000000003000000A50D9F6E064051420422009F6501FF9000
    open_sc -security 1 -keyind 0 -keyver 0 -mac_key 404142434445464748494a4b4c4d4e4
    f -enc_key 404142434445464748494a4b4c4d4e4f // Open secure channel
    Command --> 805000000894918FD9BC6C5F8700
    Wrapped command --> 805000000894918FD9BC6C5F8700
    Response <-- 00004330001341906809FF02005D6C4BE624901F1DB57E450CE1976E9000
    *mutual_authentication() returns 0x80302000 (The verification of the card cryptog*
    ram failed.)why it is happening ? i am able to use the commands of jcop and gpshell , but i dont know about command meaning !!! could anybody give me some links where i can learn more about jcop and gpshell, about why it used, about it associated commands and their meaning..
    Edited by: rohit pathak on May 8, 2012 9:13 PM

    D:\amit pathak\all in one (java)\GPShell-1.4.4\GPShell-1.4.4>GPShell.exe list.tx
    t
    mode_201
    enable_trace
    establish_context
    card_connect
    select -AID a0000000030000
    Command --> 00A4040007A0000000030000
    Wrapped command --> 00A4040007A0000000030000
    Response <-- 6F198408A000000003000000A50D9F6E064051420422009F6501FF9000
    open_sc -security 1 -keyind 0 -keyver 0 -mac_key 404142434445464748494a4b4c4d4e4
    f -enc_key 404142434445464748494a4b4c4d4e4f // Open secure channel
    Command --> 805000000894918FD9BC6C5F8700
    Wrapped command --> 805000000894918FD9BC6C5F8700
    Response <-- 00004330001341906809FF02005D6C4BE624901F1DB57E450CE1976E9000
    *mutual_authentication() returns 0x80302000 (The verification of the card cryptog*
    ram failed.)why it is happening ? You may have the wrong GP version (mode_201 sets the operation to OpenPlatform 2.0.1). You could try mode_211.
    i am able to use the commands of jcop and gpshell , but i dont know about command meaning !!! could anybody give me some links where i can learn more about jcop and gpshell, about why it used, about it associated commands and their meaning..The GP card spec describes all of the card management commands. You may also need to read some of the JCVM spec for Java Card to understand the format of the load command as well.
    Shane

  • Instructions for Downloading and Activating the JCOP Tools

    In response to my question:
    I refer to JCOP Tools available on Eclipse.
    If the plug-in free for download?
    If it is not, kindly provide a proper hyperlink from which those interested can place their order.Listed below is the reply from IBM. Can anyone who has successfully obtained the activation code this way confirm whether you need to foot the postage?
    Cheers!!!!
    There is no charge for the JCOP Tools. The tools are provided as-is with no warranty or support. Instructions for downloading and activating the tools follow.
    Please note that because our Java Card operating system is now available for more than one silicon vendor, IBM will no longer act as a distributor for sample cards. If you require a sample card, you must now approach the silicon vendors directly . Our current silicon partners are Philips Semiconductor, Samsung and Sharp. In addition you may be able to obtain JCOP sample cards from suppliers on this list http://www.zurich.ibm.com/jcop/order/cards.html
    JCOP Tools are subject to US Government Export Controls, and therefore each install has to be activated individually to ensure compliance. Please follow the instructions below for each copy of the tools that need to be activated.
    Prerequisites:
       1. If you do not already have a Java Runtime Environment (JRE) installed, download and install a JRE or JDK. You can do so from this website (http://java.sun.com/j2se/1.4.2/download.html). Please note that we recommend the use of JRE version 1.4.2.
       2. If you do not already have the open source software development environment Eclipse installed, download and install Eclipse (http://www.eclipse.org/), You can do so from this website(http://www.eclipse.org/downloads/index.php). JCOP Tools require Eclipse 3.1
    To download the tools and start install:
       1. Download the current Update Site image from here (http://www.zurich.ibm.com/jcop/download/eclipse/image/tools.zip)
       2. Unzip the downloaded file to a location of your choice
       3. Start the Eclipse IDE
       4. From the menu bar click on Help > Software Updates > Find and Install
       5. In the Install/Update Dialog select Search for new features to install
       6. Click Next
       7. Click on New Archived Site . . . and browse to the location chosen in step 2
       8. Select the file tools.zip
       9. Click Open then OK then Finish
      10. Eclipse Update Manager will start to install the plug-in, continue with the install as needed.
    For an activation code please send me ([email protected]) the following information:
       1. Your full postal address  - the serial number will be sent via International Courier for US Export control reasons.
       2. Your contact telephone number
       3. The serial number of your JCOP tools install
       4. Your planned usage/reason for needing the JCOP tools
       5. If a student, a copy (fax or digital photo) of your student ID
    For the serial number (item 3 above):
       1. Ensure you have downloaded and installed the JCOP Tools
       2. Start the Eclipse IDE
       3. From the menu bar click on File > New > Project
       4. In the New Project Dialog expand the Java Card folder
       5. Select Java Card Project
       6. Click Next
       7. You should now see the JCOP Licensing Wizard
       8. Click Next
       9. Select Verify an Activation Code
      10. Click Next
      11. The Serial Number should appear on the next page, above the Activation Code entry fields.
      12. Once you have that number click on Cancel then Abort (Note: the Java Card project choice will be disabled until the next time you restart Eclipse)

    For those who are interested to use the JCOP simulator for a start, I have checked that the plug-in and feature files (in tools.zip) for Eclipse are still available at IBM site, please download and install yourself.
    I still keep a copy of user guide for JCOP tools (version 3.1.1a) and the contents are still relevant to Version 3.1.1b simulator in tools.zip.
    If you are interested to have a copy of such document, kindly drop me an email to [email protected]

  • 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);
    }

  • JCOP tools on 64-bit platform

    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-z

    eveline-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 activation!

    Since JCOP tools was moved to NXP by IBM, I can't get activation code from NXP. It is said that JCOP sample card can be used to activate JCOP tools.
    Can all of JCOP family cards(10,20,30 or else) be useful for JCOP activation?
    How is the activation process ?
    Where can I buy JCOP sample card?
    By the way,I have a contacless card reader from Gemplus and Gemcombi XR4 card.
    Thanks!

    Bobby_SH wrote:
    Since JCOP tools was moved to NXP by IBM, I can't get activation code from NXP. It is said that JCOP sample card can be used to activate JCOP tools. Yes.
    Can all of JCOP family cards(10,20,30 or else) be useful for JCOP activation? Check out the nice post from sonnyyu at http://forum.java.sun.com/thread.jspa?threadID=5180928 .
    How is the activation process ? As soon as you want to create a Java Card project you have the choice to unlock the tools with a JCOP engineering sample.
    Where can I buy JCOP sample card?
    http://www.usasmartcard.com/ for example
    By the way,I have a contacless card reader from Gemplus and Gemcombi XR4 card. Should work as long they are PCSC compliant.
    >
    Thanks!

  • 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.

  • FYI: IBM has quit the JCOP Tools!

    Hi,
    I just checked the JCOP-Tools news site for new versions and found the following notice:
    The JCOP project comes to a close in our lab.The whole team working on JCOP in Zurich says goodbye and thanks all the users of our tools and on-card software.
    Please note that no orders for JCOP cards and activation codes can be placed on this website after January 31, 2006.
    See it yourself: http://www.zurich.ibm.com/jcop/news/news.html
    My suggestion for all developer who are using the JCOP-tools:
    Make yourself a backup of the JCOP plugin so you will be able to install it even if the online installation repository isn't available anymore.
    At least download the current plugin-file:
    http://www.zurich.ibm.com/jcop/download/eclipse/plugins/com.ibm.bluez.jcop.eclipse_3.1.1.b.jar
    Additionally you can download the site and feature file, too:
    http://www.zurich.ibm.com/jcop/download/eclipse/site.xml
    http://www.zurich.ibm.com/jcop/download/eclipse/features/com.ibm.bluez.jcop.eclipse_3.1.1.b.jar
    This allows you do perform an offline installation of the JCOP tools in case you have to clean up your eclipse.
    For installation you can extract this jar into a new subdirectory (named "com.ibm.bluez.jcop.eclipse_3.1.1.b") of the eclipse "plugin" directory.
    BTW: They are explicitly referring to this forum for "questions and answers for using JCOP".
    Perhaps that means some of the formerly JCOP members will participate in this forum? - We will see...
    Jan

    Can anybody provide details of how JCOP tools can now
    be aquired?Obvious answer: contact IBM. There is a link on the old Zurich pages. I know that they still work on JCOP, but I presume they have changed the conditions on acquiring the JCOP tools, since they have matured and have left Zurich. IBM is used to doing this; see Aphaworks. If their products get to a certain stage, they become (part of) a commercial product. I don't think they still provide sample cards etc. Read their page to be sure.

  • Generate image assets from within Smart Object

    Hi,
    When designing for phones I create a large canvas with all screens spread out accross it. Every screen is a Smart Object. To me this has many advantages.
    When editing a screen I open the Smart Object. Now I turn on Generate Image Assets. I notice that no resource folder is created.
    Seems like Generating Image Assets from within a smart object is not possible.
    Is that correct? If so, why isn't the menu option greyed out?
    UPDATE: I found that you can use Generate Image Assets from within a Smart Object. But NOT if the Smart Object is part of a PSD. In other words, only if the Smart Object (psb) is a seperate file.
    I wonder why.
    Cheers,
    H

    Old thread, but I had the exact same problem.  It turns out (on Windows at least), that you can find the generated assets folder for a smart object, but you have to know where to look.
    With the smart object "opened" in Photoshop, click "Save as". This shows the location of the current smart object being edited. For me, it was: C:\Users\Jeff\AppData\Local\Temp\Layer112112121.psb
    And lo and behold, right next to the layer temp file was the image asset output folder with my generated assets in it:
    C:\Users\Jeff\AppData\Local\Temp\Layer112112121 - assets
    You can right-click and "Open in a new window" to get a file explorer window in that folder (see image below).
    (Possibly important note: Close or cancel the Save As dialog, we don't actually want to save the layer to a different location.)
    This location makes sense, but it does seem to be a poor user experience design. Presumably temp files should output their asset folders to the desktop, just like unsaved PSD files.

  • Java card cap file install error in jcop tools

    When i try to run java card applet in real java card it gives this error.i used jcop tools and java version 1.5  and eclipse 3.2.when i run the applet in simulater it works fine.i saw some document it says allocate memory for the installation process.i don't know how to do that.
    /term "winscard:4|SCM Microsystems Inc. SCL010 Contactless Reader 0"
    --Opening terminal
    >  /card -a a000000003000000 -c com.ibm.jc.CardManager
    resetCard with timeout: 0 (ms)
    --Waiting for card...
    ATR=3B 8A 80 01 4A 43 4F 50 33 31 56 32 33 32 7A       ;...JCOP31V232z
    ATR: T=0, T=1, Hist="JCOP31V232"
    => 00 A4 04 00 08 A0 00 00 00 03 00 00 00 00          ..............
    (23807 usec)
    <= 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 73 51 2E 00 73 4A 06 07 2A    ...n.G.sQ..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 AC B1 90 01 BF 2D 24 A0 00          .P........-$..
    (49906 usec)
    <= 00 00 91 18 01 39 93 95 05 59 FF 02 00 2C BE 39    .....9...Y...,.9
        5E A5 07 55 87 B8 C3 A8 A6 93 66 2B 90 00          ^..U......f+..
    Status: No Error
    cm>  ext-auth plain
    => 84 82 00 00 10 0C AE 50 3E C8 7E 1D 92 29 E2 59    .......P>.~..).Y
        08 D9 DA 02 16                                     .....
    (57276 usec)
    <= 90 00                                              ..
    Status: No Error
    cm>  delete 060504030201
    => 80 E4 00 00 08 4F 06 06 05 04 03 02 01 00          .....O........
    (40041 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 010203040506
    => 80 E4 00 00 08 4F 06 01 02 03 04 05 06 00          .....O........
    (17392 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 "Cap File location"
    => 80 E6 02 00 13 06 01 02 03 04 05 06 08 A0 00 00    ................
        00 03 00 00 00 00 00 00 00                         .........
    (32303 usec)
    <= 00 90 00                                           ...
    Status: No Error
    => 80 E8 00 00 FA C4 81 F2 01 00 23 DE CA FF ED 02    ..........#.....
        02 04 00 01 06 01 02 03 04 05 06 12 68 6D 73 2F    ............hms/
        6A 61 76 61 63 61 72 64 2F 68 65 6C 6C 6F 02 00    javacard/hello..
        21 00 23 00 21 00 0A 00 0B 00 1E 00 0E 00 3D 00    !.#.!.........=.
        0A 00 0B 00 00 00 4D 01 BE 00 00 00 00 00 00 01    ......M.........
        01 00 04 00 0B 01 02 01 07 A0 00 00 00 62 01 01    .............b..
        03 00 0A 01 06 06 05 04 03 02 01 00 08 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 05 7A 05 30 8F 00 00 3D 8C    =.......z.0...=.
        00 01 18 1D 04 41 18 1D 25 8B 00 02 7A 02 21 18    .....A..%...z.!.
        8B 00 03 60 03 7A 19 8B 00 04 2D 1A 04 25 73 00    ...`.z....-..%s.
        09 00 00 00 00 00 0F 11 6D 00 8D 00 06 7A 08 00    ........m....z..
        0A 00 00 00 00 00 00 00 00 00 00 05 00 1E 00 07    ................
        01 00 02 00 06 00 00 01 03 80 03 02 03 80 03 03    ................
        03 80 0A 01 06 80 03 00 06 80 07 01 09 00 0B 00    ................
        00 00 07 05 06 04 0A 07 07 13 0B 00 4D 01 00 00    ............M...
    (764519 usec)
    <= 6A 80                                              j.
    Status: Wrong data
    jcshell: Error code: 6a80 (Wrong data)
    jcshell: Wrong response APDU: 6A80
    Unexpected error; aborting execution

    Thanks ReNa
    i am using nxp jcop 31 contact-less card.and it will support for java card 2.2.1 and global-platform card specification 2.1.1 .so i am using nxp jcop training 2007 tools and it has java card 2.2.1 and global-platform card specification 2.1.1.Inside my project there are three jar files these are jc221.jar and gp211.jar and bio10.jar
    i will appreciate your help
    Thanks

Maybe you are looking for