Открыть меню

Протокол CEN/XFS (XFS, J/XFS, XFS4IoT)

Создано 5 мая 2026 г. Обновлено 2 июн. 2026 г. 8 мин чтения

Справочная заметка 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.01995Первая версия (WOSA/XFS)
XFS 2.01998Расширения
XFS 3.02003Крупное обновление, EMV
XFS 3.102008Доп. сервисы
XFS 3.202011Biometrics, contactless
XFS 3.302015Широко распространенная классическая версия
XFS 3.512025Актуальный CEN/CENELEC CWA release в публичной download area по состоянию на 2026-05-28
XFS4IoT Release 2024-032024Новый 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 ModuleCDMДиспенсер банкнот (только выдача)
Cash-In ModuleCIMПриёмник банкнот
ID Card UnitIDCСчитыватель карт (моторизованный)
Encrypting PIN PadEPPPIN-клавиатура с шифрованием
PrinterPTRПринтер чеков / журнала
Sensors and Indicators UnitSIUДатчики (дверь, тамперы, лампы)
CameraCAMКамера
Barcode ReaderBCRСчитыватель штрихкодов (QR)
Text Terminal UnitTTUТекстовый дисплей
Vendor Dependent ModeVDMПроприетарный режим
Card Embossing UnitCEUЭмбоссирование карт (банковские офисы)
Bill AcceptorBACПриёмник купюр (торговые терминалы)

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_DENOMINATE301Расчёт номинала для выдачи суммы
WFS_CMD_CDM_DISPENSE302Выдать банкноты
WFS_CMD_CDM_PRESENT303Открыть shutter (предъявить клиенту)
WFS_CMD_CDM_REJECT304Отправить банкноты в reject кассету
WFS_CMD_CDM_RETRACT305Забрать банкноты обратно (retract)
WFS_CMD_CDM_RESET306Сброс устройства
WFS_CMD_CDM_OPEN_SHUTTER307Открыть shutter
WFS_CMD_CDM_CLOSE_SHUTTER308Закрыть shutter
WFS_CMD_CDM_SET_GUIDANCE_LIGHT309Индикатор секции
WFS_CMD_CDM_CALIBRATE_CASH_UNIT313Калибровка кассеты

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_TYPEBILLCASSETTE0Обычная кассета с банкнотами
WFS_CDM_TYPERETRACTCASSETTE1Retract кассета
WFS_CDM_TYPEREJECTCASSETTE2Reject кассета
WFS_CDM_TYPECOUPON3Купоны
WFS_CDM_TYPERECYCLING4Recycling кассета

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_EUROCHEQUEEurocheque PIN верификация
WFS_CMD_EPP_LOAD_IVЗагрузить Initialization Vector
WFS_CMD_EPP_SET_PINBLOCK_DATAУстановить данные для PIN Block

PIN Block форматы (EPP)

ФорматОписание
WFS_EPP_FORMAT_IBM3624IBM 3624 (устаревший)
WFS_EPP_FORMAT_ANSIX98ISO Format 0 (ANSI X9.8) — наиболее распространён
WFS_EPP_FORMAT_ISO0ISO 9564 Format 0
WFS_EPP_FORMAT_ISO1ISO 9564 Format 1
WFS_EPP_FORMAT_ISO3ISO 9564 Format 3
WFS_EPP_FORMAT_ISO4ISO 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_COMPLETEExecuteКоманда выполнена
WFS_EXECUTE_EVENTExecuteПромежуточное событие (например: media inserted)
WFS_SERVICE_EVENTServiceСобытие устройства (jam, empty, door open)
WFS_USER_EVENTUserДействие пользователя
WFS_SYSTEM_EVENTSystemСистемное событие

Пример: 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.30XFS4IoT
ТранспортWindows COMWebSocket
ФорматC структурыJSON
ОСWindows onlyОС-независимый
АрхитектураIn-process DLLМикросервисы
API стильSynchronous + MsgAsync 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.


Связанные заметки

Источники

Ссылаются на эту заметку

Источник: публичный слой Obsidian Vault.