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 79d96c0c949b8ecc4e1570106243d21c8fd5ed72efTrusted Logic#if defined (LINUX) || defined(ANDROID) 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 } 154d96c0c949b8ecc4e1570106243d21c8fd5ed72efTrusted Logic#if (!defined(__SYMBIAN32__)) && (!defined(_WIN32_WCE)) && (!defined(ANDROID)) 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