Beispiel #1
0
soter_asym_ka_t* soter_asym_ka_create(soter_asym_ka_alg_t alg)
{
    soter_status_t status;
    soter_asym_ka_t* ctx = malloc(sizeof(soter_asym_ka_t));
    if (!ctx) {
        return NULL;
    }

    status = soter_asym_ka_init(ctx, alg);
    if (SOTER_SUCCESS == status) {
        return ctx;
    }

    free(ctx);
    return NULL;
}
Beispiel #2
0
themis_status_t secure_session_init(secure_session_t *session_ctx, const void *id, size_t id_length, const void *sign_key, size_t sign_key_length, const secure_session_user_callbacks_t *user_callbacks)
{
	soter_status_t soter_status;
	themis_status_t res = THEMIS_SUCCESS;

	/* TODO: validate input parameters including callback pointers */
	res = secure_session_peer_init(&(session_ctx->we), id, id_length, NULL, 0, sign_key, sign_key_length);
	if (THEMIS_SUCCESS != res)
	{
		goto err;
	}

	session_ctx->user_callbacks = user_callbacks;

	soter_status = soter_asym_ka_init(&(session_ctx->ecdh_ctx), SOTER_ASYM_KA_EC_P256);
	if (THEMIS_SUCCESS != soter_status)
	{
		res = soter_status;
		goto err;
	}

	soter_status = soter_asym_ka_gen_key(&(session_ctx->ecdh_ctx));
	if (THEMIS_SUCCESS != soter_status)
	{
		res = soter_status;
		goto err;
	}

	/* Initially we are in the "server accept" mode */
	session_ctx->state_handler = secure_session_accept;

err:

	if (THEMIS_SUCCESS != res)
	{
		secure_session_cleanup(session_ctx);
	}
	return res;
}
Beispiel #3
0
static void test_api(void)
{
	soter_status_t res;
	soter_asym_ka_t ctx;

	uint8_t key_buffer[KEY_BUFFER_SIZE];
	size_t key_buffer_length = sizeof(key_buffer);

	uint8_t shared_secret[SHARED_SECRET_BUFFER_SIZE];
	size_t shared_secret_length = sizeof(shared_secret);

	memset(&ctx, 0, sizeof(soter_asym_ka_t));

	testsuite_fail_unless(SOTER_INVALID_PARAMETER == soter_asym_ka_init(NULL, SOTER_ASYM_KA_EC_P256), "soter_asym_ka_init: invalid context");
	testsuite_fail_unless(SOTER_INVALID_PARAMETER == soter_asym_ka_init(&ctx, (soter_asym_ka_alg_t)0xffffffff), "soter_asym_ka_init: invalid algorithm type");
	testsuite_fail_unless(NULL == soter_asym_ka_create((soter_asym_ka_alg_t)0xffffffff), "soter_asym_ka_create: invalid algorithm type");

	res = soter_asym_ka_init(&ctx, SOTER_ASYM_KA_EC_P256);
	if (SOTER_SUCCESS != res)
	{
		testsuite_fail_unless(SOTER_SUCCESS == res, "soter_asym_ka_init fail");
		return;
	}

	testsuite_fail_unless(SOTER_INVALID_PARAMETER == soter_asym_ka_gen_key(NULL), "soter_asym_ka_gen_key: invalid context");

	res = soter_asym_ka_gen_key(&ctx);
	if (SOTER_SUCCESS != res)
	{
		testsuite_fail_unless(SOTER_SUCCESS == res, "soter_asym_ka_gen_key fail");
		return;
	}

	testsuite_fail_unless(SOTER_INVALID_PARAMETER == soter_asym_ka_export_key(NULL, key_buffer, &key_buffer_length, true), "soter_asym_ka_export_key: invalid context");
	testsuite_fail_unless(SOTER_INVALID_PARAMETER == soter_asym_ka_export_key(&ctx, key_buffer, NULL, false), "soter_asym_ka_export_key: invalid output data length");

	key_buffer_length = 0;
	res = soter_asym_ka_export_key(&ctx, NULL, &key_buffer_length, false);
	testsuite_fail_unless((SOTER_BUFFER_TOO_SMALL == res) && (key_buffer_length > 0), "soter_asym_ka_export_key: get output size (NULL out buffer)");

	key_buffer_length--;
	res = soter_asym_ka_export_key(&ctx, key_buffer, &key_buffer_length, false);
	testsuite_fail_unless((SOTER_BUFFER_TOO_SMALL == res) && (key_buffer_length > 0), "soter_asym_ka_export_key: get output size (small out buffer)");

	res = soter_asym_ka_export_key(&ctx, key_buffer, &key_buffer_length, false);
	if (SOTER_SUCCESS != res)
	{
		testsuite_fail_unless(SOTER_SUCCESS == res, "soter_asym_ka_export_key fail");
		return;
	}

	testsuite_fail_unless(SOTER_INVALID_PARAMETER == soter_asym_ka_import_key(NULL, key_buffer, key_buffer_length), "soter_asym_ka_import_key: invalid context");
	testsuite_fail_unless(SOTER_INVALID_PARAMETER == soter_asym_ka_import_key(&ctx, NULL, key_buffer_length), "soter_asym_ka_import_key: invalid input data");
	testsuite_fail_unless(SOTER_INVALID_PARAMETER == soter_asym_ka_import_key(NULL, key_buffer, 0), "soter_asym_ka_import_key: invalid input data length");

	testsuite_fail_unless(SOTER_INVALID_PARAMETER == soter_asym_ka_derive(NULL, key_buffer, key_buffer_length, shared_secret, &shared_secret_length), "soter_asym_ka_derive: invalid context");
	testsuite_fail_unless(SOTER_INVALID_PARAMETER == soter_asym_ka_derive(&ctx, NULL, key_buffer_length, shared_secret, &shared_secret_length), "soter_asym_ka_derive: invalid input data");
	testsuite_fail_unless(SOTER_INVALID_PARAMETER == soter_asym_ka_derive(&ctx, key_buffer, 0, shared_secret, &shared_secret_length), "soter_asym_ka_derive: invalid input data length");
	testsuite_fail_unless(SOTER_INVALID_PARAMETER == soter_asym_ka_derive(&ctx, key_buffer, key_buffer_length, shared_secret, NULL), "soter_asym_ka_derive: invalid output data length");

	shared_secret_length = 0;
	res = soter_asym_ka_derive(&ctx, key_buffer, key_buffer_length, NULL, &shared_secret_length);
	testsuite_fail_unless((SOTER_BUFFER_TOO_SMALL == res) && (shared_secret_length > 0), "soter_asym_ka_derive: get output size (NULL out buffer)");

	shared_secret_length--;
	res = soter_asym_ka_derive(&ctx, key_buffer, key_buffer_length, shared_secret, &shared_secret_length);
	testsuite_fail_unless((SOTER_BUFFER_TOO_SMALL == res) && (shared_secret_length > 0), "soter_asym_ka_derive: get output size (small out buffer)");

	res = soter_asym_ka_derive(&ctx, key_buffer, key_buffer_length, shared_secret, &shared_secret_length);
	if (SOTER_SUCCESS != res)
	{
		testsuite_fail_unless(SOTER_SUCCESS == res, "soter_asym_ka_derive fail");
		return;
	}

	testsuite_fail_unless(SOTER_INVALID_PARAMETER == soter_asym_ka_cleanup(NULL), "soter_asym_ka_cleanup: invalid context");

	res = soter_asym_ka_cleanup(&ctx);
	if (SOTER_SUCCESS != res)
	{
		testsuite_fail_unless(SOTER_SUCCESS == res, "soter_asym_ka_cleanup fail");
		return;
	}

	testsuite_fail_unless(SOTER_INVALID_PARAMETER == soter_asym_ka_destroy(NULL), "soter_asym_ka_destroy: invalid context");
}