comparison src/g23m-gsm/sim/uicc_fkt.c @ 1:fa8dc04885d8

src/g23m-*: import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:25:50 +0000
parents
children
comparison
equal deleted inserted replaced
0:4e78acac3d88 1:fa8dc04885d8
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GSM-F&D (8411)
4 | Modul : SIM_FKT
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : This modul defines the wrapping functions for the
18 | SIM application.
19 +-----------------------------------------------------------------------------
20 */
21
22 #ifndef SIM_FKT_C
23 #define SIM_FKT_C
24
25 #define ENTITY_SIM
26
27 /*==== INCLUDES ===================================================*/
28
29 #include <string.h>
30 #include "typedefs.h"
31 #include "pconst.cdg"
32 #include "message.h"
33 #include "ccdapi.h"
34 #include "vsi.h"
35 #include "custom.h"
36 #include "gsm.h"
37 #include "cnf_sim.h"
38 #include "mon_sim.h"
39 #include "prim.h"
40 #include "pei.h"
41 #include "tok.h"
42 #include "sim.h"
43 #include "sim_em.h"
44 #include "8010_136_SIMDRV_SAP_inline.h"
45
46 /*==== EXPORT =====================================================*/
47
48 /*==== PRIVAT =====================================================*/
49
50 /*==== VARIABLES ==================================================*/
51 GLOBAL USHORT stk_l_cmd = 0;
52 /*==== FUNCTIONS ===================================================*/
53
54 /* Implements Measure# 13 */
55 /*
56 +---------------------------------------------------------------------+
57 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
58 | STATE : code ROUTINE : FKT_ChangeCHV_n_UnblockCHV |
59 +---------------------------------------------------------------------+
60
61 PURPOSE : Wrapping function for the SIM driver call SIM_ChangeCHV and
62 SIM_UnblockCHV
63
64 */
65
66 LOCAL USHORT FKT_ChangeCHV_n_UnblockCHV ( UBYTE * oldPin_UnblkCHV,
67 UBYTE * newPin_CHV,
68 UBYTE pinId_chvType,
69 UBYTE inst_code)
70 {
71 USHORT size = 0;
72 USHORT sw1sw2;
73
74 U8 reader_id;
75 U8 i;
76 U8 data[2*MAX_PIN_LEN];
77
78 UBYTE response[SIMDRV_MAX_RESULT];
79
80 T_SIMDRV_cmd_header cmd_header;
81 T_SIMDRV_data_info data_info;
82 T_SIMDRV_result_info result_info;
83
84 TRACE_FUNCTION ("FKT_ChangeCHV_n_UnblockCHV()");
85
86 reader_id = SIMDRV_VAL_READER_ID__RANGE_MIN;
87 cmd_header.cla = SIMDRV_GSM_CLASS_BYTE;
88 cmd_header.ins = inst_code;
89 cmd_header.p1 = 0;
90 cmd_header.p2 = pinId_chvType;
91
92 for (i=0;i<2*MAX_PIN_LEN;i++)
93 {
94 if (i < MAX_PIN_LEN)
95 data[i] = oldPin_UnblkCHV[i];
96 else
97 data[i] = newPin_CHV[i-MAX_PIN_LEN];
98 }
99
100 data_info.data = (U8 *)data;
101 data_info.c_data = sizeof(data);
102
103 result_info.result = response;
104 result_info.c_result = size;
105 result_info.len = NOT_PRESENT_16BIT;
106
107 sw1sw2 = simdrv_xch_apdu(reader_id, cmd_header, data_info, &result_info);
108
109 return FKT_convert_error (sw1sw2,result_info.c_result);
110 }
111
112
113 /* Implements Measure# 16 */
114 /*
115 +------------------------------------------------------------------------+
116 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
117 | STATE : code ROUTINE : FKT_Invalidate_n_Rehabilitate |
118 +------------------------------------------------------------------------+
119
120 PURPOSE : Wrapping function for the SIM driver call SIM_Invalidate and
121 SIM_Rehabilitate.
122
123 */
124
125 LOCAL USHORT FKT_Invalidate_n_Rehabilitate ( UBYTE inst_code)
126 {
127 USHORT size = 0;
128 USHORT sw1sw2;
129
130 U8 reader_id;
131
132 UBYTE response[SIMDRV_MAX_RESULT];
133
134 T_SIMDRV_cmd_header cmd_header;
135 T_SIMDRV_data_info data_info;
136 T_SIMDRV_result_info result_info;
137
138 TRACE_FUNCTION ("FKT_Invalidate_n_Rehabilitate()");
139
140 reader_id = SIMDRV_VAL_READER_ID__RANGE_MIN;
141 cmd_header.cla = SIMDRV_GSM_CLASS_BYTE;
142 cmd_header.ins = inst_code;
143 cmd_header.p1 = 0;
144 cmd_header.p2 = 0;
145
146 data_info.data = NULL;
147 data_info.c_data = 0;
148
149 result_info.result = response;
150 result_info.c_result = size;
151 result_info.len = NOT_PRESENT_16BIT;
152
153 sw1sw2 = simdrv_xch_apdu(reader_id,cmd_header,data_info,&result_info);
154
155 if (sw1sw2 EQ 0x9810) /* already invalidated */
156 return SIM_NO_ERROR;
157
158 return FKT_convert_error (sw1sw2,result_info.c_result);
159 }
160
161
162 /* Implements Measure# 17 */
163 /*
164 +----------------------------------------------------------------------+
165 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
166 | STATE : code ROUTINE : FKT_DisableCHV_n_EnableCHV |
167 +----------------------------------------------------------------------+
168
169 PURPOSE : Wrapping function for the SIM driver call SIM_DisableCHV and
170 SIM_EnableCHV
171
172 */
173
174 LOCAL USHORT FKT_DisableCHV_n_EnableCHV (UBYTE * pin, UBYTE inst_code)
175 {
176 USHORT size = 0;
177 USHORT sw1sw2;
178
179 U8 reader_id;
180
181 T_SIMDRV_cmd_header cmd_header;
182 T_SIMDRV_data_info data_info;
183 T_SIMDRV_result_info result_info;
184
185 UBYTE response[SIMDRV_MAX_RESULT];
186
187 TRACE_FUNCTION ("FKT_DisableCHV_n_EnableCHV()");
188
189 reader_id = SIMDRV_VAL_READER_ID__RANGE_MIN;
190 cmd_header.cla = SIMDRV_GSM_CLASS_BYTE;
191 cmd_header.ins = inst_code;
192 cmd_header.p1 = 0;
193 cmd_header.p2 = 1;
194
195 data_info.data = (U8 *)pin;
196 data_info.c_data = MAX_PIN_LEN;
197
198 result_info.result = response;
199 result_info.c_result = size;
200 result_info.len = NOT_PRESENT_16BIT;
201
202 sw1sw2 = simdrv_xch_apdu(reader_id, cmd_header, data_info, &result_info);
203
204 return FKT_convert_error (sw1sw2,result_info.c_result);
205 }
206
207
208 /*
209 +--------------------------------------------------------------------+
210 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
211 | STATE : code ROUTINE : FKT_check_pin_count |
212 +--------------------------------------------------------------------+
213
214 PURPOSE : PIN/PUK count is checked for secret code initialisation.
215 count is set to zero, if not initialised, otherwise the
216 initialisation flag (most significant bit) is reset.
217 */
218
219 GLOBAL UBYTE FKT_check_pin_count (UBYTE count)
220 {
221 if ((count & 0x80) EQ 0)
222 return 0;
223
224 return count & 0x0F;
225 }
226
227 /*
228 +--------------------------------------------------------------------+
229 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
230 | STATE : code ROUTINE : FKT_convert_error |
231 +--------------------------------------------------------------------+
232
233 PURPOSE : Converts sw1 and sw2 to an unique error code for the
234 SIM application.
235
236 */
237
238 /*
239 * PIN/PUK is wrong, remaining attempts
240 */
241 static const USHORT sim_inv_chv_A [6] =
242 {
243 /* last requested PIN no error code */
244 /* none */ SIM_CAUSE_OTHER_ERROR,
245 /* PIN 1 */ SIM_CAUSE_PIN1_EXPECT,
246 /* PIN 2 */ SIM_CAUSE_PIN2_EXPECT,
247 /* PUK 1 */ SIM_CAUSE_PUK1_EXPECT,
248 /* PUK 2 */ SIM_CAUSE_PUK2_EXPECT,
249 /* NEVER */ SIM_CAUSE_ACCESS_PROHIBIT
250 };
251
252
253 /*
254 * PIN/PUK is wrong, no remaining attempts
255 */
256 static const USHORT sim_inv_chv_B [6] =
257 {
258 /* last requested PIN no error code */
259 /* none */ SIM_CAUSE_OTHER_ERROR,
260 /* PIN 1 */ SIM_CAUSE_PIN1_BLOCKED,
261 /* PIN 2 */ SIM_CAUSE_PIN2_BLOCKED,
262 /* PUK 1 */ SIM_CAUSE_PUK1_BLOCKED,
263 /* PUK 2 */ SIM_CAUSE_PUK2_BLOCKED,
264 /* NEVER */ SIM_CAUSE_OTHER_ERROR
265 };
266
267 GLOBAL USHORT FKT_convert_error (USHORT sw1sw2, USHORT size)
268 {
269 TRACE_FUNCTION ("FKT_convert_error()");
270
271 sim_data.sw1 = (UBYTE)(sw1sw2 >> 8);
272 sim_data.sw2 = (UBYTE)sw1sw2;
273
274 TRACE_EVENT_P1 ("Data returned from SIM, Size =%X", size);
275 TRACE_EVENT_P2 ("SW1=%02X SW2=%02X", sim_data.sw1, sim_data.sw2);
276
277 switch (sim_data.sw1)
278 {
279 case 0x00:
280 /*
281 * SIM driver error
282 */
283 if (SIM_IS_FLAG_CLEARED(SIM_INSERT))
284 {
285 return SIM_CAUSE_CARD_REMOVED;
286 }
287 if (sim_data.sw2 EQ 14)
288 {
289 SIM_SET_FLAG(DRV_FAILED_RETRY);
290 return SIM_CAUSE_DRV_TEMPFAIL;
291 }
292 return CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, SIM_ORIGINATING_ENTITY, sim_data.sw2);
293 #if defined SIM_TOOLKIT
294 case 0x9E:
295 /*
296 * use SW2 as length indicator for
297 * the following get response
298 */
299 if (sim_data.sim_phase >= 3) /* Phase 2+ or higher */
300 {
301 if (sim_data.stk_profile[0] & SAT_TP1_9E_XX)
302 {
303 sim_data.sim_data_len = (sim_data.sw2 EQ 0)? 0x100: (USHORT)sim_data.sw2;
304 return SIM_CAUSE_DNL_ERROR;
305 }
306 else
307 return SIM_CAUSE_SAT_BUSY;
308 }
309 else
310 return SIM_CAUSE_OTHER_ERROR;
311 case 0x93:
312 if (sim_data.sim_phase >= 3) /* Phase 2+ or higher */
313 {
314 return SIM_CAUSE_SAT_BUSY;
315 }
316 else
317 return SIM_CAUSE_OTHER_ERROR;
318 case 0x91:
319 if (sim_data.sim_phase >= 3) /* Phase 2+ or higher */
320 {
321 sim_data.proactive_sim_data_len = (sim_data.sw2 EQ 0)? 0x100: (SHORT)sim_data.sw2;
322 return SIM_NO_ERROR;
323 }
324 else
325 return SIM_CAUSE_OTHER_ERROR;
326 #endif
327 case 0x92:
328 if (sim_data.sw2 > 0xF)
329 {
330 #ifdef REL99
331 if (sim_data.sw2 EQ SW2_MEMORY_PROBLEM)
332 {
333 return SIM_CAUSE_MEM_PROBLEM;
334 }
335 #endif /* end of ifdef REL99 */
336 return SIM_CAUSE_OTHER_ERROR;
337 }
338 /* no break (otherwise the command was successful)*/
339 case 0x90:
340 if( (size>0) AND (size <= 0x100) )
341 {
342 sim_data.sim_data_len = size;
343 TRACE_EVENT_P1 ("sim_data.sim_data_len updated size =%X ", size);
344 }
345 return SIM_NO_ERROR;
346 case 0x9F:
347 /*
348 * use SW2 as length indicator for
349 * the following get response
350 */
351 sim_data.sim_data_len = (sim_data.sw2 EQ 0)? 0x100: (USHORT)sim_data.sw2;
352 return SIM_NO_ERROR;
353
354 case 0x94:
355 switch (sim_data.sw2)
356 {
357 case 0:
358 return SIM_CAUSE_NO_SELECT;
359 case 2:
360 return SIM_CAUSE_ADDR_WRONG;
361 case 4:
362 return SIM_CAUSE_UNKN_FILE_ID;
363 case 8:
364 return SIM_CAUSE_CMD_INCONSIST;
365 default:
366 break;
367 }
368 break;
369
370 case 0x98:
371 TRACE_EVENT_P1 ("LRP = %d", (int)sim_data.last_requested_pin_no);
372
373 switch (sim_data.sw2)
374 {
375 case 2:
376 return SIM_CAUSE_CHV_NOTSET;
377 case 8:
378 return SIM_CAUSE_CHV_VALIDATED;
379 case 0x10:
380 return SIM_CAUSE_EF_INVALID; /* contradiction cases */
381 case 4:
382 //TISH, patch for OMAPS00115342&OMAPS00123717
383 //start
384 #if 0
385 /* Check whether PIN1 is entered/Verified */
386 if (SIM_IS_FLAG_SET(PIN1_VERIFIED))
387 return SIM_CAUSE_ACCESS_PROHIBIT;
388 else
389 #endif
390 //end
391 return sim_inv_chv_A [sim_data.last_requested_pin_no];
392 case 0x40:
393 return sim_inv_chv_B [sim_data.last_requested_pin_no];
394 case 0x50:
395 return SIM_CAUSE_MAX_INCREASE;
396 default:
397 break;
398 }
399 break;
400 }
401
402 return SIM_CAUSE_OTHER_ERROR;
403 }
404
405 /*
406 +--------------------------------------------------------------------+
407 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
408 | STATE : code ROUTINE : FKT_ChangeCHV |
409 +--------------------------------------------------------------------+
410
411 PURPOSE : Wrapping function for the SIM driver call SIM_ChangeCHV.
412
413 */
414
415 GLOBAL USHORT FKT_ChangeCHV (UBYTE * old_pin,
416 UBYTE * new_pin,
417 UBYTE pin_id)
418 {
419 /* Implements Measure# 13 */
420 return (FKT_ChangeCHV_n_UnblockCHV (old_pin, new_pin, pin_id, SIMDRV_INS_CHANGE_CHV));
421 }
422
423
424 /*
425 +--------------------------------------------------------------------+
426 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
427 | STATE : code ROUTINE : FKT_DisableCHV |
428 +--------------------------------------------------------------------+
429
430 PURPOSE : Wrapping function for the SIM driver call SIM_DisableCHV.
431
432 */
433
434 GLOBAL USHORT FKT_DisableCHV (UBYTE * pin)
435 {
436 /* Implements Measure# 17 */
437 return (FKT_DisableCHV_n_EnableCHV (pin, SIMDRV_INS_DISABLE_CHV));
438 }
439
440 /*
441 +--------------------------------------------------------------------+
442 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
443 | STATE : code ROUTINE : FKT_EnableCHV |
444 +--------------------------------------------------------------------+
445
446 PURPOSE : Wrapping function for the SIM driver call SIM_EnableCHV.
447
448 */
449
450 GLOBAL USHORT FKT_EnableCHV (UBYTE * pin)
451 {
452 /* Implements Measure# 17 */
453 return (FKT_DisableCHV_n_EnableCHV (pin, SIMDRV_INS_ENABLE_CHV));
454 }
455
456
457 /*
458 +--------------------------------------------------------------------+
459 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
460 | STATE : code ROUTINE : FKT_Increase |
461 +--------------------------------------------------------------------+
462
463 PURPOSE : Wrapping function for the SIM driver call SIM_Increase.
464
465 */
466
467 GLOBAL USHORT FKT_Increase (UBYTE * data)
468 {
469 USHORT sw1sw2;
470 USHORT size = 0;
471 U8 reader_id;
472 T_SIMDRV_cmd_header cmd_header;
473 T_SIMDRV_data_info data_info;
474 T_SIMDRV_result_info result_info;
475 UBYTE response[SIMDRV_MAX_RESULT];
476
477 TRACE_FUNCTION ("FKT_Increase()");
478 reader_id = SIMDRV_VAL_READER_ID__RANGE_MIN;
479 cmd_header.cla = SIMDRV_GSM_CLASS_BYTE ;
480 cmd_header.ins = SIMDRV_INS_INCREASE;
481 cmd_header.p1 = 0;
482 cmd_header.p2 = 0;
483
484 data_info.data = (U8 *)data;
485 data_info.c_data = 3;
486
487 result_info.result = response;
488 result_info.c_result = size;
489 result_info.len = NOT_PRESENT_16BIT;
490
491 sw1sw2 = simdrv_xch_apdu(reader_id,cmd_header,data_info,&result_info);
492 return FKT_convert_error (sw1sw2,result_info.c_result);
493 }
494
495
496 /*
497 +--------------------------------------------------------------------+
498 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
499 | STATE : code ROUTINE : FKT_Invalidate |
500 +--------------------------------------------------------------------+
501
502 PURPOSE : Wrapping function for the SIM driver call SIM_Invalidate.
503
504 */
505
506 GLOBAL USHORT FKT_Invalidate (void)
507 {
508 /* Implements Measure# 16 */
509 return (FKT_Invalidate_n_Rehabilitate(SIMDRV_INS_INVALIDATE));
510 }
511
512
513 /*
514 +--------------------------------------------------------------------+
515 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
516 | STATE : code ROUTINE : FKT_ReadBinary |
517 +--------------------------------------------------------------------+
518
519 PURPOSE : Wrapping function for the SIM driver call SIM_ReadBinary.
520
521 */
522
523 GLOBAL USHORT FKT_ReadBinary (UBYTE * data,
524 USHORT offset,
525 USHORT length)
526 {
527 USHORT sw1sw2;
528 USHORT size = 0;
529 U8 reader_id;
530 T_SIMDRV_cmd_header cmd_header;
531 T_SIMDRV_data_info data_info;
532 T_SIMDRV_result_info result_info;
533 U8 offset_high;
534 U8 offset_low;
535
536 TRACE_FUNCTION ("FKT_ReadBinary()");
537 offset_high = (U8)((offset &0x7F00)>>8); /* to make the 8th bit 0 as per 102.221 */
538 offset_low = (U8)(offset & 0x00FF);
539
540 reader_id = SIMDRV_VAL_READER_ID__RANGE_MIN;
541 cmd_header.cla = SIMDRV_GSM_CLASS_BYTE;
542 cmd_header.ins = SIMDRV_INS_READ_BINARY;
543 cmd_header.p1 =offset_high ;
544 cmd_header.p2 =offset_low ;
545
546 data_info.data = NULL;
547 data_info.c_data = 0;
548
549 result_info.result = (U8 *)data;
550 result_info.c_result = size;
551 result_info.len = (USHORT)length;
552
553 sw1sw2= simdrv_xch_apdu (reader_id,cmd_header,data_info,&result_info);
554 return FKT_convert_error (sw1sw2,result_info.c_result);
555 }
556
557
558 /*
559 +--------------------------------------------------------------------+
560 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
561 | STATE : code ROUTINE : FKT_ReadRecord |
562 +--------------------------------------------------------------------+
563
564 PURPOSE : Wrapping function for the SIM driver call SIM_ReadRecord.
565
566 */
567
568 GLOBAL USHORT FKT_ReadRecord (UBYTE * data,
569 UBYTE mode,
570 USHORT record,
571 USHORT length)
572 {
573 USHORT sw1sw2;
574 USHORT size = 0;
575 U8 reader_id;
576 T_SIMDRV_cmd_header cmd_header;
577 T_SIMDRV_data_info data_info;
578 T_SIMDRV_result_info result_info;
579
580 #if !defined NTRACE
581 /* Implements Measure#32: Row 37 */
582 TRACE_EVENT_P1("FKT_ReadRecord(): Nr. %hu", record);
583 #endif
584
585 reader_id = SIMDRV_VAL_READER_ID__RANGE_MIN;
586 cmd_header.cla = SIMDRV_GSM_CLASS_BYTE;
587 cmd_header.ins = SIMDRV_INS_READ_RECORD;
588 cmd_header.p1 = (U8)record;
589 cmd_header.p2 = (U8)mode;
590
591 data_info.data = NULL;
592 data_info.c_data = 0;
593
594 result_info.result = (U8 *)data ;
595 result_info.c_result = size;
596 result_info.len =(USHORT)length;
597
598 sw1sw2= simdrv_xch_apdu (reader_id,cmd_header,data_info,&result_info);
599 return FKT_convert_error (sw1sw2,result_info.c_result);
600 }
601
602
603 /*
604 +--------------------------------------------------------------------+
605 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
606 | STATE : code ROUTINE : FKT_Rehabilitate |
607 +--------------------------------------------------------------------+
608
609 PURPOSE : Wrapping function for the SIM driver call SIM_Rehabilitate.
610
611 */
612
613 GLOBAL USHORT FKT_Rehabilitate (void)
614 {
615 /* Implements Measure# 16 */
616 return (FKT_Invalidate_n_Rehabilitate(SIMDRV_INS_REHABILITATE));
617 }
618
619
620 /*
621 +--------------------------------------------------------------------+
622 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
623 | STATE : code ROUTINE : FKT_Status |
624 +--------------------------------------------------------------------+
625
626 PURPOSE : Wrapping function for the SIM driver call SIM_Status.
627
628 */
629
630 GLOBAL USHORT FKT_Status (UBYTE * pin_cnt,
631 UBYTE * pin2_cnt,
632 UBYTE * puk_cnt,
633 UBYTE * puk2_cnt)
634 {
635 USHORT size = 0;
636 USHORT sw1sw2;
637 U8 reader_id;
638 T_SIMDRV_cmd_header cmd_header;
639 T_SIMDRV_data_info data_info;
640 T_SIMDRV_result_info result_info;
641
642 USHORT cause;
643 USHORT fileid;
644 union
645 {
646 T_DIR_STATUS status;
647 UBYTE response [40];
648 } dir;
649
650 TRACE_FUNCTION ("FKT_Status()");
651
652 memset (dir.response, 0, sizeof(dir.response));
653
654 reader_id = SIMDRV_VAL_READER_ID__RANGE_MIN;
655
656 cmd_header.cla = SIMDRV_GSM_CLASS_BYTE;
657 cmd_header.ins = SIMDRV_INS_STATUS;
658 cmd_header.p1 = 0;
659 cmd_header.p2 = 0;
660
661 data_info.data = NULL;
662 data_info.c_data = 0;
663
664 result_info.result = (U8 *)dir.response;
665 result_info.c_result = size;
666 result_info.len = sim_data.dir_status_len;
667
668 sw1sw2 = simdrv_xch_apdu(reader_id, cmd_header, data_info, &result_info);
669
670 cause = FKT_convert_error (sw1sw2,result_info.c_result);
671
672 *pin_cnt = 0;
673 *puk_cnt = 0;
674 *pin2_cnt = 0;
675 *puk2_cnt = 0;
676
677 if (cause EQ SIM_NO_ERROR)
678 {
679 /*
680 * Check file id on active call: if different from last directory
681 * indicate failure during SIM Presence Detection (27.20).
682 * A selection of a non-existent DF (possible with SIM_ACCESS_REQ)
683 * leads to the loss of the current DF: this confuses the SIM
684 * Presence Detection, therefore the validity of the actual DF
685 * stored in 'sim_data.act_directory' must be considered.
686 */
687 fileid = (dir.status.fileid[0] << 8) | dir.status.fileid[1];
688
689 if (SIM_IS_FLAG_SET (CALL_ACTIVE) AND /* call active */
690 sim_data.act_directory NEQ NOT_PRESENT_16BIT /* actual DF known? */
691 AND fileid NEQ sim_data.act_directory) /* compare DF */
692 return SIM_CAUSE_CARD_REMOVED;
693 else
694 {
695 if (SIM_TI_DRV_X_BYTES > 0) /* discard SW1, SW2 from response! */
696 memset (&dir.response[sim_data.dir_status_len], 0, SIM_TI_DRV_X_BYTES);
697 /*
698 * Directory status is available
699 */
700 *pin_cnt = FKT_check_pin_count (dir.status.pinstatus);
701 *puk_cnt = FKT_check_pin_count (dir.status.unbstatus);
702 *pin2_cnt = FKT_check_pin_count (dir.status.pin2status);
703 *puk2_cnt = FKT_check_pin_count (dir.status.unb2status);
704 }
705 }
706 return cause;
707 }
708
709 /*
710 +--------------------------------------------------------------------+
711 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
712 | STATE : code ROUTINE : FKT_RunGSMAlgo |
713 +--------------------------------------------------------------------+
714
715 PURPOSE : Wrapping function for the SIM driver call SIM_RunGSMAlgo.
716
717 */
718
719 GLOBAL USHORT FKT_RunGSMAlgo (UBYTE * rand, UBYTE * data, USHORT len)
720 {
721 USHORT sw1sw2;
722 USHORT size = 0;
723 U8 reader_id;
724 T_SIMDRV_cmd_header cmd_header;
725 T_SIMDRV_data_info data_info;
726 T_SIMDRV_result_info result_info;
727
728 TRACE_FUNCTION ("FKT_RunGSMAlgo()");
729
730 reader_id = SIMDRV_VAL_READER_ID__RANGE_MIN;
731 cmd_header.cla = SIMDRV_GSM_CLASS_BYTE ;
732 cmd_header.ins = SIMDRV_INS_AUTHENTICATE;
733 cmd_header.p1 = 0;
734 cmd_header.p2 = 0;
735
736 data_info.data = (U8*)rand;
737 data_info.c_data = MAX_RAND;
738
739 result_info.result = data;
740 result_info.c_result = size;
741 result_info.len = len;
742
743 sw1sw2= simdrv_xch_apdu (reader_id,cmd_header,data_info,&result_info);
744
745 return FKT_convert_error (sw1sw2,result_info.c_result);
746 }
747
748
749 /*
750 +--------------------------------------------------------------------+
751 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
752 | STATE : code ROUTINE : FKT_Select |
753 +--------------------------------------------------------------------+
754
755 PURPOSE : Wrapping function for the SIM driver call SIM_Select.
756
757 */
758 LOCAL USHORT fkt_select_one (USHORT id, UBYTE * data, USHORT len)
759 {
760
761 USHORT size = 0;
762 USHORT sw1sw2;
763 U8 reader_id;
764 T_SIMDRV_cmd_header cmd_header;
765 U8 field[2];
766 T_SIMDRV_data_info data_info;
767 T_SIMDRV_result_info result_info;
768
769 TRACE_EVENT_P1 ("fkt_select_one() : File id =%X ", id);
770
771 reader_id = SIMDRV_VAL_READER_ID__RANGE_MIN;
772
773 cmd_header.cla = SIMDRV_GSM_CLASS_BYTE;
774 cmd_header.ins = SIMDRV_INS_SELECT;
775 cmd_header.p1 = 0;
776 cmd_header.p2 = 0;
777
778 field[0] =(U8) (id>>8); /* high byte */
779 field[1] =(U8) id; /* low byte */
780
781 data_info.data = field;
782 data_info.c_data = sizeof(field);
783
784 result_info.result = data;
785 result_info.c_result = size;
786 result_info.len = len;
787
788 TRACE_EVENT_P1 ("Expected result size from SIM =%X ", result_info.len);
789
790 sw1sw2 = simdrv_xch_apdu(reader_id, cmd_header, data_info, &result_info);
791
792 return FKT_convert_error (sw1sw2,result_info.c_result);
793 }
794
795 /*
796 +--------------------------------------------------------------------+
797 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
798 | STATE : code ROUTINE : sim_select_df |
799 +--------------------------------------------------------------------+
800
801 PURPOSE : Function to select the directory given the path.
802
803 */
804 LOCAL USHORT sim_select_df(U16 dir_level,UBYTE *data,USHORT len)
805 {
806 USHORT result = SIM_NO_ERROR;
807
808 result = fkt_select_one (dir_level, data, len);
809 if (result NEQ SIM_NO_ERROR)
810 {
811 sim_data.act_directory = NOT_PRESENT_16BIT;
812 sim_data.act_field = NOT_PRESENT_16BIT;
813 }
814 else
815 {
816 sim_data.act_directory = dir_level;
817 }
818 return result;
819 }
820
821 /*
822 +--------------------------------------------------------------------+
823 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
824 | STATE : code ROUTINE : FKT_Select |
825 +--------------------------------------------------------------------+
826
827 PURPOSE : Wrapping function for the SIM driver call SIM_Select.
828
829 */
830 GLOBAL USHORT FKT_Select (USHORT id,
831 BOOL path_info_present, T_path_info * path_info_ptr,
832 UBYTE * data, USHORT len)
833 {
834 USHORT result;
835 USHORT directory = (SIM_IS_FLAG_SET (GSM_DATAFIELD))?
836 SIM_DF_GSM: SIM_DF_1800; /* default parent directory */
837
838 #if !defined NTRACE
839 /* Implements Measure#32: Row 39 */
840 TRACE_EVENT_P1("FKT_Select(): id = %04X", id);
841 #endif
842 switch (id & 0xFF00) /* selecting DF deselects EF */
843 {
844 case 0x3F00:
845 case 0x7F00:
846 case 0x5F00:
847 sim_data.act_field = NOT_PRESENT_16BIT;
848 break;
849 }
850
851 if( path_info_present NEQ FALSE )
852 {
853 if((sim_data.act_directory & 0xFF00) NEQ 0x5F00 AND
854 sim_data.act_directory NEQ NOT_PRESENT_16BIT)
855 {
856 /* Currently selected df is MF or a first level directory */
857 if(sim_data.act_directory NEQ path_info_ptr->df_level1)
858 {
859 result = sim_select_df(path_info_ptr->df_level1,data,len);
860 if(result NEQ SIM_NO_ERROR)
861 return result;
862 }
863 }
864 /* Currently selected df is a second level directory */
865 else
866 {
867 result = sim_select_df(SIM_MF,data,len);
868 if(result NEQ SIM_NO_ERROR)
869 return result;
870 result = sim_select_df(path_info_ptr->df_level1,data,len);
871 if(result NEQ SIM_NO_ERROR)
872 return result;
873 }
874 if(path_info_ptr->v_df_level2)
875 {
876 result = sim_select_df(path_info_ptr->df_level2,data,len);
877 if(result NEQ SIM_NO_ERROR)
878 return result;
879 }
880 result = fkt_select_one (id, data, len);
881 if (result NEQ SIM_NO_ERROR)
882 {
883 sim_data.act_field = NOT_PRESENT_16BIT;
884 }
885 else
886 {
887 sim_data.act_field = id;
888 }
889 return result;
890 }
891 else
892 {
893 switch (id)
894 {
895 case SIM_MF:
896 result = fkt_select_one (SIM_MF, data, len);
897 if (result NEQ SIM_NO_ERROR)
898 sim_data.act_directory = NOT_PRESENT_16BIT;
899 else
900 {
901 sim_data.dir_status_len = sim_data.sim_data_len;
902 sim_data.act_directory = id;
903 }
904 return result;
905
906 default:
907 /* All the standard defined EFs would be handled before coming to this
908 * point. Complete path information should be given for non-standard 2nd level EFs
909 * and they also would be handled before coming to this point.
910 * This statement will be hit for non-standard files
911 * without path information. Hence returning error */
912 return SIM_CAUSE_UNKN_FILE_ID;
913
914 /* continue here in case of any first level directory */
915 case SIM_DF_GSM:
916 case SIM_DF_1800:
917 case SIM_DF_TELECOM:
918 case SIM_DF_VI:
919 if (sim_data.act_directory EQ id)
920 return SIM_NO_ERROR; /* already selected */
921 else
922 {
923 /* If current directory has not been selected or it is a
924 2nd level and under another 1st level DF */
925 if (((sim_data.act_directory & 0xFF00) EQ 0x5F00 AND
926 ! SIM_IS_DF_LEVEL2_UNDER_DF_LEVEL1(sim_data.act_directory,id))
927 OR sim_data.act_directory EQ NOT_PRESENT_16BIT)
928 { /* MF has to be selected first */
929 result = sim_select_df(SIM_MF,data,len);
930 if(result NEQ SIM_NO_ERROR)
931 return result;
932 }
933 result = fkt_select_one (id, data, len);
934 if (result NEQ SIM_NO_ERROR)
935 {
936 sim_data.act_directory = NOT_PRESENT_16BIT;
937 sim_data.act_field = NOT_PRESENT_16BIT;
938 }
939 else
940 {
941 sim_data.dir_status_len = sim_data.sim_data_len;
942 sim_data.act_directory = id;
943 }
944 return result;
945 }
946 case SIM_DF_GRAPHICS:
947 directory = SIM_DF_TELECOM; /* parent directory */
948 /* no break */
949 /*lint -fallthrough*/
950 case SIM_DF_SOLSA:
951 case SIM_DF_MEXE:
952 if (sim_data.act_directory EQ id)
953 return SIM_NO_ERROR; /* already selected */
954
955 if (sim_data.act_directory NEQ directory)
956 { /* not the parent directory */
957 /* If current directory is MF or first level OR if the 2nd level
958 directory is under another 1st level df, select the parent directory */
959 if((sim_data.act_directory & 0xFF00) NEQ 0x5F00 ||
960 (!SIM_IS_DF_LEVEL2_UNDER_DF_LEVEL1(sim_data.act_directory,directory)) )
961 {
962 result = FKT_Select (directory, FALSE, NULL, data, len);
963 if (result NEQ SIM_NO_ERROR)
964 {
965 sim_data.act_directory = NOT_PRESENT_16BIT;
966 return result;
967 }
968 }
969 }
970 result = fkt_select_one (id, data, len);
971 if (result NEQ SIM_NO_ERROR)
972 {
973 sim_data.act_directory = NOT_PRESENT_16BIT;
974 sim_data.act_field = NOT_PRESENT_16BIT;
975 }
976 else
977 {
978 sim_data.dir_status_len = sim_data.sim_data_len;
979 sim_data.act_directory = id;
980 }
981 return result;
982
983 case SIM_ICCID:
984 case SIM_ELP:
985 /*
986 * Access to Root Directory
987 */
988 directory = SIM_MF;
989 break;
990
991 case SIM_ADN:
992 case SIM_FDN:
993 case SIM_SMS:
994 case SIM_CCP:
995 case SIM_MSISDN:
996 case SIM_SMSP:
997 case SIM_SMSS:
998 case SIM_LND:
999 case SIM_SMSR:
1000 case SIM_SDN:
1001 case SIM_EXT1:
1002 case SIM_EXT2:
1003 case SIM_EXT3:
1004 case SIM_BDN:
1005 case SIM_EXT4:
1006 /* VO temp PATCH: Needed for reading CPHS info num from old SIMs */
1007 case SIM_CPHS_INFN2:
1008 /* VO temp PATCH end */
1009 /*
1010 * Access to Telecom Directory
1011 */
1012 directory = SIM_DF_TELECOM;
1013 break;
1014
1015 case SIM_LP:
1016 case SIM_IMSI:
1017 case SIM_KC:
1018 case SIM_PLMNSEL:
1019 case SIM_HPLMN:
1020 case SIM_ACMMAX:
1021 case SIM_SST:
1022 case SIM_ACM:
1023 case SIM_GID1:
1024 case SIM_GID2:
1025 case SIM_PUCT:
1026 case SIM_CBMI:
1027 case SIM_SPN:
1028 case SIM_CBMID:
1029 case SIM_BCCH:
1030 case SIM_ACC:
1031 case SIM_FPLMN:
1032 case SIM_LOCI:
1033 case SIM_AD:
1034 case SIM_PHASE:
1035 case SIM_VGCS:
1036 case SIM_VGCSS:
1037 case SIM_VBS:
1038 case SIM_VBSS:
1039 case SIM_EMLPP:
1040 case SIM_AAEM:
1041 case SIM_ECC:
1042 case SIM_CBMIR:
1043 case SIM_DCK:
1044 case SIM_CNL:
1045 case SIM_NIA:
1046 case SIM_KCGPRS:
1047 case SIM_LOCGPRS:
1048 case SIM_SUME:
1049 case SIM_CPHS_VMW:
1050 case SIM_CPHS_SST:
1051 case SIM_CPHS_CFF:
1052 case SIM_CPHS_ONSTR:
1053 case SIM_CPHS_CSP:
1054 case SIM_CPHS_CINF:
1055 case SIM_CPHS_MBXN:
1056 case SIM_CPHS_ONSHF:
1057 case SIM_CPHS_INFN:
1058 #ifdef REL99
1059 case SIM_UCPS_ACTEC:
1060 case SIM_OCPS_ACTEC:
1061 case SIM_HPLMN_ACT:
1062 case SIM_CPBCCH:
1063 case SIM_INV_SCAN:
1064 case SIM_RPLMN_ACT:
1065 #endif
1066 case SIM_PNN:
1067 case SIM_OPL:
1068
1069 /*
1070 * Access to GSM
1071 */
1072 directory = (SIM_IS_FLAG_SET (GSM_DATAFIELD))?
1073 SIM_DF_GSM: SIM_DF_1800;
1074 break;
1075
1076 case SIM_MEXE_ST:
1077 case SIM_ORPK:
1078 case SIM_ARPK:
1079 case SIM_TPRPK:
1080 /*
1081 * Access to MExE Directory
1082 */
1083 directory = SIM_DF_MEXE;
1084 break;
1085 case SIM_IMG:
1086 /*
1087 * Access to Icon Directory
1088 */
1089 directory = SIM_DF_GRAPHICS;
1090 break;
1091
1092 case SIM_SAI:
1093 case SIM_SLL:
1094 /*
1095 * Access to SoLSA Directory
1096 */
1097 directory = SIM_DF_SOLSA;
1098 break;
1099 }
1100 }
1101
1102 if (sim_data.act_directory NEQ directory)
1103 {
1104 /*
1105 * select directory
1106 */
1107 result = FKT_Select (directory, FALSE, NULL, data, len);
1108 if (result NEQ SIM_NO_ERROR) /* directory selection fails */
1109 {
1110 sim_data.act_directory = NOT_PRESENT_16BIT;
1111 sim_data.act_field = NOT_PRESENT_16BIT;
1112 return result;
1113 }
1114 }
1115
1116 if (sim_data.act_field NEQ id)
1117 {
1118 /*
1119 * secondly select elementary field
1120 */
1121 result = fkt_select_one (id, data, len);
1122 if (result NEQ SIM_NO_ERROR) /* EF selection fails */
1123 {
1124 sim_data.act_field = NOT_PRESENT_16BIT;
1125 #ifdef __INVALID /* more sophisticated SELECT error handling */
1126
1127 sw1 = (UBYTE)(SIM_Status_Extended ((UBYTE *)response, 6, &size) >> 8);
1128
1129 if (sw1 NEQ 0x90 AND sw1 NEQ 0x91)
1130 /*
1131 * SIM Status request failed
1132 */
1133 sim_data.act_directory = NOT_PRESENT_16BIT;
1134 else if (((response[4] << 8) | response[5])
1135 NEQ sim_data.act_directory)
1136 /*
1137 * SIM Presence Detection indicates invalid SIM
1138 */
1139 sim_data.act_directory = NOT_PRESENT_16BIT;
1140 #endif
1141 }
1142 else
1143 {
1144 sim_data.act_directory = directory;
1145 sim_data.act_field = id;
1146 }
1147 return result;
1148 }
1149 else
1150 /*
1151 * field is already selected
1152 */
1153 return SIM_NO_ERR_FILE_ALREADY_SELECTED;
1154 }
1155
1156
1157 /*
1158 +--------------------------------------------------------------------+
1159 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
1160 | STATE : code ROUTINE : FKT_UnblockCHV |
1161 +--------------------------------------------------------------------+
1162
1163 PURPOSE : Wrapping function for the SIM driver call SIM_UnblockCHV.
1164
1165 */
1166
1167 GLOBAL USHORT FKT_UnblockCHV (UBYTE * unblockCHV,
1168 UBYTE * new_CHV,
1169 UBYTE chvType)
1170 {
1171 /* Implements Measure# 13 */
1172 return (FKT_ChangeCHV_n_UnblockCHV (unblockCHV, new_CHV, chvType, SIMDRV_INS_UNBLOCK_CHV));
1173 }
1174
1175
1176 /*
1177 +--------------------------------------------------------------------+
1178 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
1179 | STATE : code ROUTINE : FKT_UpdateBinary |
1180 +--------------------------------------------------------------------+
1181
1182 PURPOSE : Wrapping function for the SIM driver call SIM_UpdateBinary.
1183
1184 */
1185
1186 GLOBAL USHORT FKT_UpdateBinary (UBYTE * data,
1187 USHORT length,
1188 USHORT offset)
1189 {
1190 USHORT size = 0;
1191 USHORT sw1sw2;
1192 U8 reader_id;
1193 T_SIMDRV_cmd_header cmd_header;
1194 T_SIMDRV_data_info data_info;
1195 T_SIMDRV_result_info result_info;
1196 U8 offset_high;
1197 U8 offset_low;
1198 UBYTE response[SIMDRV_MAX_RESULT];
1199
1200 TRACE_FUNCTION ("FKT_UpdateBinary()");
1201
1202 offset_high = (U8)((offset &0x7F00)>>8);/*to make the 8th bit 0 as per 102.221*/
1203 offset_low = (U8)(offset & 0x00FF);
1204
1205 reader_id = SIMDRV_VAL_READER_ID__RANGE_MIN;
1206 cmd_header.cla = SIMDRV_GSM_CLASS_BYTE ;
1207 cmd_header.ins = SIMDRV_INS_UPDATE_BINARY;
1208 cmd_header.p1 = offset_high;
1209 cmd_header.p2 = offset_low;
1210
1211 data_info.data = (U8 *)data;
1212 data_info.c_data = (U8)length;
1213
1214 result_info.result = response;
1215 result_info.c_result = size;
1216 result_info.len = NOT_PRESENT_16BIT;
1217
1218 sw1sw2= simdrv_xch_apdu (reader_id,cmd_header,data_info,&result_info);
1219 return FKT_convert_error (sw1sw2,result_info.c_result);
1220 }
1221
1222
1223 /*
1224 +--------------------------------------------------------------------+
1225 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
1226 | STATE : code ROUTINE : FKT_UpdateRecord |
1227 +--------------------------------------------------------------------+
1228
1229 PURPOSE : Wrapping function for the SIM driver call SIM_UpdateRecord.
1230
1231 */
1232
1233 GLOBAL USHORT FKT_UpdateRecord (UBYTE * data,
1234 USHORT length,
1235 UBYTE mode,
1236 USHORT record)
1237 {
1238 USHORT size = 0;
1239 USHORT sw1sw2;
1240 U8 reader_id;
1241 T_SIMDRV_cmd_header cmd_header;
1242 T_SIMDRV_data_info data_info;
1243 T_SIMDRV_result_info result_info;
1244 UBYTE response[SIMDRV_MAX_RESULT];
1245
1246 #if !defined NTRACE
1247 /* Implements Measure#32: Row 40 */
1248 TRACE_EVENT_P1("FKT_UpdateRecord(): Nr. %hu", record);
1249 #endif
1250 reader_id = SIMDRV_VAL_READER_ID__RANGE_MIN;
1251 cmd_header.cla = SIMDRV_GSM_CLASS_BYTE ;
1252 cmd_header.ins = SIMDRV_INS_UPDATE_RECORD;
1253 cmd_header.p1 = (U8)record;
1254 cmd_header.p2 = (U8)mode;
1255
1256 data_info.data = (U8*)data;
1257 data_info.c_data = (U8)length;
1258
1259 result_info.result = response;
1260 result_info.c_result = size;
1261 result_info.len = NOT_PRESENT_16BIT;
1262
1263 sw1sw2= simdrv_xch_apdu (reader_id,cmd_header,data_info,&result_info);
1264 return FKT_convert_error (sw1sw2,result_info.c_result);
1265 }
1266
1267
1268
1269 /*
1270 +--------------------------------------------------------------------+
1271 | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
1272 | STATE : code ROUTINE : FKT_VerifyCHV |
1273 +--------------------------------------------------------------------+
1274
1275 PURPOSE : Wrapping function for the SIM driver call SIM_VerifyCHV.
1276
1277 */
1278
1279 GLOBAL USHORT FKT_VerifyCHV (UBYTE * pin,
1280 UBYTE pin_id)
1281 {
1282 USHORT size = 0;
1283 USHORT sw1sw2;
1284 U8 reader_id;
1285 T_SIMDRV_cmd_header cmd_header;
1286 T_SIMDRV_data_info data_info;
1287 T_SIMDRV_result_info result_info;
1288 UBYTE response[SIMDRV_MAX_RESULT];
1289
1290 TRACE_FUNCTION ("FKT_VerifyCHV()");
1291
1292 reader_id = SIMDRV_VAL_READER_ID__RANGE_MIN;
1293
1294 cmd_header.cla = SIMDRV_GSM_CLASS_BYTE;
1295 cmd_header.ins = SIMDRV_INS_VERIFY_CHV;
1296 cmd_header.p1 = 0x00;
1297 cmd_header.p2 = pin_id;
1298
1299 data_info.data = (U8 *)pin;
1300 data_info.c_data = MAX_PIN_LEN;
1301
1302 result_info.result = response;
1303 result_info.c_result = size;
1304 result_info.len = NOT_PRESENT_16BIT;
1305
1306 sw1sw2 = simdrv_xch_apdu(reader_id, cmd_header, data_info, &result_info);
1307
1308 return FKT_convert_error (sw1sw2,result_info.c_result);
1309 }
1310
1311 /*
1312 +********************************************************************+
1313 | Moved from sim_stk.c - for CQ 34109 under feature flag SIM_TOOLKIT |
1314 +********************************************************************+
1315 */
1316
1317 #ifdef SIM_TOOLKIT
1318
1319 /*
1320 +--------------------------------------------------------------------+
1321 | PROJECT : GSM-PS (8419) MODULE : SIM_STK |
1322 | STATE : code ROUTINE : FKT_TerminalResponse |
1323 +--------------------------------------------------------------------+
1324
1325 PURPOSE : Wrapping function for the SIM driver call SIM_TerminalResponse
1326
1327 */
1328
1329 static const UBYTE timer_env[] = {
1330 STK_TIMER_EXPIRATION_TAG,
1331 STK_DEVICE_IDENTITY_LEN+STK_TIMER_ID_LEN+STK_TIMER_VALUE_LEN+6,
1332 STK_DEVICE_IDENTITY_TAG|STK_COMPREHENSION_REQUIRED, STK_DEVICE_IDENTITY_LEN, 0x82, 0x81,
1333 STK_TIMER_ID_TAG|STK_COMPREHENSION_REQUIRED, STK_TIMER_ID_LEN, 0,
1334 STK_TIMER_VALUE_TAG|STK_COMPREHENSION_REQUIRED, STK_TIMER_VALUE_LEN, 0, 0, 0
1335 };
1336
1337 UBYTE pending_timers[9] = {0,0,0,0,0,0,0,0,0};
1338 UBYTE next_pos_to_fill = 0;
1339 UBYTE next_pos_to_send = 0;
1340
1341 GLOBAL USHORT FKT_TerminalResponse (UBYTE * data,
1342 USHORT length)
1343 {
1344 USHORT size = 0;
1345 USHORT sw1sw2;
1346 U8 reader_id;
1347 T_SIMDRV_cmd_header cmd_header;
1348 T_SIMDRV_data_info data_info;
1349 T_SIMDRV_result_info result_info;
1350 UBYTE response[SIMDRV_MAX_RESULT];
1351 UBYTE env[sizeof(timer_env)];
1352 USHORT index;
1353 UBYTE dummy[4];
1354 USHORT error;
1355 USHORT i;
1356
1357 TRACE_FUNCTION ("FKT_TerminalResponse()");
1358
1359 reader_id = SIMDRV_VAL_READER_ID__RANGE_MIN;
1360 cmd_header.cla = SIMDRV_GSM_CLASS_BYTE ;
1361 cmd_header.ins = SIMDRV_INS_TERMINAL_RESPONSE;
1362 cmd_header.p1 = 0;
1363 cmd_header.p2 = 0;
1364
1365 data_info.data = data;
1366 data_info.c_data = (U8)length;
1367
1368 result_info.result = response;
1369 result_info.c_result = size;
1370 result_info.len = NOT_PRESENT_16BIT;
1371
1372 sw1sw2 = simdrv_xch_apdu(reader_id,cmd_header,data_info,&result_info);
1373
1374 sim_data.term_resp_sent = TRUE;
1375
1376 SIM_EM_TERMINAL_RESPONSE;
1377 /*
1378 * if SIM response is OK, try resending pending timer expiry envelopes (send updated envelopes)
1379 */
1380 if( 0x9000 == sw1sw2 )
1381 {
1382 for(i=0;i<8;i++)
1383 {
1384 if (next_pos_to_fill != next_pos_to_send)
1385 {
1386 /*
1387 * some timer expiry envelopes are pending
1388 */
1389 index = pending_timers[next_pos_to_send];
1390 memcpy (env, timer_env, sizeof(timer_env));
1391 env[8] = (UBYTE)(index + 1); /* Timer number range is 1..8 */
1392 env[11] = sim_data.timer[index].hour;
1393 env[12] = sim_data.timer[index].minute;
1394 env[13] = sim_data.timer[index].second;
1395 error = FKT_Envelope (dummy, env, sizeof(timer_env),0);
1396 if(8 == next_pos_to_send)
1397 {
1398 next_pos_to_send = 0;
1399 }
1400 else
1401 {
1402 next_pos_to_send++;
1403 }
1404 if (error NEQ SIM_NO_ERROR)
1405 {
1406 break;
1407 }
1408 }
1409 }
1410 }
1411
1412 return FKT_convert_error (sw1sw2,result_info.c_result);
1413
1414 }
1415
1416
1417 /*
1418 +--------------------------------------------------------------------+
1419 | PROJECT : GSM-PS (8419) MODULE : SIM_STK |
1420 | STATE : code ROUTINE : FKT_Envelope |
1421 +--------------------------------------------------------------------+
1422
1423 PURPOSE : Wrapping function for the SIM driver call SIM_Envelope
1424
1425 */
1426
1427 GLOBAL USHORT FKT_Envelope (UBYTE * data_out, UBYTE * data_in,
1428 USHORT in_length, USHORT out_length)
1429 {
1430
1431 USHORT size = 0;
1432 USHORT sw1sw2;
1433 USHORT error;
1434 U8 reader_id;
1435 T_SIMDRV_cmd_header cmd_header;
1436 T_SIMDRV_data_info data_info;
1437 T_SIMDRV_result_info result_info;
1438
1439 TRACE_FUNCTION ("FKT_Envelope()");
1440
1441 reader_id = SIMDRV_VAL_READER_ID__RANGE_MIN;
1442
1443 cmd_header.cla = SIMDRV_GSM_CLASS_BYTE;
1444 cmd_header.ins = SIMDRV_INS_ENVELOPE;
1445 cmd_header.p1 = 0;
1446 cmd_header.p2 = 0;
1447
1448 data_info.data = data_in;
1449 data_info.c_data = (U8)in_length;
1450
1451 result_info.result = data_out;
1452 result_info.c_result = size;
1453 result_info.len = out_length;
1454
1455 sw1sw2 = simdrv_xch_apdu(reader_id,cmd_header,data_info,&result_info);
1456
1457 SIM_EM_ENVELOPE;
1458
1459 sim_data.sim_data_len = 0;
1460 TRACE_EVENT("sim_data.sim_data_len initialised as 0"); /* for debug only - to be removed */
1461
1462 error = FKT_convert_error (sw1sw2,result_info.c_result);
1463
1464 stk_l_cmd = sim_data.sim_data_len << 3;
1465
1466 return error;
1467
1468 }
1469
1470 /*
1471 +--------------------------------------------------------------------+
1472 | PROJECT : GSM-PS (8419) MODULE : SIM_STK |
1473 | STATE : code ROUTINE : FKT_TerminalProfile |
1474 +--------------------------------------------------------------------+
1475
1476 PURPOSE : Wrapping function for the SIM driver call SIM_TerminalProfile
1477
1478 */
1479
1480 GLOBAL USHORT FKT_TerminalProfile (UBYTE * data,
1481 USHORT length)
1482 {
1483 USHORT size = 0;
1484 USHORT sw1sw2;
1485 U8 reader_id;
1486 T_SIMDRV_cmd_header cmd_header;
1487 T_SIMDRV_data_info data_info;
1488 T_SIMDRV_result_info result_info;
1489 UBYTE response[SIMDRV_MAX_RESULT];
1490
1491 TRACE_FUNCTION ("FKT_TerminalProfile()");
1492
1493 reader_id = SIMDRV_VAL_READER_ID__RANGE_MIN;
1494 cmd_header.cla = SIMDRV_GSM_CLASS_BYTE;
1495 cmd_header.ins = SIMDRV_INS_TERMINAL_PROFILE;
1496 cmd_header.p1 = 0;
1497 cmd_header.p2 = 0;
1498
1499 data_info.data = data;
1500 data_info.c_data = (U8)length;
1501
1502 result_info.result = response;
1503 result_info.c_result = size;
1504 result_info.len = NOT_PRESENT_16BIT;
1505
1506 sw1sw2= simdrv_xch_apdu(reader_id,cmd_header,data_info,&result_info);
1507
1508 return FKT_convert_error (sw1sw2,result_info.c_result);
1509
1510 }
1511
1512
1513 /*
1514 +--------------------------------------------------------------------+
1515 | PROJECT : GSM-PS (8419) MODULE : SIM_STK |
1516 | STATE : code ROUTINE : FKT_Fetch |
1517 +--------------------------------------------------------------------+
1518
1519 PURPOSE : Wrapping function for the SIM driver call SIM_Fetch
1520
1521 */
1522
1523 GLOBAL USHORT FKT_Fetch (UBYTE * cmd,
1524 USHORT length)
1525 {
1526 USHORT size = 0;
1527 USHORT sw1sw2;
1528 U8 reader_id;
1529 T_SIMDRV_cmd_header cmd_header;
1530 T_SIMDRV_data_info data_info;
1531 T_SIMDRV_result_info result_info;
1532
1533 TRACE_FUNCTION ("FKT_Fetch()");
1534
1535 reader_id = SIMDRV_VAL_READER_ID__RANGE_MIN;
1536 cmd_header.cla = SIMDRV_GSM_CLASS_BYTE;
1537 cmd_header.ins = SIMDRV_INS_FETCH;
1538 cmd_header.p1 = 0;
1539 cmd_header.p2 = 0;
1540
1541 data_info.data = NULL;
1542 data_info.c_data = 0;
1543
1544 result_info.result = cmd;
1545 result_info.c_result = size;
1546 result_info.len = (USHORT)length;
1547
1548 sw1sw2 = simdrv_xch_apdu(reader_id,cmd_header,data_info,&result_info);
1549
1550 return FKT_convert_error (sw1sw2,result_info.c_result);
1551
1552 }
1553
1554 #endif /* SIM_TOOLKIT */
1555
1556 #endif