random.c
Go to the documentation of this file.
1 
9 #include "random.h"
10 #include "security.h"
11 #include "string_util.h"
12 #include "mcl_core/mcl_assert.h"
13 #include "mcl_core/mcl_random.h"
14 #include "mcl_core/mcl_memory.h"
15 
16 #if defined(HAVE_STDLIB_H_) && (1 == HAVE_STDLIB_H_)
17 #include <stdlib.h>
18 #endif
19 
20 #define GUID_LENGTH 36
21 
22 typedef union guid_t
23 {
24  struct
25  {
32  } guid_fields;
33 
35 } guid_t;
36 
38 {
39  mcl_error_t code = MCL_OK;
40 
41  MCL_DEBUG_ENTRY("char **guid = <%p>", guid);
42 
43  MCL_ASSERT_NOT_NULL(guid, code);
44 
45  code = random_generate_guid(guid);
46  MCL_ASSERT_CODE_MESSAGE(MCL_OK == code, code, "GUID can not be generated.");
47 
49  MCL_DEBUG_LEAVE("retVal = <%d>", code);
50  return code;
51 }
52 
53 mcl_error_t mcl_random_generate_bytes(unsigned char *buffer, mcl_size_t size)
54 {
55  mcl_error_t code;
56 
57  MCL_DEBUG_ENTRY("unsigned char *buffer = <%u>, mcl_size_t size = <%u>", buffer, size);
58 
59  MCL_ASSERT_NOT_NULL(buffer, code);
60 
61  code = security_generate_random_bytes(buffer, size);
62 
64  MCL_DEBUG_LEAVE("retVal = <%d>", code);
65  return code;
66 }
67 
69 {
70  mcl_error_t code;
71 
72  MCL_DEBUG_ENTRY("mcl_uint32_t *random_number = <%p>", random_number);
73 
74  code = security_generate_random_bytes((unsigned char *) random_number, sizeof(mcl_uint32_t));
75 
76  MCL_DEBUG_LEAVE("retVal = <%d>", code);
77  return code;
78 }
79 
81 {
82  mcl_error_t code;
83  guid_t guid_content;
84  char *guid_string;
85 
86  MCL_DEBUG_ENTRY("char **guid = <%p>", guid);
87 
88  guid_string = MCL_MALLOC(GUID_LENGTH + 1);
89  MCL_ASSERT_CODE_MESSAGE(MCL_NULL != guid_string, MCL_OUT_OF_MEMORY, "Memory can not be allocated for GUID string.");
90 
91  code = security_generate_random_bytes(guid_content.rnd, sizeof(guid_content));
92 
93  if (MCL_OK == code)
94  {
95  guid_content.guid_fields.clk_seq_hi_res = (guid_content.guid_fields.clk_seq_hi_res & 0x3FU) | 0x80U;
96  guid_content.guid_fields.time_hi_and_version = (guid_content.guid_fields.time_hi_and_version & 0x0FFFU) | 0x4000U;
97 
98  code = string_util_snprintf(guid_string, GUID_LENGTH + 1, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
99  guid_content.guid_fields.time_low, guid_content.guid_fields.time_mid, guid_content.guid_fields.time_hi_and_version,
100  guid_content.guid_fields.clk_seq_hi_res, guid_content.guid_fields.clk_seq_low,
101  guid_content.guid_fields.node[0], guid_content.guid_fields.node[1],
102  guid_content.guid_fields.node[2], guid_content.guid_fields.node[3],
103  guid_content.guid_fields.node[4], guid_content.guid_fields.node[5]);
104  MCL_ASSERT_STATEMENT_CODE_MESSAGE(MCL_OK == code, MCL_FREE(guid_string), code, "GUID structure can not be printed as string.");
105 
106  *guid = guid_string;
107  }
108  else
109  {
110  MCL_FREE(guid_string);
111  }
112 
113  MCL_DEBUG_LEAVE("retVal = <%d>", code);
114  return code;
115 }
#define MCL_FUNCTION_LEAVE_LABEL
uint16_t mcl_uint16_t
Definition: random.c:22
size_t mcl_size_t
Assert module header file.
Success.
mcl_uint16_t time_mid
Middle 16 bits of time.
Definition: random.c:27
mcl_int32_t mcl_error_t
mcl_error_t security_generate_random_bytes(unsigned char *buffer, mcl_size_t size)
#define MCL_DEBUG_ENTRY(...)
Definition: mcl_log_util.h:115
mcl_uint16_t time_hi_and_version
Version followed by 12 highest significant bits of time.
Definition: random.c:28
uint32_t mcl_uint32_t
String utility module header file.
#define MCL_ASSERT_CODE_MESSAGE(condition, return_code,...)
Definition: mcl_assert.h:77
#define MCL_NULL
mcl_uint8_t rnd[16]
Random bytes.
Definition: random.c:34
#define MCL_FREE(p)
Definition: mcl_memory.h:59
struct guid_t::@0 guid_fields
mcl_error_t mcl_random_generate_guid(char **guid)
Definition: random.c:37
uint8_t mcl_uint8_t
mcl_error_t random_generate_number(mcl_uint32_t *random_number)
Definition: random.c:68
#define MCL_ASSERT_STATEMENT_CODE_MESSAGE(condition, statement, return_code,...)
Definition: mcl_assert.h:93
mcl_uint8_t clk_seq_hi_res
Variant followed by highest bits of clock sequence.
Definition: random.c:29
#define MCL_ASSERT_NOT_NULL(argument, return_variable)
Definition: mcl_assert.h:38
mcl_uint8_t node[6]
Node ID.
Definition: random.c:31
#define GUID_LENGTH
Definition: random.c:20
mcl_error_t mcl_random_generate_bytes(unsigned char *buffer, mcl_size_t size)
Definition: random.c:53
mcl_error_t string_util_snprintf(char *string, mcl_size_t length, const char *format,...)
Definition: string_util.c:177
mcl_uint8_t clk_seq_low
Lowest significant bits of clock sequence.
Definition: random.c:30
Security interface header file.
Memory allocation fail.
#define MCL_MALLOC(bytes)
Definition: mcl_memory.h:54
Random module header file.
mcl_uint32_t time_low
Lowest significant 32 bits of time.
Definition: random.c:26
#define MCL_DEBUG_LEAVE(...)
Definition: mcl_log_util.h:116
Random module interface header file.
mcl_error_t random_generate_guid(char **guid)
Definition: random.c:80
Memory module interface header file.