Browse Source

Change DkRandomBitsRead interface and fix error checking

Now it returns 0 on success and -PAL_* on error.
Michał Kowalczyk 5 years ago
parent
commit
17102eab9d

+ 3 - 1
LibOS/shim/src/bookkeep/shim_vma.c

@@ -342,7 +342,9 @@ int init_vma (void)
     uint64_t addr_rand_size =
         (PAL_CB(user_address.end) - PAL_CB(user_address.start)) * 5 / 6;
     uint64_t rand;
-    DkRandomBitsRead(&rand, sizeof(rand));
+    ret = DkRandomBitsRead(&rand, sizeof(rand));
+    if (ret < 0)
+        return -convert_pal_errno(-ret);
     current_heap_top -= ALIGN_DOWN(rand % addr_rand_size);
 #endif
 

+ 9 - 6
LibOS/shim/src/fs/dev/fs.c

@@ -114,16 +114,19 @@ static int dev_random_mode (const char * name, mode_t * mode)
     return 0;
 }
 
-static int dev_random_read (struct shim_handle * hdl, void * buf,
-                            size_t count)
+static int dev_urandom_read (struct shim_handle * hdl, void * buf,
+                             size_t count)
 {
-    return DkRandomBitsRead(buf, count);
+    int ret = DkRandomBitsRead(buf, count);
+    if (ret < 0)
+        return -convert_pal_errno(-ret);
+    return count;
 }
 
-static int dev_urandom_read (struct shim_handle * hdl, void * buf,
-                             size_t count)
+static int dev_random_read (struct shim_handle * hdl, void * buf,
+                            size_t count)
 {
-    return DkRandomBitsRead(buf, count);
+    return dev_urandom_read(hdl, buf, count);
 }
 
 static int dev_random_stat (const char * name, struct stat * stat)

+ 6 - 2
LibOS/shim/src/shim_init.c

@@ -860,7 +860,9 @@ static int name_pipe (char * uri, size_t size, void * id)
 {
     IDTYPE pipeid;
     int len;
-    DkRandomBitsRead(&pipeid, sizeof(pipeid));
+    int ret = DkRandomBitsRead(&pipeid, sizeof(pipeid));
+    if (ret < 0)
+        return -convert_pal_errno(-ret);
     debug("creating pipe: pipe.srv:%u\n", pipeid);
     if ((len = snprintf(uri, size, "pipe.srv:%u", pipeid)) == size)
         return -ERANGE;
@@ -909,7 +911,9 @@ static int name_path (char * path, size_t size, void * id)
     unsigned int suffix;
     int prefix_len = strlen(path);
     int len;
-    DkRandomBitsRead(&suffix, sizeof(suffix));
+    int ret = DkRandomBitsRead(&suffix, sizeof(suffix));
+    if (ret < 0)
+        return -convert_pal_errno(-ret);
     len = snprintf(path + prefix_len, size - prefix_len, "%08x", suffix);
     if (len == size)
         return -ERANGE;

+ 3 - 1
LibOS/shim/src/sys/shim_brk.c

@@ -85,7 +85,9 @@ int init_brk_region (void * brk_region)
     if (brk_region) {
         while (true) {
             uint32_t rand;
-            DkRandomBitsRead(&rand, sizeof(rand));
+            int ret = DkRandomBitsRead(&rand, sizeof(rand));
+            if (ret < 0)
+                return -convert_pal_errno(-ret);
             rand %= 0x2000000;
             rand = ALIGN_UP(rand);
 

+ 5 - 1
LibOS/shim/src/sys/shim_migrate.c

@@ -113,7 +113,11 @@ int create_checkpoint (const char * cpdir, IDTYPE * sid)
             }
     } else {
 retry:
-        DkRandomBitsRead(&cpsession->sid, sizeof(cpsession->sid));
+        ret = DkRandomBitsRead(&cpsession->sid, sizeof(cpsession->sid));
+        if (ret < 0) {
+            ret = -convert_pal_errno(-ret);
+            goto err_locked;
+        }
 
         listp_for_each_entry(s, &cp_sessions, list)
             if (s->sid == cpsession->sid)

+ 1 - 1
Pal/lib/crypto/adapters/mbedtls_adapter.c

@@ -39,7 +39,7 @@ int _DkRandomBitsRead(void *buffer, int size);
 static int RandomWrapper(void *private, unsigned char *data, size_t size)
 {
     __UNUSED(private);
-    return _DkRandomBitsRead(data, size) != size;
+    return _DkRandomBitsRead(data, size);
 }
 
 #define BITS_PER_BYTE 8

+ 1 - 1
Pal/lib/crypto/adapters/mbedtls_dh.c

@@ -35,7 +35,7 @@ int _DkRandomBitsRead(void *buffer, int size);
 static int RandomWrapper(void *private, unsigned char *data, size_t size)
 {
     __UNUSED(private);
-    return _DkRandomBitsRead(data, size) != size;
+    return _DkRandomBitsRead(data, size);
 }
 
 int lib_DhInit(LIB_DH_CONTEXT *context)

+ 7 - 2
Pal/regression/Misc.c

@@ -37,8 +37,13 @@ int main (int argc, const char ** argv, const char ** envp)
     unsigned long data[100];
     memset(data, 0, sizeof(data));
 
-    for (int i = 0 ; i < 100 ; i++)
-        DkRandomBitsRead(&data[i], sizeof(unsigned long));
+    for (int i = 0 ; i < 100 ; i++) {
+        int ret = DkRandomBitsRead(&data[i], sizeof(unsigned long));
+        if (ret < 0) {
+            pal_printf("DkRandomBitsRead() failed!\n");
+            return 1;
+        }
+    }
 
     bool same = false;
     for (int i = 1 ; i < 100 ; i++)

+ 3 - 12
Pal/src/db_misc.c

@@ -48,8 +48,9 @@ int _DkFastRandomBitsRead (void * buffer, int size)
     rand = seed;
     while (!seed) {
         _DkInternalUnlock(&lock);
-        if (_DkRandomBitsRead(&rand, sizeof(rand)) < sizeof(rand))
-            return -PAL_ERROR_DENIED;
+        int ret = _DkRandomBitsRead(&rand, sizeof(rand));
+        if (ret < 0)
+            return ret;
 
         _DkInternalLock(&lock);
         seed = rand;
@@ -79,18 +80,8 @@ PAL_NUM DkRandomBitsRead (PAL_PTR buffer, PAL_NUM size)
 {
     ENTER_PAL_CALL(DkRandomBitsRead);
 
-    if (!buffer || !size) {
-        _DkRaiseFailure(PAL_ERROR_INVAL);
-        LEAVE_PAL_CALL_RETURN(0);
-    }
-
     int ret = _DkRandomBitsRead((void *) buffer, size);
 
-    if (ret < 0) {
-        _DkRaiseFailure(-ret);
-        ret = 0;
-    }
-
     LEAVE_PAL_CALL_RETURN(ret);
 }
 

+ 2 - 2
Pal/src/host/FreeBSD/db_misc.c

@@ -82,7 +82,7 @@ int _DkRandomBitsRead (void * buffer, int size)
             total_bytes = size;
         }
     } while (total_bytes < size);
-    return total_bytes;
+    return 0;
 }
 #else
 int _DkRandomBitsRead (void * buffer, int size)
@@ -105,7 +105,7 @@ int _DkRandomBitsRead (void * buffer, int size)
         total_bytes += bytes;
     } while (total_bytes < size);
 
-    return total_bytes;
+    return 0;
 }
 #endif
 

+ 5 - 26
Pal/src/host/Linux-SGX/db_misc.c

@@ -46,33 +46,12 @@ unsigned long _DkSystemTimeQuery (void)
 
 int _DkRandomBitsRead (void * buffer, int size)
 {
-    int i = 0;
-
-    for ( ; i < size ; i += 4) {
-        uint32_t rand = rdrand();
-
-        if (i + 4 <= size) {
-            *(uint32_t *)(buffer + i) = rand;
-        } else {
-            switch (size - i) {
-                case 3:
-                    *(uint16_t *)(buffer + i) = rand & 0xffff;
-                    i += 2;
-                    rand >>= 16;
-                    /* FALLTHROUGH */
-                case 1:
-                    *(uint8_t *)(buffer + i) = rand & 0xff;
-                    i++;
-                    break;
-                case 2:
-                    *(uint16_t *)(buffer + i) = rand & 0xffff;
-                    i += 2;
-                    break;
-            }
-            break;
-        }
+    uint32_t rand;
+    for (int i = 0; i < size; i += sizeof(rand)) {
+        rand = rdrand();
+        memcpy(buffer + i, &rand, MIN(sizeof(rand), size - i));
     }
-    return i;
+    return 0;
 }
 
 int _DkInstructionCacheFlush (const void * addr, int size)

+ 2 - 2
Pal/src/host/Linux/db_misc.c

@@ -133,7 +133,7 @@ int _DkRandomBitsRead (void * buffer, int size)
             total_bytes = size;
         }
     } while (total_bytes < size);
-    return total_bytes;
+    return 0;
 }
 #else
 int _DkRandomBitsRead (void * buffer, int size)
@@ -156,7 +156,7 @@ int _DkRandomBitsRead (void * buffer, int size)
         total_bytes += bytes;
     } while (total_bytes < size);
 
-    return total_bytes;
+    return 0;
 }
 #endif
 

+ 5 - 1
Pal/test/Pipe.c

@@ -12,7 +12,11 @@ int main (int argc, char ** argv)
     unsigned long pipeid;
     char uri[40];
 
-    DkRandomBitsRead(&pipeid, sizeof(unsigned long));
+    int ret = DkRandomBitsRead(&pipeid, sizeof(unsigned long));
+    if (ret < 0) {
+        pal_printf("DkRandomBitsRead() failed\n");
+        return -1;
+    }
     pipeid = pipeid % 1024;
 
     snprintf(uri, 40, "pipe.srv:%d", pipeid);