The documentation covers public parts of cryptsetup API. In the following sections you'll find the examples that describe some features of cryptsetup API. For more info about libcryptsetup API versions see API Tracker.
-
Cryptsetup API examples
-
crypt_luks_usage - cryptsetup LUKS device type usage examples
-
crypt_log_usage - cryptsetup logging API examples
Cryptsetup API examples
crypt_luks_usage - cryptsetup LUKS device type usage
crypt_init()
Every time you need to do something with cryptsetup or dmcrypt device you need a valid context. The first step to start your work is crypt_init call. You can call it either with path to the block device or path to the regular file. If you don't supply the path, empty context is initialized.
crypt_format() - header and payload on mutual device
This section covers basic use cases for formatting LUKS devices. Format operation sets device type in context and in case of LUKS header is written at the beginning of block device. In the example below we use the scenario where LUKS header and data are both stored on the same device. There's also a possibility to store header and data separately.
Bear in mind that crypt_format() is destructive operation and it overwrites part of the backing block device.
Keyslot operations examples
After successful crypt_format of LUKS device, volume key is not stored in a persistent way on the device. Keyslot area is an array beyond LUKS header, where volume key is stored in the encrypted form using user input passphrase. For more info about LUKS keyslots and how it's actually protected, please look at LUKS specification. There are two basic methods to create a new keyslot:
crypt_keyslot_add_by_volume_key()
Creates a new keyslot directly by encrypting volume_key stored in the device context. Passphrase should be supplied or user is prompted if passphrase param is NULL.
crypt_keyslot_add_by_passphrase()
Creates a new keyslot for the volume key by opening existing active keyslot, extracting volume key from it and storing it into a new keyslot protected by a new passphrase
crypt_load()
Function loads header from backing block device into device context.
crypt_activate_by_passphrase()
Activates crypt device by user supplied password for keyslot containing the volume_key. If keyslot parameter is set to CRYPT_ANY_SLOT then all active keyslots are tried one by one until the volume key is found.
crypt_get_active_device()
This call returns structure containing runtime attributes of active device.
crypt_init_by_name()
In case you need to do operations with active device (device which already has its corresponding mapping) and you miss valid device context stored in *crypt_device reference, you should use this call. Function tries to get path to backing device from DM, initializes context for it and loads LUKS header.
crypt_deactivate()
Deactivates crypt device (removes DM mapping and safely erases volume key from kernel).
crypt_luks_usage.c - Complex example
To compile and run use following commands in examples directory:
make
./crypt_luks_usage _path_to_[block_device]_file
Note that you need to have the cryptsetup library compiled.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <inttypes.h>
#include <sys/types.h>
static int format_and_add_keyslots(const char *path)
{
struct crypt_device *cd;
int r;
if (r < 0) {
printf("crypt_init() failed for %s.\n", path);
return r;
}
printf("Device %s will be formatted as a LUKS device after 5 seconds.\n"
"Press CTRL+C now if you want to cancel this operation.\n", path);
sleep(5);
"aes",
"xts-plain64",
NULL,
NULL,
512 / 8,
NULL);
if (r < 0) {
return r;
}
NULL,
0,
"foo",
3);
if (r < 0) {
printf("Adding keyslot failed.\n");
return r;
}
printf("The first keyslot is initialized.\n");
"foo", 3,
"bar", 3);
if (r < 0) {
printf("Adding keyslot failed.\n");
return r;
}
printf("The second keyslot is initialized.\n");
return 0;
}
static int activate_and_check_status(const char *path, const char *device_name)
{
struct crypt_device *cd;
int r;
if (r < 0) {
printf("crypt_init() failed for %s.\n", path);
return r;
}
NULL);
if (r < 0) {
return r;
}
device_name,
"foo", 3,
if (r < 0) {
printf("Device %s activation failed.\n", device_name);
return r;
}
if (r < 0) {
printf("Get info about active device %s failed.\n", device_name);
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,
return 0;
}
static int handle_active_device(const char *device_name)
{
struct crypt_device *cd;
int r;
if (r < 0) {
printf("crypt_init_by_name() failed for %s.\n", device_name);
return r;
}
printf("Device %s is still active.\n", device_name);
else {
printf("Something failed perhaps, device %s is not active.\n", device_name);
return -1;
}
if (r < 0) {
printf("crypt_deactivate() failed.\n");
return r;
}
printf("Device %s is now deactivated.\n", device_name);
return 0;
}
int main(int argc, char **argv)
{
if (geteuid()) {
printf("Using of libcryptsetup requires super user privileges.\n");
return 1;
}
if (argc != 2) {
printf("usage: ./crypt_luks_usage <path>\n"
"<path> refers to either a regular file or a block device.\n"
" WARNING: the file or device will be wiped.\n");
return 2;
}
if (format_and_add_keyslots(argv[1]))
return 3;
if (activate_and_check_status(argv[1], "example_device"))
return 4;
if (handle_active_device("example_device"))
return 5;
return 0;
}
int crypt_format(struct crypt_device *cd, const char *type, const char *cipher, const char *cipher_mode, const char *uuid, const char *volume_key, size_t volume_key_size, void *params)
int crypt_load(struct crypt_device *cd, const char *requested_type, void *params)
int crypt_activate_by_passphrase(struct crypt_device *cd, const char *name, int keyslot, const char *passphrase, size_t passphrase_size, uint32_t flags)
int crypt_deactivate(struct crypt_device *cd, const char *name)
#define CRYPT_ACTIVATE_READONLY
Definition libcryptsetup.h:1465
int crypt_get_active_device(struct crypt_device *cd, const char *name, struct crypt_active_device *cad)
const char * crypt_get_cipher_mode(struct crypt_device *cd)
const char * crypt_get_device_name(struct crypt_device *cd)
crypt_status_info crypt_status(struct crypt_device *cd, const char *name)
const char * crypt_get_uuid(struct crypt_device *cd)
const char * crypt_get_cipher(struct crypt_device *cd)
@ CRYPT_ACTIVE
Definition libcryptsetup.h:1923
int crypt_init_by_name(struct crypt_device **cd, const char *name)
void crypt_free(struct crypt_device *cd)
int crypt_init(struct crypt_device **cd, const char *device)
#define CRYPT_ANY_SLOT
Definition libcryptsetup.h:1038
int crypt_keyslot_add_by_passphrase(struct crypt_device *cd, int keyslot, const char *passphrase, size_t passphrase_size, const char *new_passphrase, size_t new_passphrase_size)
const char * crypt_get_dir(void)
int crypt_keyslot_add_by_volume_key(struct crypt_device *cd, int keyslot, const char *volume_key, size_t volume_key_size, const char *passphrase, size_t passphrase_size)
#define CRYPT_LUKS
Definition libcryptsetup.h:436
const char * crypt_get_type(struct crypt_device *cd)
#define CRYPT_LUKS2
Definition libcryptsetup.h:421
Definition libcryptsetup.h:1524
crypt_log_usage - cryptsetup logging API example
Example describes basic use case for cryptsetup logging. To compile and run use following commands in examples directory:
Note that you need to have the cryptsetup library compiled.
#include <stdio.h>
#include <sys/types.h>
#include <syslog.h>
#include <unistd.h>
static void simple_syslog_wrapper(int level, const char *msg, void *usrptr)
{
const char *prefix = (const char *)usrptr;
int priority;
switch(level) {
default:
fprintf(stderr, "Unsupported log level requested!\n");
return;
}
if (prefix)
syslog(priority, "%s:%s", prefix, msg);
else
syslog(priority, "%s", msg);
}
int main(void)
{
struct crypt_device *cd;
char usrprefix[] = "cslog_example";
int r;
if (geteuid()) {
printf("Using of libcryptsetup requires super user privileges.\n");
return 1;
}
openlog("cryptsetup", LOG_CONS | LOG_PID, LOG_USER);
if (r < 0) {
printf("crypt_init() failed.\n");
return 2;
}
closelog();
return 0;
}
#define CRYPT_LOG_ERROR
Definition libcryptsetup.h:189
#define CRYPT_LOG_DEBUG
Definition libcryptsetup.h:193
#define CRYPT_LOG_VERBOSE
Definition libcryptsetup.h:191
#define CRYPT_LOG_NORMAL
Definition libcryptsetup.h:187
void crypt_set_log_callback(struct crypt_device *cd, void(*log)(int level, const char *msg, void *usrptr), void *usrptr)
void crypt_log(struct crypt_device *cd, int level, const char *msg)