我尝试使用ECDSA实现签名代码。 但我总是在安装阶段得到错误SW(6F00)。 我试过多次更改参数。 (例如ALG_EC_FP / ALG_EC_F2M,LENGTH_EC_FP_xxx / LENGTH_EC_F2M_xxx) 你可以在下面的代码中告诉我我的错误吗? (Ver - 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。 有没有办法检查???
提前谢谢。
答案 0 :(得分:2)
请将您的代码修改为
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();
}