1  /*
2   * Copyright (C) 2015 NXP Semiconductors
3   *
4   * Licensed under the Apache License, Version 2.0 (the "License");
5   * you may not use this file except in compliance with the License.
6   * You may obtain a copy of the License at
7   *
8   *      http://www.apache.org/licenses/LICENSE-2.0
9   *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16 #ifndef ALA_H_
17 #define ALA_H_
18 
19 #define NXP_LS_AID
20 #include "data_types.h"
21 #include "IChannel.h"
22 #include <stdio.h>
23 
24 typedef struct Ala_ChannelInfo
25 {
26     UINT8 channel_id;
27     bool  isOpend;
28 }Ala_ChannelInfo_t;
29 
30 typedef struct Ala_TranscieveInfo
31 {
32     INT32 timeout;
33     UINT8 sRecvData[1024];
34     UINT8 sSendData[1024];
35     INT32 sSendlength;
36     int   sRecvlength;
37     UINT8 sTemp_recvbuf[1024];
38 }Ala_TranscieveInfo_t;
39 
40 #if(NXP_LDR_SVC_VER_2 == TRUE)
41 typedef struct Ala_ImageInfo
42 {
43     FILE                 *fp;
44     int                  fls_size;
45     char                 fls_path[384];
46     int                  bytes_read;
47     FILE                 *fResp;
48     int                  fls_RespSize;
49     char                 fls_RespPath[384];
50     int                  bytes_wrote;
51     Ala_ChannelInfo_t    Channel_Info[10];
52     UINT8                channel_cnt;
53 }Ala_ImageInfo_t;
54 typedef enum
55 {
56     LS_Default = 0x00,
57     LS_Cert = 0x7F21,
58     LS_Sign = 0x60,
59     LS_Comm = 0x40
60 }Ls_TagType;
61 #else
62 typedef struct Ala_ImageInfo
63 {
64     FILE                 *fp;
65     int                  fls_size;
66     char                 fls_path[256];
67     int                  bytes_read;
68     Ala_ChannelInfo_t    Channel_Info[10];
69     UINT8                channel_cnt;
70 }Ala_ImageInfo_t;
71 #endif
72 typedef struct Ala_lib_Context
73 {
74     IChannel_t            *mchannel;
75     Ala_ImageInfo_t       Image_info;
76     Ala_TranscieveInfo_t  Transcv_Info;
77 }Ala_Dwnld_Context_t,*pAla_Dwnld_Context_t;
78 
79 static UINT8 OpenChannel[] = {0x00, 0x70, 0x00, 0x00, 0x01};
80 #if(NXP_LDR_SVC_VER_2 == TRUE)
81 static UINT8 GetData[] = {0x80, 0xCA, 0x00, 0x46, 0x00};
82 #ifndef NXP_LS_AID
83 static UINT8 SelectAla[] = {0x00, 0xA4, 0x04, 0x00, 0x0D, 0xA0, 0x00, 0x00, 0x03, 0x96, 0x41, 0x4C, 0x41, 0x01, 0x43, 0x4F, 0x52, 0x01};
84 #else
85 static UINT8 SelectAla[] = {0x00, 0xA4, 0x04, 0x00, 0x0F, 0xA0, 0x00, 0x00, 0x03, 0x96, 0x54, 0x43, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0B
86 , 0x00,0x01};
87 #endif
88 #else
89 static UINT8 SelectAla[] = {0x00, 0xA4, 0x04, 0x00, 0x0D, 0xA0, 0x00, 0x00, 0x03, 0x96, 0x41, 0x4C, 0x41, 0x01, 0x43, 0x4F, 0x52, 0x01};
90 #endif
91 /*ALA2*/
92 #if(NXP_LDR_SVC_VER_2 == TRUE)
93 #define NOOFAIDS     0x03
94 #define LENOFAIDS    0x16
95 #ifndef NXP_LS_AID
96 static UINT8 ArrayOfAIDs[NOOFAIDS][LENOFAIDS] = {
97         {0x12, 0x00, 0xA4, 0x04, 0x00, 0x0D, 0xA0, 0x00, 0x00, 0x03, 0x96, 0x41, 0x4C, 0x41, 0x01, 0x4C, 0x44, 0x52, 0x01,0x00,0x00,0x00},
98         {0x12, 0x00, 0xA4, 0x04, 0x00, 0x0D, 0xA0, 0x00, 0x00, 0x03, 0x96, 0x41, 0x4C, 0x41, 0x01, 0x43, 0x4F, 0x52, 0x01,0x00,0x00,0x00},
99         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
100 };
101 #else
102 static UINT8 ArrayOfAIDs[NOOFAIDS][LENOFAIDS] = {
103         {0x14, 0x00, 0xA4, 0x04, 0x00, 0x0F, 0xA0, 0x00, 0x00, 0x03, 0x96, 0x54, 0x43, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0B,0x00,0x02,0x00},
104         {0x14, 0x00, 0xA4, 0x04, 0x00, 0x0F, 0xA0, 0x00, 0x00, 0x03, 0x96, 0x54, 0x43, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0B,0x00,0x01,0x00},
105         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
106 };
107 #endif
108 #define TAG_CERTIFICATE     0x7F21
109 #define TAG_LSES_RESP       0x4E
110 #define TAG_LSES_RSPLEN     0x02
111 #define TAG_SERIAL_NO       0x93
112 #define TAG_LSRE_ID         0x42
113 #define TAG_LSRE_SIGNID     0x45
114 #define TAG_CERTFHOLD_ID    0x5F20
115 #define TAG_KEY_USAGE       0x95
116 #define TAG_EFF_DATE        0x5F25
117 #define TAG_EXP_DATE        0x5F24
118 #define TAG_CCM_PERMISSION  0x53
119 #define TAG_SIG_RNS_COMP    0x5F37
120 
121 #define TAG_LS_VER1         0x9F
122 #define TAG_LS_VER2         0x08
123 #define LS_DEFAULT_STATUS   0x6340
124 #define LS_SUCCESS_STATUS   0x9000
125 #define TAG_RE_KEYID        0x65
126 
127 #define LS_ABORT_SW1        0x69
128 #define LS_ABORT_SW2        0x87
129 #define AID_MEM_PATH       "/data/vendor/ese/AID_MEM.txt"
130 #define LS_STATUS_PATH     "/data/vendor/ese/LS_Status.txt"
131 #define LS_SRC_BACKUP      "/data/vendor/ese/LS_Src_Backup.txt"
132 #define LS_DST_BACKUP      "/data/vendor/ese/LS_Dst_Backup.txt"
133 #define MAX_CERT_LEN        (255+137)
134 
135 #endif
136 /*ALA2*/
137 
138 #define JCOP3_WR
139 #define APPLET_PATH        "/data/ala/"
140 #define MAX_SIZE            0xFF
141 #define PARAM_P1_OFFSET     0x02
142 #define FIRST_BLOCK         0x05
143 #define LAST_BLOCK          0x84
144 #define ONLY_BLOCK          0x85
145 #define CLA_BYTE            0x80
146 #define JSBL_HEADER_LEN     0x03
147 #define ALA_CMD_HDR_LEN     0x02
148 
149 /* Definations for TAG ID's present in the script file*/
150 #define TAG_SELECT_ID       0x6F
151 #define TAG_ALA_ID          0x84
152 #define TAG_PRO_DATA_ID     0xA5
153 #define TAG_JSBL_HDR_ID     0x60
154 #define TAG_JSBL_KEY_ID     0x61
155 #define TAG_SIGNATURE_ID    0x41
156 #define TAG_ALA_CMD_ID      0x40
157 #define TAG_JSBL_CER_ID     0x44
158 
159 /*Definitions for Install for load*/
160 #define INSTAL_LOAD_ID      0xE6
161 #define LOAD_CMD_ID         0xE8
162 #define LOAD_MORE_BLOCKS    0x00
163 #define LOAD_LAST_BLOCK     0x80
164 
165 #define STORE_DATA_CLA      0x80
166 #define STORE_DATA_INS      0xE2
167 #define STORE_DATA_LEN      32
168 #define STORE_DATA_TAG      0x4F
169 
170 /*******************************************************************************
171 **
172 ** Function:        initialize
173 **
174 ** Description:     Initialize all member variables.
175 **                  native: Native data.
176 **
177 ** Returns:         True if ok.
178 **
179 *******************************************************************************/
180 BOOLEAN initialize (IChannel_t *channel);
181 
182 /*******************************************************************************
183 **
184 ** Function:        finalize
185 **
186 ** Description:     Release all resources.
187 **
188 ** Returns:         None
189 **
190 *******************************************************************************/
191 void finalize ();
192 
193 #if(NXP_LDR_SVC_VER_2 == TRUE)
194 tJBL_STATUS Perform_ALA(const char *path,const char *dest, const UINT8 *pdata, UINT16 len, UINT8 *respSW);
195 #else
196 tJBL_STATUS Perform_ALA(const char *path, const UINT8 *pdata, UINT16 len);
197 #endif
198 tJBL_STATUS GetJsbl_Certificate_Refkey(UINT8 *pkey, INT32 *pKeylen);
199 
200 static tJBL_STATUS
201 ALA_OpenChannel(Ala_ImageInfo_t* pContext, tJBL_STATUS status, Ala_TranscieveInfo_t* pInfo);
202 
203 static tJBL_STATUS
204 ALA_SelectAla(Ala_ImageInfo_t* pContext, tJBL_STATUS status, Ala_TranscieveInfo_t* pInfo);
205 
206 static tJBL_STATUS
207 ALA_StoreData(Ala_ImageInfo_t* pContext, tJBL_STATUS status, Ala_TranscieveInfo_t* pInfo);
208 
209 static tJBL_STATUS
210 ALA_loadapplet(Ala_ImageInfo_t *Os_info, tJBL_STATUS status, Ala_TranscieveInfo_t *pTranscv_Info);
211 
212 #if(NXP_LDR_SVC_VER_2 == TRUE)
213 static tJBL_STATUS
214 ALA_update_seq_handler(tJBL_STATUS (*seq_handler[])(Ala_ImageInfo_t* pContext, tJBL_STATUS status, Ala_TranscieveInfo_t* pInfo), const char *name, const char *dest);
215 
216 tJBL_STATUS GetLs_Version(UINT8 *pKey);
217 
218 tJBL_STATUS GetVer_seq_handler(tJBL_STATUS (*seq_handler[])(Ala_ImageInfo_t* pContext, tJBL_STATUS status, Ala_TranscieveInfo_t* pInfo));
219 
220 tJBL_STATUS Write_Response_To_OutFile(Ala_ImageInfo_t *image_info, UINT8* RecvData, INT32 recvlen, Ls_TagType tType);
221 
222 tJBL_STATUS Check_Certificate_Tag(UINT8 *read_buf, UINT16 *offset1);
223 
224 tJBL_STATUS Check_SerialNo_Tag(UINT8 *read_buf, UINT16 *offset1);
225 
226 tJBL_STATUS Check_LSRootID_Tag(UINT8 *read_buf, UINT16 *offset1);
227 
228 tJBL_STATUS Check_CertHoldID_Tag(UINT8 *read_buf, UINT16 *offset1);
229 
230 tJBL_STATUS Check_Date_Tag(UINT8 *read_buf, UINT16 *offset1);
231 
232 tJBL_STATUS Check_45_Tag(UINT8 *read_buf, UINT16 *offset1, UINT8 *tag45Len);
233 
234 tJBL_STATUS Certificate_Verification(Ala_ImageInfo_t *Os_info, Ala_TranscieveInfo_t
235 *pTranscv_Info, UINT8 *read_buf, UINT16 *offset1, UINT8 *tag45Len);
236 
237 tJBL_STATUS Check_Complete_7F21_Tag(Ala_ImageInfo_t *Os_info,
238        Ala_TranscieveInfo_t *pTranscv_Info, UINT8 *read_buf, UINT16 *offset);
239 BOOLEAN ALA_UpdateExeStatus(UINT16 status);
240 tJBL_STATUS ALA_getAppletLsStatus(Ala_ImageInfo_t *Os_info, tJBL_STATUS status, Ala_TranscieveInfo_t *pTranscv_Info);
241 tJBL_STATUS Get_LsStatus(UINT8 *pVersion);
242 tJBL_STATUS Get_LsAppletStatus(UINT8 *pVersion);
243 #else
244 static tJBL_STATUS
245 ALA_update_seq_handler(tJBL_STATUS (*seq_handler[])(Ala_ImageInfo_t* pContext, tJBL_STATUS status, Ala_TranscieveInfo_t* pInfo), const char *name);
246 #endif
247 static tJBL_STATUS
248 JsblCerId_seq_handler(tJBL_STATUS (*seq_handler[])(Ala_ImageInfo_t* pContext, tJBL_STATUS status, Ala_TranscieveInfo_t* pInfo));
249 
250 tJBL_STATUS ALA_SendtoEse(Ala_ImageInfo_t *Os_info, tJBL_STATUS status, Ala_TranscieveInfo_t *pTranscv_Info);
251 #if(NXP_LDR_SVC_VER_2 == TRUE)
252 tJBL_STATUS GetLsStatus_seq_handler(tJBL_STATUS (*seq_handler[])(Ala_ImageInfo_t*
253         pContext, tJBL_STATUS status, Ala_TranscieveInfo_t* pInfo));
254 tJBL_STATUS ALA_SendtoAla(Ala_ImageInfo_t *Os_info, tJBL_STATUS status, Ala_TranscieveInfo_t *pTranscv_Info, Ls_TagType tType);
255 #else
256 tJBL_STATUS ALA_SendtoAla(Ala_ImageInfo_t *Os_info, tJBL_STATUS status, Ala_TranscieveInfo_t *pTranscv_Info);
257 #endif
258 tJBL_STATUS ALA_CloseChannel(Ala_ImageInfo_t *Os_info, tJBL_STATUS status, Ala_TranscieveInfo_t *pTranscv_Info);
259 #if(NXP_LDR_SVC_VER_2 == TRUE)
260 tJBL_STATUS ALA_ProcessResp(Ala_ImageInfo_t *image_info, INT32 recvlen, Ala_TranscieveInfo_t *trans_info, Ls_TagType tType);
261 #else
262 tJBL_STATUS ALA_ProcessResp(Ala_ImageInfo_t *image_info, INT32 recvlen, Ala_TranscieveInfo_t *trans_info);
263 #endif
264 #if(NXP_LDR_SVC_VER_2 == TRUE)
265 tJBL_STATUS ALA_Check_KeyIdentifier(Ala_ImageInfo_t *Os_info, tJBL_STATUS status,
266    Ala_TranscieveInfo_t *pTranscv_Info, UINT8* temp_buf, tJBL_STATUS flag,
267    INT32 wNewLen);
268 #else
269 tJBL_STATUS ALA_Check_KeyIdentifier(Ala_ImageInfo_t *Os_info, tJBL_STATUS status, Ala_TranscieveInfo_t *pTranscv_Info);
270 #endif
271 tJBL_STATUS ALA_ReadScript(Ala_ImageInfo_t *Os_info, UINT8 *read_buf);
272 
273 tJBL_STATUS Process_EseResponse(Ala_TranscieveInfo_t *pTranscv_Info, INT32 recv_len, Ala_ImageInfo_t *Os_info);
274 
275 tJBL_STATUS Process_SelectRsp(UINT8* Recv_data, INT32 Recv_len);
276 #ifdef JCOP3_WR
277 tJBL_STATUS Send_Backall_Loadcmds(Ala_ImageInfo_t *Os_info, tJBL_STATUS status, Ala_TranscieveInfo_t *pTranscv_Info);
278 
279 tJBL_STATUS Bufferize_load_cmds(Ala_ImageInfo_t *Os_info, tJBL_STATUS status, Ala_TranscieveInfo_t *pTranscv_Info);
280 #endif
281 UINT8 Numof_lengthbytes(UINT8 *read_buf, INT32 *wLen);
282 #endif /*ALA_H*/
283