Revert "Imported upstream version 1.6.7"
[platform/upstream/cryptsetup.git] / lib / libcryptsetup.h
index 3709a51..2a1ca06 100644 (file)
@@ -4,10 +4,12 @@
  * Copyright (C) 2004, Christophe Saout <christophe@saout.de>
  * Copyright (C) 2004-2007, Clemens Fruhwirth <clemens@endorphin.org>
  * Copyright (C) 2009-2012, Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2009-2012, Milan Broz
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
+ * 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
@@ -87,7 +89,7 @@ int crypt_init_by_name_and_header(struct crypt_device **cd,
 int crypt_init_by_name(struct crypt_device **cd, const char *name);
 
 /**
- * @defgroup loglevel "Cryptsetup logging"
+ * @defgroup loglevel Cryptsetup logging
  *
  * Set of functions and defines used in cryptsetup for
  * logging purposes
@@ -237,7 +239,7 @@ void crypt_set_password_verify(struct crypt_device *cd, int password_verify);
 int crypt_set_data_device(struct crypt_device *cd, const char *device);
 
 /**
- * @defgroup rng "Cryptsetup RNG"
+ * @defgroup rng Cryptsetup RNG
  *
  * @addtogroup rng
  * @{
@@ -283,7 +285,7 @@ int crypt_get_rng_type(struct crypt_device *cd);
 int crypt_memory_lock(struct crypt_device *cd, int lock);
 
 /**
- * @defgroup crypt_type "Cryptsetup on-disk format types"
+ * @defgroup crypt_type Cryptsetup on-disk format types
  *
  * Set of functions, \#defines and structs related
  * to on-disk format types
@@ -302,7 +304,7 @@ int crypt_memory_lock(struct crypt_device *cd, int lock);
 #define CRYPT_LOOPAES "LOOPAES"
 /** dm-verity mode */
 #define CRYPT_VERITY "VERITY"
-/** TCRYPT mode */
+/** TCRYPT (TrueCrypt-compatible) mode */
 #define CRYPT_TCRYPT "TCRYPT"
 
 /**
@@ -361,13 +363,6 @@ struct crypt_params_loopaes {
  * @see crypt_format, crypt_load
  *
  */
-/** No on-disk header (only hashes) */
-#define CRYPT_VERITY_NO_HEADER   (1 << 0)
-/** Verity hash in userspace before activation */
-#define CRYPT_VERITY_CHECK_HASH  (1 << 1)
-/** Create hash - format hash device */
-#define CRYPT_VERITY_CREATE_HASH (1 << 2)
-
 struct crypt_params_verity {
        const char *hash_name;     /**< hash function */
        const char *data_device;   /**< data_device (CRYPT_VERITY_CREATE_HASH) */
@@ -382,25 +377,25 @@ struct crypt_params_verity {
        uint32_t flags;            /**< CRYPT_VERITY* flags */
 };
 
+/** No on-disk header (only hashes) */
+#define CRYPT_VERITY_NO_HEADER   (1 << 0)
+/** Verity hash in userspace before activation */
+#define CRYPT_VERITY_CHECK_HASH  (1 << 1)
+/** Create hash - format hash device */
+#define CRYPT_VERITY_CREATE_HASH (1 << 2)
+
 /**
  *
  * Structure used as parameter for TCRYPT device type
  *
- * @see crypt_format
+ * @see crypt_load
  *
  */
-/** Include legacy modes ehn scannig for header*/
-#define CRYPT_TCRYPT_LEGACY_MODES    (1 << 0)
-/** Try to load hidden header (describing hidden device) */
-#define CRYPT_TCRYPT_HIDDEN_HEADER   (1 << 1)
-/** Try to load backup header */
-#define CRYPT_TCRYPT_BACKUP_HEADER   (1 << 2)
-
 struct crypt_params_tcrypt {
-       const char *passphrase;
-       size_t passphrase_size;
-       const char **keyfiles;
-       unsigned int keyfiles_count;
+       const char *passphrase;    /**< passphrase to unlock header (input only) */
+       size_t passphrase_size;    /**< passphrase size (input only, max length is 64) */
+       const char **keyfiles;     /**< keyfile paths to unlock header (input only) */
+       unsigned int keyfiles_count;/**< keyfiles count (input only) */
        const char *hash_name;     /**< hash function for PBKDF */
        const char *cipher;        /**< cipher chain c1[-c2[-c3]] */
        const char *mode;          /**< cipher block mode */
@@ -408,6 +403,15 @@ struct crypt_params_tcrypt {
        uint32_t flags;            /**< CRYPT_TCRYPT* flags */
 };
 
+/** Include legacy modes ehn scannig for header*/
+#define CRYPT_TCRYPT_LEGACY_MODES    (1 << 0)
+/** Try to load hidden header (describing hidden device) */
+#define CRYPT_TCRYPT_HIDDEN_HEADER   (1 << 1)
+/** Try to load backup header */
+#define CRYPT_TCRYPT_BACKUP_HEADER   (1 << 2)
+/** Device contains encrypted system (with boot loader) */
+#define CRYPT_TCRYPT_SYSTEM_HEADER   (1 << 3)
+
 /** @} */
 
 /**
@@ -568,7 +572,7 @@ int crypt_resume_by_keyfile(struct crypt_device *cd,
 void crypt_free(struct crypt_device *cd);
 
 /**
- * @defgroup keyslot "Cryptsetup LUKS keyslots"
+ * @defgroup keyslot Cryptsetup LUKS keyslots
  * @addtogroup keyslot
  * @{
  *
@@ -599,6 +603,33 @@ int crypt_keyslot_add_by_passphrase(struct crypt_device *cd,
        size_t new_passphrase_size);
 
 /**
+ * Change defined key slot using provided passphrase
+ *
+ * @pre @e cd contains initialized and formatted LUKS device context
+ *
+ * @param cd crypt device handle
+ * @param keyslot_old old keyslot or @e CRYPT_ANY_SLOT
+ * @param keyslot_new new keyslot (can be the same as old)
+ * @param passphrase passphrase used to unlock volume key, @e NULL for query
+ * @param passphrase_size size of passphrase (binary data)
+ * @param new_passphrase passphrase for new keyslot, @e NULL for query
+ * @param new_passphrase_size size of @e new_passphrase (binary data)
+ *
+ * @return allocated key slot number or negative errno otherwise.
+ *
+ * @note This function is just internal implementation of luksChange
+ * command to avoid reading of volume key outside libcryptsetup boundary
+ * in FIPS mode.
+ */
+int crypt_keyslot_change_by_passphrase(struct crypt_device *cd,
+       int keyslot_old,
+       int keyslot_new,
+       const char *passphrase,
+       size_t passphrase_size,
+       const char *new_passphrase,
+       size_t new_passphrase_size);
+
+/**
 * Add key slot using provided key file path
  *
  * @pre @e cd contains initialized and formatted LUKS device context
@@ -674,7 +705,7 @@ int crypt_keyslot_destroy(struct crypt_device *cd, int keyslot);
 /** @} */
 
 /**
- * @defgroup aflags "Device runtime attributes"
+ * @defgroup aflags Device runtime attributes
  *
  * Activation flags
  *
@@ -788,6 +819,8 @@ int crypt_activate_by_keyfile(struct crypt_device *cd,
  * @note For VERITY the volume key means root hash required for activation.
  *      Because kernel dm-verity is always read only, you have to provide
  *      CRYPT_ACTIVATE_READONLY flag always.
+ * @note For TCRYPT the volume key should be always NULL and because master
+ *      key from decrypted header is used instead.
  */
 int crypt_activate_by_volume_key(struct crypt_device *cd,
        const char *name,
@@ -820,6 +853,9 @@ int crypt_deactivate(struct crypt_device *cd, const char *name);
  * @param passphrase_size size of @e passphrase
  *
  * @return unlocked key slot number or negative errno otherwise.
+ *
+ * @note For TCRYPT cipher chain is  the volume key concatenated
+ *      for all ciphers in chain.
  */
 int crypt_volume_key_get(struct crypt_device *cd,
        int keyslot,
@@ -842,7 +878,7 @@ int crypt_volume_key_verify(struct crypt_device *cd,
        size_t volume_key_size);
 
 /**
- * @defgroup devstat "Crypt and Verity device status"
+ * @defgroup devstat Crypt and Verity device status
  * @addtogroup devstat
  * @{
  */
@@ -878,29 +914,6 @@ crypt_status_info crypt_status(struct crypt_device *cd, const char *name);
 int crypt_dump(struct crypt_device *cd);
 
 /**
- * Informational benchmark for ciphers
- *
- * @param cd crypt device handle
- * @param cipher (e.g. "aes")
- * @param cipher_mode (e.g. "xts"), IV generator is ignored
- * @param volume_key_size size of volume key in bytes
- * @param iv_size size of IV in bytes
- * @param buffer_size size of encryption buffer in bytes used in test
- * @param encryption_mbs measured encryption speed in MiB/s
- * @param decryption_mbs measured decryption speed in MiB/s
- *
- * @return @e 0 on success or negative errno value otherwise.
- */
-int crypt_benchmark(struct crypt_device *cd,
-       const char *cipher,
-       const char *cipher_mode,
-       size_t volume_key_size,
-       size_t iv_size,
-       size_t buffer_size,
-       double *encryption_mbs,
-       double *decryption_mbs);
-
-/**
  * Get cipher used in device
  *
  * @param cd crypt device handle
@@ -984,6 +997,63 @@ int crypt_get_verity_info(struct crypt_device *cd,
 /** @} */
 
 /**
+ * @defgroup benchmark Benchmarking
+ *
+ * Benchmarking of algorithms
+ *
+ * @addtogroup benchmark
+ * @{
+ *
+ */
+
+/**
+ * Informational benchmark for ciphers
+ *
+ * @param cd crypt device handle
+ * @param cipher (e.g. "aes")
+ * @param cipher_mode (e.g. "xts"), IV generator is ignored
+ * @param volume_key_size size of volume key in bytes
+ * @param iv_size size of IV in bytes
+ * @param buffer_size size of encryption buffer in bytes used in test
+ * @param encryption_mbs measured encryption speed in MiB/s
+ * @param decryption_mbs measured decryption speed in MiB/s
+ *
+ * @return @e 0 on success or negative errno value otherwise.
+ */
+int crypt_benchmark(struct crypt_device *cd,
+       const char *cipher,
+       const char *cipher_mode,
+       size_t volume_key_size,
+       size_t iv_size,
+       size_t buffer_size,
+       double *encryption_mbs,
+       double *decryption_mbs);
+
+/**
+ * Informational benchmark for KDF
+ *
+ * @param cd crypt device handle
+ * @param kdf Key derivation function (e.g. "pbkdf2")
+ * @param hash Hash algorithm used in KDF (e.g. "sha256")
+ * @param password password for benchmark
+ * @param password_size size of password
+ * @param salt salt for benchmark
+ * @param salt_size size of salt
+ * @param iterations_sec returns measured KDF iterations per second
+ *
+ * @return @e 0 on success or negative errno value otherwise.
+ */
+int crypt_benchmark_kdf(struct crypt_device *cd,
+       const char *kdf,
+       const char *hash,
+       const char *password,
+       size_t password_size,
+       const char *salt,
+       size_t salt_size,
+       uint64_t *iterations_sec);
+/** @} */
+
+/**
  * @addtogroup keyslot
  * @{
  *
@@ -1099,7 +1169,7 @@ void crypt_get_error(char *buf, size_t size);
 const char *crypt_get_dir(void);
 
 /**
- * @defgroup dbg "Library debug level"
+ * @defgroup dbg Library debug level
  *
  * Set library debug level
  *