...
1 // Send Actions for DeviceState state machine
4 #include "pEp_internal.h"
5 #include "keymanagement.h"
8 #include "baseprotocol.h"
10 #include "../asn.1/Beacon.h"
11 #include "../asn.1/HandshakeRequest.h"
12 #include "../asn.1/GroupKeys.h"
15 // sendBeacon() - send Beacon message
18 // session (in) session handle
19 // state (in) state the state machine is in
20 // partner (in) (must be NULL)
23 // PEP_STATUS_OK or any other value on error
25 PEP_STATUS sendBeacon(
27 DeviceState_state state,
32 PEP_STATUS status = PEP_STATUS_OK;
35 message *_message = NULL;
36 pEp_identity *me = NULL;
40 if (!(session && !partner))
41 return PEP_ILLEGAL_VALUE;
43 assert(session->messageToSend);
44 if (!session->messageToSend) {
45 status = PEP_SEND_FUNCTION_NOT_REGISTERED;
49 msg = (Beacon_t *) calloc(1, sizeof(Beacon_t));
55 status = sequence_value(session, "DeviceGroup", &seq);
56 if (status != PEP_STATUS_OK)
58 msg->header.sequence = (long) seq;
60 bool devicegroup = storedGroupKeys(session);
61 if (devicegroup) { // default is FALSE
62 BOOLEAN_t *dg = malloc(sizeof(BOOLEAN_t));
68 msg->header.devicegroup = dg;
71 msg->header.state = (long) state;
73 me = new_identity(NULL, NULL, NULL, NULL);
76 status = myself(session, me);
77 if (status != PEP_STATUS_OK)
79 if (Identity_from_Struct(me, &msg->header.me) == NULL)
82 if (asn_check_constraints(&asn_DEF_Beacon, msg, NULL, NULL)) {
83 status = PEP_CONTRAINTS_VIOLATED;
87 ssize_t size = uper_encode_to_new_buffer(&asn_DEF_Beacon,
88 NULL, msg, (void **) &payload);
90 status = PEP_CANNOT_ENCODE;
94 status = prepare_message(me, partner, payload, size, &_message);
95 if (status != PEP_STATUS_OK)
102 status = session->messageToSend(session->sync_obj, _message);
104 free_message(_message);
105 ASN_STRUCT_FREE(asn_DEF_Beacon, msg);
106 free_identity(partner);
110 status = PEP_OUT_OF_MEMORY;
112 ASN_STRUCT_FREE(asn_DEF_Beacon, msg);
114 free_message(_message);
120 // sendHandshakeRequest() - send HandshakeRequest message
123 // session (in) session handle
124 // state (in) state the state machine is in
125 // partner (in) partner to communicate with
128 // PEP_STATUS_OK or any other value on error
130 PEP_STATUS sendHandshakeRequest(
132 DeviceState_state state,
137 PEP_STATUS status = PEP_STATUS_OK;
138 HandshakeRequest_t *msg = NULL;
139 char *payload = NULL;
140 message *_message = NULL;
141 pEp_identity *me = NULL;
145 if (!(session && partner))
146 return PEP_ILLEGAL_VALUE;
148 assert(session->messageToSend);
149 if (!session->messageToSend) {
150 status = PEP_SEND_FUNCTION_NOT_REGISTERED;
154 msg = (HandshakeRequest_t *) calloc(1, sizeof(HandshakeRequest_t));
160 status = sequence_value(session, "DeviceGroup", &seq);
161 if (status != PEP_STATUS_OK)
163 msg->header.sequence = (long) seq;
165 bool devicegroup = storedGroupKeys(session);
166 if (devicegroup) { // default is FALSE
167 BOOLEAN_t *dg = malloc(sizeof(BOOLEAN_t));
173 msg->header.devicegroup = dg;
176 msg->header.state = (long) state;
178 me = new_identity(NULL, NULL, NULL, NULL);
181 status = myself(session, me);
182 if (status != PEP_STATUS_OK)
184 if (Identity_from_Struct(me, &msg->header.me) == NULL)
187 if (asn_check_constraints(&asn_DEF_HandshakeRequest, msg, NULL, NULL)) {
188 status = PEP_CONTRAINTS_VIOLATED;
192 ssize_t size = uper_encode_to_new_buffer(&asn_DEF_HandshakeRequest,
193 NULL, msg, (void **) &payload);
195 status = PEP_CANNOT_ENCODE;
199 status = prepare_message(me, partner, payload, size, &_message);
200 if (status != PEP_STATUS_OK)
207 status = session->messageToSend(session->sync_obj, _message);
209 free_message(_message);
210 ASN_STRUCT_FREE(asn_DEF_HandshakeRequest, msg);
211 free_identity(partner);
215 status = PEP_OUT_OF_MEMORY;
217 ASN_STRUCT_FREE(asn_DEF_HandshakeRequest, msg);
219 free_message(_message);
225 // sendGroupKeys() - send GroupKeys message
228 // session (in) session handle
229 // state (in) state the state machine is in
230 // partner (in) (must be NULL)
233 // PEP_STATUS_OK or any other value on error
235 PEP_STATUS sendGroupKeys(
237 DeviceState_state state,
242 PEP_STATUS status = PEP_STATUS_OK;
243 GroupKeys_t *msg = NULL;
244 char *payload = NULL;
245 message *_message = NULL;
246 pEp_identity *me = NULL;
250 if (!(session && !partner))
251 return PEP_ILLEGAL_VALUE;
253 assert(session->messageToSend);
254 if (!session->messageToSend) {
255 status = PEP_SEND_FUNCTION_NOT_REGISTERED;
259 msg = (GroupKeys_t *) calloc(1, sizeof(GroupKeys_t));
265 status = sequence_value(session, "DeviceGroup", &seq);
266 if (status != PEP_STATUS_OK)
268 msg->header.sequence = (long) seq;
270 bool devicegroup = storedGroupKeys(session);
271 if (devicegroup) { // default is FALSE
272 BOOLEAN_t *dg = malloc(sizeof(BOOLEAN_t));
278 msg->header.devicegroup = dg;
281 msg->header.state = (long) state;
283 me = new_identity(NULL, NULL, NULL, NULL);
286 status = myself(session, me);
287 if (status != PEP_STATUS_OK)
289 if (Identity_from_Struct(me, &msg->header.me) == NULL)
292 if (asn_check_constraints(&asn_DEF_GroupKeys, msg, NULL, NULL)) {
293 status = PEP_CONTRAINTS_VIOLATED;
297 ssize_t size = uper_encode_to_new_buffer(&asn_DEF_GroupKeys,
298 NULL, msg, (void **) &payload);
300 status = PEP_CANNOT_ENCODE;
304 status = prepare_message(me, partner, payload, size, &_message);
305 if (status != PEP_STATUS_OK)
312 status = session->messageToSend(session->sync_obj, _message);
314 free_message(_message);
315 ASN_STRUCT_FREE(asn_DEF_GroupKeys, msg);
316 free_identity(partner);
320 status = PEP_OUT_OF_MEMORY;
322 ASN_STRUCT_FREE(asn_DEF_GroupKeys, msg);
324 free_message(_message);