Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Expand
titleОглавление...

Table of Contents


RtPcsc - фреймворк для работы с Рутокен ЭЦП Bluetooth, виртуальными считывателями Рутокен VCR, а также NFC-устройствами семейства Рутокен ЭЦП.

...

Info
Внимание! Приложение со встроенным RtPcsc.framework может быть запущено только на физических устройствах Apple, не на эмуляторе. Обратите внимание, что работа с VCR API доступна только на iPad.

Для работы с Рутокен ЭЦП Bluetooth необходимо

Добавить в Info.plist ключ UISupportedExternalAccessoryProtocols со значением com.aktivco.rutokenecp.

Infoplist
Code Block
languagexml
title.
<key>UISupportedExternalAccessoryProtocols</key>
<array>
  <string>com.aktivco.rutokenecp</string>
</array>

Для работы с NFC устройствами Рутокен необходимо

...

Info
Внимание! Убедитесь, что ваш сертификат разработчика для iOS позволяет разрабатывать приложения для работы с NFC устройствами.

Для работы с виртуальными считывателями (Рутокен VCR) необходимо

  1. в Info.plist добавить ключ Bonjour services со значениями:

    Code Block
    languagexml
    titleEntitlements.plist
    <key>NSBonjourServices</key>
    <array>
        <string>_ru-rutoken-vcr._udp</string>
        <string>_ru-rutoken-vcr._tcp</string>
    </array>
  2. в Info.plist добавить ключ Privacy - Local Network Usage Description с описанием причины необходимости доступа, например: Доступ необходим для работы с VCR

    Code Block
    languagexml
    titleEntitlements.plist
    <key>NSLocalNetworkUsageDescription</key>
    <string>Доступ необходим для работы с виртуальным считывателем Рутокен</string>
  3. Работа в приложениях с VCR API на macOS в режиме совместимости с iPad
    Чтобы в приложении для iPadOS, когда оно запускается в режиме совместимости на macOS, работал VCR API необходимо:

    Добавить в Entitlements.plist ключ keychain-access-groups.

Info
titleПримеры на GitHub

Примеры готовых приложений можно найти в репозиториях на GitHub: rutoken-demobank-ios и rutoken-demoshift-ios.

Для работы с USB-токенами необходимо

Начиная с iOS/iPadOS 16.2 стала возможна работа USB-токенов.
Для включения поддержки USB-токенов достаточно только обновления RtPcsc.framework до версии 4.0.0 или новее.


Описание интерфейса RtPcsc для работы с NFC/VCR

Warning
titleИзменилось поведение функции SCardGetStatusChange

Начиная с версии RtPcsc 5.0.0 для обнаружения нового считывателя с помощью "\\?PnP?\Notification", необходимо указывать количество уже известных приложению считывателей в верхнем слове dwCurrentState.

Например, так:

SCARD_READERSTATE state;
state.szReader = "\\\\?PnP?\\Notification";
state.dwCurrentState = (1 << 16);

Если ожидаемое приложением количество считывателей не совпадет с реальным, управление будет сразу же возвращено, а в верхнем слове dwEventState будет содержаться текущее количество считывателей.

Пример работы с функцией SCardGetStatusChange, учитывающий поведение описанное на GitHub.

Expand
titleDeprecated API для работы с NFC устройствами...
  1. Перед началом взаимодействия с Рутокен ЭЦП 3.0 NFC запустите функцию startNFC. Функция определена во фреймворке RtPcsc.
  2. Функция startNFC запускает в отдельном потоке окно с просьбой приложить NFC карту к телефону или планшету. На вход она принимает callback, который будет вызван в случае ошибок, например если окно закрылось по таймауту или пользователь нажал на клавишу "Отмена".
  3. После окончания взаимодействия с NFC токеном запустите функцию stopNFC из фреймворка RtPcsc. 
  4. Поток с окном предложения приложить токен и поток работы с PKCS#11 функциями надо синхронизировать: токен не сразу распознается системой и нужно некоторое время подождать прежде чем начать работать с ним. 

...

  • RUTOKEN_CONTROL_CODE_START_NFC - запуск обнаружения по NFC;
  • RUTOKEN_CONTROL_CODE_STOP_NFC - остановка обнаружения по NFC;
  • RUTOKEN_CONTROL_CODE_STOP_NFC_WITH_ERROR - остановка обнаружения по NFC с показом иконки ошибки;
  • RUTOKEN_CONTROL_CODE_LAST_NFC_STOP_REASON - возврат причины прекращения обнаружения по NFC.


Параметр pbSendBuffer используется для передачи дополнительной информации:

  • при RUTOKEN_CONTROL_CODE_START_NFC: параметр задан в формате "\(waitMessage)\0\(workMessage)\0\0" и содержит два сообщения:
    • waitMessage отображается во время ожидания карты,
    • workMessage отображается во время работы с картой;
  • при RUTOKEN_CONTROL_CODE_STOP_NFC: параметр содержит сообщение о завершении работы с картой.;
  • при RUTOKEN_CONTROL_CODE_STOP_NFC_WITH_ERROR: параметр содержит сообщение о завершении работы с картой .с уведомлением об ошибке;
  • при RUTOKEN_CONTROL_CODE_LAST_NFC_STOP_REASON: параметр не используется.

Рекомендуемый порядок работы с Рутокеном с NFC

...

  • получить список доступных ридеров с помощью функции SCardListReaders;
  • если ридер еще не появился – дождаться его появления с помощью функции SCardGetStatusChange;
  • вызов функции SCardConnect для нужного ридера с параметром dwShareMode == SCARD_SHARE_DIRECT;
  • вызов функции SCardControl с параметром RUTOKEN_CONTROL_CODE_START_NFC;
  • работа с Рутокеном;
  • вызов функции SCardControl с параметром RUTOKEN_CONTROL_CODE_STOP_NFC;
  • вызов функции SCardDisconnect.

Причину завершения обнаружения NFC устройств можно получить с помощью вызова функции SCardControl с параметром RUTOKEN_CONTROL_CODE_LAST_NFC_STOP_REASON.

...

  • RUTOKEN_NFC_STOP_REASON_FINISHED - вызов SCardControl с параметром RUTOKEN_CONTROL_CODE_STOP_NFC;
  • RUTOKEN_NFC_STOP_REASON_UNKNOWN - причина завершения неизвестна;
  • RUTOKEN_NFC_STOP_REASON_TIMEOUT - системный таймаут (на устройствах под управлением iOS предоставляется 20 секунд на одну NFC сессию);
  • RUTOKEN_NFC_STOP_REASON_CANCELLED_BY_USER - нажатие кнопки "Отмена" на системном окне обнаружения NFC;
  • RUTOKEN_NFC_STOP_REASON_NO_ERROR - системное окно работы с NFC еще не опускалось, ошибок нет.

Получение типа устройства Рутокен

...

Работа с виртуальным считывателем

Для спаривания запуска процедуры создания пары с новым виртуальным считывателем необходимо вызвать функцию NSString* generatePairingQR(void), она возвращает изображение QR-кода в виде base64 строки. Для спаривания этого необходимо отобразить QR-код на экране и считать его с помощью приложения Рутокен VCR.

Info

Функция NSString* generatePairingQR(void) служит для создания сертификата и временного секрета для сопряжения. Процедура сопряжения начнется после вызова хотя бы одной функции из интерфейса RtPcsc.framework.


Для получения списка спаренных сопряженных считывателей необходимо вызвать функцию NSArray* listPairedVCR(void).
Функция возвращает массив словарей, содержащих информацию о считывателях. Для каждого считывателя Рутокен VCR существует один сертификат, который хранится в keychain. Он необходим, чтобы удостовериться, что данные устройства (iPad и iPhone) спаренысопряжены.

Ключи словаря:

  • name - имя считывателя
  • cert - сертификат считывателя в виде BASE64-строки
  • fingerprint - SHA1-хеш от сертификата считывателя

Для отмены спаривания разрыва пары со считывателем необходимо вызвать функцию BOOL unpairVCR(NSData* vcrId).

Функция возвращает true, если спаривание отмененоразрыв произошёл успешно, и false в противном случае. В качестве параметра она принимает SHA1-хеш от сертификата считывателя, спаривание пару с которым котором необходимо отменитьразорвать.

Рекомендуемый порядок работы с VCR

...

  • Вызвать функцию SCardEstablishContext;
  • Сгенерировать сгенерировать QR-код для спаривания создания пары с помощью функции generatePairingQR
  • осуществить спаривание с VCR
  • ;
  • Запустить процесс ожидания подключения ридеров, вызвав функцию SCardGetStatusChange;
  • Осуществить сопряжение с VCR и дождаться подключения ридера на уровне RtPcsc получить список доступных считывателей с помощью функции SCardListReaders (для iPad будут отображаться доступные виртуальные считыватели);
  • вызов Вызов функции SCardConnect для нужного считывателя с параметром dwShareMode == SCARD_SHARE_DIRECT;
  • вызов Вызов функции SCardControl с параметром RUTOKEN_CONTROL_CODE_START_NFC;
  • работа Работа с Рутокеном;
  • вызов Вызов функции SCardControl с параметром RUTOKEN_CONTROL_CODE_STOP_NFC;вызов функции SCardDisconnect
  • Вызов функции SCardDisconnect.

Пример работы с API

Примеры работы с API есть в репозитории на GitHub rutoken-demoshift-ios в файле https://github.com/AktivCo/rutoken-demoshift-ios/blob/master/demoshift/PcscWrapper/PcscWrapper.swift