summaryrefslogtreecommitdiffstats
path: root/security/tf_daemon/smc_properties.c
diff options
context:
space:
mode:
Diffstat (limited to 'security/tf_daemon/smc_properties.c')
-rw-r--r--security/tf_daemon/smc_properties.c323
1 files changed, 323 insertions, 0 deletions
diff --git a/security/tf_daemon/smc_properties.c b/security/tf_daemon/smc_properties.c
new file mode 100644
index 0000000..ce1e7e3
--- /dev/null
+++ b/security/tf_daemon/smc_properties.c
@@ -0,0 +1,323 @@
+/**
+ * Copyright(c) 2011 Trusted Logic. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name Trusted Logic nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+#if defined(_WIN32_WCE)
+#include "os_wm.h"
+#else
+#include <sys/stat.h>
+#endif
+
+#include "smc_properties.h"
+#include "smc_properties_parser.h"
+#include "s_type.h"
+#include "s_error.h"
+
+#if defined(__SYMBIAN32__)
+#include "smc_properties_symbian.h"
+#endif
+
+
+#define SECURE_CONFIG_FILE_HDR 66
+#define SECURE_CONFIG_FILE_VERSION 01
+
+
+#define SYSTEM_SECTION_NAME "Global"
+
+typedef enum {
+ MANDATORY_FILE_SYSTEM_FILE_NAME,
+ MANDATORY_KEYSTORE_SYSTEM_FILE_NAME,
+ MANDATORY_KEYSTORE_USER_FILE_NAME,
+ MANDATORY_SUPER_PARTITION_FILE_NAME,
+
+ NB_MANDATORY_PROPS,
+} MANDATORY_PROPS;
+
+
+typedef enum
+{
+ STATE_NONE,
+ STATE_DECIMAL,
+ STATE_HEXA,
+ STATE_BINARY
+} INTEGER_FORMAT;
+
+#if defined (LINUX) || defined(__ANDROID32__)
+#define SEPARATOR_CHAR '/'
+
+#elif defined (WIN32) || defined (__SYMBIAN32__) || defined (_WIN32_WCE)
+#define SEPARATOR_CHAR '\\'
+
+#else
+#error SEPARATOR_CHAR not implemented...
+#endif
+
+#if defined(__SYMBIAN32__)
+#define printf RDebugPrintf
+#endif
+
+
+/** the sturct that keep the data stored in the config file */
+static CONF_FILE gConfFile;
+
+
+
+/**
+ * check the validity of a given path (is a directory, has the READ/WRITE access rights)
+ * @param pPath the path we want to check
+ * @return true if the path is OK, else false
+ */
+static bool checkFilePath(char *pPath)
+{
+ struct stat buf;
+ uint32_t result;
+ char *pDir = pPath;
+
+ // cobra & buffalo version : complete path (directory and filename) is given in the config file.
+ // so we extract from this path the parent directory
+ {
+ uint32_t nSlashIndex = 0;
+ uint32_t i = 0;
+ while(pPath[i] != '\0')
+ {
+ if (pPath[i] == SEPARATOR_CHAR)
+ nSlashIndex = i;
+ i++;
+ }
+ pDir = malloc(sizeof(char) * nSlashIndex);
+ if (pDir == NULL)
+ {
+ printf("Out of memory.");
+ return false;
+ }
+ strncpy(pDir, pPath, nSlashIndex);
+ pDir[nSlashIndex] = '\0';
+ }
+
+ /* check if file exists */
+ result = stat(pDir, &buf);
+ if(result != 0 )
+ {
+#if defined(__SYMBIAN32__)
+ if (SymbianCheckFSDirectory(pDir) == -1)
+ {
+ printf("Cannot create directory : %s\n.", pDir);
+ return false;
+ }
+#else
+ printf("Unknown path : %s\n.", pDir);
+ return false;
+#endif
+ }
+ else
+ {
+ /* check it's a directory */
+ if ((buf.st_mode & S_IFDIR) != S_IFDIR)
+ {
+ printf("Path %s doesn't point on a directory.\n", pDir);
+ return false;
+ }
+#if (!defined(__SYMBIAN32__)) && (!defined(_WIN32_WCE)) && (!defined(__ANDROID32__))
+ // TODO : under Symbian, Android and WM, check access right of a directory failed? I don't know why...
+ /* check read access */
+ if ((buf.st_mode & S_IREAD) != S_IREAD)
+ {
+ printf("Path %s doesn't have the READ access rights.\n", pDir);
+ return false;
+ }
+ /* check write */
+ if ((buf.st_mode & S_IWRITE) != S_IWRITE)
+ {
+ printf("Path %s doesn't have the WRITE access rights.\n", pDir);
+ return false;
+ }
+#endif
+ }
+
+ return true;
+}
+
+/**
+ * check properties (value, range...)
+ * @param sConfFile struct where are stored the properties we will check
+ * @return true if the check succeed, else false
+ */
+static bool smcPropertiesCheck(CONF_FILE sConfFile)
+{
+ NODE* pNext = NULL;
+ char *pPropVal = NULL;
+ bool bCheckResult = true;
+ bool pMandatoryProps[NB_MANDATORY_PROPS];
+ uint32_t i = 0;
+
+ // reset properties table
+ for (i=0; i<NB_MANDATORY_PROPS; i++)
+ pMandatoryProps[i] = false;
+
+ // check properties type and set MandatoryProps field to true (check later)
+ pNext = sConfFile.sSystemSectionPropertyList.pFirst;
+ while(pNext != NULL)
+ {
+ pPropVal = ((PROPERTY*)pNext)->pValue;
+
+ //printf("Checking %s = %s.\n", pNext->pName, pPropVal);
+ if(strcmp(pNext->pName, FILE_SYSTEM_FILE_NAME) == 0)
+ {
+ /* File System */
+ bCheckResult = checkFilePath(pPropVal);
+ pMandatoryProps[MANDATORY_FILE_SYSTEM_FILE_NAME] = true;
+ }
+ else if(strcmp(pNext->pName, KEYSTORE_SYSTEM_FILE_NAME) == 0)
+ {
+ bCheckResult = checkFilePath(pPropVal);
+ pMandatoryProps[MANDATORY_KEYSTORE_SYSTEM_FILE_NAME] = true;
+ }
+ else if(strcmp(pNext->pName, KEYSTORE_USER_FILE_NAME) == 0)
+ {
+ bCheckResult = checkFilePath(pPropVal);
+ pMandatoryProps[MANDATORY_KEYSTORE_USER_FILE_NAME] = true;
+ }
+ else if(strcmp(pNext->pName, SUPER_PARTITION_FILE_NAME) == 0)
+ {
+ bCheckResult = checkFilePath(pPropVal);
+ pMandatoryProps[MANDATORY_SUPER_PARTITION_FILE_NAME] = true;
+ }
+ else
+ {
+ bCheckResult = true;
+ }
+
+ if (! bCheckResult)
+ {
+ printf("Property %s = %s. Bad value!!!\n", pNext->pName, pPropVal);
+ return false;
+ }
+ pNext=pNext->pNext;
+ }
+
+ /* check all mandatory properties had been found */
+ for (i=0; i<NB_MANDATORY_PROPS; i++)
+ {
+ if (!pMandatoryProps[i])
+ {
+ char *pMissingProp = NULL;
+ switch(i){
+ case MANDATORY_FILE_SYSTEM_FILE_NAME :
+ pMissingProp = FILE_SYSTEM_FILE_NAME;
+ break;
+ case MANDATORY_KEYSTORE_SYSTEM_FILE_NAME :
+ pMissingProp = KEYSTORE_SYSTEM_FILE_NAME;
+ break;
+ case MANDATORY_KEYSTORE_USER_FILE_NAME :
+ pMissingProp = KEYSTORE_USER_FILE_NAME;
+ break;
+ case MANDATORY_SUPER_PARTITION_FILE_NAME :
+ pMissingProp = SUPER_PARTITION_FILE_NAME;
+ break;
+ }
+ printf("Mandatory property %s is missing.\n", pMissingProp);
+ bCheckResult = false;
+ }
+ }
+
+ return bCheckResult;
+}
+
+
+
+/**
+ * parse the config file
+ * @param configFile the path of the configuration file
+ * @return 0 if succeed, else 1
+ */
+int smcPropertiesParse(const char *configFile)
+{
+ S_RESULT nResult = S_SUCCESS;
+
+ // first : parse the config file
+ memset(&gConfFile, 0x00, sizeof(CONF_FILE));
+ nResult=SMCPropParseConfigFile((char *)configFile, &gConfFile);
+ if (nResult!=S_SUCCESS)
+ {
+ printf("Parsing error in file %s : %x.\n", configFile, nResult);
+ return 1;
+ }
+
+ // check properties
+ if (!smcPropertiesCheck(gConfFile))
+ {
+ printf("Properties check failed.\n");
+ return 1;
+ }
+
+ return 0;
+}
+
+
+
+/**
+ * get the value of a property
+ * @param pProp we are asking the value of this property
+ * @return the value if found, else NULL
+ */
+char *smcGetPropertyAsString(char *pProp)
+{
+ return SMCPropGetSystemProperty(&gConfFile, pProp);
+}
+
+
+/**
+ * get the value of a property
+ * @param pProp we are asking the value of this property
+ * @param pVal the value of the property
+ * @return 0 if found, else 1 (and pVal set to 0)
+ */
+int smcGetPropertyAsInt(char *pProp, int *pVal)
+{
+ char *pStr = SMCPropGetSystemProperty(&gConfFile, pProp);
+ if (pStr == NULL)
+ {
+ *pVal = 0;
+ return 1;
+ }
+ if (libString2GetStringAsInt(pStr, (uint32_t*)pVal) == S_SUCCESS)
+ {
+ return 0;
+ }
+ *pVal = 0;
+ return 1;
+}