⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interf.cpp

📁 一种的著名的加解密算法ssf43. 国家密码管理委员会办公室批准的用于WLAN的SSF43对称分组加密算法.
💻 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 + -