Используйте libcryptsetup, чтобы открыть обычный зашифрованный раздел - PullRequest
0 голосов
/ 27 января 2019

У меня есть развернутая система киосков, которая монтирует зашифрованный раздел во время загрузки, используя crytpsetup и файл ключа на диске следующим образом:

cryptsetup open --type plain --key-file /root/key.bin /dev/sda3 sda3

Это дает устройство / dev / mapper / sda3, которое я могузатем подключите для доступа к данным.

Я перемещаю ключ на смарт-карту и хочу открыть раздел с помощью libcryptsetup, чтобы ключ не отображался в командной строке.К сожалению, единственный пример, приведенный в источнике cryptsetup, относится к LUKS.

Я попытался провести обратный инжиниринг источника cryptsetup для получения правильных вызовов библиотеки, но был разочарован сложностью параметров.

Существуют ли примеры других проектов, которые используют библиотеку для простого шифрования или, возможно, каркас библиотечных вызовов, необходимых для дублирования действий вызова командной строки?

1 Ответ

0 голосов
/ 08 февраля 2019

Базовая последовательность вызовов библиотеки, необходимая для дублирования действий в командной строке для открытия зашифрованного раздела с использованием библиотеки cryptsetup, будет выглядеть следующим образом:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <inttypes.h>
#include <sys/types.h>
#include <libcryptsetup.h>

int activate_and_check_status(const char *path, const char *device_name)
{
        struct crypt_device *cd;
        struct crypt_active_device cad;
        int r;
        /*
         * LUKS device activation example.
         * It's sequence of sub-steps: device initialization, LUKS header load
         * and the device activation itself.
         */
        r = crypt_init(&cd, path);
        if (r < 0 ) {
                printf("crypt_init() failed for %s.\n", path);
                return r;
        }
        /*
         * crypt_load() is used to load the LUKS header from block device
         * into crypt_device context.
         */
        r = crypt_load(cd,              /* crypt context */
                       CRYPT_LUKS1,     /* requested type */
                       NULL);           /* additional parameters (not used) */
        if (r < 0) {
                printf("crypt_load() failed on device %s.\n", crypt_get_device_name(cd));
                crypt_free(cd);
                return r;
        }
        /*
         * Device activation creates device-mapper devie mapping with name device_name.
         */
        r = crypt_activate_by_passphrase(cd,            /* crypt context */
                                         device_name,   /* device name to activate */
                                         CRYPT_ANY_SLOT,/* which slot use (ANY - try all) */
                                         "foo", 3,      /* passphrase */
                                         CRYPT_ACTIVATE_READONLY); /* flags */
        if (r < 0) {
                printf("Device %s activation failed.\n", device_name);
                crypt_free(cd);
                return r;
        }
        printf("LUKS device %s/%s is active.\n", crypt_get_dir(), device_name);
        printf("\tcipher used: %s\n", crypt_get_cipher(cd));
        printf("\tcipher mode: %s\n", crypt_get_cipher_mode(cd));
        printf("\tdevice UUID: %s\n", crypt_get_uuid(cd));
        /*
         * Get info about active device (query DM backend)
         */
        r = crypt_get_active_device(cd, device_name, &cad);
        if (r < 0) {
                printf("Get info about active device %s failed.\n", device_name);
                crypt_deactivate(cd, device_name);
                crypt_free(cd);
                return r;
        }
        printf("Active device parameters for %s:\n"
                "\tDevice offset (in sectors): %" PRIu64 "\n"
                "\tIV offset (in sectors)    : %" PRIu64 "\n"
                "\tdevice size (in sectors)  : %" PRIu64 "\n"
                "\tread-only flag            : %s\n",
                device_name, cad.offset, cad.iv_offset, cad.size,
                cad.flags & CRYPT_ACTIVATE_READONLY ? "1" : "0");
        crypt_free(cd);
        return 0;
}

Ссылки API для формата luks, открытия, активации идеактивировать с примерами для cryptsetup можно по этой ссылке: cryptsetup API

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...