Я пытаюсь реализовать шифрование PGP на основе апплета Yubikey NEO OpenPGP Smart Card в приложении Java. Кажется, это темное искусство, и нелегко это сделать Google, но вот где я до сих пор:
-
Карта инициализируется, ключи генерируются с помощью инструмента gpg. Он вообще работает. У меня есть открытый ключ в формате
.asc
и ему удалось загрузить его вorg.bouncycastle.openpgp
-
Подключитесь к смарт-карте в USB-ключах с помощью API
javax.smartcardio
. -
Выберите апплет OpenPGP
val pgpAID = bytes(0xD2, 0x76, 0x00, 0x01, 0x24, 0x01) val answer = cardChannel.transmit(CommandAPDU(0x00, 0xA4, 0x04, 0x00, pgpAID))
-
Успешно представить правильный PIN-код на карту
val pin = "123456" return bytes(0x00, 0x20, 0x00, 0x82, pin.length) + pin.toByteArray(Charsets.UTF_8)
-
Отправить квази-успешную (см. ниже) команду
decipher
bytes(0x00, 0x2a, 0x80, 0x86, data.size) + data + bytes(0x00)
Когда
data = "xxxx".toByteArray()
, результатSW=9000
(= успех), но данные не возвращаются. Это наивный тест, потому что документация апплета OpenPGP на стр. 52 упоминает, чтоввод команды (кроме байта индикатора заполнения) должен быть отформатирован в соответствии с PKCS # 1 перед шифрованием.
Я не знаю, как зашифровать данные и получить их в формате PKCS # 1.
Я также пробовал читать через тесты внедрения OpenPGP в Yubico OpenPGP, но он предоставляет только другой пример "сбоя" (строка 196). Я попытался запустить это, но результат другой: тест ожидает SW=0050
(указывает на исключение?), И я получаю SW=6f00
(Нет точного диагноза, согласно этот документ).
Я создал репозиторий GitHub со всем кодом. Это написано в Котлине, но должно быть легко читаемым.