1#!/bin/ksh -p 2# 3# CDDL HEADER START 4# 5# This file and its contents are supplied under the terms of the 6# Common Development and Distribution License ("CDDL"), version 1.0. 7# You may only use this file in accordance with the terms of version 8# 1.0 of the CDDL. 9# 10# A full copy of the text of the CDDL should have accompanied this 11# source. A copy of the CDDL is also available via the Internet at 12# http://www.illumos.org/license/CDDL. 13# 14# CDDL HEADER END 15# 16 17# 18# Copyright (c) 2017 Datto, Inc. All rights reserved. 19# 20 21. $STF_SUITE/include/libtest.shlib 22 23# 24# DESCRIPTION: 25# ZFS should receive streams from raw sends. 26# 27# STRATEGY: 28# 1. Create an encrypted dataset 29# 2. Create a file and get its checksum 30# 3. Snapshot the dataset 31# 4. Attempt to receive a raw send stream as a child of an unencrypted dataset 32# 5. Verify the key is unavailable 33# 6. Attempt to load the key and mount the dataset 34# 7. Verify the cheksum of the file is the same as the original 35# 8. Attempt to receive a raw send stream as a child of an encrypted dataset 36# 9. Verify the key is unavailable 37# 10. Attempt to load the key and mount the dataset 38# 11. Verify the cheksum of the file is the same as the original 39# 40 41verify_runnable "both" 42 43function cleanup 44{ 45 datasetexists $TESTPOOL/$TESTFS1 && \ 46 log_must zfs destroy -r $TESTPOOL/$TESTFS1 47 48 datasetexists $TESTPOOL/$TESTFS2 && \ 49 log_must zfs destroy -r $TESTPOOL/$TESTFS2 50} 51 52log_onexit cleanup 53 54log_assert "ZFS should receive streams from raw sends" 55 56typeset passphrase="password" 57typeset snap="$TESTPOOL/$TESTFS1@snap" 58 59log_must eval "echo $passphrase | zfs create -o encryption=on" \ 60 "-o keyformat=passphrase $TESTPOOL/$TESTFS1" 61 62log_must mkfile 1M /$TESTPOOL/$TESTFS1/$TESTFILE0 63typeset checksum=$(md5sum /$TESTPOOL/$TESTFS1/$TESTFILE0 | \ 64 awk '{ print $1 }') 65 66log_must zfs snapshot $snap 67 68log_note "Verify ZFS can receive a raw send stream from an encrypted dataset" 69log_must eval "zfs send -w $snap | zfs receive $TESTPOOL/$TESTFS2" 70 71keystatus=$(get_prop keystatus $TESTPOOL/$TESTFS2) 72[[ "$keystatus" == "unavailable" ]] || \ 73 log_fail "Expected keystatus unavailable, got $keystatus" 74 75log_must eval "echo $passphrase | zfs mount -l $TESTPOOL/$TESTFS2" 76 77typeset cksum1=$(md5sum /$TESTPOOL/$TESTFS2/$TESTFILE0 | awk '{ print $1 }') 78[[ "$cksum1" == "$checksum" ]] || \ 79 log_fail "Checksums differ ($cksum1 != $checksum)" 80 81log_must eval "zfs send -w $snap | zfs receive $TESTPOOL/$TESTFS1/c1" 82 83keystatus=$(get_prop keystatus $TESTPOOL/$TESTFS1/c1) 84[[ "$keystatus" == "unavailable" ]] || \ 85 log_fail "Expected keystatus unavailable, got $keystatus" 86 87log_must eval "echo $passphrase | zfs mount -l $TESTPOOL/$TESTFS1/c1" 88typeset cksum2=$(md5sum /$TESTPOOL/$TESTFS1/c1/$TESTFILE0 | \ 89 awk '{ print $1 }') 90[[ "$cksum2" == "$checksum" ]] || \ 91 log_fail "Checksums differ ($cksum2 != $checksum)" 92 93log_pass "ZFS can receive streams from raw sends" 94