Skip to content
Snippets Groups Projects
encryption_keys_delete.c 1.78 KiB
Newer Older
/**
 * Callback function to delete a luks encryption password.
 * @param[in]   request   incoming HTTP request
 * @param[out]  response  HTTP response to the request
 * @param[in]   user_data extra data to pass between main thread and callbacks
 * @return                internal status code
 */
int callback_encryption_keys_delete(const struct _u_request * request,
    struct _u_response * response, void * user_data)
{
    int r;

    // Read keyslot from request URI.
    const char * keyslot_string = u_map_get(request->map_url, "slot");
    if (keyslot_string == NULL)
    {
        return send_simple_response(response, 400, "error",
            "missing url parameter `slot`");
    }
    int keyslot;
    r = parse_int(keyslot_string, &keyslot);
    if (r != 0)
    {
        printf("invalid url parameter `slot`: %s\n", keyslot_string);
        return send_simple_response(response, 400, "error",
            "invalid url parameter `slot`");
    }

    // Initialise encrypted container.
    struct crypt_device * cd = NULL;
    r = container_initialise(&cd, DATA_PARTITION_DEVICE, true);
    if (r < 0)
    {
        crypt_free(cd);
    }
    if (r != 0)
    {
        printf("container_initialise failed with status %d\n", r);
        return send_simple_response(response, 500, "error",
            "initialising encrypted container failed");
    }

    // Delete encryption password.
    r = crypt_keyslot_destroy(cd, keyslot);
  
    if (r < 0)
    {
        // Something else went wrong.
        printf("crypt_keyslot_destroy failed with status %d\n", r);
        return send_simple_response(response, 500, "error",
            "error deleting encryption password");
    }
  
    // If we reach this point, apparently everything went well.
    return send_simple_response(response, 200, "status", "ok");
}