📄 authcavefunc.c
字号:
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 + -