FreeCalypso > hg > fc-magnetite
comparison src/g23m-gsm/sim/uicc_fkt.c @ 104:27a4235405c6
src/g23m-gsm: import from LoCosto source
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Tue, 04 Oct 2016 18:24:05 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 103:76d139c7a25e | 104:27a4235405c6 |
|---|---|
| 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 |
