random.c
Go to the documentation of this file.
1 /*!**********************************************************************
2 *
3 * @copyright Copyright (C) 2016 Siemens Aktiengesellschaft.\n
4 * All rights reserved.
5 *
6 *************************************************************************
7 *
8 * @file random.c
9 * @date Aug 15, 2016
10 * @brief Random module implementation file.
11 *
12 ************************************************************************/
13 
14 #include "random.h"
15 #include "mcl/mcl_random.h"
16 #include "memory.h"
17 #include "security.h"
18 #include "definitions.h"
19 #include "log_util.h"
20 
21 #if (1 == HAVE_STDLIB_H_)
22 #include <stdlib.h>
23 #endif
24 
25 #define GUID_LENGTH 36
26 
27 typedef union guid_t
28 {
29  struct
30  {
37  };
38 
40 } guid_t;
41 
43 {
44  DEBUG_ENTRY("char **guid = <%p>", guid)
45 
46  E_MCL_ERROR_CODE code;
47  string_t *guid_string = MCL_NULL;
48 
49  ASSERT_NOT_NULL(guid);
50 
51  code = random_generate_guid(&guid_string);
52  ASSERT_CODE_MESSAGE(MCL_OK == code, code, "GUID can not be generated.");
53 
54  *guid = guid_string->buffer;
55  MCL_FREE(guid_string);
56 
57  DEBUG_LEAVE("retVal = <%d>", MCL_OK);
58  return MCL_OK;
59 }
60 
62 {
63  DEBUG_ENTRY("mcl_uint32_t *random_number = <%p>", random_number)
64 
65  E_MCL_ERROR_CODE code = security_generate_random_bytes((unsigned char *)random_number, sizeof(mcl_uint32_t));
66 
67  DEBUG_LEAVE("retVal = <%d>", code);
68  return code;
69 }
70 
72 {
73  DEBUG_ENTRY("mcl_size_t size = <%u>", size)
74 
75  E_MCL_ERROR_CODE result;
76  mcl_uint8_t *array = MCL_MALLOC(size);
77  ASSERT_MESSAGE(MCL_NULL != array, "Not enough memory to allocate random array!");
78 
79  result = security_generate_random_bytes(array, size);
80  ASSERT_STATEMENT_MESSAGE(MCL_OK == result, MCL_FREE(array), "security_generate_random_bytes() function fail.");
81 
82  DEBUG_LEAVE("retVal = <%p>", array);
83  return array;
84 }
85 
87 {
88  E_MCL_ERROR_CODE code;
89  guid_t guid_content;
90  char *guid_string;
91 
92  DEBUG_ENTRY("string_t **guid = <%p>", guid)
93 
94  guid_string = MCL_MALLOC(GUID_LENGTH + 1);
95  ASSERT_CODE_MESSAGE(MCL_NULL != guid_string, MCL_OUT_OF_MEMORY, "Memory can not be allocated for GUID string.");
96 
97  code = security_generate_random_bytes(guid_content.rnd, sizeof(guid_content));
98 
99  if (MCL_OK == code)
100  {
101  guid_content.clk_seq_hi_res = (mcl_uint8_t)((guid_content.clk_seq_hi_res & 0x3F) | 0x80);
102  guid_content.time_hi_and_version = (mcl_uint16_t)((guid_content.time_hi_and_version & 0x0FFF) | 0x4000);
103 
104  code = string_util_snprintf(guid_string, GUID_LENGTH + 1, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", guid_content.time_low, guid_content.time_mid,
105  guid_content.time_hi_and_version, guid_content.clk_seq_hi_res, guid_content.clk_seq_low, guid_content.node[0], guid_content.node[1],
106  guid_content.node[2], guid_content.node[3], guid_content.node[4], guid_content.node[5]);
107  ASSERT_STATEMENT_CODE_MESSAGE(MCL_OK == code, MCL_FREE(guid_string), code, "GUID structure can not be printed as string.");
108 
109  code = string_initialize_dynamic(guid_string, GUID_LENGTH, guid);
110  ASSERT_STATEMENT_CODE_MESSAGE(MCL_OK == code, MCL_FREE(guid_string), code, "GUID string can not be initialized.");
111  }
112  else
113  {
114  MCL_FREE(guid_string);
115  }
116 
117  DEBUG_LEAVE("retVal = <%d>", code);
118  return code;
119 }
Definition: random.c:27
Memory module header file.
#define DEBUG_LEAVE(...)
Definition: log_util.h:81
#define DEBUG_ENTRY(...)
Definition: log_util.h:80
mcl_uint16_t time_mid
Middle 16 bits of time.
Definition: random.c:32
char * buffer
Buffer of string handle.
Definition: string_type.h:45
E_MCL_ERROR_CODE mcl_random_generate_guid(char **guid)
Generates globally unique identifier.
Definition: random.c:42
#define ASSERT_MESSAGE(condition,...)
Definition: definitions.h:82
mcl_uint16_t time_hi_and_version
Version followed by 12 highest significant bits of time.
Definition: random.c:33
#define ASSERT_NOT_NULL(argument)
Definition: definitions.h:129
#define MCL_MALLOC(bytes)
Definition: memory.h:120
E_MCL_ERROR_CODE security_generate_random_bytes(unsigned char *buffer, mcl_size_t size)
To be used to generate random bytes.
Log utility module header file.
#define ASSERT_STATEMENT_MESSAGE(condition, statement,...)
Definition: definitions.h:89
E_MCL_ERROR_CODE
MCL Error code definitions. Every function returning an error code uses this enum values...
Definition: mcl_common.h:137
E_MCL_ERROR_CODE string_util_snprintf(char *string, mcl_size_t length, const char *format,...)
Standard library snprintf wrapper.
Definition: string_util.c:95
#define MCL_FREE(p)
Definition: memory.h:125
uint32_t mcl_uint32_t
Definition: mcl_common.h:45
#define ASSERT_STATEMENT_CODE_MESSAGE(condition, statement, return_code,...)
Definition: definitions.h:121
uint16_t mcl_uint16_t
Definition: mcl_common.h:44
mcl_uint8_t rnd[16]
Random bytes.
Definition: random.c:39
uint8_t mcl_uint8_t
Definition: mcl_common.h:43
E_MCL_ERROR_CODE random_generate_guid(string_t **guid)
Generates random guid.
Definition: random.c:86
#define ASSERT_CODE_MESSAGE(condition, return_code,...)
Definition: definitions.h:105
Definitions module header file.
mcl_uint8_t clk_seq_hi_res
Variant followed by highest bits of clock sequence.
Definition: random.c:34
E_MCL_ERROR_CODE string_initialize_dynamic(const char *value, mcl_size_t value_length, string_t **string)
Initializes a dynamic string_t object with the given value and length.
Definition: string_type.c:68
E_MCL_ERROR_CODE random_generate_number(mcl_uint32_t *random_number)
Generates random integer number.
Definition: random.c:61
mcl_uint8_t node[6]
Node ID.
Definition: random.c:36
#define GUID_LENGTH
Definition: random.c:25
size_t mcl_size_t
Definition: mcl_common.h:38
Success.
Definition: mcl_common.h:140
mcl_uint8_t clk_seq_low
Lowest significant bits of clock sequence.
Definition: random.c:35
Security module header file.Inner security interface. Contains security related functions like hashin...
Random module header file.
mcl_uint32_t time_low
Lowest significant 32 bits of time.
Definition: random.c:31
Memory allocation fail.
Definition: mcl_common.h:143
#define MCL_NULL
Definition: definitions.h:24
Random number generation module interface header file.
mcl_uint8_t * random_generate_array(mcl_size_t size)
Generates an array of random numbers.
Definition: random.c:71