Added question answer authentication (libotr 3.2.x)

This commit is contained in:
James Booth
2014-04-30 23:59:40 +01:00
parent eaa19598c1
commit a077d2008a
7 changed files with 118 additions and 9 deletions

View File

@@ -450,6 +450,40 @@ _otr_smp_secret(const char * const recipient, const char *secret)
}
}
static void
_otr_smp_question(const char * const recipient, const char *question, const char *answer)
{
ConnContext *context = otrlib_context_find(user_state, recipient, jid);
if (context == NULL) {
return;
}
if (context->msgstate != OTRL_MSGSTATE_ENCRYPTED) {
return;
}
otrl_message_initiate_smp_q(user_state, &ops, NULL, context, question, (const unsigned char*)answer, strlen(answer));
ui_otr_authetication_waiting(recipient);
}
static void
_otr_smp_answer(const char * const recipient, const char *answer)
{
ConnContext *context = otrlib_context_find(user_state, recipient, jid);
if (context == NULL) {
return;
}
if (context->msgstate != OTRL_MSGSTATE_ENCRYPTED) {
return;
}
// if recipient initiated SMP, send response, else initialise
otrl_message_respond_smp(user_state, &ops, NULL, context, (const unsigned char*)answer, strlen(answer));
}
static void
_otr_end_session(const char * const recipient)
{
@@ -560,4 +594,6 @@ otr_init_module(void)
otr_decrypt_message = _otr_decrypt_message;
otr_free_message = _otr_free_message;
otr_smp_secret = _otr_smp_secret;
otr_smp_question = _otr_smp_question;
otr_smp_answer = _otr_smp_answer;
}

View File

@@ -49,6 +49,8 @@ void (*otr_trust)(const char * const recipient);
void (*otr_untrust)(const char * const recipient);
void (*otr_smp_secret)(const char * const recipient, const char *secret);
void (*otr_smp_question)(const char * const recipient, const char *question, const char *answer);
void (*otr_smp_answer)(const char * const recipient, const char *answer);
void (*otr_end_session)(const char * const recipient);

View File

@@ -132,6 +132,18 @@ otrlib_handle_tlvs(OtrlUserState user_state, OtrlMessageAppOps *ops, ConnContext
g_hash_table_insert(smp_initiators, strdup(context->username), strdup(context->username));
}
}
tlv = otrl_tlv_find(tlvs, OTRL_TLV_SMP1Q);
if (tlv) {
if (nextMsg != OTRL_SMP_EXPECT1) {
otrl_message_abort_smp(user_state, ops, NULL, context);
} else {
char *question = (char *)tlv->data;
char *eoq = memchr(question, '\0', tlv->len);
if (eoq) {
ui_smp_recipient_initiated_q(context->username, question);
}
}
}
tlv = otrl_tlv_find(tlvs, OTRL_TLV_SMP2);
if (tlv) {
if (nextMsg != OTRL_SMP_EXPECT2) {
@@ -146,14 +158,16 @@ otrlib_handle_tlvs(OtrlUserState user_state, OtrlMessageAppOps *ops, ConnContext
otrl_message_abort_smp(user_state, ops, NULL, context);
} else {
context->smstate->nextExpected = OTRL_SMP_EXPECT1;
if ((context->active_fingerprint->trust != NULL) && (context->active_fingerprint->trust[0] != '\0')) {
ui_smp_successful(context->username);
ui_trust(context->username);
otr_trust(context->username);
} else {
ui_smp_unsuccessful_sender(context->username);
ui_untrust(context->username);
otr_untrust(context->username);
if (context->smstate->received_question == 0) {
if ((context->active_fingerprint->trust != NULL) && (context->active_fingerprint->trust[0] != '\0')) {
ui_smp_successful(context->username);
ui_trust(context->username);
otr_trust(context->username);
} else {
ui_smp_unsuccessful_sender(context->username);
ui_untrust(context->username);
otr_untrust(context->username);
}
}
}
}