1 /******************************************************************************* 2 * 3 * Copyright 2018 NXP 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 #define LOG_TAG "LSClient" 19 #include <LsClient.h> 20 #include <LsLib.h> 21 #include <errno.h> 22 #include <log/log.h> 23 #include <stdlib.h> 24 #include <string.h> 25 26 extern bool ese_debug_enabled; 27 28 static int32_t gsTransceiveTimeout = 120000; 29 static uint8_t gsCmd_Buffer[64 * 1024]; 30 static int32_t gsCmd_count = 0; 31 static bool gsIslastcmdLoad; 32 static bool gsSendBack_cmds = false; 33 static uint8_t* gspBuffer; 34 static uint8_t gsStoreData[22]; 35 static uint8_t gsTag42Arr[17]; 36 static uint8_t gsTag45Arr[9]; 37 static uint8_t gsLsExecuteResp[4]; 38 static int32_t gsResp_len = 0; 39 40 LSCSTATUS(*Applet_load_seqhandler[]) 41 (Lsc_ImageInfo_t* pContext, LSCSTATUS status, Lsc_TranscieveInfo_t* pInfo) = { 42 LSC_OpenChannel, LSC_SelectLsc, LSC_StoreData, LSC_loadapplet, NULL}; 43 44 /******************************************************************************* 45 ** 46 ** Function: Perform_LSC 47 ** 48 ** Description: Performs the LSC download sequence 49 ** 50 ** Returns: Success if ok. 51 ** 52 *******************************************************************************/ 53 LSCSTATUS Perform_LSC(const char* name, const char* dest, const uint8_t* pdata, 54 uint16_t len, uint8_t* respSW) { 55 static const char fn[] = "Perform_LSC"; 56 ALOGD_IF(ese_debug_enabled, "%s: enter; sha-len=%d", fn, len); 57 if ((pdata == NULL) || (len == 0x00)) { 58 ALOGE("%s: Invalid SHA-data", fn); 59 return LSCSTATUS_FAILED; 60 } 61 gsStoreData[0] = STORE_DATA_TAG; 62 gsStoreData[1] = len; 63 memcpy(&gsStoreData[2], pdata, len); 64 LSCSTATUS status = LSC_update_seq_handler(Applet_load_seqhandler, name, dest); 65 if ((status != LSCSTATUS_SUCCESS) && (gsLsExecuteResp[2] == 0x90) && 66 (gsLsExecuteResp[3] == 0x00)) { 67 gsLsExecuteResp[2] = LS_ABORT_SW1; 68 gsLsExecuteResp[3] = LS_ABORT_SW2; 69 } 70 memcpy(&respSW[0], &gsLsExecuteResp[0], 4); 71 ALOGD_IF(ese_debug_enabled, "%s: lsExecuteScript Response SW=%2x%2x", fn, 72 gsLsExecuteResp[2], gsLsExecuteResp[3]); 73 74 ALOGD_IF(ese_debug_enabled, "%s: exit; status=0x0%x", fn, status); 75 return status; 76 } 77 78 /******************************************************************************* 79 ** 80 ** Function: LSC_update_seq_handler 81 ** 82 ** Description: Performs the LSC update sequence handler sequence 83 ** 84 ** Returns: Success if ok. 85 ** 86 *******************************************************************************/ 87 LSCSTATUS LSC_update_seq_handler( 88 LSCSTATUS (*seq_handler[])(Lsc_ImageInfo_t* pContext, LSCSTATUS status, 89 Lsc_TranscieveInfo_t* pInfo), 90 const char* name, const char* dest) { 91 static const char fn[] = "LSC_update_seq_handler"; 92 Lsc_ImageInfo_t update_info; 93 94 ALOGD_IF(ese_debug_enabled, "%s: enter", fn); 95 memset(&update_info, 0, sizeof(Lsc_ImageInfo_t)); 96 if (dest != NULL) { 97 strcat(update_info.fls_RespPath, dest); 98 ALOGD_IF(ese_debug_enabled, 99 "%s: Loader Service response data path/destination: %s", fn, dest); 100 update_info.bytes_wrote = 0xAA; 101 } else { 102 update_info.bytes_wrote = 0x55; 103 } 104 if ((LSC_UpdateExeStatus(LS_DEFAULT_STATUS)) != true) { 105 return LSCSTATUS_FAILED; 106 } 107 // memcpy(update_info.fls_path, (char*)Lsc_path, sizeof(Lsc_path)); 108 strcat(update_info.fls_path, name); 109 ALOGD_IF(ese_debug_enabled, "Selected applet to install is: %s", 110 update_info.fls_path); 111 112 uint16_t seq_counter = 0; 113 LSCSTATUS status = LSCSTATUS_FAILED; 114 Lsc_TranscieveInfo_t trans_info; 115 memset(&trans_info, 0, sizeof(Lsc_TranscieveInfo_t)); 116 while ((seq_handler[seq_counter]) != NULL) { 117 status = (*(seq_handler[seq_counter]))(&update_info, status, &trans_info); 118 if (LSCSTATUS_SUCCESS != status) { 119 ALOGE("%s: exiting; status=0x0%X", fn, status); 120 break; 121 } 122 seq_counter++; 123 } 124 125 LSC_CloseChannel(&update_info, LSCSTATUS_FAILED, &trans_info); 126 ALOGD_IF(ese_debug_enabled, "%s: exit; status=0x%x", fn, status); 127 return status; 128 } 129 130 /******************************************************************************* 131 ** 132 ** Function: LSC_OpenChannel 133 ** 134 ** Description: Creates the logical channel with lsc 135 ** 136 ** Returns: Success if ok. 137 ** 138 *******************************************************************************/ 139 LSCSTATUS LSC_OpenChannel(Lsc_ImageInfo_t* Os_info, LSCSTATUS status, 140 Lsc_TranscieveInfo_t* pTranscv_Info) { 141 static const char fn[] = "LSC_OpenChannel"; 142 143 ALOGD_IF(ese_debug_enabled, "%s: enter", fn); 144 if (Os_info == NULL || pTranscv_Info == NULL) { 145 ALOGE("%s: Invalid parameter", fn); 146 return LSCSTATUS_FAILED; 147 } 148 phNxpEse_data cmdApdu; 149 phNxpEse_data rspApdu; 150 phNxpEse_memset(&cmdApdu, 0x00, sizeof(phNxpEse_data)); 151 phNxpEse_memset(&rspApdu, 0x00, sizeof(phNxpEse_data)); 152 cmdApdu.len = (int32_t)sizeof(OpenChannel); 153 cmdApdu.p_data = (uint8_t*)phNxpEse_memalloc(cmdApdu.len * sizeof(uint8_t)); 154 memcpy(cmdApdu.p_data, OpenChannel, cmdApdu.len); 155 156 ALOGD_IF(ese_debug_enabled, "%s: Calling Secure Element Transceive", fn); 157 ESESTATUS eseStat = phNxpEse_Transceive(&cmdApdu, &rspApdu); 158 159 if (eseStat != ESESTATUS_SUCCESS && (rspApdu.len < 0x03)) { 160 if (rspApdu.len == 0x02) 161 memcpy(&gsLsExecuteResp[2], &rspApdu.p_data[rspApdu.len - 2], 2); 162 status = LSCSTATUS_FAILED; 163 ALOGE("%s: SE transceive failed status = 0x%X", fn, status); 164 } else if (((rspApdu.p_data[rspApdu.len - 2] != 0x90) && 165 (rspApdu.p_data[rspApdu.len - 1] != 0x00))) { 166 memcpy(&gsLsExecuteResp[2], &rspApdu.p_data[rspApdu.len - 2], 2); 167 status = LSCSTATUS_FAILED; 168 ALOGE("%s: invalid response = 0x%X", fn, status); 169 } else { 170 uint8_t cnt = Os_info->channel_cnt; 171 Os_info->Channel_Info[cnt].channel_id = rspApdu.p_data[rspApdu.len - 3]; 172 Os_info->Channel_Info[cnt].isOpend = true; 173 Os_info->channel_cnt++; 174 status = LSCSTATUS_SUCCESS; 175 } 176 177 phNxpEse_free(cmdApdu.p_data); 178 phNxpEse_free(rspApdu.p_data); 179 ALOGD_IF(ese_debug_enabled, "%s: exit; status=0x%x", fn, status); 180 return status; 181 } 182 183 /******************************************************************************* 184 ** 185 ** Function: LSC_SelectLsc 186 ** 187 ** Description: Creates the logical channel with lsc 188 ** Channel_id will be used for any communication with Lsc 189 ** 190 ** Returns: Success if ok. 191 ** 192 *******************************************************************************/ 193 LSCSTATUS LSC_SelectLsc(Lsc_ImageInfo_t* Os_info, LSCSTATUS status, 194 Lsc_TranscieveInfo_t* pTranscv_Info) { 195 static const char fn[] = "LSC_SelectLsc"; 196 197 ALOGD_IF(ese_debug_enabled, "%s: enter", fn); 198 199 if (Os_info == NULL || pTranscv_Info == NULL) { 200 ALOGE("%s: Invalid parameter", fn); 201 return LSCSTATUS_FAILED; 202 } 203 204 phNxpEse_data cmdApdu; 205 phNxpEse_data rspApdu; 206 207 phNxpEse_memset(&cmdApdu, 0x00, sizeof(phNxpEse_data)); 208 phNxpEse_memset(&rspApdu, 0x00, sizeof(phNxpEse_data)); 209 210 uint8_t selectCnt = 3; 211 while ((selectCnt--) > 0) { 212 if (selectCnt == 2) { 213 cmdApdu.p_data = (uint8_t*)phNxpEse_memalloc( 214 ((ArrayOfAIDs[selectCnt - 1][0]) - 1) * sizeof(uint8_t)); 215 cmdApdu.len = (int32_t)ArrayOfAIDs[selectCnt - 1][0]; 216 } else { 217 cmdApdu.p_data = (uint8_t*)phNxpEse_memalloc( 218 ((ArrayOfAIDs[selectCnt][0]) - 1) * sizeof(uint8_t)); 219 cmdApdu.len = (int32_t)ArrayOfAIDs[selectCnt][0]; 220 } 221 222 cmdApdu.p_data[0] = Os_info->Channel_Info[0].channel_id; 223 224 memcpy(&(cmdApdu.p_data[1]), &ArrayOfAIDs[selectCnt][2], 225 ((ArrayOfAIDs[selectCnt][0]) - 1)); 226 227 /*If NFC/SPI Deinitialize requested*/ 228 ALOGD_IF(ese_debug_enabled, 229 "%s: Calling Secure Element Transceive with Loader service AID", 230 fn); 231 232 ESESTATUS eseStat = phNxpEse_Transceive(&cmdApdu, &rspApdu); 233 234 if (eseStat != ESESTATUS_SUCCESS && (rspApdu.len == 0x00)) { 235 status = LSCSTATUS_FAILED; 236 ALOGE("%s: SE transceive failed status = 0x%X", fn, status); 237 break; 238 } else if (((rspApdu.p_data[rspApdu.len - 2] == 0x90) && 239 (rspApdu.p_data[rspApdu.len - 1] == 0x00))) { 240 status = Process_SelectRsp(rspApdu.p_data, (rspApdu.len - 2)); 241 if (status != LSCSTATUS_SUCCESS) { 242 ALOGE("%s: Select Lsc Rsp doesnt have a valid key; status = 0x%X", fn, 243 status); 244 } 245 /*If AID is found which is successfully selected break while loop*/ 246 if (status == LSCSTATUS_SUCCESS) { 247 uint8_t totalLen = ArrayOfAIDs[selectCnt][0]; 248 uint8_t cnt = 0; 249 int32_t wStatus = 0; 250 status = LSCSTATUS_FAILED; 251 252 FILE* fAidMem = fopen(AID_MEM_PATH, "w+"); 253 254 if (fAidMem == NULL) { 255 ALOGE("Error opening AID data file for writing: %s", strerror(errno)); 256 phNxpEse_free(cmdApdu.p_data); 257 return status; 258 } 259 while (cnt <= totalLen) { 260 wStatus = fprintf(fAidMem, "%02x", ArrayOfAIDs[selectCnt][cnt++]); 261 if (wStatus != 2) { 262 ALOGE("%s: Error writing AID data to AID_MEM file: %s", fn, 263 strerror(errno)); 264 break; 265 } 266 } 267 if (wStatus == 2) status = LSCSTATUS_SUCCESS; 268 fclose(fAidMem); 269 break; 270 } 271 } else if (((rspApdu.p_data[rspApdu.len - 2] != 0x90))) { 272 /*Copy the response SW in failure case*/ 273 memcpy(&gsLsExecuteResp[2], &(rspApdu.p_data[rspApdu.len - 2]), 2); 274 } else { 275 status = LSCSTATUS_FAILED; 276 } 277 } 278 phNxpEse_free(cmdApdu.p_data); 279 phNxpEse_free(rspApdu.p_data); 280 ALOGD_IF(ese_debug_enabled, "%s: exit; status=0x%x", fn, status); 281 return status; 282 } 283 284 /******************************************************************************* 285 ** 286 ** Function: LSC_StoreData 287 ** 288 ** Description: It is used to provide the LSC with an Unique 289 ** Identifier of the Application that has triggered the LSC 290 *script. 291 ** 292 ** Returns: Success if ok. 293 ** 294 *******************************************************************************/ 295 LSCSTATUS LSC_StoreData(Lsc_ImageInfo_t* Os_info, LSCSTATUS status, 296 Lsc_TranscieveInfo_t* pTranscv_Info) { 297 static const char fn[] = "LSC_StoreData"; 298 ALOGD_IF(ese_debug_enabled, "%s: enter", fn); 299 if (Os_info == NULL || pTranscv_Info == NULL) { 300 ALOGE("%s: Invalid parameter", fn); 301 return LSCSTATUS_FAILED; 302 } 303 304 phNxpEse_data cmdApdu; 305 phNxpEse_data rspApdu; 306 phNxpEse_memset(&cmdApdu, 0x00, sizeof(phNxpEse_data)); 307 phNxpEse_memset(&rspApdu, 0x00, sizeof(phNxpEse_data)); 308 cmdApdu.len = (int32_t)(5 + sizeof(gsStoreData)); 309 cmdApdu.p_data = (uint8_t*)phNxpEse_memalloc(cmdApdu.len * sizeof(uint8_t)); 310 311 uint32_t xx = 0; 312 int32_t len = 313 gsStoreData[1] + 2; //+2 offset is for tag value and length byte 314 cmdApdu.p_data[xx++] = STORE_DATA_CLA | (Os_info->Channel_Info[0].channel_id); 315 cmdApdu.p_data[xx++] = STORE_DATA_INS; 316 cmdApdu.p_data[xx++] = 0x00; // P1 317 cmdApdu.p_data[xx++] = 0x00; // P2 318 cmdApdu.p_data[xx++] = len; 319 memcpy(&(cmdApdu.p_data[xx]), gsStoreData, len); 320 321 ALOGD_IF(ese_debug_enabled, "%s: Calling Secure Element Transceive", fn); 322 ESESTATUS eseStat = phNxpEse_Transceive(&cmdApdu, &rspApdu); 323 324 if ((eseStat != ESESTATUS_SUCCESS) && (rspApdu.len == 0x00)) { 325 status = LSCSTATUS_FAILED; 326 ALOGE("%s: SE transceive failed status = 0x%X", fn, status); 327 } else if ((rspApdu.p_data[rspApdu.len - 2] == 0x90) && 328 (rspApdu.p_data[rspApdu.len - 1] == 0x00)) { 329 ALOGD_IF(ese_debug_enabled, "%s: STORE CMD is successful", fn); 330 status = LSCSTATUS_SUCCESS; 331 } else { 332 /*Copy the response SW in failure case*/ 333 memcpy(&gsLsExecuteResp[2], &(rspApdu.p_data[rspApdu.len - 2]), 2); 334 status = LSCSTATUS_FAILED; 335 } 336 phNxpEse_free(cmdApdu.p_data); 337 phNxpEse_free(rspApdu.p_data); 338 ALOGD_IF(ese_debug_enabled, "%s: exit; status=0x%x", fn, status); 339 return status; 340 } 341 342 /******************************************************************************* 343 ** 344 ** Function: LSC_loadapplet 345 ** 346 ** Description: Reads the script from the file and sent to Lsc 347 ** 348 ** Returns: Success if ok. 349 ** 350 *******************************************************************************/ 351 LSCSTATUS LSC_loadapplet(Lsc_ImageInfo_t* Os_info, LSCSTATUS status, 352 Lsc_TranscieveInfo_t* pTranscv_Info) { 353 static const char fn[] = "LSC_loadapplet"; 354 bool reachEOFCheck = false; 355 356 ALOGD_IF(ese_debug_enabled, "%s: enter", fn); 357 if (Os_info == NULL || pTranscv_Info == NULL) { 358 ALOGE("%s: Invalid parameter", fn); 359 return LSCSTATUS_FAILED; 360 } 361 if (Os_info->bytes_wrote == 0xAA) { 362 Os_info->fResp = fopen(Os_info->fls_RespPath, "a+"); 363 if (Os_info->fResp == NULL) { 364 ALOGE("%s: Error opening response recording file <%s> for reading: %s", 365 fn, Os_info->fls_path, strerror(errno)); 366 return LSCSTATUS_FAILED; 367 } 368 ALOGD_IF(ese_debug_enabled, 369 "%s: Response OUT FILE path is successfully created", fn); 370 } else { 371 ALOGD_IF(ese_debug_enabled, 372 "%s: Response Out file is optional as per input", fn); 373 } 374 375 Os_info->fp = fopen(Os_info->fls_path, "r"); 376 if (Os_info->fp == NULL) { 377 ALOGE("%s: Error opening OS image file <%s> for reading: %s", fn, 378 Os_info->fls_path, strerror(errno)); 379 return LSCSTATUS_FAILED; 380 } 381 int wResult = fseek(Os_info->fp, 0L, SEEK_END); 382 if (wResult) { 383 ALOGE("%s: Error seeking end OS image file %s", fn, strerror(errno)); 384 goto exit; 385 } 386 Os_info->fls_size = ftell(Os_info->fp); 387 if (Os_info->fls_size < 0) { 388 ALOGE("%s: Error ftelling file %s", fn, strerror(errno)); 389 goto exit; 390 } 391 wResult = fseek(Os_info->fp, 0L, SEEK_SET); 392 if (wResult) { 393 ALOGE("%s: Error seeking start image file %s", fn, strerror(errno)); 394 goto exit; 395 } 396 397 Os_info->bytes_read = 0; 398 status = LSC_Check_KeyIdentifier(Os_info, status, pTranscv_Info, NULL, 399 LSCSTATUS_FAILED, 0); 400 if (status != LSCSTATUS_SUCCESS) { 401 goto exit; 402 } 403 404 uint8_t len_byte, offset; 405 while (!feof(Os_info->fp) && (Os_info->bytes_read < Os_info->fls_size)) { 406 len_byte = 0; 407 offset = 0; 408 /*Check if the certificate/ is verified or not*/ 409 if (status != LSCSTATUS_SUCCESS) { 410 goto exit; 411 } 412 413 uint8_t temp_buf[1024]; 414 memset(temp_buf, 0, sizeof(temp_buf)); 415 status = LSC_ReadScript(Os_info, temp_buf); 416 if (status != LSCSTATUS_SUCCESS) { 417 goto exit; 418 } 419 /*Reset the flag in case further commands exists*/ 420 reachEOFCheck = false; 421 422 int32_t wLen = 0; 423 LSCSTATUS tag40_found = LSCSTATUS_SUCCESS; 424 if (temp_buf[offset] == TAG_LSC_CMD_ID) { 425 /* start sending the packet to Lsc */ 426 offset = offset + 1; 427 len_byte = Numof_lengthbytes(&temp_buf[offset], &wLen); 428 /* If the len data not present or len is less than or equal to 32 */ 429 if ((len_byte == 0) || (wLen <= 32)) { 430 ALOGE("%s: Invalid length zero", fn); 431 goto exit; 432 } 433 434 tag40_found = LSCSTATUS_SUCCESS; 435 offset = offset + len_byte; 436 pTranscv_Info->sSendlength = wLen; 437 memcpy(pTranscv_Info->sSendData, &temp_buf[offset], wLen); 438 439 status = LSC_SendtoLsc(Os_info, status, pTranscv_Info, LS_Comm); 440 if (status != LSCSTATUS_SUCCESS) { 441 /*When the switching of LS 6320 case*/ 442 if (status == LSCSTATUS_FILE_NOT_FOUND) { 443 /*When 6320 occurs close the existing channels*/ 444 LSC_CloseChannel(Os_info, status, pTranscv_Info); 445 446 status = LSCSTATUS_FAILED; 447 status = LSC_OpenChannel(Os_info, status, pTranscv_Info); 448 if (status == LSCSTATUS_SUCCESS) { 449 ALOGD_IF(ese_debug_enabled, 450 "%s: SUCCESS:Post Switching LS open channel", fn); 451 status = LSCSTATUS_FAILED; 452 status = LSC_SelectLsc(Os_info, status, pTranscv_Info); 453 if (status == LSCSTATUS_SUCCESS) { 454 ALOGD_IF(ese_debug_enabled, 455 "%s: SUCCESS:Post Switching LS select", fn); 456 status = LSCSTATUS_FAILED; 457 status = LSC_StoreData(Os_info, status, pTranscv_Info); 458 if (status == LSCSTATUS_SUCCESS) { 459 /*Enable certificate and signature verification*/ 460 tag40_found = LSCSTATUS_SUCCESS; 461 gsLsExecuteResp[2] = 0x90; 462 gsLsExecuteResp[3] = 0x00; 463 reachEOFCheck = true; 464 continue; 465 } 466 ALOGE("%s: Post Switching LS store data failure", fn); 467 } 468 ALOGE("%s: Post Switching LS select failure", fn); 469 } 470 ALOGE("%s: Post Switching LS failure", fn); 471 } 472 ALOGE("%s: Sending packet to lsc failed", fn); 473 goto exit; 474 } 475 } else if ((temp_buf[offset] == (0x7F)) && 476 (temp_buf[offset + 1] == (0x21))) { 477 ALOGD_IF(ese_debug_enabled, 478 "%s: TAGID: Encountered again certificate tag 7F21", fn); 479 if (tag40_found == LSCSTATUS_SUCCESS) { 480 ALOGD_IF(ese_debug_enabled, 481 "%s: 2nd Script processing starts with reselect", fn); 482 status = LSCSTATUS_FAILED; 483 status = LSC_SelectLsc(Os_info, status, pTranscv_Info); 484 if (status == LSCSTATUS_SUCCESS) { 485 ALOGD_IF(ese_debug_enabled, 486 "%s: 2nd Script select success next store data command", fn); 487 status = LSCSTATUS_FAILED; 488 status = LSC_StoreData(Os_info, status, pTranscv_Info); 489 if (status == LSCSTATUS_SUCCESS) { 490 ALOGD_IF(ese_debug_enabled, 491 "%s: 2nd Script store data success next certificate " 492 "verification", 493 fn); 494 offset = offset + 2; 495 len_byte = Numof_lengthbytes(&temp_buf[offset], &wLen); 496 status = LSC_Check_KeyIdentifier(Os_info, status, pTranscv_Info, 497 temp_buf, LSCSTATUS_SUCCESS, 498 wLen + len_byte + 2); 499 } 500 } 501 /*If the certificate and signature is verified*/ 502 if (status == LSCSTATUS_SUCCESS) { 503 /*If the certificate is verified for 6320 then new script starts*/ 504 tag40_found = LSCSTATUS_FAILED; 505 } else { 506 /*If the certificate or signature verification failed*/ 507 goto exit; 508 } 509 } else { 510 /*Already certificate&Sginature verified previously skip 7f21& tag 60*/ 511 memset(temp_buf, 0, sizeof(temp_buf)); 512 status = LSC_ReadScript(Os_info, temp_buf); 513 if (status != LSCSTATUS_SUCCESS) { 514 ALOGE("%s: Next Tag has to TAG 60 not found", fn); 515 goto exit; 516 } 517 if (temp_buf[offset] == TAG_JSBL_HDR_ID) 518 continue; 519 else 520 goto exit; 521 } 522 } else { 523 /* 524 * Invalid packet received in between stop processing packet 525 * return failed status 526 */ 527 status = LSCSTATUS_FAILED; 528 break; 529 } 530 } 531 if (Os_info->bytes_wrote == 0xAA) { 532 fclose(Os_info->fResp); 533 } 534 LSC_UpdateExeStatus(LS_SUCCESS_STATUS); 535 wResult = fclose(Os_info->fp); 536 ALOGD_IF(ese_debug_enabled, "%s: exit, status=0x%x", fn, status); 537 return status; 538 exit: 539 wResult = fclose(Os_info->fp); 540 if (Os_info->bytes_wrote == 0xAA) { 541 fclose(Os_info->fResp); 542 } 543 /*Script ends with SW 6320 and reached END OF FILE*/ 544 if (reachEOFCheck == true) { 545 status = LSCSTATUS_SUCCESS; 546 LSC_UpdateExeStatus(LS_SUCCESS_STATUS); 547 } 548 ALOGD_IF(ese_debug_enabled, "%s: exit; status= 0x%X", fn, status); 549 return status; 550 } 551 552 /******************************************************************************* 553 ** 554 ** Function: LSC_Check_KeyIdentifier 555 ** 556 ** Description: Checks and validates certificate 557 ** 558 ** Returns: Success if ok. 559 ** 560 *******************************************************************************/ 561 LSCSTATUS LSC_Check_KeyIdentifier(Lsc_ImageInfo_t* Os_info, LSCSTATUS status, 562 Lsc_TranscieveInfo_t* pTranscv_Info, 563 uint8_t* temp_buf, LSCSTATUS flag, 564 int32_t wNewLen) { 565 static const char fn[] = "LSC_Check_KeyIdentifier"; 566 status = LSCSTATUS_FAILED; 567 uint8_t read_buf[1024]; 568 uint16_t offset = 0, len_byte = 0; 569 int32_t wLen; 570 uint8_t certf_found = LSCSTATUS_FAILED; 571 572 ALOGD_IF(ese_debug_enabled, "%s: enter", fn); 573 574 while (!feof(Os_info->fp) && (Os_info->bytes_read < Os_info->fls_size)) { 575 offset = 0x00; 576 wLen = 0; 577 if (flag == LSCSTATUS_SUCCESS) { 578 /*If the 7F21 TAG is already read: After TAG 40*/ 579 memcpy(read_buf, temp_buf, wNewLen); 580 status = LSCSTATUS_SUCCESS; 581 flag = LSCSTATUS_FAILED; 582 } else { 583 /*If the 7F21 TAG is not read: Before TAG 40*/ 584 status = LSC_ReadScript(Os_info, read_buf); 585 } 586 if (status != LSCSTATUS_SUCCESS) return status; 587 if (LSCSTATUS_SUCCESS == 588 Check_Complete_7F21_Tag(Os_info, pTranscv_Info, read_buf, &offset)) { 589 ALOGD_IF(ese_debug_enabled, "%s: Certificate is verified", fn); 590 certf_found = LSCSTATUS_SUCCESS; 591 break; 592 } 593 /* 594 * The Loader Service Client ignores all subsequent commands starting by tag 595 * 7F21 or tag 60 until the first command starting by tag 40 is found 596 */ 597 else if (((read_buf[offset] == TAG_LSC_CMD_ID) && 598 (certf_found != LSCSTATUS_SUCCESS))) { 599 ALOGE("%s: NOT FOUND Root entity identifier's certificate", fn); 600 status = LSCSTATUS_FAILED; 601 return status; 602 } 603 } 604 memset(read_buf, 0, sizeof(read_buf)); 605 if (certf_found == LSCSTATUS_SUCCESS) { 606 offset = 0x00; 607 wLen = 0; 608 status = LSC_ReadScript(Os_info, read_buf); 609 if (status != LSCSTATUS_SUCCESS) return status; 610 if ((read_buf[offset] == TAG_JSBL_HDR_ID) && 611 (certf_found != LSCSTATUS_FAILED)) { 612 // TODO check the SElect cmd response and return status accordingly 613 ALOGD_IF(ese_debug_enabled, "%s: TAGID: TAG_JSBL_HDR_ID", fn); 614 offset = offset + 1; 615 len_byte = Numof_lengthbytes(&read_buf[offset], &wLen); 616 offset = offset + len_byte; 617 if (read_buf[offset] == TAG_SIGNATURE_ID) { 618 offset = offset + 1; 619 len_byte = Numof_lengthbytes(&read_buf[offset], &wLen); 620 offset = offset + len_byte; 621 ALOGD_IF(ese_debug_enabled, "%s: TAGID: TAG_SIGNATURE_ID", fn); 622 623 pTranscv_Info->sSendlength = wLen + 5; 624 625 pTranscv_Info->sSendData[0] = 0x00; 626 pTranscv_Info->sSendData[1] = 0xA0; 627 pTranscv_Info->sSendData[2] = 0x00; 628 pTranscv_Info->sSendData[3] = 0x00; 629 pTranscv_Info->sSendData[4] = wLen; 630 631 memcpy(&(pTranscv_Info->sSendData[5]), &read_buf[offset], wLen); 632 ALOGD_IF(ese_debug_enabled, "%s: start transceive for length %ld", fn, 633 (long)pTranscv_Info->sSendlength); 634 status = LSC_SendtoLsc(Os_info, status, pTranscv_Info, LS_Sign); 635 if (status != LSCSTATUS_SUCCESS) { 636 return status; 637 } 638 } 639 } else if (read_buf[offset] != TAG_JSBL_HDR_ID) { 640 status = LSCSTATUS_FAILED; 641 } 642 } else { 643 ALOGE("%s : Exit certificate verification failed", fn); 644 } 645 646 ALOGD_IF(ese_debug_enabled, "%s: exit: status=0x%x", fn, status); 647 return status; 648 } 649 650 /******************************************************************************* 651 ** 652 ** Function: LSC_ReadScript 653 ** 654 ** Description: Reads the current line if the script 655 ** 656 ** Returns: Success if ok. 657 ** 658 *******************************************************************************/ 659 LSCSTATUS LSC_ReadScript(Lsc_ImageInfo_t* Os_info, uint8_t* read_buf) { 660 static const char fn[] = "LSC_ReadScript"; 661 int32_t wResult = 0, wCount, wIndex = 0; 662 663 ALOGD_IF(ese_debug_enabled, "%s: enter", fn); 664 665 for (wCount = 0; (wCount < 2 && !feof(Os_info->fp)); wCount++, wIndex++) { 666 wResult = FSCANF_BYTE(Os_info->fp, "%2X", (unsigned int*)&read_buf[wIndex]); 667 } 668 if (wResult == 0) return LSCSTATUS_FAILED; 669 670 Os_info->bytes_read = Os_info->bytes_read + (wCount * 2); 671 672 int32_t lenOff = 1; 673 if ((read_buf[0] == 0x7f) && (read_buf[1] == 0x21)) { 674 for (wCount = 0; (wCount < 1 && !feof(Os_info->fp)); wCount++, wIndex++) { 675 wResult = 676 FSCANF_BYTE(Os_info->fp, "%2X", (unsigned int*)&read_buf[wIndex]); 677 } 678 if (wResult == 0) { 679 ALOGE("%s: Exit Read Script failed in 7F21 ", fn); 680 return LSCSTATUS_FAILED; 681 } 682 /*Read_Script from wCount*2 to wCount*1 */ 683 Os_info->bytes_read = Os_info->bytes_read + (wCount * 2); 684 lenOff = 2; 685 } else if ((read_buf[0] == 0x40) || (read_buf[0] == 0x60)) { 686 lenOff = 1; 687 } else { 688 /*If TAG is neither 7F21 nor 60 nor 40 then ABORT execution*/ 689 ALOGE("%s: Invalid TAG 0x%X found in the script", fn, read_buf[0]); 690 return LSCSTATUS_FAILED; 691 } 692 693 uint8_t len_byte = 0; 694 int32_t wLen; 695 if (read_buf[lenOff] == 0x00) { 696 ALOGE("%s: Invalid length zero", fn); 697 len_byte = 0x00; 698 return LSCSTATUS_FAILED; 699 } else if ((read_buf[lenOff] & 0x80) == 0x80) { 700 len_byte = read_buf[lenOff] & 0x0F; 701 len_byte = len_byte + 1; // 1 byte added for byte 0x81 702 703 ALOGD_IF(ese_debug_enabled, "%s: Length byte Read from 0x80 is 0x%x ", fn, 704 len_byte); 705 706 if (len_byte == 0x02) { 707 for (wCount = 0; (wCount < 1 && !feof(Os_info->fp)); wCount++, wIndex++) { 708 wResult = 709 FSCANF_BYTE(Os_info->fp, "%2X", (unsigned int*)&read_buf[wIndex]); 710 } 711 if (wResult == 0) { 712 ALOGE("%s: Exit Read Script failed in length 0x02 ", fn); 713 return LSCSTATUS_FAILED; 714 } 715 716 wLen = read_buf[lenOff + 1]; 717 Os_info->bytes_read = Os_info->bytes_read + (wCount * 2); 718 ALOGD_IF(ese_debug_enabled, 719 "%s: Length of Read Script in len_byte= 0x02 is 0x%x ", fn, 720 wLen); 721 } else if (len_byte == 0x03) { 722 for (wCount = 0; (wCount < 2 && !feof(Os_info->fp)); wCount++, wIndex++) { 723 wResult = 724 FSCANF_BYTE(Os_info->fp, "%2X", (unsigned int*)&read_buf[wIndex]); 725 } 726 if (wResult == 0) { 727 ALOGE("%s: Exit Read Script failed in length 0x03 ", fn); 728 return LSCSTATUS_FAILED; 729 } 730 731 Os_info->bytes_read = Os_info->bytes_read + (wCount * 2); 732 wLen = read_buf[lenOff + 1]; // Length of the packet send to LSC 733 wLen = ((wLen << 8) | (read_buf[lenOff + 2])); 734 ALOGD_IF(ese_debug_enabled, 735 "%s: Length of Read Script in len_byte= 0x03 is 0x%x ", fn, 736 wLen); 737 } else { 738 /*Need to provide the support if length is more than 2 bytes*/ 739 ALOGE("Length recived is greater than 3"); 740 return LSCSTATUS_FAILED; 741 } 742 } else { 743 len_byte = 0x01; 744 wLen = read_buf[lenOff]; 745 ALOGE("%s: Length of Read Script in len_byte= 0x01 is 0x%x ", fn, wLen); 746 } 747 748 for (wCount = 0; (wCount < wLen && !feof(Os_info->fp)); wCount++, wIndex++) { 749 wResult = FSCANF_BYTE(Os_info->fp, "%2X", (unsigned int*)&read_buf[wIndex]); 750 } 751 752 if (wResult == 0) { 753 ALOGE("%s: Exit Read Script failed in fscanf function ", fn); 754 return LSCSTATUS_FAILED; 755 } 756 Os_info->bytes_read = 757 Os_info->bytes_read + (wCount * 2) + 1; // not sure why 2 added 758 759 ALOGD_IF(ese_debug_enabled, "%s: exit: Num of bytes read=%d and index=%d", fn, 760 Os_info->bytes_read, wIndex); 761 762 return LSCSTATUS_SUCCESS; 763 } 764 765 /******************************************************************************* 766 ** 767 ** Function: LSC_SendtoEse 768 ** 769 ** Description: It is used to send the packet to p61 770 ** 771 ** Returns: Success if ok. 772 ** 773 *******************************************************************************/ 774 LSCSTATUS LSC_SendtoEse(Lsc_ImageInfo_t* Os_info, LSCSTATUS status, 775 Lsc_TranscieveInfo_t* pTranscv_Info) { 776 static const char fn[] = "LSC_SendtoEse"; 777 bool chanl_open_cmd = false; 778 779 ALOGD_IF(ese_debug_enabled, "%s: enter", fn); 780 781 /* Bufferize_load_cmds function is implemented in JCOP */ 782 status = Bufferize_load_cmds(Os_info, status, pTranscv_Info); 783 if (status != LSCSTATUS_FAILED) { 784 if (pTranscv_Info->sSendData[1] == 0x70) { 785 if (pTranscv_Info->sSendData[2] == 0x00) { 786 chanl_open_cmd = true; 787 } else { 788 for (uint8_t cnt = 0; cnt < Os_info->channel_cnt; cnt++) { 789 if (Os_info->Channel_Info[cnt].channel_id == 790 pTranscv_Info->sSendData[3]) { 791 ALOGD_IF(ese_debug_enabled, "%s: channel 0%x closed", fn, 792 Os_info->Channel_Info[cnt].channel_id); 793 Os_info->Channel_Info[cnt].isOpend = false; 794 } 795 } 796 } 797 } 798 799 phNxpEse_data cmdApdu; 800 phNxpEse_data rspApdu; 801 phNxpEse_memset(&cmdApdu, 0x00, sizeof(phNxpEse_data)); 802 phNxpEse_memset(&rspApdu, 0x00, sizeof(phNxpEse_data)); 803 804 cmdApdu.len = (int32_t)(pTranscv_Info->sSendlength); 805 cmdApdu.p_data = (uint8_t*)phNxpEse_memalloc(cmdApdu.len * sizeof(uint8_t)); 806 memcpy(cmdApdu.p_data, pTranscv_Info->sSendData, cmdApdu.len); 807 808 ESESTATUS eseStat = phNxpEse_Transceive(&cmdApdu, &rspApdu); 809 810 if (eseStat != ESESTATUS_SUCCESS) { 811 ALOGE("%s: Transceive failed; status=0x%X", fn, eseStat); 812 status = LSCSTATUS_FAILED; 813 } else { 814 if (chanl_open_cmd && (rspApdu.len == 0x03) && 815 ((rspApdu.p_data[rspApdu.len - 2] == 0x90) && 816 (rspApdu.p_data[rspApdu.len - 1] == 0x00))) { 817 ALOGD_IF(ese_debug_enabled, "%s: open channel success", fn); 818 uint8_t cnt = Os_info->channel_cnt; 819 Os_info->Channel_Info[cnt].channel_id = rspApdu.p_data[rspApdu.len - 3]; 820 Os_info->Channel_Info[cnt].isOpend = true; 821 Os_info->channel_cnt++; 822 } 823 memcpy(pTranscv_Info->sRecvData, rspApdu.p_data, rspApdu.len); 824 status = Process_EseResponse(pTranscv_Info, rspApdu.len, Os_info); 825 phNxpEse_free(cmdApdu.p_data); 826 phNxpEse_free(rspApdu.p_data); 827 } 828 } else if (gsSendBack_cmds == false) { 829 /* Workaround for issue in JCOP, send the fake response back */ 830 int32_t recvBufferActualSize = 0x03; 831 pTranscv_Info->sRecvData[0] = 0x00; 832 pTranscv_Info->sRecvData[1] = 0x90; 833 pTranscv_Info->sRecvData[2] = 0x00; 834 status = Process_EseResponse(pTranscv_Info, recvBufferActualSize, Os_info); 835 } else { 836 if (gsIslastcmdLoad == true) { 837 status = Send_Backall_Loadcmds(Os_info, status, pTranscv_Info); 838 gsSendBack_cmds = false; 839 } else { 840 memset(gsCmd_Buffer, 0, sizeof(gsCmd_Buffer)); 841 gsSendBack_cmds = false; 842 status = LSCSTATUS_FAILED; 843 } 844 } 845 846 ALOGD_IF(ese_debug_enabled, "%s: exit: status=0x%x", fn, status); 847 return status; 848 } 849 850 /******************************************************************************* 851 ** 852 ** Function: LSC_SendtoLsc 853 ** 854 ** Description: It is used to forward the packet to Lsc 855 ** 856 ** Returns: Success if ok. 857 ** 858 *******************************************************************************/ 859 LSCSTATUS LSC_SendtoLsc(Lsc_ImageInfo_t* Os_info, LSCSTATUS status, 860 Lsc_TranscieveInfo_t* pTranscv_Info, Ls_TagType tType) { 861 static const char fn[] = "LSC_SendtoLsc"; 862 863 ALOGD_IF(ese_debug_enabled, "%s: enter", fn); 864 pTranscv_Info->sSendData[0] = (0x80 | Os_info->Channel_Info[0].channel_id); 865 pTranscv_Info->timeout = gsTransceiveTimeout; 866 pTranscv_Info->sRecvlength = 1024; 867 868 phNxpEse_data cmdApdu; 869 phNxpEse_data rspApdu; 870 phNxpEse_memset(&cmdApdu, 0x00, sizeof(phNxpEse_data)); 871 phNxpEse_memset(&rspApdu, 0x00, sizeof(phNxpEse_data)); 872 cmdApdu.len = pTranscv_Info->sSendlength; 873 cmdApdu.p_data = (uint8_t*)phNxpEse_memalloc(cmdApdu.len * sizeof(uint8_t)); 874 memcpy(cmdApdu.p_data, pTranscv_Info->sSendData, cmdApdu.len); 875 876 ESESTATUS eseStat = phNxpEse_Transceive(&cmdApdu, &rspApdu); 877 878 if (eseStat != ESESTATUS_SUCCESS) { 879 ALOGE("%s: Transceive failed; status=0x%X", fn, eseStat); 880 status = LSCSTATUS_FAILED; 881 } else { 882 memcpy(pTranscv_Info->sRecvData, rspApdu.p_data, rspApdu.len); 883 status = LSC_ProcessResp(Os_info, rspApdu.len, pTranscv_Info, tType); 884 } 885 phNxpEse_free(cmdApdu.p_data); 886 phNxpEse_free(rspApdu.p_data); 887 ALOGD_IF(ese_debug_enabled, "%s: exit: status=0x%x", fn, status); 888 return status; 889 } 890 891 /******************************************************************************* 892 ** 893 ** Function: LSC_CloseChannel 894 ** 895 ** Description: Closes the previously opened logical channel 896 ** 897 ** Returns: Success if ok. 898 ** 899 *******************************************************************************/ 900 LSCSTATUS LSC_CloseChannel(Lsc_ImageInfo_t* Os_info, LSCSTATUS status, 901 Lsc_TranscieveInfo_t* pTranscv_Info) { 902 static const char fn[] = "LSC_CloseChannel"; 903 status = LSCSTATUS_FAILED; 904 905 ALOGD_IF(ese_debug_enabled, "%s: enter", fn); 906 907 if (Os_info == NULL || pTranscv_Info == NULL) { 908 ALOGE("%s: Invalid parameter", fn); 909 return LSCSTATUS_FAILED; 910 } 911 for (uint8_t cnt = 0; (cnt < Os_info->channel_cnt); cnt++) { 912 phNxpEse_data cmdApdu; 913 phNxpEse_data rspApdu; 914 915 phNxpEse_memset(&cmdApdu, 0x00, sizeof(phNxpEse_data)); 916 phNxpEse_memset(&rspApdu, 0x00, sizeof(phNxpEse_data)); 917 918 cmdApdu.len = 5; 919 cmdApdu.p_data = (uint8_t*)phNxpEse_memalloc(cmdApdu.len * sizeof(uint8_t)); 920 if (!Os_info->Channel_Info[cnt].isOpend) continue; 921 uint8_t xx = 0; 922 cmdApdu.p_data[xx++] = Os_info->Channel_Info[cnt].channel_id; 923 cmdApdu.p_data[xx++] = 0x70; 924 cmdApdu.p_data[xx++] = 0x80; 925 cmdApdu.p_data[xx++] = Os_info->Channel_Info[cnt].channel_id; 926 cmdApdu.p_data[xx++] = 0x00; 927 928 ESESTATUS eseStat = phNxpEse_Transceive(&cmdApdu, &rspApdu); 929 930 if (eseStat != ESESTATUS_SUCCESS || rspApdu.len < 2) { 931 ALOGD_IF(ese_debug_enabled, "%s: Transceive failed; status=0x%X", fn, 932 eseStat); 933 } else if ((rspApdu.p_data[rspApdu.len - 2] == 0x90) && 934 (rspApdu.p_data[rspApdu.len - 1] == 0x00)) { 935 ALOGD_IF(ese_debug_enabled, "%s: Close channel id = 0x0%x success", fn, 936 Os_info->Channel_Info[cnt].channel_id); 937 status = LSCSTATUS_SUCCESS; 938 } else { 939 ALOGD_IF(ese_debug_enabled, "%s: Close channel id = 0x0%x failed", fn, 940 Os_info->Channel_Info[cnt].channel_id); 941 } 942 phNxpEse_free(cmdApdu.p_data); 943 phNxpEse_free(rspApdu.p_data); 944 } 945 ALOGD_IF(ese_debug_enabled, "%s: exit; status=0x0%x", fn, status); 946 return status; 947 } 948 949 /******************************************************************************* 950 ** 951 ** Function: LSC_ProcessResp 952 ** 953 ** Description: Process the response packet received from Lsc 954 ** 955 ** Returns: Success if ok. 956 ** 957 *******************************************************************************/ 958 LSCSTATUS LSC_ProcessResp(Lsc_ImageInfo_t* image_info, int32_t recvlen, 959 Lsc_TranscieveInfo_t* trans_info, Ls_TagType tType) { 960 static const char fn[] = "LSC_ProcessResp"; 961 uint8_t* RecvData = trans_info->sRecvData; 962 963 ALOGD_IF(ese_debug_enabled, "%s: enter", fn); 964 965 if (RecvData == NULL && recvlen == 0x00) { 966 ALOGE("%s: Invalid parameter.", fn); 967 return LSCSTATUS_FAILED; 968 } else if (recvlen < 2) { 969 ALOGE("%s: Invalid response.", fn); 970 return LSCSTATUS_FAILED; 971 } 972 973 char sw[2]; 974 sw[0] = RecvData[recvlen - 2]; 975 sw[1] = RecvData[recvlen - 1]; 976 ALOGD_IF(ese_debug_enabled, "%s: Process Response SW, status = 0x%2X%2X", fn, 977 sw[0], sw[1]); 978 979 /*Update the Global variable for storing response length*/ 980 gsResp_len = recvlen; 981 if (sw[0] != 0x63) { 982 gsLsExecuteResp[2] = sw[0]; 983 gsLsExecuteResp[3] = sw[1]; 984 } 985 986 LSCSTATUS status = LSCSTATUS_FAILED; 987 if ((recvlen == 0x02) && (sw[0] == 0x90) && (sw[1] == 0x00)) { 988 status = Write_Response_To_OutFile(image_info, RecvData, recvlen, tType); 989 } else if ((recvlen > 0x02) && (sw[0] == 0x90) && (sw[1] == 0x00)) { 990 status = Write_Response_To_OutFile(image_info, RecvData, recvlen, tType); 991 } else if ((recvlen > 0x02) && (sw[0] == 0x63) && (sw[1] == 0x10)) { 992 static int32_t temp_len = 0; 993 if (temp_len != 0) { 994 memcpy((trans_info->sTemp_recvbuf + temp_len), RecvData, (recvlen - 2)); 995 trans_info->sSendlength = temp_len + (recvlen - 2); 996 memcpy(trans_info->sSendData, trans_info->sTemp_recvbuf, 997 trans_info->sSendlength); 998 temp_len = 0; 999 } else { 1000 memcpy(trans_info->sSendData, RecvData, (recvlen - 2)); 1001 trans_info->sSendlength = recvlen - 2; 1002 } 1003 status = LSC_SendtoEse(image_info, status, trans_info); 1004 } else if ((recvlen > 0x02) && (sw[0] == 0x63) && (sw[1] == 0x20)) { 1005 uint8_t aid_array[22]; 1006 aid_array[0] = recvlen + 3; 1007 aid_array[1] = 00; 1008 aid_array[2] = 0xA4; 1009 aid_array[3] = 0x04; 1010 aid_array[4] = 0x00; 1011 aid_array[5] = recvlen - 2; 1012 memcpy(&aid_array[6], &RecvData[0], recvlen - 2); 1013 memcpy(&ArrayOfAIDs[2][0], &aid_array[0], recvlen + 4); 1014 1015 FILE* fAidMem = fopen(AID_MEM_PATH, "w"); 1016 1017 if (fAidMem == NULL) { 1018 ALOGE("%s: Error opening AID data for writing: %s", fn, strerror(errno)); 1019 return LSCSTATUS_FAILED; 1020 } 1021 1022 /*Updating the AID_MEM with new value into AID file*/ 1023 uint8_t respLen = 0; 1024 int32_t wStatus = 0; 1025 while (respLen <= (recvlen + 4)) { 1026 wStatus = fprintf(fAidMem, "%2x", aid_array[respLen++]); 1027 if (wStatus != 2) { 1028 ALOGE("%s: Invalid Response during fprintf; status=0x%x", fn, wStatus); 1029 fclose(fAidMem); 1030 break; 1031 } 1032 } 1033 if (wStatus == 2) { 1034 status = LSCSTATUS_FILE_NOT_FOUND; 1035 } else { 1036 status = LSCSTATUS_FAILED; 1037 } 1038 } else if ((recvlen >= 0x02) && 1039 ((sw[0] != 0x90) && (sw[0] != 0x63) && (sw[0] != 0x61))) { 1040 Write_Response_To_OutFile(image_info, RecvData, recvlen, tType); 1041 } 1042 ALOGD_IF(ese_debug_enabled, "%s: exit: status=0x%x", fn, status); 1043 return status; 1044 } 1045 1046 /******************************************************************************* 1047 ** 1048 ** Function: Process_EseResponse 1049 ** 1050 ** Description: It is used to process the received response packet from ESE 1051 ** 1052 ** Returns: Success if ok. 1053 ** 1054 *******************************************************************************/ 1055 LSCSTATUS Process_EseResponse(Lsc_TranscieveInfo_t* pTranscv_Info, 1056 int32_t recv_len, Lsc_ImageInfo_t* Os_info) { 1057 static const char fn[] = "Process_EseResponse"; 1058 LSCSTATUS status = LSCSTATUS_SUCCESS; 1059 uint8_t xx = 0; 1060 ALOGD_IF(ese_debug_enabled, "%s: enter", fn); 1061 1062 pTranscv_Info->sSendData[xx++] = 1063 (CLA_BYTE | Os_info->Channel_Info[0].channel_id); 1064 pTranscv_Info->sSendData[xx++] = 0xA2; 1065 1066 if (recv_len <= 0xFF) { 1067 pTranscv_Info->sSendData[xx++] = 0x80; 1068 pTranscv_Info->sSendData[xx++] = 0x00; 1069 pTranscv_Info->sSendData[xx++] = (uint8_t)recv_len; 1070 memcpy(&(pTranscv_Info->sSendData[xx]), pTranscv_Info->sRecvData, recv_len); 1071 pTranscv_Info->sSendlength = xx + recv_len; 1072 status = LSC_SendtoLsc(Os_info, status, pTranscv_Info, LS_Comm); 1073 } else { 1074 while (recv_len > MAX_SIZE) { 1075 xx = PARAM_P1_OFFSET; 1076 pTranscv_Info->sSendData[xx++] = 0x00; 1077 pTranscv_Info->sSendData[xx++] = 0x00; 1078 pTranscv_Info->sSendData[xx++] = MAX_SIZE; 1079 recv_len = recv_len - MAX_SIZE; 1080 memcpy(&(pTranscv_Info->sSendData[xx]), pTranscv_Info->sRecvData, 1081 MAX_SIZE); 1082 pTranscv_Info->sSendlength = xx + MAX_SIZE; 1083 /* 1084 * Need not store Process eSE response's response in the out file so 1085 * LS_Comm = 0 1086 */ 1087 status = LSC_SendtoLsc(Os_info, status, pTranscv_Info, LS_Comm); 1088 if (status != LSCSTATUS_SUCCESS) { 1089 ALOGE("%s: Sending packet to Lsc failed: status=0x%x", fn, status); 1090 return status; 1091 } 1092 } 1093 xx = PARAM_P1_OFFSET; 1094 pTranscv_Info->sSendData[xx++] = LAST_BLOCK; 1095 pTranscv_Info->sSendData[xx++] = 0x01; 1096 pTranscv_Info->sSendData[xx++] = recv_len; 1097 memcpy(&(pTranscv_Info->sSendData[xx]), pTranscv_Info->sRecvData, recv_len); 1098 pTranscv_Info->sSendlength = xx + recv_len; 1099 status = LSC_SendtoLsc(Os_info, status, pTranscv_Info, LS_Comm); 1100 } 1101 ALOGD_IF(ese_debug_enabled, "%s: exit: status=0x%x", fn, status); 1102 return status; 1103 } 1104 1105 /******************************************************************************* 1106 ** 1107 ** Function: Process_SelectRsp 1108 ** 1109 ** Description: It is used to process the received response for SELECT LSC 1110 ** cmd. 1111 ** 1112 ** Returns: Success if ok. 1113 ** 1114 *******************************************************************************/ 1115 LSCSTATUS Process_SelectRsp(uint8_t* Recv_data, int32_t Recv_len) { 1116 static const char fn[] = "Process_SelectRsp"; 1117 ALOGD_IF(ese_debug_enabled, "%s: enter", fn); 1118 1119 if (Recv_len < 2) { 1120 ALOGE("%s: Invalid response length %d", fn, Recv_len); 1121 return LSCSTATUS_FAILED; 1122 } 1123 1124 int i = 0; 1125 if (Recv_data[i] != TAG_SELECT_ID) { 1126 ALOGE("%s: Invalid FCI TAG = 0x%x", fn, Recv_data[i]); 1127 return LSCSTATUS_FAILED; 1128 } 1129 i++; 1130 int len = Recv_data[i++]; 1131 if (Recv_len < len + 2) { 1132 ALOGE("%s: Invalid response length %d", fn, Recv_len); 1133 return LSCSTATUS_FAILED; 1134 } 1135 if (Recv_data[i] != TAG_LSC_ID) { 1136 ALOGE("%s: Invalid Loader Service AID TAG ID = 0x%x", fn, Recv_data[i]); 1137 return LSCSTATUS_FAILED; 1138 } 1139 i++; 1140 len = Recv_data[i]; 1141 i = i + 1 + len; // points to next tag name A5 1142 // points to TAG 9F08 for LS application version 1143 if ((Recv_data[i] != TAG_LS_VER1) || (Recv_data[i + 1] != TAG_LS_VER2)) { 1144 ALOGE("%s: Invalid LS Version = 0x%2X%2X", fn, Recv_data[i], 1145 Recv_data[i + 1]); 1146 return LSCSTATUS_FAILED; 1147 } 1148 uint8_t lsaVersionLen = 0; 1149 i = i + 2; 1150 lsaVersionLen = Recv_data[i]; 1151 // points to TAG 9F08 LS application version 1152 i++; 1153 // points to Identifier of the Root Entity key set identifier 1154 i = i + lsaVersionLen; 1155 1156 if (Recv_data[i] != TAG_RE_KEYID) { 1157 ALOGE("%s: Invalid Root entity key set TAG ID = 0x%x", fn, Recv_data[i]); 1158 return LSCSTATUS_FAILED; 1159 } 1160 1161 i = i + 2; 1162 if (Recv_data[i] != TAG_LSRE_ID) { 1163 ALOGE("%s: Invalid Root entity for TAG 42 = 0x%x", fn, Recv_data[i]); 1164 return LSCSTATUS_FAILED; 1165 } 1166 i++; 1167 uint8_t tag42Len = Recv_data[i]; 1168 // copy the data including length 1169 memcpy(gsTag42Arr, &Recv_data[i], tag42Len + 1); 1170 i = i + tag42Len + 1; 1171 ALOGD_IF(ese_debug_enabled, "%s: gsTag42Arr %s", fn, gsTag42Arr); 1172 if (Recv_data[i] != TAG_LSRE_SIGNID) { 1173 ALOGE("%s: Invalid Root entity for TAG 45 = 0x%x", fn, Recv_data[i]); 1174 return LSCSTATUS_FAILED; 1175 } 1176 uint8_t tag45Len = Recv_data[i + 1]; 1177 memcpy(gsTag45Arr, &Recv_data[i + 1], tag45Len + 1); 1178 ALOGD_IF(ese_debug_enabled, "%s: Exiting", fn); 1179 return LSCSTATUS_SUCCESS; 1180 } 1181 1182 LSCSTATUS Bufferize_load_cmds(__attribute__((unused)) Lsc_ImageInfo_t* Os_info, 1183 __attribute__((unused)) LSCSTATUS status, 1184 Lsc_TranscieveInfo_t* pTranscv_Info) { 1185 static const char fn[] = "Bufferize_load_cmds"; 1186 1187 if (gsCmd_count == 0x00) { 1188 if ((pTranscv_Info->sSendData[1] == INSTAL_LOAD_ID) && 1189 (pTranscv_Info->sSendData[2] == PARAM_P1_OFFSET) && 1190 (pTranscv_Info->sSendData[3] == 0x00)) { 1191 ALOGD_IF(ese_debug_enabled, "%s: BUffer: install for load", fn); 1192 gspBuffer[0] = pTranscv_Info->sSendlength; 1193 memcpy(&gspBuffer[1], &(pTranscv_Info->sSendData[0]), 1194 pTranscv_Info->sSendlength); 1195 gspBuffer = gspBuffer + pTranscv_Info->sSendlength + 1; 1196 gsCmd_count++; 1197 return LSCSTATUS_FAILED; 1198 } 1199 /* Do not buffer this cmd, Send to eSE */ 1200 return LSCSTATUS_SUCCESS; 1201 } else { 1202 uint8_t Param_P2 = gsCmd_count - 1; 1203 if ((pTranscv_Info->sSendData[1] == LOAD_CMD_ID) && 1204 (pTranscv_Info->sSendData[2] == LOAD_MORE_BLOCKS) && 1205 (pTranscv_Info->sSendData[3] == Param_P2)) { 1206 ALOGD_IF(ese_debug_enabled, "%s: BUffer: load", fn); 1207 gspBuffer[0] = pTranscv_Info->sSendlength; 1208 memcpy(&gspBuffer[1], &(pTranscv_Info->sSendData[0]), 1209 pTranscv_Info->sSendlength); 1210 gspBuffer = gspBuffer + pTranscv_Info->sSendlength + 1; 1211 gsCmd_count++; 1212 } else if ((pTranscv_Info->sSendData[1] == LOAD_CMD_ID) && 1213 (pTranscv_Info->sSendData[2] == LOAD_LAST_BLOCK) && 1214 (pTranscv_Info->sSendData[3] == Param_P2)) { 1215 ALOGD_IF(ese_debug_enabled, "%s: BUffer: last load", fn); 1216 gsSendBack_cmds = true; 1217 gspBuffer[0] = pTranscv_Info->sSendlength; 1218 memcpy(&gspBuffer[1], &(pTranscv_Info->sSendData[0]), 1219 pTranscv_Info->sSendlength); 1220 gspBuffer = gspBuffer + pTranscv_Info->sSendlength + 1; 1221 gsCmd_count++; 1222 gsIslastcmdLoad = true; 1223 } else { 1224 ALOGD_IF(ese_debug_enabled, "%s: BUffer: Not a load cmd", fn); 1225 gsSendBack_cmds = true; 1226 gspBuffer[0] = pTranscv_Info->sSendlength; 1227 memcpy(&gspBuffer[1], &(pTranscv_Info->sSendData[0]), 1228 pTranscv_Info->sSendlength); 1229 gspBuffer = gspBuffer + pTranscv_Info->sSendlength + 1; 1230 gsIslastcmdLoad = false; 1231 gsCmd_count++; 1232 } 1233 } 1234 ALOGD_IF(ese_debug_enabled, "%s: exit", fn); 1235 return LSCSTATUS_FAILED; 1236 } 1237 1238 LSCSTATUS Send_Backall_Loadcmds(Lsc_ImageInfo_t* Os_info, LSCSTATUS status, 1239 Lsc_TranscieveInfo_t* pTranscv_Info) { 1240 static const char fn[] = "Send_Backall_Loadcmds"; 1241 status = LSCSTATUS_FAILED; 1242 1243 ALOGD_IF(ese_debug_enabled, "%s: enter", fn); 1244 gspBuffer = gsCmd_Buffer; // Points to start of first cmd to send 1245 if (gsCmd_count == 0x00) { 1246 ALOGD_IF(ese_debug_enabled, "%s: No cmds stored to send to eSE", fn); 1247 } else { 1248 while (gsCmd_count-- > 0) { 1249 phNxpEse_data cmdApdu; 1250 phNxpEse_data rspApdu; 1251 phNxpEse_memset(&cmdApdu, 0x00, sizeof(phNxpEse_data)); 1252 phNxpEse_memset(&rspApdu, 0x00, sizeof(phNxpEse_data)); 1253 1254 cmdApdu.len = (int32_t)(gspBuffer[0]); 1255 cmdApdu.p_data = 1256 (uint8_t*)phNxpEse_memalloc(cmdApdu.len * sizeof(uint8_t)); 1257 gspBuffer = gspBuffer + 1 + cmdApdu.len; 1258 1259 memcpy(cmdApdu.p_data, &gspBuffer[1], cmdApdu.len); 1260 1261 ESESTATUS eseStat = phNxpEse_Transceive(&cmdApdu, &rspApdu); 1262 memcpy(pTranscv_Info->sRecvData, rspApdu.p_data, rspApdu.len); 1263 int32_t recvBufferActualSize = rspApdu.len; 1264 phNxpEse_free(cmdApdu.p_data); 1265 phNxpEse_free(rspApdu.p_data); 1266 1267 if (eseStat != LSCSTATUS_SUCCESS || (recvBufferActualSize < 2)) { 1268 ALOGE("%s: Transceive failed; status=0x%X", fn, eseStat); 1269 } else if (gsCmd_count == 0x00) { 1270 // Last command in the buffer 1271 if (gsIslastcmdLoad == false) { 1272 status = 1273 Process_EseResponse(pTranscv_Info, recvBufferActualSize, Os_info); 1274 } else if ((recvBufferActualSize == 0x02) && 1275 (pTranscv_Info->sRecvData[recvBufferActualSize - 2] == 1276 0x90) && 1277 (pTranscv_Info->sRecvData[recvBufferActualSize - 1] == 1278 0x00)) { 1279 recvBufferActualSize = 0x03; 1280 pTranscv_Info->sRecvData[0] = 0x00; 1281 pTranscv_Info->sRecvData[1] = 0x90; 1282 pTranscv_Info->sRecvData[2] = 0x00; 1283 status = 1284 Process_EseResponse(pTranscv_Info, recvBufferActualSize, Os_info); 1285 } else { 1286 status = 1287 Process_EseResponse(pTranscv_Info, recvBufferActualSize, Os_info); 1288 } 1289 } else if ((recvBufferActualSize == 0x02) && 1290 (pTranscv_Info->sRecvData[0] == 0x90) && 1291 (pTranscv_Info->sRecvData[1] == 0x00)) { 1292 /*response ok without data, send next command in the buffer*/ 1293 } else if ((recvBufferActualSize == 0x03) && 1294 (pTranscv_Info->sRecvData[0] == 0x00) && 1295 (pTranscv_Info->sRecvData[1] == 0x90) && 1296 (pTranscv_Info->sRecvData[2] == 0x00)) { 1297 /*response ok without data, send next command in the buffer*/ 1298 } else if ((pTranscv_Info->sRecvData[recvBufferActualSize - 2] != 0x90) && 1299 (pTranscv_Info->sRecvData[recvBufferActualSize - 1] != 0x00)) { 1300 /*Error condition hence exiting the loop*/ 1301 status = 1302 Process_EseResponse(pTranscv_Info, recvBufferActualSize, Os_info); 1303 /*If the sending of Load fails reset the count*/ 1304 gsCmd_count = 0; 1305 break; 1306 } 1307 } 1308 } 1309 memset(gsCmd_Buffer, 0, sizeof(gsCmd_Buffer)); 1310 gspBuffer = gsCmd_Buffer; // point back to start of line 1311 gsCmd_count = 0x00; 1312 ALOGD_IF(ese_debug_enabled, "%s: exit: status=0x%x", fn, status); 1313 return status; 1314 } 1315 /******************************************************************************* 1316 ** 1317 ** Function: Numof_lengthbytes 1318 ** 1319 ** Description: Checks the number of length bytes and assigns 1320 ** length value to wLen. 1321 ** 1322 ** Returns: Number of Length bytes 1323 ** 1324 *******************************************************************************/ 1325 uint8_t Numof_lengthbytes(uint8_t* read_buf, int32_t* pLen) { 1326 static const char fn[] = "Numof_lengthbytes"; 1327 uint8_t len_byte = 0; 1328 ALOGD_IF(ese_debug_enabled, "%s: enter", fn); 1329 1330 if (read_buf[0] == 0x00) { 1331 ALOGE("%s: Invalid length zero", fn); 1332 len_byte = 0x00; 1333 } else if ((read_buf[0] & 0x80) == 0x80) { 1334 len_byte = read_buf[0] & 0x0F; 1335 len_byte = len_byte + 1; // 1 byte added for byte 0x81 1336 } else { 1337 len_byte = 0x01; 1338 } 1339 1340 /* To get the length of the value field */ 1341 int32_t wLen = 0; 1342 switch (len_byte) { 1343 case 0: 1344 wLen = read_buf[0]; 1345 break; 1346 case 1: 1347 /*1st byte is the length*/ 1348 wLen = read_buf[0]; 1349 break; 1350 case 2: 1351 /*2nd byte is the length*/ 1352 wLen = read_buf[1]; 1353 break; 1354 case 3: 1355 /*1st and 2nd bytes are length*/ 1356 wLen = read_buf[1]; 1357 wLen = ((wLen << 8) | (read_buf[2])); 1358 break; 1359 case 4: 1360 /*3bytes are the length*/ 1361 wLen = read_buf[1]; 1362 wLen = ((wLen << 16) | (read_buf[2] << 8)); 1363 wLen = (wLen | (read_buf[3])); 1364 break; 1365 default: 1366 ALOGE("%s: Invalid length %d.", fn, len_byte); 1367 break; 1368 } 1369 1370 *pLen = wLen; 1371 ALOGD_IF(ese_debug_enabled, "%s: exit; len_bytes=0x0%x, Length=%d", fn, 1372 len_byte, *pLen); 1373 return len_byte; 1374 } 1375 1376 /******************************************************************************* 1377 ** 1378 ** Function: Write_Response_To_OutFile 1379 ** 1380 ** Description: Write the response to Out file 1381 ** with length recvlen from buffer RecvData. 1382 ** 1383 ** Returns: Success if OK 1384 ** 1385 *******************************************************************************/ 1386 LSCSTATUS Write_Response_To_OutFile(Lsc_ImageInfo_t* image_info, 1387 uint8_t* RecvData, int32_t recvlen, 1388 Ls_TagType tType) { 1389 static const char fn[] = "Write_Response_to_OutFile"; 1390 1391 ALOGD_IF(ese_debug_enabled, "%s: Enter", fn); 1392 /*If the Response out file is NULL or Other than LS commands*/ 1393 if ((image_info->bytes_wrote == 0x55) || (tType == LS_Default)) { 1394 return LSCSTATUS_SUCCESS; 1395 } 1396 1397 uint8_t tag43Len = 1; 1398 /*Certificate TAG occupies 2 bytes*/ 1399 if (tType == LS_Cert) { 1400 tag43Len = 2; 1401 } 1402 1403 /* |TAG|LEN| VAL | 1404 * |61 |XX |TAG|LEN| VAL |TAG| LEN | VAL | 1405 * |43 |1/2|7F21/60/40|44 |apduRespLen|apduResponse| 1406 */ 1407 int32_t tag44Len = 0; 1408 uint8_t ucTag44[3] = {0x00, 0x00, 0x00}; 1409 int32_t tag61Len = 0; 1410 uint8_t tag43off = 0; 1411 uint8_t tag44off = 0; 1412 uint8_t tagLen = 0; 1413 uint8_t tagBuffer[12] = {0x61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 1414 if (recvlen < 0x80) { 1415 tag44Len = 1; 1416 ucTag44[0] = recvlen; 1417 tag61Len = recvlen + 4 + tag43Len; 1418 1419 if (tag61Len & 0x80) { 1420 tagBuffer[1] = 0x81; 1421 tagBuffer[2] = tag61Len; 1422 tag43off = 3; 1423 tag44off = 5 + tag43Len; 1424 tagLen = tag44off + 2; 1425 } else { 1426 tagBuffer[1] = tag61Len; 1427 tag43off = 2; 1428 tag44off = 4 + tag43Len; 1429 tagLen = tag44off + 2; 1430 } 1431 } else if ((recvlen >= 0x80) && (recvlen <= 0xFF)) { 1432 ucTag44[0] = 0x81; 1433 ucTag44[1] = recvlen; 1434 tag61Len = recvlen + 5 + tag43Len; 1435 tag44Len = 2; 1436 1437 if ((tag61Len & 0xFF00) != 0) { 1438 tagBuffer[1] = 0x82; 1439 tagBuffer[2] = (tag61Len & 0xFF00) >> 8; 1440 tagBuffer[3] = (tag61Len & 0xFF); 1441 tag43off = 4; 1442 tag44off = 6 + tag43Len; 1443 tagLen = tag44off + 3; 1444 } else { 1445 tagBuffer[1] = 0x81; 1446 tagBuffer[2] = (tag61Len & 0xFF); 1447 tag43off = 3; 1448 tag44off = 5 + tag43Len; 1449 tagLen = tag44off + 3; 1450 } 1451 } else if ((recvlen > 0xFF) && (recvlen <= 0xFFFF)) { 1452 ucTag44[0] = 0x82; 1453 ucTag44[1] = (recvlen & 0xFF00) >> 8; 1454 ucTag44[2] = (recvlen & 0xFF); 1455 tag44Len = 3; 1456 1457 tag61Len = recvlen + 6 + tag43Len; 1458 1459 if ((tag61Len & 0xFF00) != 0) { 1460 tagBuffer[1] = 0x82; 1461 tagBuffer[2] = (tag61Len & 0xFF00) >> 8; 1462 tagBuffer[3] = (tag61Len & 0xFF); 1463 tag43off = 4; 1464 tag44off = 6 + tag43Len; 1465 tagLen = tag44off + 4; 1466 } 1467 } 1468 tagBuffer[tag43off] = 0x43; 1469 tagBuffer[tag43off + 1] = tag43Len; 1470 tagBuffer[tag44off] = 0x44; 1471 memcpy(&tagBuffer[tag44off + 1], &ucTag44[0], tag44Len); 1472 1473 if (tType == LS_Cert) { 1474 tagBuffer[tag43off + 2] = 0x7F; 1475 tagBuffer[tag43off + 3] = 0x21; 1476 } else if (tType == LS_Sign) { 1477 tagBuffer[tag43off + 2] = 0x60; 1478 } else if (tType == LS_Comm) { 1479 tagBuffer[tag43off + 2] = 0x40; 1480 } else { 1481 /*Do nothing*/ 1482 } 1483 1484 uint8_t tempLen = 0; 1485 LSCSTATUS wStatus = LSCSTATUS_FAILED; 1486 int32_t status = 0; 1487 while (tempLen < tagLen) { 1488 status = fprintf(image_info->fResp, "%02X", tagBuffer[tempLen++]); 1489 if (status != 2) { 1490 ALOGE("%s: Invalid Response during fprintf; status=0x%x", fn, (status)); 1491 wStatus = LSCSTATUS_FAILED; 1492 break; 1493 } 1494 } 1495 /*Updating the response data into out script*/ 1496 int32_t respLen = 0; 1497 while (respLen < recvlen) { 1498 status = fprintf(image_info->fResp, "%02X", RecvData[respLen++]); 1499 if (status != 2) { 1500 ALOGE("%s: Invalid Response during fprintf; status=0x%x", fn, (status)); 1501 wStatus = LSCSTATUS_FAILED; 1502 break; 1503 } 1504 } 1505 if (status == 2) { 1506 fprintf(image_info->fResp, "%s\n", ""); 1507 ALOGD_IF(ese_debug_enabled, 1508 "%s: SUCCESS Response written to script out file", fn); 1509 wStatus = LSCSTATUS_SUCCESS; 1510 } 1511 fflush(image_info->fResp); 1512 return wStatus; 1513 } 1514 1515 /******************************************************************************* 1516 ** 1517 ** Function: Check_Certificate_Tag 1518 ** 1519 ** Description: Check certificate Tag presence in script 1520 ** by 7F21 . 1521 ** 1522 ** Returns: Success if Tag found 1523 ** 1524 *******************************************************************************/ 1525 LSCSTATUS Check_Certificate_Tag(uint8_t* read_buf, uint16_t* offset1) { 1526 static const char fn[] = "Check_Certificate_Tag"; 1527 uint16_t offset = *offset1; 1528 1529 if (((read_buf[offset] << 8 | read_buf[offset + 1]) == TAG_CERTIFICATE)) { 1530 ALOGD_IF(ese_debug_enabled, "%s: TAGID: TAG_CERTIFICATE", fn); 1531 int32_t wLen; 1532 offset = offset + 2; 1533 uint16_t len_byte = Numof_lengthbytes(&read_buf[offset], &wLen); 1534 offset = offset + len_byte; 1535 *offset1 = offset; 1536 if (wLen <= MAX_CERT_LEN) return LSCSTATUS_SUCCESS; 1537 } 1538 return LSCSTATUS_FAILED; 1539 } 1540 1541 /******************************************************************************* 1542 ** 1543 ** Function: Check_SerialNo_Tag 1544 ** 1545 ** Description: Check Serial number Tag presence in script 1546 ** by 0x93 . 1547 ** 1548 ** Returns: Success if Tag found 1549 ** 1550 *******************************************************************************/ 1551 LSCSTATUS Check_SerialNo_Tag(uint8_t* read_buf, uint16_t* offset1) { 1552 static const char fn[] = "Check_SerialNo_Tag"; 1553 uint16_t offset = *offset1; 1554 1555 if (read_buf[offset] == TAG_SERIAL_NO) { 1556 ALOGD_IF(ese_debug_enabled, "%s: TAGID: TAG_SERIAL_NO", fn); 1557 uint8_t serNoLen = read_buf[offset + 1]; 1558 offset = offset + serNoLen + 2; 1559 *offset1 = offset; 1560 ALOGD_IF(ese_debug_enabled, "%s: TAG_LSROOT_ENTITY is %x", fn, 1561 read_buf[offset]); 1562 return LSCSTATUS_SUCCESS; 1563 } 1564 return LSCSTATUS_FAILED; 1565 } 1566 1567 /******************************************************************************* 1568 ** 1569 ** Function: Check_LSRootID_Tag 1570 ** 1571 ** Description: Check LS root ID tag presence in script and compare with 1572 ** select response root ID value. 1573 ** 1574 ** Returns: Success if Tag found 1575 ** 1576 *******************************************************************************/ 1577 LSCSTATUS Check_LSRootID_Tag(uint8_t* read_buf, uint16_t* offset1) { 1578 static const char fn[] = "Check_LSRootID_Tag"; 1579 uint16_t offset = *offset1; 1580 1581 if (read_buf[offset] == TAG_LSRE_ID) { 1582 ALOGD_IF(ese_debug_enabled, "%s: TAGID: TAG_LSROOT_ENTITY", fn); 1583 if (gsTag42Arr[0] == read_buf[offset + 1]) { 1584 uint8_t tag42Len = read_buf[offset + 1]; 1585 offset = offset + 2; 1586 if (!memcmp(&read_buf[offset], &gsTag42Arr[1], gsTag42Arr[0])) { 1587 ALOGD_IF(ese_debug_enabled, "%s : TAG 42 verified", fn); 1588 offset = offset + tag42Len; 1589 *offset1 = offset; 1590 return LSCSTATUS_SUCCESS; 1591 } 1592 } 1593 } 1594 return LSCSTATUS_FAILED; 1595 } 1596 1597 /******************************************************************************* 1598 ** 1599 ** Function: Check_CertHoldID_Tag 1600 ** 1601 ** Description: Check certificate holder ID tag presence in script. 1602 ** 1603 ** Returns: Success if Tag found 1604 ** 1605 *******************************************************************************/ 1606 LSCSTATUS Check_CertHoldID_Tag(uint8_t* read_buf, uint16_t* offset1) { 1607 static const char fn[] = "Check_CertHoldID_Tag"; 1608 uint16_t offset = *offset1; 1609 1610 if ((read_buf[offset] << 8 | read_buf[offset + 1]) == TAG_CERTFHOLD_ID) { 1611 uint8_t certfHoldIDLen = 0; 1612 ALOGD_IF(ese_debug_enabled, "%s: TAGID: TAG_CERTFHOLD_ID", fn); 1613 certfHoldIDLen = read_buf[offset + 2]; 1614 offset = offset + certfHoldIDLen + 3; 1615 if (read_buf[offset] == TAG_KEY_USAGE) { 1616 ALOGD_IF(ese_debug_enabled, "%s: TAGID: TAG_KEY_USAGE", fn); 1617 uint8_t keyusgLen = read_buf[offset + 1]; 1618 offset = offset + keyusgLen + 2; 1619 *offset1 = offset; 1620 return LSCSTATUS_SUCCESS; 1621 } 1622 } 1623 return LSCSTATUS_FAILED; 1624 } 1625 1626 /******************************************************************************* 1627 ** 1628 ** Function: Check_Date_Tag 1629 ** 1630 ** Description: Check date tags presence in script. 1631 ** 1632 ** Returns: Success if Tag found 1633 ** 1634 *******************************************************************************/ 1635 LSCSTATUS Check_Date_Tag(uint8_t* read_buf, uint16_t* offset1) { 1636 static const char fn[] = "Check_Date_Tag"; 1637 LSCSTATUS status = LSCSTATUS_FAILED; 1638 uint16_t offset = *offset1; 1639 1640 if ((read_buf[offset] << 8 | read_buf[offset + 1]) == TAG_EFF_DATE) { 1641 uint8_t effDateLen = read_buf[offset + 2]; 1642 offset = offset + 3 + effDateLen; 1643 ALOGD_IF(ese_debug_enabled, "%s: TAGID: TAG_EFF_DATE", fn); 1644 if ((read_buf[offset] << 8 | read_buf[offset + 1]) == TAG_EXP_DATE) { 1645 uint8_t effExpLen = read_buf[offset + 2]; 1646 offset = offset + 3 + effExpLen; 1647 ALOGD_IF(ese_debug_enabled, "%s: TAGID: TAG_EXP_DATE", fn); 1648 status = LSCSTATUS_SUCCESS; 1649 } else if (read_buf[offset] == TAG_LSRE_SIGNID) { 1650 status = LSCSTATUS_SUCCESS; 1651 } 1652 } else if ((read_buf[offset] << 8 | read_buf[offset + 1]) == TAG_EXP_DATE) { 1653 uint8_t effExpLen = read_buf[offset + 2]; 1654 offset = offset + 3 + effExpLen; 1655 ALOGD_IF(ese_debug_enabled, "%s: TAGID: TAG_EXP_DATE", fn); 1656 status = LSCSTATUS_SUCCESS; 1657 } else if (read_buf[offset] == TAG_LSRE_SIGNID) { 1658 status = LSCSTATUS_SUCCESS; 1659 } else { 1660 /*LSCSTATUS_FAILED*/ 1661 } 1662 *offset1 = offset; 1663 return status; 1664 } 1665 1666 /******************************************************************************* 1667 ** 1668 ** Function: Check_45_Tag 1669 ** 1670 ** Description: Check 45 tags presence in script and compare the value 1671 ** with select response tag 45 value 1672 ** 1673 ** Returns: Success if Tag found 1674 ** 1675 *******************************************************************************/ 1676 LSCSTATUS Check_45_Tag(uint8_t* read_buf, uint16_t* offset1, 1677 uint8_t* tag45Len) { 1678 static const char fn[] = "Check_45_Tag"; 1679 uint16_t offset = *offset1; 1680 if (read_buf[offset] == TAG_LSRE_SIGNID) { 1681 *tag45Len = read_buf[offset + 1]; 1682 offset = offset + 2; 1683 if (gsTag45Arr[0] == *tag45Len) { 1684 if (!memcmp(&read_buf[offset], &gsTag45Arr[1], gsTag45Arr[0])) { 1685 *offset1 = offset; 1686 ALOGD_IF(ese_debug_enabled, 1687 "%s: LSC_Check_KeyIdentifier : TAG 45 verified", fn); 1688 return LSCSTATUS_SUCCESS; 1689 } 1690 } 1691 } 1692 return LSCSTATUS_FAILED; 1693 } 1694 1695 /******************************************************************************* 1696 ** 1697 ** Function: Certificate_Verification 1698 ** 1699 ** Description: Perform the certificate verification by forwarding it to 1700 ** LS applet. 1701 ** 1702 ** Returns: Success if certificate is verified 1703 ** 1704 *******************************************************************************/ 1705 LSCSTATUS Certificate_Verification(Lsc_ImageInfo_t* Os_info, 1706 Lsc_TranscieveInfo_t* pTranscv_Info, 1707 uint8_t* read_buf, uint16_t* offset1, 1708 uint8_t* tag45Len) { 1709 static const char fn[] = "Certificate_Verification"; 1710 1711 pTranscv_Info->sSendData[0] = 0x80; 1712 pTranscv_Info->sSendData[1] = 0xA0; 1713 pTranscv_Info->sSendData[2] = 0x01; 1714 pTranscv_Info->sSendData[3] = 0x00; 1715 1716 int32_t wCertfLen = (read_buf[2] << 8 | read_buf[3]); 1717 uint16_t offset = *offset1; 1718 /*If the certificate is less than 255 bytes*/ 1719 if (wCertfLen <= 251) { 1720 uint8_t tag7f49Off = 0; 1721 uint8_t u7f49Len = 0; 1722 uint8_t tag5f37Len = 0; 1723 ALOGD_IF(ese_debug_enabled, "%s: Certificate is less than 255", fn); 1724 offset = offset + *tag45Len; 1725 ALOGD_IF(ese_debug_enabled, "%s: Before TAG_CCM_PERMISSION = %x", fn, 1726 read_buf[offset]); 1727 if (read_buf[offset] != TAG_CCM_PERMISSION) { 1728 return LSCSTATUS_FAILED; 1729 } 1730 int32_t tag53Len = 0; 1731 uint8_t len_byte = 0; 1732 offset = offset + 1; 1733 len_byte = Numof_lengthbytes(&read_buf[offset], &tag53Len); 1734 offset = offset + tag53Len + len_byte; 1735 ALOGD_IF(ese_debug_enabled, "%s: Verified TAG TAG_CCM_PERMISSION = 0x53", 1736 fn); 1737 if ((uint16_t)(read_buf[offset] << 8 | read_buf[offset + 1]) != 1738 TAG_SIG_RNS_COMP) { 1739 return LSCSTATUS_FAILED; 1740 } 1741 tag7f49Off = offset; 1742 u7f49Len = read_buf[offset + 2]; 1743 offset = offset + 3 + u7f49Len; 1744 if (u7f49Len != 64) { 1745 return LSCSTATUS_FAILED; 1746 } 1747 if ((uint16_t)(read_buf[offset] << 8 | read_buf[offset + 1]) != 0x7f49) { 1748 return LSCSTATUS_FAILED; 1749 } 1750 tag5f37Len = read_buf[offset + 2]; 1751 if (read_buf[offset + 3] != 0x86 || (read_buf[offset + 4] != 65)) { 1752 return LSCSTATUS_FAILED; 1753 } 1754 uint8_t tag_len_byte = Numof_lengthbytes(&read_buf[2], &wCertfLen); 1755 pTranscv_Info->sSendData[4] = wCertfLen + 2 + tag_len_byte; 1756 pTranscv_Info->sSendlength = wCertfLen + 7 + tag_len_byte; 1757 memcpy(&(pTranscv_Info->sSendData[5]), &read_buf[0], 1758 wCertfLen + 2 + tag_len_byte); 1759 1760 ALOGD_IF(ese_debug_enabled, "%s: start transceive for length %d", fn, 1761 pTranscv_Info->sSendlength); 1762 LSCSTATUS status = LSCSTATUS_FAILED; 1763 status = LSC_SendtoLsc(Os_info, status, pTranscv_Info, LS_Cert); 1764 if (status == LSCSTATUS_SUCCESS) { 1765 ALOGD_IF(ese_debug_enabled, "%s: Certificate is verified", fn); 1766 } 1767 return status; 1768 } else { 1769 /*If the certificate is more than 255 bytes*/ 1770 uint8_t tag7f49Off = 0; 1771 uint8_t u7f49Len = 0; 1772 uint8_t tag5f37Len = 0; 1773 ALOGD_IF(ese_debug_enabled, "%s: Certificate is greater than 255", fn); 1774 offset = offset + *tag45Len; 1775 ALOGD_IF(ese_debug_enabled, "%s: Before TAG_CCM_PERMISSION = %x", fn, 1776 read_buf[offset]); 1777 if (read_buf[offset] != TAG_CCM_PERMISSION) { 1778 return LSCSTATUS_FAILED; 1779 } 1780 int32_t tag53Len = 0; 1781 uint8_t len_byte = 0; 1782 offset = offset + 1; 1783 len_byte = Numof_lengthbytes(&read_buf[offset], &tag53Len); 1784 offset = offset + tag53Len + len_byte; 1785 ALOGD_IF(ese_debug_enabled, "%s: Verified TAG TAG_CCM_PERMISSION = 0x53", 1786 fn); 1787 if ((uint16_t)(read_buf[offset] << 8 | read_buf[offset + 1]) != 1788 TAG_SIG_RNS_COMP) { 1789 return LSCSTATUS_FAILED; 1790 } 1791 tag7f49Off = offset; 1792 u7f49Len = read_buf[offset + 2]; 1793 offset = offset + 3 + u7f49Len; 1794 if (u7f49Len != 64) { 1795 return LSCSTATUS_FAILED; 1796 } 1797 if ((uint16_t)(read_buf[offset] << 8 | read_buf[offset + 1]) != 0x7f49) { 1798 return LSCSTATUS_FAILED; 1799 } 1800 tag5f37Len = read_buf[offset + 2]; 1801 if (read_buf[offset + 3] != 0x86 || (read_buf[offset + 4] != 65)) { 1802 return LSCSTATUS_FAILED; 1803 } 1804 pTranscv_Info->sSendData[4] = tag7f49Off; 1805 memcpy(&(pTranscv_Info->sSendData[5]), &read_buf[0], tag7f49Off); 1806 pTranscv_Info->sSendlength = tag7f49Off + 5; 1807 ALOGD_IF(ese_debug_enabled, "%s: start transceive for length %d", fn, 1808 pTranscv_Info->sSendlength); 1809 1810 LSCSTATUS status = LSCSTATUS_FAILED; 1811 status = LSC_SendtoLsc(Os_info, status, pTranscv_Info, LS_Default); 1812 if (status != LSCSTATUS_SUCCESS) { 1813 uint8_t* RecvData = pTranscv_Info->sRecvData; 1814 Write_Response_To_OutFile(Os_info, RecvData, gsResp_len, LS_Cert); 1815 return status; 1816 } 1817 1818 pTranscv_Info->sSendData[2] = 0x00; 1819 pTranscv_Info->sSendData[4] = u7f49Len + tag5f37Len + 6; 1820 memcpy(&(pTranscv_Info->sSendData[5]), &read_buf[tag7f49Off], 1821 u7f49Len + tag5f37Len + 6); 1822 pTranscv_Info->sSendlength = u7f49Len + tag5f37Len + 11; 1823 ALOGD_IF(ese_debug_enabled, "%s: start transceive for length %d", fn, 1824 pTranscv_Info->sSendlength); 1825 1826 status = LSC_SendtoLsc(Os_info, status, pTranscv_Info, LS_Cert); 1827 if (status == LSCSTATUS_SUCCESS) { 1828 ALOGD_IF(ese_debug_enabled, "Certificate is verified"); 1829 } 1830 return status; 1831 } 1832 return LSCSTATUS_FAILED; 1833 } 1834 1835 /******************************************************************************* 1836 ** 1837 ** Function: Check_Complete_7F21_Tag 1838 ** 1839 ** Description: Traverses the 7F21 tag for verification of each sub tag with 1840 ** in the 7F21 tag. 1841 ** 1842 ** Returns: Success if all tags are verified 1843 ** 1844 *******************************************************************************/ 1845 LSCSTATUS Check_Complete_7F21_Tag(Lsc_ImageInfo_t* Os_info, 1846 Lsc_TranscieveInfo_t* pTranscv_Info, 1847 uint8_t* read_buf, uint16_t* offset) { 1848 static const char fn[] = "Check_Complete_7F21_Tag"; 1849 1850 if (LSCSTATUS_SUCCESS != Check_Certificate_Tag(read_buf, offset)) { 1851 ALOGE("%s: FAILED in Check_Certificate_Tag", fn); 1852 return LSCSTATUS_FAILED; 1853 } 1854 if (LSCSTATUS_SUCCESS != Check_SerialNo_Tag(read_buf, offset)) { 1855 ALOGE("%s: FAILED in Check_SerialNo_Tag", fn); 1856 return LSCSTATUS_FAILED; 1857 } 1858 if (LSCSTATUS_SUCCESS != Check_LSRootID_Tag(read_buf, offset)) { 1859 ALOGE("%s: FAILED in Check_LSRootID_Tag", fn); 1860 return LSCSTATUS_FAILED; 1861 } 1862 if (LSCSTATUS_SUCCESS != Check_CertHoldID_Tag(read_buf, offset)) { 1863 ALOGE("%s: FAILED in Check_CertHoldID_Tag", fn); 1864 return LSCSTATUS_FAILED; 1865 } 1866 if (LSCSTATUS_SUCCESS != Check_Date_Tag(read_buf, offset)) { 1867 ALOGE("%s: FAILED in Check_CertHoldID_Tag", fn); 1868 return LSCSTATUS_FAILED; 1869 } 1870 uint8_t tag45Len = 0; 1871 if (LSCSTATUS_SUCCESS != Check_45_Tag(read_buf, offset, &tag45Len)) { 1872 ALOGE("%s: FAILED in Check_CertHoldID_Tag", fn); 1873 return LSCSTATUS_FAILED; 1874 } 1875 if (LSCSTATUS_SUCCESS != Certificate_Verification(Os_info, pTranscv_Info, 1876 read_buf, offset, 1877 &tag45Len)) { 1878 ALOGE("%s: FAILED in Certificate_Verification", fn); 1879 return LSCSTATUS_FAILED; 1880 } 1881 return LSCSTATUS_SUCCESS; 1882 } 1883 1884 /******************************************************************************* 1885 ** 1886 ** Function: LSC_UpdateExeStatus 1887 ** 1888 ** Description: Updates LSC status to a file 1889 ** 1890 ** Returns: true if success else false 1891 ** 1892 *******************************************************************************/ 1893 bool LSC_UpdateExeStatus(uint16_t status) { 1894 static const char fn[] = "LSC_UpdateExeStatus"; 1895 1896 ALOGD_IF(ese_debug_enabled, "%s: enter", fn); 1897 1898 FILE* fLsStatus = fopen(LS_STATUS_PATH, "w+"); 1899 if (fLsStatus == NULL) { 1900 ALOGE("%s: Error opening LS Status file for backup: %s", fn, 1901 strerror(errno)); 1902 return false; 1903 } 1904 if ((fprintf(fLsStatus, "%04x", status)) != 4) { 1905 ALOGE("%s: Error updating LS Status backup: %s", fn, strerror(errno)); 1906 fclose(fLsStatus); 1907 return false; 1908 } 1909 fclose(fLsStatus); 1910 ALOGD_IF(ese_debug_enabled, "%s: exit", fn); 1911 return true; 1912 } 1913 1914 /******************************************************************************* 1915 ** 1916 ** Function: Get_LsStatus 1917 ** 1918 ** Description: Interface to fetch Loader service client status to JNI, 1919 ** Services 1920 ** 1921 ** Returns: SUCCESS/FAILURE 1922 ** 1923 *******************************************************************************/ 1924 LSCSTATUS Get_LsStatus(uint8_t* pStatus) { 1925 static const char fn[] = "Get_LsStatus"; 1926 1927 FILE* fLsStatus = fopen(LS_STATUS_PATH, "r"); 1928 if (fLsStatus == NULL) { 1929 ALOGE("%s: Error opening LS Status file for backup: %s", fn, 1930 strerror(errno)); 1931 return LSCSTATUS_FAILED; 1932 } 1933 1934 uint8_t lsStatus[2] = {0x63, 0x40}; 1935 for (uint8_t loopcnt = 0; loopcnt < 2; loopcnt++) { 1936 if ((FSCANF_BYTE(fLsStatus, "%2x", &lsStatus[loopcnt])) == 0) { 1937 ALOGE("%s: Error updating LS Status backup: %s", fn, strerror(errno)); 1938 fclose(fLsStatus); 1939 return LSCSTATUS_FAILED; 1940 } 1941 } 1942 ALOGD_IF(ese_debug_enabled, "%s: LS Status 0x%X 0x%X", fn, lsStatus[0], 1943 lsStatus[1]); 1944 memcpy(pStatus, lsStatus, 2); 1945 fclose(fLsStatus); 1946 return LSCSTATUS_SUCCESS; 1947 } 1948