亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? authcavefunc.c

?? 在cdma2000移動通信系統中空中接口部分使用CAVE進行身份認證。
?? C
?? 第 1 頁 / 共 2 頁
字號:
/**********************************************************
 *  @Copyright (C)   GDT  2002/07/10   		          
 *  @Author 	  姓名:李建彬    付權(fq@mail.ndsc.com.cn)                    
 *                      cavefunc.c                        
 *  @Description:                                         
 *     本文件中主要包括鑒權模塊需要用到的CAVE算法,包括CA 
 *  VE算法、A_key的產生及其校驗、SSD的產生和更新、鑒權響應
 *  的計算、CMEA加密鍵和VPM的產生。                       
 *                                                        
 *  主要修改1:                                           
***********************************************************/

//#include "vxWorks.h"
#include <stdio.h>
//#include "authcaveinternal.h" 
#include "userareastruct_inhlr.h" 
#include "map_optsavearea.h"
#include "auth_macro.h"
#include "hlroamglobal.h"

/*-------------------------------------------------------------
             CAVE算法相關用戶數據初始化
初始化內容:CURRENT_ESN[4]、A_key[8]、CURRENT_AAV、SSD_A、SSD_B、
--------------------------------------------------------------*/
void cave_init(U16 optID,U8 LocalType)
{
	U8	i;
	U32	*pCURRENT_ESN;
	SUBSCRIBERINHLR *pUserDataHlr;
	SUBSCRIBERINVLR *pUserDataVlr;

	pUserDataVlr=NULL;
	pUserDataHlr=NULL;

	#ifdef _AUTH_DEBUG
       printf("執行cave_init()函數 !\n");
       #endif 

	if(LocalType==LOCALTYPEAC)
	{
		pUserDataHlr=(SUBSCRIBERINHLR *)((OptManageTabPtr+optID)->ptr_userarea);

        if (pUserDataHlr==NULL)
        {
            	    #ifdef _AUTH_DEBUG
		    printf("用戶數據區指針為空,CAVE數據初始化失敗!\n");
		    #endif
		    
		    return ;
        }
        
		/*Init CURRENT_ESN[4]*/
		pCURRENT_ESN=(U32 *)&CURRENT_ESN[0];
		*pCURRENT_ESN=pUserDataHlr->AssocACPoint->UIMNo;

		/*Init A_key[8]*/
		for(i=0;i<8;i++)
		{
			A_key[i]=pUserDataHlr->AssocACPoint->A_key[i];
		}

		/*Init CURRENT_AAV*/
		CURRENT_AAV=pUserDataHlr->AssocACPoint->AAV;

		#ifdef _AUTH_DEBUG_CAVE
	       printf("AAV=%2x !\n",CURRENT_AAV);
		#endif

		/*Init SSD_A、SSD_B*/
		for(i=0;i<8;i++)
		{
			SSD_A[i]=pUserDataHlr->AssocACPoint->SSD_A[i];
			SSD_B[i]=pUserDataHlr->AssocACPoint->SSD_B[i];
		}
		#ifdef _AUTH_DEBUG
		printf("AC CAVE 初始化完成!\n");
		#endif
		
	}
	else if(LocalType==LOCALTYPEVLR)
	{
		pUserDataVlr=(SUBSCRIBERINVLR *)((OptManageTabPtr+optID)->ptr_userarea);

        if (pUserDataVlr==NULL)
        {
            	    #ifdef _AUTH_DEBUG
		    printf("用戶數據區指針為空,CAVE數據初始化失敗!\n");
		    #endif
		    
		    return ;
        }
        
		/*Init CURRENT_ESN[4]*/
	        pCURRENT_ESN=(U32 *)&CURRENT_ESN[0];
		*pCURRENT_ESN=pUserDataVlr->ESN;

		/*Init CURRENT_AAV*/
		CURRENT_AAV=pUserDataVlr->AuthParaPoint->AAV;

		#ifdef _AUTH_DEBUG_CAVE
	        printf("AAV=%2x !\n",CURRENT_AAV);
		#endif

		/*Init SSD_A、SSD_B*/
		for(i=0;i<8;i++)
		{
			SSD_A[i]=pUserDataVlr->AuthParaPoint->SSD_A[i];
			SSD_B[i]=pUserDataVlr->AuthParaPoint->SSD_B[i];
		}
		#ifdef _AUTH_DEBUG
		printf("VLR CAVE 初始化完成!\n");
		#endif
	}
	else
	{
		#ifdef _AUTH_DEBUG
		printf("傳遞的參數LocalType錯,CAVE數據初始化失敗!\n");
		#endif
	}

      #ifdef _AUTH_DEBUG_CAVE1
	CURRENT_ESN[0]=0XD7;
	CURRENT_ESN[1]=0X5A;
	CURRENT_ESN[2]=0X96;
	CURRENT_ESN[3]=0XEC;

	CURRENT_AAV=0XC7;
	
	SSD_A[0]=0XCC;
	SSD_A[1]=0X38;
	SSD_A[2]=0X12;
	SSD_A[3]=0X94;
	SSD_A[4]=0X9F;
	SSD_A[5]=0X4D;
	SSD_A[6]=0XCD;
	SSD_A[7]=0X0D;
	SSD_B[0]=0X31;
	SSD_B[1]=0X05;
	SSD_B[2]=0X02;
	SSD_B[3]=0X34;
	SSD_B[4]=0X58;
	SSD_B[5]=0X0E;
	SSD_B[6]=0X63;
	SSD_B[7]=0XB4;
      #endif
	
	
	return;
}

/*---------------------------------------------------
                      鑒權算法                      
----------------------------------------------------*/

static U8 bit_val(const U8 octet, const int bit)
{
	return((octet << (7 - bit)) & 0x80);
}

static void LFSR_cycle(void)
{
	U8 temp;
	int i;

	temp = bit_val(LFSR_B,6); 
	temp ^= bit_val(LFSR_D,2);
	temp ^= bit_val(LFSR_D,1);
	temp ^= bit_val(LFSR_D,0);

	/* Shift right LFSR, Discard LFSR_D[0] bit */
	for (i = 3; i > 0; i--)
	{
		LFSR[i] >>= 1;
		if (LFSR[i-1] & 0x01)
			LFSR[i] |= 0x80;
	}
	LFSR_A >>= 1;
	LFSR_A |= temp;

	return;
}

static void Rotate_right_Registers(void)
{
	int i;
	unsigned int temp_reg;

	temp_reg = Register[15]; /* save lsb */
	for (i = 15; i > 0; i--)
	{
		Register[i] >>= 1;
		if (Register[i-1] & 0x01)
			Register[i] |= 0x80;
	} 
	Register[0] >>= 1; 
	if (temp_reg & 0x01)
	Register[0] |= 0x80; 
	return;
} 

void CAVE(const int number_of_rounds,int *offset_1,int *offset_2)
{ 
	U8 temp_reg0;
	U8 lowNibble;
	U8 hiNibble;
	U8 temp;
	int round_index;
	int R_index;
	int fail_count;
	U8 T[16];

	#ifdef _AUTH_DEBUG
	printf("執行CAVE算法!\n");
	#endif

	for (round_index = number_of_rounds - 1;round_index >= 0;round_index--)
	{ 
		/* save R0 for reuse later */
		temp_reg0 = Register[0];
		for (R_index = 0; R_index < 16; R_index++) 
		{ 
			fail_count = 0;
			while(1)
			{
				*offset_1 += (LFSR_A ^ Register[R_index]);
				/* will overflow; mask to prevent */ 
				*offset_1 &= 0xff; 
				lowNibble = map_SmpGlbVarPtr->CaveTable[*offset_1] & LOMASK;
				if (lowNibble == (Register[R_index] & LOMASK))
				{
					LFSR_cycle();
					fail_count++;
					if (fail_count == 32)
					{
						LFSR_D++; /* no carry to LFSR_C */
						break;
					}
				}
				else 
					break;
			}

			while(1) 
			{
				*offset_2 += (LFSR_B ^ Register[R_index]);

				/* will overflow; mask to prevent */ 
				*offset_2 &= 0xff;
				hiNibble = map_SmpGlbVarPtr->CaveTable[*offset_2] & HIMASK;
				if (hiNibble == (Register[R_index] & HIMASK))
				{
					LFSR_cycle();
					fail_count++; 
					if (fail_count == 32)
					{
						LFSR_D++; /* no carry to LFSR_C */
						break;
					} 
				} 
				else 
					break;
			}

			temp = lowNibble | hiNibble;
			if (R_index == 15) 
			Register[R_index] = temp_reg0 ^ temp;
			else 
			Register[R_index] = Register[R_index+1] ^ temp;
			LFSR_cycle();
		}

		Rotate_right_Registers(); 

		/* shuffle the mixing Registers */
		for (R_index = 0; R_index < 16; R_index++)
		{
			temp = map_SmpGlbVarPtr->CaveTable[16*round_index + R_index] & LOMASK;
			T[temp] = Register[R_index];
		} 
		for (R_index = 0; R_index < 16; R_index++)
		{
			Register[R_index] = T[R_index];
		}
	}
	return;
}

/*----------------------------------------------
             A_Key校驗和的產生  
----------------------------------------------*/
void mul10(unsigned char i64[8], unsigned int carry)
{ 
	int i; 
	unsigned int temp; 

	for (i = 7; i >= 0; i--) 
	{ 
		temp = ((unsigned int)(i64[i]) * 10) + carry; 
		i64[i] = temp & 0xFF;
		carry = temp >> 8;
	} 
	return;
} 

unsigned long Calc_Checksum(const unsigned char A_key[8])
{
	int i,offset_1,offset_2;
	unsigned long A_key_checksum; 

	/* see if 32 MSB are zero */ 
	if ((A_key[0] | A_key[1] | A_key[2] | A_key[3]) != 0)
	{ 
		/* put 32 MSB into LFSR */ 
		for (i = 0; i < 4; i++) 
			LFSR[i] = A_key[i]; 
	} 
	else
	{ 
		/* put CURRENT_ESN into LFSR */ 
		for (i = 0; i < 4; i++) 
			LFSR[i] = CURRENT_ESN[i]; 
	}

	/* put A_key into r0-r7 */
	for (i = 0; i < 8; i++) 
		Register[i] = A_key[i]; 
	Register[8] = CURRENT_AAV; 

	/* put ls 24 bits of A_key into r9-r11 */
	for (i = 9; i < 12; i++)
		Register[i] = A_key[5+i-9]; 

	/* put CURRENT_ESN into r12-r15 */ 
	for (i = 12; i < 16; i++)
		Register[i] = CURRENT_ESN[i-12]; 
	offset_1 = offset_2 = 128;
	CAVE(8, &offset_1, &offset_2);
	A_key_checksum = (((unsigned long)(Register[0] ^ Register[13]) << 16) + 
					  ((unsigned long)(Register[1] ^ Register[14]) << 8) + 
					  ((unsigned long)(Register[2] ^ Register[15]))) & 0x3ffff; 
	
	return (A_key_checksum);
} 

/* A_KEY_DIGITS contains the ASCII digits in the order to be entered */
void A_Key_Checksum(const char A_KEY_DIGITS[20],char A_KEY_CHECKSUM[6])
{ 
	int i; 
	unsigned char temp_A_key[8];
	unsigned long A_key_checksum; 

	/* convert digits to 64-bit representation in temp_A_key */ 
	for (i = 0; i < 8; i++) 
		temp_A_key[i] = 0;
	for (i = 0; i < 20; i++) 
	{ 
		mul10(temp_A_key,(unsigned int)(A_KEY_DIGITS[i] - '0'));
	} 
	A_key_checksum = Calc_Checksum(temp_A_key);

	/* convert checksum to decimal digits */ 
	for (i = 0; i < 6; i++)
	{ 
		A_KEY_CHECKSUM[5-i] = '0' + (char)(A_key_checksum % 10); 
		A_key_checksum /= 10; 
	} 
	return;
}

/*--------------------------------------------------------------        
                          A_Key的校驗
--------------------------------------------------------------*/ 
int A_Key_Verify(const char A_KEY_DIGITS[26]) 
{ 
	int i; 
	unsigned char temp_A_key[8]; 
	unsigned long entered_checksum; 

	/* convert first 20 digits to 64-bit representation in temp_A_key */ 
	for (i = 0; i < 8; i++) 
		temp_A_key[i] = 0; 

	for (i = 0; i < 20; i++)
	{ 
		mul10(temp_A_key,(unsigned int)(A_KEY_DIGITS[i] - '0')); 
	} 

	/* convert last 6 digits to entered checksum */ 
	entered_checksum = 0; 
	for (i = 20; i < 26; i++) 
	{ 
		entered_checksum = (entered_checksum * 10) + (A_KEY_DIGITS[i] - '0'); 
	} 

	if(Calc_Checksum(temp_A_key) == entered_checksum) 
	{
		for (i = 0; i < 8; i++)
		{ 
			A_key[i] = temp_A_key[i];
			SSD_A[i] = SSD_B[i] = 0;
		} 
		return TRUE;
	}
	else
	{ 
		return FALSE;
	} 
} 

/*------------------------------------------------
                  SSD的產生
------------------------------------------------*/
#ifdef _AUTH_DEBUG_CAVE1
	#define  SSD_GENERATION_ENTRY_PARA      unsigned char RANDSSD[7]
#else
	#define  SSD_GENERATION_ENTRY_PARA      const unsigned char RANDSSD[7]
#endif 

void SSD_Generation(const unsigned char RANDSSD[7]) 
{ 
     int i,offset_1,offset_2; 

     #ifdef _AUTH_DEBUG
     printf("執行SSD_Generation()函數 !\n");
     #endif 

     #ifdef _AUTH_DEBUG_CAVE1
        A_key[0]=0xc4;
	 A_key[1]=0x42;
	 A_key[2]=0xF5;
	 A_key[3]=0x6B;
	 A_key[4]=0xE9;
	 A_key[5]=0xE1;
	 A_key[6]=0x71;
	 A_key[7]=0x58;

	 RANDSSD[0]=0X4D;
	 RANDSSD[1]=0X18;
	 RANDSSD[2]=0XEE;
	 RANDSSD[3]=0XAA;
	 RANDSSD[4]=0X05;
	 RANDSSD[5]=0X89;
	 RANDSSD[6]=0X5C;
	
     #endif

     #ifdef _AUTH_DEBUG
     printf("\n");
     printf("RANDSSD=");
     for(i=0;i<7;i++)
     	  printf("%2x",RANDSSD[i]);
     printf("\n");

     printf("A_key=");
     for(i=0;i<8;i++)
     	  printf("%2x",A_key[i]);
     printf("\n");
     
     #endif
     
     for (i = 0; i < 4; i++) 
     { 
         LFSR[i] = RANDSSD[i+3] ^ A_key[i] ^ A_key[i+4]; 
     } 

     if ((LFSR[0] | LFSR[1] | LFSR[2] | LFSR[3]) == 0)
     { 
          for (i = 0; i < 4; i++) 
              LFSR[i] = RANDSSD[i+3]; 
     } 

     for (i = 0; i < 8; i++) 
         Register[i] = A_key[i]; 

     Register[8] = CURRENT_AAV; 

     for (i = 9; i < 12; i++) 
         Register[i] = RANDSSD[i-9]; 

     for (i = 12; i < 16; i++) 
         Register[i] =CURRENT_ESN[i-12]; 

     offset_1 = offset_2 = 128; 
     CAVE(8, &offset_1, &offset_2); 

     for (i = 0; i < 8; i++) 
     { 
         SSD_A_NEW[i] = Register[i]; 
         SSD_B_NEW[i] = Register[i+8]; 
     } 

     #ifdef _AUTH_DEBUG
     printf("SSD_A_NEW[i]=0x:");
     for(i=0;i<8;i++)
     	    printf("%2x ",SSD_A_NEW[i]);
     printf("\n");
     
     printf("SSD_B_NEW[i]=0x:");
     for(i=0;i<8;i++)
     	printf("%2x ",SSD_B_NEW[i]);
     printf("\n");
     
     #endif
     return;
} 

/*------------------------------------------------
                  SSD的更新
------------------------------------------------*/
/*void SSD_Update(void)
 { 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线国产亚洲欧美| 日韩欧美资源站| 777色狠狠一区二区三区| 亚洲精品一区二区精华| 亚洲激情欧美激情| 国产成人福利片| 欧美一区二区三区不卡| 亚洲天堂av老司机| 国产一区二区三区在线观看免费 | 一本到不卡精品视频在线观看| 国产精品1区二区.| 99riav一区二区三区| 欧美福利视频一区| 中文幕一区二区三区久久蜜桃| 亚洲午夜久久久久久久久电影院| 精品影院一区二区久久久| 成人av电影在线观看| 制服丝袜中文字幕亚洲| 中文字幕一区二区在线观看| 日本亚洲一区二区| 色综合天天做天天爱| 2020日本不卡一区二区视频| 亚洲最色的网站| 成人免费不卡视频| 欧美一二三区在线| 一区二区三区丝袜| 国产激情视频一区二区在线观看 | 欧美日韩高清一区| 国产精品理论片在线观看| 日韩精品电影在线观看| 99re这里只有精品6| 久久久另类综合| 久久国内精品自在自线400部| 99在线精品视频| 中文字幕在线不卡视频| 国产精品99久久久久久有的能看| 欧美精品一区二区三区蜜桃视频| 亚洲永久免费视频| 欧美日韩在线电影| 一区二区三区免费看视频| 美国欧美日韩国产在线播放| 日韩欧美一卡二卡| 人人狠狠综合久久亚洲| 日韩精品中文字幕一区二区三区 | 91视频com| 亚洲国产岛国毛片在线| 成人蜜臀av电影| 国产日韩欧美精品一区| 韩国av一区二区三区四区| 久久免费看少妇高潮| 久久精品国产亚洲aⅴ| 久久久久97国产精华液好用吗| 久久精品国产亚洲a| 国产日本亚洲高清| 高清成人在线观看| 亚洲靠逼com| 欧美影片第一页| 日韩美女视频一区二区| 欧美日韩国产另类一区| 日本伊人午夜精品| 国产欧美一区二区在线观看| 成人午夜电影网站| 五月婷婷久久综合| 日韩一区二区三区高清免费看看 | 九九视频精品免费| 久久精品亚洲麻豆av一区二区| 国产一区不卡视频| 欧美激情一区二区三区在线| 国产成人免费网站| 亚洲午夜视频在线观看| 欧美精品久久一区| 国产在线精品一区二区不卡了| 久久久天堂av| av电影天堂一区二区在线观看| 亚洲素人一区二区| 欧美日本在线一区| 久久成人免费网| 日本一区二区三区久久久久久久久不| 成人免费毛片高清视频| 日韩久久一区二区| 欧美性猛片aaaaaaa做受| 奇米四色…亚洲| 中文字幕不卡在线| 欧亚洲嫩模精品一区三区| 欧美aaaaa成人免费观看视频| 久久综合久久99| 色婷婷综合视频在线观看| 亚洲韩国一区二区三区| 精品对白一区国产伦| 色中色一区二区| 久久不见久久见免费视频1| 国产精品毛片无遮挡高清| 97久久超碰精品国产| 日韩不卡在线观看日韩不卡视频| 久久久91精品国产一区二区精品| 日本高清免费不卡视频| 国产麻豆欧美日韩一区| 亚洲成av人片一区二区梦乃| 国产天堂亚洲国产碰碰| 欧美日韩国产小视频在线观看| 国产精品综合在线视频| 亚洲成人在线免费| 2023国产精品视频| 欧美喷潮久久久xxxxx| 免费成人你懂的| 亚洲精品乱码久久久久久日本蜜臀| 欧美tk—视频vk| 欧美亚洲一区三区| 欧美精品少妇一区二区三区| 欧美激情一区二区三区在线| 日韩一区二区三区在线观看| 欧洲精品在线观看| 在线观看亚洲精品| 波多野洁衣一区| 成人一级片在线观看| 日韩av一二三| 一区二区欧美视频| 亚洲综合久久av| 中文字幕亚洲不卡| 亚洲男女一区二区三区| 日韩欧美国产1| 日韩美女在线视频| 91精品国产综合久久精品图片| 欧美日韩在线观看一区二区| 一本色道**综合亚洲精品蜜桃冫 | 日本一二三不卡| 日韩视频免费观看高清完整版在线观看 | 欧美三级在线看| 色综合久久久久网| 国产精品77777| 国产中文一区二区三区| 蜜臀99久久精品久久久久久软件| 亚洲电影第三页| 亚洲一区二区三区影院| 亚洲老妇xxxxxx| 一区二区日韩电影| 亚洲一二三级电影| 亚洲高清免费在线| 天天综合天天综合色| 亚洲成人动漫在线观看| 亚洲国产美国国产综合一区二区| 一区二区三区国产| 亚洲图片欧美一区| 一区二区三区四区蜜桃| 亚洲欧洲成人精品av97| 亚洲一区国产视频| 午夜精品久久久久久久蜜桃app| 亚洲主播在线观看| 伊人婷婷欧美激情| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲第一二三四区| 男女性色大片免费观看一区二区| 日本麻豆一区二区三区视频| 麻豆精品国产传媒mv男同 | 中文字幕日韩一区二区| 亚洲人成亚洲人成在线观看图片| 亚洲免费看黄网站| 一区二区三区在线视频观看58| 夜夜嗨av一区二区三区中文字幕| 亚洲卡通欧美制服中文| 日本午夜一区二区| 国产成人久久精品77777最新版本| 成人午夜av电影| 欧美日韩一区二区在线观看 | 99在线精品观看| 欧美日韩一级片网站| 日韩精品专区在线| 国产精品丝袜91| 亚洲韩国精品一区| 国产伦理精品不卡| 色婷婷av久久久久久久| 91.com视频| 国产精品国产自产拍在线| 亚洲国产精品一区二区久久恐怖片| 麻豆91精品91久久久的内涵| 成人一区二区三区| 在线成人高清不卡| 中文字幕电影一区| 日本午夜精品视频在线观看 | 一区二区三区视频在线看| 开心九九激情九九欧美日韩精美视频电影| 337p日本欧洲亚洲大胆精品| wwwwxxxxx欧美| 亚洲国产cao| 成人午夜视频网站| 日韩午夜激情视频| 亚洲欧美日韩国产中文在线| 强制捆绑调教一区二区| 91网站视频在线观看| 日韩女优av电影| 亚洲一区二区成人在线观看| 国产成人亚洲综合色影视| 欧美电影一区二区| 亚洲私人影院在线观看| 麻豆精品视频在线观看免费| 色综合久久中文综合久久97| 久久青草国产手机看片福利盒子| 一区二区三区欧美在线观看| 国产91清纯白嫩初高中在线观看| 日韩女优制服丝袜电影|