The exclusive promotional activities on JCOP J3H145 card and Feitian R301 Smartcard Reader are in full swing. Please check this page for details.

APDU Command

JavaCard Applet Development Related Questions and Answers.
keiji
Posts: 3
Joined: Tue Dec 13, 2016 8:45 pm
Points :72
Contact:

APDU Command

Post by keiji » Tue Dec 13, 2016 8:53 pm

I got this code from the internet and I want to play around with it. But I dont know how to send command to APDU?
Your help is greatly appreciated.

Code: Select all

package Eighth;

import javacard.framework.*;
import javacard.security.*;
import javacardx.crypto.*;

public class ECDSA extends Applet
{
    private byte[] plaintext ;
    private ECPrivateKey            objECDSAPriKey=null;    // Object for ECDSA Private Key
    private ECPublicKey             key=null;               // Object for ECDSA Public Key
    private KeyPair                 objECDSAKeyPair=null;   // Object for ECDSA Key Pair
    private Signature               objECDSASign=null;

    final static short  BAS  =  0;

    private final static byte[] fp = new byte[] {
        (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
        (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
        (byte)0xFF, (byte)0xFE, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
        (byte)0xFF, (byte)0xFF, (byte)0xFF };
    private final static byte[] r = new byte[] {
        (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
        (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x99, (byte)0xDE,
        (byte)0xF8, (byte)0x36, (byte)0x14, (byte)0x6B, (byte)0xC9, (byte)0xB1, (byte)0xB4,
        (byte)0xD2, (byte)0x28, (byte)0x31 };
    private final static byte[] a = new byte[] {
        (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
        (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
        (byte)0xFF, (byte)0xFE, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
        (byte)0xFF, (byte)0xFF, (byte)0xFC };
    private final static byte[] b = new byte[] {
        (byte)0x64, (byte)0x21, (byte)0x05, (byte)0x19, (byte)0xE5, (byte)0x9C, (byte)0x80,
        (byte)0xE7, (byte)0x0F, (byte)0xA7, (byte)0xE9, (byte)0xAB, (byte)0x72, (byte)0x24,
        (byte)0x30, (byte)0x49, (byte)0xFE, (byte)0xB8, (byte)0xDE, (byte)0xEC, (byte)0xC1,
        (byte)0x46, (byte)0xB9, (byte)0xB1 };
    private final static byte[] g = new byte[] {
        (byte)0x04, (byte)0x18, (byte)0x8D, (byte)0xA8, (byte)0x0E, (byte)0xB0, (byte)0x30,
        (byte)0x90, (byte)0xF6, (byte)0x7C, (byte)0xBF, (byte)0x20, (byte)0xEB, (byte)0x43,
        (byte)0xA1, (byte)0x88, (byte)0x00, (byte)0xF4, (byte)0xFF, (byte)0x0A, (byte)0xFD,
        (byte)0x82, (byte)0xFF, (byte)0x10, (byte)0x12, (byte)0x07, (byte)0x19, (byte)0x2B,
        (byte)0x95, (byte)0xFF, (byte)0xC8, (byte)0xDA, (byte)0x78, (byte)0x63, (byte)0x10,
        (byte)0x11, (byte)0xED, (byte)0x6B, (byte)0x24, (byte)0xCD, (byte)0xD5, (byte)0x73,
        (byte)0xF9, (byte)0x77, (byte)0xA1, (byte)0x1E, (byte)0x79, (byte)0x48, (byte)0x11 }; //49
     private final static short k = 1;   

    public static void install(byte[] bArray, short bOffset, byte bLength){
    new ECDSA(bArray, bOffset, bLength);
    }

    private ECDSA(byte bArray[], short bOffset, byte bLength){   

    plaintext       = new byte[0x100] ;         

    Util.arrayFillNonAtomic(plaintext,  BAS, (short)0x100, (byte)0);

    register();
    }

    public void process(APDU apdu){
    byte buf[] = apdu.getBuffer();

     switch(buf[1])
    {
        case (byte)0xA4:
            break;

        case (byte)0x46:

        try{

      objECDSAPriKey = (ECPrivateKey)KeyBuilder.buildKey(KeyBuilder.TYPE_EC_FP_PRIVATE, KeyBuilder.LENGTH_EC_FP_192, false);
      //ISOException.throwIt((short)0x8888);       
      key = (ECPublicKey)KeyBuilder.buildKey(KeyBuilder.TYPE_EC_FP_PUBLIC,  KeyBuilder.LENGTH_EC_FP_192, false);

        key.setFieldFP(fp, (short)0, (short)fp.length);
        key.setR(r, (short)0, (short)r.length);
        key.setA(a, (short)0, (short)a.length);
        key.setB(b, (short)0, (short)b.length);
        key.setG(g, (short)0, (short)g.length);
        key.setK(k);

     objECDSAKeyPair = new KeyPair(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_FP_192);
     }

     catch(CryptoException c)
      {   
        short reason = c.getReason();   
        ISOException.throwIt(reason);       
      }

     // On-Card Key Generation Process
      objECDSAKeyPair.genKeyPair();

     // Obtain Key References
      objECDSAPriKey = (ECPrivateKey)objECDSAKeyPair.getPrivate();
      key = (ECPublicKey)objECDSAKeyPair.getPublic(); 

     // Create Signature Object
      objECDSASign = Signature.getInstance(Signature.ALG_ECDSA_SHA, false);

      break;

       case (byte)0x2E:                       
            short   Le = apdu.setOutgoing();   
            short   sSignLen=0 ;

            // Init with Private Key
            objECDSASign.init(objECDSAPriKey, Signature.MODE_SIGN);

            // Sign Data
            sSignLen = objECDSASign.sign(plaintext, BAS, Le, buf, BAS);

            apdu.setOutgoingLength(sSignLen);
            apdu.sendBytes(BAS, sSignLen);

     default:
            ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
    }

    return;
    }
}

User avatar
UNKNwYSHSA
Posts: 630
Joined: Thu May 21, 2015 4:05 am
Points :3035
Contact:

Re: APDU Command

Post by UNKNwYSHSA » Tue Dec 13, 2016 9:49 pm

Send APDU to the Applet?

You can use JCIDE/JCOP development kit for debug;
And if you have one javacard, load applet, send APDUs with APDU tools, like pyApdutool, GPShell ...
sense and simplicity

Post Reply Previous topicNext topic

Who is online

Users browsing this forum: No registered users and 4 guests

JavaCard OS : Disclaimer