PKCS#11 на Android (Flutter)

Здравствуйте!

Подключаю библиотеку PKCS#11 к программе на Flutter (Dart). Использую вызов функций из динамически загружаемой библиотеки. Для Windows использую библиотеку rtpkcs11ecp.dll, все работает.

Для Android использую библиотеку librtpkcs11ecp.so, обнаружены проблемы:

1. Неправильное выравнивание в структуре CK_INFO, возвращаемой функцией C_GetInfo. Дамп памяти для обоих платформ приложен. Красным выделены лишние байты.
Windows:
https://forum.rutoken.ru/uploads/images/2023/05/399a6080de3ef97fd619c5e348577f92.png
Android:
https://forum.rutoken.ru/uploads/images/2023/05/ea17fa9898a4c2d785c857d9239fed66.png

2. Неправильное выравнивание в структуре возвращаемой функцией C_GetSlotList. Дамп памяти для обоих платформ приложен.
Windows:
https://forum.rutoken.ru/uploads/images/2023/05/e534bf741d5c5da1079d65dd116eea93.png
Android:
https://forum.rutoken.ru/uploads/images/2023/05/1a1cc4156e8ab1e51d1c419018856cff.png

3. Функция C_WaitForSlotEvent возвращает CKR_NO_EVENT, а C_GetSlotList кол-во активных слотов 0, независимо от наличия или отсутствия токена подключенного через NFC.

Используется Рутокен 3.0 ЭЦП NFC. Панель управления Рутокен установлена. Она NFC-токен обнаруживает. Приложение Демо-смена установлено, оно так же видит NFC-токен, но оно использует другую библиотеку, не PKCS#11.

Re: PKCS#11 на Android (Flutter)

Денис (ЦПУ-301), добрый день.
Структуры в интерфейсе pkcs#11 только для Windows выравнены по 1 байту, для других платформ используется "нативное" выравнивание, которое может отличаться от платформы к платформе.

Типы в интерфейсе pkcs#11 мапятся в нативные типы языка С, размеры которых от платформы к платформе тоже отличаются.

В совокупности 1 и 2 дают разницу в выравниваниях и в размерах типов, которые вы видете в дампе памяти. Никакого "неправильного" выравнивания мы не видим.

Вы видимо используете C_WaitForSlotEvent в неблокирующем режиме, для корректной работы в этом случае она должна вызываться в цикле. Вы вызываете ее в цикле?

Для поддержки работы с Рутокенами на Android требуется внедрение дополнительных библиотек в ваше приложение (rtpcsc.aar или rtserviceconnection.aar), подробнее о них можно прочитать тут – https://dev.rutoken.ru/pages/viewpage.a … =54395671. Подскажите внедрены ли они в ваше приложение? Если да – какой библиотекой и какой версией вы пользуетесь?

Также будем рады если сообщите на каком устройстве вы проверяете работу (модель, версия Android и прочее).

Re: PKCS#11 на Android (Flutter)

Спасибо за оперативный ответ.

Функцию C_WaitForSlotEvet использовал в вариантах с блокировкой и без блокировки.
   в отсутствии блокировки ожидал в цикле. Всегда получал код ответа CKR_NO_EVENT
   в варианте с блокировкой функция не возвращала управление

Так же проверял в цикле C_GetSlotList и C_GetSlotInfo
   C_GetSlotList с параметром tokenPresent=1 возвращает всегда пустой список (длина 0)
   С_GetSlotInfo записывает с структуру CK_SLOT_INFO флаги CKF_REMOVABLE_DEVICE, CKF_HW_SLOT, без флага CKF_TOKEN_PRESENT

Относительно библиотек, в соответствии с запросом библиотеки librtpkcs11ecp.so я добавил библиотеку librtpcsc.so из SDK, соответствующий rtpcsc-2.1.0.aar. Без внедрения этих библиотек функции вообще не вызывались. Сейчас все вызовы проходят нормально.

Для подключения я пользуюсь интерфейсом динамических библиотек, аналогично как если бы вашу библиотеку подключали в приложение написанное на С. AAR не использую так как это формат библиотек для Java.

Проверяю на мобильном телефоне Armor X7 Pro, Android 10, архитектура arm64-v8a.

Относительно выравнивания и на Windows и на Android у меня платформы 64 бита. Размеры CK_ULONG и CK_VOID_PTR идентичные, 4 и 8 байт соответственно. Но это не принципиально, могу подстроиться под фактически возвращаемую структуру. Я надеялся что это поможет в поиске проблемы с не работающим C_WaitForSlotEvent.

Re: PKCS#11 на Android (Flutter)

Денис (ЦПУ-301), добрый день.
К сожалению, важная часть встраивания находится в java части aar библиотек для встраивания. Без встраивания aar (только с встраиванием нативных библиотек) работать с Рутокенами не получится.

Re: PKCS#11 на Android (Flutter)

Хорошо. Попробую для тестов подключиться через AAR.

Подскажите, планируется ли выпустить найтивные библиотеки для андроид что бы работать без Java, как это уже сделано для Линукс и Windows?

Нам предстоит сертификация в ФСБ и ФСТЭК под Андроид и Линукс, использование одного и того же кода, который работает через стандарт PKCS#11 существенно упростило бы задачу.

Re: PKCS#11 на Android (Flutter)

Если вы планируете поддерживать любые устройства на ОС Android, то на текущий момент встраивание без java кода невозможно. Предпосылок к появлению такого варианта встраивания также нет.
Если вы являетесь разработчиками устройств с ОС Android, то напишите нам на hotline@rutoken.ru