themis_status_t secure_session_cleanup(secure_session_t *session_ctx) { if (NULL == session_ctx) { return THEMIS_INVALID_PARAMETER; } secure_session_peer_cleanup(&(session_ctx->peer)); secure_session_peer_cleanup(&(session_ctx->we)); soter_asym_ka_cleanup(&(session_ctx->ecdh_ctx)); memset(session_ctx, 0, sizeof(secure_session_t)); return THEMIS_SUCCESS; }
soter_status_t soter_asym_ka_destroy(soter_asym_ka_t* asym_ka_ctx) { soter_status_t status; if (!asym_ka_ctx) { return SOTER_INVALID_PARAMETER; } status = soter_asym_ka_cleanup(asym_ka_ctx); if (SOTER_SUCCESS == status) { free(asym_ka_ctx); return SOTER_SUCCESS; } return status; }
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"); }