storage.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 storage.c
9 * @date Oct 6, 2016
10 * @brief Storage module implementation file.
11 *
12 ************************************************************************/
13 
14 #include "storage.h"
15 #include "definitions.h"
16 #include "memory.h"
17 #include "log_util.h"
18 #include "file_util.h"
19 #include "string_util.h"
20 
21 // Get public key from file in PEM format.
22 static E_MCL_ERROR_CODE _get_public_key(char *buffer, mcl_size_t buffer_size, void *file_descriptor);
23 
24 // Get private key from file in PEM format.
25 static E_MCL_ERROR_CODE _get_private_key(char *buffer, mcl_size_t buffer_size, void *file_descriptor);
26 
27 E_MCL_ERROR_CODE storage_save_shared_secret_registration_information(string_t *path, string_t *client_id, string_t *client_secret, string_t *registration_access_token,
28  string_t *registration_uri)
29 {
30  DEBUG_ENTRY("string_t *path = <%p>, string_t *client_id = <%p>, string_t *client_secret = <%p>, string_t *registration_access_token = <%p>, string_t *registration_uri = <%p>", path, client_id, client_secret, registration_access_token, registration_uri)
31 
32 #if (1 == HAVE_STORAGE_MEDIUM_)
33 
34 #if (1 == HAVE_FILE_SYSTEM_)
35 
36  E_MCL_ERROR_CODE code;
37 
38  void *file_descriptor = MCL_NULL;
39  mcl_bool_t ok = MCL_OK == (file_util_fopen(path->buffer, "w", &file_descriptor));
40 
41  // TODO : Check and save security profile when RSA is implemented.
42  ok = ok && (MCL_OK == file_util_fputs(client_id->buffer, file_descriptor));
43  ok = ok && (MCL_OK == file_util_fputs("\n", file_descriptor));
44  ok = ok && (MCL_OK == file_util_fputs(client_secret->buffer, file_descriptor));
45  ok = ok && (MCL_OK == file_util_fputs("\n", file_descriptor));
46  ok = ok && (MCL_OK == file_util_fputs(registration_access_token->buffer, file_descriptor));
47  ok = ok && (MCL_OK == file_util_fputs("\n", file_descriptor));
48  ok = ok && (MCL_OK == file_util_fputs(registration_uri->buffer, file_descriptor));
49  ok = ok && (MCL_OK == file_util_fputs("\n", file_descriptor));
50 
51  if (ok)
52  {
53  code = MCL_OK;
54  MCL_INFO("Registration information is successfully saved.");
55  }
56  else
57  {
59  MCL_WARN("Registration information can not be saved.");
60  }
61 
62  file_util_fclose(file_descriptor);
63 
64 #else
66  MCL_INFO("There is no file system support.");
67 #endif
68 
69 #else
71  MCL_INFO("There is no storage medium in the system.");
72 #endif
73 
74  DEBUG_LEAVE("retVal = <%d>", code);
75  return code;
76 }
77 
78 E_MCL_ERROR_CODE storage_save_rsa_registration_information(string_t *path, string_t *client_id, char *public_key, char *private_key, string_t *registration_access_token,
79  string_t *registration_uri)
80 {
81  DEBUG_ENTRY("string_t *path = <%p>, string_t *client_id = <%p>, char *public_key = <%s>, char *private_key = <%s>, string_t *registration_access_token = <%p>, string_t *registration_uri = <%p>", path, client_id, public_key, private_key, registration_access_token, registration_uri)
82 
83 #if (1 == HAVE_STORAGE_MEDIUM_)
84 
85 #if (1 == HAVE_FILE_SYSTEM_)
86 
87  E_MCL_ERROR_CODE code;
88 
89  void *file_descriptor = MCL_NULL;
90  mcl_bool_t ok = MCL_OK == (file_util_fopen(path->buffer, "w", &file_descriptor));
91 
92  // TODO : Check and save security profile when RSA is implemented.
93  ok = ok && (MCL_OK == file_util_fputs(client_id->buffer, file_descriptor));
94  ok = ok && (MCL_OK == file_util_fputs("\n", file_descriptor));
95  ok = ok && (MCL_OK == file_util_fputs(public_key, file_descriptor));
96  ok = ok && (MCL_OK == file_util_fputs(private_key, file_descriptor));
97  ok = ok && (MCL_OK == file_util_fputs(registration_access_token->buffer, file_descriptor));
98  ok = ok && (MCL_OK == file_util_fputs("\n", file_descriptor));
99  ok = ok && (MCL_OK == file_util_fputs(registration_uri->buffer, file_descriptor));
100  ok = ok && (MCL_OK == file_util_fputs("\n", file_descriptor));
101 
102  if (ok)
103  {
104  code = MCL_OK;
105  MCL_INFO("Registration information is successfully saved.");
106  }
107  else
108  {
110  MCL_WARN("Registration information can not be saved.");
111  }
112 
113  file_util_fclose(file_descriptor);
114 
115 #else
117  MCL_INFO("There is no file system support.");
118 #endif
119 
120 #else
122  MCL_INFO("There is no storage medium in the system.");
123 #endif
124 
125  DEBUG_LEAVE("retVal = <%d>", code);
126  return code;
127 }
128 
129 E_MCL_ERROR_CODE storage_load_shared_secret_registration_information(string_t *path, string_t **client_id, string_t **client_secret, string_t **registration_access_token,
130  string_t **registration_uri)
131 {
132  DEBUG_ENTRY("string_t *path = <%p>, string_t **client_id = <%p>, string_t **client_secret = <%p>, string_t **registration_access_token = <%p>, string_t **registration_uri = <%p>", path, client_id, client_secret, registration_access_token, registration_uri)
133 
134 #if (1 == HAVE_STORAGE_MEDIUM_)
135 
136 #if (1 == HAVE_FILE_SYSTEM_)
137 
138  E_MCL_ERROR_CODE code;
139  void *file_descriptor = MCL_NULL;
140  mcl_size_t string_length = 0;
141  mcl_bool_t ok;
142 
143  mcl_size_t buffer_size = 1024;
144  char *buffer = MCL_MALLOC(buffer_size);
145  ASSERT_CODE_MESSAGE(MCL_NULL != buffer, MCL_OUT_OF_MEMORY, "Memory can not be allocated for file read buffer.");
146 
147  code = file_util_fopen(path->buffer, "r", &file_descriptor);
148  ASSERT_STATEMENT_CODE_MESSAGE(MCL_OK == code, MCL_FREE(buffer), MCL_REGISTRATION_INFO_IS_NOT_LOADED, "File does not exist.");
149 
150  ok = MCL_OK == file_util_fgets(buffer, buffer_size, file_descriptor);
151  if (ok)
152  {
153  string_length = string_util_strlen(buffer);
154  ok = (MCL_OK == string_initialize_new(buffer, string_length - 1, client_id));
155  }
156 
157  ok = ok && (MCL_OK == file_util_fgets(buffer, buffer_size, file_descriptor));
158  if (ok)
159  {
160  string_length = string_util_strlen(buffer);
161  ok = (MCL_OK == string_initialize_new(buffer, string_length - 1, client_secret));
162  }
163 
164  ok = ok && (MCL_OK == file_util_fgets(buffer, buffer_size, file_descriptor));
165  if (ok)
166  {
167  string_length = string_util_strlen(buffer);
168  ok = (MCL_OK == string_initialize_new(buffer, string_length - 1, registration_access_token));
169  }
170 
171  ok = ok && (MCL_OK == file_util_fgets(buffer, buffer_size, file_descriptor));
172  if (ok)
173  {
174  string_length = string_util_strlen(buffer);
175  ok = (MCL_OK == string_initialize_new(buffer, string_length - 1, registration_uri));
176  }
177 
178  if (ok)
179  {
180  code = MCL_OK;
181  MCL_DEBUG("Registration information is successfully loaded.");
182  }
183  else
184  {
186  MCL_DEBUG("Registration information can not be loaded.");
187  string_destroy(client_id);
188  string_destroy(client_secret);
189  string_destroy(registration_access_token);
190  string_destroy(registration_uri);
191  }
192 
193  file_util_fclose(file_descriptor);
194  MCL_FREE(buffer);
195 
196 #else
198  MCL_INFO("There is no file system support.");
199 #endif
200 
201 #else
203  MCL_INFO("There is no storage medium in the system.");
204 #endif
205 
206  DEBUG_LEAVE("retVal = <%d>", code);
207  return code;
208 }
209 
210 E_MCL_ERROR_CODE storage_load_rsa_registration_information(string_t *path, string_t **client_id, char **public_key, char **private_key, string_t **registration_access_token,
211  string_t **registration_uri)
212 {
213  DEBUG_ENTRY("string_t *path = <%p>, string_t **client_id = <%p>, char **public_key = <%p>, char **private_key = <%p>, string_t **registration_access_token = <%p>, string_t **registration_uri = <%p>", path, client_id, public_key, private_key, registration_access_token, registration_uri)
214 
215 #if (1 == HAVE_STORAGE_MEDIUM_)
216 
217 #if (1 == HAVE_FILE_SYSTEM_)
218 
219  E_MCL_ERROR_CODE code;
220  mcl_size_t buffer_size = 3000;
221  mcl_size_t string_length = 0;
222  mcl_bool_t ok;
223  char *buffer;
224  void *file_descriptor = MCL_NULL;
225 
226  *client_id = MCL_NULL;
227  *public_key = MCL_NULL;
228  *private_key = MCL_NULL;
229  *registration_access_token = MCL_NULL;
230  *registration_uri = MCL_NULL;
231 
232  buffer = MCL_MALLOC(buffer_size);
233  ASSERT_CODE_MESSAGE(MCL_NULL != buffer, MCL_OUT_OF_MEMORY, "Memory can not be allocated for file read buffer.");
234 
235  code = file_util_fopen(path->buffer, "r", &file_descriptor);
236  ASSERT_STATEMENT_CODE_MESSAGE(MCL_OK == code, MCL_FREE(buffer), MCL_REGISTRATION_INFO_IS_NOT_LOADED, "File does not exist.");
237 
238  ok = MCL_OK == file_util_fgets(buffer, buffer_size, file_descriptor);
239  if (ok)
240  {
241  string_length = string_util_strlen(buffer);
242  ok = (MCL_OK == string_initialize_new(buffer, string_length - 1, client_id));
243  }
244 
245  ok = ok && (MCL_OK == _get_public_key(buffer, buffer_size, file_descriptor));
246  if (ok)
247  {
248  *public_key = string_util_strdup(buffer);
249  ok = (MCL_NULL != *public_key);
250  }
251 
252  ok = ok && (MCL_OK == _get_private_key(buffer, buffer_size, file_descriptor));
253  if (ok)
254  {
255  *private_key = string_util_strdup(buffer);
256  ok = (MCL_NULL != *private_key);
257  }
258 
259  ok = ok && (MCL_OK == file_util_fgets(buffer, buffer_size, file_descriptor));
260  if (ok)
261  {
262  string_length = string_util_strlen(buffer);
263  ok = (MCL_OK == string_initialize_new(buffer, string_length - 1, registration_access_token));
264  }
265 
266  ok = ok && (MCL_OK == file_util_fgets(buffer, buffer_size, file_descriptor));
267  if (ok)
268  {
269  string_length = string_util_strlen(buffer);
270  ok = (MCL_OK == string_initialize_new(buffer, string_length - 1, registration_uri));
271  }
272 
273  if (ok)
274  {
275  code = MCL_OK;
276  MCL_DEBUG("Registration information is successfully loaded.");
277  }
278  else
279  {
281  MCL_DEBUG("Registration information can not be loaded.");
282  string_destroy(client_id);
283  MCL_FREE(*public_key);
284  MCL_FREE(*private_key);
285  string_destroy(registration_access_token);
286  string_destroy(registration_uri);
287  }
288 
289  file_util_fclose(file_descriptor);
290  MCL_FREE(buffer);
291 
292 #else
294  MCL_INFO("There is no file system support.");
295 #endif
296 
297 #else
299  MCL_INFO("There is no storage medium in the system.");
300 #endif
301 
302  DEBUG_LEAVE("retVal = <%d>", code);
303  return code;
304 }
305 
306 static E_MCL_ERROR_CODE _get_public_key(char *buffer, mcl_size_t buffer_size, void *file_descriptor)
307 {
308  DEBUG_ENTRY("char *buffer = <%s>, mcl_size_t buffer_size = <%u>, void *file_descriptor = <%p>", buffer, buffer_size, file_descriptor)
309 
310  E_MCL_ERROR_CODE code;
311  E_MCL_ERROR_CODE compare_result;
312 
313  const char *begin_line = "-----BEGIN PUBLIC KEY-----\n";
314  mcl_size_t begin_line_length = 27;
315 
316  const char *end_line = "-----END PUBLIC KEY-----\n";
317  mcl_size_t end_line_length = 25;
318 
319  mcl_size_t length = 0;
320  mcl_size_t buffer_offset = 0;
321 
322  // Get first line.
323  if (MCL_OK == (code = file_util_fgets(buffer, buffer_size, file_descriptor)))
324  {
325  // Check if it is the beginning line.
326  compare_result = string_util_strncmp(buffer, begin_line, begin_line_length);
327 
328  if (MCL_OK == compare_result)
329  {
330  // Begin line is found.
331  buffer_offset += begin_line_length;
332 
333  // Concatenate key to buffer until end line is reached.
334  do
335  {
336  // Get next line.
337  code = file_util_fgets(buffer + buffer_offset, buffer_size - buffer_offset, file_descriptor);
338 
339  if (MCL_OK == code)
340  {
341  // Check if end line is reached.
342  compare_result = string_util_strncmp(buffer + buffer_offset, end_line, end_line_length);
343  length = string_util_strlen(buffer + buffer_offset);
344  buffer_offset += length;
345  if (buffer_offset >= buffer_size - 1)
346  {
347  code = MCL_FAIL;
348  break;
349  }
350  }
351  else
352  {
353  // Can not read any more data from file.
354  break;
355  }
356  } while (MCL_OK != compare_result);
357  }
358  else
359  {
360  // Can not find the beginning line.
361  code = MCL_FAIL;
362  }
363  }
364 
365  DEBUG_LEAVE("retVal = <%d>", code);
366  return code;
367 }
368 
369 static E_MCL_ERROR_CODE _get_private_key(char *buffer, mcl_size_t buffer_size, void *file_descriptor)
370 {
371  DEBUG_ENTRY("char *buffer = <%s>, mcl_size_t buffer_size = <%u>, void *file_descriptor = <%p>", buffer, buffer_size, file_descriptor)
372 
373  E_MCL_ERROR_CODE code;
374  E_MCL_ERROR_CODE compare_result;
375 
376  const char *begin_line = "-----BEGIN RSA PRIVATE KEY-----\n";
377  mcl_size_t begin_line_length = 32;
378 
379  const char *end_line = "-----END RSA PRIVATE KEY-----\n";
380  mcl_size_t end_line_length = 30;
381 
382  mcl_size_t length = 0;
383  mcl_size_t buffer_offset = 0;
384 
385  // Get first line.
386  if (MCL_OK == (code = file_util_fgets(buffer, buffer_size, file_descriptor)))
387  {
388  // Check if it is the beginning line.
389  compare_result = string_util_strncmp(buffer, begin_line, begin_line_length);
390 
391  if (MCL_OK == compare_result)
392  {
393  // Begin line is found.
394  buffer_offset += begin_line_length;
395 
396  // Concatenate key to buffer until end line is reached.
397  do
398  {
399  // Get next line.
400  code = file_util_fgets(buffer + buffer_offset, buffer_size - buffer_offset, file_descriptor);
401 
402  if (MCL_OK == code)
403  {
404  // Check if end line is reached.
405  compare_result = string_util_strncmp(buffer + buffer_offset, end_line, end_line_length);
406  length = string_util_strlen(buffer + buffer_offset);
407  buffer_offset += length;
408  }
409  else
410  {
411  // Can not read any more data from file.
412  break;
413  }
414  } while (MCL_OK != compare_result);
415  }
416  else
417  {
418  // Can not find the beginning line.
419  code = MCL_FAIL;
420  }
421  }
422 
423  DEBUG_LEAVE("retVal = <%d>", code);
424  return code;
425 }
The system does not support file handling.
Definition: mcl_common.h:145
void string_destroy(string_t **string)
Destroys the allocated resources of the string.
Definition: string_type.c:326
Internal failure in MCL.
Definition: mcl_common.h:141
char * string_util_strdup(const char *string)
Standard library strdup wrapper.
Definition: string_util.c:140
Memory module header file.
#define DEBUG_LEAVE(...)
Definition: log_util.h:81
E_MCL_ERROR_CODE file_util_fgets(char *data, mcl_size_t data_size, void *file_descriptor)
Definition: file_util.c:135
#define DEBUG_ENTRY(...)
Definition: log_util.h:80
static E_MCL_ERROR_CODE _get_private_key(char *buffer, mcl_size_t buffer_size, void *file_descriptor)
Definition: storage.c:369
E_MCL_ERROR_CODE string_initialize_new(const char *value, mcl_size_t value_length, string_t **string)
Initializes a new string_t object with the given value and length.
Definition: string_type.c:46
char * buffer
Buffer of string handle.
Definition: string_type.h:45
#define MCL_DEBUG(...)
Definition: log_util.h:70
E_MCL_ERROR_CODE file_util_fputs(const char *data, void *file_descriptor)
Definition: file_util.c:115
#define MCL_MALLOC(bytes)
Definition: memory.h:120
Log utility module header file.
String utility module implementation file.
E_MCL_ERROR_CODE storage_load_shared_secret_registration_information(string_t *path, string_t **client_id, string_t **client_secret, string_t **registration_access_token, string_t **registration_uri)
Definition: storage.c:129
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 file_util_fopen(const char *file_name, const char *mode, void **file_descriptor)
Definition: file_util.c:22
#define MCL_FREE(p)
Definition: memory.h:125
#define ASSERT_STATEMENT_CODE_MESSAGE(condition, statement, return_code,...)
Definition: definitions.h:121
E_MCL_ERROR_CODE storage_save_rsa_registration_information(string_t *path, string_t *client_id, char *public_key, char *private_key, string_t *registration_access_token, string_t *registration_uri)
Definition: storage.c:78
#define MCL_WARN(...)
Definition: log_util.h:92
#define ASSERT_CODE_MESSAGE(condition, return_code,...)
Definition: definitions.h:105
Definitions module header file.
Storage module header file.
File utility module header file.
E_MCL_ERROR_CODE storage_load_rsa_registration_information(string_t *path, string_t **client_id, char **public_key, char **private_key, string_t **registration_access_token, string_t **registration_uri)
Definition: storage.c:210
E_MCL_ERROR_CODE string_util_strncmp(const char *string_1, const char *string_2, mcl_size_t count)
Standard library strncmp wrapper.
Definition: string_util.c:74
The system does not have a storage medium.
Definition: mcl_common.h:146
E_MCL_ERROR_CODE file_util_fclose(void *file_descriptor)
Definition: file_util.c:52
size_t mcl_size_t
Definition: mcl_common.h:38
E_MCL_ERROR_CODE storage_save_shared_secret_registration_information(string_t *path, string_t *client_id, string_t *client_secret, string_t *registration_access_token, string_t *registration_uri)
Definition: storage.c:27
mcl_uint8_t mcl_bool_t
Definition: mcl_common.h:47
Success.
Definition: mcl_common.h:140
Registration information is not loaded.
Definition: mcl_common.h:212
static E_MCL_ERROR_CODE _get_public_key(char *buffer, mcl_size_t buffer_size, void *file_descriptor)
Definition: storage.c:306
#define MCL_INFO(...)
Definition: log_util.h:87
Registration information is not saved.
Definition: mcl_common.h:211
Memory allocation fail.
Definition: mcl_common.h:143
#define MCL_NULL
Definition: definitions.h:24
mcl_size_t string_util_strlen(const char *buffer)
Standard library strlen wrapper.
Definition: string_util.c:24