В 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).


В панели управления 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.

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-уровня. Если загрузка завершается неудачей, проверьте следующее:
- Собрана ли DLL в конфигурации Release — сборка Debug часто приводит к описанным сбоям.
- Собрана ли DLL под платформу x86: TSMaster — 32-разрядное приложение, и отладочная DLL также должна быть x86.
1.2. Совместимость с другими интерфейсами функций
На практике у пользователя часто уже есть готовая DLL, и если её интерфейс не совпадает ни с одним из трёх стандартных, загрузить её в диагностический модуль напрямую нельзя. В этом случае рекомендуется решение со вторичной обёрткой (рис. 1-4).

Разберём на реальном примере, как обеспечить совместимость существующей DLL.
- Шаг 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. Возьмите шаблонный проект GenerateKeyEx из каталога установки TSMaster и вызовите в нём функции этой DLL. Базовая идея: загрузить существующую DLL динамически через
LoadLibrary; по переданному параметру Level получить черезGetProcAddressуказатель на реальную функцию вычисления Key; при успехе передать в неё значение Seed и вычислить Key. Подробный пример вызова — на рис. 1-5. - Шаг 3. После завершения разработки проекта GenerateKeyEx TSMaster напрямую загружает полученную GenerateKeyEx.dll. Важно: исходную
UserSeedKey.dllнужно скопировать в корневой каталог TSMaster или в каталог, где лежит GenerateKeyEx.dll. Иначе при выполнении GenerateKeyEx.dll не найдёт зависимую DLL, и разблокировка завершится неудачей.

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

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

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

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