После небольшой работы решение было закончено. Всего несколько уточнений до кода
ECPoint
из BouncyCastle не могут быть импортированы «как есть»: есть два оберток требуются. Первый - выполнять задачи высокого уровня, такие как умножение и добавление точек (см. Класс ECOperation). Второй - некоторый чистый класс JavaCard, необходимый для того, чтобы обернуть высокоуровневую конструкцию для использования на низком уровне (см. Класс JCECC).
- Это интегрированное решение не может быть более чем тестовой средой в эмуляторе jcardsim. Чтобы создать резервную копию
ECPoint
для аппаратного устройства, необходимо заменить все импортные jcardsim импортными товарами (например, import com.licel.jcardsim.SESPAKE.JCECC;
, например import com.gemalto.javacard.gostservices.math.ECMathFp;
), и обеспечить, чтобы все API-функции были правильно привязаны в апплете. Файл .exp
необходим для компиляции файла .cap
для соответствующего устройства.
Как это работает:
- Для того, чтобы применить IDE патча должен быть установлен this пути и последний jcardsim исходного кода версия должна быть вытащена из repo.
ECOperations
класс следует добавить в пакет jcardsim. Я использовал crypto
пакет в моих источниках.
JCECC
класс следует добавить в пакет jcardsim. В моих источниках я использовал отдельный пакет samples.SESPAKE
.
- Добавьте тестирование конструкции в апплет просто проверить все операции в порядке:
private JCECC jcecc = new JCECC((short) 32);
, а затем где-то в process()
jcecc.generatePointData();
jcecc.multiplyBasepoint();
byte[] Qpwx = { (byte) 0x9d,(byte) 0x33,(byte) 0x9b,(byte) 0x33,(byte) 0x96,(byte) 0xae,(byte) 0x4a,
(byte) 0x81,(byte) 0x63,(byte) 0x88,(byte) 0xa1,(byte) 0x4c,(byte) 0x79,(byte) 0xab,
(byte) 0x3a,(byte) 0x8d,(byte) 0xd4,(byte) 0x95,(byte) 0xfa,(byte) 0x4c,(byte) 0x53,
(byte) 0xf0,(byte) 0xd4,(byte) 0x07,(byte) 0x65,(byte) 0x79,(byte) 0x02,(byte) 0x2e,
(byte) 0xf2,(byte) 0xaa,(byte) 0xeb,(byte) 0x68 };
byte[] Qpwy = { (byte) 0xda,(byte) 0xd9,(byte) 0x14,(byte) 0x82,(byte) 0xe2,(byte) 0x08,(byte) 0x59,
(byte) 0x0f,(byte) 0xd3,(byte) 0x16,(byte) 0xbf,(byte) 0x95,(byte) 0x94,(byte) 0x80,
(byte) 0xf5, (byte)0xec,(byte) 0x2c,(byte) 0x17,(byte) 0x46,(byte) 0x3e,(byte) 0xc8,
(byte) 0xfc,(byte) 0x8f,(byte) 0x63,(byte) 0x03,(byte) 0x06,(byte) 0x49,(byte) 0xb4,
(byte) 0x52,(byte) 0xcd,(byte) 0xdd,(byte) 0xa8 };
jcecc.addPoints(jcecc.Qx, jcecc.Qy, Qpwx, Qpwy);
Qpwx = jcecc.getRx();
Qpwy = jcecc.getRy();
Sidenote
Все эти усилия могли бы выглядят действительно чрезмерно: кто бы ни нуждался в этом, когда есть поддержка ECDH на карте? К сожалению, иногда прямая манипуляция с EC poitns - единственный способ реализовать такие протоколы, как SESPAKE
в JavaCard.
Любая обратная связь приветствуется.
На самом деле вопрос здесь? Вы можете изменить все виды вещей в jCardSim, если хотите, как его Java с поддержкой JavaCard API –
@PaulBastian, моя ошибка в том, что вопрос не был указан явно. Обновлено. –