📄 iccapp.lst
字号:
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 + -