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 19 #ifndef LSC_H_ 20 #define LSC_H_ 21 22 #include <stdio.h> 23 #include "LsClient.h" 24 #include "phNxpEse_Api.h" 25 26 typedef struct Lsc_ChannelInfo { 27 uint8_t channel_id; 28 bool isOpend; 29 } Lsc_ChannelInfo_t; 30 31 typedef struct Lsc_TranscieveInfo { 32 int32_t timeout; 33 uint8_t sRecvData[1024]; 34 uint8_t sSendData[1024]; 35 int32_t sSendlength; 36 int sRecvlength; 37 uint8_t sTemp_recvbuf[1024]; 38 } Lsc_TranscieveInfo_t; 39 40 typedef struct Lsc_ImageInfo { 41 FILE* fp; 42 int fls_size; 43 char fls_path[384]; 44 int bytes_read; 45 FILE* fResp; 46 int fls_RespSize; 47 char fls_RespPath[384]; 48 int bytes_wrote; 49 Lsc_ChannelInfo_t Channel_Info[10]; 50 uint8_t channel_cnt; 51 } Lsc_ImageInfo_t; 52 53 typedef enum { 54 LS_Default = 0x00, 55 LS_Cert = 0x7F21, 56 LS_Sign = 0x60, 57 LS_Comm = 0x40 58 } Ls_TagType; 59 60 static uint8_t OpenChannel[] = {0x00, 0x70, 0x00, 0x00, 0x01}; 61 static uint8_t GetData[] = {0x80, 0xCA, 0x00, 0x46, 0x00}; 62 63 static uint8_t SelectLsc[] = {0x00, 0xA4, 0x04, 0x00, 0x0F, 0xA0, 0x00, 64 0x00, 0x03, 0x96, 0x54, 0x43, 0x00, 0x00, 65 0x00, 0x01, 0x00, 0x0B, 0x00, 0x01}; 66 67 /*LSC2*/ 68 #define NOOFAIDS 0x03 69 #define LENOFAIDS 0x16 70 71 static uint8_t ArrayOfAIDs[NOOFAIDS][LENOFAIDS] = { 72 {0x14, 0x00, 0xA4, 0x04, 0x00, 0x0F, 0xA0, 0x00, 0x00, 0x03, 0x96, 73 0x54, 0x43, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0B, 0x00, 0x02, 0x00}, 74 {0x14, 0x00, 0xA4, 0x04, 0x00, 0x0F, 0xA0, 0x00, 0x00, 0x03, 0x96, 75 0x54, 0x43, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0B, 0x00, 0x01, 0x00}, 76 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 77 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; 78 79 #define TAG_CERTIFICATE 0x7F21 80 #define TAG_LSES_RESP 0x4E 81 #define TAG_LSES_RSPLEN 0x02 82 #define TAG_SERIAL_NO 0x93 83 #define TAG_LSRE_ID 0x42 84 #define TAG_LSRE_SIGNID 0x45 85 #define TAG_CERTFHOLD_ID 0x5F20 86 #define TAG_KEY_USAGE 0x95 87 #define TAG_EFF_DATE 0x5F25 88 #define TAG_EXP_DATE 0x5F24 89 #define TAG_CCM_PERMISSION 0x53 90 #define TAG_SIG_RNS_COMP 0x5F37 91 92 #define TAG_LS_VER1 0x9F 93 #define TAG_LS_VER2 0x08 94 #define LS_DEFAULT_STATUS 0x6340 95 #define LS_SUCCESS_STATUS 0x9000 96 #define TAG_RE_KEYID 0x65 97 98 #define LS_ABORT_SW1 0x69 99 #define LS_ABORT_SW2 0x87 100 #define AID_MEM_PATH "/data/vendor/secure_element/AID_MEM.txt" 101 #define LS_STATUS_PATH "/data/vendor/secure_element/LS_Status.txt" 102 #define LS_SRC_BACKUP "/data/vendor/secure_element/LS_Src_Backup.txt" 103 #define LS_DST_BACKUP "/data/vendor/secure_element/LS_Dst_Backup.txt" 104 #define MAX_CERT_LEN (255 + 137) 105 106 /*LSC2*/ 107 108 #define MAX_SIZE 0xFF 109 #define PARAM_P1_OFFSET 0x02 110 #define FIRST_BLOCK 0x05 111 #define LAST_BLOCK 0x84 112 #define ONLY_BLOCK 0x85 113 #define CLA_BYTE 0x80 114 #define JSBL_HEADER_LEN 0x03 115 #define LSC_CMD_HDR_LEN 0x02 116 117 /* Definations for TAG ID's present in the script file*/ 118 #define TAG_SELECT_ID 0x6F 119 #define TAG_LSC_ID 0x84 120 #define TAG_PRO_DATA_ID 0xA5 121 #define TAG_JSBL_HDR_ID 0x60 122 #define TAG_JSBL_KEY_ID 0x61 123 #define TAG_SIGNATURE_ID 0x41 124 #define TAG_LSC_CMD_ID 0x40 125 #define TAG_JSBL_CER_ID 0x44 126 127 /*Definitions for Install for load*/ 128 #define INSTAL_LOAD_ID 0xE6 129 #define LOAD_CMD_ID 0xE8 130 #define LOAD_MORE_BLOCKS 0x00 131 #define LOAD_LAST_BLOCK 0x80 132 133 #define STORE_DATA_CLA 0x80 134 #define STORE_DATA_INS 0xE2 135 #define STORE_DATA_LEN 32 136 #define STORE_DATA_TAG 0x4F 137 138 /******************************************************************************* 139 ** 140 ** Function: Perform_LSC 141 ** 142 ** Description: Performs the LSC download sequence 143 ** 144 ** Returns: Success if ok. 145 ** 146 *******************************************************************************/ 147 LSCSTATUS Perform_LSC(const char* path, const char* dest, const uint8_t* pdata, 148 uint16_t len, uint8_t* respSW); 149 150 /******************************************************************************* 151 ** 152 ** Function: LSC_OpenChannel 153 ** 154 ** Description: Creates the logical channel with lsc 155 ** 156 ** Returns: Success if ok. 157 ** 158 *******************************************************************************/ 159 static LSCSTATUS LSC_OpenChannel(Lsc_ImageInfo_t* pContext, LSCSTATUS status, 160 Lsc_TranscieveInfo_t* pInfo) 161 __attribute__((unused)); 162 163 /******************************************************************************* 164 ** 165 ** Function: LSC_SelectLsc 166 ** 167 ** Description: Creates the logical channel with lsc 168 ** Channel_id will be used for any communication with Lsc 169 ** 170 ** Returns: Success if ok. 171 ** 172 *******************************************************************************/ 173 static LSCSTATUS LSC_SelectLsc(Lsc_ImageInfo_t* pContext, LSCSTATUS status, 174 Lsc_TranscieveInfo_t* pInfo) 175 __attribute__((unused)); 176 177 /******************************************************************************* 178 ** 179 ** Function: LSC_StoreData 180 ** 181 ** Description: It is used to provide the LSC with an Unique 182 ** Identifier of the Application that has triggered the LSC 183 *script. 184 ** 185 ** Returns: Success if ok. 186 ** 187 *******************************************************************************/ 188 static LSCSTATUS LSC_StoreData(Lsc_ImageInfo_t* pContext, LSCSTATUS status, 189 Lsc_TranscieveInfo_t* pInfo) 190 __attribute__((unused)); 191 192 /******************************************************************************* 193 ** 194 ** Function: LSC_loadapplet 195 ** 196 ** Description: Reads the script from the file and sent to Lsc 197 ** 198 ** Returns: Success if ok. 199 ** 200 *******************************************************************************/ 201 static LSCSTATUS LSC_loadapplet(Lsc_ImageInfo_t* Os_info, LSCSTATUS status, 202 Lsc_TranscieveInfo_t* pTranscv_Info) 203 __attribute__((unused)); 204 205 /******************************************************************************* 206 ** 207 ** Function: LSC_update_seq_handler 208 ** 209 ** Description: Performs the LSC update sequence handler sequence 210 ** 211 ** Returns: Success if ok. 212 ** 213 *******************************************************************************/ 214 static LSCSTATUS LSC_update_seq_handler( 215 LSCSTATUS (*seq_handler[])(Lsc_ImageInfo_t* pContext, LSCSTATUS status, 216 Lsc_TranscieveInfo_t* pInfo), 217 const char* name, const char* dest) __attribute__((unused)); 218 219 /******************************************************************************* 220 ** 221 ** Function: Write_Response_To_OutFile 222 ** 223 ** Description: Write the response to Out file 224 ** with length recvlen from buffer RecvData. 225 ** 226 ** Returns: Success if OK 227 ** 228 *******************************************************************************/ 229 LSCSTATUS Write_Response_To_OutFile(Lsc_ImageInfo_t* image_info, 230 uint8_t* RecvData, int32_t recvlen, 231 Ls_TagType tType); 232 233 /******************************************************************************* 234 ** 235 ** Function: Check_Certificate_Tag 236 ** 237 ** Description: Check certificate Tag presence in script 238 ** by 7F21 . 239 ** 240 ** Returns: Success if Tag found 241 ** 242 *******************************************************************************/ 243 LSCSTATUS Check_Certificate_Tag(uint8_t* read_buf, uint16_t* offset1); 244 245 /******************************************************************************* 246 ** 247 ** Function: Check_SerialNo_Tag 248 ** 249 ** Description: Check Serial number Tag presence in script 250 ** by 0x93 . 251 ** 252 ** Returns: Success if Tag found 253 ** 254 *******************************************************************************/ 255 LSCSTATUS Check_SerialNo_Tag(uint8_t* read_buf, uint16_t* offset1); 256 257 /******************************************************************************* 258 ** 259 ** Function: Check_LSRootID_Tag 260 ** 261 ** Description: Check LS root ID tag presence in script and compare with 262 ** select response root ID value. 263 ** 264 ** Returns: Success if Tag found 265 ** 266 *******************************************************************************/ 267 LSCSTATUS Check_LSRootID_Tag(uint8_t* read_buf, uint16_t* offset1); 268 269 /******************************************************************************* 270 ** 271 ** Function: Check_CertHoldID_Tag 272 ** 273 ** Description: Check certificate holder ID tag presence in script. 274 ** 275 ** Returns: Success if Tag found 276 ** 277 *******************************************************************************/ 278 LSCSTATUS Check_CertHoldID_Tag(uint8_t* read_buf, uint16_t* offset1); 279 280 /******************************************************************************* 281 ** 282 ** Function: Check_Date_Tag 283 ** 284 ** Description: Check date tags presence in script. 285 ** 286 ** Returns: Success if Tag found 287 ** 288 *******************************************************************************/ 289 LSCSTATUS Check_Date_Tag(uint8_t* read_buf, uint16_t* offset1); 290 291 /******************************************************************************* 292 ** 293 ** Function: Check_45_Tag 294 ** 295 ** Description: Check 45 tags presence in script and compare the value 296 ** with select response tag 45 value 297 ** 298 ** Returns: Success if Tag found 299 ** 300 *******************************************************************************/ 301 LSCSTATUS Check_45_Tag(uint8_t* read_buf, uint16_t* offset1, uint8_t* tag45Len); 302 303 /******************************************************************************* 304 ** 305 ** Function: Certificate_Verification 306 ** 307 ** Description: Perform the certificate verification by forwarding it to 308 ** LS applet. 309 ** 310 ** Returns: Success if certificate is verified 311 ** 312 *******************************************************************************/ 313 LSCSTATUS Certificate_Verification(Lsc_ImageInfo_t* Os_info, 314 Lsc_TranscieveInfo_t* pTranscv_Info, 315 uint8_t* read_buf, uint16_t* offset1, 316 uint8_t* tag45Len); 317 318 /******************************************************************************* 319 ** 320 ** Function: Check_Complete_7F21_Tag 321 ** 322 ** Description: Traverses the 7F21 tag for verification of each sub tag with 323 ** in the 7F21 tag. 324 ** 325 ** Returns: Success if all tags are verified 326 ** 327 *******************************************************************************/ 328 LSCSTATUS Check_Complete_7F21_Tag(Lsc_ImageInfo_t* Os_info, 329 Lsc_TranscieveInfo_t* pTranscv_Info, 330 uint8_t* read_buf, uint16_t* offset); 331 332 /******************************************************************************* 333 ** 334 ** Function: LSC_UpdateExeStatus 335 ** 336 ** Description: Updates LSC status to a file 337 ** 338 ** Returns: true if success else false 339 ** 340 *******************************************************************************/ 341 bool LSC_UpdateExeStatus(uint16_t status); 342 343 /******************************************************************************* 344 ** 345 ** Function: Get_LsStatus 346 ** 347 ** Description: Interface to fetch Loader service client status to JNI, 348 *Services 349 ** 350 ** Returns: SUCCESS/FAILURE 351 ** 352 *******************************************************************************/ 353 LSCSTATUS Get_LsStatus(uint8_t* pVersion); 354 355 /******************************************************************************* 356 ** 357 ** Function: LSC_SendtoEse 358 ** 359 ** Description: It is used to send the packet to p61 360 ** 361 ** Returns: Success if ok. 362 ** 363 *******************************************************************************/ 364 LSCSTATUS LSC_SendtoEse(Lsc_ImageInfo_t* Os_info, LSCSTATUS status, 365 Lsc_TranscieveInfo_t* pTranscv_Info); 366 367 /******************************************************************************* 368 ** 369 ** Function: LSC_SendtoLsc 370 ** 371 ** Description: It is used to forward the packet to Lsc 372 ** 373 ** Returns: Success if ok. 374 ** 375 *******************************************************************************/ 376 LSCSTATUS LSC_SendtoLsc(Lsc_ImageInfo_t* Os_info, LSCSTATUS status, 377 Lsc_TranscieveInfo_t* pTranscv_Info, Ls_TagType tType); 378 379 /******************************************************************************* 380 ** 381 ** Function: LSC_CloseChannel 382 ** 383 ** Description: Closes the previously opened logical channel 384 ** 385 ** Returns: Success if ok. 386 ** 387 *******************************************************************************/ 388 LSCSTATUS LSC_CloseChannel(Lsc_ImageInfo_t* Os_info, LSCSTATUS status, 389 Lsc_TranscieveInfo_t* pTranscv_Info); 390 391 /******************************************************************************* 392 ** 393 ** Function: LSC_ProcessResp 394 ** 395 ** Description: Process the response packet received from Lsc 396 ** 397 ** Returns: Success if ok. 398 ** 399 *******************************************************************************/ 400 LSCSTATUS LSC_ProcessResp(Lsc_ImageInfo_t* image_info, int32_t recvlen, 401 Lsc_TranscieveInfo_t* trans_info, Ls_TagType tType); 402 403 /******************************************************************************* 404 ** 405 ** Function: LSC_Check_KeyIdentifier 406 ** 407 ** Description: Checks and validates certificate 408 ** 409 ** Returns: Success if ok. 410 ** 411 *******************************************************************************/ 412 LSCSTATUS LSC_Check_KeyIdentifier(Lsc_ImageInfo_t* Os_info, LSCSTATUS status, 413 Lsc_TranscieveInfo_t* pTranscv_Info, 414 uint8_t* temp_buf, LSCSTATUS flag, 415 int32_t wNewLen); 416 417 /******************************************************************************* 418 ** 419 ** Function: LSC_ReadScript 420 ** 421 ** Description: Reads the current line if the script 422 ** 423 ** Returns: Success if ok. 424 ** 425 *******************************************************************************/ 426 LSCSTATUS LSC_ReadScript(Lsc_ImageInfo_t* Os_info, uint8_t* read_buf); 427 428 /******************************************************************************* 429 ** 430 ** Function: Process_EseResponse 431 ** 432 ** Description: It is used to process the received response packet from ESE 433 ** 434 ** Returns: Success if ok. 435 ** 436 *******************************************************************************/ 437 LSCSTATUS Process_EseResponse(Lsc_TranscieveInfo_t* pTranscv_Info, 438 int32_t recv_len, Lsc_ImageInfo_t* Os_info); 439 440 /******************************************************************************* 441 ** 442 ** Function: Process_SelectRsp 443 ** 444 ** Description: It is used to process the received response for SELECT LSC 445 *cmd 446 ** 447 ** Returns: Success if ok. 448 ** 449 *******************************************************************************/ 450 LSCSTATUS Process_SelectRsp(uint8_t* Recv_data, int32_t Recv_len); 451 452 /******************************************************************************* 453 ** 454 ** Function: Numof_lengthbytes 455 ** 456 ** Description: Checks the number of length bytes and assigns 457 ** length value to wLen. 458 ** 459 ** Returns: Number of Length bytes 460 ** 461 *******************************************************************************/ 462 uint8_t Numof_lengthbytes(uint8_t* read_buf, int32_t* wLen); 463 464 LSCSTATUS Send_Backall_Loadcmds(Lsc_ImageInfo_t* Os_info, LSCSTATUS status, 465 Lsc_TranscieveInfo_t* pTranscv_Info); 466 467 LSCSTATUS Bufferize_load_cmds(Lsc_ImageInfo_t* Os_info, LSCSTATUS status, 468 Lsc_TranscieveInfo_t* pTranscv_Info); 469 470 inline int FSCANF_BYTE(FILE* stream, const char* format, void* pVal) { 471 int Result = 0; 472 473 if ((NULL != stream) && (NULL != format) && (NULL != pVal)) { 474 unsigned int dwVal; 475 unsigned char* pTmp = (unsigned char*)pVal; 476 Result = fscanf(stream, format, &dwVal); 477 478 (*pTmp) = (unsigned char)(dwVal & 0x000000FF); 479 } 480 return Result; 481 } 482 483 #endif /*LSC_H*/ 484