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

📄 ic.c

📁 网络中交换节点的上数据的交换和下行数据分发的硬件实现
💻 C
📖 第 1 页 / 共 2 页
字号:
    int status;
    
    IC_addr=peek(0x80008804,2);            /*读出IC卡地址*/ 
    
    IC_len=peek(0x80008808,2);             /*读出数据长度*/
    
    status=w_IC(0x8000880C,IC_addr,IC_len);   /*向IC卡写入指定长度的数据*/  
    
    if (status==0x30)
     {
      status=0x3;
      poke(0x80008800,0x3,2);
      goto label2;
     }
   if (status==0x32)
     {
      status=0x7;
      poke(0x80008800,0x7,2);
      goto label2;
     }                                     /*若写IC卡失败,进行相应处理*/
     
   status=0;
   poke(0x80008800,0,2);  
     
label2:  return  status;   
   
   }
   
   
   /*本函数用于清除IC卡中的内容*/ 
   
   int IC_clean()
   {
    extern int w_IC();
    extern void poke();
   
    int i,status;
    
    for (i=0;i<32;i++) 
     {
     *(unsigned volatile int *)(0x80008804+i)=0xFFFFFFFF;
     } 
     
     for (i=0;i<64;i++)
      {
       status=w_IC(0x80008804,0+i*32,32);
       if (status==0x30)
        {
         status=0x3;
         poke(0x80008800,0x3,2);
         goto label2;
        }
       if (status==0x32)
        {
         status=0x7;
         poke(0x80008800,0x7,2);
         goto label2;
        }                                     /*若写IC卡失败,进行相应处理*/
      }
     
     status=0;
     poke(0x80008800,0,2);  
    
label2:  return  status;   
   }
   
   
   /*本函数用于制操作员IC卡*/
   
   int operatorIC_create()
   {
    extern int w_IC(),peek(),inputkey();
    extern void poke(),flash_w(),secerase(),memcopy();
   int status,i;
    unsigned int u_num,addr,new_ICID;
    
    u_num=peek(0x8000BFFE,1);                /*确定现在已经存在的用户数目*/
    
    addr=0x8000C800+u_num*20;                /*确定新的用户信息应写入的地址*/
    
    new_ICID=peek(0x80008B24,1);
    
    if((u_num+1)>50)
     {
      status=0x18;
      poke(0x80008800,0x18,2);
      goto label2;
     }
     
    for(i=0;i<u_num;i++)
     {
      if(peek(0x8000C800+i*20,1)==new_ICID)
      {
       status=0x19;
       poke(0x80008800,0x19,2);
       goto label2;
      }
     } 
     
     
     memcopy(0x80008B24,addr,1,1);            /*将ICID移到内存的相应位置*/  
    
    memcopy(0x80008B44,addr+4,4,2);          /*将认证随机串移到内存相应位置*/
    
    secerase(0x01480000);                    /*擦除用户信息所在的flash扇区*/
    
    flash_w(0x8000C800,0x01480000,50*(u_num+1));       /*更新flash中的用户信息区*/ 
    
     if (status==0x30)
        {
         status=0x3;
         poke(0x80008800,0x3,2);
         goto label2;
        }
      if (status==0x32)
        {
         status=0x71;
         poke(0x80008800,0x71,2);
         goto label2;
        }                                    /*若写IC卡失败,进行相应处理*/
    
      
   
     memcopy(0x8000880C,0x80008808,4,2);      /*将主密钥移到加密位置*/
  
    memcopy(0x80008B24,0x80008818,12,2);     /*将用户信息移到加密位置*/
    
    poke(0x80008804,3,2);                    /*输入加密数据的组数*/

     inputkey(0x80008804,0x80008808,0x80008818,0x80008804,0,0);
   
     status=w_IC(0x80008804,0x321,48);        /*将加密后的用户信息存入IC卡*/
    
    if (status==0x30)
        {
         status=0x3;
         poke(0x80008800,0x3,2);
         goto label2;
        }
       if (status==0x32)
        {
         status=0x72;
         poke(0x80008800,0x72,2);
         goto label2;
        }                                     /*若写IC卡失败,进行相应处理*/
 
    u_num=u_num+1;                           /*密码卡增加了一个用户*/
    
    poke(0x8000BFFE,u_num,1);                /*更新用户状态字*/
    
    status=0;
    poke(0x80008800,0,2);  
    
label2:  return  status; 
    
   }
    
  
   /*本函数用于验证用户身份*/ 
   
   int log_in()
   {
   extern int r_IC(),w_IC(),peek(),inputkey(),erandx();
    extern void poke(),memcopy(),flash_w(),secerase();
   
    int i,j,status = 0;
    unsigned short ICID,u_num;
    
      
    status=r_IC(0x09,0x80008808,16);         /*将主密钥读到内存中,准备解密*/
    if (status==0x30)
     {
      status=0x3;
      poke(0x80008800,0x3,2);
      goto label1;
     }
   if (status==0x32)
     {
      status=0x7;
      poke(0x80008800,0x7,2);
      goto label1;
     }  
     
    
    status=r_IC(0x321,0x80008818,48);        /*将用户信息读到内存中,准备解密*/
    if (status==0x30)
     {
      status=0x3;
      poke(0x80008800,0x3,2);
      goto label1;
     }
   if (status==0x32)
     {
      status=0x7;
      poke(0x80008800,0x7,2);
      goto label1;
     }                                       /*若读IC卡失败,进行相应处理*/
   
    poke(0x80008804,3,2);                    /*输入要解密数据的组数*/
      
    inputkey(0x80008804,0x80008808,0x80008818,0x80008804,1,0);  /*用主密钥解密用户信息*/
    
 
    ICID=peek(0x80008804,1);               /*要验证用户的ICID*/ 
    
    u_num=peek(0x8000BFFE,1);
    
    for (i=0;i<u_num;i++)
     {
      if(ICID==peek(0x8000C800+i*20,1))
      break; 
     }
    
    if(i>=u_num)
     {
      poke(0x80008800,0xa1,2);
      status=0xa;                          
     goto label1;
     }
   
    for (j=0;j<4;j++)
     {
      if(peek(0x80008824+j*4,2)!=peek(0x8000C800+i*20+4+j*4,2))
       {
        poke(0x80008800,0xa2,2);
        status=0xa;
        goto label1;                         /*若操作员非法,则做相应处理*/
       }
     }
    
    memcopy(0x8000D004,0x80008824,4,2);      /*产生16字节的随机数作为新的认证随机串*/
   
     memcopy(0x80008824,0x8000C800+i*20+4,4,2);   /*将新的认证随机串移到指定位置*/ 
    
    memcopy(0x80008824,0x80008838,4,2);
    memcopy(0x80008814,0x80008828,4,2);
    memcopy(0x80008804,0x80008818,4,2);         /*将新的用户信息移到加密位置*/
    
    status=r_IC(0x09,0x80008808,16);         /*将主密钥读到内存中,准备解密*/
    if (status==0x30)
     {
      status=0x3;
      poke(0x80008800,0x3,2);
      goto label1;
     }
    if (status==0x32)
     {
      status=0x7;
      poke(0x80008800,0x7,2);
      goto label1;
     }                                     /*若读IC卡失败,进行相应处理*/
    
    poke(0x80008804,3,2);                  /*输入要加密的数据的组数*/
    
    inputkey(0x80008804,0x80008808,0x80008818,0x80008804,0,0);     /*用主密钥加密用户信息*/
    
    status=w_IC(0x80008804,0x321,48);        /*新的用户信息密文写入IC卡*/
    if (status==0x30)
     {
      status=0x3;
      poke(0x80008800,0x3,2);
      goto label1;
     }
    if (status==0x32)
     {
      status=0x7;
      poke(0x80008800,0x7,2);
      goto label1;
     }                                     /*若写IC卡失败,进行相应处理*/

    secerase(0x01480000);                    /*擦除用户信息所在的flash扇区*/
    
    flash_w(0x8000C800,0x01480000,5*u_num);       /*更新flash中的用户信息区*/
    
    
    if (peek(0x8000BFFC,1)==0)
     {
      memcopy(0x01440000,0x8000C300,2,2);      /*将RSA公钥的模长和加密指数读到内存*/
    
      memcopy(0x01440008,0x80008818,64,2);     /*将RSA公钥的密文积移到解密位置*/
    
        status=r_IC(0x09,0x80008808,16);         /*将主密钥读到内存中,准备解密*/
    if (status==0x30)
     {
      status=0x3;
      poke(0x80008800,0x3,2);
      goto label1;
     }
    if (status==0x32)
     {
      status=0x7;
      poke(0x80008800,0x7,2);
      goto label1;
     }
      poke(0x80008804,8,2);                   /*输入要解密数据的组数*/ 
      
      inputkey(0x80008804,0x80008808,0x80008818,0x80008804,1,0);    /*用主密钥解密RSA公钥的积*/ 
    
      memcopy(0x80008804,0x8000C308,32,2);     /*将RSA公钥的积的明文移到指定位置*/
    
      memcopy(0x01440108,0x8000C408,1,2);      /*将RSA私钥模长移到内存*/
    
      memcopy(0x0144010C,0x80008818,160,2);    /*将RSA私钥的密文部分移到解密位置*/ 
    
        status=r_IC(0x09,0x80008808,16);         /*将主密钥读到内存中,准备解密*/
    if (status==0x30)
     {
      status=0x3;
      poke(0x80008800,0x3,2);
      goto label1;
     }
    if (status==0x32)
     {
      status=0x7;
      poke(0x80008800,0x7,2);
      goto label1;
     }
      poke(0x80008804,40,2);                   /*输入要解密数据的组数*/ 
   
      inputkey(0x80008804,0x80008808,0x80008818,0x80008804,1,0);                          /*用主密钥解密RSA私钥的密文部分*/ 
    
      memcopy(0x80008804,0x8000C40C,160,2);    /*将RSA私钥的明文移到指定位置*/
    
      memcopy(0x0144038C,0x8000C68C,2,2);      /*将SMC公钥的模长和加密指数读到内存*/
    
      memcopy(0x01440394,0x80008818,64,2);     /*将SMC公钥的密文积移到解密位置*/ 
    
       status=r_IC(0x09,0x80008808,16);         /*将主密钥读到内存中,准备解密*/
    if (status==0x30)
     {
      status=0x3;
      poke(0x80008800,0x3,2);
      goto label1;
     }
    if (status==0x32)
     {
      status=0x7;
      poke(0x80008800,0x7,2);
      goto label1;
     }
      poke(0x80008804,16,2);                   /*输入要解密数据的组数*/
    
      inputkey(0x80008804,0x80008808,0x80008818,0x80008804,1,0);                          /*用主密钥解密SMC公钥的积*/ 
    
      memcopy(0x80008804,0x8000C694,64,2);     /*将SMC公钥的明文积移到指定位置*/ 
     }
      
    poke(0x8000BFFC,ICID,1);                 /*身份验证通过,将ICID写入用户状态码*/
    
    poke(0x80008800,0,2);
    status=0; 
    
label1:  return status;         
   }
   
    /*清除密码卡内某个操作员信息*/ 
   
   int user_delete()
   {
    extern int peek();
    extern void poke(),memcopy(),secerase(),flash_w();
   
    int i,j,status;
    unsigned short ICID,u_num;
    unsigned int data[5];
    
    ICID=peek(0x80008804,1);                   /*读出要删除的用户ICID*/ 
    
    u_num=peek(0x8000BFFE,1);
    
    for (i=0;i<u_num;i++)
     {
      if(ICID==peek(0x8000C800+i*20,1))
      break; 
     }
    
    if(i>=u_num)
     {
      poke(0x80008800,0x13,2);
      status=0x13;                           /*若没有该用户,则做相应处理*/
      goto label1;
     }
    
    for(j=0;j<5;j++)
     {
      data[j]=0xFFFFFFFF;  
     }
    
    if(u_num>1)
     {
      memcopy(0x8000C800+(i+1)*20,0x8000C800+i*20,(u_num-1-i)*5,2);   /*将被删除用户后的用户信息前移*/
      memcopy(data,0x8000C800+(u_num-1)*20,5,2);
     }
    
    if(u_num==1)
     {
      memcopy(data,0x8000C800,5,2);
     }
    
    u_num=u_num-1;
    poke(0x8000BFFE,u_num,1);               /*更新用户数目*/ 
    
    secerase(0x01480000);                   /*擦除用户信息所在的flash扇区*/ 
    
    if(u_num>0)
     {
      flash_w(0x8000C800,0x01480000,u_num*5);   /*更新flash中的用户信息区*/ 
     }
    poke(0x80008800,0,2);
    status=0;
   
   
label1:  return  status;    
 
      
   }  
  
     /*本函数用于读出密钥卡或身份卡头信息内容*/ 
   
   int IChead_read()
   {
    extern int r_IC();
    extern void poke();
   
    int status;
    
    status=r_IC(0x1,0x80008804,800);         /*从IC卡读出头信息*/
    
    if (status==0x30)
     {
      status=0x3;
      poke(0x80008800,0x3,2);
      goto label1;
     }
   if (status==0x32)
     {
      status=0x7;
      poke(0x80008800,0x7,2);
      goto label1;
     }                                     /*若读IC卡失败,进行相应处理*/
    
    
    poke(0x80008800,0,2);
    status=0;
   
label1:  return status;   
   }
   
   
   
/*复位密码卡*/
int logout()
{
  
   extern void poke();
   int status;
    int tmp;
  
   if(peek(0x8000BFFC,1)==0)
   {
      status=0xc;
      poke(0x80008800,0xc,2);
      goto label1;
   }
 poke(0x8000BFFC,0,2);

 for(tmp=0;tmp<293;tmp++)
 {
 poke(0x8000C300+tmp*4,0,2);
 }
   
 for(tmp=0;tmp<8;tmp++)
 {
 poke(0x8000E000+tmp*4,0,2);
 }
   
poke(0x80008800,0,2);
 status=0;
   
   
label1:  return  status;    
 
}
 
 
  

⌨️ 快捷键说明

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