In order to thank you for all members' support of our website, we are holding new events - Getting Free Samples by Paying Freight only.
Want to get free samples? Please check this post for more details.

The Communication Sample Code

Applets Development Guide

Moderator: product

User avatar
JavaCardOS
Posts: 260
Joined: Thu Apr 30, 2015 12:00 pm
Points :2279
Contact:

The Communication Sample Code

Post by JavaCardOS » Thu Jun 16, 2016 5:26 am

The following code is the Communication Sample Code in JavaCard API Specification.

You can copy and use it directly or you can download the JCIDE project from the attachment and build it.

Code: Select all


/**
 * @file  Communication.java
 * @brief Communication Sample Code in JavaCard API Specification
 * @comment The purpose of this example is only used to show the usage of API functions and there is no practical significance.
 * @copyright Copyright(C) 2016 JavaCardOS Technologies Co., Ltd. All rights reserved.
 */
package JavaCardOS.Sample.Communication;

import javacard.framework.*;
import javacardx.apdu.ExtendedLength;

public class Communication extends Applet implements ExtendedLength
{
   public static final byte INS_SEND_RECV_APDU_1     = 0x01;
   public static final byte INS_SEND_RECV_APDU_2     = 0x02;
   public static final byte INS_RECV_EXTEND_APDU     = 0x03;
   public static final byte INS_SEND_EXTEND_APDU     = 0x04;
   
   private byte[] tmp_memory;
   public static final short MAX_LENGTH = (short)(0x7FFF);
   
   public static void install(byte[] bArray, short bOffset, byte bLength)
   {
      new Communication().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
   }

   public void process(APDU apdu)
   {
      if (selectingApplet())
      {
         return;
      }
      //Get the apdu buffer datas
      byte[] buf = apdu.getBuffer();
      byte cla= buf[ISO7816.OFFSET_CLA];
      byte ins = buf[ISO7816.OFFSET_INS];
      byte p1 = buf[ISO7816.OFFSET_P1];
      byte p2 = buf[ISO7816.OFFSET_P2];
      short p1p2 = Util.makeShort(p1, p2);
      
      if (cla != (byte)0x80)
      {
         ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
      }
      
      if (p1p2 != 0x00)
      {
         ISOException.throwIt(ISO7816.SW_WRONG_P1P2);
      }
      
      //Calling this method indicates that this APDU has incoming data.
      short recvLen = apdu.setIncomingAndReceive();
      
      //Get the incoming data length(Lc).
      short lc = apdu.getIncomingLength();
         
      if (lc == 0x00)
      {
         ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
      }
      
      switch (ins)
      {
      case (byte)INS_SEND_RECV_APDU_1:
         //Define a byte string
         byte sendStr[] = {'A','P','D','U', ',', 'C','l','a','s','s', ',', 'D','e','m','o'};
         short len = (short) sendStr.length;
         
         //Copy character to APDU Buffer.
         Util.arrayCopyNonAtomic(sendStr, (short)0, buf, (short)0, (short)len);
         
         //Send the 'sendStr' string, the hex of JCRE sending data is the ASCII of sendStr.
         apdu.setOutgoingAndSend((short)0, (short)len);
         break;
         
      case (byte)INS_SEND_RECV_APDU_2:
         //Set the length of received bytes into the 'buf' array,  the offset is 0.
         Util.setShort(buf, (short)0, (short)lc);
         
         //Set the data transfer direction to outbound.
         short le = apdu.setOutgoing();
         
         //Set the expected(le) length of response data.
         apdu.setOutgoingLength((short)le);
         
         //Sends the data of APDU buffer 'buf', the length is 'le' bytes,  the offset is 0.
         apdu.sendBytes((short) 0, (short)le);
         break;
         
      case (byte) INS_RECV_EXTEND_APDU: //
         short pointer = 0;
         tmp_memory = new byte[MAX_LENGTH];
         short offData = apdu.getOffsetCdata();
         // recvieve data and put them in a byte array 'tmp_memory'
         while (recvLen > (short) 0)
         {
            Util.arrayCopy(buf, offData, tmp_memory, pointer, recvLen);
            pointer += recvLen;
            //Gets as many data bytes as will fit without APDU buffer overflow
            recvLen = apdu.receiveBytes(offData);
         }

         // send the lc length
         apdu.setOutgoing();
         apdu.setOutgoingLength((short)2);
         Util.setShort(buf, (short)0, lc);
         apdu.sendBytesLong(buf, (short) 0, (short)2);
         break;
         
      case (byte) INS_SEND_EXTEND_APDU: //
         if(buf[ISO7816.OFFSET_LC] != 0x02)
         {
            ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
         }
         short sendLen = Util.getShort(buf, ISO7816.OFFSET_CDATA);
         // send the specified length data in byte array 'tmp_memory'
         apdu.setOutgoing();
         apdu.setOutgoingLength(sendLen);
         apdu.sendBytesLong(tmp_memory, (short)0, sendLen);
         //request Object Deletion
         tmp_memory = null;
         JCSystem.requestObjectDeletion();
         break;
         
      default:
         ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
      }
   }

}


Note:
The purpose of this example is only used to show the usage of API functions and there is no practical significance.
You do not have the required permissions to view the files attached to this post. Please login first.

dongho1492
Posts: 5
Joined: Thu Jul 19, 2018 2:30 am
Points :72
Contact:

Re: The Communication Sample Code

Post by dongho1492 » Mon Jul 30, 2018 5:09 am

I read your article well. Thank you always.
This source is currently not driven by JCIDE.
Javacardx.apdu. ExtendedLength seems not to be supported. I would be very grateful if you could tell me how to resolve it.

dongho1492
Posts: 5
Joined: Thu Jul 19, 2018 2:30 am
Points :72
Contact:

Re: The Communication Sample Code

Post by dongho1492 » Mon Jul 30, 2018 5:09 am

I read your article well. Thank you always.
This source is currently not driven by JCIDE.
Javacardx.apdu. ExtendedLength seems not to be supported. I would be very grateful if you could tell me how to resolve it..

kuafu
Posts: 89
Joined: Thu Jun 25, 2015 2:09 am
Points :1093
Contact:

Re: The Communication Sample Code

Post by kuafu » Thu Aug 02, 2018 11:37 pm

What's your version of JCIDE.
If you use the newset version of JCIDE, you can try to set atr.
You do not have the required permissions to view the files attached to this post. Please login first.

Post Reply Previous topicNext topic

Who is online

Users browsing this forum: No registered users and 1 guest

JavaCard OS : Disclaimer