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

📄 authcavefunc.c

📁 在cdma2000移动通信系统中空中接口部分使用CAVE进行身份认证。
💻 C
📖 第 1 页 / 共 2 页
字号:
     int i; 
     for (i = 0; i < 8; i++) 
     { 
         SSD_A[i] = SSD_A_NEW[i]; 
         SSD_B[i] = SSD_B_NEW[i]; 
     } 
 }*/ 
void SSD_Update(U16 optID) 
{ 
	int i; 
	SUBSCRIBERINHLR *pUserData;
	
	pUserData=(SUBSCRIBERINHLR *)((OptManageTabPtr+optID)->ptr_userarea);

	//pUserData->AssocACPoint->SSD_ShareFlag=TRUE;
	#ifdef _AUTH_DEBUG
    	printf("用新SSD值更新AC 表中的SSD !\n");
    	#endif 
	
	for (i = 0; i < 8; i++) 
	{ 
		pUserData->AssocACPoint->SSD_A[i] = pUserData->AssocACPoint->AuthMda.SSD_A_NEW[i];
		pUserData->AssocACPoint->SSD_B[i] = pUserData->AssocACPoint->AuthMda.SSD_B_NEW[i]; 
	}
	return;
}

/*-----------------------------------------------------------
                  产生鉴权相关的响应   
-----------------------------------------------------------*/
unsigned long Auth_Signature(const unsigned char RAND_CHALLENGE[4],
			                 const unsigned char AUTH_DATA[3],
			                 const unsigned char *SSD_AUTH,
			                 const int SAVE_REGISTERS)
{ 
       int i,offset_1,offset_2;

	unsigned long AUTH_SIGNATURE;

    	#ifdef _AUTH_DEBUG
    	printf("执行auth_signature()函数 !\n");
   	#endif 

	for (i = 0; i < 4; i++) 
	{ 
		LFSR[i] = RAND_CHALLENGE[i] ^ SSD_AUTH[i] ^ SSD_AUTH[i+4];
	}

	if ((LFSR_A | LFSR_B | LFSR_C | LFSR_D) == 0)
	{
		for (i = 0; i < 4; i++)
		LFSR[i] = RAND_CHALLENGE[i];
	} 

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

	#ifdef _AUTH_DEBUG
	printf("CURRENT_AAV=%2x.\n",CURRENT_AAV);

	printf("AUTH_DATA=0X:");
	for(i=0;i<3;i++)
		printf("%2x ",AUTH_DATA[i]);
	printf("\n");

	printf("RAND_CHALLENGE=0X:");
	for(i=0;i<4;i++)
		printf("%2x",RAND_CHALLENGE[i]);
	printf("\n");
	
	#endif

	/* put AUTH_DATA into r9-r11 */ 
	for (i = 9; i < 12; i++)
	Register[i] = AUTH_DATA[i-9];

	/* put CURRENT_ESN into r12-r15 */
	for (i = 12; i < 16; i++)
	Register[i] = CURRENT_ESN[i-12]; 

	#ifdef _AUTH_DEBUG
	printf("CURRENT_ESN[4]=0x:");
	for(i=0;i<4;i++)
		printf("%2x.",CURRENT_ESN[i]);
	printf("\n");
	#endif
	
	offset_1 = offset_2 = 128; 
	CAVE(8, &offset_1, &offset_2); 

	AUTH_SIGNATURE =(((unsigned long)(Register[0] ^ Register[13]) << 16)+ 
					 ((unsigned long)(Register[1] ^ Register[14]) << 8)+ 
					 ((unsigned long)(Register[2] ^ Register[15]) )) &0x3ffff; 

	if (SAVE_REGISTERS) 
	{ 
		/* save LFSR and offsets */ 
		SAVED_OFFSET_1 = offset_1;
		SAVED_OFFSET_2 = offset_2;
		for (i = 0; i < 4; i++)
		{
			SAVED_LFSR[i] = LFSR[i];
			SAVED_RAND[i] = RAND_CHALLENGE[i]; 
			if (i < 3)
			{ 
				SAVED_DATA[i] = AUTH_DATA[i];
			} 
		} 
		#ifdef _AUTH_DEBUG
    		printf("保存产生AUTHR后的CAVE参数,for 产生加密密钥用 !\n");
    		#endif 
	} 
	return(AUTH_SIGNATURE); 
} 

/*--------------------------------------------------
         产生CMEA Key 和 VPM 
--------------------------------------------------*/ 
static void roll_LFSR(void) 
{
	int i; 

	LFSR_A = Register[0]; 
	LFSR_B = Register[1];
	LFSR_C = Register[14]; 
	LFSR_D = Register[15]; 

	if ((LFSR_A | LFSR_B | LFSR_C | LFSR_D) == 0) 
	{ 
		for (i = 0; i < 4; i++) 
		LFSR[i] = SAVED_RAND[i]; 
	} 
	return;
} 

void Key_VPM_Generation(void) 
{ 
	int i,j,r_ptr,offset_1,offset_2,vpm_ptr; 

	#ifdef _AUTH_DEBUG
	printf("调用VPM/SMEKEY 产生函数!\n");
	#endif

	/* iteration 1, first pass through CAVE */ 
	for (i = 0; i < 4; i++)
	{
		LFSR[i] = SAVED_LFSR[i] ^ SSD_B[i] ^ SSD_B[i+4];
	}

	if ((LFSR_A | LFSR_B | LFSR_C | LFSR_D) == 0) 
	{ 
		for (i = 0; i < 4; i++) 
		{
			LFSR[i] = SAVED_RAND[i]; 
		}
	} 

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

	Register[8] = CURRENT_AAV;

	/* put SAVED_DATA into r9-r11 */
	for (i = 9; i < 12; i++) 
	{
		Register[i] = SAVED_DATA[i-9];
	}

	/* put ESN into r12-r15 */ 
	for (i = 12; i < 16; i++) 
	{
		Register[i] = CURRENT_ESN[i-12]; 
	}

	offset_1 = SAVED_OFFSET_1; 
	offset_2 = SAVED_OFFSET_2;

	CAVE(8, &offset_1, &offset_2); 

	/* iteration 2, generation of first CMEA key parameters */ 
	roll_LFSR(); 
	CAVE(4, &offset_1, &offset_2); 
	for (i = 0; i < 4; i++) 
	{
		cmeakey[i] = Register[i+4] ^ Register[i+8]; 
	}

	/* iteration 3, generation of second CMEA key parameters */ 
	roll_LFSR();
	CAVE(4, &offset_1, &offset_2);
	for (i = 4; i < 8; i++)
	{
		cmeakey[i] = Register[i] ^ Register[i+4];
	}

	#ifdef _AUTH_DEBUG
  	printf("产生的SMEKEY=:0X");
       for(i=0;i<8;i++)
    		printf("%2x",cmeakey[i]);
    	printf("\n");
       #endif

	/* iterations 4-13, generation of CURRENT_VPM */
	vpm_ptr = 0;
	for (i = 0; i < 10; i++)
	{ 
		roll_LFSR(); 
		CAVE(4, &offset_1, &offset_2); 
		for (r_ptr = 0; r_ptr < 6; r_ptr++) 
		{ 
			CURRENT_VPM[vpm_ptr] = Register[r_ptr+2] ^ Register[r_ptr+8];
			vpm_ptr++; 
		} 
	} 

	/* iteration 14, generation of last CURRENT_VPM bits */
	roll_LFSR(); 
	CAVE(4, &offset_1, &offset_2); 
	for (j = 0; j < 5; j++) 
	{ 
		CURRENT_VPM[vpm_ptr] = Register[j+2] ^ Register[j+8]; 
		vpm_ptr++; 
	} 
	return;
}

/*--------------------------------------------------
	产生CDMAPLCM(见017p1-物理层(上)-参考标准)  
--------------------------------------------------*/ 
void Cdmaplcm_Generation(void)
{
	U8  i;

	#ifdef _AUTH_DEBUG
       printf("产生CDMAPLCM 函数 !\n");
       #endif 

	//第42、41个bit置为01
	CdmaPLCM.val[0]=0x01;
	
	for (i=0;i<5;i++)
		CdmaPLCM.val[i+1]=CURRENT_VPM[60+i];

    	#ifdef _AUTH_DEBUG
    	printf("产生的CDMAPLCM=:0X");
   	for(i=0;i<6;i++)
    	  	printf("%2x",CdmaPLCM.val[i]);
    	printf("\n");
    	#endif
    	
	return;
}

/*---------------------------------
    从HLR的IMSI到MIN1的转换函数
---------------------------------*/
void HlrImsitoMin1(U8 *in ,U8 *out)
{
    U8  i;
    U8  Tbcd;
    U16 *p16;
    U16 R1,R2;
    U8  D[8];

    #ifdef _AUTH_DEBUG
    printf("执行HlrImsitoMin1() 函数 !\n");
    #endif 

    for (i=0;i<4;i++)
    {
    	if(pHlrGdt->pHlrGbDataTable->OamManager.DigOfImsi==15) 
    	{
			D[2*i]=(*(in+i+4))&0x0f;
			D[2*i+1]=((*(in+i+4))&0xf0)>>4;
    	}
    	else if(pHlrGdt->pHlrGbDataTable->OamManager.DigOfImsi==16) 
    	{
			D[2*i]=((*(in+i+4))&0xf0)>>4;
			D[2*i+1]=(*(in+i+5))&0x0f;
    	}
    	else
    	{
			#ifdef _AUTH_DEBUG
			printf("HLR OAMS 配置的IMSI数字个数非15和16!\n");
			#endif
    	}
    }

    for(i=0;i<7;i++)
    {
		if (D[i]==0)
		    D[i]=10;
    }
    /*
    for(i=4;i<7;i++)
    {
		if (D[i]==0)
		    D[i]=10;
    }
    */

    R1=100*D[0]+10*D[1]+D[2]-111;
    R2=100*D[4]+10*D[5]+D[6]-111;
    Tbcd=D[3];
	
    p16=(U16 *)out;  //R1的低10 bits+Tbcd+R2的低10bits付给M1N[3]
    *p16=R1<<6;

    p16=(U16 *)(out+1);
    *p16=((*(out+1) & 0xc0)|(Tbcd<<2));
    *p16=*p16<<8;
    *p16=*p16|R2;

    #ifdef _AUTH_DEBUG
    printf("\n");
    printf("MIN1=(24bit):0x");
    for(i=0;i<3;i++)
    	printf("%2x",*(out+i));
    printf("\n");
    #endif
    	
    return ;
}

/*--------------------------------------
    从HLR的IMSI到MIN2的转换函数
---------------------------------------*/
void HlrImsitoMin2 (U8 *in ,U8 *out)
{
    U8  i;
    U16 *p16;
    U16 R;
    U8  D[3];

    #ifdef _AUTH_DEBUG
    printf("执行HlrImsitoMin2() 函数 !\n");
    #endif 
  
    if(pHlrGdt->pHlrGbDataTable->OamManager.DigOfImsi==15)  //暂认为IMSI个数可能为15或16
	{
		D[0]=(*(in+2)&0xf0)>>4;
		D[1]=*(in+3)&0x0f;
		D[2]=(*(in+3)&0xf0)>>4;
   	}
   	else if(pHlrGdt->pHlrGbDataTable->OamManager.DigOfImsi==16)
    {
		D[0]=*(in+3)&0x0f;
		D[1]=(*(in+3)&0xf0)>>4;
		D[2]=*(in+4)&0x0f;
   	}
   	else
    {
		#ifdef _AUTH_DEBUG
		printf("HLR OAMS 配置的IMSI数字个数非15和16!\n");
		#endif
    }
  
    for(i=0;i<3;i++)
    {
		if (D[i]==0)
		    D[i]=10;
    }

    R=100*D[0]+10*D[1]+D[2]-111;
    
    p16=(U16 *)out;
    *p16=R;

    #ifdef _AUTH_DEBUG
    printf("\n");
    printf("MIN2=(10bit):0x");
    for(i=0;i<2;i++)
    	printf("%2x",*(out+i));
    printf("\n");
    #endif

    return ;
}

/*---------------------------------
    从VLR的IMSI到MIN1的转换函数
---------------------------------*/
void VlrImsitoMin1(U8 *in ,U8 *out)
{
    U8  i;
    U8  Tbcd;
    U16 *p16;
    U16 R1,R2;
    U8  D[8];

    #ifdef _AUTH_DEBUG
    printf("执行VlrImsitoMin1() 函数 !\n");
    #endif 

    for (i=0;i<4;i++)
    {
	    	if(*in==15)  //VLR数据库的IMSI首字节为IMSI数字个数
	    	{
				D[2*i]=(*(in+i+5)&0x0f);
				D[2*i+1]=(*(in+i+5)&0xf0)>>4;
	    	}
	    	else if(*in==16) 
	    	{
				D[2*i]=(*(in+i+5)&0xf0)>>4;
				D[2*i+1]=(*(in+i+6)&0x0f);
	    	}
	    	else
	   	{
				#ifdef _AUTH_DEBUG
				printf("VLR数据库中IMSI数字个数非15和16!\n");
				#endif
	        }
    }

    for(i=0;i<7;i++)
    {
		if (D[i]==0)
		    D[i]=10;
    }
   // for(i=4;i<7;i++)
   // {
	
	//	if (D[i]==0)
	//	    D[i]=10;
   // }

    R1=100*D[0]+10*D[1]+D[2]-111;
    R2=100*D[4]+10*D[5]+D[6]-111;
    Tbcd=D[3];
	
    p16=(U16 *)out;
    *p16=R1<<6;
    p16=(U16 *)(out+1);
    *p16=((*(out+1) & 0xc0)|(Tbcd<<2));
    *p16=*p16<<8;
    *p16=*p16|R2;

    #ifdef _AUTH_DEBUG
    printf("\n");
    printf("MIN1=(24bit):0x");
    for(i=0;i<3;i++)
    	printf("%2x",*(out+i));
    printf("\n");
    #endif

    return ;
}

/*-----------------------------------
从VLR的IMSI到MIN2的转换函数
------------------------------------*/
void VlrImsitoMin2(U8 *in ,U8 *out)
{
    U8  i;
    U16 *p16;
    U16 R;
    U8  D[4];

    #ifdef _AUTH_DEBUG
    printf("执行VlrImsitoMin2() 函数 !\n");
    #endif 

    if(*in==15)  //VLR数据库的IMSI首字节为IMSI数字个数
	{
		D[0]=(*(in+3)&0xf0)>>4;
		D[1]=(*(in+4)&0x0f);
		D[2]=(*(in+4)&0xf0)>>4;
    }
    else if(*in==16)
    {
		D[0]=(*(in+4)&0x0f);
		D[1]=(*(in+4)&0xf0)>>4;
		D[2]=(*(in+5)&0x0f);
    }
    else
    {
		#ifdef _AUTH_DEBUG
		printf("VLR数据库中IMSI数字个数非15和16!\n");
		#endif
    }

    for(i=0;i<3;i++)
    {
		if (D[i]==0)
		    D[i]=10;
    }

    R=100*D[0]+10*D[1]+D[2]-111;
    
    p16=(U16 *)out;
    *p16=R;

    #ifdef _AUTH_DEBUG
    printf("\n");
    printf("MIN2=(10bit):0x");
    for(i=0;i<2;i++)
    	  printf("%2x",*(out+i));
    printf("\n");
    #endif

    return ;
}


/*end of the file:authcavefunc.c*/

⌨️ 快捷键说明

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