(2017-10-23 08:51:59 отредактировано borune)

Пример из сдк для андроид

Добрый день!

Имеется токен, полученный в компании "Контур". Красненький усб стик с прозрачными стенками.

Загрузил сдк, нашел там в папке mobile/android/pkcs11/samples проект. После некоторых мучений с экспортом в студию 2.3.3 (было бы гораздо удобнее, если бы примеры поддерживались в актуальном состоянии и использовали ну пускай не самые последние, но хотя бы современные версии грейдла, студии и пр.) пример удалось собрать и запустить на телефоне.

В главном активити имеются 3 кнопки.
1. "Показать информацию о подключенных устройствах"
2. "Вычислить хэш-код"
3. "Активировать шифрование канала"

Я правильно понимаю, что усб токен нужно подключить к телефону посредством OTG-кабеля? Ну и по идее при нажатии на кнопку 1 должна появится какая-то информация о нем. У меня ничего не появляется, в лог пишутся следующие сообщения:

C_Initialize -> OK
C_GetSlotList -> OK
Checking number of tokens connected -> Failed
No tokens available
C_Finalize -> OK

По всей видимости, что-то пошло не так. Подскажите пожалуйста, я правильно понял концепцию работы токена и если да, то как сделать так, чтоб токен был виден в приложении?

UPD Вообще хотелось бы знать, было ли проверено приложение на работоспособность перед тем, как оно попало в сдк. Я, конечно, не гуру в програмировании андроида, но чтобы как-то взаимодействовать с токеном по усб, я так полагаю, приложение должно использовать классы для работы с усб портом. В примере из сдк последовательность символов "usb" встречается только в описании стиля statUSBar, но это, скорее всего, немного не то.

UUPD А ещё больше хотелось бы получить полноценный пример работы с усб токеном в андроид.

Re: Пример из сдк для андроид

Добрый день, borune.

Спасибо за обратную связь по версии Android Studio. Постараемся обновить в новой версии SDK.
Что касается ваших вопросов:
1. Токен может быть подключен к мобильному устройству по протоколу Bluetooth (если Вы используете Рутокен ЭЦП Bluetooth) или через OTG кабель (если Вы используете другие модели).
2. В папке с примером расположен README.txt. Убедитесь, что проделали все шаги, которые там описаны.
3. Вы ошибаетесь на тему USB в SDK. Устройства конечно подключаются по USB, но работают через специальные протоколы для работы со смарт-картами. А логика работы с USB реализована в других библиотеках.
4. Уточните пожалуйста, что Вы имеете ввиду под полноценным примером?

(2017-10-24 10:10:29 отредактировано borune)

Re: Пример из сдк для андроид

Владимир Салыкин пишет:

3. Вы ошибаетесь на тему USB в SDK. Устройства конечно подключаются по USB, но работают через специальные протоколы для работы со смарт-картами. А логика работы с USB реализована в других библиотеках.
4. Уточните пожалуйста, что Вы имеете ввиду под полноценным примером?

Владимир Салыкин, вот это я и имею ввиду. Почему нельзя было включить эту логику в пример? Эти протоколы закрыты или секретны?

Просто смотрите какая штука получается. В сдк есть две апкшки с сервисом. Одна без графического интерфейса (и без иконки для запуска, лежит по адресу sdk/mobile/android/service/rtservice-standalone-release.apk), вторая с гуями (sdk/mobile/android/service/rtservice-withUI-release.apk). И для возможности работы с токеном необходима установка одного из этих приложений. Т.е. получается, что если кто-то хочет написать собственное приложение и как-то взаимодействовать в нем с токеном, ему необходимо принудить пользователя установить ваше приложение "Панель управления Рутокен". Это первый и очень существенный минус.

Второй минус является следствием первого и заключается в следующем. Как устанавливать ваше приложение? В маркете мне удалось найти только версию с графикой, а это означает, что у пользователя на телефоне появится ненужная ему иконка на рабочем столе и "ненужное" ему приложение (пишу в кавычках, так как приложение нужно будет ему лишь косвенно). Можно, конечно, включать в дистрибутив своего приложения апкшку вашего приложения, того, которое без графики (или скачивать апк с сервера), с последующей установкой его из файла на устройстве. Но этот вариант тоже плох, поскольку не каждый согласится устанавливать неизвестное приложение из непонятного файла и, по большому счету, будет совершенно прав.

И еще несколько слов насчет протокола обмена. Я провел небольшой реверс инжиниринг вашего приложения и не обнаружил там ничего секретного или закрытого. Код даже не обфусцирован, не говоря уже о том, чтобы вынести какие-то критичные ко взлому вещи в нативные библиотеки. Поэтому все же непонятно, почему нельзя было включить исходники реализации протокола обмена в пример.

Re: Пример из сдк для андроид

Добрый день, borune.

Вы во многом правы. Если Вы создаете свое мобильное приложение по работе с токеном, то Вы можете включить наш APK в состав своего приложения. Или Вашим пользователям придется поставить нашу Панель управления Рутокен.

Минусов в первом подходе я не вижу - это аналогично включению библиотеки в свое приложение. Далеко не каждая библиотека распространяется в исходных кодах. Для пользователя это происходит совершенно прозрачно.

Во втором подходе я также минусов не вижу. Панель управления Рутокен позволяет не только посмотреть информацию об устройстве, но и производить с ним различные действия. Постепенно ее функционал расширяется. Далеко не каждый разработчик мобильных приложений хочет реализовывать ту же смену PIN-кодов в своем приложении. Проще передать эту функцию нашему приложению, которое постоянно тестируется со всеми моделями.

Раскрытие всех исходников в open-source налагает свои обязательства и требует дополнительных вложений от компании. Спасибо за предложение, мы подумаем над этим вопросом в будущих версиях SDK.

(2017-10-25 11:10:47 отредактировано borune)

Re: Пример из сдк для андроид

Владимир Салыкин пишет:

Минусов в первом подходе я не вижу - это аналогично включению библиотеки в свое приложение. Далеко не каждая библиотека распространяется в исходных кодах.

Владимир Салыкин, мы с Вами, кажется, говорим о несколько разных вещах. Если бы работа с токеном требовала бы всего лишь библиотеки, у меня бы не возникло никаких вопросов. Библиотека это что? В случае с андроидом, это, например, GSON, Retrofit, Picasso, Dagger и пр. Вот это библиотеки. Они прозрачны, так как их исходные коды опенсорсны. К каждой библиотеке есть примеры использования. Также существуют нативные библиотеки, такие, какие используются в вашем приложении (librtpkcs11ecp.so). Они не прозрачны, так как их исходные коды закрыты от пользователя. Как правило, такие библиотеки распространяются с описанием АПИ, либо с примерами их использования. Чем хороша библиотека? Тем, что любой программист может включить ее в свой проект и использовать для своих нужд.
В вашем случае ситуация иная. Протокол обмена с токеном реализован не в виде библиотеки, а в отдельном приложении. Приложение в ОС Android это полностью автономный и закрытый модуль, черный ящик, который не может быть встроен в другое приложение. К тому же его исходников нет ни в открытом доступе, ни в сдк. Поэтому у программиста отсутствуют какие-либо инструменты для реализации логики работы с токеном в своем приложении. Если бы этот протокол был оформлен так же, как библиотека для работы с PKCS11, т.е. в отдельном .so файле, это было бы удобно и правильно. А тот вариант, который выбрали ваши программисты, на мой скромный взгляд, не самый оптимальный.

Владимир Салыкин пишет:

Во втором подходе я также минусов не вижу. Панель управления Рутокен позволяет не только посмотреть информацию об устройстве, но и производить с ним различные действия. Постепенно ее функционал расширяется. Далеко не каждый разработчик мобильных приложений хочет реализовывать ту же смену PIN-кодов в своем приложении. Проще передать эту функцию нашему приложению, которое постоянно тестируется со всеми моделями.

Полностью согласен с Вами. Однако есть одно "но". Если пользователю нужно приложение "Панель управления Рутокен", он может поставить его из GooglePlay. Если ему нужно изменять PIN код, он установит приложение и сделает это в нем. А если ему это не нужно? Если эта функциональность не нужна?

Re: Пример из сдк для андроид

Добрый день, borune.

Понял о чём Вы.
Во-первых, Вы ошибаетесь на тему встраивания. Наше приложение может быть встроено в Ваше. Для этого и сделано APK без GUI. Будет распространятся вместе с Вашим приложением, как единое целое. От варианта с *.so файлом это практически ничем не отличается.

Во-вторых, Вы плохо себе представляете как устроена работа с токенами в Linux системах и в частности в Android. Там для такой работы необходим PC\SC сервис. И если в Linux он есть грубо говоря из коробки, то в Android его просто нет. Именно поэтому в нашем приложении есть не только .so. Этот сервис должен работать для работы с токенами. Если у Вас есть желание, вы можете целиком написать этот сервис самостоятельно или даже встроить его самостоятельно в свое приложение. По скольку обычно разработчики не горят желанием писать и поддерживать такой сервис (а это не тривиальная задача), мы включили в SDK для Android не голую PKCS#11 библиотеку.

(2017-10-26 23:14:02 отредактировано borune)

Re: Пример из сдк для андроид

Владимир Салыкин пишет:

Понял о чём Вы.

Я уже сомневаюсь даже в том, что Вы понимаете, о чем Вы сами пишете.

Владимир Салыкин пишет:

Во-первых, Вы ошибаетесь на тему встраивания. Наше приложение может быть встроено в Ваше. Для этого и сделано APK без GUI. Будет распространятся вместе с Вашим приложением, как единое целое. От варианта с *.so файлом это практически ничем не отличается.

Вы знаете, я не первый год программирую под андроид и неплохо в нем разбираюсь. И сообщаю Вам, что в андроиде одно приложение не может быть встроено в другое. Под встраиванием я понимаю возможность использования функций первого во втором. Что Вы под этим понимаете, сказать не могу, но явно что-то не то. Вы мне предлагаете из своего приложения устанавливать ваше. И, видимо, это называете встраиванием. Это не верно. Это называется костыль. Да, это будет работать. Но Вы, по всей видимости, не внимательно читаете то, что я у Вас спрашиваю, отсюда и такие нелепые ответы. Я еще раз для Вас специально повторю, постарайтесь внимательно прочитать и понять смысл того, что я пытаюсь до Вас донести.

Установка приложения из APK это всегда плохой вариант. Объясняю почему. Если у Вас имеется телефон на андроиде, можете убедиться, что по умолчанию установка приложений из APK отключена. И сделано это наверное не просто так, верно? Хотите я Вам расскажу, почему так сделано? Думаю, Вам будет интересно это узнать. Это сделано для безопасности пользователей. Все приложения, находящиеся в маркете, проходят автоматическую проверку на наличие вредоносного кода, поэтому их установка безопасна. А вот приложения, распространяемые через APK, никем не проверяются. Поэтому они потенциально могут нести угрозу. В этой связи требование установки приложения из непроверенных источников ("untrusted sources" в терминах google) является плохой практикой. А Вы мне предлагаете использовать такой метод. Поставьте себя на место пользователя. Вы из маркета скачали приложение, запускаете его, а оно Вам заявляет, что для работы необходимо установить еще какое-то неизвестное Вам приложение не понятно кем и в каких целях написанное. Как Вы поступите? А может там вирус, который прочитает данные всех Ваших банковских карт, переписки с любовницами? И никто Вам не сможет гарантировать, что этого не будет. Что Вы сделаете? Я думаю, если Вы человек благоразумный, Вы, скорее всего, откажетесь от использования данного приложения. А еще можете отзыв или жалобу оставить. Сомневаюсь, что разработчик ожидает от пользователей именно такого поведения.

Прошу обратить внимание, я ни в коем случае не хочу сказать, что в вашем приложении есть вирус. Но пользователь об этом не знает и узнать не может. Имя пекеджа приложения, его название, иконку и прочие атрибуты можно сделать какие угодно, тем самым замаскировав вирус подо что угодно.

И в этой связи я, да и любой другой адекватный разработчик, который заботится о своих клиентах и об имидже своей компании, вероятнее всего, не будут действовать тем путем, который Вы предлагаете.  Очень надеюсь, что я понятно объяснил.

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

Владимир Салыкин пишет:

Во-вторых, Вы плохо себе представляете как устроена работа с токенами в Linux системах и в частности в Android. Там для такой работы необходим PC\SC сервис. И если в Linux он есть грубо говоря из коробки, то в Android его просто нет.

А я и не должен себе этого представлять. По большому счету, мне, как пользователю, все равно, что и как у вас там внутри реализовано. Ваша задача предоставить разработчикам удобный инструмент для использования Вашего токена в своем приложении. И на данный момент, если судить по тому, что есть в сдк, задачу эту Вы (или программисты Вашей компании) выполнить не в состоянии.

Владимир Салыкин пишет:

Именно поэтому в нашем приложении есть не только .so. Этот сервис должен работать для работы с токенами.

А что мешает обернуть ваше "не только .so" в нормальную полноценную библиотеку?

Владимир Салыкин пишет:

Если у Вас есть желание, вы можете целиком написать этот сервис самостоятельно или даже встроить его самостоятельно в свое приложение. По скольку обычно разработчики не горят желанием писать и поддерживать такой сервис (а это не тривиальная задача), мы включили в SDK для Android не голую PKCS#11 библиотеку.

У меня нет такого желания. Вы сделали железку, не предоставив ни описания интерфейсов к ней, ни АПИ - ничего, и предлагаете мне писать какие-то сервисы для взаимодействия с ней? Серьезно? Это Ваш продукт и Ваша задача написать эти сервисы. И причем сделать это так, чтобы ими было удобно пользоваться. У меня есть желание получить качественную и квалифицированную техническую поддержку и с этой целью я создал этот топик и разместил тут свой вопрос. На данный момент я имею 3 Ваших абсолютно бесполезных ответа за 6 дней. И это называется технической поддержкой?

Мне кажется, что компании, подобные Вашей, как раз-таки должны быть ориентированы на клиентов. Пытаться находить с ними общий язык и делать все возможное для того, чтобы клиентам было комфортно и удобно с такими компаниями сотрудничать. Но если судить по примерам из сдк, с допотопными версиями всего, чего только можно, и нулевой полезной функциональностью, а также учесть качество и полезность Ваших ответов и время, которое Вам требуется на их написание, то может сложится впечатление, что, по крайней мере, в области поддержки ОС Android у Вашей компании серьезные проблемы. И будь я на Вашем месте, меня это не могло бы не беспокоить.

Re: Пример из сдк для андроид

Добрый день, borune.

Спасибо за Ваше мнение и за большое желание улучшить наш SDK.
Возможно в будущем, мы учтем Ваше мнение при разработке.

На данный момент, есть только тот путь, который я Вам описал. Использовать его или нет - Ваш выбор. Другого пути пока нет. Когда он появится - мы Вам обязательно сообщим письмом на почту.