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 #include "Ala.h"
17 #include "AlaLib.h"
18 #include <data_types.h>
19 #include <cutils/log.h>
20 #include <dirent.h>
21
22 static INT16 alaHandle;
23 extern pAla_Dwnld_Context_t gpAla_Dwnld_Context;
24 /*static bool Ala_inUse = false;*/
25 /*******************************************************************************
26 **
27 ** Function: JCDNLD_Init
28 **
29 ** Description: Initializes the JCOP library and opens the DWP communication channel
30 **
31 ** Returns: TRUE if ok.
32 **
33 *******************************************************************************/
ALA_Init(IChannel_t * channel)34 tJBL_STATUS ALA_Init(IChannel_t *channel)
35 {
36 static const char fn[] = "ALA_Init";
37 BOOLEAN stat = FALSE;
38 alaHandle = EE_ERROR_OPEN_FAIL;
39 ALOGD("%s: enter", fn);
40
41 /* if (Ala_inUse == true)
42 {
43 return STATUS_INUSE;
44 }*/
45 if(channel == NULL)
46 {
47 return STATUS_FAILED;
48 }
49 /*TODO: inUse assignment should be with protection like using semaphore*/
50 /*Ala_inUse = true;*/
51 stat = initialize (channel);
52 if(stat != TRUE)
53 {
54 ALOGE("%s: failed", fn);
55 }
56 else
57 {
58 channel = gpAla_Dwnld_Context->mchannel;
59 if((channel != NULL) &&
60 (channel->open) != NULL)
61 {
62 alaHandle = channel->open();
63 if(alaHandle == EE_ERROR_OPEN_FAIL)
64 {
65 ALOGE("%s:Open DWP communication is failed", fn);
66 stat = FALSE;
67 }
68 else
69 {
70 ALOGE("%s:Open DWP communication is success", fn);
71 stat = TRUE;
72 }
73 }
74 else
75 {
76 ALOGE("%s: NULL DWP channel", fn);
77 stat = FALSE;
78 }
79 }
80 return (stat == true)?STATUS_OK:STATUS_FAILED;
81 }
82
83 /*******************************************************************************
84 **
85 ** Function: ALA_Start
86 **
87 ** Description: Starts the ALA update over DWP
88 **
89 ** Returns: SUCCESS if ok.
90 **
91 *******************************************************************************/
92 #if(NXP_LDR_SVC_VER_2 == TRUE)
ALA_Start(const char * name,const char * dest,UINT8 * pdata,UINT16 len,UINT8 * respSW)93 tJBL_STATUS ALA_Start(const char *name, const char *dest, UINT8 *pdata, UINT16 len, UINT8 *respSW)
94 #else
95 tJBL_STATUS ALA_Start(const char *name, UINT8 *pdata, UINT16 len)
96 #endif
97 {
98 static const char fn[] = "ALA_Start";
99 tJBL_STATUS status = STATUS_FAILED;
100 IChannel_t *channel = gpAla_Dwnld_Context->mchannel;
101 if(name != NULL)
102 {
103 ALOGE("%s: name is %s", fn, name);
104 #if(NXP_LDR_SVC_VER_2 == TRUE)
105 ALOGE("%s: Dest is %s", fn, dest);
106 status = Perform_ALA(name, dest, pdata, len, respSW);
107 #else
108 status = Perform_ALA(name, pdata, len);
109 #endif
110 }
111 else
112 {
113 ALOGE("Invalid parameter");
114 }
115 ALOGE("%s: Exit; status=0x0%X", fn, status);
116 return status;
117 }
118
119 /*******************************************************************************
120 **
121 ** Function: JCDNLD_DeInit
122 **
123 ** Description: Deinitializes the ALA module
124 **
125 ** Returns: TRUE if ok.
126 **
127 *******************************************************************************/
ALA_DeInit()128 bool ALA_DeInit()
129 {
130 static const char fn[] = "ALA_DeInit";
131 BOOLEAN stat = FALSE;
132 IChannel_t* channel = gpAla_Dwnld_Context->mchannel;
133 ALOGD("%s: enter", fn);
134 if(channel != NULL)
135 {
136 if(channel->doeSE_Reset != NULL)
137 {
138 //channel->doeSE_Reset();
139 if(channel->close != NULL)
140 {
141 stat = channel->close(alaHandle);
142 if(stat != TRUE)
143 {
144 ALOGE("%s:closing DWP channel is failed", fn);
145 }
146 }
147 else
148 {
149 ALOGE("%s: NULL fp DWP_close", fn);
150 stat = FALSE;
151 }
152 }
153 }
154 else
155 {
156 ALOGE("%s: NULL dwp channel", fn);
157 }
158 finalize();
159 /*TODO: inUse assignment should be with protection like using semaphore*/
160 /*Ala_inUse = false;*/
161 return stat;
162 }
163 #if(NXP_LDR_SVC_VER_2 != TRUE)
164 /*******************************************************************************
165 **
166 ** Function: ALA_GetlistofApplets
167 **
168 ** Description: Gets the list of applets present the pre-defined directory
169 **
170 ** Returns: TRUE if ok.
171 **
172 *******************************************************************************/
ALA_GetlistofApplets(char * list[],UINT8 * num)173 void ALA_GetlistofApplets(char *list[], UINT8* num)
174 {
175 static const char dir[] = "/data/ala/";
176 struct dirent *dp;
177 UINT8 xx =0;
178 DIR *fd;
179
180 if ((fd = opendir(dir)) == NULL)
181 {
182 fprintf(stderr, "listdir: can't open %s\n", dir);
183 return;
184 }
185 while ((dp = readdir(fd)) != NULL)
186 {
187 if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
188 continue; /* skip self and parent */
189
190 ALOGE("%s/%s\n", dir, dp->d_name);
191 list[xx] = (char *)malloc(strlen(dp->d_name)+1);
192 if(list[xx] != NULL)
193 {
194 memset((void *)list[xx],0, strlen(dp->d_name)+1);
195 memcpy(list[xx++], dp->d_name, strlen(dp->d_name)+1);
196 }
197 else
198 {
199 ALOGE("Memory allocation failed");
200 }
201
202 }
203 *num = xx;
204 ALOGD("%s: number of applets found=0x0%x", __FUNCTION__, *num);
205 closedir(fd);
206 }
207
208 /*******************************************************************************
209 **
210 ** Function: ALA_GetCertificateKey
211 **
212 ** Description: Get the JSBL reference key
213 **
214 ** Returns: TRUE if ok.
215 **
216 *******************************************************************************/
ALA_GetCertificateKey(UINT8 * pKey,INT32 * pKeylen)217 tJBL_STATUS ALA_GetCertificateKey(UINT8 *pKey, INT32 *pKeylen)
218 {
219 static const char fn[] = "ALA_GetCertificateKey";
220 tJBL_STATUS status = STATUS_FAILED;
221 IChannel_t *channel = gpAla_Dwnld_Context->mchannel;
222 if(pKey != NULL)
223 {
224 status = GetJsbl_Certificate_Refkey(pKey, pKeylen);
225 }
226 else
227 {
228 ALOGE("Invalid parameter");
229 }
230 ALOGE("%s: Exit; status=0x0%X", fn, status);
231 return status;
232 }
233 #else
234
235 /*******************************************************************************
236 **
237 ** Function: ALA_lsGetVersion
238 **
239 ** Description: Get the version of Loder service client and applet
240 **
241 ** Returns: TRUE if ok.
242 **
243 *******************************************************************************/
ALA_lsGetVersion(UINT8 * pVersion)244 tJBL_STATUS ALA_lsGetVersion(UINT8 *pVersion)
245 {
246 static const char fn[] = "ALA_lsGetVersion";
247 tJBL_STATUS status = STATUS_FAILED;
248 IChannel_t *channel = gpAla_Dwnld_Context->mchannel;
249 if(pVersion!= NULL)
250 {
251 status = GetLs_Version(pVersion);
252 ALOGE("%s: LS Lib lsGetVersion status =0x0%X%X", fn, *pVersion, *(pVersion+1));
253 }
254 else
255 {
256 ALOGE("Invalid parameter");
257 }
258 ALOGE("%s: Exit; status=0x0%X", fn, status);
259 return status;
260 }
261 /*******************************************************************************
262 **
263 ** Function: ALA_lsGetStatus
264 **
265 ** Description: Get the version of Loder service client and applet
266 **
267 ** Returns: TRUE if ok.
268 **
269 *******************************************************************************/
ALA_lsGetStatus(UINT8 * pVersion)270 tJBL_STATUS ALA_lsGetStatus(UINT8 *pVersion)
271 {
272 static const char fn[] = "ALA_lsGetStatus";
273 tJBL_STATUS status = STATUS_FAILED;
274 IChannel_t *channel = gpAla_Dwnld_Context->mchannel;
275 if(pVersion!= NULL)
276 {
277 status = Get_LsStatus(pVersion);
278 ALOGE("%s: lsGetStatus ALALIB status=0x0%X 0x0%X", fn, pVersion[0], pVersion[1]);
279 }
280 else
281 {
282 ALOGE("Invalid parameter");
283 }
284 ALOGE("%s: Exit; status=0x0%X", fn, status);
285 return status;
286 }
287 /*******************************************************************************
288 **
289 ** Function: ALA_lsGetAppletStatus
290 **
291 ** Description: Get the version of Loder service client and applet
292 **
293 ** Returns: TRUE if ok.
294 **
295 *******************************************************************************/
ALA_lsGetAppletStatus(UINT8 * pVersion)296 tJBL_STATUS ALA_lsGetAppletStatus(UINT8 *pVersion)
297 {
298 static const char fn[] = "ALA_lsGetStatus";
299 tJBL_STATUS status = STATUS_FAILED;
300 IChannel_t *channel = gpAla_Dwnld_Context->mchannel;
301 if(pVersion!= NULL)
302 {
303 status = Get_LsAppletStatus(pVersion);
304 ALOGE("%s: lsGetStatus ALALIB status=0x0%X 0x0%X", fn, pVersion[0], pVersion[1]);
305 }
306 else
307 {
308 ALOGE("Invalid parameter");
309 }
310 ALOGE("%s: Exit; status=0x0%X", fn, status);
311 return status;
312 }
313
314 #endif
315