Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
e7fae5d
Read timeouts in fsmpico
Jan 29, 2018
e17b33d
Merge remote-tracking branch 'origin/create-fsm-tests' into 6-support…
dettonijr Jan 31, 2018
240e58b
Merge remote-tracking branch 'origin/read-timeouts-in-fsmpico' into 6…
dettonijr Jan 31, 2018
9d53752
Merge remote-tracking branch 'origin/fix-service-reauth-timeout' into…
dettonijr Jan 31, 2018
bbe200a
Fix test according to new timeouts
dettonijr Jan 31, 2018
6ed4f4c
Adding extra data to service reauth message
dettonijr Feb 1, 2018
a5c4a3c
Adding extraData to fsmpico
dettonijr Feb 1, 2018
11e443b
Adding ability send send the reauth message at any time
dettonijr Feb 1, 2018
3d290ab
Reply to ServiceReauth immediately
Feb 2, 2018
fcbd22a
Merge remote-tracking branch 'origin/read-timeouts-in-fsmpico' into 6…
dettonijr Feb 6, 2018
2c115d5
Merge remote-tracking branch 'origin/master' into 6-support-messages-…
dettonijr Feb 12, 2018
b5ce68f
Improve messageservicereauth destructor
dettonijr Feb 12, 2018
877118a
Merge remote-tracking branch 'origin/6-support-messages-in-continuous…
dettonijr Feb 12, 2018
5ce6be2
Merge remote-tracking branch 'origin/master' into 6-support-messages-…
dettonijr Feb 12, 2018
17a052e
Update serial service/pico continuous functions to support extradata
llewelld Feb 13, 2018
7fbb392
Update documentation
llewelld Feb 13, 2018
7bcd058
Update unit tests to check extradata sending
llewelld Feb 15, 2018
54c4bf1
Avoid the use of global variables
llewelld Feb 16, 2018
4f853ab
Add extradata to one test
llewelld Feb 16, 2018
db383c4
Fix intermittent test failure; add pico->service extradata check
llewelld Feb 16, 2018
b721edb
Fix bug preventing Pico sending extradata during continuous
llewelld Feb 16, 2018
b86a476
Add extradata sending to FSM tests
llewelld Feb 16, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions include/pico/continuous.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,16 +72,16 @@ DLL_PUBLIC void continuous_set_service_sequence_number(Continuous * continuous,
DLL_PUBLIC REAUTHSTATE continuous_get_state(Continuous * continuous);

DLL_PUBLIC bool continuous_start(Continuous * continuous, Shared * shared, Users * authorizedUsers, Buffer * returnedStoredData, QrCallbackFunction qrCallback, void * data, Buffer * localSymmetricKey);
DLL_PUBLIC bool continuous_cycle_start(Continuous * continuous);
DLL_PUBLIC bool continuous_cycle_start_pico(Continuous * continuous, Buffer * extraData);
DLL_PUBLIC bool continuous_cycle_start(Continuous * continuous, Buffer const * extraData, Buffer * returnedStoredData);
DLL_PUBLIC bool continuous_cycle_start_pico(Continuous * continuous, Buffer const * extraData, Buffer * returnedStoredData);
DLL_PUBLIC bool continuous_read_pico_reauth(Continuous * continuous, SequenceNumber * sequenceNumber, Buffer * returnedStoredData);
DLL_PUBLIC bool continuous_write_pico_reauth(Continuous * continuous, Buffer * extraData);
DLL_PUBLIC bool continuous_read_service_reauth(Continuous * continuous, SequenceNumber * sequenceNumber, int * timeout);
DLL_PUBLIC bool continuous_write_service_reauth(Continuous * continuous);
DLL_PUBLIC bool continuous_update_state(Continuous * continuous, REAUTHSTATE new_state);
DLL_PUBLIC bool continuous_reauth(Continuous * continuous, Buffer * returnedStoredData);
DLL_PUBLIC bool continuous_reauth_pico(Continuous * continuous, Buffer * extraData, int * timeout);
DLL_PUBLIC bool continuous_continue(Continuous * continuous, Buffer * returnedStoredData);
DLL_PUBLIC bool continuous_write_pico_reauth(Continuous * continuous, Buffer const * extraData);
DLL_PUBLIC bool continuous_read_service_reauth(Continuous * continuous, SequenceNumber * sequenceNumber, Buffer * returnedStoredData, int * timeout);
DLL_PUBLIC bool continuous_write_service_reauth(Continuous * continuous, Buffer const * extraData);
DLL_PUBLIC bool continuous_update_state(Continuous * continuous, REAUTHSTATE new_state, Buffer const * extraData);
DLL_PUBLIC bool continuous_reauth(Continuous * continuous, Buffer const * extraData, Buffer * returnedStoredData);
DLL_PUBLIC bool continuous_reauth_pico(Continuous * continuous, Buffer const * extraData, Buffer * returnedStoredData, int * timeout);
DLL_PUBLIC bool continuous_continue(Continuous * continuous, Buffer const * extraData, Buffer * returnedStoredData);
DLL_PUBLIC bool continuous_finish(Continuous * continuous);

DLL_PUBLIC void continuous_set_custom_timeout(Continuous * continuous, int timeout_active, int timeout_paused);
Expand All @@ -92,7 +92,7 @@ DLL_PUBLIC void continuous_get_shared_key(Continuous * continuous, Buffer * shar
DLL_PUBLIC void continuous_set_channel(Continuous * continuous, RVPChannel * channel);
DLL_PUBLIC RVPChannel * continuous_get_channel(Continuous * continuous);

DLL_PUBLIC bool continuous_continue_pico(Continuous * continuous, Buffer * extraData, int * timeout);
DLL_PUBLIC bool continuous_continue_pico(Continuous * continuous, Buffer const * extraData, Buffer * returnedStoredData, int * timeout);

// Function definitions

Expand Down
3 changes: 3 additions & 0 deletions include/pico/fsmpico.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,14 @@ FsmPico * fsmpico_new();
void fsmpico_delete(FsmPico * fsmpico);
void fsmpico_set_functions(FsmPico * fsmpico, FsmWrite write, FsmSetTimeout setTimeout, FsmError error, FsmReconnect reconnect, FsmDisconnect disconnect, FsmAuthenticated authenticated, FsmSessionEnded sessionEnded, FsmStatusUpdate statusUpdate);
void fsmpico_set_userdata(FsmPico * fsmpico, void * user_data);
Buffer const * fsmpico_get_received_extra_data(FsmPico * fsmpico);
void fsmpico_set_outbound_extra_data(FsmPico * fsmpico, Buffer const * extraData);

// Use these functions to control the authentication process
void fsmpico_start(FsmPico * fsmpico, Buffer const * extraData, EC_KEY * serviceIdPubKey, EC_KEY * clientIdPubKey, EVP_PKEY * clientIdPrivKey);
void fsmpico_stop(FsmPico * fsmpico);
FSMPICOSTATE fsmpico_get_state(FsmPico * fsmpico);
void fsmpico_send_extra_data(FsmPico * fsmpico);

// Call these functions when an event occurs
void fsmpico_read(FsmPico * fsmpico, char const * data, size_t length);
Expand Down
1 change: 1 addition & 0 deletions include/pico/fsmservice.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ DLL_PUBLIC void fsmservice_set_outbound_extra_data(FsmService * fsmservice, Buff
DLL_PUBLIC void fsmservice_start(FsmService * fsmservice, Shared * shared, Users const * users, Buffer const * extraData);
DLL_PUBLIC void fsmservice_stop(FsmService * fsmservice);
DLL_PUBLIC FSMSERVICESTATE fsmservice_get_state(FsmService * fsmservice);
DLL_PUBLIC void fsmservice_send_extra_data(FsmService * fsmpico);

// Call these functions when an event occurs
DLL_PUBLIC void fsmservice_read(FsmService * fsmservice, char const * data, size_t length);
Expand Down
2 changes: 2 additions & 0 deletions include/pico/messageservicereauth.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ typedef struct _MessageServiceReAuth MessageServiceReAuth;
MessageServiceReAuth * messageservicereauth_new();
void messageservicereauth_delete(MessageServiceReAuth * messageservicereauth);
void messageservicereauth_set(MessageServiceReAuth * messageservicereauth, Buffer * sharedKey, long int timeout, REAUTHSTATE reauthState, SequenceNumber const * sequenceNum);
void messageservicereauth_set_extra_data(MessageServiceReAuth * messageservicereauth, Buffer const * extraData);
Buffer const * messageservicereauth_get_extra_data(MessageServiceReAuth * messageservicereauth);
void messageservicereauth_serialize(MessageServiceReAuth * messageservicereauth, Buffer * buffer);
bool messageservicereauth_deserialize(MessageServiceReAuth * messageservicereauth, Buffer const * buffer);
int messageservicereauth_get_timeout(MessageServiceReAuth * messageservicereauth);
Expand Down
87 changes: 63 additions & 24 deletions src/continuous.c
Original file line number Diff line number Diff line change
Expand Up @@ -409,9 +409,12 @@ bool continuous_start(Continuous * continuous, Shared * shared, Users * authoriz
* call to continuous_continue().
*
* @param continuous The continuous prover object.
* @param extraData The extra data to send to the Pico, or NULL for none
* @param returnedStoredData A buffer to store the extra data sent back by the
* Pico
* @return true if everything was successfully set up.
*/
bool continuous_cycle_start(Continuous * continuous) {
bool continuous_cycle_start(Continuous * continuous, Buffer const * extraData, Buffer * returnedStoredData) {
bool result;
SequenceNumber * sequenceNum;
REAUTHSTATE receivedState = REAUTHSTATE_INVALID;
Expand All @@ -423,7 +426,7 @@ bool continuous_cycle_start(Continuous * continuous) {
if (result) {
LOG(LOG_INFO, "First read, allowing default timeout");
channel_set_timeout(continuous->channel, DEFAULT_CONTINUOUS_TIMEOUT_ACTIVE);
result = continuous_read_pico_reauth(continuous, sequenceNum, NULL);
result = continuous_read_pico_reauth(continuous, sequenceNum, returnedStoredData);
receivedState = continuous->currentState;
}

Expand All @@ -436,7 +439,7 @@ bool continuous_cycle_start(Continuous * continuous) {
sequencenumber_increment(sequenceNum);
continuous_set_pico_sequence_number(continuous, sequenceNum);
continuous_set_current_state(continuous, receivedState);
result = continuous_write_service_reauth(continuous);
result = continuous_write_service_reauth(continuous, extraData);
}

sequencenumber_delete(sequenceNum);
Expand All @@ -451,9 +454,12 @@ bool continuous_cycle_start(Continuous * continuous) {
* call to continuous_continue_pico().
*
* @param continuous The continuous prover object.
* @param extraData The extra data to send to the service, or NULL for none
* @param returnedStoredData A buffer to store the extra data sent back by the
* service
* @return true if everything was successfully set up.
*/
bool continuous_cycle_start_pico(Continuous * continuous, Buffer * extraData) {
bool continuous_cycle_start_pico(Continuous * continuous, Buffer const * extraData, Buffer * returnedStoredData) {
bool result;
SequenceNumber * sequenceNum;

Expand All @@ -471,7 +477,7 @@ bool continuous_cycle_start_pico(Continuous * continuous, Buffer * extraData) {
if (result) {
sequenceNum = sequencenumber_new();

result = continuous_read_service_reauth(continuous, sequenceNum, NULL);
result = continuous_read_service_reauth(continuous, sequenceNum, returnedStoredData, NULL);

// Increment and store the sequence number received from the Service
sequencenumber_increment(sequenceNum);
Expand Down Expand Up @@ -508,6 +514,7 @@ bool continuous_read_pico_reauth(Continuous * continuous, SequenceNumber * seque
Buffer * buffer;
MessagePicoReAuth * messagepicoreauth;
SequenceNumber * sequenceNum;
Buffer const * extraData;

buffer = buffer_new(0);
sequenceNum = sequencenumber_new();
Expand All @@ -520,17 +527,17 @@ bool continuous_read_pico_reauth(Continuous * continuous, SequenceNumber * seque
result = channel_read(continuous->channel, buffer);
LOG(LOG_INFO, "PicoReauth received\n");

messagepicoreauth = messagepicoreauth_new();

if (result) {
// Deserialize the message
messagepicoreauth = messagepicoreauth_new();
messagepicoreauth_set(messagepicoreauth, continuous->sharedKey, NULL);
result = messagepicoreauth_deserialize(messagepicoreauth, buffer);
}

if (result) {
messagepicoreauth_get_sequencenum(messagepicoreauth, sequenceNum);
continuous_set_current_state(continuous, messagepicoreauth_get_reauthstate(messagepicoreauth));
messagepicoreauth_delete(messagepicoreauth);

if (sequenceNumber != NULL) {
// This is an initialisation message, so store the receied sequence
Expand All @@ -548,12 +555,20 @@ bool continuous_read_pico_reauth(Continuous * continuous, SequenceNumber * seque

if (result && sequencenumber_match) {
sequencenumber_increment(continuous->picoSeqNumber);

if (returnedStoredData != NULL) {
extraData = messagepicoreauth_get_extra_data(messagepicoreauth);
buffer_clear(returnedStoredData);
buffer_append_buffer(returnedStoredData, extraData);
}

} else {
continuous_set_current_state(continuous, REAUTHSTATE_ERROR);
}

buffer_delete(buffer);
sequencenumber_delete(sequenceNum);
messagepicoreauth_delete(messagepicoreauth);

return result;
}
Expand All @@ -568,7 +583,7 @@ bool continuous_read_pico_reauth(Continuous * continuous, SequenceNumber * seque
* @param extraData The extra data to send to the service (or NULL for none).
* @return True if we could send the message correctly
*/
bool continuous_write_pico_reauth(Continuous * continuous, Buffer * extraData) {
bool continuous_write_pico_reauth(Continuous * continuous, Buffer const * extraData) {
bool result;
Buffer * buffer;
MessagePicoReAuth * messagepicoreauth;
Expand Down Expand Up @@ -620,12 +635,13 @@ bool continuous_write_pico_reauth(Continuous * continuous, Buffer * extraData) {
* @param returnedStoredData A buffer to store any returned extraData into.
* @return True if the message was read correctly.
*/
bool continuous_read_service_reauth(Continuous * continuous, SequenceNumber * sequenceNumber, int * timeout) {
bool continuous_read_service_reauth(Continuous * continuous, SequenceNumber * sequenceNumber, Buffer * returnedStoredData, int * timeout) {
bool result;
bool sequencenumber_match;
Buffer * buffer;
MessageServiceReAuth * messageservicereauth;
SequenceNumber * sequenceNum;
Buffer const * extraData;

buffer = buffer_new(0);
sequenceNum = sequencenumber_new();
Expand All @@ -641,9 +657,10 @@ bool continuous_read_service_reauth(Continuous * continuous, SequenceNumber * se
result = channel_read(continuous->channel, buffer);
LOG(LOG_INFO, "ServiceReauth received\n");

messageservicereauth = messageservicereauth_new();

if (result) {
// Deserialize the message
messageservicereauth = messageservicereauth_new();
messageservicereauth_set(messageservicereauth, continuous->sharedKey, 0, REAUTHSTATE_CONTINUE, NULL);
result = messageservicereauth_deserialize(messageservicereauth, buffer);
}
Expand All @@ -654,7 +671,6 @@ bool continuous_read_service_reauth(Continuous * continuous, SequenceNumber * se
if (timeout != NULL) {
*timeout = MAX(messageservicereauth_get_timeout(messageservicereauth) - continuous->timeoutLeeway, 0);
}
messageservicereauth_delete(messageservicereauth);

if (sequenceNumber != NULL) {
// This is an initialisation message, so store the receied sequence
Expand All @@ -672,12 +688,19 @@ bool continuous_read_service_reauth(Continuous * continuous, SequenceNumber * se

if (result && sequencenumber_match) {
sequencenumber_increment(continuous->serviceSeqNumber);

if (returnedStoredData != NULL) {
extraData = messageservicereauth_get_extra_data(messageservicereauth);
buffer_clear(returnedStoredData);
buffer_append_buffer(returnedStoredData, extraData);
}
} else {
continuous_set_current_state(continuous, REAUTHSTATE_ERROR);
}

buffer_delete(buffer);
sequencenumber_delete(sequenceNum);
messageservicereauth_delete(messageservicereauth);

return result;
}
Expand All @@ -689,9 +712,10 @@ bool continuous_read_service_reauth(Continuous * continuous, SequenceNumber * se
* If successful, the sequence number will be incremented.
*
* @param continuous The continuous structure holding the context.
* @param extraData The extra data to send to the Pico, or NULL for none
* @return True if we could send the message correctly.
*/
bool continuous_write_service_reauth(Continuous * continuous) {
bool continuous_write_service_reauth(Continuous * continuous, Buffer const * extraData) {
bool result;
Buffer * buffer;
MessageServiceReAuth * messageservicereauth;
Expand All @@ -703,6 +727,9 @@ bool continuous_write_service_reauth(Continuous * continuous) {
// {"encryptedData":"B64-ENC","iv":"B64","sessionId":0}
messageservicereauth = messageservicereauth_new();
messageservicereauth_set(messageservicereauth, continuous->sharedKey, continuous->currentTimeout, continuous->currentState, continuous->serviceSeqNumber);
if (extraData != NULL) {
messageservicereauth_set_extra_data(messageservicereauth, extraData);
}

messageservicereauth_serialize(messageservicereauth, buffer);

Expand Down Expand Up @@ -736,16 +763,17 @@ bool continuous_write_service_reauth(Continuous * continuous) {
* @param continuous The continuous structure holding the context.
* @param newState The new state to attempt to transition to (if different
* from the current state).
* @param extraData The extra data to send with the new state, or NULL for none
* @return True if we could send the message correctly.
*/
bool continuous_update_state(Continuous * continuous, REAUTHSTATE newState) {
bool continuous_update_state(Continuous * continuous, REAUTHSTATE newState, Buffer const * extraData) {
bool result = true;

newState = continuous_transition(continuous->currentState, newState);

if (continuous->currentState != newState) {
continuous_set_current_state(continuous, newState);
result = continuous_write_service_reauth(continuous);
result = continuous_write_service_reauth(continuous, extraData);
}

return result;
Expand All @@ -758,11 +786,12 @@ bool continuous_update_state(Continuous * continuous, REAUTHSTATE newState) {
* It will return the current status, as returned by Pico.
*
* @param continuous The continuous prover object.
* @param extraData The extra data to send to the Pico, or NULL for none
* @param returnedStoredData If not NULL, is appended with a string
* containing data returned from Pico.
* @return True if the authentication was successful.
*/
bool continuous_reauth(Continuous * continuous, Buffer * returnedStoredData) {
bool continuous_reauth(Continuous * continuous, Buffer const * extraData, Buffer * returnedStoredData) {
bool result;

LOG(LOG_INFO, "Starting read %d", continuous->currentTimeout);
Expand All @@ -774,7 +803,7 @@ bool continuous_reauth(Continuous * continuous, Buffer * returnedStoredData) {
}

if (result) {
result = continuous_write_service_reauth(continuous);
result = continuous_write_service_reauth(continuous, extraData);
}

return result;
Expand All @@ -786,12 +815,18 @@ bool continuous_reauth(Continuous * continuous, Buffer * returnedStoredData) {
*
* It will return the current status, as returned by the service.
*
* The timeout should be used as a deadline within which the Pico must
* respond to the service. If the service doesn't hear back within this time,
* it will assume the Pico is no longer coninuously communicating with it.
*
* @param continuous The continuous prover object.
* @param extraData The extra data to send to the Pico, or NULL for none
* @param timeout An integer to store the timeout returned by the service
* @param returnedStoredData If not NULL, is appended with a string
* containing data returned from Pico.
* @return True if the authentication was successful.
*/
bool continuous_reauth_pico(Continuous * continuous, Buffer * extraData, int * timeout) {
bool continuous_reauth_pico(Continuous * continuous, Buffer const * extraData, Buffer * returnedStoredData, int * timeout) {
bool result;

result = continuous_write_pico_reauth(continuous, extraData);
Expand All @@ -801,7 +836,7 @@ bool continuous_reauth_pico(Continuous * continuous, Buffer * extraData, int * t
}

if (result) {
result = continuous_read_service_reauth(continuous, NULL, timeout);
result = continuous_read_service_reauth(continuous, NULL, returnedStoredData, timeout);
}

return result;
Expand All @@ -815,15 +850,17 @@ bool continuous_reauth_pico(Continuous * continuous, Buffer * extraData, int * t
* successfully (e.g. someone tried unsuccessfully to imitate the Pico).
*
* @param continuous The continuous prover object.
* @param returnedStoredData If not NULL, is appended with a string
* @param extraData The extra data to send to the Pico, or NULL for none
* @param returnedStoredData A buffer to store the extra data sent back by the
* Pico
* containing data returned from Pico.
* @return true if authentication completed successfully, false o/w.
*/
bool continuous_continue(Continuous * continuous, Buffer * returnedStoredData) {
bool continuous_continue(Continuous * continuous, Buffer const * extraData, Buffer * returnedStoredData) {
bool result;
REAUTHSTATE receivedState = REAUTHSTATE_INVALID;

result = continuous_reauth(continuous, returnedStoredData);
result = continuous_reauth(continuous, extraData, returnedStoredData);
if (result) {
receivedState = continuous->currentState;
}
Expand Down Expand Up @@ -856,17 +893,19 @@ bool continuous_finish(Continuous * continuous) {
* the Server).
*
* @param continuous The continuous prover object.
* @param extraData If not NULL, is sent to the server.
* @param extraData The extra data to send to the service, or NULL for none
* @param timeout returns the timeout value sent by the server, measured in
* milliseconds. The server value defaults toCONTINUOUS_TIMEOUT_ACTIVE
* (set in messageservicereauth.h to 10000ms = 10s).
* @param returnedStoredData A buffer to store the extra data sent back by the
* service
* @return true if authentication completed successfully. false o/w.
*/
bool continuous_continue_pico(Continuous * continuous, Buffer * extraData, int * timeout) {
bool continuous_continue_pico(Continuous * continuous, Buffer const * extraData, Buffer * returnedStoredData, int * timeout) {
bool result;
REAUTHSTATE receivedState = REAUTHSTATE_INVALID;

result = continuous_reauth_pico(continuous, extraData, timeout);
result = continuous_reauth_pico(continuous, extraData, returnedStoredData, timeout);

if (result) {
receivedState = continuous->currentState;
Expand Down
Loading