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

📄 gen_mac.c

📁 秀山在线影院本程序授权普通用户免费使用.适用范围:远程教育视频点播视频教育音乐欣赏等 如果您做为商业用途,请支持程序的发展购买商业版系统.您将获得更加完善的服务. 本次发布的版本为正式完美版本
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h> 
 
#define FIRST	1
#define MID		2
#define LAST	3
#define ONLY	4

#define SUCCESS 0
#define MAX_TEXT_LEN                2048 


unsigned char  g_tempenkey[128] ;

unsigned short    Gen_MAC(unsigned short  status,unsigned char *msg_text,unsigned short msg_size,
		unsigned char *mac_text,unsigned char *save_buf);

int generate_soft_mac_core(unsigned short c_status,unsigned char *msg_text,unsigned short msg_size,
				unsigned char *hash_text, unsigned short *hash_size,unsigned short *save_buf);

void gen_i_enkey(unsigned char *inkey, unsigned char *enkey_array);
void cip(unsigned char *indata, unsigned char *outdata, unsigned char *key);
int  ecb_mac_proc(unsigned char *indata1,unsigned short indata1_blk,
                  unsigned char *outMAC,unsigned char *key);
void idea_uchar_to_ushort(
    unsigned char* inData,
    unsigned int inDataSize,
    unsigned short* outData);
void idea_ushort_to_uchar(
    unsigned short* inData,
    unsigned int inDataSize,
    unsigned char* outData);
unsigned short mul(unsigned short a, unsigned short b);
 


 
/*********************
!!!!!!!!!!!!!
**********************/
void idea_uchar_to_ushort(
    unsigned char* inData,
    unsigned int inDataSize,
    unsigned short* outData)
{
    unsigned int i,j,k;

    j = inDataSize/2;
    k = 0;

    for(i=0;i<j;i++){
        outData[i] = inData[k]*256 + inData[k+1];
        k += 2;
    }

    return;
}

/***********************
!!!!!!!!!!!!!!!
***********************/

void idea_ushort_to_uchar(
    unsigned short* inData,
    unsigned int inDataSize,
    unsigned char* outData)
{
    unsigned int i,j,k;

    j = inDataSize;
    k = 0;

    for(i=0;i<j;i++){
        outData[k++] = (unsigned char)(inData[i]/256);
        outData[k++] = (unsigned char)inData[i];
    }

    return;
}

/*******************
!!!!!!!!!!!!!
*******************/
void gen_i_enkey(unsigned char *inkey, unsigned char *enkey_array)

{
    unsigned short t_inkey[8],t_enkey_array[56];
    short i,k;
    unsigned short *p;

        idea_uchar_to_ushort(inkey,16,t_inkey);
  
        k = 0;
        for(i=0;i<8;i++){
           t_enkey_array[k++] = t_inkey[i];
        }

        p = t_enkey_array;
        for(i=0;i<6;i++){
            t_enkey_array[k++] = (p[1] << 9) | (p[2] >> 7); /*  0 */
            t_enkey_array[k++] = (p[2] << 9) | (p[3] >> 7); /*  1 */
            t_enkey_array[k++] = (p[3] << 9) | (p[4] >> 7); /*  2 */
            t_enkey_array[k++] = (p[4] << 9) | (p[5] >> 7); /*  3 */
            t_enkey_array[k++] = (p[5] << 9) | (p[6] >> 7); /*  4 */
            t_enkey_array[k++] = (p[6] << 9) | (p[7] >> 7); /*  5 */
            t_enkey_array[k++] = (p[7] << 9) | (p[0] >> 7); /*  6 */
            t_enkey_array[k++] = (p[0] << 9) | (p[1] >> 7); /*  7 */
            p = p + 8;
        }

        idea_ushort_to_uchar(t_enkey_array,k,enkey_array);

        return;
}
 
 
/*********************
!!!!!!!!!!!!!!!!!!
**********************/
void cip(unsigned char *indata, unsigned char *outdata, unsigned char *key)
{
    unsigned short t_indata[4],t_outdata[4],t_key[64];
    unsigned short x1,x2,x3,x4,t1,t2,x5;
    unsigned short *p,i;

        idea_uchar_to_ushort(indata,8,t_indata);
        idea_uchar_to_ushort(outdata,8,t_outdata);
        idea_uchar_to_ushort(key,52+52,t_key);

        p = t_key;
        x1 = t_indata[0];
        x2 = t_indata[1];
        x3 = t_indata[2];
        x4 = t_indata[3];
        for(i=0;i<8;i++){
            x1 = mul(x1,p[0]);
            x2 = x2 + p[1];
            x3 = x3 + p[2];
            x4 = mul(x4,p[3]);
			x5=x1^x3;
            t2 = mul(x5,p[4]);
            t1 = t2 + (x2^x4);
            t1 = mul(t1,p[5]);
            t2 = t1 + t2;
            x1 = x1 ^ t1;
            x4 = x4 ^ t2;

            t2 = t2 ^ x2;
            x2 = x3 ^ t1;
            x3 = t2;

            p = p + 6;
        }

        t_outdata[0] = mul(x1,p[0]);
        t_outdata[1] = x3 + p[1];
        t_outdata[2] = x2 + p[2];
        t_outdata[3] = mul(x4,p[3]);

        idea_ushort_to_uchar(t_outdata,4,outdata);

        return;
}

unsigned short mul(unsigned short a, unsigned short b)
{
    unsigned long lx;
    unsigned short low,high,x;

        if(a){
            if(b){
                lx = a;
                lx = lx*b;
		        low = (unsigned short)lx;
		        high = (unsigned short)(lx >>16);
                x = low - high;
                if(low < high){
                    x++;
                }
                return (unsigned short)x;
            }
            else{
                return (unsigned short)(1-a);
            }
        }
        else{
            return (unsigned short)(1-b);
        }
}
/********************
!!!!!!!!!!!!!
**********************/
int  ecb_mac_proc(unsigned char *indata1,unsigned short indata1_blk,
                  unsigned char *outMAC,unsigned char *key)
{
    unsigned short i,j,k;
    unsigned short tbuf[4],tbuf2[4];
    unsigned char  *inp;

        gen_i_enkey(key, g_tempenkey);

        inp = indata1;

        idea_uchar_to_ushort(outMAC,8,tbuf);
 
        j = indata1_blk;
        for(i=0;i<j;i++){
            idea_uchar_to_ushort(inp,8,tbuf2);
            for(k=0;k<4;k++){
                tbuf[k] ^= tbuf2[k];
            }
            cip((unsigned char*)tbuf, (unsigned char*)tbuf, g_tempenkey);
            inp = inp + 8;
        }

        idea_ushort_to_uchar(tbuf,4,outMAC);

        return 0;
}
 


/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*  Gen_MAC   !!!!!!!!!!!
*  return : 0 --- success, else --- failure
* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
unsigned short Gen_MAC(
	unsigned short  status,
	unsigned char *msg_text,
	unsigned short msg_size,
	unsigned char *mac_text,
	unsigned char *key)   /* 16 unsigned chars */
{
	 
	unsigned char    ret_val;
	unsigned short     o_len;
	 
	 
	unsigned short    hashormac = 2;
 

	if((status == MID) || (status == FIRST)) {
		if(msg_size != 2*MAX_TEXT_LEN) {
			return 0xc8;
		}
	}
	if((status == LAST) || (status == ONLY)) {
		if(msg_size > 2*MAX_TEXT_LEN) {
			return 0xc4;
		}
	}

	if((ret_val = generate_soft_mac_core(status,msg_text,
			msg_size,mac_text,&o_len,(unsigned short *)key)) !=0) {
	return ret_val;
	}
	return(0);
}



 
/*************************** 
!!!!!!!!!!!!!!!
/****************************/
int generate_soft_mac_core(unsigned short c_status,unsigned char *msg_text,unsigned short msg_size,
				unsigned char *hash_text, unsigned short *hash_size,unsigned short *save_buf)
{
	unsigned short    *inbuf;
 	int     i;
	unsigned short    *word_point, cfb_block=8;

	int pad_bytes,pad_zero_no;
	int first_sndword,tail_bytes,indata_len;
	unsigned char  last8bytes[100];
	unsigned short kd_buf[64];
	unsigned short *static_inbuf;
	static_inbuf=(unsigned short*)malloc(5100);
        inbuf = static_inbuf;
	 
    memcpy(kd_buf,save_buf,64);
	
	switch(c_status) {
	    case 1:
		if(msg_size != (MAX_TEXT_LEN + MAX_TEXT_LEN)) {
			free(static_inbuf);
			return(0xc3);
		}
		memset(save_buf+32,0,64);
		ecb_mac_proc((unsigned char*)msg_text,(unsigned short)(MAX_TEXT_LEN/4),
                  (unsigned char*)(save_buf+32),(unsigned char*)(kd_buf+8));
		break;

	    case 2:
		if(msg_size != (MAX_TEXT_LEN + MAX_TEXT_LEN)) {
			free(static_inbuf);
			return(0xc3);
		}
		ecb_mac_proc((unsigned char*)msg_text,(unsigned short)(MAX_TEXT_LEN/4),
            (unsigned char*)(save_buf+32),(unsigned char*)(kd_buf+8));

		break;

	    case 3:
		if(msg_size > (MAX_TEXT_LEN + MAX_TEXT_LEN)) {
			free(static_inbuf);
			return(0xc4);
		}
		cfb_block = 8;
                memcpy(hash_text,save_buf+32,8);
		pad_bytes = cfb_block - (msg_size % cfb_block);
		pad_zero_no = pad_bytes - 1;

		tail_bytes = msg_size;
		first_sndword = tail_bytes >> 1;

		inbuf[0]=1+((tail_bytes+pad_bytes) >>1);
		word_point = (unsigned short *)msg_text;
		for(i=0;i<first_sndword;i++)
			inbuf[i+2] = word_point[i];

		if((tail_bytes % 2) ==1) {
			last8bytes[0]=msg_text[msg_size - 1];
			last8bytes[1]=1;
			for(i=0;i<pad_zero_no;i++)
				last8bytes[i+2]=0;
		}
		else {
			last8bytes[0]=1;
			for(i=0;i<pad_zero_no;i++)
				last8bytes[i+1]=0;
		}

		indata_len=(pad_bytes+1) >> 1;
		word_point = (unsigned short *)last8bytes;
		for(i=0;i<indata_len;i++)
			inbuf[i+2+first_sndword] = word_point[i];
		ecb_mac_proc((unsigned char*)&inbuf[2],(unsigned short)((inbuf[0]-1)/4),
              (unsigned char*)hash_text,(unsigned char*)(kd_buf+8));

		break;

	    case 4:
		if(msg_size > (MAX_TEXT_LEN + MAX_TEXT_LEN)) {
			free(static_inbuf);
			return(0xc4);
		}
		
		cfb_block = 8;
		memset(hash_text,0,8);
		pad_bytes = cfb_block - (msg_size % cfb_block);
		pad_zero_no = pad_bytes - 1;

		tail_bytes = msg_size;
		first_sndword=tail_bytes >> 1;

		inbuf[0]=1+((tail_bytes + pad_bytes) >>1);
		
		word_point = (unsigned short *)msg_text;
		for(i=0;i<first_sndword;i++)
			inbuf[i+2] = word_point[i];

		if((tail_bytes % 2) ==1) {
			last8bytes[0]=msg_text[msg_size - 1];
			last8bytes[1]=1;
			for(i=0;i<pad_zero_no;i++)
				last8bytes[i+2]=0;
		}
		else {
			last8bytes[0]=1;
			for(i=0;i<pad_zero_no;i++)
				last8bytes[i+1]=0;
		}

		indata_len=(pad_bytes+1) >> 1;
		word_point = (unsigned short *)last8bytes;
		for(i=0;i<indata_len;i++)
			inbuf[i+2+first_sndword] = word_point[i];

		ecb_mac_proc((unsigned char*)&inbuf[2],(unsigned short)((inbuf[0]-1)/4),
              (unsigned char*)hash_text,(unsigned char*)(kd_buf+8));
		break;
	    default:
			free(static_inbuf);
		return(0Xff);
	}
	free(static_inbuf);
	return 0;
}

 
 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -