12e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley/**
22e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * Copyright(c) 2011 Trusted Logic.   All rights reserved.
32e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *
42e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * Redistribution and use in source and binary forms, with or without
52e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * modification, are permitted provided that the following conditions
62e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * are met:
72e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *
82e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *  * Redistributions of source code must retain the above copyright
92e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *    notice, this list of conditions and the following disclaimer.
102e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *  * Redistributions in binary form must reproduce the above copyright
112e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *    notice, this list of conditions and the following disclaimer in
122e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *    the documentation and/or other materials provided with the
132e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *    distribution.
142e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *  * Neither the name Trusted Logic nor the names of its
152e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *    contributors may be used to endorse or promote products derived
162e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *    from this software without specific prior written permission.
172e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *
182e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
192e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
202e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
212e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
222e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
232e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
242e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
252e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
262e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
272e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
282e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
292e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley */
302e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
312e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <stdlib.h>
322e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <stdio.h>
332e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <string.h>
342e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <ctype.h>
352e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <errno.h>
362e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <sys/types.h>
372e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <fcntl.h>
382e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
392e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#if defined(_WIN32_WCE)
402e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include "os_wm.h"
412e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#else
422e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <sys/stat.h>
432e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#endif
442e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
452e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include "smc_properties.h"
462e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include "smc_properties_parser.h"
472e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include "s_type.h"
482e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include "s_error.h"
492e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
502e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#if defined(__SYMBIAN32__)
512e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include "smc_properties_symbian.h"
522e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#endif
532e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
542e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
552e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#define SECURE_CONFIG_FILE_HDR     66
562e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#define SECURE_CONFIG_FILE_VERSION 01
572e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
582e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
592e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#define SYSTEM_SECTION_NAME               "Global"
602e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
612e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleytypedef enum {
622e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   MANDATORY_FILE_SYSTEM_FILE_NAME,
632e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   MANDATORY_KEYSTORE_SYSTEM_FILE_NAME,
642e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   MANDATORY_KEYSTORE_USER_FILE_NAME,
652e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   MANDATORY_SUPER_PARTITION_FILE_NAME,
662e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
672e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   NB_MANDATORY_PROPS,
682e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley} MANDATORY_PROPS;
692e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
702e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
712e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleytypedef enum
722e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
732e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   STATE_NONE,
742e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   STATE_DECIMAL,
752e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   STATE_HEXA,
762e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   STATE_BINARY
772e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley} INTEGER_FORMAT;
782e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
792e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#if defined (LINUX) || defined(__ANDROID32__)
802e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#define SEPARATOR_CHAR '/'
812e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
822e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#elif defined (WIN32) || defined (__SYMBIAN32__) || defined (_WIN32_WCE)
832e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#define SEPARATOR_CHAR '\\'
842e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
852e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#else
862e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#error SEPARATOR_CHAR not implemented...
872e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#endif
882e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
892e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#if defined(__SYMBIAN32__)
902e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#define printf RDebugPrintf
912e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#endif
922e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
932e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
942e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley/** the sturct that keep the data stored in the config file */
952e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleystatic CONF_FILE gConfFile;
962e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
972e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
982e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
992e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley/**
1002e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * check the validity of a given path (is a directory, has the READ/WRITE access rights)
1012e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * @param pPath the path we want to check
1022e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * @return true if the path is OK, else false
1032e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley */
1042e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleystatic bool checkFilePath(char *pPath)
1052e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
1062e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   struct stat buf;
1072e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   uint32_t  result;
1082e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   char *pDir = pPath;
1092e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1102e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   // cobra & buffalo version : complete path (directory and filename) is given in the config file.
1112e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   // so we extract from this path the parent directory
1122e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
1132e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      uint32_t nSlashIndex = 0;
1142e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      uint32_t i = 0;
1152e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      while(pPath[i] != '\0')
1162e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
1172e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         if (pPath[i] == SEPARATOR_CHAR)
1182e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            nSlashIndex = i;
1192e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         i++;
1202e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
1212e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      pDir = malloc(sizeof(char) * nSlashIndex);
1222e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      if (pDir == NULL)
1232e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
1242e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         printf("Out of memory.");
1252e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         return false;
1262e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
1272e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      strncpy(pDir, pPath, nSlashIndex);
1282e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      pDir[nSlashIndex] = '\0';
1292e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
1302e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1312e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   /* check if file exists */
1322e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   result = stat(pDir, &buf);
1332e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   if(result != 0 )
1342e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
1352e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#if defined(__SYMBIAN32__)
1362e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      if (SymbianCheckFSDirectory(pDir) == -1)
1372e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
1382e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         printf("Cannot create directory : %s\n.", pDir);
1392e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         return false;
1402e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
1412e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#else
1422e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      printf("Unknown path : %s\n.", pDir);
1432e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      return false;
1442e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#endif
1452e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
1462e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   else
1472e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
1482e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      /* check it's a directory */
1492e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      if ((buf.st_mode & S_IFDIR) != S_IFDIR)
1502e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
1512e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         printf("Path %s doesn't point on a directory.\n", pDir);
1522e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         return false;
1532e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
1542e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#if (!defined(__SYMBIAN32__)) && (!defined(_WIN32_WCE)) && (!defined(__ANDROID32__))
1552e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      // TODO : under Symbian, Android and WM, check access right of a directory failed? I don't know why...
1562e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley       /* check read access */
1572e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley       if ((buf.st_mode & S_IREAD) != S_IREAD)
1582e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley       {
1592e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley          printf("Path %s doesn't have the READ access rights.\n", pDir);
1602e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley          return false;
1612e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley       }
1622e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley       /* check write */
1632e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley       if ((buf.st_mode & S_IWRITE) != S_IWRITE)
1642e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley       {
1652e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley          printf("Path %s doesn't have the WRITE access rights.\n", pDir);
1662e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley          return false;
1672e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley       }
1682e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#endif
1692e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
1702e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1712e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   return true;
1722e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley}
1732e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1742e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley/**
1752e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * check properties (value, range...)
1762e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * @param sConfFile struct where are stored the properties we will check
1772e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * @return true if the check succeed, else false
1782e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley */
1792e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleystatic bool smcPropertiesCheck(CONF_FILE sConfFile)
1802e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
1812e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   NODE* pNext = NULL;
1822e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   char *pPropVal = NULL;
1832e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   bool bCheckResult = true;
1842e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   bool pMandatoryProps[NB_MANDATORY_PROPS];
1852e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   uint32_t i = 0;
1862e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1872e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   // reset properties table
1882e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   for (i=0; i<NB_MANDATORY_PROPS; i++)
1892e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      pMandatoryProps[i] = false;
1902e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1912e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   // check properties type and set MandatoryProps field to true (check later)
1922e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   pNext = sConfFile.sSystemSectionPropertyList.pFirst;
1932e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   while(pNext != NULL)
1942e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
1952e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      pPropVal = ((PROPERTY*)pNext)->pValue;
1962e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1972e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      //printf("Checking %s = %s.\n", pNext->pName, pPropVal);
1982e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      if(strcmp(pNext->pName, FILE_SYSTEM_FILE_NAME) == 0)
1992e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
2002e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         /* File System */
2012e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         bCheckResult = checkFilePath(pPropVal);
2022e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         pMandatoryProps[MANDATORY_FILE_SYSTEM_FILE_NAME] = true;
2032e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
2042e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      else if(strcmp(pNext->pName, KEYSTORE_SYSTEM_FILE_NAME) == 0)
2052e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
2062e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         bCheckResult = checkFilePath(pPropVal);
2072e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         pMandatoryProps[MANDATORY_KEYSTORE_SYSTEM_FILE_NAME] = true;
2082e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
2092e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      else if(strcmp(pNext->pName, KEYSTORE_USER_FILE_NAME) == 0)
2102e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
2112e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         bCheckResult = checkFilePath(pPropVal);
2122e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         pMandatoryProps[MANDATORY_KEYSTORE_USER_FILE_NAME] = true;
2132e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
2142e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      else if(strcmp(pNext->pName, SUPER_PARTITION_FILE_NAME) == 0)
2152e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
2162e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         bCheckResult = checkFilePath(pPropVal);
2172e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         pMandatoryProps[MANDATORY_SUPER_PARTITION_FILE_NAME] = true;
2182e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
2192e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      else
2202e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
2212e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         bCheckResult = true;
2222e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
2232e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2242e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      if (! bCheckResult)
2252e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
2262e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         printf("Property %s = %s. Bad value!!!\n", pNext->pName, pPropVal);
2272e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         return false;
2282e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
2292e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      pNext=pNext->pNext;
2302e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
2312e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2322e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   /* check all mandatory properties had been found */
2332e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   for (i=0; i<NB_MANDATORY_PROPS; i++)
2342e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
2352e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      if (!pMandatoryProps[i])
2362e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
2372e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         char *pMissingProp = NULL;
2382e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         switch(i){
2392e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            case MANDATORY_FILE_SYSTEM_FILE_NAME :
2402e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               pMissingProp = FILE_SYSTEM_FILE_NAME;
2412e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               break;
2422e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            case MANDATORY_KEYSTORE_SYSTEM_FILE_NAME :
2432e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               pMissingProp = KEYSTORE_SYSTEM_FILE_NAME;
2442e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               break;
2452e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            case MANDATORY_KEYSTORE_USER_FILE_NAME :
2462e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               pMissingProp = KEYSTORE_USER_FILE_NAME;
2472e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               break;
2482e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            case MANDATORY_SUPER_PARTITION_FILE_NAME :
2492e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               pMissingProp = SUPER_PARTITION_FILE_NAME;
2502e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               break;
2512e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         }
2522e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         printf("Mandatory property %s is missing.\n", pMissingProp);
2532e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         bCheckResult = false;
2542e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
2552e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
2562e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2572e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   return bCheckResult;
2582e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley}
2592e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2602e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2612e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2622e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley/**
2632e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * parse the config file
2642e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * @param configFile the path of the configuration file
2652e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * @return 0 if succeed, else 1
2662e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley */
2672e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleyint smcPropertiesParse(const char *configFile)
2682e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
2692e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   S_RESULT nResult = S_SUCCESS;
2702e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2712e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   // first : parse the config file
2722e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   memset(&gConfFile, 0x00, sizeof(CONF_FILE));
2732e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   nResult=SMCPropParseConfigFile((char *)configFile, &gConfFile);
2742e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   if (nResult!=S_SUCCESS)
2752e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
2762e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      printf("Parsing error in file %s : %x.\n", configFile, nResult);
2772e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      return 1;
2782e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
2792e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2802e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   // check properties
2812e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   if (!smcPropertiesCheck(gConfFile))
2822e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
2832e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      printf("Properties check failed.\n");
2842e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      return 1;
2852e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
2862e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2872e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   return 0;
2882e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley}
2892e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2902e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2912e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2922e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley/**
2932e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * get the value of a property
2942e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * @param pProp we are asking the value of this property
2952e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * @return the value if found, else NULL
2962e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley */
2972e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleychar *smcGetPropertyAsString(char *pProp)
2982e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
2992e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   return SMCPropGetSystemProperty(&gConfFile, pProp);
3002e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley}
3012e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
3022e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
3032e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley/**
3042e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * get the value of a property
3052e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * @param pProp we are asking the value of this property
3062e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * @param pVal the value of the property
3072e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * @return 0 if found, else 1 (and pVal set to 0)
3082e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley */
3092e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleyint smcGetPropertyAsInt(char *pProp, int *pVal)
3102e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
3112e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   char *pStr = SMCPropGetSystemProperty(&gConfFile, pProp);
3122e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   if (pStr == NULL)
3132e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
3142e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      *pVal = 0;
3152e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      return 1;
3162e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
3172e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   if (libString2GetStringAsInt(pStr, (uint32_t*)pVal) == S_SUCCESS)
3182e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
3192e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      return 0;
3202e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
3212e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   *pVal = 0;
3222e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   return 1;
3232e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley}
324