Add --device-size option for reencryption tool.
[platform/upstream/cryptsetup.git] / tests / api-test.c
index 00d3d87..bcbd301 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * cryptsetup library API check functions
  *
- * Copyright (C) 2009-2010 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2009-2012 Red Hat, Inc. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -14,7 +14,7 @@
  *
  * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
 #include <stdio.h>
@@ -469,9 +469,10 @@ static void check_ko(int status, int line, const char *func)
                printf("   => errno %d, errmsg: %s\n", status, buf);
 }
 
-static void check_equal(int line, const char *func)
+static void check_equal(int line, const char *func, int64_t x, int64_t y)
 {
-       printf("FAIL line %d [%s]: expected equal values differs.\n", line, func);
+       printf("FAIL line %d [%s]: expected equal values differs: %"
+               PRIi64 " != %" PRIi64 "\n", line, func, x, y);
        _cleanup();
        exit(-1);
 }
@@ -494,9 +495,9 @@ static void xlog(const char *msg, const char *tst, const char *func, int line, c
                             check_ko((x), __LINE__, __FUNCTION__); \
                        } while(0)
 #define EQ_(x, y)      do { xlog("(equal)  ", #x " == " #y, __FUNCTION__, __LINE__, NULL); \
-                            if ((x) != (y)) check_equal(__LINE__, __FUNCTION__); \
+                            int64_t _x = (x), _y = (y); \
+                            if (_x != _y) check_equal(__LINE__, __FUNCTION__, _x, _y); \
                        } while(0)
-
 #define RUN_(x, y)             do { printf("%s: %s\n", #x, (y)); x(); } while (0)
 
 static void AddDevicePlain(void)
@@ -660,6 +661,11 @@ static void AddDevicePlain(void)
 
        FAIL_(crypt_init_by_name_and_header(&cd, CDEVICE_1, H_DEVICE),"can't init plain device by header device");
        OK_(crypt_init_by_name(&cd, CDEVICE_1));
+       OK_(strcmp(cipher_mode,crypt_get_cipher_mode(cd)));
+       OK_(strcmp(cipher,crypt_get_cipher(cd)));
+       EQ_((int)key_size, crypt_get_volume_key_size(cd));
+       EQ_(params.skip, crypt_get_iv_offset(cd));
+       EQ_(params.offset, crypt_get_data_offset(cd));
        OK_(crypt_deactivate(cd, CDEVICE_1));
        crypt_free(cd);
 
@@ -764,6 +770,9 @@ static void AddDevicePlain(void)
        EQ_(0, crypt_activate_by_keyfile(cd, CDEVICE_1, CRYPT_ANY_SLOT, KEYFILE1, 0, 0));
        EQ_(crypt_status(cd, CDEVICE_1), CRYPT_ACTIVE);
        OK_(crypt_deactivate(cd, CDEVICE_1));
+       FAIL_(crypt_activate_by_keyfile_offset(cd, NULL, CRYPT_ANY_SLOT, KEYFILE1, 0, strlen(KEY1) + 1, 0), "cannot seek");
+       EQ_(0, crypt_activate_by_keyfile_offset(cd, CDEVICE_1, CRYPT_ANY_SLOT, KEYFILE1, 0, 0, 0));
+       OK_(crypt_deactivate(cd, CDEVICE_1));
        _remove_keyfiles();
        crypt_free(cd);
 
@@ -916,7 +925,8 @@ static void SuspendDevice(void)
        OK_(_prepare_keyfile(KEYFILE1, KEY1, strlen(KEY1)));
        OK_(crypt_suspend(cd, CDEVICE_1));
        FAIL_(crypt_resume_by_keyfile(cd, CDEVICE_1, CRYPT_ANY_SLOT, KEYFILE1 "blah", 0), "wrong keyfile");
-       OK_(crypt_resume_by_keyfile(cd, CDEVICE_1, CRYPT_ANY_SLOT, KEYFILE1, 0));
+       FAIL_(crypt_resume_by_keyfile_offset(cd, CDEVICE_1, CRYPT_ANY_SLOT, KEYFILE1, 1, 0), "wrong key");
+       OK_(crypt_resume_by_keyfile_offset(cd, CDEVICE_1, CRYPT_ANY_SLOT, KEYFILE1, 0, 0));
        FAIL_(crypt_resume_by_keyfile(cd, CDEVICE_1, CRYPT_ANY_SLOT, KEYFILE1, 0), "not suspended");
        _remove_keyfiles();
 out:
@@ -976,7 +986,8 @@ static void AddDeviceLuks(void)
        OK_(get_luks_offsets(0, key_size, params.data_alignment, 0, NULL, &r_payload_offset));
        OK_(create_dmdevice_over_loop(L_DEVICE_0S, r_payload_offset));
        OK_(create_dmdevice_over_loop(L_DEVICE_1S, r_payload_offset + 1));
-       OK_(create_dmdevice_over_loop(L_DEVICE_WRONG, r_payload_offset - 1));
+       //OK_(create_dmdevice_over_loop(L_DEVICE_WRONG, r_payload_offset - 1));
+       OK_(create_dmdevice_over_loop(L_DEVICE_WRONG, 2050 - 1)); //FIXME last keyslot - 1 sector
 
        // 1 sector less than required
        OK_(crypt_init(&cd, DMDIR L_DEVICE_WRONG));
@@ -1041,7 +1052,7 @@ static void AddDeviceLuks(void)
        // there we've got uuid mismatch
        OK_(crypt_init_by_name_and_header(&cd, CDEVICE_1, DMDIR H_DEVICE));
        EQ_(crypt_status(cd, CDEVICE_1), CRYPT_ACTIVE);
-       EQ_(crypt_get_type(cd), NULL);
+       OK_((int)crypt_get_type(cd));
        FAIL_(crypt_activate_by_volume_key(cd, CDEVICE_1, key, key_size, 0), "Device is active");
        FAIL_(crypt_activate_by_volume_key(cd, CDEVICE_2, key, key_size, 0), "Device is active");
        EQ_(crypt_status(cd, CDEVICE_2), CRYPT_INACTIVE);
@@ -1066,15 +1077,26 @@ static void AddDeviceLuks(void)
        EQ_(crypt_status(cd, CDEVICE_2), CRYPT_ACTIVE);
        OK_(crypt_deactivate(cd, CDEVICE_2));
 
+       crypt_set_iteration_time(cd, 1);
        EQ_(1, crypt_keyslot_add_by_volume_key(cd, 1, key, key_size, KEY1, strlen(KEY1)));
        OK_(_prepare_keyfile(KEYFILE1, KEY1, strlen(KEY1)));
        OK_(_prepare_keyfile(KEYFILE2, KEY2, strlen(KEY2)));
        EQ_(2, crypt_keyslot_add_by_keyfile(cd, 2, KEYFILE1, 0, KEYFILE2, 0));
+       FAIL_(crypt_keyslot_add_by_keyfile_offset(cd, 3, KEYFILE1, 0, 1, KEYFILE2, 0, 1), "wrong key");
+       EQ_(3, crypt_keyslot_add_by_keyfile_offset(cd, 3, KEYFILE1, 0, 0, KEYFILE2, 0, 1));
+       EQ_(4, crypt_keyslot_add_by_keyfile_offset(cd, 4, KEYFILE2, 0, 1, KEYFILE1, 0, 1));
        FAIL_(crypt_activate_by_keyfile(cd, CDEVICE_2, CRYPT_ANY_SLOT, KEYFILE2, strlen(KEY2)-1, 0), "key mismatch");
        EQ_(2, crypt_activate_by_keyfile(cd, NULL, CRYPT_ANY_SLOT, KEYFILE2, 0, 0));
+       EQ_(3, crypt_activate_by_keyfile_offset(cd, NULL, CRYPT_ANY_SLOT, KEYFILE2, 0, 1, 0));
+       EQ_(4, crypt_activate_by_keyfile_offset(cd, NULL, CRYPT_ANY_SLOT, KEYFILE1, 0, 1, 0));
+       FAIL_(crypt_activate_by_keyfile_offset(cd, CDEVICE_2, CRYPT_ANY_SLOT, KEYFILE2, strlen(KEY2), 2, 0), "not enough data");
+       FAIL_(crypt_activate_by_keyfile_offset(cd, CDEVICE_2, CRYPT_ANY_SLOT, KEYFILE2, 0, strlen(KEY2) + 1, 0), "cannot seek");
+       FAIL_(crypt_activate_by_keyfile_offset(cd, CDEVICE_2, CRYPT_ANY_SLOT, KEYFILE2, 0, 2, 0), "wrong key");
        EQ_(2, crypt_activate_by_keyfile(cd, CDEVICE_2, CRYPT_ANY_SLOT, KEYFILE2, 0, 0));
        OK_(crypt_keyslot_destroy(cd, 1));
        OK_(crypt_keyslot_destroy(cd, 2));
+       OK_(crypt_keyslot_destroy(cd, 3));
+       OK_(crypt_keyslot_destroy(cd, 4));
        OK_(crypt_deactivate(cd, CDEVICE_2));
        _remove_keyfiles();
 
@@ -1277,8 +1299,10 @@ static void LuksHeaderLoad(void)
        // external header device
        OK_(create_dmdevice_over_loop(H_DEVICE, r_header_size));
        // prepared header on a device too small to contain header and payload
-       OK_(create_dmdevice_over_loop(H_DEVICE_WRONG, r_payload_offset - 1));
-       snprintf(cmd, sizeof(cmd), "dd if=" EVL_HEADER_4 " of=" DMDIR H_DEVICE_WRONG " bs=512 count=%" PRIu64, r_payload_offset - 1);
+       //OK_(create_dmdevice_over_loop(H_DEVICE_WRONG, r_payload_offset - 1));
+       OK_(create_dmdevice_over_loop(H_DEVICE_WRONG, 2050 - 1)); //FIXME
+       //snprintf(cmd, sizeof(cmd), "dd if=" EVL_HEADER_4 " of=" DMDIR H_DEVICE_WRONG " bs=512 count=%" PRIu64, r_payload_offset - 1);
+       snprintf(cmd, sizeof(cmd), "dd if=" EVL_HEADER_4 " of=" DMDIR H_DEVICE_WRONG " bs=512 count=%" PRIu64, 2050ULL - 1);
        OK_(_system(cmd, 1));
        // some device
        OK_(create_dmdevice_over_loop(L_DEVICE_OK, r_payload_offset + 1000));
@@ -1304,7 +1328,7 @@ static void LuksHeaderLoad(void)
        // bad header: device too small (payloadOffset > device_size)
        OK_(crypt_init(&cd, DMDIR H_DEVICE_WRONG));
        FAIL_(crypt_load(cd, CRYPT_LUKS1, NULL), "Device too small");
-       EQ_(crypt_get_type(cd), NULL);
+       OK_((int)crypt_get_type(cd));
        crypt_free(cd);
 
        // 0 secs for encrypted data area
@@ -1321,7 +1345,7 @@ static void LuksHeaderLoad(void)
        crypt_free(cd);
 
        // damaged header
-       OK_(_system("dd if=/dev/zero of=" DMDIR L_DEVICE_0S "bs=512 count=8", 1));
+       OK_(_system("dd if=/dev/zero of=" DMDIR L_DEVICE_OK " bs=512 count=8", 1));
        OK_(crypt_init(&cd, DMDIR L_DEVICE_OK));
        FAIL_(crypt_load(cd, CRYPT_LUKS1, NULL), "Header not found");
        crypt_free(cd);