在设置Public Key的参数W时,总是报错。提示长度错误。
W由公钥的Qx和Qy两部分依次组成。与设置Private Key的S参数不同的是,在setW时,需要在Qx前再添加1字节标记位,表明Q是否被压缩。通常使用0x04,代表未被压缩。因此,W的长度应为1+Qx Length+Qy Length。
此问题javacardAPI中,并未有详细描述,此处记录一下。
示例代码如下:
private ECKey initECKey(ECKey ecKey, byte[] ecParams) {
ecKey.setFieldFP(ecParams, (short) (0), (short) (32));
ecKey.setA(ecParams, (short) (32), (short) (32));
ecKey.setB(ecParams, (short) (64), (short) (32));
ecKey.setG(ecParams, (short) (96), (short) (65));
ecKey.setR(ecParams, (short) (161), (short) (32));
ecKey.setK(Util.getShort(ecParams, (short) (193)));
return ecKey;
}
public ECPublicKey genECPubKey(byte[] buffer, short offset){
ECPublicKey ePubKey=null;
ePubKey=(ECPublicKey) (KeyBuilder.buildKey(
KeyBuilder.TYPE_EC_FP_PUBLIC, ECC_KEY_LEN, false));
ePubKey.setW(buffer, offset, (short)((ECC_KEY_LEN/4)+1)); //W Length
ePubKey=(ECPublicKey)initECKey(ePubKey,EC_PARAMS_SECP256R1);
return ePubKey;
}
public ECPrivateKey genECPriKey(byte[] buffer, short offset){
ECPrivateKey ePriKey=null;
ePriKey=(ECPrivateKey) (KeyBuilder.buildKey(
KeyBuilder.TYPE_EC_FP_PRIVATE, ECC_KEY_LEN, false));
ePriKey.setS(buffer, offset,(short)(AlgoCore.ECC_KEY_LEN/8));
ePriKey=(ECPrivateKey)initECKey(ePriKey,EC_PARAMS_SECP256R1);
return ePriKey;
}