DLL库我们一般用VS工具来生成,首先选择生成DLL例程模板。和其他安全会话一样,主要分为3部分;首先上位机获取DLL库的权限,然后向下位机发送获取当前权限下的种子(SEED)请求,进行上位机SEED值的计算比较,然后向下位机发送KEY值来获取权限。
//*****************************************************************************
/// @fn DllMain ... Windows DLL entrance point
//*****************************************************************************
BOOL WINAPI DllMain (HANDLE hModule, DWORD fdwReason, LPVOID lpReserved)
{
switch (fdwReason) {
case DLL_PROCESS_ATTACH: setMyPrivilege(); break;
case DLL_PROCESS_DETACH: break;
default: break;
} // switch
return TRUE;
}
XCP标定安全会话,一般会加密四种工况,分别为标定页切换(XcpSkPrivCalPag)、DAQ测量(XcpSkPrivDaq)、STIM旁路(XcpSkPrivStim)和PGM刷写(XcpSkPrivPgm)。根据下位机底层代码的实现情况,使能这几种模式。
static void setMyPrivilege()
{
MyPrivilege = 0;
// to do: comment out unsupported privileges
// example: MyPrivilege |= XcpSkPrivCalPag; -> //MyPrivilege |= XcpSkPrivCalPag;
MyPrivilege |= XcpSkPrivCalPag;
MyPrivilege |= XcpSkPrivDaq;
MyPrivilege |= XcpSkPrivStim;
MyPrivilege |= XcpSkPrivPgm;
}
// privileges
const BYTE XcpSkPrivCalPag = 0x01; // Calibration & Page Mngmnt privilege
const BYTE XcpSkPrivDaq = 0x04; // Acquisition privilege
const BYTE XcpSkPrivStim = 0x08; // Stimulation privilege
const BYTE XcpSkPrivPgm = 0x10; // Programming privilege
获取可用权限
EXTERN_C __declspec(dllexport) TXcpSkExtFncRet __cdecl XCP_GetAvailablePrivileges(BYTE *privilege)
{
// check input parameter
// set available privileges
}
然后发送获取种子并进行比较,并返回KEY值:
EXTERN_C __declspec(dllexport) TXcpSkExtFncRet __cdecl XCP_ComputeKeyFromSeed(BYTE privilege,
BYTE byteLenSeed, BYTE *seed,
BYTE *byteLenKey, BYTE *key)
{
// check input parameter
// unsupported privilege request
// check key length
// compute key for respective privilege
}
注意:这两个函数是CANape给的标准接口函数
EXTERN_C __declspec(dllexport) TXcpSkExtFncRet __cdecl XCP_GetAvailablePrivileges(BYTE *privilege)
EXTERN_C __declspec(dllexport) TXcpSkExtFncRet __cdecl XCP_ComputeKeyFromSeed(BYTE privilege,
BYTE byteLenSeed, BYTE *seed,
BYTE *byteLenKey, BYTE *key)