Получить CryptoException.ILLEGAL_VALUE при создании пары ключей ECC

Я использовал карту JCOP для создания пары ключей ECC. Я могу создать ECPrivateKey, ECPublicKey, KeyPair без каких-либо проблем, но выдает исключение CryptoException.ILLEGAL_VALUE, когда genKeyPair(). Что не так с моей картой или моей операцией? Я понятия не имею. Не могли бы вы сказать мне, где я допустил ошибку? Очень признателен!

Кстати, я обнаружил, что JCAlgTest столкнулся с той же проблемой, пожалуйста, проверьте отчет о тестировании здесь .

Вот мой код.

public void process(APDU apdu)
 {
   if (selectingApplet())
  {
    return;
  }

byte[] buf = apdu.getBuffer();
switch (buf[ISO7816.OFFSET_INS])
{
case (byte)0x00:
    JCSystem.requestObjectDeletion();
    break;
case (byte)0x01:
    ecPubKey = (ECPublicKey) KeyBuilder.buildKey(KeyBuilder.TYPE_EC_FP_PUBLIC, KeyBuilder.LENGTH_EC_FP_160, false);
    ecPriKey = (ECPrivateKey) KeyBuilder.buildKey(KeyBuilder.TYPE_EC_FP_PRIVATE, KeyBuilder.LENGTH_EC_FP_160, false);
    break;
case (byte) 0x02:
    kp = new KeyPair(ecPubKey, ecPriKey);
    break;
case (byte) 0x03:
    try {
        kp.genKeyPair();
    } catch (CryptoException e) {
        short reason = e.getReason();
        apdu.setOutgoing();
        apdu.setOutgoingLength((short) 2);
        Util.setShort(buf, (short) 0, reason);
        apdu.sendBytes((short) 0, (short) 2);
        ISOException.throwIt((short) 0x6F00);
    }
    break;
default:
    ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}

person Jsine    schedule 14.03.2016    source источник
comment
На основании JC API Spec это означает, что предварительно инициализированный набор параметров Field, A, B, G и R в открытом ключе EC недействителен.. Боюсь, что ваша карта просто не поддерживает алгоритм ALG_EC_FP любой длины. Добавление вашей программы к вопросу может быть полезно для зрителей. Инициализировали ли вы ключи перед вызовом метода genKeyPair() при создании объекта пары ключей (используя метод keypair())?   -  person Ebrahim Ghasemi    schedule 14.03.2016
comment
@ Авраам, я использовал карту JCOP J3D081 242R2. Он поддерживает genKeyPair() с KeyPair.ALG_EC_FP и длиной ключа 160. Код хорошо работает на карте A22CR.   -  person Jsine    schedule 15.03.2016
comment
@Jsine Ваши ключи не инициализированы параметрами домена кривой, это может быть проблемой ...   -  person vojta    schedule 16.03.2016
comment
См. stackoverflow.com /вопросы/24467612/   -  person vojta    schedule 16.03.2016
comment
Спасибо за помощь! Я решил свою проблему!   -  person Jsine    schedule 17.03.2016


Ответы (1)


Вам нужно установить параметры домена ECC, иначе он не знает, какие из них использовать (и немного сложно позволить карте нести все известные именованные кривые, место в большом почете). Вам нужно установить их как минимум для открытого ключа и - в случае карт NXP - вероятно, также и для закрытого ключа.

person Maarten Bodewes    schedule 16.03.2016
comment
Вау, спасибо, Мартен! Я установил параметры домена ECC как для открытого ключа, так и для закрытого ключа. Моя проблема решена! Очень признателен! - person Jsine; 17.03.2016