replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / resource / c_common / ocrandom / src / ocrandom.c
index 78d2bc9..e0dcdc5 100644 (file)
 #define _POSIX_C_SOURCE 200809L
 #endif
 
-#if defined(__ANDROID__) || defined(__linux__) || defined(__APPLE__)
-#include "fcntl.h"
-#include "unistd.h"
+#include "iotivity_config.h"
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#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
+#ifdef HAVE_TIME_H
 #include <time.h>
+#endif
 #if defined(__ANDROID__)
+#include <ctype.h>
 #include <linux/time.h>
 #endif
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
 #endif
 #include "ocrandom.h"
 #include <stdio.h>
 
-#if !defined(__ANDROID__) && (defined(__linux__) || defined(__APPLE__))
+#ifdef HAVE_UUID_UUID_H
 #include <uuid/uuid.h>
 #endif
 
+#define NANO_SEC 1000000000
+
 #ifdef ARDUINO
 #include "Arduino.h"
 
+// ARM GCC compiler doesnt define srandom function.
+#if defined(ARDUINO) && !defined(ARDUINO_ARCH_SAM)
+#define HAVE_SRANDOM 1
+#endif
+
 uint8_t GetRandomBitRaw()
 {
     return analogRead((uint8_t)ANALOG_IN) & 0x1;
@@ -94,23 +120,28 @@ uint8_t GetRandomBit()
 
 int8_t OCSeedRandom()
 {
-#if defined(__ANDROID__) || defined(__linux__) || defined(__APPLE__) || defined(__TIZEN__)
+#ifndef ARDUINO
     // Get current time to Seed.
     uint64_t currentTime = 0;
 #ifdef __ANDROID__
     struct timespec getTs;
     clock_gettime(CLOCK_MONOTONIC, &getTs);
-    currentTime = (getTs.tv_sec * (uint64_t)1000000000 + getTs.tv_nsec)/1000;
+    currentTime = (getTs.tv_sec * (uint64_t)NANO_SEC + getTs.tv_nsec)/1000;
+#elif _WIN32
+    LARGE_INTEGER count;
+    if (QueryPerformanceCounter(&count)) {
+        currentTime = count.QuadPart;
+    }
 #elif  _POSIX_TIMERS > 0
     struct timespec ts;
     clock_gettime(CLOCK_MONOTONIC, &ts);
-    currentTime = ts.tv_sec * 1000000 + ts.tv_nsec / 1000;
+    currentTime = (ts.tv_sec * (uint64_t)NANO_SEC + ts.tv_nsec)/ 1000;
 #else
     struct timeval tv;
     gettimeofday(&tv, NULL);
-    currentTime = tv.tv_sec * 1000000 + tv.tv_usec;
+    currentTime = tv.tv_sec * (uint64_t)1000000 + tv.tv_usec;
 #endif
-
+#if defined(__unix__) || defined(__APPLE__) || defined(__TIZENRT__)
     int32_t fd = open("/dev/urandom", O_RDONLY);
     if (fd >= 0)
     {
@@ -130,6 +161,7 @@ int8_t OCSeedRandom()
         srand(randomSeed | currentTime);
     }
     else
+#endif
     {
         // Do time based seed when problem in accessing "/dev/urandom"
         srand(currentTime);
@@ -143,7 +175,11 @@ int8_t OCSeedRandom()
     {
         result += result + GetRandomBit();
     }
+#if HAVE_SRANDOM
     srandom(result);
+#else
+    srand(result);
+#endif
     return 0;
 #endif
 
@@ -170,10 +206,10 @@ uint32_t OCGetRandom()
 
 uint8_t OCGetRandomByte(void)
 {
-#if defined(__ANDROID__) || defined(__linux__) || defined(__APPLE__)
-    return rand() & 0x00FF;
-#elif defined ARDUINO
+#ifdef HAVE_SRANDOM
     return random() & 0x00FF;
+#else
+    return rand() & 0x00FF;
 #endif
 }
 
@@ -255,7 +291,7 @@ OCRandomUuidResult OCGenerateUuid(uint8_t uuid[UUID_SIZE])
     uuid[15] = parseUuidPart(&uuidString[34]);
 
     return RAND_UUID_OK;
-#elif !defined(__ANDROID__) && (defined(__linux__) || defined(__APPLE__))
+#elif defined(HAVE_UUID_UUID_H)
     // note: uuid_t is typedefed as unsigned char[16] on linux/apple
     uuid_generate(uuid);
     return RAND_UUID_OK;
@@ -297,10 +333,9 @@ OCRandomUuidResult OCGenerateUuidString(char uuidString[UUID_STRING_SIZE])
     }
     else
     {
-        close(fd);
         return RAND_UUID_READ_ERROR;
     }
-#elif !defined(__ANDROID__) && (defined(__linux__) || defined(__APPLE__))
+#elif defined(HAVE_UUID_UUID_H)
     uint8_t uuid[UUID_SIZE];
     int8_t ret = OCGenerateUuid(uuid);
 
@@ -344,3 +379,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;
+}
+