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

📄 iccapp.lst

📁 mifarea卡程序mifarea卡程序mifarea卡程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V7.07   ICCAPP                                                                12/06/2003 18:49:10 PAGE 1   


C51 COMPILER V7.07, COMPILATION OF MODULE ICCAPP
OBJECT MODULE PLACED IN iccapp.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE source\iccapp.c LARGE BROWSE ORDER NOAREGS DEBUG OBJECTEXTEND PRINT(.\iccap
                    -p.lst) OBJECT(iccapp.obj)

stmt level    source

   1          /************************
   2           *    iccapp.c          *
   3           * Designe by 刘俐训    *
   4           * ic Card application  *
   5           ************************/
   6          #include <icc.h>
   7          #include <string.h>
   8          #include <iccapp.h>
   9          #include <uart.h>
  10          /*
  11          typedef struct _SamCommand
  12          {
  13              unsigned char CLA;
  14              unsigned char INS;
  15              unsigned char P1;
  16              unsigned char P2;
  17              unsigned char Lc;
  18              unsigned char *DAT;
  19              unsigned char Le;
  20          }SamCommand;
  21          
  22          typedef struct _SamResponse
  23          {
  24              unsigned char len;
  25              unsigned char DAT[128];
  26              unsigned char SW[2];
  27              int ISW;
  28          }SamResponse;
  29          */
  30          //#define DEBUGICC
  31          
  32          static SamCommand command;
  33          static SamResponse response;
  34          
  35          //static bit SamSendCommand(void);
  36          /* 发送命令报文,并取响应 */
  37          
  38          /* keytype */
  39          #ifndef masterkey
  40          #define masterkey   0
  41          #define workingkey  1
  42          #endif
  43          /* mode */
  44          #ifndef LOAD
  45          #define LOAD        0
  46          #define UPDATE      1
  47          #endif
  48          //static int ICC_store_key(char *skey, int keylen, int keyid, int keytype/*, int mode*/);
  49          /* 存储银行密钥 */
  50          
  51          unsigned char ICC_get_rsp_len(void)
  52          {
  53   1          return response.len;
  54   1      }
C51 COMPILER V7.07   ICCAPP                                                                12/06/2003 18:49:10 PAGE 2   

  55          
  56          bit SamSendCommand(SamCommand *cmd, SamResponse *rsp)
  57          {
  58   1          int i;
  59   1          int tmp = 0;
  60   1          unsigned char cmdstr[5];
  61   1          unsigned char proc_char;
  62   1          unsigned char LC, LE;
  63   1      
  64   1          IccClear();           //清缓冲区。
  65   1          rsp->len = 0;
  66   1          
  67   1          cmdstr[0] = cmd->CLA;
  68   1          cmdstr[1] = cmd->INS;
  69   1          cmdstr[2] = cmd->P1;
  70   1          cmdstr[3] = cmd->P2;
  71   1          if(cmd->Lc == 0)
  72   1              cmdstr[4] = cmd->Le;
  73   1          else
  74   1              cmdstr[4] = cmd->Lc;
  75   1              
  76   1          LC = cmd->Lc;
  77   1          LE = cmd->Le;
  78   1      
  79   1      Startsend:
  80   1          tmp = IccWrite(cmdstr, 5);              /* send command head 5 bytes */
  81   1          if(tmp < 5)
  82   1              {
  83   2              return 0;
  84   2              }
  85   1      
  86   1          
  87   1      Proc:
  88   1          i = IccRead(&proc_char, 1);             /* procedure byte */
  89   1          if(i < 1)
  90   1              {
  91   2              return 0;
  92   2              }
  93   1          else if((proc_char == cmdstr[1]) || (proc_char == ~cmdstr[1]))    /* ack */
  94   1          {
  95   2              if(LC > 0)
  96   2              {
  97   3                  /* send lc */
  98   3                  i = IccWrite(cmd->DAT, LC);  
  99   3                  if(i < LC)
 100   3                              {
 101   4                              return 0;
 102   4                              }
 103   3                  
 104   3                  /* send le ? */    
 105   3                  if(LE > 0)
 106   3                  {
 107   4                      i = IccWrite(&LE, 1);
 108   4                      if(i < 1)
 109   4                                      {
 110   5                                      return 0;
 111   5                                      }
 112   4                  }
 113   3                  
 114   3                  LC = 0;
 115   3                  goto Proc;
 116   3              }
C51 COMPILER V7.07   ICCAPP                                                                12/06/2003 18:49:10 PAGE 3   

 117   2              
 118   2              i = IccRead(rsp->DAT, LE);          // get response.data
 119   2              if(i < LE)
 120   2                      {
 121   3                      return 0;
 122   3                      }
 123   2              i = IccRead(rsp->SW, 2);            // get response.sw1~sw2
 124   2              if(i < 2)
 125   2                      {
 126   3                      return 0;
 127   3                      }
 128   2          }
 129   1          else if(proc_char == 0x6c)                        /* incorect lenght P3 */
 130   1          {
 131   2              i = IccRead(&proc_char, 1);
 132   2              if(i < 1)
 133   2                      {
 134   3                      return 0;
 135   3                      }
 136   2              else
 137   2              {
 138   3                  cmdstr[4] = proc_char;
 139   3                  /*
 140   3                  if(cmd->Lc > 0)
 141   3                      LC = proc_char;
 142   3                  else if(cmd->Le > 0)    */
 143   3                      LE = proc_char;
 144   3                  goto Startsend;                 /* send again*/
 145   3              }
 146   2          }
 147   1          else if(proc_char == 0x60)
 148   1          {
 149   2              goto Proc;                          /* wait another proc byte */
 150   2          }
 151   1          else                                    /* sw1 and sw2 */
 152   1          {
 153   2              rsp->SW[0] = proc_char;
 154   2              i = IccRead(rsp->SW + 1, 1);
 155   2              if(i < 1)
 156   2                      {
 157   3                      return 0;
 158   3                      }
 159   2      
 160   2              if(proc_char == 0x61)
 161   2              {
 162   3                  cmdstr[0] = 0x00;               /* get response CLA */
 163   3                  cmdstr[1] = 0xc0;               /* get response INS */
 164   3                  cmdstr[2] = 0x00;               /* P1 */
 165   3                  cmdstr[3] = 0x00;               /* P2 */
 166   3                  LE = cmdstr[4] = rsp->SW[1];/* Le */
 167   3                  LC = 0;
 168   3                  rsp->len = LE;
 169   3                  
 170   3                  goto Startsend;                 /* get response */
 171   3              }
 172   2          }
 173   1              rsp->len = LE;
 174   1          rsp->ISW = rsp->SW[0];
 175   1          rsp->ISW <<= 8;
 176   1          rsp->ISW |= rsp->SW[1];
 177   1          return 1;                               /* command success */
 178   1      }
C51 COMPILER V7.07   ICCAPP                                                                12/06/2003 18:49:10 PAGE 4   

 179          
 180          
 181          /******************************************************************
 182           *                                                                *
 183           *              TimeCOS/PBOC command sets                         *
 184           *                                                                *
 185           ******************************************************************/
 186          
 187          /*****************************************
 188           * 计算MAC1                              *
 189           * 80 70 00 00 (14H + 8*N) 08            *
 190           * 用户卡随机数,4字节                   *
 191           * 用户卡交易序号,2字节                 *
 192           * 交易金额,4字节                       *
 193           * 交易类型标识,1字节                   *
 194           * 交易日期(终端),4字节               *
 195           * 交易时间(终端),3字节               *
 196           * 消费密钥版本号,1字节                 *
 197           * 消费密钥算法标识,1字节               *
 198           * 用户卡应用序列号,8字节               *
 199           * 成员银行标识,8字节                   *
 200           * 试点城市标识,8字节                   *
 201           * tid: 交易序号,mac: MAC,各4字节      *
 202           *****************************************/
 203          int ICC_init_sam_for_purchase(char *bufin, unsigned char len, char *tid, char *mac)
 204          {
 205   1          command.CLA = 0x80;
 206   1          command.INS = 0x70;
 207   1          command.P1 = 0;
 208   1          command.P2 = 0;
 209   1          command.Lc = len;
 210   1          command.DAT = bufin;
 211   1          command.Le = 8;
 212   1          
 213   1          if(!SamSendCommand(&command, &response))
 214   1              return -1;
 215   1          else
 216   1          {
 217   2              memcpy(tid, response.DAT, 4);
 218   2              memcpy(mac, response.DAT+4, 4);
 219   2              return response.ISW;
 220   2          }
 221   1      }
 222          
 223          /*****************************************
 224           * 校验MAC2                              *
 225           * 80 72 00 00 04 MAC2                   *
 226           *****************************************/
 227          int ICC_credit_sam_for_purchase(char *mac2)
 228          {
 229   1          command.CLA = 0x80;
 230   1          command.INS = 0x70;
 231   1          command.P1 = 0;
 232   1          command.P2 = 0;
 233   1          command.Lc = 4;
 234   1          command.DAT = mac2;
 235   1          command.Le = 0;
 236   1          
 237   1          if(!SamSendCommand(&command, &response))
 238   1              return -1;
 239   1          else
 240   1              return response.ISW;
C51 COMPILER V7.07   ICCAPP                                                                12/06/2003 18:49:10 PAGE 5   

 241   1      }
 242          
 243          /*****************************************
 244           * des计算初始化(密钥分散)             *
 245           * 80 1a 密钥用途 版本 Lc data           *
 246           *****************************************/
 247          int ICC_init_sam_for_des(char useofkey, char edition, char *buf, unsigned char len)
 248          {
 249   1           
 250   1          command.CLA = 0x80;
 251   1          command.INS = 0x1a;
 252   1          command.P1 = useofkey;
 253   1          command.P2 = edition;
 254   1          command.Lc = len;
 255   1          command.DAT = buf;
 256   1          command.Le = 0;
 257   1          
 258   1          if(!SamSendCommand(&command, &response))
 259   1              return -1;
 260   1          else
 261   1              return response.ISW;
 262   1      }
 263          
 264          /*****************************************
 265           * 密钥导出                              *
 266           * 80 fc 00 密钥标识 Lc data             *
 267           *****************************************/
 268          int ICC_sam_export_key(char keyid, char *inbuf, unsigned char len, char *outbuf)
 269          {
 270   1          command.CLA = 0x80;
 271   1          command.INS = 0xfc;
 272   1          command.P1 = 0;
 273   1          command.P2 = keyid;
 274   1          command.Lc = len;
 275   1          command.DAT = inbuf;
 276   1          command.Le = 0;
 277   1      
 278   1          if(!SamSendCommand(&command, &response))
 279   1              return -1;
 280   1          else
 281   1          {
 282   2              memcpy(outbuf, response.DAT, response.len);

⌨️ 快捷键说明

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