security_handler.c
Go to the documentation of this file.
1 
9 #include "security_handler.h"
10 #include "security.h"
11 #include "base64.h"
12 #include "hmac.h"
13 #include "random.h"
14 #include "string_util.h"
15 #include "mcl_core/mcl_assert.h"
16 #include "mcl_core/mcl_memory.h"
17 
19 {
20  MCL_DEBUG_ENTRY("security_handler_t **security_handler = <%p>", security_handler);
21 
22  // Create security handler.
23  MCL_NEW(*security_handler);
24  MCL_ASSERT_CODE_MESSAGE(MCL_NULL != *security_handler, MCL_OUT_OF_MEMORY, "Memory can not be allocated for security handler.");
25 
26  // Memory for members of security_handler_t will be allocated by the key generator function.
27  (*security_handler)->rsa.private_key = MCL_NULL;
28  (*security_handler)->rsa.public_key = MCL_NULL;
29  (*security_handler)->last_token_time = MCL_NULL;
30  (*security_handler)->access_token = MCL_NULL;
31  (*security_handler)->registration_access_token = MCL_NULL;
32  (*security_handler)->client_secret = MCL_NULL;
33  (*security_handler)->registration_uri = MCL_NULL;
34  (*security_handler)->client_id = MCL_NULL;
35 
36  MCL_DEBUG_LEAVE("retVal = <%d>", MCL_OK);
37  return MCL_OK;
38 }
39 
41 {
42  mcl_error_t code;
43 
44  MCL_DEBUG_ENTRY("char **jti = <%p>", jti);
45 
46  code = random_generate_guid(jti);
47 
48  MCL_DEBUG_LEAVE("retVal = <%d>", code);
49  return code;
50 }
51 
53 {
54  mcl_error_t code;
55 
56  MCL_DEBUG_ENTRY("const mcl_uint8_t *data = <%p>, mcl_size_t data_size = <%u>, mcl_uint8_t **hash = <%p>, mcl_size_t *hash_size = <%p>",
57  data, data_size, hash, hash_size);
58 
59  code = security_hash_sha256(data, data_size, hash, hash_size);
60  if (MCL_OK == code)
61  {
62  MCL_DEBUG("SHA256 calculation succeeded: hash = <%p>, hash_size = <%u>", *hash, *hash_size);
63  }
64  else
65  {
66  MCL_ERROR("SHA256 calculation failed!");
67  }
68 
69  MCL_DEBUG_LEAVE("retVal = <%d>", code);
70  return code;
71 }
72 
74  mcl_uint8_t **hash, mcl_size_t *hash_size)
75 {
76  mcl_error_t code;
77 
78  MCL_DEBUG_ENTRY("security_handler_t *security_handler = <%p>, const mcl_uint8_t *data = <%p>, mcl_size_t data_size = <%u>, "\
79  "mcl_uint8_t **hash = <%p>, mcl_size_t *hash_size = <%p>", security_handler, data, data_size, hash, hash_size);
80 
81  code = hmac_sha256((const mcl_uint8_t *) data, data_size, (const mcl_uint8_t *) security_handler->client_secret,
82  string_util_strlen(security_handler->client_secret), hash, hash_size);
83 
84  if (MCL_OK == code)
85  {
86  MCL_DEBUG("HMAC SHA256 calculation succeeded: hash = <%p>, hash_size = <%u>", *hash, *hash_size);
87  }
88  else
89  {
90  MCL_ERROR("HMAC SHA256 calculation failed!");
91  }
92 
93  MCL_DEBUG_LEAVE("retVal = <%d>", code);
94  return code;
95 }
96 
97 mcl_error_t security_handler_base64_encode(const mcl_uint8_t *data, mcl_size_t data_size, char **encoded_data)
98 {
99  mcl_error_t code;
100 
101  MCL_DEBUG_ENTRY("const mcl_uint8_t *data = <%p>, mcl_size_t data_size = <%u>, char **encoded_data = <%p>", data, data_size, encoded_data);
102 
103  code = base64_encode(data, data_size, encoded_data);
104 
105  if (MCL_OK == code)
106  {
107  MCL_DEBUG("Base64 encoding succeeded: encoded_data = <%s>, length encoded_data = <%u>", (*encoded_data), string_util_strlen(*encoded_data));
108  }
109  else
110  {
111  MCL_ERROR("Base64 encoding failed!");
112  }
113 
114  MCL_DEBUG_LEAVE("retVal = <%d>", code);
115  return code;
116 }
117 
118 mcl_error_t security_handler_base64_decode(const char *encoded_data, mcl_uint8_t **decoded_data, mcl_size_t *decoded_data_size)
119 {
120  mcl_error_t code;
121 
122  MCL_DEBUG_ENTRY("const char *encoded_data = <%p>, mcl_uint8_t **decoded_data = <%p>, mcl_size_t *decoded_data_size = <%p>",
123  encoded_data, decoded_data, decoded_data_size);
124 
125  code = base64_decode(encoded_data, decoded_data, decoded_data_size);
126 
127  MCL_DEBUG_LEAVE("retVal = <%d>", code);
128  return code;
129 }
130 
131 mcl_error_t security_handler_base64_url_encode(const mcl_uint8_t *data, mcl_size_t data_size, char **encoded_data)
132 {
133  mcl_error_t code;
134 
135  MCL_DEBUG_ENTRY("const mcl_uint8_t *data = <%p>, mcl_size_t data_size = <%u>, char **encoded_data = <%p>", data, data_size, encoded_data);
136 
137  code = base64_url_encode(data, data_size, encoded_data);
138 
139  if (MCL_OK == code)
140  {
141  MCL_DEBUG("Base64 URL encoding succeeded: encoded_data = <%s>, length encoded_data = <%u>", (*encoded_data), string_util_strlen(*encoded_data));
142  }
143  else
144  {
145  MCL_ERROR("Base64 encoding failed!");
146  }
147 
148  MCL_DEBUG_LEAVE("retVal = <%d>", code);
149  return code;
150 }
151 
153 {
154  mcl_error_t code;
155 
156  MCL_DEBUG_ENTRY("security_handler_t *security_handler = <%p>", security_handler);
157 
158  code = security_generate_rsa_key(&security_handler->rsa.public_key, &security_handler->rsa.private_key);
159 
160  MCL_DEBUG_LEAVE("retVal = <%d>", code);
161  return code;
162 }
163 
164 mcl_error_t security_handler_rsa_sign(char *rsa_key, char *data, mcl_size_t data_size, mcl_uint8_t **signature, mcl_size_t *signature_size)
165 {
166  mcl_error_t code;
167 
168  MCL_DEBUG_ENTRY("char *rsa_key = <%p>, char *data = <%p>, mcl_size_t data_size = <%u>, mcl_uint8_t **signature = <%p>, mcl_size_t *signature_size = <%p>",
169  rsa_key, data, data_size, signature, signature_size);
170 
171  code = security_rsa_sign(rsa_key, data, data_size, signature, signature_size);
172 
173  MCL_DEBUG_LEAVE("retVal = <%d>", code);
174  return code;
175 }
176 
178 {
179  MCL_DEBUG_ENTRY("security_handler_t **security_handler = <%p>", security_handler);
180 
181  if (MCL_NULL != *security_handler)
182  {
183  // Free security handler with its members.
184  MCL_FREE((*security_handler)->access_token);
185  MCL_FREE((*security_handler)->registration_access_token);
186  MCL_FREE((*security_handler)->registration_uri);
187  MCL_FREE((*security_handler)->client_id);
188  MCL_FREE((*security_handler)->last_token_time);
189  MCL_FREE((*security_handler)->client_secret);
190  MCL_FREE((*security_handler)->rsa.private_key);
191  MCL_FREE((*security_handler)->rsa.public_key);
192  MCL_FREE(*security_handler);
193 
194  MCL_DEBUG("Security handler is destroyed.");
195  }
196  else
197  {
198  MCL_DEBUG("Security handler is already NULL.");
199  }
200 
201  MCL_DEBUG_LEAVE("retVal = void");
202 }
mcl_error_t security_handler_generate_jti(char **jti)
size_t mcl_size_t
Assert module header file.
Success.
#define MCL_DEBUG(...)
Definition: mcl_log_util.h:114
mcl_int32_t mcl_error_t
#define MCL_DEBUG_ENTRY(...)
Definition: mcl_log_util.h:115
String utility module header file.
mcl_error_t security_handler_base64_decode(const char *encoded_data, mcl_uint8_t **decoded_data, mcl_size_t *decoded_data_size)
mcl_error_t security_handler_base64_url_encode(const mcl_uint8_t *data, mcl_size_t data_size, char **encoded_data)
#define MCL_ASSERT_CODE_MESSAGE(condition, return_code,...)
Definition: mcl_assert.h:77
mcl_error_t base64_decode(const char *encoded_data, mcl_uint8_t **decoded_data, mcl_size_t *decoded_data_size)
Definition: base64.c:93
#define MCL_NEW(p)
Definition: mcl_memory.h:55
mcl_error_t security_handler_hash_sha256(const mcl_uint8_t *data, mcl_size_t data_size, mcl_uint8_t **hash, mcl_size_t *hash_size)
HMAC module header file.
#define MCL_NULL
#define MCL_ERROR(...)
Definition: mcl_log_util.h:142
void security_handler_destroy(security_handler_t **security_handler)
char * public_key
Public key.
mcl_error_t security_generate_rsa_key(char **public_key, char **private_key)
mcl_error_t base64_encode(const mcl_uint8_t *data, mcl_size_t data_size, char **encoded_data)
Definition: base64.c:119
#define MCL_FREE(p)
Definition: mcl_memory.h:59
mcl_error_t security_handler_rsa_sign(char *rsa_key, char *data, mcl_size_t data_size, mcl_uint8_t **signature, mcl_size_t *signature_size)
mcl_error_t security_hash_sha256(const mcl_uint8_t *data, mcl_size_t data_size, mcl_uint8_t **hash, mcl_size_t *hash_size)
mcl_error_t security_handler_hmac_sha256(security_handler_t *security_handler, const mcl_uint8_t *data, mcl_size_t data_size, mcl_uint8_t **hash, mcl_size_t *hash_size)
mcl_error_t security_handler_initialize(security_handler_t **security_handler)
char * private_key
Private key.
mcl_error_t security_handler_base64_encode(const mcl_uint8_t *data, mcl_size_t data_size, char **encoded_data)
uint8_t mcl_uint8_t
mcl_error_t base64_url_encode(const mcl_uint8_t *data, mcl_size_t data_size, char **encoded_data)
Definition: base64.c:131
rsa_t rsa
RSA handle.
Base64 module header file.
char * client_secret
Client secret.
mcl_error_t security_rsa_sign(char *rsa_key, char *data, mcl_size_t data_size, mcl_uint8_t **signature, mcl_size_t *signature_size)
Security interface header file.
Memory allocation fail.
mcl_error_t hmac_sha256(const mcl_uint8_t *data, mcl_size_t data_size, const mcl_uint8_t *key, mcl_size_t key_size, mcl_uint8_t **hash, mcl_size_t *hash_size)
Definition: hmac.c:21
Random module header file.
#define MCL_DEBUG_LEAVE(...)
Definition: mcl_log_util.h:116
mcl_error_t random_generate_guid(char **guid)
Definition: random.c:80
mcl_size_t string_util_strlen(const char *buffer)
Definition: string_util.c:35
Security handler module header file.
mcl_error_t security_handler_generate_rsa_key(security_handler_t *security_handler)
Memory module interface header file.