#!/bin/bash PS4='$LINENO:' [ -z "$CRYPTSETUP_PATH" ] && CRYPTSETUP_PATH=".." CRYPTSETUP=$CRYPTSETUP_PATH/cryptsetup CRYPTSETUP_RAW=$CRYPTSETUP CRYPTSETUP_VALGRIND=../.libs/cryptsetup CRYPTSETUP_LIB_VALGRIND=../.libs IMG=reenc-mangle-data IMG_HDR=$IMG.hdr IMG_JSON=$IMG.json KEY1=key1 DEV_NAME=reenc3492834 FAST_PBKDF2="--pbkdf pbkdf2 --pbkdf-force-iterations 1000" CS_PWPARAMS="--disable-keyring --key-file $KEY1" CS_PARAMS="-q --disable-locks $CS_PWPARAMS" JSON_MSIZE=16384 function remove_mapping() { [ -b /dev/mapper/$DEV_NAME ] && dmsetup remove --retry $DEV_NAME rm -f $IMG $IMG_HDR $IMG_JSON $KEY1 >/dev/null 2>&1 } function fail() { local frame=0 [ -n "$1" ] && echo "$1" echo "FAILED backtrace:" while caller $frame; do ((frame++)); done remove_mapping exit 2 } function skip() { [ -n "$1" ] && echo "$1" remove_mapping exit 77 } function bin_check() { which $1 >/dev/null 2>&1 || skip "WARNING: test require $1 binary, test skipped." } function img_json_save() { # FIXME: why --json-file cannot be used? $CRYPTSETUP luksDump --dump-json-metadata $IMG | jq -c -M | tr -d '\n' >$IMG_JSON } function img_json_dump() { img_json_save jq . $IMG_JSON } function img_hash_save() { IMG_HASH=$(sha256sum $IMG | cut -d' ' -f 1) } function img_hash_unchanged() { local IMG_HASH2=$(sha256sum $IMG | cut -d' ' -f 1) [ "$IMG_HASH" != "$IMG_HASH2" ] && fail "Image changed!" } function img_prepare_raw() # $1 options { remove_mapping if [ ! -e $KEY1 ]; then dd if=/dev/urandom of=$KEY1 count=1 bs=32 >/dev/null 2>&1 fi truncate -s 32M $IMG || fail $CRYPTSETUP luksFormat $FAST_PBKDF2 $CS_PARAMS --luks2-metadata-size $JSON_MSIZE $IMG $1 || fail } function img_prepare() # $1 options { img_prepare_raw # FIXME: resilience is not saved here (always none)? $CRYPTSETUP reencrypt $IMG $CS_PARAMS -q --init-only --resilience none $1 >/dev/null 2>&1 [ $? -ne 0 ] && skip "Reencryption unsupported, test skipped." img_json_save img_hash_save } function _dd() { dd $@ status=none conv=notrunc bs=1 } # header mangle functions function img_update_json() { local LUKS2_BIN1_OFFSET=448 local LUKS2_BIN2_OFFSET=$((LUKS2_BIN1_OFFSET + $JSON_MSIZE)) local LUKS2_JSON_SIZE=$(($JSON_MSIZE - 4096)) # if present jq script, mangle JSON if [ -n "$1" ]; then local JSON=$(cat $IMG_JSON) echo $JSON | jq -M -c "$1" >$IMG_JSON || fail local JSON=$(cat $IMG_JSON) echo $JSON | tr -d '\n' >$IMG_JSON || fail fi # wipe JSON areas _dd if=/dev/zero of=$IMG count=$LUKS2_JSON_SIZE seek=4096 _dd if=/dev/zero of=$IMG count=$LUKS2_JSON_SIZE seek=$(($JSON_MSIZE + 4096)) # write JSON data _dd if=$IMG_JSON of=$IMG count=$LUKS2_JSON_SIZE seek=4096 _dd if=$IMG_JSON of=$IMG count=$LUKS2_JSON_SIZE seek=$(($JSON_MSIZE + 4096)) # erase sha256 checksums _dd if=/dev/zero of=$IMG count=64 seek=$LUKS2_BIN1_OFFSET _dd if=/dev/zero of=$IMG count=64 seek=$LUKS2_BIN2_OFFSET # calculate sha256 and write chexksums local SUM1_HEX=$(_dd if=$IMG count=$JSON_MSIZE | sha256sum | cut -d ' ' -f 1) echo $SUM1_HEX | xxd -r -p | _dd of=$IMG seek=$LUKS2_BIN1_OFFSET count=64 || fail local SUM2_HEX=$(_dd if=$IMG skip=$JSON_MSIZE count=$JSON_MSIZE | sha256sum | cut -d ' ' -f 1) echo $SUM2_HEX | xxd -r -p | _dd of=$IMG seek=$LUKS2_BIN2_OFFSET count=64 || fail img_hash_save } function img_check_ok() { if [ $(id -u) == 0 ]; then $CRYPTSETUP open $CS_PWPARAMS $IMG $DEV_NAME || fail $CRYPTSETUP close $DEV_NAME || fail fi $CRYPTSETUP repair $IMG $CS_PARAMS || fail } function img_check_fail() { if [ $(id -u) == 0 ]; then $CRYPTSETUP open $CS_PWPARAMS $IMG $DEV_NAME 2>/dev/null && fail fi $CRYPTSETUP repair $IMG $CS_PARAMS 2>/dev/null && fail img_hash_unchanged } function img_run_reenc_ok() { local EXPECT_TIMEOUT=5 [ -n "$VALG" ] && EXPECT_TIMEOUT=60 # For now, we cannot run reencryption in batch mode for non-block device. Just fake the terminal here. expect_run - >/dev/null </dev/null 2>&1 && fail remove_mapping exit 0