mirror of
https://gitlab.com/cryptsetup/cryptsetup.git
synced 2025-12-08 17:30:03 +01:00
On some systems the requested amount of memory causes OOM killer to kill the process (instead of returning ENOMEM). For now, we never try to use more than half of available physical memory.
201 lines
7.7 KiB
C
201 lines
7.7 KiB
C
/*
|
|
* libcryptsetup - cryptsetup library internal
|
|
*
|
|
* Copyright (C) 2004, Jana Saout <jana@saout.de>
|
|
* Copyright (C) 2004-2007, Clemens Fruhwirth <clemens@endorphin.org>
|
|
* Copyright (C) 2009-2017, Red Hat, Inc. All rights reserved.
|
|
* Copyright (C) 2009-2017, Milan Broz
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*/
|
|
|
|
#ifndef INTERNAL_H
|
|
#define INTERNAL_H
|
|
|
|
#include <stdint.h>
|
|
#include <stdarg.h>
|
|
#include <stdbool.h>
|
|
#include <unistd.h>
|
|
#include <inttypes.h>
|
|
|
|
#include "nls.h"
|
|
#include "bitops.h"
|
|
#include "utils_crypt.h"
|
|
#include "utils_loop.h"
|
|
#include "utils_dm.h"
|
|
#include "utils_fips.h"
|
|
#include "utils_keyring.h"
|
|
#include "crypto_backend.h"
|
|
|
|
#include "libcryptsetup.h"
|
|
|
|
/* to silent gcc -Wcast-qual for const cast */
|
|
#define CONST_CAST(x) (x)(uintptr_t)
|
|
|
|
#define SECTOR_SHIFT 9
|
|
#define SECTOR_SIZE (1 << SECTOR_SHIFT)
|
|
#define MAX_SECTOR_SIZE 4096 /* min page size among all platforms */
|
|
#define DEFAULT_DISK_ALIGNMENT 1048576 /* 1MiB */
|
|
#define DEFAULT_MEM_ALIGNMENT 4096
|
|
#define MAX_ERROR_LENGTH 512
|
|
|
|
#define MAX_PBKDF_THREADS 4
|
|
#define MAX_PBKDF_MEMORY 1024*1024 /* 1GiB */
|
|
#define MIN_PBKDF2_ITERATIONS 1000 /* recommendation in NIST SP 800-132 */
|
|
|
|
#define at_least(a, b) ({ __typeof__(a) __at_least = (a); (__at_least >= (b))?__at_least:(b); })
|
|
|
|
struct crypt_device;
|
|
|
|
struct volume_key {
|
|
size_t keylength;
|
|
const char *key_description;
|
|
char key[];
|
|
};
|
|
|
|
struct volume_key *crypt_alloc_volume_key(size_t keylength, const char *key);
|
|
struct volume_key *crypt_generate_volume_key(struct crypt_device *cd, size_t keylength);
|
|
void crypt_free_volume_key(struct volume_key *vk);
|
|
void crypt_volume_key_set_description(struct volume_key *key, const char *key_description);
|
|
const char *crypt_volume_key_get_description(const struct volume_key *key);
|
|
|
|
struct crypt_pbkdf_type *crypt_get_pbkdf(struct crypt_device *cd);
|
|
int init_pbkdf_type(struct crypt_device *cd,
|
|
const struct crypt_pbkdf_type *pbkdf,
|
|
const char *dev_type);
|
|
int verify_pbkdf_params(struct crypt_device *cd,
|
|
const struct crypt_pbkdf_type *pbkdf);
|
|
int crypt_benchmark_pbkdf_internal(struct crypt_device *cd,
|
|
struct crypt_pbkdf_type *pbkdf,
|
|
size_t volume_key_size);
|
|
|
|
/* Device backend */
|
|
struct device;
|
|
int device_alloc(struct device **device, const char *path);
|
|
int device_alloc_no_check(struct device **device, const char *path);
|
|
void device_free(struct device *device);
|
|
const char *device_path(const struct device *device);
|
|
const char *device_dm_name(const struct device *device);
|
|
const char *device_block_path(const struct device *device);
|
|
void device_topology_alignment(struct device *device,
|
|
unsigned long *required_alignment, /* bytes */
|
|
unsigned long *alignment_offset, /* bytes */
|
|
unsigned long default_alignment);
|
|
size_t device_block_size(struct device *device);
|
|
int device_read_ahead(struct device *device, uint32_t *read_ahead);
|
|
int device_size(struct device *device, uint64_t *size);
|
|
int device_open(struct device *device, int flags);
|
|
void device_disable_direct_io(struct device *device);
|
|
int device_is_identical(struct device *device1, struct device *device2);
|
|
int device_is_rotational(struct device *device);
|
|
size_t device_alignment(struct device *device);
|
|
int device_direct_io(const struct device *device);
|
|
int device_fallocate(struct device *device, uint64_t size);
|
|
|
|
int device_open_locked(struct device *device, int flags);
|
|
int device_read_lock(struct crypt_device *cd, struct device *device);
|
|
int device_write_lock(struct crypt_device *cd, struct device *device);
|
|
void device_read_unlock(struct device *device);
|
|
void device_write_unlock(struct device *device);
|
|
|
|
enum devcheck { DEV_OK = 0, DEV_EXCL = 1, DEV_SHARED = 2 };
|
|
int device_check_access(struct crypt_device *cd,
|
|
struct device *device,
|
|
enum devcheck device_check);
|
|
int device_block_adjust(struct crypt_device *cd,
|
|
struct device *device,
|
|
enum devcheck device_check,
|
|
uint64_t device_offset,
|
|
uint64_t *size,
|
|
uint32_t *flags);
|
|
size_t size_round_up(size_t size, size_t block);
|
|
|
|
/* Receive backend devices from context helpers */
|
|
struct device *crypt_metadata_device(struct crypt_device *cd);
|
|
struct device *crypt_data_device(struct crypt_device *cd);
|
|
|
|
int crypt_confirm(struct crypt_device *cd, const char *msg);
|
|
|
|
char *crypt_lookup_dev(const char *dev_id);
|
|
int crypt_dev_is_rotational(int major, int minor);
|
|
int crypt_dev_is_partition(const char *dev_path);
|
|
char *crypt_get_partition_device(const char *dev_path, uint64_t offset, uint64_t size);
|
|
char *crypt_get_base_device(const char *dev_path);
|
|
uint64_t crypt_dev_partition_offset(const char *dev_path);
|
|
int lookup_by_disk_id(const char *dm_uuid);
|
|
int lookup_by_sysfs_uuid_field(const char *dm_uuid, size_t max_len);
|
|
|
|
ssize_t write_buffer(int fd, const void *buf, size_t count);
|
|
ssize_t read_buffer(int fd, void *buf, size_t count);
|
|
ssize_t write_blockwise(int fd, size_t bsize, size_t alignment, void *orig_buf, size_t count);
|
|
ssize_t read_blockwise(int fd, size_t bsize, size_t alignment, void *buf, size_t count);
|
|
ssize_t write_lseek_blockwise(int fd, size_t bsize, size_t alignment, void *buf, size_t count, off_t offset);
|
|
ssize_t read_lseek_blockwise(int fd, size_t bsize, size_t alignment, void *buf, size_t count, off_t offset);
|
|
|
|
size_t crypt_getpagesize(void);
|
|
unsigned crypt_cpusonline(void);
|
|
uint64_t crypt_getphysmemory_kb(void);
|
|
|
|
int init_crypto(struct crypt_device *ctx);
|
|
|
|
void logger(struct crypt_device *cd, int class, const char *file, int line, const char *format, ...) __attribute__ ((format (printf, 5, 6)));
|
|
#define log_dbg(x...) logger(NULL, CRYPT_LOG_DEBUG, __FILE__, __LINE__, x)
|
|
#define log_std(c, x...) logger(c, CRYPT_LOG_NORMAL, __FILE__, __LINE__, x)
|
|
#define log_verbose(c, x...) logger(c, CRYPT_LOG_VERBOSE, __FILE__, __LINE__, x)
|
|
#define log_err(c, x...) logger(c, CRYPT_LOG_ERROR, __FILE__, __LINE__, x)
|
|
|
|
int crypt_get_debug_level(void);
|
|
|
|
int crypt_memlock_inc(struct crypt_device *ctx);
|
|
int crypt_memlock_dec(struct crypt_device *ctx);
|
|
|
|
int crypt_metadata_locking_enabled(void);
|
|
|
|
int crypt_random_init(struct crypt_device *ctx);
|
|
int crypt_random_get(struct crypt_device *ctx, char *buf, size_t len, int quality);
|
|
void crypt_random_exit(void);
|
|
int crypt_random_default_key_rng(void);
|
|
|
|
int crypt_plain_hash(struct crypt_device *ctx,
|
|
const char *hash_name,
|
|
char *key, size_t key_size,
|
|
const char *passphrase, size_t passphrase_size);
|
|
int PLAIN_activate(struct crypt_device *cd,
|
|
const char *name,
|
|
struct volume_key *vk,
|
|
uint64_t size,
|
|
uint32_t flags);
|
|
|
|
void *crypt_get_hdr(struct crypt_device *cd, const char *type);
|
|
|
|
int crypt_wipe_device(struct crypt_device *cd,
|
|
struct device *device,
|
|
crypt_wipe_pattern pattern,
|
|
uint64_t offset,
|
|
uint64_t length,
|
|
size_t wipe_block_size,
|
|
int (*progress)(uint64_t size, uint64_t offset, void *usrptr),
|
|
void *usrptr);
|
|
|
|
/* Internal integrity helpers */
|
|
const char *crypt_get_integrity(struct crypt_device *cd);
|
|
int crypt_get_integrity_key_size(struct crypt_device *cd);
|
|
int crypt_get_integrity_tag_size(struct crypt_device *cd);
|
|
|
|
int crypt_key_in_keyring(struct crypt_device *cd);
|
|
void crypt_set_key_in_keyring(struct crypt_device *cd, unsigned key_in_keyring);
|
|
|
|
#endif /* INTERNAL_H */
|