Skip to content

Commit

Permalink
protocols:
Browse files Browse the repository at this point in the history
	jabber:
		omemo:
			added hmac_sha256 callbacks to libsignal-c initialization
  • Loading branch information
Gluzskiy Alexandr committed Feb 14, 2017
1 parent 5bb58bd commit a8dad2e
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 18 deletions.
6 changes: 4 additions & 2 deletions protocols/JabberG/src/jabber.cpp
Expand Up @@ -179,7 +179,9 @@ static int jabberProtoUninit(CJabberProto *ppro)
return 0;
}

int init_omemo();
namespace omemo {
int init_omemo();
};

extern "C" int __declspec(dllexport) Load()
{
Expand Down Expand Up @@ -223,7 +225,7 @@ extern "C" int __declspec(dllexport) Load()
g_MenuInit();
HookEvent(ME_SYSTEM_MODULESLOADED, OnModulesLoaded);
JabberUserInfoInit();
init_omemo();
omemo::init_omemo();
return 0;
}

Expand Down
87 changes: 71 additions & 16 deletions protocols/JabberG/src/jabber_omemo.cpp
Expand Up @@ -26,25 +26,80 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "stdafx.h"
#include <signal_protocol.h>

//TODO: create mutex
namespace omemo {

void lock(void * /*user_data*/)
{
int random_func(uint8_t *data, size_t len, void * /*user_data*/)
{
Utils_GetRandom(data, len);
return 0;
}

}
struct hmac_sha256_ctx {
uint8_t *key, *data;
size_t key_len, data_len;
};

void unlock(void * /*user_data*/)
{
int hmac_sha256_init_func(void **hmac_context, const uint8_t *key, size_t key_len, void * /*user_data*/)
{
hmac_sha256_ctx *ctx = (hmac_sha256_ctx*)mir_alloc(sizeof(hmac_sha256_ctx));
ctx->key = (uint8_t*)mir_alloc(key_len);
memcpy(ctx->key, key, key_len);
ctx->key_len = key_len;
*hmac_context = ctx;
return 0;
}
int hmac_sha256_update_func(void *hmac_context, const uint8_t *data, size_t data_len, void * /*user_data*/)
{
hmac_sha256_ctx *ctx = (hmac_sha256_ctx*)hmac_context;
ctx->data = (uint8_t*)mir_alloc(data_len);
memcpy(ctx->data, data, data_len);
ctx->data_len = data_len;
return 0;
}
int hmac_sha256_final_func(void *hmac_context, signal_buffer **output, void * /*user_data*/)
{
hmac_sha256_ctx *ctx = (hmac_sha256_ctx*)hmac_context;
BYTE hashout[MIR_SHA256_HASH_SIZE];
mir_hmac_sha256(hashout, ctx->key, ctx->key_len, ctx->data, ctx->data_len);
signal_buffer *output_buffer = signal_buffer_create(hashout, MIR_SHA256_HASH_SIZE);
*output = output_buffer;
return 0;
}
void hmac_sha256_cleanup_func(void * hmac_context, void * /*user_data*/)
{
hmac_sha256_ctx *ctx = (hmac_sha256_ctx*)hmac_context;
mir_free(ctx->key);
mir_free(ctx->data);
}

}
CRITICAL_SECTION _signal_cs;
mir_cslockfull signal_mutex(_signal_cs);

int init_omemo()
{
signal_context *global_context;
signal_crypto_provider provider;
signal_context_create(&global_context, NULL);
signal_context_set_crypto_provider(global_context, &provider);
signal_context_set_locking_functions(global_context, &lock, &unlock);
void lock(void * /*user_data*/)
{
signal_mutex.lock();
}

return 0;
}
void unlock(void * /*user_data*/)
{
signal_mutex.unlock();
}

int init_omemo()
{
signal_mutex.unlock(); //fuck...
signal_context *global_context;
signal_context_create(&global_context, NULL);
signal_crypto_provider provider;
provider.random_func = &random_func;
provider.hmac_sha256_init_func = &hmac_sha256_init_func;
provider.hmac_sha256_update_func = &hmac_sha256_update_func;
provider.hmac_sha256_final_func = &hmac_sha256_final_func;
provider.hmac_sha256_cleanup_func = &hmac_sha256_cleanup_func;
signal_context_set_crypto_provider(global_context, &provider);
signal_context_set_locking_functions(global_context, &lock, &unlock);

return 0;
}

};

0 comments on commit a8dad2e

Please sign in to comment.