В UDS-диагностике неизбежно встречается вопрос безопасного доступа — Seed&Key. В TSMaster предусмотрены два способа обработки Seed&Key: прямая загрузка DLL-файла и добавление алгоритма безопасности прямо во встроенном редакторе TSMaster. Разберём оба.

Ключевые слова: UDS, Seed&Key, Security Access, GenerateKeyEx, DLL.

1. Загрузка внешней Seed&Key DLL

Диагностический модуль TSMaster поддерживает загрузку алгоритма Seed&Key через DLL. Интерфейс вычисления этой DLL совместим с интерфейсами основных инструментов на рынке; определение интерфейса показано на рис. 1-1. В TSMaster откройте «Инструменты» → «Информация о системе» → «Настройка среды Python» и выберите «открыть путь парсера» (рис. 1-2).

Интерфейс Seed&Key
Рис. 1-1. Определение интерфейса Seed&Key DLL
Настройка среды
Рис. 1-2. Путь к настройке среды

В панели управления DLL доступны действия (рис. 1-3):

  • 【1】 Загрузить DLL.
  • 【2】 Удалить DLL.
  • 【3】 Проверщик DLL — кнопка, позволяющая проверить, корректен ли интерфейс загруженной DLL и соответствует ли алгоритм проектным требованиям. Выберите уровень (Level) Seed, введите демонстрационное значение Seed и нажмите GenKey. Если интерфейс DLL совпадает с шаблонным, выводится сообщение Generate Key Success; далее пользователь сравнивает значение Key с целевым и окончательно убеждается, что алгоритм в DLL соответствует требованиям.
  • 【4】 Открыть путь к проекту интерфейса Seed&Key в каталоге установки TSMaster — проект можно скопировать и дополнить собственным алгоритмом Seed&Key.
Проверщик DLL
Рис. 1-3. Проверщик Seed&Key DLL

1.1. Стандартные интерфейсы функции SeedKey

Чтобы диагностический модуль TSMaster мог загрузить DLL напрямую, она должна реализовывать один из трёх следующих интерфейсов.

Интерфейс 1:

unsigned int GenerateKeyEx(
  const unsigned char* ipSeedArray,   /* массив seed [in] */
  unsigned int iSeedArraySize,        /* длина массива seed [in] */
  const unsigned int iSecurityLevel,  /* уровень безопасности [in] */
  const char* ipVariant,              /* имя активного варианта [in] */
  unsigned char* iopKeyArray,         /* массив key [in, out] */
  unsigned int iMaxKeyArraySize,      /* максимальная длина массива key [in] */
  unsigned int& oActualKeyArraySize); /* длина key [out] */

Интерфейс 2:

unsigned int GenerateKeyExOpt(
  const unsigned char* ipSeedArray,   /* массив seed [in] */
  unsigned int iSeedArraySize,        /* длина массива seed [in] */
  const unsigned int iSecurityLevel,  /* уровень безопасности [in] */
  const char* ipVariant,              /* имя активного варианта [in] */
  const char* iPara,                  /* дополнительный параметр */
  unsigned char* iopKeyArray,         /* массив key [in, out] */
  unsigned int iMaxKeyArraySize,      /* максимальная длина массива key [in] */
  unsigned int& oActualKeyArraySize); /* длина key [out] */

Интерфейс 3:

bool ASAP1A_CCP_ComputeKeyFromSeed(
  const unsigned char* ipSeedArray,   /* массив seed [in] */
  unsigned short iSeedArraySize,      /* длина массива seed [in] */
  unsigned char* iopKeyArray,         /* массив key [in, out] */
  unsigned short iMaxKeyArraySize,    /* максимальная длина массива key [in] */
  unsigned short* opSizeKey);         /* длина key [out] */

DLL, реализующая любой из этих интерфейсов, загружается напрямую в модуль TP-уровня. Если загрузка завершается неудачей, проверьте следующее:

  1. Собрана ли DLL в конфигурации Release — сборка Debug часто приводит к описанным сбоям.
  2. Собрана ли DLL под платформу x86: TSMaster — 32-разрядное приложение, и отладочная DLL также должна быть x86.

1.2. Совместимость с другими интерфейсами функций

На практике у пользователя часто уже есть готовая DLL, и если её интерфейс не совпадает ни с одним из трёх стандартных, загрузить её в диагностический модуль напрямую нельзя. В этом случае рекомендуется решение со вторичной обёрткой (рис. 1-4).

Схема вторичной обёртки
Рис. 1-4. Схема вторичной обёртки DLL

Разберём на реальном примере, как обеспечить совместимость существующей DLL.

  1. Шаг 1. Имеющаяся DLL пользователя называется UserSeedKey.dll. Её API-функции: при уровне Seed 1 вызывается void GetKeyFromSeed01(byte* ASeed, byte* AKey); при уровне 3 — void GetKeyFromSeed03(byte* ASeed, byte* AKey); при уровне 11 — void GetKeyFromSeed11(byte* ASeed, byte* AKey). Эта DLL не поддерживает стандартные интерфейсы загрузки, поэтому её нужно обернуть дополнительным слоем.
  2. Шаг 2. Возьмите шаблонный проект GenerateKeyEx из каталога установки TSMaster и вызовите в нём функции этой DLL. Базовая идея: загрузить существующую DLL динамически через LoadLibrary; по переданному параметру Level получить через GetProcAddress указатель на реальную функцию вычисления Key; при успехе передать в неё значение Seed и вычислить Key. Подробный пример вызова — на рис. 1-5.
  3. Шаг 3. После завершения разработки проекта GenerateKeyEx TSMaster напрямую загружает полученную GenerateKeyEx.dll. Важно: исходную UserSeedKey.dll нужно скопировать в корневой каталог TSMaster или в каталог, где лежит GenerateKeyEx.dll. Иначе при выполнении GenerateKeyEx.dll не найдёт зависимую DLL, и разблокировка завершится неудачей.
Пример обёртки
Рис. 1-5. Пример функции-обёртки GenerateKeyEx

Итог: в каталоге установки TSMaster поставляются шаблонные проекты упаковки алгоритмов Seed&Key — GenerateKeyEx, GenerateKeyExOpt, ASAP1A_CCP_ComputeKeyFromSeed; на их основе разрабатывается DLL, загружаемая напрямую. Есть и проект вторичной обёртки GenerateKeyEx_Wrapper_Demo, демонстрирующий, как упаковать существующую библиотеку SeedKey в DLL для диагностического модуля TSMaster.

2. Встроенный редактор алгоритмов

Базовая последовательность показана на рис. 2-1.

Встроенный редактор алгоритмов
Рис. 2-1. Базовые шаги работы со встроенным редактором алгоритмов

На что обратить внимание:

【1】 Интерфейс алгоритмической функции: TSMaster предлагает наиболее распространённые формы интерфейса; если у вас особая форма, которой нет в списке, свяжитесь с TOSUN, чтобы добавить её в варианты (рис. 2-2).

Формы интерфейса
Рис. 2-2. Выбор формы интерфейса алгоритма

【2】 Все интерфейсные функции имеют возвращаемое значение s32. Это ограничение повышает строгость функций: 0 означает успех, другие значения — соответствующие коды ошибок. При редактировании кода не забудьте в последней строке вернуть значение, иначе после выполнения функции система сочтёт алгоритм failed и не продолжит выполнение (рис. 2-3).

Возвращаемое значение
Рис. 2-3. Строка return с кодом возврата

【3】 После добавления алгоритма нажмите OK. Встроенный компилятор TSMaster автоматически интерпретирует алгоритм и подготовит его к использованию в процессе диагностики.