📄 interf.cpp
字号:
/* *****************************************************************************
* interf.c - define the WPI interface
*
* Copyright (c) 2004, Wellhope Corporation. All rights reserved.
*
* ------------------------------------------------------------------------------
* RELEASE:
*
* AUTHOR:
* ------------------------------------------------------------------------------
* PURPOSE:
* Defines the WPI interface
*
*
*
* ------------------------------------------------------------------------------
* REVISED HISTORY:
*
*
*
***************************************************************************** */
#include <string.h>
#include <stdlib.h>
#include "interf.h"
#include "global.h"
#include "ssf43.h"
int g_SetKey_Flag=FALSE;
/* *****************************************************************************
*【函数原型】:int wh_wpi_setKey(LPBYTE pbInitialKey,LPBYTE pbLoopKey);
*【功能说明】:生成加解密密钥或完整性校验密钥,以及进行密码算法的自检性工作。
*【参数说明】:
* [IN] pbInitialKey 16个字节的初始密钥缓冲区首地址。
* [OUT] pbLoopKey: 160个字节的加密密钥或完整性校验密钥初始化结果缓
* 冲区首地址。
*【调用函数】:void en_key_ssf43(bit8 *m_key, bit32 *g_key)
*【函数返回】:=0 成功。
<0 失败,返回错误代码。
***************************************************************************** */
int wh_wpi_setKey(LPBYTE pbInitialKey,LPBYTE pbLoopKey)
{
bit32* p1;
p1=(bit32*)pbLoopKey;
en_key_ssf43(pbInitialKey,p1);
pbLoopKey=(LPBYTE)p1;
g_SetKey_Flag=TRUE;
return 0;
}
/* *****************************************************************************
*【函数原型】:
int wh_wpi_encrypt(LPBYTE pbMSDUPlain,ULONG ulMSDUPlainLen,LPBYTE pbPackageNumber,
LPBYTE pbCipherLoopKey,LPBYTE pbMSDUCipher,ULONG* pulMSDUCipherLen);
*【功能说明】:生成加解密密钥或完整性校验密钥,以及进行密码算法的自检性工作。
*【参数说明】:
* [IN] pbInitialKey 16个字节的初始密钥缓冲区首地址。
* [OUT] pbLoopKey: 160个字节的加密密钥或完整性校验密钥初始化结果缓
* 冲区首地址。
*【调用函数】:void cipher_ssf43(bit32 *g_key, bit8 *in, bit8 *out)
*【函数返回】:=0 成功。
<0 失败,返回错误代码。
***************************************************************************** */
int wh_wpi_encrypt(LPBYTE pbMSDUPlain,ULONG ulMSDUPlainLen,LPBYTE pbPackageNumber,
LPBYTE pbCipherLoopKey,LPBYTE pbMSDUCipher,ULONG* pulMSDUCipherLen)
{
unsigned int i,j;
ULONG inlength,residual;
bit32* enkey=NULL;
//bit8 inbuffer[128];
//bit8 outbuffer[128];
bit8* inbuff=NULL;
bit8* outbuff=NULL;
bit8* intemp=NULL;
bit8* outtemp=NULL;
inlength=ulMSDUPlainLen/16;
residual=ulMSDUPlainLen%16;
if(residual!=0)
inlength++;
*pulMSDUCipherLen=inlength*16;
//pbMSDUCipher=new BYTE[inlength*16];
pbMSDUCipher=malloc((int)(inlength*16));
if(pbMSDUCipher==NULL)
return WPI_ERROR_UNEXPECTED;
inbuff=pbMSDUPlain;
outbuff=pbMSDUCipher;
enkey=(bit32*)pbCipherLoopKey;
intemp=pbPackageNumber;
//outtemp=new BYTE[16];
outtemp=malloc(16);
if(outtemp==NULL)
return WPI_ERROR_UNEXPECTED;
cipher_ssf43(enkey,intemp,outtemp);
for(i=0;i<16;i++)
{
//inbuffer[i]=inbuff[i];
//outbuffer[i]=inbuffer[i]^outtemp[i];
//outbuff[i]=outbuffer[i];
outbuff[i]=inbuff[i]^outtemp[i];
}
inbuff+=16;
outbuff+=16;
for(j=1;j<inlength-1;j++)
{
intemp=outtemp;
cipher_ssf43(enkey,intemp,outtemp);
for(i=0;i<16;i++)
{
//inbuffer[i]=inbuff[i];
//outbuffer[i]=inbuffer[i]^outtemp[i];
//outbuff[i]=outbuffer[i];
outbuff[i]=inbuff[i]^outtemp[i];
}
inbuff+=16;
outbuff+=16;
}
if(residual==0)
{
intemp=outtemp;
cipher_ssf43(enkey,intemp,outtemp);
for(i=0;i<16;i++)
{
//inbuffer[i]=inbuff[i];
//outbuffer[i]=inbuffer[i]^outtemp[i];
//outbuff[i]=outbuffer[i];
outbuff[i]=inbuff[i]^outtemp[i];
}
}
else
{
intemp=outtemp;
cipher_ssf43(enkey,intemp,outtemp);
for(i=0;i<residual;i++)
{
//inbuffer[i]=inbuff[i];
//outbuffer[i]=inbuffer[i]^outtemp[i];
//outbuff[i]=outbuffer[i];
outbuff[i]=inbuff[i]^outtemp[i];
}
for(i=residual;i<16;i++)
{
//inbuffer[i]=inbuff[i];
//outbuffer[i]=inbuffer[i]^outtemp[i];
//outbuff[i]=outbuffer[i];
outbuff[i]=outtemp[i];
}
}
//delete outtemp;
free(outtemp);
return 0;
}
/* *****************************************************************************
*【函数原型】:
int wh_wpi_encrypt(LPBYTE pbMSDUPlain,ULONG ulMSDUPlainLen,LPBYTE pbPackageNumber,
LPBYTE pbCipherLoopKey,LPBYTE pbMSDUCipher,ULONG* pulMSDUCipherLen);
*【功能说明】:生成加解密密钥或完整性校验密钥,以及进行密码算法的自检性工作。
*【参数说明】:
* [IN] pbInitialKey 16个字节的初始密钥缓冲区首地址。
* [OUT] pbLoopKey: 160个字节的加密密钥或完整性校验密钥初始化结果缓
* 冲区首地址。
*【调用函数】:void en_key_ssf43(bit8 *m_key, bit32 *g_key)
*【函数返回】:=0 成功。
<0 失败,返回错误代码。
***************************************************************************** */
int wh_wpi_decrypt(LPBYTE pbMSDUCipher,ULONG ulMSDUCipherLen,LPBYTE pbPackageNumber,
LPBYTE pbCipherLoopKey,LPBYTE pbMSDUPlain,ULONG* pulMSDUPlainLen)
{
unsigned int i,j;
ULONG inlength;
bit32* enkey=NULL;
//bit8 inbuffer[128];
//bit8 outbuffer[128];
bit8* inbuff=NULL;
bit8* outbuff=NULL;
bit8* intemp=NULL;
bit8* outtemp=NULL;
inlength=ulMSDUCipherLen/16;
*pulMSDUPlainLen=ulMSDUCipherLen;
//pbMSDUPlain=new BYTE[ulMSDUCipherLen];
pbMSDUPlain=malloc((int)(ulMSDUCipherLen));
if(pbMSDUPlain==NULL)
return WPI_ERROR_UNEXPECTED;
inbuff=pbMSDUCipher;
outbuff=pbMSDUPlain;
de_key_ssf43((bit32*)pbCipherLoopKey,enkey);
intemp=pbPackageNumber;
//outtemp=new BYTE[16];
outtemp=malloc(16);
if(outtemp==NULL)
return WPI_ERROR_UNEXPECTED;
cipher_ssf43(enkey,intemp,outtemp);
for(i=0;i<16;i++)
{
//inbuffer[i]=inbuff[i];
//outbuffer[i]=inbuffer[i]^outtemp[i];
//outbuff[i]=outbuffer[i];
outbuff[i]=inbuff[i]^outtemp[i];
}
inbuff+=16;
outbuff+=16;
for(j=1;j<inlength;j++)
{
intemp=outtemp;
cipher_ssf43(enkey,intemp,outtemp);
for(i=0;i<16;i++)
{
//inbuffer[i]=inbuff[i];
//outbuffer[i]=inbuffer[i]^outtemp[i];
//outbuff[i]=outbuffer[i];
outbuff[i]=inbuff[i]^outtemp[i];
}
inbuff+=16;
outbuff+=16;
}
//delete outtemp;
free(outtemp);
return 0;
}
/* *****************************************************************************
*【函数原型】:
int wh_wpi_encrypt(LPBYTE pbMSDUPlain,ULONG ulMSDUPlainLen,LPBYTE pbPackageNumber,
LPBYTE pbCipherLoopKey,LPBYTE pbMSDUCipher,ULONG* pulMSDUCipherLen);
*【功能说明】:生成加解密密钥或完整性校验密钥,以及进行密码算法的自检性工作。
*【参数说明】:
* [IN] pbInitialKey 16个字节的初始密钥缓冲区首地址。
* [OUT] pbLoopKey: 160个字节的加密密钥或完整性校验密钥初始化结果缓
* 冲区首地址。
*【调用函数】:void en_key_ssf43(bit8 *m_key, bit32 *g_key)
*【函数返回】:=0 成功。
<0 失败,返回错误代码。
***************************************************************************** */
int wh_wpi_getMIC(LPBYTE pbWPIPackage,ULONG ulWPIPackageLen,LPBYTE pbPackageNumber,
LPBYTE pbMICLoopKey,LPBYTE pbWPIMIC)
{
unsigned int i,j;
ULONG WPIPlength,residual;
bit32* enkey=NULL;
//bit8 inbuffer[128];
//bit8 outbuffer[128];
bit8* inbuff=NULL;
//bit8* outbuff=NULL;
bit8* intemp=NULL;
bit8* outtemp=NULL;
WPIPlength=ulWPIPackageLen/16;
residual=ulWPIPackageLen%16;
enkey=(bit32*)pbMICLoopKey;
inbuff=pbWPIPackage;
//outbuff=pbMSDUCipher;
intemp=pbPackageNumber;
//outtemp=new BYTE[16];
outtemp=malloc(16);
if(outtemp==NULL)
return WPI_ERROR_UNEXPECTED;
cipher_ssf43(enkey,intemp,outtemp);
for(j=0;j<WPIPlength;j++)
{
for( i=0;i<16;i++)
intemp[i]=outtemp[i]^inbuff[i];
inbuff+=16;
cipher_ssf43(enkey,intemp,outtemp);
}
pbWPIMIC=outtemp;
if(residual!=0)
{
for(i=0;i<residual;i++)
intemp[i]=outtemp[i]^inbuff[i];
for(i=residual;i<16;i++)
intemp[i]=outtemp[i];
cipher_ssf43(enkey,intemp,outtemp);
}
pbWPIMIC=outtemp;
return 0;
}
/* *****************************************************************************
*【函数原型】:
int wh_wpi_encrypt(LPBYTE pbMSDUPlain,ULONG ulMSDUPlainLen,LPBYTE pbPackageNumber,
LPBYTE pbCipherLoopKey,LPBYTE pbMSDUCipher,ULONG* pulMSDUCipherLen);
*【功能说明】:生成加解密密钥或完整性校验密钥,以及进行密码算法的自检性工作。
*【参数说明】:
* [IN] pbInitialKey 16个字节的初始密钥缓冲区首地址。
* [OUT] pbLoopKey: 160个字节的加密密钥或完整性校验密钥初始化结果缓
* 冲区首地址。
*【调用函数】:void en_key_ssf43(bit8 *m_key, bit32 *g_key)
*【函数返回】:=0 成功。
<0 失败,返回错误代码。
***************************************************************************** */
int wh_wpi_verifyMIC(LPBYTE pbWPIPackage,ULONG ulWPIPackageLen,LPBYTE pbPackageNumber,
LPBYTE pbMICLoopKey,LPBYTE pbWPIMIC)
{
bit8 getWPIMIC[16];
strcpy(getWPIMIC,pbWPIMIC);
wh_wpi_getMIC(pbWPIPackage,ulWPIPackageLen,pbPackageNumber,
pbMICLoopKey,pbWPIMIC);
if(strcmp(getWPIMIC,pbWPIMIC)==0)
return 0;
else
return WPI_ERROR_UNEXPECTED;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -