aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEnji Cooper <ngie@FreeBSD.org>2017-01-12 07:26:39 +0000
committerEnji Cooper <ngie@FreeBSD.org>2017-01-12 07:26:39 +0000
commit20d24fbb933deae4ccdc875f54babfff8dace678 (patch)
tree086ca5a4b87d5f393d00711903b00279a7ec14e3
parent2254eda87e053e92fb9e0bd34a1fb5db0d9d7cd7 (diff)
downloadsrc-20d24fbb933deae4ccdc875f54babfff8dace678.tar.gz
src-20d24fbb933deae4ccdc875f54babfff8dace678.zip
Sync ^/vendor/NetBSD/tests/dist with upstream
Notes
Notes: svn path=/vendor/NetBSD/tests/dist/; revision=311966
-rw-r--r--crypto/libcrypto/rc4/Makefile3
-rwxr-xr-xcrypto/libcrypto/t_libcrypto.sh4
-rwxr-xr-xcrypto/libcrypto/t_pubkey.sh8
-rw-r--r--dev/Makefile4
-rw-r--r--dev/audio/h_pad.c10
-rw-r--r--dev/audio/t_pad_output.bz2.uue2069
-rw-r--r--dev/cgd/Makefile14
-rw-r--r--dev/cgd/t_cgd_3des.c913
-rw-r--r--dev/cgd/t_cgd_aes.c3606
-rw-r--r--dev/cgd/t_cgd_blowfish.c2341
-rwxr-xr-xfs/ffs/ffs_common.sh4
-rw-r--r--fs/fifofs/t_fifo.c3
-rw-r--r--fs/nfs/nfsservice/Makefile5
-rwxr-xr-xfs/psshfs/t_psshfs.sh23
-rw-r--r--fs/puffs/t_basic.c6
-rw-r--r--fs/vfs/Makefile7
-rw-r--r--fs/vfs/t_vnops.c100
-rw-r--r--h_macros.h4
-rw-r--r--kernel/Makefile14
-rw-r--r--kernel/msg.h136
-rw-r--r--kernel/t_mqueue.c3
-rw-r--r--kernel/t_ptrace.c208
-rw-r--r--kernel/t_ptrace_wait.c5082
-rw-r--r--kernel/t_ptrace_wait.h431
-rw-r--r--kernel/t_ptrace_wait3.c30
-rw-r--r--kernel/t_ptrace_wait4.c30
-rw-r--r--kernel/t_ptrace_wait6.c30
-rw-r--r--kernel/t_ptrace_waitid.c30
-rw-r--r--kernel/t_ptrace_waitpid.c30
-rw-r--r--lib/Makefile5
-rw-r--r--lib/libc/arch/sparc64/exec_prot_support.c7
-rw-r--r--lib/libc/arch/sparc64/return_one.S11
-rw-r--r--lib/libc/db/Makefile3
-rw-r--r--lib/libc/db/h_db.c61
-rwxr-xr-xlib/libc/db/t_db.sh301
-rw-r--r--lib/libc/gen/Makefile5
-rw-r--r--lib/libc/gen/t_fnmatch.c5
-rw-r--r--lib/libc/net/getaddrinfo/Makefile4
-rw-r--r--lib/libc/regex/Makefile4
-rw-r--r--lib/libc/rpc/t_rpc.c22
-rw-r--r--lib/libc/sync/cpp_atomic_ops_linkable.cc16
-rw-r--r--lib/libc/sys/Makefile5
-rw-r--r--lib/libc/sys/t_clock_nanosleep.c63
-rw-r--r--lib/libc/sys/t_wait_noproc.c340
-rw-r--r--lib/libc/sys/t_wait_noproc_wnohang.c30
-rw-r--r--lib/libm/Makefile7
-rw-r--r--lib/libm/t_ldexp.c12
-rw-r--r--lib/libm/t_precision.c8
-rw-r--r--lib/libpthread/Makefile3
-rw-r--r--lib/libpthread/h_common.h6
-rw-r--r--lib/libpthread/t_mutex.c194
-rw-r--r--lib/librumpclient/Makefile2
-rw-r--r--lib/librumpclient/h_execthr.c68
-rwxr-xr-xlib/librumphijack/t_tcpip.sh7
-rw-r--r--lib/libusbhid/t_usbhid.c7
-rw-r--r--net/Makefile4
-rw-r--r--net/arp/Makefile8
-rwxr-xr-xnet/arp/t_arp.sh127
-rwxr-xr-xnet/arp/t_dad.sh100
-rw-r--r--net/icmp/Makefile7
-rwxr-xr-xnet/icmp/t_icmp6_redirect.sh65
-rwxr-xr-xnet/icmp/t_icmp_redirect.sh100
-rw-r--r--net/if/t_compat.c4
-rwxr-xr-xnet/if/t_ifconfig.sh22
-rw-r--r--net/if_bridge/Makefile7
-rwxr-xr-xnet/if_bridge/t_bridge.sh103
-rw-r--r--net/if_gif/Makefile7
-rwxr-xr-xnet/if_gif/t_gif.sh35
-rw-r--r--net/if_pppoe/Makefile7
-rwxr-xr-xnet/if_pppoe/t_pppoe.sh265
-rw-r--r--net/if_tap/Makefile7
-rwxr-xr-xnet/if_tap/t_tap.sh50
-rw-r--r--net/mcast/Makefile7
-rwxr-xr-xnet/mcast/t_mcast.sh18
-rw-r--r--net/ndp/Makefile9
-rwxr-xr-xnet/ndp/t_dad.sh156
-rwxr-xr-xnet/ndp/t_ndp.sh100
-rwxr-xr-xnet/ndp/t_ra.sh607
-rw-r--r--net/net/Makefile12
-rwxr-xr-xnet/net/t_forwarding.sh125
-rwxr-xr-xnet/net/t_ipaddress.sh129
-rwxr-xr-xnet/net/t_ipv6_lifetime.sh48
-rwxr-xr-xnet/net/t_ipv6address.sh103
-rwxr-xr-xnet/net/t_mtudisc.sh192
-rwxr-xr-xnet/net/t_mtudisc6.sh179
-rwxr-xr-xnet/net/t_ping6_opts.sh380
-rwxr-xr-xnet/net_common.sh314
-rw-r--r--net/route/Makefile8
-rwxr-xr-xnet/route/t_change.sh4
-rwxr-xr-xnet/route/t_flags.sh116
-rwxr-xr-xnet/route/t_flags6.sh88
-rwxr-xr-xnet/route/t_route.sh78
-rw-r--r--rump/modautoload/Makefile6
-rw-r--r--rump/modautoload/t_modautoload.c3
-rw-r--r--rump/rumpkern/t_lwproc.c3
-rw-r--r--sys/net/t_print.c14
-rw-r--r--usr.bin/Makefile6
-rwxr-xr-xusr.bin/config/t_config.sh62
-rwxr-xr-xusr.bin/netpgpverify/t_netpgpverify.sh536
-rw-r--r--usr.bin/xlint/lint1/Makefile4
-rw-r--r--usr.bin/xlint/lint1/d_c99_anon_union.c16
-rw-r--r--usr.bin/xlint/lint1/d_c99_union_cast.c18
102 files changed, 18017 insertions, 2586 deletions
diff --git a/crypto/libcrypto/rc4/Makefile b/crypto/libcrypto/rc4/Makefile
index c4ade83d6e5d..db156a9461c5 100644
--- a/crypto/libcrypto/rc4/Makefile
+++ b/crypto/libcrypto/rc4/Makefile
@@ -1,6 +1,7 @@
-# $NetBSD: Makefile,v 1.1 2009/02/13 20:58:15 jmmv Exp $
+# $NetBSD: Makefile,v 1.2 2016/10/14 16:09:45 spz Exp $
HELPER_NAME= rc4test
HELPER_DIR= rc4
+CPPFLAGS= -DOPENSSL_PIC
.include <bsd.init.mk>
diff --git a/crypto/libcrypto/t_libcrypto.sh b/crypto/libcrypto/t_libcrypto.sh
index aa7af27ceee4..f460cf58241b 100755
--- a/crypto/libcrypto/t_libcrypto.sh
+++ b/crypto/libcrypto/t_libcrypto.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_libcrypto.sh,v 1.3 2010/11/08 19:06:12 pooka Exp $
+# $NetBSD: t_libcrypto.sh,v 1.4 2016/10/13 09:25:37 martin Exp $
#
# Copyright (c) 2008, 2009, 2010 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -49,7 +49,7 @@ atf_test_case bn
bn_head()
{
atf_set "descr" "Checks BIGNUM library"
- atf_set "timeout" "300"
+ atf_set "timeout" "360"
}
bn_body()
{
diff --git a/crypto/libcrypto/t_pubkey.sh b/crypto/libcrypto/t_pubkey.sh
index 1453e757a4cc..eb8d0f5b6d2a 100755
--- a/crypto/libcrypto/t_pubkey.sh
+++ b/crypto/libcrypto/t_pubkey.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_pubkey.sh,v 1.3 2011/06/09 05:25:21 spz Exp $
+# $NetBSD: t_pubkey.sh,v 1.4 2016/10/13 09:25:37 martin Exp $
#
# Copyright (c) 2008, 2009, 2010 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -49,7 +49,7 @@ atf_test_case rsa
rsa_head()
{
atf_set "descr" "Checks RSA"
- atf_set "timeout" "300"
+ atf_set "timeout" "420"
}
rsa_body()
{
@@ -60,7 +60,7 @@ atf_test_case ec
ec_head()
{
atf_set "descr" "Checks EC cipher"
- atf_set "timeout" "300"
+ atf_set "timeout" "480"
}
ec_body()
{
@@ -81,7 +81,7 @@ atf_test_case ecdsa
ecdsa_head()
{
atf_set "descr" "Checks ECDSA algorithm"
- atf_set "timeout" "300"
+ atf_set "timeout" "480"
}
ecdsa_body()
{
diff --git a/dev/Makefile b/dev/Makefile
index e255e24dd44e..4d774d422d96 100644
--- a/dev/Makefile
+++ b/dev/Makefile
@@ -1,11 +1,11 @@
-# $NetBSD: Makefile,v 1.11 2016/07/29 06:13:39 pgoyette Exp $
+# $NetBSD: Makefile,v 1.12 2016/08/14 14:55:42 jakllsch Exp $
#
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/dev
-TESTS_SUBDIRS+= cgd fss raidframe
+TESTS_SUBDIRS+= cgd clock_subr fss raidframe
.if (${MKRUMP} != "no") && !defined(BSD_MK_COMPAT_FILE)
TESTS_SUBDIRS+= audio md scsipi sysmon usb
.endif
diff --git a/dev/audio/h_pad.c b/dev/audio/h_pad.c
index dd481ac1a85c..b760d047c366 100644
--- a/dev/audio/h_pad.c
+++ b/dev/audio/h_pad.c
@@ -1,4 +1,4 @@
-/* $NetBSD: h_pad.c,v 1.1 2010/08/04 13:15:15 pooka Exp $ */
+/* $NetBSD: h_pad.c,v 1.2 2016/10/15 07:08:06 nat Exp $ */
/*
* Copyright (c) 2010 Antti Kantee. All Rights Reserved.
@@ -56,14 +56,14 @@ main(int argc, char *argv[])
ssize_t n;
rump_init();
- audiofd = rump_sys_open("/dev/audio0", O_RDWR);
- if (audiofd == -1)
- err(1, "open audio");
-
padfd = rump_sys_open("/dev/pad0", O_RDONLY);
if (padfd == -1)
err(1, "open pad");
+ audiofd = rump_sys_open("/dev/audio0", O_RDWR);
+ if (audiofd == -1)
+ err(1, "open audio");
+
if ((n = rump_sys_write(audiofd, musa, sizeof(musa))) != sizeof(musa))
err(1, "write");
diff --git a/dev/audio/t_pad_output.bz2.uue b/dev/audio/t_pad_output.bz2.uue
index e0cbf5226c24..969ad9c88a25 100644
--- a/dev/audio/t_pad_output.bz2.uue
+++ b/dev/audio/t_pad_output.bz2.uue
@@ -1,1035 +1,1040 @@
begin 644 t_pad_output.bz2
-M0EIH.3%!629369%IQ#X`<IM_____________________________________
-M________X)OO)A21(@B``4"A15``"A2!1E]V5*%%*`!0JJ7"HT*HVT6^LZTT
-M13<F#E#=<'#>MT#FU'+1O7<;MT;NYNNYW<[N[OO;K>W7+>^Y[M;[LV]??=M]
-MYZ[MMMO>WO;6=W.KIOKNUF:EFEJVK5I"+:J;8:B5K1JJIJVUJV,K6IK5MJJ6
-M--%5FJLS55K158M5K:U5FU4RVMJ(K0BK-6Q0-L+6JVLJ6MK559M5556*M54J
-MJMIMFS-"U6LJRUBRJJRV;55::M6U[G=0JI5-4W66J=KVZ]LNW=]W=FW=S;YM
-MDO<]LW>Z[WW%E@WUOD-[G!SN<'=W$CD8@[K<FVD6>N<36:PVO=W;*I*E%4SC
-MV]XE)5!54*"@*JJMH)J0H*`4&V4`!11(``!4BJI27O>Z(]5()`22)**%4``I
-M0`!*B5`D(DB*5@:5``AH`"8F3"8`F0#3(Q,FF@#1H&(&C)H-#3330!ID,C`C
-M!-,F)IIA`TQ-,!,33$831@@R9&$T`!,`@TD@FC$``````&@```:-`3`F$P0T
-M,$!@`$``#03T!H-`U,`33$TTQJ-,$P$P%/$R8",!-02FDI"!$QJ>S,`0`$!H
-M:!#":$Q-,28$V@0-`34]$:;*:>D]1I[0H'HGDRC:AD&@]0&@/4`]0R`R,AH-
-M!H`VHS2`:`(4E)*)&R>J-^GBGL!2,:::2;48GI$IO%)Y)Y)[3TE/U1^FFC*C
-MQ&H>IZC$T,AIZAZF31H>4``'J!DTTT---```#U```-`9#0T``T!(I((28-)B
-M>A3TTF>14]3VT&IJ>R,@F$TQ'DT3&@FU3\4GFDT>J>333&IBFTPF$T]$-,32
-MGM-4]IDTR)ZI^1I3V332;(93-4_5/R>D#":GDU-D:FIZ>IM3U-HTH)-25)%1
-MM3:3]L/-2$FWD4S4U-B:::FB;4V3"4_4R4>H>U0;4]JGJ&33T]4T`#(T-&0]
-M0!HT-`_5`!Z@T````9!IH:```````_Q$/Z:,D&8X$&L.'B.D00+!M12TQ2">
-MGH4)$$U776'(,NA5T"`@H&+#%`;<'^;2<4$`CK#I>?6\SY]KTOQX,LDD%=#]
-M=K=W[.S5.*PD:9EE+#8V,8RRL@"_3]+%\'Y\OE<[XY25)9,&QL(&#!(B3@T.
-MCTYNF5=LVA0D0'QD+"T]J]AX/R0)P"P$\13QX$Q,/GR(O5_U5.R7J.DE`0K(
-MEC0PL$_ONQ0)A@@60_";^_OE&;Q_:\_3BPGL8?\=O:KUNG!-MF0A03X9PPMX
-MF'WE;&SK)O(N2J"`80_J9Y6*=6(?DZ7*_=I%;(JB,Q$/X5S@P$*M6IZ6$>F.
-M&L;Y&C($S\KC'O`Q#')%M:;\FTP-4ET5[;UV7JU<$0D7*H[&KC\]MFO+$`\&
-MK%L^,?8,8N-=10VF1`%ZT<0V#-6C#OCSQ<+:D1!\*'M+14@>!P\/!T&+LDA`
-MM>S!`Y))"PU-A7RRF1#XLD2TAAXFXPES0HB!="\G,MI5;+<6\:#8!?:^9F[%
-ME',L8MFO;T)7.GR!;_`/D0:1+;UF7Y[3=J&V"``O/U.NE!"#*9$.X86#N,8I
-M`#2>Y2VR.+WM3?[`$7UIE`R.12-/ADE3=;A$1!:]O_:**7`0NS1[]JFWB&;,
-M9H]?3J1$29(D`##!T*ZI]K?Y2?W`!+<"-:V[)FM&)64CY`27=R&1(43Q0:.3
-M57.RL\G5'0B!%DUBC6R2:/8GH36'00V/_3FF$$BHG7;+O%I3X!8&S2LK'/>1
-M8OS=Z#;4Y$43X>>W=G@!;JCZJXZ+CG@"_SV[O7ZI=P8DJ:+_5D',I4)`;G=/
-M'LMX@K6`@UZ4;>CQD0!>G1L^>LPH@:>W<=.CS^7@)?+I``+POTESZ]3/ZA2!
-M75?3@*BYG9V,AZN4Q4&IJ@(<=6[N*2:B4T<QKI#O,ZO-HP0'U-93XT^"A:<5
-MT6-2(HM3`Y[CJ.+14K[U\5;*A$78H:]/`WME:,[SII]<4D!%9=VZ6J(N'#C<
-MKS'M=:II1G0(2!?].M0MLAD.O>)ITB]VC:@%[*8[4SK5EZR_]5WDD@B*BP]Z
-MM&`(P"9NX?<(%_4:IX/(`!5M=`Y*J0ALV/=9UEH,?/)])PN4S.3Q*JX(OE@.
-M2:Z?"+C-^RQK#(AH^YZF'"(N4H(.K.`QOV&@=HI"`,-P0@1,W5)#ZE916Z/V
-MDMCV8^`4YS\-7R*L!D&Y@OT/@[O\HB+8?+K:EP*>6KQIHI#9&]*\I@AOG`B[
-ME!(1^\3.":<CW*ZM?*Q*Q`M9(]AW:5CCD*E1DZ>TV[8($^"X\PV,D"7'@5IA
-M_&HS5?4^K5(@17-'D>"%FJ8^%HE-%-GP07=Y"M@$+JL?O=<_H_;+X"$$)/+$
-M(#&Y%>VSVDIS6@!!PH[W&3U(!SXV;RV<\".VZ\"A!%NDZM&LY*JMTR0+GH5%
-M-UD0(OWQ1PM=G=;!V2D>(AEP2@)MH6&EBU77QS:R7B0`5P)?N)=]4'"%!``L
-M6>;IEY>3]?^J#F8Y((@VJ'9(3=(Y;EL/U*W3_M""&*6LOPA)`2G2\;XHZ?,1
-MN@9?--I!`7BU)`)6&?V2\RV=GPPO_+AI`13_]&!9NI8WF&D8=EAD>=1@A]-M
-M2*,@.#^UP_^]`1,'Y@7\>&O=GPWW86]K`46*"9"107H9R&2FIS4QC(C9?S9E
-M0`/+,`K\G03>F3F0D&K]O^I"WC##9]90$6;P/K*\,L":#V^TRY\OGS?!Z.>D
-M($R4A>S*K^+BN!7^#D(`!):^.YO0(#Y_7L:3*O#7:[G5>S#2DD#:[ZDW8'GX
-M2)284[['@*/]+TCLR$C2\R=8*W5,5CI?!P%6`2B(:+04!>;6K6S6]]<H]_T8
-M'])`!/+^!Q/?6.L&C>(_;T]*B(`QH.-:D+F0Y<GK\<MQTJ@(NSSWHBDECQC7
-M\U6/P<R$`(2A!FBDZ2;7S&G.#H;S]]![200F8L$DO:GRND<"7MTP&@)`%8+]
-M]<H'.S@##D@`'KUN8M0/S1,/-<R?^,>(DOX[O8A^D&ZOMFWV'@4'P8^/`G6'
-M4MT7D&'K95`"'TM;8HC'LCRM8)T%MM8^D+N/=;2(V#3NCX`4ISMR_2ZY!(<<
-MOD<CL)<\5UVP2KOK)#O8?R:KPK=M2)!`<WFX+>MH/*.`-_8\FLT9T`6L6N;B
-ML+\].#\V8R;3BE920@#2V<!/@EWP:5@-=/0[_U2=-[40`S?H?N7RB%;"I]KD
-M-'*\CP14VB`'5!,B+)?#\X;3>1+PA(E.R3ONAYKUN//A^GSGB+*OAX\D`:G4
-M:N6A>'`4Q\%%^V;+*\"K@=4D2`OFKMZ-$0*_[`*>S-)N7WOTB9UK:P8!A_-*
-M!#IK6Q(LWF_4F>(UJO>>(9:Z7`0D,+EMF0/N3>?#*1()V)O8Z86&8^!<<S?9
-MV-!#!I?WS=C*.^]M["(8[.I2@7>^ZRS=X!-^V>ZVP;`ZT!\%Z,_M4O]>(!*Q
-M%78V.MY[<?!&R'\W%!";Z).'0,EXHGP@AOI>N[_RBAL(JLA?)W_"-+S/ZED0
-M;/3I;2@T6N\'?(;S])2EU,C6-+$@`&SZ+)688"[5QVM98;-GB%YN\`AY&9IE
-MW6!=**T2J@+$5]."ANQ]8K\>S;J0'=Q541?&&5H]>H.:O/8H/BC(H+5TL-!%
-MC&+N0$H<`3/0LN='R;P@R<.!'<-C*;7FPP#W3-<!"<*VU@/@"R^%V`,2`C0M
-M<[CZSS8'P0@F+N6%N0@O7^_#$V$K\#Y:_8@6+=(6^T.%JL]J>Z"8=_X,P_=A
-MXHKO&(2"G=D,QU$C((T6%6GP&!#S"XF5-4V6YAT`'5EB!2_H5<S!6VSSJ4DH
-M2&55(%+Z8*<:C36G8KKWP/D+,%[:GB]%5Q_.4YOQPAA$1:P!;6N@[QYP8J&L
-M`7F,-$$P&O=5:@6!LB4^CW/&0_GH.-/QFH&=/@5]I$\8`<3]>R+\+"TB'N$`
-M+T%X4&3]-]G#I0>*@2%GIH<DS;8TZ`,SUUGE@7"K"^(WP2&)^#.@SM/.-LYH
-M50@)_':RR3$3A7+=[&JUS1-*F0]7FI,B0#+L?EQ._.2&EP?/2I:00FV[@$0A
-M.*;AY"`6%?2Q/BSU56-J,BD+2#GP775X%-,NR-RM9U?0D+8`(%7!F[PVZV>7
-MSW9O]0D`OIGB+^\1)&P36=Y]RD/%JD1%"5@`[_O_LUM7*JV1\K6;+I3/![/Q
-M.#`S2;N_U[:(B>+8XRN,SF.'J%WW8:0"&DUMP7<C>D:"XONX&O-1"LFTT^RG
-MR+S^5?!8/;3Y9K[##DDM+1(B+E*B/MD%:Y4H%W4-P>!,]+^'3!:;H\PZRRFC
-M,*N]1$`Y3OHLIC/@I?18G7MEW5J04*WZE9NVEJCX]O3A@!"*.^XTQR#K_H+B
-MK`_GST-]:GHOXGP6;!7_\>WC/V4[-<>[Y"(A'>SUX`+BNS=W40.$/SF;@#%7
-M/G9ZN`.E)(9E.O"`OX'_/=0TANWS\@%ZGZ"Q`@[-KB[#G4C"?(+B9O2!?3V?
-MU(RWC7&#H]VG6T@"3_+P0#-+4"/+:-K195`'/]=0!>5EY/E\%"0EO%WYN;I\
-M,!92L^L[-@(=H^*F`-%2<NZEB&1F/C\T$JD_D^6%<V9$.]\[G[?P9SX'GV5^
-M,(NX=2`'9'5X2ME6F9SL"*!$0TU6`7PTWM43<ME'QBG+SQT\R1>+>M'^T?2W
-M'C:U,<Z;(8:YW.JT*.)4=93(3]2M_,U\1+5KF=GU(;HIFB54)$BR>6=Z7MD-
-M!S,3Y&RP>BX!RT^M!(O4_R)^"A]\?+TU4;M'@"5;;:ZIS@]DEP@`GW#)=.K]
-MO\7W&3'^J?:TH`>FSXA%M?%/2O67]%.K"6EKOD22)U:K(B<XN>^/<O]"HGRU
-M=1G0!BL2>TNND%OAGR,>$A17>EHS;U89'SEZ,TK*[C@G2H>W_/QJP2&S5GGO
-MJE2]X=O]U=K22`\/)G.A*\;1D5Y8TB9-1"S]]V@!)?#_OC6ZNP(-L@?M71N)
-MF5SY`+]]\X//8((6RI`6'=Q<E;-&T9U!02033.8U3B>>`,79HH,_*7BDQ5B$
-MF#C;\$,9E\_=O%KQ8180+*XJ:0$1[TM:]]/]?3>UY$I,\SDOR,#I1E=JFS"!
-M)D6KO$6H8D4OU,[!)!$>B\C[>U3$!Z^KJW(<\.5K:U&!G41!!%$5_Y/6QC<L
-M&&>+5MNVCN4"&]Z]DJ<WB:O&S"`?1]Q4Q9D4Q[^2JY+.G1S&7[J8(,^[JG+N
-M[C*+KV@(??>O`(9_'6]7?*ZF8/$&+R1H`D$,1>.+._G@W*)DDB;]VG`*5YF7
-MWD]IU[X\&5T,-")):A_]LR"]=;MJN5!LX6;D=]@@KQ`@^-G`>;-=H$6+3?0;
-MYG3YLP?<=K)H?)5`"JW_5R6!`Q9OZ8Z#_17<BY98V5E\T^1C@6Q[&6U$Q9:9
-MK[7?NG'$22+63?0X&UV%F`(+]O/YV.Z[)XGX$)F*O6R;%@K>/+4<,$0*_:]M
-M['1B(#.(QC+-;7CH'N\LREOH(>W0-/OY\=&_S[F9)"7_77XA@06;X>OJ&IOK
-M]_"/D$]\6"(#S']/.AK:OAKS"CC7-%WN:`*S+_$Q\,^Z5>:9-EA;.ZD`(GSF
-MIQ:L*`\3U-]F](KQ2F<&;.+!Y/Y?&`$JI5%RF94'0/-]9,`:CO;'C<7'S6Y/
-MC(IK?C@3Z*)/UJ'6-^%6!`"074SY(^7^GX$0[^K\-)/;:';#_=4R9TB+O0^G
-M[]]7D3#&W$Q$WJ'_>WZV-KK`!WGEP^O)3UHKSY6'>%*ZJN$_$'M<RW'N3@VG
-MC_>>40"Y'4TKT[6!UHFC)`&?/)6ALNE4_=YKB+#=*OU0?%/4DSB6RY5I(*1T
-MBS_(D<8`16E0,O"KK9W:_/'P9`7LW2]VZ=L6P&CX1W4GLP1+"_P[R>#N[U"/
-M6WJ(6I\<?P_[X?6R!#(LG/STLX<^7MD`NK*!S0`\N8DE:_:=6>K#MUC,*=$&
-M1:KI+^\1_-\P/5`$`\H[779:X^25NX"RC<8`-!NW(+E)7#8<-$0NNC.=8%;Y
-M""W5''H1A\USP=7IXRZHLP`5SU[KII-+72^YR&2"Z82`/&[YW!C^'UK5S(MO
-MW&B.-PG"G%8BH=8XL2#/=7#/E$X>/AR(5Z^AT]%#>CG.$(E5&]2?[<@D>*0/
-MLZ<&PTK&10ST<\S7A0!X<3B>_3^EJE_\RHP"TFVYCEX^77UK9&C9T20A*]99
-M7K6E``:<-TKEE8"N>WK92J@43N+VH+CGZ#],-YHU(37CX]<0)-RJOCFS%/><
-MAQN%3[ZBT6R(:O24[5N6@(0PW=6K8XBYT._;F*0;7N`AGO:TU&>^N%)?1CJ+
-MGA$!F<DBZRR@+A?1R45Q`-D'C;CU._QU\Y_L3J>/HR`O_,-OQ]:S+*EE+7F;
-M)8:Y8$Z23!0[=.AU<55;Y+G00EZ:%X+;4.QH1$7K^V(=S>;QJF5!%*(66:M6
-M[]<2>?+NA5:@B'.L/3K<LY,LFX^[PSH!:J[>#D=IF8CCD"I:=]2]C(V:VB`Z
-MOS\_5M\P`2K/>9)C:<PLX]54P&;1?=&O((:!0M#[J_P6J;EY#BS`%!%]#O=#
-MJ<P^0+4\R!M:CJJX/`W&=%K'L95T@'CGU'+/W)&/M#$JGRCN6]_XTD0K4JSN
-MCTJK)%50IA1I&(%\>#G,^D1A32(@7>9.&JW(0D0'@NOJ*)ZVW.3&/<M?A@U)
-M)3;K%=N-RPD3AVEX'E0QL(X#:*O;P63.>)46P09QKXZA5D`53`!D=\)LX*R1
-M!$VM(PTC]$J02F,8P,".;C\K*?9X_7%;MH6>P6<2HYV8U=JFL3)L0P;&-M=6
-MQ"QWM=K46:O@8B=]_\<9C+E\'NRM?3;$*AU\"9&FVFFQH!@"],<7:RQP[:(X
-M(.&1#:N&(>`2H-SY3E0:Q```RU<;/1R="%-3!('Y%^`@'U3/^:?U'4DDD^2K
-M_QSJ>F@<3(!_<D\LKFH(Y-$6D@X(T(H!0B$UDK38+]F,CAWJHEZ?5`GCKH+4
-M`+/;,#O&C)0JD<)S8TE?Z%?S+H'?'7R+RR)GCF_;C-"$B<'F6EZCQ)F6HN$0
-M(0$=UD75WP*Q0XM>5_39XX%+[S0)3Q!$2G$(CR,W5,0ALWVR5@^PNW\Z?G("
-M`E5V)'F?/MYL@H'05?I>U/0;5$JNX(9@PLAMWF/]5Y=G2)KZA/W]\6KGP7TW
-M=W;`93G$(W[@4<N?D]^`\1>7APG.]9PXDV619K+/GQ=Y"H#*8MA2K<.U0:]J
-M:[P_S0(`0S@3L$R/6W=-GT;+A'"+='OL8`Z36_XSN)T+M;(@*I\0Q$P[W.QU
-M75`U^S3T[*WDD"J.S-BXH)4"-NVA`QPE7A^H`7^G#K^Y#]GW<Z0-U'L9XQBX
-M/G,0/2L<L65+0XI"0#1\P,&*RMK](;[L)G0$!<XWS*K9:XI`0B&#2;!.WF&4
-M5])X>?Z@6;MLN!LH;Y8V[TBAUSY!77`-3DZ).?CA%NN(3U]N[8L)PO7=2[[?
-MK?+IP4G)+./7E[L39T%%XY?YT$-0U[8TLY4Z3UDGQ6P.(=`BEAE9/#\#15F/
-M`>_ME9OM"".@E3DR84IGAU)L@Y9W1:M_[OX_)?[G)6:Y=`;!--*(GTMVGOC@
-M"M.:85V$\*TYC78\0T]2+KO*6=_-F75H3!"RI[5E%MF-L:((=8,M2&70#ZW-
-M$O9J/0@H[BV!#T_DCO-3-M>J1$32[58X'"UIXHV&4I<18I##UHY6XXEJN&P/
-M[+_)I,DH:BVYVQQZ_O,X=!-]/8)XA,][37V[KG"[%TA.S(Y(\1:.1<'+8>P!
-MTC2B]U(SYL#9%1^*\-#T-R]I/8`]M.T2RK3'>,$!HM`\3#=>9@\`-?GY`S\]
-M'^7GF;T%I/11:4V6BU8@[1!]C9"PV\A^?P9`WL8!?79D"YCUK:`64G<=<^![
-MM#C.5F/_>8BBW!5>]G?,QPK`MOE8>+$X\S@'%B3EB66;K,\3Q-+A\#<Z_]4Y
-ML1N7V49^0.F=[,3)9XT"X3)P@7VF]AA.D-LN2^T:$@S7`LX'IFB]6EG1Z%CE
-MW1LA'="6']C_L:&OVUTPF`/LW=;J@6JVKFAQ6C5C(>=1PS8&'6ONW(<G':I7
-M4D!684-YQ?:#(?'R_;D[E!BL8!V>L^Y$^,ALR-E)'%'RR'Z;,8\@125W#0>(
-M(#Y96:QO(.%EGH"N6U!T\/&,'04QB=/WB-#*@D^2;)<3QA^2D?DHA$Z%2-6M
-M55_<:_/.C6[D.'%]GX_2?C`.K";8T6'&:5+CS0_F4Z)>K:&\@;TVTVP'I=^:
-MY=HX3U'3"E-E/-<7;]7*'2RO(T-)_@5+]/#*EW,7;/R1#'2:/\X@06H4X2+?
-M`);^=S>ZPX(A-FAP#!KYMMM\W+;4D_I/>>`'+KI;G\$G;W7IKB3!)@6L?=9B
-M8*,D]4:LO-(+-(:$GC_"'/22E/38XZ!EYB]IL#7&,F0SV+_9H#_L$NH_NN$;
-M`YY;>`WRW)2(R_EGS0Y>4R/2%0UT!H>XOSJ#,5UEL#1:S819LJ2Y9YXR$;:*
-M+2R9H5&H;4'TW\@&]O?C08ZIYG"M.?O$WF_L;$_+KZ/I@,;.8VO8-DAQLE_@
-M*F+&8>S(8K^[BR.2[.:J/%0B[B^IOZ/H"=7ELT(5Z3P-M%;0Y0'"PW0%B^-L
-M^CHCB]9>CRF/0VMBJ084\S(]"?`EVGY&D]WJF)<7_849]9\T%NQU1^_WH&,_
-M5^:^K6L2FR(J\PH/W*3)P.C^9'<E3"M<*&0(L5OJVLECG+H@(#YIZNJ\P9[V
-MF=UY$X,?HBX=L.%>,6$)OO<O5&R#@KE37#!RS8Q'H%[O5-YI;.3KW#X(I-%L
-MS0#!/+'-`\_Q59XQ*%-K?WN%>0-%D1.;GY>Z%(/[H^5!\IJCTY>TVV!=^XZ]
-M/D?;R_(6)'WW?`>S2].TI:(%$?*%L3XD%Z`_[1*CVU3[S"EBV,S3O&V(D7C?
-M<Y`<@ZXQ0*%Y]6:%E+1NJ_I,<(S?;&\C+D.[JO)%31QN"CN\SDOJ6EV$(:JK
-MLF;C5N0(2=G\:69VYTI$%X)]Z_[?[!+N\,*-:9B/#.F,AN2&6EI#L.+IK#PS
-MES5?G>CX7#((<L-E^36.22W"&6%![_GX0+/)M@'@M:6Y-I5%:`9JR^'.`]+I
-M[M;OSA+FU_*];@-T>A-/5OOM."4.=)P3%-$'!ZQ;SBG8+&8(;Y]WO/QB!8>_
-M1`09PN#_L;#77^>^Z%CSS_RF*D%4_LM6Y\0W(7R&+SJ10?Z[!0X^R(2VMM<7
-MZ#@QIZ_ML697.F[D/>_WWC^,Z;,J'`[$<)J(QAJ.R^W['JQ@*YSF!LV#'(0G
-MINP0WMHSPE6@)+;2#N0I#RQP\XZOY8'[VWX$,"E;-W,?+W,3.!;[=@838['X
-MN'5^;;`/^,,G%+:5H+V&^EX>L`)7RZ=4\T.LI[4M4,2"M_G>?%I`_EHW'7=U
-M+'\NP(?YXV&)GD&EZ'@@71ZH48<^!BD^E^U2EAOE3@"A4:9C6">_N/?-+AH:
-MV$R>6I6S($%7H_C2_"R$&>,CKU`#E3X^\=.6!@_1^I.?=:Q_$04>S+1J?7[P
-MOT8K<\G7.YV1#<?7<[WV.+S.6:92!@SJ=-&X#-CB",TO[I$AGZK=S`)V;:V`
-M^)TX@VF6S(V3(R9[Q@?H]7*+0H,RN:\#%PD-3J6T0\+<D+P\<3/]';Z11J.!
-M;?(ZS\^PD)==V?U_XHH]<;:53MHPM-UW\Y!&3&ECK5_Y8>T(@W_3_Y[^,B6:
-MEF)6-335TB(-Y'S(@B&TWK?H@"KS3:49A_AC%$T#$SB3$_&C7A%PGX%@U%E#
-MH3OAQ,#V+C%%TJMF6WRU[G>I.+H?NE^<7ZO7[4$JNYWJ7W[J"60W_3]NLWF+
-MRZ7*TDY,V)/9C`GOL=[=+.]8$$0`E5TIH!H:),G*`Y\F'SZ6&"/IHYD84M7-
-MB@SK9"-\W8^A%&3A-<X6"P'=;;J;@)G68>3T0L_8UBV<SU"=V-TF+0U<Z?F*
-MF],]_QM/Q,5>6.(/_'+6Y_4<_W0:X/95G9K<NP"#Q?H\'R+Y;K&C(2GS-[18
-M4:AS[O@/D-0NS7`."=A&P^APVYIDDQ[#\49Y]8R1)+IAZ6H*Z0YSJV&T\I-'
-M5+K<&=8[PONB/%@"+F&NKW?0.'/FJTP0,55<J?$N%RQ,'6.&"J`:*(?3P-UU
-M\AX3T+INHB.C>[]6,VW;)RW[BL&"4QI*+FQIL3-;]0MTG<?/R!^_S84CE1CG
-M?QGIAK^9P"O;,SH]&#UY7$>,P&5];4I-/<#MZ[$G6F\QXH3/S1?6PP?`?+Q$
-M]R*YE='TQ>X[,Z+H34N>&#L0FK==ON$!U>%8>&^_LQ7N:&03DMT_&/"P<QNW
-M(P\[9WRC-W%"H8XP\7N](H_4U1V1(?7'B]7=_T<G[K!@F_>/5EL4ZUQPD"B_
-M&<%C2OQET?ZHSC`WFH*3S?D6R3B,6V'?[-W>B$Q@W>M,_N;\<`M2)=NG;C07
-M>9]X%OU`=]09"9P(UX,A^TM<,V7&O82A?MG/#`EKFD#9CS(HRZ_O6S(@.2:6
-M92'[SCA]-D@A0XX!P&6[(P'*M+1[4=/><0R]>^8MH)B>5ZXD?R9(8"OG#+]/
-MXU#^`[.XMGMC-!X*,,;J-L\ZJ[9JT&"-'.[P5%`A]1L53J-Z8O^1B&F(?/F?
-MEZ6-.7H;)E,M&+ISG+`U?ZT)VCVXY'G]3\C'Y&&]UV(.<P$OFSN?\P4,!6-/
-M7B$4C@?>+R!'\3#[M"',]^NSG/W!-`R+(=B;KN?>=B0!7YM]TGPN?R]6>&E?
-M2\]9^5R5!!-?`^Q<C9C814H>G\F?HCEEH)^F(2RF_6)I0OS;,8,&8'4?ISN>
-M4>5)YWW/\][[2T/#PW\^+!DC(RF'_+C\3NG0WN\FGH(:C?6_:G#U_-QO`]/L
-MS0O9V;_2/OARD3*]*Q#?(@?&GTWP$_1TUJX%51#[8U%HU5L747&5+ST6H,!2
-M$X;-DZ;MV/:X!CJ#M-XM6U<O7#MP;A"<?2E7N$BT=;&&M?GQ>]D;/`Z@0PP%
-MF8::)8Q5B+;K[!7`E<!J]L=H?,*%VS[O]QL\^/9V!Q=C4/+$9R_=]$*)GD%8
-MVEL:C<S[:<-YF;U`=M?TJ70F0^C0F,7&UVSS<AA8-U&%P[*<SLJ51T,.5$-2
-MYL=HM!::BD.PM]@^GL8R!]42`O1EX_0.N._06O"WWP,\=POAD#[8JFQ4[Y#/
-MR?("[$';1VNP7*V6>GD7FR+Y68,^N&P?O`G.GY'PAY'?!EACMOFL9%XRW$LB
-M2'AGMOZ+&XPU;+URN9\?W'D-6+ZHR5Y\[7_/)CNNL@J\UM&A5Q%+NN]]&.=%
-M$U4\8`_>`>'`,HH/SN[`*'XE]#\?44AD&_N:@Q(@E("%]S%59Y!(SB/1:].4
-MW5K]Z+_CFN-\O"ZRF5<<61,*,QBB<Y[]]R)4Z6X<LU@$(@\<0/0JG@,,<70_
-MKO/#O3Z(*!,57PEZH">QXIKL0[ZB\?,S(&W)JZN4#'B-$WN"P)EZU%:7!\\_
-MG(CG+4Z09+L97)['"&1WNL:^#0DW7G*"RRF!3,OP,:)>2;LNA)RV"3ZU,^R*
-M4.IG6(!CK#(+B8.'T2_W^NROX2A*1LH=*[VT&VU\\HRN/SG/#=KGH['/O<.#
-M:MD,GO^/']`S!X]Q"]Y&MNP8FX^)U,5ME6[+T>)FM#Q2<K"8-JK#9;FU53/Y
-M2E0?+T9]5T\UJ.YA*S9_;H<-71R!J*5&D,_=?DW/`J,WB>_S3_%VXB)5LUEX
-M>+7;'D@[U-(:=6'&SD-&)[Z=DZAX<8/0;,9:/#^/J'9@J"U5#Z%&CSR(T0)V
-MS.Y84,1>/W<3VO2T.].F:1;VG!XQH@Z<C$$(,.NT'KJS+)`=3<:-VTID8.9^
-M8_T=+C$W3=43@H3B9DV/D'VAEL9>)_,\(KV&\\PX%;;=Y/2.8S_ZS4_/=LX2
-MVN:NW,>H7RAPLC<R!LJ!G':,6J0X_138OFL,U)Z+WF/>FW?KW"Q0#G0^A/!=
-MP<([\FPL?J-D>"ZJB[,K_26\6@VQVD7L_`CR2IQ76S4JX\.6S6#&)2VE,7G+
-M3%:>?-AUK$ZV[*N&],3ZW.J+FV#:*#KV,^YD]6>2I*C$JJL2\7L&MZ:5Y\?>
-MFZC=+!FI!PQTM68V@V7$888RN<*)`:TP=[R\]U$&_C;4F:,-':'75;7BZ?)[
-M:->K&P^#J_ZP.M(R$//!/IKX:D:#WJ/O*#T_!J)VF3#.,JZ\9GIRTY"\23IL
-M[7GQWV+W#DZXJ?S*:M^Z^94<4.IJO:%]CN=[Q=&N1;J5O3Q6`BS@%]",K!&?
-M;D]5YWW9KDY8FPV5)@E1M^=X="Z=95@N+B?B8A2[V.&;T3V!F^:R\7J"K&^5
-M>B4GI=!W*.@Q0$I:WC\K%/[R=-92FE"N;C72E0_U$DRCA%.MAXU7G#%G=*5W
-MI'''Q@<<X4G(V:$Q1M(&U=S1\VN+`KH9M\0UV.@06B931BRV[Z),8AO71+=7
-MJ$3R;76XG2P433;&8IB/F_RX]_6-41!0A\`']7^WS230G[B72C!"D2C45-(%
-M4TT@`5`VT@T#`B;:$?(,_^L,01<6$>"!KUFH=&EX?'G-2+BX\H72GD2#6;J3
-M[M!IO)0^%X\.1R"A\;JB^=/["Q?9"(*5_A_;RO;D:<S.\/GXPE(F?H<ZJ](U
-M#?\S9NG">8MIG2$S]>8SN=@NGQZ!RY9'U7`WG;M>";K1[:9B$VB\<#)XCYV;
-M=D8C`ZWY0NRS5^#$]6^RGZ#%!X6[A\IPI9-IA:KV)FG'(/%)6F0^4=H#ORE_
-M*0>K[,L;Z_OVL8YXT+^_I!BDS)"A]8R=)C$#HPW9[!%AT8K$*`W/?%^($=7/
-M/-ZT&8!)T'',A*Z_B'#V'B]3DQ^DB%LP^Q@P=[K[VNN&\-&V'3QK#)OQF7R\
-MFB_T=B?K>K6-_0.T;6*KK4E4X#0C.>C4:EL'),%X?6]^.;BY*,:3(RVI;K0V
-MI[FDQ7J;,?GN#^M[3F%'KBU\L#)1LG0X1[*W:)RE3#6CW,.?@//J)#2\"S.7
-M\V1XS`6JQ\L>$'K==I'+F\KS.N7_RHPC6R$*9!3;CI.^%Q=1UM%9F-Q?P-S>
-M(&DQZ8'4\=.<C,/HJ%#)8F&@ZB*4EGPS#S.[@"VG2VAH</[Y>>PAJ9Y&'[81
-MBU!XS]NLQK6PEH;8R@A[%F-;+C15JNUH\4:WSVWW3D58ZQC'T*'*;JUU&XJ]
-M#N=&QG:27'&21/0F)\3F"IFV').61IE7[!M*A;^'0B$[B$\*?;3:B4PT!,MM
-MV]H<!/BV"UI4^LH<]ME.Y";=#23>A%3>-R?[A1Y@YT&.I$4SEF+:OI;\2-Z=
-ML]CLQ!48G=#\+[HFA=8$Z`M'\!.(#Y[H%J!SPR$VV6OSF^<;N#%^;%&+/.9X
-M<1/#3.YW.`TMZ^`)[L%G??@EE0P*+I1[JR1HX-+>6V<W48;&85P8G'\RR&2R
-MR2A'!9JJJ#]!"']A**4$6QD5XAO%Q6*3O;C([6*`T6C,ZC*YT4)O9?T[3WN?
-M>K/.<KX*KKC@SM&)C/PX<I)TYPQ9QJ"H[#-F*\;_P1?^/]4R=DCGPG$R?,?U
-MN"X^>Y<QT7UB(6&C']<+3O$P0D67E%B.%Q`:Y7PLQ8C$<%[>F!JF1=*7EX2<
-M&\7:DPEVSXTW??#PV/G7),\&,=;;=K]5#?].'AT6,RM<:`P/@U)IC%WH198Q
-MC8S]Z`=Z<\:7=5](-56M?`RKAS^<T4D`?8G*U"4F#_OX9=:>Z6_U>.S9=BA>
-M)FZ)9&HQ^$]0W`M`C@`MH[9.[]RRC`@'1U3UI.T)PQ?1`T>:%K'RVC:S61OF
-M96XXV.DU^PY,-S60)MG3"YC3OQ1/0^5!`.$YA<C-/)21IIC^036EE7LW3J'&
-M-*AG=[792*@NCKM'^8]4C-:2OJJ,"B&!1%6V*=]']4..@D@L8CH2\L'BQ9:^
-MI1_M$>EIHL@@R(=G'A:'QT<;8&&6B0)61_[4IJ!K'%5).TB*[WJ(['O&K_"$
-MP$-C#YE/FZP?AHLWGK#.ZO)7=WF;NSUC]+%,.U^W9IENONCJG0L,UFK*QS+I
-M%S&LU<X?IH[81N<UT'KF4QAJY!^TVX,OZF+)O'0S]/`@8#S<;DGD-9$O2?I.
-M`H&P:/23;;!B1`954#"'UI/_%%**3YB'T;)N/3]7$/FRS[<\[YOU5H"BDN3<
-M)!3V[R\)T-%(8<%WP)!ZCV85-#LS=>I;]C3FA<Y,R[JO4^E[6-BW(.O=5-Q1
-MXLB#+&Z[:<N$A+W'US"N4Z!9W^$5%YKAF^\;+9ABA%[S\ZJD@J2#QTI;V_X6
-MEU[2ZC+D3`8NRM<)KVX6WXQ1+;_B-\%TLS:$\YI0Y-;T;Y*"^MQ?RW&]O_@H
-M<V*]O-YQ`^"DI=0%'R4'/0G??9L3A,J;@]#QF;N$X+S+/',&^97S;]':*PX-
-MY./)F]7QH_=M&>E2]T<$T!A,?%YRAGK\H[/*_Q)?;TJN)Q11Z^0<PQ?[A[=5
-M_K2IX79/8J=QE6N/K^XHI]9IQVJ)9HTUKPHNCL.)O_YTL2^YY4JYEV#T_%T;
-M$[+Y3+#!T5"5<_O(RR\'%`]!05>ZXM@CO`,Q7B1->Q(S2S3NE6Q,$\^N-[]M
-M1#Z^YM_X?!J&J"7*?,7LP:X$1;"MH6LVCJPR95[HKIT&G2N8VCU_J>[:,:=I
-MJ#/6K>VTNSHABWO(Z7/Y-";,/35L^NXO69)D49Q#L]CE5QHC(,4+Q,T.9E6@
-M:5,#D!PM!]1[$]'\A\OH^![X>_)[X(P_1H3YA^>2:6T0BP#\<`OX=I&,1(?2
-ML7WQ4]NC\&D])_,[`,]4^F]_R_(,!I-!(`.QYJ5Y<\^:0[1&>5F:=3<86763
-M!N/,2PEV>JAC'AO9<=<S)]`5%4)3M\WZC1H:$V2BXC386W2]=)`&X'2M(Z:D
-M<Q_&JNDE9KE71_FT?$)MHX]_VTB3"C7RUFT>`8_-=]Z#%(C&5/W9CQ+BE0`-
-M.9S0/H5)3M.4S:$9%/._OL]QH;?'^,3RS')<,<\?MF9[#C7.+@:5Z]ZEO,KR
-ME&C4<'I%0M]O&,<O4!-]*19"--OG,F\]5GYIOLLE)A25(HZ<9:7"G9!X"@2L
-MC.TT(\O[GLGTJ6B8,X_T%VBL92O9I04.A\]ME-+)A1]T,UO:]"RB22KJI4A<
-M=;Z9;O(:PFJ"<EQ2P34WN7D565OJPHYQL9/P*Y+&O0DK3RI61Y:!V62A#)VF
-M5>0GL[;V9P,XS?P2[@;&REA!(_8PSB01DFHU7")L([$DQ&<\`-5A(EH'/YZ&
-M=,[$\]=\SCN#4*CN^;=T#K3V883?\TMN,R.2\4'>;]@ZS_72Y[?)_"W>'L7<
-M6S9N9LKFPQX5>+Q[H."G=U6,'0O>D]RQTDUN/$"'[M9/W[T+`N8A!'?APTSB
-MUX-PK>+,MGQ&37<+7?8)Z6O:AA4LBV5&3&998%K7DR'LO32L%#.]P:9?V-WN
-M5F"FOXC?#\V_(()7\<HL+0JI1%-I]Y[!MW[_5%OQ(-THEH_`&5Y5="?@2.^0
-ME^KICXCI2Q>#XSU)[\7J,M%BE,%9#(/;5&H!5ML6(*M/+*UHXU]<#U(GFTE*
-MIAIAV7%BBJF6EJ'QU#M"4C4X343C7D\K6(DS]"^KIX/PIJ;[N]&0_;AO"[MW
-M1Y<OY5A5N*`8TRS3%)#+,*J#WG]7K-$`?R)!$PKL'_)D/+_)9]CP:<2T1!-N
-M855ES+W_*53+LR!N,)C#ULMEWS"BJO^NL^/[L-368X7>GT_YZW*<EBDX@2AW
-M:J:\.4,:WTVV7^C"U::_Y`EU'%].%C/LT?6T4:K=U?27U/Z!?4(@>_/\5:_R
-M@.?#1+X.-.[U4RU-((0^J_)?%17?S*GO@<XJ""88I(9]S3MZE'296!9&-GND
-M@#I`[..Y/Y&2K/B@8;X7T4L=%T@XR'JUGNSJ3'(%T+%BGB\:KPTF)Z?==W"L
-M0BU!TRZJ\I['9_<YY_FI&EI,@H5^!!E%QL8P?"?>H5/`-LFI3L]0&&\"&M>>
-MK3+DQ&F*>4+\=]-4F,H*JJJBEFR,^VJH-*J&VQ55U?=10H7!N*"'0$E,@8?D
-M0<]8&>G6D=/Z?+9K_1DT?J-A(F!@1WXT)R4QD1AT^U7G946<)I]*P]2=QG[4
-M?J*3?,"%^*QR;#>]SV6%A?:S4VEMRJA.W1CV!+^`G?']ZBKBM1MXM7@4U,X7
-M^:-=#C%L<>8VH1\Y*&+2%M12J_`ALFD'S9_^S,=]FY3N?\74R_+_6+D#0K`-
-MT996(1ZC!"&>_NE(M;>W#?"*WR<\F;P<:,$==RB8?65C6S-",BY")BF^G<*:
-M^01=<XM?]+4FS]/T-$(T")W,C,Q$M:RV7DU]:<&-9,9*]RTF(/J3AY?ZBL9V
-M9X60CH*OP7!8?9J;3U9V1JL<,<*&8QK;5'8TCH@-C^-847XV9-04H:=1FBR6
-MR%*)#!MB6$Z5_@=XH43O_>&:?=^"];C^^CO_V)=K"JHI^[6K87'QF7-<+]9E
-MCXU-JIP89K=QN6ZV+HZJ_%\\^ZQ7M^RFI@CRYG!])\`F+C>`TK]HQSK*WYW_
-M>S(4V@?L.P5IF"2+BJF^D/-8"SE.1BXW,+[-XL."9%:OKI%"RDF>VR>>GEH;
-MJ-?AXUC\+B)TS7N7IZ#^P-1^*8PYL\([&0QD6L0FR7W80IY-&(ZM/`O,#(,4
-M6$\C/6FHI[\5ZAU=1J\#V.K?;26[DZ>H3IZAJEA3*FI@(S%>X"@T/W6W\/55
-M`'U`*B3[R1_O</Q(99GUX?Q%#&"B8?=:\25"I(,*BH-WQH>YH+QC?'/MQM2M
-MQ]E>Y&()C1,<Q*C(_[F]H;1:D/#N'OPI=@(S%I.<-[$$(?T6]UPJF^OHC7OE
-M5^_XQ*2/@*OI/*#`S+X^IG;6L7KD-GS'J!<@OEMU^$:'DTP^-"HBMTK:S!]>
-M\JZ-O^KYF1&Y,L$N+Z-X3L\`PK+H\0ZT.LH>'D]K/._PL&MQ<:^N;K`\:%B#
-MTD?I(+1L#TB/'3T_.P$4R3L[AY8GZWWZ50??!-3]]JQ`@BB;PX*,5L<!@VD8
-M5-A!I77"EVPIV4-<S!G/AAX\U7>-A_:I(TIALLN=V?KPE63I3Z#68#WDT#*0
-M""I&=IDJE4$?6:_-<ZT(#$/XM=[6W,:U3WMNAUWWW(9AI6FH1U'>4$-UWUDY
-M*LR^RI'^7TO'-RPH'381J9M:5V>Z9<8O,$<<WRTI^#]H,Y^C7-R=;C,NB5M?
-M5AQ=[P+%RH%R`9.H`>U!QB!YP79`\>/!3-*Q(*#Z09/T@DE/A&J@HD#Z26L<
-MOI9`2@,:;2Y+2P6<1@FE7QM7:*,N'"&"P:9@Y8N_>Y[!6`,1X6X5Z>`?TE3R
-MY1ZJN(Y7N3UKJF)57>OWMAGD^E4O_?+VRJ+/(,4H!@;)1&PSZRR(6S4(/UPV
-M;NN+-;=<SS1?&B@SN5VE(.;(Y;C^5)K21:5Q0N\8W*SNU+8859B7G#!W=G'@
-M_R?(M[&A#L=OX[(N_@=VQNSMN]LP;KOY/;9';9,D)@[;(^C.301DHW[ZS[RP
-MC,QA<^\@*OS)^&$E/^,1P-*RLKM36VRV@F#MC@92B[!X:;6=D9"CM>)77]FW
-M85FS>;!F.S)_5<TKCRTC:KZ!/YZ<E#Y5"S7X&:3S+(E56,A_C"KC0OK:?I$U
-M.6`G)7/Q;?VX;W+Z;D-*RG#-TOI+)T2S]PNK;&YGWM:4FU<;'-85I??B93/4
-MB^RZDNA^UDO)2I*9C`X`2<G)4?1`I3Z('T9,*@U:@R$<&OHT"]N`1-";&@=N
-MRO;Q^X1:;K&;]V>")LW'2CW'RZ+IT="*+5:Z.N.'/D1=]'H;B2'AN<37<BEE
-M:?:>AXKL+T*Z_9KOR7,/I=-+1_+?NCBO&6NVI^-ITR6QVBZC:97@K&2^6_JV
-MF(2A@,"Q3<7%_SXJ]:P2%4H0:7CG#')";RDM,^?+9U3#21D':*7=*RJD5"M#
-MDON*3<,;#HE^;A9%@<$+2BA7Q_=E_-IH9B+CM%)'22X<(N=-F[]F?L[WOYX^
-MO?%_!^NE$>+PX_@TQ)T?7</!F$4+H_`RK5E9.`FAJ"`/P2HAX?X<?@/UW]I0
-MC/&,2+%G&.0/N>#W1=_=&I%:&,*DV$-(EQ.[TY7,RU-I&A+".'68<*R6U[G4
-M:5"4/:5=4B@_RNQWM>EV[4%*:3QRUOC+JW@I=MUU#N,:Q'I/Q/FNY@-'+Q_8
-MR6*,8YE^C@U[.O5SL)H='FT^/@HDZ,USGWLF+\^GYGM-#M&W)Y/:@;7M)W/)
-M\EH6.PR'"TEJ\TE>8J,\T6"*(0L`QD/,0Q@8XX1YB!HX""!C0XCK0TJ\ON9Y
-M\5(R-SU;YR3\Q]Y$JLKBM(_QAL[!@JXPGA2V[E=JERN_#Q'E;N+I]?/:]@6%
-MAA1K*L;7+:TJ/M^##4LS[3&8#C4S\$V'J/!ZMGJLQO%\LE/<^6:M2?+JHHA/
-M?6UBQM&TG,"'$F`@EJ)MH;$_K-Y9]34,[\_V#^#G9M7H$N;ZVK=M6JKM3YJO
-M!K?P@3RYE3#I+LIJ?3:K9]?8+;UL&UG%32(SZRQ'VE<X:1@RJ\9@:1+I2_')
-MMS\*9_/]M;WG'DS-ENK9RFTL/1&*H:L-D0C9!W?8S*0]Y-8XS1`F![^&'@A?
-M?HHF$@-_L383DR/"7/"Z*+28:<UWUP6P=!^DQ68GXBQR7#LH2=CB>7_&3LJO
-M]_Q^4\@4UA'UVW>L;TP*ZNKJR\KZC3+J1_7%PT^@K<D<2&",;#$\MP)H$"=#
-M9]E]_\S/@S,]F?F?`<@^#Q887P6>>'[+8F1;+%/4TVS'*LPR@H4,,L,PQCU0
-M/[63`H)YB@X!.SR@X!/3S+F=\.DWUABBNIU7.WE`4%W[QV(N_'T>2R*0?+4Q
-M7AB5@(3UN?\ND$VJ3-H[MZS.LJ_^_[P#2N+JU[UI>>.N%5@A&1?782V0H>K\
-M[?:VO.OZS7J>I.KO+/30Z83I#NT5"=,!G2T+(`J`&(Q`!`1\!Z3!,8)CB/GP
-M>ERR"9^?CGUN?*E\M#JG.R/YK_^4Y6WWV[5I+[QQF6NE&L07E;V/:A-($MF3
-M9[U)?V,DI+">K(3JDLIZ<G*:FJ*T=0I"]/TR?2]'T?BGH^BTWRK+NMW[3=WD
-M)>B;Z0;YC&2-\$D)54AWP[]5$12!1$8I#OC&3X0=^3UCUL4UC;:C\Y,UE'G^
-MKGAV>S_PO?Q#-AO2[I3XQ__(=FP6?24:T(+8Y8(?"E)E:J*2@E*6=HR<[Z]C
-M@]B/I0EK2Q19]?G:7RMI;7WAKMKLM<US6;79EKIQG$AH7Y44ROREI(HJ$.Y+
-M69(?*H"<Z[X1Y\?!.SIITJ\]7F>A/OU>)K<>WY<!PR&0USEYX,:QG=53TAD_
-M0Y82G)$:PK*R*9V/Y+/Q_.PL$"YI!,O2\]3!BEYA\,`F"8)F<XY,8`QX$8&4
-M[J$8(CTU)&08J=+(,BLUM+`DQ/8,9\`?'R7"8/0>ZD26[Z5M"]ZLHGC[_'QA
-MY7:SZEFD_7S'S/BHNK*)5\?HYVAT>?XGC^1T?'[?17R-3'[O%6R`^3"-A,1B
-M<@[LR=,[IQ5(^<"AH0\X$D>>!\^M:)="><^[/J8.=0Z#OL[N-4'2UY7;2)_:
-MXWALJV0D`I0N^IUIW;-<E75E7VZTM!9DUHRI12?B\WR/'R<NEZ7T>EI<NJA:
-MFG!/JZHT&G-5M5(U00AM422K9@OI'Y$X$1`'I2(B?3`$4'IPQ`0!YX,488/(
-M.>104$;71QVZ.34/"R'/J]-R.!94"2UYVVQ:'*;-,?2HT"5(>+SNAT/%Y_/.
-MAT?]W.^?^J1]UZM[%B/44&QH$D8PY^/$C$F!\9WZQ#2$,5$@;!G9:T9"'H39
-MKOQ&0F,`F0B#)GF6XS^?]^^^59,<^4OO!UJ+GN_??DI,1+/0$:84$A`C.(D1
-M])26$[,^I]H^]>UR>;S3FY:.:C<:>8.8YN8G-(C!!('(![D&665K,E#220ON
-M20_(`]S,Q/<`Z.X=CHX6P?%YX#OPLAJZ;.JM\?K*C3FU3W90Z58.0*7O4S*Z
-M155T:O9/+-$/7D:GH6,.,,=]\)BAB/$Q0$V)H`03H8Q,"$(3,W>!)44#WMY\
-MPS%\^N]-FR'8?,_6?XV?Q9];Y!YOK<>LX$LX,YI#3_JX_^6)E<F7I(D4D4&$
-M:%&D54FJ#@XM:LVM9X@9M;3S:<#!LA/(I:PPE=`Q"'D0@\>.0AADV+C"-QT$
-M%OWF[P_3;0<P7;MYRW^Q\KO"V_N?N-#[_/T+7,^Q-_CXC[.?6K<WQ>AL^+S.
-M=[:MM[;<\+(K+6K*+53L[0$DDF"TP)`-@!B1233`1DS(LTG!14X(:=(L:SD(
-M?@UOHG!'#1X":+-3?:_.8/5R>NIH3FM`CZB0R)--34;-"M#8X'!P;<P\W3=O
-MF.KPZ-?%\P#YGA#VW@V&`^9>VV:R*A>@297S%1F!T4'F^"[C#R7W67;^\U\'
-M^[_&=_]I^A_Y_V]G\WYW,SL^'@^=X;_VY:*BAKEEV03E0E2G3.#4C"$0E>0,
-M30/,:/;UH-49*'B6CQ2E4F20;0]DL[:VW>VK1R6_?W-S[#_/K?@^1G?1T/MS
-M0S_QO4S]@RJK+GZ)G,UK-3,BS@EJRM*'882TFTE(@R`[,A,%10AT/2FJI"<F
-MUH*<G]X;'R/^.R>F?9,_R_V!^Z-#SNU;^#[K*^<O0N7>)]E(N7B_X\"\7AKI
-M>82&+PD-:S**:$.T*I8A3M&[;"(UCBA$AMQX`-%K+87$T/4R=]RCY-9A8W-(
-MV^C..RYZNN43Z_P9HFJ+V?9B/@.SCG)X\.08E!R62-2,+,%`'GS_*R<]J(99
-M5*A0+D(SQ9AXU/5]5/6/'W_F?+_*_TN?]OKD/Q>E9SXWK<V4DU\^8@R4LP(D
-M3NX3#"9,!@T;\,`,&@^[_[L-0!Q:*4XAJS<[B$)FG$IO'4,YYU-+.CC^!VK/
-M/H;]'XRU3%O5L[M=7YYG]4Y?=^UGQ]7L/8TG8TUP)-46R"QA2$L`Q60SAFT)
-M"I,LZJEAP9J9GM_6?%/E\_+_BM^6*PQ3TSF^Z_/[8^2'9NPVFX@V-`;F87<A
-M2;H<(*0,4[M^C4RAA5+;S+-X[R]S@\,/N?F1W]?7-<[^]M7>BYL'9@O(/UG[
-MWJZS:-JYH.%LR6[0K;F>]M"4>.@]H?'X]:-9B&EO'K0&#!-`'Q%/#!P:VQ;:
-MU;!%NVXY;A;A`M'@J%<W;5NT?.V__7Y"_+^V2OW][Y6A>U;]^^7;PK8@5ZZG
-M"\$"XBXAQKS`D$$Y6IZ+9L$(`BI4\H>5HI/+W';YO;_5GZWU]SXGW3IM6BV.
-MA+X7,+JEAM>S%,+T#>J\ZJ(6`&"(K)#8DET*5D*EJHN@)@S%6'@LB<=Q-CV<
-M9O[_\C?^M_@]A_DD(;W^'EX/3+=NWAJZ:LEE#52R+F9JHB!D!F(1@,51DF89
-ML*4$"@6`YE.:"0H0,O7,O7];OGP^Q8AN]3\DG.665-)DER23*"":#"&F=W:6
-M9IG=,.S$%E)MQ'@B:@RUC@!P'4AA4+A/#.@PY,3.+'!G,A`X:)Z.W1_:R?6^
-M/A^B.\.YAZ6&S245550/%G+'Q&.O$\XYQ)XEU?'UB!H#Q892FQ!*HA:#25(9
-M994J;^4XS)JIQYZ.[I/-JU>;L>F&3\;\3?7YKKQ/+U![MXNW++%PMW&>Y`0D
-M)!<&=!:@SS41IV+0#L`+%).I(,0FD>P2LLV.>71:6I^AJB_![$F:+J]7:CDC
-MD(H1R00.!([C.,))),&Y&J:!W`[H##+%<-UE,IC[EFM0$VI+"P:DPIG1@^T^
-MJ\=R.WL7$;"'!Y%$.I"*1VD<UC&Y:W0$I%5([D2*MLA"3%DWB+"X+O0WJJK;
-MW#;?MO[P]CGZ$Y^?Q'3^V]#];:?OULO3S\7=[._=QYL\@V<FS'H.4LARC"%Q
-M?ST)88&H'2\LXD:1,(C5!R#S<.6>GA_`?SFLUFSPKM3T-FD*@H;(4RA(;,#9
-M84BR%2,8I#9BJ39V:H*ZLX=DV=7PML>]_*YO1[1MF_A-S?Q*)B"K,8.+02B&
-M+`&&*2HPE28I!I#%PQ5%](ZVBX7T3W#7WT^O^G^57L:].E*HY]O/ESNWF<PY
-M\>C'GS(RH<1H38!0$U`<A.<&/18)H*.68=&&`;-G,YG/F<SGRH_<'9\WYOXO
-MM_;<3K.OKQZM!UY'7F%(8!,TCTD(N*2D)0"XI46(!44AB8AB8&==V#@^AD\/
-M=/FZ_\O_9@L<6Q?ZDN5")AW>:8$I@FD<&=F+A5A,@8K1,AV+1%0AP:`Z%,#S
-M7Y^ILH2HZB]QP^'\CR^]DEEDRS#K*G>>>=W=)IB8.`L,+P%FS,%X)$02/!R$
-MWE,PDTS2J9H;%81BG6OS=[?HW_.ZVK_6_\^O^5N^'=N]E];=WGV%>O":[2CR
-M%>[=N)VAVE4O:">50F![4.-0:UA2NA[2(\C)'E[=9VGSK+#R'D\??]#P]_A]
-M<0JB;8[=1FW!2;<@]5H#;(BC(;9%),=)CVZ`6>[MTNDZQ:*-%\0ZV3!?KOL'
-MA[511Q6)&D,W1N#<;@I-U!1&W`=R153,4)B,SMC)3"D[-V9MUV'I]C[;[GN[
-M>GU_#AY'1FM:RCIZ;,/7Z8]>RI.D=`TA$"=*!0$2'3`DI3EC"=(=,Y4A@69E
-M#;-S*80X(0ROV,]T@I0%F>8A\4^/['C\?UWQOOA\TX3J^=[GFR\<1XR]JS/'
-MX\#Q^,\9XPU/V?C1R#QK3*2%B2S(:IJ2A)0"PU!JRF@\/9[>YMG5V?0*.J=4
-M39LU):+$9U06*;+5JD+2'50*!"&R0LBQHJ`5#9#9.(VN'A-.K5Y/KNYZ_Q#B
-M_2?*]ST]I],XG&X''3@8\<JPC,P>`<4XV;,30IQ6XXG&<4I]_,B!T''#%X\L
-MG8<MA\"Q19C.XCP6H*.?Z`VS;\NX<9@CAN8.YZ&`!487I4\/3B:=FM*25,!T
-MCT21=-CCZ_28=(0M(JL_=__?!]WXOI<G#YBU)<N4E"0:65#(D2)6((#>-%#,
-M:@?M$*-XN\"MX5O-V_?1ORW-JC[>'CO?28:=G<F`;@&$BPV&A@5!18]5B2!@
-M4%`=5F/4]755#TG5>OTWRNGVCZ6'T/5_#'R#L]CU?-/0:=QXG=F9NL@S=E@1
-MNS*#!;=@;A"J0P'=A@.)MW;C=J/B;MQN\7Z'T;SD-LW-L]_[C-@))YLF/+A$
-M*IREZ2D8B9A)(&I9AY`PD>:ERQ.99''2<9V!SN9AT'/P5R-\S9I9M2_$2)F%
-MK(&1?4HI94AB6M(]\FDFA`F8UF.Q`B.!(PL0)P#=..L`X-$H::99XXTPE*3%
-MZ_1J4G7U*L'=>UP8.N<%JBIBJ:A4.J'4/%"8#D)L@,I@I`Y#J=1J$*`2H"BA
-MWH>!0034$RG)YY\M&KAK82(B%$6[DD,PW1%!NC<X%.YW61DLM*5$CN0V1DAN
-M7;&%0Y9AD&V-SV=EM[.STG9M[O2Z^-JO+X7W"8S%!D6"AC5$*(""0F(CU@99
-M5U2%=6,778Y<LKJR.O/#U;_E]N?=')Z_=WN;=YEWM'63,WU-\WPWV1)OLD2!
-MOLI5F'8)4,F'=VE$0A"""4A%*57HBR=?CQ[\>]%%$=QV=D9G9J.S69V)V02G
-ML&8)V`'7&0.)%I`-B7T6M*L+IOIT\^[W<,*VC:-J;2S:-H-DE#0GA$I\,F$#
-M@>&$PD</#+X<:9X0(3WKU)7#+%E-K8VHK%ZDR5(D4CH2:12.R))$!!2AN1H#
-M=($M#NE-S$X'L6""1H/(H,\B4>JE?CU[.SQ:K_3W^K\7)9[^SLFRK(6=NFI%
-M44,I,D!@9-"LA1!9,F%,A02DPE\04AS&(.>S6/,\3WYZ.'?]C^5ZNF/>ZNH[
-MO27P1=YV=C2=G9F8TT=@/7AB!@!V9@&(TP10GL#[$=CAWSE[!EHVY>?WN_M\
-MW<?.^?]3O[*W>[?HHI34SO0]`4!0[NT[!0AJ&9D@*&`2!J&)T,)4.BB>=(WM
-MC"074X>#'P1UU%%%?C:-1D<84FU`B#9`[5:VP$@;8)R"MI''?@)G:33:27@E
-M,V*<P8/-P9O3WJ+RLU244N[4E3L[5"60*"F4!9.!`0BR512R&4BP&("IBEW2
-M8<:H53B2+Q952EFWKO6Y.+CY?K3XYJ)R<X[N'`UA@Z(C@-)P%X`$0\+*E#!D
-MAD@)F$DB:9W3M,3$I>PF':/:[7F'5-_?V+$S[CS\.!Y_B5QQN/"XV&5)Q7A.
-MR'B)PCC:8#H1JD8B,P324)QJ@Z*'C<>.LM;?Z'K'9[_/HT:+F*7:I#$PPHQM
-M:J7"JA6%J,4(=63B/7!Z\]$;"I=B4]<&69@F`QG)TP5S2KK2R"LY2)6MK(?5
-M_`^%>EEM)I`DM(BE4JU!@&\[)#?&R'!**!6(7>"1B<8K`)DS2!+*[I,X26I2
-M5\`1YD2/U+>\<9=TWS;XLP-#H=`:`T(H"30P*40E%TFBIT2!@FNC,M5`8!9A
-MG98Y=F7EA@THPCC2+I<-N]-BFVR;S_!W35*2B_1?TPI*54D.U"(XWB?$63B>
-M*;,4P79(85`&(9#5!4BM!V(#4U.R9W03U4E)=IH[L_8KV+$5?%&8B!M#;Z^W
-M&-N&+B-#M!:3:!6V*`(0D@SW42(V=KHDT1BED5V]!Y9I;LO%K<&_RX<.'-BS
-M7;A=OJO-Z#ROC\KY4P"E\H^2!\MJ!Q/+)080F+,)L"O+EF$'EC3E'E\KY#T=
-MN9XO%\O^/EC[IEUY"6/3FU-6,9HV&2`C9@2",8C3,($(-4&@N8'$>7L[7QO@
-M_!,WT,PS.JKF%06/H5*51(;,$8L1`L0ALDV4A20J.=0&;5JA0YT[66YGT8_>
-M>UOF]OX8"WQ,;8VCB@ABLK9B'6E!U%UFL`-*Z)"=1T]4#MO<M@=OG_@?H?A_
-M1\&0W,<3#+%!,)=+DIK"B+!`LP+@18%Y%D50+AN-,IR+F)D9+,&W'O;G!O^2
-M>"?O]S-KZNOB>FJFI%105"35`5#,Z!U0,B3*JIA%("`LG`JAP91<GCK+?\/7
-MX^?W-_=[_-V1W:31HOB(7H$06%R+`62Y`NBD9+H+(R]JE,4M<L#C:J.R:#!@
-M@8)(B3=ZVU,]PCCJT:[A8<+"9D5G'9P2`0H%X12"(LAA%+L"A)*DNTE1N6(:
-M(5ZK#K7R1V#:X>][FYRW+N]PJ&R<NIQ%.I48E45"253$RJB4D0`RA!2&0L.N
-M9'!EP5V>/W?N7?ZURY[OO79['RH._;M-M-=^6$;B(W.Z('=F#@!NS!,$HW5&
-M29FW6C=`6XV?)WWHST7HS@=]&7.0YR'?W?#^IWO1M'+M7,=TLU6K>\D0$BV[
-MN6RVG3.>.D]KQZT&*Y!H#4^.1E/'!E11@!;3""TK:<=EC+@0>FYM4[NWL<(D
-M19(H\<DA&U>.31EHPW&49CB[LQ<4H=PKN1R-VL!V2$FD2"0C"/$^.52CUL9R
-M[\K\,_6V?8_A>7O;V"S9JWH6L].DJ.FDTR:4C!RHI-(&ED$!=A"4,"@AI0I)
-M41%)IFEJJB+F<>>FDK/O>KZ?XO9YSW._.PW[]V[:;C=6Z"MSNB$-UNLD)"W8
-M@Z&D<2C<5N*=V;MV[N+=N[[W#O\_VWU?>UM8GIN[\**A5((D544,E0P]#IFH
-M3"$:"!V8H#("S$<4Y60YPUF$$5'(Y&XWW:M^4XNL;'6S38,2DCEDDP2X1Y@4
-MT$TR$,3`),PTJE`G`:2DWA54[^&</+ZO-W<M<N/@SD_!]/S]]7R?O_5[WK_=
-M=WUN0P<;:V#6PWK]TO)!?+Y?:^A`6T05],*#9*X"GF1H<LE#H"B@NU/,]%YO
-M5WNCH['"GSG3>_/<QFW@8%*;C@%$6;4%(+)A#XTYF4.9BDIU9F5(0TUU3!T]
-M7A[_7\I:.$[/'LF;:B6U9VK4MJ$$2*4=I6E2)9$$K#"0*0,$I-\M*R4;I#>:
-MM6IRW&_VN'M7O9GO\MG+T_8^GS\F_LH[#KZNO'*,&"NO,#$ZX**`E.N,D<%R
-M7J'KDEZ]=.!U7P&CKT;5O9ZZ-$]/U]?P]8O2<1=DT[UYDB<=VG@B<0F2)F%)
-MQAD*WYB&"4<;(,`B.)7;QCB4+65+TE_4LC\'A]SI7C(\=C1B'B,Z#Q$0T2<0
-M:#,R3J"%>P"D*0[$J@["*@[-=G1I"KZ)?1Q<GAKM'MGN>UTFHTXZ#&[>U2K4
-M5+X5)0*"DPD610+`7O04142I=ED*+E8E#A=J]<NCRU\+<UX=-=PNF1663-W>
-M%WM%5O*&\19L4J@:0W4FV+,B1P3LW80&62XD1HD'=/&\CH)&DP/>O]G?J]?3
-M.#M12J5WE4I(T<N&]-";QB3?`R-.^:R'$9@-X),)$$-*TJ$$KN\I*2J*-:>$
-MO+9Q=_:DX)<N`EF)C=PW.^M89!M2@HB7>!0;H<D-\)9BTP*1W]]$WS=W]^E[
-M4[_/S->J<7/B<N[T3W.WLVF&4;3;%M2C;MP<&J3$:`VRLZ9@<`C'3-&-&R1&
-MHX"CCTS45[!/V-/S[74:Q<N&@N2X%V`D`Q(%7H!@MTB&!:L5&X=$T]/1?@.S
-MY/F^UX-\S7X\&&_APK;>=Z7SJ$J!S$4I@1R`.8%`<Y3(`Y*FB#(<4H3D-2BD
-M3IWQ.FQ8E@@V$=*W9MLC">IEX*;$:45@PQ1HVL]EAM%ITE+MC)'$*:-LA(I!
-M&$8J[@\<5:Q'A>0>&O'N'F:NJ2;UV]<G4[H33$MO-YK6@T;YWNZ!WJY"$[HP
-MLC)#`%WW?M8HWCN'6;[VKGX:W/4<=.G157Q-N^%R]*"13899"I%BEV1`6$QD
-M+I!@B(FL"36-*NZL0=-5:KYCR^]2U.G*E*I7E".J6:9VF=$H\!X2S0<)@2EX
-M(4M"<!B%X#3)$JE)4I7>J6DIQ5^J9(M..,C:.*-1NXY&$8Q2;5VSDY#`4+0F
-MU`VP$!V"2C:VA*,MRJ.0P+=VL1W.6V1S3#S2RRJ4E4J3L*44YF.^2#?8VZ34
-M4++0IO"ET--.\WY8;H,WQ&ZV:]K*+A=![A[GCW?H.X][?>7K+MRXL,2XQ27(
-MI%"%X"S%"Y%`4H0$)A>(+-P,>IJV^+7PGNGI]WDT7Y#DU<0\1Y3><.#OUAPW
-M[*.`.`7#!]B5P%RR0Q8F3,E,X"9Y(3#JZ.IT(U\E*><ZGDR6Y5JMCB*^&-.-
-MC0E7J%4,&%V+25`1"D)B!7>Q`""`0,ZL/7.EB1?.EPYN+E+N_?[=Z]=)&E=Y
-M;LG!X!PF#?OA#A++5)9B2IOA.`-2;\ZRQ0X3A/2[7A[S[>[X^4W>7><9BF+4
-M*Q#:MA:K$ZHZNO#0FO!K2NA"ET]5UR%`0U#&6F-<5!Q:#I$Z=WR^#OZL,W3A
-M>Y>]ZHPJ@L799DHEV2#)%4;T><A9(4!93'&BXEK()N"7>YR=RO/K0:S;ZVX<
-M/%A2XTN.*8T&&-+#B=<9+@-'39`/6!J,@ZR$^U,S!<MEA9TW481UG$]CE'L\
-MOSO5OZ]9CZYTW2=+Z\]+CZ_3A0Q2Y*2GYS'$*1P"@Z8.E@P4V;;=MPH=R574
-M-O?Z*:R.CE^2?*]WNG3QXFXXF,U$'7F!A!`G7(P]<M&0XCUP&)BN-HUT5V22
-M9Z[5Z:46+IN;7'U^&8[NON+B\_L=W8.K9V[.3W?D'N^Z7ISTG=J[LS#N.[+)
-MH[B)*\TAVPF(4>:$H92D-0TLE'<EW&$=UF&-6R.Y^XCSEX-'S/N_SYZP>L!Z
-MQ>MAJU)H(GUHD*%]8;9A\>U(&"GK#]F'K7K?:>MF9LQS#CQFPDEB.SAQ=KN;
-MG%:M;F6Y;MA;II*6HH=J0$F'8I=V'&&*6!T,%*I!TU%-%-%#VF@$*JLK(JX>
-MWR=B68FPSF&4$)*4G@Y,$PD$KIQD!,[H09`P$0+P1VPO`'@[,,.#T.\X%;22
-M7J[F%^0V_*E+$A'(6[DI+,TR221+,FE0$PR3$TP!2;YV0ZAQ#A-#&RM_#,R#
-MR<=W#P[W6Y.R8F[C>L+LNWBW-QN1$EV,(WJ`A%D-@A>&+3>FE"]38*B51@'!
-MCP8+PZ/#V.]YVOU>3DQ;>9[-ZBFJF#JH2*G14DJL^`[-4[L5)F@TR01L,819
-M"DC)E5`B!9(6)E64&$!`J80@NWK5IK0M;6N'%FB]MHM?B?I5])AW=QM&8>KI
-MP<0H0^R"BCJ"Z>AUU9!J;/7^3TFP[AXCU.][7LNG2XUS&6C/&KV-C<SKSC1!
-M2:"79*830$BP//(NPK((++F@,3+=OEE63R>IS:O'[7'R<$\'!6OO^IISSZAQ
-M]=R3(TLV(4AF&8"A,LZC+KV<0-@&0%`0>S,>SD'H[\##9KQZPU.KTLWIU:N]
-MO[VO=Q*;IHN8J"PN!BA+)+DLP62)%-BJEF2\4QO+U11>]ZKJ8%SBUE^V>CV^
-MO?%QV\<>O2I4O30,<;V$)/.)"S")%DNQ:8%03:HC%+MS%P/1-M];GU\_N?=O
-MI?)[?+]N.GEZ3@/!EGEV3,SS0SI,Z0I4S<T"H%"06"D&!G9M8"D@R*!G2&68
-MT@^"TUI[I9MT]RW;[O5W=K@MZM5!11CG=3J<G"=,(9)B:6!.)!+D<7C!<<<<
-MSAG'(XAZ>'IRST^]/5R\WAZ?2WC#6G5O,;I,1;-K0HA=NEF%D$A9DB!YU4I*
-M%A<,871V+6O>[YV/%K^&?/_'[^G/+`PF$<4*(F-1),80Q0$`PM03%DL%("D2
-M8CAMEDW*J8XY<"Y2]]'9[7E^Y]S@WNX]SSAY_E<3E<C.'(IDXQR0R#)3`'DJ
-M<@FF&F(/-11/`>%RM-N\/3Y>I8-+1TC2$C11I#LD-I)+IM2FE>HLE3`(NDFD
-MDHI.ANDH3!:VZW-O2<VWWJ^1\CC.MAMX81H,#"8)%@@8$-*2-)0]0GKSU%U8
-M&G'J.DZLX&CSXG'Q\_EY/%P^/LZ-T;C-=&C=$-#3-TLQA2;J*$FV6@)`[,Q3
-M:61LG4I"TNP[*)-&T*T($$B/.LM%9>,CM7<[?O=WE\L\E^SK;INO4561:]H.
-M--.K5*SU1-0B:5`U*$4U)$FG502U.,(&@F$R06W1;M,ZP-KW,2(/<LU:NU9Z
-MN[QVK13/R#B<"N7(Y<@W\LT6'("Y80/1F-91+(4`<4>6850&20<6RY'+9OX%
-MW\.[._O*39R]/(9.UYOKU&GO;.S/+.\Z<<@E.)A,$Z9(81"R'&$9#C+D&)OB
-M/?LGB\BX]%<LU"?4*)MG3ZT^U'DCDR9=/$9*)YP0B<&)P)T,.[L"&2">=V'9
-MDA)IYT(E,I)+,^7?Y>2[VXRN:1L5_=S6:?-GL9V-LS9&P'LF0NLUFA.Q#80&
-M1*`NAH2%$4-"6==]!KW9T;V]T6X^@[AXGA-/3;3=V/7M=VLPW6X#H1W9C0%!
-MB[B<S![$S.`.)1D;R%L(Y8V=2Q1-V\N++W>S=FY=34ZG4-4LX5EGIJLC-3,,
-MZI2I)FD9#-(1A'@SL2E#.G'=#50(/!D69Z<.&K!O:I:Y)Y8XT16(E@>.-HU#
-MMU@8.W;CJ-2]$CB)L@90VPP;5&F<3)\`21R.\F"(\/L6-B+>NO%92C(FC0B-
-M((FZMNI=ILP3%-L(2!2&V!A?!F68B8TG=HV2(V49''H&1HZM:6S[SYE_!EQ9
-MB\KVQ*TJ!22N6(;Y,C!-X1OEP`S,6AR&@88)20)22,5C8B<S>Z]:O>KV+%LM
-MW'N$5B)E!X*P,Q8$ZO8]CLV"FAU(RQ;'LUFK3V9KQ^38;KQ^2.'!>[W_-\KI
-MW[F.Z,N7#07`T--:**)*A-"+`$#&J4"F1DO12E!L-F:#`QNZ+%%]C1K5L^!B
-M.38WEZ_ON]Z/GO/ZG:S;FYL[ES*9+H[O=+MVZ@97+KH,'QR0ODO+(4LIY81A
-MU&&8$4>5"9U=:RPKCJU;M]-]DW;TDLFL9IL>:AZTY.MBB`XZH;D\GE$W)Y1`
-M<BH8'?<2+C@Y+*2&H(),*LV1C3$;&Q)+Z&+:FDCKAI'2/;K1;1<1TJVC!Q#(
-M$E=?I<PM2!0F#TR=1U3'3U>3R6!*Y%;7I=3KWJY=(BS:%(6;1-*TS5G9PD4Q
-M!5H,X;))3?(4,!NM^8#(4#2&+OG$2J`SDC8732P@^&3"_%-Q=[W$]<.D:)HM
-MHH0:+,:)*R'3(9#B'3"$O2GM)TDW5F=/KGAZ?:T'PZ6[BR9-6HJ:J-Q$1%&X
-M[$97K0:`"591IDS1K*@<1VUF/L2AH#XL?%@,#;09S#=""NTBYKJ-Z:V"MPQ&
-M]O6]0L11#Q(2NMHM$D$:9$8&ZD4!@*!NDEV$$#=9NL*8D-TW1&;NDOEUST=>
-MX;2FV[4V6SM(J6VD&*;0&T)3(5`#902;(@A6U0L-FIM*;4KK:LY]&A$M[M9.
-MQU/6Z??\GP>AEWZ>79M6K]J^)%M[5M-2BV-;9.G":8A%!A-40+,*"=29I$>I
-M1J.!S-1J-<=8-A;'?-3NYI8S(5Y(FBC=AVC0FC`KI(83,[9R3HDU#"[0S$`P
-M<DR0-HVW!DSN\01*P9().^[7U1X[_+Z^#C,I+EENR/=GG>=GD)C?/`<)WQB/
-M`E"`T30,!P(,G@F:#.[RIB#30K.#LE-=N2%R@GVJ?7W\9TM)%P\?2'0=2'5&
-MR-0Z'J"&1V0E)#U&8N2P@TDYI#FD8:XA>/O^Z]YV>3O[&S@X2XKUV%X=%UY&
-MEEK6H-6\B"MY$AO@LUOV!L<S,@R'`=WW%BE)*;I:3(<#?G`V>##AT7ICM?-K
-MJ0()SBPWRK"C?/`4%_S-2FE3$LSN[*4F@F:-3(0VL*-D;5=Q`=&L4-">`LER
-M$@=\P*5#(E2$I3`387=R,DCDPMYO&W7.P98R3+>DD16XRK<;G=MQU.D-T&2X
-MH4[(6`(02$2DA)6@[O<N71T\@H\MCG<GE]HX>W)'7"OI.]<"#U=>)#C-($-'
-MQH!A>N:2E)-%)W*Z"%=W:"1!(M6[<<!1Q/%;MVR7A.7L]@[GKZF;5\O(.G//
-MO'>Y#DG.'+6LUNN4ZU02"ZXBJ"CY@FC+S0Z$,)-0Y+`'FD)\V92FLUJ<.OL'
-MGZ\O;W>,\7:[FY?$QQQIF`LQIH2&*,2#)Z#%BA$)3),8&*.PF)CA,3`R6!TG
-M?6T\AC@NW,</<VPM-M6B4F)H-*.IF2FF=QGJ.&"6[,F@D<&20X2N^`P#@1!M
-M5K%HIO;O6K'H[O2XZS7MFV.W6U6V"V86&.V;6V`Q!";0P4C";<0!D-M%+)'#
-MI'MW=(2?V]D@.\'Z152:6]2CJZ^H8=W!J:KXX05N>Y>2X\^9AF<PY\N>6%+R
-M8"$YSSD.4II71%`LO.B6'EG1HV0;-5S/0'EO0>^?H^]N]OHY./T=\IPQ2Z71
-M,=BB\ED278%"2B1$)C)<8L(R&-5+B4R47"_43CJY3=8'OZV;'P][T?4]3V-[
-M?T\<^/&U.)Z1ZG!-4#U.PBH"IE(P,A@)#)%)3(5"9"(U14C,N"IE:THR%4[O
-M@^%VL=''HQ,3%QQQG->K72T+K5AL4+:`WIH:`2%UC)&!=A%(D+HI!`NA25+H
-MP2]`\VM->LX=?I^GX?:Z.CWO[V;OT]+;-G%CVML@/=K.[7;;%UU=>Z7;HURZ
-M"2'=V+KXX!Y925\L'VLC`%+28/EK,*P+B=0NU@NM=%L[5O3O*Z=;COKDS<EN
-MS:HHH$ITDB6>=VXAQJI@>)-`P(;UXYB&+Q>)QH]^"8G((U#9U<LLGI\:[6WI
-MZE%$YD-/)D++V2%DLM99[)9&SIH*0J#G423.,*9*(&8BYI9(6&@DR3%2&2J*
-M7V:;_@ZW+8O\2V%'%'8B(X(B@.Y6A'8;2-M-M`VV9FKLUE,IMF(*2@)'23D&
-M*W7E1&$&!MF3NO/AOW]WG;7$IC%MX<W<]7?W+)R54TM2T\]-!/"B":`U#3NS
-MLS4)2;(,5V4P#*<IS'E1PY9RQB^;SZ.[N]7S>#'U>M%BCQ0>*.,2L!%$XXS.
-MS$43.DDPR8&<&$$-`D2*:$B;DT=GLF'P^/#V/,?<##`<,\7$QF>/4L6ES8D+
-ME502ZL(D"XJ0$A+@6$R$]F%@B51&T:(JI.KK]O\[S?>[GO:V;=TZJ=RBEJ6I
-MH#EPUSV#L4YP%+*=%1$#(<RR*'&H0J4Z-.A%$W$U[<XMW=W7]?'']J>'T^Q[
-M[T3;-AF*N:JD#/1`R`RF2Y5*A41F0Q@*"PR@+UTDR(4,4`23@.YG0AT63,TN
-M?K<_1US]__O?7[5KXW/2-$T:)?1!00#0*D$DT(BB`P*ZB2(.SH9!$-62KQ.A
-M%@Y%CBWCN8ML_E%KM]HY/T7RS/5YO5SN8<SG<\Y\PYH5SJ25.<!J7$><Q#00
-M/.*$DW<PXEW1ASUS\6>#F_.W<):X:SVNYQ']XYEOO]4[-K8M54U,J2@*$U+`
-M[)W&*44ZS"@)3G$0)"<Z(RU*:;GCRF0BCK9:%V>SQ\9Q>E^/II>3'&-DCTW1
-M*2A*DTJ$U9$H[EWQ2$`6_'(`P4W5OL6MELM!6R.XY#'D%,1[6/3VIINM\'M5
-M_PSSO<9#U=,T[74JM<\M-:69T)O&'M>T.>UEK,B!,CVB$H2!*4>:%I#(!U:+
-M6FF?4+E8S0<@)75<XS/M5<>;3U/4X>=UBH\&>?!DY=O/(>O#@!F3*`,F#"<"
-M*!P6HI(%B!DL6,A$DL'`!E5%&67`=O-[QWN?7Z=[P_;'^MUR>?J4ST\F["BR
-MZJ*K)G)&JK3LK36F23)K0!>T>UFM0L)HD-D!@'M&S$P/:G),]I&:1TG`?\B_
-M#?AG?^)NUO&]NM;SO;"7EZ2]Z2E%Q"7&"D$DO54R*`P+F#0*1DJ#N5Q)J]^Q
-M=MG>][H'9Y9HIGZQ8W(BU%;MRRC2LTHA,2DDANB(20W;\I&`RI"6\>'`Q-I?
-M%G)X(2X<VO]CMB^)WE['H="MH8,$LA+)*RE:52A*F$!0;XD-\,AOS,WX`8.2
-M!#O:C>TA(*6_N;9M'5ZF_A]+V7O7Y9>;(T1&A$9&-'$XSC1IEE#1$04%*0O8
-M42$.V2VE$3*)U&W34FOP%92S;$^*CZ7USR.O\/L[7?T-G0VGW<UR[=MW7=T8
-MO1VG;,%VF,/;%F8!VB=I^>Q<4,HFI%@D.(03B8AQ4TJ'$CPTG8.QPZ?C?E3Z
-M_ZDNSY_NFT]W;V.LVEM3LVA=ED&MJ[&0A=I020#M*)2E@=M[$N;8C069M#Y&
-M2>.+36,\SX7F:_K=7R]AZ_JUO>OW.(ZGJ\5;X6Y#F&VC*9<N7'?8RB1^?//V
-MG<'=&S'#N0[JH'N990[B^I@8!!W9DS8!,)EA"_APNYWS:6#9NWO^GZ/U3\WV
-M*U:$>S(ZDT,H4F_O`-]V11)-$9`9"XBA$DT#'0,.6"P6$E8;>-D7)ZLG!*?5
-M^ELEGW?Z8K?[\_ZG#!<4%]QMYOX/1[//Q>0UTZYQ=R+PZ]8:Y#7$@L!8)#7$
-M#4&*^:(BD(1\R^;Y.:\&!I-AGF\W=LSY/G7'R<FQ\;O_`\]?V_WA]@\[S[7J
-M\SB+?=XKEPN9U:Y:+=QSB:RA)!=1`>6S!/*R]48IY8@A(3R20'ELC@9L;FX-
-MP@QBH."A#CA!P2@1<)"RASENG2ON,!Q^AC(3W8&4A)^C//5EF,7M?:O</%/I
-M#[[T<O.)SKVT9VWE[99C)2C&$YD8D%`23FY4HD8%(L!ARO,D;6#E7FTSB#CX
-M^.&MW<!+^6>/[LA\'@X.PFE2)=^932\V8'9E,Z9/F$?'D@#@Q10[)3%=Q&0F
-M(%!,)G0.$Q,!O%A1R2%.WV.WER_<Z.G-#ET*S]8Y_%Z')S6]D]G[,Y[W.)QF
-M`N!G%'#C&"RI@WXED@;)3$>47+!Q,BB>1WGH>>M8<]G/[CT'V_MF?/_4_OOW
-M-]?/IY;MWR'>;]YO@S`WVYH#%=VLP8)`MV4TY(&#^/.ZU#O#1OMYM=>_PK>3
-M9%V3WZJF/M<F?GR?*]N=29KT[[11!;5-#3@BAG10F3,<>38F1(&9F/(PT6K9
-M)B&^Z(AY&N,4)$*U:<V:5%[J%_!LU'FM9X;7Z3\SY'WP\/G%;Q<^BF<QA0Z*
-M$XH\IDI$R.55X+$('E3*PF^3)D,E,F9!0T]#4"<<GGH9\6N:_F/9TRSYG4_J
-MKXERX[^;P_>?L^8N9O]R[Q=?M<>UM<S$VUC2+YB2#`L()8DF8AA1B0G?6S!,
-M0-C%]K8I(=]1LE,3ODDAD8L",6*$,1]##APW[WC?]:S_^X+F>P16(GW6>/64
-MD<4@%4RNZAIDD:-U5&Z,7"6`D@FL($TC.[B3<+1+6#64%8DUMZ7XWRN/ZAC_
-M$K<_P_4^SSGYO.SNO]-?`Y_0_2^S[[P:]YB_>:^=&Z%Y)7B\RO.DF9KB$DDP
-M23AMQ!9CR4=2T*).H(`S64AQ37SO/SEG`N=WSVOP_R?E_,A?SOZ?TK3\S.K5
-MN9S.IZONKO`6^FBU::S9W!QVM%2;2V&B66`78(Y,"I`J(Q",CG0B9`64BET6
-M0LJH[9NEE[6;=?=6X=KZ'T^]_M\D]SUU6K>A>YF;WOK=IWYS>)\;>P>,K^ZV
-M&_@;!A@-?AA0L,`%A3NS&%DWF@<0\]LUK12,)L)/^F<3O)([I[PPG*`!@XF<
-MS1Z>;9,S80K*?Y?)8UO+]U$RJ:+E(3(>8J-34IAI2DT,QYI/-#2"9)#H@,L0
-M/$5XLR3KG$#X\)L_#L`$,%E`BR9\'++.GLAN)6FS=Z7TZJH?SOW'X7S?Q=WY
-MSZ&A^9\W._7_CZ-;@YU;0S_O?D^)H>=P8/.;"8,`L`Q@#!:08`>"9BZ24A`U
-MTRLAY6"?)%Y/+!Y?T?J^Z/5W9]S_&][DY?]O=M7.'YGC^+^)E)20T:)#MCUO
-MD9*T<3I%Q<0XPH1N0<C!R<C!Q.,##SGGF`//),TL`WGPKSR&*820N1QQQ.(#
-MB((QW:/2!G-T!G%TC\HXC;743L3OLJF/;;((:_=[BI1N=-0"?H/1^E^P'I^O
-M\G[&/N/HO1[>C*3T2![:VHQ3VX38&;,]NT)D21('MQ1[>&4TDJY,FJ/<Y:FP
-MP0E,63:9*A.46>->7D7W>;F^B\BOE>`<[A7LU:R[O3-Z-%FD!O#F#3?N4DWL
-M0JZ`^J,SUO&)79@XJKDY*SC%!R<`Y.0/'9#C(=6"*,`XT4C).L"*?BF%=#25
-MMB<!C&Q#2MHVV%M;O1:9N;O3RN;OG?8:;V64V_(Z6%?&F$#&@RV[1:-8,L(T
-MJDCCG=45F41,6(P1ASJ'>+=S30<G1T,&$G0@/0,$I>?'OM3BO?&;,H21HTG?
-M$1G,@XF%HZ1I^-,Z!U/68=XP^[!V,:9I*W[I17!U1X9;3JN9'Y+:%\/\R_HO
-M6V(0SNAT.9G\_Q.=@PX7\3R/6.)L38C2383$R98G0"1B=#RG?+1DAB!WQ7?+
-MDC"&40R.9@1@<Y@2!@#$S63J<443DXC3N6BM=!#N<WUL(-/@Q+)%\]%H8:8V
-MZ5-D?'HT2ISDJRK=M$M_!:654]RE5)M6EA6=TI9YD$&?/(E]U6F)FN0G/5H:
-M"9W].+\)TY>H/@]3ZC[2E]54!ZE]50DC[_JS/PMFE1(48;;30PGE%%"=?@PM
-MU%@L!DIJQ3WL457XVUUGV:DI])L.PU&12:I2OU)R>OT8WI4YZ1=G=X?9LDO:
-MWJXXS#_;.O,:18>$*LMKB:##2S,:RLLZ$*3>R;?HYGM<S-Z.8W-%"G6YZ"$M
-MS)NLV[`(..DC=!MS,A@DO@LEE#)H2#JJ#YA\S'\>T:O[+;^!_$?@?.!@SLME
-ME:CC/#<\M9AQXQAYCX7:BS?J7/[1,R^P0"7P3.74$F&AU.\M<_P/=&PX\V%`
-MYY56;R<0JMXU;+X)%QH94;'PCA4ZRJ:V2P5]$RQ+`IL3E`LS<JQ$TL0KI`J\
-M<[-[?3_=Q]"6<Z6'/[^B7_E_/U?:.0/,K8E#P>9L7K'E,KM/E`XYY"\H\IOA
-MI^$'X:\D`9.14$2A\,I(_>990,0$H86IP.,>YZCSRJ@E!E"A1M%#GH,P^<]-
-M]^NQN\BMKF>GUEI]YOD86)25S9RJK%S]]QZ^\8/S(SZ;%)?18KRVTJ21A4V+
-MJ3/#.64OG;6!D9T3FW,<HXM2^XI6@9]XY:=BKJ_#/B?%?CX>AP\(L/3.FJNF
-MQT_&882=#.R$;SM@)JU/XF.+LAP&^<&?5C']/!]`Q]5F/S_G^%;U2"//6FI=
-M#TBXF\S%[9UTQCN>U*0A;_R9^71"DS$SD(<(DJ53_YF7O6*VNVWO64NMAL!X
-M[:+60#:TH#[7UD>;K'@-RZLKRVA95MR:E^+S+,X$KM=,&=<QT8U7HBA5%M6Z
-MP_):;:/9H7L\N%>SQXV3'#Q#-MIG7$GW'@F@NLF<8WD&<E\E.PF#/0Z'8.-)
-M>RX/!SK\IJ'WWP.8+S>P9G'0[LLWQ<]GA"YO)2,B@T5E";(XDXC@^W\"ZA4=
-M_*FR5:S3UC)*'N@U5%T6]*Y/H#%Z,:I+C`SKBVRJ3$P\)5R4Y`[-Y;&40[&2
-M`Y>18#,NMB6,=V)9:&IN;$BRP!I6&`^=GE\?C/5\1X8=92'B62>PB,1!).YX
-M*+,I4D80\]@@HA$D\#3*$9X/!/D8>'U_#ZGK^`G]MFI/PH]O1J*!E8>]MY7<
-M^;<H3:=:*<T^Y`_W,4J:Y3_%9\U8;P)/]V35/A[5I'C!45'!=>?2L5JM%M$`
-MUIEBVI5O;M'1<5M*DADH\GW+-6Q)65H:EL-+HE=FI?6`Y+OSQ[';Z_/S^][W
-MO>3+M^,^K[)PP\3Y)-;Y!&/DZA`5&**+!)/(J)^QK]8DM`\"##V5#V3OD\IY
-M?9]XXS9IBCHB/]AFKP>(]T-C#(>-V=_#^R6#U0QGO,XY7L:NK\>A2[;]5]LY
-MK'%L-3RJD,OVP]$N+0/SYS)F6C[+_<;F)F56U)--:PZ34&O-:^WN#>QI,TNH
-MW=68'!J:41\,+EQ=GR>3C\?C\6Z3PU7AW=@GL69&54HD\"(BD8$?G8?/B8*$
-MA;,^59#`8_//G:_WOH?0=G#Y_Y7SC]KF%:V!J#N#%!M6^I$,=U-[MJP_ZS)S
-M;=M'2=Z(^+3P$_<&ZNP/4&\5F^)F<5]TY9Y\;!*(4T*9*F^O1,OO01REU(M;
-MGD$-I4@P?"BC3T*HJ(QDE==T*6GF4_@+[&TL"H<R%O%K;..797P\G)R'(%;D
-M;CAQN9'=#!QB0S'&@XW'#(<!,"3OS*65Y_O^$PSD$OVZ?;W6%`)[=SS&1?3`
-M5_+\6.3#S^'%FMEVL_RO9=C=H-*>_Z9NG"=CD4S?1)Y0QWQ?$:2NUZA0+'[Q
-M2WE,5H[QJ-SV#H0KK1I(_!U>5\PC6JA;Z:NONJ@HCNL31S5E.VK//!>S43^^
-MR:G/V=^_ENZ.YXVV48/&K_>GP^B&AKU=?L[:#L]ANR;-9,=E*6^['Q`!3SWS
-M*/FJI!`*9OI0L(OF&#-@^<>[)W]R*"%.-(VF@DS6!X'OZ:_W%KHAB:OA969S
-M43C,9<4%@/VOPR9?>0.73<M1&#ZI]I5%2OGO$9?3Z@GR9@B%JH\)<_P-C]LW
-M>_BPZJ<*RU'6/5:.F6N`O^-2-5.QYYEKO0*M\U):WF"?[[.^=I&L+ZP)EMG?
-MLWAK<7Q7#4M1#$_C^$CLMGO,T%^!SOL]Z3I_4WL._N^-9D-?>U]K`W[?ZQT]
-MDN7/(/Y/N3TDN%JU@(>@_F'H+5@?-^L?5UAB'WTS40A]68AOWN9!3(E2-T1`
-M1!"I!HN\!%(-D&,\/$&(C^O$&MD/M\4'X3XG_16SOGH`=);1T?75?BY]_:6&
-M+FT%^Z7W?9-_TK0D!];^AB(/R$=CHKZG26/T]%JW+P:6,Y;4V!Z<N;KF6NL)
-M_R^[G+FW8MOW]&[F'!TB-D9-C<3+5^QAX?Y7AZFVV7/2%2'1/3JJ+C(Y2;3S
-MV%F$@>9H".;EJ:?'Z((@VO%,U>X;6FAG:!56R'M;Z-1.7$=[KMNMM?QEYO]G
-M.23COHYBZ8K$`\0'9#&B?I%>6P.^/OR^;@&6D7/T631$10L+]]'U/O=:#IC!
-M?D=&!F&5[MEY(Q-@_4_A,^'9L#'\/9GT#][F4@2E(Q^+B#_N+0>),Y^3&RNR
-MTEOQ!36APMM+HG37+@P</A\:#^+U2\;+^N[$2>^']\4WP-Q\M3*\%<:K60_'
-MX&92+LOS&'>.-V;AT>LW.$9O,.=#??D*RGB_/JMQLG+2YH[&<UNZ<)JY/*N3
-M-=8$;<X'"EA$_!/I[.*O`WVN$[+[B9]_(RO=.^HA]E$0`A].?<=.L\!AV6G2
-MZ=J@'J)?D4!KTE5'Q"293/TJ]IN0V'?YLY!L_UEF>A,/>+7Y1,[M9\0-6^1R
-M=\<18SVQ_.37F&$E#9OEL-/`!-=-9Y@^,BLSX6C4\8*6:F5]6+LNCM*+4O5+
-M-!1;X2L+,S([83MX-/ORULE>KRMN+@'R;*MM*JM2LK,B%H1B,=K-(D".BJJ"
-MA`2D2E"*D%D9"(A&)`60(L)!@?+3\:C_%6+*[-!@2?&)#(^/!$9!A^0_^-_+
-M)^0EM+4\/&_6S!O;;[7!WNN<N:SAX)\0'7%$T&Z726FN3497BKFW,$/]"HR8
-M\]T%UKQC8+6UU?#HH1^+@[+N7VL4NN8NT_<F`PY`=<](J5AYV1?VUYVZ[I4<
-M6P9H<"QN_]XE#BULAZ:G9HOJ#.*'?,)["K2=BHX\Q9L^P9U3$MI]^_YQ5]WN
-MS(S,:U*RKZX%V4$??D>!>*/;%10]_#V'\1AW2D5J,2S/.;^=,.1A"W2E/8#J
-MU<+M<9^A7F3E:$+HXG7J9#2=3J0LK^'$6[*5[%\W_37+S4\TGP7=4;)Q2G!4
-M[H:@D;6!MZYW)/:/N.CKS'X^3<0OU/H=FT.E(=!X[36&2D71[KW@7KJ!/U,/
-MH%%!+43UF'D/=5]8QF:7PH%;RM<'V#K5RA:>6RZ&MBF"J/QNAT-7CIJN.@+8
-MP=DP8+AH8QF@,[57.7F?R/@6)BSPX?I/TVCX:0^]:H_.0/Y=4444"?EIA9?#
-M!0$>(R(;J?<B"(%6-M&08;9D6ETNE;K&UX5$S;KHX,7C'#:51DWR\8!SNSS#
-M7OCA1UB3VY'9693/'W%;NTRC;U)3&JDFLUF\>H[?SS5'0VKOH-CZ$=;4H^*?
-M"[MQL#Y9)--Y>*2_R6J21P'OI\#!W_<P)AJ@I>AUJ;7-<5<'<T9"%M1U%>2A
-M'99R]BXQ^PX;JA;M@*[+<J&DX[`_&6306ADHOXR:<POG9PCYK8,H5C:6BB6H
-MJA_TV8_1'BO.?R/:I&?OI_^\(1-HE7(X_;PL=-TE`\>''S>!!B('</9Z#/"F
-MIJ!DAX82[;.)Z*G^>((BA"E*-OZ4`/"X>AI(>M@8]3^9B(3[-?IA(ILD?>::
-MBTU0QTOE3ACA<<OL#I4T$(JR]3)"L'_53-IK6B<8L9^JHJZN;`]QD;CS"3KC
-M2!GA02)5F#Y9P*C_6.&4#!FBGC>3-X]WG,T5@84>:!41KR]1H:A"[/B65Y])
-MYA?BS'ZZ!*JD_6R!@CRB#]=GZ_64C/QHJE_SIUX,\%&K']I^PPT'V1)?"QHS
-M#6\-%HC11X$-"RLRD7S?.M(?;XF)Q?`@J0L[?4H)>P4FM]7.)WW$*03=!N;&
-MH.\SF62KS\5R.\L&6GG1U2KT2?6A-E<UH1L_O'/5#5Y(&](IQ.-HKGOB2/E_
-MW+3OGFY["]X\BE*&"`WOG.0O@2<S:V.1BY>FIS>HXVO@KWIM+?5&1G;MA.3_
-MKK%.P8PT^S^^"U[O&\.`D@WRQS]Y.Y_3UPXZY"JV1HU+Z;XL/K%_K81C&^KM
-M\(-\_\W[Y[A->IF?X*G[C>^P;B(`D\?#86,8L_49PPR4+W<.:RTM!Y"0W;^Z
-MKJH?`TSS%NUNX[G$G8@9]G%^K5&4?Y*&PJZ>EQ-9.:JIZ).3QYJ1\^6+2BI6
-MR8A1O)[5D`J)QBK":D8BB&;;H497&3G-9!2MVQFLA<:ZRD9Z/#[9/F.NUAI=
-M89JD73,B4>S6E>H%***JG9%]R,!&9-J,=6Y'-`N4G,9P;GNT,5EE!H9$\6=!
-M@8OHY^,+^4U1NE#\H*D)$_*JJ_)S*OU__5FF)R[;$3;2&CVW.UE97,#'JXX0
-M:D!6!PV9,;SR]F,&1WFK[,5,Q!C*.JEX1\BQ-W%K2XV5%2^+"]UE\5?Q@.1R
-M7AMH?+G?LX#[#Z'RTG\Y0?6>!L?/1S:AJVAK[W^Q_W8&8:AU#:1JD;&=U6=C
-M]^8.L[WM?U=@^VZVWMVF9?[([7+#0RR&(-.A'PY/B1LUK?C'+O]+\MS;UC$\
-MC"P9J'55NY$"%/R:-]XIA6)N+#[E\H9VKW/6S,YXQ_YC<MYN^G9==R6!]K.E
-M;\BI3LQ.EZPW4-\G86?."AD)J?O;)AF;>29"^>*,X:5N1)R?H.=D99V8:*BQ
-M&1X$BSEJSC08#0^O&/7UFO<PU;O`O-WZECF4(WFY@[U75CT%]V4SD@QC@6:A
-MV0U+FKO(97363CJ:O-)^OE&(/;EIVC;LW8/W87X8EU>N42L(?^ESRY6[E)<;
-MQ`\22F?CL?53^ZCZ@4VF8EL-DG.+=:F[8A1FIMB?=9J:CJ948&DL5H:."K'9
-MA?"TKWG8@*98\D%\HV?6ZT@%=RLFC/,<5;F9+7.G:CU"KM6>7+(+6.+J--FN
-M@:'6[%W`7TT'LV>XUX!XXM9>2Z8I\^"&R5MG;H#^S*"E/Y_\S]9\0V3$`?&C
-M]A\M-F@P1TWGD<$]:/RZB*G_LP,@_-_8I^QUAL_5;#7[+#_/VPPX1NCM;^O.
-M./FQFA`\C#(/L[G<'I1^WV>P.U?--D5VQYJ!.G_:CNPOP9QHQ?Z!O[+S<%@W
-MSR_\K>C>BD21,8<73+]&G9[W>>H+OXPP6'5H,!XQ.TEVW68%@LB9N.`*G'/7
-M',''2,O[HH]LOF3>YUE+>,4SG$!C!M@`J3*TP>F,WZU@5HT2UX#`7+OD%%1S
-MGM&G3OJP4F[?#(M<JQ]FQP1<*-YJ\B^MT:T35^'.XTS`-,<^V8:\,P'OV4V)
-MB*+J8V^-^IK0^/@ECU2L^$(D"7ZSN]KA"L<JH(\2FJLC7_)HL>N]=GU#"V37
-M>@Y^KD/)A\V6ZC/;7N3@5FZY+/UQ]9M$<F@$2O0S1P=2S5V3,LIWIWFNV7(Q
-MD@[VO#YBO@3&S1.SB+R9%Z%BK.:1^AH1SQ?833D-QC0ODJH([\ZQ[+$\;,/,
-M>D1>Z!/`HACQH),ZXT.GQE?`<GG-?HSWZ<?]M"*A)BZ8V3G!N/M5>%M&)6*Q
-MGB[K)O(/[7^B/1+>'\ORT(FI(X15F$)FJ&7ETPM:O`3(F[C7',=(OA4TU7O5
-M3A9E46C7^0UM%K\P+^V>[!MG*II`;MC^28+)M&_[LU[G+C);'%*-/N-?48%\
-MZ@+$,[T^PNE]K"^G#]27F;OHO1,>,#X6=XV5GS7^U.4M)HQ1A1E8N_M-F'?:
-M'#`FF.DO`4:@"&U-96>9`BO^NAJ,^UV;"0Z]_#;K;N4@+SXQ!H"CB4&."_K(
-MP4_;0.?W@8T_J8<5*#P2?<RXA!EJ:4"NM*W>N>N\A:UW$B/%HGX']HQZ^:<Y
-M5&`V_=V#ZHBN3'G5FRG]_`F%4O<`"Z54-"O;\W<\`A^"7"L^SGWJ#W-)4M/2
-MQ/9<?FMY6Q]!XHM$7S\`_=KU?*2?R-P)02;AT-<JXK$I--X"OL,1;1E!5]$R
-M(>8@!I'^<YGF9KKQ^XAKYJAP8$D5B/SWAZH%*?1=EGK^%<[=O_S@^G=*N07<
-MR]N3O:<OS,^B?T^-`\#AVCGBQ?3'(>8_"U:$A^NK?^FH3;_B$@',-)T7HUOJ
-MR'OHLBT-N<DM!B8K#=7<:QP<$ZZ<6MUE%]M+Z&1#O=MSH(7Y@[P!>OL?QBZ*
-M2\K*O]D?*2NH<?5\$]/S]$8NOIHVIX=>\EG+J_VO\,8N>SJMIQ<S0+M7D<%8
-M]S?^N?1PUZI<?IH&4X+G,?K\EIEW^@@E^!<:'B''G$^<C#I/H#RQ<F-=6^-\
-M"-PL-C+JH;@QF(^^]5:\C7F-`-_E`@M;+YU'@%YX,G]M[X2F[7X!-%?2'B"B
-M#=6;&6-B4D>7Z<!WNWV;Z^-"'>Q$L<*#W,E<<,:_]N?CCY`4SU@;]AZN!@#8
-MST"]\>`6B[#B1_&GND-DZEK[G?FIUOHH_,Y,P1#8>@4RKE7^RD*VPF^"(D^7
-MS2C(K#ZN7:X'D-!I@=ZVG/"X`<U(#@KQ^XJ6O^S?$AIHZ1C_!A:\;3<&MIL7
-M>6:K$^!M*,Z<2-9TJW#@'SA)Y\E;:U1HF`H^?J!4]X'N5?YPS@2Z:\&47!)R
-M;`O'Q@BOUO"VV@%U]3LW$3PRK5K^\$!2$FO]U6QO#7#+X^\\<TQA8Z.:-':(
-MU1$O,VUA#7L8#6<X-:NG2J0EW?M2\;!Y+O"0&]R>:DN*R=\^0SF^K]!&)CR*
-MJ9:0"%H8S"ES>QI*V.L'8K%<$@!(K^<G:RPKG_B:SH;2Y[*X&;X?\M=_'4UA
-MN7T%\F8@SU-[!%3[](R)RF>5?,CO_/@KJT1I7T/C/9]!5N98:,>O@&8L,K$%
-MT;,6P14,DMM-#&!/YZ$^2SB?):D2?C$J'SS%A/YWLT?U7^'>H'VQA?H7R*.I
-M5DD'O6?PB-NU@<YG8Q[3"O+4-ZO4>E&",KSPR)J,8>ZFO-D^*V]0@IA!R#L:
-M=/2Q)OU,.<=Q)[3ES\%G\I00Y<'`O14"#2IKA1IPWLK^:2_O>KJ6,ZQPZN;A
-M>\8L[8X[M]@>WDR5X-;MG74<T7L.\\RH%'F;NKT7DT:U<A</[N%_GEDG'F5F
-M\&,K_O`G[7D>S_3FY\94&,;)R5S2Y%%1^[M;@6ERKAVJ3-=S8$MJDF!!N79%
-MY;)^J\4OQ^_TU:TFFG/?6/UOU&-QE^-^0]K73^@ACQ&<FUQ<UJ3/=U]7#>4S
-M;U5T\<A7:?$:`])U5]].:+2N.@8ZRV0>D`Y(\(I4^??LG"[<R`KZJUNFLRBO
-M-HMX;Q!@_8GK[!5?4X@L_[#P,=M"^'947<=\.^*AA>V(?O!:,]?=&@]^MI!-
-M<5;CW_8;$X"`@!J#?W5P\N<'&N\PA?-FK+S6WWQ/0FOUL_%]RWOF9KC?39=C
-M\4[VEL)C#P.9DEP,'?'UNI>.@6S=],^GF954%[U-%P]YE,KRS`Z;6F$DP+'[
-M]:]'DT?%&JG2:9#99+;O_JOMM9TN9WI\"G432$RQ^',Q+3LF`YR_]]J5#*M*
-MCYIOXMDEZRX=.+ENC30F-'OI%BZV6G3(S`$F8BAH>AU6XLDD;;SA%V<&XYXJ
-MG[CX\V,FM<OB],=<QXFF=U)B*Y`>5N@#'J_W?2&D,.5/1&$W47ENY8^\#DU*
-MW^7!6WE=H9KI;VRU>&TT,O0'"[>SQ*C[;T?H9+A9'L5@<ED]5L>(]857IY"E
-ME!+ZZ[L6P<+G%,F'R:]@=X=7I-Q*&1T^W(F';ZNA)A@+FY&A"Z8G:J6)MZER
-M>6667-Y[#9#7=,[BE`:],6]^APSV;K17V8XQNT*!1$;0M2:-V1?J'Y5"Z;*1
-MW)Z*G)G%85!"-,/VYG`*22+'*W_Z9B-56GBC,*BU?EJG,5/17G,K%D.$I4NL
-M'B]:5_BNA%-1SK&I>E_#KI!G(("'^^WZF2V=X!U%4Y/6%N37P%'AI*RA+CU1
-MSI7%F^O/G'233ENB&KG=[@TVDF$_Z=AE8YXHJSY&*?BE\@=TM"5`M_QQ*S97
-M)>O+:FMPE[SR52T'!:";XB\^1L?5W^2MWG\#E3VL#?O*YLQN=*'W.)V"[FPB
-M"";-H\>8()>Y)$)4\!S,67%8P[WM5;]]?,5M>LGKBF,&9PR&%^A#!%%+3/<*
-M+X0XX>.UL3=\6`HL7P06+OOIQ+K0'IX4W50$>0PV1-4#]6']SJP@G[V#/CM2
-M_JF/S?Q<#;L3N4#A98H\*TQ0_WN^>::P?R>Z)Y.ZXF$F[@":SV/;2B#M0\1G
-M^S.$[LW1Z:`"AU#\?V_Y0@8[!/J4SF'YJ7M^KSVJM;_]T,,;`X?&M*6A(*.Z
-M8_>S&2SWAL^:N[X\)#`J&8?8-(]G@R22Q&=Z-AF"-T<7$=MUENMN;<?<\*(G
-MKAO/+`T&H$)PX2LI7UU=NK^M6>%QX[3#Q!1X.;X?\CI_.SUND2BB2MH&VO<K
-MF.PXRYA7RV6KVW4&/S5Q`TM-B$R5_B*<SXI?X"\RKFH/X@;5(NM9'G47C0DN
-MV8PL_W%,Y5!ZW)Y/,C]==F@'-Z,&0-U)4O9X=\`P>M;Q!4<G.0!DO-,`:UER
-MNOVBEYR9LPL9@PVRZ=(\ZEX[8-#^)WU]7UY7[#KS7O]98;)MJ+OYO[ICH'B'
-M\>MA$D&<X%I<YU&_/>>E%S;?+"<+A4_H&H.6Y@L_6VO]T&AH?HE:3M$_QV.I
-M7CD&A&FY09.`6:_CI!I&W9G@MC<_X@_HO\AKSYF\W85]A'&'\36-&<YL,>)U
-MN\.;4'`<"%X<XHU0!O+6XV1[@^TQVX9^,#10&4089;/V@>OX\C27J^^/-*^&
-M1C9ZP>S(S57HHXR.W7Y%X4M;F2B/Z^ONZ.%)SOH_#]2UBT8$Q4P1AML^*(`P
-M3?1#"T^C<?7/G2$E;<7"?L/;J>&/'OSK3_9Y1VRM>9XS>S_W]D-9C,^R]TPJ
-MJ_U]_:<E+B&$H[\[\]N<+M@YW^EG5'9G0CC*:KQ9X2/D"<A(2'(_1BM3AU6_
-MP@<2"*1]NH;L''H0+7$IOZ#EJK.P1^\-_\:O^""(!O@/QH!,XY0#[-3N!3F2
-M5-2HCQ&$O+?\/0HKS@FYI9G-"@>'P\0@_77#*89PU,(.M^75TGODAXWKTL6(
-M43O0)-!Q.UJ/8P6($A8#P&KUA,"XQ4Z(R8,EYJ^;'P2;#W?,_#V=O(@:OR;8
-MT(8?OA&>J%#)F1IG>Y&&ZF=-TKVG,6]I+X>R?!?I$?F:&&!XP(*%IMMUSSE>
-M6:08]B85"[?]'_KU)-<JM].WAP_&[%%8%#;WS<8!3,7)6.]4F\\R!ELH<+C]
-M%OU-7HNX,X=E5GQAS!F*4^B'R$'UY)F62M"7<H<=^\P57S3(FN!`@=SQ7^@-
-MCQ+NW?JWH%Z\-2SIO1E=UVG-%H-;2C$,&Z60!*DU04@Y_D')*+K/6C-CB[]'
-M*A1J5ZR]AC/X>>WH'(,"!I[[O.X++S$$Z(CA4.!Z!<Y_+6HU+MA%IV8S,8*#
-M>=?;TP'7?3*N%)_O!V-O2RY9OTYD]H(&8+B4.'[>/;$/(WR9XMG8"<,2B77@
-MNIH6E_BZ)7<#LR!6=&<@3?`Q-#H,?J2#E&.IKU=I6QY0600$A(=#!G+P=M.S
-M*.77NX!J="T;<:)U._N6(OY@#APKYP."LPX`'?,F<R%H5AUYQ6*/VYW%L_+C
-MKO8^!D+T&N.:9:R7\6M&BS2NFB#@+AS\%9I/43NA,QWD#9=W'F,?7EWKV7=4
-MW905#`".A@*4W<47EOZ41FD+V>`D,Y[#`+W)B5`7779$!"8F=YFP]@5ZL\L"
-M6(S/CAF"$Y=[;W_*Y'F^M!*?T>#L>F8COJ'O]G&0CQ^(T%FYF`^7Z8![7%TT
-M%F?9`\7G8FM1<<7\/L!PJ6Y=_!=#2WR`5+#WB.TBI:7NC;,B]^L_)L40_-_;
-M?\.A?!`%(00K7[*``7(II^+9$2`4A$BE115143,55%1(@%04P`T(20[K]`R!
-ML*"?ZD_K-G7_9HGUNP?!BQ40156;<HVV;GW.AJXXM#U2G)26;&-IZB"KC9SN
-M/Y485HN7:V3H7]25"?+"_ZOA)`8=EF.*>A?)],0$@,6Y]!P)_9*LU-SVO,_^
-M(./;XT4O]EGOL_.;@DN4W2G\KL$<X=]2.*+6\$#2>=9A0X`E-LEVGHNYD`'W
-M&/U;K3J21`0'%AU-C%?^\Y[=(YG2&2.`]4U\L;`D\IKY!S%;Q[@T,XY&*9"E
-MN)*XGE5]]^2DAW_!P'%F#>9(,CD>,5NFJNQ7=![`4%KOW,/B?4AJM=Q-OB<K
-M0JQ@-^,=[)SK=W=`H[2:;:^C*LI_8]HB^B"+)'\,?5'Q+.8MH\(>AZ,-*@!:
-MK/QWF-@ZG'XXZX@VJ:1$038,#*I<](GB*(R&3<JL9S:C_#P$"(J2AIW&,@*F
-MQFLG\9T;,\$G%:OT[[^UGX)-<%Q]CE9\_!$T*&'(Y\5E_Q=B#8)8AEIQ7'V4
-MVWD]V%E=G[T@B$/[-=L7,>`@(RVDRD=6.4>"9AW$JA3P)W6R?X(2+O<N!>=A
-M@3`N0PJIXEW+$IWLL*B(.)!<?*P">2_\>+;<"M9/-K+";R6&"QO5_"<#[`N-
-M6CO$)`/:[\A"]R@Y3U1Y\M,C,@:M\D<SC]GSC9$_H>55@1$"R1'C:?,^=M@I
-M@-TS`N%,RGR-E:=UU<BH<YAY[.?0Z0KN.MN8WZYQIW+_SB'B+.6LEZ&2''&N
-MFVX-EGFILQ<K/O\O*GP-WV9,?]2U!XD%#L\<S?^/`E^2B^!`0W=^(`I$M-^S
-M43(Y\S\/=HKU2!74%B:H:K_+O["<U[-0!_$Z(U'V[BX;`V`IOA=8`+&?BJA<
-MYG\0V!$73KNIGY5?O/#EWVWW_T?^>>*HE]AYM47(;-^>*CWOJJ2;XSFQ9\"4
-M((-2.U];6QH%(DR:I,`:;1#S]5?3#876*V=OK*,W8,@46MC<;5N'W(1QE/X@
-MXF)KS13VED"LJV1.&QO.6][>K'!X.;-%FH73.AHJZ-SLL*/Z\"KU1P"]7+Q:
-MFS8&'F/^UIE(HM;;&(W^$.SER>O^WU=KD7J/$(2MLL*M+^"O,BGWO.H"]5OL
-M5$V);;U8'([XHC07/E5[?*\O198X0RQ0[;KCV.Q6G/`EILZU[067?=S($/AS
-M)@@#MT9!?3'LU)"UE_]#(W\-5F@1U0H\B+Z^,EV//:=I+SIHA'LSB,N9@>R_
-M.'&/`MQ+(%*R>>FSZ)2!>QLTET0C(BE:U7AH_<B!!!OFVIX:I^(%E<X:%V!*
-M)=MH>M9WYXA&&YCP?$V3O@J?#B"]TM,Z'F'"#WVJ>\H3!4FP^$T,Z8W/H@XL
-MR&*U42.<B_/%/39^V6FZYVH#C0SOIH-$A`QSRH`VO3X9X;CP1QP[!9"W.U.J
-MAMU@X_#0`4O*$%RC.[GCQ?G?Z^Z-A\\5IXOH6`D*D'CF6O*S_3T:*?\\Q[N*
-M9'&I"G\$5QX#G(^Q"4;">(G[5)@[5+CM#Y8?OY+E:1G@TE#\2&>8^47]9#-G
-M@,/[KE1+D/6]6[1>'"Y-3W0-'GFC\XR8Y%.?(0GK!K7^8T1#A9F*(2O+F/=2
-MNAWHF`'Z&YLJFQ)!?_?SXR5CSH%,I3X#:FZS9&R^34`P>T:!NLL<=`NE^,L!
-M)4G[-FR&'O^#9-?7!NGUM4;+0.TX!=AXV!S$.!V:IK$G/P9+RIKRX$4=4>O.
-M!GC:KP?.`]*(%;9&!S*\0WZ=M#1J=K1''-FX/)PAV_^Z-&N&B8X/REJL['>L
-MV!`=O!V0&5F=*P'P'^YYA>%E.'[U>M`QN^OSP/Z,"5A<3^/'WD)6J81UNW+Y
-ML%O?S\W^G#RP3RU=G`&/2`L27L=<]<`Z6G<V0B]W5/)79MX[XGR'8LQZWO:Q
-MYLNT2'6.55)G"E.P(?7S>+AN@.!L.]XC9&J6"5"GS&HKRZ/Z.+2)R.D2FO%E
-M[_4V!L3>[B@4HWOQHK)>CRS\354Z/@*IX#;KGAY@6<9RS0<_N2=%%8Q/=IUW
-MN'2'8_%0!4;"YD.@<`ZRYP`.M.XBX;=YD@R1^.V!MP=]%S/FNZTR75+SRIG2
-MTQ"HJ7.U&F;3I4?:4(R)2O\`I,''>P%ONF5O=E[,IJI\V5#1RQ%[-DQ=5CSL
-M^I%^63(O1ZN[Z4>3OU(3\L1/SMOO0?D,T!2^;$^Z.0#4C3P9TAZQ#&&1Y\-6
-M@3D&JZ4VJ9X5]GF\"=!>[[>>RFS@W'`F@`S?4(O,,W/+E0?`>-%>#%,AGO\L
-M@<Z)E(]-,17%_F<6-12\$\7TI"'V6NB_&Q[(I4(O&P>"AUJU>GBVE[0@"WDD
-MI[K)\Z2-\G88%LUR@AS8M:@IC6'31(SW)*XGKHT%Y%$D!L5'UZR4LSI2ZK?T
-M:(E<QGNC\8$`=8*<NRK5T=).[0+K?](4IM*Y+$_D4NJ<"!W;@=&%OZX%"XE[
-MM)#9)3?N$`(\E\.:X!"5R,$A0G"W^[XY$J_&4HVC&'2#G>1CQR`(ZUT1KX`4
-M%WG30=OSMB&:S<33<\`=*DQKV;+H0440NM<99Y4OA8.>:FZ$'0/3C9<BK_M*
-MYQ4`U]=W31?JX<_I`"1D#(J4QP`T"YF=B;C=X`*OKHNO:1Z'>D7AJ<<^;8N'
-MX%KS;XA'QQPVS/[<&%`":VX.0H^..E2!$4SM;]QHK`I:YM<SZ!>J-=OB'>.Y
-MMR-TW*(O+Y,6H1D8=WQ#40F-WS\<'.]TR`L[=X;EZ*!.'9X$'0:!"7^?B16.
-MXQ.,".%]>$7X8QX/`@M&(">,`W)XTA%8*GF&AL!/'<Z\D;OJU<^75J`SN3L:
-M&:I@2SKLQDZ;];FF*>:@X&G)^X?X%4<=W:=?!"TNG?&TR#(PH`9<EGHAF"`8
-MX%9M6I11""U)C-0Y/7$,U52N$0[-OX37#57R_<6L@'N>X>!X\3OYH^QDQ^4;
-ME9,Z=R=R`ZT@XY0WAPX`X$IIL(^+_'D4TRXT\.\V5N"`'?\,ZROLG!EZ,1_@
-M#]GL+8$\S3SE-%^-!:D7NMO-8<(#A:#PXKL#\BR?8)L`*JTGSTR>\,FI.GQ1
-M^8>$OG%D34U8K_M5/`$OFS0_3Y?)7L+^RLJ!KT5T0$\SQ[_HD'#I/&!5]];I
-MC]KZ]:;,)0`"L3%VZ.XB$@1A::%Q:$&2:0EG6))&0K<GH+#P\E]\A(^KYK!M
-M9PY.JM9H(*S^1L@$A/K]3=#XWAD@#ICD=[D[K\=&/]?:0D07=_*8F-`V,Z9(
-M7XC=E\2JGX^9D!.V.`:YLW+$K2YKG1)9O5?A$D?DVI.G^VX<N1(2"R>[>:/I
-M1Q!UJ%^ZT9[A7J.@-NQ(ZUB=^@04'C931XJU$<$>A6^UL[[_GRI*`KO]_Y0_
-M4XR7I,[*7E]KJK_*%D0VVFV-L;8VBA;>D>AWVCO/EZ:S1<9R@E8?]_1[K.Q6
-M!6`;3?(LN#B;/]<SAQ):>.ET_D@F/^N,\CD[CDY^2A2YM-![A._OKRDS)+S-
-M'I^FGGP0A%G>_'[=5)/73K][:X,'0"5-U8[EZJG/:I.\_/MN'SAZ9AS>00D1
-M(DR*[G9VT+@?*`^,!4Y.`S5>`7->J5<W!QPUKTJ?O9'@0/[PP,R&;B^RXSGZ
-M5$:($-DJ<'7;6[U%7@K"W31?:?LNA(A/[J5M]-@3=J_L!A85]\R\3Y/^6$HI
-MD0"U6YVYY_DVC?,,LFU<'>=J5<M6<.*P(-/79H'R:3,<OE6'Y_.A0$1.G*6J
-M^)<M_(;$?,^0"D_FT%2_+-TG5,IPDY\`;!&[>5(>ZG8]N8-:2@\#KZ&>'K-]
-MM<BI@#M8V,D(_*OKKUIU:4@"CV&3-0FO*[XF+%=*;:XNUO'NDK#Y`="`%9(:
-MNK.-@!&G<Z_2X&Q^G12&EH>[W2QEP>!!-3,XF\?FWDIV\#<;F*6'0QO>0=("
-M0ZSIW'^)X?!0?PQ\C@(*EET/SX-GS_?TD&*8E#XZSHH2(+:XTSTMP_MTT.JR
-M.K;6Z"HY1``5#L7/PZ3'8]8?/8_,=/3'@"5]A+.*1C<P_,7D(@@G<A\;7INE
-M\WUP`9H9$.@R]#_)47`"PG%Q]?;#S;M]]V,U20``Z,6U^Y^I,#>V?V;NIW&]
-M*[2``8MS0:)O)__$>-^F-`MX%G]=ZC(%V:#/ED1QV/GPJPYT$<(!4!!N8QSF
-MPI<*M:)_A_WIG@0TFU^W$?RVU)MF%LFTRP:K):V:0`4SW83`H-:3<C>[&<^R
-MN>!"'O_#OO-OA.063TC[^V3F]#QDUHB`$WT?.TO4T-$T)D%OO/)\L^`2_YHA
-MVF0)''_)?TT?S%B"G7*)2"(..*V7^01SSEKZF;Z2\(A7??Y^*@97!K6<R]N!
-MX@%[N>):OL\4=E6)R:I0Z"CWG/M:UEI#\@D'(W^U^E@Z[AM]['T_4`&ZL^U9
-MN^HSR+W7#B[Q^!G.;?]NYX@'&Y7NUT]/%HP2Y,:H)VBL$YM/D0V26U_CM"SY
-M[CQ1-J,!M.]O50`KE\>_,XUPO]+$Y'S)!@ZE$1#!^GQNOY`0Z0U!$;B]-7*0
-M`ZN9?%/RA(?W&?Y*1CAF)Y_0D"2(R_@U,AMFO+*LUE_G.9VRHD1`6+[@!*G8
-M-6LTG*'@!IVC`"`/NXH[?SG0`P8W<$WY;=S&4B>JH^NIQ:(@$=A3RFZSU3TR
-MCI:N2XEODORF<="1#0)\1UBZ>&/W/)#[FYJO:4(`$&XZ3MV0':I[3>[R29DV
-M3'M0D"W*.)P5,N'T9/?\#=)(@OL@(OUL]KS)HJSFFX/P0#\VGP`I^S>!S=Z#
-M7?B\SG^`)H=<ST%_AWDC)6I%T-H-3K5CA:Z#42&^VDW]Y]*(BU/RGJ"L(6XA
-M7G2/%OICP"EX>X5!M.;O-MDIPZ>!#&T&'<5N<!<`?OM0UCO-1Q5JH0D-!R^V
-M)J529:(;YR(/D7VTK??A(K56(N>(=(*_D?TB%@B&15G'?4FQW]2IH`!GN3>E
-M=:J8DP3OOYW,MNW>+X^`K(/M*DLRJ#>[MHGQ$T:XA!!=4O2V$4!%><'SFR@0
-MXJP\.]1D07GJ<RI7RJWY35YD\A(EV7$)#]&`+76"?EXI`0^/$Z=79;X%GN_$
-MNN&J\((\G\T)`:.#BTKG.H"5D*I($_(&OCRCY%-3SW6%E660;^LX#O*I\@._
-M/Y<"LB^=UCE-Z8>5P$(`PN:;=/(74ROQ-P?W,)->)U`0'T[F$!'<Q5P:*-GV
-M_MH"`W_SFM\!\?WK;Y^V\S0NS;XX7BI(!<S``J]QPQ9?ND.@2F3(I)ZPEV8A
-M'MXDK25\-KX:M&1"DW0+&OD?<>J2TH<6[G(2+S7F'ZNN7]C=[P\A221X"AWT
-MY_U:0[1,-127"0=`"\UOL/##L^DOE[56D-EP82X\LP0&%UOSS_%U\@1JJN:B
-M-G20`"TOC4BK\6N:%A/;ZGVQ;L,K]^JE)GP^YKO8S:>]2`%4SLQ,+)>[Q[K)
-M\[M)PI`#:^M,S-W``BW+0QW6SC]E]NI@N!P03AD,U'5]I4;&#EK>S_*RE$0=
-M75L*\X:O!2+L8.&WX\`.;4D)_SR2^A4,$\11U&!*4W%=Z8,?IUQKY("`QE0]
-M+IF!"2Y;/09[,?&J/D7&NB+RUN'#]XS@92:5DV#1@#AP(+S>H3J:@1_*QM%,
-M%EWCS@(ZT)W/8OFT]"(`/_TB5;[P!\/--HQ7O/)HDMN0@M!`@8/I;A1)Q\'0
-M7'A?."->7=[3'X*WA6R`#1>D%GCZ</@J4-^>+(M10U]R]7!-'(Y/Q0$3E5?W
-MM]H`9L-]33<1;SFQG=]Z>,D`#+=7CD5`.FNJ'(UQT"9<78`6GW0J"^G??IC(
-M">4J=3.KJ4"$1A1`*!SSS'O>ZHG/R^+;6/Z^_H1@B8.)Z"#!#7*=J@]9@SWC
-MY%9(\R"US[ZPVZ;63M)&NA!RA5B2A$8`'XYU002QX>;>>W)L!X$N>:>`_NBL
-M.4B1<X\06H_')P(/\0Z/XG.JO\Q:0#12X/[9/[[`^G07GP?.SD!5++3A\6&?
-MNEP(!+S9M<R240'\Q^C"(%()6XV3:K+;`Z12$BS>BO.^!ZVW?W78TJ(\1*7(
-MF>D012>Y;[XX+_JN6U!"P$XM[QI:F>/26/3+H^I]$DD78`%+DS@M>7":?Z/E
-M0-;L60)=::9DLB)>QE\`L6#?33Z&=VNPW[=5)!$&:1Z!)76;M<-S-G2&S5/F
-M14_\U?=_[8QB@?`@\S4$6%]GUL_<8)&65,01J(BSG.O""G_.]_LG;;')GP4%
-M:J_E`N<Z@'W=Z[BZZ.0$"_G/!>^#F*++HMMP>:Y;QRBQ[THB"7^M7/`#TW[E
-MAM3?&42,-3EY$@`?2.E%7P$)U-#.:#-<ZNT(O1D_K%<?7K)X#T5Q`)=^&U9C
-M^?*-;=2(2'M3CP)CZ>!R7F(1Z)(GM%.+DNE$`U0DHMLBP5.<Z8E_&<(8=\R9
-M#`7J:EOFW+1$%SE,$$V44."!RMLD"&UR1;I8F<=C,\Z:PI_^$A%;=5JG2#=V
-M\W)9<,)+/T/D`VO5N0S$IMF.?1..(P*D`B(O(QY_N$(7>TUT;J'.II@!D(2A
-M94I0T'JM<%"1/.[R9#^)\NZ5JD=*1PX_C$43SA:VF20O[Y!(""^922+\:=HV
-M3J<+QUUQZ02+6XJ9R9S(R@)E@9,]NG7)W=]QXJ&2`!FH<`?50]2P.0C?JND?
-MU=&188`<W9((>PI,4DV_'>48+^[*!(!^_YB51V!T6[,-EEM7A(06,^0%+A(]
-MJY[8Q1;JF2>\%ZX200V'8E`5O%6*6T,&KGCX&$]Z>.4_."$M2=OZ8B7>ME.@
-M*1(M%BNT>&B4V5E&4RCGOD@`51$HC-+45]:EED,?4(05K5Q:.>!<#,;)22%%
-M^]I\$O^2EJ`!EWV47;\5-X*+)H`51)R&7\H'OKOHB"-D2/[1$7N;%:_(1+NQ
-M/L9O*FHY"F"^='1D01[^DC<1F?L?1*8%O@W&](MWWW2D/4VBBLY`$,A[D9`N
-MR`/QMQOA6A/R?.I!P_F_(!<D,Y:5=9F5(F';V(!:/6\IB^FJ2\XCD\#*I`&C
-MT=41:3N=G:B1BK.7@T`%M0@ED^PS<6]8]ZSFVV=+7I(!6G+@B(<_.QMKZ,+C
-MP?S=9:<TEHE`5##:`#QP*9FO/J4)X#S,DH0I/,VN<I-"I?>!AH05%,=4FMRB
-MYGC#-'0,C?S`()(@OMJ:H;*4XKNW9@(B*AO"*FN8%(LOD=#YZ90@/WU;_RM_
-M8:%-_K)CHLNW2@4GJXN^QX`YZA(064OA.]*F#6A!:T@%KG4\<DM[>G(0GPB(
-M@S];2D30M_45-;R64'B'OA4[3D&O<U_[Y\6QZL^!WB*(/[Y\[9[IBL/D+6F8
-M(0`K&TVXN\>^:%O2]2MH@$N^2].0*$R,@'F*KO3UJE='8:(1)!?:-,0<'9$0
-MT'G?][N@NQZE;4<")2C206+O@4/J<II#8N(?RDTQ$P>A#@*262!=[[5&K2%5
-MWVN59(CLOH:\KX'IG300X-!0@!E\]F3B_.Z2>)#D(\ARG:($`Z4#43J?!"?K
-MFF:_J;SB(2VF=O#G]UD>3W4!"VR/5!#V\+\1@G>XAG3Y*%CY)SM\4B'6:G-G
-MRW".WDY9_:+`#!4U>\X:YT*-Q;$)",BVC_HT@.K8^>SE*1+C-'C$UN6=`_(R
-M`D(TB&LQB5J!$]7S_M83O,B+M>*ZX!%CKU$$2+9\\\7P?N#F^,"'EO?(O=56
-MW![SJ6W-$*N>(G=%QW->Y5HYLB`F#GZA)("EE1VMZE(TI^9('S(@5_S2(6'A
-MS]FN#(]#<YU)0@5=NV)Z_6D05IZ=VR7PA.N:VY[XTB(DS`==@[`%U^YLNBC?
-M*Z]8Y%N1"JGB`H.YEHW>O/'0HC"`BVO=G`0U6OBFW/Z.@JN;:2&B2`$+>"%-
-MX)1A\239!5UT@JH@%TQ_2',7-?]HY<?^P?(/%GQ(0@3)GT?VI8ZMG7N,3:)(
-M%Y0S9`EEUI>W:[8?S\]-<<-B$O2<T(R+B7UC;ZX@,SS$K,8^QS>.OP@!5,*1
-M;6,@7-FFK&-/E[=K_R/$96($!LL]D]#BMFYU^JZ#&>X'2SO?9T>\3""^\PP!
-M8S$RMV\!03.LX.]DO7B802@"VEIMIX@6@1C/[:GS,TC>JM"!8ZX@&SC7GU8A
-MN91JAI=)1`IN_Q.B0#7190>6/G$A>/E]\F"T3G7]CH=)K/#AO2H"8''))S?B
-MG<)DBF0[)%KLORUMBC@A+F+-8=_I$+$_G(SMJV54@K7/H\J^"'5?*F_T*=^I
-M'.]\,5OR(?3=/VW9#(2]'J9*MJ0B!0^(C^>.R9`3S=U!GWM>Y!T\!L%@@%I<
-MG[Z[IGWJH@Q)[_UY8B#)45W18%;6Z#.UT5DQ4)0!,01B!+:Y<8]6@#E;'-%#
-M$A64Z5*`,PSD0/JM7OY^&F4&0B#RF0S]>0*2Z.VVJ1J0\>MX;^1!]:S:#@JA
-MUVSW">?Q^;-?D%@$`]1&+OQ`27&QKIC=&[,"2%R29X2*(DBX^N3Y#5ISL2?(
-M:NQ<_UQ2(MJW.VP9J<[-KT?I@"XE)UHE4L,CZ-)VT(>-W%RBIHP1/7F>,?]@
-MF.,)N^5"9%(+^.I`>+H3"1M5_IK`D5!""W?LH(@@5?Z"^NFT_#D`P(BR&F[U
-MB`*_V^:!O-C%A#LK93!02&:``K*"T8+9D;74T^./JD8Z$1_7^7O\T:X=!$MI
-M]!IU77]E.-K.I,H0-E41\7787$.@ABM#':CU(K[-S#G#1Z07VHO\D*K^L60&
-M_FOO^L$UR2D578:+-D06K*AN<.G1RM;&BOTJ0A$$2N[N]?$R*)J/EC9O.D1:
-MK9X'5-1=ZI#JGQXZO+<\B+RR=?O9_PYJSV+[/&00#0XY^5C?'4?!I2W46D=$
-MX(MBV*OIZ?YS[[FX=4+2XKC44PQ@B;*%^_:,J&(;*/"F&$81P"K]^$"*$R'`
-MNZ-)GC`RBR>0`9SHKOFX.,`)>2Z3`2H@PE+SH@#5):^HB;1:(`1HD7=0IDO=
-M'3*8ZKJNB"B[`B=MOV4MYN^NA&75TU$0C-;[+.XPE$$!S6GC,*NCQC](^[+Q
-M[C$*I-+>8B((?VA%."V6X6;$P8O#`N(9G(.*N"]G@I[_/^=>5TKZ7=,99KIW
-MDHF,^QKSX)ZE_NR1J!W/XT@.WU44%G5IEWA\NW_4Y[VF!.9?)@`<ZOG^E67>
-MH/1?W^?@?/=E"(F=';L*D<<VR)6,X<6FM:,"A"4<(L2<V+'&Z#).((JSD6-A
-MYMC8+>O7,&Y2%2N.MM_)SWER%]2H@":=@QZSN-*%"*1OCY;ZJ-A7+-:J`B#(
-M9U56UH,+TV=ZU%"'ZM$FJSD:0HI5GOK_QX`@R.%94^3^%)+;#Y9.JU"[?0:W
-MX7M`""(O=553(ZNYT)+MG>P;(@0%&8!,!@`EXPO]'">>%47\GMYU:^+(!^%!
-M]:[I_CI%/P8U<M?4/F3ZQ/6?[^NOV"$`/G#_/4).ABP/BU1`ZL06;FTV6[V6
-MYEWJ]_Q>=15T0?HVQIC;6P:X=3+\"CI\!\_&Y4L!!UK,#O0/%Q,SIU4_.H@"
-M"B1%>=6T4D!P1)@B('T&8,>[-W6G/$"$*VFS00@=%Q-110A5WC(_OC'@,-E'
-MVW'NTSLOD_+;:SMI6]Z-Y#544T4-3*X*C[F%'F:_:,?7>WK8]!)N]-F-M9+C
-M'BE^OM:;$VFQV6$&6P80@7RT<G\<;PI_-?ZROUR(>=JJ^)'>3'/L_>=7U;33
-M$PY[K;)#P-WI_,SKB=(@]L3WOIEVT=OU]_L@6*,%T$U9O(K`T`/``-FFZ?EO
-M^W[*/LK-NG$N<:._G+1;K_1ROO=BD$`'9-V@]9]C\)A-$V*!>]:#<S7\G1@J
-M*!)22`*%TU6LW>WS^C\B'[TLBW0&38H``"*E\]\EL%DN5PAHV.P4H;]VD0Q-
-M[>U.*60`YV^^;MT,/6C@37+I&L;4`LI.3J>)V*VR:";<F+9('?9\<B`W[LW*
-MKB,T8>D4$0ZJ_%P1NCX(KRT[&SO<WARZK;JNH#5CS*$`%Q(;X8U=5;6G3Q++
-MMOBR(;WN"66(RYA^6J[[E,5U`L7:DDA`#RW\3_<R+SSI%MI<N\M/"F1%W?$D
-M=6-#PC^(Q]M-9^T`"Y<I;?P\[1L4)2X#JWUS:J\'>UN"RY*SU.,6G[*)B<"!
-M3]#\:?1&\U/?!J9\:D;D0`"2R[FR_:9RF:G0]V4E=9WZ^+XD`-+SW5V4"-GZ
-M^26[/5SR(`57$Y-OWTXG:>L<GGUWSH^U2H0`D(;'EBY6Z0T2]/Z>W8QLXW-+
-M.%5_ZGON1TEP@13&6N''D2*LX[/./W^FEU/B<_7I!`!LF9'&#>3/?0<G7<+Q
-M_'[ZQ$"*`V?D:(G]K_J=<`B#S46-;8*:-U`Z4'QLNYP&-6_BB0D0N[VUM;E2
-M9R7PX:'99"0TLW-1/`7.!ETH$1[NKBV/%&$T*"YM.>]]GV1O(0@BM&>Y\[S&
-M*X$#7<C6-F<RB'H]Y"1$K7.X44J`CB9Z?6<C%W$*MS!C+Z9I0I`(#*\AE>I!
-M^&G/\%YU;:VU743Y9$0*\WD!\./25O0S8&#Q:I[U';?<IJ'DS"Q:ND@%+Y]A
-MFT:GFM6!QME$4STXKL_FZ!D74@!/7:S(G8:%:-0\W-%>J9`NG472C;`.@14E
-M6Q*T7,^>4\B,B%[9\:J_]XG"D`NG2;9ZR\:?-37LX9&"*]EK\"P:'^G5A,FF
-M?L.N[#;HR(I^UFMST;=<]J]H"$VT];C=%J>IH4OSY4C(*B4")8>\&>5H:5TF
-M[2S&]DH-`0)(,OZ9&CJLN:Y*4/!CCP(9_MMP`5GFQTB]LX;K]J#'-6_W=+']
-M2DLB+Y[=XQ!`RP8_P\L<-1U\BY]]"0+G$!N(8<%;6V[7^'K[O1(@15VAC5+-
-MD6J3(ZZGZ21:.8ZLLX@XJ>$"4"`E7OY\7@EQ6)^>W++?#=L2<A(%?\V.UG3<
-M2#OLJ]G-@AN7%HC%"BW?YRJ`$7)[=`EGZ49)HX_9%@@1'@0D<"*Z$)LT49G^
-M^^-DK[`14.MI^,1-:CF<N_,.TU";C4<LR))`67-5W0@*N?7WK3\@0&Z2ZP6:
-MPD$`S;BLYY%)3KKQGIZX+2T*/.^UEW$H`KD.280_@A6>&S>5XT+$.LZB!"D]
-M;U@;WFBWE=;=S[JKXJ>1;6RDD@!2&S[^@K2*%5-![7BW3*X@5,`<OJ:I)0PY
-M`MWU>`.[J)VWG)*HB9BVRG-G;Y-]W&6R(=R5QV)VI+$PN;A@OLR-$WKF.;YS
-M!7SZ,@/;=Z3<\@%R>-C^(__YTC>7ZKA62"(;X]Q[W[4'EYY%EDU-K@_9/+]?
-M7*\-8S"2"$W'R06=`DK.=1.AX@,M64!!>A^N'+*NYT$*529ONZ$!M;M<[F,Q
-MF@55S>6K)GUP9^ZJ;^SX-MH>K8+X!";\7=T7-(4]749F]V&1B[&AIT8`BK\B
-M6U5PJL="23=Q*V];'9KS;4]+!$7?]_'!-WS?6A6Q:$M9XK468+%E];_H4G-@
-M$B(B&\<+KQ(R%9P7E=2>9JTF!NEA$`2)RFXH@:>L_*Q\Y1P%#KO-2)!$3Y]3
-M?:(N;Q<>F_3>L.7U/!@<*120![:6,(A8P?$Q)-_ZSNT\IXTK8)<+OUD4PB'?
-MS&8N@\)C.SNS\VHRFYF;S7LTZ4`!S>-_J`%JDY<T31TN0%':*,A?R_\UO*2R
-M`'*AX"V(J1Y-R%R=DUB6;:^WMX=*1#X-O"(M^,W^&/V$.KL[N@^/=8^<.LT>
-M*V6"`$U[K\`7#1W=$&VW>L&WB+>L>_W500TSGI`!HVN>A5G\6U?51VHEDT:4
-M`*'3(NWA\39LR5J;-_@ZS@6R2"'Z]48""6XID;//*:QOC]UDT9O7T50M)@(=
-M[9S)`9UY']H9/G[^2QE1GN\SUJ40$LN8.IIR%NO^%TXUKTL=CG!D1`!3YGJ[
-M7RZG!!?AMIK-9:0:YRWPNDC!6VK!,R5S#)';&/<HSZJA%R_7+M9%%?)]O]#V
-MM)"-N:T=Q_DDB%#SE#!9R`^\F,TQ:G8M<ZR-<%VL+L=BA7X)-(BE?KJH8@2A
-ML?[V_:;852GN\@Z;3>5=PC!#10VW:2(1^XOQFL_GZ#I47O]2(B^=3]^N1=WE
-M0G!XN%I-WUTWP]).200G7^04_N.FA>N<3;N=Y!?#SH2(O>DTE:[+Q%4O#-OM
-MZNZ%<H]P^:D8GXPG8I%@B)WW(!;8;!)=!1DUJR09>A=[G]DI!4XK"`VIO^=K
-M2C]S,_^)""$S(Z&;(!ZFF1DT"PL.$OQ>TB)A8."1!Z/W<WO1UF*3F\;/:[YR
-MEGW_9AC\IP(8C(#7CT<BK\)'-)'W0@BZH`GIZ<Q>-5MIH]^X:OVWWF>K)+(#
-M4XOK)``IF//,:=LY_L-Z-;]NY8^1I^Z^"S7D\@!;09`=."=D_CQ\W#-[W7T*
-M00W](0'I12GI6[Z4K.+D/"M0G62?4C(A_/7\'A>2B+S35FEK7"SS<8R]Z/3@
-M\==52`AHK\R&-[K5#S4;>V4+VQ[D9`?RT2M7R0+@,V\N:*2812*JF0&\4/U-
-M$/;,9^ERFQRE#%IDXQ=7<,:,$(8]G0`D^Q@6&RDN^(T9_D/5(DD!"*6)-D!]
-MA:].>?VHT2L--GG$E/A*I`>=YY$_HB(2HYD#DJ#&GU;>HNJ9<H,"Y@L(Z"$1
-MF+@B'4EC'EQV!F*F-[3<TJBX[I1#Y_J[VL<`2;@7U==8,,H<$MIJ5S13SKVN
-MMQZ#CIX(=U%"$'NC1XY'PQLV[.H"(6:_?@"=ATJV5^-PG7KI;.*K4]7W3:6`
-M3/E]<HH.H0[=^R\&M3J)-]-9DPB(#+=\0DLQ/L_>Z[L'R`8?QW5B5(#(I1;-
-M42Z2=T&;Y;[/Z=)!>;L=ZN`A8!+0YCFW76S<:A`'\6T2VA>T,WRCY`O3NB`N
-M-RXYKF^"`K*J\QZ(%+8%S*$4$B9MN?WW$2<"S7+U(`'"E[`@7>L1I'_M_C%,
-MS1'U-EM-T&PHJ0<U+^X2HH@`4<6"'<:?E8]W:UDZTITVF)`&5Q'T`ES[8])2
-MLH^+K3>,EXN]GIHP604)D`:+$I)9-D9V:T$^A(?BN(L3QYW5;SQP&5Z,%!AX
-M5/G+(P0V?RO^_RR+:Z9X2(&P3-<.Z@`J"`A[YV\E+K9C'Q>FXSXD$.3_WNN;
-M(`=W[TKTEN3VXK*<,8,56))`3;M`V)%LNGXQH4RS[;`X/Z9R+M)`'TR!!)B5
-M:<F.5WCP%.^;#=D0W&7P\WKN9KPKWMKRLJM+##Z(M,(#T4G1("`GM>[[:#WE
-M_R(/VHB'/2:7H$0C/KU%S=>3T4GH;%1=\#;)2B6"G.-ZB+Q2'U3UOO9CFV3J
-MR:M(!6]N"';6NG8?.UY'"X_9^L&\=Y*!"BS8!2\[F6QY$=ZXMDVSK]=C4O2@
-M]IA`;+./5R1#P!MVZWG^[E56]Z&_3/RD@#9\ZX!-W.M4X]4>;%2B`$UMO:(!
-M.X><T!S/Y[L^RN)""_D8"8YWK'_&S/N7X7S;D1`>5_(BF7OUPTEML7\Q$Y;.
-M:H<Q=<6W)Q6*6@40U=DBMWJ&).E2UN_:@U?FU??X$H`HX^D`BUDSC,26<*;B
-M[+HCHZ)]2O2C!*?:("CI_K=!DWK)7_%80EH]9K/`"#-&_CC>3X97Z[18:,ED
-M/.E`L;HG[[-H`DDZY]*6WS[%>-B:_:!)!10[`(0!RVY"AQ,IH?7J6?LS]+0=
-MF16"`H'/>$-$Y;59P:U)2=+,)T8`^X%XDM'J:%5\$#P(7X<A(`'(.Z3H$1K@
-MA*?]"VNE[(J^TV@L,&81D0[UAV//]VZGS(`[RBY0CPZGTZI[#FB`&TN+:J(#
-M]\1HX8>8>2RG7Z2$#\)L."&X@VC0#<HW*![:2\(BPE67YQ$5_UXUTPEB=\XU
-M:R\T*[J]PC`VZS3D.:-AQG/88DX]]U;I41%Y=ZV$14'L2VY,[.3?M8GM7)MZ
-M.QVBAN$T%":B;]&OB2(0W_-,S@XJDA+"7740>:V.(B2O?\OW/>E+[=/3Z\;E
-M;XNX8.+_4TB&;5;(%9J^\0#B/HU$PFRJ$$+SYRL#D*L"$HOT[;4[:9_/8-L$
-M1`0\O>?7Z2\.K$!O,]MY3-,Y["8/K(:+N*8/-J,@("S`#__=[FT]/[*#9^F)
-MSB01,'F("F[/_6Y8N5JYP^!L\>10I_.SEXM;#._)`1,B\1#M0;MJXOC(Z_AC
-ME;84K@EM\"E@!%KM-ZP`P$TZUM:3^@%:COD<E"))`1K60'`>TE_RW'W_'[[W
-M+S4A;4DW`K*:1#L^S[=F6_4""*7026@EJQ5W^\9]W"K%/;R7#B1\?*G@$8!!
-M08,;?/G$Q?9XB07:JD@`5,2`5OILA#>>N3OAKY.M4.5U?:C(1;WVY1N(!Q'5
-MKOBEQU8MIM%(,0@J:2Z:6"$GQ*3N-&Q`+5G-<M>"0S#L[KM2B('J":GB(M!Y
-MHYYA3_6,9A-UPT4:FRG)&Z2P0JUR.`'ZSD_MNAX]OWEQ`!PLU-?V=(#Q^OV?
-M"JUD"8M_<L(0)!O(A/TK+'LFTR6BR\?7)0<<K4HR`K`"Z>8[.5#Q:FV60[B%
-MFW-ZSIB,%\F*`(B\N>U(R7LG>K&.:<CVPRW8/9M&`\W,%6Z5V(A[!:;-<3+-
-M$KN>L0@6\ACR!8M(W6,GE5+U8E(YS&T=."U:>]A=3_2X0*29O!BP!GD"C!X"
-MS<[F/OE0@]>!+AT=,1!;]N[_WE[03>+6UZR>4@#Q*7%Z`5S4>R_P\7D5..K]
-M/X$A"+7YL/X(?AO0E)&9@F3CUW"G$0*QR((>)A]1CBU_@OC^-GUGN9-PS-(E
-MD!0QVS[K&*2W!5_U_B0U^XW$QN7J73E)I2(;SS9/NW-"")HM9RPX/LM5YQK@
-MXR+`OR:L"FJW'>G)D3B&_1T3SUTI*8HE"18?XB8C##U\\Z0$/;++7NH.;DHV
-M7B!8_3H)0`U,55-?1`+#3\\Y6*?\M\H24ZGSB2!@S!$6?_%,&GW[Z)E:].7,
-MJN:/-Q#8]]]?3R`7L$$<@^FG16^V\CJC"`BGW^XRWV`%F]^?QO^GV^<94C;N
-MT\D@#1VEMMH1Y(!FMKW!JN/*3QIIW6LLD!3/9(%VFBU&3:>!#BIM:.!5?\2@
-M65-Y<^\VY$&%WKE2!W-K:X.AD;Z<J/+LWZ362+Z=[_=SKP18/KBI[>^^1KPM
-MV\?4=I*0UC;70WH<R(>:&8&I]:@=$/\SF4E>B0+L<RN@DG*XN;6-<_MC/K+0
-MVYZI,(!YGF3Z>R9SQ$!VI;N>Y_":W!HAA<XON[.7^Z`E.6L@O5J.*1%L^][Z
-M#8<NY7;)U#W7K7<ZJ<ED%IWIR(<+W8S&<G+VO9V,QDT0%NPV)`>W%6PH.IU>
-M71JR2A`[.M=NN0*-=ME+1KTPL+!;(0LM4J1#J1^1Y5O*/"!_FF%$!?*G#.P)
-M$.]<Q73[BJE:R.SEQ;9W7;5&171GMS1`O'Z-]?>^G:W'8J,-O%EFP@C!,_E[
-M&HUX(G>C7[OW[R,S?8=,'QQ<@HJ.R[^FU]B/BH@@R2M9)$`(7DM8><JI0NKH
-M]KKJ)0F53@*NL4TX$/[9NDZ`&`/;_[L:F[#IR&<\J(BW.,9F8`J95;4PKW88
-MG#E>LWHB"6S_>4AP!=_?B):9I99F1TJ$AI^2`'.!5$"DW*<XU)#"B(K5?``;
-MYZ9[O(@MK%'G'1O[Q6U3-!JY%=X5V1%6[#U[>F\*VN5V<7?[:FQW5B'OFO1Y
-M/YY:4B`RHQ>\B)OI+U,&X&E,!O"H$A#S]_SH0`$$;^E_AM+(K.[)+CHI`6L<
-MUAK(#FQF_CTM\0M.9TNP1$&?Z6'N42!/]%;>17JZ[3041T,RD%`WM`>(AL.A
-MD_I9[Y5QZ4@)1_4)-[B:!!'8M'>XAP(N>)-*!LA04$NM_Q1`)J[2SJT>L7NF
-MT[>GCT@L9J51EX74]_(:`"%_[E)0T>N4O`CUG4ZC1%:80K&U*U<$\B'`Z/TJ
-M/[!S?2(B02"CT8Q5W..P%?2.IAYE4,;QDL`,7ZHF/W;<`":^IV7U_YW6H/EE
-MYMQ@LF1"5KN$J2K+'YUH9):E2$+'K8\$6U]M9\F5TB!`*MTMHP)"Y[-5B*,A
-MYO9TY,@6=\U;*Y3`A^"[\UU5;+_P(NT=$Q)\N[)?6&/`B2R3DSVV^J;W@^YR
-MKEE952&@RRRVV1`8E.[7"66,;54J($\?E1;]E(`'K/F.L-Y-5E5*E89O'32H
-MMVU\H8M-!6.LVSN`-N%'-?'3+QQK2]],QR(BCO16_A]R`("'A*6FG+GQMN[@
-M\N+3J.*ZC%Y,Y"!M8G7@`M=J\;M9&E_/&A[[/LWC,1#I;I9;G`XA`KVLS/:7
-M+WJ,2-3%!F+4@6`P:ETZ*-&ZL"]2-B0H+3K4H`!)+VO[BDGHZ$5RPUGIHQEF
-MY504K%*A$.=J\C)R4-I,^B$_!X.4'MN#[V`3"I:[D)<I^\*]LDBTYQHGE8@[
-MT>=O^_19R</`$_L&=H]U2ZETX>W;8%6E55&3E:\"H4GNR3=("`V%YKL?J_+H
-M%+O\X_IU%@]B4!#6E![8_&@A+;Y)</OF\8OGP\NS@V9,B`@L)J,9Y31Y:QCK
-M]9R[FL:5&!#SW2:6[Y^;U]$`L=*VKPP^`RN*A\MXZ5_/@01"&AD%9,)S+Q5H
-M[C&K)6627,NVK!>B=Y3_+D`+9HN<X;^)MYCER:>UI(3Y)?WY8H@4)9\3#D?1
-ME0HX7U@GG=GN>YD"%P_W6DC^W0[CPOFE:5H[3-<HG6&\,/#;+2TL_[X704P"
-M5N_X8K>12VMKJFO[EK8`"G=AT[Z2SPX,E9?G4#KR&08@0H5]\U8GT'Q\>UV[
-M*"(9J/D)1WDZL;[+[[FL,#D]$[I8%A^,KX>O2+K``0VKJXS-/!G$U/#XG(0O
-M"OJ_&SOB`$`QJDECIERVTTTSVI6G-&2C?GU8O)+<?EYA*1`,3UN*#8.LXK,'
-MSS"VJ/C+D%P*X0C_GO0<?=-O?5O_7CX/VW24`$KV^69,;6U&EYSKR-Y/A(8&
-M:U4X7.@G,RS:DZ1$N.F5<*8VE!?!X&@06^5.MQFH&%XO1*12_,O7;_<M)3)[
-ME-.&T^'E=Y#JSGS+Z+4KJV?ZQRPKMS`A9R(@U&,#?8X"O;K;+=%RB!Y^CL'?
-M*Y:3@'DEU84+R:3Y<19NOD(1+-C;8V2V*V.THJ_/U_"5/H5PJ&)7*L[30_CX
-M=YYO]+U+ZVXW:\=.P)"MXVVQ_J:AF<923F?X'PF6N4J6H97$<2ZP$9C5?;?)
-AOE[3]=PE4E9R<92Z_X:N7V3I;?Y7_XNY(IPH2$BTXA\`
+M0EIH.3%!629360S39&D`<XA_____________________________________
+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
+9@#N8461T+A7W1J)TTW_Q=R13A0D`S39&D(#!
`
end
diff --git a/dev/cgd/Makefile b/dev/cgd/Makefile
index f0e541bb4138..98d86a1db0ff 100644
--- a/dev/cgd/Makefile
+++ b/dev/cgd/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.2 2010/12/14 17:48:31 pooka Exp $
+# $NetBSD: Makefile,v 1.7 2016/11/11 07:39:58 alnsn Exp $
#
.include <bsd.own.mk>
@@ -9,4 +9,16 @@ FILESDIR= ${TESTSDIR}
TESTS_SH= t_cgd
+.if ${MKCRYPTO} != "no" && ${MKRUMP} != "no"
+TESTS_C= t_cgd_3des t_cgd_aes t_cgd_blowfish
+
+WARNS= 4
+CPPFLAGS+= -D_KERNTYPES
+LDADD+= -lrumpdev -lrumpdev_disk -lrumpdev_cgd -lrumpkern_crypto -lrumpvfs
+LDADD+= -lrump
+LDADD+= -lrumpuser
+LDADD+= -lrump -lutil
+LDADD+= -lpthread
+.endif
+
.include <bsd.test.mk>
diff --git a/dev/cgd/t_cgd_3des.c b/dev/cgd/t_cgd_3des.c
new file mode 100644
index 000000000000..91e81f45ec5e
--- /dev/null
+++ b/dev/cgd/t_cgd_3des.c
@@ -0,0 +1,913 @@
+/* $NetBSD: t_cgd_3des.c,v 1.1 2016/11/11 07:39:58 alnsn Exp $ */
+/*-
+ * Copyright (c) 2016 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Alexander Nasonov.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/sysctl.h>
+
+#include <atf-c.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <util.h>
+
+#include <dev/cgdvar.h>
+
+#include <rump/rump.h>
+#include <rump/rump_syscalls.h>
+
+#include "../../h_macros.h"
+
+#define SECSIZE 512
+
+struct testvec {
+ unsigned int blkno;
+ const uint8_t *ptxt; /* PlainText */
+ const uint8_t *ctxt; /* CipherText */
+};
+
+/*
+ * 192 bits CBC key, NUL terminated.
+ */
+static const char c3des_cbc_192_key[25] = {
+ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, /* ABCDEFGH */
+ 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, /* IJKLMNOP */
+ 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, /* QRSTUVWX */
+ 0
+};
+
+static const uint8_t c3des_cbc_ptxt[SECSIZE] =
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop";
+
+/*
+ * IV method encblkno1, blkno 0.
+ */
+static const uint8_t c3des_cbc_192_encblkno1_vec0_ctxt[SECSIZE] = {
+ 0x19, 0x92, 0xc8, 0xce, 0xdf, 0xa3, 0x14, 0xef,
+ 0xff, 0x88, 0x9f, 0x01, 0xfa, 0x6f, 0xfa, 0xa6,
+ 0xdd, 0x2b, 0x43, 0x67, 0xfa, 0xce, 0x37, 0x95,
+ 0x73, 0x4d, 0x18, 0x33, 0x0c, 0x29, 0xb6, 0xbb,
+ 0x37, 0x77, 0x31, 0x74, 0xf6, 0x62, 0x03, 0xd2,
+ 0x78, 0x13, 0x55, 0xf6, 0x58, 0x49, 0xaf, 0x2a,
+ 0x15, 0x4c, 0xc2, 0x4a, 0x55, 0x99, 0x82, 0xb9,
+ 0xfb, 0x8b, 0x4f, 0x92, 0xe3, 0xbc, 0x9b, 0x09,
+ 0x42, 0x7b, 0x5f, 0x54, 0xed, 0xf0, 0xcb, 0x5d,
+ 0x93, 0xba, 0x09, 0x4b, 0x20, 0xf3, 0xe6, 0x44,
+ 0x30, 0x5e, 0x9e, 0xfc, 0x7a, 0x3c, 0x7d, 0x11,
+ 0x63, 0xea, 0x40, 0x94, 0xaa, 0xd0, 0xa9, 0xf6,
+ 0xc7, 0x1e, 0x8f, 0xc8, 0xa6, 0x2c, 0xf7, 0xeb,
+ 0x51, 0x26, 0xdc, 0xf8, 0x73, 0xf9, 0xb4, 0xa8,
+ 0x80, 0x4a, 0xe5, 0x6f, 0xb6, 0x33, 0x13, 0x6b,
+ 0x1b, 0x7d, 0x00, 0xde, 0x44, 0x7e, 0x26, 0xa2,
+ 0x82, 0xa7, 0x80, 0x16, 0x34, 0xde, 0xb9, 0x82,
+ 0x4c, 0x42, 0x8e, 0x0d, 0x48, 0x7e, 0x38, 0xbd,
+ 0x1d, 0x7d, 0x98, 0xbb, 0x11, 0x8a, 0x72, 0x14,
+ 0x4e, 0xaa, 0xd0, 0xef, 0x4d, 0x7f, 0xa3, 0xa6,
+ 0xfc, 0x85, 0x9d, 0x74, 0x63, 0x9d, 0xe4, 0x5c,
+ 0xf7, 0xa8, 0xd0, 0xd7, 0x95, 0xb4, 0x28, 0x64,
+ 0x41, 0x2d, 0x5d, 0xd9, 0xba, 0x79, 0xa7, 0xb3,
+ 0x9c, 0x16, 0xfa, 0xb8, 0x10, 0x5d, 0x1d, 0xd4,
+ 0xce, 0xad, 0x67, 0x27, 0x91, 0x8a, 0xb3, 0xbc,
+ 0x37, 0x20, 0x95, 0xac, 0xf7, 0x0d, 0xe0, 0x1e,
+ 0x59, 0xa7, 0xe5, 0x81, 0x82, 0x6a, 0x71, 0x07,
+ 0x85, 0x43, 0x43, 0xdb, 0xbf, 0x56, 0xb0, 0x0a,
+ 0x4c, 0xf1, 0xcd, 0xcd, 0xa3, 0x9a, 0x10, 0x8e,
+ 0x0c, 0xe2, 0x6d, 0xf2, 0x16, 0xd0, 0x4c, 0xac,
+ 0xf9, 0xfc, 0xc9, 0x56, 0x1f, 0x31, 0x89, 0x1c,
+ 0xfa, 0xb7, 0x49, 0xea, 0x69, 0x91, 0xfe, 0x45,
+ 0x96, 0x5e, 0x45, 0xc3, 0x2c, 0xb1, 0x40, 0xd9,
+ 0x1f, 0x82, 0x3f, 0xc1, 0x45, 0x7c, 0x39, 0x72,
+ 0x6f, 0x52, 0xe4, 0xaf, 0x15, 0xa4, 0xe2, 0xd4,
+ 0xa1, 0xa4, 0xb2, 0xb5, 0x4a, 0x0b, 0xad, 0xe4,
+ 0x1e, 0x5c, 0x26, 0x62, 0x81, 0x78, 0x3e, 0xd3,
+ 0x6a, 0x98, 0x94, 0x2a, 0x00, 0xa7, 0xe4, 0x04,
+ 0x9d, 0x9a, 0xfc, 0xcf, 0xad, 0x2b, 0xba, 0x9b,
+ 0x40, 0x1e, 0x71, 0x3a, 0xb6, 0x92, 0xc4, 0xc5,
+ 0x56, 0x58, 0x92, 0x2a, 0x69, 0xbe, 0x0f, 0xb0,
+ 0x91, 0xae, 0xaa, 0x3f, 0x07, 0xe8, 0xf9, 0x71,
+ 0x20, 0x06, 0xed, 0xe0, 0x80, 0xec, 0xc9, 0xe7,
+ 0x54, 0xaa, 0xaa, 0xf4, 0x4c, 0xb2, 0x34, 0xf7,
+ 0x8a, 0x76, 0xc2, 0x4a, 0xae, 0x71, 0x7a, 0x07,
+ 0xd7, 0xec, 0x75, 0x2f, 0x8a, 0x99, 0x59, 0x13,
+ 0xd0, 0x8d, 0x18, 0x69, 0x0d, 0xd9, 0x39, 0x73,
+ 0x2b, 0xd0, 0xa3, 0xbc, 0x9e, 0x29, 0x4d, 0x88,
+ 0xff, 0x98, 0x02, 0xb4, 0xcf, 0xa1, 0xf9, 0x2a,
+ 0xa6, 0xef, 0x7c, 0x72, 0x26, 0x4e, 0xd7, 0xdf,
+ 0xec, 0x3a, 0xbc, 0x8e, 0xe6, 0xb3, 0x2b, 0x43,
+ 0xcd, 0x67, 0x8b, 0x72, 0x00, 0x6f, 0xe5, 0x85,
+ 0xe2, 0x2a, 0x4c, 0x8d, 0x02, 0x44, 0x6b, 0x7a,
+ 0x89, 0x7a, 0x18, 0x3b, 0xc8, 0x9c, 0x8d, 0x60,
+ 0xec, 0x79, 0x58, 0x15, 0x98, 0x71, 0x4b, 0x1a,
+ 0x34, 0x69, 0x96, 0xd0, 0x0f, 0x01, 0x27, 0x2e,
+ 0x19, 0x02, 0xf0, 0x17, 0x8c, 0x89, 0xbf, 0x05,
+ 0xf0, 0xfe, 0xc3, 0xe6, 0x90, 0x9d, 0xa2, 0xb1,
+ 0x40, 0x06, 0x7e, 0xcd, 0x20, 0x7e, 0x5f, 0x54,
+ 0x31, 0xfb, 0x79, 0x84, 0x47, 0x38, 0x71, 0x69,
+ 0xe1, 0xd5, 0x4e, 0x84, 0xa3, 0x2b, 0x4a, 0x86,
+ 0xc2, 0x21, 0x5b, 0x15, 0xc3, 0x63, 0xbb, 0xc5,
+ 0x5c, 0xc1, 0xfb, 0x31, 0x3a, 0x4d, 0xb1, 0x9e,
+ 0xe1, 0xd8, 0x67, 0x4b, 0x08, 0x42, 0xc4, 0xe8,
+};
+
+/*
+ * IV method encblkno1, blkno 1.
+ */
+static const uint8_t c3des_cbc_192_encblkno1_vec1_ctxt[SECSIZE] = {
+ 0x1d, 0x65, 0xdf, 0x01, 0x9b, 0x24, 0xa5, 0x10,
+ 0x94, 0x9a, 0x5b, 0x81, 0x96, 0x4e, 0xa3, 0x42,
+ 0x42, 0xd5, 0x05, 0x52, 0xab, 0x3c, 0x67, 0x40,
+ 0x79, 0xf9, 0x4b, 0x58, 0x39, 0xf6, 0xd0, 0x97,
+ 0x48, 0xf4, 0x77, 0xb8, 0xac, 0xe2, 0x10, 0x66,
+ 0xa8, 0x04, 0x0a, 0x1e, 0xa6, 0xbb, 0x4c, 0xd9,
+ 0x5d, 0x0c, 0x11, 0xb5, 0xe0, 0x26, 0x84, 0x50,
+ 0x10, 0x80, 0xbf, 0xd6, 0xdc, 0x82, 0x53, 0x0a,
+ 0xcf, 0xf6, 0xd3, 0x07, 0x45, 0xb0, 0x8e, 0x36,
+ 0x2e, 0x60, 0x0f, 0xd0, 0xc1, 0xb9, 0xd8, 0x29,
+ 0x6e, 0x13, 0x8e, 0xc1, 0xa8, 0x63, 0x20, 0xe0,
+ 0x8d, 0x47, 0x8b, 0xf9, 0xa0, 0x60, 0x55, 0x53,
+ 0x1d, 0xaf, 0x43, 0x46, 0xe5, 0x10, 0xd5, 0xcd,
+ 0x91, 0x9e, 0x11, 0x4a, 0x6f, 0x6a, 0x13, 0xdf,
+ 0xee, 0x7a, 0x88, 0xbe, 0x59, 0x96, 0xdb, 0x65,
+ 0x25, 0x57, 0x9e, 0x82, 0xad, 0xc2, 0xd6, 0x28,
+ 0x96, 0xb3, 0x7f, 0x57, 0x5d, 0xb2, 0xfa, 0x60,
+ 0x43, 0x22, 0xa5, 0x33, 0x14, 0x99, 0x8f, 0x68,
+ 0x5a, 0x7f, 0xaf, 0x9e, 0xe9, 0x23, 0x57, 0x9b,
+ 0x52, 0xe9, 0x20, 0x59, 0x26, 0x89, 0x9b, 0x59,
+ 0xb0, 0xee, 0xe8, 0x6d, 0x06, 0x8c, 0x01, 0xc2,
+ 0xea, 0xbc, 0x7d, 0x93, 0x3f, 0x79, 0x7f, 0xeb,
+ 0x57, 0xc9, 0x0a, 0xca, 0x37, 0x81, 0xa7, 0x82,
+ 0xde, 0x37, 0x7d, 0x69, 0x01, 0xaa, 0x19, 0x98,
+ 0x26, 0xfe, 0x06, 0x83, 0xeb, 0x9d, 0x26, 0xdc,
+ 0x04, 0x5d, 0xc9, 0x05, 0xee, 0x1a, 0xd3, 0xeb,
+ 0x20, 0x8c, 0xb7, 0x99, 0x75, 0xe0, 0x19, 0x98,
+ 0xca, 0x83, 0xae, 0x94, 0x28, 0xbf, 0x47, 0x42,
+ 0x92, 0x05, 0x8c, 0xaa, 0xeb, 0x99, 0x0f, 0xcc,
+ 0x33, 0x79, 0x24, 0x62, 0xa0, 0x7a, 0x65, 0xcb,
+ 0x53, 0xb7, 0x86, 0x0d, 0xcb, 0x44, 0x2d, 0xbf,
+ 0xe8, 0x5d, 0x62, 0xeb, 0x21, 0x4d, 0x35, 0x86,
+ 0x56, 0x6c, 0x51, 0xff, 0xa3, 0x45, 0xcc, 0x88,
+ 0x09, 0x43, 0x08, 0x97, 0x13, 0x7d, 0x00, 0xd8,
+ 0x82, 0x2d, 0xbe, 0xbe, 0x44, 0x0c, 0x2c, 0xa4,
+ 0x4f, 0x84, 0x07, 0x20, 0x9c, 0x3f, 0xf6, 0x5b,
+ 0x9e, 0xe8, 0x68, 0x40, 0xd3, 0x64, 0x8f, 0xb4,
+ 0x9e, 0xac, 0xc6, 0x41, 0x11, 0xda, 0xf2, 0x60,
+ 0xfa, 0x29, 0x9d, 0x26, 0x68, 0x5b, 0x79, 0x3a,
+ 0xd1, 0x66, 0x78, 0xca, 0x80, 0x87, 0xae, 0xab,
+ 0x7b, 0x29, 0x3c, 0xb0, 0xe6, 0xa2, 0x6b, 0x24,
+ 0x81, 0xeb, 0x51, 0xf9, 0xcb, 0x4a, 0x08, 0x37,
+ 0x2a, 0x75, 0xb5, 0xd3, 0xb3, 0x8f, 0x3d, 0x13,
+ 0x11, 0x0c, 0xa9, 0xf7, 0xf6, 0x57, 0x7e, 0xb7,
+ 0xa6, 0x22, 0xe8, 0x13, 0xfd, 0xf1, 0x6a, 0xe9,
+ 0xc1, 0x94, 0xa6, 0xf5, 0xa5, 0xec, 0xfa, 0x31,
+ 0xd2, 0x66, 0x8f, 0xe3, 0x6e, 0x9a, 0xaa, 0xb0,
+ 0xe3, 0x04, 0x09, 0x00, 0x1e, 0x67, 0x3c, 0xbe,
+ 0x2a, 0x8c, 0xd5, 0x1f, 0x4f, 0x55, 0x2c, 0x1d,
+ 0x26, 0x7f, 0xc9, 0x27, 0x00, 0x88, 0x7d, 0x45,
+ 0x4e, 0xe1, 0x36, 0xf6, 0xf5, 0xa8, 0xd4, 0xef,
+ 0x8b, 0x26, 0x76, 0x41, 0x28, 0x87, 0xf4, 0x51,
+ 0x14, 0x36, 0xad, 0x60, 0x8d, 0xe9, 0xe2, 0x9d,
+ 0x3c, 0xea, 0x09, 0x51, 0x3c, 0x81, 0xdf, 0x1a,
+ 0xc2, 0xc2, 0xf6, 0x45, 0xe1, 0x73, 0xac, 0xae,
+ 0x85, 0x74, 0x83, 0x8f, 0x56, 0x3c, 0x36, 0x1c,
+ 0xe0, 0x07, 0xc6, 0x6a, 0x48, 0xe4, 0x34, 0xe9,
+ 0x81, 0x53, 0xb7, 0x53, 0x95, 0xa7, 0x94, 0x21,
+ 0x7e, 0x32, 0x53, 0xda, 0x83, 0xd8, 0x57, 0x92,
+ 0xd1, 0x15, 0x45, 0x86, 0x40, 0xac, 0xf1, 0x6f,
+ 0x3c, 0x29, 0xef, 0x8d, 0x12, 0xe1, 0x9d, 0x04,
+ 0x17, 0x3a, 0xcc, 0xa6, 0xc5, 0xe4, 0x27, 0x41,
+ 0xcb, 0xfb, 0x5e, 0x77, 0x73, 0x5a, 0x2c, 0x03,
+ 0xe9, 0x2b, 0x76, 0x4e, 0x69, 0xea, 0xcb, 0xb3,
+};
+
+/*
+ * IV method encblkno1, blkno 2.
+ */
+static const uint8_t c3des_cbc_192_encblkno1_vec2_ctxt[SECSIZE] = {
+ 0x87, 0xb1, 0x3c, 0xd6, 0x60, 0xa0, 0x5a, 0x35,
+ 0xf7, 0xe1, 0x6b, 0x87, 0xa0, 0x90, 0x2f, 0xc7,
+ 0x8c, 0xed, 0x53, 0xda, 0x93, 0x32, 0x78, 0x5d,
+ 0x24, 0x23, 0x42, 0xdd, 0x93, 0x5b, 0x2e, 0x40,
+ 0xa1, 0xb1, 0x3b, 0xbb, 0xf0, 0x50, 0xb4, 0x61,
+ 0xea, 0x15, 0x37, 0xf3, 0x49, 0xe1, 0xa0, 0x32,
+ 0x88, 0x85, 0x81, 0xfd, 0xb7, 0x96, 0xd7, 0x9d,
+ 0xd7, 0x29, 0x4b, 0x14, 0xf9, 0x18, 0x6a, 0xf6,
+ 0x46, 0xae, 0x69, 0xdf, 0x63, 0x9a, 0xe0, 0x0b,
+ 0x2c, 0x53, 0xd7, 0x82, 0x6f, 0xe5, 0xa0, 0x95,
+ 0x2f, 0x61, 0x7f, 0x15, 0xff, 0xc7, 0xe8, 0x83,
+ 0xfc, 0xfc, 0x16, 0x1c, 0x37, 0x0f, 0x9b, 0xbb,
+ 0x14, 0xb2, 0xe2, 0xb7, 0x1f, 0x85, 0xb7, 0x07,
+ 0x8a, 0x18, 0xed, 0xf7, 0x5f, 0x27, 0xff, 0x2f,
+ 0x07, 0xf9, 0x9d, 0xe3, 0x79, 0x45, 0x1f, 0x51,
+ 0x08, 0x54, 0x0f, 0x56, 0x84, 0xee, 0x87, 0x9a,
+ 0xa9, 0x46, 0xb8, 0x77, 0x85, 0x40, 0x46, 0x50,
+ 0xc1, 0x58, 0x07, 0xfd, 0xfa, 0x2b, 0x20, 0xd6,
+ 0x4e, 0xba, 0x08, 0x02, 0x59, 0x3d, 0x23, 0x3b,
+ 0x5d, 0xf9, 0x5e, 0x2f, 0xac, 0x9e, 0xa0, 0xd7,
+ 0x3f, 0x9a, 0xdf, 0x50, 0x66, 0xcc, 0x28, 0xce,
+ 0x93, 0xc8, 0x11, 0x5c, 0x74, 0xe2, 0x4f, 0xfd,
+ 0xaf, 0x33, 0xbb, 0xce, 0x96, 0x1f, 0xb3, 0x46,
+ 0x6e, 0xcd, 0xe4, 0xef, 0xfa, 0x2f, 0x93, 0xb1,
+ 0xe5, 0x7c, 0x54, 0xbc, 0x17, 0x1f, 0xd5, 0x31,
+ 0x0e, 0x88, 0xe7, 0xcd, 0xb0, 0xb5, 0x2e, 0x1e,
+ 0x9e, 0x40, 0x36, 0xa5, 0xbb, 0xa7, 0x4e, 0xc8,
+ 0x11, 0x6c, 0xae, 0x1c, 0x2d, 0xdb, 0x55, 0xd8,
+ 0x14, 0x40, 0x02, 0xad, 0xaf, 0x19, 0x28, 0x59,
+ 0xd7, 0x4f, 0x81, 0xd0, 0xc1, 0x54, 0x63, 0x73,
+ 0x0e, 0xfb, 0x26, 0xf2, 0xa6, 0x80, 0xca, 0x2e,
+ 0xf3, 0xca, 0x1e, 0xa4, 0x62, 0x07, 0x22, 0x10,
+ 0x11, 0x6a, 0x57, 0x28, 0x45, 0x80, 0xdf, 0x34,
+ 0x88, 0xe5, 0xf1, 0x23, 0xe0, 0xb6, 0x44, 0x51,
+ 0x54, 0xd8, 0xb3, 0x66, 0xac, 0x46, 0x4d, 0xdf,
+ 0xa2, 0x8e, 0x72, 0x3a, 0x1c, 0x87, 0x2a, 0x43,
+ 0xfe, 0xdb, 0x00, 0xff, 0xb7, 0x1c, 0x13, 0xc3,
+ 0x18, 0xfc, 0x71, 0x13, 0xe3, 0xd1, 0x1f, 0xde,
+ 0x16, 0x63, 0x73, 0xf5, 0x0e, 0xf7, 0x18, 0xe5,
+ 0x48, 0x8d, 0x30, 0xd9, 0x26, 0x20, 0x6d, 0xa1,
+ 0xba, 0xde, 0xe8, 0x7d, 0x77, 0x02, 0x33, 0x0d,
+ 0x73, 0xb2, 0xab, 0x35, 0xfd, 0xa5, 0x6e, 0x4c,
+ 0x5c, 0x27, 0xc7, 0x7e, 0x4a, 0x28, 0xf8, 0xf5,
+ 0x00, 0xbe, 0x4c, 0xd7, 0x2c, 0x27, 0x83, 0x16,
+ 0x37, 0xda, 0x0c, 0xb1, 0xd7, 0x89, 0xd8, 0x8f,
+ 0x17, 0x69, 0x1b, 0x6b, 0x48, 0x2b, 0xce, 0x9c,
+ 0xbd, 0xf4, 0x0d, 0xb5, 0x4d, 0x12, 0x11, 0x36,
+ 0x49, 0xd3, 0x8b, 0x52, 0xce, 0x7e, 0x47, 0xb0,
+ 0xb5, 0x54, 0x77, 0xef, 0x90, 0xb8, 0x0e, 0xaf,
+ 0x6f, 0x97, 0x88, 0xde, 0x6b, 0x37, 0x24, 0xdd,
+ 0x91, 0x84, 0x00, 0x51, 0xab, 0x06, 0x96, 0x3c,
+ 0x82, 0x73, 0xcf, 0xae, 0x8d, 0x23, 0x86, 0x59,
+ 0x62, 0x5b, 0xeb, 0x2a, 0xaf, 0x40, 0x17, 0xed,
+ 0x2b, 0x60, 0x73, 0x7d, 0x99, 0x95, 0x3f, 0xd6,
+ 0x6c, 0xca, 0x1e, 0xf3, 0xb0, 0xcd, 0xd5, 0x1d,
+ 0x53, 0xe0, 0xd2, 0x8b, 0x57, 0x7b, 0xac, 0x67,
+ 0x5a, 0x5a, 0x0a, 0x64, 0x82, 0xab, 0x8f, 0x5a,
+ 0x36, 0xe2, 0x45, 0x50, 0xec, 0x3e, 0x14, 0x80,
+ 0x7c, 0xfd, 0x0c, 0xa9, 0x94, 0xfb, 0xfe, 0x72,
+ 0xec, 0x47, 0x71, 0x2e, 0x90, 0x97, 0xf6, 0x33,
+ 0xbd, 0x7d, 0x7e, 0x77, 0x8f, 0xad, 0xd4, 0x1d,
+ 0x1d, 0x53, 0x0f, 0x28, 0x39, 0x77, 0x06, 0x1a,
+ 0x75, 0xfc, 0x12, 0xe6, 0x45, 0xfc, 0x87, 0xe1,
+ 0x46, 0xac, 0xb0, 0x73, 0xca, 0x24, 0x7c, 0x71,
+};
+
+/*
+ * IV method encblkno1, blkno 3.
+ */
+static const uint8_t c3des_cbc_192_encblkno1_vec3_ctxt[SECSIZE] = {
+ 0xb1, 0xef, 0x7c, 0xd0, 0xa0, 0x6b, 0xe4, 0x88,
+ 0x5c, 0xd7, 0xf1, 0xbf, 0x5f, 0xce, 0xda, 0x19,
+ 0x81, 0x32, 0xbb, 0x96, 0x7e, 0xb9, 0x6e, 0xa1,
+ 0x43, 0xde, 0x53, 0x66, 0x9c, 0x27, 0x94, 0x85,
+ 0xcb, 0x09, 0x4e, 0x16, 0xd8, 0x60, 0x7a, 0x38,
+ 0x27, 0x21, 0x4d, 0x08, 0xaa, 0xe2, 0x1e, 0x6e,
+ 0xa3, 0xcb, 0x9a, 0x7f, 0xd1, 0xbf, 0x18, 0x36,
+ 0x5a, 0x4d, 0x7a, 0x7f, 0xcf, 0x3f, 0xba, 0xa5,
+ 0x77, 0x5b, 0xb4, 0x79, 0xdc, 0xbf, 0x2a, 0x28,
+ 0x16, 0x27, 0x0f, 0x8b, 0xd7, 0x95, 0xc3, 0xcb,
+ 0xa1, 0x6a, 0x49, 0x53, 0xa8, 0x0c, 0x70, 0xde,
+ 0x90, 0x2e, 0x36, 0x74, 0x40, 0x5d, 0x81, 0x74,
+ 0x03, 0x11, 0xbd, 0xba, 0x40, 0x8d, 0x03, 0x86,
+ 0x2b, 0x17, 0x55, 0x20, 0xd8, 0x81, 0x30, 0xd2,
+ 0x2a, 0xbd, 0xea, 0xff, 0x5c, 0x69, 0x9b, 0xe6,
+ 0xe3, 0x21, 0x9a, 0x10, 0x3e, 0xb0, 0xf4, 0x7a,
+ 0xfc, 0x6e, 0x66, 0xec, 0x44, 0x0b, 0x95, 0x8d,
+ 0x13, 0xd4, 0xf6, 0x3e, 0xa1, 0xa1, 0xac, 0xb1,
+ 0xd8, 0x3d, 0x86, 0xaf, 0x5e, 0xef, 0x14, 0x6a,
+ 0x32, 0xf3, 0x13, 0x75, 0x3b, 0x64, 0x9a, 0xf4,
+ 0xd0, 0xf5, 0x00, 0x36, 0x9e, 0xdb, 0xfd, 0xcb,
+ 0xda, 0x1f, 0xed, 0x9d, 0x6d, 0x52, 0xd7, 0xb5,
+ 0x48, 0xce, 0x53, 0x5e, 0xdc, 0xc8, 0xe4, 0x96,
+ 0x04, 0x32, 0xa5, 0xcf, 0x0c, 0xba, 0xa0, 0xd0,
+ 0x44, 0xb3, 0xe8, 0x72, 0xc6, 0xff, 0x8f, 0xd4,
+ 0x4d, 0x0a, 0x22, 0x89, 0x74, 0x50, 0xaa, 0x65,
+ 0x15, 0xab, 0x99, 0xc8, 0xf9, 0xa4, 0x10, 0xe6,
+ 0xa6, 0x4b, 0x0c, 0xc8, 0xb9, 0xa7, 0x60, 0x41,
+ 0xe7, 0x57, 0x31, 0xfa, 0x86, 0x55, 0xdf, 0x29,
+ 0x49, 0xac, 0x55, 0x7b, 0x21, 0xf9, 0x3b, 0x1e,
+ 0x1f, 0xb4, 0x1c, 0x0b, 0x77, 0xcb, 0x88, 0xbf,
+ 0xa6, 0x79, 0xbf, 0x9a, 0x51, 0xc4, 0x8e, 0x59,
+ 0x9c, 0xb3, 0x9d, 0x9d, 0x6b, 0xb2, 0x15, 0x41,
+ 0x0d, 0x6c, 0xf7, 0x5e, 0xe2, 0xf9, 0xb3, 0x80,
+ 0x8f, 0x03, 0x67, 0x68, 0x6e, 0x4b, 0x4d, 0x52,
+ 0xbc, 0x9b, 0xa2, 0xd8, 0x29, 0x1e, 0x5c, 0xd7,
+ 0x59, 0x67, 0x94, 0x40, 0x9e, 0x08, 0x15, 0x0d,
+ 0x7e, 0xc9, 0x14, 0x53, 0xa8, 0x67, 0xb3, 0xb8,
+ 0xaa, 0x21, 0x0f, 0x79, 0x69, 0x48, 0x52, 0xea,
+ 0x56, 0x03, 0x7b, 0x55, 0xb7, 0xf3, 0xfe, 0xb1,
+ 0x8a, 0x22, 0x7d, 0x75, 0x55, 0x31, 0xad, 0x20,
+ 0x6a, 0xc2, 0xa4, 0xd1, 0x1e, 0xab, 0xdd, 0x29,
+ 0xb5, 0xf8, 0xdd, 0x9b, 0x1a, 0xb8, 0xe7, 0xde,
+ 0xae, 0xa1, 0xab, 0xbb, 0xf6, 0x00, 0x87, 0xc4,
+ 0x29, 0xee, 0x2b, 0xa1, 0xa9, 0x1a, 0x46, 0x05,
+ 0x5a, 0x12, 0x3f, 0x32, 0x81, 0x25, 0x20, 0x71,
+ 0xb6, 0xfa, 0x1f, 0x27, 0x2a, 0x33, 0x49, 0xfc,
+ 0x95, 0x00, 0x72, 0x6b, 0x03, 0x53, 0x94, 0x57,
+ 0x2f, 0x47, 0x3d, 0x2d, 0x7c, 0xb4, 0xde, 0xa7,
+ 0x96, 0x81, 0x12, 0xff, 0x2c, 0xec, 0x5c, 0x03,
+ 0x2a, 0x8c, 0x76, 0xc4, 0xed, 0x09, 0xe6, 0x00,
+ 0x28, 0xdb, 0x9b, 0x44, 0xb0, 0xb4, 0x7b, 0x57,
+ 0x3b, 0xb6, 0x4f, 0x0b, 0xff, 0xf2, 0xf5, 0x02,
+ 0x56, 0xcf, 0xd5, 0xbf, 0x71, 0xe6, 0x66, 0xf3,
+ 0x08, 0x8e, 0x8b, 0x15, 0x57, 0x07, 0x41, 0xa3,
+ 0x91, 0xc1, 0xe4, 0x64, 0x92, 0x89, 0xed, 0x22,
+ 0x88, 0x8f, 0x17, 0x91, 0xde, 0xea, 0x0c, 0xa6,
+ 0x86, 0x8e, 0x4c, 0xd9, 0x63, 0xc9, 0xe5, 0xdc,
+ 0xd6, 0xd3, 0x7b, 0x2b, 0x65, 0xfa, 0x36, 0x47,
+ 0x20, 0xa4, 0xe7, 0x0b, 0x52, 0xfa, 0xa6, 0xeb,
+ 0x1d, 0x20, 0xd0, 0x4b, 0xfd, 0x88, 0x8c, 0xbb,
+ 0x52, 0x9c, 0x2f, 0xb7, 0xba, 0x8b, 0xdd, 0x10,
+ 0x2d, 0x7d, 0x77, 0x79, 0x40, 0xa7, 0xed, 0xf9,
+ 0xbd, 0x2a, 0x55, 0x1f, 0x87, 0x1e, 0x3c, 0xfc,
+};
+
+const struct testvec c3des_cbc_192_1_vectors[] = {
+ {
+ .blkno = 0,
+ .ptxt = c3des_cbc_ptxt,
+ .ctxt = c3des_cbc_192_encblkno1_vec0_ctxt,
+ },
+ {
+ .blkno = 1,
+ .ptxt = c3des_cbc_ptxt,
+ .ctxt = c3des_cbc_192_encblkno1_vec1_ctxt,
+ },
+ {
+ .blkno = 2,
+ .ptxt = c3des_cbc_ptxt,
+ .ctxt = c3des_cbc_192_encblkno1_vec2_ctxt,
+ },
+ {
+ .blkno = 3,
+ .ptxt = c3des_cbc_ptxt,
+ .ctxt = c3des_cbc_192_encblkno1_vec3_ctxt,
+ },
+};
+
+/*
+ * IV method encblkno8, blkno 0.
+ */
+static const uint8_t c3des_cbc_192_encblkno8_vec0_ctxt[SECSIZE] = {
+ 0x9e, 0x5d, 0x35, 0x56, 0xa7, 0xcc, 0xc0, 0x1c,
+ 0x60, 0x4c, 0x42, 0x90, 0x35, 0xf3, 0xc1, 0x20,
+ 0xf2, 0x07, 0x6f, 0xf8, 0x7c, 0x33, 0x6a, 0x74,
+ 0xdc, 0x85, 0xbc, 0x9c, 0xa2, 0x29, 0xc6, 0x69,
+ 0x0e, 0xef, 0x0f, 0xa9, 0x6e, 0xec, 0xf2, 0x23,
+ 0x2f, 0x9a, 0xbe, 0x1a, 0x89, 0x22, 0x00, 0xc4,
+ 0x5a, 0xaf, 0x4a, 0xa0, 0x4f, 0x30, 0x8f, 0x99,
+ 0xd2, 0x93, 0x6d, 0xfa, 0xcd, 0x2f, 0xad, 0x19,
+ 0x10, 0x14, 0x90, 0x3a, 0x4b, 0xab, 0x17, 0x2e,
+ 0x2c, 0xe1, 0x26, 0xe5, 0x76, 0xf1, 0xd1, 0x1d,
+ 0x4c, 0x77, 0x68, 0xfb, 0x45, 0x9a, 0x3e, 0x19,
+ 0xe0, 0xfb, 0xdc, 0xd4, 0x0e, 0x29, 0x7c, 0x06,
+ 0xd3, 0x45, 0xa8, 0xf7, 0x39, 0x91, 0xe6, 0x18,
+ 0x0f, 0x81, 0xe6, 0x7d, 0x6c, 0x65, 0x2e, 0x16,
+ 0x24, 0xa4, 0x16, 0x96, 0x0a, 0x7b, 0x5f, 0x3a,
+ 0x0c, 0xe9, 0x0e, 0x3f, 0x34, 0x38, 0xb0, 0xe1,
+ 0x39, 0x23, 0x5c, 0x3c, 0x00, 0xb4, 0xa0, 0xf7,
+ 0x42, 0x18, 0x70, 0x25, 0x82, 0x13, 0x24, 0x49,
+ 0xbb, 0x3f, 0xfb, 0xef, 0xb6, 0xc6, 0x7f, 0x3d,
+ 0x8c, 0x17, 0x62, 0x60, 0x6f, 0xd5, 0xda, 0x2c,
+ 0xf8, 0x85, 0xee, 0xa7, 0xc2, 0x76, 0x5d, 0x34,
+ 0x4c, 0xe1, 0x0d, 0x36, 0x6e, 0x02, 0xdd, 0x08,
+ 0x85, 0xe4, 0x90, 0xfe, 0x1f, 0x81, 0x4a, 0x06,
+ 0xa6, 0x72, 0x81, 0x79, 0x47, 0xd7, 0x6d, 0x92,
+ 0x8f, 0xb7, 0xb2, 0xfd, 0xd0, 0x60, 0x6c, 0x06,
+ 0x44, 0xcd, 0x20, 0x28, 0xef, 0x16, 0xc3, 0x01,
+ 0x19, 0x14, 0x34, 0x39, 0xad, 0x87, 0x9f, 0xde,
+ 0x76, 0xb9, 0xb9, 0x87, 0x1a, 0xbd, 0x8e, 0x2c,
+ 0xe6, 0xb3, 0xe7, 0xb6, 0x80, 0xf8, 0xc5, 0x22,
+ 0x5f, 0x53, 0xed, 0x03, 0xfe, 0x09, 0x2c, 0x9d,
+ 0xb6, 0x61, 0x4a, 0xbb, 0x07, 0x5d, 0xbd, 0x68,
+ 0x74, 0xab, 0x02, 0x81, 0x64, 0x7b, 0x97, 0xa3,
+ 0xad, 0x15, 0x99, 0x7a, 0x04, 0x33, 0xbd, 0x50,
+ 0x94, 0x11, 0xcc, 0xf7, 0x8b, 0x77, 0x88, 0x78,
+ 0x80, 0xfe, 0x5f, 0xa1, 0x63, 0xbc, 0xb0, 0x65,
+ 0xcb, 0x9d, 0x4c, 0xfe, 0x66, 0x4e, 0xff, 0xe3,
+ 0x43, 0x61, 0x99, 0x88, 0x88, 0x4c, 0xbc, 0x8a,
+ 0xf1, 0x69, 0x00, 0xc2, 0xe5, 0xb9, 0x65, 0x8b,
+ 0x10, 0xdf, 0x38, 0x3e, 0x9e, 0x9f, 0x87, 0xed,
+ 0x84, 0x71, 0xe7, 0xf2, 0xb5, 0xb6, 0x11, 0xed,
+ 0x1e, 0xd4, 0xc0, 0x6d, 0x77, 0x08, 0x4b, 0xfd,
+ 0x95, 0xd5, 0xc0, 0xbe, 0xa6, 0xcc, 0x3b, 0xea,
+ 0x11, 0x38, 0xa5, 0x59, 0x36, 0x2a, 0xf4, 0x98,
+ 0x52, 0x9d, 0x3b, 0x8c, 0x8a, 0x19, 0xbd, 0xfb,
+ 0x49, 0xcb, 0xb0, 0x57, 0x91, 0xc7, 0xf8, 0x2a,
+ 0x89, 0xa8, 0x85, 0x03, 0xdf, 0x6e, 0xad, 0xf4,
+ 0x8a, 0x88, 0x9a, 0x2b, 0x5d, 0xe8, 0xca, 0xa9,
+ 0x8f, 0x18, 0xa3, 0x6a, 0x37, 0x84, 0xa9, 0x24,
+ 0x5b, 0xce, 0xd6, 0xbe, 0x7e, 0x40, 0x86, 0x6a,
+ 0xc3, 0x47, 0x28, 0x66, 0xf0, 0x8c, 0x2d, 0x69,
+ 0x22, 0x64, 0x61, 0x36, 0x6a, 0x0c, 0xc4, 0x18,
+ 0x5f, 0xd7, 0xff, 0xbc, 0xf1, 0x94, 0x16, 0xfb,
+ 0x26, 0xa7, 0x80, 0xa4, 0x2d, 0x72, 0xc6, 0x9d,
+ 0xa7, 0xed, 0x04, 0x13, 0x0f, 0xe7, 0xf8, 0x93,
+ 0x57, 0x6b, 0xd5, 0xa4, 0xad, 0x9a, 0x97, 0xeb,
+ 0x97, 0xe7, 0x60, 0x01, 0x89, 0x3f, 0x88, 0xf2,
+ 0xee, 0xf3, 0x79, 0xd6, 0x5a, 0x03, 0x94, 0x07,
+ 0xd3, 0x33, 0xc8, 0xda, 0x15, 0x17, 0x0a, 0x8f,
+ 0xbd, 0x58, 0x1b, 0xfe, 0x3d, 0x77, 0x5d, 0x8f,
+ 0x4e, 0x0e, 0x98, 0x7d, 0x02, 0x63, 0x94, 0x73,
+ 0x4a, 0x58, 0x47, 0xed, 0x52, 0xfc, 0x85, 0x19,
+ 0x5d, 0x2f, 0xfa, 0x07, 0x44, 0xbd, 0x8e, 0xcb,
+ 0x20, 0x63, 0x9d, 0x2b, 0x61, 0x5c, 0x19, 0x71,
+ 0x80, 0xe5, 0x25, 0x5b, 0x2e, 0xc5, 0xfe, 0x1a,
+};
+
+/*
+ * IV method encblkno8, blkno 1.
+ */
+static const uint8_t c3des_cbc_192_encblkno8_vec1_ctxt[SECSIZE] = {
+ 0xf4, 0xb0, 0xb0, 0xcb, 0x79, 0xcc, 0x8c, 0x0a,
+ 0x3b, 0xc7, 0x43, 0x4e, 0x62, 0x9d, 0xde, 0xb4,
+ 0xab, 0xa5, 0x62, 0x63, 0x32, 0xa7, 0x18, 0x2b,
+ 0xe3, 0xee, 0x44, 0xc6, 0x6f, 0xb2, 0xdc, 0x21,
+ 0xc5, 0xc8, 0x9e, 0x32, 0x71, 0x4c, 0x7a, 0x82,
+ 0x8d, 0xe0, 0xad, 0x91, 0x88, 0x0c, 0x41, 0x83,
+ 0x28, 0x0d, 0xed, 0xa7, 0xeb, 0x48, 0xb1, 0x31,
+ 0xfa, 0x40, 0xd9, 0x44, 0x19, 0xee, 0x8d, 0x2c,
+ 0x7d, 0xe2, 0x39, 0xa0, 0x39, 0xaa, 0x86, 0xab,
+ 0xb5, 0x68, 0xe5, 0x83, 0x06, 0x61, 0xec, 0xe6,
+ 0xc2, 0x85, 0xb2, 0x46, 0xf4, 0x5b, 0x0e, 0x34,
+ 0x7e, 0x0c, 0xa0, 0xda, 0xef, 0x58, 0x9c, 0x39,
+ 0x95, 0xa2, 0xca, 0xd3, 0x3b, 0x4d, 0x76, 0xe3,
+ 0x34, 0x6d, 0x08, 0xa4, 0xba, 0x88, 0x58, 0x39,
+ 0xb4, 0xe4, 0x6b, 0xb6, 0x32, 0x50, 0x2c, 0xe2,
+ 0x0a, 0x37, 0xbc, 0x98, 0x38, 0x32, 0x17, 0x1b,
+ 0x12, 0xef, 0xdc, 0x9d, 0x91, 0x09, 0x8e, 0xd8,
+ 0xc3, 0xf8, 0x7b, 0x35, 0x41, 0x3b, 0xf8, 0xf5,
+ 0x37, 0x48, 0x04, 0xf7, 0x94, 0xbf, 0x54, 0x8d,
+ 0x79, 0x49, 0x8f, 0xf0, 0x3f, 0xb7, 0x90, 0x76,
+ 0x14, 0x09, 0xc6, 0x8c, 0xba, 0x1a, 0x30, 0x1b,
+ 0xbb, 0xd9, 0xe2, 0xb5, 0xe8, 0xd9, 0x9b, 0x68,
+ 0x60, 0x90, 0xd3, 0x4a, 0xe8, 0x65, 0x7b, 0xaa,
+ 0xb0, 0xda, 0x69, 0x1d, 0x45, 0x78, 0x2c, 0x3b,
+ 0x59, 0x29, 0x3c, 0x26, 0x9a, 0xd2, 0xa5, 0xfd,
+ 0xb7, 0x16, 0x59, 0x7c, 0x46, 0xea, 0x99, 0xd0,
+ 0x06, 0x01, 0x3f, 0xd2, 0x23, 0xcc, 0xde, 0xb8,
+ 0xaa, 0x88, 0x17, 0x03, 0xe1, 0x48, 0x2c, 0xdd,
+ 0xce, 0xd1, 0x2c, 0xce, 0x37, 0xee, 0xe6, 0xa6,
+ 0x47, 0x8c, 0x07, 0xe5, 0xfe, 0x01, 0xc6, 0x27,
+ 0xfe, 0x3f, 0x9d, 0x30, 0x18, 0x36, 0xe7, 0xa7,
+ 0x37, 0x1d, 0xcf, 0x6d, 0x4c, 0x82, 0xec, 0x58,
+ 0xa1, 0x6f, 0x56, 0xc6, 0x08, 0x25, 0x94, 0xda,
+ 0xae, 0x1a, 0x4f, 0xda, 0xb2, 0xf4, 0xbf, 0x94,
+ 0xff, 0x66, 0x6a, 0xb1, 0x1f, 0x42, 0xfe, 0x32,
+ 0xa4, 0x0e, 0x3d, 0x6a, 0x16, 0x44, 0xe0, 0xac,
+ 0xe8, 0xc1, 0xe2, 0xa8, 0x73, 0xab, 0xac, 0x58,
+ 0xb1, 0xbc, 0x94, 0xb2, 0x6a, 0xe4, 0x45, 0xf5,
+ 0x90, 0x6b, 0x82, 0xeb, 0x9e, 0x22, 0x9e, 0xb2,
+ 0x27, 0x3e, 0xc8, 0x55, 0xf4, 0x8f, 0xda, 0x04,
+ 0xa3, 0x9c, 0xa4, 0x79, 0xbd, 0x79, 0xd3, 0xbd,
+ 0xbe, 0x72, 0x7f, 0x90, 0xef, 0xc3, 0x34, 0x17,
+ 0x72, 0x6f, 0xb4, 0xfe, 0x62, 0x56, 0xc3, 0xd6,
+ 0x43, 0xc8, 0x4c, 0x76, 0x91, 0x04, 0x97, 0x4c,
+ 0x84, 0x98, 0x56, 0xb7, 0x7b, 0x4f, 0xd5, 0xcf,
+ 0x1b, 0x9c, 0x09, 0xe3, 0x1d, 0xdf, 0x0e, 0xfa,
+ 0x39, 0xc8, 0x48, 0x43, 0x84, 0xec, 0x79, 0xc8,
+ 0x7f, 0x4f, 0xa8, 0xc0, 0xb4, 0xde, 0x8b, 0x79,
+ 0xcb, 0x9c, 0x42, 0x81, 0x49, 0xdc, 0x39, 0xb5,
+ 0x31, 0xa6, 0x22, 0xba, 0x71, 0xb8, 0x2d, 0x1d,
+ 0xc8, 0x17, 0xd8, 0x9d, 0x26, 0x2b, 0xd5, 0xcf,
+ 0x57, 0x46, 0x0a, 0x61, 0x7e, 0xb7, 0xc3, 0x9c,
+ 0xa6, 0x44, 0x60, 0x2d, 0x30, 0xb8, 0x10, 0x47,
+ 0x7d, 0x7e, 0x87, 0x76, 0xc1, 0x4e, 0x85, 0x77,
+ 0xbc, 0x30, 0x32, 0x56, 0x0a, 0x5b, 0x1c, 0xd0,
+ 0xf6, 0x47, 0x48, 0x22, 0xf4, 0x6e, 0x38, 0xc5,
+ 0xab, 0xe2, 0xd0, 0x4d, 0x40, 0x27, 0xab, 0x8f,
+ 0x43, 0xb1, 0x60, 0x29, 0x07, 0xd0, 0xf5, 0x25,
+ 0xe5, 0xfa, 0xe7, 0x46, 0x32, 0x37, 0xb9, 0xae,
+ 0x2e, 0x02, 0x8c, 0x94, 0x15, 0x69, 0xd6, 0x74,
+ 0xb4, 0x36, 0xdd, 0x94, 0x70, 0xa7, 0x16, 0x7b,
+ 0x4c, 0xd3, 0x48, 0x83, 0xc5, 0xb2, 0xb0, 0x6a,
+ 0xfe, 0x7e, 0xd4, 0xe5, 0x6d, 0xa5, 0x96, 0x20,
+ 0x08, 0x59, 0xbd, 0x0c, 0x3d, 0x55, 0xa5, 0x03,
+};
+
+/*
+ * IV method encblkno8, blkno 2.
+ */
+static const uint8_t c3des_cbc_192_encblkno8_vec2_ctxt[SECSIZE] = {
+ 0xea, 0x7c, 0x8c, 0x8e, 0x3e, 0x61, 0x34, 0x3d,
+ 0xe0, 0x7f, 0xd3, 0xe1, 0x3a, 0xb9, 0xc8, 0xf2,
+ 0x98, 0xdc, 0x59, 0x26, 0xd2, 0xd8, 0xa7, 0x7f,
+ 0x41, 0x98, 0x24, 0xa8, 0x28, 0x0c, 0x88, 0x55,
+ 0x91, 0xdb, 0x29, 0x17, 0x70, 0xd7, 0x03, 0xff,
+ 0xbd, 0x0e, 0xbf, 0xf8, 0x73, 0x92, 0x19, 0xe9,
+ 0x92, 0x67, 0xdb, 0x08, 0x94, 0x77, 0x71, 0x2d,
+ 0x00, 0xad, 0x26, 0x42, 0x2d, 0xac, 0x8c, 0x67,
+ 0x6f, 0xb3, 0x8e, 0x36, 0x22, 0xeb, 0x1f, 0x8c,
+ 0xd4, 0x9b, 0x9f, 0xa6, 0xa9, 0xb1, 0x52, 0x65,
+ 0x9a, 0xfe, 0xcc, 0x92, 0x48, 0x75, 0xf6, 0xb8,
+ 0x59, 0xfe, 0x0e, 0x67, 0x93, 0xce, 0x3b, 0x7e,
+ 0x51, 0x74, 0xe5, 0x24, 0x35, 0x08, 0x68, 0x21,
+ 0x6a, 0x7f, 0xdd, 0x8c, 0xfd, 0xcd, 0x6d, 0x90,
+ 0xc5, 0x3b, 0x26, 0x9e, 0x00, 0xf4, 0x1e, 0x70,
+ 0xd3, 0xe7, 0xe8, 0x2f, 0x52, 0x87, 0x76, 0x84,
+ 0xbb, 0x5c, 0x76, 0x5a, 0xc8, 0xea, 0x74, 0xe2,
+ 0x9e, 0x85, 0xf6, 0x53, 0x85, 0x1a, 0x6e, 0x02,
+ 0x0d, 0x32, 0x11, 0xc4, 0xec, 0xee, 0x79, 0x27,
+ 0xda, 0xca, 0xc0, 0x0b, 0x8e, 0x2d, 0xb7, 0x7d,
+ 0x8c, 0x6e, 0xfb, 0xa3, 0xa8, 0x24, 0x24, 0x62,
+ 0xc8, 0xdd, 0xc7, 0x16, 0x09, 0x33, 0x0f, 0xe5,
+ 0xc8, 0x60, 0x3d, 0xb6, 0xbf, 0x6c, 0x28, 0xd2,
+ 0x0b, 0x9c, 0xd9, 0xcb, 0x64, 0x49, 0xe4, 0x80,
+ 0x72, 0x58, 0xaa, 0xaa, 0x7e, 0x1d, 0x9f, 0xd7,
+ 0x29, 0x15, 0x65, 0xfc, 0xfd, 0x3f, 0xe1, 0x82,
+ 0x25, 0x3c, 0xd4, 0xbe, 0x59, 0x79, 0x63, 0xd1,
+ 0xd6, 0x0e, 0xda, 0x00, 0xf3, 0xaa, 0x13, 0xd3,
+ 0xed, 0xef, 0xca, 0x8b, 0x97, 0x15, 0x2d, 0x10,
+ 0x6f, 0xcf, 0xee, 0xc7, 0x21, 0xad, 0xe3, 0xe4,
+ 0xd8, 0x95, 0x21, 0x1f, 0xc0, 0x06, 0x3a, 0xbc,
+ 0xbb, 0x2a, 0x92, 0x78, 0x76, 0x9d, 0x1e, 0x7b,
+ 0xb5, 0x29, 0xaf, 0x96, 0x75, 0x2b, 0x41, 0xbd,
+ 0xae, 0x79, 0x28, 0x72, 0xe7, 0x54, 0xc4, 0x08,
+ 0xd3, 0xd2, 0xac, 0x96, 0xd0, 0x0f, 0x9b, 0x68,
+ 0x7d, 0x3f, 0xc2, 0xdd, 0x3d, 0xfc, 0xca, 0xcd,
+ 0x11, 0x71, 0xd9, 0x48, 0x53, 0x9f, 0xd3, 0x79,
+ 0x7d, 0x47, 0x71, 0x2a, 0x6d, 0x9e, 0xa9, 0x47,
+ 0xa1, 0xf7, 0x97, 0x80, 0x83, 0x70, 0x6b, 0xfe,
+ 0x10, 0x11, 0x6a, 0x0e, 0xdd, 0xde, 0x22, 0x3c,
+ 0x19, 0x30, 0x73, 0x73, 0x2e, 0x4b, 0x54, 0x17,
+ 0xc3, 0x2e, 0xe9, 0xce, 0xe0, 0xe3, 0xa0, 0x1a,
+ 0x28, 0xd1, 0x50, 0xa8, 0xd2, 0x40, 0xe2, 0x1b,
+ 0xfa, 0x49, 0x06, 0x49, 0x8b, 0x4b, 0xd9, 0xd5,
+ 0xf5, 0x50, 0xae, 0x64, 0x19, 0xe1, 0xd9, 0x4e,
+ 0xbb, 0x29, 0x70, 0x66, 0x46, 0xa8, 0x7e, 0x5b,
+ 0xdc, 0xe2, 0xd5, 0x9d, 0x56, 0x6d, 0x4c, 0xe6,
+ 0x0e, 0x6b, 0x71, 0x40, 0x82, 0xf7, 0xb3, 0xad,
+ 0x23, 0x17, 0xe3, 0x1c, 0x61, 0x1d, 0x3b, 0x71,
+ 0xfc, 0x06, 0x17, 0xec, 0x6c, 0x77, 0x98, 0x27,
+ 0xc7, 0x4b, 0x65, 0x17, 0x81, 0xe7, 0xcb, 0xce,
+ 0x09, 0x76, 0x82, 0x82, 0x4a, 0x53, 0x67, 0xa0,
+ 0x05, 0x25, 0x4c, 0xc4, 0xa7, 0xad, 0xa7, 0xaf,
+ 0xa0, 0x11, 0xd7, 0x73, 0x3b, 0x30, 0xbf, 0x53,
+ 0x50, 0x9b, 0xd8, 0xf3, 0x32, 0x15, 0xdd, 0x36,
+ 0x88, 0xc2, 0x39, 0x51, 0xb6, 0xb8, 0x0d, 0x5c,
+ 0x20, 0x4e, 0x24, 0xee, 0x95, 0x32, 0x61, 0x25,
+ 0xda, 0x73, 0x0d, 0x8a, 0x58, 0xe6, 0xcc, 0xad,
+ 0x79, 0x3d, 0xef, 0x29, 0x0c, 0x9f, 0xe1, 0xa7,
+ 0x22, 0x1e, 0xea, 0x7a, 0x4f, 0xfb, 0xc1, 0x1f,
+ 0x17, 0xca, 0x69, 0xd6, 0xa4, 0xce, 0x6e, 0xc0,
+ 0x70, 0xa3, 0x08, 0x32, 0x87, 0xb4, 0x6b, 0x80,
+ 0x5c, 0x7f, 0x88, 0x5c, 0xbf, 0x07, 0xd8, 0xe9,
+ 0xdd, 0xd2, 0x76, 0xa9, 0xaa, 0xd9, 0x55, 0x48,
+};
+
+/*
+ * IV method encblkno8, blkno 3.
+ */
+static const uint8_t c3des_cbc_192_encblkno8_vec3_ctxt[SECSIZE] = {
+ 0xf3, 0x49, 0xda, 0x5c, 0xde, 0x9d, 0x3e, 0x9d,
+ 0xb9, 0xc2, 0x6e, 0x96, 0xa9, 0x93, 0x10, 0x73,
+ 0x0e, 0x26, 0x39, 0xd6, 0x9f, 0x04, 0x5f, 0x69,
+ 0x54, 0xa3, 0x7c, 0x46, 0x7b, 0x18, 0x93, 0xc0,
+ 0xbb, 0x0c, 0x96, 0x6f, 0xb0, 0xbf, 0xce, 0x67,
+ 0x33, 0x3e, 0x56, 0xe8, 0x6b, 0x4d, 0x3f, 0xc8,
+ 0x3c, 0xc6, 0x89, 0x2c, 0x0b, 0x95, 0x3a, 0xaf,
+ 0xc0, 0xf3, 0x1f, 0x0e, 0x07, 0x01, 0xa6, 0x35,
+ 0x19, 0x79, 0x91, 0x24, 0xaa, 0x0d, 0xf0, 0x53,
+ 0x27, 0x7d, 0xbb, 0xa6, 0xb6, 0x44, 0x31, 0x4b,
+ 0xd4, 0xcf, 0xf6, 0x6d, 0x18, 0xa2, 0x28, 0x8a,
+ 0xc1, 0x0a, 0xbe, 0x57, 0x0c, 0x61, 0x5f, 0xd9,
+ 0x12, 0x14, 0xfe, 0xe2, 0xc7, 0x10, 0x72, 0xee,
+ 0x19, 0xb8, 0x16, 0x0b, 0x88, 0x87, 0xce, 0xf3,
+ 0xfe, 0x57, 0x37, 0xd1, 0xa2, 0xf7, 0xd0, 0x5e,
+ 0x73, 0xde, 0x39, 0x35, 0xbc, 0xde, 0xed, 0x61,
+ 0x4b, 0x31, 0xdc, 0xfe, 0x3c, 0x4d, 0x98, 0xa9,
+ 0x36, 0xb0, 0x34, 0x5b, 0xb4, 0xb7, 0x79, 0x25,
+ 0x6e, 0x24, 0x7e, 0x10, 0xfe, 0x20, 0xd5, 0x16,
+ 0x86, 0xaf, 0xcd, 0x26, 0x34, 0xd3, 0x2e, 0xdc,
+ 0x7c, 0x69, 0xe3, 0xc5, 0x62, 0x0c, 0xba, 0x29,
+ 0x9c, 0x4b, 0x2f, 0x39, 0x45, 0xe1, 0xcf, 0xc5,
+ 0xfe, 0x35, 0xb6, 0x2f, 0xb1, 0x1a, 0x90, 0xe1,
+ 0xa7, 0x39, 0xe8, 0x1e, 0x5f, 0xac, 0xab, 0x1e,
+ 0x32, 0xba, 0xc5, 0x92, 0x39, 0x62, 0x37, 0x2c,
+ 0x49, 0xf1, 0x62, 0x90, 0xf7, 0x1e, 0x10, 0xce,
+ 0x8e, 0x95, 0xa3, 0xc6, 0xd8, 0xe5, 0xc8, 0xdf,
+ 0xcc, 0x94, 0x7d, 0x26, 0xab, 0x29, 0xbb, 0x9d,
+ 0xf3, 0x73, 0xce, 0xac, 0x76, 0xdf, 0x75, 0x2a,
+ 0x3e, 0x8f, 0x47, 0xff, 0x76, 0xfe, 0xea, 0xd4,
+ 0x4a, 0xa9, 0x36, 0x9d, 0x12, 0x45, 0xb7, 0x99,
+ 0x81, 0xb6, 0x77, 0x98, 0x13, 0xfb, 0x5a, 0xe5,
+ 0x40, 0x87, 0x61, 0x0d, 0x10, 0x76, 0xf6, 0x3e,
+ 0x48, 0xac, 0xc4, 0x27, 0x87, 0xcd, 0x07, 0xde,
+ 0x0b, 0x23, 0x97, 0x61, 0x3d, 0x18, 0x64, 0x7f,
+ 0xbf, 0xd6, 0x87, 0xc1, 0x11, 0xfb, 0xf9, 0xda,
+ 0x14, 0xa1, 0x01, 0xf8, 0x7e, 0xea, 0x5b, 0x5b,
+ 0xdd, 0x09, 0xf9, 0x31, 0x80, 0x3c, 0xee, 0x34,
+ 0x2d, 0xda, 0x71, 0xd9, 0x32, 0x7d, 0x45, 0xb2,
+ 0x53, 0xea, 0xd5, 0x7c, 0x85, 0x45, 0xce, 0x1d,
+ 0x2b, 0xe9, 0xd7, 0x95, 0xf8, 0x8c, 0x08, 0xe4,
+ 0xd0, 0x2f, 0x60, 0x75, 0x02, 0xf3, 0xde, 0xeb,
+ 0x46, 0x40, 0xa8, 0xd2, 0x37, 0xd6, 0xca, 0x5d,
+ 0xb9, 0xf4, 0x51, 0x31, 0x8a, 0x1a, 0x82, 0xbd,
+ 0x6f, 0x6d, 0x88, 0x2b, 0x63, 0x0f, 0xe1, 0xf0,
+ 0xcf, 0x13, 0x79, 0x1d, 0x78, 0x82, 0x66, 0xa1,
+ 0xef, 0xdb, 0x34, 0x50, 0xd2, 0x71, 0x47, 0x49,
+ 0x41, 0x74, 0xd9, 0x0b, 0x14, 0x38, 0x1f, 0xc3,
+ 0x09, 0x4d, 0xb3, 0xa6, 0x03, 0x3f, 0x56, 0x67,
+ 0xd7, 0x51, 0x4c, 0x8a, 0x1d, 0x37, 0x99, 0xfb,
+ 0xe1, 0x84, 0x57, 0x55, 0x9b, 0xf8, 0x73, 0x63,
+ 0x68, 0x73, 0x89, 0x52, 0x06, 0xe7, 0x34, 0xe7,
+ 0x1a, 0x15, 0x7e, 0xd9, 0x84, 0xa3, 0x0e, 0x68,
+ 0x14, 0x1c, 0xe8, 0x23, 0x9e, 0xe3, 0x8f, 0x71,
+ 0x02, 0x9b, 0x87, 0xd4, 0xd9, 0x1b, 0xd1, 0x9e,
+ 0x9e, 0xa0, 0x7e, 0x49, 0x8e, 0xaa, 0x89, 0xb5,
+ 0x16, 0x48, 0x07, 0xb3, 0x3d, 0x9e, 0x4c, 0x35,
+ 0x3e, 0x94, 0xa9, 0xf8, 0x82, 0x50, 0x6a, 0x41,
+ 0x28, 0x3e, 0x9f, 0x9a, 0x1a, 0x5d, 0x02, 0x7c,
+ 0xd0, 0x32, 0x52, 0xa5, 0xee, 0x09, 0x27, 0x2d,
+ 0x49, 0x17, 0xf7, 0x92, 0xa1, 0x63, 0x9d, 0x2a,
+ 0xfd, 0x53, 0x26, 0x14, 0x7c, 0x92, 0x72, 0xa6,
+ 0x38, 0x18, 0x8f, 0xb5, 0x54, 0xb3, 0x69, 0x63,
+ 0x6a, 0xdc, 0xb1, 0x5a, 0x12, 0x7a, 0x0b, 0xa3,
+};
+
+const struct testvec c3des_cbc_192_8_vectors[] = {
+ {
+ .blkno = 0,
+ .ptxt = c3des_cbc_ptxt,
+ .ctxt = c3des_cbc_192_encblkno8_vec0_ctxt,
+ },
+ {
+ .blkno = 1,
+ .ptxt = c3des_cbc_ptxt,
+ .ctxt = c3des_cbc_192_encblkno8_vec1_ctxt,
+ },
+ {
+ .blkno = 2,
+ .ptxt = c3des_cbc_ptxt,
+ .ctxt = c3des_cbc_192_encblkno8_vec2_ctxt,
+ },
+ {
+ .blkno = 3,
+ .ptxt = c3des_cbc_ptxt,
+ .ctxt = c3des_cbc_192_encblkno8_vec3_ctxt,
+ },
+};
+
+static int
+open_disk(const char *devpath, const char *imgpath, size_t size)
+{
+ int fd;
+
+ fd = open(imgpath, O_CREAT | O_RDWR | O_TRUNC, 0600);
+ if (fd < 0)
+ return -1;
+
+ if (ftruncate(fd, size) < 0)
+ goto fail;
+
+ if (rump_pub_etfs_register_withsize(devpath,
+ imgpath, RUMP_ETFS_BLK, 0, size) < 0) {
+ goto fail;
+ }
+
+ unlink(imgpath);
+ return fd;
+fail:
+ close(fd);
+ unlink(imgpath);
+ return -1;
+}
+
+static int
+open_cgd(int devno)
+{
+ char devpath[32];
+
+ sprintf(devpath, "/dev/rcgd%d%c", devno, getrawpartition() + 'a');
+
+ return rump_sys_open(devpath, O_RDWR, 0);
+}
+
+static int
+configure_cgd(int fd, const char *dkpath, const char *alg,
+ const char *ivmethod, const char *key, size_t keylen)
+{
+ struct cgd_ioctl ci;
+
+ memset(&ci, 0, sizeof(ci));
+ ci.ci_disk = dkpath;
+ ci.ci_alg = alg;
+ ci.ci_ivmethod = ivmethod;
+ ci.ci_keylen = 8 * keylen - 8; /* Exclude the NUL terminator. */
+ ci.ci_key = key;
+ ci.ci_blocksize = 64;
+
+ return rump_sys_ioctl(fd, CGDIOCSET, &ci);
+}
+
+static int
+unconfigure_cgd(int fd)
+{
+ struct cgd_ioctl ci;
+
+ return rump_sys_ioctl(fd, CGDIOCCLR, &ci);
+}
+
+static int
+write_testvec(int cgdfd, const struct testvec *tv)
+{
+
+ if (rump_sys_lseek(cgdfd, tv->blkno * SECSIZE, SEEK_SET) < 0)
+ return -1;
+
+ if (rump_sys_write(cgdfd, tv->ptxt, SECSIZE) != SECSIZE)
+ return -1;
+
+ return 0;
+}
+
+static int
+read_testvec(int cgdfd, const struct testvec *tv)
+{
+ char *buf;
+ int res = -1;
+
+ buf = malloc(SECSIZE);
+ if (buf == NULL)
+ return -1;
+
+ if (rump_sys_lseek(cgdfd, tv->blkno * SECSIZE, SEEK_SET) < 0)
+ goto fail;
+
+ if (rump_sys_read(cgdfd, buf, SECSIZE) != SECSIZE)
+ goto fail;
+
+ res = memcmp(buf, tv->ptxt, SECSIZE);
+fail:
+ free(buf);
+ return res;
+}
+
+static int
+check_testvec(int dkfd, const struct testvec *tv)
+{
+ char *buf;
+ int res = -1;
+
+ buf = malloc(SECSIZE);
+ if (buf == NULL)
+ return -1;
+
+ if (lseek(dkfd, tv->blkno * SECSIZE, SEEK_SET) < 0)
+ goto fail;
+
+ if (read(dkfd, buf, SECSIZE) != SECSIZE)
+ goto fail;
+
+ res = memcmp(buf, tv->ctxt, SECSIZE);
+fail:
+ free(buf);
+ return res;
+}
+
+ATF_TC(cgd_3des_cbc_192_encblkno1);
+ATF_TC_HEAD(cgd_3des_cbc_192_encblkno1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test 3des-cbc with 192 bits key, ivmethod encblkno1");
+}
+
+ATF_TC_BODY(cgd_3des_cbc_192_encblkno1, tc)
+{
+ const char imgpath[] = "3des-cbc-192-encblkno1.img";
+ const char *dkpath = "/dev/dk";
+ const size_t dksize = 4 * SECSIZE; /* Last blkno is 3. */
+ int dkfd, cgdfd;
+
+ rump_init();
+
+ RL(dkfd = open_disk(dkpath, imgpath, dksize));
+
+ RL(cgdfd = open_cgd(0));
+ RL(configure_cgd(cgdfd, dkpath, "3des-cbc", "encblkno1",
+ c3des_cbc_192_key, sizeof(c3des_cbc_192_key)));
+
+ ATF_CHECK_EQ(write_testvec(cgdfd, &c3des_cbc_192_1_vectors[0]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &c3des_cbc_192_1_vectors[1]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &c3des_cbc_192_1_vectors[2]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &c3des_cbc_192_1_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(configure_cgd(cgdfd, dkpath, "3des-cbc", "encblkno1",
+ c3des_cbc_192_key, sizeof(c3des_cbc_192_key)));
+
+ ATF_CHECK_EQ(read_testvec(cgdfd, &c3des_cbc_192_1_vectors[0]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &c3des_cbc_192_1_vectors[1]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &c3des_cbc_192_1_vectors[2]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &c3des_cbc_192_1_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(rump_sys_close(cgdfd));
+
+ ATF_CHECK_EQ(check_testvec(dkfd, &c3des_cbc_192_1_vectors[0]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &c3des_cbc_192_1_vectors[1]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &c3des_cbc_192_1_vectors[2]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &c3des_cbc_192_1_vectors[3]), 0);
+
+ RL(close(dkfd));
+}
+
+ATF_TC(cgd_3des_cbc_192_encblkno8);
+ATF_TC_HEAD(cgd_3des_cbc_192_encblkno8, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test 3des-cbc with 192 bits key, ivmethod encblkno8");
+}
+
+ATF_TC_BODY(cgd_3des_cbc_192_encblkno8, tc)
+{
+ const char imgpath[] = "3des-cbc-192-encblkno8.img";
+ const char *dkpath = "/dev/dk";
+ const size_t dksize = 4 * SECSIZE; /* Last blkno is 3. */
+ int dkfd, cgdfd;
+
+ rump_init();
+
+ RL(dkfd = open_disk(dkpath, imgpath, dksize));
+
+ RL(cgdfd = open_cgd(0));
+ RL(configure_cgd(cgdfd, dkpath, "3des-cbc", "encblkno8",
+ c3des_cbc_192_key, sizeof(c3des_cbc_192_key)));
+
+ ATF_CHECK_EQ(write_testvec(cgdfd, &c3des_cbc_192_8_vectors[0]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &c3des_cbc_192_8_vectors[1]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &c3des_cbc_192_8_vectors[2]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &c3des_cbc_192_8_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(configure_cgd(cgdfd, dkpath, "3des-cbc", "encblkno8",
+ c3des_cbc_192_key, sizeof(c3des_cbc_192_key)));
+
+ ATF_CHECK_EQ(read_testvec(cgdfd, &c3des_cbc_192_8_vectors[0]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &c3des_cbc_192_8_vectors[1]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &c3des_cbc_192_8_vectors[2]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &c3des_cbc_192_8_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(rump_sys_close(cgdfd));
+
+ ATF_CHECK_EQ(check_testvec(dkfd, &c3des_cbc_192_8_vectors[0]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &c3des_cbc_192_8_vectors[1]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &c3des_cbc_192_8_vectors[2]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &c3des_cbc_192_8_vectors[3]), 0);
+
+ RL(close(dkfd));
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+
+ ATF_TP_ADD_TC(tp, cgd_3des_cbc_192_encblkno1);
+ ATF_TP_ADD_TC(tp, cgd_3des_cbc_192_encblkno8);
+
+ return atf_no_error();
+}
diff --git a/dev/cgd/t_cgd_aes.c b/dev/cgd/t_cgd_aes.c
new file mode 100644
index 000000000000..9416333a2d71
--- /dev/null
+++ b/dev/cgd/t_cgd_aes.c
@@ -0,0 +1,3606 @@
+/* $NetBSD: t_cgd_aes.c,v 1.5 2016/12/11 00:23:44 alnsn Exp $ */
+/*-
+ * Copyright (c) 2016 The NetBSD Foundation, Inc.
+ * Copyright (c) 2007 The Institute of Electrical and Electronics Engineers, Inc
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Alexander Nasonov.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/sysctl.h>
+
+#include <atf-c.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <util.h>
+
+#include <dev/cgdvar.h>
+
+#include <rump/rump.h>
+#include <rump/rump_syscalls.h>
+
+#include "../../h_macros.h"
+
+#define SECSIZE 512
+
+struct testvec {
+ unsigned int blkno;
+ const uint8_t *ptxt; /* PlainText */
+ const uint8_t *ctxt; /* CipherText */
+};
+
+/*
+ * 128 bits CBC key, NUL terminated.
+ */
+static const char aes_cbc_128_key[17] = {
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
+ 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
+ 0
+};
+
+/*
+ * 192 bits CBC key, NUL terminated.
+ */
+static const char aes_cbc_192_key[25] = {
+ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, /* ABCDEFGH */
+ 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, /* IJKLMNOP */
+ 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, /* QRSTUVWX */
+ 0
+};
+
+/*
+ * 256 bits CBC key, NUL terminated.
+ */
+static const char aes_cbc_256_key[33] = {
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
+ 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
+ 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, /* 89abcdef */
+ 0
+};
+
+static const uint8_t aes_cbc_ptxt[SECSIZE] =
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop";
+
+/*
+ * IV method encblkno1, blkno 0.
+ */
+static const uint8_t aes_cbc_128_encblkno1_vec0_ctxt[SECSIZE] = {
+ 0x1e, 0x95, 0x12, 0x15, 0xf6, 0xe0, 0xa7, 0x56,
+ 0x95, 0xa0, 0xa7, 0x35, 0x77, 0xf4, 0xdd, 0xdc,
+ 0x37, 0xc0, 0x28, 0x20, 0x00, 0x79, 0xa0, 0x35,
+ 0xe0, 0x83, 0x23, 0x95, 0x4e, 0xea, 0x8d, 0xa2,
+ 0x11, 0xbf, 0x9a, 0xd5, 0x21, 0x1e, 0x15, 0xb9,
+ 0xd1, 0x2e, 0xd2, 0xd9, 0xa5, 0xcc, 0x26, 0x75,
+ 0xba, 0x3e, 0x30, 0x11, 0xb2, 0x40, 0xdd, 0x1d,
+ 0x07, 0x3b, 0xe6, 0x00, 0xa7, 0x31, 0x9e, 0x58,
+ 0x41, 0xf3, 0x02, 0xf5, 0xad, 0x35, 0x79, 0x9a,
+ 0x9e, 0x03, 0xc8, 0x7a, 0x9d, 0x1d, 0x58, 0x9f,
+ 0x98, 0x67, 0xe2, 0x49, 0x81, 0x0c, 0x23, 0x90,
+ 0xd8, 0xc6, 0xf0, 0xc5, 0x73, 0x46, 0xd5, 0x14,
+ 0x1d, 0x78, 0x24, 0x7c, 0x9f, 0x5c, 0x8c, 0xe6,
+ 0x5d, 0x85, 0x7a, 0x5f, 0x76, 0xcc, 0xd8, 0xe9,
+ 0x03, 0xff, 0xfd, 0xd4, 0x12, 0x3f, 0xcb, 0xb0,
+ 0xfe, 0xfd, 0x86, 0x00, 0x0c, 0xe3, 0xdd, 0xa6,
+ 0x89, 0x92, 0xfe, 0xc8, 0x07, 0x5a, 0x94, 0x55,
+ 0x75, 0xae, 0x68, 0x47, 0xba, 0x84, 0x75, 0x58,
+ 0x33, 0x30, 0x2c, 0x16, 0x5b, 0xe9, 0x3f, 0x2a,
+ 0x09, 0xf9, 0x69, 0x23, 0x77, 0xd7, 0x2b, 0x95,
+ 0x4b, 0x78, 0x59, 0xcc, 0xfa, 0xf5, 0x79, 0xd2,
+ 0x05, 0x87, 0x66, 0x57, 0x93, 0xbf, 0x05, 0x90,
+ 0x4d, 0x6d, 0xd2, 0x72, 0x92, 0x24, 0xec, 0x14,
+ 0xe7, 0xbf, 0x82, 0x57, 0xbb, 0x14, 0x51, 0xe6,
+ 0xce, 0x3f, 0xa1, 0xfc, 0x63, 0x75, 0xee, 0xde,
+ 0xf9, 0x31, 0xd3, 0xa0, 0x07, 0xcd, 0x4d, 0x8f,
+ 0x83, 0x7d, 0x65, 0xe1, 0xc6, 0x60, 0x9e, 0x5c,
+ 0x51, 0x76, 0xfa, 0x64, 0xdf, 0xdc, 0xaf, 0x38,
+ 0xee, 0xe9, 0x8f, 0x4b, 0xa0, 0x3a, 0x21, 0xdf,
+ 0x58, 0x3b, 0x73, 0xf5, 0x30, 0xbb, 0x29, 0xe0,
+ 0xff, 0x60, 0xf0, 0x05, 0x5e, 0x37, 0xbc, 0x78,
+ 0x95, 0x3f, 0xa8, 0xd4, 0xb4, 0x82, 0x0d, 0xe1,
+ 0x10, 0xe3, 0xa7, 0x61, 0x37, 0x58, 0x28, 0x14,
+ 0x22, 0x57, 0x32, 0x28, 0x80, 0x98, 0x3e, 0x5f,
+ 0x71, 0xcf, 0x34, 0xb8, 0x6d, 0x6b, 0xc0, 0x23,
+ 0xc1, 0x9e, 0x58, 0x4f, 0xd5, 0xa4, 0x14, 0x03,
+ 0x2a, 0xed, 0xc4, 0xa7, 0x77, 0x7c, 0x4f, 0x94,
+ 0x91, 0x1d, 0x47, 0x34, 0x82, 0xe8, 0x9d, 0x32,
+ 0x5c, 0xc7, 0x38, 0xe9, 0x92, 0xcd, 0x35, 0xfd,
+ 0x1c, 0xcc, 0x3c, 0x28, 0x75, 0x6f, 0xff, 0xd5,
+ 0xe8, 0xbf, 0x90, 0x92, 0x34, 0x13, 0x11, 0x89,
+ 0xe0, 0xa2, 0x25, 0xeb, 0x82, 0x63, 0x31, 0x80,
+ 0x50, 0x6c, 0x99, 0xaa, 0x97, 0x0e, 0x59, 0x45,
+ 0x64, 0xb8, 0x77, 0x78, 0x6b, 0x24, 0xac, 0xc0,
+ 0xc9, 0xa9, 0xbc, 0x13, 0xd1, 0x5e, 0x50, 0x9a,
+ 0x91, 0x1a, 0x08, 0xf7, 0xc5, 0x18, 0x9f, 0x87,
+ 0x97, 0x9c, 0x0a, 0x27, 0xf1, 0x66, 0xf8, 0x09,
+ 0x52, 0x09, 0x41, 0x07, 0xc1, 0xa1, 0x91, 0xa4,
+ 0x59, 0x09, 0x75, 0x57, 0x5b, 0x53, 0x79, 0x58,
+ 0xa2, 0x9e, 0x49, 0xa2, 0x5e, 0xf7, 0x28, 0x1c,
+ 0x43, 0xa6, 0xcb, 0x88, 0x46, 0x84, 0xc9, 0x7f,
+ 0x84, 0xdb, 0x45, 0x0c, 0xb3, 0x7f, 0x01, 0x40,
+ 0x71, 0x3e, 0x48, 0x12, 0x1f, 0xbc, 0x1e, 0xdf,
+ 0x41, 0x50, 0xb2, 0x11, 0x67, 0x83, 0x19, 0x04,
+ 0x0e, 0x21, 0xd5, 0xf2, 0x54, 0x99, 0xfb, 0x47,
+ 0xf2, 0x5e, 0x02, 0x4b, 0x61, 0x6d, 0xef, 0x78,
+ 0x29, 0xe4, 0x3a, 0x56, 0x14, 0x20, 0x6f, 0x70,
+ 0x82, 0xea, 0x5d, 0xbc, 0x48, 0x89, 0x34, 0x69,
+ 0xdb, 0x4a, 0x06, 0xa7, 0xd6, 0xc7, 0xb7, 0x06,
+ 0x8e, 0x64, 0x21, 0x3e, 0xa6, 0x32, 0x61, 0x59,
+ 0x03, 0xea, 0xc3, 0x71, 0xf0, 0x26, 0x02, 0xe0,
+ 0x71, 0x95, 0x38, 0x11, 0x32, 0xe6, 0x3b, 0x25,
+ 0x53, 0x14, 0x24, 0x34, 0xe8, 0x8c, 0xa8, 0xef,
+ 0x52, 0xfe, 0x06, 0x2c, 0x20, 0x88, 0x4f, 0xa6,
+};
+
+/*
+ * IV method encblkno1, blkno 1.
+ */
+static const uint8_t aes_cbc_128_encblkno1_vec1_ctxt[SECSIZE] = {
+ 0x2f, 0x69, 0x3e, 0x95, 0x87, 0x91, 0x99, 0xd4,
+ 0xd9, 0x5d, 0xf2, 0x52, 0x32, 0x54, 0x2a, 0x80,
+ 0xa0, 0x77, 0x6e, 0x73, 0x15, 0xb4, 0xc9, 0x13,
+ 0x85, 0xed, 0x79, 0x9b, 0x84, 0x0a, 0x7e, 0xdb,
+ 0xee, 0x09, 0x78, 0x11, 0x28, 0xd5, 0x26, 0xec,
+ 0x1d, 0x52, 0xba, 0x33, 0x26, 0xeb, 0x91, 0xc6,
+ 0x4b, 0xf0, 0x38, 0xdf, 0x9f, 0x9d, 0x6c, 0xd8,
+ 0x49, 0x83, 0x88, 0xbe, 0x62, 0x2d, 0x5e, 0x88,
+ 0xc0, 0x35, 0xe4, 0xc3, 0xc9, 0x9f, 0x62, 0x59,
+ 0x16, 0xa7, 0x2e, 0xc0, 0xda, 0x3c, 0x2e, 0x10,
+ 0x53, 0xf0, 0x84, 0x27, 0x38, 0xd0, 0xf4, 0xb5,
+ 0x7c, 0x4a, 0x63, 0x04, 0x51, 0x22, 0xae, 0xf3,
+ 0xe7, 0x97, 0x53, 0xee, 0xe6, 0xaf, 0xc3, 0x49,
+ 0x3a, 0x5a, 0x74, 0x83, 0x18, 0xa3, 0x6b, 0xf3,
+ 0x6a, 0x3b, 0xe2, 0x1b, 0xd4, 0x64, 0x41, 0xdf,
+ 0xd1, 0xd2, 0xdd, 0x22, 0xa8, 0x66, 0xbd, 0x8e,
+ 0xc4, 0x9a, 0x6d, 0x15, 0x38, 0x5b, 0x50, 0x9a,
+ 0x65, 0x48, 0x97, 0xf1, 0x04, 0x85, 0x8b, 0x5c,
+ 0x44, 0x32, 0x15, 0xea, 0x28, 0x5f, 0x98, 0x53,
+ 0xb4, 0x80, 0xd0, 0x2c, 0x59, 0x04, 0x08, 0xaf,
+ 0xa4, 0xb7, 0x49, 0xd1, 0x98, 0x87, 0xb9, 0xb6,
+ 0x3d, 0x89, 0xd1, 0xbe, 0xf4, 0x89, 0xec, 0xf9,
+ 0x2d, 0xc7, 0xc6, 0xe9, 0xe6, 0xfa, 0x1e, 0x67,
+ 0x68, 0xe7, 0xb7, 0x91, 0x55, 0x77, 0xf3, 0x27,
+ 0x38, 0x23, 0xcf, 0x2e, 0x3e, 0x8b, 0xfd, 0xb3,
+ 0x90, 0xd8, 0x6b, 0x1e, 0x93, 0x8f, 0xb6, 0xc1,
+ 0x27, 0xc2, 0xb7, 0x76, 0x10, 0x69, 0xe8, 0x7f,
+ 0xfc, 0x03, 0x59, 0xa4, 0xd3, 0x7f, 0x2f, 0x03,
+ 0x1c, 0x21, 0x6d, 0x2e, 0xae, 0xba, 0xa2, 0x04,
+ 0x67, 0xe9, 0x33, 0xc9, 0x3a, 0x96, 0xb6, 0x7c,
+ 0xf6, 0x21, 0x6b, 0x34, 0x9a, 0x5b, 0xa0, 0x8b,
+ 0x51, 0xf0, 0xd4, 0x3a, 0xa3, 0xcb, 0x22, 0xfb,
+ 0x8a, 0x56, 0xab, 0x9a, 0x15, 0x75, 0x07, 0x87,
+ 0x32, 0xa7, 0x15, 0xc7, 0xd9, 0x40, 0x95, 0xe5,
+ 0xfb, 0xb0, 0xc5, 0xb1, 0x60, 0xf8, 0xcc, 0x8b,
+ 0x30, 0x20, 0xd9, 0x84, 0x6f, 0xa2, 0xcb, 0x72,
+ 0xf5, 0xa5, 0x2c, 0xa3, 0xc6, 0x1c, 0xd2, 0x74,
+ 0x01, 0x74, 0xdd, 0xb4, 0x68, 0x3b, 0x3b, 0x3e,
+ 0x4f, 0xb5, 0x67, 0x9a, 0x9c, 0x37, 0x3d, 0xbf,
+ 0xd3, 0xab, 0xd7, 0x70, 0x03, 0x28, 0x5c, 0x3b,
+ 0xb7, 0x08, 0x38, 0x3d, 0x69, 0xa9, 0xcb, 0x63,
+ 0x04, 0x95, 0x8a, 0x16, 0x4c, 0xff, 0x9f, 0x0c,
+ 0xe2, 0x51, 0x95, 0x44, 0x52, 0x3b, 0x59, 0x9d,
+ 0x0b, 0x77, 0xa0, 0x39, 0x40, 0xea, 0x33, 0x25,
+ 0xc8, 0xc5, 0x90, 0x47, 0x23, 0xe3, 0x03, 0x8c,
+ 0x6a, 0xe0, 0x4f, 0x76, 0xe7, 0x72, 0x82, 0xcc,
+ 0xb2, 0xfd, 0xfb, 0x82, 0x1a, 0x28, 0x30, 0x89,
+ 0x0e, 0x25, 0xa7, 0x63, 0x85, 0x2e, 0x9b, 0xa6,
+ 0x0b, 0xa0, 0xb5, 0x34, 0xa2, 0x2e, 0x7f, 0xd4,
+ 0xe5, 0xd6, 0x95, 0xe8, 0x09, 0x3d, 0x4d, 0xdf,
+ 0xd9, 0xc0, 0x63, 0x17, 0xa5, 0x9c, 0xf6, 0xa3,
+ 0x59, 0x17, 0xc0, 0xf8, 0xa2, 0x11, 0x14, 0x88,
+ 0xf0, 0x1e, 0x4a, 0x4b, 0x13, 0xf6, 0xd6, 0x09,
+ 0xac, 0xf8, 0x39, 0x5d, 0x4c, 0x68, 0x69, 0x99,
+ 0x08, 0xd4, 0xf5, 0x39, 0x6d, 0x78, 0xde, 0xb5,
+ 0x6f, 0x34, 0xc4, 0x28, 0x73, 0x6c, 0x29, 0xa1,
+ 0xef, 0xfe, 0xed, 0x56, 0xb2, 0x70, 0x7b, 0xd5,
+ 0x5b, 0xd1, 0x09, 0x6a, 0x9a, 0x59, 0xe9, 0x79,
+ 0xe9, 0xee, 0xa4, 0x03, 0xc1, 0x67, 0xce, 0x62,
+ 0xf6, 0x4f, 0x04, 0xa5, 0x04, 0x71, 0x13, 0xeb,
+ 0x3d, 0x0a, 0x65, 0x2f, 0x57, 0xb0, 0xc0, 0xa4,
+ 0xf2, 0x8d, 0x78, 0x90, 0xeb, 0xc9, 0x5e, 0x8b,
+ 0xd8, 0xfb, 0xbc, 0x74, 0x1a, 0x70, 0x94, 0x2c,
+ 0xeb, 0xf2, 0x5e, 0x6d, 0xbb, 0x96, 0x7a, 0x2c,
+};
+
+/*
+ * IV method encblkno1, blkno 2.
+ */
+static const uint8_t aes_cbc_128_encblkno1_vec2_ctxt[SECSIZE] = {
+ 0xbc, 0x49, 0x35, 0x2c, 0xe3, 0x10, 0x12, 0x65,
+ 0x7a, 0xf4, 0xde, 0xd3, 0xf8, 0xe1, 0x49, 0x97,
+ 0x0a, 0x07, 0x93, 0x6c, 0xf8, 0x0e, 0xb7, 0xdf,
+ 0x53, 0xba, 0x1e, 0x8e, 0x14, 0xbd, 0xf6, 0x81,
+ 0xd6, 0xf6, 0x3d, 0xb2, 0xe7, 0x6a, 0x9d, 0x50,
+ 0x68, 0xc2, 0x75, 0x8e, 0xfb, 0x44, 0xfa, 0xc8,
+ 0x9f, 0x30, 0x15, 0xd5, 0xbe, 0xce, 0x04, 0xc1,
+ 0x99, 0xde, 0x3d, 0x2b, 0xc1, 0xc4, 0x8a, 0xb1,
+ 0xc5, 0x54, 0x47, 0x52, 0xf6, 0x38, 0x11, 0xcb,
+ 0x11, 0xf6, 0xb7, 0xbd, 0x4d, 0x24, 0xa1, 0xac,
+ 0x04, 0x17, 0x7e, 0x3c, 0xbc, 0x3b, 0xa0, 0x8d,
+ 0xfb, 0x22, 0x82, 0x56, 0xa2, 0xbe, 0xfe, 0xe7,
+ 0xde, 0xa4, 0xe9, 0xeb, 0xa0, 0x7a, 0x45, 0xc9,
+ 0x18, 0x0b, 0x14, 0xd5, 0xff, 0x4c, 0xe5, 0x86,
+ 0xac, 0xac, 0xaa, 0xb4, 0x70, 0x0c, 0x4a, 0x20,
+ 0xb6, 0xd8, 0x2d, 0xac, 0x09, 0xd8, 0xf6, 0x24,
+ 0xdf, 0xa5, 0x62, 0xef, 0x8c, 0x01, 0xa8, 0x1d,
+ 0x8f, 0x52, 0xee, 0xa6, 0x2f, 0x9b, 0x81, 0x18,
+ 0x0e, 0x6b, 0xa3, 0xe5, 0x67, 0xb3, 0xd5, 0x30,
+ 0xb1, 0x9f, 0x87, 0x05, 0xd0, 0x52, 0x62, 0x6f,
+ 0xb9, 0x3b, 0xbc, 0x0c, 0x0c, 0xcb, 0x73, 0x55,
+ 0x23, 0x83, 0x14, 0x78, 0x05, 0x5b, 0x05, 0xf5,
+ 0x3e, 0xa7, 0xf3, 0x4d, 0x0d, 0x34, 0x6f, 0xe0,
+ 0x58, 0x52, 0x0a, 0x82, 0xa7, 0x49, 0x8a, 0xd2,
+ 0x23, 0xb1, 0xc5, 0x0d, 0xa7, 0x0f, 0x56, 0xfc,
+ 0x7e, 0xf6, 0x19, 0x4b, 0xe7, 0x63, 0x72, 0x4c,
+ 0xb8, 0x5c, 0x80, 0x54, 0xf5, 0x1f, 0xb0, 0x29,
+ 0x40, 0x88, 0x75, 0x54, 0x42, 0xca, 0x2c, 0xc3,
+ 0xcf, 0xd7, 0xc1, 0xb2, 0xd6, 0x90, 0x70, 0x5e,
+ 0xf5, 0x58, 0x70, 0xe0, 0xff, 0x5a, 0xf5, 0xee,
+ 0x32, 0x4f, 0x61, 0x1c, 0xf6, 0xbf, 0xd5, 0x7c,
+ 0x73, 0xb9, 0x1d, 0x30, 0xc2, 0xfb, 0x2f, 0x9a,
+ 0xf7, 0x57, 0x2e, 0x87, 0x7d, 0xcb, 0xdd, 0x7e,
+ 0xda, 0xec, 0x47, 0x1a, 0x0e, 0x70, 0x2d, 0x6e,
+ 0x18, 0x2b, 0x89, 0xc1, 0x85, 0x58, 0x6d, 0x4b,
+ 0x45, 0x11, 0xcf, 0x82, 0x9f, 0x31, 0xd0, 0x42,
+ 0x11, 0xca, 0xa8, 0x52, 0x66, 0xf7, 0xf1, 0x1d,
+ 0x86, 0xe3, 0xb4, 0x41, 0xcb, 0x92, 0xb1, 0x9f,
+ 0x8d, 0x8e, 0x08, 0xe9, 0xc4, 0x66, 0xce, 0x9d,
+ 0xae, 0x91, 0xaf, 0xe6, 0xa6, 0x2e, 0x06, 0x3a,
+ 0xf5, 0x27, 0x48, 0xe4, 0x31, 0x0f, 0xc5, 0xdf,
+ 0x29, 0x56, 0xed, 0x62, 0xf3, 0xef, 0xca, 0xa6,
+ 0x58, 0xd1, 0x84, 0x99, 0xd3, 0x34, 0x67, 0x92,
+ 0x6a, 0xb2, 0xd1, 0xd1, 0x50, 0x1f, 0xe9, 0xd8,
+ 0x3c, 0xbe, 0x12, 0x97, 0x7c, 0x4f, 0xc0, 0xbe,
+ 0x91, 0x32, 0x15, 0xd5, 0xf2, 0x5e, 0xe6, 0x13,
+ 0x86, 0xfa, 0xc6, 0xde, 0xd8, 0xe1, 0x70, 0xb4,
+ 0xf7, 0x5b, 0x9f, 0x79, 0x55, 0x22, 0x7a, 0xe1,
+ 0x54, 0x40, 0x39, 0x11, 0xe1, 0x78, 0x01, 0x01,
+ 0xc0, 0x44, 0xeb, 0x92, 0xb9, 0x01, 0xdd, 0x56,
+ 0xb9, 0x7e, 0xa0, 0x50, 0x41, 0x58, 0xb2, 0x13,
+ 0x12, 0x44, 0xd2, 0x39, 0xf2, 0x76, 0x3c, 0x53,
+ 0x36, 0xfe, 0x17, 0x74, 0x91, 0x8d, 0xbe, 0xc5,
+ 0x40, 0xf7, 0xa2, 0xe9, 0x65, 0xd9, 0xdf, 0x80,
+ 0x7b, 0xd9, 0xc3, 0x1f, 0xb4, 0xfc, 0x9f, 0x8d,
+ 0x7a, 0x4e, 0x1e, 0x32, 0x6d, 0xb1, 0x82, 0x1e,
+ 0x0c, 0xb6, 0x0b, 0xe6, 0x15, 0x82, 0x5c, 0xcc,
+ 0xc8, 0x4a, 0x73, 0x56, 0x9d, 0x11, 0xfa, 0xcd,
+ 0x21, 0x95, 0x23, 0x71, 0xe8, 0xfe, 0x06, 0x43,
+ 0xf6, 0x17, 0x51, 0x28, 0x0d, 0xfb, 0x0a, 0x49,
+ 0x1b, 0x35, 0x1e, 0x4a, 0x38, 0x08, 0x6b, 0xcd,
+ 0x67, 0x21, 0x94, 0x09, 0x28, 0xca, 0x0a, 0x18,
+ 0xdf, 0x6c, 0x86, 0x47, 0x10, 0x29, 0x81, 0x9a,
+ 0x73, 0xba, 0x78, 0xbd, 0xc0, 0x61, 0xee, 0x23,
+};
+
+/*
+ * IV method encblkno1, blkno 3.
+ */
+static const uint8_t aes_cbc_128_encblkno1_vec3_ctxt[SECSIZE] = {
+ 0x29, 0x9f, 0xb1, 0x0f, 0x7d, 0xb4, 0xd9, 0xbb,
+ 0xf9, 0x06, 0x60, 0xdc, 0xb9, 0xeb, 0x73, 0x6e,
+ 0xfe, 0xdb, 0x99, 0x29, 0xe8, 0x42, 0x46, 0xe7,
+ 0x49, 0xcf, 0x90, 0x2d, 0x08, 0xd7, 0xd5, 0xbf,
+ 0x0f, 0x4f, 0x66, 0xce, 0xcd, 0xb1, 0x8a, 0xc7,
+ 0x47, 0xc9, 0x8e, 0xe3, 0x9f, 0x80, 0x79, 0xc6,
+ 0xa8, 0xe5, 0x20, 0x66, 0x58, 0xde, 0xab, 0x87,
+ 0x5e, 0x7e, 0xcd, 0x55, 0x81, 0x09, 0x40, 0xd9,
+ 0x8b, 0x7e, 0xd3, 0xf9, 0x16, 0x55, 0x72, 0x7d,
+ 0xe8, 0x36, 0x76, 0x06, 0x77, 0x47, 0xa5, 0xdc,
+ 0x80, 0x33, 0x7d, 0x88, 0x5f, 0x56, 0x48, 0x0f,
+ 0x66, 0xb5, 0x91, 0x9d, 0xf8, 0xdb, 0x83, 0x0d,
+ 0xd4, 0xc6, 0x13, 0xfc, 0xd4, 0xe5, 0x34, 0x81,
+ 0x70, 0x4d, 0x96, 0x82, 0x5d, 0xb2, 0x36, 0x37,
+ 0xdf, 0xd2, 0x5e, 0x31, 0xf0, 0x9d, 0x6d, 0xb7,
+ 0xf9, 0x2d, 0xcb, 0x77, 0xb8, 0x59, 0xa0, 0xbb,
+ 0x4f, 0x8d, 0xa0, 0xd1, 0x49, 0x17, 0x93, 0x3c,
+ 0xf0, 0x4e, 0x72, 0xdd, 0x99, 0x9a, 0x87, 0xf1,
+ 0x01, 0x89, 0xdf, 0xef, 0xed, 0x04, 0x86, 0x3d,
+ 0x9b, 0xab, 0x6c, 0xa7, 0xef, 0x1b, 0xbb, 0x24,
+ 0xbc, 0x65, 0x01, 0x06, 0x12, 0x3f, 0x7e, 0x9f,
+ 0x83, 0xf3, 0xd4, 0x43, 0x18, 0x03, 0xa3, 0x07,
+ 0xbc, 0x85, 0xe8, 0xdb, 0x6c, 0x8f, 0xaf, 0x70,
+ 0x71, 0x5d, 0xbc, 0x6d, 0x14, 0x05, 0xdf, 0xce,
+ 0x9f, 0xe2, 0xa3, 0x51, 0x66, 0x92, 0x52, 0x19,
+ 0x98, 0xbd, 0xb2, 0x68, 0x79, 0xf4, 0x5d, 0x71,
+ 0xcb, 0xa0, 0x1b, 0x77, 0x34, 0x46, 0x69, 0x3c,
+ 0xa4, 0x0f, 0x72, 0xf5, 0x73, 0xf6, 0xa0, 0xe9,
+ 0x72, 0xef, 0xa1, 0xcc, 0x43, 0xfc, 0xb7, 0xf3,
+ 0x59, 0xeb, 0x40, 0x61, 0x02, 0x26, 0x9b, 0x71,
+ 0x57, 0x17, 0x36, 0xac, 0xc8, 0xd5, 0x9d, 0xcb,
+ 0x4d, 0x4f, 0xf7, 0xc1, 0x58, 0xce, 0xbf, 0x73,
+ 0xe7, 0xd0, 0x58, 0x0d, 0x08, 0x01, 0x8f, 0x68,
+ 0x1b, 0x3f, 0x3a, 0x7b, 0xdb, 0x9e, 0xa7, 0x33,
+ 0x59, 0x91, 0xa8, 0xe3, 0x58, 0x22, 0x3f, 0x97,
+ 0xe1, 0xdb, 0xd6, 0x99, 0x0e, 0xdd, 0x76, 0xcd,
+ 0x4d, 0x02, 0x28, 0x43, 0x8a, 0xdd, 0x10, 0xad,
+ 0x55, 0xe0, 0x62, 0xf7, 0x44, 0xbc, 0x3f, 0x99,
+ 0x3c, 0x09, 0x25, 0xfb, 0xfd, 0x1e, 0x4c, 0x45,
+ 0x0e, 0x6e, 0x75, 0x15, 0x48, 0x19, 0x08, 0xc3,
+ 0x2b, 0x81, 0x60, 0x5f, 0x19, 0x09, 0x74, 0x0a,
+ 0xbd, 0x0d, 0x8d, 0x94, 0x55, 0x04, 0x2b, 0x8e,
+ 0x0d, 0x10, 0x60, 0x64, 0x0d, 0x7f, 0x63, 0x2e,
+ 0x89, 0x0b, 0xfc, 0x1c, 0xbc, 0xf3, 0x66, 0xc5,
+ 0x80, 0x93, 0x3a, 0x74, 0x15, 0x11, 0xd5, 0xba,
+ 0xbc, 0x06, 0x3f, 0x85, 0xcc, 0x6c, 0xd3, 0xf2,
+ 0x74, 0xc6, 0x10, 0x15, 0x0a, 0x02, 0x66, 0xa4,
+ 0xa8, 0x93, 0x0b, 0x5c, 0xe7, 0x13, 0x96, 0x90,
+ 0xdd, 0xe3, 0x25, 0x22, 0x46, 0x7b, 0x49, 0xde,
+ 0x72, 0x55, 0xf3, 0x30, 0x62, 0x5f, 0x7a, 0x2a,
+ 0x37, 0x88, 0xea, 0x57, 0x99, 0x64, 0x50, 0x2d,
+ 0xd3, 0x6a, 0x09, 0x4b, 0xd6, 0x61, 0xf2, 0x22,
+ 0x53, 0x36, 0xf7, 0x42, 0x21, 0xde, 0xda, 0xcb,
+ 0x8b, 0x6f, 0xf3, 0x4e, 0x2c, 0x16, 0xfb, 0xfc,
+ 0x13, 0xa7, 0xd1, 0xd8, 0xfd, 0x16, 0x39, 0x20,
+ 0xe0, 0xb2, 0xb4, 0xd5, 0x40, 0x93, 0x30, 0xf3,
+ 0xab, 0x88, 0xe3, 0xfb, 0xbe, 0xb8, 0x02, 0x3a,
+ 0x78, 0x2d, 0x56, 0x4b, 0x92, 0x5b, 0x0a, 0x8d,
+ 0x18, 0xa4, 0x5b, 0x11, 0x60, 0x0b, 0x45, 0xad,
+ 0x0b, 0x64, 0x96, 0x7d, 0x84, 0xf2, 0x20, 0xa8,
+ 0x95, 0x78, 0xb3, 0xb5, 0x98, 0x1f, 0xa7, 0x3e,
+ 0x30, 0x77, 0x43, 0xd2, 0x8c, 0x20, 0xc5, 0x5e,
+ 0x76, 0xcd, 0x2c, 0x7c, 0xfa, 0x34, 0x36, 0xda,
+ 0x39, 0x00, 0x2e, 0x69, 0x4a, 0xb3, 0x0f, 0x6f,
+};
+
+const struct testvec aes_cbc_128_1_vectors[] = {
+ {
+ .blkno = 0,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_128_encblkno1_vec0_ctxt,
+ },
+ {
+ .blkno = 1,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_128_encblkno1_vec1_ctxt,
+ },
+ {
+ .blkno = 2,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_128_encblkno1_vec2_ctxt,
+ },
+ {
+ .blkno = 3,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_128_encblkno1_vec3_ctxt,
+ },
+};
+
+/*
+ * IV method encblkno8, blkno 0.
+ */
+static const uint8_t aes_cbc_128_encblkno8_vec0_ctxt[SECSIZE] = {
+ 0xa6, 0x64, 0xef, 0x0f, 0xc4, 0x45, 0xcc, 0x5e,
+ 0xf8, 0x27, 0x42, 0x5e, 0xbd, 0x93, 0x99, 0xcd,
+ 0x79, 0xa8, 0x7d, 0x72, 0xc4, 0x02, 0x99, 0xa6,
+ 0xe4, 0x69, 0x57, 0x82, 0xdf, 0x32, 0x4e, 0x67,
+ 0x2a, 0xd9, 0x58, 0x8c, 0x9f, 0xfc, 0x4d, 0xcf,
+ 0x7b, 0xa4, 0xa1, 0xfa, 0xd9, 0x4d, 0xb5, 0x67,
+ 0x06, 0x4a, 0x9e, 0x6d, 0xe8, 0xaa, 0xdd, 0xae,
+ 0x8c, 0xda, 0xcf, 0x26, 0xd5, 0x94, 0x8d, 0x12,
+ 0xf8, 0xdd, 0x21, 0x4c, 0xcb, 0xc8, 0x5d, 0xd1,
+ 0x6a, 0x89, 0x37, 0xd0, 0x32, 0xe4, 0x87, 0xbc,
+ 0x5d, 0xef, 0xca, 0x38, 0xd5, 0x08, 0xfb, 0xcf,
+ 0xb7, 0x8d, 0x65, 0x52, 0x13, 0xea, 0x2d, 0x30,
+ 0xd3, 0x9a, 0xe8, 0x9c, 0x76, 0x25, 0x44, 0x2a,
+ 0xf1, 0xe1, 0xbb, 0xcd, 0xbc, 0x9c, 0xf5, 0xa3,
+ 0xfb, 0x23, 0x53, 0x95, 0x61, 0xea, 0x46, 0x97,
+ 0xf6, 0xbf, 0xdf, 0xf9, 0xb7, 0x94, 0x73, 0xa8,
+ 0xc1, 0xaa, 0x64, 0xfb, 0x66, 0x26, 0x0f, 0x4c,
+ 0xee, 0x3c, 0xb6, 0x3f, 0x13, 0x88, 0xaa, 0x7d,
+ 0x91, 0x01, 0x1a, 0x95, 0x3b, 0xb5, 0x7e, 0x1f,
+ 0xc1, 0x84, 0xa6, 0x83, 0x99, 0xe6, 0xaf, 0x21,
+ 0x33, 0xff, 0x2e, 0xc9, 0xfe, 0xf2, 0xa1, 0x37,
+ 0xed, 0x91, 0x73, 0x70, 0x4f, 0xb4, 0x69, 0x69,
+ 0x98, 0x1d, 0x6d, 0xd4, 0xa4, 0xac, 0x73, 0x61,
+ 0x04, 0xf5, 0x13, 0x50, 0x2a, 0xa9, 0xf7, 0x61,
+ 0x78, 0xf5, 0x87, 0x26, 0xc5, 0x4a, 0x30, 0xbb,
+ 0x94, 0x55, 0x51, 0xb4, 0xa0, 0x83, 0x30, 0xe6,
+ 0xf7, 0xc7, 0x89, 0x61, 0x73, 0xd9, 0xbd, 0xe1,
+ 0x4e, 0x14, 0x8a, 0x02, 0x3d, 0x7a, 0x58, 0x92,
+ 0x41, 0xe7, 0x90, 0x8d, 0xd7, 0x67, 0x62, 0xf8,
+ 0x99, 0xa7, 0x9d, 0x55, 0xec, 0x18, 0x6b, 0x42,
+ 0xaf, 0x27, 0x97, 0xe5, 0x51, 0xa9, 0x10, 0x27,
+ 0x5e, 0x3f, 0xac, 0xda, 0xd3, 0xb5, 0x2b, 0x43,
+ 0x2e, 0x10, 0xdc, 0xd9, 0xe2, 0x2f, 0x4f, 0xfe,
+ 0xf3, 0x0d, 0x06, 0x76, 0xf9, 0x25, 0xcd, 0x26,
+ 0xef, 0x8e, 0x9b, 0xc2, 0xb3, 0x20, 0x2b, 0x00,
+ 0xb6, 0xe6, 0x2e, 0xf7, 0x17, 0xc7, 0xa8, 0x3c,
+ 0x00, 0xfc, 0x78, 0x8d, 0x10, 0x38, 0xd1, 0x11,
+ 0x94, 0xed, 0xb4, 0x22, 0x13, 0xcb, 0x52, 0x0f,
+ 0x0f, 0xd7, 0x33, 0x3b, 0xbd, 0x01, 0x04, 0x56,
+ 0xfa, 0x2c, 0xaa, 0xaf, 0x2b, 0x93, 0xde, 0xf4,
+ 0x31, 0x36, 0x13, 0x71, 0xef, 0x7a, 0xf0, 0xae,
+ 0xbd, 0xa7, 0x4a, 0x57, 0xa5, 0xc5, 0xf3, 0x5c,
+ 0x08, 0x2b, 0xe7, 0x12, 0x42, 0x4b, 0x4b, 0x12,
+ 0x49, 0x3a, 0x2e, 0x26, 0x67, 0x67, 0xa1, 0xd5,
+ 0x59, 0xa6, 0x18, 0x96, 0x22, 0x2b, 0xeb, 0x56,
+ 0x1e, 0x0a, 0x08, 0x75, 0xb4, 0x2b, 0x5c, 0x0a,
+ 0x4e, 0x9d, 0x17, 0xd4, 0x0c, 0xfe, 0x46, 0x60,
+ 0x6d, 0xfa, 0xc0, 0xb9, 0x5e, 0x1f, 0x88, 0x0e,
+ 0x08, 0x2c, 0xf3, 0xb4, 0x3a, 0x15, 0xc5, 0xf9,
+ 0x5b, 0x85, 0x92, 0x94, 0xa8, 0x8f, 0x2c, 0x3a,
+ 0x7e, 0x22, 0x86, 0x88, 0x51, 0x03, 0xee, 0xf9,
+ 0x2e, 0x83, 0xce, 0x39, 0x0c, 0x76, 0x64, 0xe5,
+ 0x5a, 0x88, 0xef, 0xc5, 0x06, 0xb2, 0xe4, 0x13,
+ 0x82, 0xc9, 0xee, 0xba, 0x6d, 0x56, 0xa8, 0x87,
+ 0x51, 0x69, 0x3b, 0x86, 0x29, 0x8e, 0xe8, 0xb4,
+ 0x44, 0x42, 0x07, 0x5b, 0xff, 0x0e, 0x1e, 0x9f,
+ 0x42, 0xb1, 0xc8, 0x5f, 0xab, 0x3b, 0xc7, 0xba,
+ 0x75, 0x20, 0xe6, 0x9f, 0x93, 0xb5, 0xcf, 0x8f,
+ 0x7c, 0x1c, 0xf3, 0xdb, 0x6a, 0xf4, 0xde, 0x00,
+ 0xe9, 0xaf, 0xd5, 0xf4, 0x36, 0x98, 0x14, 0x2d,
+ 0x53, 0x20, 0x74, 0xab, 0x0c, 0xf6, 0xcd, 0x15,
+ 0x32, 0xa6, 0x01, 0x8d, 0x24, 0x1b, 0x4b, 0x1f,
+ 0xa3, 0xfc, 0x38, 0x82, 0x3a, 0xa1, 0xb5, 0x52,
+ 0x53, 0xc7, 0x2b, 0x30, 0x7c, 0x65, 0xb9, 0x7d,
+};
+
+/*
+ * IV method encblkno8, blkno 1.
+ */
+static const uint8_t aes_cbc_128_encblkno8_vec1_ctxt[SECSIZE] = {
+ 0x63, 0x45, 0x16, 0x0c, 0xe4, 0x4f, 0x51, 0xde,
+ 0x74, 0xf8, 0x7b, 0xf5, 0x05, 0x17, 0x13, 0x1e,
+ 0xa5, 0x3d, 0x84, 0xfa, 0x35, 0x5a, 0x2d, 0x3c,
+ 0xb7, 0x61, 0x68, 0xff, 0xcd, 0x33, 0x1f, 0x0b,
+ 0x53, 0x79, 0xf2, 0x2f, 0xbc, 0x8d, 0xac, 0xb9,
+ 0xf9, 0xb7, 0x9c, 0x0a, 0x9d, 0xa1, 0x4d, 0x78,
+ 0x9e, 0x4e, 0xfa, 0xe8, 0xc8, 0x46, 0x4b, 0x99,
+ 0x91, 0x7e, 0x33, 0x6e, 0x18, 0x24, 0x01, 0xc3,
+ 0x9f, 0x8c, 0x43, 0xb5, 0x15, 0x7e, 0xdd, 0xf9,
+ 0x1b, 0xb0, 0xf2, 0xc3, 0x97, 0x1f, 0x7c, 0x3f,
+ 0x43, 0x4c, 0x9f, 0x93, 0x29, 0x83, 0x8f, 0xad,
+ 0xd1, 0x5e, 0x92, 0x1a, 0x17, 0xd1, 0xa0, 0x05,
+ 0x6e, 0x62, 0x59, 0x80, 0x50, 0x6d, 0xe3, 0x28,
+ 0x9a, 0x43, 0xdc, 0x81, 0x4f, 0x49, 0xc4, 0x98,
+ 0xcd, 0x6d, 0x28, 0xb4, 0x86, 0xe4, 0x83, 0x45,
+ 0xd4, 0x43, 0x52, 0x8a, 0xd6, 0xc8, 0x1c, 0x90,
+ 0xeb, 0xf0, 0xe7, 0x76, 0xb4, 0x43, 0x9b, 0x56,
+ 0x48, 0x73, 0xdd, 0x01, 0x50, 0x1c, 0x61, 0xfc,
+ 0x22, 0xac, 0xf4, 0x27, 0x94, 0x02, 0x54, 0xd3,
+ 0x7d, 0x25, 0xf6, 0x14, 0x29, 0xbb, 0x2b, 0x22,
+ 0xc8, 0xe8, 0x7f, 0xa1, 0xfe, 0x19, 0x79, 0x97,
+ 0xb6, 0xa6, 0xba, 0x5b, 0x89, 0xdf, 0x73, 0x6d,
+ 0x79, 0x38, 0x5b, 0xf8, 0x89, 0xa2, 0x95, 0x1d,
+ 0xda, 0x38, 0x17, 0x4b, 0x01, 0xf1, 0x7d, 0x0a,
+ 0xa2, 0x8f, 0x5a, 0x02, 0x51, 0xb0, 0x88, 0x10,
+ 0x16, 0xc8, 0x82, 0xb9, 0x06, 0x9f, 0x01, 0x94,
+ 0xf9, 0xe0, 0x2e, 0x86, 0x8a, 0xb1, 0x7f, 0x74,
+ 0x22, 0xce, 0xee, 0xa6, 0x66, 0xee, 0xe2, 0x1d,
+ 0x98, 0x1b, 0x46, 0x22, 0x7e, 0x89, 0x0c, 0xc4,
+ 0x91, 0xfb, 0xe4, 0xd7, 0x36, 0x2a, 0xa9, 0x53,
+ 0xe9, 0xaf, 0x6c, 0xc1, 0xdd, 0x69, 0x4f, 0xde,
+ 0xd8, 0xd0, 0x7f, 0xc9, 0xf4, 0x8f, 0x84, 0xfe,
+ 0x0f, 0x16, 0x36, 0x90, 0x09, 0xd6, 0x0f, 0xbc,
+ 0x85, 0xad, 0xe9, 0xc3, 0xa1, 0x8d, 0x14, 0x5c,
+ 0x40, 0x7d, 0x0f, 0x22, 0xfe, 0x5e, 0xaf, 0xd9,
+ 0x0f, 0xe5, 0x2e, 0xa6, 0x04, 0xda, 0x35, 0x90,
+ 0x7f, 0x9a, 0x1f, 0xb8, 0x34, 0x1c, 0xd0, 0xf5,
+ 0x5c, 0x29, 0xce, 0xbe, 0x57, 0xd8, 0x55, 0x15,
+ 0x2d, 0x4c, 0x3c, 0x16, 0x93, 0x96, 0x3c, 0xf3,
+ 0xa8, 0x2f, 0x09, 0xb3, 0x8b, 0xe3, 0xce, 0xf7,
+ 0x3e, 0x8e, 0xcf, 0x47, 0xe2, 0xf2, 0xad, 0x06,
+ 0x00, 0x9a, 0x3a, 0x55, 0xf5, 0x9e, 0xbf, 0x5a,
+ 0x2e, 0x5a, 0x6c, 0x2b, 0x8f, 0x33, 0x71, 0x2c,
+ 0x56, 0x43, 0xd1, 0x8b, 0xd2, 0x98, 0x14, 0xb7,
+ 0x5a, 0xdc, 0x8b, 0xbc, 0xfe, 0x50, 0x99, 0x84,
+ 0x48, 0x5f, 0xcd, 0xed, 0xce, 0x61, 0x6f, 0xa6,
+ 0x83, 0xa3, 0x34, 0xbe, 0xf2, 0x66, 0xf3, 0x09,
+ 0xf3, 0xd3, 0x97, 0xd4, 0xee, 0x66, 0x9a, 0x81,
+ 0x62, 0x84, 0x85, 0x7f, 0x79, 0x18, 0xd2, 0x82,
+ 0xd6, 0x96, 0x09, 0x61, 0x1e, 0x53, 0x97, 0x80,
+ 0x0a, 0x81, 0x4b, 0x93, 0xf0, 0x03, 0x65, 0x18,
+ 0x93, 0x5b, 0x60, 0x2f, 0xb5, 0xfe, 0x82, 0xaf,
+ 0x85, 0xb7, 0x79, 0x7c, 0xee, 0xad, 0xea, 0xfa,
+ 0x9b, 0xad, 0xca, 0x38, 0x21, 0x3d, 0x46, 0x8a,
+ 0x5b, 0xa7, 0x55, 0x3d, 0x88, 0x4a, 0x52, 0xdb,
+ 0xf2, 0x07, 0xed, 0xd6, 0x3c, 0x9f, 0x1b, 0x42,
+ 0xb4, 0x14, 0x12, 0xb7, 0x00, 0xfc, 0x6a, 0x79,
+ 0x61, 0x0b, 0x43, 0xaa, 0x44, 0x48, 0x30, 0x15,
+ 0x48, 0x76, 0x27, 0x32, 0x7a, 0x2e, 0x25, 0x6a,
+ 0x8c, 0x8c, 0x64, 0x67, 0x86, 0x54, 0x4a, 0x93,
+ 0x14, 0xfe, 0x81, 0xf5, 0xcf, 0x98, 0x92, 0xd3,
+ 0x92, 0xf5, 0x6a, 0x74, 0x28, 0x10, 0x6b, 0xd4,
+ 0x1d, 0x64, 0x7e, 0x05, 0x32, 0xba, 0xf7, 0x4c,
+ 0xe9, 0xa8, 0xa9, 0xc5, 0x35, 0x34, 0x26, 0x41,
+};
+
+/*
+ * IV method encblkno8, blkno 2.
+ */
+static const uint8_t aes_cbc_128_encblkno8_vec2_ctxt[SECSIZE] = {
+ 0x64, 0x7b, 0x62, 0x7a, 0xa6, 0xa9, 0xb3, 0x47,
+ 0xbc, 0x03, 0x14, 0x3d, 0x9b, 0x56, 0xfc, 0x13,
+ 0x08, 0x32, 0x81, 0xe3, 0x57, 0x3c, 0x0d, 0xbb,
+ 0x85, 0x44, 0x47, 0x12, 0xc4, 0x80, 0x35, 0x37,
+ 0xe1, 0xb4, 0x3f, 0x35, 0x98, 0x7c, 0xb0, 0x3b,
+ 0x85, 0xab, 0x3d, 0x0b, 0xd3, 0x6f, 0xf9, 0x92,
+ 0x00, 0x6b, 0x18, 0xe7, 0x31, 0x8b, 0x77, 0x4c,
+ 0xd0, 0x7b, 0x1d, 0xfc, 0x95, 0xe6, 0x02, 0x01,
+ 0x9c, 0x17, 0x4d, 0x9b, 0x3a, 0x1d, 0x12, 0x23,
+ 0xd4, 0x24, 0xf8, 0x47, 0x5e, 0x2d, 0xfd, 0xc8,
+ 0x74, 0x28, 0xb4, 0x3a, 0x99, 0x6b, 0xcc, 0xba,
+ 0xe5, 0x51, 0x0b, 0xab, 0x4d, 0x63, 0xfc, 0x6d,
+ 0x2d, 0xd9, 0x2b, 0x4f, 0xa4, 0x26, 0xc7, 0x8d,
+ 0x9d, 0x12, 0x7f, 0xc7, 0x6b, 0x15, 0x8b, 0x4a,
+ 0x41, 0xf8, 0x50, 0x32, 0x76, 0x10, 0xca, 0x8e,
+ 0xfe, 0x08, 0x7d, 0x9a, 0xb5, 0x1a, 0xdb, 0x10,
+ 0xb3, 0x6a, 0x5f, 0xd9, 0x0a, 0x5f, 0x31, 0x19,
+ 0x3e, 0xa9, 0xa1, 0x72, 0x1f, 0x6c, 0x97, 0x20,
+ 0xd4, 0xab, 0xb8, 0xad, 0xf7, 0x70, 0x12, 0xd0,
+ 0x8f, 0x70, 0x24, 0x58, 0x2e, 0x99, 0xcd, 0xd4,
+ 0xf4, 0xcd, 0xef, 0x93, 0xfb, 0x4f, 0x9a, 0x40,
+ 0x46, 0x92, 0x6b, 0xd0, 0x25, 0x24, 0xec, 0x4d,
+ 0x4c, 0x42, 0x50, 0x61, 0xb6, 0x21, 0xa6, 0x2e,
+ 0xc1, 0x42, 0x9e, 0x86, 0x9f, 0x57, 0x2a, 0x2c,
+ 0x82, 0xbd, 0xc2, 0x25, 0xb6, 0x9f, 0x2d, 0x9f,
+ 0xba, 0xe0, 0xa6, 0x06, 0x04, 0x08, 0xc5, 0x1d,
+ 0x8c, 0x0f, 0xbf, 0x21, 0x85, 0x6d, 0x61, 0x4d,
+ 0x93, 0xc0, 0xa2, 0x8b, 0xca, 0x07, 0xd0, 0x88,
+ 0x74, 0xf9, 0x42, 0x92, 0xd5, 0x0d, 0x0c, 0x34,
+ 0xa6, 0xa5, 0x86, 0x51, 0xcf, 0x40, 0x36, 0x66,
+ 0x35, 0x9f, 0xa8, 0x95, 0x0b, 0xfb, 0x0c, 0xe8,
+ 0xdc, 0x12, 0x78, 0x4c, 0x52, 0xf4, 0xfc, 0x4a,
+ 0x77, 0xdd, 0x77, 0x34, 0xf7, 0x35, 0x94, 0x7a,
+ 0x31, 0x16, 0x86, 0x44, 0x50, 0x30, 0x1c, 0x6d,
+ 0x9f, 0x66, 0x49, 0xb5, 0xe6, 0x71, 0x00, 0x83,
+ 0xd1, 0xa0, 0x01, 0xff, 0xc3, 0x27, 0xaa, 0x9a,
+ 0xdb, 0xad, 0x24, 0xdb, 0xbd, 0xde, 0xfd, 0xa6,
+ 0xaa, 0x87, 0x98, 0x98, 0xde, 0x90, 0xd5, 0x40,
+ 0x20, 0x8f, 0xe9, 0xdd, 0xa8, 0xec, 0xd3, 0x18,
+ 0x20, 0x85, 0x5e, 0xd5, 0xe7, 0x50, 0x58, 0x15,
+ 0x69, 0x03, 0xa5, 0xe8, 0xa9, 0x7a, 0x0f, 0xd1,
+ 0x7d, 0x22, 0x8a, 0xe0, 0xc6, 0x17, 0x33, 0x00,
+ 0x57, 0xcb, 0xf6, 0x8d, 0xf0, 0xc1, 0x7b, 0xb5,
+ 0x96, 0x0f, 0x08, 0x84, 0x5b, 0x7e, 0xa6, 0x1e,
+ 0xd8, 0x5e, 0x0c, 0xca, 0x30, 0x4b, 0xe0, 0x87,
+ 0x2f, 0xbc, 0x07, 0x83, 0x35, 0x76, 0x36, 0x17,
+ 0xcf, 0xdb, 0x27, 0x53, 0x43, 0xf5, 0x07, 0xd0,
+ 0x91, 0x83, 0xa1, 0xaa, 0x8d, 0xdb, 0x00, 0x2b,
+ 0xd1, 0x88, 0xe5, 0x59, 0x47, 0x17, 0xf0, 0xe8,
+ 0xce, 0x3b, 0xa0, 0x73, 0x1f, 0x22, 0x9b, 0x1b,
+ 0x59, 0x02, 0xe6, 0xaf, 0x3f, 0xdd, 0xfe, 0xba,
+ 0xc3, 0x6b, 0xe5, 0x82, 0x02, 0x92, 0x0c, 0x5e,
+ 0x5a, 0x87, 0x88, 0x91, 0x00, 0xb5, 0x30, 0x37,
+ 0xf5, 0xc6, 0xdf, 0x0a, 0x7f, 0x03, 0x1c, 0x1f,
+ 0x20, 0xf1, 0xd4, 0x5f, 0x94, 0xc3, 0x6f, 0x21,
+ 0x5e, 0xf2, 0x77, 0x5a, 0x42, 0xfd, 0xd3, 0xc4,
+ 0x31, 0xaf, 0xd6, 0x6c, 0x6c, 0xde, 0x8c, 0x50,
+ 0x01, 0x8f, 0x57, 0x90, 0x88, 0x43, 0xf9, 0x44,
+ 0x09, 0x4d, 0x27, 0x58, 0x9f, 0xae, 0x50, 0x28,
+ 0x12, 0x47, 0x20, 0x79, 0x2b, 0xe4, 0x02, 0x97,
+ 0xcd, 0xab, 0x53, 0x28, 0x8f, 0x8f, 0xe3, 0x3b,
+ 0xd6, 0xc9, 0xc8, 0xff, 0xbf, 0x18, 0x3b, 0x75,
+ 0xdb, 0xcf, 0x07, 0x8c, 0xfe, 0x58, 0xee, 0x75,
+ 0x01, 0x98, 0x98, 0xe4, 0x60, 0xfe, 0xe6, 0x7f,
+};
+
+/*
+ * IV method encblkno8, blkno 3.
+ */
+static const uint8_t aes_cbc_128_encblkno8_vec3_ctxt[SECSIZE] = {
+ 0x98, 0xae, 0x82, 0x1d, 0x76, 0x3a, 0xfe, 0x80,
+ 0x04, 0xa3, 0x43, 0xf0, 0x06, 0x45, 0x83, 0xb7,
+ 0xe2, 0xb5, 0x73, 0x46, 0x78, 0x01, 0x2f, 0xd6,
+ 0x0d, 0x49, 0x64, 0x4c, 0xeb, 0x8d, 0xdc, 0xa9,
+ 0xdc, 0xea, 0x22, 0x25, 0xd4, 0x8f, 0xba, 0x9f,
+ 0xd4, 0x7a, 0x3c, 0x9e, 0xd0, 0xd9, 0xcd, 0xa4,
+ 0x12, 0xdf, 0x8f, 0x50, 0x24, 0x18, 0xa2, 0x0b,
+ 0xd9, 0x7f, 0xda, 0x78, 0xd6, 0x11, 0xf3, 0x99,
+ 0xc4, 0xec, 0x95, 0xe2, 0x85, 0xe1, 0xa0, 0x0d,
+ 0x07, 0x22, 0x56, 0xaf, 0x2f, 0xf5, 0x7d, 0x63,
+ 0xf2, 0x90, 0x6c, 0x26, 0x4f, 0xa5, 0x47, 0xcd,
+ 0x66, 0x2d, 0x4c, 0x4d, 0x94, 0x6a, 0x3c, 0x98,
+ 0xe4, 0x5e, 0x3b, 0x42, 0x3a, 0x93, 0x02, 0xd0,
+ 0x90, 0xc7, 0xcd, 0x87, 0x0e, 0x84, 0x82, 0xf5,
+ 0x77, 0x7b, 0x29, 0xe4, 0xea, 0x5b, 0x60, 0x50,
+ 0xf7, 0x60, 0x8d, 0xf7, 0xd8, 0xd7, 0x7d, 0x99,
+ 0x8a, 0xdc, 0xe2, 0xb9, 0x40, 0xac, 0x4b, 0x9f,
+ 0x55, 0x30, 0xcb, 0x5a, 0x73, 0x64, 0xf2, 0xca,
+ 0x76, 0x88, 0xf7, 0x55, 0xb5, 0x33, 0xc0, 0x44,
+ 0xdf, 0x42, 0xee, 0xc9, 0xc5, 0x2a, 0x47, 0x18,
+ 0x8b, 0x74, 0xb9, 0x4f, 0x2c, 0xd8, 0x7a, 0xd1,
+ 0x12, 0x19, 0xf9, 0x21, 0x8d, 0x21, 0x7e, 0x2a,
+ 0xcf, 0xd5, 0xbb, 0x69, 0xaa, 0x20, 0x25, 0xe0,
+ 0xf5, 0x3b, 0x33, 0x77, 0x63, 0xb2, 0x05, 0x5c,
+ 0x10, 0x9c, 0x61, 0x48, 0xf5, 0xe6, 0x04, 0xd3,
+ 0xc8, 0xb4, 0xf6, 0xcf, 0x22, 0x1c, 0xf6, 0xbb,
+ 0x4b, 0xd7, 0x5d, 0x23, 0xfa, 0x0e, 0xc0, 0xac,
+ 0x27, 0x38, 0x95, 0xd0, 0xdd, 0x83, 0xad, 0x9e,
+ 0xcf, 0xde, 0x99, 0xe7, 0x04, 0xb7, 0x23, 0x9f,
+ 0x46, 0x91, 0xb8, 0xcb, 0x18, 0xd0, 0xc5, 0xf8,
+ 0xec, 0xfc, 0x33, 0xb7, 0xbe, 0x2d, 0xe9, 0x3a,
+ 0x7f, 0x83, 0x5e, 0x44, 0x0f, 0x12, 0x6d, 0x05,
+ 0xaa, 0xfb, 0x80, 0x7a, 0xf6, 0xdb, 0x25, 0xc6,
+ 0x51, 0xf3, 0x5d, 0xf3, 0xa9, 0xb8, 0x34, 0x88,
+ 0x88, 0x25, 0xd5, 0xa3, 0xe5, 0x8e, 0xb2, 0xc7,
+ 0xdc, 0xd5, 0x2e, 0x99, 0xb9, 0xc5, 0x1d, 0x91,
+ 0x49, 0x7b, 0xa3, 0x5e, 0x4b, 0xaf, 0x29, 0x7b,
+ 0x37, 0xb5, 0x39, 0x2c, 0xdf, 0x3b, 0xb1, 0xd8,
+ 0xba, 0x14, 0xc9, 0xd3, 0x6d, 0x67, 0x6a, 0x80,
+ 0x89, 0x6f, 0x11, 0xc8, 0xbc, 0xd6, 0xc7, 0xab,
+ 0x42, 0x1f, 0xf4, 0xa2, 0xc0, 0x9c, 0x2d, 0xca,
+ 0x5f, 0xe6, 0x65, 0xfa, 0x28, 0x49, 0x99, 0xa3,
+ 0x0b, 0x7b, 0x7d, 0x39, 0xaa, 0xa6, 0xd8, 0x0a,
+ 0xfd, 0xde, 0x31, 0x86, 0x15, 0x95, 0x1e, 0x5c,
+ 0x05, 0x4e, 0x3c, 0x18, 0xee, 0xa9, 0x56, 0x9c,
+ 0x3c, 0xc3, 0x67, 0x84, 0x57, 0x77, 0x8d, 0xff,
+ 0xea, 0x34, 0x3c, 0xf9, 0x58, 0xb8, 0xdc, 0x4e,
+ 0xa1, 0x92, 0x2d, 0x9a, 0x91, 0x61, 0x23, 0x6a,
+ 0xd9, 0xb7, 0x41, 0xc5, 0x0d, 0xb6, 0x57, 0x58,
+ 0x42, 0x39, 0x4a, 0x86, 0x7e, 0x9d, 0xeb, 0x7d,
+ 0xa8, 0x14, 0x1a, 0x5c, 0xa1, 0x54, 0x34, 0xb6,
+ 0xb6, 0xbc, 0x1f, 0xf5, 0xe2, 0xb5, 0xe4, 0xa8,
+ 0x42, 0xe3, 0x3d, 0x06, 0x6b, 0x50, 0xbb, 0xa1,
+ 0x6b, 0x63, 0xe5, 0x60, 0x28, 0x07, 0x49, 0x06,
+ 0x61, 0x0e, 0xa3, 0x6c, 0xc3, 0xc8, 0x3e, 0x5a,
+ 0x9c, 0xa5, 0xb3, 0x9b, 0x8d, 0x46, 0xb9, 0xf5,
+ 0x4a, 0x4d, 0xbe, 0xc0, 0xc1, 0x24, 0x92, 0x09,
+ 0x7c, 0x9a, 0x21, 0x2c, 0x08, 0x8a, 0x0d, 0xfc,
+ 0xff, 0xda, 0xdc, 0xf1, 0x45, 0x66, 0xf9, 0xcd,
+ 0x64, 0x7c, 0x2f, 0x0e, 0x95, 0x5e, 0xec, 0x92,
+ 0xd1, 0x03, 0x03, 0xa0, 0xcc, 0x73, 0x92, 0x15,
+ 0x74, 0x42, 0x54, 0x48, 0x77, 0xbe, 0x96, 0xfb,
+ 0x1f, 0x0c, 0x7a, 0x25, 0x67, 0x6b, 0x85, 0x71,
+ 0x06, 0x15, 0xd3, 0x11, 0xfe, 0xf7, 0xa9, 0xb1,
+};
+
+const struct testvec aes_cbc_128_8_vectors[] = {
+ {
+ .blkno = 0,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_128_encblkno8_vec0_ctxt,
+ },
+ {
+ .blkno = 1,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_128_encblkno8_vec1_ctxt,
+ },
+ {
+ .blkno = 2,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_128_encblkno8_vec2_ctxt,
+ },
+ {
+ .blkno = 3,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_128_encblkno8_vec3_ctxt,
+ },
+};
+
+/*
+ * IV method encblkno1, blkno 0.
+ */
+static const uint8_t aes_cbc_192_encblkno1_vec0_ctxt[SECSIZE] = {
+ 0x7c, 0xc4, 0xec, 0x89, 0x7c, 0x13, 0xac, 0x99,
+ 0x49, 0xa9, 0x96, 0xe7, 0xb1, 0x1a, 0xd6, 0xb0,
+ 0xeb, 0x89, 0x27, 0x0f, 0x8b, 0x1b, 0xab, 0x8e,
+ 0x2c, 0xd4, 0x00, 0x66, 0x12, 0x3a, 0x9a, 0x03,
+ 0xc4, 0x49, 0xa4, 0xf0, 0xc1, 0x90, 0xf9, 0x38,
+ 0xb2, 0x5c, 0xa5, 0x0d, 0x1b, 0x60, 0x94, 0xf6,
+ 0x31, 0x4a, 0x72, 0xdb, 0xfc, 0xe1, 0x3c, 0xd6,
+ 0x9d, 0x03, 0x07, 0x45, 0xdb, 0xad, 0xdb, 0xb3,
+ 0x86, 0xfa, 0xce, 0x2c, 0xeb, 0xa2, 0xac, 0x05,
+ 0xd9, 0x52, 0xb8, 0xae, 0xa9, 0x91, 0x86, 0x4b,
+ 0xbb, 0xf8, 0x03, 0xb0, 0x6c, 0x40, 0xcc, 0xbf,
+ 0xa3, 0x76, 0x60, 0xf7, 0x29, 0x03, 0xe6, 0x44,
+ 0xcc, 0x2a, 0xe7, 0x74, 0x8e, 0x62, 0xfe, 0x99,
+ 0x6a, 0x6d, 0x04, 0x1b, 0xe7, 0xf7, 0x9f, 0x13,
+ 0xa7, 0x1d, 0x93, 0x0e, 0x8f, 0xe0, 0x77, 0x9b,
+ 0xe3, 0x91, 0x67, 0x12, 0x33, 0x12, 0x42, 0x55,
+ 0x28, 0x04, 0x2d, 0x01, 0x2b, 0xd2, 0xda, 0xbe,
+ 0x7c, 0x83, 0xf2, 0x87, 0x71, 0x67, 0xaf, 0x6b,
+ 0x50, 0x6c, 0x8c, 0x9f, 0x48, 0xee, 0x90, 0x0c,
+ 0x9a, 0x9e, 0x40, 0xa8, 0x13, 0x2f, 0x58, 0xfb,
+ 0xdc, 0xb1, 0xda, 0xff, 0x06, 0x9c, 0xeb, 0x5e,
+ 0x0f, 0xaf, 0xc0, 0x9a, 0x47, 0x88, 0x25, 0xfd,
+ 0x19, 0x5e, 0xd4, 0xe0, 0x7f, 0xe0, 0x71, 0x7a,
+ 0x60, 0x54, 0xe7, 0x0d, 0xfe, 0x11, 0x9d, 0x77,
+ 0xbd, 0x9b, 0xd0, 0xf8, 0x77, 0xe4, 0x5b, 0x88,
+ 0x90, 0x12, 0x29, 0x88, 0xb6, 0xd9, 0x1e, 0x6c,
+ 0xbf, 0xa4, 0x18, 0xe1, 0xe0, 0x5e, 0xed, 0x48,
+ 0x9b, 0x05, 0x13, 0x37, 0x0f, 0x41, 0x54, 0xc8,
+ 0xe4, 0x25, 0x0e, 0x82, 0x5f, 0x81, 0xba, 0x5d,
+ 0x79, 0x8f, 0x9c, 0x17, 0x4b, 0x59, 0xf4, 0x5d,
+ 0xd6, 0x83, 0xfd, 0x44, 0xd0, 0xe1, 0x89, 0x09,
+ 0xf9, 0xe2, 0xb6, 0x9c, 0x1c, 0xbd, 0x13, 0xaa,
+ 0xa0, 0x43, 0xaa, 0xaf, 0x6d, 0x65, 0x73, 0xba,
+ 0x3a, 0x55, 0x69, 0x51, 0xb9, 0x52, 0x09, 0xaa,
+ 0x9f, 0x91, 0x3c, 0x65, 0xe2, 0x81, 0xdb, 0xe8,
+ 0x5a, 0xe3, 0x74, 0x11, 0x7b, 0xec, 0x2f, 0x18,
+ 0x8d, 0x4c, 0x8f, 0xf2, 0x06, 0x3d, 0x22, 0xc6,
+ 0x43, 0xef, 0x42, 0x7d, 0xe1, 0xe7, 0xde, 0x4c,
+ 0x58, 0xad, 0x40, 0xbb, 0x8b, 0xce, 0x1f, 0x57,
+ 0x8e, 0x6a, 0x27, 0x43, 0x46, 0x7f, 0x94, 0xe5,
+ 0x45, 0x67, 0x12, 0xc8, 0x99, 0x85, 0x08, 0x2a,
+ 0x37, 0x40, 0x0b, 0xb5, 0xd9, 0xa3, 0xf7, 0xc8,
+ 0x87, 0xb1, 0xe6, 0x87, 0x2f, 0x86, 0xd8, 0x9c,
+ 0x7b, 0xec, 0xcf, 0xa4, 0xe5, 0xd5, 0x50, 0x3f,
+ 0xdf, 0xc9, 0xb7, 0x29, 0x97, 0xd6, 0x33, 0xba,
+ 0xf0, 0x72, 0xf0, 0x76, 0x12, 0xd3, 0x99, 0x4f,
+ 0x1b, 0x36, 0xda, 0xa1, 0x83, 0xfe, 0xf5, 0x94,
+ 0x9e, 0x61, 0x82, 0x62, 0xe0, 0x08, 0x3a, 0xbd,
+ 0xba, 0x8b, 0x3d, 0xd6, 0xbd, 0x16, 0x5f, 0xd7,
+ 0x1d, 0x6c, 0x0e, 0x92, 0x89, 0x8c, 0x38, 0x62,
+ 0x80, 0xee, 0x7e, 0x63, 0x82, 0x88, 0x0b, 0xbf,
+ 0xdd, 0x9f, 0xbc, 0xba, 0xa7, 0x5a, 0xc6, 0x0d,
+ 0x87, 0x59, 0xbf, 0x0a, 0x85, 0x06, 0xa3, 0xb4,
+ 0x66, 0x63, 0xda, 0x12, 0x29, 0x5f, 0x2e, 0x4d,
+ 0x60, 0xfd, 0x85, 0x76, 0xaf, 0xf7, 0x87, 0xed,
+ 0x1f, 0x46, 0xc2, 0xd6, 0x6c, 0x98, 0x6b, 0x4b,
+ 0x60, 0x04, 0xed, 0x89, 0x3b, 0x85, 0x6c, 0xe9,
+ 0x46, 0xd9, 0xfa, 0x35, 0x61, 0xe8, 0x0c, 0x84,
+ 0x1b, 0x93, 0xc0, 0xfe, 0x5d, 0x29, 0x14, 0xe1,
+ 0x1c, 0x66, 0x73, 0xc8, 0x0b, 0x98, 0xff, 0x1a,
+ 0x78, 0x2b, 0x6a, 0x93, 0x7a, 0x29, 0xd8, 0x7b,
+ 0xb1, 0x39, 0xf0, 0xad, 0x93, 0x4d, 0x2d, 0xab,
+ 0x67, 0x3c, 0xa4, 0xa1, 0x08, 0x36, 0x0b, 0xe9,
+ 0x77, 0xd0, 0xe3, 0x45, 0x7d, 0x99, 0x75, 0xc3,
+};
+
+/*
+ * IV method encblkno1, blkno 1.
+ */
+static const uint8_t aes_cbc_192_encblkno1_vec1_ctxt[SECSIZE] = {
+ 0xe6, 0x41, 0x75, 0xd6, 0x80, 0xdf, 0x44, 0x37,
+ 0xa7, 0xa2, 0xb2, 0x29, 0x0d, 0xf0, 0x02, 0x78,
+ 0x92, 0xb2, 0x06, 0x5f, 0x86, 0xd3, 0x9c, 0xa3,
+ 0xd0, 0xc5, 0x08, 0x03, 0x6d, 0x41, 0x9d, 0x61,
+ 0xb4, 0xb9, 0xa1, 0x69, 0x6e, 0x3a, 0x78, 0xd7,
+ 0x04, 0x94, 0xf2, 0x53, 0xed, 0xd1, 0xf6, 0xd8,
+ 0x98, 0xe2, 0x49, 0x75, 0x15, 0x85, 0xe0, 0x78,
+ 0x5b, 0x28, 0x5e, 0xe6, 0xfa, 0x60, 0x3d, 0x4b,
+ 0x8c, 0xf1, 0x1a, 0xfd, 0x1f, 0xe8, 0xad, 0xb4,
+ 0xa1, 0xe7, 0xd3, 0x71, 0x16, 0xdf, 0xc6, 0x95,
+ 0xd4, 0x43, 0xaf, 0x92, 0xab, 0x74, 0x0f, 0x77,
+ 0x75, 0x4d, 0xd7, 0x13, 0x97, 0x18, 0xea, 0x43,
+ 0x92, 0x0d, 0x88, 0xc8, 0x41, 0xf7, 0x15, 0x34,
+ 0x0f, 0x63, 0xbf, 0x50, 0x18, 0xbe, 0x9d, 0x3b,
+ 0xfc, 0x17, 0x7d, 0x03, 0x39, 0xc2, 0x39, 0x28,
+ 0xb2, 0x23, 0x1c, 0x7f, 0x3f, 0x19, 0x6c, 0x2f,
+ 0x64, 0xbd, 0xc9, 0x7d, 0xbe, 0x98, 0xe0, 0x83,
+ 0xa4, 0x48, 0xfc, 0x89, 0xe7, 0xe0, 0x93, 0x93,
+ 0x7b, 0x15, 0x35, 0xaf, 0xf8, 0x00, 0x81, 0xcc,
+ 0x04, 0x80, 0x8b, 0x20, 0xc8, 0x6a, 0xb7, 0x5e,
+ 0x95, 0xce, 0x69, 0x50, 0x39, 0x88, 0x90, 0x41,
+ 0x3f, 0xa8, 0x62, 0x42, 0xf1, 0xa9, 0x56, 0xce,
+ 0x25, 0x53, 0x1d, 0x97, 0x5d, 0x3a, 0x4e, 0x6b,
+ 0x1f, 0xd6, 0xea, 0x20, 0x81, 0x6c, 0xe5, 0xa1,
+ 0x0d, 0x9a, 0xd9, 0x3c, 0xbb, 0xbc, 0xc1, 0x77,
+ 0xe2, 0xf4, 0x9c, 0x11, 0x3a, 0x2f, 0xd0, 0x77,
+ 0x10, 0xa6, 0x36, 0xd1, 0xbf, 0x3b, 0x50, 0x39,
+ 0x4b, 0x2c, 0x62, 0x06, 0x1a, 0xe4, 0x18, 0xc0,
+ 0x35, 0x7c, 0xc3, 0xd0, 0x22, 0xf8, 0xee, 0x19,
+ 0xa5, 0x3d, 0x69, 0xa9, 0x34, 0xe6, 0x29, 0xf9,
+ 0xf1, 0xff, 0x26, 0x7a, 0x66, 0x13, 0x1a, 0xa2,
+ 0xc6, 0xac, 0x84, 0xf6, 0x6b, 0x09, 0xbd, 0x32,
+ 0x6f, 0x26, 0x37, 0x7c, 0x7d, 0x74, 0xe4, 0xa0,
+ 0xeb, 0x85, 0x7a, 0xa1, 0x92, 0x19, 0x2e, 0x64,
+ 0x82, 0x7c, 0x89, 0x1b, 0x14, 0x92, 0xd1, 0xf4,
+ 0x1f, 0x29, 0x84, 0x04, 0x70, 0x09, 0x13, 0x4c,
+ 0x62, 0x9a, 0xb4, 0xf7, 0xc1, 0x7b, 0x83, 0xd1,
+ 0x2d, 0x1a, 0xbe, 0x83, 0x9b, 0x73, 0xba, 0x8d,
+ 0xbb, 0xb0, 0xf2, 0x5c, 0x72, 0x75, 0x01, 0x0b,
+ 0xa6, 0x43, 0x6b, 0x76, 0x56, 0x4e, 0x71, 0x1b,
+ 0xb2, 0x34, 0x1f, 0x70, 0x44, 0xe6, 0xfb, 0x67,
+ 0xd1, 0x4d, 0x63, 0xce, 0x17, 0x46, 0x9b, 0x11,
+ 0xda, 0x93, 0xf8, 0x03, 0x11, 0x8f, 0x90, 0xff,
+ 0x80, 0x85, 0x02, 0x1f, 0xb6, 0x6a, 0x28, 0x3f,
+ 0x01, 0xa8, 0x36, 0x2e, 0xc7, 0x42, 0xd4, 0x02,
+ 0x26, 0xea, 0xb5, 0x84, 0x6c, 0x9f, 0xa0, 0x4a,
+ 0x73, 0x49, 0xea, 0x91, 0x4d, 0x62, 0xf8, 0x23,
+ 0xe4, 0x3d, 0x91, 0xfb, 0x53, 0x2c, 0x8c, 0xa4,
+ 0xfe, 0x81, 0x05, 0x5d, 0x4b, 0x9a, 0x75, 0x29,
+ 0xf8, 0xbe, 0x3f, 0x05, 0xb4, 0x8f, 0xdc, 0xcc,
+ 0xfa, 0xcc, 0xd7, 0xb2, 0x06, 0x03, 0xd4, 0xf3,
+ 0x8e, 0x09, 0x09, 0x80, 0xf8, 0xc3, 0x3b, 0x66,
+ 0xe9, 0x9c, 0x5b, 0x16, 0xed, 0x2d, 0x35, 0x1c,
+ 0x99, 0x3b, 0x1f, 0x0e, 0x04, 0x30, 0x23, 0x3a,
+ 0x83, 0x0c, 0xec, 0x76, 0xf2, 0x5d, 0x13, 0x54,
+ 0x15, 0x62, 0x36, 0x26, 0x6b, 0x21, 0x62, 0xdd,
+ 0xb4, 0x1a, 0x57, 0x16, 0xfd, 0xa0, 0x9c, 0xfa,
+ 0x37, 0xb3, 0xda, 0xe0, 0x46, 0x91, 0xb3, 0x20,
+ 0xe7, 0xe2, 0xf3, 0x0e, 0x20, 0x3c, 0x98, 0x1b,
+ 0xe4, 0xc2, 0xd3, 0xa9, 0x97, 0xaf, 0x12, 0x69,
+ 0x23, 0x97, 0x62, 0x6e, 0xae, 0x54, 0x9c, 0x82,
+ 0x92, 0x50, 0x74, 0x07, 0x4a, 0xb1, 0xdc, 0xcf,
+ 0x53, 0x1d, 0xc8, 0x29, 0x1f, 0x6e, 0xf1, 0x13,
+ 0xec, 0xb6, 0x60, 0xb1, 0x4c, 0x9d, 0xd7, 0x77,
+};
+
+/*
+ * IV method encblkno1, blkno 2.
+ */
+static const uint8_t aes_cbc_192_encblkno1_vec2_ctxt[SECSIZE] = {
+ 0x33, 0xfd, 0xfa, 0x44, 0x64, 0x75, 0x22, 0x7e,
+ 0xe3, 0xb3, 0xa0, 0x75, 0x99, 0x96, 0xc0, 0xec,
+ 0x56, 0x06, 0x7d, 0x19, 0x0b, 0x66, 0x89, 0xe0,
+ 0x69, 0x1d, 0x93, 0x91, 0xd7, 0x0f, 0xf8, 0xf5,
+ 0x5a, 0x39, 0x30, 0xad, 0x64, 0x42, 0x06, 0xa3,
+ 0xce, 0x3f, 0x67, 0xd6, 0x6e, 0xcd, 0x3b, 0xf5,
+ 0x03, 0x2b, 0x07, 0x83, 0x18, 0x1a, 0x4f, 0x4c,
+ 0xe7, 0x6b, 0xe8, 0xf9, 0x19, 0xa5, 0x23, 0x8f,
+ 0x46, 0x35, 0x13, 0x7b, 0x61, 0x05, 0xfc, 0x7d,
+ 0x17, 0x39, 0x03, 0xa8, 0xec, 0x7a, 0xd2, 0x5f,
+ 0x91, 0xa7, 0x26, 0x07, 0x9d, 0xd7, 0x0c, 0xd7,
+ 0xd4, 0x8e, 0x37, 0xf3, 0x1a, 0x3c, 0x04, 0x83,
+ 0x04, 0x71, 0x06, 0xa6, 0x5f, 0x82, 0xe0, 0x6d,
+ 0x87, 0x5c, 0x7c, 0x03, 0x25, 0x03, 0x4b, 0x24,
+ 0x07, 0x40, 0xad, 0xe4, 0x1d, 0x1d, 0xcb, 0x34,
+ 0xc2, 0x53, 0x1d, 0x13, 0xc5, 0x87, 0xab, 0xa7,
+ 0x95, 0x11, 0x8b, 0xbb, 0xf0, 0xc3, 0x00, 0xeb,
+ 0xe5, 0xb0, 0x9e, 0x88, 0x8b, 0xad, 0xca, 0xcb,
+ 0x17, 0xf8, 0x92, 0x4d, 0x00, 0xb0, 0x08, 0x74,
+ 0x08, 0xb9, 0x8b, 0x95, 0x96, 0xd9, 0x36, 0x35,
+ 0x31, 0x92, 0x89, 0xf6, 0x35, 0x33, 0xfb, 0x18,
+ 0x5b, 0x84, 0xa1, 0xfe, 0xe1, 0x62, 0x04, 0x6f,
+ 0x3c, 0xc1, 0xd2, 0xc2, 0x10, 0xd7, 0x97, 0xba,
+ 0x29, 0x7c, 0xe3, 0x85, 0xee, 0x59, 0x90, 0xaf,
+ 0x7f, 0x6f, 0x97, 0x97, 0xa2, 0x41, 0x18, 0x7f,
+ 0x2f, 0x06, 0x15, 0xb2, 0x46, 0x82, 0x49, 0x39,
+ 0xd0, 0xfb, 0xa8, 0x48, 0x44, 0x28, 0x58, 0xff,
+ 0xd8, 0xf2, 0x65, 0xf9, 0x4f, 0x2c, 0xbe, 0xec,
+ 0xb6, 0xdf, 0x27, 0x1a, 0xf2, 0x05, 0x15, 0x5e,
+ 0xe3, 0x2a, 0x98, 0x29, 0x92, 0x4a, 0x1b, 0x5d,
+ 0x5c, 0x2c, 0x70, 0xf6, 0x41, 0xd4, 0xbe, 0x64,
+ 0xa1, 0xd9, 0x79, 0xf1, 0x11, 0x16, 0xda, 0xa2,
+ 0xaf, 0xdd, 0x4d, 0xa8, 0xed, 0xec, 0xbe, 0x7d,
+ 0x49, 0x6c, 0x30, 0xf2, 0xf5, 0x36, 0x3c, 0xae,
+ 0x4b, 0xa7, 0x77, 0xa3, 0xca, 0x22, 0xa5, 0xe2,
+ 0x4d, 0x44, 0xcb, 0x36, 0xd5, 0x3f, 0x20, 0x13,
+ 0xb6, 0xfb, 0xcd, 0x79, 0xd7, 0x42, 0xf9, 0x75,
+ 0x09, 0x45, 0x28, 0x9e, 0xf2, 0xbd, 0x15, 0x57,
+ 0xf8, 0x4b, 0xc0, 0xd3, 0xb3, 0xb8, 0xde, 0x55,
+ 0x9e, 0x11, 0x67, 0xab, 0xc5, 0x5d, 0x58, 0xdb,
+ 0x4d, 0x20, 0x34, 0x77, 0x33, 0x9c, 0x46, 0x76,
+ 0x9b, 0x1e, 0x0e, 0x6b, 0x4e, 0xd9, 0x63, 0x68,
+ 0x78, 0x5e, 0x7c, 0x52, 0xa2, 0x64, 0xa9, 0xfc,
+ 0x21, 0x35, 0x17, 0x93, 0x18, 0x9e, 0x10, 0xcf,
+ 0x95, 0x6b, 0xf0, 0x55, 0x46, 0xc3, 0x4b, 0xfc,
+ 0x86, 0x8b, 0x0d, 0x3b, 0x5c, 0x30, 0xcc, 0xf1,
+ 0x4c, 0x43, 0xf0, 0xd6, 0xf6, 0x3b, 0x0b, 0x68,
+ 0x6f, 0x21, 0xd1, 0x61, 0xda, 0x35, 0x92, 0x94,
+ 0xa5, 0x5d, 0x47, 0x39, 0x96, 0x50, 0x5f, 0xbd,
+ 0x57, 0x22, 0xd2, 0x65, 0x73, 0x05, 0x8f, 0x2b,
+ 0xf2, 0x96, 0x53, 0x6b, 0x8e, 0xd3, 0x1e, 0xe7,
+ 0x92, 0xd4, 0xea, 0x41, 0xee, 0x92, 0x4d, 0x10,
+ 0x9f, 0x68, 0xd8, 0xe9, 0xac, 0x1f, 0x38, 0x0b,
+ 0x12, 0xa4, 0x1c, 0xb2, 0x63, 0x2b, 0x87, 0x07,
+ 0xb8, 0x1e, 0x02, 0x2b, 0x4d, 0xad, 0x99, 0xdf,
+ 0xe3, 0x98, 0x69, 0x29, 0x11, 0xe3, 0x77, 0x45,
+ 0x9a, 0xe9, 0x6c, 0x47, 0x4e, 0xc0, 0x85, 0x15,
+ 0x68, 0x58, 0x41, 0x37, 0xab, 0x96, 0x11, 0x94,
+ 0x9e, 0xbb, 0xa8, 0x5d, 0x51, 0x05, 0x93, 0xdd,
+ 0x2e, 0xb8, 0xdf, 0xcf, 0x83, 0xbc, 0xf6, 0x53,
+ 0x95, 0x93, 0x27, 0xda, 0xa5, 0x20, 0x1b, 0x7d,
+ 0x1d, 0xd9, 0x0c, 0xde, 0xe5, 0x3f, 0xc8, 0x60,
+ 0x16, 0x32, 0x95, 0x24, 0xa7, 0x2b, 0x74, 0xf1,
+ 0x67, 0xf9, 0xf2, 0x49, 0xda, 0x12, 0x97, 0xdd,
+};
+
+/*
+ * IV method encblkno1, blkno 3.
+ */
+static const uint8_t aes_cbc_192_encblkno1_vec3_ctxt[SECSIZE] = {
+ 0xa5, 0x81, 0x86, 0x78, 0x4a, 0xd7, 0x5b, 0x83,
+ 0xcf, 0xbf, 0x7e, 0x3c, 0xd7, 0xcd, 0xaf, 0xfa,
+ 0x82, 0x18, 0xce, 0xbd, 0x8b, 0xe6, 0xd9, 0x39,
+ 0x22, 0x2d, 0x1e, 0x75, 0x65, 0xee, 0x61, 0xf2,
+ 0xc3, 0x8b, 0xf4, 0x40, 0x03, 0x73, 0x8a, 0x21,
+ 0x9f, 0xf3, 0xcc, 0x93, 0x08, 0x3d, 0xff, 0x8a,
+ 0xbc, 0x0f, 0x19, 0xa1, 0x9f, 0xc8, 0x73, 0xe8,
+ 0xa6, 0x14, 0x2e, 0x43, 0x19, 0x79, 0x61, 0x35,
+ 0x8d, 0x55, 0x06, 0xeb, 0x96, 0xe7, 0xf5, 0x4b,
+ 0x95, 0x5f, 0x9b, 0xb2, 0x18, 0x0d, 0x13, 0xc2,
+ 0x96, 0x79, 0x50, 0x78, 0x98, 0x50, 0x88, 0x2b,
+ 0xab, 0x05, 0x66, 0xa1, 0x3a, 0x25, 0x85, 0xe2,
+ 0xd0, 0xe2, 0xac, 0xb5, 0x26, 0xde, 0x95, 0x04,
+ 0x45, 0xe7, 0x22, 0x71, 0x02, 0xb3, 0x84, 0x4c,
+ 0xb5, 0xad, 0x64, 0x5c, 0x27, 0x5c, 0x71, 0xcd,
+ 0x0b, 0x62, 0x91, 0xd6, 0x84, 0x00, 0x62, 0x52,
+ 0x54, 0xbd, 0x22, 0xc8, 0x57, 0xa7, 0x41, 0xac,
+ 0xc7, 0xa8, 0x56, 0x6f, 0x1b, 0x7e, 0xce, 0x02,
+ 0x29, 0x3b, 0xc0, 0x5d, 0x8e, 0x11, 0xa9, 0x54,
+ 0xc2, 0xf2, 0xf0, 0x81, 0x6c, 0x9a, 0x24, 0x5b,
+ 0x81, 0x7d, 0xf3, 0x84, 0x93, 0xc6, 0x2a, 0xd4,
+ 0xd3, 0x1a, 0x2f, 0x97, 0x2e, 0x31, 0x8a, 0x62,
+ 0x43, 0xcb, 0xc7, 0x3d, 0x73, 0x8e, 0xd6, 0x86,
+ 0x17, 0x8f, 0x63, 0xd4, 0xb1, 0x50, 0x92, 0xce,
+ 0x90, 0x37, 0x91, 0xce, 0x37, 0x13, 0x8e, 0x61,
+ 0x21, 0xd8, 0x1a, 0xbf, 0x42, 0x65, 0x1d, 0x86,
+ 0x07, 0x04, 0x9b, 0xd1, 0xd3, 0x26, 0x6b, 0x7c,
+ 0xa1, 0x77, 0x54, 0x5b, 0x9f, 0x95, 0x62, 0x43,
+ 0xb3, 0x71, 0x1e, 0x4c, 0x32, 0xd1, 0x3e, 0xe8,
+ 0x60, 0x9c, 0x0c, 0x15, 0x55, 0xf0, 0x38, 0xb7,
+ 0x1e, 0x40, 0xe5, 0x26, 0x4e, 0x46, 0x49, 0x47,
+ 0x59, 0x3d, 0x49, 0x76, 0x28, 0xd3, 0xed, 0x03,
+ 0xdd, 0xf8, 0x1a, 0xf4, 0x1a, 0xfe, 0xe4, 0x03,
+ 0xb9, 0xa5, 0x8e, 0x7c, 0x91, 0x7a, 0xb2, 0x17,
+ 0x84, 0x97, 0x3f, 0x12, 0x68, 0xaa, 0xf5, 0x73,
+ 0xbc, 0x84, 0xdd, 0x03, 0x4a, 0xc4, 0xcd, 0xdb,
+ 0xb0, 0x8a, 0x3b, 0xac, 0xf1, 0xdd, 0x10, 0x20,
+ 0x69, 0xee, 0x94, 0xcd, 0x60, 0x3f, 0x01, 0xcf,
+ 0xf4, 0xff, 0xdb, 0x91, 0x8a, 0xf3, 0xb8, 0x44,
+ 0x62, 0xdc, 0xdc, 0xc8, 0x2b, 0xaf, 0x0d, 0x5e,
+ 0x1b, 0x58, 0x7f, 0x6b, 0x0d, 0xc4, 0xd4, 0x1c,
+ 0x89, 0x29, 0x60, 0x5d, 0xe9, 0x59, 0xbb, 0x19,
+ 0x03, 0x7c, 0x25, 0x63, 0xc6, 0x89, 0x6f, 0xe6,
+ 0xbe, 0xcd, 0xaa, 0xf2, 0xbf, 0x16, 0xcb, 0x47,
+ 0xc6, 0x74, 0xdd, 0x90, 0x41, 0x75, 0x7f, 0x26,
+ 0x7b, 0x5a, 0xb9, 0x11, 0xa0, 0xc7, 0x75, 0x60,
+ 0xc5, 0x54, 0x7d, 0xb0, 0xb4, 0xd0, 0x95, 0x01,
+ 0xff, 0x07, 0x49, 0x56, 0xfb, 0xec, 0xa9, 0x4c,
+ 0x68, 0x28, 0x41, 0x81, 0x80, 0x05, 0x88, 0x58,
+ 0xf5, 0xdc, 0x42, 0x99, 0xd8, 0xb7, 0x47, 0xd9,
+ 0xf7, 0x0e, 0x2c, 0x0f, 0x95, 0x04, 0xb3, 0xc8,
+ 0x8a, 0xe2, 0x21, 0x57, 0x8d, 0x64, 0x54, 0x40,
+ 0xf6, 0xd0, 0x3c, 0x97, 0xcf, 0x22, 0xce, 0xcd,
+ 0xbf, 0x05, 0x15, 0xaa, 0x89, 0xd9, 0x2b, 0x48,
+ 0xaf, 0x34, 0xe0, 0xf5, 0xe3, 0x58, 0x06, 0xd7,
+ 0x49, 0x00, 0x95, 0x3a, 0xb3, 0xc8, 0xcd, 0x2b,
+ 0x3e, 0xe8, 0x1b, 0x60, 0xe8, 0xea, 0xaf, 0x09,
+ 0xbb, 0xee, 0xce, 0xbc, 0xa0, 0x9b, 0x17, 0x90,
+ 0x42, 0x40, 0x18, 0x35, 0x2e, 0x17, 0xa0, 0x6e,
+ 0x43, 0xe7, 0xac, 0x89, 0x96, 0x3c, 0x16, 0xe0,
+ 0xdb, 0x09, 0x51, 0x4a, 0x45, 0x33, 0x63, 0xe9,
+ 0x4e, 0x3f, 0x32, 0x34, 0x36, 0x43, 0xd5, 0x0c,
+ 0x5a, 0x2e, 0x0e, 0x8b, 0x80, 0xb7, 0xf4, 0xe4,
+ 0x99, 0x9b, 0x05, 0xf5, 0xb2, 0xe4, 0x03, 0xe4,
+};
+
+const struct testvec aes_cbc_192_1_vectors[] = {
+ {
+ .blkno = 0,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_192_encblkno1_vec0_ctxt,
+ },
+ {
+ .blkno = 1,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_192_encblkno1_vec1_ctxt,
+ },
+ {
+ .blkno = 2,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_192_encblkno1_vec2_ctxt,
+ },
+ {
+ .blkno = 3,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_192_encblkno1_vec3_ctxt,
+ },
+};
+
+/*
+ * IV method encblkno8, blkno 0.
+ */
+static const uint8_t aes_cbc_192_encblkno8_vec0_ctxt[SECSIZE] = {
+ 0x87, 0x9c, 0x05, 0xd6, 0x25, 0xb9, 0xe0, 0xbe,
+ 0x78, 0x21, 0x85, 0x81, 0x8e, 0x2f, 0x13, 0x5e,
+ 0xf2, 0x73, 0x11, 0xfa, 0x73, 0x77, 0x93, 0x5e,
+ 0x71, 0x16, 0x98, 0x68, 0x6f, 0xe8, 0x22, 0x34,
+ 0xf5, 0x11, 0xfa, 0x61, 0xe6, 0x1a, 0xfb, 0x42,
+ 0xa7, 0xa3, 0x2e, 0x0d, 0xc1, 0x9d, 0x7d, 0xd9,
+ 0xfb, 0xbb, 0xc5, 0x08, 0x9d, 0xc2, 0xab, 0x5c,
+ 0xdf, 0x9b, 0x3c, 0x1a, 0xbd, 0x66, 0x5a, 0x91,
+ 0x1c, 0x00, 0x59, 0x2e, 0x92, 0xe9, 0x23, 0xf6,
+ 0x90, 0x3d, 0x5b, 0x72, 0x76, 0x78, 0xd9, 0xa2,
+ 0x48, 0x33, 0x29, 0xe2, 0xfd, 0x77, 0x14, 0xda,
+ 0x01, 0x92, 0x63, 0xdd, 0x8c, 0x1c, 0x2e, 0xf7,
+ 0x61, 0xfb, 0xc5, 0x76, 0xec, 0x7f, 0xef, 0xdc,
+ 0xbe, 0x2d, 0x3b, 0x69, 0x30, 0xb9, 0x08, 0x00,
+ 0xe8, 0x37, 0x09, 0xaa, 0x2a, 0x02, 0x80, 0x11,
+ 0x91, 0x16, 0x94, 0x7d, 0xb5, 0xdc, 0x9f, 0xb3,
+ 0xb0, 0x26, 0x72, 0x85, 0x93, 0x85, 0x19, 0x08,
+ 0x97, 0xef, 0x97, 0x57, 0xa8, 0x76, 0x0e, 0x85,
+ 0xb1, 0x1d, 0x79, 0xe3, 0x7a, 0xe8, 0x06, 0x3b,
+ 0xc4, 0x00, 0xbd, 0xaa, 0xd9, 0x17, 0x81, 0x37,
+ 0x12, 0x86, 0x52, 0xea, 0x04, 0xb2, 0x11, 0x0f,
+ 0x5a, 0x08, 0x68, 0xcb, 0x48, 0xca, 0x2f, 0xda,
+ 0xa3, 0x0a, 0x60, 0x57, 0xc7, 0x80, 0x36, 0x60,
+ 0x05, 0xce, 0xd5, 0x43, 0xc9, 0xbc, 0x6c, 0xe6,
+ 0x63, 0x38, 0x2e, 0x81, 0x90, 0x34, 0x11, 0x2c,
+ 0x84, 0x0c, 0x62, 0x68, 0xde, 0x17, 0x57, 0x43,
+ 0x19, 0xa5, 0x92, 0x9d, 0x91, 0x2b, 0xa2, 0x95,
+ 0x7c, 0x20, 0x72, 0xaa, 0x83, 0x24, 0x54, 0x94,
+ 0x10, 0x80, 0xd4, 0x3f, 0x58, 0xb9, 0x7b, 0x74,
+ 0x68, 0xd5, 0xfb, 0x3e, 0xdd, 0xb4, 0xdf, 0x65,
+ 0x72, 0x88, 0x45, 0x8a, 0xd0, 0x93, 0x6e, 0x99,
+ 0x84, 0xad, 0x39, 0x73, 0x16, 0x88, 0xdc, 0x89,
+ 0x33, 0x34, 0xd7, 0xd8, 0x97, 0xfb, 0x90, 0xd2,
+ 0xc5, 0x8e, 0x94, 0xc4, 0xf1, 0xfe, 0xbe, 0x23,
+ 0xf1, 0x3a, 0x10, 0x1c, 0x42, 0x6b, 0xf5, 0xee,
+ 0xe4, 0x78, 0x8a, 0x7e, 0x13, 0x02, 0x25, 0xcb,
+ 0xd1, 0x61, 0x1f, 0xab, 0x45, 0x1f, 0x90, 0x88,
+ 0x0f, 0x6b, 0xff, 0x61, 0xba, 0xf3, 0xac, 0x8e,
+ 0x13, 0xc2, 0xfb, 0xca, 0x41, 0xed, 0xfe, 0x6c,
+ 0xcb, 0xdf, 0x97, 0x60, 0x29, 0x8a, 0x72, 0x8d,
+ 0x7d, 0xad, 0x6e, 0xe9, 0x7b, 0xc4, 0x92, 0x14,
+ 0x5e, 0x33, 0x27, 0xe2, 0xda, 0x2f, 0x95, 0x5f,
+ 0x40, 0x27, 0xeb, 0xdb, 0x0d, 0x1e, 0xc5, 0xd4,
+ 0x43, 0x50, 0x1a, 0x62, 0x82, 0xbe, 0x24, 0x7f,
+ 0xb7, 0x46, 0xa8, 0x70, 0x10, 0x33, 0xb6, 0x3f,
+ 0xbf, 0xa8, 0xa8, 0x85, 0xab, 0x1d, 0xb4, 0x3f,
+ 0x84, 0x06, 0x91, 0xd6, 0x18, 0x3d, 0xeb, 0x8b,
+ 0x3f, 0x9b, 0x37, 0x9e, 0x2e, 0xd2, 0xec, 0xe5,
+ 0x2d, 0xf0, 0x3f, 0x45, 0xd5, 0x9d, 0xb9, 0x28,
+ 0x89, 0xe4, 0x0c, 0xa9, 0x38, 0xca, 0x22, 0x56,
+ 0x53, 0xdf, 0x49, 0xba, 0x5d, 0x99, 0xd6, 0x4b,
+ 0x1d, 0x0d, 0x6d, 0xee, 0x7c, 0xf2, 0x6f, 0x50,
+ 0x04, 0xf1, 0xf8, 0x49, 0xd1, 0x2f, 0x50, 0x3e,
+ 0xf1, 0x08, 0x49, 0x17, 0x08, 0xd2, 0xac, 0x5d,
+ 0x58, 0xe7, 0x27, 0xe6, 0x59, 0x02, 0x9f, 0x1c,
+ 0x40, 0xff, 0x6c, 0x67, 0xae, 0x49, 0x1a, 0x2a,
+ 0xab, 0xd9, 0x63, 0x25, 0x2d, 0x9b, 0xd8, 0x1a,
+ 0x41, 0xa6, 0xea, 0x72, 0xfd, 0x56, 0xa1, 0x57,
+ 0x59, 0xdd, 0xf5, 0xa3, 0xb2, 0x2f, 0x64, 0xb1,
+ 0xc5, 0xfe, 0x8d, 0x9b, 0x93, 0xd1, 0x51, 0x77,
+ 0x13, 0x50, 0x74, 0x30, 0x28, 0xe4, 0x7a, 0x06,
+ 0x69, 0xd4, 0xa8, 0x0a, 0xae, 0x02, 0x4a, 0x61,
+ 0x24, 0xc2, 0xcd, 0xc8, 0xd3, 0x12, 0x2e, 0xac,
+ 0x9a, 0x0c, 0x24, 0x06, 0xb8, 0x1e, 0x3d, 0x29,
+};
+
+/*
+ * IV method encblkno8, blkno 1.
+ */
+static const uint8_t aes_cbc_192_encblkno8_vec1_ctxt[SECSIZE] = {
+ 0x1e, 0x3b, 0x66, 0x76, 0xd9, 0x9e, 0xf7, 0x82,
+ 0x17, 0x76, 0x69, 0x4d, 0x64, 0x63, 0xf1, 0x01,
+ 0x81, 0x8a, 0xa4, 0x97, 0x05, 0x42, 0xdb, 0x8c,
+ 0x27, 0xc8, 0xfd, 0x08, 0x21, 0x17, 0x87, 0xa9,
+ 0x0c, 0x86, 0x2d, 0xda, 0x17, 0xd5, 0x5d, 0x67,
+ 0x12, 0x93, 0x8d, 0x34, 0x5a, 0xfc, 0x2a, 0x49,
+ 0x1a, 0x1a, 0x77, 0x20, 0xfb, 0x1d, 0x5d, 0xd8,
+ 0x99, 0xb0, 0x8f, 0x1c, 0x13, 0x4d, 0x28, 0x6d,
+ 0x2d, 0x79, 0xa9, 0x8e, 0x04, 0x0c, 0x5a, 0xd5,
+ 0x52, 0x09, 0x15, 0x4a, 0xfb, 0x7a, 0xf8, 0xdc,
+ 0x3b, 0x77, 0xaf, 0xe0, 0x80, 0x6b, 0xac, 0x5f,
+ 0xc0, 0x0f, 0x0f, 0x29, 0xf5, 0xcc, 0xbc, 0x85,
+ 0x77, 0xe7, 0x9f, 0x59, 0x23, 0x83, 0x67, 0x74,
+ 0x3b, 0x1c, 0x0f, 0x75, 0xd8, 0x58, 0xa2, 0xce,
+ 0x8c, 0x3a, 0x80, 0xd7, 0xff, 0xa1, 0x83, 0xa3,
+ 0xe0, 0xad, 0x18, 0x7a, 0xc5, 0x28, 0x28, 0x71,
+ 0x46, 0xb5, 0x13, 0x76, 0x4d, 0x67, 0x37, 0x38,
+ 0x3f, 0x9e, 0xa6, 0x8b, 0xc2, 0xaf, 0x83, 0x7d,
+ 0x8b, 0x82, 0xd0, 0xe2, 0xec, 0x13, 0xce, 0x2b,
+ 0x1e, 0x13, 0xe7, 0xb6, 0xfa, 0x9e, 0xa2, 0x32,
+ 0xb7, 0xdc, 0xe5, 0xb5, 0x35, 0xa3, 0xb4, 0x84,
+ 0x57, 0x05, 0x2d, 0x3e, 0xb0, 0x0a, 0x52, 0x61,
+ 0x00, 0xe4, 0x84, 0xab, 0xf4, 0x98, 0xe4, 0xe6,
+ 0xcd, 0xb1, 0xd4, 0x40, 0x31, 0x5f, 0x8f, 0x73,
+ 0x16, 0x6e, 0xc0, 0x3d, 0x07, 0x5d, 0x6b, 0x91,
+ 0x70, 0x71, 0x8a, 0x4b, 0xfe, 0xeb, 0xbe, 0x04,
+ 0x5d, 0x75, 0x0a, 0x74, 0x52, 0x1e, 0xd3, 0x94,
+ 0xc5, 0xcd, 0xc1, 0xd6, 0x12, 0x6a, 0x58, 0x52,
+ 0x6e, 0x45, 0x1f, 0x49, 0x09, 0x4c, 0x32, 0xf3,
+ 0x3d, 0x3d, 0x73, 0x15, 0xa3, 0xa5, 0x2f, 0xf2,
+ 0x02, 0x10, 0x1e, 0xaf, 0xf5, 0xb4, 0x78, 0x48,
+ 0x8a, 0x6c, 0x58, 0x71, 0x77, 0x91, 0x95, 0x57,
+ 0x79, 0xbf, 0x1f, 0x3e, 0xb3, 0xf8, 0xc4, 0x33,
+ 0x07, 0x5d, 0x96, 0x41, 0x76, 0xb1, 0xe1, 0xe0,
+ 0xa9, 0x97, 0x14, 0x99, 0x1d, 0xaa, 0x91, 0xbb,
+ 0xdf, 0x89, 0xf1, 0x0d, 0xd0, 0x52, 0xf9, 0xa7,
+ 0x4c, 0x82, 0xc0, 0xeb, 0xb7, 0xaf, 0x7b, 0x4b,
+ 0x5a, 0x2a, 0x7a, 0x4e, 0xb2, 0x69, 0x87, 0x28,
+ 0x84, 0xf7, 0x76, 0x56, 0xee, 0xf8, 0x37, 0x35,
+ 0xc9, 0xbc, 0x08, 0x8b, 0xfe, 0x1e, 0x54, 0xb3,
+ 0x01, 0xa7, 0x0f, 0x20, 0x70, 0xac, 0xa6, 0x6b,
+ 0x9f, 0x98, 0xfe, 0xdb, 0x3e, 0x4f, 0x9f, 0xfc,
+ 0x95, 0x37, 0xf4, 0x90, 0x61, 0x62, 0x60, 0xeb,
+ 0x7a, 0x4a, 0x56, 0xae, 0x49, 0xcc, 0x92, 0xff,
+ 0xd3, 0x06, 0xc6, 0x62, 0x4c, 0x05, 0x28, 0xa7,
+ 0x3f, 0xe9, 0xee, 0x70, 0x6f, 0xd2, 0x80, 0x41,
+ 0x4d, 0xa0, 0xbc, 0x00, 0xaf, 0x30, 0xe4, 0x34,
+ 0x61, 0xda, 0xb4, 0xff, 0x2a, 0x85, 0x8b, 0x1a,
+ 0xbf, 0xb5, 0xe4, 0x7f, 0x27, 0xee, 0xf3, 0x25,
+ 0xe6, 0x52, 0x2a, 0x83, 0xbe, 0xe4, 0x64, 0xc3,
+ 0x67, 0x0c, 0x9e, 0x0f, 0xba, 0xb4, 0x67, 0xd1,
+ 0x1b, 0x4a, 0xb0, 0xb2, 0xb4, 0xf2, 0x8a, 0x1b,
+ 0x21, 0x34, 0x3c, 0x97, 0x5a, 0xdb, 0x92, 0x8b,
+ 0x2d, 0xe9, 0x94, 0x4e, 0x11, 0xfb, 0xd4, 0x2e,
+ 0xc2, 0xed, 0xf9, 0x75, 0xfd, 0x1a, 0xef, 0x3b,
+ 0x98, 0x5d, 0xa9, 0x75, 0xd5, 0x14, 0x0a, 0xe3,
+ 0xda, 0x07, 0xa6, 0x20, 0x7b, 0x49, 0x47, 0x87,
+ 0xff, 0xf0, 0xe8, 0x7e, 0xcf, 0xc4, 0x2c, 0x02,
+ 0xdd, 0x53, 0xe9, 0x79, 0xc7, 0x6d, 0x16, 0x9f,
+ 0x2b, 0xd7, 0x1a, 0x36, 0x25, 0x5c, 0xba, 0x5c,
+ 0xdb, 0x44, 0x88, 0x99, 0x32, 0x2e, 0xb6, 0x3f,
+ 0xb4, 0xdd, 0x15, 0xeb, 0xec, 0x2a, 0x9e, 0xc5,
+ 0x37, 0x30, 0x2a, 0xd5, 0xc4, 0x2a, 0x9b, 0x40,
+ 0x97, 0x83, 0x94, 0xe7, 0x79, 0x79, 0x63, 0x4b,
+};
+
+/*
+ * IV method encblkno8, blkno 2.
+ */
+static const uint8_t aes_cbc_192_encblkno8_vec2_ctxt[SECSIZE] = {
+ 0x34, 0x07, 0x20, 0x14, 0x64, 0x0b, 0xa2, 0x2c,
+ 0xed, 0xba, 0x46, 0x24, 0xa0, 0xe6, 0x99, 0x8a,
+ 0x20, 0x75, 0x5f, 0x9f, 0x2a, 0x10, 0xa6, 0x1c,
+ 0x52, 0x60, 0x18, 0x67, 0xd6, 0x0d, 0x90, 0x4e,
+ 0xbc, 0x25, 0x5f, 0x81, 0xb4, 0x10, 0xdb, 0xd9,
+ 0xaf, 0x36, 0x84, 0x5c, 0x20, 0x25, 0x25, 0xbf,
+ 0x0d, 0xfa, 0xc5, 0x75, 0x2b, 0xec, 0xf2, 0xa6,
+ 0x69, 0x5c, 0xfe, 0xee, 0x21, 0xd8, 0x87, 0xdf,
+ 0xe3, 0x83, 0xeb, 0xb3, 0x3f, 0x5b, 0xda, 0x37,
+ 0x11, 0x05, 0xf7, 0xd8, 0xe0, 0x94, 0x08, 0x2b,
+ 0x75, 0x6b, 0xf3, 0x40, 0x53, 0x85, 0xde, 0x7a,
+ 0x64, 0xb1, 0x0e, 0x5f, 0x01, 0xb5, 0xfb, 0x74,
+ 0x48, 0x9a, 0xd4, 0x41, 0x33, 0x70, 0x9b, 0x08,
+ 0x7e, 0x34, 0x60, 0xfc, 0xfa, 0xe6, 0x2c, 0xec,
+ 0x0e, 0xb7, 0x1a, 0xf1, 0x49, 0x48, 0x0c, 0xd4,
+ 0xd7, 0xbc, 0x60, 0x28, 0xdb, 0x57, 0xa4, 0x29,
+ 0x55, 0x2d, 0x92, 0xa6, 0xca, 0x9a, 0xaf, 0x4d,
+ 0x7f, 0xb8, 0x29, 0x9f, 0x50, 0x98, 0x21, 0x94,
+ 0x7a, 0x94, 0x44, 0x3d, 0xd1, 0xcf, 0xf4, 0x6f,
+ 0xad, 0xb4, 0x58, 0x66, 0x74, 0x01, 0x2c, 0x5b,
+ 0x8f, 0x1b, 0xa6, 0x09, 0xd0, 0x3f, 0x79, 0xc9,
+ 0x4f, 0x3b, 0x37, 0x0d, 0xb8, 0x07, 0xb0, 0x61,
+ 0xbc, 0x5a, 0x40, 0x3a, 0x10, 0x3c, 0x12, 0xe6,
+ 0x04, 0xc7, 0xd1, 0xe1, 0x18, 0x6f, 0xde, 0x72,
+ 0xf5, 0xcf, 0x24, 0x58, 0x76, 0xe1, 0xcd, 0x62,
+ 0x90, 0xc3, 0x16, 0xcc, 0x3f, 0xda, 0xd6, 0x6b,
+ 0x6a, 0xcc, 0x61, 0x76, 0xc1, 0xaf, 0xdc, 0x53,
+ 0xef, 0x06, 0x23, 0x22, 0x93, 0x11, 0x59, 0xf5,
+ 0x7f, 0x46, 0xac, 0xb8, 0x6c, 0x3b, 0x36, 0x69,
+ 0xc5, 0x14, 0x0a, 0x51, 0xa1, 0x5f, 0xb9, 0xc7,
+ 0x37, 0xe3, 0xd9, 0xaf, 0x8c, 0xe9, 0x49, 0xd4,
+ 0xf9, 0xf9, 0x5e, 0x1f, 0x5f, 0x7c, 0x07, 0xb5,
+ 0x1c, 0x9e, 0xbd, 0x10, 0x75, 0xc3, 0x93, 0x48,
+ 0xdc, 0x32, 0xe7, 0x55, 0x90, 0x48, 0x42, 0xc0,
+ 0x73, 0x20, 0x40, 0x17, 0xbb, 0x71, 0x30, 0xfe,
+ 0xd1, 0x84, 0xe9, 0x7d, 0x92, 0xd4, 0xff, 0xbe,
+ 0x3e, 0xd9, 0x41, 0xfb, 0x41, 0x43, 0x2b, 0x9f,
+ 0x04, 0x7b, 0xe7, 0x81, 0xbb, 0x2a, 0xd6, 0x7b,
+ 0x96, 0x72, 0x29, 0x30, 0x52, 0x5c, 0xea, 0xcc,
+ 0x4c, 0x77, 0xed, 0x5a, 0xd9, 0xab, 0x51, 0x90,
+ 0x21, 0x3b, 0x5b, 0x26, 0xeb, 0x14, 0xd5, 0xea,
+ 0x01, 0xb0, 0x7c, 0xbd, 0xa6, 0x3d, 0x7f, 0x42,
+ 0xd7, 0x7e, 0xf1, 0x6c, 0x71, 0x7d, 0xc0, 0x25,
+ 0x61, 0xe9, 0x66, 0xe1, 0xf2, 0x67, 0x99, 0xa1,
+ 0xe7, 0x3a, 0x6f, 0x88, 0x1e, 0x8b, 0x76, 0xed,
+ 0x50, 0x2c, 0x4e, 0xac, 0x73, 0xd7, 0xf2, 0x85,
+ 0x8f, 0xcc, 0xb1, 0x4f, 0x6c, 0x9a, 0xf7, 0x45,
+ 0x28, 0x4f, 0xfc, 0x3f, 0xf1, 0x80, 0xc3, 0xf3,
+ 0xce, 0x5e, 0xfc, 0x56, 0xd9, 0x45, 0xdd, 0x81,
+ 0xe3, 0x48, 0x22, 0xc9, 0xb8, 0x13, 0xc1, 0x48,
+ 0x6c, 0x95, 0x97, 0xc0, 0x91, 0x37, 0xf5, 0x8a,
+ 0x11, 0x3b, 0xab, 0xce, 0x7a, 0xb0, 0xb4, 0x4c,
+ 0xba, 0xc0, 0x91, 0x7f, 0x3c, 0x27, 0xe9, 0xc0,
+ 0x58, 0x92, 0x70, 0x67, 0xf4, 0x80, 0x40, 0x92,
+ 0x51, 0x80, 0x8e, 0x9d, 0x2d, 0x87, 0x89, 0x8e,
+ 0xe7, 0xd1, 0xb5, 0xc5, 0x4f, 0xd0, 0x86, 0x31,
+ 0x7f, 0x90, 0x77, 0x05, 0x35, 0xfe, 0xa7, 0xcb,
+ 0x9d, 0x94, 0xf3, 0xf8, 0xbb, 0x4f, 0xe1, 0xb3,
+ 0x48, 0x57, 0xbf, 0xd1, 0x77, 0xe8, 0x72, 0x31,
+ 0x4d, 0x2f, 0xe8, 0xa0, 0xf4, 0x7c, 0x25, 0x9c,
+ 0xcd, 0xa5, 0x7e, 0xd3, 0x30, 0xda, 0x46, 0xf5,
+ 0x48, 0x9e, 0x39, 0x34, 0x94, 0xd6, 0x24, 0x10,
+ 0xfc, 0x74, 0x2b, 0x6d, 0xcc, 0x00, 0x76, 0x3e,
+ 0x3b, 0x85, 0xfa, 0xef, 0x87, 0x70, 0x53, 0x4e,
+};
+
+/*
+ * IV method encblkno8, blkno 3.
+ */
+static const uint8_t aes_cbc_192_encblkno8_vec3_ctxt[SECSIZE] = {
+ 0xfe, 0xad, 0xf3, 0x4a, 0x9d, 0x64, 0x4e, 0x5d,
+ 0xaf, 0xa8, 0x44, 0x7e, 0xc9, 0x75, 0xe8, 0xd0,
+ 0x87, 0x73, 0x66, 0x4c, 0x77, 0x00, 0xfb, 0x7b,
+ 0x04, 0xe7, 0xd8, 0x82, 0x75, 0xe3, 0xa5, 0xbc,
+ 0xf3, 0x80, 0xae, 0x7c, 0xc9, 0x75, 0x9a, 0xc1,
+ 0x73, 0x49, 0x69, 0xf6, 0xa0, 0x49, 0x6e, 0x77,
+ 0x5f, 0x9b, 0x95, 0x9b, 0x9f, 0x41, 0x54, 0x57,
+ 0x0e, 0x3c, 0xe5, 0x2c, 0xbb, 0xbf, 0xd5, 0x76,
+ 0xf6, 0xb6, 0x05, 0xaa, 0x20, 0x5b, 0xdb, 0xcb,
+ 0x81, 0xad, 0x0c, 0x8a, 0x68, 0x94, 0x7d, 0x88,
+ 0xdc, 0x15, 0x6c, 0x89, 0x97, 0x53, 0x30, 0x96,
+ 0x4a, 0x54, 0xf9, 0x88, 0x00, 0xf7, 0x3b, 0x99,
+ 0xfc, 0x82, 0xe3, 0x48, 0xd2, 0x16, 0x2b, 0xba,
+ 0xd4, 0xba, 0x24, 0xd0, 0xd1, 0xb0, 0x8e, 0xcd,
+ 0x77, 0xdc, 0x01, 0xdf, 0xb2, 0x20, 0xc5, 0xa7,
+ 0x48, 0x2a, 0xcf, 0x56, 0xc8, 0x63, 0x6e, 0xc9,
+ 0xa8, 0xa4, 0xc2, 0x9c, 0x66, 0x25, 0x50, 0x77,
+ 0x08, 0x51, 0x92, 0xce, 0x3c, 0xaf, 0xff, 0xee,
+ 0x3e, 0x6d, 0x61, 0x37, 0xcd, 0x85, 0x67, 0x9c,
+ 0xe0, 0x7e, 0xa6, 0x17, 0x7b, 0x5f, 0x6a, 0xe2,
+ 0x4e, 0x76, 0xca, 0x95, 0x88, 0xdf, 0xad, 0x78,
+ 0x91, 0xfa, 0x9e, 0x71, 0x3e, 0xfd, 0x10, 0x78,
+ 0x32, 0x2b, 0x75, 0xbc, 0x3a, 0x06, 0x55, 0x8b,
+ 0x9b, 0xfb, 0x9c, 0x4b, 0xa1, 0x7d, 0x35, 0x3d,
+ 0x63, 0x80, 0x30, 0x61, 0xe0, 0x2d, 0x8a, 0x28,
+ 0xb4, 0x2d, 0x48, 0x9d, 0x27, 0x1a, 0x28, 0x86,
+ 0xfc, 0xfa, 0x93, 0xcf, 0x3e, 0x9c, 0x41, 0xc8,
+ 0xc5, 0x5e, 0x88, 0x22, 0xb8, 0xaf, 0x1d, 0x92,
+ 0xc5, 0x91, 0x1b, 0x1e, 0x95, 0x62, 0xbb, 0x80,
+ 0x0c, 0xae, 0x2a, 0xb3, 0x55, 0x77, 0x86, 0x39,
+ 0xa6, 0xed, 0xc1, 0xd2, 0xc4, 0x95, 0x7e, 0xd4,
+ 0xbe, 0xf3, 0x1b, 0xbc, 0x5e, 0x92, 0x0d, 0x9c,
+ 0x38, 0xb1, 0xb9, 0xd3, 0xf6, 0x3f, 0x97, 0xf9,
+ 0x48, 0x08, 0x2b, 0xa6, 0x98, 0x50, 0xc9, 0x84,
+ 0xec, 0x54, 0xe0, 0x1a, 0x65, 0x76, 0xf2, 0xbe,
+ 0x62, 0xb9, 0x40, 0x3a, 0xb1, 0xef, 0xa0, 0x51,
+ 0xab, 0x3a, 0xfa, 0xaf, 0x33, 0x32, 0xa5, 0x0c,
+ 0xc7, 0x9a, 0x9c, 0x5c, 0xa7, 0x8e, 0xc6, 0x4e,
+ 0x61, 0xe3, 0x83, 0xa1, 0xd4, 0x2c, 0xb2, 0x2c,
+ 0x46, 0x5a, 0xbf, 0x96, 0xeb, 0xda, 0x45, 0x2d,
+ 0x25, 0x37, 0x69, 0x1a, 0x6b, 0xd6, 0xbc, 0xe1,
+ 0x28, 0x65, 0xf9, 0xfc, 0xa7, 0xda, 0xf8, 0x79,
+ 0x87, 0x18, 0x99, 0x01, 0x74, 0x5a, 0x42, 0x79,
+ 0x8e, 0xe4, 0x23, 0x1a, 0x6c, 0xda, 0x93, 0x0f,
+ 0x19, 0xf0, 0xff, 0x0e, 0x25, 0x45, 0x1e, 0xbb,
+ 0x17, 0xca, 0x87, 0x6a, 0x9e, 0xd0, 0xd3, 0xd5,
+ 0x22, 0x5f, 0xce, 0x92, 0xeb, 0x82, 0x8e, 0x3e,
+ 0x4e, 0x99, 0x44, 0xa2, 0x9e, 0x78, 0x53, 0x89,
+ 0x4e, 0x45, 0x51, 0x41, 0x28, 0x91, 0xdb, 0x7e,
+ 0x8f, 0xac, 0xc2, 0xee, 0x09, 0xcb, 0xed, 0x04,
+ 0x7b, 0x37, 0xa1, 0x1d, 0x9c, 0x90, 0x19, 0xb1,
+ 0xdd, 0xc3, 0x22, 0xc8, 0x70, 0x07, 0x26, 0xce,
+ 0x4a, 0xc4, 0xde, 0xee, 0x87, 0xf3, 0x62, 0x69,
+ 0xed, 0xb2, 0x2d, 0x10, 0xc4, 0xfa, 0x86, 0x2e,
+ 0xd1, 0xb8, 0x58, 0xa3, 0xa4, 0x0b, 0x30, 0x87,
+ 0x23, 0x62, 0xed, 0xf3, 0x7b, 0x80, 0x7e, 0x4f,
+ 0xc2, 0xb3, 0xe8, 0xba, 0x25, 0x3e, 0xd3, 0x12,
+ 0x7e, 0x27, 0xd5, 0x72, 0x3b, 0x02, 0xf4, 0xfd,
+ 0x2f, 0x8b, 0xc2, 0x5f, 0x44, 0x40, 0x31, 0x88,
+ 0x73, 0x81, 0xa3, 0xcc, 0xc4, 0x78, 0x2b, 0xfc,
+ 0x41, 0x2e, 0xb2, 0xd0, 0xb4, 0x00, 0x29, 0xc1,
+ 0x46, 0xdf, 0xc1, 0xbd, 0x15, 0x59, 0xa3, 0x6a,
+ 0xc8, 0x2f, 0x29, 0x28, 0x12, 0x9b, 0x1e, 0xea,
+ 0x4e, 0xa9, 0x80, 0xa1, 0xb8, 0x89, 0x21, 0x3b,
+};
+
+const struct testvec aes_cbc_192_8_vectors[] = {
+ {
+ .blkno = 0,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_192_encblkno8_vec0_ctxt,
+ },
+ {
+ .blkno = 1,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_192_encblkno8_vec1_ctxt,
+ },
+ {
+ .blkno = 2,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_192_encblkno8_vec2_ctxt,
+ },
+ {
+ .blkno = 3,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_192_encblkno8_vec3_ctxt,
+ },
+};
+
+/*
+ * IV method encblkno1, blkno 0.
+ */
+static const uint8_t aes_cbc_256_encblkno1_vec0_ctxt[SECSIZE] = {
+ 0x1a, 0xa4, 0xe3, 0x09, 0x23, 0x2e, 0x91, 0x1b,
+ 0xa8, 0x3e, 0xda, 0x92, 0xb3, 0x22, 0xd2, 0xe8,
+ 0x8b, 0xed, 0x6c, 0xa7, 0x78, 0xe6, 0x32, 0x25,
+ 0xc4, 0x88, 0xd5, 0xb7, 0x6e, 0xef, 0xbf, 0x37,
+ 0x00, 0xd9, 0xb2, 0x55, 0x10, 0x4f, 0x7d, 0x84,
+ 0x3a, 0xae, 0xd2, 0xc6, 0x48, 0xdd, 0x3c, 0xd5,
+ 0x9b, 0xa7, 0xf8, 0xc2, 0xda, 0x6d, 0x14, 0xa2,
+ 0xdc, 0x54, 0x12, 0x8f, 0x1c, 0x22, 0x98, 0x6a,
+ 0xc0, 0x5f, 0x47, 0xa7, 0x78, 0xec, 0x79, 0x5d,
+ 0x04, 0xed, 0x5e, 0x20, 0x33, 0x53, 0x66, 0x40,
+ 0x83, 0x94, 0x5b, 0x34, 0x05, 0x25, 0x2e, 0x17,
+ 0xba, 0x23, 0x60, 0xb1, 0xd0, 0x27, 0xf0, 0x24,
+ 0xd2, 0x0b, 0xd3, 0xea, 0xa7, 0x13, 0x1e, 0xf9,
+ 0x56, 0xe1, 0xd4, 0xa2, 0x89, 0x5a, 0xaa, 0x42,
+ 0xa9, 0xd7, 0x85, 0x64, 0x9e, 0x44, 0x71, 0xa2,
+ 0xf9, 0xc3, 0xf4, 0x81, 0xbd, 0xa0, 0x40, 0xed,
+ 0x33, 0xeb, 0x09, 0x0f, 0x7f, 0x78, 0xe4, 0xd5,
+ 0x7b, 0x61, 0x42, 0xee, 0x65, 0x25, 0xcc, 0xba,
+ 0xc6, 0x99, 0x29, 0x25, 0x71, 0x9a, 0xf0, 0x0e,
+ 0x98, 0x3f, 0x12, 0xf2, 0xf9, 0x4d, 0x00, 0x3c,
+ 0xbe, 0x9f, 0x2b, 0x83, 0x1e, 0x5b, 0xab, 0x80,
+ 0x4c, 0x81, 0x82, 0x29, 0xbb, 0xeb, 0xc0, 0x89,
+ 0x07, 0x43, 0xdd, 0x69, 0xd3, 0x02, 0x6c, 0x1c,
+ 0x4b, 0xab, 0x44, 0x42, 0x6c, 0x25, 0xfc, 0xf5,
+ 0x73, 0xaa, 0x60, 0x48, 0xbc, 0xd2, 0x1c, 0x77,
+ 0x8b, 0x64, 0x3e, 0x5f, 0x24, 0xae, 0x14, 0x65,
+ 0xea, 0x18, 0xb1, 0xab, 0xbc, 0x3d, 0xa3, 0xb9,
+ 0xfc, 0xcc, 0x0f, 0x8d, 0x8e, 0x13, 0x0f, 0x4d,
+ 0x4e, 0xeb, 0x90, 0x9b, 0x1e, 0xbf, 0x2a, 0xc7,
+ 0xac, 0x5b, 0x11, 0xeb, 0x67, 0xf2, 0x9d, 0xef,
+ 0xf3, 0x66, 0x9e, 0x81, 0x9f, 0x24, 0x4d, 0xcd,
+ 0x4f, 0x31, 0xce, 0xc9, 0xa4, 0x2c, 0xd7, 0x58,
+ 0x7c, 0x2e, 0x88, 0xa2, 0xec, 0x4c, 0x02, 0x29,
+ 0x00, 0xbd, 0x14, 0x0f, 0xaa, 0xd8, 0xc3, 0x02,
+ 0x64, 0xdc, 0xa0, 0x15, 0xc8, 0xf6, 0x17, 0x8b,
+ 0x9c, 0xb3, 0xf2, 0x27, 0xc1, 0x3f, 0x60, 0x94,
+ 0x33, 0x10, 0x89, 0x49, 0x5f, 0xd2, 0x0e, 0xfe,
+ 0x9e, 0x99, 0x68, 0x95, 0xe4, 0x12, 0xfc, 0xe3,
+ 0x7f, 0xc4, 0xb1, 0x88, 0x4f, 0x66, 0xcd, 0x24,
+ 0x89, 0x09, 0xbb, 0x01, 0xf6, 0x9a, 0xe4, 0x41,
+ 0xee, 0x83, 0xd2, 0x28, 0xf5, 0x28, 0x49, 0x13,
+ 0x78, 0xfb, 0xb2, 0x0d, 0x5c, 0x97, 0xf4, 0x9c,
+ 0xe0, 0xdf, 0xef, 0x84, 0x36, 0x7d, 0xe5, 0x45,
+ 0xe0, 0xf8, 0xce, 0x82, 0x39, 0xc4, 0x54, 0x69,
+ 0xf1, 0x62, 0x7d, 0x1a, 0xf6, 0x6c, 0x20, 0x86,
+ 0x72, 0x4b, 0xf9, 0x3d, 0x87, 0x68, 0xec, 0x74,
+ 0x67, 0xee, 0xbd, 0xb8, 0xc6, 0x12, 0x91, 0x0f,
+ 0xf6, 0xd9, 0x4f, 0x34, 0x96, 0xa9, 0xe7, 0x52,
+ 0x7b, 0xe0, 0x08, 0x57, 0x0a, 0x8b, 0x09, 0xcb,
+ 0xd3, 0x3e, 0x4e, 0x64, 0xca, 0x38, 0x50, 0x07,
+ 0x0e, 0x7b, 0x95, 0x69, 0x1b, 0x82, 0xba, 0x50,
+ 0x93, 0x4f, 0x9a, 0x8e, 0x11, 0x9b, 0x64, 0xf5,
+ 0x6a, 0xd4, 0x81, 0xf0, 0x1f, 0xb8, 0x85, 0x90,
+ 0x9c, 0x79, 0xde, 0xcb, 0x50, 0xba, 0xa9, 0x56,
+ 0x66, 0xd1, 0x1e, 0x78, 0xa8, 0x6a, 0xd5, 0xa5,
+ 0x83, 0x73, 0xe2, 0x88, 0xf2, 0x04, 0x33, 0x61,
+ 0xdf, 0x89, 0xd5, 0x3d, 0x03, 0x4e, 0x94, 0xb0,
+ 0x0f, 0x8d, 0x4d, 0xb4, 0x09, 0xb2, 0xf1, 0xb0,
+ 0xe7, 0xfe, 0xb0, 0x18, 0xe2, 0xfc, 0x92, 0xeb,
+ 0x2d, 0x7d, 0x56, 0x29, 0xbd, 0x34, 0x20, 0x7c,
+ 0xb6, 0xe7, 0x7b, 0xd7, 0x95, 0xa5, 0x0d, 0x10,
+ 0xbc, 0x7d, 0x9d, 0xd9, 0xbe, 0xc7, 0x23, 0x44,
+ 0x37, 0xb3, 0x98, 0x36, 0x33, 0x1a, 0x11, 0xfe,
+ 0x41, 0xea, 0x59, 0x48, 0x75, 0x34, 0xf6, 0xc4,
+};
+
+/*
+ * IV method encblkno1, blkno 1.
+ */
+static const uint8_t aes_cbc_256_encblkno1_vec1_ctxt[SECSIZE] = {
+ 0x58, 0xfc, 0x1e, 0x48, 0x66, 0x7d, 0x91, 0xc7,
+ 0x56, 0xa3, 0x41, 0x89, 0xe8, 0x1e, 0x02, 0x77,
+ 0x93, 0x38, 0x12, 0x99, 0x06, 0x0d, 0xf3, 0x6d,
+ 0x2a, 0x5d, 0x3d, 0x7b, 0x4e, 0x05, 0x4f, 0x8f,
+ 0xe3, 0x86, 0x76, 0xfe, 0x11, 0x9d, 0xde, 0xd4,
+ 0x83, 0xd9, 0x47, 0x8d, 0x51, 0xdf, 0x4a, 0x24,
+ 0x2d, 0x11, 0xf0, 0xbd, 0xde, 0x17, 0x7e, 0x52,
+ 0x20, 0xc7, 0x17, 0x88, 0x2e, 0xa4, 0xd5, 0xa0,
+ 0x1e, 0xbc, 0x61, 0x15, 0x1e, 0x52, 0xa1, 0x8b,
+ 0xe9, 0xe4, 0x1f, 0x81, 0x49, 0x64, 0x17, 0xd4,
+ 0xef, 0xb6, 0x40, 0x05, 0x2f, 0x36, 0xf7, 0x39,
+ 0x03, 0x05, 0x80, 0xff, 0xf2, 0x1a, 0x15, 0xf1,
+ 0xfc, 0xaf, 0x71, 0x51, 0x73, 0xc5, 0x9e, 0x2f,
+ 0xd1, 0x7a, 0x2d, 0xd7, 0xed, 0x90, 0x11, 0xd2,
+ 0x80, 0x49, 0x46, 0x9f, 0x13, 0xa7, 0x32, 0x33,
+ 0x24, 0x39, 0x59, 0xf1, 0xed, 0x64, 0x75, 0x61,
+ 0xc3, 0x14, 0x68, 0x48, 0xf7, 0xc7, 0xbd, 0xe0,
+ 0x21, 0x59, 0x91, 0x07, 0x70, 0x83, 0x8f, 0xfc,
+ 0x59, 0x72, 0xca, 0xdd, 0x60, 0xa0, 0xbb, 0xb1,
+ 0x2f, 0xb8, 0x98, 0x8d, 0xf2, 0x4d, 0x3a, 0x19,
+ 0xbc, 0x6b, 0x37, 0xad, 0xd2, 0xb5, 0x7d, 0x1c,
+ 0x4a, 0x7b, 0x58, 0x76, 0x2e, 0xf5, 0x6b, 0xaf,
+ 0x4c, 0x92, 0x00, 0x8a, 0xb4, 0xa3, 0x86, 0x66,
+ 0x07, 0xc7, 0xfc, 0x57, 0x3c, 0x73, 0xf4, 0x8b,
+ 0xef, 0xb6, 0xae, 0x01, 0xfb, 0x88, 0x13, 0x04,
+ 0xa8, 0xc7, 0xec, 0xc4, 0xe0, 0x67, 0x3a, 0xfb,
+ 0x67, 0xce, 0x83, 0x9b, 0x8e, 0x66, 0xff, 0xa6,
+ 0x17, 0x1b, 0x66, 0x27, 0xdf, 0x2a, 0xfe, 0xf3,
+ 0x9a, 0xba, 0x59, 0xce, 0x28, 0xd4, 0xd2, 0x40,
+ 0x78, 0xb6, 0xe9, 0x7d, 0x8b, 0xcc, 0x47, 0x5c,
+ 0xf6, 0x5d, 0xc2, 0x5d, 0xe0, 0xa7, 0x61, 0x8b,
+ 0xe6, 0x7d, 0x38, 0xb6, 0xea, 0xfb, 0x13, 0x31,
+ 0x33, 0x2a, 0xb5, 0x45, 0x7b, 0xf6, 0x9f, 0x29,
+ 0x06, 0x2d, 0xd8, 0xab, 0x36, 0x27, 0xe4, 0x6c,
+ 0xf1, 0xab, 0xcd, 0xb9, 0x08, 0x0f, 0x4b, 0x8f,
+ 0x22, 0xea, 0xe4, 0x5d, 0x22, 0x05, 0x2e, 0xd4,
+ 0xd7, 0xff, 0x58, 0x50, 0x38, 0x17, 0x6f, 0x80,
+ 0x61, 0x98, 0xdc, 0xd4, 0x9f, 0x8f, 0xeb, 0x13,
+ 0xd3, 0x86, 0xe9, 0xa9, 0xe7, 0x07, 0x6f, 0x4f,
+ 0x54, 0x9e, 0x37, 0x3d, 0xbc, 0x82, 0x5f, 0x4f,
+ 0xd5, 0x0c, 0x21, 0xaa, 0x91, 0xcb, 0x06, 0x9a,
+ 0xaf, 0x57, 0x14, 0xfb, 0x57, 0xd8, 0x63, 0x58,
+ 0x0a, 0x03, 0x12, 0x0e, 0xd3, 0x37, 0x0b, 0xbf,
+ 0x67, 0xb7, 0x9d, 0xb7, 0x6b, 0x38, 0xeb, 0x17,
+ 0xd8, 0xb9, 0x5a, 0x37, 0x9f, 0x98, 0xa6, 0xca,
+ 0x7e, 0x95, 0xa7, 0x27, 0xc4, 0xd3, 0x15, 0x00,
+ 0x7b, 0x5e, 0x05, 0xc0, 0xc1, 0xb0, 0xe0, 0x13,
+ 0x7d, 0x91, 0xed, 0x2b, 0x99, 0x74, 0x1c, 0x16,
+ 0x45, 0x55, 0x21, 0xbc, 0x7c, 0x52, 0x87, 0x0f,
+ 0xb9, 0xbf, 0x71, 0x7c, 0x3a, 0x81, 0x72, 0x97,
+ 0xf8, 0x86, 0x61, 0x20, 0x17, 0xd8, 0xc8, 0xe0,
+ 0xfc, 0x42, 0x0f, 0x5b, 0xd6, 0x7e, 0x99, 0x81,
+ 0x5c, 0x2e, 0x2e, 0x3e, 0xe8, 0xce, 0x12, 0xcf,
+ 0x2c, 0xe6, 0x7a, 0x00, 0x5d, 0x36, 0x00, 0x92,
+ 0x60, 0xc5, 0xc0, 0xfd, 0xe0, 0xa3, 0xb9, 0x3e,
+ 0x92, 0xf8, 0x8f, 0xe2, 0x0f, 0xe5, 0xb4, 0x6a,
+ 0xd6, 0x5b, 0xa4, 0x5d, 0xf9, 0xef, 0x7e, 0xae,
+ 0xdd, 0xd0, 0x5d, 0x40, 0xfe, 0xa7, 0xed, 0xda,
+ 0xa9, 0x48, 0x1d, 0x6f, 0xc2, 0xd3, 0x35, 0x65,
+ 0xd8, 0x67, 0xc2, 0x9d, 0xed, 0xf7, 0x9f, 0x7b,
+ 0x7c, 0xd4, 0x03, 0xe0, 0xa6, 0xf9, 0x3c, 0xd0,
+ 0x21, 0x98, 0x60, 0xa6, 0x59, 0x86, 0xbd, 0x40,
+ 0x17, 0x47, 0x82, 0xb9, 0xe1, 0x11, 0x8d, 0x4b,
+ 0xcd, 0x1f, 0x54, 0x96, 0x17, 0x42, 0x22, 0x44,
+};
+
+/*
+ * IV method encblkno1, blkno 2.
+ */
+static const uint8_t aes_cbc_256_encblkno1_vec2_ctxt[SECSIZE] = {
+ 0x1d, 0x65, 0xb2, 0x4e, 0xfa, 0x3f, 0xdb, 0xab,
+ 0x34, 0x9d, 0x37, 0x03, 0x17, 0x44, 0xed, 0x5b,
+ 0xf7, 0x1b, 0x6b, 0xc0, 0x5c, 0xfe, 0x5b, 0xcd,
+ 0xf0, 0xaf, 0x26, 0x82, 0x97, 0x12, 0xb8, 0x4f,
+ 0x76, 0x3d, 0x07, 0xd8, 0x29, 0x56, 0x3c, 0xbd,
+ 0x0e, 0xac, 0xd1, 0x8f, 0x53, 0x1a, 0x8f, 0xcd,
+ 0x04, 0x5b, 0x49, 0xe0, 0xf0, 0xea, 0xc9, 0x8a,
+ 0x08, 0x3d, 0x1f, 0x2d, 0x8c, 0xec, 0xb8, 0xea,
+ 0xe9, 0x24, 0xd1, 0x93, 0xd7, 0x9a, 0x0f, 0xd7,
+ 0x0f, 0x6b, 0xa0, 0x08, 0x58, 0x81, 0x68, 0x2f,
+ 0xde, 0x36, 0xb5, 0x87, 0xd9, 0xcd, 0x82, 0x13,
+ 0x36, 0x16, 0x6a, 0x9a, 0x02, 0xca, 0xda, 0x6f,
+ 0x51, 0x87, 0x75, 0x47, 0x89, 0xa4, 0x10, 0x60,
+ 0xfb, 0x1a, 0x74, 0x55, 0x6d, 0x18, 0x8d, 0x42,
+ 0x74, 0x2d, 0x12, 0x56, 0xc0, 0xcd, 0xa2, 0x57,
+ 0x53, 0x31, 0x8c, 0x7a, 0x8b, 0xa8, 0x6d, 0x89,
+ 0x81, 0xaf, 0x9c, 0xd9, 0x56, 0xe6, 0xdc, 0xe7,
+ 0x84, 0x0f, 0x81, 0x56, 0x1a, 0xc8, 0x5d, 0xa3,
+ 0xe0, 0x93, 0xea, 0x62, 0x7d, 0xa4, 0x5a, 0x58,
+ 0x8f, 0x05, 0x85, 0x34, 0x0c, 0x74, 0x8e, 0xe7,
+ 0xb4, 0x47, 0x93, 0x61, 0xbf, 0x61, 0x0a, 0xa2,
+ 0x37, 0xcd, 0x82, 0x9d, 0x55, 0x9e, 0x32, 0x9e,
+ 0x30, 0xce, 0x61, 0x89, 0xed, 0x25, 0x9e, 0x7c,
+ 0x2a, 0xcd, 0x39, 0x45, 0x56, 0xbb, 0x1a, 0xe8,
+ 0xb0, 0x75, 0x8f, 0xa1, 0x59, 0x09, 0xf8, 0x7a,
+ 0xbd, 0x4f, 0x69, 0x8b, 0xe2, 0xf3, 0xbe, 0x9b,
+ 0xea, 0x5f, 0x2c, 0x1e, 0x84, 0x69, 0xb2, 0xfa,
+ 0xaf, 0x1d, 0xc8, 0xcf, 0x76, 0x91, 0xd0, 0x7a,
+ 0xc9, 0xd1, 0x3d, 0xa5, 0xae, 0xae, 0xd7, 0x23,
+ 0xbb, 0xb3, 0x5e, 0x8a, 0x10, 0xc6, 0xbe, 0xa6,
+ 0x79, 0x69, 0x40, 0x83, 0x81, 0xe6, 0xb1, 0xa3,
+ 0x7e, 0x57, 0x44, 0x66, 0xc9, 0x2e, 0x84, 0xdd,
+ 0x00, 0xb4, 0x93, 0xae, 0x8f, 0x23, 0x12, 0xd6,
+ 0x54, 0x56, 0xc3, 0x51, 0xe5, 0xf7, 0x69, 0x47,
+ 0x00, 0x97, 0x71, 0x29, 0xcb, 0xcf, 0xeb, 0xd9,
+ 0xaf, 0xc0, 0x2f, 0x5c, 0xd7, 0x3e, 0xe4, 0x07,
+ 0xc9, 0x65, 0x2e, 0x8c, 0xf4, 0x54, 0xce, 0x8b,
+ 0xc7, 0x0c, 0xb4, 0x74, 0x56, 0x79, 0xa6, 0x40,
+ 0x4a, 0x58, 0xfd, 0x3f, 0x7b, 0x4c, 0xe9, 0xdb,
+ 0x33, 0x85, 0x6f, 0xf7, 0x5a, 0x9f, 0x6f, 0xc4,
+ 0x60, 0xad, 0x1b, 0xe2, 0xf5, 0xeb, 0x42, 0x7d,
+ 0xa4, 0x43, 0x8d, 0x40, 0xfa, 0x53, 0xcc, 0xf0,
+ 0x5f, 0x90, 0x0d, 0x04, 0x51, 0xb1, 0x48, 0xc7,
+ 0x90, 0x65, 0xb2, 0xef, 0xca, 0xc5, 0x9a, 0xec,
+ 0xde, 0x84, 0x21, 0x22, 0xeb, 0x97, 0xdd, 0xa2,
+ 0x9d, 0x71, 0xb1, 0xe0, 0x86, 0x58, 0xc3, 0x57,
+ 0xd5, 0x5a, 0x6f, 0xdc, 0xe5, 0xcc, 0x64, 0xc7,
+ 0x80, 0x2a, 0xef, 0x90, 0x91, 0x96, 0xb4, 0xeb,
+ 0xda, 0x3b, 0x7b, 0xbc, 0x14, 0x60, 0x52, 0xe5,
+ 0xe5, 0xc8, 0x6a, 0x99, 0x46, 0x9d, 0x00, 0x77,
+ 0x3b, 0x60, 0x75, 0x04, 0x06, 0x4a, 0x5a, 0x64,
+ 0x6f, 0x2f, 0x58, 0x77, 0x27, 0x9a, 0xc5, 0x90,
+ 0x37, 0xa7, 0xf3, 0x89, 0x72, 0x47, 0x4e, 0x08,
+ 0xa5, 0x79, 0x11, 0x2f, 0x22, 0x5a, 0xbb, 0xcf,
+ 0x76, 0xb9, 0x28, 0xc8, 0xc4, 0x5a, 0xe5, 0x90,
+ 0xf7, 0x02, 0xe4, 0xf9, 0x0c, 0x4c, 0x9a, 0xb1,
+ 0xa7, 0x99, 0x34, 0xd4, 0x77, 0x66, 0xff, 0x3c,
+ 0x50, 0x9a, 0xff, 0x13, 0x49, 0xd6, 0x5a, 0xf6,
+ 0x17, 0x6f, 0xca, 0x1a, 0xef, 0x0a, 0x2d, 0xf1,
+ 0xdf, 0xd0, 0xa5, 0x6f, 0xa6, 0x22, 0x3c, 0x1f,
+ 0xcf, 0xe7, 0xec, 0x23, 0x39, 0x6e, 0xc0, 0x37,
+ 0x31, 0x84, 0xff, 0xe2, 0x5a, 0xd6, 0x88, 0x74,
+ 0x15, 0x15, 0x46, 0x21, 0x00, 0xe4, 0x13, 0x9a,
+ 0xfa, 0xb2, 0x49, 0x7e, 0x79, 0xfb, 0x8a, 0x2a,
+};
+
+/*
+ * IV method encblkno1, blkno 3.
+ */
+static const uint8_t aes_cbc_256_encblkno1_vec3_ctxt[SECSIZE] = {
+ 0xc1, 0x4a, 0x3c, 0x90, 0xba, 0xd4, 0x9c, 0xe7,
+ 0xf2, 0x5b, 0x3a, 0xc4, 0xce, 0x4a, 0x26, 0x4a,
+ 0x9c, 0x3f, 0xe5, 0x7a, 0x15, 0xbb, 0xbd, 0x3e,
+ 0xc6, 0x49, 0x47, 0x04, 0x4e, 0x8b, 0x73, 0xa6,
+ 0x02, 0x3a, 0xc1, 0xa3, 0xfa, 0x1a, 0xd0, 0x03,
+ 0xf7, 0x26, 0x9f, 0xad, 0x06, 0x8f, 0x86, 0xdc,
+ 0xb8, 0x73, 0x87, 0xa2, 0x82, 0xc6, 0x80, 0xe1,
+ 0xac, 0x3d, 0x16, 0x4c, 0xc3, 0x7c, 0x86, 0x01,
+ 0xa5, 0x7a, 0x1c, 0x4b, 0x56, 0x68, 0xf6, 0x06,
+ 0x99, 0x32, 0x42, 0x40, 0xf1, 0xb7, 0x44, 0x4b,
+ 0xd1, 0xdb, 0xad, 0x4e, 0xa6, 0xc2, 0x5f, 0xee,
+ 0x21, 0x1d, 0x58, 0xc6, 0xd5, 0x02, 0xef, 0xb2,
+ 0x38, 0xef, 0x29, 0x25, 0xfd, 0x28, 0x8a, 0x5b,
+ 0x8b, 0x36, 0x1a, 0xd6, 0x68, 0xf8, 0x77, 0xed,
+ 0xba, 0xb3, 0xa5, 0x6f, 0x76, 0x5e, 0xb5, 0xd4,
+ 0xc3, 0xb8, 0xf9, 0x67, 0x7a, 0x18, 0x43, 0xb6,
+ 0x65, 0x07, 0x48, 0x1d, 0x56, 0x20, 0x11, 0xe1,
+ 0x62, 0x6b, 0x70, 0xc9, 0x18, 0xa9, 0xa7, 0x36,
+ 0xbf, 0x31, 0x74, 0xe3, 0x33, 0x02, 0x96, 0x7a,
+ 0xf5, 0xd9, 0x8d, 0x05, 0x2b, 0xfd, 0x85, 0x4f,
+ 0x03, 0x0f, 0xe1, 0xfb, 0x1a, 0x57, 0xaf, 0xdc,
+ 0xff, 0xff, 0x5a, 0x96, 0x27, 0xca, 0xf3, 0x0c,
+ 0xd8, 0x39, 0x3e, 0xbe, 0x41, 0x5a, 0x21, 0x95,
+ 0x66, 0xe0, 0x69, 0x14, 0x2b, 0x18, 0xf2, 0x9b,
+ 0xf4, 0x22, 0xdf, 0xa9, 0xe4, 0x7d, 0x32, 0x5d,
+ 0x98, 0xa0, 0xe0, 0xe1, 0xe1, 0xbe, 0xae, 0x58,
+ 0x63, 0xbe, 0x4b, 0x97, 0x83, 0xaa, 0x67, 0xd3,
+ 0x1a, 0x70, 0xca, 0x82, 0x98, 0x77, 0x74, 0x1a,
+ 0xf2, 0x3d, 0x6a, 0x7b, 0x8e, 0xc8, 0xca, 0x34,
+ 0x44, 0xb8, 0xc0, 0xd0, 0x77, 0x8c, 0x4a, 0x5c,
+ 0xae, 0xd3, 0x17, 0x7c, 0x12, 0x47, 0x3e, 0xe2,
+ 0x2e, 0x51, 0xe0, 0x52, 0x88, 0x8e, 0xe9, 0x68,
+ 0xb6, 0x13, 0xf8, 0x69, 0xc9, 0x4b, 0xdd, 0x91,
+ 0x27, 0xb0, 0x22, 0x0c, 0x7d, 0xad, 0xb0, 0x75,
+ 0xe8, 0x76, 0x34, 0xc2, 0xd9, 0xf3, 0x20, 0xf7,
+ 0x1d, 0x0f, 0x07, 0x61, 0xc2, 0xb8, 0x7d, 0x00,
+ 0xa6, 0x68, 0xad, 0xd4, 0x0b, 0xa4, 0xa0, 0x32,
+ 0x6d, 0xa5, 0xc0, 0x07, 0x65, 0xae, 0xda, 0x2e,
+ 0xd6, 0xb7, 0xd3, 0x99, 0x8b, 0x37, 0x08, 0x13,
+ 0x6a, 0x94, 0xe9, 0xe4, 0xea, 0x34, 0xee, 0x07,
+ 0xee, 0x77, 0xb1, 0x3f, 0x54, 0x05, 0xbe, 0x66,
+ 0x7f, 0xf2, 0x70, 0x34, 0x45, 0xa7, 0x4b, 0x27,
+ 0xef, 0xe6, 0x39, 0x2e, 0x13, 0x41, 0xdb, 0x2d,
+ 0x1f, 0x76, 0x11, 0x76, 0x33, 0xf3, 0x92, 0x33,
+ 0x69, 0x16, 0x34, 0x86, 0x23, 0xc5, 0xfa, 0xaf,
+ 0xff, 0xbf, 0xee, 0x84, 0x56, 0xf6, 0x1e, 0x54,
+ 0x37, 0x32, 0x79, 0x83, 0x45, 0x04, 0x6f, 0x0e,
+ 0x75, 0x75, 0xd9, 0xd6, 0x4a, 0x87, 0xfb, 0x3c,
+ 0xb1, 0xcf, 0x66, 0xab, 0xa4, 0xaa, 0xf6, 0x96,
+ 0xb0, 0xcd, 0xaf, 0xac, 0x2c, 0x6d, 0x72, 0xca,
+ 0x43, 0xef, 0xb7, 0xa0, 0x4c, 0x62, 0xba, 0x7e,
+ 0x59, 0x0b, 0xff, 0x90, 0x49, 0x63, 0xf6, 0x31,
+ 0x8b, 0x50, 0x20, 0x82, 0x7d, 0xf0, 0x2d, 0xe4,
+ 0x5b, 0xda, 0xdf, 0xb0, 0xfb, 0x07, 0x7b, 0xe3,
+ 0x5f, 0xac, 0xd8, 0xe5, 0xa0, 0x3e, 0xc5, 0x60,
+ 0x94, 0xbc, 0xf7, 0x7e, 0xdc, 0x18, 0x27, 0x20,
+ 0xb1, 0xdd, 0x51, 0x4a, 0xb2, 0xe0, 0xc0, 0xe7,
+ 0x5d, 0x0f, 0x88, 0xb2, 0xa0, 0x42, 0x73, 0xfb,
+ 0xc4, 0x24, 0xa7, 0x17, 0x8a, 0xc9, 0x6d, 0x34,
+ 0xe8, 0x7b, 0x51, 0x37, 0x32, 0x3f, 0xf8, 0x7e,
+ 0x92, 0xe4, 0x87, 0xd2, 0x89, 0x66, 0xb0, 0xf6,
+ 0xc2, 0xba, 0x2f, 0x42, 0x8f, 0x1d, 0x5d, 0x81,
+ 0xad, 0xfd, 0x00, 0xbc, 0xa9, 0x11, 0x96, 0xae,
+ 0x80, 0xf1, 0x27, 0xe0, 0xeb, 0x5b, 0x60, 0x39,
+};
+
+const struct testvec aes_cbc_256_1_vectors[] = {
+ {
+ .blkno = 0,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_256_encblkno1_vec0_ctxt,
+ },
+ {
+ .blkno = 1,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_256_encblkno1_vec1_ctxt,
+ },
+ {
+ .blkno = 2,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_256_encblkno1_vec2_ctxt,
+ },
+ {
+ .blkno = 3,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_256_encblkno1_vec3_ctxt,
+ },
+};
+
+/*
+ * IV method encblkno8, blkno 0.
+ */
+static const uint8_t aes_cbc_256_encblkno8_vec0_ctxt[SECSIZE] = {
+ 0xe5, 0x55, 0xd9, 0xae, 0xc0, 0x66, 0x2d, 0x2f,
+ 0x11, 0xb1, 0x27, 0xd2, 0xb2, 0x73, 0xe4, 0x0a,
+ 0x85, 0xb5, 0x3c, 0x79, 0x78, 0xd6, 0x35, 0x3d,
+ 0x46, 0xac, 0xa3, 0x81, 0x55, 0x76, 0x86, 0xfc,
+ 0x37, 0xa0, 0x95, 0xc2, 0x30, 0xc9, 0x19, 0xc2,
+ 0x5f, 0xb0, 0x13, 0xa2, 0xa8, 0xe1, 0xc7, 0xb7,
+ 0x61, 0x54, 0xd8, 0xe6, 0xca, 0x94, 0x6f, 0x47,
+ 0x87, 0x33, 0x58, 0xd9, 0xd5, 0xd2, 0x95, 0x73,
+ 0x87, 0x9a, 0x31, 0xe5, 0x2e, 0x95, 0x83, 0x7d,
+ 0xdc, 0x0f, 0xc5, 0x2f, 0x14, 0xbc, 0x80, 0xac,
+ 0x47, 0xd6, 0xd8, 0x17, 0x9e, 0xf7, 0xff, 0x5b,
+ 0x85, 0x05, 0x91, 0xe0, 0x73, 0xd2, 0x5c, 0xa7,
+ 0x41, 0xf8, 0xcb, 0x3d, 0x38, 0x14, 0x28, 0x3e,
+ 0x89, 0x6f, 0xd4, 0xac, 0xb6, 0x11, 0x35, 0x67,
+ 0x7b, 0xef, 0x0d, 0xd8, 0x4d, 0xdd, 0x7e, 0x73,
+ 0xcd, 0x58, 0x0f, 0x5a, 0xcf, 0x42, 0xc5, 0x2f,
+ 0x61, 0x62, 0x13, 0xde, 0xcd, 0x2e, 0x22, 0xab,
+ 0xb0, 0x47, 0x5c, 0x1e, 0x5c, 0xc5, 0x49, 0xc6,
+ 0x3b, 0x0c, 0xe3, 0xb3, 0x59, 0xbf, 0xbf, 0x85,
+ 0xf6, 0x0a, 0x3d, 0x14, 0x74, 0x2a, 0xcd, 0xea,
+ 0x67, 0xd6, 0x80, 0x42, 0x3c, 0x6a, 0x92, 0x50,
+ 0x95, 0x73, 0xb5, 0x7a, 0xb2, 0xbc, 0x76, 0xe5,
+ 0x8f, 0xf3, 0x85, 0x5e, 0xcd, 0xf9, 0xb4, 0x9d,
+ 0xa8, 0x0a, 0xda, 0x95, 0x11, 0x2e, 0x22, 0x0c,
+ 0x2f, 0xb0, 0xbf, 0x92, 0x6b, 0x45, 0xec, 0x20,
+ 0xd2, 0x2b, 0x98, 0x3f, 0x4f, 0x97, 0xf2, 0xed,
+ 0xf7, 0x9b, 0x89, 0x4e, 0xd6, 0x59, 0xbb, 0x24,
+ 0x22, 0x44, 0x9f, 0x03, 0xb5, 0x42, 0xc8, 0x97,
+ 0xc7, 0xdb, 0x21, 0xfc, 0xcf, 0x33, 0xa1, 0xf1,
+ 0xc0, 0x1f, 0x28, 0x77, 0xee, 0xa5, 0x6a, 0x12,
+ 0xef, 0x8b, 0x48, 0xd1, 0xb3, 0xac, 0x65, 0x69,
+ 0x46, 0x04, 0x39, 0xb1, 0x9e, 0xfa, 0xab, 0x21,
+ 0x51, 0xa4, 0x33, 0xe9, 0x58, 0x5d, 0xf1, 0xc6,
+ 0x69, 0x44, 0x8c, 0x17, 0xf9, 0xaa, 0x96, 0xcb,
+ 0x40, 0xb4, 0x5c, 0x83, 0x76, 0x1e, 0x8a, 0x2b,
+ 0x5f, 0x6b, 0xc1, 0x73, 0xd4, 0x5f, 0x48, 0xa3,
+ 0x0e, 0x07, 0x69, 0x12, 0xc1, 0xbd, 0x13, 0xad,
+ 0xe2, 0xcf, 0x3d, 0x96, 0xd8, 0xaf, 0xed, 0xdc,
+ 0x4c, 0x72, 0xf6, 0xce, 0x15, 0x86, 0x88, 0x8c,
+ 0xbb, 0x60, 0xb3, 0xb9, 0xde, 0x42, 0x58, 0x6e,
+ 0xc4, 0x58, 0xac, 0x77, 0x8d, 0x35, 0x23, 0x5f,
+ 0xc3, 0xf9, 0x33, 0x46, 0x17, 0x80, 0x31, 0xfd,
+ 0xcd, 0x0a, 0x1e, 0x9b, 0xac, 0x42, 0xda, 0x70,
+ 0x54, 0x9a, 0xeb, 0x22, 0x27, 0x09, 0x0c, 0x6c,
+ 0x18, 0x1d, 0x1a, 0x5b, 0x86, 0x4d, 0x80, 0xca,
+ 0x4d, 0xda, 0x0e, 0x9a, 0x8e, 0x61, 0x04, 0x68,
+ 0x29, 0x08, 0x3b, 0xae, 0x14, 0x7d, 0x8e, 0x43,
+ 0x7a, 0xa7, 0x83, 0xcf, 0xb3, 0x95, 0xd3, 0x42,
+ 0x2d, 0x6b, 0xd8, 0x5c, 0x43, 0x31, 0x5b, 0x9c,
+ 0x18, 0x30, 0x0d, 0x61, 0x9c, 0xab, 0x29, 0x55,
+ 0xdd, 0x84, 0x24, 0x21, 0xec, 0x44, 0xad, 0xf3,
+ 0xb3, 0x70, 0x77, 0x2b, 0xfc, 0x3f, 0x99, 0xb8,
+ 0x50, 0x26, 0x8d, 0x96, 0xa2, 0x22, 0x99, 0x33,
+ 0x53, 0xa8, 0x5d, 0x84, 0x9b, 0x76, 0x26, 0x6e,
+ 0x75, 0x14, 0x7e, 0x63, 0xc6, 0x7a, 0x4f, 0x5c,
+ 0xfe, 0x4b, 0x80, 0xee, 0xb3, 0x32, 0x8d, 0x25,
+ 0x1c, 0x80, 0x7b, 0x3d, 0xd3, 0x84, 0x01, 0x1e,
+ 0x16, 0xa4, 0xca, 0x0d, 0x38, 0x40, 0x03, 0x6f,
+ 0x81, 0x8b, 0x5c, 0xad, 0x22, 0xfa, 0x6f, 0xeb,
+ 0x60, 0xa1, 0xcb, 0x2d, 0x97, 0xf8, 0xa6, 0x5e,
+ 0xbe, 0x93, 0xb7, 0xe6, 0x66, 0xbf, 0x9b, 0xd2,
+ 0x5c, 0x31, 0xcc, 0x70, 0x0c, 0xf1, 0xfb, 0x9f,
+ 0x09, 0x1b, 0xc2, 0x85, 0x2f, 0x22, 0x7c, 0x95,
+ 0x58, 0x09, 0xce, 0x9c, 0x7c, 0x50, 0xca, 0x89,
+};
+
+/*
+ * IV method encblkno8, blkno 1.
+ */
+static const uint8_t aes_cbc_256_encblkno8_vec1_ctxt[SECSIZE] = {
+ 0x37, 0x4d, 0x25, 0xdb, 0x35, 0xe0, 0x8b, 0x82,
+ 0x5f, 0x77, 0xd2, 0x53, 0xd1, 0x1f, 0xf0, 0x91,
+ 0x5b, 0xd8, 0x93, 0x2f, 0xb2, 0x81, 0xbd, 0x75,
+ 0xf0, 0xd8, 0xff, 0x46, 0x8c, 0x9d, 0xf6, 0xe2,
+ 0x99, 0x1e, 0x76, 0x9d, 0x00, 0x3a, 0xe3, 0xcf,
+ 0x6d, 0x24, 0xa8, 0xe8, 0xb4, 0xa7, 0xa0, 0x87,
+ 0xa8, 0x43, 0x01, 0x21, 0x29, 0x70, 0x39, 0x2d,
+ 0x0b, 0x2a, 0xe9, 0x11, 0x57, 0x86, 0x13, 0xd4,
+ 0x1c, 0x1b, 0x59, 0x19, 0xc4, 0x7d, 0x2c, 0x94,
+ 0xc7, 0x01, 0xb8, 0x96, 0x01, 0xd2, 0x01, 0x17,
+ 0x97, 0x41, 0x68, 0xab, 0xba, 0x9c, 0xc8, 0xad,
+ 0x4e, 0xd7, 0xa8, 0x4c, 0x96, 0x3f, 0xf9, 0xfc,
+ 0x7e, 0xd7, 0x59, 0xe8, 0x25, 0x51, 0x4d, 0x1d,
+ 0x99, 0xfd, 0x0b, 0xe9, 0x88, 0x23, 0xd1, 0x4b,
+ 0x30, 0x6e, 0x18, 0x7c, 0xe3, 0x7a, 0x54, 0x2a,
+ 0x4f, 0x2a, 0x99, 0x8f, 0xaf, 0xd7, 0x5e, 0x25,
+ 0xfe, 0x9c, 0x47, 0x09, 0x63, 0x38, 0x0d, 0x5f,
+ 0xb3, 0x43, 0xa6, 0x66, 0x9b, 0xc5, 0x3d, 0x88,
+ 0x5e, 0xc7, 0x60, 0x99, 0x8e, 0xcb, 0x6a, 0x65,
+ 0x60, 0x92, 0x88, 0xe1, 0x2b, 0xfe, 0x83, 0x34,
+ 0x92, 0xa6, 0x6c, 0x22, 0x56, 0x5b, 0x75, 0x8a,
+ 0x93, 0xc3, 0x72, 0xca, 0xff, 0x59, 0x3b, 0xd8,
+ 0xa0, 0x80, 0x56, 0x98, 0x62, 0x8a, 0x70, 0xf2,
+ 0x5d, 0xd9, 0x40, 0x6b, 0xbf, 0x9f, 0x71, 0x8d,
+ 0x2e, 0x38, 0xe8, 0x06, 0x42, 0xa9, 0x95, 0x70,
+ 0x31, 0xd1, 0xe9, 0x6c, 0xab, 0xbb, 0xed, 0x25,
+ 0xe8, 0xca, 0xe8, 0xa4, 0x98, 0x82, 0xf5, 0xe3,
+ 0x11, 0x3c, 0xc4, 0xea, 0xea, 0x88, 0x56, 0x91,
+ 0xd6, 0x5d, 0xaa, 0xf7, 0xe9, 0x49, 0x2f, 0x42,
+ 0x5b, 0x76, 0xef, 0xed, 0x03, 0x9e, 0x5f, 0x4d,
+ 0x65, 0x25, 0xa5, 0xe8, 0x26, 0xba, 0x03, 0x4f,
+ 0x0e, 0x39, 0xd2, 0x53, 0x62, 0x98, 0x81, 0x9d,
+ 0x8e, 0xad, 0x50, 0x17, 0x9f, 0xcc, 0x34, 0x45,
+ 0x19, 0x5c, 0x1c, 0xd1, 0xbc, 0x71, 0x89, 0xaa,
+ 0x9a, 0x65, 0x55, 0x6f, 0x78, 0xd4, 0xd3, 0x5b,
+ 0x27, 0x8d, 0x94, 0x46, 0xd9, 0x95, 0xb3, 0x5f,
+ 0xc4, 0x35, 0x8d, 0xba, 0x1c, 0x40, 0x52, 0xd1,
+ 0x99, 0x27, 0x5d, 0x42, 0x28, 0xef, 0xcb, 0x9b,
+ 0x10, 0x7a, 0x19, 0xbf, 0x72, 0xa3, 0x4a, 0xb9,
+ 0x56, 0x83, 0x39, 0xa6, 0xb2, 0xcd, 0x48, 0x85,
+ 0xf9, 0xcc, 0x72, 0x88, 0xb3, 0x5a, 0x9b, 0x45,
+ 0xb2, 0xd3, 0x66, 0x2d, 0x24, 0x51, 0x68, 0x91,
+ 0x9d, 0x47, 0x6a, 0xb3, 0x9a, 0x60, 0xb3, 0xcd,
+ 0x6b, 0x43, 0x96, 0x21, 0xa0, 0x65, 0x43, 0xde,
+ 0x4f, 0x6e, 0xb5, 0x81, 0x50, 0x7e, 0xca, 0x4b,
+ 0xdb, 0x30, 0xf2, 0xcb, 0x28, 0x3b, 0x19, 0x6a,
+ 0x0a, 0xfa, 0x05, 0x5e, 0x61, 0xde, 0x76, 0x7e,
+ 0xdf, 0xd9, 0xa9, 0x1b, 0xd0, 0x8a, 0xb5, 0x04,
+ 0x51, 0xf5, 0x66, 0xa2, 0x32, 0x21, 0xb2, 0xa9,
+ 0x40, 0x78, 0x60, 0x9d, 0xdc, 0x45, 0xbe, 0xb4,
+ 0x3a, 0xba, 0xd1, 0xec, 0x31, 0x53, 0x24, 0x22,
+ 0x70, 0x99, 0xda, 0xc8, 0x17, 0x04, 0x87, 0x2c,
+ 0x89, 0x86, 0x24, 0xec, 0x52, 0x12, 0x6a, 0x51,
+ 0x1e, 0x2a, 0x5e, 0x96, 0xfb, 0xac, 0x95, 0x4a,
+ 0x1a, 0x06, 0x8f, 0xdf, 0xa7, 0x26, 0xeb, 0x6c,
+ 0x79, 0x4a, 0x77, 0xea, 0xb3, 0xb1, 0x3a, 0x19,
+ 0xe6, 0x5e, 0xe2, 0x26, 0x1b, 0x85, 0x3c, 0x9b,
+ 0x1d, 0x05, 0x1d, 0xbe, 0x5c, 0x25, 0x7f, 0x45,
+ 0x4c, 0x09, 0x4c, 0xc1, 0x47, 0xa5, 0x44, 0xfc,
+ 0x04, 0x2b, 0xad, 0x53, 0xac, 0x57, 0x22, 0x54,
+ 0x13, 0x7c, 0xc9, 0x96, 0x44, 0xda, 0x74, 0x95,
+ 0x6e, 0x8c, 0xe6, 0x6a, 0x05, 0x05, 0xf3, 0x8c,
+ 0x81, 0xaf, 0xbc, 0xb1, 0x91, 0xe7, 0xfd, 0x81,
+ 0x3f, 0x47, 0xc2, 0x6f, 0x0d, 0x62, 0xf6, 0x6e,
+};
+
+/*
+ * IV method encblkno8, blkno 2.
+ */
+static const uint8_t aes_cbc_256_encblkno8_vec2_ctxt[SECSIZE] = {
+ 0x5a, 0x24, 0xfd, 0xee, 0x9a, 0x44, 0xfb, 0xac,
+ 0x3e, 0x46, 0x53, 0x95, 0x9e, 0xeb, 0x1f, 0xd9,
+ 0xfd, 0xc6, 0x4f, 0xae, 0x0b, 0xc8, 0xf2, 0xbd,
+ 0x77, 0x16, 0x7a, 0x2e, 0x8e, 0xec, 0x7a, 0x53,
+ 0xf4, 0xe0, 0x34, 0xba, 0x6e, 0xfa, 0xc4, 0x69,
+ 0xd7, 0x50, 0x13, 0x03, 0xfb, 0xb9, 0x66, 0x96,
+ 0xd4, 0x21, 0x67, 0xcc, 0x4c, 0x4d, 0x10, 0x2f,
+ 0x17, 0xeb, 0x41, 0xf4, 0x65, 0x80, 0x0b, 0x57,
+ 0x2d, 0xdf, 0xcf, 0x9f, 0xb9, 0xd8, 0x53, 0x36,
+ 0xbc, 0x1d, 0x9a, 0xe3, 0x17, 0xe7, 0x08, 0x23,
+ 0xb3, 0x60, 0xfe, 0xdf, 0x24, 0x06, 0xc5, 0x86,
+ 0x74, 0x89, 0xa3, 0xb2, 0xfc, 0x4a, 0x57, 0xf5,
+ 0xa6, 0x96, 0xfb, 0x56, 0xf0, 0xf4, 0xdc, 0xdc,
+ 0xb8, 0x53, 0x5f, 0xb2, 0xb0, 0x8d, 0x2d, 0x90,
+ 0x3d, 0x78, 0x4d, 0x42, 0x3a, 0x74, 0xa4, 0x8e,
+ 0x41, 0x7c, 0x2a, 0xff, 0xe4, 0x57, 0x1c, 0x9d,
+ 0x94, 0xc5, 0x5d, 0xd8, 0x8b, 0x88, 0x48, 0x15,
+ 0x16, 0x8a, 0xf3, 0x07, 0x3a, 0xee, 0x65, 0x24,
+ 0xbc, 0x7f, 0x58, 0xad, 0xed, 0xf2, 0xbd, 0x18,
+ 0x88, 0x1a, 0x80, 0x6e, 0xb7, 0x93, 0xe0, 0x45,
+ 0x04, 0xb0, 0xfc, 0xf9, 0x48, 0x76, 0xaf, 0xec,
+ 0x08, 0xca, 0x99, 0x64, 0x85, 0x98, 0x2c, 0xd8,
+ 0x85, 0x72, 0x32, 0xbe, 0x92, 0x18, 0xdd, 0xab,
+ 0x20, 0x8f, 0x8e, 0x11, 0xc6, 0x08, 0xf9, 0x8b,
+ 0xaf, 0x5f, 0xa9, 0xe5, 0x11, 0xc7, 0x45, 0x91,
+ 0x6e, 0x47, 0xaa, 0x0f, 0x4c, 0xf4, 0xc1, 0xb0,
+ 0x75, 0x4c, 0xba, 0x1d, 0xb3, 0x33, 0xf7, 0x47,
+ 0xbe, 0x94, 0x0b, 0x2e, 0xfa, 0x38, 0x5e, 0x5f,
+ 0x0a, 0xc2, 0x0c, 0x4e, 0x72, 0x29, 0x16, 0xc1,
+ 0x82, 0x70, 0xd4, 0xd3, 0x1b, 0x25, 0xbe, 0x0d,
+ 0x6b, 0x0a, 0x13, 0x9f, 0x4d, 0x3d, 0x7b, 0x10,
+ 0x9f, 0x93, 0x43, 0x50, 0xd1, 0x17, 0x08, 0x77,
+ 0x23, 0x58, 0x35, 0x41, 0x23, 0xf6, 0x9c, 0x6f,
+ 0x2e, 0x81, 0x6e, 0x75, 0x9b, 0x9f, 0x37, 0x4f,
+ 0xb7, 0xa1, 0xce, 0xde, 0x0c, 0x74, 0x99, 0x31,
+ 0x0e, 0x27, 0x42, 0x99, 0xdd, 0x93, 0x03, 0x6b,
+ 0x44, 0x22, 0xd4, 0xc8, 0x67, 0xb5, 0xb2, 0x4d,
+ 0x11, 0x2e, 0x80, 0x09, 0xa2, 0x5b, 0xcf, 0x0c,
+ 0xff, 0xfa, 0x51, 0xe5, 0x9b, 0xdd, 0x11, 0xa1,
+ 0x17, 0x04, 0x9e, 0xc8, 0xd8, 0x1d, 0xc1, 0x5c,
+ 0xc3, 0xde, 0x83, 0x77, 0xa3, 0xec, 0x59, 0x7e,
+ 0xfb, 0xe8, 0x45, 0xff, 0xc3, 0xb3, 0xd3, 0x9e,
+ 0x3e, 0xc4, 0x75, 0xca, 0xc1, 0x77, 0xee, 0x1a,
+ 0xdc, 0x58, 0xab, 0x27, 0xc1, 0xfe, 0x21, 0x26,
+ 0x9a, 0xe0, 0x15, 0xab, 0x35, 0x8d, 0xbc, 0x22,
+ 0x37, 0xbb, 0x4e, 0xab, 0x9d, 0xa2, 0xaf, 0xf9,
+ 0x45, 0x17, 0xb1, 0xb8, 0xd4, 0x52, 0x1e, 0x67,
+ 0xeb, 0xac, 0xe0, 0x87, 0x6c, 0xe4, 0x7a, 0x03,
+ 0x73, 0xe4, 0x43, 0xeb, 0x3b, 0x57, 0x3f, 0x56,
+ 0x4b, 0x6c, 0x26, 0x81, 0x27, 0xbf, 0x7e, 0x59,
+ 0xcd, 0xab, 0x67, 0x8c, 0x4b, 0x6f, 0xa5, 0x47,
+ 0x2c, 0x45, 0x28, 0x5a, 0x3d, 0x88, 0x53, 0xf9,
+ 0x25, 0xdf, 0x5d, 0xba, 0xf7, 0x18, 0xa7, 0x3d,
+ 0x79, 0xb4, 0x43, 0x59, 0x77, 0xf9, 0xd5, 0x5d,
+ 0x4f, 0x31, 0x56, 0x8c, 0x21, 0xb5, 0xc0, 0xa2,
+ 0xca, 0x04, 0x62, 0x2c, 0xc8, 0xa8, 0x11, 0x82,
+ 0x1b, 0xde, 0xad, 0x20, 0x5b, 0xd2, 0x63, 0xfb,
+ 0x6d, 0xba, 0xd4, 0xcc, 0xb4, 0x9d, 0xe8, 0xa8,
+ 0xd1, 0x06, 0x81, 0xf0, 0xb9, 0xd4, 0x90, 0x30,
+ 0xcd, 0x0a, 0xe8, 0xd2, 0x8c, 0x7a, 0xbf, 0xf6,
+ 0x0d, 0xa0, 0xae, 0x1b, 0x21, 0x18, 0x93, 0x18,
+ 0x71, 0xe1, 0xa0, 0x63, 0x5a, 0x9d, 0x4e, 0x6a,
+ 0x52, 0x90, 0xaf, 0xdb, 0x26, 0x1e, 0xa9, 0xa1,
+ 0xc7, 0xf9, 0xf8, 0xa7, 0x3f, 0x85, 0xa1, 0xa4,
+};
+
+/*
+ * IV method encblkno8, blkno 3.
+ */
+static const uint8_t aes_cbc_256_encblkno8_vec3_ctxt[SECSIZE] = {
+ 0x83, 0x77, 0xd8, 0xa8, 0x6a, 0x36, 0x41, 0x72,
+ 0xb6, 0x03, 0x4e, 0x5e, 0x39, 0x36, 0xe3, 0xf5,
+ 0xd0, 0x1b, 0x0d, 0x97, 0x78, 0x46, 0xee, 0xfd,
+ 0x34, 0x34, 0x16, 0xa0, 0x44, 0xcf, 0x0b, 0xdc,
+ 0xfb, 0x82, 0x98, 0xa2, 0x79, 0xc2, 0xe7, 0x1c,
+ 0x43, 0x43, 0x4c, 0x7f, 0xe7, 0xa6, 0xe6, 0x10,
+ 0x9e, 0x65, 0xb2, 0x09, 0xc7, 0x5f, 0xaa, 0xb7,
+ 0xb8, 0xad, 0x83, 0xd5, 0x9e, 0xd1, 0xb2, 0xce,
+ 0x4b, 0xa4, 0x5d, 0xbc, 0xd6, 0xf6, 0x0a, 0xe7,
+ 0x1b, 0xe9, 0x86, 0xbc, 0x72, 0xcc, 0x6f, 0xcc,
+ 0xf2, 0xde, 0x08, 0x48, 0xa2, 0x20, 0x31, 0x6a,
+ 0xdd, 0xbe, 0xc5, 0x36, 0x55, 0xff, 0xce, 0xfa,
+ 0xdf, 0x60, 0x26, 0x77, 0x7f, 0xd0, 0xfa, 0xd7,
+ 0x76, 0x70, 0x14, 0x11, 0xbf, 0x57, 0xc2, 0xdd,
+ 0x5f, 0xd3, 0x50, 0x49, 0xf8, 0xd1, 0xa7, 0xe2,
+ 0x8b, 0x89, 0xa0, 0xbc, 0x44, 0x42, 0x45, 0x10,
+ 0xfe, 0x66, 0x3d, 0x56, 0x09, 0x21, 0x7c, 0x49,
+ 0x30, 0xde, 0xe2, 0x4b, 0x26, 0x65, 0x8a, 0xe4,
+ 0x79, 0x08, 0x3a, 0xca, 0x36, 0x4f, 0x97, 0x3c,
+ 0xe4, 0x6a, 0xc3, 0xdb, 0xce, 0xac, 0x78, 0x76,
+ 0x25, 0x81, 0x7a, 0x01, 0x7b, 0xd8, 0xf1, 0x00,
+ 0x8d, 0x2e, 0xb7, 0x98, 0x3c, 0x86, 0x20, 0xa3,
+ 0x4c, 0x24, 0x2a, 0x78, 0x3a, 0x8d, 0xeb, 0xcd,
+ 0xae, 0xe1, 0x32, 0xf8, 0x21, 0x37, 0x30, 0x27,
+ 0xe1, 0xf3, 0x14, 0x60, 0x96, 0x77, 0x37, 0x50,
+ 0xa2, 0x92, 0xae, 0xe5, 0xd8, 0xea, 0x1a, 0x7e,
+ 0xa3, 0xd1, 0x04, 0x17, 0x03, 0x51, 0x2f, 0x21,
+ 0xa7, 0x00, 0x23, 0xb3, 0x24, 0xd8, 0x7d, 0xb7,
+ 0x4c, 0x51, 0xb1, 0xaf, 0xb0, 0x64, 0xe4, 0x62,
+ 0x91, 0x4c, 0xd5, 0x4b, 0xe8, 0xfb, 0x95, 0x61,
+ 0xa4, 0x6f, 0xf8, 0xb8, 0xea, 0xa9, 0xb2, 0x10,
+ 0xd3, 0x96, 0xcb, 0x1c, 0xdc, 0x86, 0x43, 0x26,
+ 0x2d, 0x39, 0xc2, 0xa7, 0x69, 0xfa, 0x8f, 0x3a,
+ 0xe7, 0xe0, 0x27, 0xbe, 0xc2, 0xe8, 0xd5, 0x05,
+ 0xbe, 0x5a, 0x96, 0xdc, 0x86, 0xcd, 0x93, 0x75,
+ 0x1b, 0x61, 0x40, 0x8c, 0x60, 0x64, 0x79, 0x85,
+ 0x6c, 0xed, 0x39, 0x72, 0x26, 0x69, 0xba, 0xb2,
+ 0xff, 0xa8, 0x68, 0x29, 0x03, 0xf7, 0x26, 0xe7,
+ 0x0f, 0x53, 0x1b, 0x5b, 0x37, 0x21, 0x68, 0x70,
+ 0x1c, 0x39, 0x7f, 0x5b, 0x31, 0xca, 0xde, 0xed,
+ 0x33, 0x8d, 0xaf, 0xe6, 0x01, 0xd5, 0x72, 0x5f,
+ 0x46, 0x44, 0x34, 0x1b, 0x4c, 0xd7, 0x75, 0xf0,
+ 0x47, 0x16, 0x6c, 0xd6, 0x65, 0x3c, 0xd3, 0xc2,
+ 0xb1, 0x46, 0x7d, 0xd5, 0x5c, 0x48, 0x5b, 0x61,
+ 0x3e, 0x88, 0xff, 0x24, 0x5c, 0x7b, 0xf7, 0xa9,
+ 0x44, 0xcb, 0x3b, 0x3e, 0x3b, 0x93, 0x24, 0x46,
+ 0x7e, 0x34, 0x8d, 0xc4, 0x2b, 0xb7, 0x8e, 0x22,
+ 0x9e, 0x87, 0x62, 0xca, 0xbc, 0x10, 0x09, 0x4a,
+ 0x4b, 0x0b, 0xdb, 0x57, 0x9b, 0xa9, 0x3e, 0xa8,
+ 0x99, 0x59, 0xa0, 0x12, 0xf3, 0xa5, 0xe4, 0x91,
+ 0xbb, 0xb9, 0x05, 0x8d, 0xcf, 0xb9, 0xcb, 0x36,
+ 0x97, 0xb2, 0x6a, 0x31, 0x8f, 0xcb, 0xf8, 0x5a,
+ 0x2f, 0x9e, 0xa1, 0xf9, 0x7a, 0xf4, 0x10, 0x0e,
+ 0xe7, 0x7f, 0x4c, 0xcb, 0xe3, 0x83, 0x17, 0x39,
+ 0x34, 0xef, 0x49, 0x35, 0x68, 0x50, 0x80, 0xf9,
+ 0xcd, 0x3a, 0x10, 0xf6, 0x71, 0x1a, 0x94, 0xc3,
+ 0xec, 0xb9, 0x36, 0x84, 0x36, 0xe7, 0x3f, 0x6f,
+ 0x9b, 0xa9, 0x2b, 0x5c, 0x96, 0x49, 0x26, 0xda,
+ 0xb3, 0x08, 0x3d, 0x5e, 0x9e, 0x59, 0xdf, 0x0f,
+ 0xfc, 0xbe, 0xa8, 0x0b, 0xbc, 0xaa, 0x32, 0xf0,
+ 0xa5, 0x21, 0x50, 0x15, 0x7e, 0x46, 0xb9, 0x76,
+ 0x09, 0x4e, 0x4b, 0x6f, 0x9f, 0xc7, 0x8c, 0x6d,
+ 0x80, 0x37, 0xf9, 0xaa, 0xd1, 0x5f, 0x12, 0xb9,
+ 0xb3, 0x15, 0xe4, 0x96, 0xa1, 0x01, 0xd5, 0xa0,
+};
+
+const struct testvec aes_cbc_256_8_vectors[] = {
+ {
+ .blkno = 0,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_256_encblkno8_vec0_ctxt,
+ },
+ {
+ .blkno = 1,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_256_encblkno8_vec1_ctxt,
+ },
+ {
+ .blkno = 2,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_256_encblkno8_vec2_ctxt,
+ },
+ {
+ .blkno = 3,
+ .ptxt = aes_cbc_ptxt,
+ .ctxt = aes_cbc_256_encblkno8_vec3_ctxt,
+ },
+};
+
+/*
+ * 256 bits key from IEEE 1619/D16, NUL terminated.
+ */
+static const char aes_xts_256_key[33] = {
+ 0x27, 0x18, 0x28, 0x18, 0x28, 0x45, 0x90, 0x45,
+ 0x23, 0x53, 0x60, 0x28, 0x74, 0x71, 0x35, 0x26,
+ 0x31, 0x41, 0x59, 0x26, 0x53, 0x58, 0x97, 0x93,
+ 0x23, 0x84, 0x62, 0x64, 0x33, 0x83, 0x27, 0x95,
+ 0
+};
+
+/*
+ * 512 bits key from IEEE 1619/D16, NUL terminated.
+ */
+static const char aes_xts_512_key[65] = {
+ 0x27, 0x18, 0x28, 0x18, 0x28, 0x45, 0x90, 0x45,
+ 0x23, 0x53, 0x60, 0x28, 0x74, 0x71, 0x35, 0x26,
+ 0x62, 0x49, 0x77, 0x57, 0x24, 0x70, 0x93, 0x69,
+ 0x99, 0x59, 0x57, 0x49, 0x66, 0x96, 0x76, 0x27,
+ 0x31, 0x41, 0x59, 0x26, 0x53, 0x58, 0x97, 0x93,
+ 0x23, 0x84, 0x62, 0x64, 0x33, 0x83, 0x27, 0x95,
+ 0x02, 0x88, 0x41, 0x97, 0x16, 0x93, 0x99, 0x37,
+ 0x51, 0x05, 0x82, 0x09, 0x74, 0x94, 0x45, 0x92,
+ 0
+};
+
+/*
+ * Vector 4 from IEEE 1619/D16, blkno 0.
+ */
+static const uint8_t aes_xts_256_vec4_ptxt[SECSIZE] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
+ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
+ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
+ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
+ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
+};
+
+static const uint8_t aes_xts_256_vec4_ctxt[SECSIZE] = {
+ 0x27, 0xa7, 0x47, 0x9b, 0xef, 0xa1, 0xd4, 0x76,
+ 0x48, 0x9f, 0x30, 0x8c, 0xd4, 0xcf, 0xa6, 0xe2,
+ 0xa9, 0x6e, 0x4b, 0xbe, 0x32, 0x08, 0xff, 0x25,
+ 0x28, 0x7d, 0xd3, 0x81, 0x96, 0x16, 0xe8, 0x9c,
+ 0xc7, 0x8c, 0xf7, 0xf5, 0xe5, 0x43, 0x44, 0x5f,
+ 0x83, 0x33, 0xd8, 0xfa, 0x7f, 0x56, 0x00, 0x00,
+ 0x05, 0x27, 0x9f, 0xa5, 0xd8, 0xb5, 0xe4, 0xad,
+ 0x40, 0xe7, 0x36, 0xdd, 0xb4, 0xd3, 0x54, 0x12,
+ 0x32, 0x80, 0x63, 0xfd, 0x2a, 0xab, 0x53, 0xe5,
+ 0xea, 0x1e, 0x0a, 0x9f, 0x33, 0x25, 0x00, 0xa5,
+ 0xdf, 0x94, 0x87, 0xd0, 0x7a, 0x5c, 0x92, 0xcc,
+ 0x51, 0x2c, 0x88, 0x66, 0xc7, 0xe8, 0x60, 0xce,
+ 0x93, 0xfd, 0xf1, 0x66, 0xa2, 0x49, 0x12, 0xb4,
+ 0x22, 0x97, 0x61, 0x46, 0xae, 0x20, 0xce, 0x84,
+ 0x6b, 0xb7, 0xdc, 0x9b, 0xa9, 0x4a, 0x76, 0x7a,
+ 0xae, 0xf2, 0x0c, 0x0d, 0x61, 0xad, 0x02, 0x65,
+ 0x5e, 0xa9, 0x2d, 0xc4, 0xc4, 0xe4, 0x1a, 0x89,
+ 0x52, 0xc6, 0x51, 0xd3, 0x31, 0x74, 0xbe, 0x51,
+ 0xa1, 0x0c, 0x42, 0x11, 0x10, 0xe6, 0xd8, 0x15,
+ 0x88, 0xed, 0xe8, 0x21, 0x03, 0xa2, 0x52, 0xd8,
+ 0xa7, 0x50, 0xe8, 0x76, 0x8d, 0xef, 0xff, 0xed,
+ 0x91, 0x22, 0x81, 0x0a, 0xae, 0xb9, 0x9f, 0x91,
+ 0x72, 0xaf, 0x82, 0xb6, 0x04, 0xdc, 0x4b, 0x8e,
+ 0x51, 0xbc, 0xb0, 0x82, 0x35, 0xa6, 0xf4, 0x34,
+ 0x13, 0x32, 0xe4, 0xca, 0x60, 0x48, 0x2a, 0x4b,
+ 0xa1, 0xa0, 0x3b, 0x3e, 0x65, 0x00, 0x8f, 0xc5,
+ 0xda, 0x76, 0xb7, 0x0b, 0xf1, 0x69, 0x0d, 0xb4,
+ 0xea, 0xe2, 0x9c, 0x5f, 0x1b, 0xad, 0xd0, 0x3c,
+ 0x5c, 0xcf, 0x2a, 0x55, 0xd7, 0x05, 0xdd, 0xcd,
+ 0x86, 0xd4, 0x49, 0x51, 0x1c, 0xeb, 0x7e, 0xc3,
+ 0x0b, 0xf1, 0x2b, 0x1f, 0xa3, 0x5b, 0x91, 0x3f,
+ 0x9f, 0x74, 0x7a, 0x8a, 0xfd, 0x1b, 0x13, 0x0e,
+ 0x94, 0xbf, 0xf9, 0x4e, 0xff, 0xd0, 0x1a, 0x91,
+ 0x73, 0x5c, 0xa1, 0x72, 0x6a, 0xcd, 0x0b, 0x19,
+ 0x7c, 0x4e, 0x5b, 0x03, 0x39, 0x36, 0x97, 0xe1,
+ 0x26, 0x82, 0x6f, 0xb6, 0xbb, 0xde, 0x8e, 0xcc,
+ 0x1e, 0x08, 0x29, 0x85, 0x16, 0xe2, 0xc9, 0xed,
+ 0x03, 0xff, 0x3c, 0x1b, 0x78, 0x60, 0xf6, 0xde,
+ 0x76, 0xd4, 0xce, 0xcd, 0x94, 0xc8, 0x11, 0x98,
+ 0x55, 0xef, 0x52, 0x97, 0xca, 0x67, 0xe9, 0xf3,
+ 0xe7, 0xff, 0x72, 0xb1, 0xe9, 0x97, 0x85, 0xca,
+ 0x0a, 0x7e, 0x77, 0x20, 0xc5, 0xb3, 0x6d, 0xc6,
+ 0xd7, 0x2c, 0xac, 0x95, 0x74, 0xc8, 0xcb, 0xbc,
+ 0x2f, 0x80, 0x1e, 0x23, 0xe5, 0x6f, 0xd3, 0x44,
+ 0xb0, 0x7f, 0x22, 0x15, 0x4b, 0xeb, 0xa0, 0xf0,
+ 0x8c, 0xe8, 0x89, 0x1e, 0x64, 0x3e, 0xd9, 0x95,
+ 0xc9, 0x4d, 0x9a, 0x69, 0xc9, 0xf1, 0xb5, 0xf4,
+ 0x99, 0x02, 0x7a, 0x78, 0x57, 0x2a, 0xee, 0xbd,
+ 0x74, 0xd2, 0x0c, 0xc3, 0x98, 0x81, 0xc2, 0x13,
+ 0xee, 0x77, 0x0b, 0x10, 0x10, 0xe4, 0xbe, 0xa7,
+ 0x18, 0x84, 0x69, 0x77, 0xae, 0x11, 0x9f, 0x7a,
+ 0x02, 0x3a, 0xb5, 0x8c, 0xca, 0x0a, 0xd7, 0x52,
+ 0xaf, 0xe6, 0x56, 0xbb, 0x3c, 0x17, 0x25, 0x6a,
+ 0x9f, 0x6e, 0x9b, 0xf1, 0x9f, 0xdd, 0x5a, 0x38,
+ 0xfc, 0x82, 0xbb, 0xe8, 0x72, 0xc5, 0x53, 0x9e,
+ 0xdb, 0x60, 0x9e, 0xf4, 0xf7, 0x9c, 0x20, 0x3e,
+ 0xbb, 0x14, 0x0f, 0x2e, 0x58, 0x3c, 0xb2, 0xad,
+ 0x15, 0xb4, 0xaa, 0x5b, 0x65, 0x50, 0x16, 0xa8,
+ 0x44, 0x92, 0x77, 0xdb, 0xd4, 0x77, 0xef, 0x2c,
+ 0x8d, 0x6c, 0x01, 0x7d, 0xb7, 0x38, 0xb1, 0x8d,
+ 0xeb, 0x4a, 0x42, 0x7d, 0x19, 0x23, 0xce, 0x3f,
+ 0xf2, 0x62, 0x73, 0x57, 0x79, 0xa4, 0x18, 0xf2,
+ 0x0a, 0x28, 0x2d, 0xf9, 0x20, 0x14, 0x7b, 0xea,
+ 0xbe, 0x42, 0x1e, 0xe5, 0x31, 0x9d, 0x05, 0x68,
+};
+
+/*
+ * Vector 5 from IEEE 1619/D16, blkno 1.
+ */
+static const uint8_t aes_xts_256_vec5_ptxt[SECSIZE] = {
+ 0x27, 0xa7, 0x47, 0x9b, 0xef, 0xa1, 0xd4, 0x76,
+ 0x48, 0x9f, 0x30, 0x8c, 0xd4, 0xcf, 0xa6, 0xe2,
+ 0xa9, 0x6e, 0x4b, 0xbe, 0x32, 0x08, 0xff, 0x25,
+ 0x28, 0x7d, 0xd3, 0x81, 0x96, 0x16, 0xe8, 0x9c,
+ 0xc7, 0x8c, 0xf7, 0xf5, 0xe5, 0x43, 0x44, 0x5f,
+ 0x83, 0x33, 0xd8, 0xfa, 0x7f, 0x56, 0x00, 0x00,
+ 0x05, 0x27, 0x9f, 0xa5, 0xd8, 0xb5, 0xe4, 0xad,
+ 0x40, 0xe7, 0x36, 0xdd, 0xb4, 0xd3, 0x54, 0x12,
+ 0x32, 0x80, 0x63, 0xfd, 0x2a, 0xab, 0x53, 0xe5,
+ 0xea, 0x1e, 0x0a, 0x9f, 0x33, 0x25, 0x00, 0xa5,
+ 0xdf, 0x94, 0x87, 0xd0, 0x7a, 0x5c, 0x92, 0xcc,
+ 0x51, 0x2c, 0x88, 0x66, 0xc7, 0xe8, 0x60, 0xce,
+ 0x93, 0xfd, 0xf1, 0x66, 0xa2, 0x49, 0x12, 0xb4,
+ 0x22, 0x97, 0x61, 0x46, 0xae, 0x20, 0xce, 0x84,
+ 0x6b, 0xb7, 0xdc, 0x9b, 0xa9, 0x4a, 0x76, 0x7a,
+ 0xae, 0xf2, 0x0c, 0x0d, 0x61, 0xad, 0x02, 0x65,
+ 0x5e, 0xa9, 0x2d, 0xc4, 0xc4, 0xe4, 0x1a, 0x89,
+ 0x52, 0xc6, 0x51, 0xd3, 0x31, 0x74, 0xbe, 0x51,
+ 0xa1, 0x0c, 0x42, 0x11, 0x10, 0xe6, 0xd8, 0x15,
+ 0x88, 0xed, 0xe8, 0x21, 0x03, 0xa2, 0x52, 0xd8,
+ 0xa7, 0x50, 0xe8, 0x76, 0x8d, 0xef, 0xff, 0xed,
+ 0x91, 0x22, 0x81, 0x0a, 0xae, 0xb9, 0x9f, 0x91,
+ 0x72, 0xaf, 0x82, 0xb6, 0x04, 0xdc, 0x4b, 0x8e,
+ 0x51, 0xbc, 0xb0, 0x82, 0x35, 0xa6, 0xf4, 0x34,
+ 0x13, 0x32, 0xe4, 0xca, 0x60, 0x48, 0x2a, 0x4b,
+ 0xa1, 0xa0, 0x3b, 0x3e, 0x65, 0x00, 0x8f, 0xc5,
+ 0xda, 0x76, 0xb7, 0x0b, 0xf1, 0x69, 0x0d, 0xb4,
+ 0xea, 0xe2, 0x9c, 0x5f, 0x1b, 0xad, 0xd0, 0x3c,
+ 0x5c, 0xcf, 0x2a, 0x55, 0xd7, 0x05, 0xdd, 0xcd,
+ 0x86, 0xd4, 0x49, 0x51, 0x1c, 0xeb, 0x7e, 0xc3,
+ 0x0b, 0xf1, 0x2b, 0x1f, 0xa3, 0x5b, 0x91, 0x3f,
+ 0x9f, 0x74, 0x7a, 0x8a, 0xfd, 0x1b, 0x13, 0x0e,
+ 0x94, 0xbf, 0xf9, 0x4e, 0xff, 0xd0, 0x1a, 0x91,
+ 0x73, 0x5c, 0xa1, 0x72, 0x6a, 0xcd, 0x0b, 0x19,
+ 0x7c, 0x4e, 0x5b, 0x03, 0x39, 0x36, 0x97, 0xe1,
+ 0x26, 0x82, 0x6f, 0xb6, 0xbb, 0xde, 0x8e, 0xcc,
+ 0x1e, 0x08, 0x29, 0x85, 0x16, 0xe2, 0xc9, 0xed,
+ 0x03, 0xff, 0x3c, 0x1b, 0x78, 0x60, 0xf6, 0xde,
+ 0x76, 0xd4, 0xce, 0xcd, 0x94, 0xc8, 0x11, 0x98,
+ 0x55, 0xef, 0x52, 0x97, 0xca, 0x67, 0xe9, 0xf3,
+ 0xe7, 0xff, 0x72, 0xb1, 0xe9, 0x97, 0x85, 0xca,
+ 0x0a, 0x7e, 0x77, 0x20, 0xc5, 0xb3, 0x6d, 0xc6,
+ 0xd7, 0x2c, 0xac, 0x95, 0x74, 0xc8, 0xcb, 0xbc,
+ 0x2f, 0x80, 0x1e, 0x23, 0xe5, 0x6f, 0xd3, 0x44,
+ 0xb0, 0x7f, 0x22, 0x15, 0x4b, 0xeb, 0xa0, 0xf0,
+ 0x8c, 0xe8, 0x89, 0x1e, 0x64, 0x3e, 0xd9, 0x95,
+ 0xc9, 0x4d, 0x9a, 0x69, 0xc9, 0xf1, 0xb5, 0xf4,
+ 0x99, 0x02, 0x7a, 0x78, 0x57, 0x2a, 0xee, 0xbd,
+ 0x74, 0xd2, 0x0c, 0xc3, 0x98, 0x81, 0xc2, 0x13,
+ 0xee, 0x77, 0x0b, 0x10, 0x10, 0xe4, 0xbe, 0xa7,
+ 0x18, 0x84, 0x69, 0x77, 0xae, 0x11, 0x9f, 0x7a,
+ 0x02, 0x3a, 0xb5, 0x8c, 0xca, 0x0a, 0xd7, 0x52,
+ 0xaf, 0xe6, 0x56, 0xbb, 0x3c, 0x17, 0x25, 0x6a,
+ 0x9f, 0x6e, 0x9b, 0xf1, 0x9f, 0xdd, 0x5a, 0x38,
+ 0xfc, 0x82, 0xbb, 0xe8, 0x72, 0xc5, 0x53, 0x9e,
+ 0xdb, 0x60, 0x9e, 0xf4, 0xf7, 0x9c, 0x20, 0x3e,
+ 0xbb, 0x14, 0x0f, 0x2e, 0x58, 0x3c, 0xb2, 0xad,
+ 0x15, 0xb4, 0xaa, 0x5b, 0x65, 0x50, 0x16, 0xa8,
+ 0x44, 0x92, 0x77, 0xdb, 0xd4, 0x77, 0xef, 0x2c,
+ 0x8d, 0x6c, 0x01, 0x7d, 0xb7, 0x38, 0xb1, 0x8d,
+ 0xeb, 0x4a, 0x42, 0x7d, 0x19, 0x23, 0xce, 0x3f,
+ 0xf2, 0x62, 0x73, 0x57, 0x79, 0xa4, 0x18, 0xf2,
+ 0x0a, 0x28, 0x2d, 0xf9, 0x20, 0x14, 0x7b, 0xea,
+ 0xbe, 0x42, 0x1e, 0xe5, 0x31, 0x9d, 0x05, 0x68,
+};
+
+static const uint8_t aes_xts_256_vec5_ctxt[SECSIZE] = {
+ 0x26, 0x4d, 0x3c, 0xa8, 0x51, 0x21, 0x94, 0xfe,
+ 0xc3, 0x12, 0xc8, 0xc9, 0x89, 0x1f, 0x27, 0x9f,
+ 0xef, 0xdd, 0x60, 0x8d, 0x0c, 0x02, 0x7b, 0x60,
+ 0x48, 0x3a, 0x3f, 0xa8, 0x11, 0xd6, 0x5e, 0xe5,
+ 0x9d, 0x52, 0xd9, 0xe4, 0x0e, 0xc5, 0x67, 0x2d,
+ 0x81, 0x53, 0x2b, 0x38, 0xb6, 0xb0, 0x89, 0xce,
+ 0x95, 0x1f, 0x0f, 0x9c, 0x35, 0x59, 0x0b, 0x8b,
+ 0x97, 0x8d, 0x17, 0x52, 0x13, 0xf3, 0x29, 0xbb,
+ 0x1c, 0x2f, 0xd3, 0x0f, 0x2f, 0x7f, 0x30, 0x49,
+ 0x2a, 0x61, 0xa5, 0x32, 0xa7, 0x9f, 0x51, 0xd3,
+ 0x6f, 0x5e, 0x31, 0xa7, 0xc9, 0xa1, 0x2c, 0x28,
+ 0x60, 0x82, 0xff, 0x7d, 0x23, 0x94, 0xd1, 0x8f,
+ 0x78, 0x3e, 0x1a, 0x8e, 0x72, 0xc7, 0x22, 0xca,
+ 0xaa, 0xa5, 0x2d, 0x8f, 0x06, 0x56, 0x57, 0xd2,
+ 0x63, 0x1f, 0xd2, 0x5b, 0xfd, 0x8e, 0x5b, 0xaa,
+ 0xd6, 0xe5, 0x27, 0xd7, 0x63, 0x51, 0x75, 0x01,
+ 0xc6, 0x8c, 0x5e, 0xdc, 0x3c, 0xdd, 0x55, 0x43,
+ 0x5c, 0x53, 0x2d, 0x71, 0x25, 0xc8, 0x61, 0x4d,
+ 0xee, 0xd9, 0xad, 0xaa, 0x3a, 0xca, 0xde, 0x58,
+ 0x88, 0xb8, 0x7b, 0xef, 0x64, 0x1c, 0x4c, 0x99,
+ 0x4c, 0x80, 0x91, 0xb5, 0xbc, 0xd3, 0x87, 0xf3,
+ 0x96, 0x3f, 0xb5, 0xbc, 0x37, 0xaa, 0x92, 0x2f,
+ 0xbf, 0xe3, 0xdf, 0x4e, 0x5b, 0x91, 0x5e, 0x6e,
+ 0xb5, 0x14, 0x71, 0x7b, 0xdd, 0x2a, 0x74, 0x07,
+ 0x9a, 0x50, 0x73, 0xf5, 0xc4, 0xbf, 0xd4, 0x6a,
+ 0xdf, 0x7d, 0x28, 0x2e, 0x7a, 0x39, 0x3a, 0x52,
+ 0x57, 0x9d, 0x11, 0xa0, 0x28, 0xda, 0x4d, 0x9c,
+ 0xd9, 0xc7, 0x71, 0x24, 0xf9, 0x64, 0x8e, 0xe3,
+ 0x83, 0xb1, 0xac, 0x76, 0x39, 0x30, 0xe7, 0x16,
+ 0x2a, 0x8d, 0x37, 0xf3, 0x50, 0xb2, 0xf7, 0x4b,
+ 0x84, 0x72, 0xcf, 0x09, 0x90, 0x20, 0x63, 0xc6,
+ 0xb3, 0x2e, 0x8c, 0x2d, 0x92, 0x90, 0xce, 0xfb,
+ 0xd7, 0x34, 0x6d, 0x1c, 0x77, 0x9a, 0x0d, 0xf5,
+ 0x0e, 0xdc, 0xde, 0x45, 0x31, 0xda, 0x07, 0xb0,
+ 0x99, 0xc6, 0x38, 0xe8, 0x3a, 0x75, 0x59, 0x44,
+ 0xdf, 0x2a, 0xef, 0x1a, 0xa3, 0x17, 0x52, 0xfd,
+ 0x32, 0x3d, 0xcb, 0x71, 0x0f, 0xb4, 0xbf, 0xbb,
+ 0x9d, 0x22, 0xb9, 0x25, 0xbc, 0x35, 0x77, 0xe1,
+ 0xb8, 0x94, 0x9e, 0x72, 0x9a, 0x90, 0xbb, 0xaf,
+ 0xea, 0xcf, 0x7f, 0x78, 0x79, 0xe7, 0xb1, 0x14,
+ 0x7e, 0x28, 0xba, 0x0b, 0xae, 0x94, 0x0d, 0xb7,
+ 0x95, 0xa6, 0x1b, 0x15, 0xec, 0xf4, 0xdf, 0x8d,
+ 0xb0, 0x7b, 0x82, 0x4b, 0xb0, 0x62, 0x80, 0x2c,
+ 0xc9, 0x8a, 0x95, 0x45, 0xbb, 0x2a, 0xae, 0xed,
+ 0x77, 0xcb, 0x3f, 0xc6, 0xdb, 0x15, 0xdc, 0xd7,
+ 0xd8, 0x0d, 0x7d, 0x5b, 0xc4, 0x06, 0xc4, 0x97,
+ 0x0a, 0x34, 0x78, 0xad, 0xa8, 0x89, 0x9b, 0x32,
+ 0x91, 0x98, 0xeb, 0x61, 0xc1, 0x93, 0xfb, 0x62,
+ 0x75, 0xaa, 0x8c, 0xa3, 0x40, 0x34, 0x4a, 0x75,
+ 0xa8, 0x62, 0xae, 0xbe, 0x92, 0xee, 0xe1, 0xce,
+ 0x03, 0x2f, 0xd9, 0x50, 0xb4, 0x7d, 0x77, 0x04,
+ 0xa3, 0x87, 0x69, 0x23, 0xb4, 0xad, 0x62, 0x84,
+ 0x4b, 0xf4, 0xa0, 0x9c, 0x4d, 0xbe, 0x8b, 0x43,
+ 0x97, 0x18, 0x4b, 0x74, 0x71, 0x36, 0x0c, 0x95,
+ 0x64, 0x88, 0x0a, 0xed, 0xdd, 0xb9, 0xba, 0xa4,
+ 0xaf, 0x2e, 0x75, 0x39, 0x4b, 0x08, 0xcd, 0x32,
+ 0xff, 0x47, 0x9c, 0x57, 0xa0, 0x7d, 0x3e, 0xab,
+ 0x5d, 0x54, 0xde, 0x5f, 0x97, 0x38, 0xb8, 0xd2,
+ 0x7f, 0x27, 0xa9, 0xf0, 0xab, 0x11, 0x79, 0x9d,
+ 0x7b, 0x7f, 0xfe, 0xfb, 0x27, 0x04, 0xc9, 0x5c,
+ 0x6a, 0xd1, 0x2c, 0x39, 0xf1, 0xe8, 0x67, 0xa4,
+ 0xb7, 0xb1, 0xd7, 0x81, 0x8a, 0x4b, 0x75, 0x3d,
+ 0xfd, 0x2a, 0x89, 0xcc, 0xb4, 0x5e, 0x00, 0x1a,
+ 0x03, 0xa8, 0x67, 0xb1, 0x87, 0xf2, 0x25, 0xdd,
+};
+
+/*
+ * Vector 6 from IEEE 1619/D16, blkno 2.
+ */
+static const uint8_t aes_xts_256_vec6_ptxt[SECSIZE] = {
+ 0x26, 0x4d, 0x3c, 0xa8, 0x51, 0x21, 0x94, 0xfe,
+ 0xc3, 0x12, 0xc8, 0xc9, 0x89, 0x1f, 0x27, 0x9f,
+ 0xef, 0xdd, 0x60, 0x8d, 0x0c, 0x02, 0x7b, 0x60,
+ 0x48, 0x3a, 0x3f, 0xa8, 0x11, 0xd6, 0x5e, 0xe5,
+ 0x9d, 0x52, 0xd9, 0xe4, 0x0e, 0xc5, 0x67, 0x2d,
+ 0x81, 0x53, 0x2b, 0x38, 0xb6, 0xb0, 0x89, 0xce,
+ 0x95, 0x1f, 0x0f, 0x9c, 0x35, 0x59, 0x0b, 0x8b,
+ 0x97, 0x8d, 0x17, 0x52, 0x13, 0xf3, 0x29, 0xbb,
+ 0x1c, 0x2f, 0xd3, 0x0f, 0x2f, 0x7f, 0x30, 0x49,
+ 0x2a, 0x61, 0xa5, 0x32, 0xa7, 0x9f, 0x51, 0xd3,
+ 0x6f, 0x5e, 0x31, 0xa7, 0xc9, 0xa1, 0x2c, 0x28,
+ 0x60, 0x82, 0xff, 0x7d, 0x23, 0x94, 0xd1, 0x8f,
+ 0x78, 0x3e, 0x1a, 0x8e, 0x72, 0xc7, 0x22, 0xca,
+ 0xaa, 0xa5, 0x2d, 0x8f, 0x06, 0x56, 0x57, 0xd2,
+ 0x63, 0x1f, 0xd2, 0x5b, 0xfd, 0x8e, 0x5b, 0xaa,
+ 0xd6, 0xe5, 0x27, 0xd7, 0x63, 0x51, 0x75, 0x01,
+ 0xc6, 0x8c, 0x5e, 0xdc, 0x3c, 0xdd, 0x55, 0x43,
+ 0x5c, 0x53, 0x2d, 0x71, 0x25, 0xc8, 0x61, 0x4d,
+ 0xee, 0xd9, 0xad, 0xaa, 0x3a, 0xca, 0xde, 0x58,
+ 0x88, 0xb8, 0x7b, 0xef, 0x64, 0x1c, 0x4c, 0x99,
+ 0x4c, 0x80, 0x91, 0xb5, 0xbc, 0xd3, 0x87, 0xf3,
+ 0x96, 0x3f, 0xb5, 0xbc, 0x37, 0xaa, 0x92, 0x2f,
+ 0xbf, 0xe3, 0xdf, 0x4e, 0x5b, 0x91, 0x5e, 0x6e,
+ 0xb5, 0x14, 0x71, 0x7b, 0xdd, 0x2a, 0x74, 0x07,
+ 0x9a, 0x50, 0x73, 0xf5, 0xc4, 0xbf, 0xd4, 0x6a,
+ 0xdf, 0x7d, 0x28, 0x2e, 0x7a, 0x39, 0x3a, 0x52,
+ 0x57, 0x9d, 0x11, 0xa0, 0x28, 0xda, 0x4d, 0x9c,
+ 0xd9, 0xc7, 0x71, 0x24, 0xf9, 0x64, 0x8e, 0xe3,
+ 0x83, 0xb1, 0xac, 0x76, 0x39, 0x30, 0xe7, 0x16,
+ 0x2a, 0x8d, 0x37, 0xf3, 0x50, 0xb2, 0xf7, 0x4b,
+ 0x84, 0x72, 0xcf, 0x09, 0x90, 0x20, 0x63, 0xc6,
+ 0xb3, 0x2e, 0x8c, 0x2d, 0x92, 0x90, 0xce, 0xfb,
+ 0xd7, 0x34, 0x6d, 0x1c, 0x77, 0x9a, 0x0d, 0xf5,
+ 0x0e, 0xdc, 0xde, 0x45, 0x31, 0xda, 0x07, 0xb0,
+ 0x99, 0xc6, 0x38, 0xe8, 0x3a, 0x75, 0x59, 0x44,
+ 0xdf, 0x2a, 0xef, 0x1a, 0xa3, 0x17, 0x52, 0xfd,
+ 0x32, 0x3d, 0xcb, 0x71, 0x0f, 0xb4, 0xbf, 0xbb,
+ 0x9d, 0x22, 0xb9, 0x25, 0xbc, 0x35, 0x77, 0xe1,
+ 0xb8, 0x94, 0x9e, 0x72, 0x9a, 0x90, 0xbb, 0xaf,
+ 0xea, 0xcf, 0x7f, 0x78, 0x79, 0xe7, 0xb1, 0x14,
+ 0x7e, 0x28, 0xba, 0x0b, 0xae, 0x94, 0x0d, 0xb7,
+ 0x95, 0xa6, 0x1b, 0x15, 0xec, 0xf4, 0xdf, 0x8d,
+ 0xb0, 0x7b, 0x82, 0x4b, 0xb0, 0x62, 0x80, 0x2c,
+ 0xc9, 0x8a, 0x95, 0x45, 0xbb, 0x2a, 0xae, 0xed,
+ 0x77, 0xcb, 0x3f, 0xc6, 0xdb, 0x15, 0xdc, 0xd7,
+ 0xd8, 0x0d, 0x7d, 0x5b, 0xc4, 0x06, 0xc4, 0x97,
+ 0x0a, 0x34, 0x78, 0xad, 0xa8, 0x89, 0x9b, 0x32,
+ 0x91, 0x98, 0xeb, 0x61, 0xc1, 0x93, 0xfb, 0x62,
+ 0x75, 0xaa, 0x8c, 0xa3, 0x40, 0x34, 0x4a, 0x75,
+ 0xa8, 0x62, 0xae, 0xbe, 0x92, 0xee, 0xe1, 0xce,
+ 0x03, 0x2f, 0xd9, 0x50, 0xb4, 0x7d, 0x77, 0x04,
+ 0xa3, 0x87, 0x69, 0x23, 0xb4, 0xad, 0x62, 0x84,
+ 0x4b, 0xf4, 0xa0, 0x9c, 0x4d, 0xbe, 0x8b, 0x43,
+ 0x97, 0x18, 0x4b, 0x74, 0x71, 0x36, 0x0c, 0x95,
+ 0x64, 0x88, 0x0a, 0xed, 0xdd, 0xb9, 0xba, 0xa4,
+ 0xaf, 0x2e, 0x75, 0x39, 0x4b, 0x08, 0xcd, 0x32,
+ 0xff, 0x47, 0x9c, 0x57, 0xa0, 0x7d, 0x3e, 0xab,
+ 0x5d, 0x54, 0xde, 0x5f, 0x97, 0x38, 0xb8, 0xd2,
+ 0x7f, 0x27, 0xa9, 0xf0, 0xab, 0x11, 0x79, 0x9d,
+ 0x7b, 0x7f, 0xfe, 0xfb, 0x27, 0x04, 0xc9, 0x5c,
+ 0x6a, 0xd1, 0x2c, 0x39, 0xf1, 0xe8, 0x67, 0xa4,
+ 0xb7, 0xb1, 0xd7, 0x81, 0x8a, 0x4b, 0x75, 0x3d,
+ 0xfd, 0x2a, 0x89, 0xcc, 0xb4, 0x5e, 0x00, 0x1a,
+ 0x03, 0xa8, 0x67, 0xb1, 0x87, 0xf2, 0x25, 0xdd,
+};
+
+static const uint8_t aes_xts_256_vec6_ctxt[SECSIZE] = {
+ 0xfa, 0x76, 0x2a, 0x36, 0x80, 0xb7, 0x60, 0x07,
+ 0x92, 0x8e, 0xd4, 0xa4, 0xf4, 0x9a, 0x94, 0x56,
+ 0x03, 0x1b, 0x70, 0x47, 0x82, 0xe6, 0x5e, 0x16,
+ 0xce, 0xcb, 0x54, 0xed, 0x7d, 0x01, 0x7b, 0x5e,
+ 0x18, 0xab, 0xd6, 0x7b, 0x33, 0x8e, 0x81, 0x07,
+ 0x8f, 0x21, 0xed, 0xb7, 0x86, 0x8d, 0x90, 0x1e,
+ 0xbe, 0x9c, 0x73, 0x1a, 0x7c, 0x18, 0xb5, 0xe6,
+ 0xde, 0xc1, 0xd6, 0xa7, 0x2e, 0x07, 0x8a, 0xc9,
+ 0xa4, 0x26, 0x2f, 0x86, 0x0b, 0xee, 0xfa, 0x14,
+ 0xf4, 0xe8, 0x21, 0x01, 0x82, 0x72, 0xe4, 0x11,
+ 0xa9, 0x51, 0x50, 0x2b, 0x6e, 0x79, 0x06, 0x6e,
+ 0x84, 0x25, 0x2c, 0x33, 0x46, 0xf3, 0xaa, 0x62,
+ 0x34, 0x43, 0x51, 0xa2, 0x91, 0xd4, 0xbe, 0xdc,
+ 0x7a, 0x07, 0x61, 0x8b, 0xde, 0xa2, 0xaf, 0x63,
+ 0x14, 0x5c, 0xc7, 0xa4, 0xb8, 0xd4, 0x07, 0x06,
+ 0x91, 0xae, 0x89, 0x0c, 0xd6, 0x57, 0x33, 0xe7,
+ 0x94, 0x6e, 0x90, 0x21, 0xa1, 0xdf, 0xfc, 0x4c,
+ 0x59, 0xf1, 0x59, 0x42, 0x5e, 0xe6, 0xd5, 0x0c,
+ 0xa9, 0xb1, 0x35, 0xfa, 0x61, 0x62, 0xce, 0xa1,
+ 0x8a, 0x93, 0x98, 0x38, 0xdc, 0x00, 0x0f, 0xb3,
+ 0x86, 0xfa, 0xd0, 0x86, 0xac, 0xce, 0x5a, 0xc0,
+ 0x7c, 0xb2, 0xec, 0xe7, 0xfd, 0x58, 0x0b, 0x00,
+ 0xcf, 0xa5, 0xe9, 0x85, 0x89, 0x63, 0x1d, 0xc2,
+ 0x5e, 0x8e, 0x2a, 0x3d, 0xaf, 0x2f, 0xfd, 0xec,
+ 0x26, 0x53, 0x16, 0x59, 0x91, 0x2c, 0x9d, 0x8f,
+ 0x7a, 0x15, 0xe5, 0x86, 0x5e, 0xa8, 0xfb, 0x58,
+ 0x16, 0xd6, 0x20, 0x70, 0x52, 0xbd, 0x71, 0x28,
+ 0xcd, 0x74, 0x3c, 0x12, 0xc8, 0x11, 0x87, 0x91,
+ 0xa4, 0x73, 0x68, 0x11, 0x93, 0x5e, 0xb9, 0x82,
+ 0xa5, 0x32, 0x34, 0x9e, 0x31, 0xdd, 0x40, 0x1e,
+ 0x0b, 0x66, 0x0a, 0x56, 0x8c, 0xb1, 0xa4, 0x71,
+ 0x1f, 0x55, 0x2f, 0x55, 0xde, 0xd5, 0x9f, 0x1f,
+ 0x15, 0xbf, 0x71, 0x96, 0xb3, 0xca, 0x12, 0xa9,
+ 0x1e, 0x48, 0x8e, 0xf5, 0x9d, 0x64, 0xf3, 0xa0,
+ 0x2b, 0xf4, 0x52, 0x39, 0x49, 0x9a, 0xc6, 0x17,
+ 0x6a, 0xe3, 0x21, 0xc4, 0xa2, 0x11, 0xec, 0x54,
+ 0x53, 0x65, 0x97, 0x1c, 0x5d, 0x3f, 0x4f, 0x09,
+ 0xd4, 0xeb, 0x13, 0x9b, 0xfd, 0xf2, 0x07, 0x3d,
+ 0x33, 0x18, 0x0b, 0x21, 0x00, 0x2b, 0x65, 0xcc,
+ 0x98, 0x65, 0xe7, 0x6c, 0xb2, 0x4c, 0xd9, 0x2c,
+ 0x87, 0x4c, 0x24, 0xc1, 0x83, 0x50, 0x39, 0x9a,
+ 0x93, 0x6a, 0xb3, 0x63, 0x70, 0x79, 0x29, 0x5d,
+ 0x76, 0xc4, 0x17, 0x77, 0x6b, 0x94, 0xef, 0xce,
+ 0x3a, 0x0e, 0xf7, 0x20, 0x6b, 0x15, 0x11, 0x05,
+ 0x19, 0x65, 0x5c, 0x95, 0x6c, 0xbd, 0x8b, 0x24,
+ 0x89, 0x40, 0x5e, 0xe2, 0xb0, 0x9a, 0x6b, 0x6e,
+ 0xeb, 0xe0, 0xc5, 0x37, 0x90, 0xa1, 0x2a, 0x89,
+ 0x98, 0x37, 0x8b, 0x33, 0xa5, 0xb7, 0x11, 0x59,
+ 0x62, 0x5f, 0x4b, 0xa4, 0x9d, 0x2a, 0x2f, 0xdb,
+ 0xa5, 0x9f, 0xbf, 0x08, 0x97, 0xbc, 0x7a, 0xab,
+ 0xd8, 0xd7, 0x07, 0xdc, 0x14, 0x0a, 0x80, 0xf0,
+ 0xf3, 0x09, 0xf8, 0x35, 0xd3, 0xda, 0x54, 0xab,
+ 0x58, 0x4e, 0x50, 0x1d, 0xfa, 0x0e, 0xe9, 0x77,
+ 0xfe, 0xc5, 0x43, 0xf7, 0x41, 0x86, 0xa8, 0x02,
+ 0xb9, 0xa3, 0x7a, 0xdb, 0x3e, 0x82, 0x91, 0xec,
+ 0xa0, 0x4d, 0x66, 0x52, 0x0d, 0x22, 0x9e, 0x60,
+ 0x40, 0x1e, 0x72, 0x82, 0xbe, 0xf4, 0x86, 0xae,
+ 0x05, 0x9a, 0xa7, 0x06, 0x96, 0xe0, 0xe3, 0x05,
+ 0xd7, 0x77, 0x14, 0x0a, 0x7a, 0x88, 0x3e, 0xcd,
+ 0xcb, 0x69, 0xb9, 0xff, 0x93, 0x8e, 0x8a, 0x42,
+ 0x31, 0x86, 0x4c, 0x69, 0xca, 0x2c, 0x20, 0x43,
+ 0xbe, 0xd0, 0x07, 0xff, 0x3e, 0x60, 0x5e, 0x01,
+ 0x4b, 0xcf, 0x51, 0x81, 0x38, 0xdc, 0x3a, 0x25,
+ 0xc5, 0xe2, 0x36, 0x17, 0x1a, 0x2d, 0x01, 0xd6,
+};
+
+/*
+ * Vector 7 from IEEE 1619/D16, blkno 0xfd.
+ */
+static const uint8_t aes_xts_256_vec7_ptxt[SECSIZE] = {
+ 0x8e, 0x41, 0xb7, 0x8c, 0x39, 0x0b, 0x5a, 0xf9,
+ 0xd7, 0x58, 0xbb, 0x21, 0x4a, 0x67, 0xe9, 0xf6,
+ 0xbf, 0x77, 0x27, 0xb0, 0x9a, 0xc6, 0x12, 0x40,
+ 0x84, 0xc3, 0x76, 0x11, 0x39, 0x8f, 0xa4, 0x5d,
+ 0xaa, 0xd9, 0x48, 0x68, 0x60, 0x0e, 0xd3, 0x91,
+ 0xfb, 0x1a, 0xcd, 0x48, 0x57, 0xa9, 0x5b, 0x46,
+ 0x6e, 0x62, 0xef, 0x9f, 0x4b, 0x37, 0x72, 0x44,
+ 0xd1, 0xc1, 0x52, 0xe7, 0xb3, 0x0d, 0x73, 0x1a,
+ 0xad, 0x30, 0xc7, 0x16, 0xd2, 0x14, 0xb7, 0x07,
+ 0xae, 0xd9, 0x9e, 0xb5, 0xb5, 0xe5, 0x80, 0xb3,
+ 0xe8, 0x87, 0xcf, 0x74, 0x97, 0x46, 0x56, 0x51,
+ 0xd4, 0xb6, 0x0e, 0x60, 0x42, 0x05, 0x1d, 0xa3,
+ 0x69, 0x3c, 0x3b, 0x78, 0xc1, 0x44, 0x89, 0x54,
+ 0x3b, 0xe8, 0xb6, 0xad, 0x0b, 0xa6, 0x29, 0x56,
+ 0x5b, 0xba, 0x20, 0x23, 0x13, 0xba, 0x7b, 0x0d,
+ 0x0c, 0x94, 0xa3, 0x25, 0x2b, 0x67, 0x6f, 0x46,
+ 0xcc, 0x02, 0xce, 0x0f, 0x8a, 0x7d, 0x34, 0xc0,
+ 0xed, 0x22, 0x91, 0x29, 0x67, 0x3c, 0x1f, 0x61,
+ 0xae, 0xd5, 0x79, 0xd0, 0x8a, 0x92, 0x03, 0xa2,
+ 0x5a, 0xac, 0x3a, 0x77, 0xe9, 0xdb, 0x60, 0x26,
+ 0x79, 0x96, 0xdb, 0x38, 0xdf, 0x63, 0x73, 0x56,
+ 0xd9, 0xdc, 0xd1, 0x63, 0x2e, 0x36, 0x99, 0x39,
+ 0xf2, 0xa2, 0x9d, 0x89, 0x34, 0x5c, 0x66, 0xe0,
+ 0x50, 0x66, 0xf1, 0xa3, 0x67, 0x7a, 0xef, 0x18,
+ 0xde, 0xa4, 0x11, 0x3f, 0xae, 0xb6, 0x29, 0xe4,
+ 0x67, 0x21, 0xa6, 0x6d, 0x0a, 0x7e, 0x78, 0x5d,
+ 0x3e, 0x29, 0xaf, 0x25, 0x94, 0xeb, 0x67, 0xdf,
+ 0xa9, 0x82, 0xaf, 0xfe, 0x0a, 0xac, 0x05, 0x8f,
+ 0x6e, 0x15, 0x86, 0x42, 0x69, 0xb1, 0x35, 0x41,
+ 0x82, 0x61, 0xfc, 0x3a, 0xfb, 0x08, 0x94, 0x72,
+ 0xcf, 0x68, 0xc4, 0x5d, 0xd7, 0xf2, 0x31, 0xc6,
+ 0x24, 0x9b, 0xa0, 0x25, 0x5e, 0x1e, 0x03, 0x38,
+ 0x33, 0xfc, 0x4d, 0x00, 0xa3, 0xfe, 0x02, 0x13,
+ 0x2d, 0x7b, 0xc3, 0x87, 0x36, 0x14, 0xb8, 0xae,
+ 0xe3, 0x42, 0x73, 0x58, 0x1e, 0xa0, 0x32, 0x5c,
+ 0x81, 0xf0, 0x27, 0x0a, 0xff, 0xa1, 0x36, 0x41,
+ 0xd0, 0x52, 0xd3, 0x6f, 0x07, 0x57, 0xd4, 0x84,
+ 0x01, 0x43, 0x54, 0xd0, 0x2d, 0x68, 0x83, 0xca,
+ 0x15, 0xc2, 0x4d, 0x8c, 0x39, 0x56, 0xb1, 0xbd,
+ 0x02, 0x7b, 0xcf, 0x41, 0xf1, 0x51, 0xfd, 0x80,
+ 0x23, 0xc5, 0x34, 0x0e, 0x56, 0x06, 0xf3, 0x7e,
+ 0x90, 0xfd, 0xb8, 0x7c, 0x86, 0xfb, 0x4f, 0xa6,
+ 0x34, 0xb3, 0x71, 0x8a, 0x30, 0xba, 0xce, 0x06,
+ 0xa6, 0x6e, 0xaf, 0x8f, 0x63, 0xc4, 0xaa, 0x3b,
+ 0x63, 0x78, 0x26, 0xa8, 0x7f, 0xe8, 0xcf, 0xa4,
+ 0x42, 0x82, 0xe9, 0x2c, 0xb1, 0x61, 0x5a, 0xf3,
+ 0xa2, 0x8e, 0x53, 0xbc, 0x74, 0xc7, 0xcb, 0xa1,
+ 0xa0, 0x97, 0x7b, 0xe9, 0x06, 0x5d, 0x0c, 0x1a,
+ 0x5d, 0xec, 0x6c, 0x54, 0xae, 0x38, 0xd3, 0x7f,
+ 0x37, 0xaa, 0x35, 0x28, 0x3e, 0x04, 0x8e, 0x55,
+ 0x30, 0xa8, 0x5c, 0x4e, 0x7a, 0x29, 0xd7, 0xb9,
+ 0x2e, 0xc0, 0xc3, 0x16, 0x9c, 0xdf, 0x2a, 0x80,
+ 0x5c, 0x76, 0x04, 0xbc, 0xe6, 0x00, 0x49, 0xb9,
+ 0xfb, 0x7b, 0x8e, 0xaa, 0xc1, 0x0f, 0x51, 0xae,
+ 0x23, 0x79, 0x4c, 0xeb, 0xa6, 0x8b, 0xb5, 0x81,
+ 0x12, 0xe2, 0x93, 0xb9, 0xb6, 0x92, 0xca, 0x72,
+ 0x1b, 0x37, 0xc6, 0x62, 0xf8, 0x57, 0x4e, 0xd4,
+ 0xdb, 0xa6, 0xf8, 0x8e, 0x17, 0x08, 0x81, 0xc8,
+ 0x2c, 0xdd, 0xc1, 0x03, 0x4a, 0x0c, 0xa7, 0xe2,
+ 0x84, 0xbf, 0x09, 0x62, 0xb6, 0xb2, 0x62, 0x92,
+ 0xd8, 0x36, 0xfa, 0x9f, 0x73, 0xc1, 0xac, 0x77,
+ 0x0e, 0xef, 0x0f, 0x2d, 0x3a, 0x1e, 0xaf, 0x61,
+ 0xd3, 0xe0, 0x35, 0x55, 0xfd, 0x42, 0x4e, 0xed,
+ 0xd6, 0x7e, 0x18, 0xa1, 0x80, 0x94, 0xf8, 0x88,
+};
+
+static const uint8_t aes_xts_256_vec7_ctxt[SECSIZE] = {
+ 0xd5, 0x5f, 0x68, 0x4f, 0x81, 0xf4, 0x42, 0x6e,
+ 0x9f, 0xde, 0x92, 0xa5, 0xff, 0x02, 0xdf, 0x2a,
+ 0xc8, 0x96, 0xaf, 0x63, 0x96, 0x28, 0x88, 0xa9,
+ 0x79, 0x10, 0xc1, 0x37, 0x9e, 0x20, 0xb0, 0xa3,
+ 0xb1, 0xdb, 0x61, 0x3f, 0xb7, 0xfe, 0x2e, 0x07,
+ 0x00, 0x43, 0x29, 0xea, 0x5c, 0x22, 0xbf, 0xd3,
+ 0x3e, 0x3d, 0xbe, 0x4c, 0xf5, 0x8c, 0xc6, 0x08,
+ 0xc2, 0xc2, 0x6c, 0x19, 0xa2, 0xe2, 0xfe, 0x22,
+ 0xf9, 0x87, 0x32, 0xc2, 0xb5, 0xcb, 0x84, 0x4c,
+ 0xc6, 0xc0, 0x70, 0x2d, 0x91, 0xe1, 0xd5, 0x0f,
+ 0xc4, 0x38, 0x2a, 0x7e, 0xba, 0x56, 0x35, 0xcd,
+ 0x60, 0x24, 0x32, 0xa2, 0x30, 0x6a, 0xc4, 0xce,
+ 0x82, 0xf8, 0xd7, 0x0c, 0x8d, 0x9b, 0xc1, 0x5f,
+ 0x91, 0x8f, 0xe7, 0x1e, 0x74, 0xc6, 0x22, 0xd5,
+ 0xcf, 0x71, 0x17, 0x8b, 0xf6, 0xe0, 0xb9, 0xcc,
+ 0x9f, 0x2b, 0x41, 0xdd, 0x8d, 0xbe, 0x44, 0x1c,
+ 0x41, 0xcd, 0x0c, 0x73, 0xa6, 0xdc, 0x47, 0xa3,
+ 0x48, 0xf6, 0x70, 0x2f, 0x9d, 0x0e, 0x9b, 0x1b,
+ 0x14, 0x31, 0xe9, 0x48, 0xe2, 0x99, 0xb9, 0xec,
+ 0x22, 0x72, 0xab, 0x2c, 0x5f, 0x0c, 0x7b, 0xe8,
+ 0x6a, 0xff, 0xa5, 0xde, 0xc8, 0x7a, 0x0b, 0xee,
+ 0x81, 0xd3, 0xd5, 0x00, 0x07, 0xed, 0xaa, 0x2b,
+ 0xcf, 0xcc, 0xb3, 0x56, 0x05, 0x15, 0x5f, 0xf3,
+ 0x6e, 0xd8, 0xed, 0xd4, 0xa4, 0x0d, 0xcd, 0x4b,
+ 0x24, 0x3a, 0xcd, 0x11, 0xb2, 0xb9, 0x87, 0xbd,
+ 0xbf, 0xaf, 0x91, 0xa7, 0xca, 0xc2, 0x7e, 0x9c,
+ 0x5a, 0xea, 0x52, 0x5e, 0xe5, 0x3d, 0xe7, 0xb2,
+ 0xd3, 0x33, 0x2c, 0x86, 0x44, 0x40, 0x2b, 0x82,
+ 0x3e, 0x94, 0xa7, 0xdb, 0x26, 0x27, 0x6d, 0x2d,
+ 0x23, 0xaa, 0x07, 0x18, 0x0f, 0x76, 0xb4, 0xfd,
+ 0x29, 0xb9, 0xc0, 0x82, 0x30, 0x99, 0xc9, 0xd6,
+ 0x2c, 0x51, 0x98, 0x80, 0xae, 0xe7, 0xe9, 0x69,
+ 0x76, 0x17, 0xc1, 0x49, 0x7d, 0x47, 0xbf, 0x3e,
+ 0x57, 0x19, 0x50, 0x31, 0x14, 0x21, 0xb6, 0xb7,
+ 0x34, 0xd3, 0x8b, 0x0d, 0xb9, 0x1e, 0xb8, 0x53,
+ 0x31, 0xb9, 0x1e, 0xa9, 0xf6, 0x15, 0x30, 0xf5,
+ 0x45, 0x12, 0xa5, 0xa5, 0x2a, 0x4b, 0xad, 0x58,
+ 0x9e, 0xb6, 0x97, 0x81, 0xd5, 0x37, 0xf2, 0x32,
+ 0x97, 0xbb, 0x45, 0x9b, 0xda, 0xd2, 0x94, 0x8a,
+ 0x29, 0xe1, 0x55, 0x0b, 0xf4, 0x78, 0x7e, 0x0b,
+ 0xe9, 0x5b, 0xb1, 0x73, 0xcf, 0x5f, 0xab, 0x17,
+ 0xda, 0xb7, 0xa1, 0x3a, 0x05, 0x2a, 0x63, 0x45,
+ 0x3d, 0x97, 0xcc, 0xec, 0x1a, 0x32, 0x19, 0x54,
+ 0x88, 0x6b, 0x7a, 0x12, 0x99, 0xfa, 0xae, 0xec,
+ 0xae, 0x35, 0xc6, 0xea, 0xac, 0xa7, 0x53, 0xb0,
+ 0x41, 0xb5, 0xe5, 0xf0, 0x93, 0xbf, 0x83, 0x39,
+ 0x7f, 0xd2, 0x1d, 0xd6, 0xb3, 0x01, 0x20, 0x66,
+ 0xfc, 0xc0, 0x58, 0xcc, 0x32, 0xc3, 0xb0, 0x9d,
+ 0x75, 0x62, 0xde, 0xe2, 0x95, 0x09, 0xb5, 0x83,
+ 0x93, 0x92, 0xc9, 0xff, 0x05, 0xf5, 0x1f, 0x31,
+ 0x66, 0xaa, 0xac, 0x4a, 0xc5, 0xf2, 0x38, 0x03,
+ 0x8a, 0x30, 0x45, 0xe6, 0xf7, 0x2e, 0x48, 0xef,
+ 0x0f, 0xe8, 0xbc, 0x67, 0x5e, 0x82, 0xc3, 0x18,
+ 0xa2, 0x68, 0xe4, 0x39, 0x70, 0x27, 0x1b, 0xf1,
+ 0x19, 0xb8, 0x1b, 0xf6, 0xa9, 0x82, 0x74, 0x65,
+ 0x54, 0xf8, 0x4e, 0x72, 0xb9, 0xf0, 0x02, 0x80,
+ 0xa3, 0x20, 0xa0, 0x81, 0x42, 0x92, 0x3c, 0x23,
+ 0xc8, 0x83, 0x42, 0x3f, 0xf9, 0x49, 0x82, 0x7f,
+ 0x29, 0xbb, 0xac, 0xdc, 0x1c, 0xcd, 0xb0, 0x49,
+ 0x38, 0xce, 0x60, 0x98, 0xc9, 0x5b, 0xa6, 0xb3,
+ 0x25, 0x28, 0xf4, 0xef, 0x78, 0xee, 0xd7, 0x78,
+ 0xb2, 0xe1, 0x22, 0xdd, 0xfd, 0x1c, 0xbd, 0xd1,
+ 0x1d, 0x1c, 0x0a, 0x67, 0x83, 0xe0, 0x11, 0xfc,
+ 0x53, 0x6d, 0x63, 0xd0, 0x53, 0x26, 0x06, 0x37,
+};
+
+/*
+ * Vector 8 from IEEE 1619/D16, blkno 0xfe.
+ */
+static const uint8_t aes_xts_256_vec8_ptxt[SECSIZE] = {
+ 0xd5, 0x5f, 0x68, 0x4f, 0x81, 0xf4, 0x42, 0x6e,
+ 0x9f, 0xde, 0x92, 0xa5, 0xff, 0x02, 0xdf, 0x2a,
+ 0xc8, 0x96, 0xaf, 0x63, 0x96, 0x28, 0x88, 0xa9,
+ 0x79, 0x10, 0xc1, 0x37, 0x9e, 0x20, 0xb0, 0xa3,
+ 0xb1, 0xdb, 0x61, 0x3f, 0xb7, 0xfe, 0x2e, 0x07,
+ 0x00, 0x43, 0x29, 0xea, 0x5c, 0x22, 0xbf, 0xd3,
+ 0x3e, 0x3d, 0xbe, 0x4c, 0xf5, 0x8c, 0xc6, 0x08,
+ 0xc2, 0xc2, 0x6c, 0x19, 0xa2, 0xe2, 0xfe, 0x22,
+ 0xf9, 0x87, 0x32, 0xc2, 0xb5, 0xcb, 0x84, 0x4c,
+ 0xc6, 0xc0, 0x70, 0x2d, 0x91, 0xe1, 0xd5, 0x0f,
+ 0xc4, 0x38, 0x2a, 0x7e, 0xba, 0x56, 0x35, 0xcd,
+ 0x60, 0x24, 0x32, 0xa2, 0x30, 0x6a, 0xc4, 0xce,
+ 0x82, 0xf8, 0xd7, 0x0c, 0x8d, 0x9b, 0xc1, 0x5f,
+ 0x91, 0x8f, 0xe7, 0x1e, 0x74, 0xc6, 0x22, 0xd5,
+ 0xcf, 0x71, 0x17, 0x8b, 0xf6, 0xe0, 0xb9, 0xcc,
+ 0x9f, 0x2b, 0x41, 0xdd, 0x8d, 0xbe, 0x44, 0x1c,
+ 0x41, 0xcd, 0x0c, 0x73, 0xa6, 0xdc, 0x47, 0xa3,
+ 0x48, 0xf6, 0x70, 0x2f, 0x9d, 0x0e, 0x9b, 0x1b,
+ 0x14, 0x31, 0xe9, 0x48, 0xe2, 0x99, 0xb9, 0xec,
+ 0x22, 0x72, 0xab, 0x2c, 0x5f, 0x0c, 0x7b, 0xe8,
+ 0x6a, 0xff, 0xa5, 0xde, 0xc8, 0x7a, 0x0b, 0xee,
+ 0x81, 0xd3, 0xd5, 0x00, 0x07, 0xed, 0xaa, 0x2b,
+ 0xcf, 0xcc, 0xb3, 0x56, 0x05, 0x15, 0x5f, 0xf3,
+ 0x6e, 0xd8, 0xed, 0xd4, 0xa4, 0x0d, 0xcd, 0x4b,
+ 0x24, 0x3a, 0xcd, 0x11, 0xb2, 0xb9, 0x87, 0xbd,
+ 0xbf, 0xaf, 0x91, 0xa7, 0xca, 0xc2, 0x7e, 0x9c,
+ 0x5a, 0xea, 0x52, 0x5e, 0xe5, 0x3d, 0xe7, 0xb2,
+ 0xd3, 0x33, 0x2c, 0x86, 0x44, 0x40, 0x2b, 0x82,
+ 0x3e, 0x94, 0xa7, 0xdb, 0x26, 0x27, 0x6d, 0x2d,
+ 0x23, 0xaa, 0x07, 0x18, 0x0f, 0x76, 0xb4, 0xfd,
+ 0x29, 0xb9, 0xc0, 0x82, 0x30, 0x99, 0xc9, 0xd6,
+ 0x2c, 0x51, 0x98, 0x80, 0xae, 0xe7, 0xe9, 0x69,
+ 0x76, 0x17, 0xc1, 0x49, 0x7d, 0x47, 0xbf, 0x3e,
+ 0x57, 0x19, 0x50, 0x31, 0x14, 0x21, 0xb6, 0xb7,
+ 0x34, 0xd3, 0x8b, 0x0d, 0xb9, 0x1e, 0xb8, 0x53,
+ 0x31, 0xb9, 0x1e, 0xa9, 0xf6, 0x15, 0x30, 0xf5,
+ 0x45, 0x12, 0xa5, 0xa5, 0x2a, 0x4b, 0xad, 0x58,
+ 0x9e, 0xb6, 0x97, 0x81, 0xd5, 0x37, 0xf2, 0x32,
+ 0x97, 0xbb, 0x45, 0x9b, 0xda, 0xd2, 0x94, 0x8a,
+ 0x29, 0xe1, 0x55, 0x0b, 0xf4, 0x78, 0x7e, 0x0b,
+ 0xe9, 0x5b, 0xb1, 0x73, 0xcf, 0x5f, 0xab, 0x17,
+ 0xda, 0xb7, 0xa1, 0x3a, 0x05, 0x2a, 0x63, 0x45,
+ 0x3d, 0x97, 0xcc, 0xec, 0x1a, 0x32, 0x19, 0x54,
+ 0x88, 0x6b, 0x7a, 0x12, 0x99, 0xfa, 0xae, 0xec,
+ 0xae, 0x35, 0xc6, 0xea, 0xac, 0xa7, 0x53, 0xb0,
+ 0x41, 0xb5, 0xe5, 0xf0, 0x93, 0xbf, 0x83, 0x39,
+ 0x7f, 0xd2, 0x1d, 0xd6, 0xb3, 0x01, 0x20, 0x66,
+ 0xfc, 0xc0, 0x58, 0xcc, 0x32, 0xc3, 0xb0, 0x9d,
+ 0x75, 0x62, 0xde, 0xe2, 0x95, 0x09, 0xb5, 0x83,
+ 0x93, 0x92, 0xc9, 0xff, 0x05, 0xf5, 0x1f, 0x31,
+ 0x66, 0xaa, 0xac, 0x4a, 0xc5, 0xf2, 0x38, 0x03,
+ 0x8a, 0x30, 0x45, 0xe6, 0xf7, 0x2e, 0x48, 0xef,
+ 0x0f, 0xe8, 0xbc, 0x67, 0x5e, 0x82, 0xc3, 0x18,
+ 0xa2, 0x68, 0xe4, 0x39, 0x70, 0x27, 0x1b, 0xf1,
+ 0x19, 0xb8, 0x1b, 0xf6, 0xa9, 0x82, 0x74, 0x65,
+ 0x54, 0xf8, 0x4e, 0x72, 0xb9, 0xf0, 0x02, 0x80,
+ 0xa3, 0x20, 0xa0, 0x81, 0x42, 0x92, 0x3c, 0x23,
+ 0xc8, 0x83, 0x42, 0x3f, 0xf9, 0x49, 0x82, 0x7f,
+ 0x29, 0xbb, 0xac, 0xdc, 0x1c, 0xcd, 0xb0, 0x49,
+ 0x38, 0xce, 0x60, 0x98, 0xc9, 0x5b, 0xa6, 0xb3,
+ 0x25, 0x28, 0xf4, 0xef, 0x78, 0xee, 0xd7, 0x78,
+ 0xb2, 0xe1, 0x22, 0xdd, 0xfd, 0x1c, 0xbd, 0xd1,
+ 0x1d, 0x1c, 0x0a, 0x67, 0x83, 0xe0, 0x11, 0xfc,
+ 0x53, 0x6d, 0x63, 0xd0, 0x53, 0x26, 0x06, 0x37,
+};
+
+static const uint8_t aes_xts_256_vec8_ctxt[SECSIZE] = {
+ 0x72, 0xef, 0xc1, 0xeb, 0xfe, 0x1e, 0xe2, 0x59,
+ 0x75, 0xa6, 0xeb, 0x3a, 0xa8, 0x58, 0x9d, 0xda,
+ 0x2b, 0x26, 0x1f, 0x1c, 0x85, 0xbd, 0xab, 0x44,
+ 0x2a, 0x9e, 0x5b, 0x2d, 0xd1, 0xd7, 0xc3, 0x95,
+ 0x7a, 0x16, 0xfc, 0x08, 0xe5, 0x26, 0xd4, 0xb1,
+ 0x22, 0x3f, 0x1b, 0x12, 0x32, 0xa1, 0x1a, 0xf2,
+ 0x74, 0xc3, 0xd7, 0x0d, 0xac, 0x57, 0xf8, 0x3e,
+ 0x09, 0x83, 0xc4, 0x98, 0xf1, 0xa6, 0xf1, 0xae,
+ 0xcb, 0x02, 0x1c, 0x3e, 0x70, 0x08, 0x5a, 0x1e,
+ 0x52, 0x7f, 0x1c, 0xe4, 0x1e, 0xe5, 0x91, 0x1a,
+ 0x82, 0x02, 0x01, 0x61, 0x52, 0x9c, 0xd8, 0x27,
+ 0x73, 0x76, 0x2d, 0xaf, 0x54, 0x59, 0xde, 0x94,
+ 0xa0, 0xa8, 0x2a, 0xda, 0xe7, 0xe1, 0x70, 0x3c,
+ 0x80, 0x85, 0x43, 0xc2, 0x9e, 0xd6, 0xfb, 0x32,
+ 0xd9, 0xe0, 0x04, 0x32, 0x7c, 0x13, 0x55, 0x18,
+ 0x0c, 0x99, 0x5a, 0x07, 0x74, 0x14, 0x93, 0xa0,
+ 0x9c, 0x21, 0xba, 0x01, 0xa3, 0x87, 0x88, 0x2d,
+ 0xa4, 0xf6, 0x25, 0x34, 0xb8, 0x7b, 0xb1, 0x5d,
+ 0x60, 0xd1, 0x97, 0x20, 0x1c, 0x0f, 0xd3, 0xbf,
+ 0x30, 0xc1, 0x50, 0x0a, 0x3e, 0xcf, 0xec, 0xdd,
+ 0x66, 0xd8, 0x72, 0x1f, 0x90, 0xbc, 0xc4, 0xc1,
+ 0x7e, 0xe9, 0x25, 0xc6, 0x1b, 0x0a, 0x03, 0x72,
+ 0x7a, 0x9c, 0x0d, 0x5f, 0x5c, 0xa4, 0x62, 0xfb,
+ 0xfa, 0x0a, 0xf1, 0xc2, 0x51, 0x3a, 0x9d, 0x9d,
+ 0x4b, 0x53, 0x45, 0xbd, 0x27, 0xa5, 0xf6, 0xe6,
+ 0x53, 0xf7, 0x51, 0x69, 0x3e, 0x6b, 0x6a, 0x2b,
+ 0x8e, 0xad, 0x57, 0xd5, 0x11, 0xe0, 0x0e, 0x58,
+ 0xc4, 0x5b, 0x7b, 0x8d, 0x00, 0x5a, 0xf7, 0x92,
+ 0x88, 0xf5, 0xc7, 0xc2, 0x2f, 0xd4, 0xf1, 0xbf,
+ 0x7a, 0x89, 0x8b, 0x03, 0xa5, 0x63, 0x4c, 0x6a,
+ 0x1a, 0xe3, 0xf9, 0xfa, 0xe5, 0xde, 0x4f, 0x29,
+ 0x6a, 0x28, 0x96, 0xb2, 0x3e, 0x7e, 0xd4, 0x3e,
+ 0xd1, 0x4f, 0xa5, 0xa2, 0x80, 0x3f, 0x4d, 0x28,
+ 0xf0, 0xd3, 0xff, 0xcf, 0x24, 0x75, 0x76, 0x77,
+ 0xae, 0xbd, 0xb4, 0x7b, 0xb3, 0x88, 0x37, 0x87,
+ 0x08, 0x94, 0x8a, 0x8d, 0x41, 0x26, 0xed, 0x18,
+ 0x39, 0xe0, 0xda, 0x29, 0xa5, 0x37, 0xa8, 0xc1,
+ 0x98, 0xb3, 0xc6, 0x6a, 0xb0, 0x07, 0x12, 0xdd,
+ 0x26, 0x16, 0x74, 0xbf, 0x45, 0xa7, 0x3d, 0x67,
+ 0xf7, 0x69, 0x14, 0xf8, 0x30, 0xca, 0x01, 0x4b,
+ 0x65, 0x59, 0x6f, 0x27, 0xe4, 0xcf, 0x62, 0xde,
+ 0x66, 0x12, 0x5a, 0x55, 0x66, 0xdf, 0x99, 0x75,
+ 0x15, 0x56, 0x28, 0xb4, 0x00, 0xfb, 0xfb, 0x3a,
+ 0x29, 0x04, 0x0e, 0xd5, 0x0f, 0xaf, 0xfd, 0xbb,
+ 0x18, 0xae, 0xce, 0x7c, 0x5c, 0x44, 0x69, 0x32,
+ 0x60, 0xaa, 0xb3, 0x86, 0xc0, 0xa3, 0x7b, 0x11,
+ 0xb1, 0x14, 0xf1, 0xc4, 0x15, 0xae, 0xbb, 0x65,
+ 0x3b, 0xe4, 0x68, 0x17, 0x94, 0x28, 0xd4, 0x3a,
+ 0x4d, 0x8b, 0xc3, 0xec, 0x38, 0x81, 0x3e, 0xca,
+ 0x30, 0xa1, 0x3c, 0xf1, 0xbb, 0x18, 0xd5, 0x24,
+ 0xf1, 0x99, 0x2d, 0x44, 0xd8, 0xb1, 0xa4, 0x2e,
+ 0xa3, 0x0b, 0x22, 0xe6, 0xc9, 0x5b, 0x19, 0x9d,
+ 0x8d, 0x18, 0x2f, 0x88, 0x40, 0xb0, 0x9d, 0x05,
+ 0x95, 0x85, 0xc3, 0x1a, 0xd6, 0x91, 0xfa, 0x06,
+ 0x19, 0xff, 0x03, 0x8a, 0xca, 0x2c, 0x39, 0xa9,
+ 0x43, 0x42, 0x11, 0x57, 0x36, 0x17, 0x17, 0xc4,
+ 0x9d, 0x32, 0x20, 0x28, 0xa7, 0x46, 0x48, 0x11,
+ 0x3b, 0xd8, 0xc9, 0xd7, 0xec, 0x77, 0xcf, 0x3c,
+ 0x89, 0xc1, 0xec, 0x87, 0x18, 0xce, 0xff, 0x85,
+ 0x16, 0xd9, 0x6b, 0x34, 0xc3, 0xc6, 0x14, 0xf1,
+ 0x06, 0x99, 0xc9, 0xab, 0xc4, 0xed, 0x04, 0x11,
+ 0x50, 0x62, 0x23, 0xbe, 0xa1, 0x6a, 0xf3, 0x5c,
+ 0x88, 0x3a, 0xcc, 0xdb, 0xe1, 0x10, 0x4e, 0xef,
+ 0x0c, 0xfd, 0xb5, 0x4e, 0x12, 0xfb, 0x23, 0x0a,
+};
+
+/*
+ * Vector 9 from IEEE 1619/D16, blkno 0xff.
+ */
+static const uint8_t aes_xts_256_vec9_ptxt[SECSIZE] = {
+ 0x72, 0xef, 0xc1, 0xeb, 0xfe, 0x1e, 0xe2, 0x59,
+ 0x75, 0xa6, 0xeb, 0x3a, 0xa8, 0x58, 0x9d, 0xda,
+ 0x2b, 0x26, 0x1f, 0x1c, 0x85, 0xbd, 0xab, 0x44,
+ 0x2a, 0x9e, 0x5b, 0x2d, 0xd1, 0xd7, 0xc3, 0x95,
+ 0x7a, 0x16, 0xfc, 0x08, 0xe5, 0x26, 0xd4, 0xb1,
+ 0x22, 0x3f, 0x1b, 0x12, 0x32, 0xa1, 0x1a, 0xf2,
+ 0x74, 0xc3, 0xd7, 0x0d, 0xac, 0x57, 0xf8, 0x3e,
+ 0x09, 0x83, 0xc4, 0x98, 0xf1, 0xa6, 0xf1, 0xae,
+ 0xcb, 0x02, 0x1c, 0x3e, 0x70, 0x08, 0x5a, 0x1e,
+ 0x52, 0x7f, 0x1c, 0xe4, 0x1e, 0xe5, 0x91, 0x1a,
+ 0x82, 0x02, 0x01, 0x61, 0x52, 0x9c, 0xd8, 0x27,
+ 0x73, 0x76, 0x2d, 0xaf, 0x54, 0x59, 0xde, 0x94,
+ 0xa0, 0xa8, 0x2a, 0xda, 0xe7, 0xe1, 0x70, 0x3c,
+ 0x80, 0x85, 0x43, 0xc2, 0x9e, 0xd6, 0xfb, 0x32,
+ 0xd9, 0xe0, 0x04, 0x32, 0x7c, 0x13, 0x55, 0x18,
+ 0x0c, 0x99, 0x5a, 0x07, 0x74, 0x14, 0x93, 0xa0,
+ 0x9c, 0x21, 0xba, 0x01, 0xa3, 0x87, 0x88, 0x2d,
+ 0xa4, 0xf6, 0x25, 0x34, 0xb8, 0x7b, 0xb1, 0x5d,
+ 0x60, 0xd1, 0x97, 0x20, 0x1c, 0x0f, 0xd3, 0xbf,
+ 0x30, 0xc1, 0x50, 0x0a, 0x3e, 0xcf, 0xec, 0xdd,
+ 0x66, 0xd8, 0x72, 0x1f, 0x90, 0xbc, 0xc4, 0xc1,
+ 0x7e, 0xe9, 0x25, 0xc6, 0x1b, 0x0a, 0x03, 0x72,
+ 0x7a, 0x9c, 0x0d, 0x5f, 0x5c, 0xa4, 0x62, 0xfb,
+ 0xfa, 0x0a, 0xf1, 0xc2, 0x51, 0x3a, 0x9d, 0x9d,
+ 0x4b, 0x53, 0x45, 0xbd, 0x27, 0xa5, 0xf6, 0xe6,
+ 0x53, 0xf7, 0x51, 0x69, 0x3e, 0x6b, 0x6a, 0x2b,
+ 0x8e, 0xad, 0x57, 0xd5, 0x11, 0xe0, 0x0e, 0x58,
+ 0xc4, 0x5b, 0x7b, 0x8d, 0x00, 0x5a, 0xf7, 0x92,
+ 0x88, 0xf5, 0xc7, 0xc2, 0x2f, 0xd4, 0xf1, 0xbf,
+ 0x7a, 0x89, 0x8b, 0x03, 0xa5, 0x63, 0x4c, 0x6a,
+ 0x1a, 0xe3, 0xf9, 0xfa, 0xe5, 0xde, 0x4f, 0x29,
+ 0x6a, 0x28, 0x96, 0xb2, 0x3e, 0x7e, 0xd4, 0x3e,
+ 0xd1, 0x4f, 0xa5, 0xa2, 0x80, 0x3f, 0x4d, 0x28,
+ 0xf0, 0xd3, 0xff, 0xcf, 0x24, 0x75, 0x76, 0x77,
+ 0xae, 0xbd, 0xb4, 0x7b, 0xb3, 0x88, 0x37, 0x87,
+ 0x08, 0x94, 0x8a, 0x8d, 0x41, 0x26, 0xed, 0x18,
+ 0x39, 0xe0, 0xda, 0x29, 0xa5, 0x37, 0xa8, 0xc1,
+ 0x98, 0xb3, 0xc6, 0x6a, 0xb0, 0x07, 0x12, 0xdd,
+ 0x26, 0x16, 0x74, 0xbf, 0x45, 0xa7, 0x3d, 0x67,
+ 0xf7, 0x69, 0x14, 0xf8, 0x30, 0xca, 0x01, 0x4b,
+ 0x65, 0x59, 0x6f, 0x27, 0xe4, 0xcf, 0x62, 0xde,
+ 0x66, 0x12, 0x5a, 0x55, 0x66, 0xdf, 0x99, 0x75,
+ 0x15, 0x56, 0x28, 0xb4, 0x00, 0xfb, 0xfb, 0x3a,
+ 0x29, 0x04, 0x0e, 0xd5, 0x0f, 0xaf, 0xfd, 0xbb,
+ 0x18, 0xae, 0xce, 0x7c, 0x5c, 0x44, 0x69, 0x32,
+ 0x60, 0xaa, 0xb3, 0x86, 0xc0, 0xa3, 0x7b, 0x11,
+ 0xb1, 0x14, 0xf1, 0xc4, 0x15, 0xae, 0xbb, 0x65,
+ 0x3b, 0xe4, 0x68, 0x17, 0x94, 0x28, 0xd4, 0x3a,
+ 0x4d, 0x8b, 0xc3, 0xec, 0x38, 0x81, 0x3e, 0xca,
+ 0x30, 0xa1, 0x3c, 0xf1, 0xbb, 0x18, 0xd5, 0x24,
+ 0xf1, 0x99, 0x2d, 0x44, 0xd8, 0xb1, 0xa4, 0x2e,
+ 0xa3, 0x0b, 0x22, 0xe6, 0xc9, 0x5b, 0x19, 0x9d,
+ 0x8d, 0x18, 0x2f, 0x88, 0x40, 0xb0, 0x9d, 0x05,
+ 0x95, 0x85, 0xc3, 0x1a, 0xd6, 0x91, 0xfa, 0x06,
+ 0x19, 0xff, 0x03, 0x8a, 0xca, 0x2c, 0x39, 0xa9,
+ 0x43, 0x42, 0x11, 0x57, 0x36, 0x17, 0x17, 0xc4,
+ 0x9d, 0x32, 0x20, 0x28, 0xa7, 0x46, 0x48, 0x11,
+ 0x3b, 0xd8, 0xc9, 0xd7, 0xec, 0x77, 0xcf, 0x3c,
+ 0x89, 0xc1, 0xec, 0x87, 0x18, 0xce, 0xff, 0x85,
+ 0x16, 0xd9, 0x6b, 0x34, 0xc3, 0xc6, 0x14, 0xf1,
+ 0x06, 0x99, 0xc9, 0xab, 0xc4, 0xed, 0x04, 0x11,
+ 0x50, 0x62, 0x23, 0xbe, 0xa1, 0x6a, 0xf3, 0x5c,
+ 0x88, 0x3a, 0xcc, 0xdb, 0xe1, 0x10, 0x4e, 0xef,
+ 0x0c, 0xfd, 0xb5, 0x4e, 0x12, 0xfb, 0x23, 0x0a,
+};
+
+static const uint8_t aes_xts_256_vec9_ctxt[SECSIZE] = {
+ 0x32, 0x60, 0xae, 0x8d, 0xad, 0x1f, 0x4a, 0x32,
+ 0xc5, 0xca, 0xfe, 0x3a, 0xb0, 0xeb, 0x95, 0x54,
+ 0x9d, 0x46, 0x1a, 0x67, 0xce, 0xb9, 0xe5, 0xaa,
+ 0x2d, 0x3a, 0xfb, 0x62, 0xde, 0xce, 0x05, 0x53,
+ 0x19, 0x3b, 0xa5, 0x0c, 0x75, 0xbe, 0x25, 0x1e,
+ 0x08, 0xd1, 0xd0, 0x8f, 0x10, 0x88, 0x57, 0x6c,
+ 0x7e, 0xfd, 0xfa, 0xaf, 0x3f, 0x45, 0x95, 0x59,
+ 0x57, 0x1e, 0x12, 0x51, 0x17, 0x53, 0xb0, 0x7a,
+ 0xf0, 0x73, 0xf3, 0x5d, 0xa0, 0x6a, 0xf0, 0xce,
+ 0x0b, 0xbf, 0x6b, 0x8f, 0x5c, 0xcc, 0x5c, 0xea,
+ 0x50, 0x0e, 0xc1, 0xb2, 0x11, 0xbd, 0x51, 0xf6,
+ 0x3b, 0x60, 0x6b, 0xf6, 0x52, 0x87, 0x96, 0xca,
+ 0x12, 0x17, 0x3b, 0xa3, 0x9b, 0x89, 0x35, 0xee,
+ 0x44, 0xcc, 0xce, 0x64, 0x6f, 0x90, 0xa4, 0x5b,
+ 0xf9, 0xcc, 0xc5, 0x67, 0xf0, 0xac, 0xe1, 0x3d,
+ 0xc2, 0xd5, 0x3e, 0xbe, 0xed, 0xc8, 0x1f, 0x58,
+ 0xb2, 0xe4, 0x11, 0x79, 0xdd, 0xdf, 0x0d, 0x5a,
+ 0x5c, 0x42, 0xf5, 0xd8, 0x50, 0x6c, 0x1a, 0x5d,
+ 0x2f, 0x8f, 0x59, 0xf3, 0xea, 0x87, 0x3c, 0xbc,
+ 0xd0, 0xee, 0xc1, 0x9a, 0xcb, 0xf3, 0x25, 0x42,
+ 0x3b, 0xd3, 0xdc, 0xb8, 0xc2, 0xb1, 0xbf, 0x1d,
+ 0x1e, 0xae, 0xd0, 0xeb, 0xa7, 0xf0, 0x69, 0x8e,
+ 0x43, 0x14, 0xfb, 0xeb, 0x2f, 0x15, 0x66, 0xd1,
+ 0xb9, 0x25, 0x30, 0x08, 0xcb, 0xcc, 0xf4, 0x5a,
+ 0x2b, 0x0d, 0x9c, 0x5c, 0x9c, 0x21, 0x47, 0x4f,
+ 0x40, 0x76, 0xe0, 0x2b, 0xe2, 0x60, 0x50, 0xb9,
+ 0x9d, 0xee, 0x4f, 0xd6, 0x8a, 0x4c, 0xf8, 0x90,
+ 0xe4, 0x96, 0xe4, 0xfc, 0xae, 0x7b, 0x70, 0xf9,
+ 0x4e, 0xa5, 0xa9, 0x06, 0x2d, 0xa0, 0xda, 0xeb,
+ 0xa1, 0x99, 0x3d, 0x2c, 0xcd, 0x1d, 0xd3, 0xc2,
+ 0x44, 0xb8, 0x42, 0x88, 0x01, 0x49, 0x5a, 0x58,
+ 0xb2, 0x16, 0x54, 0x7e, 0x7e, 0x84, 0x7c, 0x46,
+ 0xd1, 0xd7, 0x56, 0x37, 0x7b, 0x62, 0x42, 0xd2,
+ 0xe5, 0xfb, 0x83, 0xbf, 0x75, 0x2b, 0x54, 0xe0,
+ 0xdf, 0x71, 0xe8, 0x89, 0xf3, 0xa2, 0xbb, 0x0f,
+ 0x4c, 0x10, 0x80, 0x5b, 0xf3, 0xc5, 0x90, 0x37,
+ 0x6e, 0x3c, 0x24, 0xe2, 0x2f, 0xf5, 0x7f, 0x7f,
+ 0xa9, 0x65, 0x57, 0x73, 0x75, 0x32, 0x5c, 0xea,
+ 0x5d, 0x92, 0x0d, 0xb9, 0x4b, 0x9c, 0x33, 0x6b,
+ 0x45, 0x5f, 0x6e, 0x89, 0x4c, 0x01, 0x86, 0x6f,
+ 0xe9, 0xfb, 0xb8, 0xc8, 0xd3, 0xf7, 0x0a, 0x29,
+ 0x57, 0x28, 0x5f, 0x6d, 0xfb, 0x5d, 0xcd, 0x8c,
+ 0xbf, 0x54, 0x78, 0x2f, 0x8f, 0xe7, 0x76, 0x6d,
+ 0x47, 0x23, 0x81, 0x99, 0x13, 0xac, 0x77, 0x34,
+ 0x21, 0xe3, 0xa3, 0x10, 0x95, 0x86, 0x6b, 0xad,
+ 0x22, 0xc8, 0x6a, 0x60, 0x36, 0xb2, 0x51, 0x8b,
+ 0x20, 0x59, 0xb4, 0x22, 0x9d, 0x18, 0xc8, 0xc2,
+ 0xcc, 0xbd, 0xf9, 0x06, 0xc6, 0xcc, 0x6e, 0x82,
+ 0x46, 0x4e, 0xe5, 0x7b, 0xdd, 0xb0, 0xbe, 0xbc,
+ 0xb1, 0xdc, 0x64, 0x53, 0x25, 0xbf, 0xb3, 0xe6,
+ 0x65, 0xef, 0x72, 0x51, 0x08, 0x2c, 0x88, 0xeb,
+ 0xb1, 0xcf, 0x20, 0x3b, 0xd7, 0x79, 0xfd, 0xd3,
+ 0x86, 0x75, 0x71, 0x3c, 0x8d, 0xaa, 0xdd, 0x17,
+ 0xe1, 0xca, 0xbe, 0xe4, 0x32, 0xb0, 0x97, 0x87,
+ 0xb6, 0xdd, 0xf3, 0x30, 0x4e, 0x38, 0xb7, 0x31,
+ 0xb4, 0x5d, 0xf5, 0xdf, 0x51, 0xb7, 0x8f, 0xcf,
+ 0xb3, 0xd3, 0x24, 0x66, 0x02, 0x8d, 0x0b, 0xa3,
+ 0x65, 0x55, 0xe7, 0xe1, 0x1a, 0xb0, 0xee, 0x06,
+ 0x66, 0x06, 0x1d, 0x16, 0x45, 0xd9, 0x62, 0x44,
+ 0x4b, 0xc4, 0x7a, 0x38, 0x18, 0x89, 0x30, 0xa8,
+ 0x4b, 0x4d, 0x56, 0x13, 0x95, 0xc7, 0x3c, 0x08,
+ 0x70, 0x21, 0x92, 0x7c, 0xa6, 0x38, 0xb7, 0xaf,
+ 0xc8, 0xa8, 0x67, 0x9c, 0xcb, 0x84, 0xc2, 0x65,
+ 0x55, 0x44, 0x0e, 0xc7, 0xf1, 0x04, 0x45, 0xcd,
+};
+
+const struct testvec aes_xts_256_vectors[] = {
+ {
+ .blkno = 0,
+ .ptxt = aes_xts_256_vec4_ptxt,
+ .ctxt = aes_xts_256_vec4_ctxt,
+ },
+ {
+ .blkno = 1,
+ .ptxt = aes_xts_256_vec5_ptxt,
+ .ctxt = aes_xts_256_vec5_ctxt,
+ },
+ {
+ .blkno = 2,
+ .ptxt = aes_xts_256_vec6_ptxt,
+ .ctxt = aes_xts_256_vec6_ctxt,
+ },
+ {
+ .blkno = 0xfd,
+ .ptxt = aes_xts_256_vec7_ptxt,
+ .ctxt = aes_xts_256_vec7_ctxt,
+ },
+ {
+ .blkno = 0xfe,
+ .ptxt = aes_xts_256_vec8_ptxt,
+ .ctxt = aes_xts_256_vec8_ctxt,
+ },
+ {
+ .blkno = 0xff,
+ .ptxt = aes_xts_256_vec9_ptxt,
+ .ctxt = aes_xts_256_vec9_ctxt,
+ },
+};
+
+/*
+ * Vector 10 from IEEE 1619/D16, blkno 0xff.
+ */
+static const uint8_t aes_xts_512_vec10_ptxt[SECSIZE] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
+ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
+ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
+ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
+ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
+};
+
+static const uint8_t aes_xts_512_vec10_ctxt[SECSIZE] = {
+ 0x1c, 0x3b, 0x3a, 0x10, 0x2f, 0x77, 0x03, 0x86,
+ 0xe4, 0x83, 0x6c, 0x99, 0xe3, 0x70, 0xcf, 0x9b,
+ 0xea, 0x00, 0x80, 0x3f, 0x5e, 0x48, 0x23, 0x57,
+ 0xa4, 0xae, 0x12, 0xd4, 0x14, 0xa3, 0xe6, 0x3b,
+ 0x5d, 0x31, 0xe2, 0x76, 0xf8, 0xfe, 0x4a, 0x8d,
+ 0x66, 0xb3, 0x17, 0xf9, 0xac, 0x68, 0x3f, 0x44,
+ 0x68, 0x0a, 0x86, 0xac, 0x35, 0xad, 0xfc, 0x33,
+ 0x45, 0xbe, 0xfe, 0xcb, 0x4b, 0xb1, 0x88, 0xfd,
+ 0x57, 0x76, 0x92, 0x6c, 0x49, 0xa3, 0x09, 0x5e,
+ 0xb1, 0x08, 0xfd, 0x10, 0x98, 0xba, 0xec, 0x70,
+ 0xaa, 0xa6, 0x69, 0x99, 0xa7, 0x2a, 0x82, 0xf2,
+ 0x7d, 0x84, 0x8b, 0x21, 0xd4, 0xa7, 0x41, 0xb0,
+ 0xc5, 0xcd, 0x4d, 0x5f, 0xff, 0x9d, 0xac, 0x89,
+ 0xae, 0xba, 0x12, 0x29, 0x61, 0xd0, 0x3a, 0x75,
+ 0x71, 0x23, 0xe9, 0x87, 0x0f, 0x8a, 0xcf, 0x10,
+ 0x00, 0x02, 0x08, 0x87, 0x89, 0x14, 0x29, 0xca,
+ 0x2a, 0x3e, 0x7a, 0x7d, 0x7d, 0xf7, 0xb1, 0x03,
+ 0x55, 0x16, 0x5c, 0x8b, 0x9a, 0x6d, 0x0a, 0x7d,
+ 0xe8, 0xb0, 0x62, 0xc4, 0x50, 0x0d, 0xc4, 0xcd,
+ 0x12, 0x0c, 0x0f, 0x74, 0x18, 0xda, 0xe3, 0xd0,
+ 0xb5, 0x78, 0x1c, 0x34, 0x80, 0x3f, 0xa7, 0x54,
+ 0x21, 0xc7, 0x90, 0xdf, 0xe1, 0xde, 0x18, 0x34,
+ 0xf2, 0x80, 0xd7, 0x66, 0x7b, 0x32, 0x7f, 0x6c,
+ 0x8c, 0xd7, 0x55, 0x7e, 0x12, 0xac, 0x3a, 0x0f,
+ 0x93, 0xec, 0x05, 0xc5, 0x2e, 0x04, 0x93, 0xef,
+ 0x31, 0xa1, 0x2d, 0x3d, 0x92, 0x60, 0xf7, 0x9a,
+ 0x28, 0x9d, 0x6a, 0x37, 0x9b, 0xc7, 0x0c, 0x50,
+ 0x84, 0x14, 0x73, 0xd1, 0xa8, 0xcc, 0x81, 0xec,
+ 0x58, 0x3e, 0x96, 0x45, 0xe0, 0x7b, 0x8d, 0x96,
+ 0x70, 0x65, 0x5b, 0xa5, 0xbb, 0xcf, 0xec, 0xc6,
+ 0xdc, 0x39, 0x66, 0x38, 0x0a, 0xd8, 0xfe, 0xcb,
+ 0x17, 0xb6, 0xba, 0x02, 0x46, 0x9a, 0x02, 0x0a,
+ 0x84, 0xe1, 0x8e, 0x8f, 0x84, 0x25, 0x20, 0x70,
+ 0xc1, 0x3e, 0x9f, 0x1f, 0x28, 0x9b, 0xe5, 0x4f,
+ 0xbc, 0x48, 0x14, 0x57, 0x77, 0x8f, 0x61, 0x60,
+ 0x15, 0xe1, 0x32, 0x7a, 0x02, 0xb1, 0x40, 0xf1,
+ 0x50, 0x5e, 0xb3, 0x09, 0x32, 0x6d, 0x68, 0x37,
+ 0x8f, 0x83, 0x74, 0x59, 0x5c, 0x84, 0x9d, 0x84,
+ 0xf4, 0xc3, 0x33, 0xec, 0x44, 0x23, 0x88, 0x51,
+ 0x43, 0xcb, 0x47, 0xbd, 0x71, 0xc5, 0xed, 0xae,
+ 0x9b, 0xe6, 0x9a, 0x2f, 0xfe, 0xce, 0xb1, 0xbe,
+ 0xc9, 0xde, 0x24, 0x4f, 0xbe, 0x15, 0x99, 0x2b,
+ 0x11, 0xb7, 0x7c, 0x04, 0x0f, 0x12, 0xbd, 0x8f,
+ 0x6a, 0x97, 0x5a, 0x44, 0xa0, 0xf9, 0x0c, 0x29,
+ 0xa9, 0xab, 0xc3, 0xd4, 0xd8, 0x93, 0x92, 0x72,
+ 0x84, 0xc5, 0x87, 0x54, 0xcc, 0xe2, 0x94, 0x52,
+ 0x9f, 0x86, 0x14, 0xdc, 0xd2, 0xab, 0xa9, 0x91,
+ 0x92, 0x5f, 0xed, 0xc4, 0xae, 0x74, 0xff, 0xac,
+ 0x6e, 0x33, 0x3b, 0x93, 0xeb, 0x4a, 0xff, 0x04,
+ 0x79, 0xda, 0x9a, 0x41, 0x0e, 0x44, 0x50, 0xe0,
+ 0xdd, 0x7a, 0xe4, 0xc6, 0xe2, 0x91, 0x09, 0x00,
+ 0x57, 0x5d, 0xa4, 0x01, 0xfc, 0x07, 0x05, 0x9f,
+ 0x64, 0x5e, 0x8b, 0x7e, 0x9b, 0xfd, 0xef, 0x33,
+ 0x94, 0x30, 0x54, 0xff, 0x84, 0x01, 0x14, 0x93,
+ 0xc2, 0x7b, 0x34, 0x29, 0xea, 0xed, 0xb4, 0xed,
+ 0x53, 0x76, 0x44, 0x1a, 0x77, 0xed, 0x43, 0x85,
+ 0x1a, 0xd7, 0x7f, 0x16, 0xf5, 0x41, 0xdf, 0xd2,
+ 0x69, 0xd5, 0x0d, 0x6a, 0x5f, 0x14, 0xfb, 0x0a,
+ 0xab, 0x1c, 0xbb, 0x4c, 0x15, 0x50, 0xbe, 0x97,
+ 0xf7, 0xab, 0x40, 0x66, 0x19, 0x3c, 0x4c, 0xaa,
+ 0x77, 0x3d, 0xad, 0x38, 0x01, 0x4b, 0xd2, 0x09,
+ 0x2f, 0xa7, 0x55, 0xc8, 0x24, 0xbb, 0x5e, 0x54,
+ 0xc4, 0xf3, 0x6f, 0xfd, 0xa9, 0xfc, 0xea, 0x70,
+ 0xb9, 0xc6, 0xe6, 0x93, 0xe1, 0x48, 0xc1, 0x51,
+};
+
+/*
+ * Vector 11 from IEEE 1619/D16, blkno 0xffff.
+ */
+static const uint8_t aes_xts_512_vec11_ptxt[SECSIZE] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
+ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
+ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
+ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
+ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
+};
+
+static const uint8_t aes_xts_512_vec11_ctxt[SECSIZE] = {
+ 0x77, 0xa3, 0x12, 0x51, 0x61, 0x8a, 0x15, 0xe6,
+ 0xb9, 0x2d, 0x1d, 0x66, 0xdf, 0xfe, 0x7b, 0x50,
+ 0xb5, 0x0b, 0xad, 0x55, 0x23, 0x05, 0xba, 0x02,
+ 0x17, 0xa6, 0x10, 0x68, 0x8e, 0xff, 0x7e, 0x11,
+ 0xe1, 0xd0, 0x22, 0x54, 0x38, 0xe0, 0x93, 0x24,
+ 0x2d, 0x6d, 0xb2, 0x74, 0xfd, 0xe8, 0x01, 0xd4,
+ 0xca, 0xe0, 0x6f, 0x20, 0x92, 0xc7, 0x28, 0xb2,
+ 0x47, 0x85, 0x59, 0xdf, 0x58, 0xe8, 0x37, 0xc2,
+ 0x46, 0x9e, 0xe4, 0xa4, 0xfa, 0x79, 0x4e, 0x4b,
+ 0xbc, 0x7f, 0x39, 0xbc, 0x02, 0x6e, 0x3c, 0xb7,
+ 0x2c, 0x33, 0xb0, 0x88, 0x8f, 0x25, 0xb4, 0xac,
+ 0xf5, 0x6a, 0x2a, 0x98, 0x04, 0xf1, 0xce, 0x6d,
+ 0x3d, 0x6e, 0x1d, 0xc6, 0xca, 0x18, 0x1d, 0x4b,
+ 0x54, 0x61, 0x79, 0xd5, 0x55, 0x44, 0xaa, 0x77,
+ 0x60, 0xc4, 0x0d, 0x06, 0x74, 0x15, 0x39, 0xc7,
+ 0xe3, 0xcd, 0x9d, 0x2f, 0x66, 0x50, 0xb2, 0x01,
+ 0x3f, 0xd0, 0xee, 0xb8, 0xc2, 0xb8, 0xe3, 0xd8,
+ 0xd2, 0x40, 0xcc, 0xae, 0x2d, 0x4c, 0x98, 0x32,
+ 0x0a, 0x74, 0x42, 0xe1, 0xc8, 0xd7, 0x5a, 0x42,
+ 0xd6, 0xe6, 0xcf, 0xa4, 0xc2, 0xec, 0xa1, 0x79,
+ 0x8d, 0x15, 0x8c, 0x7a, 0xec, 0xdf, 0x82, 0x49,
+ 0x0f, 0x24, 0xbb, 0x9b, 0x38, 0xe1, 0x08, 0xbc,
+ 0xda, 0x12, 0xc3, 0xfa, 0xf9, 0xa2, 0x11, 0x41,
+ 0xc3, 0x61, 0x3b, 0x58, 0x36, 0x7f, 0x92, 0x2a,
+ 0xaa, 0x26, 0xcd, 0x22, 0xf2, 0x3d, 0x70, 0x8d,
+ 0xae, 0x69, 0x9a, 0xd7, 0xcb, 0x40, 0xa8, 0xad,
+ 0x0b, 0x6e, 0x27, 0x84, 0x97, 0x3d, 0xcb, 0x60,
+ 0x56, 0x84, 0xc0, 0x8b, 0x8d, 0x69, 0x98, 0xc6,
+ 0x9a, 0xac, 0x04, 0x99, 0x21, 0x87, 0x1e, 0xbb,
+ 0x65, 0x30, 0x1a, 0x46, 0x19, 0xca, 0x80, 0xec,
+ 0xb4, 0x85, 0xa3, 0x1d, 0x74, 0x42, 0x23, 0xce,
+ 0x8d, 0xdc, 0x23, 0x94, 0x82, 0x8d, 0x6a, 0x80,
+ 0x47, 0x0c, 0x09, 0x2f, 0x5b, 0xa4, 0x13, 0xc3,
+ 0x37, 0x8f, 0xa6, 0x05, 0x42, 0x55, 0xc6, 0xf9,
+ 0xdf, 0x44, 0x95, 0x86, 0x2b, 0xbb, 0x32, 0x87,
+ 0x68, 0x1f, 0x93, 0x1b, 0x68, 0x7c, 0x88, 0x8a,
+ 0xbf, 0x84, 0x4d, 0xfc, 0x8f, 0xc2, 0x83, 0x31,
+ 0xe5, 0x79, 0x92, 0x8c, 0xd1, 0x2b, 0xd2, 0x39,
+ 0x0a, 0xe1, 0x23, 0xcf, 0x03, 0x81, 0x8d, 0x14,
+ 0xde, 0xdd, 0xe5, 0xc0, 0xc2, 0x4c, 0x8a, 0xb0,
+ 0x18, 0xbf, 0xca, 0x75, 0xca, 0x09, 0x6f, 0x2d,
+ 0x53, 0x1f, 0x3d, 0x16, 0x19, 0xe7, 0x85, 0xf1,
+ 0xad, 0xa4, 0x37, 0xca, 0xb9, 0x2e, 0x98, 0x05,
+ 0x58, 0xb3, 0xdc, 0xe1, 0x47, 0x4a, 0xfb, 0x75,
+ 0xbf, 0xed, 0xbf, 0x8f, 0xf5, 0x4c, 0xb2, 0x61,
+ 0x8e, 0x02, 0x44, 0xc9, 0xac, 0x0d, 0x3c, 0x66,
+ 0xfb, 0x51, 0x59, 0x8c, 0xd2, 0xdb, 0x11, 0xf9,
+ 0xbe, 0x39, 0x79, 0x1a, 0xbe, 0x44, 0x7c, 0x63,
+ 0x09, 0x4f, 0x7c, 0x45, 0x3b, 0x7f, 0xf8, 0x7c,
+ 0xb5, 0xbb, 0x36, 0xb7, 0xc7, 0x9e, 0xfb, 0x08,
+ 0x72, 0xd1, 0x70, 0x58, 0xb8, 0x3b, 0x15, 0xab,
+ 0x08, 0x66, 0xad, 0x8a, 0x58, 0x65, 0x6c, 0x5a,
+ 0x7e, 0x20, 0xdb, 0xdf, 0x30, 0x8b, 0x24, 0x61,
+ 0xd9, 0x7c, 0x0e, 0xc0, 0x02, 0x4a, 0x27, 0x15,
+ 0x05, 0x52, 0x49, 0xcf, 0x3b, 0x47, 0x8d, 0xdd,
+ 0x47, 0x40, 0xde, 0x65, 0x4f, 0x75, 0xca, 0x68,
+ 0x6e, 0x0d, 0x73, 0x45, 0xc6, 0x9e, 0xd5, 0x0c,
+ 0xdc, 0x2a, 0x8b, 0x33, 0x2b, 0x1f, 0x88, 0x24,
+ 0x10, 0x8a, 0xc9, 0x37, 0xeb, 0x05, 0x05, 0x85,
+ 0x60, 0x8e, 0xe7, 0x34, 0x09, 0x7f, 0xc0, 0x90,
+ 0x54, 0xfb, 0xff, 0x89, 0xee, 0xae, 0xea, 0x79,
+ 0x1f, 0x4a, 0x7a, 0xb1, 0xf9, 0x86, 0x82, 0x94,
+ 0xa4, 0xf9, 0xe2, 0x7b, 0x42, 0xaf, 0x81, 0x00,
+ 0xcb, 0x9d, 0x59, 0xce, 0xf9, 0x64, 0x58, 0x03,
+};
+
+const struct testvec aes_xts_512_vectors[] = {
+ {
+ .blkno = 0xff,
+ .ptxt = aes_xts_512_vec10_ptxt,
+ .ctxt = aes_xts_512_vec10_ctxt,
+ },
+ {
+ .blkno = 0xffff,
+ .ptxt = aes_xts_512_vec11_ptxt,
+ .ctxt = aes_xts_512_vec11_ctxt,
+ },
+};
+
+static int
+open_disk(const char *devpath, const char *imgpath, size_t size)
+{
+ int fd;
+
+ fd = open(imgpath, O_CREAT | O_RDWR | O_TRUNC, 0600);
+ if (fd < 0)
+ return -1;
+
+ if (ftruncate(fd, size) < 0)
+ goto fail;
+
+ if (rump_pub_etfs_register_withsize(devpath,
+ imgpath, RUMP_ETFS_BLK, 0, size) < 0) {
+ goto fail;
+ }
+
+ unlink(imgpath);
+ return fd;
+fail:
+ close(fd);
+ unlink(imgpath);
+ return -1;
+}
+
+static int
+open_cgd(int devno)
+{
+ char devpath[32];
+
+ sprintf(devpath, "/dev/rcgd%d%c", devno, getrawpartition() + 'a');
+
+ return rump_sys_open(devpath, O_RDWR, 0);
+}
+
+static int
+configure_cgd(int fd, const char *dkpath, const char *alg,
+ const char *ivmethod, const char *key, size_t keylen)
+{
+ struct cgd_ioctl ci;
+
+ memset(&ci, 0, sizeof(ci));
+ ci.ci_disk = dkpath;
+ ci.ci_alg = alg;
+ ci.ci_ivmethod = ivmethod;
+ ci.ci_keylen = 8 * keylen - 8; /* Exclude the NUL terminator. */
+ ci.ci_key = key;
+ ci.ci_blocksize = 128;
+
+ return rump_sys_ioctl(fd, CGDIOCSET, &ci);
+}
+
+static int
+unconfigure_cgd(int fd)
+{
+ struct cgd_ioctl ci;
+
+ return rump_sys_ioctl(fd, CGDIOCCLR, &ci);
+}
+
+static int
+write_testvec(int cgdfd, const struct testvec *tv)
+{
+ ssize_t written;
+
+ if (rump_sys_lseek(cgdfd, tv->blkno * SECSIZE, SEEK_SET) < 0)
+ return -1;
+
+ written = rump_sys_write(cgdfd, tv->ptxt, SECSIZE);
+ if (written < 0)
+ return -1;
+ if (written != SECSIZE) {
+ errno = EDOM; /* Something distinct. */
+ return -1;
+ }
+
+ return 0;
+}
+
+static int
+read_testvec(int cgdfd, const struct testvec *tv)
+{
+ char *buf;
+ int res = -1;
+
+ buf = malloc(SECSIZE);
+ if (buf == NULL)
+ return -1;
+
+ if (rump_sys_lseek(cgdfd, tv->blkno * SECSIZE, SEEK_SET) < 0)
+ goto fail;
+
+ if (rump_sys_read(cgdfd, buf, SECSIZE) != SECSIZE)
+ goto fail;
+
+ res = memcmp(buf, tv->ptxt, SECSIZE);
+fail:
+ free(buf);
+ return res;
+}
+
+static int
+check_testvec(int dkfd, const struct testvec *tv)
+{
+ char *buf;
+ int res = -1;
+
+ buf = malloc(SECSIZE);
+ if (buf == NULL)
+ return -1;
+
+ if (lseek(dkfd, tv->blkno * SECSIZE, SEEK_SET) < 0)
+ goto fail;
+
+ if (read(dkfd, buf, SECSIZE) != SECSIZE)
+ goto fail;
+
+ res = memcmp(buf, tv->ctxt, SECSIZE);
+fail:
+ free(buf);
+ return res;
+}
+
+ATF_TC(cgd_aes_cbc_128_encblkno1);
+ATF_TC_HEAD(cgd_aes_cbc_128_encblkno1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test aes-cbc with 128 bits key, ivmethod encblkno1");
+}
+
+ATF_TC_BODY(cgd_aes_cbc_128_encblkno1, tc)
+{
+ const char imgpath[] = "aes-cbc-128-encblkno1.img";
+ const char *dkpath = "/dev/dk";
+ const size_t dksize = 4 * SECSIZE; /* Last blkno is 3. */
+ int dkfd, cgdfd;
+
+ rump_init();
+
+ RL(dkfd = open_disk(dkpath, imgpath, dksize));
+
+ RL(cgdfd = open_cgd(0));
+ RL(configure_cgd(cgdfd, dkpath, "aes-cbc", "encblkno1",
+ aes_cbc_128_key, sizeof(aes_cbc_128_key)));
+
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_128_1_vectors[0]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_128_1_vectors[1]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_128_1_vectors[2]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_128_1_vectors[3]), -1);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(configure_cgd(cgdfd, dkpath, "aes-cbc", "encblkno1",
+ aes_cbc_128_key, sizeof(aes_cbc_128_key)));
+
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_128_1_vectors[0]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_128_1_vectors[1]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_128_1_vectors[2]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_128_1_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(rump_sys_close(cgdfd));
+
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_128_1_vectors[0]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_128_1_vectors[1]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_128_1_vectors[2]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_128_1_vectors[3]), 0);
+
+ RL(close(dkfd));
+}
+
+ATF_TC(cgd_aes_cbc_128_encblkno8);
+ATF_TC_HEAD(cgd_aes_cbc_128_encblkno8, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test aes-cbc with 128 bits key, ivmethod encblkno8");
+}
+
+ATF_TC_BODY(cgd_aes_cbc_128_encblkno8, tc)
+{
+ const char imgpath[] = "aes-cbc-128-encblkno8.img";
+ const char *dkpath = "/dev/dk";
+ const size_t dksize = 4 * SECSIZE; /* Last blkno is 3. */
+ int dkfd, cgdfd;
+
+ rump_init();
+
+ RL(dkfd = open_disk(dkpath, imgpath, dksize));
+
+ RL(cgdfd = open_cgd(0));
+ RL(configure_cgd(cgdfd, dkpath, "aes-cbc", "encblkno8",
+ aes_cbc_128_key, sizeof(aes_cbc_128_key)));
+
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_128_8_vectors[0]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_128_8_vectors[1]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_128_8_vectors[2]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_128_8_vectors[3]), -1);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(configure_cgd(cgdfd, dkpath, "aes-cbc", "encblkno8",
+ aes_cbc_128_key, sizeof(aes_cbc_128_key)));
+
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_128_8_vectors[0]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_128_8_vectors[1]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_128_8_vectors[2]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_128_8_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(rump_sys_close(cgdfd));
+
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_128_8_vectors[0]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_128_8_vectors[1]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_128_8_vectors[2]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_128_8_vectors[3]), 0);
+
+ RL(close(dkfd));
+}
+
+ATF_TC(cgd_aes_cbc_192_encblkno1);
+ATF_TC_HEAD(cgd_aes_cbc_192_encblkno1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test aes-cbc with 192 bits key, ivmethod encblkno1");
+}
+
+ATF_TC_BODY(cgd_aes_cbc_192_encblkno1, tc)
+{
+ const char imgpath[] = "aes-cbc-192-encblkno1.img";
+ const char *dkpath = "/dev/dk";
+ const size_t dksize = 4 * SECSIZE; /* Last blkno is 3. */
+ int dkfd, cgdfd;
+
+ rump_init();
+
+ RL(dkfd = open_disk(dkpath, imgpath, dksize));
+
+ RL(cgdfd = open_cgd(0));
+ RL(configure_cgd(cgdfd, dkpath, "aes-cbc", "encblkno1",
+ aes_cbc_192_key, sizeof(aes_cbc_192_key)));
+
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_192_1_vectors[0]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_192_1_vectors[1]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_192_1_vectors[2]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_192_1_vectors[3]), -1);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(configure_cgd(cgdfd, dkpath, "aes-cbc", "encblkno1",
+ aes_cbc_192_key, sizeof(aes_cbc_192_key)));
+
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_192_1_vectors[0]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_192_1_vectors[1]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_192_1_vectors[2]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_192_1_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(rump_sys_close(cgdfd));
+
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_192_1_vectors[0]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_192_1_vectors[1]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_192_1_vectors[2]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_192_1_vectors[3]), 0);
+
+ RL(close(dkfd));
+}
+
+ATF_TC(cgd_aes_cbc_192_encblkno8);
+ATF_TC_HEAD(cgd_aes_cbc_192_encblkno8, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test aes-cbc with 192 bits key, ivmethod encblkno8");
+}
+
+ATF_TC_BODY(cgd_aes_cbc_192_encblkno8, tc)
+{
+ const char imgpath[] = "aes-cbc-192-encblkno8.img";
+ const char *dkpath = "/dev/dk";
+ const size_t dksize = 4 * SECSIZE; /* Last blkno is 3. */
+ int dkfd, cgdfd;
+
+ rump_init();
+
+ RL(dkfd = open_disk(dkpath, imgpath, dksize));
+
+ RL(cgdfd = open_cgd(0));
+ RL(configure_cgd(cgdfd, dkpath, "aes-cbc", "encblkno8",
+ aes_cbc_192_key, sizeof(aes_cbc_192_key)));
+
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_192_8_vectors[0]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_192_8_vectors[1]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_192_8_vectors[2]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_192_8_vectors[3]), -1);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(configure_cgd(cgdfd, dkpath, "aes-cbc", "encblkno8",
+ aes_cbc_192_key, sizeof(aes_cbc_192_key)));
+
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_192_8_vectors[0]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_192_8_vectors[1]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_192_8_vectors[2]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_192_8_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(rump_sys_close(cgdfd));
+
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_192_8_vectors[0]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_192_8_vectors[1]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_192_8_vectors[2]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_192_8_vectors[3]), 0);
+
+ RL(close(dkfd));
+}
+
+ATF_TC(cgd_aes_cbc_256_encblkno1);
+ATF_TC_HEAD(cgd_aes_cbc_256_encblkno1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test aes-cbc with 256 bits key, ivmethod encblkno1");
+}
+
+ATF_TC_BODY(cgd_aes_cbc_256_encblkno1, tc)
+{
+ const char imgpath[] = "aes-cbc-256-encblkno1.img";
+ const char *dkpath = "/dev/dk";
+ const size_t dksize = 4 * SECSIZE; /* Last blkno is 3. */
+ int dkfd, cgdfd;
+
+ rump_init();
+
+ RL(dkfd = open_disk(dkpath, imgpath, dksize));
+
+ RL(cgdfd = open_cgd(0));
+ RL(configure_cgd(cgdfd, dkpath, "aes-cbc", "encblkno1",
+ aes_cbc_256_key, sizeof(aes_cbc_256_key)));
+
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_256_1_vectors[0]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_256_1_vectors[1]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_256_1_vectors[2]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_256_1_vectors[3]), -1);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(configure_cgd(cgdfd, dkpath, "aes-cbc", "encblkno1",
+ aes_cbc_256_key, sizeof(aes_cbc_256_key)));
+
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_256_1_vectors[0]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_256_1_vectors[1]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_256_1_vectors[2]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_256_1_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(rump_sys_close(cgdfd));
+
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_256_1_vectors[0]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_256_1_vectors[1]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_256_1_vectors[2]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_256_1_vectors[3]), 0);
+
+ RL(close(dkfd));
+}
+
+ATF_TC(cgd_aes_cbc_256_encblkno8);
+ATF_TC_HEAD(cgd_aes_cbc_256_encblkno8, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test aes-cbc with 256 bits key, ivmethod encblkno8");
+}
+
+ATF_TC_BODY(cgd_aes_cbc_256_encblkno8, tc)
+{
+ const char imgpath[] = "aes-cbc-256-encblkno8.img";
+ const char *dkpath = "/dev/dk";
+ const size_t dksize = 4 * SECSIZE; /* Last blkno is 3. */
+ int dkfd, cgdfd;
+
+ rump_init();
+
+ RL(dkfd = open_disk(dkpath, imgpath, dksize));
+
+ RL(cgdfd = open_cgd(0));
+ RL(configure_cgd(cgdfd, dkpath, "aes-cbc", "encblkno8",
+ aes_cbc_256_key, sizeof(aes_cbc_256_key)));
+
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_256_8_vectors[0]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_256_8_vectors[1]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_256_8_vectors[2]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_cbc_256_8_vectors[3]), -1);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(configure_cgd(cgdfd, dkpath, "aes-cbc", "encblkno8",
+ aes_cbc_256_key, sizeof(aes_cbc_256_key)));
+
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_256_8_vectors[0]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_256_8_vectors[1]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_256_8_vectors[2]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_cbc_256_8_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(rump_sys_close(cgdfd));
+
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_256_8_vectors[0]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_256_8_vectors[1]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_256_8_vectors[2]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_cbc_256_8_vectors[3]), 0);
+
+ RL(close(dkfd));
+}
+
+ATF_TC(cgd_aes_xts_256);
+ATF_TC_HEAD(cgd_aes_xts_256, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "Test aes-xts with 256 bits key");
+}
+
+ATF_TC_BODY(cgd_aes_xts_256, tc)
+{
+ const char imgpath[] = "aes-xts-256.img";
+ const char *dkpath = "/dev/dk";
+ const size_t dksize = 256 * SECSIZE; /* Last blkno is 0xff. */
+ int dkfd, cgdfd;
+
+ rump_init();
+
+ RL(dkfd = open_disk(dkpath, imgpath, dksize));
+
+ RL(cgdfd = open_cgd(0));
+ RL(configure_cgd(cgdfd, dkpath, "aes-xts", "encblkno1",
+ aes_xts_256_key, sizeof(aes_xts_256_key)));
+
+ CHECK_LIBC(write_testvec(cgdfd, &aes_xts_256_vectors[0]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_xts_256_vectors[1]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_xts_256_vectors[2]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_xts_256_vectors[3]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_xts_256_vectors[4]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_xts_256_vectors[5]), -1);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(configure_cgd(cgdfd, dkpath, "aes-xts", "encblkno1",
+ aes_xts_256_key, sizeof(aes_xts_256_key)));
+
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_xts_256_vectors[0]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_xts_256_vectors[1]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_xts_256_vectors[2]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_xts_256_vectors[3]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_xts_256_vectors[4]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_xts_256_vectors[5]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(rump_sys_close(cgdfd));
+
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_xts_256_vectors[0]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_xts_256_vectors[1]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_xts_256_vectors[2]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_xts_256_vectors[3]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_xts_256_vectors[4]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_xts_256_vectors[5]), 0);
+
+ RL(close(dkfd));
+}
+
+ATF_TC(cgd_aes_xts_512);
+ATF_TC_HEAD(cgd_aes_xts_512, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "Test aes-xts with 512 bits key");
+}
+
+ATF_TC_BODY(cgd_aes_xts_512, tc)
+{
+ const char imgpath[] = "aes-xts-512.img";
+ const char *dkpath = "/dev/dk";
+ const size_t dksize = 65536 * SECSIZE; /* Last blkno is 0xffff. */
+ int dkfd, cgdfd;
+
+ rump_init();
+
+ RL(dkfd = open_disk(dkpath, imgpath, dksize));
+
+ RL(cgdfd = open_cgd(0));
+ RL(configure_cgd(cgdfd, dkpath, "aes-xts", "encblkno1",
+ aes_xts_512_key, sizeof(aes_xts_512_key)));
+
+ CHECK_LIBC(write_testvec(cgdfd, &aes_xts_512_vectors[0]), -1);
+ CHECK_LIBC(write_testvec(cgdfd, &aes_xts_512_vectors[1]), -1);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(configure_cgd(cgdfd, dkpath, "aes-xts", "encblkno1",
+ aes_xts_512_key, sizeof(aes_xts_512_key)));
+
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_xts_512_vectors[0]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &aes_xts_512_vectors[1]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(rump_sys_close(cgdfd));
+
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_xts_512_vectors[0]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &aes_xts_512_vectors[1]), 0);
+
+ RL(close(dkfd));
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+
+ ATF_TP_ADD_TC(tp, cgd_aes_cbc_128_encblkno1);
+ ATF_TP_ADD_TC(tp, cgd_aes_cbc_128_encblkno8);
+ ATF_TP_ADD_TC(tp, cgd_aes_cbc_192_encblkno1);
+ ATF_TP_ADD_TC(tp, cgd_aes_cbc_192_encblkno8);
+ ATF_TP_ADD_TC(tp, cgd_aes_cbc_256_encblkno1);
+ ATF_TP_ADD_TC(tp, cgd_aes_cbc_256_encblkno8);
+ ATF_TP_ADD_TC(tp, cgd_aes_xts_256);
+ ATF_TP_ADD_TC(tp, cgd_aes_xts_512);
+
+ return atf_no_error();
+}
diff --git a/dev/cgd/t_cgd_blowfish.c b/dev/cgd/t_cgd_blowfish.c
new file mode 100644
index 000000000000..958ebaccf6ad
--- /dev/null
+++ b/dev/cgd/t_cgd_blowfish.c
@@ -0,0 +1,2341 @@
+/* $NetBSD: t_cgd_blowfish.c,v 1.1 2016/11/10 23:44:36 alnsn Exp $ */
+/*-
+ * Copyright (c) 2016 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Alexander Nasonov.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/sysctl.h>
+
+#include <atf-c.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <util.h>
+
+#include <dev/cgdvar.h>
+
+#include <rump/rump.h>
+#include <rump/rump_syscalls.h>
+
+#include "../../h_macros.h"
+
+#define SECSIZE 512
+
+struct testvec {
+ unsigned int blkno;
+ const uint8_t *ptxt; /* PlainText */
+ const uint8_t *ctxt; /* CipherText */
+};
+
+/*
+ * 128 bits Blowfish key, NUL terminated.
+ */
+static const char bf_cbc_128_key[17] = {
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
+ 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
+ 0
+};
+
+/*
+ * 256 bits Blowfish key, NUL terminated.
+ */
+static const char bf_cbc_256_key[33] = {
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
+ 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
+ 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, /* 89abcdef */
+ 0
+};
+
+/*
+ * 448 bits Blowfish key, NUL terminated.
+ */
+static const char bf_cbc_448_key[57] = {
+ 0x3a, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* :ABCDEFG */
+ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* HIJKLMNO */
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* PQRSTUVW */
+ 0x58, 0x59, 0x5a, 0x7e, 0x3a, 0x61, 0x62, 0x63, /* XYZ~:abc */
+ 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, /* defghijk */
+ 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, /* lmnopqrs */
+ 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x23, /* tuvwxyz# */
+ 0
+};
+
+static const uint8_t bf_cbc_ptxt[SECSIZE] =
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop"
+ " abcdefghijklmnop";
+
+/*
+ * IV method encblkno1, blkno 0.
+ */
+static const uint8_t bf_cbc_128_encblkno1_vec0_ctxt[SECSIZE] = {
+ 0x78, 0x53, 0x43, 0x2a, 0x08, 0xe7, 0x84, 0x3f,
+ 0xb7, 0x61, 0x9c, 0x17, 0x81, 0xbe, 0x38, 0xb9,
+ 0x65, 0x51, 0x68, 0xa2, 0x29, 0xd7, 0x45, 0xc9,
+ 0xee, 0x0e, 0x9d, 0xe1, 0x69, 0xc6, 0x81, 0x81,
+ 0xf3, 0x93, 0xa6, 0x62, 0xc9, 0x05, 0x2c, 0x1b,
+ 0x0e, 0x05, 0xca, 0xbe, 0x12, 0x25, 0x37, 0xd8,
+ 0x98, 0x66, 0xa2, 0xd3, 0xd0, 0x8a, 0x89, 0x57,
+ 0x44, 0x91, 0x1e, 0xe9, 0x07, 0x03, 0x5c, 0xa6,
+ 0xb8, 0x30, 0xf1, 0xc7, 0x8c, 0x66, 0x05, 0xb0,
+ 0x2d, 0xc3, 0xc3, 0xd7, 0x60, 0xef, 0x62, 0xd3,
+ 0x34, 0x9c, 0xa9, 0xd2, 0x0c, 0x1a, 0x9c, 0xfe,
+ 0x74, 0x92, 0xcb, 0x90, 0x80, 0xfa, 0x71, 0x5c,
+ 0xaa, 0x29, 0x39, 0xdd, 0x3b, 0x62, 0xa1, 0xfc,
+ 0xa5, 0x35, 0xcd, 0xa3, 0x29, 0x41, 0x1a, 0x03,
+ 0xf7, 0xe1, 0x36, 0xb2, 0xdc, 0x1a, 0xb3, 0x9f,
+ 0x46, 0xa3, 0xf7, 0xc3, 0xd1, 0x29, 0x83, 0xcf,
+ 0x0d, 0x88, 0x0b, 0xd1, 0xb7, 0xc7, 0x87, 0x21,
+ 0xb7, 0x1f, 0xe7, 0xa2, 0x8e, 0x5f, 0xac, 0x6b,
+ 0x49, 0x9c, 0x93, 0x6b, 0x6b, 0x05, 0x8e, 0x4c,
+ 0xbd, 0x31, 0x13, 0x5f, 0x4a, 0xd0, 0x35, 0x0c,
+ 0x67, 0x8f, 0xd0, 0x7a, 0xc9, 0xe3, 0x52, 0x50,
+ 0x4f, 0x85, 0x09, 0xf1, 0x27, 0xb9, 0xb1, 0x1e,
+ 0xe4, 0x6a, 0x40, 0xf6, 0x5a, 0x4f, 0x5f, 0xbe,
+ 0xab, 0xe8, 0xb9, 0xfe, 0xc7, 0x59, 0x6b, 0x0c,
+ 0xcd, 0x46, 0x4e, 0x90, 0x99, 0xde, 0xf7, 0x43,
+ 0xee, 0x6e, 0xb6, 0xae, 0xc2, 0x5e, 0x08, 0xbb,
+ 0xe9, 0x30, 0x2d, 0xb2, 0x91, 0xcc, 0xb9, 0xc7,
+ 0x58, 0xea, 0x35, 0xae, 0xa2, 0xd8, 0x00, 0xf7,
+ 0xc0, 0x01, 0xc4, 0x34, 0x2b, 0x34, 0x43, 0xae,
+ 0xeb, 0x27, 0xbc, 0x5c, 0x91, 0x5f, 0x5f, 0xc1,
+ 0x61, 0x42, 0x45, 0x68, 0x31, 0xbc, 0xce, 0xb4,
+ 0x5c, 0xd3, 0x07, 0xdf, 0x4e, 0x65, 0x65, 0x9d,
+ 0x2e, 0x26, 0x28, 0xfa, 0xcd, 0x53, 0x77, 0x6a,
+ 0x77, 0xad, 0x96, 0x0b, 0x1f, 0xea, 0x03, 0xc1,
+ 0xdd, 0xca, 0xe8, 0xfe, 0xe8, 0x36, 0x01, 0x61,
+ 0x72, 0xbb, 0xed, 0xfd, 0x8d, 0xa3, 0xc2, 0x15,
+ 0x25, 0x4f, 0xa6, 0x1a, 0x73, 0xbd, 0xcd, 0x45,
+ 0xdb, 0x08, 0x74, 0x7b, 0xa8, 0x23, 0xf5, 0x74,
+ 0x3a, 0x18, 0x6d, 0x90, 0xe0, 0xee, 0xae, 0xfe,
+ 0xc8, 0xac, 0x00, 0x57, 0xa0, 0xe1, 0xfe, 0x10,
+ 0xd4, 0xf3, 0xa8, 0x00, 0x21, 0x3e, 0x2d, 0xf9,
+ 0x63, 0xb8, 0xe9, 0xa4, 0x2e, 0xf4, 0x6b, 0xd7,
+ 0x5c, 0xfd, 0x32, 0x6c, 0x98, 0x05, 0x38, 0x0d,
+ 0x29, 0xb5, 0x5a, 0x5b, 0xbb, 0xad, 0xfd, 0x46,
+ 0x9b, 0x6a, 0x97, 0x4c, 0x24, 0xcc, 0x7d, 0x13,
+ 0x25, 0xe8, 0x2c, 0xb9, 0x13, 0x54, 0xb2, 0x8a,
+ 0x28, 0xa0, 0x8a, 0x3a, 0x4d, 0x7e, 0xf4, 0x29,
+ 0xff, 0xfb, 0x4f, 0xd6, 0x3d, 0xf7, 0xca, 0x89,
+ 0x2a, 0x58, 0x9e, 0x42, 0x00, 0x84, 0x61, 0x58,
+ 0x7c, 0x94, 0xf6, 0x50, 0x48, 0x2f, 0x34, 0x88,
+ 0xec, 0x97, 0xef, 0x8b, 0x2f, 0x84, 0xca, 0x23,
+ 0xe1, 0xb7, 0x63, 0x99, 0xdd, 0x4a, 0x76, 0xdd,
+ 0x20, 0xc1, 0xc2, 0x56, 0x45, 0xbe, 0x75, 0x9a,
+ 0x40, 0x72, 0xc8, 0xfb, 0x7e, 0x40, 0x6f, 0x38,
+ 0xfd, 0x76, 0xa4, 0x78, 0xf5, 0xde, 0x5f, 0xb7,
+ 0x4a, 0xa9, 0xaf, 0xad, 0xa1, 0x8b, 0x25, 0x8f,
+ 0xea, 0xb3, 0xeb, 0x54, 0x39, 0x5a, 0x91, 0xfe,
+ 0x86, 0x18, 0xea, 0x8c, 0xd6, 0x66, 0xd5, 0x85,
+ 0x02, 0x2b, 0x00, 0x5d, 0x7e, 0x13, 0xa0, 0x1f,
+ 0x73, 0x46, 0x6d, 0x5e, 0xcd, 0xe0, 0x82, 0x02,
+ 0x28, 0x88, 0xbf, 0x17, 0xfd, 0x9b, 0x83, 0x2c,
+ 0xa2, 0xf7, 0xde, 0x51, 0x98, 0x3f, 0xe2, 0x80,
+ 0x66, 0x14, 0x17, 0xce, 0x8e, 0x30, 0x2d, 0xe2,
+ 0x24, 0x68, 0x4b, 0xe5, 0xd1, 0x09, 0xfb, 0x6e,
+};
+
+/*
+ * IV method encblkno1, blkno 1.
+ */
+static const uint8_t bf_cbc_128_encblkno1_vec1_ctxt[SECSIZE] = {
+ 0x87, 0xae, 0x01, 0x52, 0xe8, 0xe9, 0xd9, 0xba,
+ 0xa9, 0x18, 0x31, 0x2c, 0x1b, 0xab, 0x57, 0xad,
+ 0x45, 0x0e, 0x25, 0x5e, 0x0e, 0x04, 0xfa, 0xdd,
+ 0xf1, 0x59, 0xe6, 0xea, 0x78, 0x4b, 0x83, 0x07,
+ 0x8b, 0x46, 0x91, 0x09, 0x58, 0x5a, 0x11, 0x2e,
+ 0x54, 0x43, 0xa4, 0xc1, 0x04, 0x35, 0xd3, 0x3e,
+ 0xc9, 0xc8, 0xf5, 0xff, 0x69, 0x1e, 0x57, 0x85,
+ 0x6d, 0x91, 0x03, 0xeb, 0x8c, 0xa7, 0xe8, 0xcc,
+ 0x3f, 0xac, 0xf9, 0x14, 0x1e, 0x88, 0x50, 0xa5,
+ 0x38, 0x66, 0xa9, 0xf4, 0xf5, 0xc6, 0x30, 0x95,
+ 0xd6, 0x84, 0x0b, 0x81, 0xf9, 0x51, 0x05, 0x80,
+ 0x9a, 0x89, 0xbf, 0xd4, 0x7d, 0x6a, 0x26, 0x59,
+ 0x29, 0x44, 0xe7, 0x1d, 0x0e, 0xad, 0x8c, 0xa0,
+ 0x93, 0xe9, 0x4b, 0x4b, 0x51, 0x46, 0xa5, 0x07,
+ 0xe8, 0xcb, 0x59, 0xf4, 0x63, 0xb5, 0x36, 0xdb,
+ 0xbc, 0x54, 0x2d, 0xec, 0xf0, 0x90, 0x3a, 0xa5,
+ 0xed, 0xc8, 0x28, 0x0e, 0xd3, 0x79, 0xb8, 0x57,
+ 0xc6, 0x7f, 0x02, 0x22, 0x5e, 0x80, 0xe8, 0x7f,
+ 0xdf, 0xa0, 0x0f, 0xbc, 0x98, 0x79, 0x6f, 0xd2,
+ 0xb0, 0xb2, 0x4f, 0x9b, 0x1a, 0x21, 0x8f, 0x63,
+ 0xce, 0x54, 0x41, 0x64, 0xbf, 0xb9, 0xa7, 0x93,
+ 0xd6, 0x5b, 0x89, 0x86, 0xda, 0x90, 0x23, 0x2e,
+ 0x25, 0x35, 0x1a, 0x9a, 0xf5, 0x1e, 0x8f, 0xb4,
+ 0xe6, 0x66, 0x8e, 0x0e, 0x2d, 0x91, 0x06, 0x4b,
+ 0x3d, 0x4a, 0x97, 0xab, 0x9b, 0x92, 0x09, 0xaa,
+ 0x07, 0xbf, 0xc1, 0x7d, 0xe2, 0xbc, 0xd2, 0xf1,
+ 0x38, 0x8d, 0x02, 0x45, 0xc8, 0x13, 0x12, 0xda,
+ 0xaa, 0x53, 0xa2, 0x2c, 0x96, 0x69, 0x64, 0xce,
+ 0x86, 0xe4, 0x84, 0x56, 0xd0, 0xe5, 0x81, 0x99,
+ 0x27, 0xad, 0x86, 0x47, 0x5f, 0xaf, 0xa2, 0xa2,
+ 0x90, 0x7f, 0xe7, 0x86, 0xec, 0x7f, 0xf4, 0xa3,
+ 0xcd, 0x4f, 0x60, 0xcc, 0x1e, 0x35, 0x44, 0xe8,
+ 0xe9, 0x06, 0xaf, 0x5e, 0x53, 0x3d, 0x30, 0x91,
+ 0xfe, 0x44, 0x59, 0x66, 0x82, 0xc2, 0xea, 0x9f,
+ 0xc8, 0x3b, 0xe2, 0xe5, 0x58, 0xf7, 0x34, 0xd5,
+ 0x9e, 0xfc, 0x20, 0x84, 0x34, 0xaa, 0x4f, 0xe1,
+ 0xd4, 0x95, 0x76, 0x11, 0x59, 0x90, 0x90, 0xfd,
+ 0x4d, 0xf9, 0xb8, 0x41, 0xe1, 0xdb, 0x36, 0x05,
+ 0xe3, 0x0f, 0xa4, 0x4f, 0x0c, 0x61, 0x70, 0xa5,
+ 0x1b, 0xbf, 0xab, 0x65, 0x67, 0x75, 0x5c, 0x7d,
+ 0x46, 0x3b, 0x29, 0xd0, 0x3d, 0x06, 0x40, 0x25,
+ 0x47, 0x3e, 0x8d, 0x62, 0xf8, 0xd8, 0x08, 0xc1,
+ 0x03, 0x04, 0x4b, 0x5a, 0x40, 0x65, 0x84, 0x52,
+ 0x34, 0xa2, 0x4a, 0xcc, 0x3a, 0x9c, 0x1e, 0xbf,
+ 0x2d, 0xed, 0x08, 0x8b, 0xc3, 0x8f, 0x48, 0xba,
+ 0x06, 0x03, 0xea, 0x5b, 0xba, 0x6a, 0xac, 0x23,
+ 0x5a, 0x5e, 0x31, 0x08, 0x29, 0x69, 0x64, 0x44,
+ 0x1c, 0x31, 0xae, 0xb1, 0x86, 0x7b, 0x26, 0x89,
+ 0xa6, 0xbe, 0xef, 0x69, 0x81, 0xf7, 0x77, 0xd5,
+ 0x8e, 0x78, 0xa5, 0x11, 0x51, 0xca, 0xec, 0xd0,
+ 0x86, 0xa5, 0x33, 0xf3, 0x65, 0x5d, 0x04, 0xc5,
+ 0xd2, 0x17, 0x2a, 0xfe, 0x4a, 0x58, 0x0f, 0x98,
+ 0x61, 0xad, 0xc3, 0xb8, 0x5b, 0x45, 0xcc, 0x28,
+ 0x3d, 0x4d, 0x00, 0xf5, 0x4a, 0xe2, 0xbc, 0x6c,
+ 0x1b, 0x80, 0x7a, 0x2b, 0x40, 0xb8, 0x34, 0x0e,
+ 0x44, 0x53, 0x16, 0xda, 0x7c, 0x46, 0x8b, 0x42,
+ 0x5e, 0xa8, 0xe1, 0xb8, 0xf8, 0xcf, 0xff, 0x48,
+ 0xcf, 0x2c, 0x4c, 0x98, 0xdb, 0xe5, 0x55, 0xfe,
+ 0x45, 0xfa, 0xf8, 0xde, 0x72, 0xf9, 0x84, 0x3c,
+ 0xc0, 0x0c, 0x1f, 0x86, 0x97, 0x86, 0xb8, 0xfe,
+ 0x7d, 0xff, 0xa3, 0xaf, 0x68, 0x00, 0x66, 0x90,
+ 0xac, 0xb5, 0xd8, 0xde, 0x35, 0x01, 0xf7, 0xab,
+ 0xab, 0xe3, 0xe9, 0x85, 0x4c, 0x6f, 0xe6, 0xbc,
+ 0xce, 0x67, 0x4a, 0xbd, 0xad, 0x7b, 0xec, 0xa1,
+};
+
+/*
+ * IV method encblkno1, blkno 2.
+ */
+static const uint8_t bf_cbc_128_encblkno1_vec2_ctxt[SECSIZE] = {
+ 0x17, 0xdd, 0x0f, 0x4b, 0x28, 0x33, 0x03, 0x89,
+ 0x21, 0x7b, 0x67, 0x15, 0x15, 0x65, 0x08, 0x4f,
+ 0x65, 0x18, 0xa6, 0x4b, 0x62, 0xdb, 0x1e, 0xc2,
+ 0xaa, 0x82, 0xb6, 0x1d, 0xf7, 0x12, 0x9e, 0x73,
+ 0xfe, 0xac, 0x2f, 0x1e, 0x2b, 0xea, 0x3a, 0x4f,
+ 0xc3, 0x0a, 0x59, 0x80, 0x0d, 0x3d, 0xbc, 0x62,
+ 0x8d, 0x70, 0xef, 0x1b, 0xfb, 0xdc, 0x4e, 0xc4,
+ 0x97, 0xf4, 0x77, 0xb7, 0x25, 0x94, 0x13, 0x48,
+ 0xf2, 0x3d, 0x4c, 0xa7, 0xb8, 0x8c, 0xf5, 0x26,
+ 0xa4, 0x35, 0xeb, 0xa0, 0xe7, 0x68, 0xb0, 0x69,
+ 0xf4, 0xf6, 0x13, 0x3a, 0x57, 0xa3, 0xd2, 0x26,
+ 0xe6, 0x70, 0xd8, 0xd4, 0x05, 0xb5, 0x01, 0xda,
+ 0xc7, 0x4a, 0x79, 0x1a, 0x6d, 0xb6, 0xf6, 0xb5,
+ 0x7d, 0x9a, 0x5c, 0xf1, 0x6a, 0xf8, 0xd1, 0x0a,
+ 0xbc, 0xe7, 0xea, 0xb4, 0x99, 0x72, 0x19, 0x97,
+ 0x41, 0x4f, 0x14, 0x5f, 0xa3, 0xb3, 0x9b, 0x36,
+ 0x00, 0x08, 0x88, 0x8c, 0xce, 0x7f, 0x3a, 0x9b,
+ 0xb0, 0x24, 0x17, 0x95, 0xc4, 0x59, 0x30, 0x5d,
+ 0xc6, 0x92, 0x19, 0x12, 0x99, 0xb0, 0x08, 0xa6,
+ 0x04, 0xdb, 0xc6, 0xd5, 0x61, 0xe4, 0xe1, 0x68,
+ 0xa8, 0xd7, 0x07, 0xfe, 0x2f, 0x47, 0xea, 0x14,
+ 0xe5, 0xf7, 0x61, 0x9b, 0xbb, 0x98, 0xcb, 0x3b,
+ 0x8c, 0x41, 0xd1, 0x55, 0x59, 0xb2, 0x41, 0x61,
+ 0x8e, 0x60, 0x17, 0xcd, 0xe8, 0xf7, 0x1d, 0xbd,
+ 0x28, 0x5d, 0x1e, 0x15, 0x28, 0x80, 0x8c, 0x29,
+ 0x34, 0x96, 0x31, 0xda, 0xe1, 0x19, 0x88, 0xd5,
+ 0xe0, 0xc8, 0xb4, 0xaa, 0x04, 0x21, 0xf5, 0xef,
+ 0xfa, 0x0e, 0xc9, 0xa5, 0x88, 0x77, 0x49, 0xf4,
+ 0x02, 0x22, 0x0b, 0x8b, 0x5e, 0xe1, 0xab, 0xd4,
+ 0xb1, 0xb6, 0x48, 0x54, 0x96, 0x08, 0xaf, 0xa1,
+ 0x0b, 0xc0, 0xfe, 0x2a, 0x12, 0x36, 0x56, 0x85,
+ 0x6a, 0xf7, 0x3d, 0x82, 0xe6, 0xda, 0x5d, 0xfe,
+ 0x4f, 0x4f, 0xc9, 0x43, 0xdc, 0x0f, 0x53, 0x05,
+ 0x09, 0xd4, 0x9c, 0x2e, 0x6e, 0xf3, 0x52, 0x6a,
+ 0x10, 0xc6, 0x48, 0xb1, 0x54, 0x70, 0xab, 0x7c,
+ 0x31, 0xf6, 0x47, 0xef, 0x64, 0x5f, 0xff, 0x45,
+ 0x8c, 0x3f, 0x87, 0x3a, 0x2d, 0xa6, 0xaf, 0xb2,
+ 0x44, 0xdf, 0x80, 0x2e, 0x89, 0x4c, 0x94, 0x67,
+ 0xfc, 0x20, 0x98, 0xb4, 0xcf, 0x58, 0x1e, 0x33,
+ 0x55, 0x6a, 0x7c, 0x67, 0x5c, 0x28, 0x2f, 0x19,
+ 0x02, 0x14, 0x06, 0x93, 0x8c, 0x84, 0xae, 0x62,
+ 0x14, 0xf9, 0x87, 0xae, 0x85, 0xa3, 0x60, 0x26,
+ 0xfc, 0x8d, 0x04, 0x92, 0x27, 0xfe, 0x35, 0x7b,
+ 0x45, 0x9d, 0x4a, 0x86, 0x75, 0xa6, 0xb3, 0xa1,
+ 0x59, 0xe4, 0x4b, 0x1c, 0xd2, 0x71, 0x36, 0xfe,
+ 0x73, 0xed, 0x54, 0x0d, 0x9d, 0xde, 0x63, 0xb2,
+ 0xc0, 0x7c, 0xf2, 0xb3, 0x36, 0x62, 0x06, 0x1f,
+ 0xcd, 0x41, 0x92, 0x73, 0xbc, 0x11, 0x68, 0xc9,
+ 0x69, 0x20, 0xf9, 0xbb, 0x9a, 0xe9, 0x6c, 0x05,
+ 0xcf, 0x01, 0x57, 0xc4, 0x1d, 0x95, 0x5e, 0xe3,
+ 0xb7, 0x15, 0xde, 0xa7, 0xb5, 0x1a, 0x4e, 0x78,
+ 0x44, 0x5b, 0x9a, 0xee, 0x29, 0xe2, 0x22, 0x8b,
+ 0xe9, 0xe3, 0xe6, 0x70, 0x3e, 0xcb, 0x9f, 0x7f,
+ 0xc3, 0xd0, 0x2c, 0xdc, 0x55, 0xb4, 0x0d, 0x67,
+ 0xf5, 0xd8, 0xff, 0xbb, 0xb1, 0x02, 0xbf, 0xf6,
+ 0x33, 0x4e, 0x7a, 0x3a, 0x50, 0xb1, 0x01, 0x77,
+ 0x51, 0xef, 0xb5, 0x75, 0xb3, 0x66, 0xe8, 0xe6,
+ 0xd6, 0x53, 0x7d, 0x33, 0x51, 0x62, 0x5d, 0xf2,
+ 0x77, 0x02, 0x34, 0x42, 0xda, 0xee, 0xd9, 0xee,
+ 0x0b, 0x4d, 0x71, 0x5c, 0xc0, 0xec, 0xdd, 0xc0,
+ 0x34, 0x6f, 0xf4, 0x65, 0x32, 0xde, 0xc5, 0xb2,
+ 0x97, 0x60, 0x89, 0x4e, 0x3b, 0x0c, 0xf2, 0xa7,
+ 0x74, 0x61, 0xd7, 0xe4, 0xa6, 0x80, 0x78, 0x76,
+ 0xe5, 0x7d, 0xab, 0x96, 0x04, 0x00, 0x76, 0x22,
+};
+
+/*
+ * IV method encblkno1, blkno 3.
+ */
+static const uint8_t bf_cbc_128_encblkno1_vec3_ctxt[SECSIZE] = {
+ 0xdd, 0x8e, 0xce, 0x5b, 0xb8, 0x2a, 0xc8, 0x0e,
+ 0xd2, 0xbe, 0xcf, 0xa7, 0x2a, 0x5b, 0x0c, 0x1a,
+ 0xb2, 0x68, 0x5b, 0xe7, 0x53, 0xaf, 0xce, 0x56,
+ 0xfd, 0xbd, 0x73, 0x3c, 0x44, 0x02, 0x96, 0x57,
+ 0xaa, 0x47, 0x8d, 0xf1, 0x28, 0x59, 0xb6, 0xce,
+ 0xba, 0x1e, 0xc9, 0x78, 0x76, 0xdd, 0x43, 0x3a,
+ 0xbc, 0x43, 0x4c, 0x17, 0xd2, 0xba, 0xb1, 0xda,
+ 0xa8, 0xbf, 0x32, 0x25, 0xaa, 0xc0, 0xf7, 0xb6,
+ 0x72, 0x65, 0xe2, 0x67, 0xdb, 0xf0, 0xa8, 0x60,
+ 0xda, 0x9b, 0x70, 0xad, 0x8f, 0x1d, 0x34, 0x24,
+ 0x1a, 0xfd, 0x77, 0x2e, 0x1c, 0xb6, 0xc0, 0x6b,
+ 0xa0, 0x4b, 0x4a, 0xa0, 0xd5, 0x8b, 0xbb, 0xd4,
+ 0xcc, 0x7b, 0x4e, 0x4c, 0x71, 0x9a, 0x50, 0x12,
+ 0x36, 0xd4, 0xfd, 0x1f, 0xf1, 0xfc, 0x19, 0x31,
+ 0xec, 0x54, 0x24, 0xb4, 0x9f, 0xa9, 0xea, 0xd2,
+ 0x87, 0x11, 0x03, 0x29, 0xbb, 0x20, 0x20, 0x37,
+ 0xa0, 0xeb, 0x93, 0xa1, 0x60, 0x5f, 0x83, 0x9f,
+ 0x00, 0x09, 0xe4, 0x9c, 0x79, 0xcb, 0xfc, 0x4f,
+ 0x9e, 0xd2, 0x76, 0x9f, 0x56, 0x3b, 0x88, 0x1d,
+ 0x29, 0x8f, 0x36, 0x07, 0xf7, 0x7e, 0xf1, 0xa1,
+ 0xa4, 0x25, 0xfb, 0xa0, 0xbe, 0xc6, 0xa2, 0x76,
+ 0xd3, 0x59, 0x2a, 0x7f, 0xb7, 0x9b, 0xb8, 0x75,
+ 0xc7, 0xc1, 0xc0, 0xe9, 0x9b, 0x83, 0x16, 0x00,
+ 0xc8, 0x9c, 0x25, 0x2a, 0x8b, 0xd1, 0x8d, 0x16,
+ 0x9f, 0xd6, 0xd3, 0x03, 0x5b, 0xc7, 0x40, 0xac,
+ 0xb6, 0xf3, 0xbb, 0x22, 0xa3, 0x3e, 0x56, 0x55,
+ 0xdf, 0x06, 0x76, 0xe0, 0x7b, 0xd0, 0x52, 0x54,
+ 0x38, 0xb0, 0xaa, 0xab, 0x62, 0x31, 0xd1, 0x79,
+ 0x19, 0xec, 0x82, 0x36, 0x58, 0x31, 0xf9, 0x01,
+ 0xf9, 0x5e, 0xaf, 0x24, 0xb3, 0xc9, 0xb2, 0x30,
+ 0x3d, 0xbc, 0xf1, 0xbe, 0x17, 0xeb, 0xa0, 0x31,
+ 0x43, 0xed, 0xd7, 0x50, 0xcc, 0xc2, 0xe2, 0xaa,
+ 0x68, 0xc8, 0xf0, 0xd3, 0x89, 0xbd, 0xf5, 0x69,
+ 0x56, 0xe3, 0x88, 0x92, 0x32, 0x56, 0x85, 0x6f,
+ 0x25, 0x30, 0x28, 0x37, 0xd5, 0xe2, 0xa6, 0xf7,
+ 0x6e, 0xa9, 0x71, 0xda, 0x4a, 0x25, 0x94, 0x0b,
+ 0x84, 0x7f, 0x1f, 0x6b, 0x89, 0x2a, 0xf8, 0x30,
+ 0xcb, 0x60, 0x75, 0x21, 0xbd, 0xe2, 0x34, 0xf7,
+ 0x8f, 0x30, 0xd5, 0xd5, 0x1f, 0x17, 0x0d, 0x00,
+ 0x6c, 0x50, 0xde, 0x56, 0x15, 0x33, 0x1b, 0x83,
+ 0x68, 0x7b, 0x24, 0xe3, 0xa0, 0xda, 0xd5, 0x7a,
+ 0x3e, 0x93, 0x6d, 0xe0, 0x02, 0x79, 0x62, 0x5d,
+ 0x71, 0xe3, 0x7b, 0xa9, 0x0b, 0x7a, 0xcd, 0xb3,
+ 0xb2, 0x6f, 0x96, 0x19, 0x8f, 0xf8, 0x8b, 0x26,
+ 0x7a, 0x40, 0xc8, 0xae, 0xfe, 0x0d, 0x6f, 0x67,
+ 0xce, 0x5e, 0xa0, 0x04, 0x7e, 0x93, 0x1d, 0x17,
+ 0x1c, 0x32, 0x82, 0xf4, 0x54, 0xb9, 0x80, 0xdd,
+ 0x82, 0xae, 0xf5, 0xc5, 0x1e, 0x15, 0xab, 0xc2,
+ 0x5c, 0x60, 0xd2, 0x08, 0xc2, 0xa1, 0x1f, 0x89,
+ 0x0b, 0x59, 0x36, 0x07, 0xdc, 0x57, 0xd3, 0xa0,
+ 0x32, 0x42, 0xac, 0xa6, 0x90, 0x0b, 0xc0, 0xe4,
+ 0x91, 0x45, 0x85, 0x27, 0xb9, 0x48, 0x2a, 0x88,
+ 0x0a, 0xbf, 0xf6, 0x2d, 0xef, 0x4d, 0x1b, 0x64,
+ 0x49, 0x23, 0x47, 0x30, 0x29, 0x25, 0xb2, 0xc9,
+ 0xaf, 0xcd, 0xae, 0x56, 0x43, 0x28, 0xcf, 0x81,
+ 0x95, 0xa7, 0x3e, 0x51, 0x5b, 0x3b, 0xf7, 0x87,
+ 0x13, 0xc6, 0xee, 0x50, 0x2f, 0x78, 0xdd, 0xcf,
+ 0x63, 0xef, 0x15, 0xb9, 0x4f, 0x21, 0x27, 0x5e,
+ 0x94, 0x78, 0xad, 0xcd, 0x9b, 0x3d, 0xf2, 0xdb,
+ 0xed, 0xf2, 0xa2, 0x39, 0xca, 0xa3, 0xa8, 0x2e,
+ 0x68, 0xd5, 0xc3, 0xcf, 0x71, 0xec, 0x92, 0xdc,
+ 0xce, 0xe7, 0x7d, 0x2b, 0xf7, 0xbc, 0xe9, 0x2b,
+ 0x2e, 0xae, 0xaf, 0x0b, 0x92, 0x72, 0xac, 0x6e,
+ 0x49, 0xe1, 0xb3, 0x1f, 0xe5, 0x43, 0x2f, 0xa7,
+};
+
+const struct testvec bf_cbc_128_1_vectors[] = {
+ {
+ .blkno = 0,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_128_encblkno1_vec0_ctxt,
+ },
+ {
+ .blkno = 1,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_128_encblkno1_vec1_ctxt,
+ },
+ {
+ .blkno = 2,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_128_encblkno1_vec2_ctxt,
+ },
+ {
+ .blkno = 3,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_128_encblkno1_vec3_ctxt,
+ },
+};
+
+/*
+ * IV method encblkno8, blkno 0.
+ */
+static const uint8_t bf_cbc_128_encblkno8_vec0_ctxt[SECSIZE] = {
+ 0xb8, 0x65, 0x67, 0x8e, 0xe4, 0xd8, 0xb4, 0x93,
+ 0xa5, 0xbb, 0x13, 0x92, 0x27, 0x4b, 0xdd, 0xeb,
+ 0x0d, 0xad, 0x80, 0x6a, 0x57, 0x37, 0xc0, 0x23,
+ 0x23, 0xbf, 0xed, 0x86, 0x0c, 0x18, 0x48, 0x19,
+ 0xcd, 0x84, 0x66, 0xa7, 0xd6, 0xa0, 0x44, 0xd3,
+ 0x05, 0x4e, 0xf4, 0xfe, 0x6a, 0x57, 0x69, 0x01,
+ 0xaa, 0x91, 0x9c, 0x6e, 0x4f, 0x79, 0xc9, 0x8f,
+ 0x4c, 0xdf, 0x5b, 0x9c, 0xc4, 0xf7, 0x63, 0x16,
+ 0x20, 0x09, 0x07, 0x3f, 0x5e, 0x31, 0xcc, 0x81,
+ 0x71, 0xe3, 0x7b, 0xb5, 0xea, 0x2c, 0xb5, 0x14,
+ 0x1e, 0xf9, 0x0d, 0xe0, 0x45, 0xbc, 0x9f, 0x92,
+ 0x6c, 0xc9, 0x0a, 0x85, 0x62, 0x42, 0xf1, 0x4b,
+ 0xac, 0xe2, 0xfa, 0xad, 0x97, 0x7a, 0x43, 0x3d,
+ 0xb6, 0x5f, 0xcb, 0xe7, 0x17, 0x23, 0x28, 0xde,
+ 0x4e, 0xf8, 0xa1, 0x3c, 0x22, 0x63, 0x49, 0x31,
+ 0xa7, 0xbe, 0xbf, 0xfe, 0xee, 0xd9, 0x1f, 0xa0,
+ 0x2a, 0x0e, 0xf2, 0x4f, 0x3e, 0xf8, 0xbb, 0xae,
+ 0x9e, 0x0d, 0x2c, 0xaa, 0x2a, 0x2c, 0xf0, 0x6c,
+ 0x37, 0x2a, 0x5d, 0x96, 0x70, 0x9c, 0x87, 0xcc,
+ 0x2b, 0xca, 0x95, 0x37, 0xf4, 0x4d, 0x78, 0xae,
+ 0x4f, 0xb5, 0xe6, 0xad, 0xb1, 0xc1, 0x31, 0xd3,
+ 0x2d, 0xa6, 0xaf, 0xc1, 0x8c, 0xe4, 0x72, 0x05,
+ 0xb0, 0xfc, 0xb0, 0xf7, 0xfe, 0xf9, 0x3e, 0xa3,
+ 0xb9, 0xea, 0xc8, 0x69, 0xe3, 0x4e, 0x6d, 0xd1,
+ 0x8b, 0x2b, 0xf9, 0x2f, 0xd9, 0x40, 0x69, 0xff,
+ 0x90, 0x98, 0x7a, 0x82, 0xe3, 0x0d, 0x4e, 0x19,
+ 0x2f, 0x77, 0xf9, 0xab, 0x36, 0xa9, 0x4e, 0xbc,
+ 0x25, 0x32, 0xbd, 0x44, 0xea, 0x5a, 0x18, 0x31,
+ 0x37, 0xcd, 0x6c, 0x98, 0xdd, 0x1d, 0xf9, 0xf7,
+ 0x8f, 0x0b, 0x79, 0xbc, 0xe6, 0xf5, 0xf1, 0xa3,
+ 0x13, 0xe9, 0x39, 0xaf, 0xa4, 0x8a, 0x74, 0xae,
+ 0x60, 0x30, 0x63, 0x6e, 0xee, 0x97, 0x83, 0xee,
+ 0xc0, 0xdd, 0xde, 0xad, 0x92, 0x83, 0xc9, 0x3c,
+ 0xd8, 0x58, 0x6c, 0xcb, 0xe4, 0x29, 0x04, 0x69,
+ 0x4f, 0x45, 0xc2, 0x59, 0x98, 0x20, 0x91, 0x6e,
+ 0x95, 0x82, 0xb3, 0x47, 0x2c, 0xef, 0xdb, 0x96,
+ 0x38, 0xba, 0x01, 0x89, 0x84, 0x96, 0x71, 0xf9,
+ 0x2b, 0x23, 0xe0, 0x89, 0xb8, 0xb9, 0x80, 0xbf,
+ 0x0c, 0xdc, 0xf0, 0x5c, 0xd6, 0x4f, 0x18, 0x19,
+ 0xfe, 0x23, 0x5a, 0x1e, 0x20, 0x9a, 0x05, 0xf2,
+ 0x62, 0xd4, 0x04, 0x92, 0x24, 0xfc, 0xc0, 0x48,
+ 0xf0, 0x00, 0xb4, 0xbe, 0x2e, 0xea, 0x25, 0x17,
+ 0x5d, 0xab, 0x73, 0x26, 0x79, 0x77, 0xc5, 0x96,
+ 0xd3, 0xbf, 0x38, 0xda, 0x0f, 0xe1, 0x26, 0x9a,
+ 0x38, 0xfc, 0x43, 0x82, 0xd1, 0x4d, 0xf2, 0xae,
+ 0x98, 0x1e, 0xb0, 0x0d, 0xec, 0x7b, 0x56, 0x66,
+ 0xcb, 0x30, 0x57, 0x4f, 0xe7, 0x03, 0xe3, 0xa6,
+ 0x4a, 0x4a, 0xf9, 0xa3, 0xbf, 0x44, 0xac, 0x1a,
+ 0xe7, 0x4b, 0xc1, 0x5b, 0x03, 0x25, 0x4e, 0xc6,
+ 0x1f, 0x96, 0x4d, 0xf7, 0xbe, 0xa7, 0x5d, 0x60,
+ 0x20, 0x62, 0x10, 0xd7, 0xab, 0x64, 0xce, 0x22,
+ 0x8b, 0x52, 0x76, 0xa1, 0xa1, 0x8b, 0x1e, 0xb2,
+ 0x18, 0x29, 0x8f, 0xc5, 0x24, 0x39, 0xd4, 0xf8,
+ 0x75, 0x1e, 0x30, 0x57, 0x12, 0x01, 0x04, 0x78,
+ 0x68, 0x97, 0xa8, 0x65, 0x8c, 0xac, 0xb4, 0x3b,
+ 0x37, 0x45, 0x41, 0xbc, 0x7d, 0x4b, 0x09, 0xd7,
+ 0x46, 0x40, 0x99, 0x59, 0xa1, 0xb5, 0x9e, 0x84,
+ 0x24, 0x6d, 0xfb, 0x74, 0x22, 0xac, 0x4e, 0x5f,
+ 0x11, 0xd3, 0xa7, 0x9f, 0xa5, 0xca, 0x38, 0x54,
+ 0xe2, 0x65, 0x52, 0x02, 0x69, 0xe9, 0xa8, 0xf1,
+ 0xd7, 0x9d, 0x9a, 0x17, 0x54, 0xa0, 0xda, 0xbb,
+ 0x37, 0xb4, 0x0c, 0xb6, 0x00, 0xad, 0x6f, 0x88,
+ 0x84, 0xa7, 0x69, 0xd7, 0x0b, 0xbe, 0xb4, 0xbe,
+ 0x96, 0xbc, 0xcd, 0x08, 0xf1, 0x28, 0xe0, 0x6f,
+};
+
+/*
+ * IV method encblkno8, blkno 1.
+ */
+static const uint8_t bf_cbc_128_encblkno8_vec1_ctxt[SECSIZE] = {
+ 0x7d, 0x95, 0x5a, 0x66, 0x23, 0x98, 0xa8, 0xbe,
+ 0x53, 0x63, 0x0d, 0x46, 0x4e, 0x38, 0x1b, 0x1d,
+ 0x36, 0xdd, 0x2a, 0x57, 0x3c, 0x17, 0x01, 0xba,
+ 0x4e, 0xf8, 0xaa, 0x22, 0x74, 0x05, 0xa2, 0x40,
+ 0xd0, 0x30, 0x61, 0x6c, 0x65, 0x5e, 0xfb, 0x21,
+ 0x63, 0xef, 0x62, 0x01, 0x74, 0x15, 0xf6, 0x87,
+ 0x92, 0xc1, 0x4e, 0x46, 0xdd, 0x76, 0xdb, 0x8b,
+ 0x20, 0x44, 0xc4, 0xfa, 0x7c, 0xd2, 0x07, 0x32,
+ 0x11, 0xeb, 0x5b, 0x38, 0x44, 0x32, 0xa1, 0xe7,
+ 0xcb, 0xa6, 0x1a, 0x12, 0xb9, 0x53, 0x13, 0x6f,
+ 0xc2, 0x0e, 0x6a, 0x77, 0x8b, 0x96, 0x14, 0x0a,
+ 0x23, 0x48, 0x65, 0xa5, 0xcd, 0x39, 0x38, 0x03,
+ 0xc8, 0x3a, 0x98, 0x69, 0x3d, 0x14, 0xae, 0xad,
+ 0x54, 0x57, 0xf6, 0x5a, 0xdd, 0x46, 0x4c, 0x3a,
+ 0x68, 0xa8, 0xb7, 0x57, 0xdd, 0x1e, 0x66, 0x0e,
+ 0xc2, 0x4c, 0x17, 0xba, 0xa4, 0x7e, 0x83, 0x45,
+ 0xc6, 0xf2, 0x34, 0x3b, 0x4e, 0xab, 0x67, 0x0c,
+ 0x73, 0xbf, 0x87, 0x7e, 0x93, 0x2b, 0x14, 0x33,
+ 0xd6, 0x24, 0x8d, 0xc7, 0x90, 0x11, 0xd2, 0x38,
+ 0xe6, 0xe0, 0x39, 0x1f, 0x00, 0x74, 0x40, 0xab,
+ 0xdc, 0xdd, 0x46, 0xe8, 0x85, 0x14, 0xb1, 0x78,
+ 0x34, 0x24, 0x04, 0x97, 0xde, 0xf9, 0x04, 0x69,
+ 0x0b, 0x15, 0x72, 0x37, 0xf4, 0x0d, 0xf4, 0x76,
+ 0x6f, 0xd8, 0x05, 0x75, 0x8f, 0x7e, 0x6b, 0xca,
+ 0x55, 0x20, 0x4a, 0x29, 0x16, 0xc1, 0x6e, 0x91,
+ 0x22, 0x01, 0x0d, 0x39, 0x5d, 0xb9, 0x09, 0xa4,
+ 0xe8, 0xc7, 0xff, 0x60, 0x39, 0xc6, 0xe4, 0x2a,
+ 0x1c, 0xf2, 0x3c, 0xf7, 0xf9, 0xd7, 0xde, 0x0b,
+ 0x0e, 0x30, 0xf1, 0x20, 0x7c, 0x93, 0x2f, 0x74,
+ 0x72, 0x40, 0x47, 0x2d, 0xeb, 0x8a, 0x5f, 0x69,
+ 0x60, 0xdf, 0xe9, 0x4d, 0x06, 0x24, 0x9c, 0x79,
+ 0xe7, 0x61, 0xd3, 0xa7, 0x57, 0x44, 0x49, 0x97,
+ 0x3a, 0xa3, 0x11, 0xc4, 0x70, 0xf4, 0x3d, 0xb5,
+ 0x4b, 0xb7, 0xae, 0x77, 0x36, 0xcf, 0x65, 0x3e,
+ 0xb6, 0x51, 0x83, 0xcb, 0x43, 0x5f, 0xd0, 0xfb,
+ 0x69, 0xc4, 0x1b, 0x77, 0x71, 0xcc, 0x72, 0xf4,
+ 0x5f, 0xc2, 0xda, 0xea, 0xa4, 0x33, 0xec, 0x8e,
+ 0x92, 0x22, 0x6a, 0x55, 0x34, 0x6a, 0x10, 0xb8,
+ 0x62, 0x66, 0xc1, 0x6f, 0x65, 0xdd, 0x9a, 0x40,
+ 0xa0, 0xbf, 0x88, 0xbb, 0x79, 0x1c, 0xa4, 0xaa,
+ 0xdf, 0xe8, 0xe7, 0x40, 0x88, 0xc6, 0x0f, 0xa2,
+ 0x2c, 0xee, 0xe7, 0x41, 0x32, 0x46, 0xa2, 0x46,
+ 0x85, 0xbf, 0x4c, 0xca, 0x4d, 0xd3, 0x9b, 0x49,
+ 0x43, 0x98, 0xae, 0xfc, 0x93, 0xa7, 0x94, 0x98,
+ 0x86, 0xa1, 0x0a, 0x85, 0x77, 0x67, 0xa6, 0x16,
+ 0x94, 0x76, 0xe5, 0x2f, 0x88, 0x5f, 0x24, 0x16,
+ 0xe5, 0x84, 0x4c, 0xd2, 0x58, 0x59, 0x82, 0x59,
+ 0x2c, 0xe2, 0x8d, 0xba, 0x08, 0x01, 0x67, 0x1f,
+ 0x2a, 0x9e, 0x4d, 0x53, 0x57, 0x2d, 0x6e, 0x35,
+ 0x38, 0xd5, 0x50, 0xa7, 0x0c, 0xe6, 0x77, 0x71,
+ 0xbe, 0x45, 0x2e, 0xf4, 0x7a, 0x3a, 0x51, 0x03,
+ 0x04, 0x2b, 0xd7, 0x42, 0x6c, 0x5b, 0x82, 0xba,
+ 0xb4, 0x09, 0xee, 0x9d, 0xea, 0x8f, 0xf0, 0xb3,
+ 0xb2, 0x9d, 0x0e, 0x09, 0x72, 0x8c, 0xd9, 0x1e,
+ 0x6d, 0x78, 0x57, 0x10, 0x1f, 0xeb, 0x4e, 0x53,
+ 0x57, 0x65, 0xe5, 0x43, 0xe8, 0xb4, 0xb6, 0xb8,
+ 0x25, 0x8a, 0xe2, 0xb3, 0x99, 0x95, 0x2c, 0xd0,
+ 0xc7, 0x89, 0xad, 0xdb, 0x72, 0xf0, 0x83, 0xe3,
+ 0x2f, 0x30, 0x33, 0xf4, 0x03, 0x14, 0x86, 0xa0,
+ 0xe0, 0x57, 0x15, 0x53, 0x26, 0xd0, 0x6d, 0x12,
+ 0x51, 0x96, 0x9b, 0x00, 0x8e, 0x41, 0xea, 0x05,
+ 0x75, 0x5d, 0xb3, 0x8d, 0x44, 0x7f, 0x41, 0x7f,
+ 0xd1, 0xed, 0x7c, 0xf7, 0xac, 0x6b, 0x21, 0xc7,
+ 0x0c, 0x49, 0xa1, 0x2e, 0x57, 0xa1, 0x21, 0xe2,
+};
+
+/*
+ * IV method encblkno8, blkno 2.
+ */
+static const uint8_t bf_cbc_128_encblkno8_vec2_ctxt[SECSIZE] = {
+ 0x28, 0x0c, 0x49, 0x08, 0x84, 0xcb, 0xba, 0x4a,
+ 0xa5, 0xb6, 0x12, 0x4c, 0x14, 0x11, 0x1f, 0x88,
+ 0x57, 0x78, 0x1e, 0x51, 0x7c, 0x9d, 0xba, 0x31,
+ 0x80, 0x14, 0xeb, 0x4a, 0x98, 0x8a, 0xb5, 0x4d,
+ 0xc5, 0xbd, 0xd2, 0x48, 0x1e, 0x19, 0x43, 0x54,
+ 0x48, 0x1d, 0x24, 0x76, 0x7d, 0xd8, 0xcc, 0xe9,
+ 0xd9, 0x7b, 0xa9, 0xdf, 0xe3, 0x65, 0x85, 0x10,
+ 0xb8, 0x11, 0xce, 0xa3, 0x07, 0x4d, 0x87, 0x3f,
+ 0x95, 0xfb, 0xa5, 0x06, 0xa4, 0x37, 0xb0, 0x89,
+ 0x03, 0xa9, 0xef, 0x62, 0x98, 0xd3, 0x85, 0xe8,
+ 0xb3, 0x21, 0xab, 0xe9, 0xdc, 0x03, 0x2a, 0x20,
+ 0xf7, 0xb1, 0xa4, 0x7a, 0xd5, 0xdc, 0x61, 0x2e,
+ 0x15, 0x81, 0x3e, 0xcf, 0x8d, 0x8d, 0x54, 0x19,
+ 0x70, 0xde, 0xa9, 0x57, 0x93, 0x87, 0xc7, 0x16,
+ 0x06, 0x25, 0xf3, 0x93, 0x8f, 0x73, 0x92, 0x29,
+ 0x1e, 0xcd, 0x5a, 0x9d, 0x8f, 0x8d, 0x44, 0x15,
+ 0x8d, 0x92, 0x44, 0x95, 0x7a, 0x5e, 0x1b, 0xfd,
+ 0x31, 0xa5, 0x8c, 0x22, 0x89, 0xbb, 0x91, 0x15,
+ 0xad, 0x0a, 0x73, 0x94, 0x65, 0xae, 0xca, 0xfc,
+ 0x7e, 0xae, 0x85, 0x45, 0xe7, 0xd7, 0x8f, 0x89,
+ 0x8e, 0x44, 0x62, 0x7a, 0xe0, 0xee, 0x78, 0xbd,
+ 0x88, 0x62, 0x8e, 0xb8, 0x35, 0x7a, 0xa9, 0x12,
+ 0x56, 0x2d, 0xe4, 0xbb, 0x2d, 0xc8, 0x98, 0x0e,
+ 0x35, 0x9e, 0xea, 0x14, 0x43, 0x80, 0xde, 0x9e,
+ 0x2e, 0xf8, 0xf9, 0xcd, 0x61, 0xa6, 0x22, 0xc8,
+ 0x77, 0xfc, 0x32, 0x71, 0x4b, 0xcb, 0x00, 0x9b,
+ 0x9f, 0x85, 0x02, 0x92, 0xfa, 0x84, 0xd8, 0xd8,
+ 0x09, 0xa4, 0x08, 0xc1, 0x96, 0xd3, 0x9a, 0x27,
+ 0xa3, 0x82, 0x05, 0xd0, 0x78, 0x18, 0x0a, 0x7d,
+ 0xb6, 0x95, 0xc0, 0x27, 0x3e, 0x76, 0x77, 0xf3,
+ 0xd9, 0x62, 0x8e, 0x77, 0xa0, 0x1f, 0x9e, 0x41,
+ 0xdb, 0x24, 0xaa, 0xdd, 0x8f, 0x94, 0x7b, 0x1f,
+ 0xff, 0xaa, 0xfd, 0xe2, 0x19, 0xc2, 0x71, 0x80,
+ 0x0a, 0xda, 0xc5, 0x98, 0x57, 0xde, 0x4e, 0xfb,
+ 0x38, 0xe6, 0x9b, 0xe5, 0xa6, 0x1f, 0x7d, 0x2c,
+ 0x41, 0x5f, 0x4d, 0x13, 0xb8, 0x0c, 0xac, 0x9a,
+ 0x7d, 0xc0, 0x7c, 0x44, 0x64, 0x1e, 0xbc, 0x7d,
+ 0x16, 0xaa, 0x45, 0xda, 0x62, 0x4e, 0x64, 0x69,
+ 0xd6, 0x71, 0xd9, 0x64, 0x2a, 0x5d, 0x20, 0x34,
+ 0xb0, 0xcb, 0x9d, 0xd3, 0x69, 0xd6, 0x60, 0xad,
+ 0x78, 0x72, 0xb8, 0x36, 0x17, 0xe7, 0xaf, 0x0a,
+ 0x11, 0x84, 0x43, 0x32, 0x38, 0x43, 0xe5, 0xc5,
+ 0x1b, 0xf4, 0x48, 0xb6, 0x0e, 0x72, 0x48, 0x2f,
+ 0x9b, 0xe3, 0xce, 0x27, 0xcd, 0x66, 0x28, 0x5c,
+ 0x2a, 0xd7, 0x28, 0x52, 0x6e, 0x86, 0x03, 0x60,
+ 0x7b, 0xbd, 0xbd, 0x53, 0xfb, 0x7d, 0xa1, 0xba,
+ 0x6a, 0x46, 0x0c, 0xf3, 0x1a, 0xbf, 0xa7, 0xa2,
+ 0x46, 0x87, 0x40, 0xaa, 0x7d, 0x76, 0x36, 0x85,
+ 0xa5, 0xbf, 0x0b, 0xd4, 0x56, 0x4c, 0x37, 0xe3,
+ 0x60, 0x93, 0xdc, 0x3b, 0xca, 0x34, 0x78, 0xcf,
+ 0xdb, 0x0c, 0x9d, 0x5c, 0x52, 0xb2, 0xd5, 0x7b,
+ 0xbb, 0x4e, 0xe1, 0xa9, 0x2a, 0xc6, 0x42, 0xf5,
+ 0x21, 0x9c, 0x15, 0xae, 0xb9, 0x08, 0x3a, 0xc4,
+ 0x50, 0x7e, 0x0e, 0xb6, 0xc3, 0xfe, 0xf4, 0xd9,
+ 0x1a, 0x97, 0x30, 0x9f, 0x51, 0x2c, 0xac, 0xd2,
+ 0x13, 0x93, 0x62, 0x56, 0xcb, 0x34, 0xf3, 0xca,
+ 0x26, 0xc6, 0x32, 0xbe, 0xf6, 0xd5, 0x1e, 0x5b,
+ 0x3a, 0x5c, 0x31, 0x08, 0xa1, 0x47, 0x6b, 0x75,
+ 0x95, 0x8e, 0x3d, 0xbf, 0x2e, 0x81, 0x02, 0x0d,
+ 0x17, 0x66, 0x6f, 0x04, 0xe0, 0x1e, 0x03, 0x27,
+ 0xd3, 0xcf, 0x45, 0xc6, 0x08, 0xdb, 0xdf, 0x83,
+ 0xd5, 0xc2, 0x7f, 0xe8, 0x5f, 0x4a, 0x36, 0x0a,
+ 0x6d, 0x3c, 0x91, 0x8e, 0x52, 0xf3, 0xdd, 0x62,
+ 0xff, 0x78, 0x87, 0xd9, 0x4c, 0xad, 0x5c, 0x9f,
+};
+
+/*
+ * IV method encblkno8, blkno 3.
+ */
+static const uint8_t bf_cbc_128_encblkno8_vec3_ctxt[SECSIZE] = {
+ 0xa3, 0x9a, 0x21, 0xbd, 0x1c, 0x97, 0x4f, 0xe2,
+ 0x7d, 0x63, 0xfe, 0x52, 0x07, 0xac, 0x81, 0x75,
+ 0x15, 0x04, 0x8c, 0xc7, 0x7c, 0x11, 0x8d, 0x53,
+ 0x17, 0x87, 0xe8, 0x5d, 0xb1, 0xe8, 0xcb, 0x43,
+ 0xe2, 0x4b, 0xce, 0x9b, 0xf7, 0x51, 0x0a, 0xee,
+ 0x0a, 0x49, 0xae, 0x9a, 0xbd, 0x33, 0x3f, 0x0b,
+ 0xd4, 0xe8, 0x57, 0x77, 0xb1, 0xe1, 0xa5, 0x22,
+ 0x83, 0xbf, 0x7c, 0x63, 0x6c, 0x3b, 0x25, 0xde,
+ 0x2c, 0x6a, 0x28, 0x66, 0x0e, 0xc4, 0x8d, 0x66,
+ 0x66, 0xb6, 0xc6, 0xb5, 0x38, 0x40, 0x84, 0x81,
+ 0xec, 0x03, 0xdb, 0xbf, 0xe1, 0x8f, 0xf4, 0xb3,
+ 0xc4, 0x50, 0x24, 0xa2, 0x48, 0x66, 0x73, 0xed,
+ 0x4b, 0x00, 0x12, 0xd5, 0x15, 0x5f, 0xfb, 0xd9,
+ 0x6c, 0x76, 0x3b, 0xa2, 0x68, 0x41, 0xc1, 0x96,
+ 0x50, 0xff, 0x8a, 0x83, 0xac, 0x02, 0x42, 0xcb,
+ 0xed, 0x93, 0xbf, 0xd9, 0x51, 0x46, 0x50, 0xd1,
+ 0xeb, 0x02, 0x61, 0x64, 0xa7, 0x0e, 0x95, 0xc2,
+ 0x95, 0x5a, 0x93, 0xd9, 0x77, 0x17, 0xa4, 0xc7,
+ 0x51, 0x42, 0xa3, 0xd4, 0x32, 0x4e, 0x4f, 0xe1,
+ 0xaa, 0x6d, 0xab, 0x08, 0xd9, 0xe9, 0xfe, 0x72,
+ 0xf3, 0x2c, 0xfb, 0x43, 0xdf, 0x88, 0x44, 0x94,
+ 0x0b, 0x5c, 0x85, 0x54, 0xe3, 0x13, 0xe2, 0x10,
+ 0x64, 0xa7, 0xcf, 0xe3, 0x2a, 0x3e, 0xfe, 0xd1,
+ 0x67, 0xcd, 0xd1, 0x66, 0x06, 0x26, 0x2f, 0x6f,
+ 0x6f, 0x44, 0xe7, 0xf4, 0xac, 0xe4, 0x58, 0x2f,
+ 0x61, 0xad, 0x64, 0xc6, 0x0c, 0xf0, 0x9a, 0x3b,
+ 0x85, 0x1f, 0x3c, 0xea, 0x8e, 0x84, 0xbb, 0x1a,
+ 0x51, 0x19, 0x3c, 0x6f, 0x5b, 0xf5, 0x6c, 0xb1,
+ 0x8c, 0x91, 0x25, 0x89, 0x3a, 0x45, 0xb5, 0x35,
+ 0x13, 0x74, 0xec, 0x68, 0x44, 0xb8, 0xfd, 0xd6,
+ 0x20, 0x78, 0x7b, 0xe3, 0xe0, 0x82, 0xb7, 0x4a,
+ 0x38, 0xb6, 0xe4, 0x1b, 0xbf, 0xd9, 0xd3, 0xe9,
+ 0xbf, 0xd7, 0xdc, 0x8e, 0x90, 0x7d, 0xcb, 0x39,
+ 0xc4, 0x6c, 0xa4, 0x70, 0x15, 0xf7, 0xa2, 0x16,
+ 0x04, 0x9b, 0xc0, 0x85, 0x04, 0x1e, 0x69, 0x73,
+ 0xf3, 0xbd, 0x64, 0x95, 0xfb, 0x21, 0xcb, 0xca,
+ 0x72, 0xd4, 0x33, 0xe5, 0x11, 0xc3, 0x46, 0xa6,
+ 0xd2, 0x4c, 0x8a, 0xbb, 0xba, 0x45, 0xcc, 0x45,
+ 0xdb, 0x8a, 0xec, 0xef, 0x8c, 0x04, 0xcc, 0xeb,
+ 0x42, 0xad, 0xc3, 0x87, 0xe2, 0x59, 0x3b, 0xed,
+ 0x2a, 0x11, 0x74, 0xc1, 0x28, 0x8a, 0xc2, 0x17,
+ 0xca, 0x5a, 0x88, 0xcc, 0x17, 0x2c, 0x03, 0xf6,
+ 0xcd, 0xd6, 0x92, 0xbd, 0x68, 0x26, 0x41, 0x40,
+ 0x15, 0x3e, 0x54, 0xf5, 0xb7, 0x4a, 0x82, 0x68,
+ 0xca, 0x27, 0xed, 0xed, 0x25, 0xd6, 0x0d, 0x0f,
+ 0x86, 0x62, 0xf0, 0x86, 0x5b, 0xed, 0x94, 0x0b,
+ 0xd0, 0xec, 0xc7, 0xfd, 0x9c, 0x8a, 0xdf, 0x4f,
+ 0x65, 0x7e, 0x63, 0x40, 0xeb, 0xe4, 0x79, 0xcb,
+ 0x67, 0xc6, 0x0e, 0x45, 0xf9, 0xb1, 0x48, 0x27,
+ 0x16, 0xfc, 0x99, 0x76, 0xac, 0xd0, 0xbc, 0xe6,
+ 0x9b, 0x29, 0x2d, 0xa5, 0x6c, 0x88, 0x45, 0x7a,
+ 0x01, 0xf3, 0xe3, 0x15, 0xfb, 0x29, 0xd4, 0x3b,
+ 0x9a, 0xa8, 0xc6, 0x98, 0x92, 0x19, 0x16, 0xba,
+ 0xdc, 0x41, 0x70, 0x40, 0x51, 0xfb, 0x7f, 0xb5,
+ 0xe4, 0x3f, 0x3f, 0x73, 0xb0, 0xb3, 0xd7, 0x6d,
+ 0x3e, 0x4d, 0x6b, 0x9e, 0x42, 0x8e, 0xbb, 0xd7,
+ 0xb5, 0x26, 0xa9, 0x19, 0xf5, 0x68, 0xf3, 0x8d,
+ 0x35, 0x91, 0x06, 0x48, 0xfa, 0x0e, 0x7d, 0xe2,
+ 0xd3, 0x71, 0x75, 0x44, 0xbd, 0xe6, 0xe6, 0xd6,
+ 0x36, 0x43, 0x64, 0x3a, 0xd5, 0x97, 0xfa, 0xc0,
+ 0x10, 0xf7, 0x6c, 0x26, 0xf1, 0xb4, 0xbc, 0xf5,
+ 0xf6, 0xa3, 0xec, 0x0a, 0xb5, 0x34, 0x55, 0x1a,
+ 0x67, 0xcb, 0xec, 0x2c, 0x2e, 0x2e, 0x74, 0xed,
+ 0xfc, 0x85, 0x53, 0x01, 0x87, 0xa7, 0xa0, 0x1f,
+};
+
+const struct testvec bf_cbc_128_8_vectors[] = {
+ {
+ .blkno = 0,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_128_encblkno8_vec0_ctxt,
+ },
+ {
+ .blkno = 1,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_128_encblkno8_vec1_ctxt,
+ },
+ {
+ .blkno = 2,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_128_encblkno8_vec2_ctxt,
+ },
+ {
+ .blkno = 3,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_128_encblkno8_vec3_ctxt,
+ },
+};
+
+/*
+ * IV method encblkno1, blkno 0.
+ */
+static const uint8_t bf_cbc_256_encblkno1_vec0_ctxt[SECSIZE] = {
+ 0x14, 0xec, 0xa9, 0xa0, 0x51, 0x9f, 0x5e, 0xb5,
+ 0x81, 0x6f, 0xa2, 0xbf, 0x5e, 0xf7, 0x91, 0xad,
+ 0xc5, 0x1a, 0x7e, 0xe6, 0x7a, 0x82, 0x4a, 0xba,
+ 0x54, 0x60, 0xcb, 0xc3, 0x2f, 0x69, 0x5c, 0xd9,
+ 0x1e, 0x58, 0xa1, 0x88, 0xa1, 0xe5, 0xa8, 0x52,
+ 0xdf, 0xf3, 0x8d, 0x5e, 0x2f, 0x81, 0x54, 0xab,
+ 0x67, 0xb5, 0x05, 0x63, 0x20, 0x10, 0x98, 0xf5,
+ 0xa5, 0xc3, 0x9e, 0x6d, 0x80, 0x4d, 0xb6, 0x82,
+ 0x80, 0x5e, 0xb3, 0xc5, 0xd8, 0x77, 0x94, 0xa0,
+ 0xb8, 0x67, 0xb8, 0x2d, 0x9b, 0x11, 0x3c, 0x24,
+ 0xbd, 0xb7, 0x0b, 0x1d, 0xeb, 0x1d, 0x6c, 0xab,
+ 0x3f, 0x8c, 0x91, 0xa0, 0x3a, 0xa6, 0x0c, 0x5a,
+ 0x88, 0xa0, 0xb5, 0xea, 0x49, 0x58, 0xfb, 0x37,
+ 0x7c, 0x94, 0xc4, 0x22, 0x35, 0x84, 0xda, 0xd1,
+ 0x1b, 0x4a, 0x42, 0xa1, 0xd4, 0x90, 0xcd, 0xfb,
+ 0x77, 0x29, 0xd2, 0xe3, 0x89, 0xec, 0x9e, 0x6a,
+ 0x4b, 0xbc, 0xc0, 0xfa, 0xb8, 0xdd, 0x5c, 0x2b,
+ 0xc5, 0x49, 0xb1, 0x6d, 0x6f, 0x2c, 0xb5, 0x50,
+ 0xd1, 0xd4, 0x9b, 0x15, 0x1c, 0xd7, 0x44, 0xf3,
+ 0x2e, 0x1f, 0x46, 0xee, 0x38, 0x40, 0xaa, 0x73,
+ 0xca, 0xf2, 0xc3, 0x83, 0xe2, 0xff, 0xd6, 0xc7,
+ 0x20, 0xea, 0x70, 0x95, 0x48, 0x58, 0x29, 0x6e,
+ 0xac, 0x10, 0x75, 0x69, 0x1d, 0xb2, 0x08, 0x3e,
+ 0x68, 0x43, 0xff, 0x69, 0x1e, 0x88, 0x0a, 0x34,
+ 0x40, 0xae, 0xb9, 0xf4, 0xb9, 0x3f, 0xa5, 0xd2,
+ 0xfb, 0xa0, 0xfd, 0x10, 0xa5, 0xbb, 0xd7, 0x22,
+ 0x8c, 0xd1, 0xf5, 0xc4, 0x11, 0xc6, 0x1e, 0xb5,
+ 0xfc, 0x90, 0x84, 0xa2, 0x49, 0x38, 0x64, 0x92,
+ 0x6e, 0xf2, 0xaa, 0xed, 0xe8, 0x9d, 0xac, 0x86,
+ 0xb7, 0xb3, 0xd9, 0x98, 0x11, 0x8f, 0x51, 0x33,
+ 0x84, 0x06, 0x40, 0x26, 0x3f, 0xe1, 0xb3, 0x4a,
+ 0x76, 0x53, 0x68, 0x8b, 0xfe, 0x6f, 0xcd, 0x66,
+ 0x92, 0x24, 0x42, 0xf4, 0x11, 0x02, 0x01, 0x00,
+ 0xaa, 0x15, 0x35, 0x42, 0xab, 0x6f, 0x2b, 0x3b,
+ 0x9a, 0x23, 0x73, 0x18, 0xa8, 0x9b, 0x43, 0x4b,
+ 0xfb, 0xef, 0x07, 0x75, 0xd7, 0xd6, 0x08, 0x94,
+ 0xe3, 0x2d, 0xd9, 0xd4, 0x8e, 0x6b, 0x7c, 0xe0,
+ 0xae, 0xef, 0xcb, 0x5c, 0x46, 0x39, 0x64, 0x34,
+ 0x48, 0x77, 0x2c, 0x87, 0x68, 0x57, 0xef, 0xba,
+ 0xd3, 0x3b, 0xb8, 0x68, 0xc5, 0x65, 0x73, 0x44,
+ 0x0b, 0xef, 0xc7, 0x5e, 0xe6, 0xa2, 0xba, 0x24,
+ 0x8c, 0x67, 0xa0, 0xf4, 0xef, 0x18, 0x8c, 0x72,
+ 0x5b, 0x81, 0x8c, 0x81, 0x4f, 0x9a, 0xed, 0x46,
+ 0x5d, 0x05, 0x9a, 0xdc, 0x01, 0xbe, 0xe8, 0x3f,
+ 0xb7, 0x5c, 0x8b, 0x2f, 0x92, 0x2c, 0x93, 0x54,
+ 0x68, 0xfa, 0xd4, 0x27, 0x81, 0xab, 0xa9, 0xfd,
+ 0x20, 0x21, 0x1b, 0x3a, 0x6e, 0x6b, 0x02, 0x57,
+ 0x6e, 0xd6, 0x7b, 0x7e, 0x5d, 0x84, 0x47, 0x69,
+ 0x86, 0x7b, 0x8f, 0x8b, 0xff, 0xb5, 0xcd, 0xc1,
+ 0x03, 0x18, 0x23, 0x7f, 0x23, 0x2e, 0x3a, 0x48,
+ 0xe2, 0xf6, 0xb1, 0x78, 0x13, 0x81, 0xbb, 0x80,
+ 0x91, 0x89, 0x54, 0x7d, 0x1f, 0x1a, 0xd5, 0x35,
+ 0xad, 0x56, 0x6a, 0x0f, 0xeb, 0x4d, 0x00, 0xdf,
+ 0xe0, 0xf3, 0x7c, 0xd3, 0x2c, 0x5a, 0x48, 0x39,
+ 0xa1, 0xc1, 0xfa, 0x34, 0x5f, 0xf9, 0x0b, 0xcd,
+ 0x1f, 0x21, 0xc6, 0x46, 0xb3, 0xd8, 0x45, 0xc5,
+ 0x37, 0xf7, 0xd0, 0xda, 0x27, 0x0f, 0xec, 0xec,
+ 0x05, 0x81, 0x6f, 0x97, 0xca, 0x6d, 0xfa, 0x71,
+ 0xc9, 0x59, 0x84, 0xc3, 0x0d, 0x55, 0x12, 0xbf,
+ 0xe1, 0xd2, 0x7c, 0x51, 0x65, 0x8c, 0xc3, 0x8a,
+ 0x73, 0x2f, 0x1c, 0xd8, 0x13, 0x4a, 0xd1, 0x78,
+ 0xb2, 0xc8, 0x19, 0x09, 0xce, 0x7b, 0xb6, 0x77,
+ 0xcc, 0xc3, 0xe6, 0xee, 0x3a, 0x82, 0xf9, 0xc6,
+ 0x5a, 0x36, 0x46, 0xc0, 0x25, 0xee, 0xaf, 0x78,
+};
+
+/*
+ * IV method encblkno1, blkno 1.
+ */
+static const uint8_t bf_cbc_256_encblkno1_vec1_ctxt[SECSIZE] = {
+ 0x0b, 0xb6, 0x26, 0x92, 0x1d, 0x74, 0xc2, 0x10,
+ 0xb5, 0x99, 0x5f, 0x62, 0x7f, 0x3b, 0x49, 0x10,
+ 0xc1, 0x20, 0x9f, 0x38, 0x25, 0x0f, 0x59, 0xde,
+ 0xe4, 0xc8, 0xb5, 0x27, 0xb1, 0xec, 0x96, 0x40,
+ 0xe8, 0x05, 0x15, 0x40, 0x96, 0xe0, 0xff, 0xaf,
+ 0x53, 0x73, 0xa1, 0xa6, 0x73, 0x03, 0xcf, 0x1f,
+ 0x87, 0x48, 0x7d, 0x81, 0x0e, 0x35, 0x23, 0x7b,
+ 0xde, 0x12, 0xd8, 0xcd, 0x0a, 0xcb, 0x03, 0xc5,
+ 0x07, 0xf7, 0x7a, 0x04, 0xf3, 0xda, 0x7d, 0x3b,
+ 0x73, 0xc6, 0x31, 0xbc, 0x24, 0xde, 0x23, 0x05,
+ 0x3a, 0xdc, 0xe2, 0x96, 0x85, 0x06, 0xeb, 0x89,
+ 0xb0, 0x49, 0x3c, 0x79, 0x8e, 0xcf, 0x49, 0x0e,
+ 0x34, 0x04, 0xa5, 0xcf, 0x45, 0x56, 0xb6, 0xc2,
+ 0xf1, 0xf1, 0xab, 0x7c, 0x8a, 0xfc, 0xeb, 0xa0,
+ 0x8a, 0xe6, 0x73, 0xb4, 0xc3, 0x0c, 0x03, 0x5f,
+ 0x03, 0x53, 0x6f, 0x69, 0xa2, 0xd0, 0xa7, 0x48,
+ 0xc4, 0x11, 0x88, 0x75, 0xe1, 0xf3, 0xd0, 0x72,
+ 0x98, 0x6f, 0x84, 0xa6, 0xa8, 0x35, 0xbb, 0xac,
+ 0x4d, 0xac, 0x55, 0x88, 0x85, 0x86, 0x5a, 0xd9,
+ 0xb6, 0x57, 0xf9, 0x40, 0xf6, 0x7f, 0x1b, 0x4e,
+ 0x87, 0xc0, 0x56, 0x8a, 0x2f, 0x3a, 0xe5, 0xa6,
+ 0x67, 0x68, 0x21, 0x2b, 0xea, 0xfa, 0xee, 0x47,
+ 0xa0, 0x34, 0x56, 0x7d, 0xa0, 0x3d, 0x58, 0xd7,
+ 0xff, 0xa2, 0xb6, 0x03, 0x52, 0x16, 0xa5, 0x15,
+ 0x65, 0xdb, 0xe1, 0x1b, 0xdf, 0x69, 0xb1, 0x48,
+ 0x6a, 0xdf, 0xc1, 0x00, 0x07, 0xdc, 0x46, 0x4b,
+ 0x59, 0xcf, 0x15, 0x6b, 0xee, 0x4f, 0x72, 0x77,
+ 0x6e, 0xbf, 0x47, 0x0e, 0x84, 0x0b, 0xb1, 0xac,
+ 0x85, 0xce, 0x2b, 0x47, 0x7a, 0xcc, 0x30, 0x0c,
+ 0x2f, 0x10, 0x27, 0xaa, 0x83, 0x3f, 0x17, 0x39,
+ 0x84, 0x45, 0x8c, 0xb7, 0x31, 0xb3, 0x7c, 0xcd,
+ 0xed, 0x86, 0x7d, 0xa9, 0x06, 0x25, 0x1f, 0xe3,
+ 0x9a, 0x9b, 0x92, 0xdd, 0x07, 0x63, 0x3b, 0x51,
+ 0x32, 0x2e, 0xae, 0xdf, 0xad, 0xd4, 0x54, 0x5d,
+ 0x71, 0x36, 0xe9, 0xda, 0x70, 0xe9, 0xec, 0x75,
+ 0x0b, 0xbb, 0xcc, 0x5d, 0xc5, 0x45, 0x8e, 0x56,
+ 0x12, 0x87, 0x95, 0x0f, 0x0f, 0x5b, 0x22, 0xc2,
+ 0xe9, 0x71, 0xf2, 0x7e, 0x7b, 0xc2, 0xce, 0x1f,
+ 0xb4, 0x43, 0xa5, 0xf1, 0x80, 0x03, 0xd9, 0x44,
+ 0x3e, 0x97, 0xd6, 0x32, 0x80, 0x99, 0x6b, 0x5b,
+ 0x25, 0x8b, 0x73, 0x0c, 0x21, 0xda, 0x87, 0x29,
+ 0x57, 0x1e, 0xa3, 0x1f, 0xc1, 0xb2, 0xd6, 0xa4,
+ 0x72, 0x64, 0x4a, 0x6b, 0x6f, 0x4d, 0xa8, 0x03,
+ 0x59, 0x6f, 0xce, 0x8a, 0xd6, 0x1c, 0x63, 0x30,
+ 0x60, 0xd1, 0x55, 0xc5, 0x44, 0x9a, 0xa8, 0x69,
+ 0x9f, 0xc7, 0xbe, 0xca, 0x92, 0x83, 0xe9, 0xea,
+ 0x51, 0x00, 0x5a, 0xdc, 0xbb, 0xbd, 0x5d, 0xf2,
+ 0x6d, 0x3c, 0x09, 0xde, 0x68, 0x33, 0x5f, 0x5c,
+ 0x80, 0x8e, 0x22, 0x93, 0x28, 0x5b, 0x77, 0xae,
+ 0xcd, 0x0d, 0x08, 0xab, 0x94, 0xd6, 0x12, 0x72,
+ 0x3f, 0xd2, 0xb3, 0xff, 0x87, 0x0a, 0x6f, 0x72,
+ 0xa7, 0xff, 0xc1, 0xdc, 0x8a, 0x64, 0xdf, 0xeb,
+ 0x0e, 0x63, 0x71, 0x42, 0x88, 0x2b, 0x13, 0x17,
+ 0xf2, 0x3b, 0xf9, 0xbb, 0xc9, 0xcc, 0x32, 0x1f,
+ 0x12, 0x7f, 0xa0, 0x8e, 0x77, 0x31, 0x42, 0x46,
+ 0x3d, 0xb6, 0xa9, 0x14, 0x6e, 0x02, 0x5a, 0x4f,
+ 0xf1, 0x5b, 0x91, 0x7e, 0x93, 0xea, 0x94, 0xf1,
+ 0xcf, 0x0e, 0x10, 0xf8, 0xc2, 0x55, 0x87, 0x68,
+ 0xf9, 0x49, 0xfa, 0xeb, 0x0f, 0x2c, 0xd7, 0xd8,
+ 0x26, 0x1a, 0x5b, 0x1a, 0x42, 0x06, 0xea, 0x8a,
+ 0xb6, 0xec, 0x6e, 0xb0, 0x00, 0xb9, 0x3b, 0x50,
+ 0xe8, 0x9e, 0xc2, 0x51, 0x4f, 0x03, 0xcd, 0x9f,
+ 0x36, 0x27, 0xca, 0xa2, 0x98, 0x87, 0x5a, 0xae,
+ 0xd8, 0x87, 0x76, 0xb6, 0xb6, 0x19, 0x7d, 0x75,
+};
+
+/*
+ * IV method encblkno1, blkno 2.
+ */
+static const uint8_t bf_cbc_256_encblkno1_vec2_ctxt[SECSIZE] = {
+ 0x91, 0x45, 0x4e, 0xe8, 0xad, 0xe3, 0x95, 0x0f,
+ 0x40, 0x35, 0x21, 0x21, 0x77, 0x62, 0x1d, 0x65,
+ 0xe4, 0x93, 0x11, 0xd2, 0x20, 0xa4, 0xe4, 0x53,
+ 0x44, 0xff, 0x60, 0xe9, 0x34, 0xb2, 0x33, 0x87,
+ 0x3d, 0xb0, 0xd8, 0x37, 0x7e, 0x0e, 0x9a, 0x53,
+ 0x92, 0xeb, 0xee, 0x16, 0x41, 0x25, 0xe3, 0x80,
+ 0x0c, 0x53, 0xd8, 0x1f, 0xf0, 0x99, 0xcb, 0x31,
+ 0xd1, 0x00, 0x82, 0x03, 0xcc, 0xa9, 0x5c, 0x8d,
+ 0x1a, 0xbb, 0x03, 0x81, 0x80, 0x0d, 0x5d, 0x4a,
+ 0x96, 0x74, 0x79, 0xf4, 0xa7, 0x46, 0x97, 0x42,
+ 0x5e, 0xb6, 0x8d, 0xc1, 0x95, 0x1d, 0x98, 0x4d,
+ 0xe5, 0xe9, 0x70, 0x1a, 0x5a, 0xad, 0xf4, 0x3d,
+ 0xe1, 0xa7, 0x25, 0xc7, 0xfa, 0x0a, 0x75, 0x98,
+ 0x2f, 0xef, 0x16, 0x2e, 0xf2, 0x02, 0x8a, 0x4c,
+ 0x1f, 0x5a, 0xbb, 0x06, 0x1b, 0x4e, 0x50, 0xfb,
+ 0x03, 0xed, 0x2a, 0x53, 0xdc, 0x2a, 0x65, 0xad,
+ 0x57, 0x84, 0x48, 0xdb, 0xd2, 0x9b, 0xc0, 0x01,
+ 0x5f, 0x7d, 0x3e, 0x84, 0xe5, 0x15, 0x7d, 0xc5,
+ 0x60, 0x4b, 0x18, 0xa1, 0xf3, 0x00, 0x82, 0xd3,
+ 0x39, 0x2a, 0x1f, 0x8f, 0x6a, 0xb7, 0xeb, 0x76,
+ 0xfb, 0xf0, 0x5e, 0x66, 0xd8, 0xf1, 0x85, 0xa8,
+ 0x17, 0xdc, 0x6a, 0xee, 0x53, 0xd9, 0x72, 0x27,
+ 0xd1, 0x47, 0x73, 0x97, 0x2c, 0xd7, 0xd2, 0xb8,
+ 0xcd, 0xbe, 0x7b, 0xcc, 0xcc, 0x7d, 0x82, 0x10,
+ 0x05, 0x5d, 0xff, 0xb0, 0xe0, 0x3a, 0xda, 0x1b,
+ 0x39, 0x7b, 0x11, 0x30, 0x4f, 0xe7, 0xf9, 0xa6,
+ 0x43, 0x56, 0x01, 0xe4, 0xed, 0x1a, 0x22, 0x5b,
+ 0x53, 0x6b, 0x34, 0x58, 0x21, 0x3f, 0x0d, 0xca,
+ 0x95, 0x24, 0x9a, 0xb0, 0x03, 0xe3, 0x97, 0xf5,
+ 0x9b, 0xcb, 0x10, 0x6f, 0x1d, 0x8a, 0x8b, 0xaa,
+ 0x14, 0x0a, 0x89, 0x92, 0xa1, 0x07, 0xb1, 0x35,
+ 0x40, 0x7f, 0xb0, 0xc3, 0x9a, 0x2a, 0x1f, 0x94,
+ 0x6c, 0x8f, 0xd8, 0x40, 0x52, 0xec, 0x0e, 0xbf,
+ 0x91, 0x27, 0xbd, 0x65, 0x25, 0xf2, 0x36, 0xe8,
+ 0x8f, 0x49, 0x08, 0xa6, 0x8f, 0x82, 0xb3, 0x47,
+ 0xe9, 0xa4, 0xa6, 0x8e, 0xfb, 0x30, 0xb2, 0x4c,
+ 0xad, 0x76, 0x65, 0x25, 0xdb, 0x60, 0xa8, 0xeb,
+ 0xb9, 0xf9, 0x9a, 0x9c, 0x9c, 0x12, 0xab, 0xeb,
+ 0x4b, 0x96, 0xa5, 0xc3, 0x58, 0x9b, 0x68, 0x2c,
+ 0x41, 0xac, 0xe5, 0x03, 0xbc, 0xee, 0xb8, 0x05,
+ 0xf7, 0xe6, 0xb1, 0x07, 0xde, 0x46, 0x28, 0xc1,
+ 0x2c, 0x15, 0xa2, 0x34, 0xea, 0xe7, 0xc3, 0x36,
+ 0xe6, 0x18, 0x20, 0x4e, 0x20, 0x3f, 0x32, 0xa8,
+ 0x29, 0x05, 0xf6, 0xa5, 0xf2, 0xa3, 0xeb, 0x7a,
+ 0x25, 0x5e, 0x14, 0x1f, 0xd0, 0xe1, 0x8e, 0xfb,
+ 0x28, 0xc5, 0xa2, 0x42, 0xed, 0x4c, 0x12, 0x15,
+ 0x2a, 0x08, 0xfb, 0x0b, 0xfb, 0x94, 0x64, 0xc0,
+ 0x8b, 0xbb, 0xbb, 0x2c, 0xef, 0xab, 0x0b, 0x4c,
+ 0x27, 0x40, 0x94, 0x3e, 0x93, 0x77, 0x98, 0xcc,
+ 0x64, 0xe3, 0xba, 0x22, 0x95, 0xd7, 0xc1, 0xe3,
+ 0xa7, 0xcd, 0xf9, 0x25, 0xdc, 0xc4, 0xd2, 0xee,
+ 0x5b, 0x53, 0x72, 0x59, 0x8b, 0xea, 0xbf, 0xde,
+ 0x2b, 0x35, 0xd5, 0x27, 0x57, 0x2e, 0x13, 0xa7,
+ 0x50, 0x2d, 0xa5, 0xd5, 0x43, 0x0b, 0x49, 0x87,
+ 0xd0, 0xbd, 0xdd, 0xec, 0x4b, 0xd1, 0x8b, 0xf6,
+ 0xf6, 0xd0, 0x97, 0xcb, 0x8d, 0x58, 0x35, 0x27,
+ 0xa5, 0x7e, 0x4a, 0xda, 0x93, 0xa4, 0x1e, 0x39,
+ 0x53, 0x59, 0x87, 0xfe, 0x82, 0x09, 0xda, 0x03,
+ 0x33, 0xcf, 0x94, 0x60, 0xb1, 0x0c, 0xa1, 0x0e,
+ 0xd6, 0xaa, 0xb0, 0x09, 0x96, 0x8b, 0x72, 0x15,
+ 0xfb, 0xb0, 0x7d, 0x06, 0xf5, 0x2d, 0x64, 0xcd,
+ 0x03, 0xf0, 0xfa, 0xed, 0x6f, 0x43, 0xe3, 0xf3,
+ 0x33, 0xaf, 0x65, 0x82, 0x1d, 0xad, 0x03, 0x62,
+ 0xbe, 0x12, 0x14, 0x85, 0x66, 0x45, 0x03, 0x79,
+};
+
+/*
+ * IV method encblkno1, blkno 3.
+ */
+static const uint8_t bf_cbc_256_encblkno1_vec3_ctxt[SECSIZE] = {
+ 0x65, 0xbb, 0x30, 0x13, 0x9a, 0x26, 0xe9, 0x3d,
+ 0x54, 0x28, 0x77, 0xf1, 0x3f, 0x9b, 0xe1, 0x3e,
+ 0x70, 0x90, 0x6f, 0x16, 0xfc, 0x2f, 0x27, 0xb3,
+ 0xc6, 0x3c, 0x38, 0x31, 0x11, 0xe1, 0x3b, 0x72,
+ 0x22, 0x1c, 0x01, 0xc5, 0xa6, 0x70, 0x16, 0x4d,
+ 0xd2, 0xbd, 0xcb, 0x15, 0x00, 0x22, 0xab, 0x65,
+ 0x6a, 0x96, 0x5e, 0x45, 0x7f, 0xfd, 0x76, 0x18,
+ 0x43, 0x25, 0x75, 0x73, 0xa4, 0x24, 0xe4, 0x5b,
+ 0xca, 0xf7, 0x6f, 0xfe, 0xc6, 0x4c, 0x81, 0x77,
+ 0xe5, 0x1b, 0xb4, 0x7b, 0x64, 0xc2, 0x0d, 0x2b,
+ 0xa9, 0x76, 0xae, 0x5d, 0xab, 0x81, 0x77, 0xa6,
+ 0x48, 0xe9, 0x0c, 0x6d, 0x93, 0xbd, 0x7e, 0xdc,
+ 0x39, 0x89, 0x72, 0xd2, 0x07, 0x87, 0x44, 0xa6,
+ 0x7d, 0x08, 0x54, 0xc6, 0x90, 0x1d, 0xa2, 0xd7,
+ 0xfd, 0xd5, 0x59, 0x67, 0xd9, 0x5f, 0x5c, 0xbc,
+ 0x60, 0xc7, 0xf6, 0x98, 0xad, 0x21, 0xdf, 0xde,
+ 0x27, 0xca, 0x73, 0x2f, 0x56, 0xb7, 0xd7, 0x54,
+ 0x6e, 0xc3, 0x09, 0x6f, 0x1b, 0x82, 0x6f, 0xf8,
+ 0x1b, 0xb2, 0x54, 0x47, 0x54, 0x55, 0x67, 0x1c,
+ 0x4a, 0x10, 0x44, 0xb8, 0x8e, 0x85, 0x71, 0x70,
+ 0x02, 0x49, 0xdd, 0x4f, 0xd4, 0xd4, 0x8a, 0x60,
+ 0x04, 0x17, 0x84, 0xbf, 0xb4, 0x0a, 0x6f, 0xc1,
+ 0xec, 0x1f, 0x5d, 0x79, 0x59, 0x15, 0x7b, 0x87,
+ 0xa2, 0xfe, 0x81, 0xa1, 0x0b, 0x74, 0xfa, 0xef,
+ 0xce, 0x96, 0xec, 0x4b, 0xd8, 0x8e, 0xe9, 0xc2,
+ 0x6b, 0x15, 0xd9, 0xe4, 0x1d, 0x81, 0xb2, 0x12,
+ 0xb9, 0x8b, 0x64, 0x3d, 0xfa, 0xf6, 0x29, 0x25,
+ 0x88, 0x4f, 0xfa, 0x56, 0x34, 0x85, 0xa6, 0xbe,
+ 0xf7, 0x9f, 0x54, 0xc4, 0xb7, 0x17, 0xd5, 0x00,
+ 0x2d, 0x06, 0xca, 0xf0, 0xec, 0xf9, 0x52, 0x62,
+ 0x12, 0xef, 0xc0, 0x57, 0xd1, 0xf3, 0xf2, 0xb1,
+ 0x3d, 0xc5, 0x69, 0x04, 0x95, 0xaf, 0xc6, 0x54,
+ 0x18, 0x08, 0x2f, 0xe2, 0xc2, 0xdb, 0x28, 0x63,
+ 0x7c, 0xf5, 0xba, 0xa4, 0xdf, 0xbd, 0xdd, 0xac,
+ 0x98, 0xec, 0x9e, 0x07, 0x48, 0xee, 0xb9, 0x6f,
+ 0x40, 0xba, 0x08, 0xd5, 0x74, 0x97, 0x34, 0x98,
+ 0x7a, 0x80, 0xc5, 0x78, 0x69, 0x11, 0xd9, 0xcb,
+ 0x3b, 0x6f, 0xe7, 0xb7, 0x78, 0xb0, 0x5e, 0x02,
+ 0xaf, 0x6c, 0xef, 0x36, 0x00, 0xca, 0x97, 0x1a,
+ 0x01, 0x2e, 0xe8, 0xc0, 0x8b, 0xc6, 0x78, 0xf4,
+ 0x2d, 0x60, 0x2c, 0x04, 0x3f, 0x0b, 0xca, 0x7e,
+ 0xf1, 0x2e, 0x67, 0x8f, 0x9d, 0xa7, 0xaa, 0xab,
+ 0xcf, 0xb3, 0x84, 0x9e, 0x14, 0x35, 0x15, 0x3b,
+ 0x88, 0x9a, 0x33, 0x5d, 0x68, 0x82, 0x29, 0x53,
+ 0x94, 0x18, 0x0d, 0x14, 0x9e, 0x5f, 0xc1, 0x32,
+ 0x0a, 0x95, 0x6e, 0xa3, 0x82, 0x4b, 0x58, 0x0f,
+ 0x9c, 0xf0, 0x26, 0x4b, 0x2f, 0x02, 0x60, 0x85,
+ 0xdd, 0x2c, 0xb8, 0x87, 0x8b, 0x14, 0x9c, 0x54,
+ 0x0a, 0x5a, 0x02, 0xbe, 0xe2, 0x71, 0xcc, 0x07,
+ 0xae, 0x67, 0x00, 0xa8, 0xd4, 0x09, 0x7c, 0xee,
+ 0x0d, 0x29, 0x17, 0x67, 0x96, 0x68, 0x41, 0xfa,
+ 0x72, 0x29, 0x98, 0x2b, 0x23, 0xd1, 0xa9, 0x89,
+ 0x1c, 0xcc, 0xaf, 0x88, 0xdb, 0xb5, 0x1e, 0xb1,
+ 0xae, 0x17, 0x5f, 0x29, 0x8d, 0x1c, 0x0a, 0x5c,
+ 0xb9, 0xa7, 0x59, 0x8b, 0x91, 0x41, 0xee, 0x89,
+ 0xe1, 0x0e, 0x7e, 0x0a, 0xee, 0xbc, 0x35, 0xab,
+ 0xf1, 0x5a, 0x58, 0x03, 0xa2, 0xcf, 0x33, 0xa3,
+ 0x74, 0x82, 0xd3, 0xa0, 0x32, 0xfc, 0x3b, 0x9c,
+ 0xdf, 0xc0, 0x3a, 0x76, 0xe1, 0xea, 0xf0, 0x6d,
+ 0xc8, 0xe7, 0x97, 0xec, 0x03, 0xc1, 0x72, 0x94,
+ 0xe5, 0xc4, 0x04, 0x2a, 0x38, 0xb4, 0xef, 0x47,
+ 0x1d, 0xf9, 0xb8, 0x0a, 0xa9, 0x45, 0xc1, 0x63,
+ 0xf8, 0x32, 0xdb, 0x5d, 0xb1, 0xa2, 0x80, 0x8c,
+ 0x23, 0xd3, 0x60, 0xfb, 0xf8, 0x84, 0x57, 0x8b,
+};
+
+const struct testvec bf_cbc_256_1_vectors[] = {
+ {
+ .blkno = 0,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_256_encblkno1_vec0_ctxt,
+ },
+ {
+ .blkno = 1,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_256_encblkno1_vec1_ctxt,
+ },
+ {
+ .blkno = 2,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_256_encblkno1_vec2_ctxt,
+ },
+ {
+ .blkno = 3,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_256_encblkno1_vec3_ctxt,
+ },
+};
+
+/*
+ * IV method encblkno8, blkno 0.
+ */
+static const uint8_t bf_cbc_256_encblkno8_vec0_ctxt[SECSIZE] = {
+ 0x90, 0x3d, 0xd2, 0xc0, 0xd3, 0x75, 0xe8, 0x04,
+ 0x34, 0x66, 0x76, 0x25, 0x70, 0xde, 0x41, 0xf1,
+ 0x35, 0x63, 0x5c, 0xac, 0x8f, 0x28, 0x17, 0xd3,
+ 0xae, 0x43, 0xfd, 0x8a, 0xb8, 0xc2, 0xd3, 0x88,
+ 0xef, 0xfa, 0x21, 0xeb, 0xb4, 0x33, 0x75, 0x69,
+ 0x7d, 0xe9, 0x27, 0x1c, 0x03, 0xcf, 0x90, 0xcf,
+ 0xf0, 0xaa, 0x3e, 0x01, 0x41, 0x24, 0xdc, 0x01,
+ 0x5a, 0xe8, 0x92, 0xea, 0xde, 0x87, 0xbf, 0x75,
+ 0xe4, 0x0b, 0xf7, 0xa3, 0x42, 0x27, 0xc4, 0xde,
+ 0x01, 0x6f, 0x5c, 0xec, 0x6d, 0x37, 0x38, 0xd7,
+ 0x4f, 0x85, 0xc0, 0xc2, 0x3a, 0xa7, 0x2d, 0x15,
+ 0xd5, 0x1c, 0xee, 0x15, 0x13, 0x7a, 0x4e, 0x33,
+ 0xc7, 0x59, 0x93, 0x73, 0xe9, 0xf5, 0x39, 0xb0,
+ 0xad, 0x8b, 0x61, 0xca, 0x4d, 0x31, 0xaa, 0x44,
+ 0xf6, 0x5c, 0xb7, 0x99, 0xe5, 0x92, 0x3d, 0x47,
+ 0x79, 0x9b, 0x29, 0x16, 0xe1, 0x2c, 0x30, 0x8b,
+ 0x1e, 0x17, 0xf0, 0x91, 0x59, 0x00, 0xab, 0x6d,
+ 0x4d, 0xa7, 0x4d, 0x96, 0xc3, 0xe4, 0x3d, 0x17,
+ 0x5c, 0x8e, 0xfc, 0x59, 0x48, 0xd4, 0xdd, 0xf4,
+ 0xea, 0x3a, 0x68, 0xc8, 0xb1, 0x74, 0x69, 0xcb,
+ 0x49, 0x1a, 0xec, 0x24, 0x4e, 0x7e, 0xe9, 0xba,
+ 0x75, 0xfb, 0x52, 0x85, 0x75, 0xe9, 0x41, 0x9a,
+ 0xc6, 0x40, 0x9c, 0x92, 0x3f, 0xe8, 0x99, 0x81,
+ 0x84, 0x14, 0x2b, 0x62, 0x94, 0xba, 0x56, 0x00,
+ 0xde, 0x88, 0xe1, 0x35, 0xea, 0x25, 0x88, 0xd1,
+ 0xce, 0xd4, 0xfc, 0xde, 0xee, 0x1a, 0xfd, 0xb1,
+ 0xa7, 0x46, 0x9d, 0x0c, 0x99, 0xa6, 0xab, 0x23,
+ 0x55, 0x2f, 0x46, 0xd7, 0xb3, 0xcd, 0x2c, 0xab,
+ 0x93, 0x3e, 0xdb, 0xe2, 0x34, 0x69, 0x1a, 0x56,
+ 0x21, 0x92, 0x56, 0xf4, 0x05, 0xe1, 0x24, 0xee,
+ 0x4d, 0x5e, 0x89, 0xeb, 0x23, 0x26, 0xdc, 0x14,
+ 0xde, 0x56, 0x3f, 0x0c, 0x15, 0x3e, 0x42, 0x71,
+ 0x9b, 0xe8, 0xc5, 0xfd, 0x5e, 0x4a, 0xb6, 0xd9,
+ 0xa0, 0x18, 0x5d, 0xbd, 0xef, 0x80, 0xb4, 0xf6,
+ 0x1e, 0x56, 0x2a, 0x57, 0x13, 0xba, 0x24, 0xa4,
+ 0x6f, 0x4c, 0xd4, 0xaa, 0x31, 0x5e, 0x69, 0x26,
+ 0xd2, 0xee, 0xef, 0x7f, 0x83, 0x9c, 0x8e, 0x6a,
+ 0x17, 0xe3, 0xda, 0xf4, 0x59, 0xad, 0x26, 0x83,
+ 0x53, 0x4c, 0x0d, 0x62, 0xe5, 0x9a, 0x30, 0xc5,
+ 0x0a, 0xa8, 0xb1, 0x3b, 0x1b, 0x41, 0x5c, 0x74,
+ 0x42, 0x7b, 0x0c, 0x9e, 0x3c, 0x12, 0x04, 0x46,
+ 0xc3, 0xc7, 0x10, 0xea, 0xf1, 0x3b, 0xb1, 0x01,
+ 0xfe, 0x1b, 0xe8, 0xf8, 0x42, 0xbc, 0xe9, 0x11,
+ 0x9b, 0x63, 0x29, 0x99, 0x18, 0x79, 0x9e, 0xd2,
+ 0xbf, 0x9d, 0x93, 0x4d, 0x16, 0x0f, 0x14, 0x41,
+ 0xb6, 0x0c, 0xa5, 0x07, 0x13, 0x29, 0x21, 0x0d,
+ 0x8f, 0xf9, 0x0a, 0x0a, 0x54, 0xaf, 0xa6, 0x22,
+ 0x25, 0x79, 0x07, 0xe5, 0x3e, 0x49, 0x6b, 0x12,
+ 0x9e, 0xfc, 0x91, 0xdb, 0xf3, 0x7c, 0xdf, 0x03,
+ 0x9c, 0x78, 0xa7, 0xc3, 0x5e, 0x14, 0xde, 0xb5,
+ 0x6a, 0x7b, 0x3b, 0xe3, 0x4f, 0x8a, 0x49, 0xce,
+ 0xc9, 0x14, 0x29, 0x96, 0x84, 0xca, 0xe1, 0x49,
+ 0x41, 0x73, 0xb3, 0x2a, 0xbe, 0x37, 0xb6, 0x2d,
+ 0xff, 0xf2, 0x8e, 0x3d, 0x02, 0xeb, 0xd4, 0xd3,
+ 0x15, 0x8f, 0xc0, 0x00, 0x91, 0xd5, 0xe7, 0x76,
+ 0xf5, 0x6e, 0x81, 0x38, 0x38, 0x07, 0xa6, 0xe8,
+ 0x72, 0x14, 0x3b, 0x36, 0xef, 0xbc, 0x5b, 0x26,
+ 0xb0, 0x60, 0x25, 0x49, 0x7e, 0xfc, 0xd8, 0x3b,
+ 0x63, 0xdc, 0x7f, 0x80, 0xd5, 0x43, 0x78, 0xbb,
+ 0xf1, 0xf9, 0x3e, 0x75, 0x1d, 0x58, 0xb2, 0xc7,
+ 0xb6, 0x52, 0xfb, 0xe7, 0x42, 0xef, 0x87, 0xfd,
+ 0x3a, 0x02, 0x7a, 0xf9, 0xbc, 0xa8, 0x2f, 0xd6,
+ 0xc1, 0x5f, 0xa4, 0x57, 0x62, 0x83, 0x82, 0x8e,
+ 0x1e, 0xbb, 0x85, 0xf7, 0x1b, 0x2e, 0xe2, 0xb0,
+};
+
+/*
+ * IV method encblkno8, blkno 1.
+ */
+static const uint8_t bf_cbc_256_encblkno8_vec1_ctxt[SECSIZE] = {
+ 0x2b, 0xf6, 0xd4, 0x61, 0x3b, 0x1f, 0x5b, 0xe9,
+ 0x32, 0xab, 0x27, 0xa1, 0xaf, 0x5e, 0xf4, 0xa7,
+ 0xaa, 0xc5, 0x2a, 0x3c, 0x0d, 0x34, 0xd8, 0xb3,
+ 0xfd, 0xb2, 0xca, 0xfb, 0x3c, 0x38, 0x96, 0x71,
+ 0x47, 0xaa, 0xa7, 0x2f, 0x48, 0x2c, 0x39, 0x88,
+ 0x2d, 0xc6, 0xb1, 0xf7, 0xc7, 0x2d, 0xda, 0xe9,
+ 0xfb, 0x4f, 0x9b, 0x1f, 0xe1, 0x0c, 0x24, 0x89,
+ 0xfe, 0x70, 0xe0, 0xb2, 0x51, 0x89, 0x51, 0xa9,
+ 0xae, 0xd1, 0x92, 0x4f, 0x56, 0x5c, 0x2a, 0xf4,
+ 0xbc, 0x4e, 0x77, 0x4a, 0xb8, 0xab, 0x02, 0x76,
+ 0xef, 0x69, 0xfb, 0x5e, 0x06, 0xb5, 0xff, 0x31,
+ 0xce, 0x2b, 0xfc, 0x48, 0x4c, 0x82, 0xe9, 0x3c,
+ 0x61, 0x69, 0x68, 0x1d, 0xb1, 0xc6, 0x40, 0x10,
+ 0xd7, 0x0e, 0xd2, 0x26, 0x33, 0x5b, 0x0b, 0xe7,
+ 0xc2, 0xbe, 0xf4, 0x24, 0x1a, 0xa6, 0x70, 0x31,
+ 0xa7, 0x15, 0x76, 0xc7, 0x90, 0x8d, 0x60, 0xe0,
+ 0xee, 0x5b, 0x73, 0xa9, 0xe1, 0xe1, 0xaf, 0xf0,
+ 0x5e, 0x6f, 0x32, 0x98, 0x92, 0xbe, 0x24, 0x81,
+ 0x26, 0x9f, 0xb8, 0x67, 0xd0, 0xca, 0x9d, 0x8f,
+ 0x14, 0xc8, 0x81, 0x2e, 0x57, 0x1c, 0x3a, 0xe0,
+ 0xdb, 0x49, 0xad, 0x47, 0x51, 0x07, 0x7d, 0xec,
+ 0xbc, 0xa5, 0x8f, 0xdf, 0x84, 0xe4, 0xdf, 0x76,
+ 0x8f, 0x0b, 0xef, 0xc4, 0x41, 0xd5, 0x7c, 0xf5,
+ 0x3c, 0x21, 0x62, 0xc0, 0x1f, 0xbd, 0x39, 0xbe,
+ 0xe5, 0x75, 0x64, 0xcd, 0xa4, 0xa0, 0x03, 0xf4,
+ 0x8a, 0x16, 0x3e, 0xde, 0x79, 0x9a, 0x96, 0xff,
+ 0xf2, 0xbe, 0x88, 0xfd, 0xac, 0xc1, 0x9d, 0x5b,
+ 0xbf, 0x2f, 0xde, 0xf0, 0x26, 0x2f, 0xc9, 0x45,
+ 0xbd, 0x26, 0xa5, 0x2c, 0x3c, 0x12, 0x8b, 0xc0,
+ 0xc8, 0x7a, 0x71, 0xbb, 0xc3, 0xe9, 0xf6, 0x15,
+ 0x01, 0x6e, 0x94, 0x37, 0xbc, 0xc5, 0x9a, 0x93,
+ 0x6f, 0x9c, 0x04, 0x7e, 0xe9, 0xb2, 0xba, 0xe8,
+ 0x86, 0xa1, 0x9c, 0x1f, 0x4b, 0x77, 0x6f, 0x99,
+ 0x2d, 0x8f, 0x23, 0x34, 0x32, 0x1a, 0x82, 0x2d,
+ 0x32, 0x41, 0x3e, 0xb8, 0x6a, 0x67, 0xa9, 0x81,
+ 0xd5, 0x1b, 0x76, 0x9f, 0xd1, 0xb0, 0x06, 0xaf,
+ 0x10, 0x9e, 0x00, 0x2e, 0xb3, 0x80, 0xde, 0xae,
+ 0xf2, 0x96, 0x12, 0x5b, 0xe7, 0xc7, 0x25, 0xb7,
+ 0xd9, 0x1c, 0x04, 0xe5, 0x05, 0xaf, 0x77, 0xfa,
+ 0x6d, 0xa8, 0x04, 0x74, 0xf8, 0x9c, 0x09, 0xcf,
+ 0xe2, 0xc2, 0xd1, 0xb6, 0xac, 0xed, 0xb4, 0xbc,
+ 0x2e, 0xc2, 0xf6, 0x3c, 0xc4, 0x47, 0xc8, 0x81,
+ 0x3a, 0x50, 0x3c, 0x5c, 0x7c, 0x86, 0x17, 0x22,
+ 0xe7, 0xa3, 0xff, 0x73, 0x5e, 0x91, 0xbf, 0xb3,
+ 0x59, 0x07, 0xb7, 0xa4, 0xd5, 0x1b, 0x5c, 0xce,
+ 0x56, 0xde, 0x5f, 0xae, 0x89, 0xcb, 0x6a, 0xfe,
+ 0xaf, 0xe7, 0xd4, 0x34, 0x8d, 0x18, 0x22, 0x4d,
+ 0xd9, 0x91, 0xa6, 0xec, 0x97, 0x0e, 0x29, 0x4d,
+ 0xf6, 0xd8, 0xb3, 0x50, 0x1c, 0xc9, 0x66, 0x9d,
+ 0x2e, 0x5e, 0x27, 0xce, 0x36, 0xcb, 0x47, 0x35,
+ 0x41, 0x16, 0x0c, 0x4e, 0x73, 0x90, 0x52, 0xc5,
+ 0x65, 0xb8, 0x0c, 0xdc, 0x36, 0x8d, 0xdc, 0xca,
+ 0x97, 0x0b, 0xbc, 0xcb, 0x79, 0xc7, 0x4c, 0xd2,
+ 0x21, 0x5c, 0xbd, 0xeb, 0xea, 0xfb, 0x87, 0xe1,
+ 0xe0, 0x75, 0x39, 0xb9, 0x84, 0x1e, 0xa7, 0xfe,
+ 0x7d, 0x41, 0x75, 0x15, 0x88, 0x98, 0xd4, 0x80,
+ 0x42, 0x57, 0xb5, 0x65, 0xbf, 0xb8, 0xbd, 0x19,
+ 0x28, 0xd8, 0xa7, 0x6c, 0xe7, 0xc1, 0x00, 0xdc,
+ 0xde, 0xcb, 0x30, 0x3d, 0x29, 0x5e, 0xa6, 0x9c,
+ 0xbb, 0xb8, 0xec, 0x28, 0x23, 0x36, 0x23, 0x27,
+ 0xee, 0xdd, 0x24, 0x7d, 0x9a, 0xc9, 0xb5, 0x3c,
+ 0x7a, 0x3f, 0x1d, 0xd9, 0x32, 0x47, 0xc0, 0x4d,
+ 0x86, 0x9b, 0x2d, 0xa9, 0x5c, 0x93, 0x90, 0x51,
+ 0x70, 0xe6, 0x8f, 0x35, 0x96, 0xe0, 0x11, 0x00,
+};
+
+/*
+ * IV method encblkno8, blkno 2.
+ */
+static const uint8_t bf_cbc_256_encblkno8_vec2_ctxt[SECSIZE] = {
+ 0x28, 0x93, 0x0f, 0x23, 0xfb, 0xa4, 0x9e, 0xe5,
+ 0x11, 0x38, 0x2b, 0xbd, 0x8d, 0x2d, 0xdb, 0x11,
+ 0xfa, 0xac, 0x74, 0x28, 0x95, 0x29, 0xf2, 0x92,
+ 0x8d, 0x00, 0x8a, 0x8a, 0x04, 0x92, 0x92, 0x33,
+ 0x8c, 0x4b, 0x29, 0x8e, 0xde, 0x59, 0xf4, 0x72,
+ 0xae, 0x2f, 0xe4, 0xe9, 0xd4, 0xe4, 0xb6, 0x69,
+ 0xc5, 0x1b, 0xbe, 0x02, 0x85, 0x4b, 0x24, 0x1e,
+ 0x79, 0xb9, 0x22, 0x29, 0x4c, 0x60, 0x8c, 0xc5,
+ 0x03, 0x1d, 0x79, 0xfe, 0x3d, 0x9e, 0x47, 0xb6,
+ 0xf7, 0x17, 0x65, 0x24, 0x15, 0x5d, 0x75, 0x4d,
+ 0xdb, 0xbc, 0x68, 0x67, 0x3b, 0xc3, 0x5a, 0x7e,
+ 0x9d, 0x98, 0x67, 0xe4, 0x8f, 0x9a, 0xd1, 0x31,
+ 0xe0, 0x26, 0xa1, 0x68, 0xbe, 0x53, 0x73, 0x7c,
+ 0xfd, 0xce, 0x6c, 0xd6, 0x1f, 0x51, 0xe6, 0x84,
+ 0x54, 0x7a, 0xe3, 0x7f, 0x7c, 0x8f, 0x2f, 0x88,
+ 0x58, 0xfe, 0x5e, 0x82, 0x11, 0xc9, 0xa5, 0x89,
+ 0xa4, 0x49, 0x92, 0x21, 0x0f, 0x03, 0xdb, 0x16,
+ 0xc4, 0xc0, 0x80, 0xb7, 0x16, 0x4c, 0x29, 0xbe,
+ 0x18, 0xfa, 0x2d, 0xdf, 0x4a, 0x23, 0x34, 0x9a,
+ 0x27, 0xea, 0xed, 0x95, 0x25, 0x14, 0xa8, 0x2e,
+ 0x17, 0x59, 0x04, 0xb0, 0x5c, 0x6d, 0xc7, 0xeb,
+ 0xed, 0xf6, 0x73, 0xae, 0x18, 0x0e, 0x4b, 0xec,
+ 0xc6, 0xb7, 0x39, 0xe7, 0x62, 0xf0, 0x84, 0x30,
+ 0x10, 0xb6, 0xf3, 0x27, 0x6d, 0xfe, 0x32, 0xe7,
+ 0xfe, 0xff, 0x43, 0xba, 0x89, 0xfe, 0x24, 0xa8,
+ 0x0e, 0x7c, 0xf2, 0x23, 0x9d, 0x66, 0x6f, 0x9c,
+ 0xe6, 0x88, 0xbc, 0x3f, 0x44, 0x4c, 0x73, 0x13,
+ 0x77, 0x95, 0x6f, 0xcb, 0xc8, 0xa5, 0x7a, 0xa9,
+ 0xeb, 0xe1, 0x0f, 0x9e, 0x25, 0xbe, 0x99, 0x1a,
+ 0x99, 0x7f, 0xbb, 0xec, 0x89, 0x91, 0x3e, 0x52,
+ 0xb5, 0xac, 0xc9, 0xd3, 0xea, 0xb0, 0xf2, 0x0c,
+ 0xc8, 0x58, 0x4b, 0x93, 0xa3, 0x9f, 0xad, 0x5a,
+ 0x80, 0x4e, 0x02, 0x20, 0x9d, 0xac, 0x4b, 0xe0,
+ 0x59, 0x4d, 0xb5, 0x51, 0x07, 0xf5, 0xa6, 0xb3,
+ 0xc9, 0x20, 0x58, 0x7e, 0x45, 0xec, 0x58, 0xea,
+ 0x49, 0xbb, 0x03, 0xf5, 0x6c, 0xdd, 0xcc, 0xa3,
+ 0x13, 0x21, 0x79, 0xc9, 0xc2, 0x92, 0x60, 0xd5,
+ 0xb2, 0x3b, 0x74, 0xbc, 0x57, 0xa6, 0x70, 0x36,
+ 0x75, 0xf5, 0x01, 0xd1, 0xb2, 0xe9, 0xfd, 0xc5,
+ 0x93, 0x5e, 0x60, 0x6b, 0xfd, 0xd2, 0x56, 0xc0,
+ 0x1f, 0xe4, 0xcd, 0x4c, 0xfa, 0xc4, 0xd8, 0xc2,
+ 0x2d, 0xf9, 0x9f, 0x82, 0x0f, 0x40, 0x7b, 0xad,
+ 0x35, 0x63, 0x95, 0x7e, 0x49, 0x4a, 0xfe, 0x8f,
+ 0xaa, 0x57, 0x3a, 0x0c, 0x59, 0x69, 0xe7, 0xb8,
+ 0xfc, 0x71, 0x5c, 0x4f, 0x18, 0x12, 0xe5, 0xef,
+ 0xdb, 0x1f, 0x66, 0x9a, 0xe2, 0x1a, 0x92, 0x1f,
+ 0xfe, 0x20, 0x81, 0xe5, 0x83, 0x97, 0xfb, 0xaf,
+ 0xeb, 0x31, 0x6c, 0x81, 0xf2, 0x2f, 0xf4, 0x41,
+ 0xf1, 0xd9, 0x61, 0xfb, 0x36, 0x4e, 0xab, 0xc5,
+ 0x8b, 0x9c, 0x37, 0xea, 0x88, 0xeb, 0x1e, 0x4c,
+ 0x84, 0x1a, 0xac, 0x4c, 0x19, 0x39, 0x51, 0x53,
+ 0xe0, 0x50, 0xb0, 0xdf, 0xe6, 0xc5, 0xbb, 0x80,
+ 0x06, 0x30, 0x14, 0xf5, 0x0e, 0x73, 0xd2, 0xdb,
+ 0x19, 0x45, 0x30, 0xdc, 0xd0, 0x4d, 0xe6, 0xd6,
+ 0x0e, 0x2d, 0x77, 0xa3, 0xb3, 0x27, 0xda, 0x99,
+ 0x62, 0x88, 0x35, 0xba, 0x64, 0x15, 0xec, 0xaf,
+ 0x70, 0x97, 0x94, 0x81, 0x30, 0x6d, 0x63, 0x42,
+ 0x71, 0x3e, 0x06, 0xec, 0x50, 0x96, 0x87, 0x59,
+ 0xe7, 0x26, 0x9c, 0xcf, 0xc7, 0xe7, 0x62, 0x82,
+ 0x3b, 0xd7, 0xfe, 0xb4, 0x48, 0x45, 0x9d, 0x54,
+ 0x18, 0x15, 0x13, 0x74, 0x92, 0x6f, 0x43, 0xb3,
+ 0xa9, 0x82, 0xd4, 0xc2, 0xef, 0x61, 0x9d, 0x5e,
+ 0x1d, 0xc6, 0x80, 0xd3, 0xe9, 0xdd, 0x52, 0x9c,
+ 0x4d, 0x04, 0x05, 0xa0, 0x43, 0x36, 0xb6, 0x89,
+};
+
+/*
+ * IV method encblkno8, blkno 3.
+ */
+static const uint8_t bf_cbc_256_encblkno8_vec3_ctxt[SECSIZE] = {
+ 0x60, 0x91, 0x19, 0x89, 0xee, 0xac, 0x12, 0xe5,
+ 0x60, 0x6c, 0xfd, 0xf9, 0xe4, 0xc6, 0xc9, 0xbd,
+ 0x75, 0xe1, 0xa5, 0xe6, 0xf4, 0xed, 0x4b, 0xf4,
+ 0x16, 0xf4, 0x57, 0xa4, 0xe6, 0x60, 0x8e, 0x1b,
+ 0x97, 0x0e, 0xd5, 0x09, 0xa1, 0x3c, 0x6c, 0xe8,
+ 0x91, 0xaf, 0x19, 0x96, 0x2a, 0x7b, 0x77, 0x30,
+ 0xc7, 0x99, 0xe6, 0xaa, 0xb0, 0xe2, 0x29, 0x1c,
+ 0x39, 0x54, 0x1c, 0x0a, 0x4a, 0x51, 0xa2, 0xa2,
+ 0x22, 0x96, 0x05, 0x8b, 0x12, 0x80, 0x16, 0x28,
+ 0xdc, 0xfa, 0x22, 0x90, 0xa4, 0x33, 0xb1, 0x84,
+ 0x13, 0x52, 0x5d, 0xb5, 0xd4, 0xe8, 0x60, 0x18,
+ 0x6a, 0xb8, 0x1b, 0xdb, 0xb4, 0x69, 0xf6, 0x09,
+ 0x95, 0x71, 0xdd, 0x43, 0x21, 0xad, 0x7e, 0xf7,
+ 0x8e, 0x7a, 0x0d, 0xf0, 0x52, 0x54, 0xb8, 0xdc,
+ 0x7d, 0x72, 0x29, 0x97, 0x2b, 0x9c, 0x2c, 0xef,
+ 0xc3, 0x26, 0x68, 0x72, 0xae, 0x29, 0x0f, 0x67,
+ 0xbf, 0xea, 0x92, 0x27, 0xd1, 0xba, 0x8d, 0x32,
+ 0x8b, 0x26, 0x91, 0x30, 0x88, 0xcc, 0x47, 0xaf,
+ 0x54, 0x8c, 0x88, 0x88, 0x2f, 0x59, 0x76, 0x34,
+ 0x43, 0x35, 0x44, 0xc3, 0x16, 0x28, 0x62, 0x4b,
+ 0xbb, 0x47, 0x99, 0x7c, 0x26, 0x51, 0xe2, 0x7d,
+ 0xd8, 0x2c, 0x35, 0xf4, 0x24, 0xf1, 0x5b, 0x01,
+ 0xcc, 0x9a, 0x54, 0xd8, 0xc1, 0x73, 0x85, 0x83,
+ 0xdd, 0x0d, 0xd5, 0x75, 0xac, 0x67, 0x68, 0x59,
+ 0x3e, 0x6e, 0x9a, 0x4a, 0x7f, 0xbd, 0x85, 0xeb,
+ 0x36, 0x3e, 0xfd, 0x03, 0xfe, 0x2b, 0xe6, 0x97,
+ 0x16, 0x6b, 0xd0, 0x22, 0xb1, 0x00, 0xcc, 0x7c,
+ 0x03, 0xb1, 0x7c, 0x23, 0x7a, 0xca, 0x5e, 0x0b,
+ 0xba, 0x37, 0xa6, 0x08, 0x5b, 0xa6, 0x2b, 0x57,
+ 0x58, 0x0b, 0x5a, 0x58, 0x91, 0x3c, 0xf9, 0x46,
+ 0x05, 0x03, 0x0a, 0x9b, 0xca, 0x2d, 0x71, 0xe2,
+ 0xbb, 0x1e, 0xd3, 0xc5, 0xc2, 0xb4, 0xde, 0x7b,
+ 0xbb, 0x8b, 0x45, 0x39, 0xf5, 0x3d, 0xa2, 0xe5,
+ 0xb1, 0x40, 0x3b, 0x9e, 0x47, 0x93, 0xf9, 0x9c,
+ 0x50, 0x5c, 0x9b, 0x8d, 0x18, 0x47, 0xd3, 0xe8,
+ 0x61, 0xbc, 0x93, 0xdc, 0xf7, 0x20, 0x5a, 0x00,
+ 0x0e, 0xb8, 0xee, 0x5e, 0x83, 0x06, 0x48, 0x06,
+ 0x91, 0x08, 0x9e, 0x9c, 0x73, 0x6d, 0xb9, 0x31,
+ 0x62, 0xdc, 0x8a, 0x37, 0x17, 0x47, 0x2f, 0x0f,
+ 0xc0, 0x02, 0x02, 0xf3, 0x06, 0x26, 0x6c, 0x9d,
+ 0x96, 0x9f, 0xb0, 0xb3, 0x3b, 0x72, 0x18, 0x59,
+ 0xf4, 0xb7, 0x26, 0xcc, 0xa4, 0x46, 0xdb, 0x51,
+ 0xad, 0xed, 0xd8, 0x3a, 0xc4, 0x3a, 0x09, 0x30,
+ 0x72, 0xd9, 0x2c, 0xfe, 0x5f, 0xa8, 0x46, 0x75,
+ 0xf7, 0xba, 0x46, 0x1e, 0x7e, 0x4c, 0xd6, 0xdd,
+ 0x92, 0x2b, 0x23, 0xc6, 0x59, 0x19, 0xda, 0x9a,
+ 0x01, 0x9c, 0x5c, 0xc1, 0xaa, 0xcf, 0x6d, 0xd0,
+ 0xa5, 0x06, 0xc7, 0x5e, 0x6b, 0x60, 0x64, 0x9f,
+ 0xfe, 0xa8, 0x3f, 0x64, 0xa8, 0xed, 0xf8, 0x62,
+ 0xd7, 0x6d, 0x34, 0x41, 0x3e, 0x5e, 0x74, 0xc7,
+ 0xe6, 0x62, 0xb1, 0x5a, 0xec, 0x6a, 0xc1, 0x71,
+ 0x19, 0xf3, 0xf1, 0xe7, 0x46, 0x13, 0xd6, 0xb6,
+ 0x5a, 0xf4, 0xca, 0x3f, 0xe3, 0xa1, 0x1f, 0xe4,
+ 0xda, 0xd6, 0x0c, 0x62, 0x6a, 0x33, 0x42, 0x99,
+ 0x6f, 0x5d, 0x3a, 0xe0, 0xe7, 0xfa, 0x2d, 0x47,
+ 0x4a, 0xec, 0xaa, 0x71, 0xb5, 0xeb, 0x62, 0xb8,
+ 0x31, 0x34, 0x07, 0x44, 0xa2, 0x18, 0xec, 0x76,
+ 0xf7, 0x77, 0x56, 0x86, 0xc7, 0xe0, 0x1e, 0x8e,
+ 0xec, 0x16, 0x2b, 0xeb, 0xff, 0xaa, 0xba, 0x83,
+ 0x1f, 0xdc, 0x32, 0x23, 0x27, 0xea, 0xea, 0x0c,
+ 0x3a, 0x5f, 0x2b, 0xb4, 0xee, 0x0c, 0xf2, 0x73,
+ 0xbb, 0x59, 0x9b, 0x73, 0xf7, 0xfa, 0xe1, 0x1f,
+ 0x3b, 0xdb, 0x40, 0x29, 0xf0, 0x6c, 0xbe, 0x8f,
+ 0x2e, 0xd0, 0x83, 0xf7, 0xe8, 0x2a, 0x81, 0x82,
+};
+
+const struct testvec bf_cbc_256_8_vectors[] = {
+ {
+ .blkno = 0,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_256_encblkno8_vec0_ctxt,
+ },
+ {
+ .blkno = 1,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_256_encblkno8_vec1_ctxt,
+ },
+ {
+ .blkno = 2,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_256_encblkno8_vec2_ctxt,
+ },
+ {
+ .blkno = 3,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_256_encblkno8_vec3_ctxt,
+ },
+};
+
+/*
+ * IV method encblkno1, blkno 0.
+ */
+static const uint8_t bf_cbc_448_encblkno1_vec0_ctxt[SECSIZE] = {
+ 0xb0, 0x1b, 0x43, 0xc9, 0x84, 0x53, 0x51, 0x72,
+ 0x1f, 0x93, 0x62, 0x94, 0x13, 0x1f, 0xe3, 0xc1,
+ 0x30, 0xee, 0xc4, 0x35, 0x98, 0xb8, 0x11, 0x9b,
+ 0xd1, 0x23, 0xfa, 0x2d, 0xc1, 0xe6, 0xf3, 0x8f,
+ 0x8b, 0x05, 0x8d, 0xc5, 0x1d, 0xc3, 0x29, 0x1a,
+ 0xff, 0x08, 0xb0, 0x97, 0x88, 0x50, 0x8f, 0x41,
+ 0x66, 0xc6, 0x70, 0x37, 0xca, 0xb2, 0xcd, 0x91,
+ 0x89, 0x41, 0x1b, 0x42, 0xce, 0x02, 0xec, 0xe8,
+ 0x9b, 0xf3, 0x50, 0x95, 0x5f, 0xba, 0xda, 0xd5,
+ 0x0c, 0x2f, 0x29, 0x2a, 0x14, 0x96, 0x4a, 0x60,
+ 0x04, 0x43, 0x62, 0x80, 0x89, 0xcf, 0xfd, 0xb6,
+ 0xc7, 0x2d, 0xb2, 0xac, 0xce, 0x51, 0xf5, 0xd1,
+ 0xcd, 0x41, 0x59, 0x8b, 0xf5, 0x02, 0x2d, 0xe8,
+ 0xc4, 0xee, 0xe9, 0x40, 0x6f, 0xcd, 0xbe, 0x3b,
+ 0xd0, 0x8d, 0x3e, 0x6c, 0x42, 0x2a, 0x17, 0xfd,
+ 0x78, 0xf6, 0xb2, 0xde, 0x69, 0x81, 0xbb, 0xae,
+ 0xd9, 0x1f, 0x49, 0xa6, 0x4c, 0x5a, 0xe9, 0x94,
+ 0x49, 0x9b, 0x7e, 0x32, 0x6d, 0x11, 0xea, 0x88,
+ 0xda, 0xf0, 0xc7, 0x8d, 0x07, 0x98, 0xab, 0xc7,
+ 0xf3, 0xcf, 0x2e, 0xda, 0x27, 0x44, 0x68, 0xc7,
+ 0xdc, 0xda, 0x00, 0xd0, 0x6d, 0x64, 0x5b, 0x39,
+ 0x46, 0x3d, 0x98, 0x24, 0xee, 0x3b, 0x36, 0x23,
+ 0x62, 0xf6, 0x8e, 0xb9, 0x8d, 0xc1, 0x9a, 0x7b,
+ 0xd7, 0x03, 0x6b, 0xb7, 0x81, 0x19, 0xec, 0x2f,
+ 0x0c, 0x0b, 0x32, 0x5a, 0xb3, 0x25, 0xf5, 0xcc,
+ 0xa3, 0x60, 0xe6, 0x4e, 0x03, 0xcd, 0xdc, 0x67,
+ 0xe5, 0x26, 0xda, 0xe0, 0x1f, 0x33, 0x99, 0xc3,
+ 0x43, 0x8c, 0x9c, 0x1a, 0x85, 0xb1, 0x15, 0x04,
+ 0xc1, 0x06, 0xd1, 0x2d, 0xc9, 0x67, 0x72, 0xe7,
+ 0xd6, 0x6d, 0x1f, 0x22, 0x56, 0x56, 0xfa, 0x8a,
+ 0xd7, 0x16, 0x37, 0x3f, 0x3e, 0x67, 0xa5, 0xb7,
+ 0xee, 0x3e, 0xd2, 0x38, 0xd5, 0xce, 0xa9, 0x62,
+ 0x82, 0x17, 0xae, 0xae, 0x62, 0xe6, 0xb7, 0xf2,
+ 0x73, 0xf1, 0xc1, 0xb7, 0xe9, 0x62, 0x79, 0x3b,
+ 0x3b, 0x3f, 0xaa, 0x0d, 0x42, 0x03, 0x35, 0x3f,
+ 0x5d, 0xa4, 0xba, 0x02, 0x23, 0x65, 0x40, 0x0e,
+ 0x61, 0x31, 0xc9, 0xd5, 0x79, 0x36, 0x76, 0x7c,
+ 0x21, 0x4a, 0x75, 0xb2, 0xa0, 0x2b, 0xc1, 0xb8,
+ 0xba, 0xf8, 0x10, 0x7a, 0x85, 0x32, 0x81, 0xbf,
+ 0x2d, 0x58, 0x3c, 0x22, 0x2f, 0x0b, 0xce, 0x03,
+ 0x12, 0xce, 0x13, 0xce, 0x4a, 0x81, 0x77, 0x1d,
+ 0x68, 0x99, 0xc0, 0x25, 0xeb, 0xd9, 0x80, 0x0d,
+ 0xe7, 0x17, 0xc8, 0x41, 0xbd, 0x4b, 0x9c, 0xdd,
+ 0x41, 0x74, 0x90, 0x2a, 0x65, 0x92, 0x05, 0xff,
+ 0x06, 0x24, 0xeb, 0x89, 0xd8, 0x41, 0xaa, 0x41,
+ 0xac, 0x8a, 0x31, 0xc6, 0x82, 0x44, 0x12, 0x5a,
+ 0xd9, 0x1c, 0xca, 0x76, 0x2b, 0x4e, 0xe8, 0x18,
+ 0x7e, 0x50, 0xf5, 0x8c, 0x7c, 0x11, 0xe7, 0x0e,
+ 0xfd, 0x08, 0x5e, 0x64, 0x8b, 0x5b, 0x9f, 0x94,
+ 0x8b, 0x0d, 0x83, 0x7e, 0xef, 0x89, 0x30, 0x4a,
+ 0x55, 0xce, 0x10, 0x5f, 0x15, 0xd2, 0xe7, 0x07,
+ 0x0c, 0x34, 0x92, 0xda, 0xae, 0x84, 0x26, 0x28,
+ 0x36, 0x1a, 0x96, 0xc6, 0xf1, 0x41, 0x2b, 0xb6,
+ 0x01, 0xfe, 0x20, 0x05, 0x43, 0x80, 0x45, 0xdf,
+ 0x5c, 0xc2, 0x96, 0xc8, 0x41, 0x68, 0x87, 0x78,
+ 0xbc, 0xf8, 0x34, 0xfb, 0x19, 0x61, 0xab, 0x7f,
+ 0x15, 0x56, 0x7f, 0x1a, 0xf5, 0x08, 0xf1, 0x1c,
+ 0x59, 0x70, 0x92, 0x3a, 0xda, 0x1a, 0xfd, 0xfc,
+ 0x4d, 0xe1, 0x12, 0x61, 0xc1, 0xd8, 0xdb, 0x63,
+ 0x6e, 0x6b, 0x19, 0x96, 0x68, 0x17, 0x9b, 0xf5,
+ 0xa9, 0x5d, 0x2c, 0xaf, 0xad, 0xc6, 0x26, 0x9e,
+ 0x09, 0xcb, 0x67, 0x4e, 0x50, 0x7d, 0x2f, 0xae,
+ 0x4e, 0x73, 0xd9, 0x5a, 0xaa, 0x5d, 0x54, 0x20,
+ 0x7b, 0x77, 0xcf, 0xf8, 0xad, 0x88, 0x6b, 0xc8,
+};
+
+/*
+ * IV method encblkno1, blkno 1.
+ */
+static const uint8_t bf_cbc_448_encblkno1_vec1_ctxt[SECSIZE] = {
+ 0x8b, 0x2a, 0xcf, 0x7d, 0x38, 0x1b, 0xaa, 0x33,
+ 0x1c, 0xe6, 0xa1, 0x37, 0x6e, 0x9e, 0xb3, 0x48,
+ 0x2a, 0xb8, 0x61, 0x11, 0x00, 0xe5, 0x48, 0xea,
+ 0xb5, 0x9f, 0x6c, 0xa4, 0xdf, 0x8d, 0x5a, 0xd8,
+ 0x03, 0x55, 0x4d, 0x07, 0x7d, 0x5f, 0x1b, 0x18,
+ 0xd1, 0x86, 0x52, 0xc1, 0x13, 0xda, 0x99, 0x23,
+ 0xeb, 0xab, 0xb2, 0x93, 0x40, 0x7c, 0x6a, 0x8a,
+ 0xaa, 0xf8, 0xf1, 0x66, 0xf1, 0x10, 0x1d, 0xcd,
+ 0x25, 0xc7, 0x84, 0x55, 0x02, 0x1d, 0xc0, 0x3c,
+ 0xba, 0xf4, 0xbf, 0xe2, 0xe4, 0xc3, 0x57, 0xdc,
+ 0x0d, 0xfd, 0xeb, 0xb3, 0x7d, 0x31, 0x82, 0x6b,
+ 0x5c, 0x0e, 0x92, 0xa5, 0x42, 0x8b, 0x7f, 0x36,
+ 0x74, 0x4d, 0xfd, 0x2f, 0xd7, 0x19, 0x0d, 0x23,
+ 0xa7, 0x36, 0xe8, 0xe4, 0xe5, 0xff, 0xc8, 0x0d,
+ 0xe1, 0x48, 0x25, 0x79, 0xa9, 0x22, 0xac, 0x72,
+ 0x86, 0x28, 0xcb, 0x63, 0xa6, 0xa0, 0x46, 0x08,
+ 0x53, 0xb8, 0x59, 0xab, 0x0f, 0x8f, 0xb1, 0x78,
+ 0xf8, 0x4e, 0x6d, 0x1a, 0xb5, 0xdd, 0x12, 0x02,
+ 0x57, 0x55, 0xf8, 0xab, 0x78, 0x7d, 0x75, 0x61,
+ 0x81, 0x20, 0xd6, 0x4b, 0x7d, 0x76, 0x05, 0xc9,
+ 0x56, 0xf2, 0xe9, 0x3f, 0xb6, 0xb5, 0x02, 0x2b,
+ 0x1c, 0x29, 0xbf, 0x07, 0xe9, 0x5f, 0x9b, 0x18,
+ 0x38, 0x26, 0xa0, 0x09, 0xde, 0x24, 0x5b, 0x37,
+ 0x72, 0x74, 0xf4, 0x9f, 0x86, 0x28, 0x89, 0xb6,
+ 0x0c, 0x95, 0x24, 0x2f, 0x88, 0x80, 0x6a, 0xc7,
+ 0x3a, 0xdc, 0x89, 0xb0, 0xa3, 0xfe, 0x6e, 0x38,
+ 0xec, 0x0b, 0x1d, 0xbc, 0xd5, 0x90, 0x48, 0xfb,
+ 0xb1, 0x54, 0xac, 0x6e, 0x35, 0xb0, 0x71, 0x9e,
+ 0x57, 0x07, 0x81, 0x90, 0xcb, 0x63, 0xb2, 0x7f,
+ 0x4c, 0x81, 0xe1, 0x58, 0xda, 0x27, 0xef, 0x77,
+ 0xe7, 0xde, 0x96, 0x83, 0x2a, 0xb1, 0x6b, 0x08,
+ 0x62, 0x89, 0xdc, 0x3a, 0x3f, 0x08, 0xff, 0xdc,
+ 0x50, 0x3e, 0xc1, 0xe4, 0x33, 0x8b, 0xad, 0x19,
+ 0x90, 0x0b, 0x8e, 0xc3, 0x55, 0x77, 0xf0, 0xc2,
+ 0x24, 0xf9, 0x0c, 0x99, 0x84, 0xb2, 0xcc, 0x23,
+ 0x8c, 0xab, 0x79, 0x0d, 0xff, 0x75, 0x3a, 0xe0,
+ 0xc9, 0xe8, 0x1e, 0x15, 0x02, 0xd5, 0x67, 0x8e,
+ 0x32, 0xe3, 0x1f, 0xda, 0xfb, 0x88, 0xeb, 0xa5,
+ 0x23, 0xea, 0x1d, 0xaa, 0xc3, 0x62, 0x7f, 0x27,
+ 0x38, 0x2a, 0xf6, 0xa2, 0x6a, 0x0e, 0x05, 0xff,
+ 0xe4, 0x63, 0x70, 0xec, 0xf8, 0x25, 0x96, 0x08,
+ 0xcb, 0x22, 0x2a, 0xaa, 0xbc, 0x45, 0x04, 0xb9,
+ 0xbc, 0x64, 0x07, 0x09, 0x31, 0xee, 0x5f, 0x9a,
+ 0xb1, 0x71, 0x85, 0x10, 0x60, 0xfb, 0x3c, 0x56,
+ 0xeb, 0xfe, 0x91, 0xab, 0x3f, 0x09, 0x76, 0xba,
+ 0x3c, 0xfc, 0xa6, 0x0d, 0xce, 0x9f, 0x59, 0xd4,
+ 0x83, 0x8d, 0x98, 0xf5, 0x0d, 0x60, 0x1f, 0xd1,
+ 0x10, 0x61, 0x77, 0x0d, 0xd1, 0xcd, 0xc2, 0xc2,
+ 0x2c, 0x7d, 0xf6, 0x15, 0x16, 0x90, 0xc9, 0xc5,
+ 0x1e, 0xe9, 0xf5, 0x7b, 0xb4, 0x49, 0x47, 0x91,
+ 0x6a, 0x94, 0x26, 0x94, 0xb3, 0xb5, 0xa7, 0x9e,
+ 0xcb, 0xb1, 0x9c, 0xb7, 0x5d, 0x25, 0x3c, 0x2d,
+ 0x8c, 0xa8, 0xa1, 0xb1, 0x79, 0x8e, 0x60, 0xa2,
+ 0x3e, 0x04, 0xfa, 0x3f, 0xb4, 0x43, 0xde, 0x0a,
+ 0xde, 0xf4, 0x58, 0xe7, 0xd1, 0x04, 0x1d, 0xb7,
+ 0x1d, 0xa6, 0xcb, 0x49, 0x41, 0x30, 0xb5, 0x41,
+ 0xb5, 0x14, 0x19, 0xe4, 0xeb, 0x2c, 0xe2, 0xf0,
+ 0x66, 0x59, 0xe3, 0xc6, 0xb0, 0xd0, 0x1e, 0xaa,
+ 0x9f, 0xa5, 0x0b, 0xb8, 0xfd, 0xae, 0x62, 0xcf,
+ 0x3e, 0xe2, 0xea, 0x79, 0xc5, 0x3e, 0xcf, 0xf0,
+ 0x40, 0x00, 0x8c, 0x81, 0x97, 0xed, 0xac, 0xf9,
+ 0x61, 0x75, 0x4e, 0xd7, 0xb7, 0xb2, 0x02, 0x14,
+ 0x04, 0xf6, 0xbf, 0x25, 0xbe, 0x78, 0x2a, 0xea,
+ 0xd2, 0x61, 0xf2, 0x7e, 0x45, 0x6b, 0x20, 0xca,
+};
+
+/*
+ * IV method encblkno1, blkno 2.
+ */
+static const uint8_t bf_cbc_448_encblkno1_vec2_ctxt[SECSIZE] = {
+ 0x35, 0x34, 0x49, 0x29, 0x12, 0x3f, 0xc6, 0x2f,
+ 0xc9, 0x3d, 0xc9, 0x54, 0x46, 0xf3, 0x26, 0xf9,
+ 0x5e, 0x45, 0xb4, 0xba, 0x6d, 0x0f, 0x98, 0x53,
+ 0x8b, 0x7a, 0x00, 0x47, 0xb6, 0xbd, 0x70, 0x89,
+ 0x60, 0x8e, 0x52, 0x0b, 0xe3, 0x0a, 0xd8, 0x0e,
+ 0x48, 0xf3, 0xcc, 0x66, 0x8d, 0x71, 0xaa, 0x0e,
+ 0xc2, 0x68, 0x03, 0x05, 0xf9, 0xef, 0x1d, 0x14,
+ 0x5a, 0x85, 0x88, 0x70, 0x77, 0xcf, 0xe3, 0xdf,
+ 0x18, 0xe5, 0xfb, 0xea, 0xe1, 0xe8, 0xe0, 0x25,
+ 0xb2, 0x14, 0x61, 0x5d, 0x2f, 0xce, 0x61, 0xec,
+ 0x68, 0xc8, 0x06, 0x60, 0x41, 0xc1, 0xe3, 0x0a,
+ 0x5e, 0x96, 0x15, 0x9b, 0x2c, 0x5b, 0xfd, 0xba,
+ 0x17, 0x2e, 0x50, 0xb6, 0x68, 0x39, 0x21, 0x56,
+ 0x31, 0x2e, 0xb5, 0x29, 0xff, 0x4a, 0x12, 0x34,
+ 0x02, 0x54, 0xb1, 0x7f, 0xd8, 0x35, 0xec, 0x79,
+ 0x9e, 0xef, 0x62, 0xf3, 0x4b, 0x58, 0x96, 0xf1,
+ 0x83, 0x26, 0x57, 0x3d, 0x55, 0xb9, 0xb0, 0xa7,
+ 0x48, 0x65, 0x06, 0xee, 0x14, 0x88, 0xb5, 0x58,
+ 0xc8, 0x4d, 0x6e, 0xd8, 0x44, 0x76, 0x21, 0x16,
+ 0xa4, 0xdf, 0x68, 0x4b, 0xff, 0x69, 0x23, 0x66,
+ 0x18, 0x75, 0xe6, 0x29, 0xea, 0x95, 0x87, 0x1c,
+ 0xed, 0x2d, 0xbd, 0xbf, 0x22, 0x56, 0x11, 0xd5,
+ 0x59, 0x90, 0x24, 0xd7, 0xae, 0xda, 0x99, 0x49,
+ 0xe3, 0x23, 0x03, 0x24, 0x3b, 0x02, 0x49, 0x1d,
+ 0xa5, 0x57, 0x2f, 0xea, 0xd1, 0x6a, 0x17, 0x53,
+ 0x0f, 0xb3, 0xa9, 0x64, 0x8a, 0xdb, 0x62, 0x17,
+ 0xad, 0x5c, 0x7d, 0x56, 0x14, 0x0f, 0xfb, 0x14,
+ 0xbe, 0x7e, 0xa1, 0xa8, 0x27, 0xf0, 0xf0, 0x3a,
+ 0xe7, 0xc5, 0x26, 0x98, 0x9d, 0x29, 0xf7, 0xfd,
+ 0x43, 0x13, 0x34, 0xe2, 0xb8, 0x0b, 0x14, 0xe9,
+ 0x79, 0x66, 0x7a, 0xf2, 0xed, 0x79, 0x37, 0x16,
+ 0x75, 0x2b, 0xf2, 0x99, 0xa1, 0xba, 0xf1, 0xc1,
+ 0x61, 0x8d, 0x78, 0x46, 0x3a, 0x67, 0x58, 0x6a,
+ 0x55, 0x0d, 0x2e, 0x08, 0x47, 0xfc, 0x94, 0x2f,
+ 0x65, 0xa1, 0x1a, 0xfe, 0x05, 0xfa, 0x41, 0x00,
+ 0x6c, 0x42, 0xbc, 0x65, 0x37, 0xd9, 0x25, 0x9c,
+ 0xf4, 0x83, 0x8a, 0xdb, 0x91, 0x96, 0xc5, 0xa9,
+ 0x02, 0x44, 0xbc, 0x9a, 0x26, 0x9c, 0xd1, 0xfa,
+ 0x06, 0x8b, 0xd6, 0x40, 0x8f, 0x0a, 0xd2, 0x5b,
+ 0xd8, 0x57, 0xd5, 0x61, 0x1b, 0x86, 0xa6, 0x49,
+ 0x15, 0xe4, 0x06, 0x6c, 0x48, 0x24, 0xb8, 0xe3,
+ 0x23, 0xed, 0xcf, 0x39, 0x44, 0x4d, 0xf0, 0x4e,
+ 0x89, 0x44, 0x0d, 0x3a, 0xe6, 0x1b, 0x7c, 0x39,
+ 0xfd, 0x79, 0x0e, 0x78, 0xc7, 0xf6, 0xa3, 0x91,
+ 0x18, 0x2a, 0xfb, 0x92, 0x48, 0xcc, 0x8b, 0xbb,
+ 0x33, 0x07, 0x42, 0xf5, 0xd0, 0x01, 0x8b, 0x12,
+ 0xd9, 0x5e, 0x9d, 0xe4, 0x13, 0x99, 0x11, 0x18,
+ 0x86, 0x8a, 0xb7, 0xa6, 0xe2, 0x38, 0x34, 0x12,
+ 0x67, 0xd6, 0x4b, 0xc0, 0x23, 0x56, 0xba, 0x53,
+ 0xbe, 0x20, 0xe5, 0xec, 0x16, 0xf9, 0x74, 0x92,
+ 0x62, 0xfc, 0xb9, 0xe8, 0xa3, 0xbf, 0x3b, 0x06,
+ 0x76, 0xa5, 0xf5, 0x56, 0x81, 0x72, 0x50, 0xc8,
+ 0x55, 0x80, 0x7d, 0xe1, 0x46, 0x92, 0xa1, 0xeb,
+ 0x41, 0xaf, 0xce, 0x52, 0xb1, 0xb3, 0x51, 0xf2,
+ 0xba, 0x03, 0xb4, 0xcb, 0x16, 0xd2, 0x92, 0x3d,
+ 0x0c, 0x9b, 0xe9, 0xd9, 0x5d, 0xcf, 0x79, 0x05,
+ 0xbd, 0xe0, 0x44, 0x39, 0xf0, 0x35, 0x2d, 0x7a,
+ 0x31, 0x3b, 0x24, 0xb3, 0xb4, 0xa5, 0x08, 0xf5,
+ 0xac, 0x51, 0xf1, 0x09, 0x52, 0x14, 0xc7, 0xb5,
+ 0xe0, 0x65, 0x47, 0x30, 0xdd, 0xa4, 0xfd, 0x71,
+ 0x68, 0xa5, 0x4b, 0x00, 0x72, 0xe2, 0xc4, 0xa9,
+ 0x5d, 0x21, 0x6d, 0x83, 0x4e, 0x88, 0xaa, 0x76,
+ 0x07, 0xf0, 0xf7, 0x36, 0xa2, 0x5e, 0xd5, 0x4c,
+ 0x7f, 0x9b, 0x74, 0x89, 0x0a, 0x18, 0xdc, 0x9a,
+};
+
+/*
+ * IV method encblkno1, blkno 3.
+ */
+static const uint8_t bf_cbc_448_encblkno1_vec3_ctxt[SECSIZE] = {
+ 0xc3, 0xd3, 0xae, 0x7e, 0x4f, 0xbe, 0x0d, 0x50,
+ 0xd6, 0x63, 0x2c, 0xa2, 0xfd, 0x07, 0xf1, 0x33,
+ 0x2a, 0x15, 0x8f, 0xd7, 0x63, 0xb6, 0x5f, 0x04,
+ 0x69, 0x90, 0xa3, 0x1a, 0xd3, 0xdd, 0xe0, 0x70,
+ 0xb1, 0xcd, 0xd5, 0xe0, 0x75, 0xd2, 0x31, 0x38,
+ 0xcc, 0x65, 0xbb, 0xc3, 0x3b, 0xc6, 0xc9, 0x33,
+ 0x43, 0x9c, 0x32, 0x69, 0x95, 0x10, 0x74, 0x36,
+ 0x3a, 0x05, 0x9c, 0x26, 0x2f, 0x80, 0x20, 0x92,
+ 0x74, 0x31, 0xc0, 0xf4, 0xb1, 0x42, 0x58, 0xc8,
+ 0x3e, 0xaa, 0xd4, 0xba, 0xba, 0x4b, 0x5f, 0x47,
+ 0x1a, 0x9e, 0x43, 0xaf, 0x25, 0x64, 0x0c, 0x2e,
+ 0xa3, 0xf5, 0xde, 0x6e, 0x28, 0x5e, 0xb9, 0x9e,
+ 0xc9, 0xdf, 0x85, 0xda, 0xc9, 0xa8, 0x30, 0xf9,
+ 0x44, 0x9b, 0x16, 0xcb, 0x4b, 0x47, 0x6f, 0x11,
+ 0x5c, 0xd7, 0xc9, 0xb7, 0x9c, 0x50, 0x04, 0x3b,
+ 0x2f, 0x13, 0xab, 0xb6, 0x72, 0xe7, 0x11, 0x29,
+ 0x35, 0xf3, 0xae, 0x5e, 0x2a, 0xa7, 0x1a, 0xac,
+ 0xb7, 0x4c, 0x7b, 0x69, 0x89, 0xfc, 0xff, 0x37,
+ 0x24, 0xf8, 0x65, 0xc0, 0x87, 0x89, 0x69, 0x1e,
+ 0xa6, 0x7e, 0xe7, 0xb3, 0xb7, 0xa8, 0x42, 0x73,
+ 0x83, 0xdb, 0x56, 0x4f, 0xce, 0xb9, 0x6e, 0x38,
+ 0x40, 0x24, 0xb8, 0xdd, 0xab, 0x25, 0x3b, 0xc6,
+ 0x58, 0xed, 0xc7, 0x2b, 0xe0, 0x11, 0x8b, 0x62,
+ 0xe8, 0x4f, 0xcf, 0xba, 0x2e, 0xd7, 0x6d, 0xf0,
+ 0x14, 0xa5, 0xee, 0x24, 0xd3, 0x3a, 0xb4, 0xf2,
+ 0xdc, 0x0d, 0x79, 0xc6, 0x14, 0x52, 0x14, 0x4b,
+ 0xd1, 0x8c, 0x18, 0xef, 0x1f, 0xd8, 0xe7, 0x60,
+ 0xf3, 0x28, 0xce, 0xf1, 0x59, 0xc8, 0x43, 0x02,
+ 0x0e, 0x08, 0x72, 0xe5, 0x7d, 0x5b, 0xc5, 0x80,
+ 0xfb, 0xca, 0x2a, 0x63, 0x8d, 0x3c, 0x54, 0x04,
+ 0x1e, 0xdf, 0x94, 0x53, 0xf8, 0x44, 0xe5, 0xc2,
+ 0x5c, 0x36, 0xc9, 0x75, 0x1c, 0xa2, 0x98, 0x3d,
+ 0xd6, 0xee, 0x38, 0xf9, 0xab, 0x2d, 0x1a, 0xdb,
+ 0x87, 0x2c, 0x86, 0xfd, 0xf9, 0xb2, 0x4d, 0x21,
+ 0xb7, 0xc0, 0x8f, 0x75, 0x21, 0x53, 0xc7, 0xd7,
+ 0x3e, 0xc6, 0x6c, 0x98, 0x2c, 0x6d, 0x44, 0x13,
+ 0x40, 0xea, 0xaa, 0x84, 0xd9, 0x47, 0xfd, 0x65,
+ 0x2c, 0x3d, 0xb0, 0x76, 0xe7, 0xdd, 0xd7, 0x06,
+ 0x8a, 0x79, 0xa7, 0x6c, 0x3a, 0x2d, 0x32, 0xf7,
+ 0xae, 0xe7, 0xd2, 0xb1, 0xf2, 0xe0, 0x3a, 0x10,
+ 0x19, 0xa1, 0x79, 0x7b, 0x76, 0x0b, 0xeb, 0xf3,
+ 0x01, 0x6e, 0x9f, 0xa1, 0x5d, 0x16, 0x09, 0xec,
+ 0x6b, 0x64, 0xe3, 0x96, 0xb8, 0x89, 0x99, 0x8c,
+ 0x77, 0xcf, 0x3f, 0x37, 0x42, 0x51, 0x82, 0x5a,
+ 0x63, 0x89, 0x12, 0x12, 0x59, 0x38, 0xe3, 0xcf,
+ 0xa0, 0xda, 0xbc, 0x69, 0x75, 0x48, 0x7c, 0x3e,
+ 0x56, 0x75, 0x12, 0x10, 0xc5, 0x96, 0x5b, 0x34,
+ 0x52, 0x2e, 0xce, 0xba, 0xd2, 0x7f, 0x8f, 0x1c,
+ 0xbd, 0x35, 0x3b, 0x74, 0x5b, 0x6c, 0xfe, 0xa7,
+ 0xf1, 0x4a, 0x07, 0x95, 0xff, 0xa8, 0xa0, 0x2a,
+ 0x85, 0xec, 0xd7, 0x56, 0x3b, 0x28, 0x2e, 0x09,
+ 0x50, 0x43, 0xbd, 0x49, 0x22, 0xdc, 0x78, 0x0e,
+ 0x7e, 0x68, 0x78, 0xd5, 0x57, 0xc2, 0xd6, 0x7c,
+ 0x2f, 0xd0, 0x4a, 0x62, 0x16, 0x38, 0x04, 0x23,
+ 0x43, 0x21, 0xaa, 0xe1, 0x96, 0x0e, 0xa9, 0x22,
+ 0xe7, 0x2c, 0xb8, 0x5e, 0x8f, 0xc6, 0x2d, 0xbd,
+ 0x99, 0x25, 0x33, 0xb8, 0x47, 0x99, 0x8d, 0xf5,
+ 0x22, 0x08, 0x9b, 0xd5, 0xad, 0x83, 0x67, 0xec,
+ 0x05, 0x89, 0xda, 0xd6, 0xe4, 0xe2, 0xd5, 0xef,
+ 0x7f, 0x61, 0x1e, 0x03, 0x81, 0x03, 0xb1, 0x98,
+ 0x5a, 0x29, 0x69, 0x13, 0xb2, 0xe6, 0xe1, 0x2c,
+ 0x66, 0x88, 0x39, 0x90, 0xf9, 0xae, 0x5d, 0x71,
+ 0xfe, 0x07, 0x30, 0x7d, 0xba, 0xa9, 0x37, 0xb5,
+ 0xff, 0x2c, 0xa9, 0xe6, 0x95, 0x48, 0xb2, 0xc8,
+};
+
+const struct testvec bf_cbc_448_1_vectors[] = {
+ {
+ .blkno = 0,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_448_encblkno1_vec0_ctxt,
+ },
+ {
+ .blkno = 1,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_448_encblkno1_vec1_ctxt,
+ },
+ {
+ .blkno = 2,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_448_encblkno1_vec2_ctxt,
+ },
+ {
+ .blkno = 3,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_448_encblkno1_vec3_ctxt,
+ },
+};
+
+/*
+ * IV method encblkno8, blkno 0.
+ */
+static const uint8_t bf_cbc_448_encblkno8_vec0_ctxt[SECSIZE] = {
+ 0x91, 0xb4, 0x8f, 0x78, 0x34, 0xbe, 0x03, 0xe9,
+ 0x4b, 0xca, 0xf4, 0xfa, 0x27, 0x99, 0xa0, 0xd0,
+ 0xa0, 0x85, 0xf9, 0xca, 0xcc, 0x2e, 0x0d, 0x41,
+ 0x91, 0xdb, 0xf9, 0x71, 0xcd, 0x49, 0xf7, 0x66,
+ 0x9b, 0x0c, 0x70, 0x49, 0x36, 0x72, 0xf4, 0xc0,
+ 0x17, 0xdd, 0xd8, 0x6a, 0xd2, 0x17, 0xfe, 0x50,
+ 0xa3, 0x2b, 0xa8, 0x7c, 0x9c, 0x12, 0x8c, 0x08,
+ 0x3d, 0xb5, 0x20, 0xc0, 0x83, 0xc1, 0xf5, 0x34,
+ 0x4b, 0xa5, 0xcc, 0x7c, 0xc6, 0x9f, 0x4b, 0x7f,
+ 0x09, 0x0c, 0x04, 0xe3, 0x02, 0xfe, 0xe2, 0x5a,
+ 0x45, 0xee, 0x4a, 0xcb, 0xc0, 0xe1, 0xf1, 0xae,
+ 0x1a, 0x22, 0x95, 0xb9, 0x30, 0xe8, 0x2d, 0x90,
+ 0xe5, 0x6a, 0x2f, 0x0a, 0x59, 0x15, 0xfc, 0x60,
+ 0xa5, 0x91, 0x95, 0x1a, 0xa2, 0xf5, 0x87, 0xa3,
+ 0x97, 0x45, 0x1b, 0xfb, 0x78, 0x62, 0x8b, 0xb6,
+ 0x86, 0xc6, 0x94, 0x9a, 0x9d, 0x09, 0x46, 0xc9,
+ 0x1f, 0x5f, 0x2e, 0x6c, 0xed, 0x5e, 0xe2, 0xab,
+ 0xca, 0x30, 0xdb, 0x13, 0x37, 0x8d, 0xb7, 0xc6,
+ 0xce, 0x74, 0xe3, 0xe2, 0x64, 0x7b, 0x74, 0x3e,
+ 0x9f, 0x18, 0x4e, 0xe2, 0x2b, 0x52, 0x08, 0x60,
+ 0x2b, 0x6d, 0x17, 0x1a, 0xff, 0xae, 0xfb, 0xea,
+ 0x59, 0x1d, 0x45, 0xe8, 0xf9, 0x0c, 0x56, 0xb8,
+ 0xb5, 0xc7, 0x8f, 0xa7, 0x9e, 0x67, 0x87, 0xbb,
+ 0xe2, 0x37, 0x56, 0x49, 0xed, 0x75, 0x27, 0x54,
+ 0xb5, 0x16, 0x34, 0xb6, 0xa6, 0xe0, 0x27, 0x48,
+ 0x91, 0xfb, 0x80, 0x4f, 0x5e, 0xef, 0x40, 0x6d,
+ 0x28, 0x8f, 0x2e, 0x56, 0xab, 0x6c, 0x7d, 0xde,
+ 0xbd, 0xa5, 0xa6, 0x47, 0xe2, 0xc9, 0xb0, 0xc5,
+ 0x69, 0x5d, 0x57, 0x18, 0x59, 0x08, 0x66, 0x1b,
+ 0xdc, 0x4f, 0xa4, 0xe2, 0xb5, 0xff, 0x72, 0x4d,
+ 0x25, 0x79, 0x38, 0x8f, 0xca, 0x23, 0x81, 0x31,
+ 0x1d, 0xeb, 0x7b, 0x7e, 0x04, 0xc3, 0xa6, 0xac,
+ 0x12, 0x92, 0x95, 0x44, 0x08, 0xae, 0x25, 0xb5,
+ 0xc2, 0x39, 0x88, 0x28, 0xc5, 0xc7, 0x3c, 0xfe,
+ 0x95, 0xe1, 0x1a, 0x27, 0xbe, 0xfd, 0x0a, 0xc7,
+ 0xd1, 0x02, 0x1a, 0xae, 0x03, 0xfb, 0xce, 0x79,
+ 0xe6, 0xea, 0x4a, 0xa1, 0x0e, 0x68, 0x61, 0x2f,
+ 0xfa, 0x7a, 0xb8, 0xda, 0xd1, 0x4a, 0xbe, 0x88,
+ 0xd2, 0xa0, 0x6b, 0x90, 0xc3, 0x37, 0x18, 0x77,
+ 0x2e, 0xc8, 0x44, 0x2e, 0x9d, 0xa2, 0x4a, 0xc7,
+ 0x54, 0xb2, 0x38, 0x9b, 0x60, 0x5e, 0x5b, 0xb0,
+ 0x31, 0x4c, 0x10, 0xf0, 0x1d, 0x8c, 0xab, 0x9b,
+ 0x25, 0x86, 0x05, 0xfc, 0xd9, 0x39, 0x11, 0x2b,
+ 0x7e, 0x07, 0xfd, 0x6b, 0xb3, 0x28, 0x57, 0x66,
+ 0x94, 0xc6, 0xfc, 0x48, 0x71, 0xeb, 0x7b, 0x9a,
+ 0x26, 0x8f, 0x9f, 0x97, 0xb6, 0x83, 0x9a, 0xdc,
+ 0x5d, 0x84, 0x96, 0x9d, 0xe3, 0xa5, 0x12, 0x97,
+ 0x8c, 0x87, 0xa6, 0x2a, 0xa8, 0x15, 0x9a, 0xb0,
+ 0x0e, 0x31, 0x55, 0xf7, 0x1b, 0x5c, 0x9c, 0xaf,
+ 0x13, 0x20, 0x13, 0x50, 0xaf, 0xc9, 0xf4, 0xd9,
+ 0x47, 0x16, 0xcc, 0x9d, 0xec, 0xa9, 0x2d, 0xfc,
+ 0x3d, 0x5d, 0x48, 0x89, 0x86, 0x91, 0x6f, 0x1a,
+ 0xa5, 0xf0, 0xb6, 0x9b, 0xa9, 0x08, 0xf2, 0x05,
+ 0xad, 0xe5, 0xe0, 0xd8, 0x2e, 0x09, 0xbe, 0x3a,
+ 0xf2, 0xdc, 0xeb, 0x14, 0xe6, 0x8c, 0x21, 0x20,
+ 0xbb, 0x42, 0x6a, 0xba, 0x55, 0x79, 0x54, 0x8b,
+ 0xa8, 0x43, 0x14, 0x28, 0x66, 0xd2, 0x44, 0x65,
+ 0x9c, 0xa9, 0xdc, 0x3b, 0x3f, 0xab, 0x36, 0xb4,
+ 0xbc, 0x9d, 0x22, 0x92, 0x24, 0xa8, 0x29, 0x18,
+ 0x98, 0x3a, 0xbe, 0xa1, 0xb4, 0xf8, 0x7f, 0xea,
+ 0x2f, 0x58, 0x69, 0xce, 0xee, 0x99, 0x76, 0x2c,
+ 0x53, 0x84, 0xf5, 0x9e, 0xa3, 0x98, 0xe6, 0x94,
+ 0x39, 0xfa, 0xfa, 0x6d, 0x66, 0xe2, 0x39, 0x2b,
+ 0x4b, 0x84, 0x14, 0x89, 0x18, 0xa2, 0x03, 0xdd,
+};
+
+/*
+ * IV method encblkno8, blkno 1.
+ */
+static const uint8_t bf_cbc_448_encblkno8_vec1_ctxt[SECSIZE] = {
+ 0x90, 0x3d, 0xee, 0x58, 0xf7, 0xe3, 0xc4, 0x18,
+ 0xaf, 0xfa, 0xaf, 0xed, 0x9a, 0x45, 0xe7, 0xa8,
+ 0xbe, 0xcd, 0x0f, 0xb9, 0x53, 0x18, 0xc6, 0x14,
+ 0xbe, 0xbb, 0x90, 0x1c, 0x5c, 0x60, 0x93, 0xcb,
+ 0x62, 0xb3, 0xdb, 0x31, 0x19, 0x39, 0xce, 0x3f,
+ 0xe4, 0x8f, 0x44, 0xc1, 0x10, 0x80, 0x05, 0x6b,
+ 0x77, 0xe3, 0xe1, 0xe5, 0xd2, 0x6d, 0x93, 0xf2,
+ 0xb3, 0x81, 0x03, 0xf8, 0xbc, 0x7b, 0x5a, 0x71,
+ 0x15, 0x16, 0x3a, 0x2f, 0x03, 0xbb, 0x67, 0x6a,
+ 0xd9, 0xf5, 0x63, 0x6f, 0x3d, 0x75, 0x1b, 0x0a,
+ 0x4b, 0x9d, 0x04, 0x11, 0x7e, 0xe8, 0x3e, 0x2d,
+ 0x04, 0x8f, 0xbf, 0x8a, 0xb2, 0x35, 0x76, 0xc5,
+ 0xcc, 0x6d, 0x9e, 0x99, 0x71, 0x13, 0xf6, 0x5e,
+ 0xeb, 0x74, 0x96, 0x8a, 0x29, 0x38, 0x0b, 0x25,
+ 0x4b, 0x89, 0xa9, 0x43, 0x3c, 0x2f, 0x03, 0x14,
+ 0x8d, 0x0f, 0xe3, 0xe7, 0x01, 0xd1, 0x2e, 0x14,
+ 0x08, 0x51, 0xba, 0x06, 0x39, 0x76, 0x35, 0xbc,
+ 0x14, 0xa6, 0x16, 0x36, 0x47, 0xcc, 0x48, 0xe0,
+ 0xd6, 0xd7, 0x07, 0xb0, 0xf0, 0x30, 0x6c, 0xf8,
+ 0x68, 0x9d, 0x6c, 0x4b, 0x69, 0x33, 0x78, 0x0e,
+ 0x4a, 0xfa, 0x97, 0xfb, 0x0c, 0x0d, 0x0a, 0xc3,
+ 0x4b, 0x7b, 0x77, 0x77, 0x18, 0x9a, 0x74, 0x85,
+ 0x2f, 0xae, 0xc7, 0x90, 0x45, 0x4b, 0xa2, 0x06,
+ 0x3e, 0xa2, 0x48, 0xe7, 0x6c, 0x86, 0x65, 0x78,
+ 0x97, 0x0b, 0x97, 0xc1, 0x70, 0x91, 0x12, 0x79,
+ 0xae, 0xf0, 0x2b, 0x44, 0xe9, 0x84, 0x8d, 0x78,
+ 0x53, 0xf8, 0x3a, 0xf5, 0x9f, 0x27, 0x3d, 0x49,
+ 0x69, 0xd1, 0x18, 0xa4, 0xb2, 0xd0, 0xbb, 0xf2,
+ 0x57, 0x76, 0xb7, 0x77, 0x16, 0x2f, 0xf8, 0x0c,
+ 0xa5, 0x86, 0x43, 0x0d, 0x2d, 0xfe, 0x84, 0xc6,
+ 0xbb, 0x58, 0x81, 0x47, 0x3d, 0xa3, 0x93, 0xb0,
+ 0x50, 0xfc, 0x25, 0xf7, 0xc5, 0x05, 0xe5, 0xf2,
+ 0xb3, 0x79, 0x12, 0xe4, 0x37, 0x71, 0x2d, 0xe8,
+ 0xa5, 0x0b, 0xce, 0x67, 0x51, 0x4f, 0xab, 0xc7,
+ 0x7b, 0x3b, 0xac, 0x78, 0x97, 0x82, 0x02, 0xf4,
+ 0x62, 0x20, 0x1b, 0x8b, 0xac, 0x07, 0x3b, 0xd7,
+ 0x0b, 0x99, 0x27, 0x85, 0x52, 0x7a, 0x79, 0x18,
+ 0xfb, 0x81, 0x3a, 0x05, 0x76, 0x6c, 0x3c, 0x6a,
+ 0x35, 0xe1, 0x2b, 0x03, 0x48, 0x70, 0x1a, 0xa8,
+ 0x30, 0x33, 0x61, 0xe2, 0xd8, 0x99, 0x86, 0x7f,
+ 0xfd, 0xe0, 0x4a, 0xe4, 0x62, 0xa1, 0xac, 0xcb,
+ 0xb8, 0x8a, 0xf3, 0xaa, 0xd6, 0x61, 0x9d, 0xc5,
+ 0xdb, 0xf5, 0x53, 0x39, 0x1d, 0xd7, 0xf8, 0x96,
+ 0xc6, 0x2b, 0xca, 0xbf, 0x83, 0x4e, 0x89, 0x63,
+ 0x53, 0x6f, 0x17, 0xaa, 0xf3, 0x61, 0x9b, 0x75,
+ 0x8c, 0x5a, 0xf8, 0x21, 0x84, 0x52, 0xb8, 0x76,
+ 0xbc, 0xf5, 0x9b, 0xd6, 0x98, 0x26, 0x58, 0xec,
+ 0xdd, 0xa8, 0xf1, 0xee, 0x9e, 0x14, 0x24, 0x94,
+ 0x7c, 0xb6, 0x45, 0x8b, 0xc7, 0x85, 0x50, 0x4e,
+ 0x30, 0xd7, 0x51, 0x8c, 0x33, 0xeb, 0xeb, 0x5d,
+ 0x52, 0x58, 0x43, 0xcb, 0x25, 0x4a, 0x77, 0x34,
+ 0xe6, 0x70, 0x5b, 0x6f, 0x8f, 0xe8, 0x07, 0xee,
+ 0x76, 0x4a, 0xad, 0xab, 0x11, 0x8a, 0x1b, 0x92,
+ 0x60, 0x79, 0xb8, 0xe0, 0x88, 0xa7, 0x3a, 0xe0,
+ 0x15, 0xf6, 0x57, 0xf0, 0xe8, 0x87, 0xda, 0xf8,
+ 0x90, 0x4e, 0xe7, 0xb3, 0xb4, 0xe7, 0x73, 0x5c,
+ 0xd3, 0x69, 0xfb, 0x23, 0x4f, 0x4f, 0xc8, 0xd2,
+ 0xfb, 0xf5, 0xf5, 0x76, 0x80, 0xb6, 0xb7, 0xe2,
+ 0xb7, 0x96, 0x1a, 0x97, 0x12, 0x40, 0x16, 0x86,
+ 0xd6, 0x66, 0xf5, 0x46, 0x9e, 0x04, 0x62, 0xaa,
+ 0x9c, 0xc9, 0x45, 0x39, 0x5c, 0xd3, 0x58, 0x40,
+ 0xb4, 0x32, 0xd8, 0x6c, 0x19, 0xfa, 0xa5, 0x5f,
+ 0x1e, 0x83, 0x5a, 0x32, 0x5e, 0x1d, 0xab, 0xa9,
+ 0x48, 0x1b, 0x1b, 0x37, 0x66, 0xf8, 0x67, 0xd7,
+};
+
+/*
+ * IV method encblkno8, blkno 2.
+ */
+static const uint8_t bf_cbc_448_encblkno8_vec2_ctxt[SECSIZE] = {
+ 0xb3, 0x2d, 0x0d, 0x90, 0x7a, 0x50, 0xb6, 0x29,
+ 0x9d, 0xd4, 0x12, 0x1a, 0xc9, 0x71, 0x56, 0xc4,
+ 0xce, 0x3d, 0x74, 0xf9, 0x91, 0xe4, 0x79, 0x8a,
+ 0x42, 0x34, 0x1a, 0xd4, 0x84, 0xaa, 0x01, 0x85,
+ 0x13, 0xe8, 0xab, 0xaa, 0xb6, 0x81, 0x82, 0xd6,
+ 0x32, 0xd6, 0x9f, 0x63, 0x69, 0x55, 0x10, 0x5f,
+ 0x2e, 0xb3, 0x51, 0x74, 0x80, 0x5c, 0xe9, 0x8d,
+ 0x27, 0xd8, 0x41, 0x2d, 0x27, 0x07, 0xb4, 0x13,
+ 0xcd, 0xc0, 0xb3, 0x96, 0xaa, 0x59, 0x9c, 0x3e,
+ 0x16, 0x9e, 0x18, 0xa5, 0x92, 0x52, 0x59, 0x19,
+ 0x19, 0x62, 0xeb, 0xd9, 0xdf, 0x9d, 0x10, 0x77,
+ 0xfb, 0x3c, 0xf1, 0xeb, 0x70, 0xf6, 0x6a, 0x9b,
+ 0xad, 0x99, 0x35, 0xd7, 0xf8, 0xde, 0x2b, 0x52,
+ 0x85, 0xdd, 0x36, 0x07, 0x3a, 0x88, 0xa6, 0xbb,
+ 0x98, 0x7a, 0xe3, 0xb0, 0xe6, 0xae, 0x33, 0x5d,
+ 0x47, 0x0c, 0x6c, 0xd4, 0x84, 0x33, 0x7e, 0xf4,
+ 0xea, 0xfd, 0xf1, 0x1c, 0xdb, 0x8b, 0xfe, 0x01,
+ 0x77, 0xa3, 0x07, 0x21, 0x09, 0xac, 0x0c, 0xe4,
+ 0x63, 0xaa, 0x3d, 0xb3, 0x05, 0xf8, 0x73, 0x03,
+ 0x69, 0x53, 0x2f, 0xd3, 0x53, 0x29, 0xf2, 0x02,
+ 0x60, 0x41, 0xed, 0xc7, 0xe9, 0x2e, 0xba, 0x54,
+ 0xa4, 0xfe, 0x26, 0xf0, 0xd9, 0x2c, 0x58, 0x2d,
+ 0x90, 0x94, 0x19, 0xf9, 0xe5, 0xaa, 0xe2, 0x13,
+ 0x9a, 0x67, 0x90, 0x44, 0x61, 0x36, 0xd0, 0x3f,
+ 0xe7, 0xe8, 0x7e, 0x47, 0x2b, 0x84, 0x97, 0xe2,
+ 0x0b, 0x8a, 0xfa, 0x2f, 0xbc, 0x1a, 0x70, 0xed,
+ 0xb2, 0x93, 0x36, 0x0e, 0xe6, 0xb1, 0xa2, 0x5a,
+ 0x04, 0x04, 0x8d, 0x2f, 0x82, 0xdb, 0x49, 0x5e,
+ 0x1b, 0x90, 0xc1, 0x27, 0x2a, 0x2f, 0x64, 0x5b,
+ 0xce, 0x35, 0x06, 0x0d, 0xb6, 0x05, 0x50, 0x5a,
+ 0x90, 0xc8, 0x21, 0xd0, 0xf0, 0xb9, 0xf3, 0x43,
+ 0x25, 0xd8, 0xb9, 0x86, 0xb7, 0xd0, 0x29, 0x75,
+ 0xdc, 0xf6, 0xf6, 0x14, 0x5e, 0x1f, 0xad, 0x54,
+ 0x28, 0x63, 0x92, 0xcd, 0xcd, 0x75, 0xb2, 0xe8,
+ 0xf3, 0x1f, 0xfd, 0x88, 0x72, 0x04, 0xab, 0xe2,
+ 0x77, 0x21, 0xc1, 0xb4, 0x87, 0xa7, 0x98, 0x86,
+ 0x2d, 0x7f, 0x01, 0x24, 0xed, 0x3a, 0x23, 0x83,
+ 0xb7, 0xa4, 0xb7, 0x08, 0x4e, 0xee, 0x10, 0x77,
+ 0x29, 0x22, 0xab, 0xea, 0x4a, 0x68, 0x1f, 0x7f,
+ 0xd6, 0xe6, 0x90, 0x11, 0xbc, 0x23, 0x2e, 0x47,
+ 0x78, 0xea, 0x1d, 0x33, 0x7c, 0x02, 0x09, 0x55,
+ 0x7a, 0xbc, 0xa7, 0x3d, 0x9a, 0xd0, 0x4d, 0x40,
+ 0x6c, 0xc2, 0x99, 0xc2, 0xe9, 0x0e, 0xcf, 0x06,
+ 0x82, 0x61, 0x5c, 0x76, 0xca, 0xef, 0x8f, 0xd3,
+ 0x78, 0x2a, 0xae, 0x39, 0x29, 0x4e, 0xc1, 0x2c,
+ 0xb1, 0xbc, 0xcd, 0x76, 0x4f, 0x25, 0xf0, 0x5b,
+ 0x78, 0x3a, 0xa4, 0x39, 0x52, 0x5a, 0xc7, 0xcf,
+ 0x17, 0x3d, 0xb0, 0x39, 0x63, 0xf9, 0xf9, 0xfb,
+ 0x6f, 0x35, 0xb7, 0xf1, 0x49, 0x10, 0xd8, 0x12,
+ 0x8d, 0xa2, 0xdf, 0xc5, 0x26, 0x37, 0xd1, 0xb8,
+ 0xef, 0xdc, 0x04, 0x1b, 0x0d, 0x60, 0xbf, 0xbc,
+ 0xc0, 0xff, 0x56, 0x8b, 0xd3, 0x6e, 0x71, 0xfc,
+ 0x87, 0x00, 0x86, 0x10, 0x78, 0x3b, 0xce, 0x8b,
+ 0xe8, 0x5f, 0x8c, 0xce, 0x03, 0xa2, 0x89, 0x8c,
+ 0x16, 0x00, 0x0e, 0xd8, 0x53, 0xaf, 0x7f, 0x77,
+ 0x78, 0x40, 0x5e, 0x5e, 0xd1, 0x7d, 0xf8, 0x41,
+ 0xa8, 0x1e, 0xa5, 0xe5, 0xe9, 0xd6, 0x17, 0x2c,
+ 0x2f, 0x1b, 0xff, 0xef, 0xf5, 0x53, 0x31, 0xf3,
+ 0x5b, 0xe4, 0x84, 0x7c, 0xe2, 0x45, 0x3c, 0x82,
+ 0x5b, 0xf6, 0x03, 0x35, 0xdd, 0x03, 0x22, 0xbe,
+ 0x77, 0x9c, 0x6a, 0x7d, 0xc8, 0x29, 0x41, 0x53,
+ 0xbb, 0xab, 0x6e, 0xa5, 0x00, 0xaf, 0x3b, 0x1d,
+ 0x76, 0x12, 0xac, 0x44, 0x5c, 0x7d, 0xd2, 0x3b,
+ 0x3a, 0x95, 0xb0, 0xa9, 0x4f, 0x27, 0x76, 0x17,
+};
+
+/*
+ * IV method encblkno8, blkno 3.
+ */
+static const uint8_t bf_cbc_448_encblkno8_vec3_ctxt[SECSIZE] = {
+ 0x8e, 0xc4, 0x56, 0x64, 0x1e, 0x2a, 0x0d, 0x60,
+ 0x54, 0x5c, 0xcd, 0xe0, 0x6d, 0xa7, 0x4c, 0x30,
+ 0x7e, 0x85, 0x21, 0xdf, 0xaa, 0xb2, 0x32, 0xde,
+ 0xc0, 0xc6, 0x56, 0xe0, 0x43, 0xc2, 0x3e, 0x6c,
+ 0x8c, 0x62, 0x35, 0xaa, 0xf9, 0xba, 0xc9, 0x52,
+ 0x38, 0x72, 0x06, 0xcc, 0x02, 0xa2, 0xb8, 0x85,
+ 0xf7, 0xcc, 0xe6, 0x8c, 0x86, 0x8f, 0x9c, 0xd6,
+ 0x1f, 0xf8, 0x24, 0x9d, 0xca, 0xe8, 0xed, 0x3c,
+ 0x80, 0x0b, 0xaf, 0x0c, 0x78, 0x4f, 0x5b, 0x2a,
+ 0x0f, 0xfe, 0xe5, 0xe6, 0x12, 0x8a, 0xff, 0xc7,
+ 0x6a, 0x97, 0xd9, 0xcb, 0xc8, 0x6a, 0x83, 0x12,
+ 0xa1, 0x12, 0x84, 0xc8, 0x72, 0x1c, 0xb7, 0x68,
+ 0x23, 0x24, 0xff, 0x5a, 0x78, 0x99, 0x9d, 0xb8,
+ 0x03, 0x70, 0x0a, 0x09, 0xa1, 0x3d, 0xfe, 0xe0,
+ 0xc5, 0x1b, 0xea, 0x58, 0xbc, 0x52, 0x70, 0xa2,
+ 0x4e, 0xcc, 0x43, 0xfb, 0xb7, 0xc4, 0xbd, 0xb6,
+ 0xa9, 0x1e, 0xff, 0xf6, 0x69, 0xaa, 0xab, 0xa4,
+ 0xd7, 0x07, 0x0d, 0xda, 0x41, 0x4b, 0xe3, 0xa5,
+ 0xef, 0x94, 0x9f, 0xb4, 0xd8, 0xd1, 0x41, 0xd0,
+ 0x9e, 0xa0, 0x0a, 0x70, 0xdb, 0xb8, 0x5e, 0x27,
+ 0xc6, 0x08, 0x38, 0x6a, 0x31, 0xe3, 0xa0, 0xd6,
+ 0x90, 0xad, 0x19, 0x0c, 0x7e, 0x1d, 0x21, 0xc8,
+ 0x66, 0x30, 0x73, 0x8e, 0x06, 0x97, 0xec, 0xc6,
+ 0xfe, 0x5c, 0xc6, 0xc0, 0xd1, 0x5c, 0x5f, 0xf8,
+ 0x01, 0xb3, 0xac, 0x18, 0x66, 0x1e, 0x04, 0xaf,
+ 0xa7, 0xd3, 0x6d, 0x10, 0x74, 0xa1, 0x9a, 0x36,
+ 0x10, 0xa0, 0xd6, 0x28, 0x61, 0x93, 0x98, 0x14,
+ 0x67, 0x6f, 0x7d, 0x52, 0x86, 0x48, 0x17, 0x99,
+ 0x53, 0xa3, 0xee, 0xe5, 0x93, 0xf6, 0x80, 0xe1,
+ 0x52, 0xf0, 0x39, 0x48, 0x5c, 0x20, 0x05, 0xd9,
+ 0xae, 0xa2, 0xe3, 0x25, 0x4e, 0x60, 0x84, 0xf8,
+ 0xad, 0xd6, 0xf6, 0x95, 0x8e, 0x95, 0xd0, 0x49,
+ 0x1c, 0x65, 0xd0, 0xc8, 0xa5, 0x26, 0xc0, 0xdf,
+ 0x32, 0xbe, 0xbc, 0xb7, 0x6d, 0xe5, 0x5e, 0x6d,
+ 0x38, 0x7d, 0x03, 0xd5, 0x94, 0x7a, 0x14, 0x2b,
+ 0x02, 0xe0, 0x09, 0x00, 0x50, 0xf1, 0x52, 0x69,
+ 0x06, 0x33, 0x4b, 0x5b, 0xa2, 0xbc, 0x2e, 0xa9,
+ 0x1a, 0xb7, 0xca, 0xa8, 0xb4, 0xa2, 0x5b, 0xcd,
+ 0x35, 0xe4, 0x03, 0xdd, 0x8f, 0x66, 0x3a, 0x34,
+ 0xc6, 0x2a, 0xd6, 0x90, 0xa2, 0xef, 0xe2, 0xfa,
+ 0x7c, 0xc1, 0x6c, 0x21, 0xd0, 0xfd, 0x96, 0x92,
+ 0xb5, 0x99, 0xe4, 0xb7, 0x66, 0xd4, 0xf2, 0x50,
+ 0x22, 0xef, 0x66, 0x1e, 0x5f, 0x62, 0xd1, 0x77,
+ 0x87, 0x52, 0xed, 0x40, 0x69, 0xfd, 0xab, 0x66,
+ 0xe4, 0x0e, 0x2b, 0xa8, 0x67, 0x4c, 0x6d, 0xce,
+ 0xb0, 0x61, 0x8e, 0x6c, 0xc5, 0x34, 0xab, 0x03,
+ 0x3e, 0x8a, 0xe5, 0x2b, 0xa2, 0xa4, 0x04, 0xa2,
+ 0x01, 0x81, 0x79, 0x72, 0xfc, 0x19, 0xbd, 0x38,
+ 0x39, 0xee, 0xb3, 0x95, 0xc5, 0x6f, 0xed, 0xaa,
+ 0x6e, 0xca, 0xeb, 0xc6, 0xaf, 0xeb, 0x76, 0xb4,
+ 0xd7, 0xc3, 0x1b, 0x65, 0x99, 0xc6, 0xa3, 0xe8,
+ 0x96, 0x5e, 0xc1, 0x0c, 0xd2, 0xf8, 0x65, 0xcf,
+ 0x42, 0xc5, 0x8f, 0x52, 0x5d, 0x90, 0x21, 0x55,
+ 0xec, 0x9d, 0x93, 0x81, 0xb7, 0x9a, 0xa4, 0x35,
+ 0xe7, 0xef, 0xef, 0x2d, 0x4c, 0x02, 0xf7, 0x2b,
+ 0x26, 0xe0, 0x9e, 0x3a, 0x31, 0xfd, 0x94, 0xb3,
+ 0xa7, 0x8a, 0x93, 0xf3, 0xe1, 0x77, 0x79, 0xdf,
+ 0xcf, 0x1f, 0x99, 0x55, 0x20, 0xc3, 0x7d, 0x8a,
+ 0xbc, 0xff, 0x63, 0x64, 0x87, 0xa9, 0x42, 0x63,
+ 0xc9, 0x67, 0x7e, 0x51, 0x99, 0x9c, 0xcb, 0x47,
+ 0xa9, 0xc8, 0x5e, 0x83, 0x87, 0x55, 0x7c, 0x45,
+ 0x3a, 0xb4, 0xfe, 0x97, 0x24, 0x17, 0x1d, 0x5e,
+ 0xdf, 0xe0, 0xe8, 0x17, 0xa6, 0x31, 0x99, 0xeb,
+ 0xb7, 0xb5, 0xd5, 0xd7, 0x7c, 0x2f, 0x22, 0x26,
+};
+
+const struct testvec bf_cbc_448_8_vectors[] = {
+ {
+ .blkno = 0,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_448_encblkno8_vec0_ctxt,
+ },
+ {
+ .blkno = 1,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_448_encblkno8_vec1_ctxt,
+ },
+ {
+ .blkno = 2,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_448_encblkno8_vec2_ctxt,
+ },
+ {
+ .blkno = 3,
+ .ptxt = bf_cbc_ptxt,
+ .ctxt = bf_cbc_448_encblkno8_vec3_ctxt,
+ },
+};
+
+static int
+open_disk(const char *devpath, const char *imgpath, size_t size)
+{
+ int fd;
+
+ fd = open(imgpath, O_CREAT | O_RDWR | O_TRUNC, 0600);
+ if (fd < 0)
+ return -1;
+
+ if (ftruncate(fd, size) < 0)
+ goto fail;
+
+ if (rump_pub_etfs_register_withsize(devpath,
+ imgpath, RUMP_ETFS_BLK, 0, size) < 0) {
+ goto fail;
+ }
+
+ unlink(imgpath);
+ return fd;
+fail:
+ close(fd);
+ unlink(imgpath);
+ return -1;
+}
+
+static int
+open_cgd(int devno)
+{
+ char devpath[32];
+
+ sprintf(devpath, "/dev/rcgd%d%c", devno, getrawpartition() + 'a');
+
+ return rump_sys_open(devpath, O_RDWR, 0);
+}
+
+static int
+configure_cgd(int fd, const char *dkpath, const char *alg,
+ const char *ivmethod, const char *key, size_t keylen)
+{
+ struct cgd_ioctl ci;
+
+ memset(&ci, 0, sizeof(ci));
+ ci.ci_disk = dkpath;
+ ci.ci_alg = alg;
+ ci.ci_ivmethod = ivmethod;
+ ci.ci_keylen = 8 * keylen - 8; /* Exclude the NUL terminator. */
+ ci.ci_key = key;
+ ci.ci_blocksize = 64;
+
+ return rump_sys_ioctl(fd, CGDIOCSET, &ci);
+}
+
+static int
+unconfigure_cgd(int fd)
+{
+ struct cgd_ioctl ci;
+
+ return rump_sys_ioctl(fd, CGDIOCCLR, &ci);
+}
+
+static int
+write_testvec(int cgdfd, const struct testvec *tv)
+{
+
+ if (rump_sys_lseek(cgdfd, tv->blkno * SECSIZE, SEEK_SET) < 0)
+ return -1;
+
+ if (rump_sys_write(cgdfd, tv->ptxt, SECSIZE) != SECSIZE)
+ return -1;
+
+ return 0;
+}
+
+static int
+read_testvec(int cgdfd, const struct testvec *tv)
+{
+ char *buf;
+ int res = -1;
+
+ buf = malloc(SECSIZE);
+ if (buf == NULL)
+ return -1;
+
+ if (rump_sys_lseek(cgdfd, tv->blkno * SECSIZE, SEEK_SET) < 0)
+ goto fail;
+
+ if (rump_sys_read(cgdfd, buf, SECSIZE) != SECSIZE)
+ goto fail;
+
+ res = memcmp(buf, tv->ptxt, SECSIZE);
+fail:
+ free(buf);
+ return res;
+}
+
+static int
+check_testvec(int dkfd, const struct testvec *tv)
+{
+ char *buf;
+ int res = -1;
+
+ buf = malloc(SECSIZE);
+ if (buf == NULL)
+ return -1;
+
+ if (lseek(dkfd, tv->blkno * SECSIZE, SEEK_SET) < 0)
+ goto fail;
+
+ if (read(dkfd, buf, SECSIZE) != SECSIZE)
+ goto fail;
+
+ res = memcmp(buf, tv->ctxt, SECSIZE);
+fail:
+ free(buf);
+ return res;
+}
+
+ATF_TC(cgd_bf_cbc_128_encblkno1);
+ATF_TC_HEAD(cgd_bf_cbc_128_encblkno1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test blowfish-cbc with 128 bits key, ivmethod encblkno1");
+}
+
+ATF_TC_BODY(cgd_bf_cbc_128_encblkno1, tc)
+{
+ const char imgpath[] = "blowfish-cbc-128-encblkno1.img";
+ const char *dkpath = "/dev/dk";
+ const size_t dksize = 4 * SECSIZE; /* Last blkno is 3. */
+ int dkfd, cgdfd;
+
+ rump_init();
+
+ RL(dkfd = open_disk(dkpath, imgpath, dksize));
+
+ RL(cgdfd = open_cgd(0));
+ RL(configure_cgd(cgdfd, dkpath, "blowfish-cbc", "encblkno1",
+ bf_cbc_128_key, sizeof(bf_cbc_128_key)));
+
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_128_1_vectors[0]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_128_1_vectors[1]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_128_1_vectors[2]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_128_1_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(configure_cgd(cgdfd, dkpath, "blowfish-cbc", "encblkno1",
+ bf_cbc_128_key, sizeof(bf_cbc_128_key)));
+
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_128_1_vectors[0]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_128_1_vectors[1]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_128_1_vectors[2]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_128_1_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(rump_sys_close(cgdfd));
+
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_128_1_vectors[0]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_128_1_vectors[1]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_128_1_vectors[2]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_128_1_vectors[3]), 0);
+
+ RL(close(dkfd));
+}
+
+ATF_TC(cgd_bf_cbc_128_encblkno8);
+ATF_TC_HEAD(cgd_bf_cbc_128_encblkno8, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test blowfish-cbc with 128 bits key, ivmethod encblkno8");
+}
+
+ATF_TC_BODY(cgd_bf_cbc_128_encblkno8, tc)
+{
+ const char imgpath[] = "blowfish-cbc-128-encblkno8.img";
+ const char *dkpath = "/dev/dk";
+ const size_t dksize = 4 * SECSIZE; /* Last blkno is 3. */
+ int dkfd, cgdfd;
+
+ rump_init();
+
+ RL(dkfd = open_disk(dkpath, imgpath, dksize));
+
+ RL(cgdfd = open_cgd(0));
+ RL(configure_cgd(cgdfd, dkpath, "blowfish-cbc", "encblkno8",
+ bf_cbc_128_key, sizeof(bf_cbc_128_key)));
+
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_128_8_vectors[0]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_128_8_vectors[1]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_128_8_vectors[2]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_128_8_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(configure_cgd(cgdfd, dkpath, "blowfish-cbc", "encblkno8",
+ bf_cbc_128_key, sizeof(bf_cbc_128_key)));
+
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_128_8_vectors[0]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_128_8_vectors[1]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_128_8_vectors[2]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_128_8_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(rump_sys_close(cgdfd));
+
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_128_8_vectors[0]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_128_8_vectors[1]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_128_8_vectors[2]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_128_8_vectors[3]), 0);
+
+ RL(close(dkfd));
+}
+
+ATF_TC(cgd_bf_cbc_256_encblkno1);
+ATF_TC_HEAD(cgd_bf_cbc_256_encblkno1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test blowfish-cbc with 256 bits key, ivmethod encblkno1");
+}
+
+ATF_TC_BODY(cgd_bf_cbc_256_encblkno1, tc)
+{
+ const char imgpath[] = "blowfish-cbc-256-encblkno1.img";
+ const char *dkpath = "/dev/dk";
+ const size_t dksize = 4 * SECSIZE; /* Last blkno is 3. */
+ int dkfd, cgdfd;
+
+ rump_init();
+
+ RL(dkfd = open_disk(dkpath, imgpath, dksize));
+
+ RL(cgdfd = open_cgd(0));
+ RL(configure_cgd(cgdfd, dkpath, "blowfish-cbc", "encblkno1",
+ bf_cbc_256_key, sizeof(bf_cbc_256_key)));
+
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_256_1_vectors[0]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_256_1_vectors[1]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_256_1_vectors[2]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_256_1_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(configure_cgd(cgdfd, dkpath, "blowfish-cbc", "encblkno1",
+ bf_cbc_256_key, sizeof(bf_cbc_256_key)));
+
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_256_1_vectors[0]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_256_1_vectors[1]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_256_1_vectors[2]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_256_1_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(rump_sys_close(cgdfd));
+
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_256_1_vectors[0]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_256_1_vectors[1]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_256_1_vectors[2]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_256_1_vectors[3]), 0);
+
+ RL(close(dkfd));
+}
+
+ATF_TC(cgd_bf_cbc_256_encblkno8);
+ATF_TC_HEAD(cgd_bf_cbc_256_encblkno8, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test blowfish-cbc with 256 bits key, ivmethod encblkno8");
+}
+
+ATF_TC_BODY(cgd_bf_cbc_256_encblkno8, tc)
+{
+ const char imgpath[] = "blowfish-cbc-256-encblkno8.img";
+ const char *dkpath = "/dev/dk";
+ const size_t dksize = 4 * SECSIZE; /* Last blkno is 3. */
+ int dkfd, cgdfd;
+
+ rump_init();
+
+ RL(dkfd = open_disk(dkpath, imgpath, dksize));
+
+ RL(cgdfd = open_cgd(0));
+ RL(configure_cgd(cgdfd, dkpath, "blowfish-cbc", "encblkno8",
+ bf_cbc_256_key, sizeof(bf_cbc_256_key)));
+
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_256_8_vectors[0]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_256_8_vectors[1]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_256_8_vectors[2]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_256_8_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(configure_cgd(cgdfd, dkpath, "blowfish-cbc", "encblkno8",
+ bf_cbc_256_key, sizeof(bf_cbc_256_key)));
+
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_256_8_vectors[0]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_256_8_vectors[1]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_256_8_vectors[2]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_256_8_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(rump_sys_close(cgdfd));
+
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_256_8_vectors[0]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_256_8_vectors[1]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_256_8_vectors[2]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_256_8_vectors[3]), 0);
+
+ RL(close(dkfd));
+}
+
+ATF_TC(cgd_bf_cbc_448_encblkno1);
+ATF_TC_HEAD(cgd_bf_cbc_448_encblkno1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test blowfish-cbc with 448 bits key, ivmethod encblkno1");
+}
+
+ATF_TC_BODY(cgd_bf_cbc_448_encblkno1, tc)
+{
+ const char imgpath[] = "blowfish-cbc-448-encblkno1.img";
+ const char *dkpath = "/dev/dk";
+ const size_t dksize = 4 * SECSIZE; /* Last blkno is 3. */
+ int dkfd, cgdfd;
+
+ rump_init();
+
+ RL(dkfd = open_disk(dkpath, imgpath, dksize));
+
+ RL(cgdfd = open_cgd(0));
+ RL(configure_cgd(cgdfd, dkpath, "blowfish-cbc", "encblkno1",
+ bf_cbc_448_key, sizeof(bf_cbc_448_key)));
+
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_448_1_vectors[0]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_448_1_vectors[1]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_448_1_vectors[2]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_448_1_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(configure_cgd(cgdfd, dkpath, "blowfish-cbc", "encblkno1",
+ bf_cbc_448_key, sizeof(bf_cbc_448_key)));
+
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_448_1_vectors[0]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_448_1_vectors[1]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_448_1_vectors[2]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_448_1_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(rump_sys_close(cgdfd));
+
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_448_1_vectors[0]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_448_1_vectors[1]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_448_1_vectors[2]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_448_1_vectors[3]), 0);
+
+ RL(close(dkfd));
+}
+
+ATF_TC(cgd_bf_cbc_448_encblkno8);
+ATF_TC_HEAD(cgd_bf_cbc_448_encblkno8, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test blowfish-cbc with 448 bits key, ivmethod encblkno8");
+}
+
+ATF_TC_BODY(cgd_bf_cbc_448_encblkno8, tc)
+{
+ const char imgpath[] = "blowfish-cbc-448-encblkno8.img";
+ const char *dkpath = "/dev/dk";
+ const size_t dksize = 4 * SECSIZE; /* Last blkno is 3. */
+ int dkfd, cgdfd;
+
+ rump_init();
+
+ RL(dkfd = open_disk(dkpath, imgpath, dksize));
+
+ RL(cgdfd = open_cgd(0));
+ RL(configure_cgd(cgdfd, dkpath, "blowfish-cbc", "encblkno8",
+ bf_cbc_448_key, sizeof(bf_cbc_448_key)));
+
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_448_8_vectors[0]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_448_8_vectors[1]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_448_8_vectors[2]), 0);
+ ATF_CHECK_EQ(write_testvec(cgdfd, &bf_cbc_448_8_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(configure_cgd(cgdfd, dkpath, "blowfish-cbc", "encblkno8",
+ bf_cbc_448_key, sizeof(bf_cbc_448_key)));
+
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_448_8_vectors[0]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_448_8_vectors[1]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_448_8_vectors[2]), 0);
+ ATF_CHECK_EQ(read_testvec(cgdfd, &bf_cbc_448_8_vectors[3]), 0);
+
+ RL(unconfigure_cgd(cgdfd));
+ RL(rump_sys_close(cgdfd));
+
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_448_8_vectors[0]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_448_8_vectors[1]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_448_8_vectors[2]), 0);
+ ATF_CHECK_EQ(check_testvec(dkfd, &bf_cbc_448_8_vectors[3]), 0);
+
+ RL(close(dkfd));
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+
+ ATF_TP_ADD_TC(tp, cgd_bf_cbc_128_encblkno1);
+ ATF_TP_ADD_TC(tp, cgd_bf_cbc_128_encblkno8);
+ ATF_TP_ADD_TC(tp, cgd_bf_cbc_256_encblkno1);
+ ATF_TP_ADD_TC(tp, cgd_bf_cbc_256_encblkno8);
+ ATF_TP_ADD_TC(tp, cgd_bf_cbc_448_encblkno1);
+ ATF_TP_ADD_TC(tp, cgd_bf_cbc_448_encblkno8);
+
+ return atf_no_error();
+}
diff --git a/fs/ffs/ffs_common.sh b/fs/ffs/ffs_common.sh
index eaf7142808a1..ee94a15f994a 100755
--- a/fs/ffs/ffs_common.sh
+++ b/fs/ffs/ffs_common.sh
@@ -1,4 +1,4 @@
-# $NetBSD: ffs_common.sh,v 1.2 2013/07/29 13:15:24 skrll Exp $
+# $NetBSD: ffs_common.sh,v 1.3 2016/10/08 13:23:53 gson Exp $
create_ffs()
{
@@ -45,7 +45,7 @@ test_case()
eval "${name}_head() { \
atf_set "descr" "${descr}"
- atf_set "timeout" "60"
+ atf_set "timeout" "120"
}"
eval "${name}_body() { \
RUMP_SOCKETS_LIST=\${RUMP_SOCKET}; \
diff --git a/fs/fifofs/t_fifo.c b/fs/fifofs/t_fifo.c
index c4a2060a6ebc..4b37bb85b8c2 100644
--- a/fs/fifofs/t_fifo.c
+++ b/fs/fifofs/t_fifo.c
@@ -1,9 +1,10 @@
/* Test case written by Bharat Joshi */
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_fifo.c,v 1.1 2011/12/21 00:17:07 christos Exp $");
+__RCSID("$NetBSD: t_fifo.c,v 1.2 2017/01/10 22:36:29 christos Exp $");
#include <sys/types.h>
#include <sys/wait.h>
+#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
diff --git a/fs/nfs/nfsservice/Makefile b/fs/nfs/nfsservice/Makefile
index 307b01c54223..3385ae4cc36b 100644
--- a/fs/nfs/nfsservice/Makefile
+++ b/fs/nfs/nfsservice/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.11 2015/12/23 18:42:23 christos Exp $
+# $NetBSD: Makefile,v 1.12 2016/08/13 11:20:00 christos Exp $
#
NOMAN= 1
@@ -18,10 +18,11 @@ TESTS_C=rumpnfsd
SRCS.rumpnfsd= rumpnfsd.c nfsd.c mountd.c getmntinfo.c get_net.c
+LDADD+= -lrumpnet -lrumpnet_net -lrumpnet_local
+LDADD+= -lrumpnet_netinet6 -lrumpnet_netinet # TCP/IP
LDADD+= -lrumpfs_nfsserver -lrumpfs_nfs # NFS support
LDADD+= -lrumpdev_disk -lrumpdev # disk devices
LDADD+= -lrumpfs_ffs -lrumpvfs # FFS
-LDADD+= -lrumpnet_netinet -lrumpnet_net -lrumpnet_local # TCP/IP
LDADD+= -lrumpnet_shmif # shmif
LDADD+= -lrumpnet -lrumpkern_sysproxy -lrump -lrumpuser # base
LDADD+= -lpthread -lutil
diff --git a/fs/psshfs/t_psshfs.sh b/fs/psshfs/t_psshfs.sh
index 241d46d5d040..4d8fede15494 100755
--- a/fs/psshfs/t_psshfs.sh
+++ b/fs/psshfs/t_psshfs.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_psshfs.sh,v 1.7 2013/03/16 07:54:04 jmmv Exp $
+# $NetBSD: t_psshfs.sh,v 1.8 2016/09/05 08:53:57 christos Exp $
#
# Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -262,6 +262,26 @@ setattr_cache_cleanup() {
stop_ssh
}
+atf_test_case read_empty_file cleanup
+read_empty_file_head() {
+ atf_set "descr" "Checks whether an empty file can be read"
+ # This test is supposed to make sure psshfs does not hang
+ # when reading from an empty file, hence the timeout.
+ atf_set "timeout" 8
+}
+read_empty_file_body() {
+ require_puffs
+ start_ssh
+ atf_check mkdir root mnt
+ atf_check -x ': > root/empty'
+ mount_psshfs root mnt
+ atf_check cat mnt/empty
+}
+read_empty_file_cleanup() {
+ umount mnt
+ stop_ssh
+}
+
# -------------------------------------------------------------------------
# Initialization.
# -------------------------------------------------------------------------
@@ -271,4 +291,5 @@ atf_init_test_cases() {
atf_add_test_case pwd
atf_add_test_case ls
#atf_add_test_case setattr_cache
+ atf_add_test_case read_empty_file
}
diff --git a/fs/puffs/t_basic.c b/fs/puffs/t_basic.c
index ce5e4ea15f83..735108d64f44 100644
--- a/fs/puffs/t_basic.c
+++ b/fs/puffs/t_basic.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_basic.c,v 1.12 2013/10/19 17:45:00 christos Exp $ */
+/* $NetBSD: t_basic.c,v 1.13 2016/12/01 14:49:04 hannken Exp $ */
#include <sys/types.h>
#include <sys/mount.h>
@@ -286,7 +286,7 @@ ATF_TC_BODY(inactive_reclaim, tc)
rump_sys_close(fd);
syncbar(FSTEST_MNTNAME);
- ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE], 1);
+ ATF_REQUIRE(pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE] > 0);
ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_RECLAIM], 1);
FSTEST_EXIT();
@@ -383,7 +383,7 @@ ATF_TC_BODY(unlink_accessible, tc)
syncbar(FSTEST_MNTNAME);
ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_RECLAIM], 1);
- ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE], ianow+1);
+ ATF_REQUIRE(pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE] > ianow);
ATF_REQUIRE_STREQ(buf, MAGICSTR);
diff --git a/fs/vfs/Makefile b/fs/vfs/Makefile
index 55c4dc86a91f..48bca611f95c 100644
--- a/fs/vfs/Makefile
+++ b/fs/vfs/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.20 2015/01/07 22:24:03 pooka Exp $
+# $NetBSD: Makefile,v 1.22 2016/08/27 08:38:58 christos Exp $
#
.include <bsd.own.mk>
@@ -16,6 +16,8 @@ TESTS_C+= t_unpriv
TESTS_C+= t_vfsops
TESTS_C+= t_vnops
+LDADD+=-lrumpnet_shmif -lrumpnet -lrumpnet_net -lrumpnet_netinet# TCP/IP
+LDADD+=-lrumpfs_nfs # NFS
LDADD+=-lrumpfs_ext2fs # ext2fs
LDADD+=-lrumpfs_ffs # ffs
LDADD+=-lrumpfs_lfs # lfs
@@ -33,9 +35,8 @@ LDADD+=-lrumpdev_disk -lrumpdev # disk device
VFSTESTDIR != cd ${.CURDIR}/../common && ${PRINTOBJDIR}
LDADD+=-L${VFSTESTDIR} -lvfstest
-LDADD+=-lrumpfs_nfs # NFS
-LDADD+=-lrumpnet_shmif -lrumpnet_netinet -lrumpnet_net -lrumpnet
LDADD+=-lrumpvfs -lrumpkern_sysproxy -lrump -lrumpuser # base
+LDADD+=-lrumpnet # static linking
LDADD+=-lpthread
LDADD+=-lutil
diff --git a/fs/vfs/t_vnops.c b/fs/vfs/t_vnops.c
index 08203dde0cfa..978fadb04c26 100644
--- a/fs/vfs/t_vnops.c
+++ b/fs/vfs/t_vnops.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_vnops.c,v 1.55 2016/01/28 10:10:09 martin Exp $ */
+/* $NetBSD: t_vnops.c,v 1.58 2016/08/29 02:31:46 kre Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -28,6 +28,7 @@
#include <sys/stat.h>
#include <sys/statvfs.h>
+#include <sys/time.h>
#include <assert.h>
#include <atf-c.h>
@@ -55,10 +56,10 @@
atf_tc_skip("symlinks not supported by file system")
static char *
-md(char *buf, const char *base, const char *tail)
+md(char *buf, size_t buflen, const char *base, const char *tail)
{
- sprintf(buf, "%s/%s", base, tail);
+ snprintf(buf, buflen, "%s/%s", base, tail);
return buf;
}
@@ -69,11 +70,11 @@ lookup_simple(const atf_tc_t *tc, const char *mountpath)
struct stat sb1, sb2;
strcpy(final, mountpath);
- sprintf(pb, "%s/../%s", mountpath, basename(final));
+ snprintf(pb, sizeof(pb), "%s/../%s", mountpath, basename(final));
if (rump_sys_stat(pb, &sb1) == -1)
atf_tc_fail_errno("stat 1");
- sprintf(pb, "%s/./../%s", mountpath, basename(final));
+ snprintf(pb, sizeof(pb), "%s/./../%s", mountpath, basename(final));
if (rump_sys_stat(pb, &sb2) == -1)
atf_tc_fail_errno("stat 2");
@@ -85,22 +86,38 @@ lookup_complex(const atf_tc_t *tc, const char *mountpath)
{
char pb[MAXPATHLEN];
struct stat sb1, sb2;
+ struct timespec atplus1, onesec;
USES_DIRS;
- if (FSTYPE_UDF(tc))
- atf_tc_expect_fail("PR kern/49033");
-
- sprintf(pb, "%s/dir", mountpath);
+ snprintf(pb, sizeof(pb), "%s/dir", mountpath);
if (rump_sys_mkdir(pb, 0777) == -1)
atf_tc_fail_errno("mkdir");
if (rump_sys_stat(pb, &sb1) == -1)
atf_tc_fail_errno("stat 1");
- sprintf(pb, "%s/./dir/../././dir/.", mountpath);
+ snprintf(pb, sizeof(pb), "%s/./dir/../././dir/.", mountpath);
if (rump_sys_stat(pb, &sb2) == -1)
atf_tc_fail_errno("stat 2");
+ /*
+ * The lookup is permitted to modify the access time of
+ * any directories searched - such a directory is the
+ * subject of this test. Any difference should cause
+ * the 2nd lookup atime tp be >= the first, if it is ==, all is
+ * OK (atime is not required to be modified by the search, or
+ * both references may happen within the came clock tick), if the
+ * 2nd lookup atime is > the first, but not "too much" greater,
+ * just set it back, so the memcmp just below succeeds
+ * (assuming all else is OK).
+ */
+ onesec.tv_sec = 1;
+ onesec.tv_nsec = 0;
+ timespecadd(&sb1.st_atimespec, &onesec, &atplus1);
+ if (timespeccmp(&sb2.st_atimespec, &sb1.st_atimespec, >) &&
+ timespeccmp(&sb2.st_atimespec, &atplus1, <))
+ sb2.st_atimespec = sb1.st_atimespec;
+
if (memcmp(&sb1, &sb2, sizeof(sb1)) != 0) {
printf("what\tsb1\t\tsb2\n");
@@ -133,9 +150,6 @@ lookup_complex(const atf_tc_t *tc, const char *mountpath)
atf_tc_fail("stat results differ, see ouput for more details");
}
- if (FSTYPE_UDF(tc))
- atf_tc_fail("random failure of PR kern/49033 "
- "did not happen this time");
}
static void
@@ -147,7 +161,7 @@ dir_simple(const atf_tc_t *tc, const char *mountpath)
USES_DIRS;
/* check we can create directories */
- sprintf(pb, "%s/dir", mountpath);
+ snprintf(pb, sizeof(pb), "%s/dir", mountpath);
if (rump_sys_mkdir(pb, 0777) == -1)
atf_tc_fail_errno("mkdir");
if (rump_sys_stat(pb, &sb) == -1)
@@ -169,11 +183,11 @@ dir_notempty(const atf_tc_t *tc, const char *mountpath)
USES_DIRS;
/* check we can create directories */
- sprintf(pb, "%s/dir", mountpath);
+ snprintf(pb, sizeof(pb), "%s/dir", mountpath);
if (rump_sys_mkdir(pb, 0777) == -1)
atf_tc_fail_errno("mkdir");
- sprintf(pb2, "%s/dir/file", mountpath);
+ snprintf(pb2, sizeof(pb2), "%s/dir/file", mountpath);
fd = rump_sys_open(pb2, O_RDWR | O_CREAT, 0777);
if (fd == -1)
atf_tc_fail_errno("create file");
@@ -205,9 +219,9 @@ dir_rmdirdotdot(const atf_tc_t *tc, const char *mp)
RL(rump_sys_mkdir("subtest", 0777));
RL(rump_sys_chdir("subtest"));
- md(pb, mp, "test/subtest");
+ md(pb, sizeof(pb), mp, "test/subtest");
RL(rump_sys_rmdir(pb));
- md(pb, mp, "test");
+ md(pb, sizeof(pb), mp, "test");
RL(rump_sys_rmdir(pb));
if (FSTYPE_NFS(tc))
@@ -225,7 +239,7 @@ checkfile(const char *path, struct stat *refp)
struct stat sb;
static int n = 1;
- md(buf, path, "file");
+ md(buf, sizeof(buf), path, "file");
if (rump_sys_stat(buf, &sb) == -1)
atf_tc_fail_errno("cannot stat file %d (%s)", n, buf);
if (memcmp(&sb, refp, sizeof(sb)) != 0)
@@ -244,18 +258,18 @@ rename_dir(const atf_tc_t *tc, const char *mp)
USES_DIRS;
- md(pb1, mp, "dir1");
+ md(pb1, sizeof(pb1), mp, "dir1");
if (rump_sys_mkdir(pb1, 0777) == -1)
atf_tc_fail_errno("mkdir 1");
- md(pb2, mp, "dir2");
+ md(pb2, sizeof(pb2), mp, "dir2");
if (rump_sys_mkdir(pb2, 0777) == -1)
atf_tc_fail_errno("mkdir 2");
- md(pb2, mp, "dir2/subdir");
+ md(pb2, sizeof(pb2), mp, "dir2/subdir");
if (rump_sys_mkdir(pb2, 0777) == -1)
atf_tc_fail_errno("mkdir 3");
- md(pb3, mp, "dir1/file");
+ md(pb3, sizeof(pb3), mp, "dir1/file");
if (rump_sys_mknod(pb3, S_IFREG | 0777, -1) == -1)
atf_tc_fail_errno("create file");
if (rump_sys_stat(pb3, &ref) == -1)
@@ -266,13 +280,13 @@ rename_dir(const atf_tc_t *tc, const char *mp)
*/
/* rename within directory */
- md(pb3, mp, "dir3");
+ md(pb3, sizeof(pb3), mp, "dir3");
if (rump_sys_rename(pb1, pb3) == -1)
atf_tc_fail_errno("rename 1");
checkfile(pb3, &ref);
/* rename directory onto itself (two ways, should fail) */
- md(pb1, mp, "dir3/.");
+ md(pb1, sizeof(pb1), mp, "dir3/.");
if (rump_sys_rename(pb1, pb3) != -1 || errno != EINVAL)
atf_tc_fail_errno("rename 2");
if (rump_sys_rename(pb3, pb1) != -1 || errno != EISDIR)
@@ -281,13 +295,13 @@ rename_dir(const atf_tc_t *tc, const char *mp)
checkfile(pb3, &ref);
/* rename father of directory into directory */
- md(pb1, mp, "dir2/dir");
- md(pb2, mp, "dir2");
+ md(pb1, sizeof(pb1), mp, "dir2/dir");
+ md(pb2, sizeof(pb2), mp, "dir2");
if (rump_sys_rename(pb2, pb1) != -1 || errno != EINVAL)
atf_tc_fail_errno("rename 4");
/* same for grandfather */
- md(pb1, mp, "dir2/subdir/dir2");
+ md(pb1, sizeof(pb1), mp, "dir2/subdir/dir2");
if (rump_sys_rename(pb2, pb1) != -1 || errno != EINVAL)
atf_tc_fail("rename 5");
@@ -298,29 +312,29 @@ rename_dir(const atf_tc_t *tc, const char *mp)
atf_tc_fail("rename 6");
/* cross-directory rename */
- md(pb1, mp, "dir3");
- md(pb2, mp, "dir2/somedir");
+ md(pb1, sizeof(pb1), mp, "dir3");
+ md(pb2, sizeof(pb2), mp, "dir2/somedir");
if (rump_sys_rename(pb1, pb2) == -1)
atf_tc_fail_errno("rename 7");
checkfile(pb2, &ref);
/* move to parent directory */
- md(pb1, mp, "dir2/somedir/../../dir3");
+ md(pb1, sizeof(pb1), mp, "dir2/somedir/../../dir3");
if (rump_sys_rename(pb2, pb1) == -1)
atf_tc_fail_errno("rename 8");
- md(pb1, mp, "dir2/../dir3");
+ md(pb1, sizeof(pb1), mp, "dir2/../dir3");
checkfile(pb1, &ref);
/* atomic cross-directory rename */
- md(pb3, mp, "dir2/subdir");
+ md(pb3, sizeof(pb3), mp, "dir2/subdir");
if (rump_sys_rename(pb1, pb3) == -1)
atf_tc_fail_errno("rename 9");
checkfile(pb3, &ref);
/* rename directory over an empty directory */
- md(pb1, mp, "parent");
- md(pb2, mp, "parent/dir1");
- md(pb3, mp, "parent/dir2");
+ md(pb1, sizeof(pb1), mp, "parent");
+ md(pb2, sizeof(pb2), mp, "parent/dir1");
+ md(pb3, sizeof(pb3), mp, "parent/dir2");
RL(rump_sys_mkdir(pb1, 0777));
RL(rump_sys_mkdir(pb2, 0777));
RL(rump_sys_mkdir(pb3, 0777));
@@ -467,15 +481,15 @@ create_many(const atf_tc_t *tc, const char *mp)
for (i = 0; i < nfiles; i++) {
int fd;
- sprintf(buf, TESTFN "%d", i);
+ snprintf(buf, sizeof(buf), TESTFN "%d", i);
RL(fd = rump_sys_open(buf, O_RDWR|O_CREAT|O_EXCL, 0666));
RL(rump_sys_close(fd));
}
/* wipe them out */
for (i = 0; i < nfiles; i++) {
- sprintf(buf, TESTFN "%d", i);
- RL(rump_sys_unlink(buf));
+ snprintf(buf, sizeof(buf), TESTFN "%d", i);
+ RLF(rump_sys_unlink(buf), "%s", buf);
}
#undef TESTFN
@@ -499,12 +513,12 @@ create_nonalphanum(const atf_tc_t *tc, const char *mp)
for (i = 0; i < 256; i++) {
int fd;
- sprintf(buf, "%c", i);
+ snprintf(buf, sizeof(buf), "%c", i);
fd = rump_sys_open(buf, O_RDWR|O_CREAT|O_EXCL, 0666);
if (fd == -1)
continue;
- RL(rump_sys_close(fd));
- RL(rump_sys_unlink(buf));
+ RLF(rump_sys_close(fd), "%d", fd);
+ RLF(rump_sys_unlink(buf), "%s", buf);
}
printf("\n");
@@ -632,7 +646,7 @@ symlink_len(const atf_tc_t *tc, const char *mp, size_t len)
USES_SYMLINKS;
- RL(rump_sys_chdir(mp));
+ RLF(rump_sys_chdir(mp), "%s", mp);
buf = malloc(len + 1);
ATF_REQUIRE(buf);
diff --git a/h_macros.h b/h_macros.h
index 29b4e9901042..dd730c9efe4d 100644
--- a/h_macros.h
+++ b/h_macros.h
@@ -1,4 +1,4 @@
-/* $NetBSD: h_macros.h,v 1.12 2016/08/04 11:49:07 jakllsch Exp $ */
+/* $NetBSD: h_macros.h,v 1.13 2016/08/20 15:49:08 christos Exp $ */
/*-
* Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -45,6 +45,8 @@
ATF_CHECK_MSG((x) != (v), "%s: %s", #x, strerror(errno))
#define RL(x) REQUIRE_LIBC(x, -1)
+#define RLF(x, fmt, arg) \
+ ATF_CHECK_MSG((x) != -1, "%s [" fmt "]: %s", #x, arg, strerror(errno))
#define RZ(x) \
do { \
int RZ_rv = x; \
diff --git a/kernel/Makefile b/kernel/Makefile
index 5df392d9e499..be79f1615116 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.39 2016/02/15 14:59:38 christos Exp $
+# $NetBSD: Makefile,v 1.44 2016/12/14 06:19:59 kamil Exp $
NOMAN= # defined
@@ -6,9 +6,17 @@ NOMAN= # defined
TESTSDIR= ${TESTSBASE}/kernel
-TESTS_SUBDIRS= kqueue
+TESTS_SUBDIRS= arch
+TESTS_SUBDIRS+= kqueue
TESTS_C= t_lock
TESTS_C+= t_lockf
+TESTS_C+= t_ptrace
+TESTS_C+= t_ptrace_wait
+TESTS_C+= t_ptrace_wait3
+TESTS_C+= t_ptrace_wait4
+TESTS_C+= t_ptrace_wait6
+TESTS_C+= t_ptrace_waitid
+TESTS_C+= t_ptrace_waitpid
TESTS_C+= t_pty
TESTS_C+= t_mqueue
TESTS_C+= t_sysv
@@ -38,10 +46,10 @@ LDADD.t_extattrctl+= -lrump -lpthread
LDADD.t_filedesc+= ${LDADD.t_rnd}
LDADD.t_rnd+= -lrumpvfs -lrumpdev_rnd -lrumpdev -lrump -lrumpuser
LDADD.t_rnd+= -lrump -lpthread
-CPPFLAGS+= -D_KERNTYPES
.endif
+CPPFLAGS+= -D_KERNTYPES
.PATH: ${NETBSDSRCDIR}/sys/kern
TESTS_C+= t_extent
diff --git a/kernel/msg.h b/kernel/msg.h
new file mode 100644
index 000000000000..547400ee73a6
--- /dev/null
+++ b/kernel/msg.h
@@ -0,0 +1,136 @@
+/* $NetBSD: msg.h,v 1.1 2016/12/05 20:10:10 christos Exp $ */
+
+/*-
+ * Copyright (c) 2016 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Christos Zoulas.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+struct msg_fds {
+ int pfd[2];
+ int cfd[2];
+};
+
+#define CLOSEFD(fd) do { \
+ if (fd != -1) { \
+ close(fd); \
+ fd = -1; \
+ } \
+} while (/*CONSTCOND*/ 0)
+
+static int
+msg_open(struct msg_fds *fds)
+{
+ if (pipe(fds->pfd) == -1)
+ return -1;
+ if (pipe(fds->cfd) == -1) {
+ close(fds->pfd[0]);
+ close(fds->pfd[1]);
+ return -1;
+ }
+ return 0;
+}
+
+static void
+msg_close(struct msg_fds *fds)
+{
+ CLOSEFD(fds->pfd[0]);
+ CLOSEFD(fds->pfd[1]);
+ CLOSEFD(fds->cfd[0]);
+ CLOSEFD(fds->cfd[1]);
+}
+
+static int
+msg_write_child(const char *info, struct msg_fds *fds, void *msg, size_t len)
+{
+ ssize_t rv;
+ CLOSEFD(fds->cfd[1]);
+ CLOSEFD(fds->pfd[0]);
+
+ printf("Send %s\n", info);
+ rv = write(fds->pfd[1], msg, len);
+ if (rv != (ssize_t)len)
+ return 1;
+// printf("Wait %s\n", info);
+ rv = read(fds->cfd[0], msg, len);
+ if (rv != (ssize_t)len)
+ return 1;
+ return 0;
+}
+
+static int
+msg_write_parent(const char *info, struct msg_fds *fds, void *msg, size_t len)
+{
+ ssize_t rv;
+ CLOSEFD(fds->pfd[1]);
+ CLOSEFD(fds->cfd[0]);
+
+ printf("Send %s\n", info);
+ rv = write(fds->cfd[1], msg, len);
+ if (rv != (ssize_t)len)
+ return 1;
+// printf("Wait %s\n", info);
+ rv = read(fds->pfd[0], msg, len);
+ if (rv != (ssize_t)len)
+ return 1;
+ return 0;
+}
+
+static int
+msg_read_parent(const char *info, struct msg_fds *fds, void *msg, size_t len)
+{
+ ssize_t rv;
+ CLOSEFD(fds->pfd[1]);
+ CLOSEFD(fds->cfd[0]);
+
+ printf("Wait %s\n", info);
+ rv = read(fds->pfd[0], msg, len);
+ if (rv != (ssize_t)len)
+ return 1;
+// printf("Send %s\n", info);
+ rv = write(fds->cfd[1], msg, len);
+ if (rv != (ssize_t)len)
+ return 1;
+ return 0;
+}
+
+static int
+msg_read_child(const char *info, struct msg_fds *fds, void *msg, size_t len)
+{
+ ssize_t rv;
+ CLOSEFD(fds->cfd[1]);
+ CLOSEFD(fds->pfd[0]);
+
+ printf("Wait %s\n", info);
+ rv = read(fds->cfd[0], msg, len);
+ if (rv != (ssize_t)len)
+ return 1;
+// printf("Send %s\n", info);
+ rv = write(fds->pfd[1], msg, len);
+ if (rv != (ssize_t)len)
+ return 1;
+ return 0;
+}
diff --git a/kernel/t_mqueue.c b/kernel/t_mqueue.c
index 2a0310116207..7206bc6ef917 100644
--- a/kernel/t_mqueue.c
+++ b/kernel/t_mqueue.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_mqueue.c,v 1.4 2014/03/02 19:56:48 jmmv Exp $ */
+/* $NetBSD: t_mqueue.c,v 1.5 2017/01/10 22:10:22 christos Exp $ */
/*
* Test for POSIX message queue priority handling.
@@ -7,6 +7,7 @@
*/
#include <atf-c.h>
+#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
diff --git a/kernel/t_ptrace.c b/kernel/t_ptrace.c
new file mode 100644
index 000000000000..074a953a93e7
--- /dev/null
+++ b/kernel/t_ptrace.c
@@ -0,0 +1,208 @@
+/* $NetBSD: t_ptrace.c,v 1.17 2016/11/13 22:59:31 kamil Exp $ */
+
+/*-
+ * Copyright (c) 2016 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: t_ptrace.c,v 1.17 2016/11/13 22:59:31 kamil Exp $");
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/ptrace.h>
+#include <sys/stat.h>
+#include <sys/sysctl.h>
+#include <err.h>
+#include <errno.h>
+#include <unistd.h>
+
+#include <atf-c.h>
+
+#include "../h_macros.h"
+
+/*
+ * A child process cannot call atf functions and expect them to magically
+ * work like in the parent.
+ * The printf(3) messaging from a child will not work out of the box as well
+ * without estabilishing a communication protocol with its parent. To not
+ * overcomplicate the tests - do not log from a child and use err(3)/errx(3)
+ * wrapped with FORKEE_ASSERT()/FORKEE_ASSERTX() as that is guaranteed to work.
+ */
+#define FORKEE_ASSERTX(x) \
+do { \
+ int ret = (x); \
+ if (!ret) \
+ errx(EXIT_FAILURE, "%s:%d %s(): Assertion failed for: %s", \
+ __FILE__, __LINE__, __func__, #x); \
+} while (0)
+
+#define FORKEE_ASSERT(x) \
+do { \
+ int ret = (x); \
+ if (!ret) \
+ err(EXIT_FAILURE, "%s:%d %s(): Assertion failed for: %s", \
+ __FILE__, __LINE__, __func__, #x); \
+} while (0)
+
+ATF_TC(attach_pid0);
+ATF_TC_HEAD(attach_pid0, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Assert that a debugger cannot attach to PID 0");
+}
+
+ATF_TC_BODY(attach_pid0, tc)
+{
+ errno = 0;
+ ATF_REQUIRE_ERRNO(EPERM, ptrace(PT_ATTACH, 0, NULL, 0) == -1);
+}
+
+ATF_TC(attach_pid1);
+ATF_TC_HEAD(attach_pid1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Assert that a debugger cannot attach to PID 1 (as non-root)");
+
+ atf_tc_set_md_var(tc, "require.user", "unprivileged");
+}
+
+ATF_TC_BODY(attach_pid1, tc)
+{
+ ATF_REQUIRE_ERRNO(EPERM, ptrace(PT_ATTACH, 1, NULL, 0) == -1);
+}
+
+ATF_TC(attach_pid1_securelevel);
+ATF_TC_HEAD(attach_pid1_securelevel, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Assert that a debugger cannot attach to PID 1 with "
+ "securelevel >= 1 (as root)");
+
+ atf_tc_set_md_var(tc, "require.user", "root");
+}
+
+ATF_TC_BODY(attach_pid1_securelevel, tc)
+{
+ int level;
+ size_t len = sizeof(level);
+
+ ATF_REQUIRE(sysctlbyname("kern.securelevel", &level, &len, NULL, 0)
+ != -1);
+
+ if (level < 1) {
+ atf_tc_skip("Test must be run with securelevel >= 1");
+ }
+
+ ATF_REQUIRE_ERRNO(EPERM, ptrace(PT_ATTACH, 1, NULL, 0) == -1);
+}
+
+ATF_TC(attach_self);
+ATF_TC_HEAD(attach_self, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Assert that a debugger cannot attach to self (as it's nonsense)");
+}
+
+ATF_TC_BODY(attach_self, tc)
+{
+ ATF_REQUIRE_ERRNO(EINVAL, ptrace(PT_ATTACH, getpid(), NULL, 0) == -1);
+}
+
+ATF_TC(attach_chroot);
+ATF_TC_HEAD(attach_chroot, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Assert that a debugger cannot trace another process unless the "
+ "process's root directory is at or below the tracing process's "
+ "root");
+
+ atf_tc_set_md_var(tc, "require.user", "root");
+}
+
+ATF_TC_BODY(attach_chroot, tc)
+{
+ char buf[PATH_MAX];
+ pid_t child;
+ int fds_toparent[2], fds_fromparent[2];
+ int rv;
+ uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
+
+ (void)memset(buf, '\0', sizeof(buf));
+ ATF_REQUIRE(getcwd(buf, sizeof(buf)) != NULL);
+ (void)strlcat(buf, "/dir", sizeof(buf));
+
+ ATF_REQUIRE(mkdir(buf, 0500) == 0);
+ ATF_REQUIRE(chdir(buf) == 0);
+
+ ATF_REQUIRE(pipe(fds_toparent) == 0);
+ ATF_REQUIRE(pipe(fds_fromparent) == 0);
+ child = atf_utils_fork();
+ if (child == 0) {
+ FORKEE_ASSERT(close(fds_toparent[0]) == 0);
+ FORKEE_ASSERT(close(fds_fromparent[1]) == 0);
+
+ FORKEE_ASSERT(chroot(buf) == 0);
+
+ rv = write(fds_toparent[1], &msg, sizeof(msg));
+ FORKEE_ASSERTX(rv == sizeof(msg));
+
+ ATF_REQUIRE_ERRNO(EPERM,
+ ptrace(PT_ATTACH, getppid(), NULL, 0) == -1);
+
+ rv = read(fds_fromparent[0], &msg, sizeof(msg));
+ FORKEE_ASSERTX(rv == sizeof(msg));
+
+ _exit(0);
+ }
+ ATF_REQUIRE(close(fds_toparent[1]) == 0);
+ ATF_REQUIRE(close(fds_fromparent[0]) == 0);
+
+ printf("Waiting for chrooting of the child PID %d", child);
+ rv = read(fds_toparent[0], &msg, sizeof(msg));
+ ATF_REQUIRE(rv == sizeof(msg));
+
+ printf("Child is ready, it will try to PT_ATTACH to parent\n");
+ rv = write(fds_fromparent[1], &msg, sizeof(msg));
+ ATF_REQUIRE(rv == sizeof(msg));
+
+ printf("fds_fromparent is no longer needed - close it\n");
+ ATF_REQUIRE(close(fds_fromparent[1]) == 0);
+
+ printf("fds_toparent is no longer needed - close it\n");
+ ATF_REQUIRE(close(fds_toparent[0]) == 0);
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+ setvbuf(stdout, NULL, _IONBF, 0);
+ setvbuf(stderr, NULL, _IONBF, 0);
+ ATF_TP_ADD_TC(tp, attach_pid0);
+ ATF_TP_ADD_TC(tp, attach_pid1);
+ ATF_TP_ADD_TC(tp, attach_pid1_securelevel);
+ ATF_TP_ADD_TC(tp, attach_self);
+ ATF_TP_ADD_TC(tp, attach_chroot);
+
+ return atf_no_error();
+}
diff --git a/kernel/t_ptrace_wait.c b/kernel/t_ptrace_wait.c
new file mode 100644
index 000000000000..e502a034eb1b
--- /dev/null
+++ b/kernel/t_ptrace_wait.c
@@ -0,0 +1,5082 @@
+/* $NetBSD: t_ptrace_wait.c,v 1.53 2017/01/10 05:08:24 kamil Exp $ */
+
+/*-
+ * Copyright (c) 2016 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: t_ptrace_wait.c,v 1.53 2017/01/10 05:08:24 kamil Exp $");
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/ptrace.h>
+#include <sys/resource.h>
+#include <sys/stat.h>
+#include <sys/sysctl.h>
+#include <sys/wait.h>
+#include <machine/reg.h>
+#include <err.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <strings.h>
+#include <unistd.h>
+
+#include <atf-c.h>
+
+#include "../h_macros.h"
+
+#include "t_ptrace_wait.h"
+#include "msg.h"
+
+#define PARENT_TO_CHILD(info, fds, msg) \
+ ATF_REQUIRE(msg_write_child(info " to child " # fds, &fds, &msg, sizeof(msg)) == 0)
+
+#define CHILD_FROM_PARENT(info, fds, msg) \
+ FORKEE_ASSERT(msg_read_parent(info " from parent " # fds, &fds, &msg, sizeof(msg)) == 0)
+
+#define CHILD_TO_PARENT(info, fds, msg) \
+ FORKEE_ASSERT(msg_write_parent(info " to parent " # fds, &fds, &msg, sizeof(msg)) == 0)
+
+#define PARENT_FROM_CHILD(info, fds, msg) \
+ ATF_REQUIRE(msg_read_child(info " from parent " # fds, &fds, &msg, sizeof(msg)) == 0)
+
+ATF_TC(traceme1);
+ATF_TC_HEAD(traceme1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify SIGSTOP followed by _exit(2) in a child");
+}
+
+ATF_TC_BODY(traceme1, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(traceme2);
+ATF_TC_HEAD(traceme2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify SIGSTOP followed by _exit(2) in a child");
+}
+
+static int traceme2_caught = 0;
+
+static void
+traceme2_sighandler(int sig)
+{
+ FORKEE_ASSERT_EQ(sig, SIGINT);
+
+ ++traceme2_caught;
+}
+
+ATF_TC_BODY(traceme2, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP, sigsent = SIGINT;
+ pid_t child, wpid;
+ struct sigaction sa;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ sa.sa_handler = traceme2_sighandler;
+ sa.sa_flags = SA_SIGINFO;
+ sigemptyset(&sa.sa_mask);
+
+ FORKEE_ASSERT(sigaction(sigsent, &sa, NULL) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(traceme2_caught, 1);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Before resuming the child process where it left off and with "
+ "signal %s to be sent\n", strsignal(sigsent));
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, sigsent) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the exited child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(traceme3);
+ATF_TC_HEAD(traceme3, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify SIGSTOP followed by termination by a signal in a child");
+}
+
+ATF_TC_BODY(traceme3, tc)
+{
+ const int sigval = SIGSTOP, sigsent = SIGINT /* Without core-dump */;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ /* NOTREACHED */
+ FORKEE_ASSERTX(0 &&
+ "Child should be terminated by a signal from its parent");
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Before resuming the child process where it left off and with "
+ "signal %s to be sent\n", strsignal(sigsent));
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, sigsent) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_signaled(status, sigsent, 0);
+
+ printf("Before calling %s() for the exited child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(traceme4);
+ATF_TC_HEAD(traceme4, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify SIGSTOP followed by SIGCONT and _exit(2) in a child");
+}
+
+ATF_TC_BODY(traceme4, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP, sigsent = SIGCONT;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before raising %s from child\n", strsignal(sigsent));
+ FORKEE_ASSERT(raise(sigsent) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(),child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigsent);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the exited child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+#if defined(TWAIT_HAVE_PID)
+ATF_TC(attach1);
+ATF_TC_HEAD(attach1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Assert that tracer sees process termination before the parent");
+}
+
+ATF_TC_BODY(attach1, tc)
+{
+ struct msg_fds parent_tracee, parent_tracer;
+ const int exitval_tracee = 5;
+ const int exitval_tracer = 10;
+ pid_t tracee, tracer, wpid;
+ uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Spawn tracee\n");
+ ATF_REQUIRE(msg_open(&parent_tracee) == 0);
+ tracee = atf_utils_fork();
+ if (tracee == 0) {
+ // Wait for parent to let us exit
+ CHILD_FROM_PARENT("exit tracee", parent_tracee, msg);
+ _exit(exitval_tracee);
+ }
+
+ printf("Spawn debugger\n");
+ ATF_REQUIRE(msg_open(&parent_tracer) == 0);
+ tracer = atf_utils_fork();
+ if (tracer == 0) {
+ printf("Before calling PT_ATTACH from tracee %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
+
+ /* Wait for tracee and assert that it was stopped w/ SIGSTOP */
+ FORKEE_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
+
+ forkee_status_stopped(status, SIGSTOP);
+
+ /* Resume tracee with PT_CONTINUE */
+ FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
+
+ /* Inform parent that tracer has attached to tracee */
+ CHILD_TO_PARENT("tracer ready", parent_tracer, msg);
+
+ /* Wait for parent to tell use that tracee should have exited */
+ CHILD_FROM_PARENT("wait for tracee exit", parent_tracer, msg);
+
+ /* Wait for tracee and assert that it exited */
+ FORKEE_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
+
+ forkee_status_exited(status, exitval_tracee);
+ printf("Tracee %d exited with %d\n", tracee, exitval_tracee);
+
+ printf("Before exiting of the tracer process\n");
+ _exit(exitval_tracer);
+ }
+
+ printf("Wait for the tracer to attach to the tracee\n");
+ PARENT_FROM_CHILD("tracer ready", parent_tracer, msg);
+
+ printf("Resume the tracee and let it exit\n");
+ PARENT_TO_CHILD("exit tracee", parent_tracee, msg);
+
+ printf("Detect that tracee is zombie\n");
+ await_zombie(tracee);
+
+
+ printf("Assert that there is no status about tracee %d - "
+ "Tracer must detect zombie first - calling %s()\n", tracee,
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0);
+
+ printf("Tell the tracer child should have exited\n");
+ PARENT_TO_CHILD("wait for tracee exit", parent_tracer, msg);
+ printf("Wait for tracer to finish its job and exit - calling %s()\n",
+ TWAIT_FNAME);
+
+ printf("Wait from tracer child to complete waiting for tracee\n");
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracer, &status, 0),
+ tracer);
+
+ validate_status_exited(status, exitval_tracer);
+
+ printf("Wait for tracee to finish its job and exit - calling %s()\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, WNOHANG),
+ tracee);
+
+ validate_status_exited(status, exitval_tracee);
+
+ msg_close(&parent_tracer);
+ msg_close(&parent_tracee);
+}
+#endif
+
+#if defined(TWAIT_HAVE_PID)
+ATF_TC(attach2);
+ATF_TC_HEAD(attach2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Assert that any tracer sees process termination before its "
+ "parent");
+}
+
+ATF_TC_BODY(attach2, tc)
+{
+ struct msg_fds parent_tracer, parent_tracee;
+ const int exitval_tracee = 5;
+ const int exitval_tracer1 = 10, exitval_tracer2 = 20;
+ pid_t tracee, tracer, wpid;
+ uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Spawn tracee\n");
+ ATF_REQUIRE(msg_open(&parent_tracee) == 0);
+ tracee = atf_utils_fork();
+ if (tracee == 0) {
+ /* Wait for message from the parent */
+ CHILD_FROM_PARENT("Message 1", parent_tracee, msg);
+ _exit(exitval_tracee);
+ }
+
+ printf("Spawn debugger\n");
+ ATF_REQUIRE(msg_open(&parent_tracer) == 0);
+ tracer = atf_utils_fork();
+ if (tracer == 0) {
+ /* Fork again and drop parent to reattach to PID 1 */
+ tracer = atf_utils_fork();
+ if (tracer != 0)
+ _exit(exitval_tracer1);
+
+ printf("Before calling PT_ATTACH from tracee %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
+
+ /* Wait for tracee and assert that it was stopped w/ SIGSTOP */
+ FORKEE_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
+
+ forkee_status_stopped(status, SIGSTOP);
+
+ /* Resume tracee with PT_CONTINUE */
+ FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
+
+ /* Inform parent that tracer has attached to tracee */
+ CHILD_TO_PARENT("Message 1", parent_tracer, msg);
+ CHILD_FROM_PARENT("Message 2", parent_tracer, msg);
+
+ /* Wait for tracee and assert that it exited */
+ FORKEE_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
+
+ forkee_status_exited(status, exitval_tracee);
+
+ printf("Before exiting of the tracer process\n");
+ _exit(exitval_tracer2);
+ }
+ printf("Wait for the tracer process (direct child) to exit calling "
+ "%s()\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracer, &status, 0), tracer);
+
+ validate_status_exited(status, exitval_tracer1);
+
+ printf("Wait for the non-exited tracee process with %s()\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, NULL, WNOHANG), 0);
+
+ printf("Wait for the tracer to attach to the tracee\n");
+ PARENT_FROM_CHILD("Message 1", parent_tracer, msg);
+ printf("Resume the tracee and let it exit\n");
+ PARENT_TO_CHILD("Message 1", parent_tracee, msg);
+
+ printf("Detect that tracee is zombie\n");
+ await_zombie(tracee);
+
+ printf("Assert that there is no status about tracee - "
+ "Tracer must detect zombie first - calling %s()\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0);
+
+ printf("Resume the tracer and let it detect exited tracee\n");
+ PARENT_TO_CHILD("Message 2", parent_tracer, msg);
+
+ printf("Wait for tracee to finish its job and exit - calling %s()\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, WNOHANG),
+ tracee);
+
+ validate_status_exited(status, exitval_tracee);
+
+ msg_close(&parent_tracer);
+ msg_close(&parent_tracee);
+
+}
+#endif
+
+ATF_TC(attach3);
+ATF_TC_HEAD(attach3, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Assert that tracer parent can PT_ATTACH to its child");
+}
+
+ATF_TC_BODY(attach3, tc)
+{
+ struct msg_fds parent_tracee;
+ const int exitval_tracee = 5;
+ pid_t tracee, wpid;
+ uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Spawn tracee\n");
+ ATF_REQUIRE(msg_open(&parent_tracee) == 0);
+ tracee = atf_utils_fork();
+ if (tracee == 0) {
+ CHILD_FROM_PARENT("Message 1", parent_tracee, msg);
+ printf("Parent should now attach to tracee\n");
+
+ CHILD_FROM_PARENT("Message 2", parent_tracee, msg);
+ /* Wait for message from the parent */
+ _exit(exitval_tracee);
+ }
+ PARENT_TO_CHILD("Message 1", parent_tracee, msg);
+
+ printf("Before calling PT_ATTACH for tracee %d\n", tracee);
+ ATF_REQUIRE(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
+
+ printf("Wait for the stopped tracee process with %s()\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
+
+ validate_status_stopped(status, SIGSTOP);
+
+ printf("Resume tracee with PT_CONTINUE\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
+
+ printf("Let the tracee exit now\n");
+ PARENT_TO_CHILD("Message 2", parent_tracee, msg);
+
+ printf("Wait for tracee to exit with %s()\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
+
+ validate_status_exited(status, exitval_tracee);
+
+ printf("Before calling %s() for tracee\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD,
+ wpid = TWAIT_GENERIC(tracee, &status, 0));
+
+ msg_close(&parent_tracee);
+}
+
+ATF_TC(attach4);
+ATF_TC_HEAD(attach4, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Assert that tracer child can PT_ATTACH to its parent");
+}
+
+ATF_TC_BODY(attach4, tc)
+{
+ struct msg_fds parent_tracee;
+ const int exitval_tracer = 5;
+ pid_t tracer, wpid;
+ uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Spawn tracer\n");
+ ATF_REQUIRE(msg_open(&parent_tracee) == 0);
+ tracer = atf_utils_fork();
+ if (tracer == 0) {
+
+ /* Wait for message from the parent */
+ CHILD_FROM_PARENT("Message 1", parent_tracee, msg);
+
+ printf("Attach to parent PID %d with PT_ATTACH from child\n",
+ getppid());
+ FORKEE_ASSERT(ptrace(PT_ATTACH, getppid(), NULL, 0) != -1);
+
+ printf("Wait for the stopped parent process with %s()\n",
+ TWAIT_FNAME);
+ FORKEE_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(getppid(), &status, 0), getppid());
+
+ forkee_status_stopped(status, SIGSTOP);
+
+ printf("Resume parent with PT_DETACH\n");
+ FORKEE_ASSERT(ptrace(PT_DETACH, getppid(), (void *)1, 0)
+ != -1);
+
+ /* Tell parent we are ready */
+ CHILD_TO_PARENT("Message 1", parent_tracee, msg);
+
+ _exit(exitval_tracer);
+ }
+
+ printf("Wait for the tracer to become ready\n");
+ PARENT_TO_CHILD("Message 1", parent_tracee, msg);
+ printf("Allow the tracer to exit now\n");
+ PARENT_FROM_CHILD("Message 1", parent_tracee, msg);
+
+ printf("Wait for tracer to exit with %s()\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracer, &status, 0), tracer);
+
+ validate_status_exited(status, exitval_tracer);
+
+ printf("Before calling %s() for tracer\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD,
+ wpid = TWAIT_GENERIC(tracer, &status, 0));
+
+ msg_close(&parent_tracee);
+}
+
+#if defined(TWAIT_HAVE_PID)
+ATF_TC(attach5);
+ATF_TC_HEAD(attach5, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Assert that tracer sees its parent when attached to tracer "
+ "(check getppid(2))");
+}
+
+ATF_TC_BODY(attach5, tc)
+{
+ struct msg_fds parent_tracer, parent_tracee;
+ const int exitval_tracee = 5;
+ const int exitval_tracer = 10;
+ pid_t parent, tracee, tracer, wpid;
+ uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Spawn tracee\n");
+ ATF_REQUIRE(msg_open(&parent_tracer) == 0);
+ ATF_REQUIRE(msg_open(&parent_tracee) == 0);
+ tracee = atf_utils_fork();
+ if (tracee == 0) {
+ parent = getppid();
+
+ /* Emit message to the parent */
+ CHILD_TO_PARENT("tracee ready", parent_tracee, msg);
+ CHILD_FROM_PARENT("exit tracee", parent_tracee, msg);
+
+ FORKEE_ASSERT_EQ(parent, getppid());
+
+ _exit(exitval_tracee);
+ }
+ printf("Wait for child to record its parent identifier (pid)\n");
+ PARENT_FROM_CHILD("tracee ready", parent_tracee, msg);
+
+ printf("Spawn debugger\n");
+ tracer = atf_utils_fork();
+ if (tracer == 0) {
+ /* No IPC to communicate with the child */
+ printf("Before calling PT_ATTACH from tracee %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
+
+ /* Wait for tracee and assert that it was stopped w/ SIGSTOP */
+ FORKEE_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
+
+ forkee_status_stopped(status, SIGSTOP);
+
+ /* Resume tracee with PT_CONTINUE */
+ FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
+
+ /* Inform parent that tracer has attached to tracee */
+ CHILD_TO_PARENT("tracer ready", parent_tracer, msg);
+
+ /* Wait for parent to tell use that tracee should have exited */
+ CHILD_FROM_PARENT("wait for tracee exit", parent_tracer, msg);
+
+ /* Wait for tracee and assert that it exited */
+ FORKEE_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
+
+ forkee_status_exited(status, exitval_tracee);
+
+ printf("Before exiting of the tracer process\n");
+ _exit(exitval_tracer);
+ }
+
+ printf("Wait for the tracer to attach to the tracee\n");
+ PARENT_FROM_CHILD("tracer ready", parent_tracer, msg);
+
+ printf("Resume the tracee and let it exit\n");
+ PARENT_TO_CHILD("exit tracee", parent_tracee, msg);
+
+ printf("Detect that tracee is zombie\n");
+ await_zombie(tracee);
+
+ printf("Assert that there is no status about tracee - "
+ "Tracer must detect zombie first - calling %s()\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0);
+
+ printf("Tell the tracer child should have exited\n");
+ PARENT_TO_CHILD("wait for tracee exit", parent_tracer, msg);
+
+ printf("Wait from tracer child to complete waiting for tracee\n");
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracer, &status, 0),
+ tracer);
+
+ validate_status_exited(status, exitval_tracer);
+
+ printf("Wait for tracee to finish its job and exit - calling %s()\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, WNOHANG),
+ tracee);
+
+ validate_status_exited(status, exitval_tracee);
+
+ msg_close(&parent_tracer);
+ msg_close(&parent_tracee);
+}
+#endif
+
+#if defined(TWAIT_HAVE_PID)
+ATF_TC(attach6);
+ATF_TC_HEAD(attach6, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Assert that tracer sees its parent when attached to tracer "
+ "(check sysctl(7) and struct kinfo_proc2)");
+}
+
+ATF_TC_BODY(attach6, tc)
+{
+ struct msg_fds parent_tracee, parent_tracer;
+ const int exitval_tracee = 5;
+ const int exitval_tracer = 10;
+ pid_t parent, tracee, tracer, wpid;
+ uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ int name[CTL_MAXNAME];
+ struct kinfo_proc2 kp;
+ size_t len = sizeof(kp);
+ unsigned int namelen;
+
+ printf("Spawn tracee\n");
+ ATF_REQUIRE(msg_open(&parent_tracee) == 0);
+ ATF_REQUIRE(msg_open(&parent_tracer) == 0);
+ tracee = atf_utils_fork();
+ if (tracee == 0) {
+ parent = getppid();
+
+ /* Emit message to the parent */
+ CHILD_TO_PARENT("Message 1", parent_tracee, msg);
+ CHILD_FROM_PARENT("Message 2", parent_tracee, msg);
+
+ namelen = 0;
+ name[namelen++] = CTL_KERN;
+ name[namelen++] = KERN_PROC2;
+ name[namelen++] = KERN_PROC_PID;
+ name[namelen++] = getpid();
+ name[namelen++] = len;
+ name[namelen++] = 1;
+
+ FORKEE_ASSERT(sysctl(name, namelen, &kp, &len, NULL, 0) == 0);
+ FORKEE_ASSERT_EQ(parent, kp.p_ppid);
+
+ _exit(exitval_tracee);
+ }
+
+ printf("Wait for child to record its parent identifier (pid)\n");
+ PARENT_FROM_CHILD("Message 1", parent_tracee, msg);
+
+ printf("Spawn debugger\n");
+ tracer = atf_utils_fork();
+ if (tracer == 0) {
+ /* No IPC to communicate with the child */
+ printf("Before calling PT_ATTACH from tracee %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
+
+ /* Wait for tracee and assert that it was stopped w/ SIGSTOP */
+ FORKEE_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
+
+ forkee_status_stopped(status, SIGSTOP);
+
+ /* Resume tracee with PT_CONTINUE */
+ FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
+
+ /* Inform parent that tracer has attached to tracee */
+ CHILD_TO_PARENT("Message 1", parent_tracer, msg);
+
+ CHILD_FROM_PARENT("Message 2", parent_tracer, msg);
+
+ /* Wait for tracee and assert that it exited */
+ FORKEE_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
+
+ forkee_status_exited(status, exitval_tracee);
+
+ printf("Before exiting of the tracer process\n");
+ _exit(exitval_tracer);
+ }
+
+ printf("Wait for the tracer to attach to the tracee\n");
+ PARENT_FROM_CHILD("Message 1", parent_tracer, msg);
+
+ printf("Resume the tracee and let it exit\n");
+ PARENT_TO_CHILD("Message 1", parent_tracee, msg);
+
+ printf("Detect that tracee is zombie\n");
+ await_zombie(tracee);
+
+ printf("Assert that there is no status about tracee - "
+ "Tracer must detect zombie first - calling %s()\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0);
+
+ printf("Resume the tracer and let it detect exited tracee\n");
+ PARENT_TO_CHILD("Message 2", parent_tracer, msg);
+
+ printf("Wait for tracer to finish its job and exit - calling %s()\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracer, &status, 0),
+ tracer);
+
+ validate_status_exited(status, exitval_tracer);
+
+ printf("Wait for tracee to finish its job and exit - calling %s()\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, WNOHANG),
+ tracee);
+
+ validate_status_exited(status, exitval_tracee);
+
+ msg_close(&parent_tracee);
+ msg_close(&parent_tracer);
+}
+#endif
+
+#if defined(TWAIT_HAVE_PID)
+ATF_TC(attach7);
+ATF_TC_HEAD(attach7, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Assert that tracer sees its parent when attached to tracer "
+ "(check /proc/curproc/status 3rd column)");
+}
+
+ATF_TC_BODY(attach7, tc)
+{
+ struct msg_fds parent_tracee, parent_tracer;
+ int rv;
+ const int exitval_tracee = 5;
+ const int exitval_tracer = 10;
+ pid_t parent, tracee, tracer, wpid;
+ uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ FILE *fp;
+ struct stat st;
+ const char *fname = "/proc/curproc/status";
+ char s_executable[MAXPATHLEN];
+ int s_pid, s_ppid;
+ /*
+ * Format:
+ * EXECUTABLE PID PPID ...
+ */
+
+ ATF_REQUIRE((rv = stat(fname, &st)) == 0 || (errno == ENOENT));
+ if (rv != 0) {
+ atf_tc_skip("/proc/curproc/status not found");
+ }
+
+ printf("Spawn tracee\n");
+ ATF_REQUIRE(msg_open(&parent_tracee) == 0);
+ ATF_REQUIRE(msg_open(&parent_tracer) == 0);
+ tracee = atf_utils_fork();
+ if (tracee == 0) {
+ parent = getppid();
+
+ // Wait for parent to let us exit
+ CHILD_TO_PARENT("tracee ready", parent_tracee, msg);
+ CHILD_FROM_PARENT("tracee exit", parent_tracee, msg);
+
+ FORKEE_ASSERT((fp = fopen(fname, "r")) != NULL);
+ fscanf(fp, "%s %d %d", s_executable, &s_pid, &s_ppid);
+ FORKEE_ASSERT(fclose(fp) == 0);
+ FORKEE_ASSERT_EQ(parent, s_ppid);
+
+ _exit(exitval_tracee);
+ }
+
+ printf("Wait for child to record its parent identifier (pid)\n");
+ PARENT_FROM_CHILD("tracee ready", parent_tracee, msg);
+
+ printf("Spawn debugger\n");
+ tracer = atf_utils_fork();
+ if (tracer == 0) {
+ printf("Before calling PT_ATTACH from tracee %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
+
+ /* Wait for tracee and assert that it was stopped w/ SIGSTOP */
+ FORKEE_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
+
+ forkee_status_stopped(status, SIGSTOP);
+
+ /* Resume tracee with PT_CONTINUE */
+ FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
+
+ /* Inform parent that tracer has attached to tracee */
+ CHILD_TO_PARENT("tracer ready", parent_tracer, msg);
+
+ /* Wait for parent to tell use that tracee should have exited */
+ CHILD_FROM_PARENT("wait for tracee exit", parent_tracer, msg);
+
+ /* Wait for tracee and assert that it exited */
+ FORKEE_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
+
+ forkee_status_exited(status, exitval_tracee);
+
+ printf("Before exiting of the tracer process\n");
+ _exit(exitval_tracer);
+ }
+ printf("Wait for the tracer to attach to the tracee\n");
+ PARENT_FROM_CHILD("tracer ready", parent_tracer, msg);
+ printf("Resume the tracee and let it exit\n");
+ PARENT_TO_CHILD("tracee exit", parent_tracee, msg);
+
+ printf("Detect that tracee is zombie\n");
+ await_zombie(tracee);
+
+ printf("Assert that there is no status about tracee - "
+ "Tracer must detect zombie first - calling %s()\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0);
+
+ printf("Resume the tracer and let it detect exited tracee\n");
+ PARENT_TO_CHILD("Message 2", parent_tracer, msg);
+
+ printf("Wait for tracer to finish its job and exit - calling %s()\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracer, &status, 0),
+ tracer);
+
+ validate_status_exited(status, exitval_tracer);
+
+ printf("Wait for tracee to finish its job and exit - calling %s()\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, WNOHANG),
+ tracee);
+
+ validate_status_exited(status, exitval_tracee);
+
+ msg_close(&parent_tracee);
+ msg_close(&parent_tracer);
+}
+#endif
+
+ATF_TC(eventmask1);
+ATF_TC_HEAD(eventmask1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify that empty EVENT_MASK is preserved");
+}
+
+ATF_TC_BODY(eventmask1, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ ptrace_event_t set_event, get_event;
+ const int len = sizeof(ptrace_event_t);
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ set_event.pe_set_event = 0;
+ ATF_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &set_event, len) != -1);
+ ATF_REQUIRE(ptrace(PT_GET_EVENT_MASK, child, &get_event, len) != -1);
+ ATF_REQUIRE(memcmp(&set_event, &get_event, len) == 0);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(eventmask2);
+ATF_TC_HEAD(eventmask2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify that PTRACE_FORK in EVENT_MASK is preserved");
+}
+
+ATF_TC_BODY(eventmask2, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ ptrace_event_t set_event, get_event;
+ const int len = sizeof(ptrace_event_t);
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ set_event.pe_set_event = PTRACE_FORK;
+ ATF_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &set_event, len) != -1);
+ ATF_REQUIRE(ptrace(PT_GET_EVENT_MASK, child, &get_event, len) != -1);
+ ATF_REQUIRE(memcmp(&set_event, &get_event, len) == 0);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+#if defined(TWAIT_HAVE_PID)
+ATF_TC(fork1);
+ATF_TC_HEAD(fork1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify that fork(2) is intercepted by ptrace(2) with EVENT_MASK "
+ "set to PTRACE_FORK");
+}
+
+ATF_TC_BODY(fork1, tc)
+{
+ const int exitval = 5;
+ const int exitval2 = 15;
+ const int sigval = SIGSTOP;
+ pid_t child, child2, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ ptrace_state_t state;
+ const int slen = sizeof(state);
+ ptrace_event_t event;
+ const int elen = sizeof(event);
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT((child2 = fork()) != 1);
+
+ if (child2 == 0)
+ _exit(exitval2);
+
+ FORKEE_REQUIRE_SUCCESS
+ (wpid = TWAIT_GENERIC(child2, &status, 0), child2);
+
+ forkee_status_exited(status, exitval2);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Enable PTRACE_FORK in EVENT_MASK for the child %d\n", child);
+ event.pe_set_event = PTRACE_FORK;
+ ATF_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child %d\n", TWAIT_FNAME, child);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, SIGTRAP);
+
+ ATF_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1);
+ ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_FORK);
+
+ child2 = state.pe_other_pid;
+ printf("Reported PTRACE_FORK event with forkee %d\n", child2);
+
+ printf("Before calling %s() for the forkee %d of the child %d\n",
+ TWAIT_FNAME, child2, child);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0),
+ child2);
+
+ validate_status_stopped(status, SIGTRAP);
+
+ ATF_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child2, &state, slen) != -1);
+ ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_FORK);
+ ATF_REQUIRE_EQ(state.pe_other_pid, child);
+
+ printf("Before resuming the forkee process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child2, (void *)1, 0) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the forkee - expected exited\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0),
+ child2);
+
+ validate_status_exited(status, exitval2);
+
+ printf("Before calling %s() for the forkee - expected no process\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD,
+ wpid = TWAIT_GENERIC(child2, &status, 0));
+
+ printf("Before calling %s() for the child - expected stopped "
+ "SIGCHLD\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, SIGCHLD);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child - expected exited\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child - expected no process\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+#endif
+
+ATF_TC(fork2);
+ATF_TC_HEAD(fork2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify that fork(2) is not intercepted by ptrace(2) with empty "
+ "EVENT_MASK");
+}
+
+ATF_TC_BODY(fork2, tc)
+{
+ const int exitval = 5;
+ const int exitval2 = 15;
+ const int sigval = SIGSTOP;
+ pid_t child, child2, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ ptrace_event_t event;
+ const int elen = sizeof(event);
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT((child2 = fork()) != 1);
+
+ if (child2 == 0)
+ _exit(exitval2);
+
+ FORKEE_REQUIRE_SUCCESS
+ (wpid = TWAIT_GENERIC(child2, &status, 0), child2);
+
+ forkee_status_exited(status, exitval2);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Set empty EVENT_MASK for the child %d\n", child);
+ event.pe_set_event = 0;
+ ATF_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child - expected stopped "
+ "SIGCHLD\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, SIGCHLD);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child - expected exited\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child - expected no process\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+#if defined(TWAIT_HAVE_PID)
+ATF_TC(vfork1);
+ATF_TC_HEAD(vfork1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify that vfork(2) is intercepted by ptrace(2) with EVENT_MASK "
+ "set to PTRACE_VFORK");
+}
+
+ATF_TC_BODY(vfork1, tc)
+{
+ const int exitval = 5;
+ const int exitval2 = 15;
+ const int sigval = SIGSTOP;
+ pid_t child, child2, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ ptrace_state_t state;
+ const int slen = sizeof(state);
+ ptrace_event_t event;
+ const int elen = sizeof(event);
+
+ /*
+ * ptrace(2) command PT_SET_EVENT_MASK: option PTRACE_VFORK unsupported
+ */
+#ifndef PTRACE_VFORK
+#define PTRACE_VFORK 0
+#endif
+ atf_tc_expect_fail("PR kern/51630");
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT((child2 = vfork()) != 1);
+
+ if (child2 == 0)
+ _exit(exitval2);
+
+ FORKEE_REQUIRE_SUCCESS
+ (wpid = TWAIT_GENERIC(child2, &status, 0), child2);
+
+ forkee_status_exited(status, exitval2);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Enable PTRACE_VFORK in EVENT_MASK for the child %d\n", child);
+ event.pe_set_event = PTRACE_VFORK;
+ ATF_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child %d\n", TWAIT_FNAME, child);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, SIGTRAP);
+
+ ATF_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1);
+ ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_VFORK);
+
+ child2 = state.pe_other_pid;
+ printf("Reported PTRACE_VFORK event with forkee %d\n", child2);
+
+ printf("Before calling %s() for the forkee %d of the child %d\n",
+ TWAIT_FNAME, child2, child);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0),
+ child2);
+
+ validate_status_stopped(status, SIGTRAP);
+
+ ATF_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child2, &state, slen) != -1);
+ ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_VFORK);
+ ATF_REQUIRE_EQ(state.pe_other_pid, child);
+
+ printf("Before resuming the forkee process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child2, (void *)1, 0) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the forkee - expected exited\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0),
+ child2);
+
+ validate_status_exited(status, exitval2);
+
+ printf("Before calling %s() for the forkee - expected no process\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD,
+ wpid = TWAIT_GENERIC(child2, &status, 0));
+
+ printf("Before calling %s() for the child - expected stopped "
+ "SIGCHLD\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, SIGCHLD);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child - expected exited\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child - expected no process\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+#endif
+
+ATF_TC(vfork2);
+ATF_TC_HEAD(vfork2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify that vfork(2) is not intercepted by ptrace(2) with empty "
+ "EVENT_MASK");
+}
+
+ATF_TC_BODY(vfork2, tc)
+{
+ const int exitval = 5;
+ const int exitval2 = 15;
+ const int sigval = SIGSTOP;
+ pid_t child, child2, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ ptrace_event_t event;
+ const int elen = sizeof(event);
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT((child2 = vfork()) != 1);
+
+ if (child2 == 0)
+ _exit(exitval2);
+
+ FORKEE_REQUIRE_SUCCESS
+ (wpid = TWAIT_GENERIC(child2, &status, 0), child2);
+
+ forkee_status_exited(status, exitval2);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Set empty EVENT_MASK for the child %d\n", child);
+ event.pe_set_event = 0;
+ ATF_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child - expected stopped "
+ "SIGCHLD\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, SIGCHLD);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child - expected exited\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child - expected no process\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(io_read_d1);
+ATF_TC_HEAD(io_read_d1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_IO with PIOD_READ_D and len = sizeof(uint8_t)");
+}
+
+ATF_TC_BODY(io_read_d1, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ uint8_t lookup_me = 0;
+ const uint8_t magic = 0xab;
+ struct ptrace_io_desc io = {
+ .piod_op = PIOD_READ_D,
+ .piod_offs = &lookup_me,
+ .piod_addr = &lookup_me,
+ .piod_len = sizeof(lookup_me)
+ };
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ lookup_me = magic;
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me, magic,
+ "got value %" PRIx8 " != expected %" PRIx8, lookup_me, magic);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(io_read_d2);
+ATF_TC_HEAD(io_read_d2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_IO with PIOD_READ_D and len = sizeof(uint16_t)");
+}
+
+ATF_TC_BODY(io_read_d2, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ uint16_t lookup_me = 0;
+ const uint16_t magic = 0x1234;
+ struct ptrace_io_desc io = {
+ .piod_op = PIOD_READ_D,
+ .piod_offs = &lookup_me,
+ .piod_addr = &lookup_me,
+ .piod_len = sizeof(lookup_me)
+ };
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ lookup_me = magic;
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me, magic,
+ "got value %" PRIx16 " != expected %" PRIx16, lookup_me, magic);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(io_read_d3);
+ATF_TC_HEAD(io_read_d3, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_IO with PIOD_READ_D and len = sizeof(uint32_t)");
+}
+
+ATF_TC_BODY(io_read_d3, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ uint32_t lookup_me = 0;
+ const uint32_t magic = 0x1234abcd;
+ struct ptrace_io_desc io = {
+ .piod_op = PIOD_READ_D,
+ .piod_offs = &lookup_me,
+ .piod_addr = &lookup_me,
+ .piod_len = sizeof(lookup_me)
+ };
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ lookup_me = magic;
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me, magic,
+ "got value %" PRIx32 " != expected %" PRIx32, lookup_me, magic);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(io_read_d4);
+ATF_TC_HEAD(io_read_d4, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_IO with PIOD_READ_D and len = sizeof(uint64_t)");
+}
+
+ATF_TC_BODY(io_read_d4, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ uint64_t lookup_me = 0;
+ const uint64_t magic = 0x1234abcd9876dcfa;
+ struct ptrace_io_desc io = {
+ .piod_op = PIOD_READ_D,
+ .piod_offs = &lookup_me,
+ .piod_addr = &lookup_me,
+ .piod_len = sizeof(lookup_me)
+ };
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ lookup_me = magic;
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me, magic,
+ "got value %" PRIx64 " != expected %" PRIx64, lookup_me, magic);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(io_write_d1);
+ATF_TC_HEAD(io_write_d1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_IO with PIOD_WRITE_D and len = sizeof(uint8_t)");
+}
+
+ATF_TC_BODY(io_write_d1, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ uint8_t lookup_me = 0;
+ const uint8_t magic = 0xab;
+ struct ptrace_io_desc io = {
+ .piod_op = PIOD_WRITE_D,
+ .piod_offs = &lookup_me,
+ .piod_addr = &lookup_me,
+ .piod_len = sizeof(lookup_me)
+ };
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(lookup_me, magic);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ lookup_me = magic;
+
+ printf("Write new lookup_me to tracee (PID=%d) from tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(io_write_d2);
+ATF_TC_HEAD(io_write_d2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_IO with PIOD_WRITE_D and len = sizeof(uint16_t)");
+}
+
+ATF_TC_BODY(io_write_d2, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ uint16_t lookup_me = 0;
+ const uint16_t magic = 0xab12;
+ struct ptrace_io_desc io = {
+ .piod_op = PIOD_WRITE_D,
+ .piod_offs = &lookup_me,
+ .piod_addr = &lookup_me,
+ .piod_len = sizeof(lookup_me)
+ };
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(lookup_me, magic);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ lookup_me = magic;
+
+ printf("Write new lookup_me to tracee (PID=%d) from tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(io_write_d3);
+ATF_TC_HEAD(io_write_d3, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_IO with PIOD_WRITE_D and len = sizeof(uint32_t)");
+}
+
+ATF_TC_BODY(io_write_d3, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ uint32_t lookup_me = 0;
+ const uint32_t magic = 0xab127643;
+ struct ptrace_io_desc io = {
+ .piod_op = PIOD_WRITE_D,
+ .piod_offs = &lookup_me,
+ .piod_addr = &lookup_me,
+ .piod_len = sizeof(lookup_me)
+ };
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(lookup_me, magic);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ lookup_me = magic;
+
+ printf("Write new lookup_me to tracee (PID=%d) from tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(io_write_d4);
+ATF_TC_HEAD(io_write_d4, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_IO with PIOD_WRITE_D and len = sizeof(uint64_t)");
+}
+
+ATF_TC_BODY(io_write_d4, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ uint64_t lookup_me = 0;
+ const uint64_t magic = 0xab12764376490123;
+ struct ptrace_io_desc io = {
+ .piod_op = PIOD_WRITE_D,
+ .piod_offs = &lookup_me,
+ .piod_addr = &lookup_me,
+ .piod_len = sizeof(lookup_me)
+ };
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(lookup_me, magic);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ lookup_me = magic;
+
+ printf("Write new lookup_me to tracee (PID=%d) from tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(read_d1);
+ATF_TC_HEAD(read_d1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_READ_D called once");
+}
+
+ATF_TC_BODY(read_d1, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ int lookup_me = 0;
+ const int magic = (int)random();
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ lookup_me = magic;
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Read new lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me = ptrace(PT_READ_D, child, &lookup_me, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me, magic,
+ "got value %#x != expected %#x", lookup_me, magic);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(read_d2);
+ATF_TC_HEAD(read_d2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_READ_D called twice");
+}
+
+ATF_TC_BODY(read_d2, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ int lookup_me1 = 0;
+ int lookup_me2 = 0;
+ const int magic1 = (int)random();
+ const int magic2 = (int)random();
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ lookup_me1 = magic1;
+ lookup_me2 = magic2;
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Read new lookup_me1 from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me1 = ptrace(PT_READ_D, child, &lookup_me1, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me1, magic1,
+ "got value %#x != expected %#x", lookup_me1, magic1);
+
+ printf("Read new lookup_me2 from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me2 = ptrace(PT_READ_D, child, &lookup_me2, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me2, magic2,
+ "got value %#x != expected %#x", lookup_me2, magic2);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(read_d3);
+ATF_TC_HEAD(read_d3, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_READ_D called three times");
+}
+
+ATF_TC_BODY(read_d3, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ int lookup_me1 = 0;
+ int lookup_me2 = 0;
+ int lookup_me3 = 0;
+ const int magic1 = (int)random();
+ const int magic2 = (int)random();
+ const int magic3 = (int)random();
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ lookup_me1 = magic1;
+ lookup_me2 = magic2;
+ lookup_me3 = magic3;
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Read new lookup_me1 from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me1 = ptrace(PT_READ_D, child, &lookup_me1, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me1, magic1,
+ "got value %#x != expected %#x", lookup_me1, magic1);
+
+ printf("Read new lookup_me2 from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me2 = ptrace(PT_READ_D, child, &lookup_me2, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me2, magic2,
+ "got value %#x != expected %#x", lookup_me2, magic2);
+
+ printf("Read new lookup_me3 from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me3 = ptrace(PT_READ_D, child, &lookup_me3, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me3, magic3,
+ "got value %#x != expected %#x", lookup_me3, magic3);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(read_d4);
+ATF_TC_HEAD(read_d4, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_READ_D called four times");
+}
+
+ATF_TC_BODY(read_d4, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ int lookup_me1 = 0;
+ int lookup_me2 = 0;
+ int lookup_me3 = 0;
+ int lookup_me4 = 0;
+ const int magic1 = (int)random();
+ const int magic2 = (int)random();
+ const int magic3 = (int)random();
+ const int magic4 = (int)random();
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ lookup_me1 = magic1;
+ lookup_me2 = magic2;
+ lookup_me3 = magic3;
+ lookup_me4 = magic4;
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Read new lookup_me1 from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me1 = ptrace(PT_READ_D, child, &lookup_me1, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me1, magic1,
+ "got value %#x != expected %#x", lookup_me1, magic1);
+
+ printf("Read new lookup_me2 from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me2 = ptrace(PT_READ_D, child, &lookup_me2, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me2, magic2,
+ "got value %#x != expected %#x", lookup_me2, magic2);
+
+ printf("Read new lookup_me3 from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me3 = ptrace(PT_READ_D, child, &lookup_me3, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me3, magic3,
+ "got value %#x != expected %#x", lookup_me3, magic3);
+
+ printf("Read new lookup_me4 from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me4 = ptrace(PT_READ_D, child, &lookup_me4, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me4, magic4,
+ "got value %#x != expected %#x", lookup_me4, magic4);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(write_d1);
+ATF_TC_HEAD(write_d1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_WRITE_D called once");
+}
+
+ATF_TC_BODY(write_d1, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ int lookup_me = 0;
+ const int magic = (int)random();
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(lookup_me, magic);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Write new lookup_me to tracee (PID=%d) from tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me, magic) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(write_d2);
+ATF_TC_HEAD(write_d2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_WRITE_D called twice");
+}
+
+ATF_TC_BODY(write_d2, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ int lookup_me1 = 0;
+ int lookup_me2 = 0;
+ const int magic1 = (int)random();
+ const int magic2 = (int)random();
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(lookup_me1, magic1);
+ FORKEE_ASSERT_EQ(lookup_me2, magic2);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Write new lookup_me1 to tracee (PID=%d) from tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me1, magic1) != -1);
+
+ printf("Write new lookup_me2 to tracee (PID=%d) from tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me2, magic2) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(write_d3);
+ATF_TC_HEAD(write_d3, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_WRITE_D called three times");
+}
+
+ATF_TC_BODY(write_d3, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ int lookup_me1 = 0;
+ int lookup_me2 = 0;
+ int lookup_me3 = 0;
+ const int magic1 = (int)random();
+ const int magic2 = (int)random();
+ const int magic3 = (int)random();
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(lookup_me1, magic1);
+ FORKEE_ASSERT_EQ(lookup_me2, magic2);
+ FORKEE_ASSERT_EQ(lookup_me3, magic3);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Write new lookup_me1 to tracee (PID=%d) from tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me1, magic1) != -1);
+
+ printf("Write new lookup_me2 to tracee (PID=%d) from tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me2, magic2) != -1);
+
+ printf("Write new lookup_me3 to tracee (PID=%d) from tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me3, magic3) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(write_d4);
+ATF_TC_HEAD(write_d4, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_WRITE_D called four times");
+}
+
+ATF_TC_BODY(write_d4, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ int lookup_me1 = 0;
+ int lookup_me2 = 0;
+ int lookup_me3 = 0;
+ int lookup_me4 = 0;
+ const int magic1 = (int)random();
+ const int magic2 = (int)random();
+ const int magic3 = (int)random();
+ const int magic4 = (int)random();
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(lookup_me1, magic1);
+ FORKEE_ASSERT_EQ(lookup_me2, magic2);
+ FORKEE_ASSERT_EQ(lookup_me3, magic3);
+ FORKEE_ASSERT_EQ(lookup_me4, magic4);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Write new lookup_me1 to tracee (PID=%d) from tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me1, magic1) != -1);
+
+ printf("Write new lookup_me2 to tracee (PID=%d) from tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me2, magic2) != -1);
+
+ printf("Write new lookup_me3 to tracee (PID=%d) from tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me3, magic3) != -1);
+
+ printf("Write new lookup_me4 to tracee (PID=%d) from tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me4, magic4) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(io_read_d_write_d_handshake1);
+ATF_TC_HEAD(io_read_d_write_d_handshake1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_IO with PIOD_READ_D and PIOD_WRITE_D handshake");
+}
+
+ATF_TC_BODY(io_read_d_write_d_handshake1, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ uint8_t lookup_me_fromtracee = 0;
+ const uint8_t magic_fromtracee = (uint8_t)random();
+ uint8_t lookup_me_totracee = 0;
+ const uint8_t magic_totracee = (uint8_t)random();
+ struct ptrace_io_desc io_fromtracee = {
+ .piod_op = PIOD_READ_D,
+ .piod_offs = &lookup_me_fromtracee,
+ .piod_addr = &lookup_me_fromtracee,
+ .piod_len = sizeof(lookup_me_fromtracee)
+ };
+ struct ptrace_io_desc io_totracee = {
+ .piod_op = PIOD_WRITE_D,
+ .piod_offs = &lookup_me_totracee,
+ .piod_addr = &lookup_me_totracee,
+ .piod_len = sizeof(lookup_me_totracee)
+ };
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ lookup_me_fromtracee = magic_fromtracee;
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(lookup_me_totracee, magic_totracee);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Read lookup_me_fromtracee PID=%d by tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_IO, child, &io_fromtracee, 0) != -1);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me_fromtracee, magic_fromtracee,
+ "got value %" PRIx8 " != expected %" PRIx8, lookup_me_fromtracee,
+ magic_fromtracee);
+
+ lookup_me_totracee = magic_totracee;
+
+ printf("Write lookup_me_totracee to PID=%d by tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_IO, child, &io_totracee, 0) != -1);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me_totracee, magic_totracee,
+ "got value %" PRIx8 " != expected %" PRIx8, lookup_me_totracee,
+ magic_totracee);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(io_read_d_write_d_handshake2);
+ATF_TC_HEAD(io_read_d_write_d_handshake2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_IO with PIOD_WRITE_D and PIOD_READ_D handshake");
+}
+
+ATF_TC_BODY(io_read_d_write_d_handshake2, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ uint8_t lookup_me_fromtracee = 0;
+ const uint8_t magic_fromtracee = (uint8_t)random();
+ uint8_t lookup_me_totracee = 0;
+ const uint8_t magic_totracee = (uint8_t)random();
+ struct ptrace_io_desc io_fromtracee = {
+ .piod_op = PIOD_READ_D,
+ .piod_offs = &lookup_me_fromtracee,
+ .piod_addr = &lookup_me_fromtracee,
+ .piod_len = sizeof(lookup_me_fromtracee)
+ };
+ struct ptrace_io_desc io_totracee = {
+ .piod_op = PIOD_WRITE_D,
+ .piod_offs = &lookup_me_totracee,
+ .piod_addr = &lookup_me_totracee,
+ .piod_len = sizeof(lookup_me_totracee)
+ };
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ lookup_me_fromtracee = magic_fromtracee;
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(lookup_me_totracee, magic_totracee);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ lookup_me_totracee = magic_totracee;
+
+ printf("Write lookup_me_totracee to PID=%d by tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_IO, child, &io_totracee, 0) != -1);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me_totracee, magic_totracee,
+ "got value %" PRIx8 " != expected %" PRIx8, lookup_me_totracee,
+ magic_totracee);
+
+ printf("Read lookup_me_fromtracee PID=%d by tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_IO, child, &io_fromtracee, 0) != -1);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me_fromtracee, magic_fromtracee,
+ "got value %" PRIx8 " != expected %" PRIx8, lookup_me_fromtracee,
+ magic_fromtracee);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(read_d_write_d_handshake1);
+ATF_TC_HEAD(read_d_write_d_handshake1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_READ_D with PT_WRITE_D handshake");
+}
+
+ATF_TC_BODY(read_d_write_d_handshake1, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ int lookup_me_fromtracee = 0;
+ const int magic_fromtracee = (int)random();
+ int lookup_me_totracee = 0;
+ const int magic_totracee = (int)random();
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ lookup_me_fromtracee = magic_fromtracee;
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(lookup_me_totracee, magic_totracee);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Read new lookup_me_fromtracee PID=%d by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me_fromtracee =
+ ptrace(PT_READ_D, child, &lookup_me_fromtracee, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me_fromtracee, magic_fromtracee,
+ "got value %#x != expected %#x", lookup_me_fromtracee,
+ magic_fromtracee);
+
+ printf("Write new lookup_me_totracee to PID=%d from tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE
+ (ptrace(PT_WRITE_D, child, &lookup_me_totracee, magic_totracee)
+ != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(read_d_write_d_handshake2);
+ATF_TC_HEAD(read_d_write_d_handshake2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_WRITE_D with PT_READ_D handshake");
+}
+
+ATF_TC_BODY(read_d_write_d_handshake2, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ int lookup_me_fromtracee = 0;
+ const int magic_fromtracee = (int)random();
+ int lookup_me_totracee = 0;
+ const int magic_totracee = (int)random();
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ lookup_me_fromtracee = magic_fromtracee;
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(lookup_me_totracee, magic_totracee);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Write new lookup_me_totracee to PID=%d from tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE
+ (ptrace(PT_WRITE_D, child, &lookup_me_totracee, magic_totracee)
+ != -1);
+
+ printf("Read new lookup_me_fromtracee PID=%d by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me_fromtracee =
+ ptrace(PT_READ_D, child, &lookup_me_fromtracee, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me_fromtracee, magic_fromtracee,
+ "got value %#x != expected %#x", lookup_me_fromtracee,
+ magic_fromtracee);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+/* These dummy functions are used to be copied with ptrace(2) calls */
+static int __used
+dummy_fn1(int a, int b, int c, int d)
+{
+
+ a *= 1;
+ b += 2;
+ c -= 3;
+ d /= 4;
+
+ return a + b * c - d;
+}
+
+static int __used
+dummy_fn2(int a, int b, int c, int d)
+{
+
+ a *= 4;
+ b += 3;
+ c -= 2;
+ d /= 1;
+
+ return a + b * c - d;
+}
+
+static int __used
+dummy_fn3(int a, int b, int c, int d)
+{
+
+ a *= 10;
+ b += 20;
+ c -= 30;
+ d /= 40;
+
+ return a + b * c - d;
+}
+
+static int __used
+dummy_fn4(int a, int b, int c, int d)
+{
+
+ a *= 40;
+ b += 30;
+ c -= 20;
+ d /= 10;
+
+ return a + b * c - d;
+}
+
+ATF_TC(io_read_i1);
+ATF_TC_HEAD(io_read_i1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_IO with PIOD_READ_I and len = sizeof(uint8_t)");
+}
+
+ATF_TC_BODY(io_read_i1, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ uint8_t lookup_me = 0;
+ uint8_t magic;
+ memcpy(&magic, dummy_fn1, sizeof(magic));
+ struct ptrace_io_desc io = {
+ .piod_op = PIOD_READ_I,
+ .piod_offs = dummy_fn1,
+ .piod_addr = &lookup_me,
+ .piod_len = sizeof(lookup_me)
+ };
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me, magic,
+ "got value %" PRIx8 " != expected %" PRIx8, lookup_me, magic);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(io_read_i2);
+ATF_TC_HEAD(io_read_i2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_IO with PIOD_READ_I and len = sizeof(uint16_t)");
+}
+
+ATF_TC_BODY(io_read_i2, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ uint16_t lookup_me = 0;
+ uint16_t magic;
+ memcpy(&magic, dummy_fn1, sizeof(magic));
+ struct ptrace_io_desc io = {
+ .piod_op = PIOD_READ_I,
+ .piod_offs = dummy_fn1,
+ .piod_addr = &lookup_me,
+ .piod_len = sizeof(lookup_me)
+ };
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me, magic,
+ "got value %" PRIx16 " != expected %" PRIx16, lookup_me, magic);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(io_read_i3);
+ATF_TC_HEAD(io_read_i3, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_IO with PIOD_READ_I and len = sizeof(uint32_t)");
+}
+
+ATF_TC_BODY(io_read_i3, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ uint32_t lookup_me = 0;
+ uint32_t magic;
+ memcpy(&magic, dummy_fn1, sizeof(magic));
+ struct ptrace_io_desc io = {
+ .piod_op = PIOD_READ_I,
+ .piod_offs = dummy_fn1,
+ .piod_addr = &lookup_me,
+ .piod_len = sizeof(lookup_me)
+ };
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me, magic,
+ "got value %" PRIx32 " != expected %" PRIx32, lookup_me, magic);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(io_read_i4);
+ATF_TC_HEAD(io_read_i4, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_IO with PIOD_READ_I and len = sizeof(uint64_t)");
+}
+
+ATF_TC_BODY(io_read_i4, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ uint64_t lookup_me = 0;
+ uint64_t magic;
+ memcpy(&magic, dummy_fn1, sizeof(magic));
+ struct ptrace_io_desc io = {
+ .piod_op = PIOD_READ_I,
+ .piod_offs = dummy_fn1,
+ .piod_addr = &lookup_me,
+ .piod_len = sizeof(lookup_me)
+ };
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ ATF_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me, magic,
+ "got value %" PRIx64 " != expected %" PRIx64, lookup_me, magic);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(read_i1);
+ATF_TC_HEAD(read_i1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_READ_I called once");
+}
+
+ATF_TC_BODY(read_i1, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ int lookup_me = 0;
+ int magic;
+ memcpy(&magic, dummy_fn1, sizeof(magic));
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Read new lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me = ptrace(PT_READ_I, child, dummy_fn1, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me, magic,
+ "got value %#x != expected %#x", lookup_me, magic);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(read_i2);
+ATF_TC_HEAD(read_i2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_READ_I called twice");
+}
+
+ATF_TC_BODY(read_i2, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ int lookup_me1 = 0;
+ int lookup_me2 = 0;
+ int magic1;
+ int magic2;
+ memcpy(&magic1, dummy_fn1, sizeof(magic1));
+ memcpy(&magic2, dummy_fn2, sizeof(magic2));
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Read new lookup_me1 from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me1 = ptrace(PT_READ_I, child, dummy_fn1, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me1, magic1,
+ "got value %#x != expected %#x", lookup_me1, magic1);
+
+ printf("Read new lookup_me2 from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me2 = ptrace(PT_READ_I, child, dummy_fn2, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me2, magic2,
+ "got value %#x != expected %#x", lookup_me2, magic2);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(read_i3);
+ATF_TC_HEAD(read_i3, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_READ_I called three times");
+}
+
+ATF_TC_BODY(read_i3, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ int lookup_me1 = 0;
+ int lookup_me2 = 0;
+ int lookup_me3 = 0;
+ int magic1;
+ int magic2;
+ int magic3;
+ memcpy(&magic1, dummy_fn1, sizeof(magic1));
+ memcpy(&magic2, dummy_fn2, sizeof(magic2));
+ memcpy(&magic3, dummy_fn3, sizeof(magic3));
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Read new lookup_me1 from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me1 = ptrace(PT_READ_I, child, dummy_fn1, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me1, magic1,
+ "got value %#x != expected %#x", lookup_me1, magic1);
+
+ printf("Read new lookup_me2 from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me2 = ptrace(PT_READ_I, child, dummy_fn2, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me2, magic2,
+ "got value %#x != expected %#x", lookup_me2, magic2);
+
+ printf("Read new lookup_me3 from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me3 = ptrace(PT_READ_I, child, dummy_fn3, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me3, magic3,
+ "got value %#x != expected %#x", lookup_me3, magic3);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(read_i4);
+ATF_TC_HEAD(read_i4, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_READ_I called four times");
+}
+
+ATF_TC_BODY(read_i4, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+ int lookup_me1 = 0;
+ int lookup_me2 = 0;
+ int lookup_me3 = 0;
+ int lookup_me4 = 0;
+ int magic1;
+ int magic2;
+ int magic3;
+ int magic4;
+ memcpy(&magic1, dummy_fn1, sizeof(magic1));
+ memcpy(&magic2, dummy_fn2, sizeof(magic2));
+ memcpy(&magic3, dummy_fn3, sizeof(magic3));
+ memcpy(&magic4, dummy_fn4, sizeof(magic4));
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Read new lookup_me1 from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me1 = ptrace(PT_READ_I, child, dummy_fn1, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me1, magic1,
+ "got value %#x != expected %#x", lookup_me1, magic1);
+
+ printf("Read new lookup_me2 from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me2 = ptrace(PT_READ_I, child, dummy_fn2, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me2, magic2,
+ "got value %#x != expected %#x", lookup_me2, magic2);
+
+ printf("Read new lookup_me3 from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me3 = ptrace(PT_READ_I, child, dummy_fn3, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me3, magic3,
+ "got value %#x != expected %#x", lookup_me3, magic3);
+
+ printf("Read new lookup_me4 from tracee (PID=%d) by tracer (PID=%d)\n",
+ child, getpid());
+ errno = 0;
+ lookup_me4 = ptrace(PT_READ_I, child, dummy_fn4, 0);
+ ATF_REQUIRE_EQ(errno, 0);
+
+ ATF_REQUIRE_EQ_MSG(lookup_me4, magic4,
+ "got value %#x != expected %#x", lookup_me4, magic4);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+#if defined(HAVE_GPREGS)
+ATF_TC(regs1);
+ATF_TC_HEAD(regs1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify plain PT_GETREGS call without further steps");
+}
+
+ATF_TC_BODY(regs1, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ struct reg r;
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Call GETREGS for the child process\n");
+ ATF_REQUIRE(ptrace(PT_GETREGS, child, &r, 0) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+#endif
+
+#if defined(HAVE_GPREGS)
+ATF_TC(regs2);
+ATF_TC_HEAD(regs2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify plain PT_GETREGS call and retrieve PC");
+}
+
+ATF_TC_BODY(regs2, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ struct reg r;
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Call GETREGS for the child process\n");
+ ATF_REQUIRE(ptrace(PT_GETREGS, child, &r, 0) != -1);
+
+ printf("Retrieved PC=%" PRIxREGISTER "\n", PTRACE_REG_PC(&r));
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+#endif
+
+#if defined(HAVE_GPREGS)
+ATF_TC(regs3);
+ATF_TC_HEAD(regs3, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify plain PT_GETREGS call and retrieve SP");
+}
+
+ATF_TC_BODY(regs3, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ struct reg r;
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Call GETREGS for the child process\n");
+ ATF_REQUIRE(ptrace(PT_GETREGS, child, &r, 0) != -1);
+
+ printf("Retrieved SP=%" PRIxREGISTER "\n", PTRACE_REG_SP(&r));
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+#endif
+
+#if defined(HAVE_GPREGS)
+ATF_TC(regs4);
+ATF_TC_HEAD(regs4, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify plain PT_GETREGS call and retrieve INTRV");
+}
+
+ATF_TC_BODY(regs4, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ struct reg r;
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Call GETREGS for the child process\n");
+ ATF_REQUIRE(ptrace(PT_GETREGS, child, &r, 0) != -1);
+
+ printf("Retrieved INTRV=%" PRIxREGISTER "\n", PTRACE_REG_INTRV(&r));
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+#endif
+
+#if defined(HAVE_GPREGS)
+ATF_TC(regs5);
+ATF_TC_HEAD(regs5, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_GETREGS and PT_SETREGS calls without changing regs");
+}
+
+ATF_TC_BODY(regs5, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ struct reg r;
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Call GETREGS for the child process\n");
+ ATF_REQUIRE(ptrace(PT_GETREGS, child, &r, 0) != -1);
+
+ printf("Call SETREGS for the child process (without changed regs)\n");
+ ATF_REQUIRE(ptrace(PT_GETREGS, child, &r, 0) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+#endif
+
+#if defined(HAVE_FPREGS)
+ATF_TC(fpregs1);
+ATF_TC_HEAD(fpregs1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify plain PT_GETFPREGS call without further steps");
+}
+
+ATF_TC_BODY(fpregs1, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ struct fpreg r;
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Call GETFPREGS for the child process\n");
+ ATF_REQUIRE(ptrace(PT_GETFPREGS, child, &r, 0) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+#endif
+
+#if defined(HAVE_FPREGS)
+ATF_TC(fpregs2);
+ATF_TC_HEAD(fpregs2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_GETFPREGS and PT_SETFPREGS calls without changing "
+ "regs");
+}
+
+ATF_TC_BODY(fpregs2, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ struct fpreg r;
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Call GETFPREGS for the child process\n");
+ ATF_REQUIRE(ptrace(PT_GETFPREGS, child, &r, 0) != -1);
+
+ printf("Call SETFPREGS for the child (without changed regs)\n");
+ ATF_REQUIRE(ptrace(PT_SETFPREGS, child, &r, 0) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+#endif
+
+#if defined(PT_STEP)
+ATF_TC(step1);
+ATF_TC_HEAD(step1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify single PT_STEP call");
+}
+
+ATF_TC_BODY(step1, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ int happy;
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ happy = check_happy(100);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(happy, check_happy(100));
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent (use PT_STEP)\n");
+ ATF_REQUIRE(ptrace(PT_STEP, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, SIGTRAP);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+#endif
+
+#if defined(PT_STEP)
+ATF_TC(step2);
+ATF_TC_HEAD(step2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_STEP called twice");
+}
+
+ATF_TC_BODY(step2, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ int happy;
+ int N = 2;
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ happy = check_happy(999);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(happy, check_happy(999));
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ while (N --> 0) {
+ printf("Before resuming the child process where it left off "
+ "and without signal to be sent (use PT_STEP)\n");
+ ATF_REQUIRE(ptrace(PT_STEP, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0),
+ child);
+
+ validate_status_stopped(status, SIGTRAP);
+ }
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+#endif
+
+#if defined(PT_STEP)
+ATF_TC(step3);
+ATF_TC_HEAD(step3, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_STEP called three times");
+}
+
+ATF_TC_BODY(step3, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ int happy;
+ int N = 3;
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ happy = check_happy(999);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(happy, check_happy(999));
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ while (N --> 0) {
+ printf("Before resuming the child process where it left off "
+ "and without signal to be sent (use PT_STEP)\n");
+ ATF_REQUIRE(ptrace(PT_STEP, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0),
+ child);
+
+ validate_status_stopped(status, SIGTRAP);
+ }
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+#endif
+
+#if defined(PT_STEP)
+ATF_TC(step4);
+ATF_TC_HEAD(step4, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify PT_STEP called four times");
+}
+
+ATF_TC_BODY(step4, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ int happy;
+ int N = 4;
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ happy = check_happy(999);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(happy, check_happy(999));
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ while (N --> 0) {
+ printf("Before resuming the child process where it left off "
+ "and without signal to be sent (use PT_STEP)\n");
+ ATF_REQUIRE(ptrace(PT_STEP, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0),
+ child);
+
+ validate_status_stopped(status, SIGTRAP);
+ }
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+#endif
+
+ATF_TC(kill1);
+ATF_TC_HEAD(kill1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify that PT_CONTINUE with SIGKILL terminates child");
+}
+
+ATF_TC_BODY(kill1, tc)
+{
+ const int sigval = SIGSTOP, sigsent = SIGKILL;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ /* NOTREACHED */
+ FORKEE_ASSERTX(0 &&
+ "Child should be terminated by a signal from its parent");
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, sigsent) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_signaled(status, sigsent, 0);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(kill2);
+ATF_TC_HEAD(kill2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify that PT_KILL terminates child");
+}
+
+ATF_TC_BODY(kill2, tc)
+{
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ /* NOTREACHED */
+ FORKEE_ASSERTX(0 &&
+ "Child should be terminated by a signal from its parent");
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_KILL, child, (void*)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_signaled(status, SIGKILL, 0);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(lwpinfo1);
+ATF_TC_HEAD(lwpinfo1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify basic LWPINFO call for single thread (PT_TRACE_ME)");
+}
+
+ATF_TC_BODY(lwpinfo1, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ struct ptrace_lwpinfo info = {0, 0};
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Before calling ptrace(2) with PT_LWPINFO for child\n");
+ ATF_REQUIRE(ptrace(PT_LWPINFO, child, &info, sizeof(info)) != -1);
+
+ printf("Assert that there exists a thread\n");
+ ATF_REQUIRE(info.pl_lwpid > 0);
+
+ printf("Assert that lwp thread %d received event PL_EVENT_SIGNAL\n",
+ info.pl_lwpid);
+ ATF_REQUIRE_EQ_MSG(info.pl_event, PL_EVENT_SIGNAL,
+ "Received event %d != expected event %d",
+ info.pl_event, PL_EVENT_SIGNAL);
+
+ printf("Before calling ptrace(2) with PT_LWPINFO for child\n");
+ ATF_REQUIRE(ptrace(PT_LWPINFO, child, &info, sizeof(info)) != -1);
+
+ printf("Assert that there are no more lwp threads in child\n");
+ ATF_REQUIRE_EQ(info.pl_lwpid, 0);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+#if defined(TWAIT_HAVE_PID)
+ATF_TC(lwpinfo2);
+ATF_TC_HEAD(lwpinfo2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify basic LWPINFO call for single thread (PT_ATTACH from "
+ "tracer)");
+}
+
+ATF_TC_BODY(lwpinfo2, tc)
+{
+ struct msg_fds parent_tracee, parent_tracer;
+ const int exitval_tracee = 5;
+ const int exitval_tracer = 10;
+ pid_t tracee, tracer, wpid;
+ uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ struct ptrace_lwpinfo info = {0, 0};
+
+ printf("Spawn tracee\n");
+ ATF_REQUIRE(msg_open(&parent_tracee) == 0);
+ ATF_REQUIRE(msg_open(&parent_tracer) == 0);
+ tracee = atf_utils_fork();
+ if (tracee == 0) {
+
+ /* Wait for message from the parent */
+ CHILD_TO_PARENT("tracee ready", parent_tracee, msg);
+ CHILD_FROM_PARENT("tracee exit", parent_tracee, msg);
+
+ _exit(exitval_tracee);
+ }
+ PARENT_FROM_CHILD("tracee ready", parent_tracee, msg);
+
+ printf("Spawn debugger\n");
+ tracer = atf_utils_fork();
+ if (tracer == 0) {
+ /* No IPC to communicate with the child */
+ printf("Before calling PT_ATTACH from tracee %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
+
+ /* Wait for tracee and assert that it was stopped w/ SIGSTOP */
+ FORKEE_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
+
+ forkee_status_stopped(status, SIGSTOP);
+
+ printf("Before calling ptrace(2) with PT_LWPINFO for child\n");
+ FORKEE_ASSERT(ptrace(PT_LWPINFO, tracee, &info, sizeof(info))
+ != -1);
+
+ printf("Assert that there exists a thread\n");
+ FORKEE_ASSERTX(info.pl_lwpid > 0);
+
+ printf("Assert that lwp thread %d received event "
+ "PL_EVENT_SIGNAL\n", info.pl_lwpid);
+ FORKEE_ASSERT_EQ(info.pl_event, PL_EVENT_SIGNAL);
+
+ printf("Before calling ptrace(2) with PT_LWPINFO for child\n");
+ FORKEE_ASSERT(ptrace(PT_LWPINFO, tracee, &info, sizeof(info))
+ != -1);
+
+ printf("Assert that there are no more lwp threads in child\n");
+ FORKEE_ASSERTX(info.pl_lwpid == 0);
+
+ /* Resume tracee with PT_CONTINUE */
+ FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
+
+ /* Inform parent that tracer has attached to tracee */
+ CHILD_TO_PARENT("tracer ready", parent_tracer, msg);
+ /* Wait for parent */
+ CHILD_FROM_PARENT("tracer wait", parent_tracer, msg);
+
+ /* Wait for tracee and assert that it exited */
+ FORKEE_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
+
+ forkee_status_exited(status, exitval_tracee);
+
+ printf("Before exiting of the tracer process\n");
+ _exit(exitval_tracer);
+ }
+
+ printf("Wait for the tracer to attach to the tracee\n");
+ PARENT_FROM_CHILD("tracer ready", parent_tracer, msg);
+
+ printf("Resume the tracee and let it exit\n");
+ PARENT_TO_CHILD("tracee exit", parent_tracee, msg);
+
+ printf("Detect that tracee is zombie\n");
+ await_zombie(tracee);
+
+ printf("Assert that there is no status about tracee - "
+ "Tracer must detect zombie first - calling %s()\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(
+ wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0);
+
+ printf("Resume the tracer and let it detect exited tracee\n");
+ PARENT_TO_CHILD("tracer wait", parent_tracer, msg);
+
+ printf("Wait for tracer to finish its job and exit - calling %s()\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracer, &status, 0),
+ tracer);
+
+ validate_status_exited(status, exitval_tracer);
+
+ printf("Wait for tracee to finish its job and exit - calling %s()\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, WNOHANG),
+ tracee);
+
+ validate_status_exited(status, exitval_tracee);
+
+ msg_close(&parent_tracer);
+ msg_close(&parent_tracee);
+}
+#endif
+
+ATF_TC(siginfo1);
+ATF_TC_HEAD(siginfo1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify basic PT_GET_SIGINFO call for SIGTRAP from tracee");
+}
+
+ATF_TC_BODY(siginfo1, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGTRAP;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ struct ptrace_siginfo info;
+ memset(&info, 0, sizeof(info));
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
+ ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
+
+ printf("Signal traced to lwpid=%d\n", info.psi_lwpid);
+ printf("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n",
+ info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
+ info.psi_siginfo.si_errno);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(siginfo2);
+ATF_TC_HEAD(siginfo2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify basic PT_GET_SIGINFO and PT_SET_SIGINFO calls without "
+ "modification of SIGINT from tracee");
+}
+
+static int siginfo2_caught = 0;
+
+static void
+siginfo2_sighandler(int sig)
+{
+ FORKEE_ASSERT_EQ(sig, SIGINT);
+
+ ++siginfo2_caught;
+}
+
+ATF_TC_BODY(siginfo2, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGINT;
+ pid_t child, wpid;
+ struct sigaction sa;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ struct ptrace_siginfo info;
+ memset(&info, 0, sizeof(info));
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ sa.sa_handler = siginfo2_sighandler;
+ sa.sa_flags = SA_SIGINFO;
+ sigemptyset(&sa.sa_mask);
+
+ FORKEE_ASSERT(sigaction(sigval, &sa, NULL) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(siginfo2_caught, 1);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
+ ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
+
+ printf("Signal traced to lwpid=%d\n", info.psi_lwpid);
+ printf("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n",
+ info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
+ info.psi_siginfo.si_errno);
+
+ printf("Before calling ptrace(2) with PT_SET_SIGINFO for child\n");
+ ATF_REQUIRE(ptrace(PT_SET_SIGINFO, child, &info, sizeof(info)) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, sigval) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(siginfo3);
+ATF_TC_HEAD(siginfo3, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify basic PT_GET_SIGINFO and PT_SET_SIGINFO calls with "
+ "setting signal to new value");
+}
+
+static int siginfo3_caught = 0;
+
+static void
+siginfo3_sigaction(int sig, siginfo_t *info, void *ctx)
+{
+ FORKEE_ASSERT_EQ(sig, SIGTRAP);
+
+ FORKEE_ASSERT_EQ(info->si_signo, SIGTRAP);
+ FORKEE_ASSERT_EQ(info->si_code, TRAP_BRKPT);
+
+ ++siginfo3_caught;
+}
+
+ATF_TC_BODY(siginfo3, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGINT;
+ const int sigfaked = SIGTRAP;
+ const int sicodefaked = TRAP_BRKPT;
+ pid_t child, wpid;
+ struct sigaction sa;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ struct ptrace_siginfo info;
+ memset(&info, 0, sizeof(info));
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ sa.sa_sigaction = siginfo3_sigaction;
+ sa.sa_flags = SA_SIGINFO;
+ sigemptyset(&sa.sa_mask);
+
+ FORKEE_ASSERT(sigaction(sigfaked, &sa, NULL) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(siginfo3_caught, 1);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
+ ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
+
+ printf("Signal traced to lwpid=%d\n", info.psi_lwpid);
+ printf("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n",
+ info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
+ info.psi_siginfo.si_errno);
+
+ printf("Before setting new faked signal to signo=%d si_code=%d\n",
+ sigfaked, sicodefaked);
+ info.psi_siginfo.si_signo = sigfaked;
+ info.psi_siginfo.si_code = sicodefaked;
+
+ printf("Before calling ptrace(2) with PT_SET_SIGINFO for child\n");
+ ATF_REQUIRE(ptrace(PT_SET_SIGINFO, child, &info, sizeof(info)) != -1);
+
+ printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
+ ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
+
+ printf("Before checking siginfo_t\n");
+ ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigfaked);
+ ATF_REQUIRE_EQ(info.psi_siginfo.si_code, sicodefaked);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, sigfaked) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+ATF_TC(siginfo4);
+ATF_TC_HEAD(siginfo4, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Detect SIGTRAP TRAP_EXEC from tracee");
+}
+
+ATF_TC_BODY(siginfo4, tc)
+{
+ const int sigval = SIGTRAP;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+
+ struct ptrace_siginfo info;
+ memset(&info, 0, sizeof(info));
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before calling execve(2) from child\n");
+ execlp("/bin/echo", "/bin/echo", NULL);
+
+ FORKEE_ASSERT(0 && "Not reached");
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
+ ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
+
+ printf("Signal traced to lwpid=%d\n", info.psi_lwpid);
+ printf("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n",
+ info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
+ info.psi_siginfo.si_errno);
+
+ ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
+ ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_EXEC);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+
+#if defined(TWAIT_HAVE_PID)
+ATF_TC(siginfo5);
+ATF_TC_HEAD(siginfo5, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify that fork(2) is intercepted by ptrace(2) with EVENT_MASK "
+ "set to PTRACE_FORK and reports correct signal information");
+}
+
+ATF_TC_BODY(siginfo5, tc)
+{
+ const int exitval = 5;
+ const int exitval2 = 15;
+ const int sigval = SIGSTOP;
+ pid_t child, child2, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ ptrace_state_t state;
+ const int slen = sizeof(state);
+ ptrace_event_t event;
+ const int elen = sizeof(event);
+ struct ptrace_siginfo info;
+
+ memset(&info, 0, sizeof(info));
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT((child2 = fork()) != 1);
+
+ if (child2 == 0)
+ _exit(exitval2);
+
+ FORKEE_REQUIRE_SUCCESS
+ (wpid = TWAIT_GENERIC(child2, &status, 0), child2);
+
+ forkee_status_exited(status, exitval2);
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
+ ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
+
+ printf("Before checking siginfo_t\n");
+ ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
+ ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP);
+
+ printf("Enable PTRACE_FORK in EVENT_MASK for the child %d\n", child);
+ event.pe_set_event = PTRACE_FORK;
+ ATF_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child %d\n", TWAIT_FNAME, child);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, SIGTRAP);
+
+ printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
+ ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
+
+ printf("Before checking siginfo_t\n");
+ ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP);
+ ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_CHLD);
+
+ ATF_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1);
+ ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_FORK);
+
+ child2 = state.pe_other_pid;
+ printf("Reported PTRACE_FORK event with forkee %d\n", child2);
+
+ printf("Before calling %s() for the forkee %d of the child %d\n",
+ TWAIT_FNAME, child2, child);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0),
+ child2);
+
+ validate_status_stopped(status, SIGTRAP);
+
+ printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
+ ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
+
+ printf("Before checking siginfo_t\n");
+ ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP);
+ ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_CHLD);
+
+ ATF_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child2, &state, slen) != -1);
+ ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_FORK);
+ ATF_REQUIRE_EQ(state.pe_other_pid, child);
+
+ printf("Before resuming the forkee process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child2, (void *)1, 0) != -1);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the forkee - expected exited\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0),
+ child2);
+
+ validate_status_exited(status, exitval2);
+
+ printf("Before calling %s() for the forkee - expected no process\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD,
+ wpid = TWAIT_GENERIC(child2, &status, 0));
+
+ printf("Before calling %s() for the child - expected stopped "
+ "SIGCHLD\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, SIGCHLD);
+
+ printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
+ ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
+
+ printf("Before checking siginfo_t\n");
+ ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGCHLD);
+ ATF_REQUIRE_EQ(info.psi_siginfo.si_code, CLD_EXITED);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child - expected exited\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child - expected no process\n",
+ TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+#endif
+
+#if defined(PT_STEP)
+ATF_TC(siginfo6);
+ATF_TC_HEAD(siginfo6, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify single PT_STEP call with signal information check");
+}
+
+ATF_TC_BODY(siginfo6, tc)
+{
+ const int exitval = 5;
+ const int sigval = SIGSTOP;
+ pid_t child, wpid;
+#if defined(TWAIT_HAVE_STATUS)
+ int status;
+#endif
+ int happy;
+ struct ptrace_siginfo info;
+
+ memset(&info, 0, sizeof(info));
+
+ printf("Before forking process PID=%d\n", getpid());
+ ATF_REQUIRE((child = fork()) != -1);
+ if (child == 0) {
+ printf("Before calling PT_TRACE_ME from child %d\n", getpid());
+ FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
+
+ happy = check_happy(100);
+
+ printf("Before raising %s from child\n", strsignal(sigval));
+ FORKEE_ASSERT(raise(sigval) == 0);
+
+ FORKEE_ASSERT_EQ(happy, check_happy(100));
+
+ printf("Before exiting of the child process\n");
+ _exit(exitval);
+ }
+ printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, sigval);
+
+ printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
+ ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
+
+ printf("Before checking siginfo_t\n");
+ ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
+ ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent (use PT_STEP)\n");
+ ATF_REQUIRE(ptrace(PT_STEP, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_stopped(status, SIGTRAP);
+
+ printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
+ ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
+
+ printf("Before checking siginfo_t\n");
+ ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP);
+ ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_TRACE);
+
+ printf("Before resuming the child process where it left off and "
+ "without signal to be sent\n");
+ ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
+
+ validate_status_exited(status, exitval);
+
+ printf("Before calling %s() for the child\n", TWAIT_FNAME);
+ TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
+}
+#endif
+
+ATF_TP_ADD_TCS(tp)
+{
+ setvbuf(stdout, NULL, _IONBF, 0);
+ setvbuf(stderr, NULL, _IONBF, 0);
+ ATF_TP_ADD_TC(tp, traceme1);
+ ATF_TP_ADD_TC(tp, traceme2);
+ ATF_TP_ADD_TC(tp, traceme3);
+ ATF_TP_ADD_TC(tp, traceme4);
+
+ ATF_TP_ADD_TC_HAVE_PID(tp, attach1);
+ ATF_TP_ADD_TC_HAVE_PID(tp, attach2);
+ ATF_TP_ADD_TC(tp, attach3);
+ ATF_TP_ADD_TC(tp, attach4);
+ ATF_TP_ADD_TC_HAVE_PID(tp, attach5);
+ ATF_TP_ADD_TC_HAVE_PID(tp, attach6);
+ ATF_TP_ADD_TC_HAVE_PID(tp, attach7);
+
+ ATF_TP_ADD_TC(tp, eventmask1);
+ ATF_TP_ADD_TC(tp, eventmask2);
+
+ ATF_TP_ADD_TC_HAVE_PID(tp, fork1);
+ ATF_TP_ADD_TC(tp, fork2);
+
+ ATF_TP_ADD_TC_HAVE_PID(tp, vfork1);
+ ATF_TP_ADD_TC(tp, vfork2);
+
+ ATF_TP_ADD_TC(tp, io_read_d1);
+ ATF_TP_ADD_TC(tp, io_read_d2);
+ ATF_TP_ADD_TC(tp, io_read_d3);
+ ATF_TP_ADD_TC(tp, io_read_d4);
+
+ ATF_TP_ADD_TC(tp, io_write_d1);
+ ATF_TP_ADD_TC(tp, io_write_d2);
+ ATF_TP_ADD_TC(tp, io_write_d3);
+ ATF_TP_ADD_TC(tp, io_write_d4);
+
+ ATF_TP_ADD_TC(tp, read_d1);
+ ATF_TP_ADD_TC(tp, read_d2);
+ ATF_TP_ADD_TC(tp, read_d3);
+ ATF_TP_ADD_TC(tp, read_d4);
+
+ ATF_TP_ADD_TC(tp, write_d1);
+ ATF_TP_ADD_TC(tp, write_d2);
+ ATF_TP_ADD_TC(tp, write_d3);
+ ATF_TP_ADD_TC(tp, write_d4);
+
+ ATF_TP_ADD_TC(tp, io_read_d_write_d_handshake1);
+ ATF_TP_ADD_TC(tp, io_read_d_write_d_handshake2);
+
+ ATF_TP_ADD_TC(tp, read_d_write_d_handshake1);
+ ATF_TP_ADD_TC(tp, read_d_write_d_handshake2);
+
+ ATF_TP_ADD_TC(tp, io_read_i1);
+ ATF_TP_ADD_TC(tp, io_read_i2);
+ ATF_TP_ADD_TC(tp, io_read_i3);
+ ATF_TP_ADD_TC(tp, io_read_i4);
+
+ ATF_TP_ADD_TC(tp, read_i1);
+ ATF_TP_ADD_TC(tp, read_i2);
+ ATF_TP_ADD_TC(tp, read_i3);
+ ATF_TP_ADD_TC(tp, read_i4);
+
+ ATF_TP_ADD_TC_HAVE_GPREGS(tp, regs1);
+ ATF_TP_ADD_TC_HAVE_GPREGS(tp, regs2);
+ ATF_TP_ADD_TC_HAVE_GPREGS(tp, regs3);
+ ATF_TP_ADD_TC_HAVE_GPREGS(tp, regs4);
+ ATF_TP_ADD_TC_HAVE_GPREGS(tp, regs5);
+
+ ATF_TP_ADD_TC_HAVE_FPREGS(tp, fpregs1);
+ ATF_TP_ADD_TC_HAVE_FPREGS(tp, fpregs2);
+
+ ATF_TP_ADD_TC_PT_STEP(tp, step1);
+ ATF_TP_ADD_TC_PT_STEP(tp, step2);
+ ATF_TP_ADD_TC_PT_STEP(tp, step3);
+ ATF_TP_ADD_TC_PT_STEP(tp, step4);
+
+ ATF_TP_ADD_TC(tp, kill1);
+ ATF_TP_ADD_TC(tp, kill2);
+
+ ATF_TP_ADD_TC(tp, lwpinfo1);
+ ATF_TP_ADD_TC_HAVE_PID(tp, lwpinfo2);
+
+ ATF_TP_ADD_TC(tp, siginfo1);
+ ATF_TP_ADD_TC(tp, siginfo2);
+ ATF_TP_ADD_TC(tp, siginfo3);
+ ATF_TP_ADD_TC(tp, siginfo4);
+ ATF_TP_ADD_TC_HAVE_PID(tp, siginfo5);
+ ATF_TP_ADD_TC_PT_STEP(tp, siginfo6);
+
+ return atf_no_error();
+}
diff --git a/kernel/t_ptrace_wait.h b/kernel/t_ptrace_wait.h
new file mode 100644
index 000000000000..9c6921c70683
--- /dev/null
+++ b/kernel/t_ptrace_wait.h
@@ -0,0 +1,431 @@
+/* $NetBSD: t_ptrace_wait.h,v 1.7 2017/01/09 22:09:20 kamil Exp $ */
+
+/*-
+ * Copyright (c) 2016 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* Detect plain wait(2) use-case */
+#if !defined(TWAIT_WAITPID) && \
+ !defined(TWAIT_WAITID) && \
+ !defined(TWAIT_WAIT3) && \
+ !defined(TWAIT_WAIT4) && \
+ !defined(TWAIT_WAIT6)
+#define TWAIT_WAIT
+#endif
+
+/*
+ * There are two classes of wait(2)-like functions:
+ * - wait4(2)-like accepting pid_t, optional options parameter, struct rusage*
+ * - wait6(2)-like accepting idtype_t, id_t, struct wrusage, mandatory options
+ *
+ * The TWAIT_FNAME value is to be used for convenience in debug messages.
+ *
+ * The TWAIT_GENERIC() macro is designed to reuse the same unmodified
+ * code with as many wait(2)-like functions as possible.
+ *
+ * In a common use-case wait4(2) and wait6(2)-like function can work the almost
+ * the same way, however there are few important differences:
+ * wait6(2) must specify P_PID for idtype to match wpid from wait4(2).
+ * To behave like wait4(2), wait6(2) the 'options' to wait must include
+ * WEXITED|WTRUNCATED.
+ *
+ * There are two helper macros (they purpose it to mach more than one
+ * wait(2)-like function):
+ * The TWAIT_HAVE_STATUS - specifies whether a function can retrieve
+ * status (as integer value).
+ * The TWAIT_HAVE_PID - specifies whether a function can request
+ * exact process identifier
+ * The TWAIT_HAVE_RUSAGE - specifies whether a function can request
+ * the struct rusage value
+ *
+ */
+
+#if defined(TWAIT_WAIT)
+# define TWAIT_FNAME "wait"
+# define TWAIT_WAIT4TYPE(a,b,c,d) wait((b))
+# define TWAIT_GENERIC(a,b,c) wait((b))
+# define TWAIT_HAVE_STATUS 1
+#elif defined(TWAIT_WAITPID)
+# define TWAIT_FNAME "waitpid"
+# define TWAIT_WAIT4TYPE(a,b,c,d) waitpid((a),(b),(c))
+# define TWAIT_GENERIC(a,b,c) waitpid((a),(b),(c))
+# define TWAIT_HAVE_PID 1
+# define TWAIT_HAVE_STATUS 1
+#elif defined(TWAIT_WAITID)
+# define TWAIT_FNAME "waitid"
+# define TWAIT_GENERIC(a,b,c) \
+ waitid(P_PID,(a),NULL,(c)|WEXITED|WTRAPPED)
+# define TWAIT_WAIT6TYPE(a,b,c,d,e,f) waitid((a),(b),(f),(d))
+# define TWAIT_HAVE_PID 1
+#elif defined(TWAIT_WAIT3)
+# define TWAIT_FNAME "wait3"
+# define TWAIT_WAIT4TYPE(a,b,c,d) wait3((b),(c),(d))
+# define TWAIT_GENERIC(a,b,c) wait3((b),(c),NULL)
+# define TWAIT_HAVE_STATUS 1
+# define TWAIT_HAVE_RUSAGE 1
+#elif defined(TWAIT_WAIT4)
+# define TWAIT_FNAME "wait4"
+# define TWAIT_WAIT4TYPE(a,b,c,d) wait4((a),(b),(c),(d))
+# define TWAIT_GENERIC(a,b,c) wait4((a),(b),(c),NULL)
+# define TWAIT_HAVE_PID 1
+# define TWAIT_HAVE_STATUS 1
+# define TWAIT_HAVE_RUSAGE 1
+#elif defined(TWAIT_WAIT6)
+# define TWAIT_FNAME "wait6"
+# define TWAIT_WAIT6TYPE(a,b,c,d,e,f) wait6((a),(b),(c),(d),(e),(f))
+# define TWAIT_GENERIC(a,b,c) \
+ wait6(P_PID,(a),(b),(c)|WEXITED|WTRAPPED,NULL,NULL)
+# define TWAIT_HAVE_PID 1
+# define TWAIT_HAVE_STATUS 1
+#endif
+
+/*
+ * There are 3 groups of tests:
+ * - TWAIT_GENERIC() (wait, wait2, waitpid, wait3, wait4, wait6)
+ * - TWAIT_WAIT4TYPE() (wait2, waitpid, wait3, wait4)
+ * - TWAIT_WAIT6TYPE() (waitid, wait6)
+ *
+ * Tests only in the above categories are allowed. However some tests are not
+ * possible in the context requested functionality to be verified, therefore
+ * there are helper macros:
+ * - TWAIT_HAVE_PID (wait2, waitpid, waitid, wait4, wait6)
+ * - TWAIT_HAVE_STATUS (wait, wait2, waitpid, wait3, wait4, wait6)
+ * - TWAIT_HAVE_RUSAGE (wait3, wait4)
+ * - TWAIT_HAVE_RETPID (wait, wait2, waitpid, wait3, wait4, wait6)
+ *
+ * If there is an intention to test e.g. wait6(2) specific features in the
+ * ptrace(2) context, find the most matching group and with #ifdefs reduce
+ * functionality of less featured than wait6(2) interface (TWAIT_WAIT6TYPE).
+ *
+ * For clarity never use negative preprocessor checks, like:
+ * #if !defined(TWAIT_WAIT4)
+ * always refer to checks for positive values.
+ */
+
+#define TEST_REQUIRE_EQ(x, y) \
+do { \
+ uintmax_t vx = (x); \
+ uintmax_t vy = (y); \
+ int ret = vx == vy; \
+ if (!ret) \
+ ATF_REQUIRE_EQ_MSG(vx, vy, "%s(%ju) == %s(%ju)", \
+ #x, vx, #y, vy); \
+} while (/*CONSTCOND*/0)
+
+/*
+ * A child process cannot call atf functions and expect them to magically
+ * work like in the parent.
+ * The printf(3) messaging from a child will not work out of the box as well
+ * without estabilishing a communication protocol with its parent. To not
+ * overcomplicate the tests - do not log from a child and use err(3)/errx(3)
+ * wrapped with FORKEE_ASSERT()/FORKEE_ASSERTX() as that is guaranteed to work.
+ */
+#define FORKEE_ASSERT_EQ(x, y) \
+do { \
+ uintmax_t vx = (x); \
+ uintmax_t vy = (y); \
+ int ret = vx == vy; \
+ if (!ret) \
+ errx(EXIT_FAILURE, "%s:%d %s(): Assertion failed for: " \
+ "%s(%ju) == %s(%ju)", __FILE__, __LINE__, __func__, \
+ #x, vx, #y, vy); \
+} while (/*CONSTCOND*/0)
+
+#define FORKEE_ASSERTX(x) \
+do { \
+ int ret = (x); \
+ if (!ret) \
+ errx(EXIT_FAILURE, "%s:%d %s(): Assertion failed for: %s",\
+ __FILE__, __LINE__, __func__, #x); \
+} while (/*CONSTCOND*/0)
+
+#define FORKEE_ASSERT(x) \
+do { \
+ int ret = (x); \
+ if (!ret) \
+ err(EXIT_FAILURE, "%s:%d %s(): Assertion failed for: %s",\
+ __FILE__, __LINE__, __func__, #x); \
+} while (/*CONSTCOND*/0)
+
+/*
+ * Simplify logic for functions using general purpose registers add HAVE_GPREGS
+ *
+ * For platforms that do not implement all needed calls for simplicity assume
+ * that they are unsupported at all.
+ */
+#if defined(PT_GETREGS) \
+ && defined(PT_SETREGS) \
+ && defined(PTRACE_REG_PC) \
+ && defined(PTRACE_REG_SET_PC) \
+ && defined(PTRACE_REG_SP) \
+ && defined(PTRACE_REG_INTRV)
+#define HAVE_GPREGS
+#endif
+
+/* Add guards for floating point registers */
+#if defined(PT_GETFPREGS) \
+ && defined(PT_SETFPREGS)
+#define HAVE_FPREGS
+#endif
+
+/* Add guards for cpu debug registers */
+#if defined(PT_GETDBREGS) \
+ && defined(PT_SETDBREGS)
+#define HAVE_DBREGS
+#endif
+
+/*
+ * If waitid(2) returns because one or more processes have a state change to
+ * report, 0 is returned. If an error is detected, a value of -1 is returned
+ * and errno is set to indicate the error. If WNOHANG is specified and there
+ * are no stopped, continued or exited children, 0 is returned.
+ */
+#if defined(TWAIT_WAITID)
+#define TWAIT_REQUIRE_SUCCESS(a,b) TEST_REQUIRE_EQ((a), 0)
+#define TWAIT_REQUIRE_FAILURE(a,b) ATF_REQUIRE_ERRNO((a),(b) == -1)
+#define FORKEE_REQUIRE_SUCCESS(a,b) FORKEE_ASSERT_EQ(a, 0)
+#define FORKEE_REQUIRE_FAILURE(a,b) \
+ FORKEE_ASSERTX(((a) == errno) && ((b) == -1))
+#else
+#define TWAIT_REQUIRE_SUCCESS(a,b) TEST_REQUIRE_EQ((a), (b))
+#define TWAIT_REQUIRE_FAILURE(a,b) ATF_REQUIRE_ERRNO((a),(b) == -1)
+#define FORKEE_REQUIRE_SUCCESS(a,b) FORKEE_ASSERT_EQ(a, b)
+#define FORKEE_REQUIRE_FAILURE(a,b) \
+ FORKEE_ASSERTX(((a) == errno) && ((b) == -1))
+#endif
+
+/*
+ * Helper tools to verify whether status reports exited value
+ */
+#if TWAIT_HAVE_STATUS
+static void __used
+validate_status_exited(int status, int expected)
+{
+ ATF_REQUIRE_MSG(WIFEXITED(status), "Reported !exited process");
+ ATF_REQUIRE_MSG(!WIFCONTINUED(status), "Reported continued process");
+ ATF_REQUIRE_MSG(!WIFSIGNALED(status), "Reported signaled process");
+ ATF_REQUIRE_MSG(!WIFSTOPPED(status), "Reported stopped process");
+
+ ATF_REQUIRE_EQ_MSG(WEXITSTATUS(status), expected,
+ "The process has exited with invalid value %d != %d",
+ WEXITSTATUS(status), expected);
+}
+
+static void __used
+forkee_status_exited(int status, int expected)
+{
+ FORKEE_ASSERTX(WIFEXITED(status));
+ FORKEE_ASSERTX(!WIFCONTINUED(status));
+ FORKEE_ASSERTX(!WIFSIGNALED(status));
+ FORKEE_ASSERTX(!WIFSTOPPED(status));
+
+ FORKEE_ASSERT_EQ(WEXITSTATUS(status), expected);
+}
+
+static void __used
+validate_status_continued(int status)
+{
+ ATF_REQUIRE_MSG(!WIFEXITED(status), "Reported exited process");
+ ATF_REQUIRE_MSG(WIFCONTINUED(status), "Reported !continued process");
+ ATF_REQUIRE_MSG(!WIFSIGNALED(status), "Reported signaled process");
+ ATF_REQUIRE_MSG(!WIFSTOPPED(status), "Reported stopped process");
+}
+
+static void __used
+forkee_status_continued(int status)
+{
+ FORKEE_ASSERTX(!WIFEXITED(status));
+ FORKEE_ASSERTX(WIFCONTINUED(status));
+ FORKEE_ASSERTX(!WIFSIGNALED(status));
+ FORKEE_ASSERTX(!WIFSTOPPED(status));
+}
+
+static void __used
+validate_status_signaled(int status, int expected_termsig, int expected_core)
+{
+ ATF_REQUIRE_MSG(!WIFEXITED(status), "Reported exited process");
+ ATF_REQUIRE_MSG(!WIFCONTINUED(status), "Reported continued process");
+ ATF_REQUIRE_MSG(WIFSIGNALED(status), "Reported !signaled process");
+ ATF_REQUIRE_MSG(!WIFSTOPPED(status), "Reported stopped process");
+
+ ATF_REQUIRE_EQ_MSG(WTERMSIG(status), expected_termsig,
+ "Unexpected signal received");
+
+ ATF_REQUIRE_EQ_MSG(WCOREDUMP(status), expected_core,
+ "Unexpectedly core file %s generated", expected_core ? "not" : "");
+}
+
+static void __used
+forkee_status_signaled(int status, int expected_termsig, int expected_core)
+{
+ FORKEE_ASSERTX(!WIFEXITED(status));
+ FORKEE_ASSERTX(!WIFCONTINUED(status));
+ FORKEE_ASSERTX(WIFSIGNALED(status));
+ FORKEE_ASSERTX(!WIFSTOPPED(status));
+
+ FORKEE_ASSERT_EQ(WTERMSIG(status), expected_termsig);
+ FORKEE_ASSERT_EQ(WCOREDUMP(status), expected_core);
+}
+
+static void __used
+validate_status_stopped(int status, int expected)
+{
+ ATF_REQUIRE_MSG(!WIFEXITED(status), "Reported exited process");
+ ATF_REQUIRE_MSG(!WIFCONTINUED(status), "Reported continued process");
+ ATF_REQUIRE_MSG(!WIFSIGNALED(status), "Reported signaled process");
+ ATF_REQUIRE_MSG(WIFSTOPPED(status), "Reported !stopped process");
+
+ char st[128], ex[128];
+ strlcpy(st, strsignal(WSTOPSIG(status)), sizeof(st));
+ strlcpy(ex, strsignal(expected), sizeof(ex));
+
+ ATF_REQUIRE_EQ_MSG(WSTOPSIG(status), expected,
+ "Unexpected stop signal received [%s] != [%s]", st, ex);
+}
+
+static void __used
+forkee_status_stopped(int status, int expected)
+{
+ FORKEE_ASSERTX(!WIFEXITED(status));
+ FORKEE_ASSERTX(!WIFCONTINUED(status));
+ FORKEE_ASSERTX(!WIFSIGNALED(status));
+ FORKEE_ASSERTX(WIFSTOPPED(status));
+
+ FORKEE_ASSERT_EQ(WSTOPSIG(status), expected);
+}
+#else
+#define validate_status_exited(a,b)
+#define forkee_status_exited(a,b)
+#define validate_status_continued(a,b)
+#define forkee_status_continued(a,b)
+#define validate_status_signaled(a,b,c)
+#define forkee_status_signaled(a,b,c)
+#define validate_status_stopped(a,b)
+#define forkee_status_stopped(a,b)
+#endif
+
+/* This function is currently designed to be run in the main/parent process */
+static void __used
+await_zombie(pid_t process)
+{
+ struct kinfo_proc2 p;
+ size_t len = sizeof(p);
+
+ const int name[] = {
+ [0] = CTL_KERN,
+ [1] = KERN_PROC2,
+ [2] = KERN_PROC_PID,
+ [3] = process,
+ [4] = sizeof(p),
+ [5] = 1
+ };
+
+ const size_t namelen = __arraycount(name);
+
+ /* Await the process becoming a zombie */
+ while(1) {
+ ATF_REQUIRE(sysctl(name, namelen, &p, &len, NULL, 0) == 0);
+
+ if (p.p_stat == LSZOMB)
+ break;
+
+ ATF_REQUIRE(usleep(1000) == 0);
+ }
+}
+
+/* Happy number sequence -- this function is used to just consume cpu cycles */
+#define HAPPY_NUMBER 1
+
+/* If n is not happy then its sequence ends in the cycle:
+ * 4, 16, 37, 58, 89, 145, 42, 20, 4, ... */
+#define SAD_NUMBER 4
+
+/* Calculate the sum of the squares of the digits of n */
+static unsigned __used
+dsum(unsigned n)
+{
+ unsigned sum, x;
+ for (sum = 0; n; n /= 10) {
+ x = n % 10;
+ sum += x * x;
+ }
+ return sum;
+}
+
+/*
+ * XXX: Disabled optimization is required to make tests for hardware assisted
+ * traps in .text functional
+ *
+ * Tested with GCC 5.4 on NetBSD 7.99.47 amd64
+ */
+static int __used
+#ifdef __clang__
+__attribute__((__optnone__))
+#else
+__attribute__((__optimize__("O0")))
+#endif
+check_happy(unsigned n)
+{
+ for (;;) {
+ unsigned total = dsum(n);
+
+ if (total == HAPPY_NUMBER)
+ return 1;
+ if (total == SAD_NUMBER)
+ return 0;
+
+ n = total;
+ }
+}
+
+#if defined(TWAIT_HAVE_PID)
+#define ATF_TP_ADD_TC_HAVE_PID(a,b) ATF_TP_ADD_TC(a,b)
+#else
+#define ATF_TP_ADD_TC_HAVE_PID(a,b)
+#endif
+
+#if defined(HAVE_GPREGS)
+#define ATF_TP_ADD_TC_HAVE_GPREGS(a,b) ATF_TP_ADD_TC(a,b)
+#else
+#define ATF_TP_ADD_TC_HAVE_GPREGS(a,b)
+#endif
+
+#if defined(HAVE_FPREGS)
+#define ATF_TP_ADD_TC_HAVE_FPREGS(a,b) ATF_TP_ADD_TC(a,b)
+#else
+#define ATF_TP_ADD_TC_HAVE_FPREGS(a,b)
+#endif
+
+#if defined(PT_STEP)
+#define ATF_TP_ADD_TC_PT_STEP(a,b) ATF_TP_ADD_TC(a,b)
+#else
+#define ATF_TP_ADD_TC_PT_STEP(a,b)
+#endif
+
+#if defined(__HAVE_PTRACE_WATCHPOINTS)
+#define ATF_TP_ADD_TC_HAVE_PTRACE_WATCHPOINTS(a,b) ATF_TP_ADD_TC(a,b)
+#else
+#define ATF_TP_ADD_TC_HAVE_PTRACE_WATCHPOINTS(a,b)
+#endif
diff --git a/kernel/t_ptrace_wait3.c b/kernel/t_ptrace_wait3.c
new file mode 100644
index 000000000000..c136431af818
--- /dev/null
+++ b/kernel/t_ptrace_wait3.c
@@ -0,0 +1,30 @@
+/* $NetBSD: t_ptrace_wait3.c,v 1.1 2016/11/07 21:09:03 kamil Exp $ */
+
+/*-
+ * Copyright (c) 2016 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#define TWAIT_WAIT3
+#include "t_ptrace_wait.c"
diff --git a/kernel/t_ptrace_wait4.c b/kernel/t_ptrace_wait4.c
new file mode 100644
index 000000000000..7ae771bb7075
--- /dev/null
+++ b/kernel/t_ptrace_wait4.c
@@ -0,0 +1,30 @@
+/* $NetBSD: t_ptrace_wait4.c,v 1.1 2016/11/07 21:09:03 kamil Exp $ */
+
+/*-
+ * Copyright (c) 2016 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#define TWAIT_WAIT4
+#include "t_ptrace_wait.c"
diff --git a/kernel/t_ptrace_wait6.c b/kernel/t_ptrace_wait6.c
new file mode 100644
index 000000000000..122cb1d9a1cc
--- /dev/null
+++ b/kernel/t_ptrace_wait6.c
@@ -0,0 +1,30 @@
+/* $NetBSD: t_ptrace_wait6.c,v 1.1 2016/11/07 21:09:03 kamil Exp $ */
+
+/*-
+ * Copyright (c) 2016 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#define TWAIT_WAIT6
+#include "t_ptrace_wait.c"
diff --git a/kernel/t_ptrace_waitid.c b/kernel/t_ptrace_waitid.c
new file mode 100644
index 000000000000..1c09be70d8a5
--- /dev/null
+++ b/kernel/t_ptrace_waitid.c
@@ -0,0 +1,30 @@
+/* $NetBSD: t_ptrace_waitid.c,v 1.1 2016/11/07 21:09:03 kamil Exp $ */
+
+/*-
+ * Copyright (c) 2016 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#define TWAIT_WAITID
+#include "t_ptrace_wait.c"
diff --git a/kernel/t_ptrace_waitpid.c b/kernel/t_ptrace_waitpid.c
new file mode 100644
index 000000000000..c8f107dbda51
--- /dev/null
+++ b/kernel/t_ptrace_waitpid.c
@@ -0,0 +1,30 @@
+/* $NetBSD: t_ptrace_waitpid.c,v 1.1 2016/11/07 21:09:03 kamil Exp $ */
+
+/*-
+ * Copyright (c) 2016 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#define TWAIT_WAITPID
+#include "t_ptrace_wait.c"
diff --git a/lib/Makefile b/lib/Makefile
index b8008636accd..1fef36a12ac5 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -1,10 +1,11 @@
-# $NetBSD: Makefile,v 1.25 2016/01/01 21:38:54 jakllsch Exp $
+# $NetBSD: Makefile,v 1.27 2016/11/16 21:36:23 kamil Exp $
.include <bsd.own.mk>
TESTS_SUBDIRS= csu libbluetooth libc libcrypt libcurses libevent libexecinfo \
libm libobjc libposix libppath libprop libpthread \
- librt libtre libusbhid libutil semaphore
+ libpthread_dbg librefuse librt libtre libusbhid libutil \
+ semaphore
.if (${MKRUMP} != "no") && !defined(BSD_MK_COMPAT_FILE)
TESTS_SUBDIRS+= librumpclient librumphijack
diff --git a/lib/libc/arch/sparc64/exec_prot_support.c b/lib/libc/arch/sparc64/exec_prot_support.c
index 474cfc742f69..8ca38b4fb209 100644
--- a/lib/libc/arch/sparc64/exec_prot_support.c
+++ b/lib/libc/arch/sparc64/exec_prot_support.c
@@ -1,4 +1,4 @@
-/* $NetBSD: exec_prot_support.c,v 1.1 2011/07/18 23:16:10 jym Exp $ */
+/* $NetBSD: exec_prot_support.c,v 1.2 2016/12/31 11:51:20 martin Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -30,12 +30,13 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: exec_prot_support.c,v 1.1 2011/07/18 23:16:10 jym Exp $");
+__RCSID("$NetBSD: exec_prot_support.c,v 1.2 2016/12/31 11:51:20 martin Exp $");
#include "../../common/exec_prot.h"
int
exec_prot_support(void)
{
- return NOTIMPL;
+
+ return PERPAGE_XP;
}
diff --git a/lib/libc/arch/sparc64/return_one.S b/lib/libc/arch/sparc64/return_one.S
index 3495260d6f68..ec8bcdd9de7f 100644
--- a/lib/libc/arch/sparc64/return_one.S
+++ b/lib/libc/arch/sparc64/return_one.S
@@ -1,8 +1,11 @@
-/* $NetBSD: return_one.S,v 1.1 2011/07/18 23:16:10 jym Exp $ */
+/* $NetBSD: return_one.S,v 1.2 2016/12/31 11:51:20 martin Exp $ */
#include <machine/asm.h>
-.globl return_one, return_one_end;
+.global return_one_end
-return_one: return_one_end:
- nop
+ENTRY(return_one)
+return_one:
+ retl
+ mov 1, %o0
+return_one_end:
diff --git a/lib/libc/db/Makefile b/lib/libc/db/Makefile
index ffcc96e98bf6..fa5f94c5c18d 100644
--- a/lib/libc/db/Makefile
+++ b/lib/libc/db/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.3 2015/11/18 18:35:35 christos Exp $
+# $NetBSD: Makefile,v 1.4 2016/09/24 20:12:33 christos Exp $
.include <bsd.own.mk>
@@ -13,6 +13,7 @@ MKMAN= no
PROGS+= h_db
PROGS+= h_lfsr
+CPPFLAGS.h_db.c += -I${NETBSDSRCDIR}/lib/libc/db/btree
FILESDIR= ${TESTSDIR}
diff --git a/lib/libc/db/h_db.c b/lib/libc/db/h_db.c
index dfb13859d3f2..4bea6feb2769 100644
--- a/lib/libc/db/h_db.c
+++ b/lib/libc/db/h_db.c
@@ -1,4 +1,4 @@
-/* $NetBSD: h_db.c,v 1.1 2011/01/07 15:05:58 pgoyette Exp $ */
+/* $NetBSD: h_db.c,v 1.3 2016/09/24 21:18:22 christos Exp $ */
/*-
* Copyright (c) 1992, 1993, 1994
@@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1992, 1993, 1994\
#if 0
static char sccsid[] = "@(#)dbtest.c 8.17 (Berkeley) 9/1/94";
#else
-__RCSID("$NetBSD: h_db.c,v 1.1 2011/01/07 15:05:58 pgoyette Exp $");
+__RCSID("$NetBSD: h_db.c,v 1.3 2016/09/24 21:18:22 christos Exp $");
#endif
#endif /* not lint */
@@ -57,12 +57,13 @@ __RCSID("$NetBSD: h_db.c,v 1.1 2011/01/07 15:05:58 pgoyette Exp $");
#include <unistd.h>
#include <err.h>
#include <db.h>
+#include "btree.h"
enum S { COMMAND, COMPARE, GET, PUT, REMOVE, SEQ, SEQFLAG, KEY, DATA };
static void compare(DBT *, DBT *);
static DBTYPE dbtype(const char *);
-static void dump(DB *, int);
+static void dump(DB *, int, int);
static void get(DB *, DBT *);
static void getdata(DB *, DBT *, DBT *);
static void put(DB *, DBT *, DBT *);
@@ -73,6 +74,7 @@ static void *rfile(char *, size_t *);
static void seq(DB *, DBT *);
static u_int setflags(char *);
static void *setinfo(DBTYPE, char *);
+static void unlinkpg(DB *);
static void usage(void) __attribute__((__noreturn__));
static void *xcopy(void *, size_t);
static void chkcmd(enum S);
@@ -82,6 +84,7 @@ static void chkkey(enum S);
#ifdef STATISTICS
extern void __bt_stat(DB *);
#endif
+extern int __bt_relink(BTREE *, PAGE *);
static DBTYPE type; /* Database type. */
static void *infop; /* Iflags. */
@@ -315,7 +318,13 @@ lkey: switch (command) {
}
break;
case 'o':
- dump(dbp, p[1] == 'r');
+ dump(dbp, p[1] == 'r', 0);
+ break;
+ case 'O':
+ dump(dbp, p[1] == 'r', 1);
+ break;
+ case 'u':
+ unlinkpg(dbp);
break;
default:
errx(1, "line %zu: %s: unknown command character",
@@ -483,17 +492,17 @@ seq(DB *dbp, DBT *kp)
}
static void
-dump(DB *dbp, int rev)
+dump(DB *dbp, int rev, int recurse)
{
DBT key, data;
int xflags, nflags;
if (rev) {
xflags = R_LAST;
- nflags = R_PREV;
+ nflags = recurse ? R_RPREV : R_PREV;
} else {
xflags = R_FIRST;
- nflags = R_NEXT;
+ nflags = recurse ? R_RNEXT : R_NEXT;
}
for (;; xflags = nflags)
switch (dbp->seq(dbp, &key, &data, xflags)) {
@@ -511,6 +520,40 @@ dump(DB *dbp, int rev)
done: return;
}
+void
+unlinkpg(DB *dbp)
+{
+ BTREE *t = dbp->internal;
+ PAGE *h = NULL;
+ pgno_t pg;
+
+ for (pg = P_ROOT; pg < t->bt_mp->npages;
+ mpool_put(t->bt_mp, h, 0), pg++) {
+ if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
+ break;
+ /* Look for a nonempty leaf page that has both left
+ * and right siblings. */
+ if (h->prevpg == P_INVALID || h->nextpg == P_INVALID)
+ continue;
+ if (NEXTINDEX(h) == 0)
+ continue;
+ if ((h->flags & (P_BLEAF | P_RLEAF)))
+ break;
+ }
+ if (h == NULL || pg == t->bt_mp->npages) {
+ errx(1, "%s: no appropriate page found", __func__);
+ return;
+ }
+ if (__bt_relink(t, h) != 0) {
+ perror("unlinkpg");
+ goto cleanup;
+ }
+ h->prevpg = P_INVALID;
+ h->nextpg = P_INVALID;
+cleanup:
+ mpool_put(t->bt_mp, h, MPOOL_DIRTY);
+}
+
static u_int
setflags(char *s)
{
@@ -725,7 +768,7 @@ static void
usage(void)
{
(void)fprintf(stderr,
- "Usage: %s [-l] [-f file] [-i info] [-o file] type script\n",
- getprogname());
+ "Usage: %s [-lu] [-f file] [-i info] [-o file] [-O file] "
+ "type script\n", getprogname());
exit(1);
}
diff --git a/lib/libc/db/t_db.sh b/lib/libc/db/t_db.sh
index 53500ffe4a05..dc090d0802de 100755
--- a/lib/libc/db/t_db.sh
+++ b/lib/libc/db/t_db.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_db.sh,v 1.6 2015/11/18 18:35:35 christos Exp $
+# $NetBSD: t_db.sh,v 1.7 2016/09/24 20:12:33 christos Exp $
#
# Copyright (c) 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -540,6 +540,7 @@ delete_recno_body()
h_repeated()
{
+ local type="$1"
TMPDIR="$(pwd)/db_dir"; export TMPDIR
mkdir ${TMPDIR}
@@ -558,7 +559,7 @@ h_repeated()
}
}' >in
- $(prog_db) btree in
+ $(prog_db) $type in
}
atf_test_case repeated_btree
@@ -618,11 +619,10 @@ duplicate_btree_body()
h_cursor_flags()
{
+ local type=$1
TMPDIR="$(pwd)/db_dir"; export TMPDIR
mkdir ${TMPDIR}
- type=$1
-
echo $SEVEN_SEVEN |
awk '{
for (i = 1; i <= 20; ++i)
@@ -758,6 +758,7 @@ h_byte_orders()
echo p
echo k$i
echo d$i
+ echo S
echo g
echo k$i
done >in
@@ -924,6 +925,292 @@ bsize_torture_body()
done
}
+atf_test_case btree_weird_page_split
+btree_weird_page_split_head()
+{
+ atf_set "descr" \
+ "Test for a weird page split condition where an insertion " \
+ "into index 0 of a page that would cause the new item to " \
+ "be the only item on the left page results in index 0 of " \
+ "the right page being erroneously skipped; this only " \
+ "happens with one particular key+data length for each page size."
+}
+btree_weird_page_split_body()
+{
+ for psize in 512 1024 2048 4096 8192; do
+ echo " page size $psize"
+ kdsizes=`awk 'BEGIN {
+ psize = '$psize'; hsize = int(psize/2);
+ for (kdsize = hsize-40; kdsize <= hsize; kdsize++) {
+ print kdsize;
+ }
+ }' /dev/null`
+
+ # Use a series of keylen+datalen values in the right
+ # neighborhood to find the one that triggers the bug.
+ # We could compute the exact size that triggers the
+ # bug but this additional fuzz may be useful.
+
+ # Insert keys in reverse order to maximize the chances
+ # for a split on index 0.
+
+ for kdsize in $kdsizes; do
+ awk 'BEGIN {
+ kdsize = '$kdsize';
+ for (i = 8; i-- > 0; ) {
+ s = sprintf("a%03d:%09d", i, kdsize);
+ for (j = 0; j < kdsize-20; j++) {
+ s = s "x";
+ }
+ printf("p\nka%03d\nd%s\n", i, s);
+ }
+ print "o";
+ }' /dev/null > in
+ sed -n 's/^d//p' in | sort > exp
+ atf_check -o file:exp \
+ "$(prog_db)" -i psize=$psize btree in
+ done
+ done
+}
+
+# Extremely tricky test attempting to replicate some unusual database
+# corruption seen in the field: pieces of the database becoming
+# inaccessible to random access, sequential access, or both. The
+# hypothesis is that at least some of these are triggered by the bug
+# in page splits on index 0 with a particular exact keylen+datalen.
+# (See Test 40.) For psize=4096, this size is exactly 2024.
+
+# The order of operations here relies on very specific knowledge of
+# the internals of the btree access method in order to place records
+# at specific offsets in a page and to create certain keys on internal
+# pages. The to-be-split page immediately prior to the bug-triggering
+# split has the following properties:
+#
+# * is not the leftmost leaf page
+# * key on the parent page is compares less than the key of the item
+# on index 0
+# * triggering record's key also compares greater than the key on the
+# parent page
+
+# Additionally, we prime the mpool LRU chain so that the head page on
+# the chain has the following properties:
+#
+# * record at index 0 is located where it will not get overwritten by
+# items written to the right-hand page during the split
+# * key of the record at index 0 compares less than the key of the
+# bug-triggering record
+
+# If the page-split bug exists, this test appears to create a database
+# where some records are inaccessible to a search, but still remain in
+# the file and are accessible by sequential traversal. At least one
+# record gets duplicated out of sequence.
+
+atf_test_case btree_tricky_page_split
+btree_tricky_page_split_head()
+{
+ atf_set "descr" \
+ "btree: no unsearchables due to page split on index 0"
+}
+btree_tricky_page_split_body()
+{
+ list=`(for i in a b c d; do
+ for j in 990 998 999; do
+ echo g ${i}${j} 1024
+ done
+ done;
+ echo g y997 2014
+ for i in y z; do
+ for j in 998 999; do
+ echo g ${i}${j} 1024
+ done
+ done)`
+ # Exact number for trigger condition accounts for newlines
+ # retained by dbtest with -ofile but not without; we use
+ # -ofile, so count newlines. keylen=5,datalen=5+2014 for
+ # psize=4096 here.
+ (cat - <<EOF
+p z999 1024
+p z998 1024
+p y999 1024
+p y990 1024
+p d999 1024
+p d990 1024
+p c999 1024
+p c990 1024
+p b999 1024
+p b990 1024
+p a999 1024
+p a990 1024
+p y998 1024
+r y990
+p d998 1024
+p d990 1024
+p c998 1024
+p c990 1024
+p b998 1024
+p b990 1024
+p a998 1024
+p a990 1024
+p y997 2014
+S
+o
+EOF
+ echo "$list") |
+ # awk script input:
+ # {p|g|r} key [datasize]
+ awk '/^[pgr]/{
+ printf("%s\nk%s\n", $1, $2);
+ }
+ /^p/{
+ s = $2;
+ for (i = 0; i < $3; i++) {
+ s = s "x";
+ }
+ printf("d%s\n", s);
+ }
+ !/^[pgr]/{
+ print $0;
+ }' > in
+ (echo "$list"; echo "$list") | awk '{
+ s = $2;
+ for (i = 0; i < $3; i++) {
+ s = s "x";
+ }
+ print s;
+ }' > exp
+ atf_check -o file:exp \
+ "$(prog_db)" -i psize=4096 btree in
+}
+
+atf_test_case btree_recursive_traversal
+btree_recursive_traversal_head()
+{
+ atf_set "descr" \
+ "btree: Test for recursive traversal successfully " \
+ "retrieving records that are inaccessible to normal " \
+ "sequential 'sibling-link' traversal. This works by " \
+ "unlinking a few leaf pages but leaving their parent " \
+ "links intact. To verify that the unlink actually makes " \
+ "records inaccessible, the test first uses 'o' to do a " \
+ "normal sequential traversal, followed by 'O' to do a " \
+ "recursive traversal."
+}
+btree_recursive_traversal_body()
+{
+ fill="abcdefghijklmnopqrstuvwxyzy"
+ script='{
+ for (i = 0; i < 20000; i++) {
+ printf("p\nkAA%05d\nd%05d%s\n", i, i, $0);
+ }
+ print "u";
+ print "u";
+ print "u";
+ print "u";
+ }'
+ (echo $fill | awk "$script"; echo o) > in1
+ echo $fill |
+ awk '{
+ for (i = 0; i < 20000; i++) {
+ if (i >= 5 && i <= 40)
+ continue;
+ printf("%05d%s\n", i, $0);
+ }
+ }' > exp1
+ atf_check -o file:exp1 \
+ "$(prog_db)" -i psize=512 btree in1
+ echo $fill |
+ awk '{
+ for (i = 0; i < 20000; i++) {
+ printf("%05d%s\n", i, $0);
+ }
+ }' > exp2
+ (echo $fill | awk "$script"; echo O) > in2
+ atf_check -o file:exp2 \
+ "$(prog_db)" -i psize=512 btree in2
+}
+
+atf_test_case btree_byteswap_unaligned_access_bksd
+btree_byteswap_unaligned_access_bksd_head()
+{
+ atf_set "descr" \
+ "btree: big key, small data, byteswap unaligned access"
+}
+btree_byteswap_unaligned_access_bksd_body()
+{
+ (echo foo; echo bar) |
+ awk '{
+ s = $0
+ for (i = 0; i < 488; i++) {
+ s = s "x";
+ }
+ printf("p\nk%s\ndx\n", s);
+ }' > in
+ for order in 1234 4321; do
+ atf_check \
+ "$(prog_db)" -o out -i psize=512,lorder=$order btree in
+ done
+}
+
+atf_test_case btree_byteswap_unaligned_access_skbd
+btree_byteswap_unaligned_access_skbd_head()
+{
+ atf_set "descr" \
+ "btree: small key, big data, byteswap unaligned access"
+}
+btree_byteswap_unaligned_access_skbd_body()
+{
+ # 484 = 512 - 20 (header) - 7 ("foo1234") - 1 (newline)
+ (echo foo1234; echo bar1234) |
+ awk '{
+ s = $0
+ for (i = 0; i < 484; i++) {
+ s = s "x";
+ }
+ printf("p\nk%s\nd%s\n", $0, s);
+ }' > in
+ for order in 1234 4321; do
+ atf_check \
+ "$(prog_db)" -o out -i psize=512,lorder=$order btree in
+ done
+}
+
+atf_test_case btree_known_byte_order
+btree_known_byte_order_head()
+{
+ atf_set "descr" \
+ "btree: small key, big data, known byte order"
+}
+btree_known_byte_order_body()
+{
+ local a="-i psize=512,lorder="
+
+ (echo foo1234; echo bar1234) |
+ awk '{
+ s = $0
+ for (i = 0; i < 484; i++) {
+ s = s "x";
+ }
+ printf("%s\n", s);
+ }' > exp
+ (echo foo1234; echo bar1234) |
+ awk '{
+ s = $0
+ for (i = 0; i < 484; i++) {
+ s = s "x";
+ }
+ printf("p\nk%s\nd%s\n", $0, s);
+ }' > in1
+ for order in 1234 4321; do
+ atf_check \
+ "$(prog_db)" -f out.$order $a$order btree in1
+ done
+ (echo g; echo kfoo1234; echo g; echo kbar1234) > in2
+ for order in 1234 4321; do
+ atf_check -o file:exp \
+ "$(prog_db)" -s -f out.$order $a$order btree in2
+ done
+}
+
atf_init_test_cases()
{
atf_add_test_case small_btree
@@ -952,4 +1239,10 @@ atf_init_test_cases()
atf_add_test_case bsize_ffactor
atf_add_test_case four_char_hash
atf_add_test_case bsize_torture
+ atf_add_test_case btree_weird_page_split
+ atf_add_test_case btree_tricky_page_split
+ atf_add_test_case btree_recursive_traversal
+ atf_add_test_case btree_byteswap_unaligned_access_bksd
+ atf_add_test_case btree_byteswap_unaligned_access_skbd
+ atf_add_test_case btree_known_byte_order
}
diff --git a/lib/libc/gen/Makefile b/lib/libc/gen/Makefile
index c99ada1d87d2..c4ba9e93e016 100644
--- a/lib/libc/gen/Makefile
+++ b/lib/libc/gen/Makefile
@@ -1,10 +1,11 @@
-# $NetBSD: Makefile,v 1.49 2015/12/22 14:25:58 christos Exp $
+# $NetBSD: Makefile,v 1.50 2016/12/09 06:12:02 kamil Exp $
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/lib/libc/gen
-TESTS_SUBDIRS= execve
+TESTS_SUBDIRS= exect
+TESTS_SUBDIRS+= execve
TESTS_SUBDIRS+= posix_spawn
TESTS_C+= t_alarm
diff --git a/lib/libc/gen/t_fnmatch.c b/lib/libc/gen/t_fnmatch.c
index c0064c38f66a..69ee8d2f793d 100644
--- a/lib/libc/gen/t_fnmatch.c
+++ b/lib/libc/gen/t_fnmatch.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_fnmatch.c,v 1.6 2014/10/12 22:33:41 christos Exp $ */
+/* $NetBSD: t_fnmatch.c,v 1.7 2016/10/31 05:08:53 dholland Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_fnmatch.c,v 1.6 2014/10/12 22:33:41 christos Exp $");
+__RCSID("$NetBSD: t_fnmatch.c,v 1.7 2016/10/31 05:08:53 dholland Exp $");
#include <atf-c.h>
#include <fnmatch.h>
@@ -166,6 +166,7 @@ ATF_TC_BODY(fnmatch_initialbracket, tc)
ATF_CHECK(fnmatch("[!]a-]", "b", 0) == 0);
ATF_CHECK(fnmatch("[]-_]", "^", 0) == 0); /* range: ']', '^', '_' */
ATF_CHECK(fnmatch("[!]-_]", "X", 0) == 0);
+ ATF_CHECK(fnmatch("[A-\\\\]", "[", 0) == 0);
ATF_CHECK(fnmatch("[a-z]/[a-z]", "a/b", 0) == 0);
ATF_CHECK(fnmatch("[*]/b", "*/b", 0) == 0);
ATF_CHECK(fnmatch("[?]/b", "?/b", 0) == 0);
diff --git a/lib/libc/net/getaddrinfo/Makefile b/lib/libc/net/getaddrinfo/Makefile
index a9f4b53f4c33..416af34a567a 100644
--- a/lib/libc/net/getaddrinfo/Makefile
+++ b/lib/libc/net/getaddrinfo/Makefile
@@ -1,6 +1,6 @@
-# $NetBSD: Makefile,v 1.1 2011/01/12 02:58:40 pgoyette Exp $
+# $NetBSD: Makefile,v 1.2 2016/08/26 01:31:43 darcy Exp $
-MKMAN= no
+NOMAN=
.include <bsd.own.mk>
diff --git a/lib/libc/regex/Makefile b/lib/libc/regex/Makefile
index c59a5b6d4acc..d8a46d474fe9 100644
--- a/lib/libc/regex/Makefile
+++ b/lib/libc/regex/Makefile
@@ -1,6 +1,6 @@
-# $NetBSD: Makefile,v 1.9 2012/08/24 20:24:40 jmmv Exp $
+# $NetBSD: Makefile,v 1.10 2016/08/26 01:31:43 darcy Exp $
-MKMAN= no
+NOMAN=
.include <bsd.own.mk>
diff --git a/lib/libc/rpc/t_rpc.c b/lib/libc/rpc/t_rpc.c
index 371576250f28..1cfe913c4e47 100644
--- a/lib/libc/rpc/t_rpc.c
+++ b/lib/libc/rpc/t_rpc.c
@@ -1,7 +1,7 @@
-/* $NetBSD: t_rpc.c,v 1.9 2015/11/27 13:59:40 christos Exp $ */
+/* $NetBSD: t_rpc.c,v 1.10 2016/08/27 14:36:22 christos Exp $ */
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_rpc.c,v 1.9 2015/11/27 13:59:40 christos Exp $");
+__RCSID("$NetBSD: t_rpc.c,v 1.10 2016/08/27 14:36:22 christos Exp $");
#include <sys/types.h>
#include <sys/socket.h>
@@ -21,12 +21,12 @@ __RCSID("$NetBSD: t_rpc.c,v 1.9 2015/11/27 13:59:40 christos Exp $");
#define SKIPX(ev, msg, ...) do { \
atf_tc_skip(msg, __VA_ARGS__); \
- return; \
+ return ev; \
} while(/*CONSTCOND*/0)
#else
-#define ERRX(ev, msg, ...) errx(ev, msg, __VA_ARGS__)
-#define SKIPX(ev, msg, ...) errx(ev, msg, __VA_ARGS__)
+#define ERRX(ev, msg, ...) errx(EXIT_FAILURE, msg, __VA_ARGS__)
+#define SKIPX(ev, msg, ...) errx(EXIT_FAILURE, msg, __VA_ARGS__)
#endif
#ifdef DEBUG
@@ -72,13 +72,13 @@ onehost(const char *host, const char *transp)
__rpc_control(CLCR_SET_RPCB_TIMEOUT, &tv);
if ((clnt = clnt_create(host, RPCBPROG, RPCBVERS, transp)) == NULL)
- SKIPX(EXIT_FAILURE, "clnt_create (%s)", clnt_spcreateerror(""));
+ SKIPX(, "clnt_create (%s)", clnt_spcreateerror(""));
tv.tv_sec = 1;
tv.tv_usec = 0;
if (clnt_call(clnt, RPCBPROC_NULL, xdr_void, NULL, xdr_void, NULL, tv)
!= RPC_SUCCESS)
- ERRX(EXIT_FAILURE, "clnt_call (%s)", clnt_sperror(clnt, ""));
+ ERRX(, "clnt_call (%s)", clnt_sperror(clnt, ""));
clnt_control(clnt, CLGET_SVC_ADDR, (char *) &addr);
reply(NULL, &addr, NULL);
}
@@ -100,13 +100,13 @@ server(struct svc_req *rqstp, SVCXPRT *transp)
switch (rqstp->rq_proc) {
case NULLPROC:
if (!svc_sendreply(transp, (xdrproc_t)xdr_void, NULL))
- ERRX(EXIT_FAILURE, "svc_sendreply failed %d", 0);
+ ERRX(, "svc_sendreply failed %d", 0);
return;
case PLUSONE:
break;
case DESTROY:
if (!svc_sendreply(transp, (xdrproc_t)xdr_void, NULL))
- ERRX(EXIT_FAILURE, "svc_sendreply failed %d", 0);
+ ERRX(, "svc_sendreply failed %d", 0);
svc_destroy(transp);
exit(0);
default:
@@ -121,7 +121,7 @@ server(struct svc_req *rqstp, SVCXPRT *transp)
DPRINTF("About to increment\n");
num++;
if (!svc_sendreply(transp, (xdrproc_t)xdr_int, (void *)&num))
- ERRX(EXIT_FAILURE, "svc_sendreply failed %d", 1);
+ ERRX(, "svc_sendreply failed %d", 1);
DPRINTF("Leaving server procedure.\n");
}
@@ -176,7 +176,7 @@ regtest(const char *hostname, const char *transp, const char *arg, int p)
svc_fdset_init(p ? SVC_FDSET_POLL : 0);
if (!svc_create(server, PROGNUM, VERSNUM, transp))
- ERRX(EXIT_FAILURE, "Cannot create server %d", num);
+ SKIPX(EXIT_FAILURE, "Cannot create server %d", num);
switch ((pid = fork())) {
case 0:
diff --git a/lib/libc/sync/cpp_atomic_ops_linkable.cc b/lib/libc/sync/cpp_atomic_ops_linkable.cc
index 742685103dba..e7822b768d7f 100644
--- a/lib/libc/sync/cpp_atomic_ops_linkable.cc
+++ b/lib/libc/sync/cpp_atomic_ops_linkable.cc
@@ -1,4 +1,4 @@
-/* $NetBSD: cpp_atomic_ops_linkable.cc,v 1.4 2016/02/27 18:50:39 joerg Exp $ */
+/* $NetBSD: cpp_atomic_ops_linkable.cc,v 1.5 2017/01/11 12:10:26 joerg Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -58,19 +58,13 @@ private:
volatile std::atomic<T> m_val;
};
-#if defined(__clang__) && defined(__sparc64__)
-#define NO_SHORT_ATOMICS
-#endif
-
int main(int argc, char **argv)
{
-#ifndef NO_SHORT_ATOMICS
ATest<char>();
ATest<signed char>();
ATest<unsigned char>();
ATest<short>();
ATest<unsigned short>();
-#endif
ATest<int>();
ATest<unsigned int>();
ATest<long>();
@@ -79,29 +73,23 @@ int main(int argc, char **argv)
ATest<long long>();
ATest<unsigned long long>();
#endif
-#ifndef NO_SHORT_ATOMICS
ATest<char16_t>();
-#endif
ATest<char32_t>();
ATest<wchar_t>();
-#ifndef NO_SHORT_ATOMICS
ATest<int_least8_t>();
ATest<uint_least8_t>();
ATest<int_least16_t>();
ATest<uint_least16_t>();
-#endif
ATest<int_least32_t>();
ATest<uint_least32_t>();
#ifdef __HAVE_ATOMIC64_OPS
ATest<int_least64_t>();
ATest<uint_least64_t>();
#endif
-#ifndef NO_SHORT_ATOMICS
ATest<int_fast8_t>();
ATest<uint_fast8_t>();
ATest<int_fast16_t>();
ATest<uint_fast16_t>();
-#endif
ATest<int_fast32_t>();
ATest<uint_fast32_t>();
#ifdef __HAVE_ATOMIC64_OPS
@@ -115,5 +103,5 @@ int main(int argc, char **argv)
#ifdef __HAVE_ATOMIC64_OPS
ATest<intmax_t>();
ATest<uintmax_t>();
-#endif /* NO_SHORT_ATOMICS */
+#endif
}
diff --git a/lib/libc/sys/Makefile b/lib/libc/sys/Makefile
index f96beb444fea..962cb098c112 100644
--- a/lib/libc/sys/Makefile
+++ b/lib/libc/sys/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.43 2016/07/30 11:03:54 njoly Exp $
+# $NetBSD: Makefile,v 1.45 2016/11/11 15:30:44 njoly Exp $
MKMAN= no
@@ -12,6 +12,7 @@ TESTS_C+= t_access
TESTS_C+= t_bind
TESTS_C+= t_chroot
TESTS_C+= t_clock_gettime
+TESTS_C+= t_clock_nanosleep
TESTS_C+= t_clone
TESTS_C+= t_connect
TESTS_C+= t_dup
@@ -67,6 +68,8 @@ TESTS_C+= t_ucontext
TESTS_C+= t_umask
TESTS_C+= t_unlink
TESTS_C+= t_wait
+TESTS_C+= t_wait_noproc
+TESTS_C+= t_wait_noproc_wnohang
TESTS_C+= t_write
SRCS.t_mprotect= t_mprotect.c ${SRCS_EXEC_PROT}
diff --git a/lib/libc/sys/t_clock_nanosleep.c b/lib/libc/sys/t_clock_nanosleep.c
new file mode 100644
index 000000000000..8c1fd036b8ba
--- /dev/null
+++ b/lib/libc/sys/t_clock_nanosleep.c
@@ -0,0 +1,63 @@
+/* $NetBSD: t_clock_nanosleep.c,v 1.1 2016/11/11 15:30:44 njoly Exp $ */
+
+/*-
+ * Copyright (c) 2016 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: t_clock_nanosleep.c,v 1.1 2016/11/11 15:30:44 njoly Exp $");
+
+#include <atf-c.h>
+#include <time.h>
+
+ATF_TC(clock_nanosleep_remain);
+ATF_TC_HEAD(clock_nanosleep_remain, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Check clock_nanosleep(2) remaining time");
+}
+
+ATF_TC_BODY(clock_nanosleep_remain, tc)
+{
+ struct timespec rqtp, rmtp;
+
+ rqtp.tv_sec = 0; rqtp.tv_nsec = 0;
+ rmtp.tv_sec = -1; rmtp.tv_nsec = -1;
+ ATF_REQUIRE(clock_nanosleep(CLOCK_REALTIME, 0, &rqtp, &rmtp) == 0);
+ ATF_CHECK(rmtp.tv_sec == 0 && rmtp.tv_nsec == 0);
+
+ ATF_REQUIRE(clock_gettime(CLOCK_REALTIME, &rqtp) == 0);
+ rmtp.tv_sec = -1; rmtp.tv_nsec = -1;
+ ATF_REQUIRE(clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &rqtp, &rmtp) == 0);
+ ATF_CHECK(rmtp.tv_sec == -1 && rmtp.tv_nsec == -1);
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+
+ ATF_TP_ADD_TC(tp, clock_nanosleep_remain);
+
+ return atf_no_error();
+}
diff --git a/lib/libc/sys/t_wait_noproc.c b/lib/libc/sys/t_wait_noproc.c
new file mode 100644
index 000000000000..5d95e526a187
--- /dev/null
+++ b/lib/libc/sys/t_wait_noproc.c
@@ -0,0 +1,340 @@
+/* $NetBSD: t_wait_noproc.c,v 1.5 2016/11/09 17:50:19 kamil Exp $ */
+
+/*-
+ * Copyright (c) 2016 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: t_wait_noproc.c,v 1.5 2016/11/09 17:50:19 kamil Exp $");
+
+#include <sys/wait.h>
+#include <sys/resource.h>
+
+#include <errno.h>
+#include <stdio.h>
+
+#include <atf-c.h>
+
+#ifndef TWAIT_OPTION
+#define TWAIT_OPTION 0
+#endif
+
+#if TWAIT_OPTION == 0
+ATF_TC(wait);
+ATF_TC_HEAD(wait, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test that wait(2) returns ECHILD for no child");
+}
+
+ATF_TC_BODY(wait, tc)
+{
+ ATF_REQUIRE_ERRNO(ECHILD, wait(NULL) == -1);
+}
+#endif
+
+ATF_TC(waitpid);
+ATF_TC_HEAD(waitpid, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test that waitpid(2) returns ECHILD for WAIT_ANY and option %s",
+ ___STRING(TWAIT_OPTION));
+}
+
+ATF_TC_BODY(waitpid, tc)
+{
+ ATF_REQUIRE_ERRNO(ECHILD, waitpid(WAIT_ANY, NULL, TWAIT_OPTION) == -1);
+}
+
+ATF_TC(waitid);
+ATF_TC_HEAD(waitid, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test that waitid(2) returns ECHILD for P_ALL and option %s",
+ ___STRING(TWAIT_OPTION));
+}
+
+ATF_TC_BODY(waitid, tc)
+{
+ ATF_REQUIRE_ERRNO(ECHILD,
+ waitid(P_ALL, 0, NULL,
+ WTRAPPED | WEXITED | TWAIT_OPTION) == -1);
+}
+
+ATF_TC(wait3);
+ATF_TC_HEAD(wait3, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test that wait3(2) returns ECHILD for no child");
+}
+
+ATF_TC_BODY(wait3, tc)
+{
+ ATF_REQUIRE_ERRNO(ECHILD, wait3(NULL, TWAIT_OPTION, NULL) == -1);
+}
+
+ATF_TC(wait4);
+ATF_TC_HEAD(wait4, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test that wait4(2) returns ECHILD for WAIT_ANY and option %s",
+ ___STRING(TWAIT_OPTION));
+}
+
+ATF_TC_BODY(wait4, tc)
+{
+ ATF_REQUIRE_ERRNO(ECHILD,
+ wait4(WAIT_ANY, NULL, TWAIT_OPTION, NULL) == -1);
+}
+
+ATF_TC(wait6);
+ATF_TC_HEAD(wait6, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test that wait6(2) returns ECHILD for P_ALL and option %s",
+ ___STRING(TWAIT_OPTION));
+}
+
+ATF_TC_BODY(wait6, tc)
+{
+ ATF_REQUIRE_ERRNO(ECHILD,
+ wait6(P_ALL, 0, NULL,
+ WTRAPPED | WEXITED | TWAIT_OPTION, NULL, NULL) == -1);
+}
+
+/*
+ * Generator of valid combinations of options
+ * Usage: i = 0; while ((o = get_options_wait6(i++)) != -1) {}
+ */
+static int
+get_options6(size_t pos)
+{
+ int rv = 0;
+ size_t n;
+
+ /*
+ * waitid(2) must specify at least one of WEXITED, WUNTRACED,
+ * WSTOPPED, WTRAPPED or WCONTINUED. Single option WNOWAIT
+ * isn't valid.
+ */
+
+ const int matrix[] = {
+ WNOWAIT, /* First in order to blacklist it easily */
+ WEXITED,
+ WUNTRACED,
+ WSTOPPED, /* SUS compatibility, equal to WUNTRACED */
+ WTRAPPED,
+ WCONTINUED
+ };
+
+ const size_t M = (1 << __arraycount(matrix)) - 1;
+
+ /* Skip empty and sole WNOWAIT option */
+ pos+=2;
+
+ if (pos > M)
+ return -1;
+
+ for (n = 0; n < __arraycount(matrix); n++) {
+ if (pos & __BIT(n))
+ rv |= matrix[n];
+ }
+
+ return rv;
+}
+
+/*
+ * Generator of valid combinations of options
+ * Usage: i = 0; while ((o = get_options_wait4(i++)) != -1) {}
+ */
+static int
+get_options4(size_t pos)
+{
+ int rv = 0;
+ size_t n;
+
+ const int special[] = {
+ 0,
+ WALLSIG,
+ WALTSIG,
+ __WALL, /* Linux compatibility, equal to WALLSIG */
+ __WCLONE /* Linux compatibility, equal to WALTSIG */
+ };
+
+ const int matrix[] = {
+ WNOWAIT,
+ WEXITED,
+ WUNTRACED,
+ WSTOPPED, /* SUS compatibility, equal to WUNTRACED */
+ WTRAPPED,
+ WCONTINUED
+ };
+
+ const size_t M = (1 << __arraycount(special)) - 1;
+
+ if (pos < __arraycount(special))
+ return special[pos];
+
+ pos -= __arraycount(special);
+
+ ++pos; /* Don't start with empty mask */
+
+ if (pos > M)
+ return -1;
+
+ for (n = 0; n < __arraycount(special); n++) {
+ if (pos & __BIT(n))
+ rv |= matrix[n];
+ }
+
+ return rv;
+}
+
+ATF_TC(waitpid_options);
+ATF_TC_HEAD(waitpid_options, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test that waitpid(2) returns ECHILD for WAIT_ANY and valid "
+ "combination of options with%s WNOHANG",
+ TWAIT_OPTION == 0 ? "out" : "");
+}
+
+ATF_TC_BODY(waitpid_options, tc)
+{
+ size_t i = 0;
+ int o;
+
+ while((o = get_options4(i++)) != -1) {
+ printf("Testing waitpid(2) with options %x\n", o);
+
+ ATF_REQUIRE_ERRNO(ECHILD,
+ waitpid(WAIT_ANY, NULL, o | TWAIT_OPTION) == -1);
+ }
+}
+
+ATF_TC(waitid_options);
+ATF_TC_HEAD(waitid_options, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test that waitid(2) returns ECHILD for P_ALL and valid "
+ "combination of options with%s WNOHANG",
+ TWAIT_OPTION == 0 ? "out" : "");
+}
+
+ATF_TC_BODY(waitid_options, tc)
+{
+ size_t i = 0;
+ int o;
+
+ while((o = get_options6(i++)) != -1) {
+ printf("Testing waitid(2) with options %x\n", o);
+
+ ATF_REQUIRE_ERRNO(ECHILD,
+ waitid(P_ALL, 0, NULL, o | TWAIT_OPTION) == -1);
+ }
+}
+
+ATF_TC(wait3_options);
+ATF_TC_HEAD(wait3_options, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test that wait3(2) returns ECHILD for no child");
+}
+
+ATF_TC_BODY(wait3_options, tc)
+{
+ size_t i = 0;
+ int o;
+
+ while((o = get_options4(i++)) != -1) {
+ printf("Testing wait3(2) with options %x\n", o);
+
+ ATF_REQUIRE_ERRNO(ECHILD,
+ wait3(NULL, o | TWAIT_OPTION, NULL) == -1);
+ }
+}
+
+ATF_TC(wait4_options);
+ATF_TC_HEAD(wait4_options, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test that wait4(2) returns ECHILD for WAIT_ANY and option %s",
+ ___STRING(TWAIT_OPTION));
+}
+
+ATF_TC_BODY(wait4_options, tc)
+{
+ size_t i = 0;
+ int o;
+
+ while((o = get_options4(i++)) != -1) {
+ printf("Testing wait4(2) with options %x\n", o);
+
+ ATF_REQUIRE_ERRNO(ECHILD,
+ wait4(WAIT_ANY, NULL, o | TWAIT_OPTION, NULL) == -1);
+ }
+}
+
+ATF_TC(wait6_options);
+ATF_TC_HEAD(wait6_options, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test that wait6(2) returns ECHILD for P_ALL and option %s",
+ ___STRING(TWAIT_OPTION));
+}
+
+ATF_TC_BODY(wait6_options, tc)
+{
+ size_t i = 0;
+ int o;
+
+ while((o = get_options6(i++)) != -1) {
+ printf("Testing wait6(2) with options %x\n", o);
+
+ ATF_REQUIRE_ERRNO(ECHILD,
+ wait6(P_ALL, 0, NULL, o | TWAIT_OPTION, NULL, NULL) == -1);
+ }
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+
+#if TWAIT_OPTION == 0
+ ATF_TP_ADD_TC(tp, wait);
+#endif
+ ATF_TP_ADD_TC(tp, waitpid);
+ ATF_TP_ADD_TC(tp, waitid);
+ ATF_TP_ADD_TC(tp, wait3);
+ ATF_TP_ADD_TC(tp, wait4);
+ ATF_TP_ADD_TC(tp, wait6);
+
+ ATF_TP_ADD_TC(tp, waitpid_options);
+ ATF_TP_ADD_TC(tp, waitid_options);
+ ATF_TP_ADD_TC(tp, wait3_options);
+ ATF_TP_ADD_TC(tp, wait4_options);
+ ATF_TP_ADD_TC(tp, wait6_options);
+
+ return atf_no_error();
+}
diff --git a/lib/libc/sys/t_wait_noproc_wnohang.c b/lib/libc/sys/t_wait_noproc_wnohang.c
new file mode 100644
index 000000000000..45a9998580f0
--- /dev/null
+++ b/lib/libc/sys/t_wait_noproc_wnohang.c
@@ -0,0 +1,30 @@
+/* $NetBSD: t_wait_noproc_wnohang.c,v 1.1 2016/11/06 15:03:30 kamil Exp $ */
+
+/*-
+ * Copyright (c) 2016 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#define TWAIT_OPTION WNOHANG
+#include "t_wait_noproc.c"
diff --git a/lib/libm/Makefile b/lib/libm/Makefile
index 77a39af2600e..f13134e58a67 100644
--- a/lib/libm/Makefile
+++ b/lib/libm/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.37 2016/01/24 20:26:47 gson Exp $
+# $NetBSD: Makefile,v 1.42 2016/12/20 06:13:19 maya Exp $
.include <bsd.own.mk>
@@ -9,11 +9,14 @@ COPTS+= -mfloat-ieee -mieee-with-inexact -mfp-trap-mode=sui -mtrap-precision=i
.endif
CPPFLAGS.t_fenv.c+= -D__TEST_FENV
+CPPFLAGS.t_fe_round.c+= -D__TEST_FENV
+CPPFLAGS.t_ilogb.c+= -D__TEST_FENV
CPPFLAGS.t_fmod.c+= -I${.CURDIR}/../libc/gen
TESTS_C+= t_acos
TESTS_C+= t_asin
TESTS_C+= t_atan
+TESTS_C+= t_casinh
TESTS_C+= t_cbrt
TESTS_C+= t_ceil
TESTS_C+= t_cos
@@ -21,8 +24,10 @@ TESTS_C+= t_cosh
TESTS_C+= t_erf
TESTS_C+= t_exp
TESTS_C+= t_fenv
+TESTS_C+= t_fe_round
TESTS_C+= t_fmod
TESTS_C+= t_hypot
+TESTS_C+= t_ilogb
TESTS_C+= t_infinity
TESTS_C+= t_ldexp
TESTS_C+= t_log
diff --git a/lib/libm/t_ldexp.c b/lib/libm/t_ldexp.c
index eaf8a4bfdb18..251f2aeba5fb 100644
--- a/lib/libm/t_ldexp.c
+++ b/lib/libm/t_ldexp.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ldexp.c,v 1.14 2014/11/04 00:20:19 justin Exp $ */
+/* $NetBSD: t_ldexp.c,v 1.16 2016/08/25 00:32:31 maya Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_ldexp.c,v 1.14 2014/11/04 00:20:19 justin Exp $");
+__RCSID("$NetBSD: t_ldexp.c,v 1.16 2016/08/25 00:32:31 maya Exp $");
#include <sys/param.h>
@@ -96,10 +96,12 @@ struct ldexp_test ldexp_overflow[] = {
{ 1.0, 1023, 1, " inf" },
{ 1.0, -1022, 2046, " inf" },
{ 1.0, 1025, SKIP, " inf" },
+ { 2.0, INT_MAX,SKIP, " inf" },
{ -1.0, 1024, SKIP, " -inf" },
{ -1.0, 1023, 1, " -inf" },
{ -1.0, -1022, 2046, " -inf" },
{ -1.0, 1025, SKIP, " -inf" },
+ { -2.0, INT_MAX,SKIP, " -inf" },
{ 0, 0, 0, NULL }
};
@@ -170,10 +172,8 @@ run_test(struct ldexp_test *table)
v = ldexp(table->x, table->exp1);
- if (table->exp2 == SKIP)
- continue;
-
- v = ldexp(v, table->exp2);
+ if (table->exp2 != SKIP)
+ v = ldexp(v, table->exp2);
(void)snprintf(outbuf, sizeof(outbuf), FORMAT, v);
diff --git a/lib/libm/t_precision.c b/lib/libm/t_precision.c
index 777666f297fb..df2d8a36e3f6 100644
--- a/lib/libm/t_precision.c
+++ b/lib/libm/t_precision.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_precision.c,v 1.2 2014/11/04 00:20:19 justin Exp $ */
+/* $NetBSD: t_precision.c,v 1.3 2016/08/27 10:07:05 christos Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_precision.c,v 1.2 2014/11/04 00:20:19 justin Exp $");
+__RCSID("$NetBSD: t_precision.c,v 1.3 2016/08/27 10:07:05 christos Exp $");
#include <atf-c.h>
@@ -45,7 +45,9 @@ ATF_TC_HEAD(t_precision, tc)
}
volatile double x = 1;
+#if __HAVE_LONG_DOUBLE
volatile long double y = 1;
+#endif
ATF_TC_BODY(t_precision, tc)
{
@@ -58,6 +60,7 @@ ATF_TC_BODY(t_precision, tc)
x += DBL_EPSILON;
ATF_CHECK(x == 2.0);
+#if __HAVE_LONG_DOUBLE
y += LDBL_EPSILON;
ATF_CHECK(y != 1.0L);
y -= 1;
@@ -65,6 +68,7 @@ ATF_TC_BODY(t_precision, tc)
y = 2;
y += LDBL_EPSILON;
ATF_CHECK(y == 2.0L);
+#endif
}
ATF_TP_ADD_TCS(tp)
diff --git a/lib/libpthread/Makefile b/lib/libpthread/Makefile
index 4f227aaa8eff..cb84bcd0a807 100644
--- a/lib/libpthread/Makefile
+++ b/lib/libpthread/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.11 2013/04/12 17:18:11 christos Exp $
+# $NetBSD: Makefile,v 1.12 2016/10/30 16:17:16 kamil Exp $
NOMAN= # defined
@@ -38,6 +38,7 @@ TESTS_C+= t_sigsuspend
TESTS_C+= t_siglongjmp
TESTS_C+= t_sleep
TESTS_C+= t_swapcontext
+TESTS_C+= t_timedmutex
LDADD.t_sem+= -lrt
diff --git a/lib/libpthread/h_common.h b/lib/libpthread/h_common.h
index f4d03bcdec9e..2e8b0a123e75 100644
--- a/lib/libpthread/h_common.h
+++ b/lib/libpthread/h_common.h
@@ -9,4 +9,10 @@
ATF_REQUIRE_MSG(ret == 0, "%s: %s", #x, strerror(ret)); \
} while (0)
+#define PTHREAD_REQUIRE_STATUS(x, v) \
+ do { \
+ int ret = (x); \
+ ATF_REQUIRE_MSG(ret == (v), "%s: %s", #x, strerror(ret)); \
+ } while (0)
+
#endif // H_COMMON_H
diff --git a/lib/libpthread/t_mutex.c b/lib/libpthread/t_mutex.c
index f2cba5e4deec..e9ba2fc5754a 100644
--- a/lib/libpthread/t_mutex.c
+++ b/lib/libpthread/t_mutex.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_mutex.c,v 1.10 2016/07/31 13:01:29 christos Exp $ */
+/* $NetBSD: t_mutex.c,v 1.14 2016/10/31 23:51:20 christos Exp $ */
/*
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -29,12 +29,13 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2008\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_mutex.c,v 1.10 2016/07/31 13:01:29 christos Exp $");
+__RCSID("$NetBSD: t_mutex.c,v 1.14 2016/10/31 23:51:20 christos Exp $");
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
+#include <time.h>
#include <unistd.h>
#include <sys/sched.h>
#include <sys/param.h>
@@ -47,6 +48,31 @@ static pthread_mutex_t mutex;
static pthread_mutex_t static_mutex = PTHREAD_MUTEX_INITIALIZER;
static int global_x;
+#ifdef TIMEDMUTEX
+/* This code is used for verifying non-timed specific code */
+static struct timespec ts_lengthy = {
+ .tv_sec = UINT16_MAX,
+ .tv_nsec = 0
+};
+/* This code is used for verifying timed-only specific code */
+static struct timespec ts_shortlived = {
+ .tv_sec = 0,
+ .tv_nsec = 120
+};
+
+static int
+mutex_lock(pthread_mutex_t *m, const struct timespec *ts)
+{
+ struct timespec ts_wait;
+ ATF_REQUIRE(clock_gettime(CLOCK_REALTIME, &ts_wait) != -1);
+ timespecadd(&ts_wait, ts, &ts_wait);
+
+ return pthread_mutex_timedlock(m, &ts_wait);
+}
+#else
+#define mutex_lock(a, b) pthread_mutex_lock(a)
+#endif
+
static void *
mutex1_threadfunc(void *arg)
{
@@ -56,7 +82,7 @@ mutex1_threadfunc(void *arg)
param = arg;
printf("2: Locking mutex\n");
- pthread_mutex_lock(&mutex);
+ mutex_lock(&mutex, &ts_lengthy);
printf("2: Got mutex. *param = %d\n", *param);
ATF_REQUIRE_EQ(*param, 20);
(*param)++;
@@ -81,7 +107,7 @@ ATF_TC_BODY(mutex1, tc)
PTHREAD_REQUIRE(pthread_mutex_init(&mutex, NULL));
x = 1;
- PTHREAD_REQUIRE(pthread_mutex_lock(&mutex));
+ PTHREAD_REQUIRE(mutex_lock(&mutex, &ts_lengthy));
PTHREAD_REQUIRE(pthread_create(&new, NULL, mutex1_threadfunc, &x));
printf("1: Before changing the value.\n");
sleep(2);
@@ -92,7 +118,7 @@ ATF_TC_BODY(mutex1, tc)
printf("1: After releasing the mutex.\n");
PTHREAD_REQUIRE(pthread_join(new, &joinval));
- PTHREAD_REQUIRE(pthread_mutex_lock(&mutex));
+ PTHREAD_REQUIRE(mutex_lock(&mutex, &ts_lengthy));
printf("1: Thread joined. X was %d. Return value (int) was %d\n",
x, *(int *)joinval);
ATF_REQUIRE_EQ(x, 21);
@@ -108,7 +134,7 @@ mutex2_threadfunc(void *arg)
printf("2: Second thread (%p). Count is %ld\n", pthread_self(), count);
while (count--) {
- PTHREAD_REQUIRE(pthread_mutex_lock(&mutex));
+ PTHREAD_REQUIRE(mutex_lock(&mutex, &ts_lengthy));
global_x++;
PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex));
}
@@ -141,7 +167,7 @@ ATF_TC_BODY(mutex2, tc)
global_x = 0;
count = count2 = 10000000;
- PTHREAD_REQUIRE(pthread_mutex_lock(&mutex));
+ PTHREAD_REQUIRE(mutex_lock(&mutex, &ts_lengthy));
PTHREAD_REQUIRE(pthread_create(&new, NULL, mutex2_threadfunc, &count2));
printf("1: Thread %p\n", pthread_self());
@@ -149,14 +175,14 @@ ATF_TC_BODY(mutex2, tc)
PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex));
while (count--) {
- PTHREAD_REQUIRE(pthread_mutex_lock(&mutex));
+ PTHREAD_REQUIRE(mutex_lock(&mutex, &ts_lengthy));
global_x++;
PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex));
}
PTHREAD_REQUIRE(pthread_join(new, &joinval));
- PTHREAD_REQUIRE(pthread_mutex_lock(&mutex));
+ PTHREAD_REQUIRE(mutex_lock(&mutex, &ts_lengthy));
printf("1: Thread joined. X was %d. Return value (long) was %ld\n",
global_x, (long)joinval);
ATF_REQUIRE_EQ(global_x, 20000000);
@@ -178,7 +204,7 @@ mutex3_threadfunc(void *arg)
printf("2: Second thread (%p). Count is %ld\n", pthread_self(), count);
while (count--) {
- PTHREAD_REQUIRE(pthread_mutex_lock(&static_mutex));
+ PTHREAD_REQUIRE(mutex_lock(&static_mutex, &ts_lengthy));
global_x++;
PTHREAD_REQUIRE(pthread_mutex_unlock(&static_mutex));
}
@@ -210,7 +236,7 @@ ATF_TC_BODY(mutex3, tc)
global_x = 0;
count = count2 = 10000000;
- PTHREAD_REQUIRE(pthread_mutex_lock(&static_mutex));
+ PTHREAD_REQUIRE(mutex_lock(&static_mutex, &ts_lengthy));
PTHREAD_REQUIRE(pthread_create(&new, NULL, mutex3_threadfunc, &count2));
printf("1: Thread %p\n", pthread_self());
@@ -218,14 +244,14 @@ ATF_TC_BODY(mutex3, tc)
PTHREAD_REQUIRE(pthread_mutex_unlock(&static_mutex));
while (count--) {
- PTHREAD_REQUIRE(pthread_mutex_lock(&static_mutex));
+ PTHREAD_REQUIRE(mutex_lock(&static_mutex, &ts_lengthy));
global_x++;
PTHREAD_REQUIRE(pthread_mutex_unlock(&static_mutex));
}
PTHREAD_REQUIRE(pthread_join(new, &joinval));
- PTHREAD_REQUIRE(pthread_mutex_lock(&static_mutex));
+ PTHREAD_REQUIRE(mutex_lock(&static_mutex, &ts_lengthy));
printf("1: Thread joined. X was %d. Return value (long) was %ld\n",
global_x, (long)joinval);
ATF_REQUIRE_EQ(global_x, 20000000);
@@ -248,7 +274,7 @@ mutex4_threadfunc(void *arg)
param = arg;
printf("2: Locking mutex\n");
- PTHREAD_REQUIRE(pthread_mutex_lock(&mutex));
+ PTHREAD_REQUIRE(mutex_lock(&mutex, &ts_lengthy));
printf("2: Got mutex. *param = %d\n", *param);
(*param)++;
@@ -279,11 +305,11 @@ ATF_TC_BODY(mutex4, tc)
PTHREAD_REQUIRE(pthread_mutexattr_destroy(&mattr));
x = 1;
- PTHREAD_REQUIRE(pthread_mutex_lock(&mutex));
+ PTHREAD_REQUIRE(mutex_lock(&mutex, &ts_lengthy));
PTHREAD_REQUIRE(pthread_create(&new, NULL, mutex4_threadfunc, &x));
printf("1: Before recursively acquiring the mutex.\n");
- PTHREAD_REQUIRE(pthread_mutex_lock(&mutex));
+ PTHREAD_REQUIRE(mutex_lock(&mutex, &ts_lengthy));
printf("1: Before releasing the mutex once.\n");
sleep(2);
@@ -299,7 +325,7 @@ ATF_TC_BODY(mutex4, tc)
PTHREAD_REQUIRE(pthread_join(new, &joinval));
- PTHREAD_REQUIRE(pthread_mutex_lock(&mutex));
+ PTHREAD_REQUIRE(mutex_lock(&mutex, &ts_lengthy));
printf("1: Thread joined. X was %d. Return value (int) was %d\n",
x, *(int *)joinval);
ATF_REQUIRE_EQ(x, 21);
@@ -320,7 +346,7 @@ child_func(void* arg)
res = _sched_protect(-2);
ATF_REQUIRE_EQ_MSG(res, -1, "sched_protect returned %d", res);
ATF_REQUIRE_EQ(errno, ENOENT);
- PTHREAD_REQUIRE(pthread_mutex_lock(&mutex5));
+ PTHREAD_REQUIRE(mutex_lock(&mutex5, &ts_lengthy));
printf("child is owning resource\n");
res = _sched_protect(-2);
ATF_REQUIRE_EQ(res, max_fifo_prio);
@@ -363,7 +389,7 @@ ATF_TC_BODY(mutex5, tc)
max_fifo_prio));
PTHREAD_REQUIRE(pthread_mutex_init(&mutex5, &attr5));
- PTHREAD_REQUIRE(pthread_mutex_lock(&mutex5));
+ PTHREAD_REQUIRE(mutex_lock(&mutex5, &ts_lengthy));
printf("enter critical section for main\n");
PTHREAD_REQUIRE(pthread_create(&child, NULL, child_func, NULL));
printf("main starts to sleep\n");
@@ -401,7 +427,7 @@ high_prio(void* arg)
high_cnt = 0;
sleep(1);
}
- PTHREAD_REQUIRE(pthread_mutex_lock(&mutex6));
+ PTHREAD_REQUIRE(mutex_lock(&mutex6, &ts_lengthy));
if (start == 0) start = 2;
PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex6));
@@ -433,7 +459,7 @@ low_prio(void* arg)
low_cnt = 0;
sleep(1);
}
- PTHREAD_REQUIRE(pthread_mutex_lock(&mutex6));
+ PTHREAD_REQUIRE(mutex_lock(&mutex6, &ts_lengthy));
if (start == 0)
start = 1;
PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex6));
@@ -551,6 +577,123 @@ ATF_TC_BODY(mutexattr2, tc)
}
}
+#ifdef TIMEDMUTEX
+ATF_TC(timedmutex1);
+ATF_TC_HEAD(timedmutex1, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "Checks timeout on selflock");
+}
+
+ATF_TC_BODY(timedmutex1, tc)
+{
+
+ printf("Timed mutex-test 1\n");
+
+ PTHREAD_REQUIRE(pthread_mutex_init(&mutex, NULL));
+
+ printf("Before acquiring mutex\n");
+ PTHREAD_REQUIRE(pthread_mutex_lock(&mutex));
+
+ printf("Before endeavor to reacquire timed-mutex (timeout expected)\n");
+ PTHREAD_REQUIRE_STATUS(mutex_lock(&mutex, &ts_shortlived),
+ ETIMEDOUT);
+
+ printf("Unlocking mutex\n");
+ PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex));
+}
+
+ATF_TC(timedmutex2);
+ATF_TC_HEAD(timedmutex2, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks timeout on selflock with timedlock");
+}
+
+ATF_TC_BODY(timedmutex2, tc)
+{
+
+ printf("Timed mutex-test 2\n");
+
+ PTHREAD_REQUIRE(pthread_mutex_init(&mutex, NULL));
+
+ printf("Before acquiring mutex with timedlock\n");
+ PTHREAD_REQUIRE(mutex_lock(&mutex, &ts_lengthy));
+
+ printf("Before endeavor to reacquire timed-mutex (timeout expected)\n");
+ PTHREAD_REQUIRE_STATUS(mutex_lock(&mutex, &ts_shortlived),
+ ETIMEDOUT);
+
+ printf("Unlocking mutex\n");
+ PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex));
+}
+
+ATF_TC(timedmutex3);
+ATF_TC_HEAD(timedmutex3, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks timeout on selflock in a new thread");
+}
+
+static void *
+timedmtx_thrdfunc(void *arg)
+{
+ printf("Before endeavor to reacquire timed-mutex (timeout expected)\n");
+ PTHREAD_REQUIRE_STATUS(mutex_lock(&mutex, &ts_shortlived),
+ ETIMEDOUT);
+
+ return NULL;
+}
+
+ATF_TC_BODY(timedmutex3, tc)
+{
+ pthread_t new;
+
+ printf("Timed mutex-test 3\n");
+
+ PTHREAD_REQUIRE(pthread_mutex_init(&mutex, NULL));
+
+ printf("Before acquiring mutex with timedlock\n");
+ PTHREAD_REQUIRE(pthread_mutex_lock(&mutex));
+
+ printf("Before creating new thread\n");
+ PTHREAD_REQUIRE(pthread_create(&new, NULL, timedmtx_thrdfunc, NULL));
+
+ printf("Before joining the mutex\n");
+ PTHREAD_REQUIRE(pthread_join(new, NULL));
+
+ printf("Unlocking mutex\n");
+ PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex));
+}
+
+ATF_TC(timedmutex4);
+ATF_TC_HEAD(timedmutex4, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks timeout on selflock with timedlock in a new thread");
+}
+
+ATF_TC_BODY(timedmutex4, tc)
+{
+ pthread_t new;
+
+ printf("Timed mutex-test 4\n");
+
+ PTHREAD_REQUIRE(pthread_mutex_init(&mutex, NULL));
+
+ printf("Before acquiring mutex with timedlock\n");
+ PTHREAD_REQUIRE(mutex_lock(&mutex, &ts_lengthy));
+
+ printf("Before creating new thread\n");
+ PTHREAD_REQUIRE(pthread_create(&new, NULL, timedmtx_thrdfunc, NULL));
+
+ printf("Before joining the mutex\n");
+ PTHREAD_REQUIRE(pthread_join(new, NULL));
+
+ printf("Unlocking mutex\n");
+ PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex));
+}
+#endif
+
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, mutex1);
@@ -561,6 +704,13 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, mutex6);
ATF_TP_ADD_TC(tp, mutexattr1);
ATF_TP_ADD_TC(tp, mutexattr2);
-
+
+#ifdef TIMEDMUTEX
+ ATF_TP_ADD_TC(tp, timedmutex1);
+ ATF_TP_ADD_TC(tp, timedmutex2);
+ ATF_TP_ADD_TC(tp, timedmutex3);
+ ATF_TP_ADD_TC(tp, timedmutex4);
+#endif
+
return atf_no_error();
}
diff --git a/lib/librumpclient/Makefile b/lib/librumpclient/Makefile
index 3cc3f437e698..9dc696d575b4 100644
--- a/lib/librumpclient/Makefile
+++ b/lib/librumpclient/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.7 2016/08/10 21:10:18 kre Exp $
+# $NetBSD: Makefile,v 1.9 2016/10/06 20:14:11 christos Exp $
#
.include <bsd.own.mk>
diff --git a/lib/librumpclient/h_execthr.c b/lib/librumpclient/h_execthr.c
index f653fe6afe0a..c209375e4b9f 100644
--- a/lib/librumpclient/h_execthr.c
+++ b/lib/librumpclient/h_execthr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: h_execthr.c,v 1.3 2014/08/13 00:03:00 pooka Exp $ */
+/* $NetBSD: h_execthr.c,v 1.7 2016/11/24 00:37:29 dholland Exp $ */
/*
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -42,6 +42,14 @@
#include <rump/rumpclient.h>
#include <rump/rump_syscalls.h>
+//#define VERBOSE
+
+#ifdef VERBOSE
+#define SAY(...) printf(__VA_ARGS__)
+#else
+#define SAY(...)
+#endif
+
static int canreturn = 0;
/*
@@ -103,6 +111,7 @@ main(int argc, char *argv[], char *envp[])
else
execd = 0;
sprintf(nexec, "%d", execd+1);
+ SAY("execd: %d\n", execd);
if (rumpclient_init() == -1) {
if (execd)
@@ -111,33 +120,43 @@ main(int argc, char *argv[], char *envp[])
err(1, "init");
}
mypid = rump_sys_getpid();
+ SAY("rumpclient_init finished.\n");
if (execd) {
canreturn = 1;
- if (pthread_create(&pt, NULL,
- wrk, (void *)(uintptr_t)P2_0) != 0)
- errx(1, "exec pthread_create");
+ errno = pthread_create(&pt, NULL,
+ wrk, (void *)(uintptr_t)P2_0);
+ if (errno != 0)
+ err(1, "exec pthread_create");
+ SAY("startup pthread_create finished.\n");
i = 37;
rump_sys_write(P2_1, &i, sizeof(i));
pthread_join(pt, NULL);
+ SAY("startup pthread_join finished.\n");
n = rump_sys_read(P1_0, &i, sizeof(i));
if (n != -1 || errno != EBADF)
errx(1, "post-exec cloexec works");
+ SAY("startup rump_sys_read finished.\n");
getproc(mypid, &p);
+ SAY("startup getproc finished.\n");
if (p.p_nlwps != 2)
errx(1, "invalid nlwps: %lld", (long long)p.p_nlwps);
/* we passed? */
- if (execd > 10)
+ if (execd > 10) {
+ SAY("done.\n");
exit(0);
+ }
rump_sys_close(P2_0);
rump_sys_close(P2_1);
}
+ SAY("making pipes...\n");
+
if (rump_sys_pipe(p1) == -1)
err(1, "pipe1");
if (p1[0] != P1_0 || p1[1] != P1_1)
@@ -151,32 +170,47 @@ main(int argc, char *argv[], char *envp[])
if (rump_sys_fcntl(p1[1], F_SETFD, FD_CLOEXEC) == -1)
err(1, "cloexec");
- for (i = 0; i < NTHR; i++)
- if (pthread_create(&pt, NULL,
- wrk, (void *)(uintptr_t)p1[0]) != 0)
- errx(1, "pthread_create 1 %d", i);
+ SAY("making threads...\n");
+
+ for (i = 0; i < NTHR; i++) {
+ errno = pthread_create(&pt, NULL,
+ wrk, (void *)(uintptr_t)p1[0]);
+ if (errno != 0)
+ err(1, "pthread_create 1 %d", i);
+ }
+
+ for (i = 0; i < NTHR; i++) {
+ errno = pthread_create(&pt, NULL,
+ wrk, (void *)(uintptr_t)p2[0]);
+ if (errno != 0)
+ err(1, "pthread_create 2 %d", i);
+ }
- for (i = 0; i < NTHR; i++)
- if (pthread_create(&pt, NULL,
- wrk, (void *)(uintptr_t)p2[0]) != 0)
- errx(1, "pthread_create 2 %d", i);
+ SAY("waiting for threads to start...\n");
/* wait for all the threads to be enjoying themselves */
for (;;) {
getproc(mypid, &p);
+ SAY("getproc finished.\n");
if (p.p_nlwps == 2*NTHR + 2)
break;
usleep(10000);
}
+ SAY("making some more threads start...\n");
+
/*
* load up one more (big) set. these won't start executing, though,
* but we're interested in if they create blockage
*/
- for (i = 0; i < 3*NTHR; i++)
- if (pthread_create(&pt, NULL,
- wrk, (void *)(uintptr_t)p1[0]) != 0)
- errx(1, "pthread_create 1 %d", i);
+ for (i = 0; i < 3*NTHR; i++) {
+ errno = pthread_create(&pt, NULL,
+ wrk, (void *)(uintptr_t)p1[0]);
+ if (errno != 0)
+ err(1, "pthread_create 3 %d", i);
+ }
+
+ SAY("calling exec...\n");
/* then, we exec! */
execarg[0] = argv[0];
diff --git a/lib/librumphijack/t_tcpip.sh b/lib/librumphijack/t_tcpip.sh
index 718dfdc1de4c..411be3340bbc 100755
--- a/lib/librumphijack/t_tcpip.sh
+++ b/lib/librumphijack/t_tcpip.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_tcpip.sh,v 1.17 2016/08/11 21:29:44 kre Exp $
+# $NetBSD: t_tcpip.sh,v 1.18 2016/08/13 11:22:11 christos Exp $
#
# Copyright (c) 2011 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -25,7 +25,8 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-rumpnetsrv='rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpdev'
+rumpnetlibs="-lrumpnet -lrumpnet_net -lrumpnet_netinet6 -lrumpnet_netinet"
+rumpnetsrv="rump_server $rumpnetlibs -lrumpdev"
export RUMP_SERVER=unix://csock
atf_test_case http cleanup
@@ -37,7 +38,7 @@ http_head()
http_body()
{
- atf_check -s exit:0 ${rumpnetsrv} -lrumpnet_netinet6 ${RUMP_SERVER}
+ atf_check -s exit:0 ${rumpnetsrv} ${RUMP_SERVER}
# start bozo in daemon mode
atf_check -s exit:0 env LD_PRELOAD=/usr/lib/librumphijack.so \
diff --git a/lib/libusbhid/t_usbhid.c b/lib/libusbhid/t_usbhid.c
index f20652a926f1..2766da234f1a 100644
--- a/lib/libusbhid/t_usbhid.c
+++ b/lib/libusbhid/t_usbhid.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_usbhid.c,v 1.11 2016/01/07 16:10:49 jakllsch Exp $ */
+/* $NetBSD: t_usbhid.c,v 1.12 2016/08/17 12:10:42 jakllsch Exp $ */
/*
* Copyright (c) 2016 Jonathan A. Kollasch
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_usbhid.c,v 1.11 2016/01/07 16:10:49 jakllsch Exp $");
+__RCSID("$NetBSD: t_usbhid.c,v 1.12 2016/08/17 12:10:42 jakllsch Exp $");
#include <atf-c.h>
@@ -244,6 +244,9 @@ ATF_TC_BODY(check_hid_get_data, tc)
int32_t data;
uint32_t udat;
+ atf_tc_expect_fail("only the 32-bit opcode works, "
+ "8 and 16-bit is broken");
+
ATF_REQUIRE((hrd = hid_use_report_desc(
range_test_report_descriptor,
__arraycount(range_test_report_descriptor))) != NULL);
diff --git a/net/Makefile b/net/Makefile
index 6f6ad298ed2b..8268e4b29bfa 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.28 2016/04/15 01:38:17 ozaki-r Exp $
+# $NetBSD: Makefile,v 1.30 2016/11/26 03:19:48 ozaki-r Exp $
.include <bsd.own.mk>
@@ -7,7 +7,7 @@ TESTSDIR= ${TESTSBASE}/net
TESTS_SUBDIRS= fdpass in_cksum net sys
.if (${MKRUMP} != "no") && !defined(BSD_MK_COMPAT_FILE)
TESTS_SUBDIRS+= arp bpf bpfilter carp icmp if if_bridge if_gif if_loop
-TESTS_SUBDIRS+= if_pppoe if_tap mcast mpls ndp npf route
+TESTS_SUBDIRS+= if_pppoe if_tap if_tun mcast mpls ndp npf route if_vlan
.if (${MKSLJIT} != "no")
TESTS_SUBDIRS+= bpfjit
.endif
diff --git a/net/arp/Makefile b/net/arp/Makefile
index fc11e5af6fbe..98d80dd7054c 100644
--- a/net/arp/Makefile
+++ b/net/arp/Makefile
@@ -1,11 +1,13 @@
-# $NetBSD: Makefile,v 1.3 2015/07/30 05:43:42 ozaki-r Exp $
+# $NetBSD: Makefile,v 1.4 2016/11/24 08:52:19 ozaki-r Exp $
#
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/net/arp
-TESTS_SH= t_arp
-TESTS_SH+= t_dad
+.for name in arp dad
+TESTS_SH+= t_${name}
+TESTS_SH_SRC_t_${name}= ../net_common.sh t_${name}.sh
+.endfor
.include <bsd.test.mk>
diff --git a/net/arp/t_arp.sh b/net/arp/t_arp.sh
index ab55eb326ed0..04e2f70375c2 100755
--- a/net/arp/t_arp.sh
+++ b/net/arp/t_arp.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_arp.sh,v 1.16 2016/06/21 05:04:16 ozaki-r Exp $
+# $NetBSD: t_arp.sh,v 1.22 2016/11/25 08:51:16 ozaki-r Exp $
#
# Copyright (c) 2015 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -25,10 +25,6 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-inetserver="rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_shmif"
-inetserver="$inetserver -lrumpdev -lrumpnet_tap"
-HIJACKING="env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=sysctl=yes"
-
SOCKSRC=unix://commsock1
SOCKDST=unix://commsock2
IP4SRC=10.0.1.1
@@ -36,7 +32,7 @@ IP4DST=10.0.1.2
IP4DST_PROXYARP1=10.0.1.3
IP4DST_PROXYARP2=10.0.1.4
-DEBUG=false
+DEBUG=${DEBUG:-false}
TIMEOUT=1
atf_test_case arp_cache_expiration_5s cleanup
@@ -106,9 +102,9 @@ arp_static_head()
setup_dst_server()
{
+
+ rump_server_add_iface $SOCKDST shmif0 bus1
export RUMP_SERVER=$SOCKDST
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1
atf_check -s exit:0 rump.ifconfig shmif0 inet $IP4DST/24
atf_check -s exit:0 rump.ifconfig shmif0 up
atf_check -s exit:0 rump.ifconfig -w 10
@@ -127,8 +123,7 @@ setup_src_server()
atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.arp.keep=$keep
# Setup an interface
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1
+ rump_server_add_iface $SOCKSRC shmif0 bus1
atf_check -s exit:0 rump.ifconfig shmif0 inet $IP4SRC/24
atf_check -s exit:0 rump.ifconfig shmif0 up
atf_check -s exit:0 rump.ifconfig -w 10
@@ -145,8 +140,8 @@ test_cache_expiration()
local arp_keep=$1
local bonus=2
- atf_check -s exit:0 ${inetserver} $SOCKSRC
- atf_check -s exit:0 ${inetserver} $SOCKDST
+ rump_server_start $SOCKSRC
+ rump_server_start $SOCKDST
setup_dst_server
setup_src_server $arp_keep
@@ -172,12 +167,16 @@ test_cache_expiration()
arp_cache_expiration_5s_body()
{
+
test_cache_expiration 5
+ rump_server_destroy_ifaces
}
arp_cache_expiration_10s_body()
{
+
test_cache_expiration 10
+ rump_server_destroy_ifaces
}
arp_command_body()
@@ -185,8 +184,8 @@ arp_command_body()
local arp_keep=5
local bonus=2
- atf_check -s exit:0 ${inetserver} $SOCKSRC
- atf_check -s exit:0 ${inetserver} $SOCKDST
+ rump_server_start $SOCKSRC
+ rump_server_start $SOCKDST
setup_dst_server
setup_src_server $arp_keep
@@ -257,7 +256,7 @@ arp_command_body()
$DEBUG && rump.arp -n -a
#atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.10
- return 0
+ rump_server_destroy_ifaces
}
make_pkt_str_arpreq()
@@ -273,12 +272,12 @@ arp_garp_body()
{
local pkt=
- atf_check -s exit:0 ${inetserver} $SOCKSRC
+ rump_server_start $SOCKSRC
+
export RUMP_SERVER=$SOCKSRC
# Setup an interface
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1
+ rump_server_add_iface $SOCKSRC shmif0 bus1
atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.1/24
atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.2/24 alias
atf_check -s exit:0 rump.ifconfig shmif0 up
@@ -304,6 +303,8 @@ arp_garp_body()
atf_check -s not-exit:0 -x "cat ./out |grep -q '$pkt'"
pkt=$(make_pkt_str_arpreq 10.0.0.4 10.0.0.4)
atf_check -s not-exit:0 -x "cat ./out |grep -q '$pkt'"
+
+ rump_server_destroy_ifaces
}
arp_cache_overwriting_body()
@@ -311,8 +312,8 @@ arp_cache_overwriting_body()
local arp_keep=5
local bonus=2
- atf_check -s exit:0 ${inetserver} $SOCKSRC
- atf_check -s exit:0 ${inetserver} $SOCKDST
+ rump_server_start $SOCKSRC
+ rump_server_start $SOCKDST
setup_dst_server
setup_src_server $arp_keep
@@ -341,7 +342,7 @@ arp_cache_overwriting_body()
atf_check -s exit:0 -o match:'b2:a0:20:00:00:ff' rump.arp -n 10.0.1.10
$DEBUG && rump.arp -n -a
- return 0
+ rump_server_destroy_ifaces
}
make_pkt_str_arprep()
@@ -363,36 +364,21 @@ make_pkt_str_garp()
echo $pkt
}
-extract_new_packets()
-{
- local old=./old
-
- if [ ! -f $old ]; then
- old=/dev/null
- fi
-
- shmif_dumpbus -p - bus1 2>/dev/null| \
- tcpdump -n -e -r - 2>/dev/null > ./new
- diff -u $old ./new |grep '^+' |cut -d '+' -f 2 > ./diff
- mv -f ./new ./old
- cat ./diff
-}
-
test_proxy_arp()
{
local arp_keep=5
local opts= title= flags=
local type=$1
- atf_check -s exit:0 ${inetserver} $SOCKSRC
- atf_check -s exit:0 ${inetserver} $SOCKDST
+ rump_server_start $SOCKSRC
+ rump_server_start $SOCKDST tap
setup_dst_server
setup_src_server $arp_keep
export RUMP_SERVER=$SOCKDST
atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.forwarding=1
- macaddr_dst=$(rump.ifconfig shmif0 |awk '/address/ {print $2;}')
+ macaddr_dst=$(get_macaddr $SOCKDST shmif0)
if [ "$type" = "pub" ]; then
opts="pub"
@@ -416,7 +402,7 @@ test_proxy_arp()
rump.ping -n -w 1 -c 1 $IP4DST_PROXYARP1
# Flushing
- extract_new_packets > ./out
+ extract_new_packets bus1 > ./out
# Set up proxy ARP entry
export RUMP_SERVER=$SOCKDST
@@ -435,7 +421,7 @@ test_proxy_arp()
rump.ping -n -w 1 -c 1 $IP4DST_PROXYARP1
fi
- extract_new_packets > ./out
+ extract_new_packets bus1 > ./out
$DEBUG && cat ./out
pkt1=$(make_pkt_str_arprep $IP4DST_PROXYARP1 $macaddr_dst)
@@ -461,7 +447,7 @@ test_proxy_arp()
atf_check -s not-exit:0 -o ignore -e ignore \
rump.ping -n -w 1 -c 1 $IP4DST_PROXYARP2
- extract_new_packets > ./out
+ extract_new_packets bus1 > ./out
$DEBUG && cat ./out
# ARP reply should be sent
@@ -482,12 +468,14 @@ arp_proxy_arp_pub_body()
{
test_proxy_arp pub
+ rump_server_destroy_ifaces
}
arp_proxy_arp_pubproxy_body()
{
test_proxy_arp pubproxy
+ rump_server_destroy_ifaces
}
arp_link_activation_body()
@@ -495,14 +483,14 @@ arp_link_activation_body()
local arp_keep=5
local bonus=2
- atf_check -s exit:0 ${inetserver} $SOCKSRC
- atf_check -s exit:0 ${inetserver} $SOCKDST
+ rump_server_start $SOCKSRC
+ rump_server_start $SOCKDST
setup_dst_server
setup_src_server $arp_keep
# flush old packets
- extract_new_packets > ./out
+ extract_new_packets bus1 > ./out
export RUMP_SERVER=$SOCKSRC
@@ -510,7 +498,7 @@ arp_link_activation_body()
b2:a1:00:00:00:01
atf_check -s exit:0 sleep 1
- extract_new_packets > ./out
+ extract_new_packets bus1 > ./out
$DEBUG && cat ./out
pkt=$(make_pkt_str_arpreq $IP4SRC $IP4SRC)
@@ -520,12 +508,14 @@ arp_link_activation_body()
b2:a1:00:00:00:02 active
atf_check -s exit:0 sleep 1
- extract_new_packets > ./out
+ extract_new_packets bus1 > ./out
$DEBUG && cat ./out
pkt=$(make_pkt_str_arpreq $IP4SRC $IP4SRC)
atf_check -s exit:0 -x \
"cat ./out |grep '$pkt' |grep -q 'b2:a1:00:00:00:02'"
+
+ rump_server_destroy_ifaces
}
arp_static_body()
@@ -533,14 +523,13 @@ arp_static_body()
local arp_keep=5
local macaddr_src=
- atf_check -s exit:0 ${inetserver} $SOCKSRC
- atf_check -s exit:0 ${inetserver} $SOCKDST
+ rump_server_start $SOCKSRC
+ rump_server_start $SOCKDST
setup_dst_server
setup_src_server $arp_keep
- export RUMP_SERVER=$SOCKSRC
- macaddr_src=$(rump.ifconfig shmif0 |awk '/address/ {print $2;}')
+ macaddr_src=$(get_macaddr $SOCKSRC shmif0)
# Set a (valid) static ARP entry for the src server
export RUMP_SERVER=$SOCKDST
@@ -551,37 +540,8 @@ arp_static_body()
# Test receiving an ARP request with the static ARP entry (as spa/sha)
export RUMP_SERVER=$SOCKSRC
atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST
-}
-cleanup()
-{
- env RUMP_SERVER=$SOCKSRC rump.halt
- env RUMP_SERVER=$SOCKDST rump.halt
-}
-
-dump_src()
-{
- export RUMP_SERVER=$SOCKSRC
- rump.netstat -nr
- rump.arp -n -a
- rump.ifconfig
- $HIJACKING dmesg
-}
-
-dump_dst()
-{
- export RUMP_SERVER=$SOCKDST
- rump.netstat -nr
- rump.arp -n -a
- rump.ifconfig
- $HIJACKING dmesg
-}
-
-dump()
-{
- dump_src
- dump_dst
- shmif_dumpbus -p - bus1 2>/dev/null| tcpdump -n -e -r -
+ rump_server_destroy_ifaces
}
arp_cache_expiration_5s_cleanup()
@@ -604,9 +564,8 @@ arp_command_cleanup()
arp_garp_cleanup()
{
- $DEBUG && dump_src
- $DEBUG && shmif_dumpbus -p - bus1 2>/dev/null| tcpdump -n -e -r -
- env RUMP_SERVER=$SOCKSRC rump.halt
+ $DEBUG && dump
+ cleanup
}
arp_cache_overwriting_cleanup()
diff --git a/net/arp/t_dad.sh b/net/arp/t_dad.sh
index aefcb0befa45..57a7d4b0ecc4 100755
--- a/net/arp/t_dad.sh
+++ b/net/arp/t_dad.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_dad.sh,v 1.7 2016/08/10 22:05:07 kre Exp $
+# $NetBSD: t_dad.sh,v 1.13 2016/11/25 08:51:16 ozaki-r Exp $
#
# Copyright (c) 2015 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -25,14 +25,10 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-inetserver="rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_shmif"
-inetserver="${inetserver} -lrumpdev"
-HIJACKING="env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=sysctl=yes"
-
SOCKLOCAL=unix://commsock1
SOCKPEER=unix://commsock2
-DEBUG=false
+DEBUG=${DEBUG:-false}
atf_test_case dad_basic cleanup
atf_test_case dad_duplicated cleanup
@@ -54,10 +50,9 @@ setup_server()
local sock=$1
local ip=$2
- export RUMP_SERVER=$sock
+ rump_server_add_iface $sock shmif0 bus1
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1
+ export RUMP_SERVER=$sock
atf_check -s exit:0 rump.ifconfig shmif0 inet $ip/24
atf_check -s exit:0 rump.ifconfig shmif0 up
atf_check -s exit:0 rump.ifconfig -w 10
@@ -74,30 +69,15 @@ make_pkt_str()
echo $pkt
}
-extract_new_packets()
-{
- local old=./old
-
- if [ ! -f $old ]; then
- old=/dev/null
- fi
-
- shmif_dumpbus -p - bus1 2>/dev/null| \
- tcpdump -n -e -r - 2>/dev/null > ./new
- diff -u $old ./new |grep '^+' |cut -d '+' -f 2 > ./diff
- mv -f ./new ./old
- cat ./diff
-}
-
dad_basic_body()
{
local pkt=
- atf_check -s exit:0 ${inetserver} $SOCKLOCAL
+ rump_server_start $SOCKLOCAL
+ rump_server_add_iface $SOCKLOCAL shmif0 bus1
+
export RUMP_SERVER=$SOCKLOCAL
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1
atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.1/24
atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.2/24 alias
$DEBUG && rump.ifconfig shmif0
@@ -107,13 +87,13 @@ dad_basic_body()
$DEBUG && cat ./out
# The primary address doesn't start with tentative state
- atf_check -s not-exit:0 -x "cat ./out |grep 10.0.0.1 |grep -q tentative"
+ atf_check -s not-exit:0 -x "cat ./out |grep 10.0.0.1 |grep -iq tentative"
# The alias address starts with tentative state
# XXX we have no stable way to check this, so skip for now
- #atf_check -s exit:0 -x "cat ./out |grep 10.0.0.2 |grep -q tentative"
+ #atf_check -s exit:0 -x "cat ./out |grep 10.0.0.2 |grep -iq tentative"
atf_check -s exit:0 sleep 2
- extract_new_packets > ./out
+ extract_new_packets bus1 > ./out
$DEBUG && cat ./out
# Check DAD probe packets
@@ -127,14 +107,14 @@ dad_basic_body()
atf_check -s exit:0 rump.ifconfig -w 10
# Give a chance to send a DAD announce packet
atf_check -s exit:0 sleep 1
- extract_new_packets > ./out
+ extract_new_packets bus1 > ./out
$DEBUG && cat ./out
# Check the DAD announce packet
pkt=$(make_pkt_str 10.0.0.2 10.0.0.2)
atf_check -s exit:0 -x "cat ./out |grep -q '$pkt'"
# The alias address left tentative
- atf_check -s not-exit:0 -x "rump.ifconfig shmif0 |grep 10.0.0.2 |grep -q tentative"
+ atf_check -s not-exit:0 -x "rump.ifconfig shmif0 |grep 10.0.0.2 |grep -iq tentative"
#
# Add a new address on the fly
@@ -143,11 +123,11 @@ dad_basic_body()
# The new address starts with tentative state
# XXX we have no stable way to check this, so skip for now
- #atf_check -s exit:0 -x "rump.ifconfig shmif0 |grep 10.0.0.3 |grep -q tentative"
+ #atf_check -s exit:0 -x "rump.ifconfig shmif0 |grep 10.0.0.3 |grep -iq tentative"
# Check DAD probe packets
atf_check -s exit:0 sleep 2
- extract_new_packets > ./out
+ extract_new_packets bus1 > ./out
$DEBUG && cat ./out
pkt=$(make_pkt_str 10.0.0.3 0.0.0.0)
atf_check -s exit:0 -x "cat ./out |grep -q '$pkt'"
@@ -156,14 +136,16 @@ dad_basic_body()
atf_check -s exit:0 rump.ifconfig -w 10
# Give a chance to send a DAD announce packet
atf_check -s exit:0 sleep 1
- extract_new_packets > ./out
+ extract_new_packets bus1 > ./out
$DEBUG && cat ./out
# Check the DAD announce packet
pkt=$(make_pkt_str 10.0.0.3 10.0.0.3)
atf_check -s exit:0 -x "cat ./out |grep -q '$pkt'"
# The new address left tentative
- atf_check -s not-exit:0 -x "rump.ifconfig shmif0 |grep 10.0.0.3 |grep -q tentative"
+ atf_check -s not-exit:0 -x "rump.ifconfig shmif0 |grep 10.0.0.3 |grep -iq tentative"
+
+ rump_server_destroy_ifaces
}
dad_duplicated_body()
@@ -172,8 +154,8 @@ dad_duplicated_body()
local localip2=10.0.1.11
local peerip=10.0.1.2
- atf_check -s exit:0 ${inetserver} $SOCKLOCAL
- atf_check -s exit:0 ${inetserver} $SOCKPEER
+ rump_server_start $SOCKLOCAL
+ rump_server_start $SOCKPEER
setup_server $SOCKLOCAL $localip1
setup_server $SOCKPEER $peerip
@@ -181,7 +163,7 @@ dad_duplicated_body()
export RUMP_SERVER=$SOCKLOCAL
# The primary address isn't marked as duplicated
- atf_check -s not-exit:0 -x "rump.ifconfig shmif0 |grep $localip1 |grep -q duplicated"
+ atf_check -s not-exit:0 -x "rump.ifconfig shmif0 |grep $localip1 |grep -iq duplicated"
#
# Add a new address duplicated with the peer server
@@ -190,50 +172,20 @@ dad_duplicated_body()
atf_check -s exit:0 sleep 1
# The new address is marked as duplicated
- atf_check -s exit:0 -x "rump.ifconfig shmif0 |grep $peerip |grep -q duplicated"
+ atf_check -s exit:0 -x "rump.ifconfig shmif0 |grep $peerip |grep -iq duplicated"
# A unique address isn't marked as duplicated
atf_check -s exit:0 rump.ifconfig shmif0 inet $localip2 alias
atf_check -s exit:0 sleep 1
- atf_check -s not-exit:0 -x "rump.ifconfig shmif0 |grep $localip2 |grep -q duplicated"
-}
-
-cleanup()
-{
- env RUMP_SERVER=$SOCKLOCAL rump.halt
- env RUMP_SERVER=$SOCKPEER rump.halt
-}
-
-dump_local()
-{
- export RUMP_SERVER=$SOCKLOCAL
- rump.netstat -nr
- rump.arp -n -a
- rump.ifconfig
- $HIJACKING dmesg
-}
+ atf_check -s not-exit:0 -x "rump.ifconfig shmif0 |grep $localip2 |grep -iq duplicated"
-dump_peer()
-{
- export RUMP_SERVER=$SOCKPEER
- rump.netstat -nr
- rump.arp -n -a
- rump.ifconfig
- $HIJACKING dmesg
-}
-
-dump()
-{
- dump_local
- dump_peer
- shmif_dumpbus -p - bus1 2>/dev/null| tcpdump -n -e -r -
+ rump_server_destroy_ifaces
}
dad_basic_cleanup()
{
- $DEBUG && dump_local
- $DEBUG && shmif_dumpbus -p - bus1 2>/dev/null| tcpdump -n -e -r -
- env RUMP_SERVER=$SOCKLOCAL rump.halt
+ $DEBUG && dump
+ cleanup
}
dad_duplicated_cleanup()
diff --git a/net/icmp/Makefile b/net/icmp/Makefile
index b419c8d91967..18d42f8e57e5 100644
--- a/net/icmp/Makefile
+++ b/net/icmp/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.8 2016/08/08 14:49:35 pgoyette Exp $
+# $NetBSD: Makefile,v 1.9 2016/11/24 09:06:09 ozaki-r Exp $
#
.include <bsd.own.mk>
@@ -8,7 +8,10 @@ TESTSDIR= ${TESTSBASE}/net/icmp
TESTS_C= t_forward
TESTS_C+= t_ping
-TESTS_SH= t_ping2 t_icmp_redirect t_icmp6_redirect
+.for name in ping2 icmp_redirect icmp6_redirect
+TESTS_SH+= t_${name}
+TESTS_SH_SRC_t_${name}= ../net_common.sh t_${name}.sh
+.endfor
LDADD+= -lrumpnet_shmif -lrumpnet_netinet -lrumpnet_net -lrumpnet
LDADD+= -lrump -lrumpuser -lrump -lpthread -lrumpdev -lrumpvfs
diff --git a/net/icmp/t_icmp6_redirect.sh b/net/icmp/t_icmp6_redirect.sh
index c12017d5b090..5dcdc9cda03e 100755
--- a/net/icmp/t_icmp6_redirect.sh
+++ b/net/icmp/t_icmp6_redirect.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_icmp6_redirect.sh,v 1.2 2016/08/10 22:17:44 kre Exp $
+# $NetBSD: t_icmp6_redirect.sh,v 1.7 2016/11/25 08:51:16 ozaki-r Exp $
#
# Copyright (c) 2015 Internet Initiative Japan Inc.
# All rights reserved.
@@ -24,8 +24,6 @@
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
-netserver="rump_server -lrumpnet -lrumpnet_net -lrumpnet_shmif"
-netserver="${netserver} -lrumpnet_netinet -lrumpnet_netinet6 -lrumpdev"
SOCK_LOCAL=unix://commsock1
SOCK_PEER=unix://commsock2
@@ -44,50 +42,38 @@ IP6IF0_GW2=fc00:1::3
REDIRECT_TIMEOUT=5
-DEBUG=true
+DEBUG=${DEBUG:-true}
-get_lladdr()
-{
-
- export RUMP_SERVER=${1}
- rump.ifconfig ${2} inet6 | awk "/fe80/ {sub(/%$2/, \"\"); print \$2;}"
- unset RUMP_SERVER
-
- return 0
-}
+atf_test_case icmp6_redirect_basic cleanup
-atf_test_case basic cleanup
-
-basic_head()
+icmp6_redirect_basic_head()
{
atf_set "descr" "Test for the basically function of the ICMP6 redirect"
atf_set "require.progs" "rump_server rump.route rump.ping rump.ifconfig"
}
-basic_body()
+icmp6_redirect_basic_body()
{
local gw1_lladdr0=
local gw1_lladdr1=
local gw2_lladdr0=
- atf_check -s exit:0 ${netserver} ${SOCK_LOCAL}
- atf_check -s exit:0 ${netserver} ${SOCK_PEER}
- atf_check -s exit:0 ${netserver} ${SOCK_GW1}
- atf_check -s exit:0 ${netserver} ${SOCK_GW2}
+ rump_server_start $SOCK_LOCAL netinet6
+ rump_server_start $SOCK_PEER netinet6
+ rump_server_start $SOCK_GW1 netinet6
+ rump_server_start $SOCK_GW2 netinet6
#
# Setup
#
# Setup gateway #1 (real gateway)
export RUMP_SERVER=${SOCK_GW1}
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr ${BUS1}
+ rump_server_add_iface $SOCK_GW1 shmif0 $BUS1
+ rump_server_add_iface $SOCK_GW1 shmif1 $BUS2
+
atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6IF0_GW1}
atf_check -s exit:0 rump.ifconfig shmif0 up
-
- atf_check -s exit:0 rump.ifconfig shmif1 create
- atf_check -s exit:0 rump.ifconfig shmif1 linkstr ${BUS2}
atf_check -s exit:0 rump.ifconfig shmif1 inet6 ${IP6IF1_GW1}
atf_check -s exit:0 rump.ifconfig shmif1 up
@@ -95,13 +81,12 @@ basic_body()
net.inet6.ip6.forwarding=1
unset RUMP_SERVER
- gw1_lladdr0=`get_lladdr ${SOCK_GW1} shmif0`
- gw1_lladdr1=`get_lladdr ${SOCK_GW1} shmif1`
+ gw1_lladdr0=`get_linklocal_addr ${SOCK_GW1} shmif0`
+ gw1_lladdr1=`get_linklocal_addr ${SOCK_GW1} shmif1`
# Setup a peer behind gateway #1
export RUMP_SERVER=${SOCK_PEER}
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr ${BUS2}
+ rump_server_add_iface $SOCK_PEER shmif0 $BUS2
atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6IF0_PEER}
atf_check -s exit:0 rump.ifconfig shmif0 up
atf_check -s exit:0 -o ignore rump.route add \
@@ -110,8 +95,7 @@ basic_body()
# Setup gateway #2 (fake gateway)
export RUMP_SERVER=${SOCK_GW2}
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr ${BUS1}
+ rump_server_add_iface $SOCK_GW2 shmif0 $BUS1
atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6IF0_GW2}
atf_check -s exit:0 rump.ifconfig shmif0 up
@@ -121,11 +105,10 @@ basic_body()
net.inet6.ip6.forwarding=1
unset RUMP_SERVER
- gw2_lladdr0=`get_lladdr ${SOCK_GW2} shmif0`
+ gw2_lladdr0=`get_linklocal_addr ${SOCK_GW2} shmif0`
export RUMP_SERVER=${SOCK_LOCAL}
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr ${BUS1}
+ rump_server_add_iface $SOCK_LOCAL shmif0 $BUS1
atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6IF0_LOCAL}
atf_check -s exit:0 rump.ifconfig shmif0 up
@@ -152,20 +135,18 @@ basic_body()
atf_check -s exit:0 -o not-match:"gateway: ${gw1_lladdr0}" rump.route get \
-inet6 ${IP6IF0_PEER}
- unset RUMP_SERVER
+ rump_server_destroy_ifaces
}
-basic_cleanup()
+icmp6_redirect_basic_cleanup()
{
- env RUMP_SERVER=$SOCK_LOCAL rump.halt
- env RUMP_SERVER=$SOCK_PEER rump.halt
- env RUMP_SERVER=$SOCK_GW1 rump.halt
- env RUMP_SERVER=$SOCK_GW2 rump.halt
+ $DEBUG && dump
+ cleanup
}
atf_init_test_cases()
{
- atf_add_test_case basic
+ atf_add_test_case icmp6_redirect_basic
}
diff --git a/net/icmp/t_icmp_redirect.sh b/net/icmp/t_icmp_redirect.sh
index 730f2d28a11f..669721649365 100755
--- a/net/icmp/t_icmp_redirect.sh
+++ b/net/icmp/t_icmp_redirect.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_icmp_redirect.sh,v 1.3 2016/08/10 22:17:44 kre Exp $
+# $NetBSD: t_icmp_redirect.sh,v 1.6 2016/11/25 08:51:16 ozaki-r Exp $
#
# Copyright (c) 2015 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -27,8 +27,6 @@
# Most codes are derived from tests/net/route/t_flags.sh
-netserver=\
-"rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_shmif -lrumpdev"
SOCK_LOCAL=unix://commsock1
SOCK_PEER=unix://commsock2
SOCK_GW=unix://commsock3
@@ -36,7 +34,7 @@ BUS=bus1
BUS2=bus2
REDIRECT_TIMEOUT=5
-DEBUG=false
+DEBUG=${DEBUG:-false}
atf_test_case icmp_redirect_timeout cleanup
@@ -50,11 +48,10 @@ icmp_redirect_timeout_head()
setup_local()
{
- atf_check -s exit:0 ${netserver} ${SOCK_LOCAL}
+ rump_server_start $SOCK_LOCAL
+ rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
export RUMP_SERVER=$SOCK_LOCAL
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 create
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 linkstr ${BUS}
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 10.0.0.2/24
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
@@ -68,11 +65,10 @@ setup_local()
setup_peer()
{
- atf_check -s exit:0 ${netserver} ${SOCK_PEER}
+ rump_server_start $SOCK_PEER
+ rump_server_add_iface $SOCK_PEER shmif0 $BUS
export RUMP_SERVER=$SOCK_PEER
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 create
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 linkstr ${BUS}
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 10.0.0.1/24
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
@@ -83,16 +79,14 @@ setup_peer()
setup_gw()
{
- atf_check -s exit:0 ${netserver} ${SOCK_GW}
+ rump_server_start $SOCK_GW
+ rump_server_add_iface $SOCK_GW shmif0 $BUS
+ rump_server_add_iface $SOCK_GW shmif1 $BUS2
export RUMP_SERVER=$SOCK_GW
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 create
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 linkstr ${BUS}
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 10.0.0.254/24
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
- atf_check -s exit:0 -o ignore rump.ifconfig shmif1 create
- atf_check -s exit:0 -o ignore rump.ifconfig shmif1 linkstr ${BUS2}
atf_check -s exit:0 -o ignore rump.ifconfig shmif1 10.0.2.1/24
atf_check -s exit:0 -o ignore rump.ifconfig shmif1 alias 10.0.2.2/24
atf_check -s exit:0 -o ignore rump.ifconfig shmif1 up
@@ -105,39 +99,6 @@ setup_gw()
$DEBUG && rump.netstat -rn -f inet
}
-teardown_gw()
-{
-
- env RUMP_SERVER=$SOCK_GW rump.halt
-}
-
-check_entry_flags()
-{
- local ip=$(echo $1 |sed 's/\./\\./g')
- local flags=$2
-
- atf_check -s exit:0 -o match:" $flags " -e ignore -x \
- "rump.netstat -rn -f inet | grep ^'$ip'"
-}
-
-check_entry_gw()
-{
- local ip=$(echo $1 |sed 's/\./\\./g')
- local gw=$2
-
- atf_check -s exit:0 -o match:" $gw " -e ignore -x \
- "rump.netstat -rn -f inet | grep ^'$ip'"
-}
-
-check_entry_fail()
-{
- local ip=$(echo $1 |sed 's/\./\\./g')
- local flags=$2 # Not used currently
-
- atf_check -s not-exit:0 -e ignore -x \
- "rump.netstat -rn -f inet | grep ^'$ip'"
-}
-
icmp_redirect_timeout_body()
{
@@ -159,7 +120,7 @@ icmp_redirect_timeout_body()
export RUMP_SERVER=$SOCK_PEER
atf_check -s exit:0 -o ignore rump.route add -net 10.0.2.0/24 10.0.0.254
# Up, Gateway, Static
- check_entry_flags 10.0.2/24 UGS
+ check_route_flags 10.0.2/24 UGS
#
# Setup the default gateway to the peer, 10.0.0.1
@@ -167,39 +128,25 @@ icmp_redirect_timeout_body()
export RUMP_SERVER=$SOCK_LOCAL
atf_check -s exit:0 -o ignore rump.route add default 10.0.0.1
# Up, Gateway, Static
- check_entry_flags default UGS
+ check_route_flags default UGS
# Try ping 10.0.2.1
atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 10.0.2.1
$DEBUG && rump.netstat -rn -f inet
# Up, Gateway, Host, Dynamic
- check_entry_flags 10.0.2.1 UGHD
- check_entry_gw 10.0.2.1 10.0.0.254
+ check_route_flags 10.0.2.1 UGHD
+ check_route_gw 10.0.2.1 10.0.0.254
atf_check -s exit:0 sleep $((REDIRECT_TIMEOUT + 2))
# The dynamic entry should be expired and removed
- check_entry_fail 10.0.2.1
+ check_route_no_entry 10.0.2.1
export RUMP_SERVER=$SOCK_PEER
$DEBUG && rump.netstat -rn -f inet
- teardown_gw
-}
-
-dump()
-{
-
- shmif_dumpbus -p - $BUS 2>/dev/null | tcpdump -n -e -r -
- gdb -ex bt /usr/bin/rump_server rump_server.core
-}
-
-cleanup()
-{
-
- env RUMP_SERVER=$SOCK_LOCAL rump.halt
- env RUMP_SERVER=$SOCK_PEER rump.halt
+ rump_server_destroy_ifaces
}
icmp_redirect_timeout_cleanup()
@@ -249,7 +196,7 @@ icmp_redirect_body()
export RUMP_SERVER=$SOCK_PEER
atf_check -s exit:0 -o ignore rump.route add -net 10.0.2.0/24 10.0.0.254
# Up, Gateway, Static
- check_entry_flags 10.0.2/24 UGS
+ check_route_flags 10.0.2/24 UGS
#
# Setup the default gateway to the peer, 10.0.0.1
@@ -257,7 +204,7 @@ icmp_redirect_body()
export RUMP_SERVER=$SOCK_LOCAL
atf_check -s exit:0 -o ignore rump.route add default 10.0.0.1
# Up, Gateway, Static
- check_entry_flags default UGS
+ check_route_flags default UGS
### ICMP redirects are NOT sent by the peer ###
@@ -274,7 +221,7 @@ icmp_redirect_body()
$DEBUG && rump.netstat -rn -f inet
# A direct route shouldn't be created
- check_entry_fail 10.0.2.1
+ check_route_no_entry 10.0.2.1
### ICMP redirects are sent by the peer ###
@@ -291,8 +238,8 @@ icmp_redirect_body()
$DEBUG && rump.netstat -rn -f inet
# Up, Gateway, Host, Dynamic
- check_entry_flags 10.0.2.1 UGHD
- check_entry_gw 10.0.2.1 10.0.0.254
+ check_route_flags 10.0.2.1 UGHD
+ check_route_gw 10.0.2.1 10.0.0.254
export RUMP_SERVER=$SOCK_PEER
$DEBUG && rump.netstat -rn -f inet
@@ -301,7 +248,7 @@ icmp_redirect_body()
# cleanup
export RUMP_SERVER=$SOCK_LOCAL
atf_check -s exit:0 -o ignore rump.route delete 10.0.2.1
- check_entry_fail 10.0.2.1
+ check_route_no_entry 10.0.2.1
### ICMP redirects are NOT sent by the peer (again) ###
@@ -318,10 +265,9 @@ icmp_redirect_body()
$DEBUG && rump.netstat -rn -f inet
# A direct route shouldn't be created
- check_entry_fail 10.0.2.1
-
+ check_route_no_entry 10.0.2.1
- teardown_gw
+ rump_server_destroy_ifaces
}
icmp_redirect_cleanup()
diff --git a/net/if/t_compat.c b/net/if/t_compat.c
index 4798034fa2cc..9eb84a3bbbe9 100644
--- a/net/if/t_compat.c
+++ b/net/if/t_compat.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_compat.c,v 1.1 2010/11/07 19:53:42 pooka Exp $ */
+/* $NetBSD: t_compat.c,v 1.4 2016/11/12 15:12:59 kre Exp $ */
#include <sys/socket.h>
#include <sys/ioctl.h>
@@ -65,6 +65,8 @@ ATF_TC_BODY(OOSIOCGIFBRDADDR, tc)
sprintf(ifreq.ifr_name, "shmif%d", ifnum);
netcfg_rump_if(ifreq.ifr_name, "1.7.64.10", "255.255.0.0");
+ atf_tc_expect_fail("PR kern/51610: rump does not include COMPAT_43");
+
/* query kernel for iface bcast */
RL(fd = rump_sys_socket(AF_INET, SOCK_DGRAM, 0));
RL(rump_sys_ioctl(fd, OOSIOCGIFBRDADDR, &ifreq));
diff --git a/net/if/t_ifconfig.sh b/net/if/t_ifconfig.sh
index e8c53e675b41..a6100179de43 100755
--- a/net/if/t_ifconfig.sh
+++ b/net/if/t_ifconfig.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_ifconfig.sh,v 1.11 2016/08/10 22:30:02 kre Exp $
+# $NetBSD: t_ifconfig.sh,v 1.14 2016/10/01 22:15:04 kre Exp $
#
# Copyright (c) 2015 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -34,6 +34,9 @@ RUMP_FLAGS="${RUMP_FLAGS} -lrumpdev"
TIMEOUT=3
+anycast="[Aa][Nn][Yy][Cc][Aa][Ss][Tt]"
+deprecated="[Dd][Ee][Pp][Rr][Ee][Cc][Aa][Tt][Ee][Dd]"
+
atf_test_case ifconfig_create_destroy cleanup
ifconfig_create_destroy_head()
{
@@ -227,16 +230,17 @@ ifconfig_parameters_body()
rump.ifconfig shmif0
# down, up
atf_check -s exit:0 rump.ifconfig shmif0 down
- atf_check -s ignore -o ignore -e match:'down' rump.ping -c 1 \
+ atf_check -s not-exit:0 -o ignore -e ignore rump.ping -c 1 \
-w $TIMEOUT -n 192.168.0.2
atf_check -s exit:0 rump.ifconfig shmif0 up
+ atf_check -s exit:0 rump.ifconfig -w 10
atf_check -s exit:0 -o ignore rump.ping -c 1 -w $TIMEOUT -n 192.168.0.2
# alias
atf_check -s exit:0 rump.ifconfig shmif0 inet 192.168.1.1/24 alias
- atf_check -s exit:0 -o match:'alias 192.168.1.1' rump.ifconfig shmif0
+ atf_check -s exit:0 -o match:'192.168.1.1/24' rump.ifconfig shmif0
atf_check -s exit:0 rump.ifconfig shmif0 inet 192.168.1.1/24 -alias
- atf_check -s exit:0 -o not-match:'192.168.1.1' rump.ifconfig shmif0
+ atf_check -s exit:0 -o not-match:'192.168.1.1/24' rump.ifconfig shmif0
atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::1
atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::2
atf_check -s exit:0 -o match:'fc00::1' rump.ifconfig shmif0 inet6
@@ -290,22 +294,22 @@ ifconfig_parameters_body()
# anycast
atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::2 anycast
- atf_check -s exit:0 -o match:'fc00::2.+anycast' rump.ifconfig shmif0 inet6
+ atf_check -s exit:0 -o match:"fc00::2.+$anycast" rump.ifconfig shmif0 inet6
# deprecated
atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::3 deprecated
# Not deprecated immediately. Need to wait nd6_timer that does it is scheduled.
interval=$(sysctl -n net.inet6.icmp6.nd6_prune)
atf_check -s exit:0 sleep $((interval + 1))
- atf_check -s exit:0 -o match:'fc00::3.+deprecated' rump.ifconfig shmif0 inet6
+ atf_check -s exit:0 -o match:"fc00::3.+$deprecated" rump.ifconfig shmif0 inet6
atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::3 -deprecated
- atf_check -s exit:0 -o not-match:'fc00::3.+deprecated' rump.ifconfig shmif0 inet6
+ atf_check -s exit:0 -o not-match:"fc00::3.+$deprecated" rump.ifconfig shmif0 inet6
# pltime
atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::3 pltime 3
- atf_check -s exit:0 -o not-match:'fc00::3.+deprecated' rump.ifconfig shmif0 inet6
+ atf_check -s exit:0 -o not-match:"fc00::3.+$deprecated" rump.ifconfig shmif0 inet6
atf_check -s exit:0 sleep 5
- atf_check -s exit:0 -o match:'fc00::3.+deprecated' rump.ifconfig shmif0 inet6
+ atf_check -s exit:0 -o match:"fc00::3.+$deprecated" rump.ifconfig shmif0 inet6
# eui64
atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00:1::0 eui64
diff --git a/net/if_bridge/Makefile b/net/if_bridge/Makefile
index 1d21951dff5f..894dc9dc2576 100644
--- a/net/if_bridge/Makefile
+++ b/net/if_bridge/Makefile
@@ -1,10 +1,13 @@
-# $NetBSD: Makefile,v 1.1 2014/09/18 15:13:27 ozaki-r Exp $
+# $NetBSD: Makefile,v 1.2 2016/11/24 09:07:09 ozaki-r Exp $
#
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/net/if_bridge
-TESTS_SH= t_bridge
+.for name in bridge
+TESTS_SH+= t_${name}
+TESTS_SH_SRC_t_${name}= ../net_common.sh t_${name}.sh
+.endfor
.include <bsd.test.mk>
diff --git a/net/if_bridge/t_bridge.sh b/net/if_bridge/t_bridge.sh
index 769893d44781..25edb35895ba 100755
--- a/net/if_bridge/t_bridge.sh
+++ b/net/if_bridge/t_bridge.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_bridge.sh,v 1.13 2016/08/10 22:37:07 kre Exp $
+# $NetBSD: t_bridge.sh,v 1.16 2016/11/25 08:51:16 ozaki-r Exp $
#
# Copyright (c) 2014 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -25,13 +25,6 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-libs1="-lrumpnet -lrumpnet_net -lrumpnet_netinet"
-libs2="-lrumpnet_bridge -lrumpnet_shmif -lrumpdev"
-libs6="-lrumpnet_netinet6"
-
-inetserver="rump_server ${libs1} ${libs2}"
-inet6server="rump_server ${libs1} ${libs6} ${libs2}"
-
SOCK1=unix://commsock1
SOCK2=unix://commsock2
SOCK3=unix://commsock3
@@ -44,6 +37,7 @@ IPBR2=10.0.0.12
IP6BR1=fc00::11
IP6BR2=fc00::12
+DEBUG=${DEBUG:-false}
TIMEOUT=5
atf_test_case bridge_ipv4 cleanup
@@ -89,9 +83,8 @@ setup_endpoint()
bus=${3}
mode=${4}
+ rump_server_add_iface $sock shmif0 $bus
export RUMP_SERVER=${sock}
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr ${bus}
if [ $mode = "ipv6" ]; then
atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${addr}
else
@@ -99,7 +92,7 @@ setup_endpoint()
fi
atf_check -s exit:0 rump.ifconfig shmif0 up
- rump.ifconfig shmif0
+ $DEBUG && rump.ifconfig shmif0
}
test_endpoint()
@@ -118,14 +111,6 @@ test_endpoint()
fi
}
-show_endpoint()
-{
- sock=${1}
-
- export RUMP_SERVER=${sock}
- rump.ifconfig -v shmif0
-}
-
test_setup()
{
test_endpoint $SOCK1 $IP1 bus1 ipv4
@@ -148,21 +133,20 @@ test_setup6()
setup_bridge_server()
{
+
+ rump_server_add_iface $SOCK2 shmif0 bus1
+ rump_server_add_iface $SOCK2 shmif1 bus2
export RUMP_SERVER=$SOCK2
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1
atf_check -s exit:0 rump.ifconfig shmif0 up
-
- atf_check -s exit:0 rump.ifconfig shmif1 create
- atf_check -s exit:0 rump.ifconfig shmif1 linkstr bus2
atf_check -s exit:0 rump.ifconfig shmif1 up
}
setup()
{
- atf_check -s exit:0 ${inetserver} $SOCK1
- atf_check -s exit:0 ${inetserver} $SOCK2
- atf_check -s exit:0 ${inetserver} $SOCK3
+
+ rump_server_start $SOCK1 bridge
+ rump_server_start $SOCK2 bridge
+ rump_server_start $SOCK3 bridge
setup_endpoint $SOCK1 $IP1 bus1 ipv4
setup_endpoint $SOCK3 $IP2 bus2 ipv4
@@ -171,9 +155,10 @@ setup()
setup6()
{
- atf_check -s exit:0 ${inet6server} $SOCK1
- atf_check -s exit:0 ${inet6server} $SOCK2
- atf_check -s exit:0 ${inet6server} $SOCK3
+
+ rump_server_start $SOCK1 netinet6 bridge
+ rump_server_start $SOCK2 netinet6 bridge
+ rump_server_start $SOCK3 netinet6 bridge
setup_endpoint $SOCK1 $IP61 bus1 ipv6
setup_endpoint $SOCK3 $IP62 bus2 ipv6
@@ -244,19 +229,6 @@ test_setup_bridge()
unset LD_PRELOAD
}
-cleanup()
-{
- env RUMP_SERVER=$SOCK1 rump.halt
- env RUMP_SERVER=$SOCK2 rump.halt
- env RUMP_SERVER=$SOCK3 rump.halt
-}
-
-dump_bus()
-{
- /usr/bin/shmif_dumpbus -p - bus1 2>/dev/null| /usr/sbin/tcpdump -n -e -r -
- /usr/bin/shmif_dumpbus -p - bus2 2>/dev/null| /usr/sbin/tcpdump -n -e -r -
-}
-
down_up_interfaces()
{
export RUMP_SERVER=$SOCK1
@@ -360,11 +332,8 @@ test_brconfig_maxaddr()
addr1= addr3= n=
# Get MAC addresses of the endpoints.
- export RUMP_SERVER=$SOCK1
- addr1=$(rump.ifconfig shmif0 |awk '/address:/ { print $2;}')
- export RUMP_SERVER=$SOCK3
- addr3=$(rump.ifconfig shmif0 |awk '/address:/ { print $2;}')
- unset RUMP_SERVER
+ addr1=$(get_macaddr $SOCK1 shmif0)
+ addr3=$(get_macaddr $SOCK3 shmif0)
# Refill the MAC addresses of the endpoints.
export RUMP_SERVER=$SOCK1
@@ -422,6 +391,8 @@ bridge_ipv4_body()
teardown_bridge
test_ping_failure
+
+ rump_server_destroy_ifaces
}
bridge_ipv6_body()
@@ -438,6 +409,8 @@ bridge_ipv6_body()
teardown_bridge
test_ping6_failure
+
+ rump_server_destroy_ifaces
}
bridge_rtable_body()
@@ -448,16 +421,13 @@ bridge_rtable_body()
setup_bridge
# Get MAC addresses of the endpoints.
- export RUMP_SERVER=$SOCK1
- addr1=$(rump.ifconfig shmif0 |awk '/address:/ { print $2;}')
- export RUMP_SERVER=$SOCK3
- addr3=$(rump.ifconfig shmif0 |awk '/address:/ { print $2;}')
- unset RUMP_SERVER
+ addr1=$(get_macaddr $SOCK1 shmif0)
+ addr3=$(get_macaddr $SOCK3 shmif0)
# Confirm there is no MAC address caches.
export RUMP_SERVER=$SOCK2
export LD_PRELOAD=/usr/lib/librumphijack.so
- /sbin/brconfig bridge0
+ $DEBUG && /sbin/brconfig bridge0
atf_check -s exit:0 -o not-match:"$addr1" /sbin/brconfig bridge0
atf_check -s exit:0 -o not-match:"$addr3" /sbin/brconfig bridge0
unset LD_PRELOAD
@@ -470,7 +440,7 @@ bridge_rtable_body()
# Tests the addresses are in the cache.
export RUMP_SERVER=$SOCK2
export LD_PRELOAD=/usr/lib/librumphijack.so
- /sbin/brconfig bridge0
+ $DEBUG && /sbin/brconfig bridge0
atf_check -s exit:0 -o match:"$addr1 shmif0" /sbin/brconfig bridge0
atf_check -s exit:0 -o match:"$addr3 shmif1" /sbin/brconfig bridge0
@@ -487,7 +457,7 @@ bridge_rtable_body()
unset RUMP_SERVER
export RUMP_SERVER=$SOCK2
export LD_PRELOAD=/usr/lib/librumphijack.so
- /sbin/brconfig bridge0
+ $DEBUG && /sbin/brconfig bridge0
atf_check -s exit:0 -o match:"$addr1 shmif0" /sbin/brconfig bridge0
atf_check -s exit:0 -o match:"$addr3 shmif1" /sbin/brconfig bridge0
@@ -511,6 +481,8 @@ bridge_rtable_body()
# TODO: brconfig static/flushall/discover/learn
# TODO: cache expiration; it takes 5 minutes at least and we want to
# wait here so long. Should we have a sysctl to change the period?
+
+ rump_server_destroy_ifaces
}
bridge_member_ipv4_body()
@@ -531,6 +503,8 @@ bridge_member_ipv4_body()
teardown_bridge
test_ping_failure
+
+ rump_server_destroy_ifaces
}
bridge_member_ipv6_body()
@@ -550,35 +524,42 @@ bridge_member_ipv6_body()
teardown_bridge
test_ping6_failure
+
+ rump_server_destroy_ifaces
}
bridge_ipv4_cleanup()
{
- dump_bus
+
+ $DEBUG && dump
cleanup
}
bridge_ipv6_cleanup()
{
- dump_bus
+
+ $DEBUG && dump
cleanup
}
bridge_rtable_cleanup()
{
- dump_bus
+
+ $DEBUG && dump
cleanup
}
bridge_member_ipv4_cleanup()
{
- dump_bus
+
+ $DEBUG && dump
cleanup
}
bridge_member_ipv6_cleanup()
{
- dump_bus
+
+ $DEBUG && dump
cleanup
}
diff --git a/net/if_gif/Makefile b/net/if_gif/Makefile
index 4ccd0127f4dd..4e828fbf636f 100644
--- a/net/if_gif/Makefile
+++ b/net/if_gif/Makefile
@@ -1,10 +1,13 @@
-# $NetBSD: Makefile,v 1.1 2015/11/05 00:02:59 knakahara Exp $
+# $NetBSD: Makefile,v 1.2 2016/11/24 09:03:53 ozaki-r Exp $
#
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/net/if_gif
-TESTS_SH= t_gif
+.for name in gif
+TESTS_SH+= t_${name}
+TESTS_SH_SRC_t_${name}= ../net_common.sh t_${name}.sh
+.endfor
.include <bsd.test.mk>
diff --git a/net/if_gif/t_gif.sh b/net/if_gif/t_gif.sh
index b804d7b21cc4..8690d78b2dde 100755
--- a/net/if_gif/t_gif.sh
+++ b/net/if_gif/t_gif.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_gif.sh,v 1.5 2016/08/10 08:29:20 ozaki-r Exp $
+# $NetBSD: t_gif.sh,v 1.9 2016/12/21 09:46:39 ozaki-r Exp $
#
# Copyright (c) 2015 Internet Initiative Japan Inc.
# All rights reserved.
@@ -25,10 +25,6 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-server="rump_server -v -lrumpdev -lrumpnet -lrumpnet_net -lrumpnet_netinet \
- -lrumpnet_netinet6 -lrumpnet_shmif -lrumpnet_gif"
-HIJACKING="env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=sysctl=yes"
-
SOCK1=unix://commsock1 # for ROUTER1
SOCK2=unix://commsock2 # for ROUTER2
ROUTER1_LANIP=192.168.1.1
@@ -65,6 +61,7 @@ ROUTER2_GIFIP6_DUMMY=fc00:14::1
ROUTER2_GIFIP6_RECURSIVE1=fc00:104::1
ROUTER2_GIFIP6_RECURSIVE2=fc00:204::1
+DEBUG=${DEBUG:-true}
TIMEOUT=5
setup_router()
@@ -75,9 +72,10 @@ setup_router()
wan=${4}
wan_mode=${5}
+ rump_server_add_iface $sock shmif0 bus0
+ rump_server_add_iface $sock shmif1 bus1
+
export RUMP_SERVER=${sock}
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus0
if [ ${lan_mode} = "ipv6" ]; then
atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${lan}
else
@@ -86,8 +84,6 @@ setup_router()
atf_check -s exit:0 rump.ifconfig shmif0 up
rump.ifconfig shmif0
- atf_check -s exit:0 rump.ifconfig shmif1 create
- atf_check -s exit:0 rump.ifconfig shmif1 linkstr bus1
if [ ${wan_mode} = "ipv6" ]; then
atf_check -s exit:0 rump.ifconfig shmif1 inet6 ${wan}
else
@@ -126,8 +122,8 @@ setup()
inner=${1}
outer=${2}
- atf_check -s exit:0 ${server} $SOCK1
- atf_check -s exit:0 ${server} $SOCK2
+ rump_server_start $SOCK1 netinet6 gif
+ rump_server_start $SOCK2 netinet6 gif
router1_lan=""
router1_lan_mode=""
@@ -482,18 +478,6 @@ teardown_recursive_tunnels()
atf_check -s exit:0 rump.ifconfig gif2 destroy
}
-cleanup()
-{
- env RUMP_SERVER=$SOCK1 rump.halt
- env RUMP_SERVER=$SOCK2 rump.halt
-}
-
-dump_bus()
-{
- /usr/bin/shmif_dumpbus -p - bus0 2>/dev/null| /usr/sbin/tcpdump -n -e -r -
- /usr/bin/shmif_dumpbus -p - bus1 2>/dev/null| /usr/sbin/tcpdump -n -e -r -
-}
-
test_ping_failure()
{
mode=$1
@@ -739,7 +723,7 @@ add_test()
inner=$3
outer=$4
- name="${category}${inner}over${outer}"
+ name="gif_${category}_${inner}over${outer}"
fulldesc="Does ${inner} over ${outer} if_gif ${desc}"
atf_test_case ${name} cleanup
@@ -751,9 +735,10 @@ add_test()
${category}_setup ${inner} ${outer}; \
${category}_test ${inner} ${outer}; \
${category}_teardown ${inner} ${outer}; \
+ rump_server_destroy_ifaces; \
}; \
${name}_cleanup() { \
- dump_bus; \
+ $DEBUG && dump; \
cleanup; \
}"
atf_add_test_case ${name}
diff --git a/net/if_pppoe/Makefile b/net/if_pppoe/Makefile
index c082be8a7dba..091ed3150d08 100644
--- a/net/if_pppoe/Makefile
+++ b/net/if_pppoe/Makefile
@@ -1,8 +1,13 @@
+# $NetBSD: Makefile,v 1.3 2016/11/24 09:03:53 ozaki-r Exp $
+#
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/net/if_pppoe
-TESTS_SH= t_pppoe
+.for name in pppoe
+TESTS_SH+= t_${name}
+TESTS_SH_SRC_t_${name}= ../net_common.sh t_${name}.sh
+.endfor
.include <bsd.test.mk>
diff --git a/net/if_pppoe/t_pppoe.sh b/net/if_pppoe/t_pppoe.sh
index 3199ca0a73e9..8d9d5c23a7a1 100755
--- a/net/if_pppoe/t_pppoe.sh
+++ b/net/if_pppoe/t_pppoe.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_pppoe.sh,v 1.2 2016/08/07 23:34:31 pgoyette Exp $
+# $NetBSD: t_pppoe.sh,v 1.16 2016/12/14 03:30:30 knakahara Exp $
#
# Copyright (c) 2016 Internet Initiative Japan Inc.
# All rights reserved.
@@ -28,6 +28,7 @@
server="rump_server -lrump -lrumpnet -lrumpnet_net -lrumpnet_netinet \
-lrumpnet_netinet6 -lrumpnet_shmif -lrumpdev \
-lrumpnet_pppoe"
+# pppoectl doesn't work with RUMPHIJACK=sysctl=yes
HIJACKING="env LD_PRELOAD=/usr/lib/librumphijack.so"
SERVER=unix://commsock1
@@ -35,17 +36,23 @@ CLIENT=unix://commsock2
SERVER_IP=10.3.3.1
CLIENT_IP=10.3.3.3
+SERVER_IP6=fc00::1
+CLIENT_IP6=fc00::3
AUTHNAME=foobar@baz.com
SECRET=oink
BUS=bus0
TIMEOUT=3
-WAITTIME=5
-DEBUG=false
-
-atf_test_case pap cleanup
+WAITTIME=10
+DEBUG=${DEBUG:-false}
setup()
{
+ inet=true
+
+ if [ $# -ne 0 ]; then
+ eval $@
+ fi
+
atf_check -s exit:0 ${server} $SERVER
atf_check -s exit:0 ${server} $CLIENT
@@ -55,7 +62,8 @@ setup()
atf_check -s exit:0 rump.ifconfig shmif0 up
atf_check -s exit:0 rump.ifconfig pppoe0 create
- atf_check -s exit:0 rump.ifconfig pppoe0 inet $SERVER_IP $CLIENT_IP down
+ $inet && atf_check -s exit:0 rump.ifconfig pppoe0 \
+ inet $SERVER_IP $CLIENT_IP down
atf_check -s exit:0 rump.ifconfig pppoe0 link0
$DEBUG && rump.ifconfig
@@ -70,22 +78,19 @@ setup()
atf_check -s exit:0 rump.ifconfig shmif0 up
atf_check -s exit:0 rump.ifconfig pppoe0 create
- atf_check -s exit:0 rump.ifconfig pppoe0 inet 0.0.0.0 0.0.0.1 down
+ $inet && atf_check -s exit:0 rump.ifconfig pppoe0 \
+ inet 0.0.0.0 0.0.0.1 down
atf_check -s exit:0 -x "$HIJACKING pppoectl -e shmif0 pppoe0"
unset RUMP_SERVER
}
+
cleanup()
{
env RUMP_SERVER=$SERVER rump.halt
env RUMP_SERVER=$CLIENT rump.halt
}
-pap_head()
-{
- atf_set "descr" "Does simple pap tests"
- atf_set "require.progs" "rump_server pppoectl"
-}
wait_for_session_established()
{
@@ -98,21 +103,50 @@ wait_for_session_established()
sleep 1
done
- if [ $dontfail != "dontfail" ]; then
+ if [ "$dontfail" != "dontfail" ]; then
atf_fail "Couldn't connect to the server for $n seconds."
fi
}
-pap_body()
+wait_for_disconnected()
+{
+ local dontfail=$1
+ local n=$WAITTIME
+
+ for i in $(seq $n); do
+ $HIJACKING pppoectl -d pppoe0 | grep -q "state = initial"
+ [ $? = 0 ] && return
+ # If PPPoE client is disconnected by PPPoE server and then
+ # the client kicks callout of pppoe_timeout(), the client
+ # state is changed to PPPOE_STATE_PADI_SENT while padi retrying.
+ $HIJACKING pppoectl -d pppoe0 | grep -q "state = PADI sent"
+ [ $? = 0 ] && return
+
+ sleep 1
+ done
+
+ if [ "$dontfail" != "dontfail" ]; then
+ atf_fail "Couldn't disconnect for $n seconds."
+ fi
+}
+
+run_test()
{
- local auth=pap
+ local auth=$1
setup
+ # As pppoe client doesn't support rechallenge yet.
+ local server_optparam=""
+ if [ $auth = "chap" ]; then
+ server_optparam="norechallenge"
+ fi
+
export RUMP_SERVER=$SERVER
local setup_serverparam="pppoectl pppoe0 hisauthproto=$auth \
'hisauthname=$AUTHNAME' \
'hisauthsecret=$SECRET' \
- 'myauthproto=none'"
+ 'myauthproto=none' \
+ $server_optparam"
atf_check -s exit:0 -x "$HIJACKING $setup_serverparam"
atf_check -s exit:0 rump.ifconfig pppoe0 up
unset RUMP_SERVER
@@ -130,8 +164,11 @@ pap_body()
unset RUMP_SERVER
# test for disconnection from server
- atf_check -s exit:0 -x "env RUMP_SERVER=$SERVER rump.ifconfig pppoe0 down"
+ export RUMP_SERVER=$SERVER
+ atf_check -s exit:0 rump.ifconfig pppoe0 down
+ wait_for_disconnected
export RUMP_SERVER=$CLIENT
+ wait_for_disconnected
atf_check -s not-exit:0 -o ignore -e ignore \
rump.ping -c 1 -w $TIMEOUT $SERVER_IP
atf_check -s exit:0 -o match:'PADI sent' -x "$HIJACKING pppoectl -d pppoe0"
@@ -145,15 +182,18 @@ pap_body()
unset RUMP_SERVER
# test for disconnection from client
- atf_check -s exit:0 -x "env RUMP_SERVER=$CLIENT rump.ifconfig pppoe0 down"
+ export RUMP_SERVER=$CLIENT
+ atf_check -s exit:0 -x rump.ifconfig pppoe0 down
+ wait_for_disconnected
export RUMP_SERVER=$SERVER
+ wait_for_disconnected
$DEBUG && $HIJACKING pppoectl -d pppoe0
atf_check -s not-exit:0 -o ignore -e ignore \
rump.ping -c 1 -w $TIMEOUT $CLIENT_IP
atf_check -s exit:0 -o match:'initial' -x "$HIJACKING pppoectl -d pppoe0"
unset RUMP_SERVER
- # test for recconecting
+ # test for reconnecting
export RUMP_SERVER=$CLIENT
atf_check -s exit:0 -x rump.ifconfig pppoe0 up
wait_for_session_established
@@ -162,6 +202,7 @@ pap_body()
unset RUMP_SERVER
export RUMP_SERVER=$SERVER
+ atf_check -s exit:0 rump.ifconfig -w 10
atf_check -s exit:0 -o ignore rump.ping -c 1 -w $TIMEOUT $CLIENT_IP
atf_check -s exit:0 -o match:'session' -x "$HIJACKING pppoectl -d pppoe0"
$DEBUG && HIJACKING pppoectl -d pppoe0
@@ -170,6 +211,7 @@ pap_body()
# test for invalid password
export RUMP_SERVER=$CLIENT
atf_check -s exit:0 rump.ifconfig pppoe0 down
+ wait_for_disconnected
local setup_clientparam="pppoectl pppoe0 myauthproto=$auth \
'myauthname=$AUTHNAME' \
'myauthsecret=invalidsecret' \
@@ -179,15 +221,196 @@ pap_body()
wait_for_session_established dontfail
atf_check -s not-exit:0 -o ignore -e ignore \
rump.ping -c 1 -w $TIMEOUT $SERVER_IP
+ atf_check -s exit:0 -o match:'DETACHED' rump.ifconfig pppoe0
+ unset RUMP_SERVER
+}
+
+atf_test_case pppoe_pap cleanup
+
+pppoe_pap_head()
+{
+ atf_set "descr" "Does simple pap tests"
+ atf_set "require.progs" "rump_server pppoectl"
+}
+
+pppoe_pap_body()
+{
+ run_test pap
+}
+
+pppoe_pap_cleanup()
+{
+ cleanup
+}
+
+atf_test_case pppoe_chap cleanup
+
+pppoe_chap_head()
+{
+ atf_set "descr" "Does simple chap tests"
+ atf_set "require.progs" "rump_server pppoectl"
+}
+
+pppoe_chap_body()
+{
+ run_test chap
+}
+
+pppoe_chap_cleanup()
+{
+ cleanup
+}
+
+run_test6()
+{
+ local auth=$1
+ setup "inet=false"
+
+ # As pppoe client doesn't support rechallenge yet.
+ local server_optparam=""
+ if [ $auth = "chap" ]; then
+ server_optparam="norechallenge"
+ fi
+
+ export RUMP_SERVER=$SERVER
+ local setup_serverparam="pppoectl pppoe0 hisauthproto=$auth \
+ 'hisauthname=$AUTHNAME' \
+ 'hisauthsecret=$SECRET' \
+ 'myauthproto=none' \
+ $server_optparam"
+ atf_check -s exit:0 -x "$HIJACKING $setup_serverparam"
+ atf_check -s exit:0 rump.ifconfig pppoe0 inet6 $SERVER_IP6/64 down
+ atf_check -s exit:0 rump.ifconfig pppoe0 up
+ unset RUMP_SERVER
+
+ export RUMP_SERVER=$CLIENT
+ local setup_clientparam="pppoectl pppoe0 myauthproto=$auth \
+ 'myauthname=$AUTHNAME' \
+ 'myauthsecret=$SECRET' \
+ 'hisauthproto=none'"
+ atf_check -s exit:0 -x "$HIJACKING $setup_clientparam"
+ atf_check -s exit:0 rump.ifconfig pppoe0 inet6 $CLIENT_IP6/64 down
+ atf_check -s exit:0 rump.ifconfig pppoe0 up
+ $DEBUG && rump.ifconfig
+ wait_for_session_established
+ atf_check -s exit:0 -o ignore rump.ifconfig -w 10
+ export RUMP_SERVER=$SERVER
+ atf_check -s exit:0 -o ignore rump.ifconfig -w 10
+ export RUMP_SERVER=$CLIENT
+ atf_check -s exit:0 -o ignore rump.ping6 -c 1 -X $TIMEOUT $SERVER_IP6
+ unset RUMP_SERVER
+
+ # test for disconnection from server
+ export RUMP_SERVER=$SERVER
+ session_id=`$HIJACKING pppoectl -d pppoe0 | grep state`
+ atf_check -s exit:0 rump.ifconfig pppoe0 down
+ wait_for_disconnected
+ export RUMP_SERVER=$CLIENT
+ wait_for_disconnected
+ atf_check -s not-exit:0 -o ignore -e ignore \
+ rump.ping6 -c 1 -X $TIMEOUT $SERVER_IP6
+ atf_check -s exit:0 -o not-match:"$session_id" -x "$HIJACKING pppoectl -d pppoe0"
+ unset RUMP_SERVER
+
+ # test for recoonecting
+ export RUMP_SERVER=$SERVER
+ atf_check -s exit:0 rump.ifconfig pppoe0 up
+ wait_for_session_established
+ atf_check -s exit:0 rump.ifconfig -w 10
+ $DEBUG && $HIJACKING pppoectl -d pppoe0
+ $DEBUG && rump.ifconfig pppoe0
+ export RUMP_SERVER=$CLIENT
+ atf_check -s exit:0 -o ignore rump.ifconfig -w 10
+ atf_check -s exit:0 -o ignore rump.ping6 -c 1 -X $TIMEOUT $SERVER_IP6
+ unset RUMP_SERVER
+
+ # test for disconnection from client
+ export RUMP_SERVER=$CLIENT
+ atf_check -s exit:0 rump.ifconfig pppoe0 down
+ wait_for_disconnected
+
+ export RUMP_SERVER=$SERVER
+ wait_for_disconnected
+ $DEBUG && $HIJACKING pppoectl -d pppoe0
+ atf_check -s not-exit:0 -o ignore -e ignore \
+ rump.ping6 -c 1 -X $TIMEOUT $CLIENT_IP6
atf_check -s exit:0 -o match:'initial' -x "$HIJACKING pppoectl -d pppoe0"
unset RUMP_SERVER
+
+ # test for reconnecting
+ export RUMP_SERVER=$CLIENT
+ atf_check -s exit:0 rump.ifconfig pppoe0 up
+ wait_for_session_established
+ atf_check -s exit:0 rump.ifconfig -w 10
+
+ $DEBUG && rump.ifconfig pppoe0
+ $DEBUG && $HIJACKING pppoectl -d pppoe0
+ unset RUMP_SERVER
+
+ export RUMP_SERVER=$SERVER
+ atf_check -s exit:0 rump.ifconfig -w 10
+ atf_check -s exit:0 -o ignore rump.ping6 -c 1 -X $TIMEOUT $CLIENT_IP6
+ atf_check -s exit:0 -o match:'session' -x "$HIJACKING pppoectl -d pppoe0"
+ $DEBUG && HIJACKING pppoectl -d pppoe0
+ unset RUMP_SERVER
+
+ # test for invalid password
+ export RUMP_SERVER=$CLIENT
+ atf_check -s exit:0 rump.ifconfig pppoe0 down
+ wait_for_disconnected
+ local setup_clientparam="pppoectl pppoe0 myauthproto=$auth \
+ 'myauthname=$AUTHNAME' \
+ 'myauthsecret=invalidsecret' \
+ 'hisauthproto=none'"
+ atf_check -s exit:0 -x "$HIJACKING $setup_clientparam"
+ atf_check -s exit:0 rump.ifconfig pppoe0 up
+ wait_for_session_established dontfail
+ atf_check -s not-exit:0 -o ignore -e ignore \
+ rump.ping6 -c 1 -X $TIMEOUT $SERVER_IP6
+ atf_check -s exit:0 -o match:'DETACHED' rump.ifconfig pppoe0
+ unset RUMP_SERVER
}
-pap_cleanup()
+atf_test_case pppoe6_pap cleanup
+
+pppoe6_pap_head()
+{
+ atf_set "descr" "Does simple pap using IPv6 tests"
+ atf_set "require.progs" "rump_server pppoectl"
+}
+
+pppoe6_pap_body()
+{
+ run_test6 pap
+}
+
+pppoe6_pap_cleanup()
+{
+ cleanup
+}
+
+atf_test_case pppoe6_chap cleanup
+
+pppoe6_chap_head()
+{
+ atf_set "descr" "Does simple chap using IPv6 tests"
+ atf_set "require.progs" "rump_server pppoectl"
+}
+
+pppoe6_chap_body()
+{
+ run_test6 chap
+}
+
+pppoe6_chap_cleanup()
{
cleanup
}
+
atf_init_test_cases()
{
- atf_add_test_case pap
+ atf_add_test_case pppoe_pap
+ atf_add_test_case pppoe_chap
+ atf_add_test_case pppoe6_pap
+ atf_add_test_case pppoe6_chap
}
diff --git a/net/if_tap/Makefile b/net/if_tap/Makefile
index d55c140329ab..e3d06c930c44 100644
--- a/net/if_tap/Makefile
+++ b/net/if_tap/Makefile
@@ -1,10 +1,13 @@
-# $NetBSD: Makefile,v 1.1 2016/03/04 02:44:45 ozaki-r Exp $
+# $NetBSD: Makefile,v 1.2 2016/11/25 08:51:16 ozaki-r Exp $
#
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/net/if_tap
-TESTS_SH= t_tap
+.for name in tap
+TESTS_SH+= t_${name}
+TESTS_SH_SRC_t_${name}= ../net_common.sh t_${name}.sh
+.endfor
.include <bsd.test.mk>
diff --git a/net/if_tap/t_tap.sh b/net/if_tap/t_tap.sh
index 29efc201b488..4b1ce2566e2f 100755
--- a/net/if_tap/t_tap.sh
+++ b/net/if_tap/t_tap.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_tap.sh,v 1.3 2016/08/10 22:42:21 kre Exp $
+# $NetBSD: t_tap.sh,v 1.6 2016/11/25 08:51:16 ozaki-r Exp $
#
# Copyright (c) 2016 Internet Initiative Japan Inc.
# All rights reserved.
@@ -25,10 +25,6 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-RUMP_FLAGS="-lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_netinet6"
-RUMP_FLAGS="$RUMP_FLAGS -lrumpnet_shmif -lrumpnet_tap -lrumpnet_bridge -lrumpdev"
-HIJACKING="env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=sysctl=yes"
-
SOCK_LOCAL=unix://commsock1
SOCK_REMOTE=unix://commsock2
BUS=bus1
@@ -39,7 +35,7 @@ IP6_LOCAL=fc00::1
IP6_TAP=fc00::2
IP6_REMOTE=fc00::3
-DEBUG=false
+DEBUG=${DEBUG:-false}
TIMEOUT=1
atf_test_case tap_create_destroy cleanup
@@ -53,7 +49,7 @@ tap_create_destroy_head()
tap_create_destroy_body()
{
- atf_check -s exit:0 rump_server ${RUMP_FLAGS} ${SOCK_LOCAL}
+ rump_server_start $SOCK_LOCAL netinet6 tap
export RUMP_SERVER=${SOCK_LOCAL}
@@ -77,7 +73,8 @@ tap_create_destroy_body()
tap_create_destroy_cleanup()
{
- RUMP_SERVER=${SOCK_LOCAL} rump.halt
+ $DEBUG && dump
+ cleanup
}
atf_test_case tap_stand_alone cleanup
@@ -90,13 +87,14 @@ tap_create_destroy_head()
tap_stand_alone_body()
{
- atf_check -s exit:0 rump_server ${RUMP_FLAGS} ${SOCK_LOCAL}
- atf_check -s exit:0 rump_server ${RUMP_FLAGS} ${SOCK_REMOTE}
- export RUMP_SERVER=${SOCK_LOCAL}
+ rump_server_start $SOCK_LOCAL netinet6 tap
+ rump_server_start $SOCK_REMOTE netinet6 tap
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr $BUS
+ rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
+ rump_server_add_iface $SOCK_REMOTE shmif0 $BUS
+
+ export RUMP_SERVER=${SOCK_LOCAL}
atf_check -s exit:0 rump.ifconfig shmif0 $IP4_LOCAL
atf_check -s exit:0 rump.ifconfig shmif0 inet6 $IP6_LOCAL
atf_check -s exit:0 rump.ifconfig shmif0 up
@@ -108,8 +106,6 @@ tap_stand_alone_body()
export RUMP_SERVER=${SOCK_REMOTE}
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr $BUS
atf_check -s exit:0 rump.ifconfig shmif0 $IP4_REMOTE
atf_check -s exit:0 rump.ifconfig shmif0 inet6 $IP6_REMOTE
atf_check -s exit:0 rump.ifconfig shmif0 up
@@ -124,13 +120,15 @@ tap_stand_alone_body()
# Cannot reach to an alone tap
atf_check -s not-exit:0 -o ignore -e ignore \
rump.ping6 -n -X $TIMEOUT -c 1 $IP6_TAP
+
+ rump_server_destroy_ifaces
}
tap_stand_alone_cleanup()
{
- RUMP_SERVER=${SOCK_LOCAL} rump.halt
- RUMP_SERVER=${SOCK_REMOTE} rump.halt
+ $DEBUG && dump
+ cleanup
}
atf_test_case tap_bridged cleanup
@@ -143,13 +141,15 @@ tap_bridged_head()
tap_bridged_body()
{
- atf_check -s exit:0 rump_server ${RUMP_FLAGS} ${SOCK_LOCAL}
- atf_check -s exit:0 rump_server ${RUMP_FLAGS} ${SOCK_REMOTE}
+
+ rump_server_start $SOCK_LOCAL netinet6 tap bridge
+ rump_server_start $SOCK_REMOTE netinet6 tap
+
+ rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
+ rump_server_add_iface $SOCK_REMOTE shmif0 $BUS
export RUMP_SERVER=${SOCK_LOCAL}
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr $BUS
atf_check -s exit:0 rump.ifconfig shmif0 $IP4_LOCAL
atf_check -s exit:0 rump.ifconfig shmif0 inet6 $IP6_LOCAL
atf_check -s exit:0 rump.ifconfig shmif0 up
@@ -168,8 +168,6 @@ tap_bridged_body()
export RUMP_SERVER=${SOCK_REMOTE}
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr $BUS
atf_check -s exit:0 rump.ifconfig shmif0 $IP4_REMOTE
atf_check -s exit:0 rump.ifconfig shmif0 inet6 $IP6_REMOTE
atf_check -s exit:0 rump.ifconfig shmif0 up
@@ -180,13 +178,15 @@ tap_bridged_body()
atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 $IP6_LOCAL
atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 $IP6_TAP
+
+ rump_server_destroy_ifaces
}
tap_bridged_cleanup()
{
- RUMP_SERVER=${SOCK_LOCAL} rump.halt
- RUMP_SERVER=${SOCK_REMOTE} rump.halt
+ $DEBUG && dump
+ cleanup
}
atf_init_test_cases()
diff --git a/net/mcast/Makefile b/net/mcast/Makefile
index 5085e1e9def3..cdce1c691592 100644
--- a/net/mcast/Makefile
+++ b/net/mcast/Makefile
@@ -1,11 +1,14 @@
-# $NetBSD: Makefile,v 1.2 2015/05/26 00:42:07 ozaki-r Exp $
+# $NetBSD: Makefile,v 1.3 2016/11/25 08:51:16 ozaki-r Exp $
#
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/net/mcast
-TESTS_SH= t_mcast
+.for name in mcast
+TESTS_SH+= t_${name}
+TESTS_SH_SRC_t_${name}= ../net_common.sh t_${name}.sh
+.endfor
PROGS= mcast
MAN.mcast= # empty
diff --git a/net/mcast/t_mcast.sh b/net/mcast/t_mcast.sh
index 67e13d4a9cdc..aeb70001716f 100755
--- a/net/mcast/t_mcast.sh
+++ b/net/mcast/t_mcast.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_mcast.sh,v 1.2 2016/08/10 22:45:39 kre Exp $
+# $NetBSD: t_mcast.sh,v 1.4 2016/11/25 08:51:16 ozaki-r Exp $
#
# Copyright (c) 2015 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -25,12 +25,9 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-netserver="rump_server -lrumpnet -lrumpnet_net"
-netserver="$netserver -lrumpnet_netinet -lrumpnet_netinet6 -lrumpnet_shmif"
-netserver="$netserver -lrumpdev"
export RUMP_SERVER=unix://commsock
-DEBUG=false
+DEBUG=${DEBUG:-false}
run_test()
{
@@ -38,9 +35,8 @@ run_test()
local opts="$2"
local mcast="$(atf_get_srcdir)/mcast"
- atf_check -s exit:0 ${netserver} ${RUMP_SERVER}
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1
+ rump_server_start $RUMP_SERVER netinet6
+ rump_server_add_iface $RUMP_SERVER shmif0 bus1
atf_check -s exit:0 rump.ifconfig shmif0 10.0.0.2/24
atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::2/64
atf_check -s exit:0 rump.ifconfig shmif0 up
@@ -79,11 +75,11 @@ add_test()
}; \
mcast_${name}_body() { \
run_test \"${name}\" \"${opts}\"; \
+ rump_server_destroy_ifaces; \
}; \
mcast_${name}_cleanup() { \
- ${DEBUG} && /usr/bin/shmif_dumpbus -p - bus1 2>/dev/null | \
- /usr/sbin/tcpdump -n -e -r -; \
- env RUMP_SERVER=unix://commsock rump.halt; \
+ ${DEBUG} && dump; \
+ cleanup; \
}"
atf_add_test_case "mcast_${name}"
}
diff --git a/net/ndp/Makefile b/net/ndp/Makefile
index 2d890e7ee220..8b96613774d6 100644
--- a/net/ndp/Makefile
+++ b/net/ndp/Makefile
@@ -1,12 +1,13 @@
-# $NetBSD: Makefile,v 1.2 2015/11/11 07:52:57 ozaki-r Exp $
+# $NetBSD: Makefile,v 1.3 2016/11/24 08:52:20 ozaki-r Exp $
#
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/net/ndp
-TESTS_SH= t_dad
-TESTS_SH+= t_ndp
-TESTS_SH+= t_ra
+.for name in dad ndp ra
+TESTS_SH+= t_${name}
+TESTS_SH_SRC_t_${name}= ../net_common.sh t_${name}.sh
+.endfor
.include <bsd.test.mk>
diff --git a/net/ndp/t_dad.sh b/net/ndp/t_dad.sh
index 98b8ae0b8c8b..50ec933560de 100755
--- a/net/ndp/t_dad.sh
+++ b/net/ndp/t_dad.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_dad.sh,v 1.5 2016/08/10 23:07:57 kre Exp $
+# $NetBSD: t_dad.sh,v 1.12 2016/11/25 08:51:17 ozaki-r Exp $
#
# Copyright (c) 2015 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -25,18 +25,16 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-inetserver="rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet"
-inetserver="$inetserver -lrumpnet_netinet6 -lrumpnet_shmif"
-inetserver="$inetserver -lrumpdev"
-HIJACKING="env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=sysctl=yes"
-
SOCKLOCAL=unix://commsock1
SOCKPEER=unix://commsock2
-DEBUG=false
+DEBUG=${DEBUG:-false}
+
+duplicated="[Dd][Uu][Pp][Ll][Ii][Cc][Aa][Tt][Ee][Dd]"
atf_test_case dad_basic cleanup
atf_test_case dad_duplicated cleanup
+atf_test_case dad_count cleanup
dad_basic_head()
{
@@ -50,15 +48,20 @@ dad_duplicated_head()
atf_set "require.progs" "rump_server"
}
+dad_count_head()
+{
+ atf_set "descr" "Tests for IPv6 DAD count behavior"
+ atf_set "require.progs" "rump_server"
+}
+
setup_server()
{
local sock=$1
local ip=$2
- export RUMP_SERVER=$sock
+ rump_server_add_iface $sock shmif0 bus1
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1
+ export RUMP_SERVER=$sock
atf_check -s exit:0 rump.ifconfig shmif0 inet6 $ip
atf_check -s exit:0 rump.ifconfig shmif0 up
atf_check -s exit:0 rump.ifconfig -w 10
@@ -76,21 +79,6 @@ make_ns_pkt_str()
echo $pkt
}
-extract_new_packets()
-{
- local old=./old
-
- if [ ! -f $old ]; then
- old=/dev/null
- fi
-
- shmif_dumpbus -p - bus1 2>/dev/null| \
- tcpdump -n -e -r - 2>/dev/null > ./new
- diff -u $old ./new |grep '^+' |cut -d '+' -f 2 > ./diff
- mv -f ./new ./old
- cat ./diff
-}
-
dad_basic_body()
{
local pkt=
@@ -98,11 +86,10 @@ dad_basic_body()
local localip2=fc00::2
local localip3=fc00::3
- atf_check -s exit:0 ${inetserver} $SOCKLOCAL
- export RUMP_SERVER=$SOCKLOCAL
+ rump_server_start $SOCKLOCAL netinet6
+ rump_server_add_iface $SOCKLOCAL shmif0 bus1
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1
+ export RUMP_SERVER=$SOCKLOCAL
atf_check -s exit:0 rump.ifconfig shmif0 inet6 $localip1
atf_check -s exit:0 rump.ifconfig shmif0 inet6 $localip2
$DEBUG && rump.ifconfig shmif0
@@ -118,7 +105,7 @@ dad_basic_body()
#atf_check -s exit:0 -x "cat ./out |grep $localip2 |grep -q tentative"
atf_check -s exit:0 sleep 2
- extract_new_packets > ./out
+ extract_new_packets bus1 > ./out
$DEBUG && cat ./out
# Check DAD probe packets (Neighbor Solicitation Message)
@@ -130,7 +117,7 @@ dad_basic_body()
# Waiting for DAD complete
atf_check -s exit:0 rump.ifconfig -w 10
- extract_new_packets > ./out
+ extract_new_packets bus1 > ./out
$DEBUG && cat ./out
# IPv6 DAD doesn't announce (Neighbor Advertisement Message)
@@ -149,20 +136,22 @@ dad_basic_body()
# Check DAD probe packets (Neighbor Solicitation Message)
atf_check -s exit:0 sleep 2
- extract_new_packets > ./out
+ extract_new_packets bus1 > ./out
$DEBUG && cat ./out
pkt=$(make_ns_pkt_str 3 $localip3)
atf_check -s exit:0 -x "cat ./out |grep -q '$pkt'"
# Waiting for DAD complete
atf_check -s exit:0 rump.ifconfig -w 10
- extract_new_packets > ./out
+ extract_new_packets bus1 > ./out
$DEBUG && cat ./out
# IPv6 DAD doesn't announce (Neighbor Advertisement Message)
# The new address left tentative
atf_check -s not-exit:0 -x "rump.ifconfig shmif0 |grep $localip3 |grep -q tentative"
+
+ rump_server_destroy_ifaces
}
dad_duplicated_body()
@@ -171,8 +160,8 @@ dad_duplicated_body()
local localip2=fc00::11
local peerip=fc00::2
- atf_check -s exit:0 ${inetserver} $SOCKLOCAL
- atf_check -s exit:0 ${inetserver} $SOCKPEER
+ rump_server_start $SOCKLOCAL netinet6
+ rump_server_start $SOCKPEER netinet6
setup_server $SOCKLOCAL $localip1
setup_server $SOCKPEER $peerip
@@ -180,7 +169,8 @@ dad_duplicated_body()
export RUMP_SERVER=$SOCKLOCAL
# The primary address isn't marked as duplicated
- atf_check -s not-exit:0 -x "rump.ifconfig shmif0 |grep $localip1 |grep -q duplicated"
+ atf_check -s exit:0 -o not-match:"$localip1.+$duplicated" \
+ rump.ifconfig shmif0
#
# Add a new address duplicated with the peer server
@@ -189,52 +179,81 @@ dad_duplicated_body()
atf_check -s exit:0 sleep 1
# The new address is marked as duplicated
- atf_check -s exit:0 -x "rump.ifconfig shmif0 |grep $peerip |grep -q duplicated"
+ atf_check -s exit:0 -o match:"$peerip.+$duplicated" \
+ rump.ifconfig shmif0
# A unique address isn't marked as duplicated
atf_check -s exit:0 rump.ifconfig shmif0 inet6 $localip2
atf_check -s exit:0 sleep 1
- atf_check -s not-exit:0 -x "rump.ifconfig shmif0 |grep $localip2 |grep -q duplicated"
+ atf_check -s exit:0 -o not-match:"$localip2.+$duplicated" \
+ rump.ifconfig shmif0
+
+ rump_server_destroy_ifaces
}
-cleanup()
+dad_count_test()
{
- gdb -ex bt /usr/bin/rump_server rump_server.core
- gdb -ex bt /usr/sbin/arp arp.core
- env RUMP_SERVER=$SOCKLOCAL rump.halt
- env RUMP_SERVER=$SOCKPEER rump.halt
+ local pkt=
+ local count=$1
+ local id=$2
+ local target=$3
+
+ #
+ # Set DAD count to $count
+ #
+ atf_check -s exit:0 rump.sysctl -w -q net.inet6.ip6.dad_count=$count
+
+ # Add a new address
+ atf_check -s exit:0 rump.ifconfig shmif0 inet6 $target
+
+ # Waiting for DAD complete
+ atf_check -s exit:0 rump.ifconfig -w 20
+
+ # Check the number of DAD probe packets (Neighbor Solicitation Message)
+ atf_check -s exit:0 sleep 2
+ extract_new_packets bus1 > ./out
+ $DEBUG && cat ./out
+ pkt=$(make_ns_pkt_str $id $target)
+ atf_check -s exit:0 -o match:"$count" \
+ -x "cat ./out |grep '$pkt' | wc -l | tr -d ' '"
}
-dump_local()
+dad_count_body()
{
+ local localip1=fc00::1
+ local localip2=fc00::2
+
+ rump_server_start $SOCKLOCAL netinet6
+ rump_server_add_iface $SOCKLOCAL shmif0 bus1
+
export RUMP_SERVER=$SOCKLOCAL
- rump.netstat -nr
- rump.arp -n -a
- rump.ifconfig
- $HIJACKING dmesg
-}
-dump_peer()
-{
- export RUMP_SERVER=$SOCKPEER
- rump.netstat -nr
- rump.arp -n -a
- rump.ifconfig
- $HIJACKING dmesg
-}
+ # Check default value
+ atf_check -s exit:0 -o match:"1" rump.sysctl -n net.inet6.ip6.dad_count
-dump()
-{
- dump_local
- dump_peer
- shmif_dumpbus -p - bus1 2>/dev/null| tcpdump -n -e -r -
+ # Setup interface
+ atf_check -s exit:0 rump.ifconfig shmif0 up
+ atf_check -s exit:0 sleep 2
+ rump.ifconfig shmif0 > ./out
+ $DEBUG && cat ./out
+
+ #
+ # Set and test DAD count (count=1)
+ #
+ dad_count_test 1 1 $localip1
+
+ #
+ # Set and test DAD count (count=8)
+ #
+ dad_count_test 8 2 $localip2
+
+ rump_server_destroy_ifaces
}
dad_basic_cleanup()
{
- $DEBUG && dump_local
- $DEBUG && shmif_dumpbus -p - bus1 2>/dev/null| tcpdump -n -e -r -
- env RUMP_SERVER=$SOCKLOCAL rump.halt
+ $DEBUG && dump
+ cleanup
}
dad_duplicated_cleanup()
@@ -243,8 +262,15 @@ dad_duplicated_cleanup()
cleanup
}
+dad_count_cleanup()
+{
+ $DEBUG && dump
+ cleanup
+}
+
atf_init_test_cases()
{
atf_add_test_case dad_basic
atf_add_test_case dad_duplicated
+ atf_add_test_case dad_count
}
diff --git a/net/ndp/t_ndp.sh b/net/ndp/t_ndp.sh
index 449198122f69..aa96390cf96e 100755
--- a/net/ndp/t_ndp.sh
+++ b/net/ndp/t_ndp.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_ndp.sh,v 1.13 2016/08/10 23:07:57 kre Exp $
+# $NetBSD: t_ndp.sh,v 1.17 2016/11/25 08:51:17 ozaki-r Exp $
#
# Copyright (c) 2015 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -25,17 +25,12 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-inetserver="rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet"
-inetserver="$inetserver -lrumpnet_netinet6 -lrumpnet_shmif"
-inetserver="$inetserver -lrumpdev"
-HIJACKING="env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=sysctl=yes"
-
SOCKSRC=unix://commsock1
SOCKDST=unix://commsock2
IP6SRC=fc00::1
IP6DST=fc00::2
-DEBUG=true
+DEBUG=${DEBUG:-true}
TIMEOUT=1
atf_test_case ndp_cache_expiration cleanup
@@ -78,9 +73,8 @@ setup_dst_server()
{
local assign_ip=$1
+ rump_server_add_iface $SOCKDST shmif0 bus1
export RUMP_SERVER=$SOCKDST
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1
if [ "$assign_ip" != no ]; then
atf_check -s exit:0 rump.ifconfig shmif0 inet6 $IP6DST
fi
@@ -97,8 +91,7 @@ setup_src_server()
export RUMP_SERVER=$SOCKSRC
# Setup an interface
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1
+ rump_server_add_iface $SOCKSRC shmif0 bus1
atf_check -s exit:0 rump.ifconfig shmif0 inet6 $IP6SRC
atf_check -s exit:0 rump.ifconfig shmif0 up
atf_check -s exit:0 rump.ifconfig -w 10
@@ -119,8 +112,9 @@ get_timeout()
ndp_cache_expiration_body()
{
- atf_check -s exit:0 ${inetserver} $SOCKSRC
- atf_check -s exit:0 ${inetserver} $SOCKDST
+
+ rump_server_start $SOCKSRC netinet6
+ rump_server_start $SOCKDST netinet6
setup_dst_server
setup_src_server
@@ -144,6 +138,8 @@ ndp_cache_expiration_body()
atf_check -s exit:0 -o match:'permanent' rump.ndp -n $IP6SRC
# Expired but remains until GC sweaps it (1 day)
atf_check -s exit:0 -o match:'(1d0h0m|23h59m)' rump.ndp -n $IP6DST
+
+ rump_server_destroy_ifaces
}
ifdown_dst_server()
@@ -155,8 +151,9 @@ ifdown_dst_server()
ndp_commands_body()
{
- atf_check -s exit:0 ${inetserver} $SOCKSRC
- atf_check -s exit:0 ${inetserver} $SOCKDST
+
+ rump_server_start $SOCKSRC netinet6
+ rump_server_start $SOCKDST netinet6
setup_dst_server
setup_src_server
@@ -217,13 +214,14 @@ ndp_commands_body()
$DEBUG && rump.ndp -n -a
atf_check -s exit:0 -o not-match:'permanent' rump.ndp -n fc00::10
- return 0
+ rump_server_destroy_ifaces
}
ndp_cache_overwriting_body()
{
- atf_check -s exit:0 ${inetserver} $SOCKSRC
- atf_check -s exit:0 ${inetserver} $SOCKDST
+
+ rump_server_start $SOCKSRC netinet6
+ rump_server_start $SOCKDST netinet6
setup_dst_server
setup_src_server
@@ -249,7 +247,7 @@ ndp_cache_overwriting_body()
#atf_check -s not-exit:0 -e ignore rump.ndp -s fc00::10 b2:a0:20:00:00:ff
#$DEBUG && rump.ndp -n -a
- return 0
+ rump_server_destroy_ifaces
}
get_n_caches()
@@ -261,8 +259,8 @@ get_n_caches()
ndp_neighborgcthresh_body()
{
- atf_check -s exit:0 ${inetserver} $SOCKSRC
- atf_check -s exit:0 ${inetserver} $SOCKDST
+ rump_server_start $SOCKSRC netinet6
+ rump_server_start $SOCKDST netinet6
setup_dst_server no
setup_src_server
@@ -311,7 +309,7 @@ ndp_neighborgcthresh_body()
atf_fail "Neighbor caches are not GC-ed"
fi
- return 0
+ rump_server_destroy_ifaces
}
make_pkt_str_na()
@@ -324,33 +322,18 @@ make_pkt_str_na()
echo $pkt
}
-extract_new_packets()
-{
- local old=./old
-
- if [ ! -f $old ]; then
- old=/dev/null
- fi
-
- shmif_dumpbus -p - bus1 2>/dev/null| \
- tcpdump -n -e -r - 2>/dev/null > ./new
- diff -u $old ./new |grep '^+' |cut -d '+' -f 2 > ./diff
- mv -f ./new ./old
- cat ./diff
-}
-
ndp_link_activation_body()
{
local linklocal=
- atf_check -s exit:0 ${inetserver} $SOCKSRC
- atf_check -s exit:0 ${inetserver} $SOCKDST
+ rump_server_start $SOCKSRC netinet6
+ rump_server_start $SOCKDST netinet6
setup_dst_server
setup_src_server
# flush old packets
- extract_new_packets > ./out
+ extract_new_packets bus1 > ./out
export RUMP_SERVER=$SOCKSRC
@@ -358,7 +341,7 @@ ndp_link_activation_body()
b2:a1:00:00:00:01
atf_check -s exit:0 sleep 1
- extract_new_packets > ./out
+ extract_new_packets bus1 > ./out
$DEBUG && cat ./out
linklocal=$(rump.ifconfig shmif0 |awk '/fe80/ {print $2;}' |awk -F % '{print $1;}')
@@ -371,7 +354,7 @@ ndp_link_activation_body()
b2:a1:00:00:00:02 active
atf_check -s exit:0 sleep 1
- extract_new_packets > ./out
+ extract_new_packets bus1 > ./out
$DEBUG && cat ./out
linklocal=$(rump.ifconfig shmif0 |awk '/fe80/ {print $2;}' |awk -F % '{print $1;}')
@@ -379,39 +362,8 @@ ndp_link_activation_body()
pkt=$(make_pkt_str_na $linklocal b2:a1:00:00:00:02)
atf_check -s exit:0 -x "cat ./out |grep -q '$pkt'"
-}
-cleanup()
-{
- env RUMP_SERVER=$SOCKSRC rump.halt
- env RUMP_SERVER=$SOCKDST rump.halt
-}
-
-dump_src()
-{
- export RUMP_SERVER=$SOCKSRC
- rump.netstat -nr
- rump.ndp -n -a
- rump.ifconfig
- $HIJACKING dmesg
-}
-
-dump_dst()
-{
- export RUMP_SERVER=$SOCKDST
- rump.netstat -nr
- rump.ndp -n -a
- rump.ifconfig
- $HIJACKING dmesg
-}
-
-dump()
-{
- dump_src
- dump_dst
- shmif_dumpbus -p - bus1 2>/dev/null| tcpdump -n -e -r -
- $DEBUG && gdb -ex bt /usr/bin/rump_server rump_server.core
- $DEBUG && gdb -ex bt /usr/sbin/rump.ndp rump.ndp.core
+ rump_server_destroy_ifaces
}
ndp_cache_expiration_cleanup()
diff --git a/net/ndp/t_ra.sh b/net/ndp/t_ra.sh
index cf81683fc0f4..b2345704f462 100755
--- a/net/ndp/t_ra.sh
+++ b/net/ndp/t_ra.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_ra.sh,v 1.3 2016/08/10 23:07:57 kre Exp $
+# $NetBSD: t_ra.sh,v 1.20 2017/01/11 03:15:44 ozaki-r Exp $
#
# Copyright (c) 2015 Internet Initiative Japan Inc.
# All rights reserved.
@@ -25,27 +25,49 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-RUMPFLAGS="-lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_netinet6"
-RUMPFLAGS="${RUMPFLAGS} -lrumpnet_shmif -lrumpdev"
-RUMPFLAGS="${RUMPFLAGS} -lrumpvfs -lrumpfs_ffs"
-
RUMPSRV=unix://r1
+RUMPSRV1_2=unix://r12
RUMPCLI=unix://r2
+RUMPSRV3=unix://r3
+RUMPSRV4=unix://r4
IP6SRV=fc00:1::1
+IP6SRV1_2=fc00:1::2
+IP6SRV_PREFIX=fc00:1:
IP6CLI=fc00:2::2
-PIDFILE=/var/run/rump.rtadvd.pid
+IP6SRV3=fc00:3::1
+IP6SRV3_PREFIX=fc00:3:
+IP6SRV4=fc00:4::1
+IP6SRV4_PREFIX=fc00:4:
+PIDFILE=./rump.rtadvd.pid
+PIDFILE1_2=./rump.rtadvd.pid12
+PIDFILE3=./rump.rtadvd.pid3
+PIDFILE4=./rump.rtadvd.pid4
CONFIG=./rtadvd.conf
-DEBUG=true
+WAITTIME=2
+DEBUG=${DEBUG:-true}
+
+init_server()
+{
+
+ export RUMP_SERVER=$1
+ atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.forwarding=1
+ export LD_PRELOAD=/usr/lib/librumphijack.so
+ atf_check -s exit:0 mkdir -p /rump/var/chroot/rtadvd
+ unset LD_PRELOAD
+ unset RUMP_SERVER
+}
setup_shmif0()
{
- local IP6ADDR=${1}
- shift
+ local sock=$1
+ local IP6ADDR=$2
+
+ rump_server_add_iface $sock shmif0 bus1
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1
+ export RUMP_SERVER=$sock
atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6ADDR}
atf_check -s exit:0 rump.ifconfig shmif0 up
+ atf_check -s exit:0 rump.ifconfig -w 10
$DEBUG && rump.ifconfig
}
@@ -72,41 +94,81 @@ shmif0:\
_EOF
}
-atf_test_case basic cleanup
-basic_head()
+start_rtadvd()
+{
+ local sock=$1
+ local pidfile=$2
+
+ export RUMP_SERVER=$sock
+ atf_check -s exit:0 rump.rtadvd -c ${CONFIG} -p $pidfile shmif0
+ while [ ! -f $pidfile ]; do
+ sleep 0.2
+ done
+ unset RUMP_SERVER
+}
+
+check_entries()
+{
+ local cli=$1
+ local srv=$2
+ local addr_prefix=$3
+ local mac_srv= ll_srv=
+
+ ll_srv=$(get_linklocal_addr $srv shmif0)
+ mac_srv=$(get_macaddr $srv shmif0)
+
+ export RUMP_SERVER=$cli
+ $DEBUG && dump_entries
+ atf_check -s exit:0 -o match:'if=shmif0' rump.ndp -r
+ atf_check -s exit:0 -o match:'advertised' rump.ndp -p
+ atf_check -s exit:0 -o match:"${ll_srv}%shmif0 \(reachable\)" rump.ndp -p
+ atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
+ atf_check -s exit:0 \
+ -o match:"$ll_srv%shmif0 +$mac_srv +shmif0 +(23h59m|1d0h0m)..s S R" \
+ rump.ndp -n -a
+ atf_check -s exit:0 -o match:$addr_prefix rump.ndp -n -a
+ atf_check -s exit:0 -o match:"$addr_prefix.+<AUTOCONF>" \
+ rump.ifconfig shmif0 inet6
+ unset RUMP_SERVER
+}
+
+dump_entries()
+{
+
+ echo ndp -n -a
+ rump.ndp -n -a
+ echo ndp -p
+ rump.ndp -p
+ echo ndp -r
+ rump.ndp -r
+}
+
+atf_test_case ra_basic cleanup
+ra_basic_head()
{
atf_set "descr" "Tests for basic functions of router advaertisement(RA)"
atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
}
-basic_body()
+ra_basic_body()
{
- atf_check -s exit:0 rump_server ${RUMPFLAGS} ${RUMPSRV}
- atf_check -s exit:0 rump_server ${RUMPFLAGS} ${RUMPCLI}
+ rump_server_fs_start $RUMPSRV netinet6
+ rump_server_start $RUMPCLI netinet6
- export RUMP_SERVER=${RUMPSRV}
- setup_shmif0 ${IP6SRV}
- atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.forwarding=1
- export LD_PRELOAD=/usr/lib/librumphijack.so
- atf_check -s exit:0 mkdir -p /rump/var/chroot/rtadvd
- unset LD_PRELOAD
- unset RUMP_SERVER
+ setup_shmif0 ${RUMPSRV} ${IP6SRV}
+ init_server $RUMPSRV
+ setup_shmif0 ${RUMPCLI} ${IP6CLI}
export RUMP_SERVER=${RUMPCLI}
- setup_shmif0 ${IP6CLI}
$DEBUG && rump.ndp -n -a
atf_check -s exit:0 -o match:'= 0' rump.sysctl net.inet6.ip6.accept_rtadv
unset RUMP_SERVER
create_rtadvdconfig
-
- export RUMP_SERVER=${RUMPSRV}
- atf_check -s exit:0 rump.rtadvd -c ${CONFIG} shmif0
- atf_check -s exit:0 sleep 3
- atf_check -s exit:0 -o ignore -e empty cat ${PIDFILE}
- unset RUMP_SERVER
+ start_rtadvd $RUMPSRV $PIDFILE
+ sleep $WAITTIME
export RUMP_SERVER=${RUMPCLI}
atf_check -s exit:0 -o empty rump.ndp -r
@@ -124,30 +186,482 @@ basic_body()
atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
unset RUMP_SERVER
- export RUMP_SERVER=${RUMPSRV}
- atf_check -s exit:0 rump.rtadvd -c ${CONFIG} shmif0
- atf_check -s exit:0 sleep 3
- atf_check -s exit:0 -o ignore -e empty cat ${PIDFILE}
+ start_rtadvd $RUMPSRV $PIDFILE
+ sleep $WAITTIME
+
+ check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
+
+ atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
+ wait_term ${PIDFILE}
+
+ rump_server_destroy_ifaces
+}
+
+ra_basic_cleanup()
+{
+
+ if [ -f ${PIDFILE} ]; then
+ kill -TERM `cat ${PIDFILE}`
+ wait_term ${PIDFILE}
+ fi
+
+ $DEBUG && dump
+ cleanup
+}
+
+atf_test_case ra_flush_prefix_entries cleanup
+ra_flush_prefix_entries_head()
+{
+
+ atf_set "descr" "Tests for flushing prefixes (ndp -P)"
+ atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
+}
+
+ra_flush_prefix_entries_body()
+{
+
+ rump_server_fs_start $RUMPSRV netinet6
+ rump_server_start $RUMPCLI netinet6
+
+ setup_shmif0 ${RUMPSRV} ${IP6SRV}
+ setup_shmif0 ${RUMPCLI} ${IP6CLI}
+
+ init_server $RUMPSRV
+
+ create_rtadvdconfig
+
+ export RUMP_SERVER=${RUMPCLI}
+ atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
unset RUMP_SERVER
+ start_rtadvd $RUMPSRV $PIDFILE
+ sleep $WAITTIME
+
+ check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
+
export RUMP_SERVER=${RUMPCLI}
- $DEBUG && rump.ndp -n -a
- $DEBUG && rump.ndp -r
+
+ # Terminate rtadvd to prevent new RA messages from coming
+ # Note that ifconfig down; kill -TERM doesn't work
+ kill -KILL `cat ${PIDFILE}`
+
+ # Flush all the entries in the prefix list
+ atf_check -s exit:0 rump.ndp -P
+
+ $DEBUG && dump_entries
atf_check -s exit:0 -o match:'if=shmif0' rump.ndp -r
- atf_check -s exit:0 -o match:'advertised' rump.ndp -p
+ atf_check -s exit:0 -o empty rump.ndp -p
atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
- atf_check -s exit:0 -o match:'23h59m..s S R' rump.ndp -n -a
+ atf_check -s exit:0 -o match:'(23h59m|1d0h0m)..s S R' rump.ndp -n -a
+ atf_check -s exit:0 -o match:'fc00:1:' rump.ndp -n -a
+ atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6
+ unset RUMP_SERVER
+
+ rump_server_destroy_ifaces
+}
+
+ra_flush_prefix_entries_cleanup()
+{
+
+ $DEBUG && dump
+ cleanup
+}
+
+atf_test_case ra_flush_defrouter_entries cleanup
+ra_flush_defrouter_entries_head()
+{
+
+ atf_set "descr" "Tests for flushing default routers (ndp -R)"
+ atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
+}
+
+ra_flush_defrouter_entries_body()
+{
+
+ rump_server_fs_start $RUMPSRV netinet6
+ rump_server_start $RUMPCLI netinet6
+
+ setup_shmif0 ${RUMPSRV} ${IP6SRV}
+ setup_shmif0 ${RUMPCLI} ${IP6CLI}
+
+ init_server $RUMPSRV
+
+ create_rtadvdconfig
+
+ export RUMP_SERVER=${RUMPCLI}
+ atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
+ unset RUMP_SERVER
+
+ start_rtadvd $RUMPSRV $PIDFILE
+ sleep $WAITTIME
+
+ check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
+
+ export RUMP_SERVER=${RUMPCLI}
+
+ # Terminate rtadvd to prevent new RA messages from coming
+ # Note that ifconfig down; kill -TERM doesn't work
+ kill -KILL `cat ${PIDFILE}`
+
+ # Flush all the entries in the default router list
+ atf_check -s exit:0 rump.ndp -R
+
+ $DEBUG && dump_entries
+ atf_check -s exit:0 -o empty rump.ndp -r
+ atf_check -s exit:0 -o match:'No advertising router' rump.ndp -p
+ atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
+ atf_check -s exit:0 -o match:'(23h59m|1d0h0m)..s S R' rump.ndp -n -a
atf_check -s exit:0 -o match:'fc00:1:' rump.ndp -n -a
atf_check -s exit:0 -o match:'fc00:1:' rump.ifconfig shmif0 inet6
unset RUMP_SERVER
+ rump_server_destroy_ifaces
+}
+
+ra_flush_defrouter_entries_cleanup()
+{
+
+ $DEBUG && dump
+ cleanup
+}
+
+atf_test_case ra_delete_address cleanup
+ra_delete_address_head()
+{
+
+ atf_set "descr" "Tests for deleting auto-configured address"
+ atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
+}
+
+ra_delete_address_body()
+{
+
+ rump_server_fs_start $RUMPSRV netinet6
+ rump_server_start $RUMPCLI netinet6
+
+ setup_shmif0 ${RUMPSRV} ${IP6SRV}
+ setup_shmif0 ${RUMPCLI} ${IP6CLI}
+
+ init_server $RUMPSRV
+
+ create_rtadvdconfig
+
+ export RUMP_SERVER=${RUMPCLI}
+ atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
+ unset RUMP_SERVER
+
+ start_rtadvd $RUMPSRV $PIDFILE
+ sleep $WAITTIME
+
+ check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
+
+ export RUMP_SERVER=${RUMPCLI}
+ $DEBUG && rump.ifconfig shmif0
+ atf_check -s exit:0 rump.ifconfig shmif0 inet6 \
+ $(rump.ifconfig shmif0 |awk '/AUTOCONF/ {print $2}') delete
+ unset RUMP_SERVER
+
atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
wait_term ${PIDFILE}
- return 0
+ rump_server_destroy_ifaces
+}
+
+ra_delete_address_cleanup()
+{
+
+ if [ -f ${PIDFILE} ]; then
+ kill -TERM `cat ${PIDFILE}`
+ wait_term ${PIDFILE}
+ fi
+
+ $DEBUG && dump
+ cleanup
+}
+
+atf_test_case ra_multiple_routers cleanup
+ra_multiple_routers_head()
+{
+
+ atf_set "descr" "Tests for multiple routers"
+ atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
+}
+
+ra_multiple_routers_body()
+{
+ local n=
+
+ rump_server_fs_start $RUMPSRV netinet6
+ rump_server_fs_start $RUMPSRV3 netinet6
+ rump_server_start $RUMPCLI netinet6
+
+ setup_shmif0 ${RUMPSRV} ${IP6SRV}
+ setup_shmif0 ${RUMPSRV3} ${IP6SRV3}
+ setup_shmif0 ${RUMPCLI} ${IP6CLI}
+
+ init_server $RUMPSRV
+ init_server $RUMPSRV3
+
+ create_rtadvdconfig
+
+ export RUMP_SERVER=${RUMPCLI}
+ atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
+ unset RUMP_SERVER
+
+ start_rtadvd $RUMPSRV $PIDFILE
+ start_rtadvd $RUMPSRV3 $PIDFILE3
+ sleep $WAITTIME
+
+ check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
+ check_entries $RUMPCLI $RUMPSRV3 $IP6SRV3_PREFIX
+
+ export RUMP_SERVER=$RUMPCLI
+ # Two prefixes are advertised by differnt two routers
+ n=$(rump.ndp -p |grep 'advertised by' |wc -l)
+ atf_check_equal $n 2
+ unset RUMP_SERVER
+
+ atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
+ wait_term ${PIDFILE}
+ atf_check -s exit:0 kill -TERM `cat ${PIDFILE3}`
+ wait_term ${PIDFILE3}
+
+ rump_server_destroy_ifaces
+}
+
+ra_multiple_routers_cleanup()
+{
+
+ if [ -f ${PIDFILE} ]; then
+ kill -TERM `cat ${PIDFILE}`
+ wait_term ${PIDFILE}
+ fi
+ if [ -f ${PIDFILE3} ]; then
+ kill -TERM `cat ${PIDFILE3}`
+ wait_term ${PIDFILE3}
+ fi
+
+ $DEBUG && dump
+ cleanup
+}
+
+atf_test_case ra_multiple_routers_single_prefix cleanup
+ra_multiple_routers_single_prefix_head()
+{
+
+ atf_set "descr" "Tests for multiple routers with a single prefix"
+ atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
+}
+
+ra_multiple_routers_single_prefix_body()
+{
+ local n=
+
+ rump_server_fs_start $RUMPSRV netinet6
+ rump_server_fs_start $RUMPSRV1_2 netinet6
+ rump_server_start $RUMPCLI netinet6
+
+ setup_shmif0 ${RUMPSRV} ${IP6SRV}
+ setup_shmif0 ${RUMPSRV1_2} ${IP6SRV1_2}
+ setup_shmif0 ${RUMPCLI} ${IP6CLI}
+
+ init_server $RUMPSRV
+ init_server $RUMPSRV1_2
+
+ create_rtadvdconfig
+
+ export RUMP_SERVER=${RUMPCLI}
+ atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
+ unset RUMP_SERVER
+
+ start_rtadvd $RUMPSRV $PIDFILE
+ start_rtadvd $RUMPSRV1_2 $PIDFILE1_2
+ sleep $WAITTIME
+
+ check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
+ check_entries $RUMPCLI $RUMPSRV1_2 $IP6SRV_PREFIX
+
+ export RUMP_SERVER=$RUMPCLI
+ # One prefix is advertised by differnt two routers
+ n=$(rump.ndp -p |grep 'advertised by' |wc -l)
+ atf_check_equal $n 1
+ unset RUMP_SERVER
+
+ atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
+ wait_term ${PIDFILE}
+ atf_check -s exit:0 kill -TERM `cat ${PIDFILE1_2}`
+ wait_term ${PIDFILE1_2}
+
+ rump_server_destroy_ifaces
+}
+
+ra_multiple_routers_single_prefix_cleanup()
+{
+
+ if [ -f ${PIDFILE} ]; then
+ kill -TERM `cat ${PIDFILE}`
+ wait_term ${PIDFILE}
+ fi
+ if [ -f ${PIDFILE1_2} ]; then
+ kill -TERM `cat ${PIDFILE1_2}`
+ wait_term ${PIDFILE1_2}
+ fi
+
+ $DEBUG && dump
+ cleanup
+}
+
+atf_test_case ra_multiple_routers_maxifprefixes cleanup
+ra_multiple_routers_maxifprefixes_head()
+{
+
+ atf_set "descr" "Tests for exceeding the number of maximum prefixes"
+ atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
+}
+
+ra_multiple_routers_maxifprefixes_body()
+{
+ local n=
+
+ rump_server_fs_start $RUMPSRV netinet6
+ rump_server_fs_start $RUMPSRV3 netinet6
+ rump_server_fs_start $RUMPSRV4 netinet6
+ rump_server_start $RUMPCLI netinet6
+
+ setup_shmif0 ${RUMPSRV} ${IP6SRV}
+ setup_shmif0 ${RUMPSRV3} ${IP6SRV3}
+ setup_shmif0 ${RUMPSRV4} ${IP6SRV4}
+ setup_shmif0 ${RUMPCLI} ${IP6CLI}
+
+ init_server $RUMPSRV
+ init_server $RUMPSRV3
+ init_server $RUMPSRV4
+
+ create_rtadvdconfig
+
+ export RUMP_SERVER=${RUMPCLI}
+ atf_check -s exit:0 -o match:'0.->.1' \
+ rump.sysctl -w net.inet6.ip6.accept_rtadv=1
+ # Limit the maximum number of prefix entries to 2
+ atf_check -s exit:0 -o match:'16.->.2' \
+ rump.sysctl -w net.inet6.ip6.maxifprefixes=2
+ unset RUMP_SERVER
+
+ start_rtadvd $RUMPSRV $PIDFILE
+ start_rtadvd $RUMPSRV3 $PIDFILE3
+ sleep $WAITTIME
+
+ check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
+ check_entries $RUMPCLI $RUMPSRV3 $IP6SRV3_PREFIX
+
+ start_rtadvd $RUMPSRV4 $PIDFILE4
+ sleep $WAITTIME
+
+ export RUMP_SERVER=${RUMPCLI}
+ $DEBUG && dump_entries
+ # There should remain two prefixes
+ n=$(rump.ndp -p |grep 'advertised by' |wc -l)
+ atf_check_equal $n 2
+ # TODO check other conditions
+ unset RUMP_SERVER
+
+ atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
+ wait_term ${PIDFILE}
+ atf_check -s exit:0 kill -TERM `cat ${PIDFILE3}`
+ wait_term ${PIDFILE3}
+ atf_check -s exit:0 kill -TERM `cat ${PIDFILE4}`
+ wait_term ${PIDFILE4}
+
+ rump_server_destroy_ifaces
+}
+
+ra_multiple_routers_maxifprefixes_cleanup()
+{
+
+ if [ -f ${PIDFILE} ]; then
+ kill -TERM `cat ${PIDFILE}`
+ wait_term ${PIDFILE}
+ fi
+ if [ -f ${PIDFILE3} ]; then
+ kill -TERM `cat ${PIDFILE3}`
+ wait_term ${PIDFILE3}
+ fi
+ if [ -f ${PIDFILE4} ]; then
+ kill -TERM `cat ${PIDFILE4}`
+ wait_term ${PIDFILE4}
+ fi
+
+ $DEBUG && dump
+ cleanup
+}
+
+atf_test_case ra_temporary_address cleanup
+ra_temporary_address_head()
+{
+
+ atf_set "descr" "Tests for IPv6 temporary address"
+ atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
+}
+
+ra_temporary_address_body()
+{
+
+ rump_server_fs_start $RUMPSRV netinet6
+ rump_server_start $RUMPCLI netinet6
+
+ setup_shmif0 ${RUMPSRV} ${IP6SRV}
+ init_server $RUMPSRV
+
+ setup_shmif0 ${RUMPCLI} ${IP6CLI}
+ export RUMP_SERVER=${RUMPCLI}
+ $DEBUG && rump.ndp -n -a
+ atf_check -s exit:0 -o match:'= 0' \
+ rump.sysctl net.inet6.ip6.accept_rtadv
+ atf_check -s exit:0 -o match:'= 0' \
+ rump.sysctl net.inet6.ip6.use_tempaddr
+ unset RUMP_SERVER
+
+ create_rtadvdconfig
+ start_rtadvd $RUMPSRV $PIDFILE
+ sleep $WAITTIME
+
+ export RUMP_SERVER=${RUMPCLI}
+ atf_check -s exit:0 -o empty rump.ndp -r
+ atf_check -s exit:0 -o not-match:'advertised' rump.ndp -p
+ atf_check -s exit:0 -o match:'linkmtu=0' rump.ndp -n -i shmif0
+ atf_check -s exit:0 -o not-match:'S R' rump.ndp -n -a
+ atf_check -s exit:0 -o not-match:'fc00:1:' rump.ndp -n -a
+ atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6
+ unset RUMP_SERVER
+
+ atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
+ wait_term ${PIDFILE}
+
+ export RUMP_SERVER=${RUMPCLI}
+ atf_check -s exit:0 -o match:'0.->.1' \
+ rump.sysctl -w net.inet6.ip6.accept_rtadv=1
+ atf_check -s exit:0 -o match:'0.->.1' \
+ rump.sysctl -w net.inet6.ip6.use_tempaddr=1
+ unset RUMP_SERVER
+
+ start_rtadvd $RUMPSRV $PIDFILE
+ sleep $WAITTIME
+
+ check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
+
+ # Check temporary address
+ export RUMP_SERVER=${RUMPCLI}
+ atf_check -s exit:0 -o match:"$IP6SRV_PREFIX.+<AUTOCONF,TEMPORARY>" \
+ rump.ifconfig shmif0 inet6
+ unset RUMP_SERVER
+
+ atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
+ wait_term ${PIDFILE}
+
+ rump_server_destroy_ifaces
}
-basic_cleanup()
+ra_temporary_address_cleanup()
{
if [ -f ${PIDFILE} ]; then
@@ -155,12 +669,19 @@ basic_cleanup()
wait_term ${PIDFILE}
fi
- env RUMP_SERVER=${RUMPSRV} rump.halt
- env RUMP_SERVER=${RUMPCLI} rump.halt
+ $DEBUG && dump
+ cleanup
}
atf_init_test_cases()
{
- atf_add_test_case basic
+ atf_add_test_case ra_basic
+ atf_add_test_case ra_flush_prefix_entries
+ atf_add_test_case ra_flush_defrouter_entries
+ atf_add_test_case ra_delete_address
+ atf_add_test_case ra_multiple_routers
+ atf_add_test_case ra_multiple_routers_single_prefix
+ atf_add_test_case ra_multiple_routers_maxifprefixes
+ atf_add_test_case ra_temporary_address
}
diff --git a/net/net/Makefile b/net/net/Makefile
index a3a5e413c80e..521b8e5cfb9a 100644
--- a/net/net/Makefile
+++ b/net/net/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.15 2016/08/08 14:16:32 pgoyette Exp $
+# $NetBSD: Makefile,v 1.19 2016/11/24 08:52:20 ozaki-r Exp $
#
.include <bsd.own.mk>
@@ -11,10 +11,12 @@ TESTS_C+= t_udp
TESTS_C+= t_pktinfo
.if (${MKRUMP} != "no") && !defined(BSD_MK_COMPAT_FILE)
TESTS_C+= t_raw
-TESTS_SH= t_forwarding
-TESTS_SH+= t_ipaddress
-TESTS_SH+= t_ipv6address
-TESTS_SH+= t_ipv6_lifetime
+
+.for name in forwarding ipaddress ipv6address ipv6_lifetime mtudisc mtudisc6 \
+ ping6_opts
+TESTS_SH+= t_${name}
+TESTS_SH_SRC_t_${name}= ../net_common.sh t_${name}.sh
+.endfor
.endif
LDADD.t_raw+= -lrumpnet_local -lrumpnet_netinet -lrumpnet_net -lrumpdev
diff --git a/net/net/t_forwarding.sh b/net/net/t_forwarding.sh
index 9e96738311f0..fc30530f14cc 100755
--- a/net/net/t_forwarding.sh
+++ b/net/net/t_forwarding.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_forwarding.sh,v 1.15 2016/08/10 21:33:52 kre Exp $
+# $NetBSD: t_forwarding.sh,v 1.19 2016/11/25 08:51:17 ozaki-r Exp $
#
# Copyright (c) 2015 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -25,9 +25,6 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-inetserver="rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_shmif -lrumpdev"
-inet6server="rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_netinet6 -lrumpnet_shmif -lrumpdev"
-
SOCKSRC=unix://commsock1
SOCKFWD=unix://commsock2
SOCKDST=unix://commsock3
@@ -40,10 +37,9 @@ IP6SRC=fc00:0:0:1::2
IP6SRCGW=fc00:0:0:1::1
IP6DSTGW=fc00:0:0:2::1
IP6DST=fc00:0:0:2::2
-HTTPD_PID=httpd.pid
HTML_FILE=index.html
-DEBUG=false
+DEBUG=${DEBUG:-false}
TIMEOUT=5
atf_test_case ipforwarding_v4 cleanup
@@ -64,6 +60,18 @@ ipforwarding_v6_head()
atf_set "require.progs" "rump_server"
}
+ipforwarding_fastforward_v4_head()
+{
+ atf_set "descr" "Tests for IPv4 fastforward"
+ atf_set "require.progs" "rump_server"
+}
+
+ipforwarding_fastforward_v6_head()
+{
+ atf_set "descr" "Tests for IPv6 fastfoward"
+ atf_set "require.progs" "rump_server"
+}
+
ipforwarding_misc_head()
{
atf_set "descr" "Does IPv4 forwarding tests"
@@ -78,9 +86,9 @@ setup_endpoint()
mode=${4}
gw=${5}
+ rump_server_add_iface $sock shmif0 $bus
+
export RUMP_SERVER=${sock}
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr ${bus}
if [ $mode = "ipv6" ]; then
atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${addr}
atf_check -s exit:0 -o ignore rump.route add -inet6 default ${gw}
@@ -116,12 +124,10 @@ setup_forwarder()
{
mode=${1}
- export RUMP_SERVER=$SOCKFWD
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1
+ rump_server_add_iface $SOCKFWD shmif0 bus1
+ rump_server_add_iface $SOCKFWD shmif1 bus2
- atf_check -s exit:0 rump.ifconfig shmif1 create
- atf_check -s exit:0 rump.ifconfig shmif1 linkstr bus2
+ export RUMP_SERVER=$SOCKFWD
if [ $mode = "ipv6" ]; then
atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6SRCGW}
@@ -146,9 +152,9 @@ setup_forwarder()
setup()
{
- atf_check -s exit:0 ${inetserver} $SOCKSRC
- atf_check -s exit:0 ${inetserver} $SOCKFWD
- atf_check -s exit:0 ${inetserver} $SOCKDST
+ rump_server_start $SOCKSRC
+ rump_server_start $SOCKFWD
+ rump_server_start $SOCKDST
setup_endpoint $SOCKSRC $IP4SRC bus1 ipv4 $IP4SRCGW
setup_endpoint $SOCKDST $IP4DST bus2 ipv4 $IP4DSTGW
@@ -157,29 +163,15 @@ setup()
setup6()
{
- atf_check -s exit:0 ${inet6server} $SOCKSRC
- atf_check -s exit:0 ${inet6server} $SOCKFWD
- atf_check -s exit:0 ${inet6server} $SOCKDST
+ rump_server_start $SOCKSRC netinet6
+ rump_server_start $SOCKFWD netinet6
+ rump_server_start $SOCKDST netinet6
setup_endpoint $SOCKSRC $IP6SRC bus1 ipv6 $IP6SRCGW
setup_endpoint $SOCKDST $IP6DST bus2 ipv6 $IP6DSTGW
setup_forwarder ipv6
}
-setup_bozo()
-{
- local ip=$1
-
- export RUMP_SERVER=$SOCKDST
-
- touch $HTML_FILE
- # start bozo in daemon mode
- atf_check -s exit:0 env LD_PRELOAD=/usr/lib/librumphijack.so \
- /usr/libexec/httpd -P $HTTPD_PID -i $ip -b -s $(pwd)
-
- $DEBUG && rump.netstat -a
-}
-
test_http_get()
{
local ip=$1
@@ -270,15 +262,8 @@ teardown_icmp_bmcastecho()
teardown_interfaces()
{
- export RUMP_SERVER=$SOCKSRC
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 destroy
- export RUMP_SERVER=$SOCKFWD
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 destroy
- atf_check -s exit:0 -o ignore rump.ifconfig shmif1 destroy
-
- export RUMP_SERVER=$SOCKDST
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 destroy
+ rump_server_destroy_ifaces
}
test_setup_forwarding()
@@ -307,33 +292,6 @@ test_teardown_forwarding6()
rump.sysctl net.inet6.ip6.forwarding
}
-cleanup()
-{
- env RUMP_SERVER=$SOCKSRC rump.halt
- env RUMP_SERVER=$SOCKFWD rump.halt
- env RUMP_SERVER=$SOCKDST rump.halt
-}
-
-cleanup_bozo()
-{
-
- if [ -f $HTTPD_PID ]; then
- kill -9 "$(cat $HTTPD_PID)"
- rm -f $HTTPD_PID
- fi
- rm -f $HTML_FILE
-}
-
-dump()
-{
- env RUMP_SERVER=$SOCKSRC rump.netstat -nr
- env RUMP_SERVER=$SOCKFWD rump.netstat -nr
- env RUMP_SERVER=$SOCKDST rump.netstat -nr
-
- /usr/bin/shmif_dumpbus -p - bus1 2>/dev/null| /usr/sbin/tcpdump -n -e -r -
- /usr/bin/shmif_dumpbus -p - bus2 2>/dev/null| /usr/sbin/tcpdump -n -e -r -
-}
-
test_ping_failure()
{
export RUMP_SERVER=$SOCKSRC
@@ -481,7 +439,10 @@ ipforwarding_fastforward_v4_body()
setup_forwarding
test_setup_forwarding
- setup_bozo $IP4DST
+ touch $HTML_FILE
+ start_httpd $SOCKDST $IP4DST
+ $DEBUG && rump.netstat -a
+
test_http_get $IP4DST
teardown_interfaces
@@ -495,7 +456,10 @@ ipforwarding_fastforward_v6_body()
setup_forwarding6
test_setup_forwarding6
- setup_bozo $IP6DST
+ touch $HTML_FILE
+ start_httpd $SOCKDST $IP6DST
+ $DEBUG && rump.netstat -a
+
test_http_get "[$IP6DST]"
teardown_interfaces
@@ -513,7 +477,10 @@ ipforwarding_misc_body()
test_directed_broadcast
- setup_bozo $IP4DST
+ touch $HTML_FILE
+ start_httpd $SOCKDST $IP4DST
+ $DEBUG && rump.netstat -a
+
test_sysctl_ttl $IP4DST
teardown_interfaces
@@ -522,34 +489,34 @@ ipforwarding_misc_body()
ipforwarding_v4_cleanup()
{
- dump
+ $DEBUG && dump
cleanup
}
ipforwarding_v6_cleanup()
{
- dump
+ $DEBUG && dump
cleanup
}
ipforwarding_fastforward_v4_cleanup()
{
- dump
- cleanup_bozo
+ $DEBUG && dump
+ stop_httpd
cleanup
}
ipforwarding_fastforward_v6_cleanup()
{
- dump
- cleanup_bozo
+ $DEBUG && dump
+ stop_httpd
cleanup
}
ipforwarding_misc_cleanup()
{
- dump
- cleanup_bozo
+ $DEBUG && dump
+ stop_httpd
cleanup
}
diff --git a/net/net/t_ipaddress.sh b/net/net/t_ipaddress.sh
index a46f484b6ff3..4cdd9545b693 100755
--- a/net/net/t_ipaddress.sh
+++ b/net/net/t_ipaddress.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_ipaddress.sh,v 1.3 2016/08/10 21:33:52 kre Exp $
+# $NetBSD: t_ipaddress.sh,v 1.9 2016/12/15 02:43:56 ozaki-r Exp $
#
# Copyright (c) 2015 Internet Initiative Japan Inc.
# All rights reserved.
@@ -25,61 +25,37 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-SERVER="rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_shmif -lrumpdev"
-SERVER6="$SERVER -lrumpnet_netinet6"
SOCK_LOCAL=unix://commsock1
BUS=bus
-DEBUG=false
-
-check_entry()
-{
- local ip=$(echo $1 |sed 's/\./\\./g')
- local word=$2
-
- atf_check -s exit:0 -o match:"$word" -e ignore -x \
- "rump.netstat -rn | grep ^'$ip'"
-}
-
-check_entry_fail()
-{
- local ip=$(echo $1 |sed 's/\./\\./g')
- local flags=$2 # Not used currently
-
- atf_check -s not-exit:0 -e ignore -x \
- "rump.netstat -rn | grep ^'$ip'"
-}
+DEBUG=${DEBUG:-false}
test_same_address()
{
local ip=10.0.0.1
local net=10.0.0/24
- atf_check -s exit:0 ${SERVER} ${SOCK_LOCAL}
+ rump_server_start $SOCK_LOCAL
+ rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
+
export RUMP_SERVER=$SOCK_LOCAL
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 create
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 linkstr ${BUS}
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 $ip/24
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
atf_check -s exit:0 -o ignore rump.ifconfig -w 10
$DEBUG && rump.netstat -nr -f inet
- check_entry $ip UHl
- check_entry $ip lo0
- check_entry $ip 'link#2'
- check_entry $net U
- check_entry $net shmif0
- check_entry $net 'link#2'
+ check_route $ip 'link#2' UHl lo0
+ check_route $net 'link#2' UC shmif0
# Delete the address
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 $ip delete
$DEBUG && rump.netstat -nr -f inet
- check_entry_fail $ip
- check_entry_fail $net
+ check_route_no_entry $ip
+ check_route_no_entry $net
# Assign the same address again
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 $ip/24
@@ -87,20 +63,18 @@ test_same_address()
$DEBUG && rump.netstat -nr -f inet
- check_entry $ip UHl
- check_entry $ip lo0
- check_entry $ip 'link#2'
- check_entry $net U
- check_entry $net shmif0
- check_entry $net 'link#2'
+ check_route $ip 'link#2' UHl lo0
+ check_route $net 'link#2' UC shmif0
# Delete the address again
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 $ip delete
$DEBUG && rump.netstat -nr -f inet
- check_entry_fail $ip
- check_entry_fail $net
+ check_route_no_entry $ip
+ check_route_no_entry $net
+
+ rump_server_destroy_ifaces
}
test_same_address6()
@@ -108,31 +82,27 @@ test_same_address6()
local ip=fc00::1
local net=fc00::/64
- atf_check -s exit:0 ${SERVER6} ${SOCK_LOCAL}
+ rump_server_start $SOCK_LOCAL netinet6
+ rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
+
export RUMP_SERVER=$SOCK_LOCAL
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 create
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 linkstr ${BUS}
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 inet6 $ip
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
atf_check -s exit:0 -o ignore rump.ifconfig -w 10
$DEBUG && rump.netstat -nr -f inet6
- check_entry $ip UHl
- check_entry $ip lo0
- check_entry $ip 'link#2'
- check_entry $net U
- check_entry $net shmif0
- check_entry $net 'link#2'
+ check_route $ip 'link#2' UHl lo0
+ check_route $net 'link#2' UC shmif0
# Delete the address
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 inet6 $ip delete
$DEBUG && rump.netstat -nr -f inet6
- check_entry_fail $ip
- check_entry_fail $net
+ check_route_no_entry $ip
+ check_route_no_entry $net
# Assign the same address again
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 inet6 $ip
@@ -140,27 +110,58 @@ test_same_address6()
$DEBUG && rump.netstat -nr -f inet6
- check_entry $ip UHl
- check_entry $ip lo0
- check_entry $ip 'link#2'
- check_entry $net U
- check_entry $net shmif0
- check_entry $net 'link#2'
+ check_route $ip 'link#2' UHl lo0
+ check_route $net 'link#2' UC shmif0
# Delete the address again
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 inet6 $ip delete
$DEBUG && rump.netstat -nr -f inet6
- check_entry_fail $ip
- check_entry_fail $net
+ check_route_no_entry $ip
+ check_route_no_entry $net
+
+ rump_server_destroy_ifaces
}
-cleanup()
+test_auto_linklocal()
{
- $DEBUG && shmif_dumpbus -p - $BUS 2>/dev/null | tcpdump -n -e -r -
- env RUMP_SERVER=$SOCK_LOCAL rump.halt
+ rump_server_start $SOCK_LOCAL netinet6
+ rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
+
+ export RUMP_SERVER=$SOCK_LOCAL
+
+ #
+ # Test enabled auto linklocal
+ #
+
+ # Check default value
+ atf_check -s exit:0 -o match:"1" rump.sysctl -n net.inet6.ip6.auto_linklocal
+
+ atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
+ atf_check -s exit:0 -o ignore rump.ifconfig -w 10
+
+ $DEBUG && rump.netstat -nr -f inet
+
+ # IPv6 link-local address is set
+ atf_check -s exit:0 -o match:"inet6 fe80::" rump.ifconfig shmif0
+
+ #
+ # Test disabled auto linklocal
+ #
+ atf_check -s exit:0 -o ignore rump.sysctl -w -q net.inet6.ip6.auto_linklocal=0
+
+ rump_server_add_iface $SOCK_LOCAL shmif1 $BUS
+ atf_check -s exit:0 -o ignore rump.ifconfig shmif1 up
+ atf_check -s exit:0 -o ignore rump.ifconfig -w 10
+
+ $DEBUG && rump.netstat -nr -f inet
+
+ # IPv6 link-local address is not set
+ atf_check -s exit:0 -o not-match:"inet6 fe80::" rump.ifconfig shmif1
+
+ rump_server_destroy_ifaces
}
add_test()
@@ -177,6 +178,7 @@ add_test()
test_${name}; \
}; \
ipaddr_${name}_cleanup() { \
+ $DEBUG && dump; \
cleanup; \
}"
atf_add_test_case "ipaddr_${name}"
@@ -187,4 +189,5 @@ atf_init_test_cases()
add_test same_address "Assigning/deleting an IP address twice"
add_test same_address6 "Assigning/deleting an IPv6 address twice"
+ add_test auto_linklocal "Assigning an IPv6 link-local address automatically"
}
diff --git a/net/net/t_ipv6_lifetime.sh b/net/net/t_ipv6_lifetime.sh
index 5fb34d0649c0..10e50fd3e1e6 100755
--- a/net/net/t_ipv6_lifetime.sh
+++ b/net/net/t_ipv6_lifetime.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_ipv6_lifetime.sh,v 1.2 2016/08/10 21:33:52 kre Exp $
+# $NetBSD: t_ipv6_lifetime.sh,v 1.6 2016/11/25 08:51:17 ozaki-r Exp $
#
# Copyright (c) 2015 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -25,13 +25,12 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-INET6SERVER="rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpdev"
-INET6SERVER="$INET6SERVER -lrumpnet_netinet6 -lrumpnet_shmif"
-
SOCK=unix://sock
BUS=./bus
-DEBUG=false
+DEBUG=${DEBUG:-false}
+
+deprecated="[Dd][Ee][Pp][Rr][Ee][Cc][Aa][Tt][Ee][Dd]"
atf_test_case basic cleanup
@@ -47,11 +46,11 @@ basic_body()
local bonus=2
local ip="fc00::1"
- atf_check -s exit:0 ${INET6SERVER} $SOCK
+ rump_server_start $SOCK netinet6
+ rump_server_add_iface $SOCK shmif0 $BUS
+
export RUMP_SERVER=$SOCK
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr $BUS
atf_check -s exit:0 rump.ifconfig shmif0 up
# A normal IP address doesn't contain preferred/valid lifetime
@@ -69,7 +68,7 @@ basic_body()
atf_check -s exit:0 sleep $(($time + $bonus))
$DEBUG && rump.ifconfig -L shmif0
# Should remain but marked as deprecated
- atf_check -s exit:0 -o match:'deprecated' rump.ifconfig -L shmif0
+ atf_check -s exit:0 -o match:"$ip.+$deprecated" rump.ifconfig -L shmif0
atf_check -s exit:0 rump.ifconfig shmif0 inet6 $ip delete
# Setting only a valid lifetime (invalid)
@@ -87,38 +86,33 @@ basic_body()
# Shouldn't remain anymore
atf_check -s exit:0 -o not-match:"$ip" rump.ifconfig -L shmif0
+ # Setting both preferred and valid lifetimes (pltime > vltime)
+ atf_check -s not-exit:0 -e match:'Invalid argument' rump.ifconfig \
+ shmif0 inet6 $ip pltime $(($time * 2)) vltime $time
+
# Setting both preferred and valid lifetimes (pltime < vltime)
atf_check -s exit:0 rump.ifconfig shmif0 inet6 $ip \
pltime $time vltime $((time * 2))
$DEBUG && rump.ifconfig -L shmif0
atf_check -s exit:0 -o match:'pltime' rump.ifconfig -L shmif0
atf_check -s exit:0 -o match:'vltime' rump.ifconfig -L shmif0
+
+ if sysctl machdep.cpu_brand 2>/dev/null | grep QEMU >/dev/null 2>&1
+ then
+ atf_check -s exit:0 rump.ifconfig shmif0 inet6 $ip delete
+ atf_skip "unreliable under qemu, skip until PR kern/43997 fixed"
+ fi
+
atf_check -s exit:0 sleep $(($time + $bonus))
$DEBUG && rump.ifconfig -L shmif0
# Should remain but marked as deprecated
- atf_check -s exit:0 -o match:'deprecated' rump.ifconfig -L shmif0
+ atf_check -s exit:0 -o match:"$ip.+$deprecated" rump.ifconfig -L shmif0
atf_check -s exit:0 sleep $(($time + $bonus))
$DEBUG && rump.ifconfig -L shmif0
# Shouldn't remain anymore
atf_check -s exit:0 -o not-match:"$ip" rump.ifconfig -L shmif0
- # Setting both preferred and valid lifetimes (pltime > vltime)
- atf_check -s not-exit:0 -e match:'Invalid argument' rump.ifconfig \
- shmif0 inet6 $ip pltime $(($time * 2)) vltime $time
-
- return 0
-}
-
-cleanup()
-{
- env RUMP_SERVER=$SOCK rump.halt
-}
-
-dump()
-{
- env RUMP_SERVER=$SOCK rump.ifconfig
- env RUMP_SERVER=$SOCK rump.netstat -nr
- shmif_dumpbus -p - $BUS 2>/dev/null| tcpdump -n -e -r -
+ rump_server_destroy_ifaces
}
basic_cleanup()
diff --git a/net/net/t_ipv6address.sh b/net/net/t_ipv6address.sh
index 3448e86b3d92..539a16d38061 100755
--- a/net/net/t_ipv6address.sh
+++ b/net/net/t_ipv6address.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_ipv6address.sh,v 1.7 2016/08/10 21:33:52 kre Exp $
+# $NetBSD: t_ipv6address.sh,v 1.12 2016/12/14 02:50:42 ozaki-r Exp $
#
# Copyright (c) 2015 Internet Initiative Japan Inc.
# All rights reserved.
@@ -24,8 +24,9 @@
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
-SERVER="rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_shmif -lrumpdev"
-SERVER6="$SERVER -lrumpnet_netinet6"
+SERVER="rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet"
+SERVER="${SERVER} -lrumpnet_shmif -lrumpdev"
+SERVER6="${SERVER} -lrumpnet_netinet6"
SOCKSRC=unix://commsock1
SOCKFWD=unix://commsock2
@@ -40,7 +41,7 @@ BUS2=bus2
BUSSRC=bus_src
BUSDST=bus_dst
-DEBUG=true
+DEBUG=${DEBUG:-true}
TIMEOUT=3
atf_test_case linklocal cleanup
@@ -118,41 +119,41 @@ setup_route()
{
local tmp_rump_server=$RUMP_SERVER
- local src_if0_lladdr=`get_lladdr ${SOCKSRC} shmif0`
- local dst_if0_lladdr=`get_lladdr ${SOCKDST} shmif0`
- local fwd_if0_lladdr=`get_lladdr ${SOCKFWD} shmif0`
- local fwd_if1_lladdr=`get_lladdr ${SOCKFWD} shmif1`
+ local src_if0_lladdr=`get_linklocal_addr ${SOCKSRC} shmif0`
+ local dst_if0_lladdr=`get_linklocal_addr ${SOCKDST} shmif0`
+ local fwd_if0_lladdr=`get_linklocal_addr ${SOCKFWD} shmif0`
+ local fwd_if1_lladdr=`get_linklocal_addr ${SOCKFWD} shmif1`
export RUMP_SERVER=${SOCKSRC}
- atf_check -s ignore -o ignore -e ignore rump.route delete -inet6 default \
- ${fwd_if0_lladdr}%shmif0
- atf_check -s exit:0 -o match:"add net default:" rump.route add -inet6 default \
- ${fwd_if0_lladdr}%shmif0
+ atf_check -s ignore -o ignore -e ignore \
+ rump.route delete -inet6 default ${fwd_if0_lladdr}%shmif0
+ atf_check -s exit:0 -o match:"add net default:" \
+ rump.route add -inet6 default ${fwd_if0_lladdr}%shmif0
atf_check -s exit:0 rump.ifconfig shmif1 inet6 ${IP6SRC}
atf_check -s exit:0 -o ignore rump.ifconfig -w 10
$DEBUG && rump.netstat -rn -f inet6
unset RUMP_SERVER
export RUMP_SERVER=${SOCKDST}
- atf_check -s ignore -o ignore -e ignore rump.route delete -inet6 default \
- ${fwd_if1_lladdr}%shmif0
- atf_check -s exit:0 -o match:"add net default:" rump.route add -inet6 default \
- ${fwd_if1_lladdr}%shmif0
+ atf_check -s ignore -o ignore -e ignore \
+ rump.route delete -inet6 default ${fwd_if1_lladdr}%shmif0
+ atf_check -s exit:0 -o match:"add net default:" \
+ rump.route add -inet6 default ${fwd_if1_lladdr}%shmif0
atf_check -s exit:0 rump.ifconfig shmif1 inet6 ${IP6DST}
atf_check -s exit:0 -o ignore rump.ifconfig -w 10
$DEBUG && rump.netstat -rn -f inet6
unset RUMP_SERVER
export RUMP_SERVER=${SOCKFWD}
- atf_check -s ignore -o ignore -e ignore rump.route delete -inet6 ${IP6SRCNW} \
- ${src_if0_lladdr}%shmif0
- atf_check -s exit:0 -o match:"add net" rump.route add -inet6 ${IP6SRCNW} \
- ${src_if0_lladdr}%shmif0
-
- atf_check -s ignore -o ignore -e ignore rump.route delete -inet6 ${IP6DSTNW} \
- ${dst_if0_lladdr}%shmif1
- atf_check -s exit:0 -o match:"add net" rump.route add -inet6 ${IP6DSTNW} \
- ${dst_if0_lladdr}%shmif1
+ atf_check -s ignore -o ignore -e ignore \
+ rump.route delete -inet6 ${IP6SRCNW} ${src_if0_lladdr}%shmif0
+ atf_check -s exit:0 -o match:"add net" \
+ rump.route add -inet6 ${IP6SRCNW} ${src_if0_lladdr}%shmif0
+
+ atf_check -s ignore -o ignore -e ignore \
+ rump.route delete -inet6 ${IP6DSTNW} ${dst_if0_lladdr}%shmif1
+ atf_check -s exit:0 -o match:"add net" \
+ rump.route add -inet6 ${IP6DSTNW} ${dst_if0_lladdr}%shmif1
atf_check -s exit:0 -o ignore rump.ifconfig -w 10
$DEBUG && rump.netstat -rn -f inet6
unset RUMP_SERVER
@@ -197,17 +198,6 @@ cleanup_bus()
export RUMP_SERVER=$tmp_rump_server
}
-
-get_lladdr()
-{
- export RUMP_SERVER=${1}
- rump.ifconfig ${2} inet6 | grep "fe80" \
- | awk '{print $2}' | sed -e "s/%$2//g"
- unset RUMP_SERVER
-
- return 0
-}
-
cleanup_rump_servers()
{
@@ -221,11 +211,11 @@ dump_bus()
shmif_dumpbus -p - ${BUSSRC} 2>/dev/null| tcpdump -n -e -r -
shmif_dumpbus -p - ${BUSDST} 2>/dev/null| tcpdump -n -e -r -
- shmif_dumpbus -p - ${BUS1} 2>/dev/null| tcpdump -n -e -r -
- shmif_dumpbus -p - ${BUS2} 2>/dev/null| tcpdump -n -e -r -
+ shmif_dumpbus -p - ${BUS1} 2>/dev/null| tcpdump -n -e -r -
+ shmif_dumpbus -p - ${BUS2} 2>/dev/null| tcpdump -n -e -r -
}
-dump()
+_dump()
{
export RUMP_SERVER=${SOCKSRC}
@@ -242,19 +232,21 @@ dump()
linklocal_head()
{
- atf_set "descr" "Test for bassically function of the IPv6 linklocal address"
- atf_set "require.progs" "rump_server rump.route rump.ifconfig rump.ping6"
+ atf_set "descr" \
+ "Test for bassically function of the IPv6 linklocal address"
+ atf_set "require.progs" \
+ "rump_server rump.route rump.ifconfig rump.ping6"
}
linklocal_body()
{
setup
- local src_if0_lladdr=`get_lladdr ${SOCKSRC} shmif0`
- local src_if1_lladdr=`get_lladdr ${SOCKSRC} shmif1`
- local dst_if0_lladdr=`get_lladdr ${SOCKDST} shmif0`
- local fwd_if0_lladdr=`get_lladdr ${SOCKFWD} shmif0`
- local fwd_if1_lladdr=`get_lladdr ${SOCKFWD} shmif1`
+ local src_if0_lladdr=`get_linklocal_addr ${SOCKSRC} shmif0`
+ local src_if1_lladdr=`get_linklocal_addr ${SOCKSRC} shmif1`
+ local dst_if0_lladdr=`get_linklocal_addr ${SOCKDST} shmif0`
+ local fwd_if0_lladdr=`get_linklocal_addr ${SOCKFWD} shmif0`
+ local fwd_if1_lladdr=`get_linklocal_addr ${SOCKFWD} shmif1`
export RUMP_SERVER=${SOCKSRC}
$DEBUG && rump.ifconfig
@@ -271,7 +263,7 @@ linklocal_body()
atf_check -s ignore -o empty -e ignore \
-x "shmif_dumpbus -p - ${BUSSRC} | tcpdump -r - -n -p icmp6"
atf_check -s ignore -o not-empty -e ignore \
- -x "shmif_dumpbus -p - ${BUS1} | tcpdump -r - -n -p icmp6"
+ -x "shmif_dumpbus -p - ${BUS1} | tcpdump -r - -n -p icmp6"
cleanup_bus
@@ -279,7 +271,7 @@ linklocal_body()
rump.ping6 -c 1 -X $TIMEOUT -n -S ${src_if1_lladdr}%shmif1 \
${fwd_if0_lladdr}%shmif0
atf_check -s ignore -o not-match:"${src_if1_lladdr}" -e ignore \
- -x "shmif_dumpbus -p - ${BUS1} | tcpdump -r - -n -p icmp6"
+ -x "shmif_dumpbus -p - ${BUS1} | tcpdump -r - -n -p icmp6"
$DEBUG && shmif_dumpbus -p - ${BUS1} | tcpdump -r - -n -p icmp6
unset RUMP_SERVER
@@ -290,16 +282,16 @@ linklocal_body()
unset RUMP_SERVER
export RUMP_SERVER=${SOCKSRC}
- atf_check -s exit:0 -o match:"add net default:" rump.route add -inet6 default \
- ${fwd_if0_lladdr}%shmif0
+ atf_check -s exit:0 -o match:"add net default:" \
+ rump.route add -inet6 default ${fwd_if0_lladdr}%shmif0
atf_check -s exit:0 -o ignore rump.ifconfig -w 10
$DEBUG && rump.ifconfig shmif0
- $DEBUG && dump
+ $DEBUG && _dump
export RUMP_SERVER=${SOCKSRC}
atf_check -s exit:0 -o match:"0.0% packet loss" \
- rump.ping6 -c 1 -X $TIMEOUT -n -S ${src_if0_lladdr}%shmif0 ${IP6FWD0}
+ rump.ping6 -c 1 -X $TIMEOUT -n -S ${src_if0_lladdr}%shmif0 ${IP6FWD0}
unset RUMP_SERVER
export RUMP_SERVER=${SOCKFWD}
@@ -340,7 +332,7 @@ linklocal_body()
linklocal_cleanup()
{
- $DEBUG && dump
+ $DEBUG && _dump
$DEBUG && dump_bus
cleanup_rump_servers
}
@@ -348,7 +340,8 @@ linklocal_cleanup()
linklocal_ops_head()
{
- atf_set "descr" "Test for various operations to IPv6 linklocal addresses"
+ atf_set "descr" \
+ "Test for various operations to IPv6 linklocal addresses"
atf_set "require.progs" "rump_server rump.route rump.ndp"
}
@@ -358,7 +351,7 @@ linklocal_ops_body()
setup
- src_if0_lladdr=`get_lladdr ${SOCKSRC} shmif0`
+ src_if0_lladdr=`get_linklocal_addr ${SOCKSRC} shmif0`
export RUMP_SERVER=${SOCKSRC}
diff --git a/net/net/t_mtudisc.sh b/net/net/t_mtudisc.sh
new file mode 100755
index 000000000000..a99d652c477d
--- /dev/null
+++ b/net/net/t_mtudisc.sh
@@ -0,0 +1,192 @@
+# $NetBSD: t_mtudisc.sh,v 1.8 2016/12/21 01:16:18 ozaki-r Exp $
+#
+# Copyright (c) 2016 Internet Initiative Japan Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+SOCKLOCAL=unix://commsock1
+SOCKGATEWAY=unix://commsock2
+SOCKREMOTE=unix://commsock3
+HTML_FILE=index.html
+
+DEBUG=${DEBUG:-false}
+
+atf_test_case mtudisc_basic cleanup
+
+mtudisc_basic_head()
+{
+ atf_set "descr" "Tests for IPv4 Path MTU Dicorvery basic behavior"
+ atf_set "require.progs" "rump_server"
+}
+
+setup_server()
+{
+ local sock=$1
+ local if=$2
+ local bus=$3
+ local ip=$4
+
+ rump_server_add_iface $sock $if $bus
+
+ export RUMP_SERVER=$sock
+ atf_check -s exit:0 rump.ifconfig $if $ip
+ atf_check -s exit:0 rump.ifconfig $if up
+ atf_check -s exit:0 rump.ifconfig -w 10
+
+ $DEBUG && rump.ifconfig $if
+}
+
+prepare_download_file()
+{
+ local file=$1
+ local data="0123456789"
+
+ touch $file
+ for i in `seq 1 512`
+ do
+ echo $data >> $file
+ done
+}
+
+do_http_get()
+{
+ local ip=$1
+ local ret=$2
+ local timeout=5
+
+ # get the webpage
+ atf_check -s exit:$ret env LD_PRELOAD=/usr/lib/librumphijack.so \
+ ftp -q $timeout -o ./out http://$ip/$HTML_FILE
+}
+
+mtudisc_basic_body()
+{
+ local pkt=
+ local local_ip=10.0.0.2
+ local gateway_local_ip=10.0.0.1
+ local gateway_remote_ip=10.0.1.1
+ local remote_ip=10.0.1.2
+ local prefixlen=24
+
+ rump_server_start $SOCKLOCAL
+ rump_server_start $SOCKGATEWAY
+ rump_server_start $SOCKREMOTE
+
+ #
+ # Setup servers
+ #
+ # [local server] [gateway server] [remote server with httpd]
+ # | 10.0.0.2 10.0.0.1 | | 10.0.1.1 10.0.1.2 |
+ # shmif0(mtu=1500) ----- shmif1(mtu=1280) shmif0(mtu=1500) ----- shmif0(mtu=1500)
+ #
+
+ # Assign IP addresses
+ setup_server $SOCKLOCAL shmif0 bus1 $local_ip/$prefixlen
+ setup_server $SOCKGATEWAY shmif0 bus1 $gateway_local_ip/$prefixlen
+ setup_server $SOCKGATEWAY shmif1 bus2 $gateway_remote_ip/$prefixlen
+ setup_server $SOCKREMOTE shmif0 bus2 $remote_ip/$prefixlen
+
+ ### Setup gateway server
+ export RUMP_SERVER=$SOCKGATEWAY
+
+ # Set mtu of shmif0 to 1280
+ export RUMP_SERVER=$SOCKGATEWAY
+ atf_check -s exit:0 rump.ifconfig shmif0 mtu 1280
+
+ # Enable IPv4 forwarding
+ atf_check -s exit:0 rump.sysctl -w -q net.inet.ip.forwarding=1
+
+ ### Setup remote server
+ export RUMP_SERVER=$SOCKREMOTE
+
+ # Check default value
+ atf_check -s exit:0 -o match:"1" rump.sysctl -n net.inet.ip.mtudisc
+
+ # Start httpd daemon
+ prepare_download_file $HTML_FILE
+ start_httpd $SOCKREMOTE $remote_ip
+ $DEBUG && rump.netstat -a -f inet
+
+ # Teach the peer thar 10.0.0.2(local serer) is behind 10.0.1.1(gateway server)
+ atf_check -s exit:0 -o ignore rump.route add $local_ip/32 $gateway_remote_ip
+
+ ### Setup local server
+ export RUMP_SERVER=$SOCKLOCAL
+
+ # Teach the peer thar 10.0.1.2(remote serer) is behind 10.0.0.1(gateway server)
+ atf_check -s exit:0 -o ignore rump.route add $remote_ip/32 $gateway_local_ip
+
+ # Don't accept fragmented packets
+ atf_check -s exit:0 -o ignore rump.sysctl -w -q net.inet.ip.maxfragpackets=0
+
+ #
+ # Test disabled path mtu discorvery
+ #
+ export RUMP_SERVER=$SOCKREMOTE
+ atf_check -s exit:0 -o ignore rump.sysctl -w -q net.inet.ip.mtudisc=0
+
+ # Get the webpage (expect: failed)
+ export RUMP_SERVER=$SOCKLOCAL
+ do_http_get $remote_ip 1
+ $DEBUG && extract_new_packets bus2 > ./out
+ $DEBUG && cat ./out
+
+ # Check path mtu size on remote server
+ export RUMP_SERVER=$SOCKREMOTE
+ atf_check -s exit:0 \
+ -o match:"^10.0.0.2 +10.0.1.1 +UGHS +- +- +- +shmif0" \
+ rump.netstat -nr -f inet
+
+ #
+ # Test enabled path mtu discorvery
+ #
+ export RUMP_SERVER=$SOCKREMOTE
+ atf_check -s exit:0 -o ignore rump.sysctl -w -q net.inet.ip.mtudisc=1
+
+ # Get the webpage (expect: success)
+ export RUMP_SERVER=$SOCKLOCAL
+ do_http_get $remote_ip 0
+ $DEBUG && extract_new_packets bus2 > ./out
+ $DEBUG && cat ./out
+
+ # Check path mtu size on remote server
+ export RUMP_SERVER=$SOCKREMOTE
+ atf_check -s exit:0 \
+ -o match:"^10.0.0.2 +10.0.1.1 +UGHS +- +- +1280 +shmif0" \
+ rump.netstat -nr -f inet
+
+ rump_server_destroy_ifaces
+}
+
+mtudisc_basic_cleanup()
+{
+ $DEBUG && dump
+ stop_httpd
+ cleanup
+}
+
+atf_init_test_cases()
+{
+ atf_add_test_case mtudisc_basic
+}
diff --git a/net/net/t_mtudisc6.sh b/net/net/t_mtudisc6.sh
new file mode 100755
index 000000000000..93bc12e3623f
--- /dev/null
+++ b/net/net/t_mtudisc6.sh
@@ -0,0 +1,179 @@
+# $NetBSD: t_mtudisc6.sh,v 1.5 2016/11/25 08:51:17 ozaki-r Exp $
+#
+# Copyright (c) 2016 Internet Initiative Japan Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+SOCKLOCAL=unix://commsock1
+SOCKGATEWAY=unix://commsock2
+SOCKREMOTE=unix://commsock3
+HTML_FILE=index.html
+
+DEBUG=${DEBUG:-false}
+
+atf_test_case mtudisc6_basic cleanup
+
+mtudisc6_basic_head()
+{
+
+ atf_set "descr" "Tests for IPv6 Path MTU Dicorvery basic behavior"
+ atf_set "require.progs" "rump_server"
+}
+
+setup_server()
+{
+ local sock=$1
+ local if=$2
+ local bus=$3
+ local ip=$4
+
+ rump_server_add_iface $sock $if $bus
+
+ export RUMP_SERVER=$sock
+ atf_check -s exit:0 rump.ifconfig $if inet6 $ip
+ atf_check -s exit:0 rump.ifconfig $if up
+ atf_check -s exit:0 rump.ifconfig -w 10
+
+ $DEBUG && rump.ifconfig $if
+}
+
+prepare_download_file()
+{
+ local file=$1
+ local data="0123456789"
+
+ touch $file
+ for i in `seq 1 512`
+ do
+ echo $data >> $file
+ done
+}
+
+do_http_get()
+{
+ local ip=$1
+ local ret=$2
+ local timeout=5
+
+ # get the webpage
+ atf_check -s exit:$ret env LD_PRELOAD=/usr/lib/librumphijack.so \
+ ftp -q $timeout -o ./out "http://[$ip]/$HTML_FILE"
+}
+
+mtudisc6_basic_body()
+{
+ local pkt=
+ local local_ip=fc00:0:0:1::2
+ local gateway_local_ip=fc00:0:0:1::1
+ local gateway_remote_ip=fc00:0:0:2::1
+ local remote_ip=fc00:0:0:2::2
+ local prefixlen=64
+
+ rump_server_start $SOCKLOCAL netinet6
+ rump_server_start $SOCKGATEWAY netinet6
+ rump_server_start $SOCKREMOTE netinet6
+
+ #
+ # Setup servers
+ #
+ # [local server] [gateway server] [remote server]
+ # | | | |
+ # shmif0(1500) -- shmif1(1280) shmif0(1500) -- shmif0(1500)
+ #
+
+ # Assign IP addresses
+ setup_server $SOCKLOCAL shmif0 bus1 $local_ip/$prefixlen
+ setup_server $SOCKGATEWAY shmif0 bus1 $gateway_local_ip/$prefixlen
+ setup_server $SOCKGATEWAY shmif1 bus2 $gateway_remote_ip/$prefixlen
+ setup_server $SOCKREMOTE shmif0 bus2 $remote_ip/$prefixlen
+
+ ### Setup gateway server
+ export RUMP_SERVER=$SOCKGATEWAY
+
+ # Set MTU of shmif0 to 1280
+ export RUMP_SERVER=$SOCKGATEWAY
+ atf_check -s exit:0 rump.ifconfig shmif0 mtu 1280
+
+ # Enable IPv6 forwarding
+ atf_check -s exit:0 rump.sysctl -w -q net.inet6.ip6.forwarding=1
+
+ ### Setup remote server
+ export RUMP_SERVER=$SOCKREMOTE
+
+ # Start httpd daemon
+ prepare_download_file $HTML_FILE
+ start_httpd $SOCKREMOTE $remote_ip
+ $DEBUG && rump.netstat -a
+
+ # Teach the peer that local serer is behind gateway server
+ atf_check -s exit:0 -o ignore \
+ rump.route add -inet6 $local_ip/128 $gateway_remote_ip
+
+ # Check path MTU size on remote server
+ atf_check -s exit:0 \
+ -o match:"^$local_ip +$gateway_remote_ip +UGHS +- +- +- +shmif0" \
+ rump.netstat -nr -f inet6
+
+ ### Setup local server
+ export RUMP_SERVER=$SOCKLOCAL
+
+ # Teach the peer that remote serer is behind gateway server
+ atf_check -s exit:0 -o ignore \
+ rump.route add -inet6 $remote_ip/128 $gateway_local_ip
+
+ # Don't accept fragmented packets
+ atf_check -s exit:0 -o ignore \
+ rump.sysctl -w -q net.inet6.ip6.maxfragpackets=0
+
+ #
+ # Test enabled path MTU discorvery
+ #
+ # Get the webpage (expect: success)
+ export RUMP_SERVER=$SOCKLOCAL
+ do_http_get $remote_ip 0
+ $DEBUG && extract_new_packets bus2 > ./out
+ $DEBUG && cat ./out
+
+ # Check path MTU size on remote server
+ export RUMP_SERVER=$SOCKREMOTE
+ atf_check -s exit:0 \
+ -o match:"^$local_ip +$gateway_remote_ip +UGHS +- +- +1280 +shmif0" \
+ rump.netstat -nr -f inet6
+
+ rump_server_destroy_ifaces
+}
+
+mtudisc6_basic_cleanup()
+{
+
+ $DEBUG && dump
+ stop_httpd
+ cleanup
+}
+
+atf_init_test_cases()
+{
+
+ atf_add_test_case mtudisc6_basic
+}
diff --git a/net/net/t_ping6_opts.sh b/net/net/t_ping6_opts.sh
new file mode 100755
index 000000000000..e2e774e75783
--- /dev/null
+++ b/net/net/t_ping6_opts.sh
@@ -0,0 +1,380 @@
+# $NetBSD: t_ping6_opts.sh,v 1.8 2016/11/25 08:51:17 ozaki-r Exp $
+#
+# Copyright (c) 2016 Internet Initiative Japan Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+SOCKSRC=unix://commsock1
+SOCKFWD=unix://commsock2
+SOCKDST=unix://commsock3
+IP6SRC=fc00:0:0:1::2
+IP6SRCGW=fc00:0:0:1::1
+IP6DSTGW=fc00:0:0:2::1
+IP6DST=fc00:0:0:2::2
+BUS_SRCGW=bus1
+BUS_DSTGW=bus2
+
+IP6SRC2=fc00:0:0:1::3
+IP6SRCGW2=fc00:0:0:1::254
+
+DEBUG=${DEBUG:-false}
+TIMEOUT=1
+
+#
+# Utility functions
+#
+setup_endpoint()
+{
+ local sock=${1}
+ local addr=${2}
+ local bus=${3}
+ local gw=${4}
+
+ rump_server_add_iface $sock shmif0 $bus
+
+ export RUMP_SERVER=${sock}
+ atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${addr}
+ atf_check -s exit:0 -o ignore rump.route add -inet6 default ${gw}
+ atf_check -s exit:0 rump.ifconfig shmif0 up
+ atf_check -s exit:0 rump.ifconfig -w 10
+
+ if $DEBUG; then
+ rump.ifconfig shmif0
+ rump.netstat -nr
+ fi
+}
+
+setup_forwarder()
+{
+
+ rump_server_add_iface $SOCKFWD shmif0 $BUS_SRCGW
+ rump_server_add_iface $SOCKFWD shmif1 $BUS_DSTGW
+
+ export RUMP_SERVER=$SOCKFWD
+
+ atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6SRCGW}
+ atf_check -s exit:0 rump.ifconfig shmif1 inet6 ${IP6DSTGW}
+
+ atf_check -s exit:0 rump.ifconfig shmif0 up
+ atf_check -s exit:0 rump.ifconfig shmif1 up
+ atf_check -s exit:0 rump.ifconfig -w 10
+
+ if $DEBUG; then
+ rump.netstat -nr
+ rump.sysctl net.inet6.ip6.forwarding
+ fi
+}
+
+setup_forwarding6()
+{
+ export RUMP_SERVER=$SOCKFWD
+ atf_check -s exit:0 -o ignore rump.sysctl -w net.inet6.ip6.forwarding=1
+}
+
+setup6()
+{
+
+ rump_server_start $SOCKSRC netinet6
+ rump_server_start $SOCKFWD netinet6
+ rump_server_start $SOCKDST netinet6
+
+ setup_endpoint $SOCKSRC $IP6SRC $BUS_SRCGW $IP6SRCGW
+ setup_endpoint $SOCKDST $IP6DST $BUS_DSTGW $IP6DSTGW
+ setup_forwarder
+}
+
+check_echo_request_pkt()
+{
+ local pkt="$1 > $2: .+ echo request"
+
+ extract_new_packets $BUS_SRCGW > ./out
+ $DEBUG && echo $pkt
+ $DEBUG && cat ./out
+ atf_check -s exit:0 -o match:"$pkt" cat ./out
+}
+
+check_echo_request_pkt_with_macaddr()
+{
+ local pkt="$1 > $2, .+ $3 > $4: .+ echo request"
+
+ extract_new_packets $BUS_SRCGW > ./out
+ $DEBUG && echo $pkt
+ $DEBUG && cat ./out
+ atf_check -s exit:0 -o match:"$pkt" cat ./out
+}
+
+check_echo_request_pkt_with_macaddr_and_rthdr0()
+{
+ local pkt=
+
+ pkt="$1 > $2, .+ $3 > $4:"
+ pkt="$pkt srcrt \\(len=2, type=0, segleft=1, \\[0\\]$5\\)"
+ pkt="$pkt .+ echo request"
+
+ extract_new_packets $BUS_SRCGW > ./out
+ $DEBUG && echo $pkt
+ $DEBUG && cat ./out
+ atf_check -s exit:0 -o match:"$pkt" cat ./out
+}
+
+#
+# Tests
+#
+atf_test_case ping6_opts_sourceaddr cleanup
+ping6_opts_sourceaddr_head()
+{
+
+ atf_set "descr" "tests of ping6 -S option"
+ atf_set "require.progs" "rump_server"
+}
+
+ping6_opts_sourceaddr_body()
+{
+
+ setup6
+ setup_forwarding6
+
+ export RUMP_SERVER=$SOCKSRC
+ atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6DST
+ check_echo_request_pkt $IP6SRC $IP6DST
+
+ atf_check -s exit:0 rump.ifconfig shmif0 inet6 $IP6SRC2
+ atf_check -s exit:0 rump.ifconfig -w 10
+
+ atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6DST
+ check_echo_request_pkt $IP6SRC $IP6DST
+
+ # ping6 -S <sourceaddr>
+ atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
+ -S $IP6SRC $IP6DST
+ check_echo_request_pkt $IP6SRC $IP6DST
+
+ atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
+ -S $IP6SRC2 $IP6DST
+ check_echo_request_pkt $IP6SRC2 $IP6DST
+
+ rump_server_destroy_ifaces
+}
+
+ping6_opts_sourceaddr_cleanup()
+{
+
+ $DEBUG && dump
+ cleanup
+}
+
+atf_test_case ping6_opts_interface cleanup
+ping6_opts_interface_head()
+{
+
+ atf_set "descr" "tests of ping6 -I option"
+ atf_set "require.progs" "rump_server"
+}
+
+ping6_opts_interface_body()
+{
+ local shmif0_lladdr=
+ local shmif1_lladdr=
+ local gw_lladdr=
+
+ setup6
+ setup_forwarding6
+
+ shmif0_lladdr=$(get_linklocal_addr ${SOCKSRC} shmif0)
+ gw_lladdr=$(get_linklocal_addr ${SOCKFWD} shmif0)
+
+ export RUMP_SERVER=$SOCKSRC
+ atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $gw_lladdr
+ check_echo_request_pkt $shmif0_lladdr $gw_lladdr
+
+ rump_server_add_iface $SOCKSRC shmif1 $BUS_SRCGW
+ atf_check -s exit:0 rump.ifconfig shmif1 up
+ atf_check -s exit:0 rump.ifconfig -w 10
+ shmif1_lladdr=$(get_linklocal_addr ${SOCKSRC} shmif1)
+
+ atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $gw_lladdr
+ check_echo_request_pkt $shmif0_lladdr $gw_lladdr
+
+ # ping6 -I <interface>
+ atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
+ -I shmif0 $gw_lladdr
+ check_echo_request_pkt $shmif0_lladdr $gw_lladdr
+
+ atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
+ -I shmif1 $gw_lladdr
+ check_echo_request_pkt $shmif1_lladdr $gw_lladdr
+
+ rump_server_destroy_ifaces
+}
+
+ping6_opts_interface_cleanup()
+{
+
+ $DEBUG && dump
+ cleanup
+}
+
+atf_test_case ping6_opts_gateway cleanup
+ping6_opts_gateway_head()
+{
+
+ atf_set "descr" "tests of ping6 -g option"
+ atf_set "require.progs" "rump_server"
+}
+
+ping6_opts_gateway_body()
+{
+ local my_macaddr=
+ local gw_shmif0_macaddr=
+ local gw_shmif2_macaddr=
+
+ setup6
+ setup_forwarding6
+
+ my_macaddr=$(get_macaddr ${SOCKSRC} shmif0)
+ gw_shmif0_macaddr=$(get_macaddr ${SOCKFWD} shmif0)
+
+ export RUMP_SERVER=$SOCKSRC
+ atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6DST
+ check_echo_request_pkt_with_macaddr \
+ $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6DST
+
+ rump_server_add_iface $SOCKFWD shmif2 $BUS_SRCGW
+ export RUMP_SERVER=$SOCKFWD
+ atf_check -s exit:0 rump.ifconfig shmif2 inet6 $IP6SRCGW2
+ atf_check -s exit:0 rump.ifconfig -w 10
+ gw_shmif2_macaddr=$(get_macaddr ${SOCKFWD} shmif2)
+
+ export RUMP_SERVER=$SOCKSRC
+ atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6DST
+ check_echo_request_pkt_with_macaddr \
+ $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6DST
+
+ # ping6 -g <gateway>
+ atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
+ -g $IP6SRCGW $IP6DST
+ check_echo_request_pkt_with_macaddr \
+ $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6DST
+
+ atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
+ -g $IP6SRCGW2 $IP6DST
+ check_echo_request_pkt_with_macaddr \
+ $my_macaddr $gw_shmif2_macaddr $IP6SRC $IP6DST
+
+ rump_server_destroy_ifaces
+}
+
+ping6_opts_gateway_cleanup()
+{
+
+ $DEBUG && dump
+ cleanup
+}
+
+atf_test_case ping6_opts_hops cleanup
+ping6_opts_hops_head()
+{
+
+ atf_set "descr" "tests of ping6 hops (Type 0 Routing Header)"
+ atf_set "require.progs" "rump_server"
+}
+
+ping6_opts_hops_body()
+{
+ local my_macaddr=
+ local gw_shmif0_macaddr=
+ local gw_shmif2_macaddr=
+
+ setup6
+ setup_forwarding6
+
+ my_macaddr=$(get_macaddr ${SOCKSRC} shmif0)
+ gw_shmif0_macaddr=$(get_macaddr ${SOCKFWD} shmif0)
+
+ export RUMP_SERVER=$SOCKSRC
+ atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6DST
+ check_echo_request_pkt_with_macaddr \
+ $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6DST
+
+ rump_server_add_iface $SOCKFWD shmif2 $BUS_SRCGW
+ export RUMP_SERVER=$SOCKFWD
+ atf_check -s exit:0 rump.ifconfig shmif2 inet6 $IP6SRCGW2
+ atf_check -s exit:0 rump.ifconfig -w 10
+ gw_shmif2_macaddr=$(get_macaddr ${SOCKFWD} shmif2)
+
+ export RUMP_SERVER=$SOCKSRC
+ atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6DST
+ check_echo_request_pkt_with_macaddr \
+ $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6DST
+
+ # ping6 hops
+
+ # ping6 fails expectedly because the kernel doesn't support
+ # to receive packets with type 0 routing headers, but we can
+ # check whether a sent packet is correct.
+ atf_check -s not-exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
+ $IP6SRCGW $IP6DST
+ check_echo_request_pkt_with_macaddr_and_rthdr0 \
+ $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6SRCGW $IP6DST
+
+ atf_check -s not-exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
+ $IP6SRCGW2 $IP6DST
+ check_echo_request_pkt_with_macaddr_and_rthdr0 \
+ $my_macaddr $gw_shmif2_macaddr $IP6SRC $IP6SRCGW2 $IP6DST
+
+ # ping6 -g <gateway> hops
+ atf_check -s not-exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
+ -g $IP6SRCGW $IP6SRCGW $IP6DST
+ check_echo_request_pkt_with_macaddr_and_rthdr0 \
+ $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6SRCGW $IP6DST
+
+ atf_check -s not-exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
+ -g $IP6SRCGW2 $IP6SRCGW2 $IP6DST
+ check_echo_request_pkt_with_macaddr_and_rthdr0 \
+ $my_macaddr $gw_shmif2_macaddr $IP6SRC $IP6SRCGW2 $IP6DST
+
+ # ping6 -g <gateway> hops, but different nexthops (is it valid?)
+ atf_check -s not-exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT \
+ -g $IP6SRCGW $IP6SRCGW2 $IP6DST
+ check_echo_request_pkt_with_macaddr_and_rthdr0 \
+ $my_macaddr $gw_shmif0_macaddr $IP6SRC $IP6SRCGW2 $IP6DST
+
+ rump_server_destroy_ifaces
+}
+
+ping6_opts_hops_cleanup()
+{
+
+ $DEBUG && dump
+ cleanup
+}
+
+atf_init_test_cases()
+{
+
+ atf_add_test_case ping6_opts_sourceaddr
+ atf_add_test_case ping6_opts_interface
+ atf_add_test_case ping6_opts_gateway
+ atf_add_test_case ping6_opts_hops
+}
diff --git a/net/net_common.sh b/net/net_common.sh
new file mode 100755
index 000000000000..df21a881ab5d
--- /dev/null
+++ b/net/net_common.sh
@@ -0,0 +1,314 @@
+# $NetBSD: net_common.sh,v 1.11 2017/01/10 05:55:34 ozaki-r Exp $
+#
+# Copyright (c) 2016 Internet Initiative Japan Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+#
+# Common utility functions for tests/net
+#
+
+HIJACKING="env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=sysctl=yes"
+
+extract_new_packets()
+{
+ local bus=$1
+ local old=./.__old
+
+ if [ ! -f $old ]; then
+ old=/dev/null
+ fi
+
+ shmif_dumpbus -p - $bus 2>/dev/null| \
+ tcpdump -n -e -r - 2>/dev/null > ./.__new
+ diff -u $old ./.__new |grep '^+' |cut -d '+' -f 2 > ./.__diff
+ mv -f ./.__new ./.__old
+ cat ./.__diff
+}
+
+check_route()
+{
+ local target=$1
+ local gw=$2
+ local flags=${3:-\.\+}
+ local ifname=${4:-\.\+}
+
+ target=$(echo $target |sed 's/\./\\./g')
+ if [ "$gw" = "" ]; then
+ gw=".+"
+ else
+ gw=$(echo $gw |sed 's/\./\\./g')
+ fi
+
+ atf_check -s exit:0 -e ignore \
+ -o match:"^$target +$gw +$flags +- +- +.+ +$ifname" \
+ rump.netstat -rn
+}
+
+check_route_flags()
+{
+
+ check_route "$1" "" "$2" ""
+}
+
+check_route_gw()
+{
+
+ check_route "$1" "$2" "" ""
+}
+
+check_route_no_entry()
+{
+ local target=$(echo $1 |sed 's/\./\\./g')
+
+ atf_check -s exit:0 -e ignore -o not-match:"^$target" \
+ rump.netstat -rn
+}
+
+get_linklocal_addr()
+{
+
+ export RUMP_SERVER=${1}
+ rump.ifconfig ${2} inet6 |
+ awk "/fe80/ {sub(/%$2/, \"\"); sub(/\\/[0-9]*/, \"\"); print \$2;}"
+ unset RUMP_SERVER
+
+ return 0
+}
+
+get_macaddr()
+{
+
+ env RUMP_SERVER=${1} \
+ rump.ifconfig ${2} |awk '/address/ {print $2;}'
+}
+
+HTTPD_PID=./.__httpd.pid
+start_httpd()
+{
+ local sock=$1
+ local ip=$2
+ local backup=$RUMP_SERVER
+
+ export RUMP_SERVER=$sock
+
+ # start httpd in daemon mode
+ atf_check -s exit:0 env LD_PRELOAD=/usr/lib/librumphijack.so \
+ /usr/libexec/httpd -P $HTTPD_PID -i $ip -b -s $(pwd)
+
+ export RUMP_SERVER=$backup
+
+ sleep 3
+}
+
+stop_httpd()
+{
+
+ if [ -f $HTTPD_PID ]; then
+ kill -9 $(cat $HTTPD_PID)
+ rm -f $HTTPD_PID
+ sleep 1
+ fi
+}
+
+BASIC_LIBS="-lrumpnet -lrumpnet_net -lrumpnet_netinet \
+ -lrumpnet_shmif -lrumpdev"
+FS_LIBS="$BASIC_LIBS -lrumpvfs -lrumpfs_ffs"
+
+# We cannot keep variables between test phases, so need to store in files
+_rump_server_socks=./.__socks
+_rump_server_ifaces=./.__ifaces
+_rump_server_buses=./.__buses
+
+_rump_server_start_common()
+{
+ local sock=$1
+ local libs=
+
+ shift 1
+ libs="$*"
+
+ atf_check -s exit:0 rump_server $libs $sock
+
+ echo $sock >> $_rump_server_socks
+ $DEBUG && cat $_rump_server_socks
+}
+
+rump_server_start()
+{
+ local sock=$1
+ local _libs=
+ local libs="$BASIC_LIBS"
+
+ shift 1
+ _libs="$*"
+
+ for lib in $_libs; do
+ libs="$libs -lrumpnet_$lib"
+ done
+
+ _rump_server_start_common $sock $libs
+
+ return 0
+}
+
+rump_server_fs_start()
+{
+ local sock=$1
+ local _libs=
+ local libs="$FS_LIBS"
+
+ shift 1
+ _libs="$*"
+
+ for lib in $_libs; do
+ libs="$libs -lrumpnet_$lib"
+ done
+
+ _rump_server_start_common $sock $libs
+
+ return 0
+}
+
+rump_server_add_iface()
+{
+ local sock=$1
+ local ifname=$2
+ local bus=$3
+ local backup=$RUMP_SERVER
+
+ export RUMP_SERVER=$sock
+ atf_check -s exit:0 rump.ifconfig $ifname create
+ atf_check -s exit:0 rump.ifconfig $ifname linkstr $bus
+ export RUMP_SERVER=$backup
+
+ echo $sock $ifname >> $_rump_server_ifaces
+ $DEBUG && cat $_rump_server_ifaces
+
+ echo $bus >> $_rump_server_buses
+ cat $_rump_server_buses |sort -u >./.__tmp
+ mv -f ./.__tmp $_rump_server_buses
+ $DEBUG && cat $_rump_server_buses
+
+ return 0
+}
+
+rump_server_destroy_ifaces()
+{
+ local backup=$RUMP_SERVER
+
+ $DEBUG && cat $_rump_server_ifaces
+
+ # Try to dump states before destroying interfaces
+ for sock in $(cat $_rump_server_socks); do
+ export RUMP_SERVER=$sock
+ atf_check -s exit:0 -o ignore rump.ifconfig
+ atf_check -s exit:0 -o ignore rump.netstat -nr
+ # XXX still need hijacking
+ atf_check -s exit:0 -o ignore $HIJACKING rump.netstat -i -a
+ atf_check -s exit:0 -o ignore rump.arp -na
+ atf_check -s exit:0 -o ignore rump.ndp -na
+ atf_check -s exit:0 -o ignore $HIJACKING ifmcstat
+ done
+
+ # XXX using pipe doesn't work. See PR bin/51667
+ #cat $_rump_server_ifaces | while read sock ifname; do
+ while read sock ifname; do
+ export RUMP_SERVER=$sock
+ if rump.ifconfig -l |grep -q $ifname; then
+ atf_check -s exit:0 rump.ifconfig $ifname destroy
+ fi
+ atf_check -s exit:0 -o ignore rump.ifconfig
+ done < $_rump_server_ifaces
+ export RUMP_SERVER=$backup
+
+ return 0
+}
+
+rump_server_halt_servers()
+{
+ local backup=$RUMP_SERVER
+
+ $DEBUG && cat $_rump_server_socks
+ for sock in $(cat $_rump_server_socks); do
+ env RUMP_SERVER=$sock rump.halt
+ done
+ export RUMP_SERVER=$backup
+
+ return 0
+}
+
+rump_server_dump_servers()
+{
+ local backup=$RUMP_SERVER
+
+ $DEBUG && cat $_rump_server_socks
+ for sock in $(cat $_rump_server_socks); do
+ echo "### Dumping $sock"
+ export RUMP_SERVER=$sock
+ rump.ifconfig
+ rump.netstat -nr
+ # XXX still need hijacking
+ $HIJACKING rump.netstat -i -a
+ rump.arp -na
+ rump.ndp -na
+ $HIJACKING ifmcstat
+ $HIJACKING dmesg
+ done
+ export RUMP_SERVER=$backup
+
+ if [ -f rump_server.core ]; then
+ gdb -ex bt /usr/bin/rump_server rump_server.core
+ strings rump_server.core |grep panic
+ fi
+ return 0
+}
+
+rump_server_dump_buses()
+{
+
+ if [ ! -f $_rump_server_buses ]; then
+ return 0
+ fi
+
+ $DEBUG && cat $_rump_server_buses
+ for bus in $(cat $_rump_server_buses); do
+ echo "### Dumping $bus"
+ shmif_dumpbus -p - $bus 2>/dev/null| tcpdump -n -e -r -
+ done
+ return 0
+}
+
+cleanup()
+{
+
+ rump_server_halt_servers
+}
+
+dump()
+{
+
+ rump_server_dump_servers
+ rump_server_dump_buses
+}
diff --git a/net/route/Makefile b/net/route/Makefile
index 7ca14767995e..9a64e6def939 100644
--- a/net/route/Makefile
+++ b/net/route/Makefile
@@ -1,10 +1,14 @@
-# $NetBSD: Makefile,v 1.4 2016/04/21 05:10:15 ozaki-r Exp $
+# $NetBSD: Makefile,v 1.5 2016/11/24 09:05:17 ozaki-r Exp $
#
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/net/route
-TESTS_SH= t_change t_flags t_flags6 t_route
+.for name in change flags flags6 route
+TESTS_SH+= t_${name}
+TESTS_SH_SRC_t_${name}= ../net_common.sh t_${name}.sh
+.endfor
+
.include <bsd.test.mk>
diff --git a/net/route/t_change.sh b/net/route/t_change.sh
index 669c9f3baae7..260cad02d7bf 100755
--- a/net/route/t_change.sh
+++ b/net/route/t_change.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_change.sh,v 1.8 2016/08/10 23:00:39 roy Exp $
+# $NetBSD: t_change.sh,v 1.9 2016/11/07 05:25:37 ozaki-r Exp $
#
# Copyright (c) 2011 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -30,7 +30,7 @@ netserver=\
-lrumpnet_netinet -lrumpnet_shmif"
export RUMP_SERVER=unix://commsock
-DEBUG=false
+DEBUG=${DEBUG:-false}
atf_test_case route_change_reject2blackhole cleanup
route_change_reject2blackhole_head()
diff --git a/net/route/t_flags.sh b/net/route/t_flags.sh
index 26625bbb899f..457e3f5bdd94 100755
--- a/net/route/t_flags.sh
+++ b/net/route/t_flags.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_flags.sh,v 1.11 2016/08/10 23:00:39 roy Exp $
+# $NetBSD: t_flags.sh,v 1.15 2016/12/21 02:46:08 ozaki-r Exp $
#
# Copyright (c) 2015 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -25,27 +25,24 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-netserver=\
-"rump_server -lrumpdev -lrumpnet -lrumpnet_net -lrumpnet_netinet \
- -lrumpnet_shmif"
SOCK_LOCAL=unix://commsock1
SOCK_PEER=unix://commsock2
SOCK_GW=unix://commsock3
BUS=bus1
BUS2=bus2
-DEBUG=false
+DEBUG=${DEBUG:-false}
setup_local()
{
- atf_check -s exit:0 ${netserver} ${SOCK_LOCAL}
+ rump_server_start $SOCK_LOCAL
+ rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
export RUMP_SERVER=$SOCK_LOCAL
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 create
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 linkstr ${BUS}
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 10.0.0.2/24
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
+ atf_check -s exit:0 -o ignore rump.ifconfig -w 10
$DEBUG && rump.ifconfig
$DEBUG && rump.netstat -rn -f inet
@@ -54,13 +51,13 @@ setup_local()
setup_peer()
{
- atf_check -s exit:0 ${netserver} ${SOCK_PEER}
+ rump_server_start $SOCK_PEER
+ rump_server_add_iface $SOCK_PEER shmif0 $BUS
export RUMP_SERVER=$SOCK_PEER
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 create
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 linkstr ${BUS}
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 10.0.0.1/24
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
+ atf_check -s exit:0 -o ignore rump.ifconfig -w 10
$DEBUG && rump.ifconfig
$DEBUG && rump.netstat -rn -f inet
@@ -69,16 +66,14 @@ setup_peer()
setup_gw()
{
- atf_check -s exit:0 ${netserver} ${SOCK_GW}
+ rump_server_start $SOCK_GW
+ rump_server_add_iface $SOCK_GW shmif0 $BUS
+ rump_server_add_iface $SOCK_GW shmif1 $BUS2
export RUMP_SERVER=$SOCK_GW
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 create
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 linkstr ${BUS}
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 10.0.0.254/24
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
- atf_check -s exit:0 -o ignore rump.ifconfig shmif1 create
- atf_check -s exit:0 -o ignore rump.ifconfig shmif1 linkstr ${BUS2}
atf_check -s exit:0 -o ignore rump.ifconfig shmif1 10.0.2.1/24
atf_check -s exit:0 -o ignore rump.ifconfig shmif1 alias 10.0.2.2/24
atf_check -s exit:0 -o ignore rump.ifconfig shmif1 up
@@ -91,46 +86,13 @@ setup_gw()
$DEBUG && rump.netstat -rn -f inet
}
-teardown_gw()
-{
-
- env RUMP_SERVER=$SOCK_GW rump.halt
-}
-
-check_entry_flags()
-{
- local ip=$(echo $1 |sed 's/\./\\./g')
- local flags=$2
-
- atf_check -s exit:0 -o match:" $flags " -e ignore -x \
- "rump.netstat -rn -f inet | grep ^'$ip'"
-}
-
-check_entry_gw()
-{
- local ip=$(echo $1 |sed 's/\./\\./g')
- local gw=$2
-
- atf_check -s exit:0 -o match:" $gw " -e ignore -x \
- "rump.netstat -rn -f inet | grep ^'$ip'"
-}
-
-check_entry_fail()
-{
- ip=$(echo $1 |sed 's/\./\\./g')
- flags=$2 # Not used currently
-
- atf_check -s not-exit:0 -e ignore -x \
- "rump.netstat -rn -f inet | grep ^'$ip'"
-}
-
test_lo()
{
export RUMP_SERVER=$SOCK_LOCAL
# Up, Host, local
- check_entry_flags 127.0.0.1 UHl
+ check_route_flags 127.0.0.1 UHl
}
test_connected()
@@ -139,10 +101,10 @@ test_connected()
export RUMP_SERVER=$SOCK_LOCAL
# Up, Host, LLINFO, local
- check_entry_flags 10.0.0.2 UHl
+ check_route_flags 10.0.0.2 UHl
# Up, Cloning
- check_entry_flags 10.0.0/24 UC
+ check_route_flags 10.0.0/24 UC
}
test_default_gateway()
@@ -154,7 +116,7 @@ test_default_gateway()
$DEBUG && rump.netstat -rn -f inet
# Up, Gateway, Static
- check_entry_flags default UGS
+ check_route_flags default UGS
}
test_static()
@@ -167,14 +129,14 @@ test_static()
$DEBUG && rump.netstat -rn -f inet
# Up, Gateway, Host, Static
- check_entry_flags 10.0.1.1 UGHS
+ check_route_flags 10.0.1.1 UGHS
# Static route to network
atf_check -s exit:0 -o ignore rump.route add -net 10.0.2.0/24 10.0.0.1
$DEBUG && rump.netstat -rn -f inet
# Up, Gateway, Static
- check_entry_flags 10.0.2/24 UGS
+ check_route_flags 10.0.2/24 UGS
}
test_blackhole()
@@ -193,14 +155,14 @@ test_blackhole()
$DEBUG && rump.netstat -rn -f inet
# Up, Gateway, Blackhole, Static
- check_entry_flags 10.0.0/24 UGBS
+ check_route_flags 10.0.0/24 UGBS
atf_check -s not-exit:0 -o match:'100.0% packet loss' \
rump.ping -n -w 1 -c 1 10.0.0.1
$DEBUG && rump.netstat -rn -f inet
# Shouldn't be created
- check_entry_fail 10.0.0.1 UH
+ check_route_no_entry 10.0.0.1
}
test_reject()
@@ -215,14 +177,14 @@ test_reject()
$DEBUG && rump.netstat -rn -f inet
# Up, Gateway, Reject, Static
- check_entry_flags 10.0.0/24 UGRS
+ check_route_flags 10.0.0/24 UGRS
atf_check -s not-exit:0 -o ignore -e match:'No route to host' \
rump.ping -n -w 1 -c 1 10.0.0.1
$DEBUG && rump.netstat -rn -f inet
# Shouldn't be created
- check_entry_fail 10.0.0.1 UH
+ check_route_no_entry 10.0.0.1
# Gateway is lo0 (RTF_GATEWAY)
@@ -234,14 +196,14 @@ test_reject()
$DEBUG && rump.netstat -rn -f inet
# Up, Gateway, Reject, Static
- check_entry_flags 10.0.0/24 UGRS
+ check_route_flags 10.0.0/24 UGRS
atf_check -s not-exit:0 -o ignore -e match:'Network is unreachable' \
rump.ping -n -w 1 -c 1 10.0.0.1
$DEBUG && rump.netstat -rn -f inet
# Shouldn't be created
- check_entry_fail 10.0.0.1 UH
+ check_route_no_entry 10.0.0.1
# Gateway is lo0 (RTF_HOST)
@@ -253,7 +215,7 @@ test_reject()
$DEBUG && rump.netstat -rn -f inet
# Up, Host, Reject, Static
- check_entry_flags 10.0.0.1 UHRS
+ check_route_flags 10.0.0.1 UHRS
atf_check -s not-exit:0 -o ignore -e match:'No route to host' \
rump.ping -n -w 1 -c 1 10.0.0.1
@@ -278,7 +240,7 @@ test_icmp_redirect()
export RUMP_SERVER=$SOCK_PEER
atf_check -s exit:0 -o ignore rump.route add -net 10.0.2.0/24 10.0.0.254
# Up, Gateway, Static
- check_entry_flags 10.0.2/24 UGS
+ check_route_flags 10.0.2/24 UGS
#
# Setup the default gateway to the peer, 10.0.0.1
@@ -286,15 +248,15 @@ test_icmp_redirect()
export RUMP_SERVER=$SOCK_LOCAL
atf_check -s exit:0 -o ignore rump.route add default 10.0.0.1
# Up, Gateway, Static
- check_entry_flags default UGS
+ check_route_flags default UGS
# Try ping 10.0.2.1
atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 10.0.2.1
$DEBUG && rump.netstat -rn -f inet
# Up, Gateway, Host, Dynamic
- check_entry_flags 10.0.2.1 UGHD
- check_entry_gw 10.0.2.1 10.0.0.254
+ check_route_flags 10.0.2.1 UGHD
+ check_route_gw 10.0.2.1 10.0.0.254
export RUMP_SERVER=$SOCK_PEER
$DEBUG && rump.netstat -rn -f inet
@@ -307,18 +269,16 @@ test_icmp_redirect()
export RUMP_SERVER=$SOCK_LOCAL
atf_check -s exit:0 -o ignore rump.route add 10.0.2.2 10.0.0.1
# Up, Gateway, Host, Static
- check_entry_flags 10.0.2.2 UGHS
- check_entry_gw 10.0.2.2 10.0.0.1
+ check_route_flags 10.0.2.2 UGHS
+ check_route_gw 10.0.2.2 10.0.0.1
# Try ping 10.0.2.2
atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 10.0.2.2
$DEBUG && rump.netstat -rn -f inet
# Up, Gateway, Host, Modified, Static
- check_entry_flags 10.0.2.2 UGHMS
- check_entry_gw 10.0.2.2 10.0.0.254
-
- teardown_gw
+ check_route_flags 10.0.2.2 UGHMS
+ check_route_gw 10.0.2.2 10.0.0.254
}
test_announce()
@@ -332,19 +292,11 @@ test_announce()
$DEBUG && rump.netstat -rn -f inet
# Up, Gateway, Static, proxy
- check_entry_flags 10.0.0/24 UGSp
+ check_route_flags 10.0.0/24 UGSp
# TODO test its behavior
}
-cleanup()
-{
- $DEBUG && /usr/bin/shmif_dumpbus -p - $BUS 2>/dev/null | \
- /usr/sbin/tcpdump -n -e -r -
- env RUMP_SERVER=$SOCK_LOCAL rump.halt
- env RUMP_SERVER=$SOCK_PEER rump.halt
-}
-
add_test()
{
local name=$1
@@ -359,8 +311,10 @@ add_test()
setup_local; \
setup_peer; \
test_${name}; \
+ rump_server_destroy_ifaces; \
}; \
route_flags_${name}_cleanup() { \
+ $DEBUG && dump; \
cleanup; \
}"
atf_add_test_case "route_flags_${name}"
diff --git a/net/route/t_flags6.sh b/net/route/t_flags6.sh
index 20b800e57ba2..e5708296b7bf 100755
--- a/net/route/t_flags6.sh
+++ b/net/route/t_flags6.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_flags6.sh,v 1.7 2016/08/10 23:00:39 roy Exp $
+# $NetBSD: t_flags6.sh,v 1.12 2016/12/21 02:46:08 ozaki-r Exp $
#
# Copyright (c) 2016 Internet Initiative Japan Inc.
# All rights reserved.
@@ -25,9 +25,6 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-RUMP_OPTS="-lrumpdev -lrumpnet -lrumpnet_net"
-RUMP_OPTS="$RUMP_OPTS -lrumpnet_netinet -lrumpnet_netinet6"
-RUMP_OPTS="$RUMP_OPTS -lrumpnet_shmif"
SOCK_LOCAL=unix://commsock1
SOCK_PEER=unix://commsock2
SOCK_GW=unix://commsock3
@@ -37,18 +34,18 @@ BUS2=bus2
IP6_LOCAL=fc00::2
IP6_PEER=fc00::1
-DEBUG=false
+DEBUG=${DEBUG:-false}
setup_local()
{
- atf_check -s exit:0 rump_server ${RUMP_OPTS} ${SOCK_LOCAL}
+ rump_server_start $SOCK_LOCAL netinet6
+ rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
export RUMP_SERVER=$SOCK_LOCAL
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 create
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 linkstr ${BUS}
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 inet6 $IP6_LOCAL
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
+ atf_check -s exit:0 -o ignore rump.ifconfig -w 10
$DEBUG && rump.ifconfig
$DEBUG && rump.netstat -rn -f inet6
@@ -57,55 +54,28 @@ setup_local()
setup_peer()
{
- atf_check -s exit:0 rump_server ${RUMP_OPTS} ${SOCK_PEER}
+ rump_server_start $SOCK_PEER netinet6
+ rump_server_add_iface $SOCK_PEER shmif0 $BUS
export RUMP_SERVER=$SOCK_PEER
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 create
- atf_check -s exit:0 -o ignore rump.ifconfig shmif0 linkstr ${BUS}
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 inet6 $IP6_PEER
atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
+ atf_check -s exit:0 -o ignore rump.ifconfig -w 10
$DEBUG && rump.ifconfig
$DEBUG && rump.netstat -rn -f inet6
}
-check_entry_flags()
-{
- local ip=$(echo $1 |sed 's/\./\\./g')
- local flags=$2
-
- atf_check -s exit:0 -o match:" $flags " -e ignore -x \
- "rump.netstat -rn -f inet6 | grep ^'$ip'"
-}
-
-check_entry_gw()
-{
- local ip=$(echo $1 |sed 's/\./\\./g')
- local gw=$2
-
- atf_check -s exit:0 -o match:" $gw " -e ignore -x \
- "rump.netstat -rn -f inet6 | grep ^'$ip'"
-}
-
-check_entry_fail()
-{
- ip=$(echo $1 |sed 's/\./\\./g')
- flags=$2 # Not used currently
-
- atf_check -s not-exit:0 -e ignore -x \
- "rump.netstat -rn -f inet6 | grep ^'$ip'"
-}
-
test_lo6()
{
export RUMP_SERVER=$SOCK_LOCAL
# Up, Host, local
- check_entry_flags fe80::1 UHl
+ check_route_flags fe80::1 UHl
- # Up, Host
- check_entry_flags ::1 UH
+ # Up, Host, local
+ check_route_flags ::1 UHl
}
test_connected6()
@@ -114,10 +84,10 @@ test_connected6()
export RUMP_SERVER=$SOCK_LOCAL
# Up, Host, local
- check_entry_flags $IP6_LOCAL UHl
+ check_route_flags $IP6_LOCAL UHl
# Up, Connected
- check_entry_flags fc00::/64 UC
+ check_route_flags fc00::/64 UC
}
test_default_gateway6()
@@ -129,7 +99,7 @@ test_default_gateway6()
$DEBUG && rump.netstat -rn -f inet6
# Up, Gateway, Static
- check_entry_flags default UGS
+ check_route_flags default UGS
}
test_static6()
@@ -143,7 +113,7 @@ test_static6()
$DEBUG && rump.netstat -rn -f inet6
# Up, Gateway, Host, Static
- check_entry_flags fc00::1:1 UGHS
+ check_route_flags fc00::1:1 UGHS
# Static route to network
atf_check -s exit:0 -o ignore \
@@ -151,7 +121,7 @@ test_static6()
$DEBUG && rump.netstat -rn -f inet6
# Up, Gateway, Static
- check_entry_flags fc00::/24 UGS
+ check_route_flags fc00::/24 UGS
}
test_blackhole6()
@@ -171,14 +141,14 @@ test_blackhole6()
$DEBUG && rump.netstat -rn -f inet6
# Up, Gateway, Blackhole, Static
- check_entry_flags fc00::/64 UGBS
+ check_route_flags fc00::/64 UGBS
atf_check -s not-exit:0 -o match:'100.0% packet loss' \
rump.ping6 -n -X 1 -c 1 $IP6_PEER
$DEBUG && rump.netstat -rn -f inet6
# Shouldn't be created
- check_entry_fail $IP6_PEER UH
+ check_route_no_entry $IP6_PEER
}
test_reject6()
@@ -195,14 +165,14 @@ test_reject6()
$DEBUG && rump.netstat -rn -f inet6
# Up, Gateway, Reject, Static
- check_entry_flags fc00::/64 UGRS
+ check_route_flags fc00::/64 UGRS
atf_check -s not-exit:0 -o ignore -e match:'No route to host' \
rump.ping6 -n -X 1 -c 1 $IP6_PEER
$DEBUG && rump.netstat -rn -f inet6
# Shouldn't be created
- check_entry_fail $IP6_PEER UH
+ check_route_no_entry $IP6_PEER
# Gateway is lo0 (RTF_GATEWAY)
@@ -215,14 +185,14 @@ test_reject6()
$DEBUG && rump.netstat -rn -f inet6
# Up, Gateway, Reject, Static
- check_entry_flags fc00::/64 UGRS
+ check_route_flags fc00::/64 UGRS
atf_check -s not-exit:0 -o ignore -e match:'Network is unreachable' \
rump.ping6 -n -X 1 -c 1 $IP6_PEER
$DEBUG && rump.netstat -rn -f inet6
# Shouldn't be created
- check_entry_fail $IP6_PEER UH
+ check_route_no_entry $IP6_PEER
# Gateway is lo0 (RTF_HOST)
@@ -235,7 +205,7 @@ test_reject6()
$DEBUG && rump.netstat -rn -f inet6
# Up, Host, Reject, Static
- check_entry_flags fc00:: UHRS
+ check_route_flags fc00:: UHRS
atf_check -s not-exit:0 -o ignore -e match:'No route to host' \
rump.ping6 -n -X 1 -c 1 $IP6_PEER
@@ -257,19 +227,11 @@ test_announce6()
$DEBUG && rump.netstat -rn -f inet6
# Up, Gateway, Static, proxy
- check_entry_flags fc00::/64 UGSp
+ check_route_flags fc00::/64 UGSp
# TODO test its behavior
}
-cleanup()
-{
- $DEBUG && /usr/bin/shmif_dumpbus -p - $BUS 2>/dev/null | \
- /usr/sbin/tcpdump -n -e -r -
- env RUMP_SERVER=$SOCK_LOCAL rump.halt
- env RUMP_SERVER=$SOCK_PEER rump.halt
-}
-
add_test()
{
local name=$1
@@ -284,8 +246,10 @@ add_test()
setup_local; \
setup_peer; \
test_${name}; \
+ rump_server_destroy_ifaces; \
}; \
route_flags_${name}_cleanup() { \
+ $DEBUG && dump; \
cleanup; \
}"
atf_add_test_case "route_flags_${name}"
diff --git a/net/route/t_route.sh b/net/route/t_route.sh
index 37ede4cec7b7..053f48f7286e 100755
--- a/net/route/t_route.sh
+++ b/net/route/t_route.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_route.sh,v 1.7 2016/08/10 23:00:39 roy Exp $
+# $NetBSD: t_route.sh,v 1.10 2016/12/21 02:46:08 ozaki-r Exp $
#
# Copyright (c) 2016 Internet Initiative Japan Inc.
# All rights reserved.
@@ -25,9 +25,6 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-RUMP_LIBS="-lrumpdev -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_shmif"
-RUMP_LIBS_IPV6="$RUMP_LIBS -lrumpnet_netinet6"
-
# non_subnet_gateway
SOCK_CLIENT=unix://commsock1
SOCK_GW=unix://commsock2
@@ -49,7 +46,7 @@ IP6DST=fc00:0:0:2::2
BUS_SRCGW=bus1
BUS_DSTGW=bus2
-DEBUG=false
+DEBUG=${DEBUG:-false}
TIMEOUT=1
PING_OPTS="-n -c 1 -w $TIMEOUT"
@@ -64,13 +61,11 @@ route_non_subnet_gateway_head()
route_non_subnet_gateway_body()
{
- atf_check -s exit:0 rump_server ${RUMP_LIBS} ${SOCK_CLIENT}
- atf_check -s exit:0 rump_server ${RUMP_LIBS} ${SOCK_GW}
+ rump_server_start $SOCK_CLIENT
+ rump_server_start $SOCK_GW
export RUMP_SERVER=${SOCK_GW}
-
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr $BUS
+ rump_server_add_iface $SOCK_GW shmif0 $BUS
atf_check -s exit:0 rump.ifconfig shmif0 192.168.0.1
atf_check -s exit:0 rump.ifconfig shmif0 up
@@ -81,11 +76,10 @@ route_non_subnet_gateway_body()
$DEBUG && rump.netstat -nr -f inet
export RUMP_SERVER=${SOCK_CLIENT}
-
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr $BUS
+ rump_server_add_iface $SOCK_CLIENT shmif0 $BUS
atf_check -s exit:0 rump.ifconfig shmif0 10.0.0.1/32
atf_check -s exit:0 rump.ifconfig shmif0 up
+ atf_check -s exit:0 rump.ifconfig -w 10
$DEBUG && rump.netstat -nr -f inet
@@ -104,15 +98,14 @@ route_non_subnet_gateway_body()
# Be reachable to the gateway
atf_check -s exit:0 -o ignore rump.ping $PING_OPTS 192.168.0.1
- unset RUMP_SERVER
+ rump_server_destroy_ifaces
}
route_non_subnet_gateway_cleanup()
{
- $DEBUG && shmif_dumpbus -p - $BUS 2>/dev/null | tcpdump -n -e -r -
- env RUMP_SERVER=$SOCK_CLIENT rump.halt
- env RUMP_SERVER=$SOCK_GW rump.halt
+ $DEBUG && dump
+ cleanup
}
atf_test_case route_command_get cleanup
@@ -140,8 +133,7 @@ setup_endpoint()
local gw=${5}
export RUMP_SERVER=${sock}
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr ${bus}
+ rump_server_add_iface $sock shmif0 $bus
if [ $mode = "ipv6" ]; then
atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${addr}
atf_check -s exit:0 -o ignore rump.route add -inet6 default ${gw}
@@ -150,6 +142,7 @@ setup_endpoint()
atf_check -s exit:0 -o ignore rump.route add default ${gw}
fi
atf_check -s exit:0 rump.ifconfig shmif0 up
+ atf_check -s exit:0 rump.ifconfig -w 10
if $DEBUG; then
rump.ifconfig shmif0
@@ -161,13 +154,10 @@ setup_forwarder()
{
mode=${1}
- export RUMP_SERVER=$SOCKFWD
- atf_check -s exit:0 rump.ifconfig shmif0 create
- atf_check -s exit:0 rump.ifconfig shmif0 linkstr $BUS_SRCGW
-
- atf_check -s exit:0 rump.ifconfig shmif1 create
- atf_check -s exit:0 rump.ifconfig shmif1 linkstr $BUS_DSTGW
+ rump_server_add_iface $SOCKFWD shmif0 $BUS_SRCGW
+ rump_server_add_iface $SOCKFWD shmif1 $BUS_DSTGW
+ export RUMP_SERVER=$SOCKFWD
if [ $mode = "ipv6" ]; then
atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6SRCGW}
atf_check -s exit:0 rump.ifconfig shmif1 inet6 ${IP6DSTGW}
@@ -178,6 +168,7 @@ setup_forwarder()
atf_check -s exit:0 rump.ifconfig shmif0 up
atf_check -s exit:0 rump.ifconfig shmif1 up
+ atf_check -s exit:0 rump.ifconfig -w 10
if $DEBUG; then
rump.netstat -nr
@@ -204,9 +195,9 @@ setup_forwarding6()
setup()
{
- atf_check -s exit:0 rump_server $RUMP_LIBS $SOCKSRC
- atf_check -s exit:0 rump_server $RUMP_LIBS $SOCKFWD
- atf_check -s exit:0 rump_server $RUMP_LIBS $SOCKDST
+ rump_server_start $SOCKSRC
+ rump_server_start $SOCKFWD
+ rump_server_start $SOCKDST
setup_endpoint $SOCKSRC $IP4SRC $BUS_SRCGW ipv4 $IP4SRCGW
setup_endpoint $SOCKDST $IP4DST $BUS_DSTGW ipv4 $IP4DSTGW
@@ -216,9 +207,9 @@ setup()
setup6()
{
- atf_check -s exit:0 rump_server $RUMP_LIBS_IPV6 $SOCKSRC
- atf_check -s exit:0 rump_server $RUMP_LIBS_IPV6 $SOCKFWD
- atf_check -s exit:0 rump_server $RUMP_LIBS_IPV6 $SOCKDST
+ rump_server_start $SOCKSRC netinet6
+ rump_server_start $SOCKFWD netinet6
+ rump_server_start $SOCKDST netinet6
setup_endpoint $SOCKSRC $IP6SRC $BUS_SRCGW ipv6 $IP6SRCGW
setup_endpoint $SOCKDST $IP6DST $BUS_DSTGW ipv6 $IP6DSTGW
@@ -380,6 +371,7 @@ route_command_get_body()
setup
setup_forwarding
test_route_get
+ rump_server_destroy_ifaces
}
route_command_get6_body()
@@ -388,36 +380,20 @@ route_command_get6_body()
setup6
setup_forwarding6
test_route_get6
-}
-
-dump()
-{
-
- env RUMP_SERVER=$SOCKSRC rump.netstat -nr
- env RUMP_SERVER=$SOCKFWD rump.netstat -nr
- env RUMP_SERVER=$SOCKDST rump.netstat -nr
-
- shmif_dumpbus -p - bus1 2>/dev/null| tcpdump -n -e -r -
- shmif_dumpbus -p - bus2 2>/dev/null| tcpdump -n -e -r -
-}
-
-cleanup()
-{
-
- env RUMP_SERVER=$SOCKSRC rump.halt
- env RUMP_SERVER=$SOCKFWD rump.halt
- env RUMP_SERVER=$SOCKDST rump.halt
+ rump_server_destroy_ifaces
}
route_command_get_cleanup()
{
+
$DEBUG && dump
cleanup
}
route_command_get6_cleanup()
{
- dump
+
+ $DEBUG && dump
cleanup
}
diff --git a/rump/modautoload/Makefile b/rump/modautoload/Makefile
index 905e79ac0f6c..dc58b14fef3b 100644
--- a/rump/modautoload/Makefile
+++ b/rump/modautoload/Makefile
@@ -1,9 +1,12 @@
-# $NetBSD: Makefile,v 1.3 2015/12/27 06:36:36 pgoyette Exp $
+# $NetBSD: Makefile,v 1.8 2016/10/14 16:02:35 christos Exp $
#
+.include <bsd.init.mk>
+
TESTSDIR= ${TESTSBASE}/rump/modautoload
TESTS_C= t_modautoload
+PAXCTL_FLAGS= +ma
SRCS.t_modautoload+= t_modautoload.c
@@ -15,6 +18,7 @@ LDADD+= -Wl,--whole-archive ${DESTDIR}/usr/lib/librumpvfs.a \
${DESTDIR}/usr/lib/librump.a \
-Wl,--no-whole-archive
LDADD+= -lrumpuser -lpthread
+DPADD+= ${LIBRUMPVFS} ${LIBRUMP} ${LIBRUMPUSER}
WARNS= 4
diff --git a/rump/modautoload/t_modautoload.c b/rump/modautoload/t_modautoload.c
index b73e52a2963b..2c21a90b664b 100644
--- a/rump/modautoload/t_modautoload.c
+++ b/rump/modautoload/t_modautoload.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_modautoload.c,v 1.4 2015/12/27 08:21:44 pgoyette Exp $ */
+/* $NetBSD: t_modautoload.c,v 1.5 2016/09/14 03:19:11 ozaki-r Exp $ */
#include <sys/types.h>
#include <sys/mount.h>
@@ -46,6 +46,7 @@ mountkernfs(void)
atf_tc_fail_errno("mkdir /kern");
new_autoload = true;
+ old_len = sizeof(old_autoload);
new_len = sizeof(new_autoload);
error = sysctlbyname("kern.module.autoload",
&old_autoload, &old_len,
diff --git a/rump/rumpkern/t_lwproc.c b/rump/rumpkern/t_lwproc.c
index d4eee3a6119a..6e78d0219e2b 100644
--- a/rump/rumpkern/t_lwproc.c
+++ b/rump/rumpkern/t_lwproc.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_lwproc.c,v 1.7 2015/01/21 15:19:01 pooka Exp $ */
+/* $NetBSD: t_lwproc.c,v 1.8 2017/01/10 22:36:29 christos Exp $ */
/*
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -29,6 +29,7 @@
#include <sys/types.h>
#include <sys/wait.h>
+#include <sys/stat.h>
#include <rump/rump.h>
#include <rump/rump_syscalls.h>
diff --git a/sys/net/t_print.c b/sys/net/t_print.c
index 0aaeb3070f98..ff178952a90d 100644
--- a/sys/net/t_print.c
+++ b/sys/net/t_print.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_print.c,v 1.1 2014/12/02 19:48:21 christos Exp $ */
+/* $NetBSD: t_print.c,v 1.2 2016/08/27 11:30:49 christos Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_print.c,v 1.1 2014/12/02 19:48:21 christos Exp $");
+__RCSID("$NetBSD: t_print.c,v 1.2 2016/08/27 11:30:49 christos Exp $");
#include "net/dl_print.c"
@@ -147,7 +147,10 @@ ATF_TC_BODY(sdl_print, tc)
memcpy(&sdl.sdl_addr, &tst[i].ia, sizeof(sdl.sdl_addr));
sdl.sdl_index = (uint16_t)i;
r = sdl_print(buf, l, &sdl);
- e = snprintf(res, l, "[%s]:%zu", tst[i].str, i);
+ if (i == 3)
+ e = snprintf(res, l, "link#%zu", i);
+ else
+ e = snprintf(res, l, "[%s]:%zu", tst[i].str, i);
ATF_REQUIRE_STREQ(buf, res);
ATF_REQUIRE_EQ(r, e);
}
@@ -157,7 +160,10 @@ ATF_TC_BODY(sdl_print, tc)
memcpy(&sdl.sdl_addr, &tst[i].ia, sizeof(sdl.sdl_addr));
sdl.sdl_index = (uint16_t)i;
r = sdl_print(buf, l, &sdl);
- e = snprintf(res, l, "[%s]:%zu", tst[i].str, i);
+ if (i == 3)
+ e = snprintf(res, l, "link#%zu", i);
+ else
+ e = snprintf(res, l, "[%s]:%zu", tst[i].str, i);
ATF_REQUIRE_STREQ(buf, res);
ATF_REQUIRE_EQ(r, e);
}
diff --git a/usr.bin/Makefile b/usr.bin/Makefile
index 34417786b120..1ed2d1a5885c 100644
--- a/usr.bin/Makefile
+++ b/usr.bin/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.21 2016/04/08 10:09:16 gson Exp $
+# $NetBSD: Makefile,v 1.23 2017/01/02 15:40:09 christos Exp $
#
.include <bsd.own.mk>
@@ -7,8 +7,8 @@ TESTSDIR= ${TESTSBASE}/usr.bin
TESTS_SUBDIRS= awk basename bzip2 cc cmp config cut \
diff dirname find gdb grep gzip id \
- infocmp jot ld m4 make mkdep \
+ infocmp jot ld m4 make mixerctl mkdep \
nbperf netpgpverify pr rump_server shmif_dumpbus sdiff \
- sed sort tmux tr unifdef vmstat xlint
+ sed sort tmux tr unifdef uniq vmstat xlint
.include <bsd.test.mk>
diff --git a/usr.bin/config/t_config.sh b/usr.bin/config/t_config.sh
index 8a8079c6a814..55af069f5afd 100755
--- a/usr.bin/config/t_config.sh
+++ b/usr.bin/config/t_config.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_config.sh,v 1.7 2015/10/04 07:59:47 uebayasi Exp $
+# $NetBSD: t_config.sh,v 1.8 2016/08/27 12:08:14 christos Exp $
#
# Copyright (c) 2008, 2010 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -25,12 +25,32 @@
# POSSIBILITY OF SUCH DAMAGE.
#
+srcdir=..
+merge_backslash()
+{
+ sed '
+: again
+/\\$/ {
+ N
+ s/\\\n//
+ t again
+}
+' "$1"
+}
run_and_check_prep()
{
local name="${1}"; shift
- mkdir compile
- supportdir="$(atf_get_srcdir)/support"
+ mkdir -p compile
+ srcdir="$(atf_get_srcdir)"
+ if [ ! -d "${srcdir}/support" ]; then
+ srcdir="$(dirname "${srcdir}")"
+ if [ ! -d "${srcdir}/support" ]; then
+ atf_fail "bad source directory ${srcdir}"
+ exit 1
+ fi
+ fi
+ supportdir="${srcdir}/support"
local config_str
eval config_str=\$${name}_config_str
@@ -38,7 +58,7 @@ run_and_check_prep()
config="d_${name}"
printf "$config_str" >"${config}"
else
- config="$(atf_get_srcdir)/d_${name}"
+ config="${srcdir}/d_${name}"
fi
}
@@ -121,28 +141,28 @@ test_case deffs_redef fail "Checks that config doesn't allow a deffs to use" \
"the same name as a previous defflag/defparam"
# Selecting an undefined option.
-undefined_opt_config_str='
-include "../d_min"
+undefined_opt_config_str="
+include \"${srcdir}/d_min\"
options UNDEFINED
-'
+"
test_case undefined_opt pass \
"Checks that config allows a selection for an undefined options"
# Negating an undefined option.
-no_undefined_opt_config_str='
-include "../d_min"
+no_undefined_opt_config_str="
+include \"${srcdir}/d_min\"
no options UNDEFINED
-'
+"
no_undefined_opt_stderr='match:UNDEFINED'
test_case no_undefined_opt warn \
"Checks that config allows a negation for an undefined options"
# Attribute selection
test_case select pass "Attribute selection"
-select_config_str='
-include "../d_min"
+select_config_str="
+include \"${srcdir}/d_min\"
select c
-'
+"
check_select()
{
local f=Makefile
@@ -158,11 +178,11 @@ select_body() {
# Attribute negation
test_case no_select pass "Attribute negation"
-no_select_config_str='
-include "../d_min"
+no_select_config_str="
+include \"${srcdir}/d_min\"
select c
no select a
-'
+"
check_no_select()
{
local f=Makefile
@@ -181,10 +201,10 @@ no_select_body() {
# Device instance
test_case devi pass "Device instance"
-devi_config_str='
-include "../d_min"
+devi_config_str="
+include \"${srcdir}/d_min\"
d0 at root
-'
+"
check_devi()
{
local f=ioconf.c
@@ -226,9 +246,7 @@ check_min_makefile()
grep -q '^%' $f >tmp.template
grep -q '^MACHINE=regress$' $f &&
- grep -q '^PARAM=-DMAXUSERS=4$' $f &&
- grep -q '^all: regress$' $f &&
- grep -q '^regress:' $f &&
+ (merge_backslash $f | grep -q '^IDENT=[ ]*-DMAXUSERS="4"') &&
[ ! -s tmp.template ] &&
:
}
diff --git a/usr.bin/netpgpverify/t_netpgpverify.sh b/usr.bin/netpgpverify/t_netpgpverify.sh
index 9c191160c7bf..2d532c0cb72d 100755
--- a/usr.bin/netpgpverify/t_netpgpverify.sh
+++ b/usr.bin/netpgpverify/t_netpgpverify.sh
@@ -1,6 +1,6 @@
#! /bin/sh
-# $NetBSD: t_netpgpverify.sh,v 1.3 2016/06/01 06:39:11 agc Exp $
+# $NetBSD: t_netpgpverify.sh,v 1.4 2016/08/28 15:59:15 christos Exp $
#
# Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -525,7 +525,7 @@ StZtC+VbuN66pfHwsAIAAw==
EOF
uudecode << EOF
begin-base64 644 NetBSD-6.0_hashes.asc.gz
-H4sICAAAAAACA05ldEJTRC02LjBfaGFzaGVzLmFzYwDUvduOXceVpX3deoq87B8o
+H4sICLYIw1cCA05ldEJTRC02LjBfaGFzaGVzLmFzYwDUvduOXceVpX3deoq87B8o
y3E+NNDA7yqrXQZKsmHZQN8V4igTRYkCSVWV++n7G4tMcu9kZnJlSgW4SYsmM3fG
ihUz5pxjRMzDr37Fr3/86ne//+bmj7/74823v//dN1/99ubrr7799je/+0rf+9UX
/9ze/PV/3Hz7z7+xX/Drz39dN/vVy5ev/uPFD9/dvHhz027Gq+9/fLnerpuXL968
@@ -6708,223 +6708,223 @@ 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
-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
-ck4sLauFT3tHHZUmr0y3EGegSlEp3M/Qe1NzL+emxViNDDoMbbZUNmipT7hjlAAt
-B7MLzTg0tjntVkX1ixL6K7xFsejZ+UJlL0dF1OhtiDF5zgSnQgAkDvOtVxJXeFSg
-FYA+MXQF9Sar62MF7TohQAGA+T9YAiclbR7eNmXge7dAXWFG4Uyo8A0gP1IQsTXz
-P7L+7jlSXl1ZlBWcd3pYrstBlIJ/26gTmwoveXk5WsGaVQXE5IjLUKIpZ7jLMgmG
-nDQRQ+6KRmpCRj4KCXkKJfXD+jSKU6Xrc0VI82bXCtOH8vV/Zvj9BYwSJ3k+C6V8
-c4vL2C3RJt+FpA2FY8kJ7L+7zU+cdhvZ+toESINV2iZPpZeleVib08dj5n6hUQWd
-33+0Q4OlPJg7P33KVeHhpZjUAEOTjC9kp7j2FqWTSwdXJPeI3y434Umjfz5Xw1lH
-EhLdecvhNVr07rot0U020UDoWmSrwwFc55STjNTjCM3zB70pnHYKgDdrkAWua5Ws
-LayFo49hgqBVjVF5eTtq1jOTRrRgQFilwD8gCIPgYOfqE3zuHK0J+ynWHDLl2c9R
-ZtJ0m0CDHFrbFNx9F/gQFBHQP0966vwhXwqnWL/JImvnfq+2urQfbWj63sb9JLis
-pkQwHTfdy4GF4JSEjIqQkaWgcyn3sRTU6rvHbQOVKtaXqFzOUX4XDK4YXbygFEwg
-ifvt4maQC7R652KmfpNvXDysvX7Z+Ox6tZo88rIniTdHjV5ffR4328sJzzYiW3yD
-217BKis6VWA0DdJOa0ERRYHWHzTZy1HpLxacb80pPZOpWszdCHySpyStu2v/mz8+
-/OiTW1/8484nd/7x9a1Pvrj+zb+++mj/9Wvfzie/arz/849PHj6988k/frfv+/ft
-n+b9X9eu3bt7q394/aMPr/94/ZMP7352d918+Mn1648+++j6D5/1+Pzzrx9++PRx
-uX7nA/sw/fzw3sOH8/aX927cvxm++ua38XWJ1369/7ymm+17+3zkH279872fHvT/
-/PD0yYPHj2/PD8dP0f14/Z83H8Vvf7n+69fti099+MrcauXJi98/u/fs65++un0t
-3fn0zuN79397/uP1Gx9/6//VHzz51/ff/fbre3eex+tf57vPP19P//njV8+emtsf
-ffPvzx8+/Sp/8p9fyr9vxue3Pnlcn1376ZNwZz18/Ov2+Lt75e4HyTz95sHPn/34
-wN376P4Ht7/+bdz843n/+dPt2wfz/m/XP3n+2fPH33777G78/pfrT8ML+8O1L7/9
-/OdHPzz6an48b9775ofrf4xlvn3x+7M/1s+fPr3z+/e315f5h/fu/Oenj9uj6/9a
-T2/dvvVlvrke3L+brocvP/zl2qOPPrptHz68z/1Zuf3dneu/3/K32vfr26c37KPt
-yUf//vmfn74ov3/4/NPb9+6s8vXzf/rv73/Rfnj0Yt7//tfPb177j/3iu+9+84/j
-w5v+4Sd365d3/vhKEeEL88N3D57eeC/261/ffe/rJz8/+cDc/az9+uGzH3/7/unt
-F3X7/dkXv5p7N67d+jibO/+09+7cv3nn52Vv3H345Q+PP/vpt3+t35W6Xe/6bfnR
-vcfv/fbo1oMfv/zp1rMbLz6++/H99eDhH+WXr27/cu2Df3/5/NnH/873Xtxo8Zen
-5gP3z8+3G18//e3ZzY9++irdivX6wxg+/Pg7c6/Gb/4I9cUq9259/OX1W+3FXD99
-eu36HXvjs9sPXfz9x9/6wz8++KrcfjpvPfsgmE8f/bQ9efLxk5uPX9zIP3/+ONx3
-dx7M337+wM/HT3/+9ql87ntP+zVz/5t7Xzy78WmLP/z+9NGXpCsPntz66KPP7nz0
-/Yzx+/7z/XLvsxeP3rt+zz78z4379sObX/zw8H558Wm79ezOrbvX4h93f3x+49M7
-5Yv5xwfmvv32vV8/vvZ/H376fb/2/wGUHa4t0v0NAA==
+Bh1fXF4EQ/TgfzV3dl1CFUmXvudX9O0s12jmye9Zay4QUJFWQW21vZmVnzaIoCiC
+/PrZzymwq6CoOsXrhbbailSePCcyI3ZkRuxdq/aRNo4WGGKcNfduo5uwUSov65UO
+Rz+Eo4X/OrmZ0M8sFDzVTcAlDqMsVq4plpyU1nshRJh6UxJGlJMQBrOr2RXpz0SQ
+S6vQKdFbMb7NfJdMm0YlJRRDgK5Q2DkSytOzRZhSDSRxMB81e64JLxmbJWa1gTeZ
+zAwtaPxGEgZW1lCHNQfMeFFRfJ2c1FbYozdlvvrXKLjUIbhLfvTYV/bRtkP2vOA5
+2jI+bRZ6OaBUgiBZEbY2ZAIEsBzcvcJEPbUhQKPUzHNgHGbYBN44Vofu2PUdNGoX
+F/bwkisVqtICQMVdP9h23s1mqE2lTi8ihYHCtT9k2AuFNAc3txMRA+7wNHmvpAMl
+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
+xP12cTPIBVq9czFTv8k3Lh7WXr9sfHa9Wk0eedmTxJujRq+vPo+b7eWEZxuRLb7B
+ba9glRWdKjCaBmmntaCIokDrD5rs5aj0FwvOt+aUnslULeZuBD7JU5LW3bX/zR8f
+3vr49uf/uPvx3X98dfvjz69//a8vb+2/fu2b+eRXjfd//vHxo6d3P/7H7/Z9/779
+07z/69q1+/du9w+v3/rw+g/XP/7w3qf31s1HH1+//vjTW9e//7TH55999ejDp7+U
+63c/sI/ST4/uP3o073xx/8aDm+HLr38bX5V47dcHz2u62b6zz0f+/vY/3/vxYf/P
+90+fPPzllzvzw/FjdD9c/+fNx/Gbn6//+lX7/BMfvjS3W3ny4vdP7z/76scv71xL
+dz+5+8v9B789/+H6jY++8f/qD5/867tvf/v1vbvP4/Wv8r3nn62n//zhy2dPzZ1b
+X//7s0dPv8wf/+fn8u+b8fntj3+pz679+HG4ux798uv2y7f3y70Pknn69cOfPv3h
+obt/68EHd776bdz843n/6ZPtm4fzwW/XP37+6fNfvvnm2b343c/Xn4YX9vtrX3zz
+2U+Pv3/85fxo3rz/9ffX/xjLfPPi92d/rJ8+eXr39+/urC/y9+/d/c+PH7XH1/+1
+nt6+c/uLfHM9fHAvXQ9ffPjztce3bt2xjx494P6s3Pn27vXfb/vb7bv1zdMb9vH2
+5Na/f/rnJy/K7x8+/+TO/burfPX8n/67B5+37x+/mA+++/Wzm9f+Yz//9tvf/C/x
+0U3/6ON79Yu7f3ypiPC5+f7bh09vvBf79a/uvffVk5+efGDufdp+/fDZD7999/TO
+i7r9/uzzX839G9duf5TN3X/a+3cf3Lz707I37j364vtfPv3xt3+t35W6Xe/6bfnx
+/V/e++3x7Yc/fPHj7Wc3Xnx076MH6+GjP8rPX975+doH//7i+bOP/p3vv7jR4s9P
+zQfun59tN756+tuzm7d+/DLdjvX6oxg+/Ohbc7/Gr/8I9cUq929/9MX12+3FXD9+
+cu36XXvj0zuPXPz9h9/6oz8++LLceTpvP/sgmE8e/7g9efLRk5u/vLiRf/rsl/DA
+3X04f/vpAz9/efrTN0/lc9972q+ZB1/f//zZjU9a/P73p4+/IF15+OT2rVuf3r31
+3Yzxu/7Tg3L/0xeP37t+3z76z40H9sObn3//6EF58Um7/ezu7XvX4h/3fnh+45O7
+5fP5xwfmgf3mvV8/uvZ/H33yXT/ZJLc+v3neFvn/qZKFEe79DQA=
====
EOF
gunzip NetBSD-6.0_hashes.asc.gz
@@ -6958,18 +6958,15 @@ YzFlNiBiZjcxIDg4NDUgNDE2YiA5NTIyIDc5ZGUgYjYxZSA0ODhlIGVlNzQgCgo=
EOF
uudecode << EOF
begin-base64 644 expected18
-R29vZCBzaWduYXR1cmUgZm9yIGdwZ3NpZ25lZC1hLmdwZyBtYWRlIFN1biBTZXAg
-IDkgMTc6NDM6MDEgMjAxMgpzaWduYXR1cmUgIDIwNDgvUlNBIChFbmNyeXB0IG9y
-IFNpZ24pIDFiNjhkY2ZjYzA1OTY4MjMgMjAwNC0wMS0xMgpmaW5nZXJwcmludDog
-IGQ0MTUgOWRlYiAzMzZkIGU0Y2MgY2RmYSAwMGNkIDFiNjggZGNmYyBjMDU5IDY4
-MjMgCnVpZCAgICAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAYWxpc3Rh
-aXJjcm9va3MuY29tPgp1aWQgICAgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8
-YWdjQHBrZ3NyYy5vcmc+CnVpZCAgICAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tz
-IDxhZ2NAbmV0YnNkLm9yZz4KdWlkICAgICAgICAgICAgICBBbGlzdGFpciBDcm9v
-a3MgPGFnY0BuZXRmbGl4LmNvbT4KZW5jcnlwdGlvbiAyMDQ4L1JTQSAoRW5jcnlw
-dCBvciBTaWduKSA3OWRlYjYxZTQ4OGVlZTc0IDIwMDQtMDEtMTIKZmluZ2VycHJp
-bnQ6ICA1N2MwIGMxZTYgYmY3MSA4ODQ1IDQxNmIgOTUyMiA3OWRlIGI2MWUgNDg4
-ZSBlZTc0IAoK
+R29vZCBzaWduYXR1cmUgZm9yIGEuZ3BnIG1hZGUgVHVlIE1heSAzMSAyMzoyOTox
+MCAyMDE2CnNpZ25hdHVyZSAgICAgMjA0OC9SU0EgKEVuY3J5cHQgb3IgU2lnbikg
+MWI2OGRjZmNjMDU5NjgyMyAyMDA0LTAxLTEyCmZpbmdlcnByaW50ICAgZDQxNSA5
+ZGViIDMzNmQgZTRjYyBjZGZhIDAwY2QgMWI2OCBkY2ZjIGMwNTkgNjgyMyAKdWlk
+ICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BhbGlzdGFpcmNyb29rcy5j
+b20+CnVpZCAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAcGtnc3JjLm9y
+Zz4KdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BuZXRic2Qub3Jn
+Pgp1aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5ldGZsaXguY29t
+PgoK
====
EOF
uudecode << EOF
@@ -6995,18 +6992,15 @@ aW5hcnkvdGV4dApiIGxlbmd0aApjIHN0cmluZwpMIG10aW1lCnRleHQK
EOF
uudecode << EOF
begin-base64 644 expected21
-R29vZCBzaWduYXR1cmUgZm9yIFtzdGRpbl0gbWFkZSBTdW4gU2VwICA5IDE3OjQ0
-OjExIDIwMTIKc2lnbmF0dXJlICAyMDQ4L1JTQSAoRW5jcnlwdCBvciBTaWduKSAx
-YjY4ZGNmY2MwNTk2ODIzIDIwMDQtMDEtMTIKZmluZ2VycHJpbnQ6ICBkNDE1IDlk
-ZWIgMzM2ZCBlNGNjIGNkZmEgMDBjZCAxYjY4IGRjZmMgYzA1OSA2ODIzIAp1aWQg
-ICAgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQGFsaXN0YWlyY3Jvb2tz
-LmNvbT4KdWlkICAgICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0Bwa2dz
-cmMub3JnPgp1aWQgICAgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5l
-dGJzZC5vcmc+CnVpZCAgICAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NA
-bmV0ZmxpeC5jb20+CmVuY3J5cHRpb24gMjA0OC9SU0EgKEVuY3J5cHQgb3IgU2ln
-bikgNzlkZWI2MWU0ODhlZWU3NCAyMDA0LTAxLTEyCmZpbmdlcnByaW50OiAgNTdj
-MCBjMWU2IGJmNzEgODg0NSA0MTZiIDk1MjIgNzlkZSBiNjFlIDQ4OGUgZWU3NCAK
-Cg==
+R29vZCBzaWduYXR1cmUgZm9yIFtzdGRpbl0gbWFkZSBUdWUgTWF5IDMxIDIzOjI5
+OjEwIDIwMTYKc2lnbmF0dXJlICAgICAyMDQ4L1JTQSAoRW5jcnlwdCBvciBTaWdu
+KSAxYjY4ZGNmY2MwNTk2ODIzIDIwMDQtMDEtMTIKZmluZ2VycHJpbnQgICBkNDE1
+IDlkZWIgMzM2ZCBlNGNjIGNkZmEgMDBjZCAxYjY4IGRjZmMgYzA1OSA2ODIzIAp1
+aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQGFsaXN0YWlyY3Jvb2tz
+LmNvbT4KdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0Bwa2dzcmMu
+b3JnPgp1aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5ldGJzZC5v
+cmc+CnVpZCAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAbmV0ZmxpeC5j
+b20+Cgo=
====
EOF
uudecode << EOF
@@ -7123,18 +7117,15 @@ MDIwNSA5ZmYyIGMyNGYgZGYyYyBlNjIwIAoK
EOF
uudecode << EOF
begin-base64 644 expected31
-YmVnaW4tYmFzZTY0IDY0NCBleHBlY3RlZDMxClVGSlBSejF3Q2xOU1ExTTljR0Z5
-YzJVdVl3cFhRVkpPVXowMUNrMUxUVUZPUFc1dkNrTlFVRVpNUVVkVEt6MHQKWnlB
-dFR6QUtURVJHVEVGSFV5czlMV2NnTFU4d0Nnb3VhVzVqYkhWa1pTQThZbk5rTG5C
-eWIyY3ViV3MrQ2dwMApPaUFrZTFCU1QwZDlDZ2t1THlSN1VGSlBSMzBnWjNCbmMy
-bG5ibVZrTFdFdVozQm5DbEJTVDBjOWNBcFRVa05UClBYQmhjbk5sTG1NS1YwRlNU
-bE05TlFwTlMwMUJUajF1YndwRFVGQkdURUZIVXlzOUxXY2dMVTh3Q2t4RVJreEIK
-UjFNclBTMW5JQzFQTUFvS0xtbHVZMngxWkdVZ1BHSnpaQzV3Y205bkxtMXJQZ29L
-ZERvZ0pIdFFVazlIZlFvSgpMaThrZTFCU1QwZDlJR2R3WjNOcFoyNWxaQzFoTG1k
-d1p3cFFVazlIUFhBS1UxSkRVejF3WVhKelpTNWpDbGRCClVrNVRQVFVLVFV0TlFV
-NDlibThLUTFCUVJreEJSMU1yUFMxbklDMVBNQXBNUkVaTVFVZFRLejB0WnlBdFR6
-QUsKQ2k1cGJtTnNkV1JsSUR4aWMyUXVjSEp2Wnk1dGF6NEtDblE2SUNSN1VGSlBS
-MzBLQ1M0dkpIdFFVazlIZlNCbgpjR2R6YVdkdVpXUXRZUzVuY0djSwo9PT09Cg==
+UFJPRz1wClNSQ1M9cGFyc2UuYwpXQVJOUz01Ck1LTUFOPW5vCkNQUEZMQUdTKz0t
+ZyAtTzAKTERGTEFHUys9LWcgLU8wCgouaW5jbHVkZSA8YnNkLnByb2cubWs+Cgp0
+OiAke1BST0d9CgkuLyR7UFJPR30gZ3Bnc2lnbmVkLWEuZ3BnClBST0c9cApTUkNT
+PXBhcnNlLmMKV0FSTlM9NQpNS01BTj1ubwpDUFBGTEFHUys9LWcgLU8wCkxERkxB
+R1MrPS1nIC1PMAoKLmluY2x1ZGUgPGJzZC5wcm9nLm1rPgoKdDogJHtQUk9HfQoJ
+Li8ke1BST0d9IGdwZ3NpZ25lZC1hLmdwZwpQUk9HPXAKU1JDUz1wYXJzZS5jCldB
+Uk5TPTUKTUtNQU49bm8KQ1BQRkxBR1MrPS1nIC1PMApMREZMQUdTKz0tZyAtTzAK
+Ci5pbmNsdWRlIDxic2QucHJvZy5taz4KCnQ6ICR7UFJPR30KCS4vJHtQUk9HfSBn
+cGdzaWduZWQtYS5ncGcK
====
EOF
uudecode << EOF
@@ -7168,20 +7159,16 @@ aXguY29tPgoK
EOF
uudecode << EOF
begin-base64 644 expected33
-YmVnaW4tYmFzZTY0IDY0NCBleHBlY3RlZDMzClVGSlBSejF3Q2xOU1ExTTljR0Z5
-YzJVdVl3cFhRVkpPVXowMUNrMUxUVUZPUFc1dkNrTlFVRVpNUVVkVEt6MHQKWnlB
-dFR6QUtURVJHVEVGSFV5czlMV2NnTFU4d0Nnb3VhVzVqYkhWa1pTQThZbk5rTG5C
-eWIyY3ViV3MrQ2dwMApPaUFrZTFCU1QwZDlDZ2t1THlSN1VGSlBSMzBnWjNCbmMy
-bG5ibVZrTFdFdVozQm5DakV1SUhSaFp5QW1JREI0Ck0yWUtNaTRnYkdWdUNncHZi
-bVVnY0dGemN5QW9kR0ZuSURRcENqMDlQVDA5UFQwOUNtSWdkbVZ5YzJsdmJqb3oK
-Q21JZ2MybG5JSFI1Y0dVS1lpQm9ZWE5vSUdGc1p3cGlJSEIxWW10bGVTQmhiR2NL
-T0dJZ2EyVjVhV1FLQ214cApkR1Z5WVd3Z1pHRjBZU0FvZEdGbklERXhLUW85UFQw
-OVBUMDlQVDA5UFQwOUNtSWdZbWx1WVhKNUwzUmxlSFFLCllpQnNaVzVuZEdnS1l5
-QnpkSEpwYm1jS1RDQnRkR2x0WlFwMFpYaDBDbEJTVDBjOWNBcFRVa05UUFhCaGNu
-TmwKTG1NS1YwRlNUbE05TlFwTlMwMUJUajF1YndwRFVGQkdURUZIVXlzOUxXY2dM
-VTh3Q2t4RVJreEJSMU1yUFMxbgpJQzFQTUFvS0xtbHVZMngxWkdVZ1BHSnpaQzV3
-Y205bkxtMXJQZ29LZERvZ0pIdFFVazlIZlFvSkxpOGtlMUJTClQwZDlJR2R3WjNO
-cFoyNWxaQzFoTG1kd1p3bz0KPT09PQo=
+UFJPRz1wClNSQ1M9cGFyc2UuYwpXQVJOUz01Ck1LTUFOPW5vCkNQUEZMQUdTKz0t
+ZyAtTzAKTERGTEFHUys9LWcgLU8wCgouaW5jbHVkZSA8YnNkLnByb2cubWs+Cgp0
+OiAke1BST0d9CgkuLyR7UFJPR30gZ3Bnc2lnbmVkLWEuZ3BnCjEuIHRhZyAmIDB4
+M2YKMi4gbGVuCgpvbmUgcGFzcyAodGFnIDQpCj09PT09PT09CmIgdmVyc2lvbjoz
+CmIgc2lnIHR5cGUKYiBoYXNoIGFsZwpiIHB1YmtleSBhbGcKOGIga2V5aWQKCmxp
+dGVyYWwgZGF0YSAodGFnIDExKQo9PT09PT09PT09PT09CmIgYmluYXJ5L3RleHQK
+YiBsZW5ndGgKYyBzdHJpbmcKTCBtdGltZQp0ZXh0ClBST0c9cApTUkNTPXBhcnNl
+LmMKV0FSTlM9NQpNS01BTj1ubwpDUFBGTEFHUys9LWcgLU8wCkxERkxBR1MrPS1n
+IC1PMAoKLmluY2x1ZGUgPGJzZC5wcm9nLm1rPgoKdDogJHtQUk9HfQoJLi8ke1BS
+T0d9IGdwZ3NpZ25lZC1hLmdwZwo=
====
EOF
uudecode << EOF
@@ -7207,13 +7194,12 @@ IG5ldHBncHZlcmlmeQo=
====
EOF
atf_check -s eq:0 -o file:expected16 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c verify b.gpg
- atf_check -s eq:0 -o file:2.expected -e empty b2e < 2.in
- atf_check -s eq:0 -o file:expected18 -e empty env TZ=US/Pacific netpgpverify -c verify a.gpg
- atf_check -s eq:0 -o file:expected19 -e empty env TZ=US/Pacific netpgpverify -c verify NetBSD-6.0_RC2_hashes.asc
+ atf_check -s eq:0 -o file:expected18 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c verify a.gpg
+# atf_check -s eq:0 -o file:expected19 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c verify NetBSD-6.0_RC2_hashes.asc
atf_check -s eq:0 -o file:expected20 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c cat jj.asc
- atf_check -s eq:0 -o file:expected21 -e empty env TZ=US/Pacific netpgpverify < a.gpg
+ atf_check -s eq:0 -o file:expected21 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg < a.gpg
atf_check -s eq:0 -o file:expected22 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg < jj.asc
- atf_check -s eq:0 -o file:expected23 -e empty env TZ=US/Pacific netpgpverify < NetBSD-6.0_RC2_hashes.asc
+# atf_check -s eq:0 -o file:expected23 -e empty env TZ=US/Pacific netpgpverify < NetBSD-6.0_RC2_hashes.asc
atf_check -s eq:0 -o file:expected24 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg < b.gpg
#atf_check -s eq:0 -o file:expected25 -e empty netpgpverify NetBSD-6.0_RC1_hashes.gpg
#atf_check -s eq:0 -o file:expected26 -e empty netpgpverify < NetBSD-6.0_RC1_hashes.gpg
@@ -7225,7 +7211,7 @@ EOF
atf_check -s eq:0 -o file:expected32 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg b.gpg b.gpg b.gpg
atf_check -s eq:0 -o file:expected33 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c cat b.gpg jj.asc b.gpg
atf_check -s eq:0 -o file:expected34 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg det.sig
- atf_check -s eq:0 -o file:expected35 -e empty env TZ=US/Pacific netpgpverify -c cat -k pubring.gpg det.sig
+ atf_check -s eq:0 -o file:expected35 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c cat det.sig
#atf_check -s eq:0 -o file:expected46 -e empty netpgpverify -k problem-pubring.gpg NetBSD-6.0_hashes.asc
}
diff --git a/usr.bin/xlint/lint1/Makefile b/usr.bin/xlint/lint1/Makefile
index 3690d1a67685..f72acb1cda94 100644
--- a/usr.bin/xlint/lint1/Makefile
+++ b/usr.bin/xlint/lint1/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.11 2015/10/14 16:32:55 christos Exp $
+# $NetBSD: Makefile,v 1.13 2016/08/19 10:21:50 christos Exp $
NOMAN= # defined
@@ -11,6 +11,7 @@ TESTS_SH= t_integration
FILESDIR= ${TESTSDIR}
FILES+= d_alignof.c
FILES+= d_c99_anon_struct.c
+FILES+= d_c99_anon_union.c
FILES+= d_c99_complex_num.c
FILES+= d_c99_complex_split.c
FILES+= d_c99_compound_literal_comma.c
@@ -23,6 +24,7 @@ FILES+= d_c99_func.c
FILES+= d_c99_recursive_init.c
FILES+= d_c99_struct_init.c
FILES+= d_c99_nested_struct.c
+FILES+= d_c99_union_cast.c
FILES+= d_c99_union_init1.c
FILES+= d_c99_union_init2.c
FILES+= d_c99_union_init3.c
diff --git a/usr.bin/xlint/lint1/d_c99_anon_union.c b/usr.bin/xlint/lint1/d_c99_anon_union.c
new file mode 100644
index 000000000000..508bcc9bdf43
--- /dev/null
+++ b/usr.bin/xlint/lint1/d_c99_anon_union.c
@@ -0,0 +1,16 @@
+/* struct with only anonymous members */
+
+struct foo {
+ union {
+ long loo;
+ double doo;
+ };
+};
+
+int
+main(void) {
+
+ struct foo *f = 0;
+ printf("%p\n", &f[1]);
+ return 0;
+}
diff --git a/usr.bin/xlint/lint1/d_c99_union_cast.c b/usr.bin/xlint/lint1/d_c99_union_cast.c
new file mode 100644
index 000000000000..31628b456288
--- /dev/null
+++ b/usr.bin/xlint/lint1/d_c99_union_cast.c
@@ -0,0 +1,18 @@
+/* union cast */
+
+struct bar {
+ int a;
+ int b;
+};
+
+union foo {
+ struct bar *a;
+ int b;
+};
+
+void
+foo(void) {
+ struct bar *a;
+
+ ((union foo)a).a;
+}