1231437Sluigi
2252869Sdelphij. $(atf_get_srcdir)/conf.sh
3231437Sluigi
4231437Sluigicopy_test() {
5231437Sluigi	cipher=$1
6231437Sluigi	aalgo=$2
7231437Sluigi	secsize=$3
8231437Sluigi	ealgo=${cipher%%:*}
9231437Sluigi	keylen=${cipher##*:}
10231437Sluigi
11231437Sluigi	atf_check -s exit:0 -e ignore \
12231437Sluigi		geli init -B none -a $aalgo -e $ealgo -l $keylen -P \
13231437Sluigi		-K keyfile -s $secsize ${md}
14231437Sluigi	atf_check geli attach -p -k keyfile ${md}
15231437Sluigi
16231437Sluigi	atf_check dd if=rnd of=/dev/${md}.eli bs=${secsize} count=1 status=none
17231437Sluigi
18231437Sluigi	# Copy first small sector to the second small sector.
19231437Sluigi	# This should be detected as corruption.
20231437Sluigi	atf_check dd if=backing_file of=sector bs=512 count=1 \
21231437Sluigi		conv=notrunc status=none
22231437Sluigi	atf_check dd if=sector of=backing_file bs=512 count=1 seek=1 \
23231437Sluigi		conv=notrunc status=none
24231437Sluigi
25231437Sluigi	atf_check -s not-exit:0 -e ignore \
26231437Sluigi		dd if=/dev/${md}.eli of=/dev/null bs=${secsize} count=1
27231437Sluigi
28231437Sluigi	# Fix the corruption
29231437Sluigi	atf_check dd if=rnd of=/dev/${md}.eli bs=${secsize} count=2 status=none
30231437Sluigi	atf_check dd if=/dev/${md}.eli of=/dev/null bs=${secsize} count=2 \
31231437Sluigi		status=none
32231437Sluigi
33231437Sluigi	# Copy first big sector to the second big sector.
34231437Sluigi	# This should be detected as corruption.
35231437Sluigi	ms=`diskinfo /dev/${md} | awk '{print $3 - 512}'`
36231437Sluigi	ns=`diskinfo /dev/${md}.eli | awk '{print $4}'`
37231437Sluigi	usecsize=`echo "($ms / $ns) - (($ms / $ns) % 512)" | bc`
38231437Sluigi	atf_check dd if=backing_file bs=512 count=$(( ${usecsize} / 512 )) \
39231437Sluigi		seek=$(( $secsize / 512 )) of=sector conv=notrunc status=none
40231437Sluigi	atf_check dd of=backing_file bs=512 count=$(( ${usecsize} / 512 )) \
41231437Sluigi		seek=$(( $secsize / 256 )) if=sector conv=notrunc status=none
42231437Sluigi	atf_check -s not-exit:0 -e ignore \
43231437Sluigi		dd if=/dev/${md}.eli of=/dev/null bs=${secsize} count=$ns
44231437Sluigi}
45231437Sluigi
46231437Sluigiatf_test_case copy cleanup
47231437Sluigicopy_head()
48231437Sluigi{
49231437Sluigi	atf_set "descr" "geli will detect misdirected writes as corruption"
50231437Sluigi	atf_set "require.user" "root"
51231437Sluigi	atf_set "timeout" 3600
52231437Sluigi}
53231437Sluigicopy_body()
54231437Sluigi{
55231437Sluigi	geli_test_setup
56231437Sluigi
57231437Sluigi	sectors=2
58231437Sluigi
59231437Sluigi	atf_check dd if=/dev/random of=keyfile bs=512 count=16 status=none
60231437Sluigi	dd if=/dev/random of=rnd bs=${MAX_SECSIZE} count=${sectors} status=none
61231437Sluigi
62231437Sluigi	for_each_geli_config copy_test backing_file
63231437Sluigi}
64231437Sluigicopy_cleanup()
65231437Sluigi{
66231437Sluigi	geli_test_cleanup
67231437Sluigi}
68231437Sluigi
69231437Sluigi
70231437Sluigidata_test() {
71231437Sluigi	cipher=$1
72231437Sluigi	aalgo=$2
73231437Sluigi	secsize=$3
74231437Sluigi	ealgo=${cipher%%:*}
75231437Sluigi	keylen=${cipher##*:}
76231437Sluigi
77231437Sluigi	atf_check -s exit:0 -e ignore \
78231437Sluigi		geli init -B none -a $aalgo -e $ealgo -l $keylen -P -K keyfile \
79231437Sluigi		-s $secsize ${md}
80231437Sluigi
81231437Sluigi	# Corrupt 8 bytes of data.
82231437Sluigi	atf_check dd if=/dev/${md} of=sector bs=512 count=1 status=none
83231437Sluigi	atf_check dd if=rnd of=sector bs=1 count=8 seek=64 conv=notrunc status=none
84231437Sluigi	atf_check dd if=sector of=/dev/${md} bs=512 count=1 status=none
85231437Sluigi	atf_check geli attach -p -k keyfile ${md}
86231437Sluigi
87231437Sluigi	# Try to read from the corrupt sector
88231437Sluigi	atf_check -s not-exit:0 -e ignore \
89231437Sluigi		dd if=/dev/${md}.eli of=/dev/null bs=${secsize} count=1
90231437Sluigi}
91231437Sluigi
92247880Sdelphijatf_test_case data cleanup
93231437Sluigidata_head()
94231437Sluigi{
95231437Sluigi	atf_set "descr" "With HMACs, geli will detect data corruption"
96231437Sluigi	atf_set "require.user" "root"
97231437Sluigi	atf_set "timeout" 1800
98231437Sluigi}
99231437Sluigidata_body()
100231437Sluigi{
101231437Sluigi	geli_test_setup
102231437Sluigi
103231437Sluigi	sectors=2
104231437Sluigi
105231437Sluigi	atf_check dd if=/dev/random of=keyfile bs=512 count=16 status=none
106252869Sdelphij	dd if=/dev/random of=rnd bs=${MAX_SECSIZE} count=${sectors} status=none
107231437Sluigi	for_each_geli_config data_test
108231437Sluigi}
109231437Sluigidata_cleanup()
110231437Sluigi{
111231437Sluigi	geli_test_cleanup
112231437Sluigi}
113231437Sluigi
114231437Sluigihmac_test() {
115231437Sluigi	cipher=$1
116231437Sluigi	aalgo=$2
117247880Sdelphij	secsize=$3
118247880Sdelphij	ealgo=${cipher%%:*}
119247880Sdelphij	keylen=${cipher##*:}
120247880Sdelphij
121247880Sdelphij	atf_check -s exit:0 -e ignore \
122247880Sdelphij		geli init -B none -a $aalgo -e $ealgo -l $keylen -P -K keyfile \
123247880Sdelphij		-s $secsize ${md}
124231437Sluigi
125231437Sluigi	# Corrupt 8 bytes of HMAC.
126231437Sluigi	atf_check dd if=/dev/${md} of=sector bs=512 count=1 status=none
127231437Sluigi	atf_check dd if=rnd of=sector bs=1 count=16 conv=notrunc status=none
128231437Sluigi	atf_check dd if=sector of=/dev/${md} bs=512 count=1 status=none
129231437Sluigi	atf_check geli attach -p -k keyfile ${md}
130231437Sluigi
131231437Sluigi	# Try to read from the corrupt sector
132231437Sluigi	atf_check -s not-exit:0 -e ignore \
133231437Sluigi		dd if=/dev/${md}.eli of=/dev/null bs=${secsize} count=1
134231437Sluigi}
135231437Sluigi
136231437Sluigiatf_test_case hmac cleanup
137231437Sluigihmac_head()
138231437Sluigi{
139231437Sluigi	atf_set "descr" "geli will detect corruption of HMACs"
140231437Sluigi	atf_set "require.user" "root"
141231437Sluigi	atf_set "timeout" 1800
142231437Sluigi}
143231437Sluigihmac_body()
144231437Sluigi{
145231437Sluigi	geli_test_setup
146231437Sluigi
147231437Sluigi	sectors=2
148231437Sluigi
149231437Sluigi	atf_check dd if=/dev/random of=keyfile bs=512 count=16 status=none
150231437Sluigi	dd if=/dev/random of=rnd bs=${MAX_SECSIZE} count=${sectors} status=none
151231437Sluigi	for_each_geli_config hmac_test
152231437Sluigi}
153231437Sluigihmac_cleanup()
154231437Sluigi{
155231437Sluigi	geli_test_cleanup
156231437Sluigi}
157231437Sluigi
158231437Sluigiatf_init_test_cases()
159231437Sluigi{
160231437Sluigi	atf_add_test_case copy
161231437Sluigi	atf_add_test_case data
162231437Sluigi	atf_add_test_case hmac
163231437Sluigi}
164231437Sluigi