#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"
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)
{
srand(randomSeed | currentTime);
}
else
+#endif
{
// Do time based seed when problem in accessing "/dev/urandom"
srand(currentTime);
{
*location++ = OCGetRandomByte();
}
+ uint8_t *temp = (char *) OICCalloc(len, sizeof(char));
+ int *mask = (int *) OICCalloc(len, sizeof(int));
+ int i, j, rand_idx;
+ 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()
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
-#endif
}
uint32_t OCGetRandomRange(uint32_t firstBound, uint32_t secondBound)
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(__ANDROID__) && (defined(__linux__) || defined(__APPLE__))
+ 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;
}
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);
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;
+}
+