Fixing crash in OCFillRandomMem (#512)
[platform/upstream/iotivity.git] / resource / c_common / ocrandom / src / ocrandom.c
index 32c4b4b..babf32b 100644 (file)
 #ifdef HAVE_STDLIB_H
 #include <stdlib.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#elif defined(HAVE_STRINGS_H)
+#include <strings.h>
+#endif
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
 #endif
@@ -136,7 +141,7 @@ int8_t OCSeedRandom()
     gettimeofday(&tv, NULL);
     currentTime = tv.tv_sec * (uint64_t)1000000 + tv.tv_usec;
 #endif
-#if defined(__unix__) || defined(__APPLE__)
+#if defined(__unix__) || defined(__APPLE__) || defined(__TIZENRT__)
     int32_t fd = open("/dev/urandom", O_RDONLY);
     if (fd >= 0)
     {
@@ -182,14 +187,48 @@ int8_t OCSeedRandom()
 
 void OCFillRandomMem(uint8_t * location, uint16_t len)
 {
+    int i, j, rand_idx;
+    i = len;
     if (!location)
     {
         return;
     }
-    for (; len--;)
+    for (; i--;)
     {
         *location++ = OCGetRandomByte();
     }
+    uint8_t *temp = (char *) OICCalloc(len, sizeof(char));
+    int *mask = (int *) OICCalloc(len, sizeof(int));
+    for (i = 0; i < len; i++)
+    {
+        mask[i] = 0;
+    }
+    j = 0;
+    for (i = 0; i < len; i++)
+    {
+        rand_idx = lrand48() % len;
+        while((rand_idx < len) && (mask[rand_idx] != 0))
+        {
+            rand_idx++;
+        }
+        if(rand_idx == len)
+        {
+            rand_idx = 0;
+            while(mask[rand_idx] != 0)
+            {
+                rand_idx++;
+            }
+        }
+        temp[rand_idx] = location[j];
+        mask[rand_idx] = 1;
+        j++;
+    }
+    for (i = 0; i < len; i++)
+    {
+        location[i] = temp[i];
+    }
+    OICFree(temp);
+    OICFree(mask);
 }
 
 uint32_t OCGetRandom()
@@ -259,34 +298,33 @@ OCRandomUuidResult OCGenerateUuid(uint8_t uuid[UUID_SIZE])
     char uuidString[UUID_STRING_SIZE];
     int8_t ret = OCGenerateUuidString(uuidString);
 
-    if (ret < 0)
+    if (RAND_UUID_OK == ret)
     {
-        return ret;
-    }
-
-    uuid[ 0] = parseUuidPart(&uuidString[0]);
-    uuid[ 1] = parseUuidPart(&uuidString[2]);
-    uuid[ 2] = parseUuidPart(&uuidString[4]);
-    uuid[ 3] = parseUuidPart(&uuidString[6]);
+        uuid[ 0] = parseUuidPart(&uuidString[0]);
+        uuid[ 1] = parseUuidPart(&uuidString[2]);
+        uuid[ 2] = parseUuidPart(&uuidString[4]);
+        uuid[ 3] = parseUuidPart(&uuidString[6]);
 
-    uuid[ 4] = parseUuidPart(&uuidString[9]);
-    uuid[ 5] = parseUuidPart(&uuidString[11]);
+        uuid[ 4] = parseUuidPart(&uuidString[9]);
+        uuid[ 5] = parseUuidPart(&uuidString[11]);
 
-    uuid[ 6] = parseUuidPart(&uuidString[14]);
-    uuid[ 7] = parseUuidPart(&uuidString[16]);
+        uuid[ 6] = parseUuidPart(&uuidString[14]);
+        uuid[ 7] = parseUuidPart(&uuidString[16]);
 
-    uuid[ 8] = parseUuidPart(&uuidString[19]);
-    uuid[ 9] = parseUuidPart(&uuidString[21]);
+        uuid[ 8] = parseUuidPart(&uuidString[19]);
+        uuid[ 9] = parseUuidPart(&uuidString[21]);
 
-    uuid[10] = parseUuidPart(&uuidString[24]);
-    uuid[11] = parseUuidPart(&uuidString[26]);
-    uuid[12] = parseUuidPart(&uuidString[28]);
-    uuid[13] = parseUuidPart(&uuidString[30]);
-    uuid[14] = parseUuidPart(&uuidString[32]);
-    uuid[15] = parseUuidPart(&uuidString[34]);
+        uuid[10] = parseUuidPart(&uuidString[24]);
+        uuid[11] = parseUuidPart(&uuidString[26]);
+        uuid[12] = parseUuidPart(&uuidString[28]);
+        uuid[13] = parseUuidPart(&uuidString[30]);
+        uuid[14] = parseUuidPart(&uuidString[32]);
+        uuid[15] = parseUuidPart(&uuidString[34]);
 
-    return RAND_UUID_OK;
-#elif defined(HAVE_UUID_UUID_H)
+        return RAND_UUID_OK;
+    }
+#endif
+#if defined(HAVE_UUID_UUID_H)
     // note: uuid_t is typedefed as unsigned char[16] on linux/apple
     uuid_generate(uuid);
     return RAND_UUID_OK;
@@ -328,7 +366,6 @@ OCRandomUuidResult OCGenerateUuidString(char uuidString[UUID_STRING_SIZE])
     }
     else
     {
-        close(fd);
         return RAND_UUID_READ_ERROR;
     }
 #elif defined(HAVE_UUID_UUID_H)
@@ -375,3 +412,39 @@ OCRandomUuidResult OCConvertUuidToString(const uint8_t uuid[UUID_SIZE],
 
     return RAND_UUID_OK;
 }
+
+OCRandomUuidResult OCConvertStringToUuid(const char uuidString[UUID_STRING_SIZE],
+                                         uint8_t uuid[UUID_SIZE])
+{
+    if(NULL == uuidString || NULL == uuid)
+    {
+        return RAND_UUID_INVALID_PARAM;
+    }
+
+    size_t urnIdx = 0;
+    size_t uuidIdx = 0;
+    size_t strUuidLen = 0;
+    char convertedUuid[UUID_SIZE * 2] = {0};
+
+    strUuidLen = strlen(uuidString);
+    if((UUID_STRING_SIZE - 1) == strUuidLen)
+    {
+        for(uuidIdx=0, urnIdx=0; uuidIdx < UUID_SIZE ; uuidIdx++, urnIdx+=2)
+        {
+            if(*(uuidString + urnIdx) == '-')
+            {
+                urnIdx++;
+            }
+            sscanf(uuidString + urnIdx, "%2hhx", &convertedUuid[uuidIdx]);
+        }
+    }
+    else
+    {
+        return RAND_UUID_CONVERT_ERROR;
+    }
+
+    memcpy(uuid, convertedUuid, UUID_SIZE);
+
+    return RAND_UUID_OK;
+}
+