Протокол CEN/XFS (XFS, J/XFS, XFS4IoT)
Справочная заметка ATM: Протокол CEN/XFS (XFS, J/XFS, XFS4IoT).
Протокол CEN/XFS (XFS, J/XFS, XFS4IoT)
Обзор
CEN/XFS (Extensions for Financial Services) — европейский стандарт (CEN/CENELEC, стандарт EN 16240 / ISO 20038), определяющий единый программный интерфейс (API) между ATM-приложением и периферийными устройствами банкомата.
Цель: независимость ПО от производителя железа. ATM-приложение использует одинаковый XFS API вне зависимости от того, чей стоит диспенсер — NCR, Diebold или Wincor.
Версии
| Версия | Год | Ключевые изменения |
|---|---|---|
| XFS 1.0 | 1995 | Первая версия (WOSA/XFS) |
| XFS 2.0 | 1998 | Расширения |
| XFS 3.0 | 2003 | Крупное обновление, EMV |
| XFS 3.10 | 2008 | Доп. сервисы |
| XFS 3.20 | 2011 | Biometrics, contactless |
| XFS 3.30 | 2015 | Широко распространенная классическая версия |
| XFS 3.51 | 2025 | Актуальный CEN/CENELEC CWA release в публичной download area по состоянию на 2026-05-28 |
| XFS4IoT Release 2024-03 | 2024 | Новый CWA-стек: JSON/WebSocket, ОС-независимый подход |
Архитектура CEN/XFS
graph TD
subgraph "ATM Application Layer"
APP["ATM Application\n(APTRA / Vynamic / Kalignite)"]
end
subgraph "XFS Manager"
MGR["XFS Manager\n(xfs_mgr.dll)\nДиспетчер запросов"]
end
subgraph "Service Providers (SP)"
SP_CDM["CDM SP\nCash Dispenser"]
SP_EPP["EPP SP\nPIN Pad"]
SP_IDC["IDC SP\nCard Reader"]
SP_PTR["PTR SP\nPrinter"]
SP_CIM["CIM SP\nCash-In Module"]
SP_SIU["SIU SP\nSensor/Indicators"]
SP_CAM["CAM SP\nCamera"]
SP_BCR["BCR SP\nBarcode Reader"]
end
subgraph "Hardware"
HW_CDM["Физический\nDиспенсер"]
HW_EPP["Физический\nEPP"]
HW_IDC["Физический\nCard Reader"]
HW_PTR["Физический\nПринтер"]
end
APP <-->|"WFSOpen/WFSExecute\nWFSGetInfo\nWFSRegister"| MGR
MGR <--> SP_CDM
MGR <--> SP_EPP
MGR <--> SP_IDC
MGR <--> SP_PTR
MGR <--> SP_CIM
MGR <--> SP_SIU
SP_CDM <-->|"USB/Serial\nдрайвер"| HW_CDM
SP_EPP <--> HW_EPP
SP_IDC <--> HW_IDC
SP_PTR <--> HW_PTR
Классы XFS Service Providers
| Класс | Аббревиатура | Устройство |
|---|---|---|
| Cash Dispenser Module | CDM | Диспенсер банкнот (только выдача) |
| Cash-In Module | CIM | Приёмник банкнот |
| ID Card Unit | IDC | Считыватель карт (моторизованный) |
| Encrypting PIN Pad | EPP | PIN-клавиатура с шифрованием |
| Printer | PTR | Принтер чеков / журнала |
| Sensors and Indicators Unit | SIU | Датчики (дверь, тамперы, лампы) |
| Camera | CAM | Камера |
| Barcode Reader | BCR | Считыватель штрихкодов (QR) |
| Text Terminal Unit | TTU | Текстовый дисплей |
| Vendor Dependent Mode | VDM | Проприетарный режим |
| Card Embossing Unit | CEU | Эмбоссирование карт (банковские офисы) |
| Bill Acceptor | BAC | Приёмник купюр (торговые терминалы) |
XFS API — основные вызовы
Все XFS-функции асинхронны (Windows Message-based). ATM-приложение регистрирует window handle, куда приходят события.
Управление сессией
| Функция | Описание |
|---|---|
WFSStartUp(version, …) | Инициализация XFS Manager |
WFSOpen(SP_name, …, &hService) | Открыть сессию с Service Provider |
WFSLock(hService, …) | Эксклюзивный захват устройства |
WFSUnlock(hService) | Освободить устройство |
WFSClose(hService) | Закрыть сессию |
WFSCleanUp() | Завершение работы с XFS |
Запросы и команды
| Функция | Описание |
|---|---|
WFSGetInfo(hService, category, …) | Запрос информации об устройстве |
WFSExecute(hService, command, …) | Выполнить команду (диспенс, печать, …) |
WFSRegister(hService, eventClass, …) | Подписка на события |
Асинхронные варианты
| Функция | Описание |
|---|---|
WFSAsyncExecute(…, &requestID) | Асинхронная команда |
WFSCancelAsyncRequest(…, requestID) | Отмена асинхронной команды |
CDM — команды диспенсера (WFS_CMD_CDM_*)
| Команда | Код | Описание |
|---|---|---|
WFS_CMD_CDM_DENOMINATE | 301 | Расчёт номинала для выдачи суммы |
WFS_CMD_CDM_DISPENSE | 302 | Выдать банкноты |
WFS_CMD_CDM_PRESENT | 303 | Открыть shutter (предъявить клиенту) |
WFS_CMD_CDM_REJECT | 304 | Отправить банкноты в reject кассету |
WFS_CMD_CDM_RETRACT | 305 | Забрать банкноты обратно (retract) |
WFS_CMD_CDM_RESET | 306 | Сброс устройства |
WFS_CMD_CDM_OPEN_SHUTTER | 307 | Открыть shutter |
WFS_CMD_CDM_CLOSE_SHUTTER | 308 | Закрыть shutter |
WFS_CMD_CDM_SET_GUIDANCE_LIGHT | 309 | Индикатор секции |
WFS_CMD_CDM_CALIBRATE_CASH_UNIT | 313 | Калибровка кассеты |
CDM GetInfo категории
| Категория | Описание |
|---|---|
WFS_INF_CDM_STATUS | Текущий статус: Online/Offline, состояние shutter |
WFS_INF_CDM_CAPABILITIES | Возможности устройства |
WFS_INF_CDM_CASH_UNIT_INFO | Информация о кассетах: номинал, остаток, тип |
WFS_INF_CDM_TELLER_INFO | Информация для кассира |
WFS_INF_CDM_CURRENCY_EXP | Экспоненты валют |
WFS_INF_CDM_MIX_TYPES | Доступные алгоритмы набора номинала |
CDM — структура кассеты (WFSCDMCASHU)
typedef struct _wfs_cdm_cash_unit {
WORD usNumber; // Номер слота (1..N)
WORD usType; // Тип: TYPEBILLCASSETTE, TYPERETRACTCASSETTE...
LPSTR lpszCashUnitName;// Имя кассеты
CHAR cCurrencyID[3]; // ISO 4217: "RUB", "USD"
ULONG ulValues; // Номинал (в минимальных единицах)
ULONG ulInitialCount; // Начальный счёт
ULONG ulCount; // Текущий счёт
ULONG ulRejectCount; // Количество отбракованных
ULONG ulMinimum; // Минимальный остаток (alert)
ULONG ulMaximum; // Максимальная ёмкость
BOOL bAppLock; // Заблокирована приложением
WORD usStatus; // OK / Low / Empty / Inoperative / Missing
} WFSCDMCASHU;
Типы кассет (usType):
| Константа | Значение | Описание |
|---|---|---|
WFS_CDM_TYPEBILLCASSETTE | 0 | Обычная кассета с банкнотами |
WFS_CDM_TYPERETRACTCASSETTE | 1 | Retract кассета |
WFS_CDM_TYPEREJECTCASSETTE | 2 | Reject кассета |
WFS_CDM_TYPECOUPON | 3 | Купоны |
WFS_CDM_TYPERECYCLING | 4 | Recycling кассета |
EPP — команды PIN Pad (WFS_CMD_EPP_*)
| Команда | Описание |
|---|---|
WFS_CMD_EPP_GET_PIN | Запросить ввод PIN (результат — PIN Block) |
WFS_CMD_EPP_GET_PINBLOCK | Получить PIN Block в указанном формате |
WFS_CMD_EPP_GET_DATA | Получить произвольный ввод с клавиатуры |
WFS_CMD_EPP_INITIALIZE_PIN | Инициализировать PIN-сессию |
WFS_CMD_EPP_LOCAL_DES | Локальная DES-верификация |
WFS_CMD_EPP_LOCAL_EUROCHEQUE | Eurocheque PIN верификация |
WFS_CMD_EPP_LOAD_IV | Загрузить Initialization Vector |
WFS_CMD_EPP_SET_PINBLOCK_DATA | Установить данные для PIN Block |
PIN Block форматы (EPP)
| Формат | Описание |
|---|---|
WFS_EPP_FORMAT_IBM3624 | IBM 3624 (устаревший) |
WFS_EPP_FORMAT_ANSIX98 | ISO Format 0 (ANSI X9.8) — наиболее распространён |
WFS_EPP_FORMAT_ISO0 | ISO 9564 Format 0 |
WFS_EPP_FORMAT_ISO1 | ISO 9564 Format 1 |
WFS_EPP_FORMAT_ISO3 | ISO 9564 Format 3 |
WFS_EPP_FORMAT_ISO4 | ISO 9564 Format 4 (AES) |
IDC — команды Card Reader (WFS_CMD_IDC_*)
| Команда | Описание |
|---|---|
WFS_CMD_IDC_READ_TRACK | Прочитать трек магнитной полосы |
WFS_CMD_IDC_WRITE_TRACK | Записать на трек (для writeable карт) |
WFS_CMD_IDC_EJECT_CARD | Вернуть карту клиенту |
WFS_CMD_IDC_RETAIN_CARD | Изъять карту (capture) |
WFS_CMD_IDC_RESET_COUNT | Сбросить счётчик захваченных карт |
WFS_CMD_IDC_SET_KEY | Установить ключ для защищённого чтения |
WFS_CMD_IDC_READ_RAW_DATA | Прочитать сырые данные (EMV) |
WFS_CMD_IDC_CHIP_IO | Обмен APDU с чипом (EMV команды) |
WFS_CMD_IDC_CHIP_POWER | Управление питанием чипа |
XFS события (Events)
XFS уведомляет приложение о событиях через Windows Messages:
| Событие | Класс | Описание |
|---|---|---|
WFS_EXECUTE_COMPLETE | Execute | Команда выполнена |
WFS_EXECUTE_EVENT | Execute | Промежуточное событие (например: media inserted) |
WFS_SERVICE_EVENT | Service | Событие устройства (jam, empty, door open) |
WFS_USER_EVENT | User | Действие пользователя |
WFS_SYSTEM_EVENT | System | Системное событие |
Пример: CDM события
| Событие | Описание |
|---|---|
WFS_SRVE_CDM_CASHUNITINFOCHANGED | Изменился счёт в кассете |
WFS_SRVE_CDM_TELLER_INFO_CHANGED | Изменилась информация кассира |
WFS_USRE_CDM_MEDIAPRESENTED | Деньги предъявлены клиенту |
WFS_USRE_CDM_MEDIATAKEN | Деньги взяты клиентом |
WFS_USRE_CDM_MEDIARETRACTED | Деньги возвращены (retracted) |
J/XFS — Java-версия
J/XFS — Java-реализация XFS API (спецификация от J/XFS Consortium):
- Те же сервисные классы (CDM, EPP, IDC…), но через Java интерфейсы
- Кроссплатформенность: Windows, Linux
- Используется в ATM на базе Java-платформ
- Реализации: KAL J/XFS, Wincor J/XFS, проприетарные
// Пример J/XFS (схематично)
CDMService cdm = (CDMService) serviceManager.getService("CDM");
cdm.open();
CDMDenominate denom = new CDMDenominate(amount, currency);
CDMDispense dispense = cdm.denominate(denom);
cdm.dispense(dispense);
cdm.present();
XFS4IoT — новый стандарт
XFS4IoT — CEN Workshop Agreement и преемник классического XFS 3.x/J/XFS:
| Параметр | CEN/XFS 3.30 | XFS4IoT |
|---|---|---|
| Транспорт | Windows COM | WebSocket |
| Формат | C структуры | JSON |
| ОС | Windows only | ОС-независимый |
| Архитектура | In-process DLL | Микросервисы |
| API стиль | Synchronous + Msg | Async JSON commands/events |
| Статус (2026) | Широко распространен в установленной базе | Развивается и внедряется, но не заменил XFS 3.x повсеместно |
// XFS4IoT пример команды диспенс (JSON)
{
"headers": {
"type": "command",
"name": "CashDispenser.Dispense",
"requestId": "a1b2c3"
},
"payload": {
"denomination": {
"currencies": { "RUB": 5000 },
"values": { "cassette1": 5 }
}
}
}
Security boundary
XFS не является authorization layer. Он предоставляет доступ приложений к устройствам через XFS Manager и Service Providers.
При компрометации ATM PC device layer становится критичной зоной риска. Для defensive-модели важно:
- журналировать критичные device commands и results;
- связывать dispenser activity с approved transaction context;
- фиксировать service mode и tamper events;
- ограничивать локальные права;
- использовать hardening и application allowlisting;
- сопоставлять device logs, EJ и reconciliation.
Подробнее: ATM-XFS-Attack-Surface.
Связанные заметки
- ATM-Протоколы-обзор — обзор всех протоколов
- ATM-Архитектура-ATM — архитектура ATM, роль XFS
- ATM-Кассеты-и-Диспенсер — XFS CDM кассеты
- ATM-NDC-DDC — NDC/DDC поверх XFS
- ATM-IFX-и-другие — другие протоколы
- ATM-XFS-Attack-Surface — defensive threat model device layer
- ATM-Jackpotting — риск неавторизованной выдачи
- TERM-xfs · TERM-sp · TERM-epp · TERM-pin-block
Источники
- CEN/CENELEC: CWA Download Area — XFS Release 3.51 and XFS4IoT.
- XFS4IoT: Specifications Preview — Release 2024-03.