1 // Send Actions for DeviceState state machine
4 #include "pEp_internal.h"
5 #include "keymanagement.h"
8 #include "baseprotocol.h"
10 #include "../asn.1/DeviceGroup-Protocol.h"
11 #include "../asn.1/Beacon.h"
12 #include "../asn.1/HandshakeRequest.h"
13 #include "../asn.1/GroupKeys.h"
16 // sendBeacon() - send Beacon message
19 // session (in) session handle
20 // state (in) state the state machine is in
21 // partner (in) (must be NULL)
24 // PEP_STATUS_OK or any other value on error
26 PEP_STATUS sendBeacon(
28 DeviceState_state state,
33 PEP_STATUS status = PEP_STATUS_OK;
36 message *_message = NULL;
37 pEp_identity *me = NULL;
41 if (!(session && !partner))
42 return PEP_ILLEGAL_VALUE;
44 assert(session->messageToSend);
45 if (!session->messageToSend) {
46 status = PEP_SEND_FUNCTION_NOT_REGISTERED;
50 msg = (Beacon_t *) calloc(1, sizeof(Beacon_t));
56 status = sequence_value(session, "DeviceGroup", &seq);
57 if (status != PEP_STATUS_OK)
59 msg->header.sequence = (long) seq;
61 bool devicegroup = storedGroupKeys(session);
62 if (devicegroup) { // default is FALSE
63 BOOLEAN_t *dg = malloc(sizeof(BOOLEAN_t));
69 msg->header.devicegroup = dg;
72 msg->header.state = (long) state;
74 me = new_identity(NULL, NULL, NULL, NULL);
77 status = myself(session, me);
78 if (status != PEP_STATUS_OK)
80 if (Identity_from_Struct(me, &msg->header.me) == NULL)
83 if (asn_check_constraints(&asn_DEF_Beacon, msg, NULL, NULL)) {
84 status = PEP_CONTRAINTS_VIOLATED;
88 ssize_t size = uper_encode_to_new_buffer(&asn_DEF_Beacon,
89 NULL, msg, (void **) &payload);
91 status = PEP_CANNOT_ENCODE;
95 status = prepare_message(me, partner, payload, size, &_message);
96 if (status != PEP_STATUS_OK)
103 status = session->messageToSend(session->sync_obj, _message);
105 free_message(_message);
106 ASN_STRUCT_FREE(asn_DEF_Beacon, msg);
107 free_identity(partner);
111 status = PEP_OUT_OF_MEMORY;
113 ASN_STRUCT_FREE(asn_DEF_Beacon, msg);
115 free_message(_message);
117 free_identity(partner);
122 // sendHandshakeRequest() - send HandshakeRequest message
125 // session (in) session handle
126 // state (in) state the state machine is in
127 // partner (in) partner to communicate with
130 // PEP_STATUS_OK or any other value on error
132 PEP_STATUS sendHandshakeRequest(
134 DeviceState_state state,
139 PEP_STATUS status = PEP_STATUS_OK;
140 HandshakeRequest_t *msg = NULL;
141 char *payload = NULL;
142 message *_message = NULL;
143 pEp_identity *me = NULL;
147 if (!(session && partner))
148 return PEP_ILLEGAL_VALUE;
150 assert(session->messageToSend);
151 if (!session->messageToSend) {
152 status = PEP_SEND_FUNCTION_NOT_REGISTERED;
156 msg = (HandshakeRequest_t *) calloc(1, sizeof(HandshakeRequest_t));
162 status = sequence_value(session, "DeviceGroup", &seq);
163 if (status != PEP_STATUS_OK)
165 msg->header.sequence = (long) seq;
167 bool devicegroup = storedGroupKeys(session);
168 if (devicegroup) { // default is FALSE
169 BOOLEAN_t *dg = malloc(sizeof(BOOLEAN_t));
175 msg->header.devicegroup = dg;
178 msg->header.state = (long) state;
180 me = new_identity(NULL, NULL, NULL, NULL);
183 status = myself(session, me);
184 if (status != PEP_STATUS_OK)
186 if (Identity_from_Struct(me, &msg->header.me) == NULL)
189 if (asn_check_constraints(&asn_DEF_HandshakeRequest, msg, NULL, NULL)) {
190 status = PEP_CONTRAINTS_VIOLATED;
194 ssize_t size = uper_encode_to_new_buffer(&asn_DEF_HandshakeRequest,
195 NULL, msg, (void **) &payload);
197 status = PEP_CANNOT_ENCODE;
201 status = prepare_message(me, partner, payload, size, &_message);
202 if (status != PEP_STATUS_OK)
209 status = session->messageToSend(session->sync_obj, _message);
211 free_message(_message);
212 ASN_STRUCT_FREE(asn_DEF_HandshakeRequest, msg);
213 free_identity(partner);
217 status = PEP_OUT_OF_MEMORY;
219 ASN_STRUCT_FREE(asn_DEF_HandshakeRequest, msg);
221 free_message(_message);
223 free_identity(partner);
228 // sendGroupKeys() - send GroupKeys message
231 // session (in) session handle
232 // state (in) state the state machine is in
233 // partner (in) (must be NULL)
236 // PEP_STATUS_OK or any other value on error
238 PEP_STATUS sendGroupKeys(
240 DeviceState_state state,
245 PEP_STATUS status = PEP_STATUS_OK;
246 GroupKeys_t *msg = NULL;
247 char *payload = NULL;
248 message *_message = NULL;
249 pEp_identity *me = NULL;
250 identity_list *kl = NULL;
254 if (!(session && !partner))
255 return PEP_ILLEGAL_VALUE;
257 assert(session->messageToSend);
258 if (!session->messageToSend) {
259 status = PEP_SEND_FUNCTION_NOT_REGISTERED;
263 msg = (GroupKeys_t *) calloc(1, sizeof(GroupKeys_t));
269 status = sequence_value(session, "DeviceGroup", &seq);
270 if (status != PEP_STATUS_OK)
272 msg->header.sequence = (long) seq;
274 bool devicegroup = storedGroupKeys(session);
275 if (devicegroup) { // default is FALSE
276 BOOLEAN_t *dg = malloc(sizeof(BOOLEAN_t));
282 msg->header.devicegroup = dg;
285 msg->header.state = (long) state;
287 me = new_identity(NULL, NULL, NULL, NULL);
290 status = myself(session, me);
291 if (status != PEP_STATUS_OK)
293 if (Identity_from_Struct(me, &msg->header.me) == NULL)
296 status = own_identities_retrieve(session, &kl);
297 if (status != PEP_STATUS_OK)
299 if (IdentityList_from_identity_list(kl, &msg->ownIdentities) == NULL)
302 if (asn_check_constraints(&asn_DEF_GroupKeys, msg, NULL, NULL)) {
303 status = PEP_CONTRAINTS_VIOLATED;
307 ssize_t size = uper_encode_to_new_buffer(&asn_DEF_GroupKeys,
308 NULL, msg, (void **) &payload);
310 status = PEP_CANNOT_ENCODE;
314 status = prepare_message(me, partner, payload, size, &_message);
315 if (status != PEP_STATUS_OK)
322 status = session->messageToSend(session->sync_obj, _message);
324 free_message(_message);
325 ASN_STRUCT_FREE(asn_DEF_GroupKeys, msg);
326 free_identity(partner);
327 free_identity_list(kl);
331 status = PEP_OUT_OF_MEMORY;
333 ASN_STRUCT_FREE(asn_DEF_GroupKeys, msg);
335 free_message(_message);
337 free_identity(partner);
338 free_identity_list(kl);