Как подписать с помощью ECDSA в Javacard

Я пытаюсь реализовать код подписи с помощью ECDSA. Но я всегда получаю ошибку SW (6F00) на этапе установки. Я пробовал, меняя параметры несколько раз. (например, ALG_EC_FP / ALG_EC_F2M, LENGTH_EC_FP_xxx / LENGTH_EC_F2M_xxx) Не могли бы вы сказать мне мою ошибку в моем коде ниже. (Версия — JCDK 2.2.1, JDK 1.4.2)


package Test;

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

public class Test extends Applet{

private byte[] PLAINTEXT ;
private ECPrivateKey objECDSAPriKey=null;   // Object for ECDSA Private Key
private ECPublicKey objECDSAPubKey=null;    // Object for ECDSA Public Key
private KeyPair objECDSAKeyPair=null;       // Object for ECDSA Key Pair
private Signature objECDSASign=null;        // Object for ECDSA Signature

final static short BAS =  0;

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

private Test(byte bArray[], short bOffset, byte bLength){ 
  PLAINTEXT = new byte[0x100] ; // Data file
  Util.arrayFillNonAtomic(PLAINTEXT,  BAS, (short)0x100, (byte)0);

  // Error position (6F00)
  objECDSAKeyPair= new KeyPair(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_FP_192);          // Error position (6F00)

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

  register();
}

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

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

  case (byte)0x46:
  objECDSAKeyPair.genKeyPair();
  objECDSAPriKey = (ECPrivateKey)objECDSAKeyPair.getPrivate();
  objECDSAPubKey = (ECPublicKey)objECDSAKeyPair.getPublic();
  break;

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

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

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

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

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

  return;
} }

Я получил карту JCOP и ее спецификацию, и я прочитал, что карта поддерживает ECC в спецификации. Но я сомневаюсь, что спецификация является спецификацией карты и карта действительно поддерживает ECC. Есть ли способ это проверить???

Заранее спасибо.


person user2642459    schedule 05.06.2014    source источник
comment
Не могли бы вы уточнить, когда именно вы получаете ошибку? Во время установки апплета через менеджер карт GlobalPlatform? Если да, то во время загрузки пакета или во время установки (сделав доступным для выбора) апплет? Или при отправке одной из ваших пользовательских команд APDU в ваш апплет?   -  person Michael Roland    schedule 06.06.2014
comment
В этой строке этапа установки --------> objECDSAKeyPair= new KeyPair(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_FP_192); И я изменил параметр, но получил ошибку (6F00)   -  person user2642459    schedule 06.06.2014


Ответы (1)


Пожалуйста, измените свой код на

try
  {
     // Error position (6F00)
     objECDSAKeyPair= new KeyPair(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_FP_192); 
  }
  catch(CryptoException c)
  {    
      //this line will give you the reason of problem ![see image][1]
      byte reason = c.getReason();   
  }

*ссылка на изображение: http://i.stack.imgur.com/dFXVd.png

person Anurag Sharma    schedule 06.06.2014
comment
Большое спасибо!! Ты мой герой. Я получил код причины 3 (NO_SUCH_ALGORITHM). Я могу сказать об этом тому, кто дал мне карту. Еще раз спасибо. ^^ - person user2642459; 06.06.2014