cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

293 (6916B)


      1#!/usr/bin/env bash
      2# group: rw
      3#
      4# Test encryption key management with luks
      5# Based on 134
      6#
      7# Copyright (C) 2019 Red Hat, Inc.
      8#
      9# This program is free software; you can redistribute it and/or modify
     10# it under the terms of the GNU General Public License as published by
     11# the Free Software Foundation; either version 2 of the License, or
     12# (at your option) any later version.
     13#
     14# This program is distributed in the hope that it will be useful,
     15# but WITHOUT ANY WARRANTY; without even the implied warranty of
     16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17# GNU General Public License for more details.
     18#
     19# You should have received a copy of the GNU General Public License
     20# along with this program.  If not, see <http://www.gnu.org/licenses/>.
     21#
     22
     23# creator
     24owner=mlevitsk@redhat.com
     25
     26seq=`basename $0`
     27echo "QA output created by $seq"
     28
     29status=1	# failure is the default!
     30
     31_cleanup()
     32{
     33	_cleanup_test_img
     34}
     35trap "_cleanup; exit \$status" 0 1 2 3 15
     36
     37# get standard environment, filters and checks
     38. ./common.rc
     39. ./common.filter
     40
     41_supported_fmt qcow2 luks
     42_supported_proto file fuse #TODO
     43_require_working_luks
     44
     45QEMU_IO_OPTIONS=$QEMU_IO_OPTIONS_NO_FMT
     46
     47if [ "$IMGFMT" = "qcow2" ] ; then
     48	PR="encrypt."
     49	EXTRA_IMG_ARGS="-o encrypt.format=luks"
     50fi
     51
     52
     53# secrets: you are supposed to see the password as *******, see :-)
     54S0="--object secret,id=sec0,data=hunter0"
     55S1="--object secret,id=sec1,data=hunter1"
     56S2="--object secret,id=sec2,data=hunter2"
     57S3="--object secret,id=sec3,data=hunter3"
     58S4="--object secret,id=sec4,data=hunter4"
     59SECRETS="$S0 $S1 $S2 $S3 $S4"
     60
     61# image with given secret
     62IMGS0="--image-opts driver=$IMGFMT,file.filename=$TEST_IMG,${PR}key-secret=sec0"
     63IMGS1="--image-opts driver=$IMGFMT,file.filename=$TEST_IMG,${PR}key-secret=sec1"
     64IMGS2="--image-opts driver=$IMGFMT,file.filename=$TEST_IMG,${PR}key-secret=sec2"
     65IMGS3="--image-opts driver=$IMGFMT,file.filename=$TEST_IMG,${PR}key-secret=sec3"
     66IMGS4="--image-opts driver=$IMGFMT,file.filename=$TEST_IMG,${PR}key-secret=sec4"
     67
     68
     69echo "== creating a test image =="
     70_make_test_img $S0 $EXTRA_IMG_ARGS -o ${PR}key-secret=sec0,${PR}iter-time=10 32M
     71
     72echo
     73echo "== test that key 0 opens the image =="
     74$QEMU_IO $S0 -c "read 0 4096" $IMGS0 | _filter_qemu_io | _filter_testdir
     75
     76echo
     77echo "== adding a password to slot 4 =="
     78$QEMU_IMG amend $SECRETS $IMGS0 -o ${PR}state=active,${PR}new-secret=sec4,${PR}iter-time=10,${PR}keyslot=4
     79echo "== adding a password to slot 1 =="
     80$QEMU_IMG amend $SECRETS $IMGS0 -o ${PR}state=active,${PR}new-secret=sec1,${PR}iter-time=10
     81echo "== adding a password to slot 3 =="
     82$QEMU_IMG amend $SECRETS $IMGS1 -o ${PR}state=active,${PR}new-secret=sec3,${PR}iter-time=10,${PR}keyslot=3
     83
     84echo "== adding a password to slot 2 =="
     85$QEMU_IMG amend $SECRETS $IMGS3 -o ${PR}state=active,${PR}new-secret=sec2,${PR}iter-time=10
     86
     87
     88echo "== erase slot 4 =="
     89$QEMU_IMG amend $SECRETS $IMGS1 -o ${PR}state=inactive,${PR}keyslot=4 | _filter_img_create
     90
     91
     92echo
     93echo "== all secrets should work =="
     94for IMG in "$IMGS0" "$IMGS1" "$IMGS2" "$IMGS3"; do
     95	$QEMU_IO $SECRETS -c "read 0 4096" $IMG | _filter_qemu_io | _filter_testdir
     96done
     97
     98echo
     99echo "== erase slot 0 and try it =="
    100$QEMU_IMG amend $SECRETS $IMGS1 -o ${PR}state=inactive,${PR}old-secret=sec0 | _filter_img_create
    101$QEMU_IO $SECRETS -c "read 0 4096" $IMGS0 | _filter_qemu_io | _filter_testdir
    102
    103echo
    104echo "== erase slot 2 and try it =="
    105$QEMU_IMG amend $SECRETS $IMGS1 -o ${PR}state=inactive,${PR}keyslot=2 | _filter_img_create
    106$QEMU_IO $SECRETS -c "read 0 4096" $IMGS2 | _filter_qemu_io | _filter_testdir
    107
    108
    109# at this point slots 1 and 3 should be active
    110
    111echo
    112echo "== filling  4 slots with secret 2 =="
    113for ((i = 0; i < 4; i++)); do
    114	$QEMU_IMG amend $SECRETS $IMGS3 -o ${PR}state=active,${PR}new-secret=sec2,${PR}iter-time=10
    115done
    116
    117echo
    118echo "== adding secret 0 =="
    119	$QEMU_IMG amend $SECRETS $IMGS3 -o ${PR}state=active,${PR}new-secret=sec0,${PR}iter-time=10
    120
    121echo
    122echo "== adding secret 3 (last slot) =="
    123	$QEMU_IMG amend $SECRETS $IMGS3 -o ${PR}state=active,${PR}new-secret=sec3,${PR}iter-time=10
    124
    125echo
    126echo "== trying to add another slot (should fail) =="
    127$QEMU_IMG amend $SECRETS $IMGS2 -o ${PR}state=active,${PR}new-secret=sec3,${PR}iter-time=10
    128
    129echo
    130echo "== all secrets should work again =="
    131for IMG in "$IMGS0" "$IMGS1" "$IMGS2" "$IMGS3"; do
    132	$QEMU_IO $SECRETS -c "read 0 4096" $IMG | _filter_qemu_io | _filter_testdir
    133done
    134
    135
    136echo
    137
    138echo "== erase all keys of secret 2=="
    139$QEMU_IMG amend $SECRETS $IMGS1 -o ${PR}state=inactive,${PR}old-secret=sec2
    140
    141echo "== erase all keys of secret 1=="
    142$QEMU_IMG amend $SECRETS $IMGS1 -o ${PR}state=inactive,${PR}old-secret=sec1
    143
    144echo "== erase all keys of secret 0=="
    145$QEMU_IMG amend $SECRETS $IMGS0 -o ${PR}state=inactive,${PR}old-secret=sec0
    146
    147echo "== erasing secret3 will fail now since it is the only secret (in 3 slots) =="
    148$QEMU_IMG amend $SECRETS $IMGS3 -o ${PR}state=inactive,${PR}old-secret=sec3
    149
    150echo
    151echo "== only secret3 should work now  =="
    152for IMG in "$IMGS0" "$IMGS1" "$IMGS2" "$IMGS3"; do
    153	$QEMU_IO $SECRETS -c "read 0 4096" $IMG | _filter_qemu_io | _filter_testdir
    154done
    155
    156echo
    157echo "== add secret0  =="
    158$QEMU_IMG amend $SECRETS $IMGS3 -o ${PR}state=active,${PR}new-secret=sec0,${PR}iter-time=10
    159
    160echo "== erase secret3 =="
    161$QEMU_IMG amend $SECRETS $IMGS0 -o ${PR}state=inactive,${PR}old-secret=sec3
    162
    163echo
    164echo "== only secret0 should work now  =="
    165for IMG in "$IMGS0" "$IMGS1" "$IMGS2" "$IMGS3"; do
    166	$QEMU_IO $SECRETS -c "read 0 4096" $IMG | _filter_qemu_io | _filter_testdir
    167done
    168
    169echo
    170echo "== replace secret0 with secret1 (should fail)  =="
    171$QEMU_IMG amend $SECRETS $IMGS0 -o ${PR}state=active,${PR}new-secret=sec1,${PR}keyslot=0
    172
    173echo
    174echo "== replace secret0 with secret1 with force (should work)  =="
    175$QEMU_IMG amend $SECRETS $IMGS0 -o ${PR}state=active,${PR}new-secret=sec1,${PR}iter-time=10,${PR}keyslot=0 --force
    176
    177echo
    178echo "== only secret1 should work now  =="
    179for IMG in "$IMGS0" "$IMGS1" "$IMGS2" "$IMGS3"; do
    180	$QEMU_IO $SECRETS -c "read 0 4096" $IMG | _filter_qemu_io | _filter_testdir
    181done
    182
    183
    184echo
    185echo "== erase last secret (should fail)  =="
    186$QEMU_IMG amend $SECRETS $IMGS1 -o ${PR}state=inactive,${PR}keyslot=0
    187$QEMU_IMG amend $SECRETS $IMGS1 -o ${PR}state=inactive,${PR}old-secret=sec1
    188
    189
    190echo "== erase non existing secrets (should fail)  =="
    191$QEMU_IMG amend $SECRETS $IMGS1 -o ${PR}state=inactive,${PR}old-secret=sec5 --force
    192$QEMU_IMG amend $SECRETS $IMGS1 -o ${PR}state=inactive,${PR}old-secret=sec0 --force
    193$QEMU_IMG amend $SECRETS $IMGS1 -o ${PR}state=inactive,${PR}keyslot=1 --force
    194
    195echo
    196echo "== erase last secret with force by slot (should work)  =="
    197$QEMU_IMG amend $SECRETS $IMGS1 -o ${PR}state=inactive,${PR}keyslot=0 --force
    198
    199echo
    200echo "== we have no secrets now, data is lost forever =="
    201for IMG in "$IMGS0" "$IMGS1" "$IMGS2" "$IMGS3"; do
    202	$QEMU_IO $SECRETS -c "read 0 4096" $IMG | _filter_qemu_io | _filter_testdir
    203done
    204
    205# success, all done
    206echo "*** done"
    207rm -f $seq.full
    208status=0
    209