Этот проект -- форк opensource-реализации UEFI Smart Card Reader Protocol, выполненной LudovicRousseau. UEFI Smart Card Reader Protocol был представлен в спецификации UEFI версии 2.5. В рамках форка были исправлены мелкие ошибки, не позволявшие собирать проект без предупреждений компилятора с актуальной версией EDK II. Исходный код драйвера выделен в отдельный пакет для упрощения ознакомления.
Реализация драйвера не проходила тщательного аудита кода и не была принята в кодовую базу проекта edk2, в основном, из-за неготовности мейнтейнеров проекта edk2 вносить в проект компоненты, лицензированные под LGPL. Эта версия драйвера может быть использована для запуска UEFI-модулей, взаимодействующих со смарт-картами, в UEFI-средах, где отсутствует встроенная реализация UEFI Smart Card Reader Protocol. После аудита кода и при условии соблюдения лицензии LGPL, в соответствии с которой распространяется драйвер, он может быть использован в UEFI-модулях, решающих прикладные задачи.
Лицензионные обязательства, которые необходимо учитывать при использовании и распространении ПО данного проекта, указаны в файле SmartCardReaderPkg/SmartCardReader/License.txt.
В репозитории проекта используются сабмодули. Перед сборкой, пожалуйста, убедитесь, что исходный код проекта скачан полностью. Для скачивания сабмодулей достаточно выполнить следующую команду из корневой директории проекта:
git submodule update --init --recursive
Для сборки проекта используется окружение EDK II. Для сборки проекта должны быть выполнены предусловия, включающие в себя установку инструментов для сборки. В частности, для сборки потребуется компилятор (GCC или Clang), Python, NASM.
Для настройки среды сборки, воспользуйтесь инструкциями по ссылке.
Для операционных систем, основанных на Debian, ожидается, что данная команда установит все необходиные инструменты:
sudo apt-get install build-essential uuid-dev iasl gcc-5 nasm python3-distutils
Для сборки используется компилятор gcc. Тестирование сборки производилось компилятором gcc 4.8.
Каждый шаг сборки выполняется из корневой директории проекта.
-
Выполнить сборку
BaseTools
проекта edk2:pushd edk2 make -C BaseTools popd
-
Настроить
BaseTools
и переменные окружения:export WORKSPACE=$(pwd) export PACKAGES_PATH="$(pwd)/edk2:$(pwd)" ./edk2/edksetup.sh
-
Выполнить сборку UEFI-модуля примера:
build -t GCC5 -a X64 -b RELEASE -p ./SmartCardReaderPkg/SmartCardReaderPkg.dsc
Исполняемый модуль примера доступен по пути ${WORKSPACE}/Build/SmartCardReaderPkg/RELEASE_GCC5/X64/SmartCardReader.efi
.
Перед сборкой требуется установить инструменты:
- Python версии 3.7 или выше
- NASM - инструкция по настройке
- ASL - инструкция по настройке
- Clang.
Для сборки используется компилятор clang. Тестирование сборки производилось компиляторами clang 9 и clang 11.
Каждый шаг сборки выполняется в командной строке из корневой директории проекта.
-
Настроить переменные окружения:
set NASM_BIN=C:\Path\To\Your\NASMDirectory\ set CLANG_BIN=C:\Path\To\Your\ClangDirectory\ set PYTHON_HOME=C:\Path\To\Your\PythonRootDirectory\ set WORKSPACE=%CD% set PACKAGES_PATH=%CD%\edk2;%CD%
-
Выполнить сборку
BaseTools
проекта edk2:.\edk2\edksetup.bat Rebuild
-
Выполнить сборку UEFI-модуля примера:
build -t CLANGPDB -a X64 -b RELEASE -p ./SmartCardReaderPkg/SmartCardReaderPkg.dsc
Исполняемый модуль примера доступен по пути ${WORKSPACE}/Build/SmartCardReaderPkg/RELEASE_CLANGPDB/X64/SmartCardReader.efi
.
Для модулей, решающих прикладные задачи, стандартным методом внедрения в процесс загрузки компьютера является модификация глобальных NVRAM-переменных (см. 3 Boot Manager Unified Extensible Firmware Interface Specification 2.6). В частности, для загрузки драйвера требуется создание переменной Driver#### и внесение имени этой переменной в список загрузки, заданного в переменной DriverOrder.
Пример использования драйвера представлен в репозитории Rutoken UEFI APDU Samples.