• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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