Index: stable/11/contrib/netbsd-tests/crypto/libcrypto/t_libcrypto.sh =================================================================== --- stable/11/contrib/netbsd-tests/crypto/libcrypto/t_libcrypto.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/crypto/libcrypto/t_libcrypto.sh (revision 313680) @@ -1,107 +1,107 @@ -# $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. # # 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. # atf_test_case engine engine_head() { atf_set "descr" "Checks ENGINE framework" } engine_body() { atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_enginetest" } atf_test_case rand rand_head() { atf_set "descr" "Checks peudo-random number generator" } rand_body() { atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_randtest" } atf_test_case bn bn_head() { atf_set "descr" "Checks BIGNUM library" - atf_set "timeout" "300" + atf_set "timeout" "360" } bn_body() { atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_bntest" atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_divtest" atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_exptest" } atf_test_case conf conf_head() { atf_set "descr" "Checks configuration modules" } conf_body() { cp $(atf_get_srcdir)/d_conf_ssleay.cnf ssleay.cnf atf_check -o file:$(atf_get_srcdir)/d_conf.out \ $(atf_get_srcdir)/h_conftest } atf_test_case lhash lhash_head() { atf_set "descr" "Checks lhash - dynamic hash tables" } lhash_body() { atf_check -o ignore -e ignore -x \ "echo hoge | $(atf_get_srcdir)/h_lhashtest" } atf_test_case threads threads_head() { atf_set "descr" "Checks threading" } threads_body() { $(atf_get_srcdir)/h_threadstest \ -cert $(atf_get_srcdir)/d_server.pem \ -ccert $(atf_get_srcdir)/d_client.pem \ 2>&1 | tee out atf_check -s eq:1 -o empty -e empty grep :error: out } atf_init_test_cases() { atf_add_test_case engine atf_add_test_case rand atf_add_test_case bn atf_add_test_case conf atf_add_test_case lhash atf_add_test_case threads } Index: stable/11/contrib/netbsd-tests/crypto/libcrypto/t_pubkey.sh =================================================================== --- stable/11/contrib/netbsd-tests/crypto/libcrypto/t_pubkey.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/crypto/libcrypto/t_pubkey.sh (revision 313680) @@ -1,110 +1,110 @@ -# $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. # # 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. # atf_test_case dsa dsa_head() { atf_set "descr" "Checks DSA cipher" } dsa_body() { atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_dsatest" } atf_test_case dh dh_head() { atf_set "descr" "Checks Diffie-Hellman key agreement protocol" } dh_body() { atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_dhtest" } atf_test_case rsa rsa_head() { atf_set "descr" "Checks RSA" - atf_set "timeout" "300" + atf_set "timeout" "420" } rsa_body() { atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_rsatest" } atf_test_case ec ec_head() { atf_set "descr" "Checks EC cipher" - atf_set "timeout" "300" + atf_set "timeout" "480" } ec_body() { atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_ectest" } atf_test_case ecdh ecdh_head() { atf_set "descr" "Checks ECDH key agreement protocol" } ecdh_body() { atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_ecdhtest" } atf_test_case ecdsa ecdsa_head() { atf_set "descr" "Checks ECDSA algorithm" - atf_set "timeout" "300" + atf_set "timeout" "480" } ecdsa_body() { atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_ecdsatest" } atf_test_case srp srp_head() { atf_set "descr" "Checks SRP key agreement protocol" } srp_body() { atf_check -o ignore -e ignore "$(atf_get_srcdir)/h_srptest" } atf_init_test_cases() { atf_add_test_case dsa atf_add_test_case dh atf_add_test_case rsa atf_add_test_case ec atf_add_test_case ecdh atf_add_test_case ecdsa atf_add_test_case srp } Index: stable/11/contrib/netbsd-tests/dev/audio/h_pad.c =================================================================== --- stable/11/contrib/netbsd-tests/dev/audio/h_pad.c (revision 313679) +++ stable/11/contrib/netbsd-tests/dev/audio/h_pad.c (revision 313680) @@ -1,76 +1,76 @@ -/* $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. * * 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 AUTHOR ``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 AUTHOR 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 #include #include #include #include #include #include #include #include #include "h_pad_musa.c" /* * Stuff some audio into /dev/audio, read it from /dev/pad. Use in * conjunction with t_pad, which tests that we got sensible output * by comparing against a previous audibly good result. */ #define BUFSIZE 1024 int main(int argc, char *argv[]) { char buf[BUFSIZE]; char zeros[BUFSIZE]; int padfd, audiofd; 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"); memset(zeros, 0, sizeof(zeros)); while ((n = rump_sys_read(padfd, buf, sizeof(buf))) > 0) { if (memcmp(buf, zeros, sizeof(buf)) == 0) break; write(STDOUT_FILENO, buf, n); } } Index: stable/11/contrib/netbsd-tests/dev/audio/t_pad_output.bz2.uue =================================================================== --- stable/11/contrib/netbsd-tests/dev/audio/t_pad_output.bz2.uue (revision 313679) +++ stable/11/contrib/netbsd-tests/dev/audio/t_pad_output.bz2.uue (revision 313680) @@ -1,1035 +1,1040 @@ begin 644 t_pad_output.bz2 -M0EIH.3%!629369%IQ#X`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@[KN<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)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.":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]](_;T]*B(`QH.-:D+F0Y(DOX[O8A^D&ZOMFWV'@4'P8^/`G6' -M4MT7D&'K95`"'TM;8HC'LCRM8)T%MM8^D+N/=;2(V#3NCX`4ISMR_2ZY!(<< -MODMH/*.`-_8\FLT9T`6L6N;B -ML+\].#\V8R;3BE920@#2V1+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^!<^ZRS=X!-^V>ZVP;`ZT!\%Z,_M4O]>(!*Q -M%78V.MY[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-Z"8=_X,P_=A -MXHKO&(2"G=D,QU$C((T6%6GP&!#S"XF5-4V6YAT`'5EB!2_H5R+\+"TB'N$` -M+T%X4&3]-]G#I0>*@2%GIH7 -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"&DUMP7D:"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+>M'^T?2W -M'C:U,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^/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>`,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+5MNVCN4"&]Z]DJO`(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/+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>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\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/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#D=IF8CCD"I:=]2]C(V:VB`Z -MOS\_5M\P`2K/>9)C:#G,^D1A32(@7>9.&JW(0D0'@NOJ*)ZVW.3&/)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(!_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[@47APG.]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?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\#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',6$)OO0-%D1.;GY>Z%(/[H^5!\IJCTY>TVV!=^XZ] -M/D?;R_(6)'WW?`>S2].TI:(%$?*%L3XD%Z`_[1*CVU3[S"EBV,S3O&V(D7C? -MCX7#((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#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-3T0L_8UBV6.(/_'+6Y_4<_W0:X/95G9K[]6,VW;)RW[BL&"4QI*+FQIL3-;]0MTG,P&5];4I-/<#MZ[$G6F\QXH3/S1?6PP?`?+Q$ -M]R*YE='TQ>X[,Z+H34N>&#L0FK==ON$!U>%8>&^_LQ7N:&03DMT_&/"P/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(.+R!'\3#[M"',]^NSG/W!-`R+(=B;KN?>=B0!7YM]TGPN?R]6>&E? -M2\]9^5R5!!-?`^QG\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#?(@?>WP$_1TUJX%51#[8U%HU5L747&5+ST6H,!2 -M$X;-DZ;MV/:X!CJ#M-XM6U]D;/`Z@0PP% -MF8::)8Q5B+;K[!7`EGD7FR+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,*,QBBQXIKL0[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_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)_,\(KV&\\PX%;;=Y/2.8S_ZS4_/=LX2 -MVN:NW,>H7RAPLCFW?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@<"!KUFH=&EX?'G-2+BX\H72GD2#6;J3 -M[M!IO)0^%X\.1R"A\;JB^=/["Q?9"(*5_A_;RO;D: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\=.>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]HA%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-+>6VK/.YF!JF1=*7EX2< -M&\7:DPEVSXTW??#PV/G7),\&,=;;=K]5#?].'AT6,RM<:`P/@U)IC%WH198Q -MC8S]Z`=Z<\:7=5](-56M?`RKAS^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!`.$YAEIHL@@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&LUI;]C3FAE2]T<$T!A,?%YRAGK\H[/*_Q)?;TJN)Q11Z^0ZXM@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<=`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&,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\#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 -M1YGT_YZW*_/\5:_R -M@.?#1+X.-.[U4RU-((0^J_)?%17?S*GO@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=&:?=^"];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_OYH+QC?'/MQM2M -MQ]E>Y&()C1, -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-A_:I(TIALLN=V?KPE63I3Z#68#WDT#*0 -M""I&=IDJE4$?6:_-4$-UWUDY -M*LR^RI'^7TO'-RPH'381J9M:5V>Z9<8O,$<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+-;=)77]FW -M85FS>;!F.S)_5")LW'2CW'RZ+IT="*+5:Z.N.'/D1=]'H;B2'AN<37AXKL+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#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'VE7_&3LJO -M]_Q^4\@4UA'UVW>L;TP*ZNKJR\KZC3+J1_7%PT^@K>'[+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(3JDLIZB;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;7WAKMKLMA/OU>)K<>WYZD26[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;-EI104$;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.0AADV+C"-QT$ -M%OWF[P_3;0AL^+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;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?9,_R_V!^Z-#SNU;^#[K*^)]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>E9SXWKBYL'9@O(/UG[ -MWJZS:-JYH.%LR6[0K;F>]M"4>.@]H?'X]:-9B&EO'K0&#!-`'Q%/#!P:VQ;: -MU;!%NVXY;A;A`M'@J%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"*1VDGA_`?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/ESNWFC'GS(RH<1H38!0$U`: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\`<4XV;,30IQ6XXG&<4I]_,B!T''#%X\L -MG8-%#, -M:@?M$*-XN\"MX5O-V_?1ORW-JC[>'CO?28:=GOTWRNGVCZ6'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]%%$=QV=D9G9J.S69V)V02G -ML&8)V`'7&0.)%I`-B7T6M*L+IOIT\^[W<,*VC:-J;2S:-H-DE#0GA$I\,F$# -M@>&$PDJE?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[?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*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"?O]S-KZNOB>FJFI%105"35`5#,Z!U0,B3*JIA%("`LG`JAP91][FYRW+N]PJ&R/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\.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[^&_/: -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)?1QUTFHTXZ#&[>U2K4 -M5+X5)0*"DPD610+`7O04142I=ED*+E8E#A=J] -M%WM%5O*&\19L4J@:0W4FV+,B1P3LW80&62XD1HD'=/&\CH)&DP/>O]G?J]?3 -M.#M12J5WE4I(T$ -MO+9Q=_:DX)!0;HJ<7/B=Z7SJ$J!S$4I@1R`.8%`IEX*;$:45@PQ1HVL]EAM%ITE+MC)'$*:-LA(I! -M&$8J[@\<5:Q'A>0>&O'N'F:NJ2;UV]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*>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>YR=RO/K0:S;ZVX< -M/%A2XTN.*8T&&-+#B=<9+@-'39`/6!J,@ZR$^U,S!:$H92D-0TLE'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-CIS: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'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%RM-N\/3Y>I8-+1TC2$C11I#LD-I)+IM2FE>HLE3`(NDFD -MDHI.ANDH3!:VZW-O2,CM7<[?O=WE\L\E^SK;INO4561:]H. -M--.K5*SU1-0B:5`U*$4U)$FG502U.,(&@F$R06W1;M,ZP-KW,2(/6850&20<6RY'+9OX% -MW\.[._O*39R]/(9.UYOKU&GO;.S/+.\Z<<@E.)A,$Z9(81"R'&$9#C+D&)OB -M/?LGB\BX]%=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[BS=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,5C8BZ]: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` -M3R6!*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=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##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@[OW)'7"OI.]<"#U=>)#C-($-' -MQH!A>N:2E)-%)W*Z"%=W:"1!(M6[<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,Y>2X\^9AF6%+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=VXAQJI@>)-`P(;UXYB&+Q>)QH]^"8G((U#9U#'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$#('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#F_.W<):X:SVNYQ']XYEOO]4[-K8M54U,J2@*$U+` -M[)W&*44ZS"@)3G$0)"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;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(2XTA(*6_N;9M'5ZF_A]+V7O7Y9>;(T1&A$9&-'$XSC1IEE#1$04%*0O8 -M42$.V2VE$3*)U&W34FOP%92S;$^*CZ7USR.O\/L[7?T-G0VGWQ<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*9S(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'R6S!/*R]48IY8@A(3R20'ELC@9L;FX- -MP@QBH."A#CA!P2@1<)"RASENG2ON,!Q^AC(3W8&4A)^C//5EF,7M?:O/[LA\'@X.PFE2)=^932\V8'9E,Z9/F$?'D@#@Q10[)3%=Q&0F -M(%!,)G0.$Q,!O%A1R2%.WV.WER_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/M38F1(&9F/(PT6K9 -M)B&^Z(AY&N,4)$*U:?L^8N9O]R[Q=?M<>UMP16(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<0XPH1N0C*3T2![:VHQ3VX38&;,]NT)D21('MQ1[>&4TDJY,FJ/->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+=S30?'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@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;?HYGMT: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`LS9L7K'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,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=,&=SQXV3'#Q#-MIG7$GW'@F@NLF<8WD&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^;?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_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_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!Z9H".;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^']\4WP-Q\M3*\%<:K60_' -MX&92+LOS&'>.-V;AT>LW.$9O,.=#??D*RGB_/JMQLG+2YH[&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!>*/;%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?H[?SS5'0VKOH-CZ$=;4H^*? -M"[MQL#Y9)--Y>*2_R6J21P'OI\#!W_AUJ;7-<5<'2A -M'99R]BXQ^PX;JA;M@*[+''S>!!B('((BA"E*-OZ4`/"X>AI(>M@8]3^9B(3[-?IA(ILD?>:: -MBTU0QTOE3ACA<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-EFIS>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_YC29"^>*,X:5N1)R?H.=D99V8:*BQ -M&1X$BSEJSC08#0^O&/7UFON42L(?^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[?#(MN]=GU#"V37 -M>@Y^KD/)A\V6ZC/;7N3@5FZY+/UQ]9M$D1>Z!/`HACQH),ZXT.GQE?`%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?N>N\A:UW$B/%HGX']HQZ^:8@!I'^8_"U:$A^NK?^FH3;_B$@',-)T7HUOJ -MR'OHLBT-NOL?QBZ* -M2\K*O]D?*2NH\EG+J_VO\,8N>SJMIQ7ZQ$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`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^\\:DN*R=\^0SF^K]!&)CR* -MJ9:0"%H8S"ES>QI*V.L'8K%<$@!(K^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@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-;MG74S_3FY\94&,;)R5S2Y%%1^[M;@6ERKAVJ3-=S8$MJDF!!N79% -MY;)^J\4OQ^_TU:TFFG/?6/UOU&-QE^-^0]K73^@ACQ&4S -M;U5T\D`Y(\(I4^??LG"[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,FM5N@#'J_W?2&D,.5/1&$W47ENY8^\#DU* -MW^7!6WE=H9KI;VRU>&TT,O0'"[>SQ*C[;T?H9+A9'L5@(]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;%QX[3#Q!1X.;X?\CI_.SUND2BB2MH&VOM;Q!4MA$D&>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-&)U -MN\.;4'`<"%XOX\C27J^^/-*^& -M1C9ZP>S(S57HHXR.W7Y%X4M;F2B/Z^ONZ.%)SOH_#]2UBT8$Q4P1AML^*(`P -M3?1#"T^C&/'OSK3_9Y1VRM>9XS>S_W]D-9C,^R]TPJ -MJ_U]_:'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)->WH'(,"!I[[O.X++S$$Z(CA4.!Z!=?;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`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;A?)],0$@,6Y]!P)_9*LU-SVO,_^ -M(./;XT4O]EGOL_.;@DN4W2G\KL$=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-OBAZ,-*@!: -MK/QWF-@ZG'XXZX@VJ:1$038,#*I<](GB*(R&3`@(RVDRD=6.4>"9AW$JA3P)W6R?X(2+O=A -M@3`N0PJIXEW+$IWLL*B(.)!2_\>+;<"M9/-K+";R6&"QO5_"<#[`N- -M6CO$)`/:[\A"]R@Y3U1Y\M,C,@:M\D55@1$"R1'C:?,^=M@I -M@-TS`N%,RGR-E:=UU>*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_M9WYXA&&YCP?$V3O@J?#B"]TM,Z'F'"#WVJ>\H3!4FP^$T,Z8W/H@XL -MR&*U42.(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+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@"AUJU>GBVE[0@"WDD -MI[K)\Z2-\G88%LUR@AS8M:@IC6'31(SW)*XGKHT%Y%$D!L5'UZR4LSI2ZK?T -M:(E1CQR`(ZUT1KX`4 -M%WG30=OSMB&:S<33<\`=*DQKV;+H0440NM<99Y4OA8.>:FZ$'0/3C9D7AJ<<^;8N' -MX%KS;XA'QQPVS/[<&%`":VX.0H^..E2!$4SM;]QHK`I:YMJ-=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!/':@X&G)^X?X%4<=W:=?!"TNG?&TR#(PH`9X>!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[>:/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;/].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=J55(>ZG8]N8-:2@\#KZ&>'K-] -MM[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+.*1CV?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[&<^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):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=X5!M.;O-MDIPZ>!#&T&'<5N(=(*_D?TB%@B&15G'?4FQW]2IH`!GN3>E -M=:J8DP3OOYW,MNW>+X^`K(/M*DLRJ#>[MHGQ$T:XA!!=4O2V$4!%><'SFR@0 -MXJP\.]1D07GJ5P$(`PN:;=/(74ROQ-P?W,)->)U`0'T[F$!'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+(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.4B1BO.^!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^#F*++HMMP>:Y;QRBQ[THB"7^M7/`#TW[E -MAM3?&42,-3EY$@`?2.E%7P$)U-#.:#-!R7F(1Z)(GM%.+DNE$`U0DHMLBP5.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`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_(!!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\G(0GPB( -M@S];2D30M_45-;R64'B'OA4[3D&O^:%O2]2MH@$N^2].0*$R,@'F*KO3UJE='8:(1)!?:-,0<'9$0 -MT'G?][N@NQZE;4<")2C206+O@4/JA#@*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#(]#O/'0HC"`BVO=G`0U6OBFW/Z.@JN;:2&B2`$+>"%- -MX)1A\239!5UT@JH@%TQ_2',7-?]HYW:[8?S\]-<<-B$O2.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?)@` -MH/1?W^?@?/=E"(F=';L*D<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=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=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*!>]:#WS^C\B'[TLBW0&38H``"*E\]\EL%DN5PAHV.P4H;]VD0Q- -M[>U.*60`YV^^;MT,/6C@37+I&L;4`LI.3J>)V*VR:";D4$0ZJ_%P1NCX(KRT[&SOUN"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:>LW8QLXW-+ -M.%5_ZGON1TEP@13&6N''D2*LX[/./W^FEU/B<_7I!`!LF9'&#>3/?0]]GV1O(0@BM&>Y\[S& -M*X$#7I! -M^&G/\%YU;:VU743Y9$0*\WD!\./25O0S8&#Q:I[U';?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&S>5XT+$.LZB!"D] -M;U@;WFBWE=;=S[JKXJ>1;6RDD@!2&S[^@K2*%5-![7BW3*X@5,``.[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 -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#)';&/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%A=[G]DI!4XK"`VIO^=K -M2C]S,_^)""$S(Z&;(!ZFF1DT"PL.$OQ>TB)A8."1!Z/W-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;>HNJ9Z[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,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:[[:#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>5_(BF7OUPTEML7\Q$Y;. -M:H3X97Z[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(7X8>2RG7Z2$#\)L."&X@VC0#: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^@%:CODTE_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-"0S#L[KM2B('J":GB(M!Y -MHYYA3_6,9A-UPT4:FRG)&Z2P0JUR.`'ZSD_MNAX]OWEQ`!PLU-?V=(#Q^OV? -M"JUD"8M_8[.5#Q:FV60[B% -MFW-ZSIB,%\F*`(B\N>U(R7LG>K&.: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^^1KPM -MV\?4=I*0UC;70WH:&8&I]:@=$/\SF4E>B0+LR9SQ$!VI;N>Y_":W!HAAW%6PH.IU> -M71JR2A`[.M=NN0*-=ME+1KTPL+!;(0LM4J1#J1^1Y5O*/"!_FF%$!?*G#.P) -M$.]^G:W'8J,-O%EFP@C!,_E[ -M&HUX(G>C7[OW[R,S?8=,'QQ<@HJ.R[^FU]B/BH@@R2M9)$`(7DM8>LWHB"6S_>4AP!=_?B):9I99F1TJ$AI^2`'.!5$"DW*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)=O^_19RW;8%6E55&3E:\"H4GNR3=("`V%YKL?J_+H -M%+O\X_IU%@]B4!#6E![8_&@A+;Y)B=Y3_+D`+9HNUI(3Y)?WY8H@4)9\3#D?1 -ME0HX7U@GG=GN>YD"%P_W6DC^W0[CPOFE:5H[3-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)+>;SS,K;%2@`2::%N=I +MVR86:*KOO>O99MMM-XP&76N]W/6T=[SW@<[G'3H:Z'K1F?=WON]WO>]S=WN^ +ML]W>^WN[[W;V\VW>[OMN^WW;;3+3/=TK*Y5E4LVE#-E5H:"S530#1IB5LS:V +MJHK6!JVA2M9LR*V:MFUJ55JBM:Q4*EL,5$`50)L6M11:P55:V%+55:U5C!I3 +M1L,BU5-5JV-%F55-5EL;:@5:K+%5:S--;5-;:M5MJVZZ[:V]>[:7NTN>][;> +M[O/MO-M[NYOM]WN^[K69ON\^][WO(Q/N8ZZ![N''=O3VP[V/>RCRX[0VJ7FW +M-FQJ%7-G0R;9MB*N\G'>PTM*5H%``-LF2NKF=-LQFU*50444`446P`&FV06V +MUE17-HDJB[#--!MBC$-1L#;!MF@JALFIM-IE3-30"JH#2D`$`!,F$R83(830 +M--,AD!H&AH`R#$9`:&AHR`Q-`,":8)D8C`3)@FF":8@P"9,$,"&)D#0)@$&D +MD$TPF@`)@```````-`"8`)@"8F$R8`F3$`)@`:&F@),R83":8$Q---,"8"8( +M,:1D#!,H--)2:$$VF##`"#329,1A-!,Q$:F)A-#$-3TT4>F4]">IZ0&U#3:@ +MVC4#`-(/4#3T@#30&@/1/1#0#1D``#$-!HR:-!)I2E$H&3TVPVH\BE/QIHC1 +M3,34T4]IE-I0WD4?IJ33T0`R:&T0`9!IM0&CRC(`!HT&AZ@`&@`````````` +M``TI$#1IHIFU,F`T:F*>"G@$F:3TP"-3T9&"&FT*/3"3R,33)I/":&C(T&(T +M4\T-`GIDR-,$T:GIJ>1B831II/(&D\C4S(::8F)HU-02:E)*!#5/%/>V,B-H +MB&"-#(TF(Q38BFVE3_48AM!-(]4_*GJ:>4>-4V*'IIE/RFIY-3RFU#$S4WJA +MH](](]&H::/1/4:>IZFF:0/2!DVIZAH-J9`>4!H:?.1!_\Q4%G*&;V=R9PT='B<1$&>Y2K7;'1?;`L!0$`X6":FH$!$6!]N]*1& +M`>)4`P7%5$G@V]E5TZFK&($]>M7]W^OSGV?[[OM^+/=V,U7MZH"`7P^J9Y.4XK0O)T]ML=,$]>C2&`+KJIP7B%-.A(A^%=L6PJT7:EU�$"\C_*-.JQ+2^W+*<`+ +M[7C&UXHH9B@ULW[I"-T:`@7%]:`B#,.N],:_+:SN\[:H0"]MG;I((-):D9I@ +MEY+M.9\`=/Z'Y5'G)UUBI`$7\=-,6\WB0M^K1(IGM("()_S^&EB%H$,(T:^: +MUJXAFG+?)LZ=2(B>DJ4`+\#0+:GW.!F9[Y0"67\4D'5N=?C<2IH"`B?%D\H0 +MGG&E/!&")G6)];))G]L??MF>!#;?]*:P<1'/-^\77VA0`%Z]R +ME-$,ZC*8W\V[=O*,`"`LNLU]SC!;I4"KG=/S#X!?7Y]N/BU*2;"=,Y6JXJ7( +M\0$Q,LORY367(RS2IZ5>L>\@(%\(7%0'&&F:-KRF&'2:+-/TMFDH`&<+FRQ] +M2/+>LL58^19Q"!7L,11[)RREOK.2B(B\T[XU`#;W%RR(G[K(5$X17%G>A! +M5%N-\(U<88J#4CQIX2R!95&T"Z:FJFOLXD$6)JV@!^C#B[K7^`23@`L&RH8#R4AD93YM`Q3];.J--PN6QM[K)JH +M(O;C-[U@O)%QFS:U:_'AEV+O+ML-FTP(.3(!E'S>H'.(0@#>MJ$"'FJI*?4K +MJ(^8_>2M:QGP"F_OWH5:].!EVM>UB'TW=R@(I#\VT2P%KT]_6]DV]DSX*:$B +M$\P$5TX-N@FLFP9/6Z#&OW(]F)2R!;.(FW!F6.80[RE%T=?O6H/*`%S(]JQ[ +MR7,>5IA_&NS_C[WLV",$5K/Y3CA9I<=R)5=2;=$"#3;X4$!A3SS<4MFG&3LO +M(C(AK8$A:MCVU5]2F6(!3!"(X/?9Y:@`ZT))M.B\B78]MY1`BX"?4#9]!56Z +M)(%K(4E%,HP1?M]'(C@/O^H")>Y@&LC0T?.?#9A!9W#]194/2$B@/0R$+"9F]7%, +M*1BYC&C`#LQ@*O)X;[/:@Q((+?>_Z#+K*>EX6<1R+?T&:\=DJ!\#0UPA_,^E +MKZ<2Y.D"5H,L:04L5`\;Q^3FH0!$N<-%2!`?/ZS>I:''+V&_V'MP$I)`W;W0 +M<("[Y"-384_['P.#[FK55I#5ZVMM[DH!4-F!?_"G;WQ+<>IO:.A1D`8W/]@0M8>%BW/(+<-&H2+N=9T(HE +M8\PHC>;Y(&31@"8(L>$>5^/YP&:Y@'%$18BM3_NBBG3?7>!ZKL^1-#L?/ +MI`&OUVRZ_+Y/!HD`*"]TF31QJ9YV"1#B\R/?U",@5[-@I;.4&_W%90)LS8U+ +M`,#YI0(2X6ML1-K;[$WRF]A\#Y!IMEPB$/?B%:LF@SS8@#$1(96`NH:/6&-` +M!:=-[T<("%]0_N*VT8X/5G4]+'5W>2@57]UECJP$[[:29VK4&^<0`O3I=VF? +MKR@)6"J[:JVG6:T`(X0_F^G'Y[@#IX#*^6`L@0>X[PUGR@1M8&GY?GK+(:KI +M_U,(@U>K55\YIW+R5A#A_I*4^UE*=FQJ$`;GLX^GP`%VFAMHQLA +MVW-FEG)_<:*\3(P705=2"A.U_T1]?;OU(#\LK5$7LA$\:N3_/7'@3_L2$4!K +MJ6$S1,[?R[77H`%;Q,<;P<]WB#C?6PY9\/V7UF*!4\2`M<&]Z=&$0`^[XVX` +MP>#"!:ZO,V=QZ_BB!8WP5-F0XF%^[*`J8WXH"<]L!5-)?B8P\`,YVUF%`M%7EW:-*$+>N64?@;# +M6+FLFTL@'_E2321+T;G=ZYGMTB0'"&+[8**(!6Z&96X#]H(:2NZ%,2"$GFN, +M1!^?3G/A^`L*^I@/+HZ6G:DLBAZ_E30+MJ_"3C6J2\[8"57T0*Q`"%5OI.Y. +M:BNS&C[E[K4@%]-&1?WDI(=$YDICRZ]&1/M.`*SX?V1W6>I79`5A)E)=C +MC=S#.CUY].X/Z]T\1.%B=8L[(9KD:Y=]^`D`AJ=I:%X(.1-A<7W`!S-]'$IU +M%-,2`BN_0O@K[OJ'6R\VPY5,3$:,BZ"HE]\AB;53X3@H[X^"Q3E2>4%#6-2: +M>^%"&#=/Z`@,;KO?/M\""U$)66_)4NJ?&F2ZTN,QPSL<'S\O.`#\I/;_'\T\ +M\-UI3`?SYZ:\L#\%AH`3:"O?XZN.EK961YEOS49"&]N%ZP3[JVOQ(P=(?G.6 +M@"M:W;)3<$\42B["?O/^=:1F#6]NZ$72@W50#Y79>"J>K0,*`@N)KT"+ +MZ#V_U(:?,N,'9\5&MI`$7^7$@&/KSB6TZC+HW]3$;[NL`N)UQ1FMLA(2OD\, +MU-4^]`5TS)K^W:"%9?8I@#2TGV8,J0KY?V?HZW)%R@*_M:XB%7\[7[?P:+XG +M]Q&X;\NX'>`&K2Z:_Q+0S=C1O(G$9#64P!8K][WE]U4>TJFLWGKV#V18-2@R +M8+PTOK0G!;/I"G/^B\0/-;"WIP@_PRA]#,0B6+V)K?EQ=JK2J^C(DC[`S_#X +MY"3TWE]1\OSVL0(N;%("2?M9ZI%FL[0`%"TQ] +MLWN_%Q7@Q^2]DUETH`>JNY1%N_++1LROZ>56$Q,7?.DD3?D:TBT$%+8?@O=, +MI("V5)HR`5A@RVJDL_?A(029R?[YENFJ2&8AT% +MAH6LF-70$`OWGS?-)?`A8JG!J?%BHFQ9=TR**BD@F:4QF(@.L`,57(WQ!&7* +MGC:=$3`_\4$,7F=+;N-@^ORPA65Q4U)$1_U9=>^G^O)/=\V,['3Z#NE@24'X +M=@U7X)-@E=Q@E'!@5_O2O$2"(_!93W=VB(#"F-EGAUAGK"PI/7HT9!#`D5[Y +M\+'#?L&`?+99C>0W1!!Z[=:J17*V6,CT(^FX5>=WB+G?#?J>A=T@<1CRU($& +M2/KW2SC-%H(8X0R]O``AJ6;Q6%^K*1B208.WI0!J4>@[T4Z6:D(9;.)+M_1- +MD"V&FA!;[J;:O3>;"4Q<%,4Y9Y.."\W*KZ:-!PZ3;$/=\"N4*'#KN#<9_N@B +MQ2=Z3G3EXJ/09W=Q:+STH`I>+,97UO,$WD!()PS]%F:D('H[F.JU@(>YN9OAUH:$_GW-1*(O^MOQS@06;P87 +M:-R?;K+]`04'98(@+A!K949?(_%S,4L9H$=7%`"GS.&9\=+H:;/X_;W^YMH< +M"`NS4-HBV;9?TX0@D-MV//U([Z4A$+WJ^K::^5S2ZJW[N0=5QIYEJ +M=&Z\W[TBD`7-[6J=-74GF61-$`:NXFO.%)=[[['PD6!H:;V/CZ?H.Q@V*Y3) +M(*(U*S_(`/X`@=4A8N1X;%PR]WU'P@+J3H?%;:O%,!M`$NVB]R")87^3W$@Z@#S-W_E3`9X%)L4B] +M6_71C'P<+:@@B2Q8.33:?)*X7!K<\Y@""[>-"CM-^)"A0$'ZQ +MUML"Y6[R\SL]`>$W58Z2ZL/G<&BN`"S?9P>JEF>9LK)Z?`TF2@=J?D?SU%]\ +MW2C2*QY;KIS^#>[A@(M]1Q3>IZ28P$!0&!DN>1#QKZ+6SW.]/5S;\E4CTD_V +MU!):LAW$J=&UU6.(N$C +MLD@@W6RR($]+)$-=IJ=G_\M`\%7E[I+&X(JO-968S9V4N@0@/FM[:` +M_DOHOVK;9]H"`YSN@MDXZ5!^\;IM^0"ZT[=\^+)':SZM<12_B%("*PA+=^-6 +M4X_PN14]E.7-."Q^B5'&6TA[JYMVGDV@!"6IH/Z6JH@=S^?QJF3 +M!%)(6*9O6O[NA.NF%0*E0`7VVG[["W;V*1;OZ\T +MW:K[M91`=CW>?L7]P`2I.^9+5TYAQM`E(0%F$ZV>R`(-RC7H&]XXFP:UY%BC +M`)R"D*N0[730$"U_3>;"DF%<'PC3?1;![F/0$!`7,+9HVZ(Q&0*AY&)ULVCY +M+1$(Q-SG5-O"<=//)P//$5`7SK)KA'4P'#J4"OU;LGD;/`VB,,ES0$FE7$DK=#UHE`B"R(_/."6="48`%=C +MEUSNIQ$$'36Q-I&5Q98XY)(("#_'Q/I0`.M?]'YG8[&O\#T,WD(20@3N/DL_0J^9;`\([->'9A>G7GCX\9E +M0@!M=I66J/(],51@(@0?HS\478WX*Y0T*XJ_O=U@*6WFC3'B"(E.&1'DANP8 +MA"9[NDG#6V]/W#46R."#QGG`O/#C)\[4?2`5H^5G3W+1P5.,(-QBP&W;-.%? +M>-((FRE+9_]=P/6!9$?X[H"/MB#IS`3J?[;1Z39%A=G\K;XFA6OI;)8DN$C" +M7BML%@PI!R4,UBVE3B=_ZKF<0@AH@GWQH836)<,FH8K\Z1<`_]C"$EEWC%^! +M/Y>[K2`I79%TH]PM=ML)@!SW*@GM%S$@J3N28M)R-`A+=E0XY^IL#V`"]FQ+ +M^_4^]%/H2!_ZO.Z:1OO/.8$>DXQ6NJ6@RJ$@&7W`;:(MKWWPFQW;(@(#-U?F +M5&F]RJ`A#+VFVB@-@,'YAF.IL?V!1W3A`*O%]39V9A:^=$086@"=9YY/=SI% +MP.43I]O%5,)TL*VCMQ>K<+1@HN)6`Y+R!4_X_[?Z1FD()>SVM"YCWW&/D(N1E:+:6?SS"^T^ +M>=9VH1@3/V1P?4WZR_1P%2B?BLO6(!4HEY]22&L[0O;91=\SO%,3IA"MH[!B +M%CFMX;((MF&F@-:$#^/NR4^?H#P+/T?`(?"H1O\3JUR+0$3,YUPX/"V!XHN$ +M4I81(I##TI)/`O^DT'P/ALO4[G$M3G3UU0\M=O((04/Q>A^QPA4[V'_/X-$'J#` +MO++H<>8QCBZ$W +M)UR&A$!99;W<4^-+"5>D]I#=H>!H8G2&P7(Q_(!?:3VM_H>=M^AN) +M]$08[0JX/,N;+V:J5'I6(6V.$(:0ZX_O4^QL.>\MF$P#[-^RDL0I]Q%IA\Z7&&FQAHOC`D/9^WQY/_D&5RP';_%[KSXRXR"- +MF8_*GR>O=!,]"!HE3EGA09H#U/^0V%;4=#9/YAX%'X,O\!"!B0Q? +M0.$N*`P//0.Z40@-,IF["EION'/2:'+N!#DP74'%[`W6W$.LT!L1>2LAH-3&4=%D#P&9C[JB +M];D8SD-)BOV;`_Z^+M/#??G`.L6]X+VMQ,0,SZ)HV(7+922%)EYPV/>7YUQJ +M!F5L#3[/:P0.`4%JR2QH)>8$]JHLV*0:[,(?IQ8<-C8[FQCJ78RA5_6X:=%? +ML;9!'+Z7+@8YD,W0.Z!V<.E@:$%BG_<]G3G5ZM]/H,].8:E4@PJ!J(D)H".9OD;4' +M"EQJXO^TH/ZS1L+=5L$%Z]`8O]7IOZY=8C-N1>,Q1=^BFR@T+P:'@C3,3:*. +M3`"L]U%/UP=A9X#@_-05U7IC2>XUP/.GC'>F"Y[4=*YQM^4F*N%V!PAFPKE1 +M6C!"G!@N@+W^R3SZV=E77GWPH-/N38#!++$4!=X:K+&1A2:W][17AS990I0; +M_Y#W\L@\:%VI#A:K9PY?,VY!>'`[-/7_S]GZET(W$\(#P:6IV9-1`H;VP=R? +M$`$G:%9(6N(ABM$"PMCR#P^[&TL]\"<,%S_QL +MQ(0B^P3W;T0R$$,%O,Q.5^I:K:OQNEMR8W^HR9"+KL.A[&]/%$`O)-.G_<7: +MIEO@!2J#72LI4S)[\@T]>'F\[H=F?&BM:7\O0^-ICQSRP&+Y9<=`EM^-,*'X +M?.R(5S.U$/)84-J#B5/5X#K<8L^0]0=L2#DD7]O],#(!9[U@83@F_Q:-[OF*D/&+-'5/=5`+VG)*RF0!&^C +M6JEQSUE0R*U.P`*S^=SAK8%RM=JW9#^Y\7`(?6_56S7G8;R>EHQ[,XHQCI_6 +M:2&_SJDYG\[4`..FZBLFED?N/A(KAL;1^9VFA:LF05>S^-5\:T/A\T.W2`9Z +MCR5SH84"^^CO0=:VV;P.D748UHW-!?N2_1E1I$^UWXVY#??7?O7MSNQE*Y-H +M`P:-/D3G!;1RA!ZK]T"0R3#7TR$X)IH7CXG#@3499,D8:^1/?H!S7?-HM(@Q +M5K9@4,%"4ZEMT/"_\0SAXXEGRN_`)&U1H,4XI9J%((D#1[,AX1TPPPPBAZA& +M!3:"V2`C$8#"*&6;GU'3+`_,_6_`]S@AW#.X23A3AL[JPI?;_?6!8+%_D?YJ +M"=RQ9,"'UT26,!(G^/'S\&#HPY'/H]/]YA#ZW![^Q`)_(&S?W>C!PZDI$S*_ +MUF+Y[5.P1GTK/PX0EJ?`18=(:`&YJA^N]`U#AQ"+T\#6/?[DT&&`FCR7_5SE +M3GT=O`34]-,T2!`[DP:*Y=PT_6.H1]9U[%)JHU=TQC$I`Y;L,@;.$8:7L$%I +MM"XSG]H0%WK:P_]@,2PP)2Z[_1E93+*BL864BUC^]U@OC2?, +M5HK_HTJ(^6Z-<^88P#OK\;*<(OS,[<;O2_HSYBTHY1P_+Q'R&J6YG@G!0OC: +M>\X;HTP3T>WODBO/KV&');,/W9PJI3G"N7[P80""\*]K-:J[PN8WX-`')Z0Q +M--X#0N7R,,".J0^Z!RMW)_]S`QNHH4L"$:\H;!ENOD+(_R]9VD9X/7%Q)JQ[ +MY9[BYU8,+$#4ST5"'!V*CZA;H/`[?D#]_FIH,]/BKM(!O7/T:`3.2LX]F,#- +M[&$7Y@#SAXL^MW08\-[)B=,(V35`ZHLV.H?2C%@DT.Q^0G;L;W8S,YX'S5FQ +M0]`-49S:KL`7G8CO5,>\PM[OA%:@E#8=HV(YA%,P&#W:#`)SIG$0JJYFRR/@ +M(+%6W79$,W]AO<]5W6UR([/ON4,7;95RLCA'%$_H<%;3OAEL?Y*9]>;#3](/ +M-R@-JH$4LK_`R'1W(2^VPAL`8/K@^'`+$>7=IVL\&G3>NVAYP3\X<%:[TM`< +M+"9Y@CBSG?P=]85NZ'DQNQPA!/)PX)?/^[,<+7DFE6(ATIMM]^U008;L8X"W +M[8QF_,%\FX'5WG$,N8?F+;B7G56R`2>UAA`.;N#K#>-B/V":GQTZEP/"@+2& +MM-+T9%?KWB3'YE+;FW'U5"7A(PKWH;VK.F%=ZR +MS(3]Q`&IWIBP]V+H4P=LP3L=6"K5"Q!G2@<(:94)[VKP&H^:!QE?V@6C?E), +MA4_]'=&O[1+0WBN:K)FZG#59EBBC)ZRR15_BZIL0V4+V[VH?0'#+A<$__@*: +M1$AF]*;V'!.;(TG+1/DO!74UZ1,RB[-,9@O7`ZQMR^81(%,/IHK.9)N=HY+J +M37V]PXP0V*+*^_O=>@,TN;S0AFDU#U+)-BRD?9MJ[U>W/BZE9/])=8,]$&EZ +M-Z39$`8='K/B)J?HK#-E2]+<55)7Y&H@J2T:"NY[7`PCXUIG0`QX[;&;C@%; +M;&NIZ^J,7XHX7#2P-7?AB>�K5LYFY=Y +M?>J;Q;S[(`!>@[EW>7(]]!87MS_!V'$>`/2*"7SXXURC&\UN(&G0';=SP@7+ +MVNAG47FKWFQVT\M&VP^@";ZN!DB&`R26G&XEN>YYQSY0TZ!(-B`EO>HF'`86 +M,#9Z;[R_`0AA)_K.`#-#T?P?T.UTGTR5.Y9\QA/20\KYWM?DZ1I*,56:J`?J +M`<%`JBA\SG0%)YC\Y]/C';2K_N94D+)VP-.#6J[.J0D"*&/'$1Z#4\9?C"_#R^!U=*?2B4 +M$O5>N6J@)VM%-A"%>T7Z<[%`W1,_8CPJVZ!]I2H'MGX\859[G^:;[;.ZT@K2 +MXD/QA?6&O;P39*5)-]]-!88S!6L>*9IUY)MRD(OKWQ;C(LFW*,/)LR0&.IS0 +M*BDINQ+[8/GQ$OIDDC.$:;IWCB5CYV4MA6Y_[PU[)W.K'OOG!J605KP./&_@ +M9>_3AG1%CUH("==L#X3WT%UMUM>O>8O<#OH@O#>DK+CV8J]I]Z++#\?\@"3# +M7&*,YQ)VG)<3AKJ..-128TQGSL\E]G]MT*S_L+849W@I1C>-;)FK,/*H7KR +M*W'9T`MJ,UV%J)E-X;(.TQAC=CV63Q[;`TQ;6EC-6^OAH?ZY8X^W%YHPXYOK +MJ(5*.U*W0]@^VE4!(N%D;#CC&>YZ^\K[=.QZ/N-%]TS/3O=.$KLF<=V7_@8D +MHVW1N<_W4^R#N&+6H:W2S0Q&@,=)Z,/G9'J=O#[2:X"KS4 *4E+FJA=+MIBA.]H>Q78=?8#9:.G@*9W:JJLW@HI>6Y-:[VB4+=@Q!O_T +M+^?.I*GUM.AGE44K_[PI*NZJ?YG3[DQE+;!QH$J:`F&I85,[_J>UR$]Y]_I" +MK)#L[22+9XSI4+CC[9*R]'64IG+*KR`;=.Z@-L4Q/O:%,3V%7LE%ZIN\$_.* +MP$987+OB2FN'*F\M11A6MHY1E(\4D2Q#D%*M1\WXSIE=;*?9F(IYT@BI`M;J +MNBC-P7<#+SYY$?:&(Q/G>KJQ\YFKXWW +M-2QBHGCI#\_Z"C;C2F;(0AX=:D/T[3!P +MI`RQ@#5U=#2]%(&<_6$$_"-&P-D9]??T^\>AAG.&@009*9,DAU:7U#7-GS.' +M*,*!ECV-23)VX_1Z/B2_,G,]"D@5?7P^_8<@@Z7 +MF'?9XZ6-B]O:`*R;E1.X09Z#%H="PVY^^%3V8'!+@[^L%Z'D3&DV-TR +MFN"DMW,-!*[?E')VOE]F>QWJ(A8L/M8+YZ<[KPVC8&7>"7QC#%NYJ.S,6C_T +M-@_IZ6L9^@>G\N*69H*7-C3#1>G7:]J'0,*RPG7S2<%$P;,:#3$K_',B;KIZ +MSXKNY@.[6\S:F"CV1;.5!DPVKB<(UB:]*WR9AL!_2_HG[SZJ.T_!NSEW/$>! +M@O%K:V5/"!V&RTS?S^7YG+-?W4;LU\A"F04VLZ1Q!@8,9?1&+%T/K-K+\.YO +M';3N&L19V=E=\CB<'`0]I'&==V-<_L<+@ENI+=&QR?OF9:_&OEDL.^U@UII< +MZX6RLGR&GS/8THS3VLF;@^@B3U%!/QDMP>GU6`HMCRX`C\,[(Q\ +M@0%&)S2>O$Z9H/7A0@*%^XUITX;\A1`KPKDO<6/Z,\PCEM(BC-884!CC8HM) +MF=3146A@FSQ@F=<)^_*J3W8>!#NO7?.T\&D#)_9W.5\[`*)Z]I)*G\9I(P:U +M@I"4D8JJJ'OT@?I&8^6(=28]6\HNX8$I&&YF3 +M#L#OXN;7LJ`2/!&SDLZ(O5Q_5&*.Y$*FK#:9XQQ?)!?Y!,&CT2=^,HFS1G]: +MPN.WO7,A!3)$*G4#^YNOJR8'Z"+T"J'(Y0-]'XUPJA@YM>>C!L,>NE'1S]*# +MAKO>,3+%V9K>L#BU.W;)-\BV]74>NU\SE422.BPFD&\VN#BM&<,6?0$S2&+T +MW]7@6U%Y$^]M.P'_MMDGHW'F3[+0<%!C<]8!*31_W\--]';+?ZN=6U6XG7'L +M6Q+(UV2OW3G<:O"7P0MI=BGUEJQ#UVL?+A995B40&\&@$M&#I:C&EH`\]^!S +M8,,5$QEJ?/8NL<0K]&F&;BSOK1.X]L_HOOUE)8;YF+\S'Q5S`U2DEM%B[A5] +MT*`UM3&Q[BV77-G;(8KL^<3:0\$!`B@@2S%RH>QY:"L@$HN8;\):5)UN6*SJ +M4G1AOW9J++H*\.;=PM)^E'%VAA;PX$G'_#5O4^T#BHY&\AK+_92,K777?5!8 +MR&YA<51GK$?5I<]H;30:ZPPL+%PKO7ODJ4NYZQKSK%@[&,J=(OS.=NKG%<8F +M7U^NFS]-&;2+S^R@=DQ&,-='/FH^4R[JXD.52=G*4X'"/^O^\_@'Z?[#$^4_ +M*:2GZEA\J*J"2%$MH,(?F2?^J*463X2'FH&F\OT(A\J6/@3M/E>?91+.U>UY +M':#DQ]1O^?//&`6!F<`/#M&2X#MI9<4G:9)1R'.,9EU.,WG:_?,WJZH-K%=H +MNUL]B1!8ST=)^)J:N9N=^JJ.U.IW-2U/(R +MWEA5-[O-YQ`\BDI=4)3VRASN)S_;M@;9A3;7=UT]NG +M+Z[I4\NG40>U>!4_+;-$;9]^4I]?J1W*)7HWJ]X431VG$X'>T\.]Z%'73#F'= +M\+IW)V:S-N-MI:`K)]=A;K@;D#N)0K-RH5Z,\0N+,1YL.'&=5Z=QKF!>G7MN +MP_CJH79C-W_7>1JF>`6J>XPY"ZAB8\"J>/2>B'HR>B",/D(3X1]TDUFR(18!]L`OVC2,8B0]J +MQ?1%$\"CW#)MOQL`,[H]YZ/5\9.58>E`/=0W&PLL[:D]/&NCG*/$9WEB.63# +MG4,ZXCF2EYQEE=1P[9J+D!24HTMQ5?P3J1`&;-R;YZDZ:;XSNB,Z_AE'5\=M +MO_?)W9V+YIZ=LD'S#5TE_`QX,[2.C2)7I)V"9F6674*J89HTKQF7:%1J`&=R +M=0E):BI7,U^#R&M02/K5]QE;?)\\/S<[?N+,R]Z9UV]BW")?Z5W_U2WEMRY3 +MY)3Z>H5`V7\5E):H#U[Z17"1ZW[@38>KC\RV75A(A21Q!TVQ4N[G(YU$H)./ +MG*:"=GUPVKV5+1+V??9_"17,E9L>^S.GD1*;&$:'A<@Y)+(654C@ZR +M_U"SG(2TF9^;EA2P#.V-_ZJC$V5PE/M-EIY_6I4V&$N8/([%`C.&W[BJ\[4[ +M=_;>H;I\_R4O^)`N-$L'WXRK)K84< +M&/WZ$ON<:V&ZDJ7B]D[2?[0ZJWB12F"=#'/#/%H!7-42(#,'E=8'R"+>VT\* +M11-):53)F$*Q4)454&*EJ'ER#G!4C.VS,/5NQY.L$I0$D99I3C7+4Y4T.*VC +MFKFF,_&S0CA<`7!CQP%0+(*J&_/=V58(![P01B23`3Y[`XA^ZH4" +M$\!.F!'@'(R\5?FAFHZUKS"",#APY>A&^M\T;\Q)U^\71U1^\U!J8NHD?YE= +M6:=%?L2P/%9U_\>'1&0?JNM+D+[0_8$P.;GEFDEYO)9?E1QIS?([>FCD(>U7DO*-5?3(_]?\^C$`OQ"4SWG7/^)3 +MJ,2\KBKG>H@#B_Y$9R>49,K^1_A/7B1"MTW&!BH6N5_RG$M8@6PK7*B)JU6$ +MD1.SSE\\&P")E#IAR59+U.;ZX3K[,Q]+29>45>#`E$Q<4O>N>=X-0_-4B%*< +MG9\PW@0YAV[%,M2Y]>I40C!EVJ;H8&OKZ\43D#YHVO.,15X,8Q@5>_FH#QWL +MM%Q23`#!8P"GXE#W.*%]#&(3$^_5U'N@8@>%B?$>8&!'?70')C&1&'5[EF=; +M"[@M3IU_K3F6Z-'_!2+SC0?L5K&.J?1C1T=,YD^&+&?%K4\W_: +MV]+LM_T3'&@UX?,975H)WBA!&>-C)1*R\-N_$1OU!YZ;`<:*$9A23T/^DXMI +MSHBHF.AXALIVVFQ$$39-S1Y5B19.KZ&6"91#_^CYB&E;V5S4BNK#;E%M-GEWK)S.;)!QT9`6>V;59[F9I17'5]56"L/N?S_QNGZ6_&E1`U3XS1 +M$?C6L5!0AB82X&LC4DF((*DGS__?V*?32_$?8^F/JWZ3ZA_2?&^^=I_H8)T- +M;)X;/R6:%FFF-UE?HY,.\K7^B'L-Q\YI.JL]>OP!?HL2U7))C-\XDE#^8R.L +M`3!O/`;5JPR?N):V_[&BH3AZ&GCDY[;#I\\U?5N?*#.1]@B=-NI+MBLG; +M2-=DA72[K4NO!O^RL.L8_Q+EP8*$4S&V*[^W9,W?RF.R.<[O[>%T +MMTNP3*[&EWEE1HK],U,8>WBVU*?RIY_^*=E^Q1J![C6L.KR3<:RCUIR,P& +M*./;G"OU6+H4"'9^MU9T+$0"'O#1T250J*7,Y>XM=H%,V=ZM+DP<+2+MQUD= +M+Z[(.8F7?ZD_U?:M(_QZ#&@V#FUN27XM:J[0S$M(3X3KI^!S5^)8BIR>SRO5 +M03_W/V=I;_!7EL>L\O4X].]R:VK]>.3Y71'E`'G]$#6Z*E#'7Q>QC!B?+I\0 +M]8%#X@5GQ`8,A[)%5!1@'Q(.+*_$M)*(Q9/\#)[7XV'M,GS8L]_@^74..E)8 +MC%+!&(.NPI3G`VH#-A4U`$4QQODU]-]=_%]]]I)=65.1W[#)Q:%$E4/_?+W1 +MJ/2(591#`U1B6PS2WZ\ +M3KQBC`Z\3KLIB@E,A'_ZUX+0E51&!$KUO??&70LJZM*#WG%AB"PJ;%DA^/B^AK5WJ9G>/>Y92TS@^_\+P.Q.W4H#K]=@J=M!8PBC`>/[OKZ7@PU.=@6G9P#9A@H?N=R'4;OUI]*--R$ +M^QCC0K]".78^3M:(>I]K(ZFG8D<1!LK>NMR7YA#Q1>'YC4B>$,*DV[&F +M3="[\K=SM.Z=-:26I@ME67XJ@IU<^E/T[W578(WS\KL-[G1=MU%3D5`0JV_K +MJW?)ECVU'P5W?:^>QR>9\/^]WL?'YOL8C>HYSWR)-76D\?U]ZR+VV51NW5 +M2W3?A(\VM^OR'D_?6SZZ>V:\K*R^D5TYMEHZ'$O>:"/;O7O"-!3X5\75%\3; +M\R^55##>!1!JW@PL*"\JHHD.7(V5(3!9*6EB?AR%`YB%3DX:I[KJ\3V7%F9 +M[4R'2_.XU#Z6<:$(J#NQY[J]7D4ME0K>!->H;NN+QET"'-CT,>41/*%M +M\EJP/1A@LL8HPA0\M*=M)/*HL8R%%\L4/'N'Y_W?Q?DX^M^@\?V/^>S]2M/^ +M5('7UH43YAK'&C\IK_5,GY9ZL*7\Z\ZA34=NO3JLS*B8F)B6IID1U%)(9U%1 +M,V&5X_J%2;LD^['7T<)P@=84LWJ["X%58BFQ@#X&"%0H.`K*2?+ZH5'4V0]* +M+'595;2J"D@4K2J*B<"$_G,*(H:G,/;#XO.5CQY_"7R\J!$ +M#!UAE@0?>SV8KTH]NKB/'#JP0GK\_^VF$TCF+QT;%><8EWI=+8ATM/0_ZT)U +MKXH[:AMN3]/;]7-FY_'H:.C-H;)7!@3/;)2\0+J!+H'HTL)Y8#/*T60/F`8P +M#M34'C\IY4\MFK4&]644U:'0FFM=:89IE#4-P':R4OE_)767%M#W?^2;TE[G +MK$Y?=NG]Z6;.)_X9SIX2?DJDYW1:XDV<]HZ&A/GT&O9^\XU-[<#T[K]?QQU^ +MNCOE1*IP_0X=D@GKC:4/3/`13TP5%MD/3#T[8B*0*1&&,"$"#$8B?P($B@!` +M92`%?.>U]//U#\&CJ5M;\1W_9BP1^9M%W.(OBCW+!722E4!#8G:E%9)2;4*B +MFHI2F=4E9%4*C4YXE1-JYQ7554]B$2F^Y0S*0H9B9H^,\9XIXY'QM)12*2>- +M%C)/'(L$45(&S!LJF!RE#Q?S]^6;^^=GLO9GG6><\H\?@\X]?\OZW_O@MN7R +M^R;_/`C7LCDC_<,/-.5DQR5(K)TZ*8Q^4K^SF6EH@6M,)AW7'>7,4M+O)@\I +MY3R]VWRH."(J>BA&"(^6R1D&*G+9!D5FPTL)RYO"[X;^_X1RPY1O?M#P/F?G +M>_[S_3[>B=?H_3C#]G.[ZUVE^[S'S/*-;5T2HK+"!26$B965UA6D5@UTZ.-. +MX'W(`YR;P7?.P[*8MD:RUHJPG?`4BD#O@,$-Y@";SQX\#$1X$&\2`_XP<*AQ +M'A9'0:T.-[R^ZE4?RW9PULTP3\I0>_IUAT:=DF6U=5W2PL!7D5@R.BD5135U +M9RBUR>U*TN1;J8&=',\8YU=01XF,Y$Y"G(!$G(%7!5$G()QV4"(@'((B(SD, +M`10Y%%:4"SD,ZJ1UO<]]7XE)Q05/`'S/@[!.Q(7P'9BP,0$ +MB*C`-01B/F/'@<8$`XD#YYP.(.).`!.)$'%0Y=>2DOWN?5R=GL=?X/P^;?[& +M?Z%@J*R1CV@TIEI*IIT"1(B3)FX-Q7T>*2/W\W[Q]QK>3N\?DKE9?_6:<[C=MG<7.\FV]O7,_5ZU"74`U)%E%=E<<> +MNP%*Z,`8:D.R`B(R3L`8*(L)V1[]I;";SS@0/GS`CX?KGZSJX3CF&VC$'IZ<=-$W)#ID' +M%*,DP$1('3`0W65(%*S+I@GO:AA]/JGSQ?4GF4[V]K;#@TZ.2E09\O+A2UZ% +M2:$62Q=N''J0GSZFJ)7I41(TY]\?"2`,X,SDT,Z='-99@55@=$!0#4`Q(I)T +M0$42((2D8@4*D"".,$I<7Q'>'5'+'L?.NY#X7SO-6A_KZ'Q5Q?A\8 +MYEWNNZX.Z'CBE(HDIJHDTS5D$[18&9D@`21'2$ZGMZBA.N3J=6*BI)VB#&2= +M8J6AVE"3`:P44SS%-7XS,'Q/35_O][^OW9FYOF9F5-9W/F=B3Z81B$/I3B5" +M!JF<6]IE!+R")8R3,$1BA+R*<:RP+%*9`SR*9V0<[%0YA6@T<#P56NZQU-?[ +M.GL?(7V$S[S/RO:Y?TPRYO[?I)NL-IHB8LL@8D5[5`8;S +MJ/$?(_^_@OM'X1_I^S[J9_B)GP9ARB+WN.+T#%])3%/H11$$8!1>5]'G7P%0 +M$@/R,$PPB2,04`\R?Y63Q8I#FYJ%)0)A!!3%$!C)&QL$;(Q[7K?6_%_J4?*] +M\&?!THIK2S,UP-W)KH9%TV`F;;0V$&,`I%-*4`I%#X?^RF$`VQ19#:&&YVB( +MR;1=GN'':NUV:;2,?T'-BXKZ?^>0;0K[,S*YN[[`3=T6>_S1W-+>-.,4XU@( +M2DA+"!8PI"6`,5D-$-#0D*DSZ*JEA?H4T'@?'ZY[3D\?]*SXA6'$G,-WV/?7 +M)R26Y*+C((8(H&2,23.`L,TE$%@%D.]I@PQD"BDHA<"E7`C@.JZCJCE[!'3N +M7!<'3V;U304:PX6'/'UWNMVW.+HZ?,H;CP[N@=U.W=R*FY0Z";MV,&+8&)'= +MC`%(@Q0#S)#@Q0FZ&Z=&X$W;J4W8W,8(QW,(-/#'2C'F7_F?OG^;Z,F239\K +M+JVI))!4J@T@0#5J`K#J#!TITI2=4!0PRKAG:=6H@(`BLD-X;XHL-_>.KK\/ +MU)^-]3B]CZ#RXO)C7R)EQY''DJ8'&6&*<>5!RM[=I#``P1BH$U23)"JR%F+3 +M)`3C9K$P?`?>?YS_PK'O?52^U"JSGRZ4L4`?AAA8(5?"@0A49"D!$!!0YI, +M/M\6`8`YJ59#5`2TAB#4LAS/T=4+4JBI3B0Z3=TR].!%%#I)4.C$LW$:ZL0#I`6*2:4@@PFL/#)6?0QT9] +M[6=WZW('^3W^3FV]+IDCC(51!5@?@-6`0`0/92I?>)2I*A%(8`%`8J!F(7H5-)HA8"F:J-*B +M@,&"^7R^\O+\RGXI;SN=YG&Y^J8C%BLX\!KJ:[18%`8Q83B(1=:2H2@+B2HL +M0"HI#$8@Q&$TN)O'=_=\;V78/B\.FF?H["OHMNW +M;MMJS8;`V$B1)-A(QMI)L@B(,)LE2&@LV"S9-'9,>34)7>-S-V=I_:[S?M>C +M\OM?%P]C#4X5MX=E=8U:H*&J"13!.L:JH*H=0JR=00WR`Q"=4#:J&,4628)U +M")TQ(S?U8O4>HUITG3N[/G.#LX.$0M)PCPV,X8*3AD'SF@<)$49#A(JPX8<" +M`]NV]U<7#P4Z9@N,8JG%Q);.'B3A:K#B)@(L!$(< +M4`4!&!Q(09!96Q(<0<3*K`H-M8<)QYA#FQ\/1<04H"QG?D.N>'T^][W +M^)V/,/E'$,/>;NQ3KHFN.LVFXW4-VXW&X,,^:W0E0W2+)4A@DPR&Z;DHDH"P +MW!NYIR'SG>]#BX3SNY[@IYQYPGVN;G"*O@W-6U5'3#P>+HVXE"S;5:);2;`VPVMU6&" +M0VR.VPVLL@L\MJ(3`;:63;W:S4=W4?,X*88SQHWV4%')[)PCA=73-HPHX=/" +MZ?J,(!44DTY#U6G4+)@LLD&"L0-,FDP1TVI4X6F;6$1PF?1\'_]X?P>Y\?J= +M/Q'=R[^^90R$RY4B9%,L+$#*112,3"$^;@*:`&@"Z`NAGIHII,>?NC\/C^#E +MET''T=SBG&'$!QR+#4T8%@HLG&V#`*"@H&%JIAF'"JDTS"\+3>5IZQV*.EP> +M4<0MD%4)?(4P"AA+Y!S5"\:35LAJLP +M!>WE&D7]HB9CH'-YN74W=BTR,@^)")UN@Z:*0TU9WK-F>S #%LU0!$V#") +M(B$-@9LLQ0-D48DV;'ME(Z"7`Z*LC^K`.7JPUN@L>W6Y8VXWX4$+KY?4OHPA +M'D`*(&8A@0*6(+`,Q+&6)8D#,"Y@S/JKZL#X84?#I>#SSVN_:EF2BB*(-$4J +M;;%4-D$$&&:9R@LSF;4K(R+(*C"9P-25@9)+DH5)35%(7)DEMK=;;R"V[9V\ +MV*RL2'(@R&1:0Y`#6E0EA%J`:IER8Q+@7HRZ.CQ +M`X#@AP+.`X`[A%(I#@(+.!A1"4.!(482G`R<%CLN,&-O5Q;S$&_;O +MG,WN9;CXMYQC.)D9YMUN:FWY/OL.FF_APFSR!YJ.V6VQ86VU518I:$Q45`*`+:H +M"H18@BD,9,:6RC;93C*;"ZG:W]OB[&R=YT?7[?V#SNQL9LQ>,OU:S5F#,&:J +M*#5@9DF:2*!F@"A,TFJA%S4F;5U5.?O;18]'I]WN=W=B;;;=BZ7-Q=<"PN@" +M(8$)=)%N0&`7(,I!;BZZ1@**C=E&W-MP8*[PK5N[K8._V7ZIBA;?@54@$*HJ +M0@F$"@IG@+)>@(19*HI9#/(L!B`0H(%4E`H2$&%0215$1A+CNS4W\F+'P>]> +MU'7W@\'L]FPQ2DP(FPBPV$FP`1)L:K(%(I%`U(*IJ:E4U-0U#*<7:-KF'P_` +M\0Z1T.AO8]2LAW]FP[_F+ML=NQVM*K#;)L9J2;2&Q-KB(':A%6$1$M(8@I#: +MJAVE)M=NW%QC3R.P[WI^+DY.3(UIDVH:SCXZ:\8M7C+27CQ36@DPUEA-:'"S +MM)J%9-4%FM"MM(4(:33`Q&'$X>,.C?+76YG&/E_@>VXN7+K,R!DUDMRN5L0H +M&AR,#1-22D%%"2(DF@02M(:@&,F8::6K*&?1H:7O!R^\3.^KN]\?!-_NGO\H +MLPEK:VA:%J*`DM8%*(2C&DM5F(D"D,=JUPJ!0&TO(V5Y*[TB"YZ`M"`/R/R60(!`820J/D)M>:.W%MW&V6%P7<*ZHEU2@*A%)<$BPN`6Y%` +M$$$@H)JFB0TBI4!*417<;-2JQ7'7*CF*WM[7!+++@KX-_2/5Z3U^`WS=OF^% +M`63>3I0F]PA+#>P4*)"R,2&H%WUM$-Z8E4W[YTG@ZK>;/S/Z6_=V#?Y60RW< +M?4W>1<270B@72`H7$+A"((@U06F,PG%.KL^J['<]R:'U&@-!ZE70%06/J+*J +MB0[D$8L1`P0AW"=Q(49"QY[`9P8L*//7@YN+G\FO[MX-#/3CXQUVX[E[I\_!JIA%("`LEZJ%^>+G=JL^7I9MKD^)ENZ&[LC= +M26VX\0ACH$06&,BP%DR(&2*1DR061F6+*Q3&1@'7BTV2TV=FPV+ +M1\%U#J*Z*[^OE$*,@Z>'L?5[/7C'!>IZE010QTMDD,!(I*JBD-S64W+#HW8P +M%DE0P!AFYA$)N8544H`UV"&LZ[14=PX865?P^9?SN#>Z8I;QK;MS)F +M"N"F95+99,[9+(*3,DF<)4R64%0469%#(7!=MUN97*5@W#K=#+73U>KR_+_$ +M];S^?LZ-&?GV:VC6UBHZU)K2:R1@YZ*36`UF00%U(2C`H0Z$*DL1%)T3H;;$ +M7G._HUJ2M'!P>%YENT;NW5IERY,EQD,BY$%R3(B0,CD:P&`YV!,$6$L%,Q?8[IM[7/]CO\GDFK?Q.A9FSCG0M3/FS1'U?V_9Z7:^LZ'@9!6QI;K6Y: +MLE0520)!()$D((`I$P];!0U,DH2'7"*2M9`[0**#U2=<[3U^EZ7D\G3O3YCR +MY9>+(USAXSC*IQ/&%(LX(*063CA[9EM4EMD&0X[:K`2+%XV$#3G:-?2[@Z80\"#%-D%AM2,!=+8%(*;6 +MH4!$V@B<7535,SR6^KS8W=!7=^R\C#Q3C5=CT[2K32LJTM):T(=K)%EB"22T +M!8"P+8*H6B*A;9;I60*QVS';Q>-TJW#P#Q/6&R4%! +M2<QAY=KK]CT^;Z/W1[_X?) +MHZ6Z.AG.72FD,$-"(PT0C"+-&+4EA&(&@+!3"32:(AI;=#0T>3E?==\ZGR[? +MA7?V3+J#$R:F295LHI"Z"@HC)E`4,TE8&@3#%K`J.FB)H6!- +M-5MTS;VW9LFT4NOHUXFT>5O]W?CN6W&;5MR71EJ5+B199!9+DIA*@+%+F`PB +MA<%PXJ"KK<&.[:K(59RKNZ/$Y'(,G/XG%Z=KMJ,V&CH:&,8#!HS29H3225(# +M,THU*P*`NCIC!3,\MKEVIJ%:F7+E$\.[J'J +M-YH;-DTQ39IJ4V!*`[*3)DE"2M8%D-C(NR@,N>-A7>5VHGC\/N6[3U?A9[M' +MT)X.0U\>NNO!R)9S2W3?GLFP-C$--$@;&1D58-L$"960U`E299J+%#B'$-O*V'&G'KI@ACMXQ),$!9,3C<3`4!(LF*63%7%H.+: +M0ZSAV<1OZN.KKJZS6S70X]=5)8:TK)0BG$U`FL#"5#6)#N!;22 +MNH;&\3QE$UFTR[J<_=X]-?M[9PG$\1Q3A9Q2SAXJ*1%DK(,A\Q98"PE`4.)# +MB8,%.YCAQQ%'BEO:.'3R5O,>3C^0>5Y.^\Z.A\43O-I8KJ3O3[. +MG?'MX/>_#\X\T/-`\T?-IAPPP",\U&`I)YI'53V[A@%`$S@G&`SCG`L*A?50HA"^!20+V\*9FO? +M@??6-&`,AAUT(AWN=DYCCH=E>$K@!!)<#S%#H#H*&E:1`V6HA4(@(A)LA.5) +M-@1U)BA0ZF4C@=!+0;/)F3E%R.)R(B3)C".5@(19#4 +M0RAK:Y5JAE8:A4(50)P$$^"<34H[M/I=Y"R+I/6]YR +M?-\4Z^2\.OCA;:3B8DX^*DL!2!\N"BDX`Z>4C)RD!A0%=*WIB8=,8A@O]OP& +M.,SUU1#1BGK08)FGHKM"V"DM)C9*82T)%@=J1<"L@@E*`H@3Q"U0AA6$V,&K +M2Q]O+8@3E0+)M8(XHLH2OF$B$1E)D*ASAS@*$YN>R,F.>P#4!4!0$.=B<]0\ +M'90IJQNQ3<[NSG?+NW>EIGU\NLKDG)D:U!89`:T)A)D3#!9(D4U6S#)E%->4 +MRM*9996]KC,CJZS+T#;Z'=RUNOAUZ^[52S*M!CKRP(2=LD,,(D63)BU@6"<% +M`82*!H">9P>&D=FW);ZG5\;)S;//%VS=$`Y4,4-81"*(@1*1SU"JG.\Z!8%$ +M@L%(,#GPXP!4("B$@")2!#$"I`6M&D:U!%2@Y]*ET-W#>VZ5J%\/O^#;7:[3 +M:&U@R*38R(0VB#)4VS:@[5`4!5=5Y2'@+3MI2MK738AYF[=KMB=(1GT$GT"$ +MG@G#C$*0R*$ULF`J`I$FL>/A,)IJJ3Y\,!,*4*%&MJ;_=7(&[AN +M2@2W'@^7PKKX)0H'B'X%(4R%`3-)#,&IJ$U"RM3-FU;"K.'@U.=T^\ZW1QF' +M3PF$4TTPE1285=-L9"P`PC2!*`1TQBP8*+#2CIE"85KA5I\+6-WA<%>-XVT: +MF'A8<,:#"89A2+!`PB19!A%@I,)#2*3@9R@,14G#3$Y70P2J1++;W[&*ICK4 +M6@:`*2**+0A:TRXL8PI+D4&%S(H#`+:J0N&DP,L9!)%DP%K:RZ68++"Q2[2T +M2W15Q='4RMJKT.#HCMUX;>$85A$,0-R,"4B.E218J2$4@01&2`W*$4W)$G1N +MH3%I!"88,4-U3=T(IK)0J7P_,<=!KNUEKUQ`+NON6!8YO=]J$6=F[ +M=><>5XTIA=HP8&UBD$21@;4A&!M9*@*@<((NE2CR/@O91+ZZH>U0^[=L[[UY +MJPTW8U[-<6'WMH(FT(;0-J0ML!(H;=MA8"BS;JHF4WS)EU*W^AUNIQ.O<8C" +M;V+>JRK`V"L=6QP5@3`$Y&,!UF+@AR0-0@5)0,D.1(4B@HD,,E"B)&DUFV]9 +MDNL+@Q&H([I:#=%)[2-L50V6P!E0F=L4!0LF8RVDY&2@%%Y3EN9N!IQI%+E& +MBG.UZ^OT.&H[P:NKRN4+0BE,,4:K"(B1$!$JDA9)SI&0YTA&$?<\^"525I:D +MYL&+B)$]!++#6V;0CR/.--$4:%$UE::1HD(TQ0%"--*C"&%)I,)4(8$(R!OO>CV>\.IZO)I-$'/2C8&C"I2& +M@)HR4`MLBDJ10B0-#,-#/E'+R?2?1:^K7EEN-W3>DY,N2.+AR)#(AQY9 +M^7WO3Z)X=Y;=YOW[T(].^H4FY@DG2[V`LC(;TA$F$I:"*;T97?.># +MTUZ-V[U+=&&JVXW;&!W4P/K,>#QUGV!0I?1]'T?(*%]'R"`'Q4B$T=HCMI*( +M#(*3NF%D=4\,/=">3R9Z?;^SW>S/EUAQAPG`\4XJ)PZN+$L"H09)CZ2J&Q@" +MD*)IL,,PH)IX>'P\8O#MUWQ^CWW%Q'$.0Y^@^+MUAPG$<4XD0XI#B& +M2,#B8%0BH!ID(`43301H-,%#.5=/2&CIQY:RSL->Q8M0B%(6J$M+;J*A<8L% +MDL`7`W,9+FE0E0ERU4QL@6`=LG;(%!
&1$,4R/;TW5?@V<'3M.?S]?=,= +MMI5J+Q)IRU0N8EP%R10&`H%Q)C808%R%S"F)"XN$9=K&//F-7KXC@4X7@G<< +M/`BIC@08IP`<`E9"R`=Q!)W!!)>"BP[EG`IP2[-W:O%W4TZOA^'U_5^B]3PO +M6>'V=_H7];EZVML:VP*:]:VNA>)KDUXTT$UHA%!A->(%C"@FE-"1'2HUR]T& +MN;LX=.SO.]X1N]CFY;CC&+);+;JA4N1EP&)4@R2YE,-)AA(DG*%L`*2L*P#E +M(\M(RV\@AQ,G1YHWN`&).GJ@ +M(2QBP!(I[9`C)-;$8+(,.);36@,GJJ,)#"1'2I-,!:HK1I4J0^>MX/'Q9:S7KUUG&+-=:)#6C$@R>X8L4(A*R37`UH +MZDUFOCFLXSPY%6VW9L#48>IFF7H +M(`I57A?FOIH63-$!(7LO8&9D+))8(H2,EZC(DS5I6&!#!8MYN!Q'<.6?8<%W +M(WN-M:N4KQZTR3)$UZJ9281)DP*)*2(A-5Y?/Z''W-75GH&9PK/4$S@9XR,#.,!(=N8K=JW$8C$XL6*;N.K,:%D,:U8-A0MD!RK1H" +M0R6,D8&3"*1(9(I!@8V%)4QHP3'0.[L)L;`<38YG,Z7K-[>^S^IS?"OX7`>7 +ML\'N_2,%WZK9OW0WUWW>;]Y.G>"I;8;[90-[(,DWH=QA$@+(L*3>MHM#I:XJ +M3`*B5`;MZE9JFH-_'(`>*K$)M&*$0@:2;;8%DVS +M:;5/+AAM#"-47;6NXWW^,\V_9U7WWA8%FQ8$2Q!D0B2)%B$02)2H*A8//8DG +M/&%9*0.<1>=,)#!,+%DSH"YR^N7?L>'U>MCV/5N\W6W8[2ZQ+;"J,%B%I<)< +ML;@+FJJQMLI8R%S$06"@,)B#*A9(ZZJ)1"ARL8=Y[]--.]WYXPET5[\N#G]G +M:V(ADA@@2!'GH'P\Q]A1@1]'E141'R2@P(4`8$8@1D,S*J9E-3-6:HCSK]+9 +MV>#G=WN=+JV[=VW95MUPN,+;:*)*D+;92K","4#""%HD2*6I$TY;L[)A[O:P +M]/OSUIAPCAT8G$8ISZ^U@Q,C5(9%M"9*PC(&0K("0F0!0*$%8F4!1,(:1HBC +M"WNW.=_KW?A['AS,&&S#!L/P)`D#X#^I9?@)@D+T!9&0TE1$(P+QI%)4?(,! +M"E++Y#[N)*NQBPX<*]K4:]2.QW_,]+UQ?&LB"'-,)`1WH&<#/,ZYZE0J(S., +M8"@L,\!K!@2]`L9*A+V(D4$)>BD&&2\-4=E*+[+S.5VD";F&41[TQ8^ +M?B'[PS*73W1PQZT<,$*&`/@/E($`5"JA!>BRRJ%`9"]$0@D+U$IL9"R-ZH^Z +M00_OZ[YX>''C&+O?W+)/;M-!+#5E2'`X`X2CA!28FA,Y-$6`@#I94`I(9KHV +M1=3J6()@L*H4,U+`+H:O:EF\Z[O^-S9_O!WG=6!V;(LQ\J&/BB-(S@J#'<'1 +MT$O17%J(0J=`D%((06($@0",A"$"F,1V2BZHIS!@8H8":AIXQ-CAQX+.KZ3I +M]QU3.='1HOSN?D:,XYH7@S.R@#.P82]%`OLHI(%A`SK%C(1)+`O`SU11GSWG +M(T&^+]NYN5>Q]&/[5.3JZL#T&3"Q^)3"(8AE$BT8U0QI&A)1G0`/0=%QA)$A +M@8&I`H'0:K"PZ$*PO0C.@>@]R?\C+?EOGI^QRW,SY6YN>I,IE4RRJ51=83(8 +M*023*VLB@,#(XV@H0HBL51/!*3Y*%2D.EX>6.'@=HNKOBAL41'1I4G'`CB(X +M$8:#!@9HB08&>E6$0*K`9&DH="E)WCO!YA!.]@N?(YP/J.D?!ZW&F9=:LXV' +M&W$+B.%P#1@@*&B,#1(P-+;I0"DK`$FB$D.(V&P7)-B^+PW>5M2][XBU9'', +MUM*(:((:#01JBH2B7,D9`L$1!06022T48"2Y@+0)%%#14M)N%NYMB87'=9ZN +M_[?WPS^7Z?AO=/+NY=Y<."G4J4JEM3L\'4=3$'J+$G4C;0.HAU'N+)9`JC%D +M6"0ZA!.IB'56JAU([ZG2=._6['W!^'[\;>CO%QO76RRKANA;<#:TA9=)@C`2 +M2X4&"!+A1D%D0ESC9*N1+`:IH"RI*M4;)U!U/3=2YX&[T=99_9F>&O/Q#E=G +M%,]-L,S!?(UQKZ^OJ20WQ3U)M<4V0V4P5*-F!LJH39C(R!LCZ^@H"RJD9-D8 +M,=H-C:VJH\*7.N?F>B%33,!RY9%$DY(R`R&0B +MA$DM&4A"C&8S&KCG/.6/4]GD[O*?+^]Y9H\SW9@^KVGH].PXF'ZB_@_/UN"W +M5R"13(E6XA-220)(B"1"$!*`$H"(=<0,(4`ZV(BP$A.N3K\5QVZ&(:A9)*TQ +M;B!O;2& +M^,G&ED-Z()!(=+`0!4*E0:52H*@VAWFUL[:J-K9Z(R;>YW"R_BZGD>L\ZM\T +MF:S^(?2;?>]EESR?J.QHYG4&)/$'AZUFV"+9-H@I:-FT&%"B*2"AA-U&)!0$ +MDW>.E$C`I%@,..[J0L8!9)U;(Q!,>/&RWT*P<_F')^>#/&V]OF%'"0YM.EUS +M-=`61V5C:6)[=@@&R(HI-3(6`9B5(5`%#4&4A0:AJ`<\QMV3(7\'?]??W_?: +M?'U+.MES%WQQ<76R9J1"+C"!Q%>#Q0@`NA7D"*'B%"(0!*(_9-#`,#(5),R. +M:B5"D49F-LW)?8Q1!,@R:@QV`O*^B_]_G/?+TU+;=E'`XX'"`J@.%M"0@629 +MXM(@P!SJQ96`4GT[,W"30,&A<#2,NNDN!VP>$>*871ZFQ-FM^5HCE.I5>6\' +MV&]`^CP!'=E3NL9#;W8V%1@%ML[I3`X=3"P-#E$$(^&/$/DADR8\+L!H^$R2 +MM=A'=I%O1_1?U^3[8*SS!,[:;FOU3<#-29H:I)F8D6$*3,J]HU`0F98R1D-$ +M8Q(NQD0[LV]V=V)2FW;W9>SQESJ+%9$74Y7ZI]13IJO=[WL?9YAS-KGU,7+Y +MN.]>S*Z7M0D2"N2!6,H+V+(8[Z6"0[%U4A8!JB/<;(,#L)(F%$"H*Y))"$5Z +MQ%>NQE<>TEEEDJYW_,Q?FL.9X(HT+:YTJ[DN2ZW(`JQDF12+&#"*9%5,B62C +M(@9X9D@S.6T6?`G(^(/$XWC7,RIDS,S.5V?"J;8I;A$<Z$.\%PPF\8+`0B\3)&!OB#.E!FIK,`UQSY&A\;CHS,.#>W +M_#?;FR;>8>/T/L,I*2&C1(=R>OZ^0O&XZ/;FX-W>'I-HVDVMI-FD3:-IC`-H +M8,8LB!':H7OL"R%&"3OVV=X.\>^;_;Q[#V>`>]X/7^H[Q^K_'>M]B=\50Q[< +MY=#9_/\M2D<*:?$]/N--0`.L^[4!Q.A.)G%R/`XQB#B8@`Y2.$LAX4AJ"ZKX +M7!"HP1@'A13PTJQ8,DE8PQ3[;[JS4P0E8LG`R6$]T&,408SFY&-0.CI31)C& +MBG4'.@5;M/=?EU3>C2YU`;QW!IK^E)Z]2%50'T;'<_':SGA6[:67D5L8ED$L +MH!E80)0@ST!!((0"4@@D9)J`BG[MA6\R3(:7091!;_.B^16,K)$RDDC'1&G8A#Q(BA%5QC=ZFZ^O-K#QY`E2HD*1,C;F]O.3*]((9;Y9)R>\OX5`BJTE.2[A`H?=/3DHWX$I(E% +MM53ID_`*X:9C,R?8T&GO*'/9XX@1_!SP>RC$4WP,%]+XY!*)?))`%])P*D&$ +MY?!5>SP6260F`58P0YLLLK@?=5Q^QZW0[Y>3V>?;GKHS?6PH@.72DER'WJ1% +MGXH_C6;QJS,BKTA2UTT<67=3C;7<&*ONQ2FK)')M3>1HZ5W:$+S>?GOS1EU7 +M+_7P+'F8.O@&QID%X['6()V+&%$PL"RBE3G!.ZYJ0&#S6F1"%,1((84Q@'X/ +MQQ5ICP/&VC!.U,[!D8X5=6__5G*"&H8`T5G#4.HPLN.C8<.2KE:$VJ$1U\:S +M*BD\[GXBYL-+QO?"<\7%^T0"4G/^M/)3_B^S]TA16EA&K4!H.L8[+BOP$SV# +MN*AFM2X7JG;;W=ET^U[7M?*]KLX>W:;EJJ.;$=9QHIF[O+J?G+G\?X].@X_F5ZC?<5HI];CP";5'!!K0[O +MIQZCQUQ[W&WMX&7<&X8=Q#U/-A!:DL1/?64(8<,^CLLFI)0CZ@'94P.*P,!" +M@XGPQQQ0D(LLT\IZA2^^=CU+511^)T=?+Y4W+R51&&;XJWMCT:;9X[UG0D5- +M@L_]$U-&P4M?^[&J\J$QG7NHM>_-3,@/M'XI,]8NH:UM77%E"Q++>SS\GEO2 +M)G1^$']+Q=^+[`8QZ5/=)OAD8GW[<^HJF*45!8 +M/XE5H$IWUK1(Y!=6!FE8CIJ=F><]ITN/OZK6?!%4I<;/H"'DT!QTW\>,;&(; +MJ!TD(,1*(F\0C$023Q^K3#*J2,">8"B`L$DA#'&(X&!BA(0IUD7+RB]2KOLY/\L`MPF^%6\;P5+ +M!JLX$:-M6W;]U;,)XEE?FAZ5KZE6=TR]-N64R6$3#_#[G/\9KCNP1:(AU./9 +MBG\D2Z?(&]:?MV_%\7Q)I$W0J[K4P)O,*(46RDGJH +MB*1@1]2GJHQ!2"2-OC:@C``XH009[LPL*1]BA-!!C=PK!TP>P.N;Z,O#\88J +M&=[]?R47F.05_'3\*KZ6&S<90WQRFJ3\YP\2V0'85ONGK/6A.(I#$(DV-.=N +M>8O@AAE/M02W+(>=JD@Q`%+D:/$H4.0+[E+HYVBNC]34KW)*&5=I5[=W4QG7P_6SI_LAZ?0`R[D/SOL>DA['KSV#RZ +MF'L+IUV'L`"GF/KJ/KVR"`5FB44D7UXP9JU7']J_[/A':/4K\+ZO\K]J?P># +M'^GH_GGQX05G5H'G4\]L-"7^CZ?-2 +M1R]Q62]"--Q":-2O=;YU41UM?.$6AO-8!_!QK.BSXT"?H*JW>DWN?<;,NUAS +MHFQ]&YRSA\/U)_3\@\=>G,&,+.S7B'9;&@YW9/8V45`]@QBHD#Z +M%B)'YBU!8PD^A7V2D*2?0C#W]D&5!C`XP,+V;$V@WQX#&0FD)T/8G1.Y-C-^ +M:>!T?MG!Z<5V(G7QF7XB90:MPP_`P[_IW9(#ZS[S$0>T([/X+JG1BX]^3>-: +MX&;*'+*FO.[?SL9BS%G._KD6I^C5*._G&0P=>=3%96Y\L]+=P8/3YU$?!?X/*LX>VI;M0_* +M[5RV#CX]G4Y'?[O"T/Z!<.^''WG.\;L@]D-P1AT/%G34#<3Q1Y]`4V0DKJTQ +M1$121)/H$^+[6,!QI23S^U0M*OHM6LP.('P4S,'21\^`<5&?.AAZ#CIL!%-F +M!LY.#@GL._:L)2/YGF8O&"UTM/LHR%*%=DGIT:#X?ZYYC%#RW"ZG:-=PL`\H +M#L"B93=3J+#1(REMQ5K=&"'RBHM1Y\$+<`SP0Z72HK[?X-@5Y5\OP4:Y\ANR +MLV1@8O[RY[_ADI^"8,^.-56_^\JB^U$/ZN]N0C^H-!6%88H, +M.)BZK/-)G>9-@R9_#NNML\IS5H^/-!RG&A44_;(/I].P';K[QYQW%Q&5V>?_ +M;F:\+MG7-->[9>MGI@,#;NTG74#&M]CS=K0MK,[O$`,\*WQPVGXGB\3:\5U: +MH23QY)A>^O-45MF@\M;UIK6(4X"G<33\?>O]_9.A*+Q[K(S.5M;(MP7:GT.; +M4'&D.@:S46EA'N+Q9NHPW(">J871RD_*T3O<.P>*K_HIC9GDG]9MK(/<#F%J +M@9OL8M)F(A>JC\7I-)75DS9'/U\8.;T%[`9W#O1UE60@G-7S5RW1NTX;DA:]H+*WY<)( +MQF-], +M(FH2;>HO:)NB1HJJBLK)I#Q%1=:82-D:.,ZRA(E27/EGPC?;%MS(7LZ4 +MZ;]<]6NDWG2M#"CSH*B-G,-(AJ$)'U(QQC-YX@V@B1&(P]!""JL//8!1"9D0 +M]"O@V4L(STR*LG\=F.W>VIAL_5_(IB'RXD?91A]4S^&?)^2?)[5+\A$#P3=O +MYBZ0]KYKW"N-%K1B3#/ZTIR9K8Z8?2<-]RR"5YY0J`G1N?TPW/WAG2=ILJ#FIQ$!C)ZUK!$H"_Z%"?\VV6O_@/.IQAA`/ +M5V=Y?D21G+"JRD%'45&W\\&G)7V,GLBU1Z$QGR^U +MNL9E&EN#\2B-A-WEF#15&?,+"#_+>S-O*P.7COG?7);1GP-0[1+G?MW_NA.0 +MPT3(-8GJ,R^R$)N[*=EA,VLS53L.X_;_<$^AX*['$WO?,][[H^/ZRR?%$9UZ_:DGQ8JF1D#ZT% +M8#"'UJJOXNU7ZS_/<)'SE2'A9!"XQGS1#1))!!<(`#C$A`T0'4,+,&-A%PM( +M'NWHN!HL?0&?I=,W7`S]M/N9S6Z"-X!@Y3G@V?8VCW?K+8 +MUZABR2.V2LRL4=T!J4(]?)\B1CO=8*Q;\J[*\_#R@G4@5C,X["?OPP@S\BD> +M^*86+UQ87_SS03E=_[\<6;_0?GE&^:[?EXMOC4T?[C.6,WA_7-^N+#"^X\W2 +M*N*Z(<6W5;#F5K#V+.)QY?-6-8"5OQ%Q?I1ZL:1]7ZJJPV*`''9"@4=E,#+L +M8!I75BTTP:(_!OH_"5^)4C;1NY]"LJ),CEL9I\#@+OHK7`#PT47>Q6%7<<-= +M8-!#!3*M)!B +M2F1^/XQP56^Z9=#E(B_,PWN@.U7\"NO626++K%8769KM;`TFPQW0!=>H'(9, +M#9@'CBU^>@4*.C1X078$XT4N_@;)+S?2O;]V?>7OAOA2)8 +M>*.+JES6;(WV\_@+?UP@5G)E,!^@G*3":[L"T5RF,#@BIK'?CF#=IF+I(HUI +MQ&'?:!B+>,$QGT!C!J?@CF`L+P_>*X"QC9@:58\1@.Q/O2VMR&2)M8_MMH.$ +M[&A8-&.[E5?"T4KG993<-<(RR-Z-!::Q@&L._;-9?`,#K[:+!P5)O,WN,^IO +M3>24)IS]CB[LZ.;U=?#(2%BZ5X3L.MKVNTQF6UIH2KPAZXAL]`1_I>!$9#Q$ +M=-Y/-BX@NC+ODES$3']Z?6J8T+5BNMY.N?,?3G)#N^]2U>(SZETO>'SE7&E\ +MA$YMPSDP,,*U<CQAZ-0_HA6C +M1R)V!I-3^NTT5C;(<3@V@_H=Z;$*=10AFUU@I?M#^I<%O%IP,#++Q;[%?BAM +M$R<4*?,[D36.,,#G.,3PJ:9LW>IW>*C6`8:S +M+["BV=P-9?/%HU3=4S`->/RGH*X,/D??G-AY_`L,?*RFI^79U&-B.1!6$(Z" +MGVF"NM`75`?*3.9[$B=+E,L'DM!QK:>-K-PQ]C?SGUC/(AVWV_Q_LI]D_+4GZ/45('SV)44'Z]*2 +M'[%"7]L%BS\"DLD%#ML/G62P#C!D,1'!,8B<]^-^:M:R4(4![.FM!Z#Y;^\, +M[UXC^!3*OD/!(O;#1;K8=QH,#LISY!^"4><5/N&77I&:[I4'&\\"S-,QM'5; +MLJSY/GA4'E[]YLLX@+]>D?NPF/02AS=\(P1>;D')55L&@UGD*\P!!,N6*F'9 +M-#GQ_!&I>)3IW#';>;WD'.1G;YY)'5#\U8]CRE;@6Y:2]Y>@LVS_9O<'M4N< +M3P9FS)PKX6X9-.\*$(!Y,WW4>[1796#-IJ2?2"%Q/_C=O+55UI(X[ICO`XG+ +MQ8K*@=D@7)H?F.&+=^IV-D+E!M;5"V<6PU]%\=/Z&%#OMS]L`-88.C\7I[77 +MH:*0_9B7>V/;(8,*/^>1.ST]1&+QSSI#=D].F#U;>",^2(O>8#M-YI/2$Z&1 +M;R?K=.@,R7UP@8B;-#:]\QGB/XC)LHV8-$NR#G4RR.BP\?C[Y-](1,&_G'IP +MG/`G./=A>:IAO#"9/7^%VT0_4QX$EH@<[]QCPH]);ST[7[5/J)]EB_6\DC=&V3PZ@SC.81#:^D42JT/%;#U%3)\< +M0"`OFE&A3H%+9GV?@"`HZ17?R3U?#6C+H^@\)$:)<8]Q!&PXH&NYL;!;.DTI*7I\+Q:=;Y]O*2S*.594W8F +M8B!%$9\RM>*:,':\!H$[#Q:TP&S(L(DXL>?C'$_F('U/:=4<+:%UKLP&>!L@ +MX"Z5E,\`_&,)\P!'EIVJL8(P)_<0GD,XKU+*1)]JE3]@Q83\WK4?XG^MCJ!Z +M5#OJZEFE.W$[4'Z"?;6'XS/`\_T,!_50[F0YAD7#R9P`X6:L@V;9S-V<>9P: +M->LR"$':8UMS6OTY9.M,%6:%%KX75H+P(4 +MJ/E\WS?^<^)8[8+=IER"5WYCW?:BC?(50M_E1CBD/=EZ/TD,D(/H6&* +MD=>:\3G3<[T&K.EMG'FJ[-Y38'J/*OPHS9:K.MV.I^FI^,!!JKTM@B16#[A6 +M)Q!5UM[@M!I2S-I=X;R!>Z)._Q"H]J!`:+U'@8[;EZQVY3"C/7X14+[PP#I0 +M'R'L3IS_^["D$SQ5F-?=ICG`/S\-4;)KH66.#=9>T-OMWTE[=Q4.'@?+B3P> +M8H51@E//_BC17&A;UX9]^-#_8PN]JW(Q8XYD,:"]7_07=\\DTYN(;K*HX+SZ +MAHH..,&B5$VPMN8,"%HQ%ZXEMM[+O+,_QYLKQG+G3H.$-KIM4>,3:2IK!Q_. +M8!5XB*5C=KVS`G`*1DH6B&^>(F +M4M#.L-Y*[FAC!'.5O5-0Y'5+L&.TC[0X<]7H-]&&A+]_5&FO[CR5C!HLA*!I +M-N?KQB@_ES9Y78I8WGM-J-EU3N*3]LWHM][SAH<]F!9W8XQNX)^4AMN6K-%[ +M4ON#XJ!;-F8SD]-3D3BM*@A%F'1YW!*02JW+X'-N(M49N*+A&L:PM:X"IZ:X +MX%]2V-`7'JCG&R+/=F>..D&:WZ89_M\'TTVFEU'-[3%E->6;XU-K,J!J!NS5 +ME!DX*%I1;WLOI3R*(LV_-\LB=C"`L#"`8K0NN>E)CGYASQNCXGW8@<\UM?BH +MP1)^QL/<,Z7]'=^-G]N?Y[/I6*'+H; +MMZ[X#U=X_=3"!O0ZQ7^3&[=&/I]5`!OIRP16/M1@.WYHES'A;!X:KIAW6PL+ +MW]SO..`/Y1AVBL389V6:]C0X1`:J%JWKEE&)CM:W=&P^7_'F[<05#O^S +M?"[^DGR^(FB!35P"CWLAM_(OZLQ6TFDM&W6F9EAP`^5N&3%:7946I%#_`5PJ +MY]\PP-VD6VSZAY'YD1+M<+_2^#$':4.F_/J!H?KML?!T#H8:`X$30]SDW@#! +MA+>"*3H:+@FBN(\#:,30Y[I3NR67I->C!*J1K0U;EWUT0=*:_GQ_G@KA;ZK_ +ML,IM7E=E>]#K-_D-D+3#51HABC0+5:+M-FDNZ$6MC\K_-VBI_0-<=LS"TM18 +M?UNTT[]$K4]TGB&R%"X\TV(0Y&!GRR<\=]('37I$V%`3'U.X('US+_^C>;M* +MNTC##KS-6,_SX0\3EA;V:E#B'!@^'N%OZP#\#UA5J5YDFX^+8&$K:A^4_U*M +MR0/-Z<28[[754/#JC@V;KG5)PC.1*Z +MP:@%I]/86BI*FA>+WJ`K6PG;'XZ[0_LD`=_#K?^"/WU0/H3O@'#-:,H*>@!^ +M[L#P"MAE:UF1N?)Q3B7IU;'5,JP/^CQ2EF<'H<\L7.B?=7D\0@?3OQPILT(E +MJ%M46O3_[1"_9OAB:PFR=`T9VB]$1\F"J`AZD>0W=,)@M%:5$''FBN/')CXI +M-3[_F@Y]=9Q`&R\^\-CG#]\@U,!19S0UCA:C`;S6LDKJC,LZ^.]D1#C`.SSE +M4S(23!(R];LJ9)=+[O'3/=]Q5+[E3UQXG<_#U6MWAH5\N(&.+2U/FXP"F8N2 +MK>"I-YY@"WS)PP.:L_PS^C"@3AVU3>%^NS.T2[M158(_O/'8RI*%X)W(?O-% +M311H2/&>0/!Y;UN.#RKN]=ZB0+"P%/1G-05OX=:;)NVE",$PY0PX)4D9R@'6 +M\XZ!05/A)9P/O%2XT*7>7JWVF:7`TCT!S3`\T=Y5N`+,Q_$T*,Z4[Z_2+72M +M-@-?J[\M:QFH^^0\/M[VB`[>X-*X/L[^/-+.6H+H?#G&X)H;RHJ#>_SQ[XA^ +MK9(GBR+039BE)9<"V]0=+U\$E5M.B0.3M=Q;'[ORRDF\SI"+TDN>_;Z6!Y+- +M/2F2,AM/SW'>+CK`B4^R:N6!.RCK8C2N1V3*D7>?CBX6(VG!.OXP'A,].!"\ +M*T[,VG*-W1W%N_VK,+'\3"7H-@:PZ`)K9&4\48PJXP+7KQODI]3["<$1J&\X +M:K>TN#/K"W3J7BQ&K450P!+G>#0G+2>]%[0B#U)>WR$BE/:8"]"LJ6OX_.XJ +M9#9X]O'%4@]ICX+*/,6M_S'*2,GFTUG8\9(##ML9Q3L'^ +MOOZ`)`8O_>@X$^L-<:F^]HQ?S(-W=XT0N]MDQ)+<9@E77VB[ZNR"07W@X44D +MI+P"8_)CPA$`EV"&R=]K/G`!%%:BBE^*N);6US>=77`)/46)(*Y_'[A%[T$ +M223UUM4?$JX"^C0A_#T;U,@!:W11GF-MM76UAV!`L\RB(@];9_DTVACSQ%#9 +M>U;ZX9_<#^SP#^(B0A)S+,)%39;7SV6Z=V>";*47CN?AR?82O$-%9IV"J]A$ +MZK7ZZJ2')\.;J`?!,6*RQ316:^O[?H_1_K?W2D0A?5LL=P'B("*OI$H_7#EG +M@]+_RR:%0_G?C:_4A(O!]C^[;3&EQFPOJAXENW)3PY45$,<2!\_/`&DT5\;* +M5G]\KX49P-6[S8+;VM)K1E&AAW2-_/$!D5(?D: +MW7'R*S1Y_D$-!;..@[3OW:KCMO$`M',%>X^O]1\OO^R7BRWTA^JB0_I"0YF& +MS1HNFC.;F$_Z_4B*0Z6K\3CG1G/Q@^N?)0\03)L)Y]EI,^!\_;D1_7+;&R.N +M,CN%F^-@L1HLY/Y;,W?X`&T272NQ9*^.J:3Z0G,/@K;B8.P&P_R[]1G6S]CX +M2L/HC6Y/<0HP&P%;BWN""6_G7R_YZG#1@.!>O4<]YD3E&Q9S'3J_VSUYLMMJ +M)#"BRIEWN&RV<[\74L9G:K.'`-*0.Q(]'\Y#VX'R39&@]8UFG%W,+Z:<"[C; +M'5_6,8YLT!/;2$QE-F_N0AC2ARARL%S-E+:J'*MJ(@Z<'#A77>TPE)33FR=9 +M=^=C964X[T`Z_RD[!_1P/0AOD'21@/8W94&:.U4'=&3F:0J]*3I_SWX7)'[# +MY!^J*V_J"_@\9H4;UU9PO99[92.#K[VF`YM8)XV%SY4V]:(73M)T@TES\PY' +M\@K:T^"6FJ9NIP5M8X&@.?@=@P@#UL:!?3),=!RZ>]^AH24S8&P20?Z[6+^_ +M-%3_Y[FP4]^#F-*:D*O9N.\20490'$F29KM9G$D%\EWIOQ#.M;DN)5"C +M^B`$#L\O.M"BI0.*^S9YC!:;4+SC;<:*/D(,Y'^3#.%/_FNWV@+T8V/*:9`0 +MJ?IXO>WQBX5/_`R"D367BP-&<&_I+9(,36'BG9H_?+"^^R@#"XZ[X.$(>`W& +M0TP$IY:$V.UZ<^:'F+=\HU$Q>9F9+*YVQP.WEK_+] +M"]:0J/F08O&5=^G0V4U=Q_O?30?Z`IJ^&_-@5:/S-6S539%E8O)AC=6&3.%- +M_]3XWCYWT]-Q_!"`5O`6#N^@;`F^L^Z;4$,)TLV6Y.ET.]X@-1I&7\XN/YM& +M@(/V$#;G<&R(TI3A-VKE`+<..U.X +M)T:O(R.#*?@T7H3MCFR*&I,+1!DA*7R?/@^I&"Z;W;1+40NEBN/'MSRAIT%; +M$4*`AQ_]VO!:#Q.&!W"GI'3^8^`_=W;;4A;:F&5#@#.^U)>I8-"PW4:!MYZ* +M-@Y"@-V8K+2_O#Q*,;%@EEJW.@8[4@L&.JG)TXQXM;H +M,>1>^8/I7(L0O%F;W7U)P2?"@048V.YLJU>ZA:6`I:-+XRJ?`W +MJY9=,+.+A38T'W)/@2JH#Q4:[X#Q";_%(!2;6UAY`Z!,KG&`F97!7#CAV"&/ +MZF0VIS-N&GZ?S7=H:*8*[C36JHB%)WM!8#69@\4_W5&#@$K_`*;!S'4!;\1I +M;X1>W+;":.%.S_7(O;M\3:JW2V!\JC@D7O^-W\$?!BCXV&G(LJQSWO.-O/`< +ML*LZV?.B)$.TFFW#&9,&4ZW.J`)1\5=4<5-(/'7-OKE07O^UW6R9T;[C2(`8 +M_J$=P&V67*1``XZ>Y"MCS59"D#O9-)'JHB*TOSZ,E0!,C$1S$M6QXD_N@IG_H>A.)7 +M0QKP11RIQGGA9L\+_B^$%R\&ZW4/MTILWR$$?3.3(\8A&Y3B(D1TN+PN81*N +M'&3[+BSQ#07,&X\T"&L-.;^($Y;Z,V-7^=X0S[;`476`$E08QU.%(<2!(6SD +M:9(TOC4Z#/R/[1NB5`'/P^(V7ZM-!]."(B'-#O)N;`;ES.;8Y +M"<,`;JW06_'T!ZI(O5#;%IHR[/ISOMJB&F=30HUG'H6T`-6XK(J"_H>&#"43 +MW18#G5=TJ"\[\3XAWUOF7)#[4,=%G^)GR+N=MD6M)I$-R0G,%LN;!`-=Z,^U6=X$:'-?R*D80&O,`7])GB$#?8C +M-,K4"5"Y\I@4@9,]JS8S]$"67+-,]%^M_1`2PR(S9O/._)_`I31J +M[VN((A>8+I5TR"O@P`Q6&AAF,(!6`KMGU:*&07I90U!:[(AG:J3W9#@=;J'K +MY?JO#%0!`5.ZOO)VO+T(Q$X$X=P63&=-Q<^0'S:F*?C_ZYT`7>ORN[/C65I$ +M^*\0;%_H(RA`#)7]X[\H0#%KDA*'7\X\)8_#(FAH5\QB4M/YW7QH4,@:?S^EZ[_SI$#5A/,R?;_2]7I0#\9)#5 +M2/?45*?-[;XGCL@0`$-IUN+NXK_=,I$`$WJY!S"8^1;/Y\@2<.WS>^,J[I1'UT1W8G];+J"`$'Y9>L/[3 +M"2?MF_[V-H8>`)4X%5OW2ET&[2>'^?=:.W)UC"VY-$1$C5M%R^!7X7D]5KZ; +M7C/MK&]]6I`@BMS")#GF_/UY#W+R1$"&U1_3LMQA:JN +MVRLLTT3W'S-(0"GOFD[_48TU>OJ\86EGB!BXGM?;<22F`00=MWO.9Y8EPYS' +MR6B4VU9RW2!1T=4!!GIOPD/*]MT[-=W,S'DX1$[32"TX+I):?''N/D`I/IM' +M4OBO@J$>9X2@^`-HD<_V2GNMVOYN#7DD/$Y>ADA;'?[BO4P!W*N*CHVV>W+\ +M9Q84@"C5^1-0&SEE[#`97J331$WN<>*2Q/D!^#\+&.UU<<<`"6G]6]3'FJ^G +M92&9E=;K50=H?!!.3=$G6*J\]@X<7B*0!,-/C125LA;!O[9$%/*D&T>2@`1[?E_6BXQA<='_(;Y>7#JGTJ8`9(T["8PF>E%_ +ME6^"4.OQOY.HR!>=P@2W@[ZM7YA-QSAGQED0(+ZL*M=+4!*WPFN3_9<^"&IW +M?VY3P6\H-XPM4FFU.1K5K[A[$IQ&? +M4[C]X^*D/,671D`)/LW;,Z2(T[*F\1[NXN%0`$OW'2U?8`B&G&77Z>XBO(T; +MIP3I$'-5B/L/=U#&XMBPY0SBDD`N=R[07^H+BZ-@=&C +ME)`*>1:EL0:3C9@(Y,245D=UZC&WX,-)A`!OL2NPA +M=U9HR!)=)XERANOX4R`;(G\IO,1$0;E +M#I3)2^`/W+)&X;9'QLR(`!\SNI[]:!W:.O>N'$L:=K1DHR!62?0_FNE?;76W +M5W:)AFO\4R+W5N7TV07)UA_`_"UL(-$`%WSVXC9^<ZD_O-)1$6O^4M.4Y"S'+V.I<;/6'P%.R\!3FZBN +M'O,K*'CX(8RSB=6NNM^"TE9`-^`J\@);/\T1`:A\@DKJ +MMX"5DZ5($U#F\/HH"*1EG6G)H8H=LF"_`ANFJWT]"339WT)`<7YR+V!A_O:7COO> +MQ.ZO,>;EOJ2`73]8%-ON2*W]T!X",9R*)=+]=CWYU<8FOC;*PLJ9+(A0<`%C +M';J6GLB=4,ZU]5$17%S@>SME_81ZY.3H(D^!.O`"]E]Q +MS^<.YZB^7N5:`X7'?K3T1Y`7_S>W)P\A""&KN&H\-W-G``!B-W9LDY[',0*7 +MXWP\Y[ZP+;TZM$TWTPF86+23"ROSX&< +MQL'G[;HY7B2R$%/]T$P;O/PWCKZ3;/G7LZ[\K*41!O;VHKGDJ_$B-68=..Y\ +M`17>(35W$KZ)1OCY%#3X$91/KA1#'>IR-_)"0&+I'1=-/(2<]N6[29K#I4!$ +M_VQ%Z*C`Y]6:];]D,"O`I`!PW\%YOX$X]3Z3VW-XI@LTZ^A/)C6B!-SR!?>IK$\GH`>!YU:_G^[U^).")MO_$0;<7L+$\*:%.^U$1?80>5H]SP +MH30D,]RUB)?DL`#\=6D()@LHJY]S.P'P2Y<2P']T]3T4:/JGR"UU,@G@@\=+ +M0O`E)A?Z:TA&GC@@WBA6,&X/`KN^NV0@*599L!]YSO)<;@IC:<7,JE$!_,EJ +M`C!0Z5OMOF,2ML&A@41$VZ>YK`,+,<6VF]4C/D2GS>Q)$$<7OVR\.B]F,]NP +M0J1*+?#9LBR=1)QVL71]4"-)(IL`4+.=%A"OVM^CM2#:;;'A,J#;&F$1+V+O +M`%BI;**:12N[VO%:Z5((@QQ$@25,M;D-_)GB&Y5/F14?\V7B_[;0:B@`?,Y2 +M$5_]MPU?N#$1UU3!$(C(M%U;DAB/Y5_YGL=LSH`7$L%?T`6NC0C[N'A?7*&0 +MD"_G6!?!\CY[,H]YQXK/2QD<]YT@`?2& +MC%7R$)5.#(;#':[*O(O2S_6!YCFLGP/3X2`3+T9A9ZG6C,NUT"(A[D\^"QTO +MZ^AL>DEZ=(EM/*+DL%1G9<1WF.D,"\<7KR-5-2XC5;PT!]JF" +M#UF91M0-]]8`AN+`OF5IBLRVA<=>4]UTI%?=AGG""_<=#19D,)+/T0$!F'2S +M(9J,WF.FD>=P6!4X*,B\^.TO@(\YD#SD@`9_G@#ZJ/L6!B)[#D4CZJI"+>@!PXK>5-1R%,%[J.C +M(@DX%)%]!C?*VB4P+_;8&^(J;`8H,W"3CC-:(A%9"80+R@"OEA5",&HL?,?7!KS01D4[R@KS)`#K*,/Q,M>"5DJ(9=$"VA`+75HX9);&Q/1!0?D9!DF=41,JW]1WJCH +M,0/D/ART_6D,OO_'^^M!8[9(`*LBZ2![=N^?EQ3H"%A1,#\`557[T6^2=M,V +M)FO6T8"9>)FM($_92'&Q@?#ZIGO+HFV5^207VA#'Q\K2(-UV\/7`"[U%.QGW +MD1D^D@L5>`N?K\MJ3@M.?Z"9NE'GWXZ"B5D@57]J39)"JX;MHQ_2[FX&7:/( +MZ,B<"''G)T`,5W7%G7=P23Y(LGU"'1U?2'!T,YD2;T`(37A9I'^IW5(AU]9J +M[+2\#*=#Q(2%CE)@$/=R/Q!B5\"*50$HU7GE.^^D0F$(AL\6E:X0$ +MQ=_M83[A&7=\MMQB+(72,(T>YZQ\OB[\=M?P0]%UYUZ8Q.^/W:GO39"FEB)P +M1\S0+W1K]!CT),'6UR20%#&CNO24EI3OCWFX1@KV*(A4V6EKEP920LI%,C`Y +M'6@EEKY1$&#=;FO5;T;F-9HVY/)")6\DO3S0!?/RZO:IZKF=]PU4,C%++$!. +M>!IA'K8\Q$C,0D6[\4H"&P2,8?*DUH57*'54 +M8"Z9_2'37'/[0RX\3:`@XUW*?B!8_2I?VH8:HE76#3IY(%S.]($2P]=G^N_L +MAFC,I$+C"A/>^0$XBEK^U\7Z$`Y<0\W--KIV;`!P%VIW5B#70XH!8O!:+=Q"BFS.;<*U +M>N4T@E`%NJ_>2Q`FY+&EWE'G)%+=*9$!5.1`-3_<_7&C?QF1YTX/9 +M(#+SV6'HZDHD+R`ONS@M/H/'-R$EESXY+HJ`F#.OBQ#Y2?#TE4R';(MEFOL6 +M6","$N_U-%=$0_JTL+% +MQ."K+3NKY7&"0%G?*G_EV?2`W4-\HDJEJQ$*D!3L1`+"U/8F%3/?81!@4:ST +MVY$&&HLNFO)]AH]!91%J*A,`)>`,0)96L"M3OQR>L9:"'"=3I4P`N&0B!]4K +MN!/0DP@R\,>4R&BLR!2'3W.X2LZ'CYCAOI$*R`/J=XO(9I1>T/L]O1:QJ6($ +M!3:!D\(M=7G&R/;)::;4P:-6Z8.B(DBT^K/SDU[J:P`N503,`J5.4].I[Z(./"X?*S^K!%">>`:5F[[4A>1%E]1X+D@+/^?,'_.8\2$.U +MOE,%`(9D@!8S]XO7S"U.1IX=^+1CR->#];K^:A=IIF>.EDU7RT\/AHB`JWRHS6Q#^:243'3F_ +M(AG9*`W5/L$QXC'0;3BG2#>1)C(R/#9H4&10%C)/1D1;#<^N8-P5TIB80#S4 +MS3UB(O1%^-ZFK+/UVVW$L:!`.L5);#2]JH];,FP8E*XJ`18[2J?OU>9//>>A +M49:?*\:BE\H")IH'SHQ50P#:QH4POC=G`+_KO018+U=]G@IMT8/S&I*8$AM6 +MGNWC.`34J\+R*F@,J-4>A&1B7.D@*]:(`0@B'!1HDS@'C2:WKJNC"EJP1:O> +M]Q,V-OVT0S*NG(R$'2>?H]?]%L$!SV;C+ZJDRSY'_UFHUNAE0F9L,1$$/1@E +M.`VORJ]R8,'C?VX,>-#"F`OEZ:.]TMVO*Z5]+>B-,=LX1,!!_8W=WQ^A_NW2 +MU$]I<80'?F$?$T:TQ<-`7?_J>Z[KURF99P`.KXYJ2I[?7'X+[_/R.WORQ$3( +MEV;"IG=`U0"QHCJUEUHP3H2CI%@RFV5L]!.[""+>TSWP,+L5@5^0QHYKD@`);D%:,NF9"A%(V1LK_TIM+)7S",$083.2HU,IAAFT'XT4$ +M?KD3U7')$I1"I._]\#P!!78-ZZX%HIIC4@)GI="3J]'-G"($!/F";"$X;)_"2&TDDA)\#BWJV=LP`]FAV799YS"0\=-?CU[U[ +M]/CISW_1L5^$A`#N#].H2;S%@=VHZ>RV_5"=L-6G!$*Q=R5^L65DQ&(P(P&2:S4C7` +MI8:*T>=/$0=6%U>^QJ]19]OB[<$K&%()RS

+M2X_PW\A4?`_T,KO6V2"`&K3MT,)!CK(Q.$F)Q>PD._D?Y*B^4D*2DD`6%-K8_P_JX2!'5M`WMGAS"KQWJHOF+*UVOQ:T[Y9-3P0*:WWIXLJ?C- +MUZV=DJTK6B``2W7?Q^C,9G.S@>+J0P=!_WD]A`#3_>Y.LY!9N]=.H@! +M5<3DW_A4"O%8FJ8(JMD+#XY#2LZ&2YJ4@!!8^J9Q;X_04\]2WO:]/KHT8(N#N? +M.RP'[7_8W^LB&QHZJGJ<0EMX$D^/^9T'!QBWAHT1$+>ZL+"U4V0E\.+S$-7& +M?.E_'!DT,GI3P(DFW0K0NYLF4^AB>9#5?NG)A+!%U^U&1$P=C,+:I:Z(R=?"9MF:$RKNC2@@'_$L?IRA.PM&PI@"V4DW;=.NQE$!G*O0 +M<2FBEN>ST^PK:4`G?N8HG(2#9=4[9NBPU,@75J,&4W(#B$5)7,">)F//)?JD +M(AAW?&JOS\C;2`8+C-,ECG&;S4V'-F2`BPY76`6C*^TZ<3!ICXBW8Q+(R(IJ +MPD=_V;-<]R\W$)-FF7_LY%TD10_/HQ$.J)0(EAUOI;$\Z-U/"3#'J)?$)`D@ +MT\)L()ABS_02AY,@?!#2]]K`&)V-5J5[<\[M]U\$4M_NV6/ZE)Y$6/%P&&)" +M@##\T3#,]>TX^FMTL@4^0$9,B46EIO_7PTT?JDP$5D\SBBVD6P38:VFJ"(9> +MFWL4HA?5`(4HB`C77YOO')]QKNZYYI^/"QJ>B(%>Q4-LY?.D'#;^-D.`AO\Z +MRP:C/<+\M"$$70[\XF(*$95EYG<%2A1GP0B/7`R#]N4>DDNA506P\X(M\*3B +MYPB@%N)A+!NKIQ7;$^,XIB`^[6,,>0'(WC733>(+6T3*<5RPD$`Q[ZGZQ%$R +MK>_NCIQV9E4NK]JWP)0!6HSR:0_@Y;)SFUH?^7TF^51@A083IZWJJ'*;HWE[ +M!B3-9KT$IQ=$D`$VR-[!;XBS"*"^;+RLFF!H0@#Q6<6D..:(%V[6?%W$:[E: +MW1;9L;^3PJK7V5/0H2U_DO1=@J$OY%>3:5662$!$.'F[;RI9 +M"GX^Q74GI[))>;981@$CSTG`D#;II8WJ2D_P9URN*!((B=OJ<[I%%/N23OH] +M,.9U_'>;^(20![J&#(A5/G*P8MXF7!FZ+CJFH1P7?K$)I$*S-9JV#BFLC)JW +M?,)92?8D\_[=:E``13__IP%L$]^JMVD*JLCH@_%VK58MEKU\E-(`:KZ10`? +M%J[A`OY&P2@0ZF.Z8`A5S7YA.I5[$)0]#8KPJ2`%&7(N_@Y[!`:/8C^SL +M7UN+$XNDTE6R5"40'77+[7T9"S7[+0O]A0LS,XL28`%+NXOFS/%6`JZC?-]M +MM.AUDM2>%,!;B?!+":PA6=>AIF!SS4LBL_CJT)$XYC7R'FL>]VVNNK_O[)I$ +M*F?/_ZR$!E\D.K!KH5LHV)LD:SUT]/4KLCG"(N7\G^9($?A?^_KWHR_G_Y\; +M4[1.VL/[3@0U4S%LY$)Z,P`ZZG4U%#5?#"1D7S[WW[9%XNB_<=]O]3PNVG64 +MDGI((2KQ#XC[B71.G5+,;_A\3XW:(`#X)-!4:M>(N\XL;V]*4&H[/M9*)%92 +MM7FVB:``R3`!2HD$A^&FX*?Q3O$<61]KDD@BHU4!>R?]8Z^?][&\>5$"'8B- +M-)D`Z2./Q[,EG+YQE=6>W`'Y3P0P1C +MP;\VHB%?D)99.NY(&`&/>9NBD%\4BHID!;K7NR"&3LY+AOU0_;[1J +MVX;__9AP3@ABJ4B`$WG;6*"X79OW62Q*;A)B`P5+H31`?$7O5G7UG-#JS-=Y +M]+3[M4(#SNW(GM*1"3'.T>SU\0C)U2E7AA_7T%Y(^M(!#@-W]D0I:`SS,V"W +M=J02^2-RUZ-"1"N7[T`2O/2K%7?^0W]M,9!2Z^8]\FF`$R9ER4D/:(=^]8 +MN/4)\\G>JG9PC(!IK`_=?&[B:NG*;0$`P_CQ+$:0&42BW*HF4$JW-L+N)K6I +M(*XFZOP@3@T]+P`-/@T&,KZK7``L\OLPB>Z0SFL +M9T+85;%-("3U;S5$6WE_,-,FUW?8,V\)O-MTD`?09,@DP&)E(_HU9\"C=MKP +MB(;[,X#:Y=-S"O=6'1:%I88?3!)I`>F@[)`<&6/G#O>:^>Y&0ZR30R!$ +M(/Z]I?I+A6C$(++YCND`G\G1-QW2Z3N>WP +MDB!?R#!.&Y^9%VG.LA+W^89(0'[/I$4P\>F$D-S0^X0]OG]:.]2<"4 +MJP@)^C^ML,>]8_QX:PB+4;/9^0$&.$_#_Y_BT?7=+#+E?8.3AY]"FD`X8Z:(0F-E +M$Z2S"6DZEPH2`#8@O(FHYW?+_X6UWA?QB)0!B(9C:$1Z\"I9RD'']_5,-=7# +MG7T>ED0JZF;N_NUT><`%6I9Y^<6]`G]Z;T",`;JTL:4@/WRF7DC8\^)RW;DD +M0'X3N>"&^?&5N&_2\\\]])<497ZK'=4B*][<)H;]8E;L;)9V,ZN[+?)8&]6: +M,A%#:O^@VN#*.OB6Z%&1>AZ:@`)SVIC6F]QG=]FH#(]"SGZK=*.^3@3]KI/T +MN<`1#G?\S=B^5J!^J8Y=1C8U$,1$E?#Y?N6]29WZ.CAD$I$V]T@*+N?]9 +MEBHVFE$`&YR1%RT&CE+E:VNC^2$BQZ\1#NOFKV4$_I?CY(Z.\%#FTR'ME4`) +M*7*^8`-I.])!NZ*3'*3^!/J\%,0&E@"`NZE-9P.'=8?0J=ED:FQH)-Y64XB' +M<]OV[G7_3R"*.0Q+=UZ=5XO#9.%RUBCLXGDP`P_0H`$8""BP8R\=N5BNYRD@ +MN[2I``[T``5GK,GSKOPI_QC,>Y+(03KWXQK(#.B8\.&F0U.MIT]#XT +M<2BB9=,!"+Y5!X&7;`%LCKDM>2'S6K<%WO(P1^2'FWM6N(0.1GY'^RI`>;"]N+7P4@9XL172P.,X +M$0ZW98YYBB=#JM+/61X.>C[2<0%B`5(W5>C$!WT9CXW+1N=EWW163@O4WVH` +M'<43H?//N?_:2-6`GKQ`[U2CDX%#V,URIF:(AYQ]]:T*W12,,;1HP.MJ7D@3 +M(E^;+3JHF[$.E<)?;N/TL^IPX/5^5:(%(,?BH0!P4=YH>OG-UU--,)9!G]*; +M3P4(1!0QZ;)L^D'U$H*,DS'0&74[G>@%NH7&Y%.BV1QUVG&])T@Y*3Z/Q!"N +MJ0>.N4BQ;VRE:),!6K6"%VOX1FZM/!?I2]UECP,^;SE`F$!.PVY\6.%!9@O' +M_+1MC^UVF^89M1I"T:21":PN#=OKB"):Y&MX%9C2JBOQH7W;/J3NG`GR,V/P +MVI$YAPU=4BICQY@X*61>SY\'@>P0F.[D!OKI9R_`?).)A([I"J^D@E`#7P-+ +ME^R`6`H:3/52A\GM1B950E$D"^CR(M+^*(,WP>X"-\:>N-"YJ&WI-3K6+Z@0 +M"]?`CKY+I\"][V(V!B$BFGBT:?L`*YUN_-9S=C(.26QFMTF`$M]_3K\&A(!C +MOL/;57'DITTRZ+%NE!3';(%W&6]%JS<%N$-*P6C/?)-`DH3"X3-+$04V2-2] +M'U)65H9MVF-9"X7\:%WSA%];_)ZG.!%0^F(G=]_L?9A9OXVH[B8AKVJRA/%& +MD0[N*VO%8\!",[_*!^V&U!%O=-S!FDS^R;=BI;."=*/[S\;/*Q`4.Z+Z&9L.YMH]G1@6;#:D![U6Z%12]2=ZZHFI8%7!OM,0*< +M?8B@G(1?7_ONDL+#1RR(4L\US7BY4`A>)%A1@7BIR3SR1"KM8&7\"JE;.&T5 +MI8Z-RW:616QKOR)`O-Z7N\^%'E\[ME+G<-98[\)8)D]$WKG,$3A/K]O\.'!M +MLWH;[S04.I*6WK-8YU0PU($,?&T\20`PL]`"A?US"HN#EZ7?K6.O7:_1KJP" +M'PZ,?N0`VBIL_0V*]/N]3(=Q(163.YN8!<1?@U8N_3^6^V'S0Z0@JNGKU^=` +M'9]=^JJTSC.:?AHR$WG@!&VR\IJ;7B)3(I#"C(K!?``;);L>+F\24S9MAA6= +MEWSLLM*81^Q,1`6PH=Y#374 +M7*8-8-)8S8$82D//X?.A``.Y[QQ4VMJZ6R*^H%BD`HS')JX0$5!\7J)CLB9L +MYJMJC(,GTJ?>I`B>)ZQ'G5Z;PZSB=*0SB03S=3A\B&UD&?Z5SVJY)*0DI?I^ +MD]](@@EU3+5\HZ$?6$6E!&(5%1S5K-SQ`FBL6!`IT$N4C/%_S/'26]=GV.5I +M?A,,I`A@8BB?U?Z*/@3H*EI67A/PEV%H5+(*!$)/HY%=_VYZ5"1$Z,VI +MQK-@JSV]&(N6ESF\3P`W^[?N'HL0`,C^T.RRWMM)Q$4)MXK-6I$).RX2.38H +MW0,K#*TJ4A<_C6@BW&/%YBNQ-XT1[=J"8!I]UY8>W>8KVXUV[D"X'MC'B/H& +MZL9+5C/27^@B\QIP<$8ORD/^A#P(DT@WLE]OZG#^G^F^R5U=4(:.W5VJZ(#H +M4[G@)I4QM;2H@3KRJ+@,1``]=\YRA/UUMLI4J_-5DRC6;[$6F17!<^CKY\`6 +M(6XSTY5J00"K07Y`N_R8GZ6CO_*WI%,3]Q>D"QE +M[5N/32)')>7*1I2E`:E8D@`)!8!`4_>I7FB[DFN=#7(IM;;?.J`8O +MW_1DZAL!#&N4T1ZXYG:T0H9J(@GT$!FOT>#*%U/`\_3^%CA(UBF4Y#.[K;.\ +M-_/=\VU`)VV'2H&[\#FA>1%;Q_-V-L"(8N*I\G9K#EFV5"SO#Y=6"UFFI6+T +M3G+?98@!?,N;SYNO-.T8M3+PL)2>9#)_:((%!7?$WL?Z+82G"_Z`=OG/?>X$ +M"&`^X.FC>[0?+XWG3LRP=J&B24*S8%_AM-Y>7>3POP4P"3^'QQ&\B%E96U-= +M_\T+P!3FTZN)(:$?3(77,J!;MN[Q((..(R75&P._B_E)98!$.?H&V,<(NF#W +MF7N*87EGT[@F`5/X:++MT"ZV@$,O+Q6/QI=\_Y(5TRD@`E6_MV&KS%1I_M!!;Z,JUFJ07_E],9`K_8=._^^O$]@_T6;`9K+P7A[JFLEQ +M(2)4E`Y;&DU,7U0]BB(@SF,#?$X"S:[ZWZ;?##S]/:.EM;R+\[!7)6`)*;Y) +MO\9Q?9T)`@D,8&,8P,8))[Y5(@3H#&,8P,PF(Z[H9MWSG1Z`MWE3#(#!(0Z[^<"%UJ_/$N7C^=F=5,B) +9@#N8461T+A7W1J)TTW_Q=R13A0D`S39&D(#! ` end Index: stable/11/contrib/netbsd-tests/dev/cgd/t_cgd_3des.c =================================================================== --- stable/11/contrib/netbsd-tests/dev/cgd/t_cgd_3des.c (nonexistent) +++ stable/11/contrib/netbsd-tests/dev/cgd/t_cgd_3des.c (revision 313680) @@ -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 +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#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(); +} Property changes on: stable/11/contrib/netbsd-tests/dev/cgd/t_cgd_3des.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/dev/cgd/t_cgd_aes.c =================================================================== --- stable/11/contrib/netbsd-tests/dev/cgd/t_cgd_aes.c (nonexistent) +++ stable/11/contrib/netbsd-tests/dev/cgd/t_cgd_aes.c (revision 313680) @@ -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 +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#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(); +} Property changes on: stable/11/contrib/netbsd-tests/dev/cgd/t_cgd_aes.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/dev/cgd/t_cgd_blowfish.c =================================================================== --- stable/11/contrib/netbsd-tests/dev/cgd/t_cgd_blowfish.c (nonexistent) +++ stable/11/contrib/netbsd-tests/dev/cgd/t_cgd_blowfish.c (revision 313680) @@ -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 +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#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(); +} Property changes on: stable/11/contrib/netbsd-tests/dev/cgd/t_cgd_blowfish.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/fs/ffs/ffs_common.sh =================================================================== --- stable/11/contrib/netbsd-tests/fs/ffs/ffs_common.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/fs/ffs/ffs_common.sh (revision 313680) @@ -1,99 +1,99 @@ -# $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() { local endian=$1; shift local vers=$1; shift local type=$1; shift local op; if [ ${type} = "both" ]; then op="-q user -q group" else op="-q ${type}" fi atf_check -o ignore -e ignore newfs ${op} \ -B ${endian} -O ${vers} -s 4000 -F ${IMG} } create_ffs_server() { local sarg=$1; shift create_ffs $* atf_check -o ignore -e ignore $(atf_get_srcdir)/h_ffs_server \ ${sarg} ${IMG} ${RUMP_SERVER} } rump_shutdown() { for s in ${RUMP_SOCKETS_LIST}; do atf_check -s exit:0 env RUMP_SERVER=unix://${s} rump.halt; done # check that the quota inode creation didn't corrupt the filesystem atf_check -s exit:0 -o "match:already clean" \ -o "match:Phase 6 - Check Quotas" \ fsck_ffs -nf -F ${IMG} } # from tests/ipf/h_common.sh via tests/sbin/resize_ffs test_case() { local name="${1}"; shift local check_function="${1}"; shift local descr="${1}"; shift atf_test_case "${name}" cleanup eval "${name}_head() { \ atf_set "descr" "${descr}" - atf_set "timeout" "60" + atf_set "timeout" "120" }" eval "${name}_body() { \ RUMP_SOCKETS_LIST=\${RUMP_SOCKET}; \ export RUMP_SERVER=unix://\${RUMP_SOCKET}; \ ${check_function} " "${@}" "; \ }" eval "${name}_cleanup() { \ for s in \${RUMP_SOCKETS_LIST}; do \ export RUMP_SERVER=unix://\${s}; \ atf_check -s exit:1 -o ignore -e ignore rump.halt; \ done; \ }" tests="${tests} ${name}" } test_case_root() { local name="${1}"; shift local check_function="${1}"; shift local descr="${1}"; shift atf_test_case "${name}" cleanup eval "${name}_head() { \ atf_set "descr" "${descr}" atf_set "require.user" "root" atf_set "timeout" "360" }" eval "${name}_body() { \ RUMP_SOCKETS_LIST=\${RUMP_SOCKET}; \ export RUMP_SERVER=unix://\${RUMP_SOCKET}; \ ${check_function} " "${@}" "; \ }" eval "${name}_cleanup() { \ for s in \${RUMP_SOCKETS_LIST}; do \ export RUMP_SERVER=unix://\${s}; \ atf_check -s exit:1 -o ignore -e ignore rump.halt; \ done; \ }" tests="${tests} ${name}" } atf_init_test_cases() { IMG=fsimage DIR=target RUMP_SOCKET=test; for i in ${tests}; do atf_add_test_case $i done } Index: stable/11/contrib/netbsd-tests/fs/fifofs/t_fifo.c =================================================================== --- stable/11/contrib/netbsd-tests/fs/fifofs/t_fifo.c (revision 313679) +++ stable/11/contrib/netbsd-tests/fs/fifofs/t_fifo.c (revision 313680) @@ -1,237 +1,238 @@ /* Test case written by Bharat Joshi */ #include -__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 #include +#include #include #include #include #include #include #include #include #include #ifndef STANDALONE #include #endif #define FIFO_FILE_PATH "./fifo_file" #define NUM_MESSAGES 20 #define MSG_SIZE 240 #define MESSAGE "I am fine" static int verbose = 0; /* * child_writer * * Function that runs in child context and opens and write to the FIFO. */ static void child_writer(void) { ssize_t rv; int fd; size_t count; char message[MSG_SIZE] = MESSAGE; static const struct timespec ts = { 0, 10000 }; /* Open the fifo in write-mode */ for (;;) { fd = open(FIFO_FILE_PATH, O_WRONLY, 0); if (fd == -1) { if (errno == EINTR) continue; err(1, "Child: can't open fifo in write mode"); } break; } for (count = 0; count < NUM_MESSAGES; count++) { rv = write(fd, message, MSG_SIZE); if (rv == -1) { warn("Child: Failed to write"); break; } if (rv != MSG_SIZE) warnx("Child: wrote only %zd", rv); nanosleep(&ts, NULL); } close(fd); if (verbose) { printf("Child: Closed the fifo file\n"); fflush(stdout); } } /* * _sigchild_handler * * Called when a sigchild is delivered */ static void sigchild_handler(int signo) { if (verbose) { if (signo == SIGCHLD) { printf("Got sigchild\n"); } else { printf("Got %d signal\n", signo); } fflush(stdout); } } static int run(void) { pid_t pid; ssize_t rv; int fd, status; size_t buf_size = MSG_SIZE; char buf[MSG_SIZE]; struct sigaction action; static const struct timespec ts = { 0, 500000000 }; /* Catch sigchild Signal */ memset(&action, 0, sizeof(action)); action.sa_handler = sigchild_handler; sigemptyset(&action.sa_mask); if (sigaction(SIGCHLD, &action, NULL) == -1) err(1, "sigaction"); (void)unlink(FIFO_FILE_PATH); /* First create a fifo */ if (mkfifo(FIFO_FILE_PATH, S_IRUSR | S_IWUSR) == -1) err(1, "mkfifo"); switch ((pid = fork())) { case -1: err(1, "fork"); case 0: /* Open the file in write mode so that subsequent read * from parent side does not block the parent.. */ if ((fd = open(FIFO_FILE_PATH, O_WRONLY, 0)) == -1) err(1, "failed to open fifo"); /* In child */ child_writer(); return 0; default: break; } if (verbose) { printf("Child pid is %d\n", pid ); fflush(stdout); } /* In parent */ for (;;) { if ((fd = open(FIFO_FILE_PATH, O_RDONLY, 0)) == -1) { if (errno == EINTR) continue; else err(1, "Failed to open the fifo in read mode"); } /* Read mode is opened */ break; } nanosleep(&ts, NULL); if (verbose) { printf("Was sleeping...\n"); fflush(stdout); } for (;;) { rv = read(fd, buf, buf_size); if (rv == -1) { warn("Failed to read"); if (errno == EINTR) { if (verbose) { printf("Parent interrupted, " "continuing...\n"); fflush(stdout); } continue; } break; } if (rv == 0) { if (verbose) { printf("Writers have closed, looks like we " "are done\n"); fflush(stdout); } break; } if (verbose) { printf("Received %zd bytes message '%s'\n", rv, buf); fflush(stdout); } } close(fd); if (verbose) { printf("We are done.. now reap the child"); fflush(stdout); } // Read the child... while (waitpid(pid, &status, 0) == -1) if (errno != EINTR) { warn("Failed to reap the child"); return 1; } if (verbose) { printf("We are done completely\n"); fflush(stdout); } return 0; } #ifndef STANDALONE ATF_TC(parent_child); ATF_TC_HEAD(parent_child, tc) { atf_tc_set_md_var(tc, "descr", "Checks that when a fifo is shared " "between a reader parent and a writer child, that read will " "return EOF, and not get stuck after the child exits"); } ATF_TC_BODY(parent_child, tc) { ATF_REQUIRE(run() == 0); } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, parent_child); return atf_no_error(); } #else int main(void) { verbose = 1; return run(); } #endif Index: stable/11/contrib/netbsd-tests/fs/psshfs/t_psshfs.sh =================================================================== --- stable/11/contrib/netbsd-tests/fs/psshfs/t_psshfs.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/fs/psshfs/t_psshfs.sh (revision 313680) @@ -1,274 +1,295 @@ -# $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. # # 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. # # ------------------------------------------------------------------------- # Auxiliary functions. # ------------------------------------------------------------------------- # # Skips the calling test case if puffs is not supported in the kernel # or if the calling user does not have the necessary permissions to mount # file systems. # require_puffs() { case "$($(atf_get_srcdir)/h_have_puffs)" in eacces) atf_skip "Cannot open /dev/puffs for read/write access" ;; enxio) atf_skip "puffs support not built into the kernel" ;; failed) atf_skip "Unknown error trying to access /dev/puffs" ;; yes) ;; *) atf_fail "Unknown value returned by h_have_puffs" ;; esac if [ $(id -u) -ne 0 -a $(sysctl -n vfs.generic.usermount) -eq 0 ] then atf_skip "Regular users cannot mount file systems" \ "(vfs.generic.usermount is set to 0)" fi } # # Starts a SSH server and sets up the client to access it. # Authentication is allowed and done using an RSA key exclusively, which # is generated on the fly as part of the test case. # XXX: Ideally, all the tests in this test program should be able to share # the generated key, because creating it can be a very slow process on some # machines. # start_ssh() { echo "Setting up SSH server configuration" sed -e "s,@SRCDIR@,$(atf_get_srcdir),g" -e "s,@WORKDIR@,$(pwd),g" \ $(atf_get_srcdir)/sshd_config.in >sshd_config || \ atf_fail "Failed to create sshd_config" atf_check -s eq:0 -o empty -e empty cp /usr/libexec/sftp-server . atf_check -s eq:0 -o empty -e empty \ cp $(atf_get_srcdir)/ssh_host_key . atf_check -s eq:0 -o empty -e empty \ cp $(atf_get_srcdir)/ssh_host_key.pub . atf_check -s eq:0 -o empty -e empty chmod 400 ssh_host_key atf_check -s eq:0 -o empty -e empty chmod 444 ssh_host_key.pub /usr/sbin/sshd -e -f ./sshd_config >sshd.log 2>&1 & while [ ! -f sshd.pid ]; do sleep 0.01 done echo "SSH server started (pid $(cat sshd.pid))" echo "Setting up SSH client configuration" atf_check -s eq:0 -o empty -e empty \ ssh-keygen -f ssh_user_key -t rsa -b 1024 -N "" -q atf_check -s eq:0 -o empty -e empty \ cp ssh_user_key.pub authorized_keys echo "[localhost]:10000,[127.0.0.1]:10000,[::1]:10000" \ "$(cat $(atf_get_srcdir)/ssh_host_key.pub)" >known_hosts || \ atf_fail "Failed to create known_hosts" atf_check -s eq:0 -o empty -e empty chmod 600 authorized_keys sed -e "s,@SRCDIR@,$(atf_get_srcdir),g" -e "s,@WORKDIR@,$(pwd),g" \ $(atf_get_srcdir)/ssh_config.in >ssh_config || \ atf_fail "Failed to create ssh_config" } # # Stops the SSH server spawned by start_ssh and prints diagnosis data. # stop_ssh() { if [ -f sshd.pid ]; then echo "Stopping SSH server (pid $(cat sshd.pid))" kill $(cat sshd.pid) fi if [ -f sshd.log ]; then echo "Server output was:" sed -e 's,^, ,' sshd.log fi } # # Mounts the given source directory on the target directory using psshfs. # Both directories are supposed to live on the current directory. # mount_psshfs() { atf_check -s eq:0 -o empty -e empty \ mount -t psshfs -o -F=$(pwd)/ssh_config localhost:$(pwd)/${1} ${2} } # ------------------------------------------------------------------------- # The test cases. # ------------------------------------------------------------------------- atf_test_case inode_nos cleanup inode_nos_head() { atf_set "descr" "Checks that different files get different inode" \ "numbers" } inode_nos_body() { require_puffs start_ssh mkdir root mkdir root/dir touch root/dir/file1 touch root/dir/file2 touch root/file3 touch root/file4 cat >ne_inodes.sh </dev/null && /bin/pwd' } pwd_cleanup() { umount mnt stop_ssh } atf_test_case ls cleanup ls_head() { atf_set "descr" "Uses ls, attempts to exercise puffs_cc" } ls_body() { require_puffs start_ssh mkdir mnt mkdir root mkdir root/dir touch root/dir/file1 touch root/dir/file2 touch root/file3 touch root/file4 mount_psshfs root mnt ls -l mnt & IFS=' ' lsout='dir file3 file4 mnt/dir: file1 file2 ' atf_check -s exit:0 -o inline:"$lsout" ls -R mnt } ls_cleanup() { umount mnt stop_ssh } atf_test_case setattr_cache cleanup setattr_cache_head() { atf_set "descr" "Checks that setattr caches" # Don't wait for the eternity that atf usually waits. Twenty # seconds should be good enough, except maybe on a VAX... atf_set "timeout" 20 } setattr_cache_body() { require_puffs start_ssh atf_check -s exit:0 mkdir root atf_check -s exit:0 mkdir mnt mount_psshfs root mnt atf_check -s exit:0 -x ': > mnt/loser' atf_check -s exit:0 -o save:stat stat mnt/loser # Oops -- this doesn't work. We need to stop the child of the # sshd that is handling the sftp session. atf_check -s exit:0 kill -STOP $(cat sshd.pid) atf_check -s exit:0 -x ': > mnt/loser' atf_check -s exit:0 -o file:stat stat mnt/loser } setattr_cache_cleanup() { umount mnt kill -CONT $(cat sshd.pid) 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. # ------------------------------------------------------------------------- atf_init_test_cases() { atf_add_test_case inode_nos atf_add_test_case pwd atf_add_test_case ls #atf_add_test_case setattr_cache + atf_add_test_case read_empty_file } Index: stable/11/contrib/netbsd-tests/fs/puffs/t_basic.c =================================================================== --- stable/11/contrib/netbsd-tests/fs/puffs/t_basic.c (revision 313679) +++ stable/11/contrib/netbsd-tests/fs/puffs/t_basic.c (revision 313680) @@ -1,455 +1,455 @@ -/* $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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../../h_macros.h" #include "../common/h_fsmacros.h" /* * Do a synchronous operation. When this returns, all FAF operations * have at least been delivered to the file system. * * XXX: is this really good enough considering puffs(9)-issued * callback operations? */ static void syncbar(const char *fs) { struct statvfs svb; if (rump_sys_statvfs1(fs, &svb, ST_WAIT) == -1) atf_tc_fail_errno("statvfs"); } #ifdef PUFFSDUMP static void __unused dumpopcount(struct puffstestargs *args) { size_t i; printf("VFS OPS:\n"); for (i = 0; i < MIN(puffsdump_vfsop_count, PUFFS_VFS_MAX); i++) { printf("\t%s: %d\n", puffsdump_vfsop_revmap[i], args->pta_vfs_toserv_ops[i]); } printf("VN OPS:\n"); for (i = 0; i < MIN(puffsdump_vnop_count, PUFFS_VN_MAX); i++) { printf("\t%s: %d\n", puffsdump_vnop_revmap[i], args->pta_vn_toserv_ops[i]); } } #endif ATF_TC(mount); ATF_TC_HEAD(mount, tc) { atf_tc_set_md_var(tc, "descr", "puffs+dtfs un/mount test"); } ATF_TC_BODY(mount, tc) { void *args; FSTEST_CONSTRUCTOR(tc, puffs, args); FSTEST_DESTRUCTOR(tc, puffs, args); } ATF_TC(root_reg); ATF_TC_HEAD(root_reg, tc) { atf_tc_set_md_var(tc, "descr", "root is a regular file"); } #define MAKEOPTS(...) \ char *theopts[] = {NULL, "-s", __VA_ARGS__, "dtfs", "n/a", NULL} ATF_TC_BODY(root_reg, tc) { MAKEOPTS("-r", "reg"); void *args; int fd, rv; FSTEST_CONSTRUCTOR_FSPRIV(tc, puffs, args, theopts); fd = rump_sys_open(FSTEST_MNTNAME, O_RDWR); if (fd == -1) atf_tc_fail_errno("open root"); if (rump_sys_write(fd, &fd, sizeof(fd)) != sizeof(fd)) atf_tc_fail_errno("write to root"); rv = rump_sys_mkdir(FSTEST_MNTNAME "/test", 0777); ATF_REQUIRE(errno == ENOTDIR); ATF_REQUIRE(rv == -1); rump_sys_close(fd); FSTEST_DESTRUCTOR(tc, puffs, args); } ATF_TC(root_lnk); ATF_TC_HEAD(root_lnk, tc) { atf_tc_set_md_var(tc, "descr", "root is a symbolic link"); } #define LINKSTR "/path/to/nowhere" ATF_TC_BODY(root_lnk, tc) { MAKEOPTS("-r", "lnk " LINKSTR); void *args; char buf[PATH_MAX]; ssize_t len; FSTEST_CONSTRUCTOR_FSPRIV(tc, puffs, args, theopts); if ((len = rump_sys_readlink(FSTEST_MNTNAME, buf, sizeof(buf)-1)) == -1) atf_tc_fail_errno("readlink"); buf[len] = '\0'; ATF_REQUIRE_STREQ(buf, LINKSTR); #if 0 /* XXX: unmount uses FOLLOW */ if (rump_sys_unmount("/mp", 0) == -1) atf_tc_fail_errno("unmount"); #endif } ATF_TC(root_fifo); ATF_TC_HEAD(root_fifo, tc) { atf_tc_set_md_var(tc, "descr", "root is a symbolic link"); } #define MAGICSTR "nakit ja muusiperunat maustevoilla" static void * dofifow(void *arg) { int fd = (int)(uintptr_t)arg; char buf[512]; printf("writing\n"); strcpy(buf, MAGICSTR); if (rump_sys_write(fd, buf, strlen(buf)+1) != strlen(buf)+1) atf_tc_fail_errno("write to fifo"); return NULL; } ATF_TC_BODY(root_fifo, tc) { MAKEOPTS("-r", "fifo"); void *args; pthread_t pt; char buf[512]; int fd; FSTEST_CONSTRUCTOR_FSPRIV(tc, puffs, args, theopts); fd = rump_sys_open(FSTEST_MNTNAME, O_RDWR); if (fd == -1) atf_tc_fail_errno("open fifo"); pthread_create(&pt, NULL, dofifow, (void *)(uintptr_t)fd); memset(buf, 0, sizeof(buf)); if (rump_sys_read(fd, buf, sizeof(buf)) == -1) atf_tc_fail_errno("read fifo"); ATF_REQUIRE_STREQ(buf, MAGICSTR); rump_sys_close(fd); FSTEST_DESTRUCTOR(tc, puffs, args); } ATF_TC(root_chrdev); ATF_TC_HEAD(root_chrdev, tc) { atf_tc_set_md_var(tc, "descr", "root is /dev/null"); } ATF_TC_BODY(root_chrdev, tc) { MAKEOPTS("-r", "chr 2 2"); void *args; ssize_t rv; char buf[512]; int fd; FSTEST_CONSTRUCTOR_FSPRIV(tc, puffs, args, theopts); fd = rump_sys_open(FSTEST_MNTNAME, O_RDWR); if (fd == -1) atf_tc_fail_errno("open null"); rv = rump_sys_write(fd, buf, sizeof(buf)); ATF_REQUIRE(rv == sizeof(buf)); rv = rump_sys_read(fd, buf, sizeof(buf)); ATF_REQUIRE(rv == 0); rump_sys_close(fd); FSTEST_DESTRUCTOR(tc, puffs, args); } /* * Inactive/reclaim tests */ ATF_TC(inactive_basic); ATF_TC_HEAD(inactive_basic, tc) { atf_tc_set_md_var(tc, "descr", "inactive gets called"); } ATF_TC_BODY(inactive_basic, tc) { struct puffstestargs *pargs; void *args; int fd; FSTEST_CONSTRUCTOR(tc, puffs, args); FSTEST_ENTER(); pargs = args; fd = rump_sys_open("file", O_CREAT | O_RDWR, 0777); if (fd == -1) atf_tc_fail_errno("create"); /* none yet */ ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE], 0); rump_sys_close(fd); /* one for file */ ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE], 1); FSTEST_EXIT(); /* another for the mountpoint */ ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE], 2); FSTEST_DESTRUCTOR(tc, puffs, args); } ATF_TC(inactive_reclaim); ATF_TC_HEAD(inactive_reclaim, tc) { atf_tc_set_md_var(tc, "descr", "inactive/reclaim gets called"); } ATF_TC_BODY(inactive_reclaim, tc) { struct puffstestargs *pargs; void *args; int fd; FSTEST_CONSTRUCTOR(tc, puffs, args); FSTEST_ENTER(); pargs = args; fd = rump_sys_open("file", O_CREAT | O_RDWR, 0777); if (fd == -1) atf_tc_fail_errno("create"); ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE], 0); if (rump_sys_unlink("file") == -1) atf_tc_fail_errno("remove"); ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE], 0); ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_RECLAIM], 0); 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(); FSTEST_DESTRUCTOR(tc, puffs, args); } ATF_TC(reclaim_hardlink); ATF_TC_HEAD(reclaim_hardlink, tc) { atf_tc_set_md_var(tc, "descr", "reclaim gets called only after " "final link is gone"); } ATF_TC_BODY(reclaim_hardlink, tc) { struct puffstestargs *pargs; void *args; int fd; int ianow; FSTEST_CONSTRUCTOR(tc, puffs, args); FSTEST_ENTER(); pargs = args; fd = rump_sys_open("file", O_CREAT | O_RDWR, 0777); if (fd == -1) atf_tc_fail_errno("create"); if (rump_sys_link("file", "anotherfile") == -1) atf_tc_fail_errno("create link"); rump_sys_close(fd); ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_RECLAIM], 0); /* unlink first hardlink */ if (rump_sys_unlink("file") == -1) atf_tc_fail_errno("unlink 1"); ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_RECLAIM], 0); ianow = pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE]; /* unlink second hardlink */ if (rump_sys_unlink("anotherfile") == -1) atf_tc_fail_errno("unlink 2"); syncbar(FSTEST_MNTNAME); ATF_REQUIRE(ianow < pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE]); ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_RECLAIM], 1); FSTEST_EXIT(); FSTEST_DESTRUCTOR(tc, puffs, args); } ATF_TC(unlink_accessible); ATF_TC_HEAD(unlink_accessible, tc) { atf_tc_set_md_var(tc, "descr", "open file is accessible after " "having been unlinked"); } ATF_TC_BODY(unlink_accessible, tc) { MAKEOPTS("-i", "-o", "nopagecache"); struct puffstestargs *pargs; void *args; char buf[512]; int fd, ianow; assert(sizeof(buf) > sizeof(MAGICSTR)); FSTEST_CONSTRUCTOR_FSPRIV(tc, puffs, args, theopts); FSTEST_ENTER(); pargs = args; fd = rump_sys_open("file", O_CREAT | O_RDWR, 0777); if (fd == -1) atf_tc_fail_errno("create"); if (rump_sys_write(fd, MAGICSTR, sizeof(MAGICSTR)) != sizeof(MAGICSTR)) atf_tc_fail_errno("write"); if (rump_sys_unlink("file") == -1) atf_tc_fail_errno("unlink"); ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_RECLAIM], 0); ianow = pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE]; if (rump_sys_pread(fd, buf, sizeof(buf), 0) == -1) atf_tc_fail_errno("read"); rump_sys_close(fd); 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); FSTEST_EXIT(); FSTEST_DESTRUCTOR(tc, puffs, args); } ATF_TC(signals); ATF_TC_HEAD(signals, tc) { atf_tc_set_md_var(tc, "descr", "Checks that sending a signal can " "cause an interrupt to puffs wait"); } extern struct proc *rumpns_initproc; extern void rumpns_psignal(struct proc *, int); extern void rumpns_sigclearall(struct proc *, void *, void *); ATF_TC_BODY(signals, tc) { struct stat sb; void *args; rump_boot_setsigmodel(RUMP_SIGMODEL_RECORD); FSTEST_CONSTRUCTOR(tc, puffs, args); FSTEST_ENTER(); RL(rump_sys_stat(".", &sb)); /* send SIGUSR1, should not affect puffs ops */ rump_schedule(); rumpns_psignal(rumpns_initproc, SIGUSR1); rump_unschedule(); RL(rump_sys_stat(".", &sb)); /* send SIGTERM, should get EINTR */ rump_schedule(); rumpns_psignal(rumpns_initproc, SIGTERM); rump_unschedule(); ATF_REQUIRE_ERRNO(EINTR, rump_sys_stat(".", &sb) == -1); /* clear sigmask so that we can unmount */ rump_schedule(); rumpns_sigclearall(rumpns_initproc, NULL, NULL); rump_unschedule(); FSTEST_EXIT(); FSTEST_DESTRUCTOR(tc, puffs, args); } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, mount); ATF_TP_ADD_TC(tp, root_fifo); ATF_TP_ADD_TC(tp, root_lnk); ATF_TP_ADD_TC(tp, root_reg); ATF_TP_ADD_TC(tp, root_chrdev); ATF_TP_ADD_TC(tp, inactive_basic); ATF_TP_ADD_TC(tp, inactive_reclaim); ATF_TP_ADD_TC(tp, reclaim_hardlink); ATF_TP_ADD_TC(tp, unlink_accessible); ATF_TP_ADD_TC(tp, signals); return atf_no_error(); } Index: stable/11/contrib/netbsd-tests/fs/vfs/t_vnops.c =================================================================== --- stable/11/contrib/netbsd-tests/fs/vfs/t_vnops.c (revision 313679) +++ stable/11/contrib/netbsd-tests/fs/vfs/t_vnops.c (revision 313680) @@ -1,1066 +1,1080 @@ -/* $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. * 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 #include +#include #include #include #include #include #include #include #include #include #include #include #include "../common/h_fsmacros.h" #include "../../h_macros.h" #define TESTFILE "afile" #define USES_DIRS \ if (FSTYPE_SYSVBFS(tc)) \ atf_tc_skip("directories not supported by file system") #define USES_SYMLINKS \ if (FSTYPE_SYSVBFS(tc) || FSTYPE_MSDOS(tc)) \ 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; } static void lookup_simple(const atf_tc_t *tc, const char *mountpath) { char pb[MAXPATHLEN], final[MAXPATHLEN]; 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"); ATF_REQUIRE(memcmp(&sb1, &sb2, sizeof(sb1)) == 0); } static void 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"); #define FIELD(FN) \ printf(#FN "\t%lld\t%lld\n", \ (long long)sb1.FN, (long long)sb2.FN) #define TIME(FN) \ printf(#FN "\t%lld.%ld\t%lld.%ld\n", \ (long long)sb1.FN.tv_sec, sb1.FN.tv_nsec, \ (long long)sb2.FN.tv_sec, sb2.FN.tv_nsec) FIELD(st_dev); FIELD(st_mode); FIELD(st_ino); FIELD(st_nlink); FIELD(st_uid); FIELD(st_gid); FIELD(st_rdev); TIME(st_atimespec); TIME(st_mtimespec); TIME(st_ctimespec); TIME(st_birthtimespec); FIELD(st_size); FIELD(st_blocks); FIELD(st_flags); FIELD(st_gen); #undef FIELD #undef TIME 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 dir_simple(const atf_tc_t *tc, const char *mountpath) { char pb[MAXPATHLEN]; struct stat sb; 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) atf_tc_fail_errno("stat new directory"); /* check we can remove then and that it makes them unreachable */ if (rump_sys_rmdir(pb) == -1) atf_tc_fail_errno("rmdir"); if (rump_sys_stat(pb, &sb) != -1 || errno != ENOENT) atf_tc_fail("ENOENT expected from stat"); } static void dir_notempty(const atf_tc_t *tc, const char *mountpath) { char pb[MAXPATHLEN], pb2[MAXPATHLEN]; int fd, rv; 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"); rump_sys_close(fd); rv = rump_sys_rmdir(pb); if (rv != -1 || errno != ENOTEMPTY) atf_tc_fail("non-empty directory removed succesfully"); if (rump_sys_unlink(pb2) == -1) atf_tc_fail_errno("cannot remove dir/file"); if (rump_sys_rmdir(pb) == -1) atf_tc_fail_errno("remove directory"); } static void dir_rmdirdotdot(const atf_tc_t *tc, const char *mp) { char pb[MAXPATHLEN]; int xerrno; USES_DIRS; FSTEST_ENTER(); RL(rump_sys_mkdir("test", 0777)); RL(rump_sys_chdir("test")); 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)) xerrno = ESTALE; else xerrno = ENOENT; ATF_REQUIRE_ERRNO(xerrno, rump_sys_chdir("..") == -1); FSTEST_EXIT(); } static void checkfile(const char *path, struct stat *refp) { char buf[MAXPATHLEN]; 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) atf_tc_fail("stat mismatch %d", n); n++; } static void rename_dir(const atf_tc_t *tc, const char *mp) { char pb1[MAXPATHLEN], pb2[MAXPATHLEN], pb3[MAXPATHLEN]; struct stat ref, sb; if (FSTYPE_RUMPFS(tc)) atf_tc_skip("rename not supported by file system"); 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) atf_tc_fail_errno("stat of file"); /* * First try ops which should succeed. */ /* 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) atf_tc_fail_errno("rename 3"); 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"); checkfile(pb3, &ref); /* rename directory over a non-empty directory */ if (rump_sys_rename(pb2, pb3) != -1 || errno != ENOTEMPTY) 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)); RL(rump_sys_rename(pb2, pb3)); RL(rump_sys_stat(pb1, &sb)); if (! FSTYPE_MSDOS(tc)) ATF_CHECK_EQ(sb.st_nlink, 3); RL(rump_sys_rmdir(pb3)); RL(rump_sys_rmdir(pb1)); } static void rename_dotdot(const atf_tc_t *tc, const char *mp) { if (FSTYPE_RUMPFS(tc)) atf_tc_skip("rename not supported by file system"); USES_DIRS; if (rump_sys_chdir(mp) == -1) atf_tc_fail_errno("chdir mountpoint"); if (rump_sys_mkdir("dir1", 0777) == -1) atf_tc_fail_errno("mkdir 1"); if (rump_sys_mkdir("dir2", 0777) == -1) atf_tc_fail_errno("mkdir 2"); if (rump_sys_rename("dir1", "dir1/..") != -1 || errno != EINVAL) atf_tc_fail_errno("self-dotdot to"); if (rump_sys_rename("dir1/..", "sometarget") != -1 || errno != EINVAL) atf_tc_fail_errno("self-dotdot from"); if (rump_sys_rename("dir1", "dir2/..") != -1 || errno != EINVAL) atf_tc_fail("other-dotdot"); rump_sys_chdir("/"); } static void rename_reg_nodir(const atf_tc_t *tc, const char *mp) { bool haslinks; struct stat sb; ino_t f1ino; if (FSTYPE_RUMPFS(tc)) atf_tc_skip("rename not supported by file system"); if (rump_sys_chdir(mp) == -1) atf_tc_fail_errno("chdir mountpoint"); if (FSTYPE_MSDOS(tc) || FSTYPE_SYSVBFS(tc)) haslinks = false; else haslinks = true; if (rump_sys_mknod("file1", S_IFREG | 0777, -1) == -1) atf_tc_fail_errno("create file"); if (rump_sys_mknod("file2", S_IFREG | 0777, -1) == -1) atf_tc_fail_errno("create file"); if (rump_sys_stat("file1", &sb) == -1) atf_tc_fail_errno("stat"); f1ino = sb.st_ino; if (haslinks) { if (rump_sys_link("file1", "file_link") == -1) atf_tc_fail_errno("link"); if (rump_sys_stat("file_link", &sb) == -1) atf_tc_fail_errno("stat"); ATF_REQUIRE_EQ(sb.st_ino, f1ino); ATF_REQUIRE_EQ(sb.st_nlink, 2); } if (rump_sys_stat("file2", &sb) == -1) atf_tc_fail_errno("stat"); if (rump_sys_rename("file1", "file3") == -1) atf_tc_fail_errno("rename 1"); if (rump_sys_stat("file3", &sb) == -1) atf_tc_fail_errno("stat 1"); if (haslinks) { ATF_REQUIRE_EQ(sb.st_ino, f1ino); } if (rump_sys_stat("file1", &sb) != -1 || errno != ENOENT) atf_tc_fail_errno("source 1"); if (rump_sys_rename("file3", "file2") == -1) atf_tc_fail_errno("rename 2"); if (rump_sys_stat("file2", &sb) == -1) atf_tc_fail_errno("stat 2"); if (haslinks) { ATF_REQUIRE_EQ(sb.st_ino, f1ino); } if (rump_sys_stat("file3", &sb) != -1 || errno != ENOENT) atf_tc_fail_errno("source 2"); if (haslinks) { if (rump_sys_rename("file2", "file_link") == -1) atf_tc_fail_errno("rename hardlink"); if (rump_sys_stat("file2", &sb) != -1 || errno != ENOENT) atf_tc_fail_errno("source 3"); if (rump_sys_stat("file_link", &sb) == -1) atf_tc_fail_errno("stat 2"); ATF_REQUIRE_EQ(sb.st_ino, f1ino); ATF_REQUIRE_EQ(sb.st_nlink, 1); } ATF_CHECK_ERRNO(EFAULT, rump_sys_rename("file2", NULL) == -1); ATF_CHECK_ERRNO(EFAULT, rump_sys_rename(NULL, "file2") == -1); rump_sys_chdir("/"); } /* PR kern/50607 */ static void create_many(const atf_tc_t *tc, const char *mp) { char buf[64]; int nfiles = 2324; /* #Nancy */ int i; /* takes forever with many files */ if (FSTYPE_MSDOS(tc)) nfiles /= 4; RL(rump_sys_chdir(mp)); if (FSTYPE_SYSVBFS(tc)) { /* fs doesn't support many files or subdirectories */ nfiles = 5; } else { /* msdosfs doesn't like many entries in the root directory */ RL(rump_sys_mkdir("subdir", 0777)); RL(rump_sys_chdir("subdir")); } /* create them */ #define TESTFN "testfile" 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 rump_sys_chdir("/"); } /* * Test creating files with one-character names using all possible * character values. Failures to create the file are ignored as the * characters allowed in file names vary by file system, but at least * we can check that the fs does not crash, and if the file is * successfully created, unlinking it should also succeed. */ static void create_nonalphanum(const atf_tc_t *tc, const char *mp) { char buf[64]; int i; RL(rump_sys_chdir(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"); rump_sys_chdir("/"); } static void create_nametoolong(const atf_tc_t *tc, const char *mp) { char *name; int fd; long val; size_t len; if (rump_sys_chdir(mp) == -1) atf_tc_fail_errno("chdir mountpoint"); val = rump_sys_pathconf(".", _PC_NAME_MAX); if (val == -1) atf_tc_fail_errno("pathconf"); len = val + 1; name = malloc(len+1); if (name == NULL) atf_tc_fail_errno("malloc"); memset(name, 'a', len); *(name+len) = '\0'; val = rump_sys_pathconf(".", _PC_NO_TRUNC); if (val == -1) atf_tc_fail_errno("pathconf"); fd = rump_sys_open(name, O_RDWR|O_CREAT, 0666); if (val != 0 && (fd != -1 || errno != ENAMETOOLONG)) atf_tc_fail_errno("open"); if (val == 0 && rump_sys_close(fd) == -1) atf_tc_fail_errno("close"); if (val == 0 && rump_sys_unlink(name) == -1) atf_tc_fail_errno("unlink"); free(name); rump_sys_chdir("/"); } static void create_exist(const atf_tc_t *tc, const char *mp) { const char *name = "hoge"; int fd; RL(rump_sys_chdir(mp)); RL(fd = rump_sys_open(name, O_RDWR|O_CREAT|O_EXCL, 0666)); RL(rump_sys_close(fd)); RL(rump_sys_unlink(name)); RL(fd = rump_sys_open(name, O_RDWR|O_CREAT, 0666)); RL(rump_sys_close(fd)); RL(fd = rump_sys_open(name, O_RDWR|O_CREAT, 0666)); RL(rump_sys_close(fd)); ATF_REQUIRE_ERRNO(EEXIST, (fd = rump_sys_open(name, O_RDWR|O_CREAT|O_EXCL, 0666))); RL(rump_sys_unlink(name)); RL(rump_sys_chdir("/")); } static void rename_nametoolong(const atf_tc_t *tc, const char *mp) { char *name; int res, fd; long val; size_t len; if (FSTYPE_RUMPFS(tc)) atf_tc_skip("rename not supported by file system"); if (rump_sys_chdir(mp) == -1) atf_tc_fail_errno("chdir mountpoint"); val = rump_sys_pathconf(".", _PC_NAME_MAX); if (val == -1) atf_tc_fail_errno("pathconf"); len = val + 1; name = malloc(len+1); if (name == NULL) atf_tc_fail_errno("malloc"); memset(name, 'a', len); *(name+len) = '\0'; fd = rump_sys_open("dummy", O_RDWR|O_CREAT, 0666); if (fd == -1) atf_tc_fail_errno("open"); if (rump_sys_close(fd) == -1) atf_tc_fail_errno("close"); val = rump_sys_pathconf(".", _PC_NO_TRUNC); if (val == -1) atf_tc_fail_errno("pathconf"); res = rump_sys_rename("dummy", name); if (val != 0 && (res != -1 || errno != ENAMETOOLONG)) atf_tc_fail_errno("rename"); if (val == 0 && rump_sys_unlink(name) == -1) atf_tc_fail_errno("unlink"); free(name); rump_sys_chdir("/"); } /* * Test creating a symlink whose length is "len" bytes, not including * the terminating NUL. */ static void symlink_len(const atf_tc_t *tc, const char *mp, size_t len) { char *buf; int r; USES_SYMLINKS; - RL(rump_sys_chdir(mp)); + RLF(rump_sys_chdir(mp), "%s", mp); buf = malloc(len + 1); ATF_REQUIRE(buf); memset(buf, 'a', len); buf[len] = '\0'; r = rump_sys_symlink(buf, "afile"); if (r == -1) { ATF_REQUIRE_ERRNO(ENAMETOOLONG, r); } else { RL(rump_sys_unlink("afile")); } free(buf); RL(rump_sys_chdir("/")); } static void symlink_zerolen(const atf_tc_t *tc, const char *mp) { symlink_len(tc, mp, 0); } static void symlink_long(const atf_tc_t *tc, const char *mp) { /* * Test lengths close to powers of two, as those are likely * to be edge cases. */ size_t len; int fuzz; for (len = 2; len <= 65536; len *= 2) { for (fuzz = -1; fuzz <= 1; fuzz++) { symlink_len(tc, mp, len + fuzz); } } } static void symlink_root(const atf_tc_t *tc, const char *mp) { USES_SYMLINKS; RL(rump_sys_chdir(mp)); RL(rump_sys_symlink("/", "foo")); RL(rump_sys_chdir("foo")); } static void attrs(const atf_tc_t *tc, const char *mp) { struct stat sb, sb2; struct timeval tv[2]; int fd; FSTEST_ENTER(); RL(fd = rump_sys_open(TESTFILE, O_RDWR | O_CREAT, 0755)); RL(rump_sys_close(fd)); RL(rump_sys_stat(TESTFILE, &sb)); if (!(FSTYPE_MSDOS(tc) || FSTYPE_SYSVBFS(tc))) { RL(rump_sys_chown(TESTFILE, 1, 2)); sb.st_uid = 1; sb.st_gid = 2; RL(rump_sys_chmod(TESTFILE, 0123)); sb.st_mode = (sb.st_mode & ~ACCESSPERMS) | 0123; } tv[0].tv_sec = 1000000000; /* need something >1980 for msdosfs */ tv[0].tv_usec = 1; tv[1].tv_sec = 1000000002; /* need even seconds for msdosfs */ tv[1].tv_usec = 3; RL(rump_sys_utimes(TESTFILE, tv)); RL(rump_sys_utimes(TESTFILE, tv)); /* XXX: utimes & birthtime */ sb.st_atimespec.tv_sec = 1000000000; sb.st_atimespec.tv_nsec = 1000; sb.st_mtimespec.tv_sec = 1000000002; sb.st_mtimespec.tv_nsec = 3000; RL(rump_sys_stat(TESTFILE, &sb2)); #define CHECK(a) ATF_REQUIRE_EQ(sb.a, sb2.a) if (!(FSTYPE_MSDOS(tc) || FSTYPE_SYSVBFS(tc))) { CHECK(st_uid); CHECK(st_gid); CHECK(st_mode); } if (!FSTYPE_MSDOS(tc)) { /* msdosfs has only access date, not time */ CHECK(st_atimespec.tv_sec); } CHECK(st_mtimespec.tv_sec); if (!(FSTYPE_EXT2FS(tc) || FSTYPE_MSDOS(tc) || FSTYPE_SYSVBFS(tc) || FSTYPE_V7FS(tc))) { CHECK(st_atimespec.tv_nsec); CHECK(st_mtimespec.tv_nsec); } #undef CHECK FSTEST_EXIT(); } static void fcntl_lock(const atf_tc_t *tc, const char *mp) { int fd, fd2; struct flock l; struct lwp *lwp1, *lwp2; FSTEST_ENTER(); l.l_pid = 0; l.l_start = l.l_len = 1024; l.l_type = F_RDLCK | F_WRLCK; l.l_whence = SEEK_END; lwp1 = rump_pub_lwproc_curlwp(); RL(fd = rump_sys_open(TESTFILE, O_RDWR | O_CREAT, 0755)); RL(rump_sys_ftruncate(fd, 8192)); RL(rump_sys_fcntl(fd, F_SETLK, &l)); /* Next, we fork and try to lock the same area */ RZ(rump_pub_lwproc_rfork(RUMP_RFCFDG)); lwp2 = rump_pub_lwproc_curlwp(); RL(fd2 = rump_sys_open(TESTFILE, O_RDWR, 0)); ATF_REQUIRE_ERRNO(EAGAIN, rump_sys_fcntl(fd2, F_SETLK, &l)); /* Switch back and unlock... */ rump_pub_lwproc_switch(lwp1); l.l_type = F_UNLCK; RL(rump_sys_fcntl(fd, F_SETLK, &l)); /* ... and try to lock again */ rump_pub_lwproc_switch(lwp2); l.l_type = F_RDLCK | F_WRLCK; RL(rump_sys_fcntl(fd2, F_SETLK, &l)); RL(rump_sys_close(fd2)); rump_pub_lwproc_releaselwp(); RL(rump_sys_close(fd)); FSTEST_EXIT(); } static int flock_compare(const void *p, const void *q) { int a = ((const struct flock *)p)->l_start; int b = ((const struct flock *)q)->l_start; return a < b ? -1 : (a > b ? 1 : 0); } /* * Find all locks set by fcntl_getlock_pids test * using GETLK for a range [start, start+end], and, * if there is a blocking lock, recursively find * all locks to the left (toward the beginning of * a file) and to the right of the lock. * The function also understands "until end of file" * convention when len==0. */ static unsigned int fcntl_getlocks(int fildes, off_t start, off_t len, struct flock *lock, struct flock *end) { unsigned int rv = 0; const struct flock l = { start, len, 0, F_RDLCK, SEEK_SET }; if (lock == end) return rv; RL(rump_sys_fcntl(fildes, F_GETLK, &l)); if (l.l_type == F_UNLCK) return rv; *lock++ = l; rv += 1; ATF_REQUIRE(l.l_whence == SEEK_SET); if (l.l_start > start) { unsigned int n = fcntl_getlocks(fildes, start, l.l_start - start, lock, end); rv += n; lock += n; if (lock == end) return rv; } if (l.l_len == 0) /* does l spans until the end? */ return rv; if (len == 0) /* are we looking for locks until the end? */ { rv += fcntl_getlocks(fildes, l.l_start + l.l_len, len, lock, end); } else if (l.l_start + l.l_len < start + len) { len -= l.l_start + l.l_len - start; rv += fcntl_getlocks(fildes, l.l_start + l.l_len, len, lock, end); } return rv; } static void fcntl_getlock_pids(const atf_tc_t *tc, const char *mp) { /* test non-overlaping ranges */ struct flock expect[4]; const struct flock lock[4] = { { 0, 2, 0, F_WRLCK, SEEK_SET }, { 2, 1, 0, F_WRLCK, SEEK_SET }, { 7, 5, 0, F_WRLCK, SEEK_SET }, { 4, 3, 0, F_WRLCK, SEEK_SET }, }; /* Add extra element to make sure recursion does't stop at array end */ struct flock result[5]; /* Add 5th process */ int fd[5]; pid_t pid[5]; struct lwp *lwp[5]; unsigned int i, j; const off_t sz = 8192; int omode = 0755; int oflags = O_RDWR | O_CREAT; memcpy(expect, lock, sizeof(lock)); FSTEST_ENTER(); /* * First, we create 4 processes and let each lock a range of the * file. Note that the third and fourth processes lock in * "reverse" order, i.e. the greater pid locks a range before * the lesser pid. * Then, we create 5th process which doesn't lock anything. */ for (i = 0; i < __arraycount(lwp); i++) { RZ(rump_pub_lwproc_rfork(RUMP_RFCFDG)); lwp[i] = rump_pub_lwproc_curlwp(); pid[i] = rump_sys_getpid(); RL(fd[i] = rump_sys_open(TESTFILE, oflags, omode)); oflags = O_RDWR; omode = 0; RL(rump_sys_ftruncate(fd[i], sz)); if (i < __arraycount(lock)) { RL(rump_sys_fcntl(fd[i], F_SETLK, &lock[i])); expect[i].l_pid = pid[i]; } } qsort(expect, __arraycount(expect), sizeof(expect[0]), &flock_compare); /* * In the context of each process, recursively find all locks * that would block the current process. Processes 1-4 don't * see their own lock, we insert it to simplify checks. * Process 5 sees all 4 locks. */ for (i = 0; i < __arraycount(lwp); i++) { unsigned int nlocks; rump_pub_lwproc_switch(lwp[i]); memset(result, 0, sizeof(result)); nlocks = fcntl_getlocks(fd[i], 0, sz, result, result + __arraycount(result)); if (i < __arraycount(lock)) { ATF_REQUIRE(nlocks < __arraycount(result)); result[nlocks] = lock[i]; result[nlocks].l_pid = pid[i]; nlocks++; } ATF_CHECK_EQ(nlocks, __arraycount(expect)); qsort(result, nlocks, sizeof(result[0]), &flock_compare); for (j = 0; j < nlocks; j++) { ATF_CHECK_EQ(result[j].l_start, expect[j].l_start ); ATF_CHECK_EQ(result[j].l_len, expect[j].l_len ); ATF_CHECK_EQ(result[j].l_pid, expect[j].l_pid ); ATF_CHECK_EQ(result[j].l_type, expect[j].l_type ); ATF_CHECK_EQ(result[j].l_whence, expect[j].l_whence); } } /* * Release processes. This also releases the fds and locks * making fs unmount possible */ for (i = 0; i < __arraycount(lwp); i++) { rump_pub_lwproc_switch(lwp[i]); rump_pub_lwproc_releaselwp(); } FSTEST_EXIT(); } static void access_simple(const atf_tc_t *tc, const char *mp) { int fd; int tmode; FSTEST_ENTER(); RL(fd = rump_sys_open("tfile", O_CREAT | O_RDWR, 0777)); RL(rump_sys_close(fd)); #define ALLACC (F_OK | X_OK | W_OK | R_OK) if (FSTYPE_SYSVBFS(tc) || FSTYPE_MSDOS(tc)) tmode = F_OK; else tmode = ALLACC; RL(rump_sys_access("tfile", tmode)); /* PR kern/44648 */ ATF_REQUIRE_ERRNO(EINVAL, rump_sys_access("tfile", ALLACC+1) == -1); #undef ALLACC FSTEST_EXIT(); } static void read_directory(const atf_tc_t *tc, const char *mp) { char buf[1024]; int fd, res; ssize_t size; FSTEST_ENTER(); fd = rump_sys_open(".", O_DIRECTORY | O_RDONLY, 0777); ATF_REQUIRE(fd != -1); size = rump_sys_pread(fd, buf, sizeof(buf), 0); ATF_CHECK(size != -1 || errno == EISDIR); size = rump_sys_read(fd, buf, sizeof(buf)); ATF_CHECK(size != -1 || errno == EISDIR); res = rump_sys_close(fd); ATF_REQUIRE(res != -1); FSTEST_EXIT(); } static void lstat_symlink(const atf_tc_t *tc, const char *mp) { const char *src, *dst; int res; struct stat st; USES_SYMLINKS; FSTEST_ENTER(); src = "source"; dst = "destination"; res = rump_sys_symlink(src, dst); ATF_REQUIRE(res != -1); res = rump_sys_lstat(dst, &st); ATF_REQUIRE(res != -1); ATF_CHECK(S_ISLNK(st.st_mode) != 0); ATF_CHECK(st.st_size == (off_t)strlen(src)); FSTEST_EXIT(); } ATF_TC_FSAPPLY(lookup_simple, "simple lookup (./.. on root)"); ATF_TC_FSAPPLY(lookup_complex, "lookup of non-dot entries"); ATF_TC_FSAPPLY(dir_simple, "mkdir/rmdir"); ATF_TC_FSAPPLY(dir_notempty, "non-empty directories cannot be removed"); ATF_TC_FSAPPLY(dir_rmdirdotdot, "remove .. and try to cd out (PR kern/44657)"); ATF_TC_FSAPPLY(rename_dir, "exercise various directory renaming ops " "(PR kern/44288)"); ATF_TC_FSAPPLY(rename_dotdot, "rename dir .. (PR kern/43617)"); ATF_TC_FSAPPLY(rename_reg_nodir, "rename regular files, no subdirectories"); ATF_TC_FSAPPLY(create_nametoolong, "create file with name too long"); ATF_TC_FSAPPLY(create_exist, "create with O_EXCL"); ATF_TC_FSAPPLY(rename_nametoolong, "rename to file with name too long"); ATF_TC_FSAPPLY(symlink_zerolen, "symlink with target of length 0"); ATF_TC_FSAPPLY(symlink_long, "symlink with target of length > 0"); ATF_TC_FSAPPLY(symlink_root, "symlink to root directory"); ATF_TC_FSAPPLY(attrs, "check setting attributes works"); ATF_TC_FSAPPLY(fcntl_lock, "check fcntl F_SETLK"); ATF_TC_FSAPPLY(fcntl_getlock_pids,"fcntl F_GETLK w/ many procs, PR kern/44494"); ATF_TC_FSAPPLY(access_simple, "access(2)"); ATF_TC_FSAPPLY(read_directory, "read(2) on directories"); ATF_TC_FSAPPLY(lstat_symlink, "lstat(2) values for symbolic links"); #undef FSTEST_IMGSIZE #define FSTEST_IMGSIZE (1024*1024*64) ATF_TC_FSAPPLY(create_many, "create many directory entries"); ATF_TC_FSAPPLY(create_nonalphanum, "non-alphanumeric filenames"); ATF_TP_ADD_TCS(tp) { ATF_TP_FSAPPLY(lookup_simple); ATF_TP_FSAPPLY(lookup_complex); ATF_TP_FSAPPLY(dir_simple); ATF_TP_FSAPPLY(dir_notempty); ATF_TP_FSAPPLY(dir_rmdirdotdot); ATF_TP_FSAPPLY(rename_dir); ATF_TP_FSAPPLY(rename_dotdot); ATF_TP_FSAPPLY(rename_reg_nodir); ATF_TP_FSAPPLY(create_many); ATF_TP_FSAPPLY(create_nonalphanum); ATF_TP_FSAPPLY(create_nametoolong); ATF_TP_FSAPPLY(create_exist); ATF_TP_FSAPPLY(rename_nametoolong); ATF_TP_FSAPPLY(symlink_zerolen); ATF_TP_FSAPPLY(symlink_long); ATF_TP_FSAPPLY(symlink_root); ATF_TP_FSAPPLY(attrs); ATF_TP_FSAPPLY(fcntl_lock); ATF_TP_FSAPPLY(fcntl_getlock_pids); ATF_TP_FSAPPLY(access_simple); ATF_TP_FSAPPLY(read_directory); ATF_TP_FSAPPLY(lstat_symlink); return atf_no_error(); } Index: stable/11/contrib/netbsd-tests/h_macros.h =================================================================== --- stable/11/contrib/netbsd-tests/h_macros.h (revision 313679) +++ stable/11/contrib/netbsd-tests/h_macros.h (revision 313680) @@ -1,85 +1,87 @@ -/* $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. * 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. */ #ifndef SRC_TESTS_H_MACROS_H_ #define SRC_TESTS_H_MACROS_H_ #include #include #include #include #include #include #include #define REQUIRE_LIBC(x, v) \ ATF_REQUIRE_MSG((x) != (v), "%s: %s", #x, strerror(errno)) #define CHECK_LIBC(x, v) \ 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; \ ATF_REQUIRE_MSG(RZ_rv == 0, "%s: %s", #x, strerror(RZ_rv)); \ } while (/*CONSTCOND*/0) __dead static __inline __printflike(1, 2) void atf_tc_fail_errno(const char *fmt, ...) { va_list ap; char buf[1024]; int sverrno = errno; va_start(ap, fmt); vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); strlcat(buf, ": ", sizeof(buf)); strlcat(buf, strerror(sverrno), sizeof(buf)); atf_tc_fail("%s", buf); } static __inline void tests_makegarbage(void *space, size_t len) { uint16_t *sb = space; uint16_t randval; while (len >= sizeof(randval)) { *sb++ = (uint16_t)random(); len -= sizeof(*sb); } randval = (uint16_t)random(); memcpy(sb, &randval, len); } #endif Index: stable/11/contrib/netbsd-tests/kernel/msg.h =================================================================== --- stable/11/contrib/netbsd-tests/kernel/msg.h (nonexistent) +++ stable/11/contrib/netbsd-tests/kernel/msg.h (revision 313680) @@ -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; +} Property changes on: stable/11/contrib/netbsd-tests/kernel/msg.h ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/kernel/t_mqueue.c =================================================================== --- stable/11/contrib/netbsd-tests/kernel/t_mqueue.c (revision 313679) +++ stable/11/contrib/netbsd-tests/kernel/t_mqueue.c (revision 313680) @@ -1,156 +1,157 @@ -/* $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. * * This file is in the Public Domain. */ #ifdef __FreeBSD__ #include #include #include "freebsd_test_suite/macros.h" #endif #include +#include #include #include #include #include #include #include #define MQ_PRIO_BASE 24 static void send_msgs(mqd_t mqfd) { char msg[2]; msg[1] = '\0'; msg[0] = 'a'; ATF_REQUIRE_MSG(mq_send(mqfd, msg, sizeof(msg), MQ_PRIO_BASE) != -1, "mq_send 1 failed: %d", errno); msg[0] = 'b'; ATF_REQUIRE_MSG(mq_send(mqfd, msg, sizeof(msg), MQ_PRIO_BASE + 1) != -1, "mq_send 2 failed: %d", errno); msg[0] = 'c'; ATF_REQUIRE_MSG(mq_send(mqfd, msg, sizeof(msg), MQ_PRIO_BASE) != -1, "mq_send 3 failed: %d", errno); msg[0] = 'd'; ATF_REQUIRE_MSG(mq_send(mqfd, msg, sizeof(msg), MQ_PRIO_BASE - 1) != -1, "mq_send 4 failed: %d", errno); msg[0] = 'e'; ATF_REQUIRE_MSG(mq_send(mqfd, msg, sizeof(msg), 0) != -1, "mq_send 5 failed: %d", errno); msg[0] = 'f'; ATF_REQUIRE_MSG(mq_send(mqfd, msg, sizeof(msg), MQ_PRIO_BASE + 1) != -1, "mq_send 6 failed: %d", errno); } static void receive_msgs(mqd_t mqfd) { struct mq_attr mqa; char *m; unsigned p; int len; ATF_REQUIRE_MSG(mq_getattr(mqfd, &mqa) != -1, "mq_getattr failed %d", errno); len = mqa.mq_msgsize; m = calloc(1, len); ATF_REQUIRE_MSG(m != NULL, "calloc failed"); ATF_REQUIRE_MSG(mq_receive(mqfd, m, len, &p) != -1, "mq_receive 1 failed: %d", errno); ATF_REQUIRE_MSG(p == (MQ_PRIO_BASE + 1) && m[0] == 'b', "mq_receive 1 prio/data mismatch"); ATF_REQUIRE_MSG(mq_receive(mqfd, m, len, &p) != -1, "mq_receive 2 failed: %d", errno); ATF_REQUIRE_MSG(p == (MQ_PRIO_BASE + 1) && m[0] == 'f', "mq_receive 2 prio/data mismatch"); ATF_REQUIRE_MSG(mq_receive(mqfd, m, len, &p) != -1, "mq_receive 3 failed: %d", errno); ATF_REQUIRE_MSG(p == MQ_PRIO_BASE && m[0] == 'a', "mq_receive 3 prio/data mismatch"); ATF_REQUIRE_MSG(mq_receive(mqfd, m, len, &p) != -1, "mq_receive 4 failed: %d", errno); ATF_REQUIRE_MSG(p == MQ_PRIO_BASE && m[0] == 'c', "mq_receive 4 prio/data mismatch"); ATF_REQUIRE_MSG(mq_receive(mqfd, m, len, &p) != -1, "mq_receive 5 failed: %d", errno); ATF_REQUIRE_MSG(p == (MQ_PRIO_BASE - 1) && m[0] == 'd', "mq_receive 5 prio/data mismatch"); ATF_REQUIRE_MSG(mq_receive(mqfd, m, len, &p) != -1, "mq_receive 6 failed: %d", errno); ATF_REQUIRE_MSG(p == 0 && m[0] == 'e', "mq_receive 6 prio/data mismatch"); } ATF_TC(mqueue); ATF_TC_HEAD(mqueue, tc) { atf_tc_set_md_var(tc, "timeout", "3"); atf_tc_set_md_var(tc, "descr", "Checks mqueue send/receive"); } ATF_TC_BODY(mqueue, tc) { int status; char *tmpdir; char template[32]; char mq_name[64]; #ifdef __FreeBSD__ ATF_REQUIRE_KERNEL_MODULE("mqueuefs"); #endif strlcpy(template, "./t_mqueue.XXXXXX", sizeof(template)); tmpdir = mkdtemp(template); ATF_REQUIRE_MSG(tmpdir != NULL, "mkdtemp failed: %d", errno); #ifdef __FreeBSD__ snprintf(mq_name, sizeof(mq_name), "/t_mqueue"); #else snprintf(mq_name, sizeof(mq_name), "%s/mq", tmpdir); #endif mqd_t mqfd; mqfd = mq_open(mq_name, O_RDWR | O_CREAT, S_IRUSR | S_IRWXG | S_IROTH, NULL); #ifdef __FreeBSD__ ATF_REQUIRE_MSG(mqfd != (mqd_t)-1, "mq_open failed: %d", errno); #else ATF_REQUIRE_MSG(mqfd != -1, "mq_open failed: %d", errno); #endif send_msgs(mqfd); receive_msgs(mqfd); status = mq_close(mqfd); ATF_REQUIRE_MSG(status == 0, "mq_close failed: %d", errno); } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, mqueue); return atf_no_error(); } Index: stable/11/contrib/netbsd-tests/kernel/t_ptrace.c =================================================================== --- stable/11/contrib/netbsd-tests/kernel/t_ptrace.c (nonexistent) +++ stable/11/contrib/netbsd-tests/kernel/t_ptrace.c (revision 313680) @@ -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 +__RCSID("$NetBSD: t_ptrace.c,v 1.17 2016/11/13 22:59:31 kamil Exp $"); + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#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(); +} Property changes on: stable/11/contrib/netbsd-tests/kernel/t_ptrace.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait.c =================================================================== --- stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait.c (nonexistent) +++ stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait.c (revision 313680) @@ -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 +__RCSID("$NetBSD: t_ptrace_wait.c,v 1.53 2017/01/10 05:08:24 kamil Exp $"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#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(); +} Property changes on: stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait.h =================================================================== --- stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait.h (nonexistent) +++ stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait.h (revision 313680) @@ -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 Property changes on: stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait.h ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait3.c =================================================================== --- stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait3.c (nonexistent) +++ stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait3.c (revision 313680) @@ -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" Property changes on: stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait3.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait4.c =================================================================== --- stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait4.c (nonexistent) +++ stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait4.c (revision 313680) @@ -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" Property changes on: stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait4.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait6.c =================================================================== --- stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait6.c (nonexistent) +++ stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait6.c (revision 313680) @@ -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" Property changes on: stable/11/contrib/netbsd-tests/kernel/t_ptrace_wait6.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/kernel/t_ptrace_waitid.c =================================================================== --- stable/11/contrib/netbsd-tests/kernel/t_ptrace_waitid.c (nonexistent) +++ stable/11/contrib/netbsd-tests/kernel/t_ptrace_waitid.c (revision 313680) @@ -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" Property changes on: stable/11/contrib/netbsd-tests/kernel/t_ptrace_waitid.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/kernel/t_ptrace_waitpid.c =================================================================== --- stable/11/contrib/netbsd-tests/kernel/t_ptrace_waitpid.c (nonexistent) +++ stable/11/contrib/netbsd-tests/kernel/t_ptrace_waitpid.c (revision 313680) @@ -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" Property changes on: stable/11/contrib/netbsd-tests/kernel/t_ptrace_waitpid.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/lib/libc/arch/sparc64/exec_prot_support.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/libc/arch/sparc64/exec_prot_support.c (revision 313679) +++ stable/11/contrib/netbsd-tests/lib/libc/arch/sparc64/exec_prot_support.c (revision 313680) @@ -1,41 +1,42 @@ -/* $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. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation * by Jean-Yves Migeon. * * 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 -__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; } Index: stable/11/contrib/netbsd-tests/lib/libc/arch/sparc64/return_one.S =================================================================== --- stable/11/contrib/netbsd-tests/lib/libc/arch/sparc64/return_one.S (revision 313679) +++ stable/11/contrib/netbsd-tests/lib/libc/arch/sparc64/return_one.S (revision 313680) @@ -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 -.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: Index: stable/11/contrib/netbsd-tests/lib/libc/db/h_db.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/libc/db/h_db.c (revision 313679) +++ stable/11/contrib/netbsd-tests/lib/libc/db/h_db.c (revision 313680) @@ -1,731 +1,794 @@ -/* $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 * The Regents of the University of California. 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. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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 #ifndef lint __COPYRIGHT("@(#) Copyright (c) 1992, 1993, 1994\ The Regents of the University of California. All rights reserved."); #endif /* not lint */ #ifndef lint #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 */ #include #include #include #include #include #include #include #include #include #include #include #include #include +#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 *); static void rem(DB *, DBT *); static const char *sflags(int); static void synk(DB *); static void *rfile(char *, size_t *); static void seq(DB *, DBT *); static u_int setflags(char *); static void *setinfo(DBTYPE, char *); +#ifdef __NetBSD__ +static void unlinkpg(DB *); +#endif static void usage(void) __attribute__((__noreturn__)); static void *xcopy(void *, size_t); static void chkcmd(enum S); static void chkdata(enum S); static void chkkey(enum S); #ifdef STATISTICS extern void __bt_stat(DB *); #endif +#ifdef __NetBSD__ +extern int __bt_relink(BTREE *, PAGE *); +#endif static DBTYPE type; /* Database type. */ static void *infop; /* Iflags. */ static size_t lineno; /* Current line in test script. */ static u_int flags; /* Current DB flags. */ static int ofd = STDOUT_FILENO; /* Standard output fd. */ static DB *XXdbp; /* Global for gdb. */ static size_t XXlineno; /* Fast breakpoint for gdb. */ int main(int argc, char *argv[]) { extern int optind; extern char *optarg; enum S command = COMMAND, state; DB *dbp; DBT data, key, keydata; size_t len; int ch, oflags, sflag; char *fname, *infoarg, *p, *t, buf[8 * 1024]; bool unlink_dbfile; infoarg = NULL; fname = NULL; unlink_dbfile = false; oflags = O_CREAT | O_RDWR; sflag = 0; while ((ch = getopt(argc, argv, "f:i:lo:s")) != -1) switch (ch) { case 'f': fname = optarg; break; case 'i': infoarg = optarg; break; case 'l': oflags |= DB_LOCK; break; case 'o': if ((ofd = open(optarg, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) err(1, "Cannot create `%s'", optarg); break; case 's': sflag = 1; break; case '?': default: usage(); } argc -= optind; argv += optind; if (argc != 2) usage(); /* Set the type. */ type = dbtype(*argv++); /* Open the descriptor file. */ if (strcmp(*argv, "-") && freopen(*argv, "r", stdin) == NULL) err(1, "Cannot reopen `%s'", *argv); /* Set up the db structure as necessary. */ if (infoarg == NULL) infop = NULL; else for (p = strtok(infoarg, ",\t "); p != NULL; p = strtok(0, ",\t ")) if (*p != '\0') infop = setinfo(type, p); /* * Open the DB. Delete any preexisting copy, you almost never * want it around, and it often screws up tests. */ if (fname == NULL) { const char *q = getenv("TMPDIR"); if (q == NULL) q = "/var/tmp"; (void)snprintf(buf, sizeof(buf), "%s/__dbtest", q); fname = buf; (void)unlink(buf); unlink_dbfile = true; } else if (!sflag) (void)unlink(fname); if ((dbp = dbopen(fname, oflags, S_IRUSR | S_IWUSR, type, infop)) == NULL) err(1, "Cannot dbopen `%s'", fname); XXdbp = dbp; if (unlink_dbfile) (void)unlink(fname); state = COMMAND; for (lineno = 1; (p = fgets(buf, sizeof(buf), stdin)) != NULL; ++lineno) { /* Delete the newline, displaying the key/data is easier. */ if (ofd == STDOUT_FILENO && (t = strchr(p, '\n')) != NULL) *t = '\0'; if ((len = strlen(buf)) == 0 || isspace((unsigned char)*p) || *p == '#') continue; /* Convenient gdb break point. */ if (XXlineno == lineno) XXlineno = 1; switch (*p) { case 'c': /* compare */ chkcmd(state); state = KEY; command = COMPARE; break; case 'e': /* echo */ chkcmd(state); /* Don't display the newline, if CR at EOL. */ if (p[len - 2] == '\r') --len; if (write(ofd, p + 1, len - 1) != (ssize_t)len - 1 || write(ofd, "\n", 1) != 1) err(1, "write failed"); break; case 'g': /* get */ chkcmd(state); state = KEY; command = GET; break; case 'p': /* put */ chkcmd(state); state = KEY; command = PUT; break; case 'r': /* remove */ chkcmd(state); if (flags == R_CURSOR) { rem(dbp, &key); state = COMMAND; } else { state = KEY; command = REMOVE; } break; case 'S': /* sync */ chkcmd(state); synk(dbp); state = COMMAND; break; case 's': /* seq */ chkcmd(state); if (flags == R_CURSOR) { state = KEY; command = SEQ; } else seq(dbp, &key); break; case 'f': flags = setflags(p + 1); break; case 'D': /* data file */ chkdata(state); data.data = rfile(p + 1, &data.size); goto ldata; case 'd': /* data */ chkdata(state); data.data = xcopy(p + 1, len - 1); data.size = len - 1; ldata: switch (command) { case COMPARE: compare(&keydata, &data); break; case PUT: put(dbp, &key, &data); break; default: errx(1, "line %zu: command doesn't take data", lineno); } if (type != DB_RECNO) free(key.data); free(data.data); state = COMMAND; break; case 'K': /* key file */ chkkey(state); if (type == DB_RECNO) errx(1, "line %zu: 'K' not available for recno", lineno); key.data = rfile(p + 1, &key.size); goto lkey; case 'k': /* key */ chkkey(state); if (type == DB_RECNO) { static recno_t recno; recno = atoi(p + 1); key.data = &recno; key.size = sizeof(recno); } else { key.data = xcopy(p + 1, len - 1); key.size = len - 1; } lkey: switch (command) { case COMPARE: getdata(dbp, &key, &keydata); state = DATA; break; case GET: get(dbp, &key); if (type != DB_RECNO) free(key.data); state = COMMAND; break; case PUT: state = DATA; break; case REMOVE: rem(dbp, &key); if ((type != DB_RECNO) && (flags != R_CURSOR)) free(key.data); state = COMMAND; break; case SEQ: seq(dbp, &key); if ((type != DB_RECNO) && (flags != R_CURSOR)) free(key.data); state = COMMAND; break; default: errx(1, "line %zu: command doesn't take a key", lineno); } break; case 'o': - dump(dbp, p[1] == 'r'); + dump(dbp, p[1] == 'r', 0); break; +#ifdef __NetBSD__ + case 'O': + dump(dbp, p[1] == 'r', 1); + break; + case 'u': + unlinkpg(dbp); + break; +#endif default: errx(1, "line %zu: %s: unknown command character", lineno, p); } } #ifdef STATISTICS /* * -l must be used (DB_LOCK must be set) for this to be * used, otherwise a page will be locked and it will fail. */ if (type == DB_BTREE && oflags & DB_LOCK) __bt_stat(dbp); #endif if ((*dbp->close)(dbp)) err(1, "db->close failed"); (void)close(ofd); return 0; } #define NOOVERWRITE "put failed, would overwrite key\n" static void compare(DBT *db1, DBT *db2) { size_t len; u_char *p1, *p2; if (db1->size != db2->size) printf("compare failed: key->data len %zu != data len %zu\n", db1->size, db2->size); len = MIN(db1->size, db2->size); for (p1 = db1->data, p2 = db2->data; len--;) if (*p1++ != *p2++) { printf("compare failed at offset %lu\n", (unsigned long)(p1 - (u_char *)db1->data)); break; } } static void get(DB *dbp, DBT *kp) { DBT data; switch ((*dbp->get)(dbp, kp, &data, flags)) { case 0: (void)write(ofd, data.data, data.size); if (ofd == STDOUT_FILENO) (void)write(ofd, "\n", 1); break; case -1: err(1, "line %zu: get failed", lineno); /* NOTREACHED */ case 1: #define NOSUCHKEY "get failed, no such key\n" if (ofd != STDOUT_FILENO) (void)write(ofd, NOSUCHKEY, sizeof(NOSUCHKEY) - 1); else (void)fprintf(stderr, "%zu: %.*s: %s", lineno, (int)MIN(kp->size, 20), (const char *)kp->data, NOSUCHKEY); #undef NOSUCHKEY break; } } static void getdata(DB *dbp, DBT *kp, DBT *dp) { switch ((*dbp->get)(dbp, kp, dp, flags)) { case 0: return; case -1: err(1, "line %zu: getdata failed", lineno); /* NOTREACHED */ case 1: errx(1, "line %zu: getdata failed, no such key", lineno); /* NOTREACHED */ } } static void put(DB *dbp, DBT *kp, DBT *dp) { switch ((*dbp->put)(dbp, kp, dp, flags)) { case 0: break; case -1: err(1, "line %zu: put failed", lineno); /* NOTREACHED */ case 1: (void)write(ofd, NOOVERWRITE, sizeof(NOOVERWRITE) - 1); break; } } static void rem(DB *dbp, DBT *kp) { switch ((*dbp->del)(dbp, kp, flags)) { case 0: break; case -1: err(1, "line %zu: rem failed", lineno); /* NOTREACHED */ case 1: #define NOSUCHKEY "rem failed, no such key\n" if (ofd != STDOUT_FILENO) (void)write(ofd, NOSUCHKEY, sizeof(NOSUCHKEY) - 1); else if (flags != R_CURSOR) (void)fprintf(stderr, "%zu: %.*s: %s", lineno, (int)MIN(kp->size, 20), (const char *)kp->data, NOSUCHKEY); else (void)fprintf(stderr, "%zu: rem of cursor failed\n", lineno); #undef NOSUCHKEY break; } } static void synk(DB *dbp) { switch ((*dbp->sync)(dbp, flags)) { case 0: break; case -1: err(1, "line %zu: synk failed", lineno); /* NOTREACHED */ } } static void seq(DB *dbp, DBT *kp) { DBT data; switch (dbp->seq(dbp, kp, &data, flags)) { case 0: (void)write(ofd, data.data, data.size); if (ofd == STDOUT_FILENO) (void)write(ofd, "\n", 1); break; case -1: err(1, "line %zu: seq failed", lineno); /* NOTREACHED */ case 1: #define NOSUCHKEY "seq failed, no such key\n" if (ofd != STDOUT_FILENO) (void)write(ofd, NOSUCHKEY, sizeof(NOSUCHKEY) - 1); else if (flags == R_CURSOR) (void)fprintf(stderr, "%zu: %.*s: %s", lineno, (int)MIN(kp->size, 20), (const char *)kp->data, NOSUCHKEY); else (void)fprintf(stderr, "%zu: seq (%s) failed\n", lineno, sflags(flags)); #undef NOSUCHKEY break; } } 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; +#ifdef __NetBSD__ + nflags = recurse ? R_RPREV : R_PREV; +#else nflags = R_PREV; +#endif } else { xflags = R_FIRST; +#ifdef __NetBSD__ + nflags = recurse ? R_RNEXT : R_NEXT; +#else nflags = R_NEXT; +#endif } for (;; xflags = nflags) switch (dbp->seq(dbp, &key, &data, xflags)) { case 0: (void)write(ofd, data.data, data.size); if (ofd == STDOUT_FILENO) (void)write(ofd, "\n", 1); break; case 1: goto done; case -1: err(1, "line %zu: (dump) seq failed", lineno); /* NOTREACHED */ } done: return; } +#ifdef __NetBSD__ +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); +} +#endif + static u_int setflags(char *s) { char *p; for (; isspace((unsigned char)*s); ++s); if (*s == '\n' || *s == '\0') return 0; if ((p = strchr(s, '\n')) != NULL) *p = '\0'; if (!strcmp(s, "R_CURSOR")) return R_CURSOR; if (!strcmp(s, "R_FIRST")) return R_FIRST; if (!strcmp(s, "R_IAFTER")) return R_IAFTER; if (!strcmp(s, "R_IBEFORE")) return R_IBEFORE; if (!strcmp(s, "R_LAST")) return R_LAST; if (!strcmp(s, "R_NEXT")) return R_NEXT; if (!strcmp(s, "R_NOOVERWRITE")) return R_NOOVERWRITE; if (!strcmp(s, "R_PREV")) return R_PREV; if (!strcmp(s, "R_SETCURSOR")) return R_SETCURSOR; errx(1, "line %zu: %s: unknown flag", lineno, s); /* NOTREACHED */ } static const char * sflags(int xflags) { switch (xflags) { case R_CURSOR: return "R_CURSOR"; case R_FIRST: return "R_FIRST"; case R_IAFTER: return "R_IAFTER"; case R_IBEFORE: return "R_IBEFORE"; case R_LAST: return "R_LAST"; case R_NEXT: return "R_NEXT"; case R_NOOVERWRITE: return "R_NOOVERWRITE"; case R_PREV: return "R_PREV"; case R_SETCURSOR: return "R_SETCURSOR"; } return "UNKNOWN!"; } static DBTYPE dbtype(const char *s) { if (!strcmp(s, "btree")) return DB_BTREE; if (!strcmp(s, "hash")) return DB_HASH; if (!strcmp(s, "recno")) return DB_RECNO; errx(1, "%s: unknown type (use btree, hash or recno)", s); /* NOTREACHED */ } static void * setinfo(DBTYPE dtype, char *s) { static BTREEINFO ib; static HASHINFO ih; static RECNOINFO rh; char *eq; if ((eq = strchr(s, '=')) == NULL) errx(1, "%s: illegal structure set statement", s); *eq++ = '\0'; if (!isdigit((unsigned char)*eq)) errx(1, "%s: structure set statement must be a number", s); switch (dtype) { case DB_BTREE: if (!strcmp("flags", s)) { ib.flags = atoi(eq); return &ib; } if (!strcmp("cachesize", s)) { ib.cachesize = atoi(eq); return &ib; } if (!strcmp("maxkeypage", s)) { ib.maxkeypage = atoi(eq); return &ib; } if (!strcmp("minkeypage", s)) { ib.minkeypage = atoi(eq); return &ib; } if (!strcmp("lorder", s)) { ib.lorder = atoi(eq); return &ib; } if (!strcmp("psize", s)) { ib.psize = atoi(eq); return &ib; } break; case DB_HASH: if (!strcmp("bsize", s)) { ih.bsize = atoi(eq); return &ih; } if (!strcmp("ffactor", s)) { ih.ffactor = atoi(eq); return &ih; } if (!strcmp("nelem", s)) { ih.nelem = atoi(eq); return &ih; } if (!strcmp("cachesize", s)) { ih.cachesize = atoi(eq); return &ih; } if (!strcmp("lorder", s)) { ih.lorder = atoi(eq); return &ih; } break; case DB_RECNO: if (!strcmp("flags", s)) { rh.flags = atoi(eq); return &rh; } if (!strcmp("cachesize", s)) { rh.cachesize = atoi(eq); return &rh; } if (!strcmp("lorder", s)) { rh.lorder = atoi(eq); return &rh; } if (!strcmp("reclen", s)) { rh.reclen = atoi(eq); return &rh; } if (!strcmp("bval", s)) { rh.bval = atoi(eq); return &rh; } if (!strcmp("psize", s)) { rh.psize = atoi(eq); return &rh; } break; } errx(1, "%s: unknown structure value", s); /* NOTREACHED */ } static void * rfile(char *name, size_t *lenp) { struct stat sb; void *p; int fd; char *np; for (; isspace((unsigned char)*name); ++name) continue; if ((np = strchr(name, '\n')) != NULL) *np = '\0'; if ((fd = open(name, O_RDONLY, 0)) == -1 || fstat(fd, &sb) == -1) err(1, "Cannot open `%s'", name); #ifdef NOT_PORTABLE if (sb.st_size > (off_t)SIZE_T_MAX) { errno = E2BIG; err("Cannot process `%s'", name); } #endif if ((p = malloc((size_t)sb.st_size)) == NULL) err(1, "Cannot allocate %zu bytes", (size_t)sb.st_size); if (read(fd, p, (ssize_t)sb.st_size) != (ssize_t)sb.st_size) err(1, "read failed"); *lenp = (size_t)sb.st_size; (void)close(fd); return p; } static void * xcopy(void *text, size_t len) { void *p; if ((p = malloc(len)) == NULL) err(1, "Cannot allocate %zu bytes", len); (void)memmove(p, text, len); return p; } static void chkcmd(enum S state) { if (state != COMMAND) errx(1, "line %zu: not expecting command", lineno); } static void chkdata(enum S state) { if (state != DATA) errx(1, "line %zu: not expecting data", lineno); } static void chkkey(enum S state) { if (state != KEY) errx(1, "line %zu: not expecting a key", lineno); } static void usage(void) { (void)fprintf(stderr, - "Usage: %s [-l] [-f file] [-i info] [-o file] type script\n", - getprogname()); +#ifdef __NetBSD__ + "Usage: %s [-lu] [-f file] [-i info] [-o file] [-O file] " +#else + "Usage: %s [-l] [-f file] [-i info] [-o file] " +#endif + "type script\n", getprogname()); exit(1); } Index: stable/11/contrib/netbsd-tests/lib/libc/db/t_db.sh =================================================================== --- stable/11/contrib/netbsd-tests/lib/libc/db/t_db.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/lib/libc/db/t_db.sh (revision 313680) @@ -1,1005 +1,1310 @@ -# $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. # # 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. # prog_db() { echo $(atf_get_srcdir)/h_db } prog_lfsr() { echo $(atf_get_srcdir)/h_lfsr } dict() { if [ -f /usr/share/dict/words ]; then echo /usr/share/dict/words elif [ -f /usr/dict/words ]; then echo /usr/dict/words else echo "" atf_fail "no dictionary found" fi } # Begin FreeBSD dict() { echo /usr/share/dict/words } # End FreeBSD SEVEN_SEVEN="abcdefg|abcdefg|abcdefg|abcdefg|abcdefg|abcdefg|abcdefg" atf_test_case small_btree small_btree_head() { atf_set "descr" \ "Checks btree database using small keys and small data" \ "pairs: takes the first hundred entries in the dictionary," \ "and makes them be key/data pairs." # Begin FreeBSD atf_set "require.files" /usr/share/dict/words # End FreeBSD } small_btree_body() { TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} sed 200q $(dict) >exp for i in `sed 200q $(dict)`; do echo p echo k$i echo d$i echo g echo k$i done >in atf_check -o file:exp "$(prog_db)" btree in } atf_test_case small_hash small_hash_head() { atf_set "descr" \ "Checks hash database using small keys and small data" \ "pairs: takes the first hundred entries in the dictionary," \ "and makes them be key/data pairs." # Begin FreeBSD atf_set "require.files" /usr/share/dict/words # End FreeBSD } small_hash_body() { TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} sed 200q $(dict) >exp for i in `sed 200q $(dict)`; do echo p echo k$i echo d$i echo g echo k$i done >in atf_check -o file:exp "$(prog_db)" hash in } atf_test_case small_recno small_recno_head() { atf_set "descr" \ "Checks recno database using small keys and small data" \ "pairs: takes the first hundred entries in the dictionary," \ "and makes them be key/data pairs." # Begin FreeBSD atf_set "require.files" /usr/share/dict/words # End FreeBSD } small_recno_body() { TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} sed 200q $(dict) >exp sed 200q $(dict) | awk '{ ++i; printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i); }' >in atf_check -o file:exp "$(prog_db)" recno in } atf_test_case medium_btree medium_btree_head() { atf_set "descr" \ "Checks btree database using small keys and medium" \ "data pairs: takes the first 200 entries in the" \ "dictionary, and gives them each a medium size data entry." # Begin FreeBSD atf_set "require.files" /usr/share/dict/words # End FreeBSD } medium_btree_body() { TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} mdata=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz echo $mdata | awk '{ for (i = 1; i < 201; ++i) print $0 }' >exp for i in $(sed 200q $(dict)); do echo p echo k$i echo d$mdata echo g echo k$i done >in atf_check -o file:exp "$(prog_db)" btree in } atf_test_case medium_hash medium_hash_head() { atf_set "descr" \ "Checks hash database using small keys and medium" \ "data pairs: takes the first 200 entries in the" \ "dictionary, and gives them each a medium size data entry." # Begin FreeBSD atf_set "require.files" /usr/share/dict/words # End FreeBSD } medium_hash_body() { TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} mdata=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz echo $mdata | awk '{ for (i = 1; i < 201; ++i) print $0 }' >exp for i in $(sed 200q $(dict)); do echo p echo k$i echo d$mdata echo g echo k$i done >in atf_check -o file:exp "$(prog_db)" hash in } atf_test_case medium_recno medium_recno_head() { atf_set "descr" \ "Checks recno database using small keys and medium" \ "data pairs: takes the first 200 entries in the" \ "dictionary, and gives them each a medium size data entry." } medium_recno_body() { TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} mdata=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz echo $mdata | awk '{ for (i = 1; i < 201; ++i) print $0 }' >exp echo $mdata | awk '{ for (i = 1; i < 201; ++i) printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i); }' >in atf_check -o file:exp "$(prog_db)" recno in } atf_test_case big_btree big_btree_head() { atf_set "descr" \ "Checks btree database using small keys and big data" \ "pairs: inserts the programs in /bin with their paths" \ "as their keys." } big_btree_body() { TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} (find /bin -type f -print | xargs cat) >exp for psize in 512 16384 65536; do echo "checking page size: $psize" for i in `find /bin -type f -print`; do echo p echo k$i echo D$i echo g echo k$i done >in atf_check "$(prog_db)" -o out btree in cmp -s exp out || atf_fail "test failed for page size: $psize" done } atf_test_case big_hash big_hash_head() { atf_set "descr" \ "Checks hash database using small keys and big data" \ "pairs: inserts the programs in /bin with their paths" \ "as their keys." } big_hash_body() { TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} (find /bin -type f -print | xargs cat) >exp for i in `find /bin -type f -print`; do echo p echo k$i echo D$i echo g echo k$i done >in atf_check "$(prog_db)" -o out hash in cmp -s exp out || atf_fail "test failed" } atf_test_case big_recno big_recno_head() { atf_set "descr" \ "Checks recno database using small keys and big data" \ "pairs: inserts the programs in /bin with their paths" \ "as their keys." } big_recno_body() { TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} (find /bin -type f -print | xargs cat) >exp find /bin -type f -print | awk '{ ++i; printf("p\nk%d\nD%s\ng\nk%d\n", i, $0, i); }' >in for psize in 512 16384 65536; do echo "checking page size: $psize" atf_check "$(prog_db)" -o out recno in cmp -s exp out || atf_fail "test failed for page size: $psize" done } atf_test_case random_recno random_recno_head() { atf_set "descr" "Checks recno database using random entries" } random_recno_body() { TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} echo $SEVEN_SEVEN | awk '{ for (i = 37; i <= 37 + 88 * 17; i += 17) { if (i % 41) s = substr($0, 1, i % 41); else s = substr($0, 1); printf("input key %d: %s\n", i, s); } for (i = 1; i <= 15; ++i) { if (i % 41) s = substr($0, 1, i % 41); else s = substr($0, 1); printf("input key %d: %s\n", i, s); } for (i = 19234; i <= 19234 + 61 * 27; i += 27) { if (i % 41) s = substr($0, 1, i % 41); else s = substr($0, 1); printf("input key %d: %s\n", i, s); } exit }' >exp cat exp | awk 'BEGIN { i = 37; incr = 17; } { printf("p\nk%d\nd%s\n", i, $0); if (i == 19234 + 61 * 27) exit; if (i == 37 + 88 * 17) { i = 1; incr = 1; } else if (i == 15) { i = 19234; incr = 27; } else i += incr; } END { for (i = 37; i <= 37 + 88 * 17; i += 17) printf("g\nk%d\n", i); for (i = 1; i <= 15; ++i) printf("g\nk%d\n", i); for (i = 19234; i <= 19234 + 61 * 27; i += 27) printf("g\nk%d\n", i); }' >in atf_check -o file:exp "$(prog_db)" recno in } atf_test_case reverse_recno reverse_recno_head() { atf_set "descr" "Checks recno database using reverse order entries" } reverse_recno_body() { TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} echo $SEVEN_SEVEN | awk ' { for (i = 1500; i; --i) { if (i % 34) s = substr($0, 1, i % 34); else s = substr($0, 1); printf("input key %d: %s\n", i, s); } exit; }' >exp cat exp | awk 'BEGIN { i = 1500; } { printf("p\nk%d\nd%s\n", i, $0); --i; } END { for (i = 1500; i; --i) printf("g\nk%d\n", i); }' >in atf_check -o file:exp "$(prog_db)" recno in } atf_test_case alternate_recno alternate_recno_head() { atf_set "descr" "Checks recno database using alternating order entries" } alternate_recno_body() { TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} echo $SEVEN_SEVEN | awk ' { for (i = 1; i < 1200; i += 2) { if (i % 34) s = substr($0, 1, i % 34); else s = substr($0, 1); printf("input key %d: %s\n", i, s); } for (i = 2; i < 1200; i += 2) { if (i % 34) s = substr($0, 1, i % 34); else s = substr($0, 1); printf("input key %d: %s\n", i, s); } exit; }' >exp cat exp | awk 'BEGIN { i = 1; even = 0; } { printf("p\nk%d\nd%s\n", i, $0); i += 2; if (i >= 1200) { if (even == 1) exit; even = 1; i = 2; } } END { for (i = 1; i < 1200; ++i) printf("g\nk%d\n", i); }' >in atf_check "$(prog_db)" -o out recno in sort -o exp exp sort -o out out cmp -s exp out || atf_fail "test failed" } h_delete() { TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} type=$1 echo $SEVEN_SEVEN | awk '{ for (i = 1; i <= 120; ++i) printf("%05d: input key %d: %s\n", i, i, $0); }' >exp cat exp | awk '{ printf("p\nk%d\nd%s\n", ++i, $0); } END { printf("fR_NEXT\n"); for (i = 1; i <= 120; ++i) printf("s\n"); printf("fR_CURSOR\ns\nkXX\n"); printf("r\n"); printf("fR_NEXT\ns\n"); printf("fR_CURSOR\ns\nk1\n"); printf("r\n"); printf("fR_FIRST\ns\n"); }' >in # For btree, the records are ordered by the string representation # of the key value. So sort the expected output file accordingly, # and set the seek_last key to the last expected key value. if [ "$type" = "btree" ] ; then sed -e 's/kXX/k99/' < in > tmp mv tmp in sort -d -k4 < exp > tmp mv tmp exp echo $SEVEN_SEVEN | awk '{ printf("%05d: input key %d: %s\n", 99, 99, $0); printf("seq failed, no such key\n"); printf("%05d: input key %d: %s\n", 1, 1, $0); printf("%05d: input key %d: %s\n", 10, 10, $0); exit; }' >> exp else # For recno, records are ordered by numerical key value. No sort # is needed, but still need to set proper seek_last key value. sed -e 's/kXX/k120/' < in > tmp mv tmp in echo $SEVEN_SEVEN | awk '{ printf("%05d: input key %d: %s\n", 120, 120, $0); printf("seq failed, no such key\n"); printf("%05d: input key %d: %s\n", 1, 1, $0); printf("%05d: input key %d: %s\n", 2, 2, $0); exit; }' >> exp fi atf_check "$(prog_db)" -o out $type in atf_check -o file:exp cat out } atf_test_case delete_btree delete_btree_head() { atf_set "descr" "Checks removing records in btree database" } delete_btree_body() { h_delete btree } atf_test_case delete_recno delete_recno_head() { atf_set "descr" "Checks removing records in recno database" } delete_recno_body() { h_delete recno } h_repeated() { + local type="$1" TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} echo "" | awk 'BEGIN { for (i = 1; i <= 10; ++i) { printf("p\nkkey1\nD/bin/sh\n"); printf("p\nkkey2\nD/bin/csh\n"); if (i % 8 == 0) { printf("c\nkkey2\nD/bin/csh\n"); printf("c\nkkey1\nD/bin/sh\n"); printf("e\t%d of 10 (comparison)\n", i); } else printf("e\t%d of 10 \n", i); printf("r\nkkey1\nr\nkkey2\n"); } }' >in - $(prog_db) btree in + $(prog_db) $type in } atf_test_case repeated_btree repeated_btree_head() { atf_set "descr" \ "Checks btree database with repeated small keys and" \ "big data pairs. Makes sure that overflow pages are reused" } repeated_btree_body() { h_repeated btree } atf_test_case repeated_hash repeated_hash_head() { atf_set "descr" \ "Checks hash database with repeated small keys and" \ "big data pairs. Makes sure that overflow pages are reused" } repeated_hash_body() { h_repeated hash } atf_test_case duplicate_btree duplicate_btree_head() { atf_set "descr" "Checks btree database with duplicate keys" } duplicate_btree_body() { TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} echo $SEVEN_SEVEN | awk '{ for (i = 1; i <= 543; ++i) printf("%05d: input key %d: %s\n", i, i, $0); exit; }' >exp cat exp | awk '{ if (i++ % 2) printf("p\nkduplicatekey\nd%s\n", $0); else printf("p\nkunique%dkey\nd%s\n", i, $0); } END { printf("o\n"); }' >in atf_check -o file:exp -x "$(prog_db) -iflags=1 btree in | sort" } 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) printf("%05d: input key %d: %s\n", i, i, $0); exit; }' >exp # Test that R_CURSOR doesn't succeed before cursor initialized cat exp | awk '{ if (i == 10) exit; printf("p\nk%d\nd%s\n", ++i, $0); } END { printf("fR_CURSOR\nr\n"); printf("eR_CURSOR SHOULD HAVE FAILED\n"); }' >in atf_check -o ignore -e ignore -s ne:0 "$(prog_db)" -o out $type in atf_check -s ne:0 test -s out cat exp | awk '{ if (i == 10) exit; printf("p\nk%d\nd%s\n", ++i, $0); } END { printf("fR_CURSOR\np\nk1\ndsome data\n"); printf("eR_CURSOR SHOULD HAVE FAILED\n"); }' >in atf_check -o ignore -e ignore -s ne:0 "$(prog_db)" -o out $type in atf_check -s ne:0 test -s out } atf_test_case cursor_flags_btree cursor_flags_btree_head() { atf_set "descr" \ "Checks use of cursor flags without initialization in btree database" } cursor_flags_btree_body() { h_cursor_flags btree } atf_test_case cursor_flags_recno cursor_flags_recno_head() { atf_set "descr" \ "Checks use of cursor flags without initialization in recno database" } cursor_flags_recno_body() { h_cursor_flags recno } atf_test_case reverse_order_recno reverse_order_recno_head() { atf_set "descr" "Checks reverse order inserts in recno database" } reverse_order_recno_body() { TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} echo $SEVEN_SEVEN | awk '{ for (i = 1; i <= 779; ++i) printf("%05d: input key %d: %s\n", i, i, $0); exit; }' >exp cat exp | awk '{ if (i == 0) { i = 1; printf("p\nk1\nd%s\n", $0); printf("%s\n", "fR_IBEFORE"); } else printf("p\nk1\nd%s\n", $0); } END { printf("or\n"); }' >in atf_check -o file:exp "$(prog_db)" recno in } atf_test_case small_page_btree small_page_btree_head() { atf_set "descr" \ "Checks btree database with lots of keys and small page" \ "size: takes the first 20000 entries in the dictionary," \ "reverses them, and gives them each a small size data" \ "entry. Uses a small page size to make sure the btree" \ "split code gets hammered." # Begin FreeBSD atf_set "require.files" /usr/share/dict/words # End FreeBSD } small_page_btree_body() { TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} mdata=abcdefghijklmnopqrstuvwxy echo $mdata | awk '{ for (i = 1; i < 20001; ++i) print $0 }' >exp for i in `sed 20000q $(dict) | rev`; do echo p echo k$i echo d$mdata echo g echo k$i done >in atf_check -o file:exp "$(prog_db)" -i psize=512 btree in } h_byte_orders() { TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} type=$1 sed 50q $(dict) >exp for order in 1234 4321; do for i in `sed 50q $(dict)`; do echo p echo k$i echo d$i + echo S echo g echo k$i done >in atf_check -o file:exp "$(prog_db)" -ilorder=$order -f byte.file $type in for i in `sed 50q $(dict)`; do echo g echo k$i done >in atf_check -o file:exp "$(prog_db)" -s -ilorder=$order -f byte.file $type in done } atf_test_case byte_orders_btree byte_orders_btree_head() { atf_set "descr" "Checks btree database using differing byte orders" # Begin FreeBSD atf_set "require.files" /usr/share/dict/words # End FreeBSD } byte_orders_btree_body() { h_byte_orders btree } atf_test_case byte_orders_hash byte_orders_hash_head() { atf_set "descr" "Checks hash database using differing byte orders" } byte_orders_hash_body() { h_byte_orders hash } h_bsize_ffactor() { bsize=$1 ffactor=$2 echo "bucketsize $bsize, fill factor $ffactor" atf_check -o file:exp "$(prog_db)" "-ibsize=$bsize,\ ffactor=$ffactor,nelem=25000,cachesize=65536" hash in } atf_test_case bsize_ffactor bsize_ffactor_head() { atf_set "timeout" "1800" atf_set "descr" "Checks hash database with various" \ "bucketsizes and fill factors" # Begin FreeBSD atf_set "require.files" /usr/share/dict/words # End FreeBSD } bsize_ffactor_body() { TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} echo $SEVEN_SEVEN | awk '{ for (i = 1; i <= 10000; ++i) { if (i % 34) s = substr($0, 1, i % 34); else s = substr($0, 1); printf("%s\n", s); } exit; }' >exp sed 10000q $(dict) | awk 'BEGIN { ds="'$SEVEN_SEVEN'" } { if (++i % 34) s = substr(ds, 1, i % 34); else s = substr(ds, 1); printf("p\nk%s\nd%s\n", $0, s); }' >in sed 10000q $(dict) | awk '{ ++i; printf("g\nk%s\n", $0); }' >>in h_bsize_ffactor 256 11 h_bsize_ffactor 256 14 h_bsize_ffactor 256 21 h_bsize_ffactor 512 21 h_bsize_ffactor 512 28 h_bsize_ffactor 512 43 h_bsize_ffactor 1024 43 h_bsize_ffactor 1024 57 h_bsize_ffactor 1024 85 h_bsize_ffactor 2048 85 h_bsize_ffactor 2048 114 h_bsize_ffactor 2048 171 h_bsize_ffactor 4096 171 h_bsize_ffactor 4096 228 h_bsize_ffactor 4096 341 h_bsize_ffactor 8192 341 h_bsize_ffactor 8192 455 h_bsize_ffactor 8192 683 h_bsize_ffactor 16384 341 h_bsize_ffactor 16384 455 h_bsize_ffactor 16384 683 h_bsize_ffactor 32768 341 h_bsize_ffactor 32768 455 h_bsize_ffactor 32768 683 # Begin FreeBSD if false; then # End FreeBSD h_bsize_ffactor 65536 341 h_bsize_ffactor 65536 455 h_bsize_ffactor 65536 683 # Begin FreeBSD fi # End FreeBSD } # This tests 64K block size addition/removal atf_test_case four_char_hash four_char_hash_head() { atf_set "descr" \ "Checks hash database with 4 char key and" \ "value insert on a 65536 bucket size" } four_char_hash_body() { TMPDIR="$(pwd)/db_dir"; export TMPDIR mkdir ${TMPDIR} cat >in < 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 - < 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 +} + +# Begin FreeBSD +if false; then +# End FreeBSD +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 +} +# Begin FreeBSD +fi +# End FreeBSD + +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 atf_add_test_case small_hash atf_add_test_case small_recno atf_add_test_case medium_btree atf_add_test_case medium_hash atf_add_test_case medium_recno atf_add_test_case big_btree atf_add_test_case big_hash atf_add_test_case big_recno atf_add_test_case random_recno atf_add_test_case reverse_recno atf_add_test_case alternate_recno atf_add_test_case delete_btree atf_add_test_case delete_recno atf_add_test_case repeated_btree atf_add_test_case repeated_hash atf_add_test_case duplicate_btree atf_add_test_case cursor_flags_btree atf_add_test_case cursor_flags_recno atf_add_test_case reverse_order_recno atf_add_test_case small_page_btree atf_add_test_case byte_orders_btree atf_add_test_case byte_orders_hash 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 + # Begin FreeBSD + if false; then + # End FreeBSD + atf_add_test_case btree_recursive_traversal + # Begin FreeBSD + fi + # End FreeBSD + 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 } Index: stable/11/contrib/netbsd-tests/lib/libc/gen/t_dir.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/libc/gen/t_dir.c (revision 313679) +++ stable/11/contrib/netbsd-tests/lib/libc/gen/t_dir.c (revision 313680) @@ -1,187 +1,193 @@ -/* $NetBSD: t_dir.c,v 1.8 2017/01/11 07:26:17 christos Exp $ */ +/* $NetBSD: t_dir.c,v 1.10 2017/01/11 18:15:02 christos Exp $ */ /*- * Copyright (c) 2010 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 #include #include #include #include #include #include #include #include #include #include ATF_TC(seekdir_basic); ATF_TC_HEAD(seekdir_basic, tc) { atf_tc_set_md_var(tc, "descr", "Check telldir(3) and seekdir(3) " "for correct behavior (PR lib/24324)"); } ATF_TC_BODY(seekdir_basic, tc) { DIR *dp; char *wasname; struct dirent *entry; long here; #define CREAT(x, m) do { \ int _creat_fd; \ ATF_REQUIRE_MSG((_creat_fd = creat((x), (m))) != -1, \ "creat(%s, %x) failed: %s", (x), (m), \ strerror(errno)); \ (void)close(_creat_fd); \ } while(0); ATF_REQUIRE_MSG(mkdir("t", 0755) == 0, "mkdir failed: %s", strerror(errno)); CREAT("t/a", 0600); CREAT("t/b", 0600); CREAT("t/c", 0600); dp = opendir("t"); if ( dp == NULL) atf_tc_fail("Could not open temp directory."); /* skip two for . and .. */ entry = readdir(dp); + ATF_REQUIRE_MSG(entry != NULL, "readdir[%s] failed: %s", + ".", strerror(errno)); + entry = readdir(dp); + ATF_REQUIRE_MSG(entry != NULL, "readdir[%s] failed: %s", + "..", strerror(errno)); /* get first entry */ entry = readdir(dp); + ATF_REQUIRE_MSG(entry != NULL, "readdir[%s] failed: %s", + "first", strerror(errno)); + here = telldir(dp); - ATF_REQUIRE_MSG(here != -1, - "telldir failed: %s", strerror(errno)); + ATF_REQUIRE_MSG(here != -1, "telldir failed: %s", strerror(errno)); /* get second entry */ entry = readdir(dp); -#ifdef __FreeBSD__ - ATF_REQUIRE_MSG(entry != NULL, - "readdir failed: %s", strerror(errno)); -#endif + ATF_REQUIRE_MSG(entry != NULL, "readdir[%s] failed: %s", + "second", strerror(errno)); + wasname = strdup(entry->d_name); if (wasname == NULL) atf_tc_fail("cannot allocate memory"); /* get third entry */ entry = readdir(dp); + ATF_REQUIRE_MSG(entry != NULL, "readdir[%s] failed: %s", + "third", strerror(errno)); /* try to return to the position after the first entry */ seekdir(dp, here); entry = readdir(dp); - - if (entry == NULL) - atf_tc_fail("entry 1 not found"); + ATF_REQUIRE_MSG(entry != NULL, "readdir[%s] failed: %s", + "first[1]", strerror(errno)); if (strcmp(entry->d_name, wasname) != 0) atf_tc_fail("1st seekdir found wrong name"); /* try again, and throw in a telldir() for good measure */ seekdir(dp, here); here = telldir(dp); entry = readdir(dp); - - if (entry == NULL) - atf_tc_fail("entry 2 not found"); + ATF_REQUIRE_MSG(entry != NULL, "readdir[%s] failed: %s", + "second[1]", strerror(errno)); if (strcmp(entry->d_name, wasname) != 0) atf_tc_fail("2nd seekdir found wrong name"); /* One more time, to make sure that telldir() doesn't affect result */ seekdir(dp, here); entry = readdir(dp); + ATF_REQUIRE_MSG(entry != NULL, "readdir[%s] failed: %s", + "third[1]", strerror(errno)); - if (entry == NULL) - atf_tc_fail("entry 3 not found"); if (strcmp(entry->d_name, wasname) != 0) atf_tc_fail("3rd seekdir found wrong name"); closedir(dp); free(wasname); } /* There is no sbrk on AArch64 and RISC-V */ #if !defined(__aarch64__) && !defined(__riscv__) ATF_TC(telldir_leak); ATF_TC_HEAD(telldir_leak, tc) { atf_tc_set_md_var(tc, "descr", "Check telldir(3) for memory leakage (PR lib/24324)"); } ATF_TC_BODY(telldir_leak, tc) { DIR *dp; char *memused; int i; int oktouse = 4096; dp = opendir("."); if (dp == NULL) atf_tc_fail("Could not open current directory"); (void)telldir(dp); memused = sbrk(0); closedir(dp); for (i = 0; i < 1000; i++) { dp = opendir("."); if (dp == NULL) atf_tc_fail("Could not open current directory"); (void)telldir(dp); closedir(dp); if ((char *)sbrk(0) - memused > oktouse) { (void)printf("Used %td extra bytes for %d telldir " "calls", ((char *)sbrk(0) - memused), i); oktouse = (char *)sbrk(0) - memused; } } if (oktouse > 4096) { atf_tc_fail("Failure: leaked %d bytes", oktouse); } else { (void)printf("OK: used %td bytes\n", (char *)(sbrk(0))-memused); } } #endif ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, seekdir_basic); #if !defined(__aarch64__) && !defined(__riscv__) ATF_TP_ADD_TC(tp, telldir_leak); #endif return atf_no_error(); } Index: stable/11/contrib/netbsd-tests/lib/libc/gen/t_fnmatch.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/libc/gen/t_fnmatch.c (revision 313679) +++ stable/11/contrib/netbsd-tests/lib/libc/gen/t_fnmatch.c (revision 313680) @@ -1,192 +1,193 @@ -/* $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. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation * by Jukka Ruohonen. * * 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 -__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 #include #include ATF_TC(fnmatch_backslashes); ATF_TC_HEAD(fnmatch_backslashes, tc) { atf_tc_set_md_var(tc, "descr", "Test translation of '\\' with fnmatch(3) (PR lib/41558)"); } ATF_TC_BODY(fnmatch_backslashes, tc) { const int rv = fnmatch(/* pattern */ "\\", "\\", 0); if (rv != FNM_NOMATCH) atf_tc_fail("fnmatch(3) did not translate '\\'"); } ATF_TC(fnmatch_casefold); ATF_TC_HEAD(fnmatch_casefold, tc) { atf_tc_set_md_var(tc, "descr", "Test FNM_CASEFOLD"); } ATF_TC_BODY(fnmatch_casefold, tc) { ATF_CHECK(fnmatch("xxx", "XXX", 0) != 0); ATF_CHECK(fnmatch("XXX", "xxx", 0) != 0); ATF_CHECK(fnmatch("xxx", "XxX", 0) != 0); ATF_CHECK(fnmatch("XxX", "xxx", 0) != 0); ATF_CHECK(fnmatch("x*x", "XXX", 0) != 0); ATF_CHECK(fnmatch("**x", "XXX", 0) != 0); ATF_CHECK(fnmatch("*?x", "XXX", 0) != 0); ATF_CHECK(fnmatch("xxx", "XXX", FNM_CASEFOLD) == 0); ATF_CHECK(fnmatch("XXX", "xxx", FNM_CASEFOLD) == 0); ATF_CHECK(fnmatch("xxx", "XxX", FNM_CASEFOLD) == 0); ATF_CHECK(fnmatch("XxX", "xxx", FNM_CASEFOLD) == 0); ATF_CHECK(fnmatch("x*x", "XXX", FNM_CASEFOLD) == 0); ATF_CHECK(fnmatch("**x", "XXX", FNM_CASEFOLD) == 0); ATF_CHECK(fnmatch("*?x", "XXX", FNM_CASEFOLD) == 0); } ATF_TC(fnmatch_leadingdir); ATF_TC_HEAD(fnmatch_leadingdir, tc) { atf_tc_set_md_var(tc, "descr", "Test FNM_LEADING_DIR"); } ATF_TC_BODY(fnmatch_leadingdir, tc) { ATF_CHECK(fnmatch("", "/*", 0) != 0); ATF_CHECK(fnmatch(" ", " /*", 0) != 0); ATF_CHECK(fnmatch("x", "x/*", 0) != 0); ATF_CHECK(fnmatch("///", "////*", 0) != 0); ATF_CHECK(fnmatch("", "/*", FNM_LEADING_DIR) == 0); ATF_CHECK(fnmatch(" ", " /*", FNM_LEADING_DIR) == 0); ATF_CHECK(fnmatch("x", "x/*", FNM_LEADING_DIR) == 0); ATF_CHECK(fnmatch("///", "////*", FNM_LEADING_DIR) == 0); } ATF_TC(fnmatch_noescape); ATF_TC_HEAD(fnmatch_noescape, tc) { atf_tc_set_md_var(tc, "descr", "Test FNM_NOESCAPE"); } ATF_TC_BODY(fnmatch_noescape, tc) { ATF_CHECK(fnmatch(" \\x", " \\x", 0) != 0); ATF_CHECK(fnmatch("xx\\x", "xx\\x", 0) != 0); ATF_CHECK(fnmatch("\\xxx", "\\xxx", 0) != 0); ATF_CHECK(fnmatch(" \\x", " \\x", FNM_NOESCAPE) == 0); ATF_CHECK(fnmatch("xx\\x", "xx\\x", FNM_NOESCAPE) == 0); ATF_CHECK(fnmatch("\\xxx", "\\xxx", FNM_NOESCAPE) == 0); } ATF_TC(fnmatch_pathname); ATF_TC_HEAD(fnmatch_pathname, tc) { atf_tc_set_md_var(tc, "descr", "Test FNM_PATHNAME"); } ATF_TC_BODY(fnmatch_pathname, tc) { ATF_CHECK(fnmatch("???x", "xxx/x", FNM_PATHNAME) != 0); ATF_CHECK(fnmatch("***x", "xxx/x", FNM_PATHNAME) != 0); ATF_CHECK(fnmatch("???x", "xxxx", FNM_PATHNAME) == 0); ATF_CHECK(fnmatch("*/xxx", "/xxx", FNM_PATHNAME) == 0); ATF_CHECK(fnmatch("x/*.y", "x/z.y", FNM_PATHNAME) == 0); } ATF_TC(fnmatch_period); ATF_TC_HEAD(fnmatch_period, tc) { atf_tc_set_md_var(tc, "descr", "Test FNM_PERIOD"); } ATF_TC_BODY(fnmatch_period, tc) { ATF_CHECK(fnmatch("*x*", "X", FNM_PERIOD) != 0); ATF_CHECK(fnmatch("*x*", "X", FNM_PERIOD | FNM_CASEFOLD) == 0); ATF_CHECK(fnmatch("x?y", "x.y", FNM_PATHNAME | FNM_PERIOD) == 0); ATF_CHECK(fnmatch("x*y", "x.y", FNM_PATHNAME | FNM_PERIOD) == 0); ATF_CHECK(fnmatch("*.c", "x.c", FNM_PATHNAME | FNM_PERIOD) == 0); ATF_CHECK(fnmatch("*/?", "x/y", FNM_PATHNAME | FNM_PERIOD) == 0); ATF_CHECK(fnmatch("*/*", "x/y", FNM_PATHNAME | FNM_PERIOD) == 0); ATF_CHECK(fnmatch(".*/?", ".x/y", FNM_PATHNAME | FNM_PERIOD) == 0); ATF_CHECK(fnmatch("*/.?", "x/.y", FNM_PATHNAME | FNM_PERIOD) == 0); ATF_CHECK(fnmatch("x[.]y", "x.y", FNM_PATHNAME | FNM_PERIOD) == 0); ATF_CHECK(fnmatch("?x/y", ".x/y", FNM_PATHNAME | FNM_PERIOD) != 0); ATF_CHECK(fnmatch("*x/y", ".x/y", FNM_PATHNAME | FNM_PERIOD) != 0); ATF_CHECK(fnmatch("x/?y", "x/.y", FNM_PATHNAME | FNM_PERIOD) != 0); ATF_CHECK(fnmatch("x/*y", "x/.y", FNM_PATHNAME | FNM_PERIOD) != 0); } ATF_TC(fnmatch_initialbracket); ATF_TC_HEAD(fnmatch_initialbracket, tc) { atf_tc_set_md_var(tc, "descr", "Test fnmatch with initial ["); } ATF_TC_BODY(fnmatch_initialbracket, tc) { ATF_CHECK(fnmatch("[[?*\\\\]", "\\", 0) == 0); ATF_CHECK(fnmatch("[]?*\\\\]", "]", 0) == 0); 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); ATF_CHECK(fnmatch("[[a]/b", "a/b", 0) == 0); ATF_CHECK(fnmatch("[[a]/b", "[/b", 0) == 0); ATF_CHECK(fnmatch("[/b", "[/b", 0) == 0); ATF_CHECK(fnmatch("[*]/b", "a/b", 0) != 0); ATF_CHECK(fnmatch("[?]/b", "a/b", 0) != 0); } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, fnmatch_backslashes); ATF_TP_ADD_TC(tp, fnmatch_casefold); ATF_TP_ADD_TC(tp, fnmatch_leadingdir); ATF_TP_ADD_TC(tp, fnmatch_noescape); ATF_TP_ADD_TC(tp, fnmatch_pathname); ATF_TP_ADD_TC(tp, fnmatch_period); ATF_TP_ADD_TC(tp, fnmatch_initialbracket); return atf_no_error(); } Index: stable/11/contrib/netbsd-tests/lib/libc/rpc/t_rpc.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/libc/rpc/t_rpc.c (revision 313679) +++ stable/11/contrib/netbsd-tests/lib/libc/rpc/t_rpc.c (revision 313680) @@ -1,420 +1,416 @@ -/* $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 -__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 #include #include #include #include #include #include #include #include #include #ifndef TEST #include #define ERRX(ev, msg, ...) ATF_REQUIRE_MSG(0, msg, __VA_ARGS__) #define SKIPX(ev, msg, ...) do { \ atf_tc_skip(msg, __VA_ARGS__); \ - return; \ + return ev; \ } while(/*CONSTCOND*/0) #ifdef __FreeBSD__ #define SKIPXI(ev, msg, ...) do { \ atf_tc_skip(msg, __VA_ARGS__); \ return ev; \ } while(/*CONSTCOND*/0) #endif #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 #define DPRINTF(...) printf(__VA_ARGS__) #else #define DPRINTF(...) #endif #define RPCBPROC_NULL 0 static int reply(caddr_t replyp, struct netbuf * raddrp, struct netconfig * nconf) { char host[NI_MAXHOST]; struct sockaddr *sock = raddrp->buf; int error; error = getnameinfo(sock, sock->sa_len, host, sizeof(host), NULL, 0, 0); if (error) warnx("Cannot resolve address (%s)", gai_strerror(error)); else printf("response from: %s\n", host); return 0; } #ifdef __FreeBSD__ #define __rpc_control rpc_control #endif extern bool_t __rpc_control(int, void *); static void onehost(const char *host, const char *transp) { CLIENT *clnt; struct netbuf addr; struct timeval tv; /* * Magic! */ tv.tv_sec = 0; tv.tv_usec = 500000; #define CLCR_SET_RPCB_TIMEOUT 2 __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; #ifdef __FreeBSD__ if (clnt_call(clnt, RPCBPROC_NULL, (xdrproc_t)xdr_void, NULL, (xdrproc_t)xdr_void, NULL, tv) != RPC_SUCCESS) #else if (clnt_call(clnt, RPCBPROC_NULL, xdr_void, NULL, xdr_void, NULL, tv) != RPC_SUCCESS) #endif - 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); } #define PROGNUM 0x81 #define VERSNUM 0x01 #define PLUSONE 1 #define DESTROY 2 static struct timeval tout = {1, 0}; static void server(struct svc_req *rqstp, SVCXPRT *transp) { int num; DPRINTF("Starting server\n"); 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: svcerr_noproc(transp); return; } if (!svc_getargs(transp, (xdrproc_t)xdr_int, (void *)&num)) { svcerr_decode(transp); return; } 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"); } static int rawtest(const char *arg) { CLIENT *clnt; SVCXPRT *svc; int num, resp; enum clnt_stat rv; if (arg) num = atoi(arg); else num = 0; svc = svc_raw_create(); if (svc == NULL) ERRX(EXIT_FAILURE, "Cannot create server %d", num); if (!svc_reg(svc, PROGNUM, VERSNUM, server, NULL)) ERRX(EXIT_FAILURE, "Cannot register server %d", num); clnt = clnt_raw_create(PROGNUM, VERSNUM); if (clnt == NULL) ERRX(EXIT_FAILURE, "%s", clnt_spcreateerror("clnt_raw_create")); rv = clnt_call(clnt, PLUSONE, (xdrproc_t)xdr_int, (void *)&num, (xdrproc_t)xdr_int, (void *)&resp, tout); if (rv != RPC_SUCCESS) ERRX(EXIT_FAILURE, "clnt_call: %s", clnt_sperrno(rv)); DPRINTF("Got %d\n", resp); clnt_destroy(clnt); svc_destroy(svc); if (++num != resp) ERRX(EXIT_FAILURE, "expected %d got %d", num, resp); return EXIT_SUCCESS; } static int regtest(const char *hostname, const char *transp, const char *arg, int p) { CLIENT *clnt; int num, resp; enum clnt_stat rv; pid_t pid; if (arg) num = atoi(arg); else num = 0; #ifdef __NetBSD__ svc_fdset_init(p ? SVC_FDSET_POLL : 0); #endif if (!svc_create(server, PROGNUM, VERSNUM, transp)) -#ifdef __NetBSD__ - ERRX(EXIT_FAILURE, "Cannot create server %d", num); -#else { SKIPXI(EXIT_FAILURE, "Cannot create server %d", num); } -#endif switch ((pid = fork())) { case 0: DPRINTF("Calling svc_run\n"); svc_run(); ERRX(EXIT_FAILURE, "svc_run returned %d!", num); case -1: ERRX(EXIT_FAILURE, "Fork failed (%s)", strerror(errno)); default: sleep(1); break; } DPRINTF("Initializing client\n"); clnt = clnt_create(hostname, PROGNUM, VERSNUM, transp); if (clnt == NULL) ERRX(EXIT_FAILURE, "%s", clnt_spcreateerror("clnt_raw_create")); rv = clnt_call(clnt, PLUSONE, (xdrproc_t)xdr_int, (void *)&num, (xdrproc_t)xdr_int, (void *)&resp, tout); if (rv != RPC_SUCCESS) ERRX(EXIT_FAILURE, "clnt_call: %s", clnt_sperrno(rv)); DPRINTF("Got %d\n", resp); if (++num != resp) ERRX(EXIT_FAILURE, "expected %d got %d", num, resp); rv = clnt_call(clnt, DESTROY, (xdrproc_t)xdr_void, NULL, (xdrproc_t)xdr_void, NULL, tout); if (rv != RPC_SUCCESS) ERRX(EXIT_FAILURE, "clnt_call: %s", clnt_sperrno(rv)); clnt_destroy(clnt); return EXIT_SUCCESS; } #ifdef TEST static void allhosts(const char *transp) { enum clnt_stat clnt_stat; clnt_stat = rpc_broadcast(RPCBPROG, RPCBVERS, RPCBPROC_NULL, (xdrproc_t)xdr_void, NULL, (xdrproc_t)xdr_void, NULL, (resultproc_t)reply, transp); if (clnt_stat != RPC_SUCCESS && clnt_stat != RPC_TIMEDOUT) ERRX(EXIT_FAILURE, "%s", clnt_sperrno(clnt_stat)); } int main(int argc, char *argv[]) { int ch; int s, p; const char *transp = "udp"; p = s = 0; while ((ch = getopt(argc, argv, "prstu")) != -1) switch (ch) { case 'p': p = 1; break; case 's': s = 1; break; case 't': transp = "tcp"; break; case 'u': transp = "udp"; break; case 'r': transp = NULL; break; default: fprintf(stderr, "Usage: %s -[r|s|t|u] [...]\n", getprogname()); return EXIT_FAILURE; } if (argc == optind) { if (transp) allhosts(transp); else rawtest(NULL); } else { for (; optind < argc; optind++) { if (transp) s == 0 ? onehost(argv[optind], transp) : regtest(argv[optind], transp, "1", p); else rawtest(argv[optind]); } } return EXIT_SUCCESS; } #else ATF_TC(get_svc_addr_tcp); ATF_TC_HEAD(get_svc_addr_tcp, tc) { atf_tc_set_md_var(tc, "descr", "Checks CLGET_SVC_ADDR for tcp"); } ATF_TC_BODY(get_svc_addr_tcp, tc) { onehost("localhost", "tcp"); } ATF_TC(get_svc_addr_udp); ATF_TC_HEAD(get_svc_addr_udp, tc) { atf_tc_set_md_var(tc, "descr", "Checks CLGET_SVC_ADDR for udp"); } ATF_TC_BODY(get_svc_addr_udp, tc) { onehost("localhost", "udp"); } ATF_TC(raw); ATF_TC_HEAD(raw, tc) { atf_tc_set_md_var(tc, "descr", "Checks svc raw"); } ATF_TC_BODY(raw, tc) { #ifdef __FreeBSD__ atf_tc_expect_fail("fails with: clnt_call: " "RPC: Can't decode result -- PR # 211804"); #endif rawtest(NULL); } ATF_TC(tcp); ATF_TC_HEAD(tcp, tc) { atf_tc_set_md_var(tc, "descr", "Checks svc tcp (select)"); #ifdef __FreeBSD__ atf_tc_set_md_var(tc, "require.user", "root"); #endif } ATF_TC_BODY(tcp, tc) { regtest("localhost", "tcp", "1", 0); } ATF_TC(udp); ATF_TC_HEAD(udp, tc) { atf_tc_set_md_var(tc, "descr", "Checks svc udp (select)"); #ifdef __FreeBSD__ atf_tc_set_md_var(tc, "require.user", "root"); #endif } ATF_TC_BODY(udp, tc) { regtest("localhost", "udp", "1", 0); } ATF_TC(tcp_poll); ATF_TC_HEAD(tcp_poll, tc) { atf_tc_set_md_var(tc, "descr", "Checks svc tcp (poll)"); #ifdef __FreeBSD__ atf_tc_set_md_var(tc, "require.user", "root"); #endif } ATF_TC_BODY(tcp_poll, tc) { regtest("localhost", "tcp", "1", 1); } ATF_TC(udp_poll); ATF_TC_HEAD(udp_poll, tc) { atf_tc_set_md_var(tc, "descr", "Checks svc udp (poll)"); #ifdef __FreeBSD__ atf_tc_set_md_var(tc, "require.user", "root"); #endif } ATF_TC_BODY(udp_poll, tc) { regtest("localhost", "udp", "1", 1); } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, get_svc_addr_udp); ATF_TP_ADD_TC(tp, get_svc_addr_tcp); ATF_TP_ADD_TC(tp, raw); ATF_TP_ADD_TC(tp, tcp); ATF_TP_ADD_TC(tp, udp); ATF_TP_ADD_TC(tp, tcp_poll); ATF_TP_ADD_TC(tp, udp_poll); return atf_no_error(); } #endif Index: stable/11/contrib/netbsd-tests/lib/libc/string/t_memcpy.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/libc/string/t_memcpy.c (revision 313679) +++ stable/11/contrib/netbsd-tests/lib/libc/string/t_memcpy.c (revision 313680) @@ -1,167 +1,163 @@ -/* $NetBSD: t_memcpy.c,v 1.5 2013/03/17 02:23:31 christos Exp $ */ +/* $NetBSD: t_memcpy.c,v 1.6 2017/01/11 18:05:54 christos Exp $ */ /*- * Copyright (c) 2010 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 #include #include #include #include #include #include #define ALIGNMENTS 16 #define LENGTHS 4 #define BLOCKTYPES 4 MD5_CTX mc[1]; typedef unsigned char testBlock_t[ALIGNMENTS * LENGTHS]; testBlock_t bss1, bss2; unsigned char *start[BLOCKTYPES] = { bss1, bss2 }; char result[100]; #ifdef __NetBSD__ const char goodResult[] = "7b405d24bc03195474c70ddae9e1f8fb"; #else const char goodResult[] = "5ab4443f0e3e058d94087d9f2a11ef5e"; #endif static void runTest(unsigned char *b1, unsigned char *b2) { int i, j, k, m; size_t n; for (i = 0; i < ALIGNMENTS; ++i) { for (j = 0; j < ALIGNMENTS; ++j) { k = sizeof(testBlock_t) - (i > j ? i : j); for (m = 0; m < k; ++m) { for (n = 0; n < sizeof(testBlock_t); ++n) { b1[n] = (unsigned char)random(); b2[n] = (unsigned char)random(); } memcpy(b1 + i, b2 + j, m); MD5Update(mc, b1, sizeof(testBlock_t)); MD5Update(mc, b2, sizeof(testBlock_t)); } } } } ATF_TC(memcpy_basic); ATF_TC_HEAD(memcpy_basic, tc) { atf_tc_set_md_var(tc, "descr", "Test memcpy results"); } ATF_TC_BODY(memcpy_basic, tc) { int i, j; testBlock_t auto1, auto2; start[2] = auto1; start[3] = auto2; #ifdef __NetBSD__ srandom(0L); #else /* * random() shall produce by default a sequence of numbers that can be * duplicated by calling srandom() with 1 as the seed. */ srandom(1); #endif MD5Init(mc); for (i = 0; i < BLOCKTYPES; ++i) for (j = 0; j < BLOCKTYPES; ++j) if (i != j) runTest(start[i], start[j]); MD5End(mc, result); -#ifdef __NetBSD__ - ATF_REQUIRE_EQ(strcmp(result, goodResult), 0); -#else ATF_REQUIRE_EQ_MSG(strcmp(result, goodResult), 0, "%s != %s", result, goodResult); -#endif } ATF_TC(memccpy_simple); ATF_TC_HEAD(memccpy_simple, tc) { atf_tc_set_md_var(tc, "descr", "Test memccpy(3) results"); } ATF_TC_BODY(memccpy_simple, tc) { char buf[100]; char c = ' '; (void)memset(buf, c, sizeof(buf)); ATF_CHECK(memccpy(buf, "foo bar", c, sizeof(buf)) != NULL); ATF_CHECK(buf[4] == c); ATF_CHECK(memccpy(buf, "foo bar", '\0', sizeof(buf) - 1) != NULL); ATF_CHECK(buf[8] == c); ATF_CHECK(memccpy(buf, "foo bar", 'x', 7) == NULL); ATF_CHECK(strncmp(buf, "foo bar", 7) == 0); ATF_CHECK(memccpy(buf, "xxxxxxx", 'r', 7) == NULL); ATF_CHECK(strncmp(buf, "xxxxxxx", 7) == 0); } ATF_TC(memcpy_return); ATF_TC_HEAD(memcpy_return, tc) { atf_tc_set_md_var(tc, "descr", "Test memcpy(3) return value"); } ATF_TC_BODY(memcpy_return, tc) { char *b = (char *)0x1; char c[2]; ATF_REQUIRE_EQ(memcpy(b, b, 0), b); ATF_REQUIRE_EQ(memcpy(c, "ab", sizeof(c)), c); } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, memcpy_basic); ATF_TP_ADD_TC(tp, memcpy_return); ATF_TP_ADD_TC(tp, memccpy_simple); return atf_no_error(); } Index: stable/11/contrib/netbsd-tests/lib/libc/string/t_memmem.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/libc/string/t_memmem.c (revision 313679) +++ stable/11/contrib/netbsd-tests/lib/libc/string/t_memmem.c (revision 313680) @@ -1,105 +1,105 @@ -/* $NetBSD: t_memmem.c,v 1.2 2011/07/07 08:27:36 jruoho Exp $ */ +/* $NetBSD: t_memmem.c,v 1.3 2017/01/11 18:07:37 christos Exp $ */ /*- * Copyright (c) 2005 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation * by Perry E. Metzger of Metzger, Dowdeswell & Co. LLC. * * 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 #include #include #include char p0[] = ""; int lp0 = 0; char p1[] = "0123"; int lp1 = 4; char p2[] = "456"; int lp2 = 3; char p3[] = "789"; int lp3 = 3; char p4[] = "abc"; int lp4 = 3; char p5[] = "0"; int lp5 = 1; char p6[] = "9"; int lp6 = 1; char p7[] = "654"; int lp7 = 3; char b0[] = ""; int lb0 = 0; char b1[] = "0"; int lb1 = 1; char b2[] = "0123456789"; int lb2 = 10; #define expect(b) \ if (!(b)) { \ fprintf(stderr, "failed on line %d\n", __LINE__); \ atf_tc_fail("Check stderr for test id/line"); \ } ATF_TC(memmem_basic); ATF_TC_HEAD(memmem_basic, tc) { atf_tc_set_md_var(tc, "descr", "Test memmem results"); } ATF_TC_BODY(memmem_basic, tc) { #if defined(__darwin__) expect(memmem(b2, lb2, p0, lp0) == NULL); expect(memmem(b0, lb0, p0, lp0) == NULL); #else expect(memmem(b2, lb2, p0, lp0) == b2); expect(memmem(b0, lb0, p0, lp0) == b0); #endif expect(memmem(b0, lb0, p1, lp1) == NULL); expect(memmem(b1, lb1, p1, lp1) == NULL); expect(memmem(b2, lb2, p1, lp1) == b2); expect(memmem(b2, lb2, p2, lp2) == (b2 + 4)); expect(memmem(b2, lb2, p3, lp3) == (b2 + 7)); expect(memmem(b2, lb2, p5, lp5) == b2); expect(memmem(b2, lb2, p6, lp6) == (b2 + 9)); expect(memmem(b2, lb2, p4, lp4) == NULL); expect(memmem(b2, lb2, p7, lp7) == NULL); } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, memmem_basic); return atf_no_error(); } Index: stable/11/contrib/netbsd-tests/lib/libc/sync/cpp_atomic_ops_linkable.cc =================================================================== --- stable/11/contrib/netbsd-tests/lib/libc/sync/cpp_atomic_ops_linkable.cc (revision 313679) +++ stable/11/contrib/netbsd-tests/lib/libc/sync/cpp_atomic_ops_linkable.cc (revision 313680) @@ -1,119 +1,107 @@ -/* $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. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation * by Martin Husemann . * * 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. */ /* * This is a simple link-time test to verify all builtin atomic sync * operations for C++ are available. */ #include #include // for __HAVE_ATOMIC64_OPS template class ATest { public: ATest() : m_val(0) { m_val.exchange(std::atomic(8)); m_val--; m_val++; m_val ^= 0x0f; m_val &= 0x0f; m_val |= 2; T tval(1), other(42); m_val.compare_exchange_weak(tval, other, std::memory_order_release, std::memory_order_relaxed); } private: volatile std::atomic m_val; }; -#if defined(__clang__) && defined(__sparc64__) -#define NO_SHORT_ATOMICS -#endif - int main(int argc, char **argv) { -#ifndef NO_SHORT_ATOMICS ATest(); ATest(); ATest(); ATest(); ATest(); -#endif ATest(); ATest(); ATest(); ATest(); #ifdef __HAVE_ATOMIC64_OPS ATest(); ATest(); #endif -#ifndef NO_SHORT_ATOMICS ATest(); -#endif ATest(); ATest(); -#ifndef NO_SHORT_ATOMICS ATest(); ATest(); ATest(); ATest(); -#endif ATest(); ATest(); #ifdef __HAVE_ATOMIC64_OPS ATest(); ATest(); #endif -#ifndef NO_SHORT_ATOMICS ATest(); ATest(); ATest(); ATest(); -#endif ATest(); ATest(); #ifdef __HAVE_ATOMIC64_OPS ATest(); ATest(); #endif ATest(); ATest(); ATest(); ATest(); #ifdef __HAVE_ATOMIC64_OPS ATest(); ATest(); -#endif /* NO_SHORT_ATOMICS */ +#endif } Index: stable/11/contrib/netbsd-tests/lib/libc/sys/t_clock_nanosleep.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/libc/sys/t_clock_nanosleep.c (nonexistent) +++ stable/11/contrib/netbsd-tests/lib/libc/sys/t_clock_nanosleep.c (revision 313680) @@ -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 +__RCSID("$NetBSD: t_clock_nanosleep.c,v 1.1 2016/11/11 15:30:44 njoly Exp $"); + +#include +#include + +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(); +} Property changes on: stable/11/contrib/netbsd-tests/lib/libc/sys/t_clock_nanosleep.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/lib/libc/sys/t_getrusage.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/libc/sys/t_getrusage.c (revision 313679) +++ stable/11/contrib/netbsd-tests/lib/libc/sys/t_getrusage.c (revision 313680) @@ -1,212 +1,216 @@ /* $NetBSD: t_getrusage.c,v 1.4 2016/08/05 15:01:39 scole Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation * by Jukka Ruohonen. * * 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 __RCSID("$NetBSD: t_getrusage.c,v 1.4 2016/08/05 15:01:39 scole Exp $"); #include #include #include #include #include #include #include #include static void work(void); static void sighandler(int); static const size_t maxiter = 2000; static void #ifdef __FreeBSD__ sighandler(int signo __unused) #else sighandler(int signo) #endif { /* Nothing. */ } +#ifdef __FreeBSD__ +#define asm __asm +#endif + static void work(void) { size_t n = UINT16_MAX * 10; while (n > 0) { #ifdef __or1k__ asm volatile("l.nop"); /* Do something. */ #elif defined(__ia64__) asm volatile("nop 0"); /* Do something. */ #else asm volatile("nop"); /* Do something. */ #endif n--; } } ATF_TC(getrusage_err); ATF_TC_HEAD(getrusage_err, tc) { atf_tc_set_md_var(tc, "descr", "Test error conditions"); } ATF_TC_BODY(getrusage_err, tc) { struct rusage ru; errno = 0; ATF_REQUIRE(getrusage(INT_MAX, &ru) != 0); ATF_REQUIRE(errno == EINVAL); errno = 0; ATF_REQUIRE(getrusage(RUSAGE_SELF, (void *)0) != 0); ATF_REQUIRE(errno == EFAULT); } ATF_TC(getrusage_sig); ATF_TC_HEAD(getrusage_sig, tc) { atf_tc_set_md_var(tc, "descr", "Test signal count with getrusage(2)"); } ATF_TC_BODY(getrusage_sig, tc) { struct rusage ru; const long n = 5; int i; /* * Test that signals are recorded. */ ATF_REQUIRE(signal(SIGUSR1, sighandler) != SIG_ERR); for (i = 0; i < n; i++) ATF_REQUIRE(raise(SIGUSR1) == 0); (void)memset(&ru, 0, sizeof(struct rusage)); ATF_REQUIRE(getrusage(RUSAGE_SELF, &ru) == 0); if (n != ru.ru_nsignals) atf_tc_fail("getrusage(2) did not record signals"); } ATF_TC(getrusage_utime_back); ATF_TC_HEAD(getrusage_utime_back, tc) { atf_tc_set_md_var(tc, "descr", "Test bogus values from getrusage(2)"); } ATF_TC_BODY(getrusage_utime_back, tc) { struct rusage ru1, ru2; size_t i; /* * Test that two consecutive calls are sane. */ #ifdef __NetBSD__ atf_tc_expect_fail("PR kern/30115"); #endif for (i = 0; i < maxiter; i++) { (void)memset(&ru1, 0, sizeof(struct rusage)); (void)memset(&ru2, 0, sizeof(struct rusage)); work(); ATF_REQUIRE(getrusage(RUSAGE_SELF, &ru1) == 0); work(); ATF_REQUIRE(getrusage(RUSAGE_SELF, &ru2) == 0); if (timercmp(&ru2.ru_utime, &ru1.ru_utime, <) != 0) atf_tc_fail("user time went backwards"); } #ifdef __NetBSD__ atf_tc_fail("anticipated error did not occur"); #endif } ATF_TC(getrusage_utime_zero); ATF_TC_HEAD(getrusage_utime_zero, tc) { atf_tc_set_md_var(tc, "descr", "Test zero utime from getrusage(2)"); } ATF_TC_BODY(getrusage_utime_zero, tc) { struct rusage ru; size_t i; #ifdef __FreeBSD__ atf_tc_skip("this testcase passes/fails sporadically on FreeBSD/i386 " "@ r273153 (at least)"); #endif /* * Test that getrusage(2) does not return * zero user time for the calling process. * * See also (duplicate) PR port-amd64/41734. */ atf_tc_expect_fail("PR kern/30115"); for (i = 0; i < maxiter; i++) { work(); (void)memset(&ru, 0, sizeof(struct rusage)); ATF_REQUIRE(getrusage(RUSAGE_SELF, &ru) == 0); if (ru.ru_utime.tv_sec == 0 && ru.ru_utime.tv_usec == 0) atf_tc_fail("zero user time from getrusage(2)"); } atf_tc_fail("anticipated error did not occur"); } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, getrusage_err); ATF_TP_ADD_TC(tp, getrusage_sig); ATF_TP_ADD_TC(tp, getrusage_utime_back); ATF_TP_ADD_TC(tp, getrusage_utime_zero); return atf_no_error(); } Index: stable/11/contrib/netbsd-tests/lib/libc/sys/t_wait_noproc.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/libc/sys/t_wait_noproc.c (nonexistent) +++ stable/11/contrib/netbsd-tests/lib/libc/sys/t_wait_noproc.c (revision 313680) @@ -0,0 +1,345 @@ +/* $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 +__RCSID("$NetBSD: t_wait_noproc.c,v 1.5 2016/11/09 17:50:19 kamil Exp $"); + +#ifdef __FreeBSD__ +#include /* For NBBY -- it's in sys/types.h on NetBSD */ +#endif +#include +#include + +#include +#include + +#include + +#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, +#ifdef __NetBSD__ + WALLSIG, + WALTSIG, + __WALL, /* Linux compatibility, equal to WALLSIG */ + __WCLONE /* Linux compatibility, equal to WALTSIG */ +#endif + }; + + 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(); +} Property changes on: stable/11/contrib/netbsd-tests/lib/libc/sys/t_wait_noproc.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/lib/libc/sys/t_wait_noproc_wnohang.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/libc/sys/t_wait_noproc_wnohang.c (nonexistent) +++ stable/11/contrib/netbsd-tests/lib/libc/sys/t_wait_noproc_wnohang.c (revision 313680) @@ -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" Property changes on: stable/11/contrib/netbsd-tests/lib/libc/sys/t_wait_noproc_wnohang.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/lib/libm/t_casinh.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/libm/t_casinh.c (nonexistent) +++ stable/11/contrib/netbsd-tests/lib/libm/t_casinh.c (revision 313680) @@ -0,0 +1,81 @@ +/* $NetBSD: t_casinh.c,v 1.2 2016/09/20 17:19:28 christos Exp $ */ + +/* + * Written by Maya Rashish + * Public domain. + * + * Testing special values of casinh + * Values from ISO/IEC 9899:201x G.6.2.2 + */ + +#include +#include +#include + +#define RE(z) (((double *)(&z))[0]) +#define IM(z) (((double *)(&z))[1]) + +static const struct { + double input_re; + double input_im; + double result_re; + double result_im; +} values[] = { + { +0, +0, +0, +0}, + { +5.032E3, +INFINITY, +INFINITY, +M_PI/2}, + { +INFINITY, +5.023E3, +INFINITY, +0}, + { +INFINITY, +INFINITY, +INFINITY, +M_PI/4}, +#ifdef __HAVE_NANF + { +INFINITY, +NAN, +INFINITY, +NAN}, + { +5.032E3, +NAN, +NAN, +NAN}, /* + FE_INVALID optionally raised */ + { +NAN, +0, +NAN, +0}, + { +NAN, -5.023E3, +NAN, +NAN}, /* + FE_INVALID optionally raised */ + { +NAN, +INFINITY, +INFINITY, +NAN}, /* sign of real part of result unspecified */ + { +NAN, +NAN, +NAN, +NAN}, +#endif +}; + +#ifdef __HAVE_NANF +#define both_nan(a,b) (isnan(a) && isnan(b)) +#else +#define both_nan(a,b) 0 +#endif + +#define crude_equality(a,b) ((a == b) || both_nan(a,b)) + +#define ATF_COMPLEX_EQUAL(a,b) do { \ + complex double ci = casinh(a); \ + ATF_CHECK_MSG(crude_equality(creal(ci),creal(b)) && \ + crude_equality(cimag(ci), cimag(b)), \ + "for casinh([%g,%g]) = [%g,%g] != [%g,%g]", \ + creal(a), cimag(a), creal(ci), cimag(ci), creal(b), cimag(b)); \ +} while (0/*CONSTCOND*/) + + +ATF_TC(casinh); +ATF_TC_HEAD(casinh, tc) +{ + atf_tc_set_md_var(tc, "descr","Check casinh family - special values"); +} + +ATF_TC_BODY(casinh, tc) +{ + complex double input; + complex double result; + unsigned int i; + for (i = 0; i < __arraycount(values); i++) { + RE(input) = values[i].input_re; + IM(input) = values[i].input_im; + RE(result) = values[i].result_re; + IM(result) = values[i].result_im; + ATF_COMPLEX_EQUAL(input, result); + } +} + +ATF_TP_ADD_TCS(tp) +{ + + ATF_TP_ADD_TC(tp, casinh); + + return atf_no_error(); +} Property changes on: stable/11/contrib/netbsd-tests/lib/libm/t_casinh.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/lib/libm/t_fe_round.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/libm/t_fe_round.c (nonexistent) +++ stable/11/contrib/netbsd-tests/lib/libm/t_fe_round.c (revision 313680) @@ -0,0 +1,124 @@ +/* + * Written by Maya Rashish + * Public domain. + * + * Testing IEEE-754 rounding modes (and lrint) + */ + +#include +#include +#ifdef __HAVE_FENV +#include +#include +#include + +/*#pragma STDC FENV_ACCESS ON gcc?? */ + +#define INT 9223L + +#define EPSILON 0.001 + +static const struct { + int round_mode; + double input; + long int expected; +} values[] = { + { FE_DOWNWARD, 3.7, 3}, + { FE_DOWNWARD, -3.7, -4}, + { FE_DOWNWARD, +0, 0}, + { FE_DOWNWARD, -INT-0.01, -INT-1}, + { FE_DOWNWARD, +INT-0.01, INT-1}, + { FE_DOWNWARD, -INT+0.01, -INT}, + { FE_DOWNWARD, +INT+0.01, INT}, +#if 0 /* cpu bugs? */ + { FE_DOWNWARD, -0, -1}, + + { FE_UPWARD, +0, 1}, +#endif + { FE_UPWARD, -0, 0}, + { FE_UPWARD, -123.7, -123}, + { FE_UPWARD, 123.999, 124}, + { FE_UPWARD, -INT-0.01, -INT}, + { FE_UPWARD, +INT-0.01, INT}, + { FE_UPWARD, -INT+0.01, -INT+1}, + { FE_UPWARD, +INT+0.01, INT+1}, + + { FE_TOWARDZERO, 1.99, 1}, + { FE_TOWARDZERO, -1.99, -1}, + { FE_TOWARDZERO, 0.2, 0}, + { FE_TOWARDZERO, INT+0.01, INT}, + { FE_TOWARDZERO, INT-0.01, INT - 1}, + { FE_TOWARDZERO, -INT+0.01, -INT + 1}, + { FE_TOWARDZERO, +0, 0}, + { FE_TOWARDZERO, -0, 0}, + + { FE_TONEAREST, -INT-0.01, -INT}, + { FE_TONEAREST, +INT-0.01, INT}, + { FE_TONEAREST, -INT+0.01, -INT}, + { FE_TONEAREST, +INT+0.01, INT}, + { FE_TONEAREST, -INT-0.501, -INT-1}, + { FE_TONEAREST, +INT-0.501, INT-1}, + { FE_TONEAREST, -INT+0.501, -INT+1}, + { FE_TONEAREST, +INT+0.501, INT+1}, + { FE_TONEAREST, +0, 0}, + { FE_TONEAREST, -0, 0}, +}; + +ATF_TC(fe_round); +ATF_TC_HEAD(fe_round, tc) +{ + atf_tc_set_md_var(tc, "descr","Checking IEEE 754 rounding modes using lrint"); +} + +ATF_TC_BODY(fe_round, tc) +{ + long int received; + + for (unsigned int i = 0; i < __arraycount(values); i++) { + fesetround(values[i].round_mode); + + received = lrint(values[i].input); + ATF_CHECK_MSG( + (labs(received - values[i].expected) < EPSILON), + "lrint rounding wrong, difference too large\n" + "input: %f (index %d): got %ld, expected %ld\n", + values[i].input, i, received, values[i].expected); + + /* Do we get the same rounding mode out? */ + ATF_CHECK_MSG( + (fegetround() == values[i].round_mode), + "Didn't get the same rounding mode out!\n" + "(index %d) fed in %d rounding mode, got %d out\n", + i, fegetround(), values[i].round_mode); + } +} + +ATF_TP_ADD_TCS(tp) +{ + + ATF_TP_ADD_TC(tp, fe_round); + + return atf_no_error(); +} +#else +ATF_TC(t_nofe_round); + +ATF_TC_HEAD(t_nofe_round, tc) +{ + atf_tc_set_md_var(tc, "descr", + "dummy test case - no fenv.h support"); +} + + +ATF_TC_BODY(t_nofe_round, tc) +{ + atf_tc_skip("no fenv.h support on this architecture"); +} + +ATF_TP_ADD_TCS(tp) +{ + ATF_TP_ADD_TC(tp, t_nofe_round); + return atf_no_error(); +} + +#endif Property changes on: stable/11/contrib/netbsd-tests/lib/libm/t_fe_round.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/lib/libm/t_ilogb.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/libm/t_ilogb.c (nonexistent) +++ stable/11/contrib/netbsd-tests/lib/libm/t_ilogb.c (revision 313680) @@ -0,0 +1,130 @@ +/* $NetBSD: t_ilogb.c,v 1.6 2016/08/26 08:01:55 christos Exp $ */ + +/*- + * Copyright (c) 2016 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Maya Rashish. + * + * 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. + */ + +#ifdef __FreeBSD__ +#include +#endif +#include +#include +#include + +#ifndef __HAVE_FENV + +# define ATF_CHECK_RAISED_INVALID +# define ATF_CHECK_RAISED_NOTHING + +#else +# define ATF_CHECK_RAISED_INVALID do { \ + int r = fetestexcept(FE_ALL_EXCEPT); \ + ATF_CHECK_MSG(r == FE_INVALID, "r=%#x != %#x\n", r, FE_INVALID); \ + (void)feclearexcept(FE_ALL_EXCEPT); \ +} while (/*CONSTCOND*/0) + +# define ATF_CHECK_RAISED_NOTHING do { \ + int r = fetestexcept(FE_ALL_EXCEPT); \ + ATF_CHECK_MSG(r == 0, "r=%#x != 0\n", r); \ + (void)feclearexcept(FE_ALL_EXCEPT); \ +} while (/*CONSTCOND*/0) +#endif + +ATF_TC(ilogb); +ATF_TC_HEAD(ilogb, tc) +{ + atf_tc_set_md_var(tc, "descr","Check ilogb family"); +} + +ATF_TC_BODY(ilogb, tc) +{ + + ATF_CHECK(ilogbf(0) == FP_ILOGB0); + ATF_CHECK_RAISED_INVALID; + ATF_CHECK(ilogb(0) == FP_ILOGB0); + ATF_CHECK_RAISED_INVALID; +#ifdef __HAVE_LONG_DOUBLE + ATF_CHECK(ilogbl(0) == FP_ILOGB0); + ATF_CHECK_RAISED_INVALID; +#endif + + ATF_CHECK(ilogbf(-0) == FP_ILOGB0); + ATF_CHECK_RAISED_INVALID; + ATF_CHECK(ilogb(-0) == FP_ILOGB0); + ATF_CHECK_RAISED_INVALID; +#ifdef __HAVE_LONG_DOUBLE + ATF_CHECK(ilogbl(-0) == FP_ILOGB0); + ATF_CHECK_RAISED_INVALID; +#endif + + ATF_CHECK(ilogbf(INFINITY) == INT_MAX); + ATF_CHECK_RAISED_INVALID; + ATF_CHECK(ilogb(INFINITY) == INT_MAX); + ATF_CHECK_RAISED_INVALID; +#ifdef __HAVE_LONG_DOUBLE + ATF_CHECK(ilogbl(INFINITY) == INT_MAX); + ATF_CHECK_RAISED_INVALID; +#endif + + ATF_CHECK(ilogbf(-INFINITY) == INT_MAX); + ATF_CHECK_RAISED_INVALID; + ATF_CHECK(ilogb(-INFINITY) == INT_MAX); + ATF_CHECK_RAISED_INVALID; +#ifdef __HAVE_LONG_DOUBLE + ATF_CHECK(ilogbl(-INFINITY) == INT_MAX); + ATF_CHECK_RAISED_INVALID; +#endif + + ATF_CHECK(ilogbf(1024) == 10); + ATF_CHECK_RAISED_NOTHING; + ATF_CHECK(ilogb(1024) == 10); + ATF_CHECK_RAISED_NOTHING; +#ifdef __HAVE_LONG_DOUBLE + ATF_CHECK(ilogbl(1024) == 10); + ATF_CHECK_RAISED_NOTHING; +#endif + +#ifndef __vax__ + ATF_CHECK(ilogbf(NAN) == FP_ILOGBNAN); + ATF_CHECK_RAISED_INVALID; + ATF_CHECK(ilogb(NAN) == FP_ILOGBNAN); + ATF_CHECK_RAISED_INVALID; +#ifdef __HAVE_LONG_DOUBLE + ATF_CHECK(ilogbl(NAN) == FP_ILOGBNAN); + ATF_CHECK_RAISED_INVALID; +#endif +#endif +} + +ATF_TP_ADD_TCS(tp) +{ + + ATF_TP_ADD_TC(tp, ilogb); + + return atf_no_error(); +} Property changes on: stable/11/contrib/netbsd-tests/lib/libm/t_ilogb.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/lib/libm/t_ldexp.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/libm/t_ldexp.c (revision 313679) +++ stable/11/contrib/netbsd-tests/lib/libm/t_ldexp.c (revision 313680) @@ -1,480 +1,480 @@ -/* $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. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation * by Jukka Ruohonen. * * 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 -__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 #include #include #include #include #include #define SKIP 9999 #define FORMAT "%23.23lg" static const int exps[] = { 0, 1, -1, 100, -100 }; struct ldexp_test { double x; int exp1; int exp2; const char *result; }; struct ldexp_test ldexp_basic[] = { { 1.0, 5, SKIP, " 32" }, { 1.0, 1022, SKIP, "4.4942328371557897693233e+307" }, { 1.0, 1023, -1, "4.4942328371557897693233e+307" }, { 1.0, 1023, SKIP, "8.9884656743115795386465e+307" }, { 1.0, 1022, 1, "8.9884656743115795386465e+307" }, { 1.0, -1022, 2045, "8.9884656743115795386465e+307" }, { 1.0, -5, SKIP, " 0.03125" }, { 1.0, -1021, SKIP, "4.4501477170144027661805e-308" }, { 1.0, -1022, 1, "4.4501477170144027661805e-308" }, { 1.0, -1022, SKIP, "2.2250738585072013830902e-308" }, { 1.0, -1021, -1, "2.2250738585072013830902e-308" }, { 1.0, 1023, -2045, "2.2250738585072013830902e-308" }, { 1.0, 1023, -1023, " 1" }, { 1.0, -1022, 1022, " 1" }, { 0, 0, 0, NULL } }; struct ldexp_test ldexp_zero[] = { { 0.0, -1, SKIP, " 0" }, { 0.0, 0, SKIP, " 0" }, { 0.0, 1, SKIP, " 0" }, { 0.0, 1024, SKIP, " 0" }, { 0.0, 1025, SKIP, " 0" }, { 0.0, -1023, SKIP, " 0" }, { 0.0, -1024, SKIP, " 0" }, { 0, 0, 0, NULL } }; struct ldexp_test ldexp_infinity[] = { { 1.0, 1024, -1, " inf" }, { 1.0, 1024, 0, " inf" }, { 1.0, 1024, 1, " inf" }, { -1.0, 1024, -1, " -inf" }, { -1.0, 1024, 0, " -inf" }, { -1.0, 1024, 1, " -inf" }, { 0, 0, 0, NULL } }; struct ldexp_test ldexp_overflow[] = { { 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" }, { -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 } }; struct ldexp_test ldexp_denormal[] = { { 1.0, -1023, SKIP, "1.1125369292536006915451e-308" }, { 1.0, -1022, -1, "1.1125369292536006915451e-308" }, { 1.0, 1023, -2046, "1.1125369292536006915451e-308" }, { 1.0, -1024, SKIP, "5.5626846462680034577256e-309" }, { 1.0, -1074, SKIP, "4.9406564584124654417657e-324" }, { -1.0, -1023, SKIP, "-1.1125369292536006915451e-308" }, { -1.0, -1022, -1, "-1.1125369292536006915451e-308" }, { -1.0, 1023, -2046, "-1.1125369292536006915451e-308" }, { -1.0, -1024, SKIP, "-5.5626846462680034577256e-309" }, { -1.0, -1074, SKIP, "-4.9406564584124654417657e-324" }, { 0, 0, 0, NULL } }; struct ldexp_test ldexp_underflow[] = { { 1.0, -1075, SKIP, " 0" }, { 1.0, -1074, -1, " 0" }, { 1.0, 1023, -2098, " 0" }, { 1.0, -1076, SKIP, " 0" }, { -1.0, -1075, SKIP, " -0" }, { -1.0, -1074, -1, " -0" }, { -1.0, 1023, -2098, " -0" }, { -1.0, -1076, SKIP, " -0" }, { 0, 0, 0, NULL } }; struct ldexp_test ldexp_denormal_large[] = { { 1.0, -1028, 1024, " 0.0625" }, { 1.0, -1028, 1025, " 0.125" }, { 1.0, -1028, 1026, " 0.25" }, { 1.0, -1028, 1027, " 0.5" }, { 1.0, -1028, 1028, " 1" }, { 1.0, -1028, 1029, " 2" }, { 1.0, -1028, 1030, " 4" }, { 1.0, -1028, 1040, " 4096" }, { 1.0, -1028, 1050, " 4194304" }, { 1.0, -1028, 1060, " 4294967296" }, { 1.0, -1028, 1100, " 4722366482869645213696" }, { 1.0, -1028, 1200, "5.9863107065073783529623e+51" }, { 1.0, -1028, 1300, "7.5885503602567541832791e+81" }, { 1.0, -1028, 1400, "9.6196304190416209014353e+111" }, { 1.0, -1028, 1500, "1.2194330274671844653834e+142" }, { 1.0, -1028, 1600, "1.5458150092069033378781e+172" }, { 1.0, -1028, 1700, "1.9595533242629369747791e+202" }, { 1.0, -1028, 1800, "2.4840289476811342962384e+232" }, { 1.0, -1028, 1900, "3.1488807865122869393369e+262" }, { 1.0, -1028, 2000, "3.9916806190694396233127e+292" }, { 1.0, -1028, 2046, "2.808895523222368605827e+306" }, { 1.0, -1028, 2047, "5.6177910464447372116541e+306" }, { 1.0, -1028, 2048, "1.1235582092889474423308e+307" }, { 1.0, -1028, 2049, "2.2471164185778948846616e+307" }, { 1.0, -1028, 2050, "4.4942328371557897693233e+307" }, { 1.0, -1028, 2051, "8.9884656743115795386465e+307" }, { 0, 0, 0, NULL } }; static void run_test(struct ldexp_test *table) { char outbuf[64]; size_t i; double v; for (i = 0; table->result != NULL; table++, i++) { 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); ATF_CHECK_STREQ_MSG(table->result, outbuf, "Entry %zu:\n\tExp: \"%s\"\n\tAct: \"%s\"", i, table->result, outbuf); } } /* * ldexp(3) */ ATF_TC(ldexp_exp2); ATF_TC_HEAD(ldexp_exp2, tc) { atf_tc_set_md_var(tc, "descr", "Test ldexp(x, n) == x * exp2(n)"); } ATF_TC_BODY(ldexp_exp2, tc) { const double n[] = { 1, 2, 3, 10, 50, 100 }; #if __DBL_MIN_10_EXP__ <= -40 const double eps = 1.0e-40; #else const double eps = __DBL_MIN__*4.0; #endif const double x = 12.0; double y; size_t i; for (i = 0; i < __arraycount(n); i++) { y = ldexp(x, n[i]); if (fabs(y - (x * exp2(n[i]))) > eps) { atf_tc_fail_nonfatal("ldexp(%0.01f, %0.01f) " "!= %0.01f * exp2(%0.01f)", x, n[i], x, n[i]); } } } ATF_TC(ldexp_nan); ATF_TC_HEAD(ldexp_nan, tc) { atf_tc_set_md_var(tc, "descr", "Test ldexp(NaN) == NaN"); } ATF_TC_BODY(ldexp_nan, tc) { const double x = 0.0L / 0.0L; double y; size_t i; ATF_REQUIRE(isnan(x) != 0); for (i = 0; i < __arraycount(exps); i++) { y = ldexp(x, exps[i]); ATF_CHECK(isnan(y) != 0); } } ATF_TC(ldexp_inf_neg); ATF_TC_HEAD(ldexp_inf_neg, tc) { atf_tc_set_md_var(tc, "descr", "Test ldexp(-Inf) == -Inf"); } ATF_TC_BODY(ldexp_inf_neg, tc) { const double x = -1.0L / 0.0L; size_t i; for (i = 0; i < __arraycount(exps); i++) ATF_CHECK(ldexp(x, exps[i]) == x); } ATF_TC(ldexp_inf_pos); ATF_TC_HEAD(ldexp_inf_pos, tc) { atf_tc_set_md_var(tc, "descr", "Test ldexp(+Inf) == +Inf"); } ATF_TC_BODY(ldexp_inf_pos, tc) { const double x = 1.0L / 0.0L; size_t i; for (i = 0; i < __arraycount(exps); i++) ATF_CHECK(ldexp(x, exps[i]) == x); } ATF_TC(ldexp_zero_neg); ATF_TC_HEAD(ldexp_zero_neg, tc) { atf_tc_set_md_var(tc, "descr", "Test ldexp(-0.0) == -0.0"); } ATF_TC_BODY(ldexp_zero_neg, tc) { const double x = -0.0L; double y; size_t i; ATF_REQUIRE(signbit(x) != 0); for (i = 0; i < __arraycount(exps); i++) { y = ldexp(x, exps[i]); ATF_CHECK(x == y); ATF_CHECK(signbit(y) != 0); } } ATF_TC(ldexp_zero_pos); ATF_TC_HEAD(ldexp_zero_pos, tc) { atf_tc_set_md_var(tc, "descr", "Test ldexp(+0.0) == +0.0"); } ATF_TC_BODY(ldexp_zero_pos, tc) { const double x = 0.0L; double y; size_t i; ATF_REQUIRE(signbit(x) == 0); for (i = 0; i < __arraycount(exps); i++) { y = ldexp(x, exps[i]); ATF_CHECK(x == y); ATF_CHECK(signbit(y) == 0); } } /* * ldexpf(3) */ ATF_TC(ldexpf_exp2f); ATF_TC_HEAD(ldexpf_exp2f, tc) { atf_tc_set_md_var(tc, "descr", "Test ldexpf(x, n) == x * exp2f(n)"); } ATF_TC_BODY(ldexpf_exp2f, tc) { const float n[] = { 1, 2, 3, 10, 50, 100 }; const float eps = 1.0e-9; const float x = 12.0; float y; size_t i; for (i = 0; i < __arraycount(n); i++) { y = ldexpf(x, n[i]); if (fabsf(y - (x * exp2f(n[i]))) > eps) { atf_tc_fail_nonfatal("ldexpf(%0.01f, %0.01f) " "!= %0.01f * exp2f(%0.01f)", x, n[i], x, n[i]); } } } ATF_TC(ldexpf_nan); ATF_TC_HEAD(ldexpf_nan, tc) { atf_tc_set_md_var(tc, "descr", "Test ldexpf(NaN) == NaN"); } ATF_TC_BODY(ldexpf_nan, tc) { const float x = 0.0L / 0.0L; float y; size_t i; ATF_REQUIRE(isnan(x) != 0); for (i = 0; i < __arraycount(exps); i++) { y = ldexpf(x, exps[i]); ATF_CHECK(isnan(y) != 0); } } ATF_TC(ldexpf_inf_neg); ATF_TC_HEAD(ldexpf_inf_neg, tc) { atf_tc_set_md_var(tc, "descr", "Test ldexpf(-Inf) == -Inf"); } ATF_TC_BODY(ldexpf_inf_neg, tc) { const float x = -1.0L / 0.0L; size_t i; for (i = 0; i < __arraycount(exps); i++) ATF_CHECK(ldexpf(x, exps[i]) == x); } ATF_TC(ldexpf_inf_pos); ATF_TC_HEAD(ldexpf_inf_pos, tc) { atf_tc_set_md_var(tc, "descr", "Test ldexpf(+Inf) == +Inf"); } ATF_TC_BODY(ldexpf_inf_pos, tc) { const float x = 1.0L / 0.0L; size_t i; for (i = 0; i < __arraycount(exps); i++) ATF_CHECK(ldexpf(x, exps[i]) == x); } ATF_TC(ldexpf_zero_neg); ATF_TC_HEAD(ldexpf_zero_neg, tc) { atf_tc_set_md_var(tc, "descr", "Test ldexpf(-0.0) == -0.0"); } ATF_TC_BODY(ldexpf_zero_neg, tc) { const float x = -0.0L; float y; size_t i; ATF_REQUIRE(signbit(x) != 0); for (i = 0; i < __arraycount(exps); i++) { y = ldexpf(x, exps[i]); ATF_CHECK(x == y); ATF_CHECK(signbit(y) != 0); } } ATF_TC(ldexpf_zero_pos); ATF_TC_HEAD(ldexpf_zero_pos, tc) { atf_tc_set_md_var(tc, "descr", "Test ldexpf(+0.0) == +0.0"); } ATF_TC_BODY(ldexpf_zero_pos, tc) { const float x = 0.0L; float y; size_t i; ATF_REQUIRE(signbit(x) == 0); for (i = 0; i < __arraycount(exps); i++) { y = ldexpf(x, exps[i]); ATF_CHECK(x == y); ATF_CHECK(signbit(y) == 0); } } #define TEST(name, desc) \ ATF_TC(name); \ ATF_TC_HEAD(name, tc) \ { \ \ atf_tc_set_md_var(tc, "descr", \ "Test ldexp(3) for " ___STRING(desc)); \ } \ ATF_TC_BODY(name, tc) \ { \ if (strcmp("vax", MACHINE_ARCH) == 0) \ atf_tc_skip("Test not valid for " MACHINE_ARCH); \ run_test(name); \ } TEST(ldexp_basic, basics) TEST(ldexp_zero, zero) TEST(ldexp_infinity, infinity) TEST(ldexp_overflow, overflow) TEST(ldexp_denormal, denormal) TEST(ldexp_denormal_large, large) TEST(ldexp_underflow, underflow) ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, ldexp_basic); ATF_TP_ADD_TC(tp, ldexp_zero); ATF_TP_ADD_TC(tp, ldexp_infinity); ATF_TP_ADD_TC(tp, ldexp_overflow); ATF_TP_ADD_TC(tp, ldexp_denormal); ATF_TP_ADD_TC(tp, ldexp_underflow); ATF_TP_ADD_TC(tp, ldexp_denormal_large); ATF_TP_ADD_TC(tp, ldexp_exp2); ATF_TP_ADD_TC(tp, ldexp_nan); ATF_TP_ADD_TC(tp, ldexp_inf_neg); ATF_TP_ADD_TC(tp, ldexp_inf_pos); ATF_TP_ADD_TC(tp, ldexp_zero_neg); ATF_TP_ADD_TC(tp, ldexp_zero_pos); ATF_TP_ADD_TC(tp, ldexpf_exp2f); ATF_TP_ADD_TC(tp, ldexpf_nan); ATF_TP_ADD_TC(tp, ldexpf_inf_neg); ATF_TP_ADD_TC(tp, ldexpf_inf_pos); ATF_TP_ADD_TC(tp, ldexpf_zero_neg); ATF_TP_ADD_TC(tp, ldexpf_zero_pos); return atf_no_error(); } Index: stable/11/contrib/netbsd-tests/lib/libm/t_precision.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/libm/t_precision.c (revision 313679) +++ stable/11/contrib/netbsd-tests/lib/libm/t_precision.c (revision 313680) @@ -1,77 +1,79 @@ -/* $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. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation * by Joerg Sonnenberger. * * 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 -__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 #include #include ATF_TC(t_precision); ATF_TC_HEAD(t_precision, tc) { atf_tc_set_md_var(tc, "descr", "Basic precision test for double and long double"); } volatile double x = 1; +#if __HAVE_LONG_DOUBLE volatile long double y = 1; +#endif ATF_TC_BODY(t_precision, tc) { x += DBL_EPSILON; ATF_CHECK(x != 1.0); x -= 1; ATF_CHECK(x == DBL_EPSILON); x = 2; x += DBL_EPSILON; ATF_CHECK(x == 2.0); -#if !defined(__FreeBSD__) || !defined(__i386__) +#if __HAVE_LONG_DOUBLE y += LDBL_EPSILON; ATF_CHECK(y != 1.0L); y -= 1; ATF_CHECK(y == LDBL_EPSILON); y = 2; y += LDBL_EPSILON; ATF_CHECK(y == 2.0L); #endif } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, t_precision); return atf_no_error(); } Index: stable/11/contrib/netbsd-tests/lib/libpthread/h_common.h =================================================================== --- stable/11/contrib/netbsd-tests/lib/libpthread/h_common.h (revision 313679) +++ stable/11/contrib/netbsd-tests/lib/libpthread/h_common.h (revision 313680) @@ -1,12 +1,18 @@ #ifndef H_COMMON_H #define H_COMMON_H #include #define PTHREAD_REQUIRE(x) \ do { \ int ret = (x); \ 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 Index: stable/11/contrib/netbsd-tests/lib/libpthread/t_mutex.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/libpthread/t_mutex.c (revision 313679) +++ stable/11/contrib/netbsd-tests/lib/libpthread/t_mutex.c (revision 313680) @@ -1,599 +1,753 @@ -/* $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. * 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 __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 $"); +#ifdef __FreeBSD__ +#include /* For timespecadd */ +#include /* For UINT16_MAX */ +#endif #include #include #include #include +#include #include #include #include #include #include "h_common.h" 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) { int *param; printf("2: Second thread.\n"); 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)++; pthread_mutex_unlock(&mutex); return param; } ATF_TC(mutex1); ATF_TC_HEAD(mutex1, tc) { atf_tc_set_md_var(tc, "descr", "Checks mutexes"); } ATF_TC_BODY(mutex1, tc) { int x; pthread_t new; void *joinval; printf("1: Mutex-test 1\n"); 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); x = 20; printf("1: Before releasing the mutex.\n"); sleep(2); PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex)); 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); ATF_REQUIRE_EQ(*(int *)joinval, 21); PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex)); } static void * mutex2_threadfunc(void *arg) { long count = *(int *)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)); } return (void *)count; } ATF_TC(mutex2); ATF_TC_HEAD(mutex2, tc) { atf_tc_set_md_var(tc, "descr", "Checks mutexes"); #ifdef __NetBSD__ #if defined(__powerpc__) atf_tc_set_md_var(tc, "timeout", "40"); #endif #endif } ATF_TC_BODY(mutex2, tc) { int count, count2; pthread_t new; void *joinval; printf("1: Mutex-test 2\n"); #ifdef __NetBSD__ #if defined(__powerpc__) atf_tc_expect_timeout("PR port-powerpc/44387"); #endif #endif PTHREAD_REQUIRE(pthread_mutex_init(&mutex, NULL)); 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()); 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); #ifdef __NetBSD__ #if defined(__powerpc__) /* XXX force a timeout in ppc case since an un-triggered race otherwise looks like a "failure" */ /* We sleep for longer than the timeout to make ATF not complain about unexpected success */ sleep(41); #endif #endif } static void * mutex3_threadfunc(void *arg) { long count = *(int *)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)); } return (void *)count; } ATF_TC(mutex3); ATF_TC_HEAD(mutex3, tc) { atf_tc_set_md_var(tc, "descr", "Checks mutexes using a static " "initializer"); #ifdef __NetBSD__ #if defined(__powerpc__) atf_tc_set_md_var(tc, "timeout", "40"); #endif #endif } ATF_TC_BODY(mutex3, tc) { int count, count2; pthread_t new; void *joinval; printf("1: Mutex-test 3\n"); #ifdef __NetBSD__ #if defined(__powerpc__) atf_tc_expect_timeout("PR port-powerpc/44387"); #endif #endif 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()); 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); #ifdef __NetBSD__ #if defined(__powerpc__) /* XXX force a timeout in ppc case since an un-triggered race otherwise looks like a "failure" */ /* We sleep for longer than the timeout to make ATF not complain about unexpected success */ sleep(41); #endif #endif } static void * mutex4_threadfunc(void *arg) { int *param; printf("2: Second thread.\n"); 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)++; PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex)); return param; } ATF_TC(mutex4); ATF_TC_HEAD(mutex4, tc) { atf_tc_set_md_var(tc, "descr", "Checks mutexes"); } ATF_TC_BODY(mutex4, tc) { int x; pthread_t new; pthread_mutexattr_t mattr; void *joinval; printf("1: Mutex-test 4\n"); PTHREAD_REQUIRE(pthread_mutexattr_init(&mattr)); PTHREAD_REQUIRE(pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_RECURSIVE)); PTHREAD_REQUIRE(pthread_mutex_init(&mutex, &mattr)); 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); PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex)); printf("1: After releasing the mutex once.\n"); x = 20; printf("1: Before releasing the mutex twice.\n"); sleep(2); PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex)); printf("1: After releasing the mutex twice.\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); ATF_REQUIRE_EQ(*(int *)joinval, 21); PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex)); } #ifdef __NetBSD__ static pthread_mutexattr_t attr5; static pthread_mutex_t mutex5; static int min_fifo_prio, max_fifo_prio; static void * child_func(void* arg) { int res; printf("child is waiting\n"); 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); PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex5)); printf("child is done\n"); return 0; } ATF_TC(mutex5); ATF_TC_HEAD(mutex5, tc) { atf_tc_set_md_var(tc, "descr", "Checks mutexes for priority setting"); atf_tc_set_md_var(tc, "require.user", "root"); } ATF_TC_BODY(mutex5, tc) { int res; struct sched_param param; pthread_t child; min_fifo_prio = sched_get_priority_min(SCHED_FIFO); max_fifo_prio = sched_get_priority_max(SCHED_FIFO); printf("min prio for FIFO = %d\n", min_fifo_prio); param.sched_priority = min_fifo_prio; /* = 0 OTHER, 1 FIFO, 2 RR, -1 NONE */ res = sched_setscheduler(getpid(), SCHED_FIFO, ¶m); printf("previous policy used = %d\n", res); res = sched_getscheduler(getpid()); ATF_REQUIRE_EQ_MSG(res, SCHED_FIFO, "sched %d != FIFO %d", res, SCHED_FIFO); PTHREAD_REQUIRE(pthread_mutexattr_init(&attr5)); PTHREAD_REQUIRE(pthread_mutexattr_setprotocol(&attr5, PTHREAD_PRIO_PROTECT)); PTHREAD_REQUIRE(pthread_mutexattr_setprioceiling(&attr5, 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"); sleep(10); printf("main completes\n"); PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex5)); PTHREAD_REQUIRE(pthread_join(child, NULL)); } static pthread_mutex_t mutex6; static int start = 0; static uintmax_t high_cnt = 0, low_cnt = 0, MAX_LOOP = 100000000; static void * high_prio(void* arg) { struct sched_param param; int policy; param.sched_priority = min_fifo_prio + 10; pthread_t childid = pthread_self(); PTHREAD_REQUIRE(pthread_setschedparam(childid, 1, ¶m)); PTHREAD_REQUIRE(pthread_getschedparam(childid, &policy, ¶m)); printf("high protect = %d, prio = %d\n", _sched_protect(-2), param.sched_priority); ATF_REQUIRE_EQ(policy, 1); printf("high prio = %d\n", param.sched_priority); sleep(1); long tmp = 0; for (int i = 0; i < 20; i++) { while (high_cnt < MAX_LOOP) { tmp += (123456789 % 1234) * (987654321 % 54321); high_cnt += 1; } 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)); return 0; } static void * low_prio(void* arg) { struct sched_param param; int policy; param.sched_priority = min_fifo_prio; pthread_t childid = pthread_self(); int res = _sched_protect(max_fifo_prio); ATF_REQUIRE_EQ(res, 0); PTHREAD_REQUIRE(pthread_setschedparam(childid, 1, ¶m)); PTHREAD_REQUIRE(pthread_getschedparam(childid, &policy, ¶m)); printf("low protect = %d, prio = %d\n", _sched_protect(-2), param.sched_priority); ATF_REQUIRE_EQ(policy, 1); printf("low prio = %d\n", param.sched_priority); sleep(1); long tmp = 0; for (int i = 0; i < 20; i++) { while (low_cnt < MAX_LOOP) { tmp += (123456789 % 1234) * (987654321 % 54321); low_cnt += 1; } 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)); return 0; } ATF_TC(mutex6); ATF_TC_HEAD(mutex6, tc) { atf_tc_set_md_var(tc, "descr", "Checks scheduling for priority ceiling"); atf_tc_set_md_var(tc, "require.user", "root"); } /* * 1. main thread sets itself to be a realtime task and launched two tasks, * one has higher priority and the other has lower priority. * 2. each child thread(low and high priority thread) sets its scheduler and * priority. * 3. each child thread did several rounds of computation, after each round it * sleep 1 second. * 4. the child thread with low priority will call _sched_protect to increase * its protect priority. * 5. We verify the thread with low priority runs first. * * Why does it work? From the main thread, we launched the high * priority thread first. This gives this thread the benefit of * starting first. The low priority thread did not call _sched_protect(2). * The high priority thread should finish the task first. After each * round of computation, we call sleep, to put the task into the * sleep queue, and wake up again after the timer expires. This * gives the scheduler the chance to decide which task to run. So, * the thread with real high priority will always block the thread * with real low priority. * */ ATF_TC_BODY(mutex6, tc) { struct sched_param param; int res; pthread_t high, low; min_fifo_prio = sched_get_priority_min(SCHED_FIFO); max_fifo_prio = sched_get_priority_max(SCHED_FIFO); PTHREAD_REQUIRE(pthread_mutex_init(&mutex, NULL)); printf("min_fifo_prio = %d, max_fifo_info = %d\n", min_fifo_prio, max_fifo_prio); param.sched_priority = min_fifo_prio; res = sched_setscheduler(getpid(), SCHED_FIFO, ¶m); printf("previous policy used = %d\n", res); res = sched_getscheduler(getpid()); ATF_REQUIRE_EQ(res, 1); PTHREAD_REQUIRE(pthread_create(&high, NULL, high_prio, NULL)); PTHREAD_REQUIRE(pthread_create(&low, NULL, low_prio, NULL)); sleep(5); PTHREAD_REQUIRE(pthread_join(low, NULL)); PTHREAD_REQUIRE(pthread_join(high, NULL)); ATF_REQUIRE_EQ(start, 1); } #endif ATF_TC(mutexattr1); ATF_TC_HEAD(mutexattr1, tc) { atf_tc_set_md_var(tc, "descr", "Checks mutexattr"); } ATF_TC_BODY(mutexattr1, tc) { pthread_mutexattr_t mattr; int protocol, target; PTHREAD_REQUIRE(pthread_mutexattr_init(&mattr)); target = PTHREAD_PRIO_NONE; PTHREAD_REQUIRE(pthread_mutexattr_setprotocol(&mattr, target)); PTHREAD_REQUIRE(pthread_mutexattr_getprotocol(&mattr, &protocol)); ATF_REQUIRE_EQ(protocol, target); /* target = PTHREAD_PRIO_INHERIT; PTHREAD_REQUIRE(pthread_mutexattr_setprotocol(&mattr, target)); PTHREAD_REQUIRE(pthread_mutexattr_getprotocol(&mattr, &protocol)); ATF_REQUIRE_EQ(protocol, target); */ target = PTHREAD_PRIO_PROTECT; PTHREAD_REQUIRE(pthread_mutexattr_setprotocol(&mattr, target)); PTHREAD_REQUIRE(pthread_mutexattr_getprotocol(&mattr, &protocol)); ATF_REQUIRE_EQ(protocol, target); } ATF_TC(mutexattr2); ATF_TC_HEAD(mutexattr2, tc) { atf_tc_set_md_var(tc, "descr", "Checks mutexattr"); } ATF_TC_BODY(mutexattr2, tc) { pthread_mutexattr_t mattr; #ifdef __FreeBSD__ atf_tc_expect_fail("fails on i == 0 with: " "pthread_mutexattr_setprioceiling(&mattr, i): Invalid argument " "-- PR # 211802"); #endif PTHREAD_REQUIRE(pthread_mutexattr_init(&mattr)); int max_prio = sched_get_priority_max(SCHED_FIFO); int min_prio = sched_get_priority_min(SCHED_FIFO); for (int i = min_prio; i <= max_prio; i++) { int prioceiling; #ifdef __FreeBSD__ int protocol; PTHREAD_REQUIRE(pthread_mutexattr_getprotocol(&mattr, &protocol)); printf("priority: %d\nprotocol: %d\n", i, protocol); #endif PTHREAD_REQUIRE(pthread_mutexattr_setprioceiling(&mattr, i)); PTHREAD_REQUIRE(pthread_mutexattr_getprioceiling(&mattr, &prioceiling)); #ifdef __FreeBSD__ printf("prioceiling: %d\n", prioceiling); #endif ATF_REQUIRE_EQ(i, prioceiling); } } +#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); ATF_TP_ADD_TC(tp, mutex2); ATF_TP_ADD_TC(tp, mutex3); ATF_TP_ADD_TC(tp, mutex4); #ifdef __NetBSD__ ATF_TP_ADD_TC(tp, mutex5); ATF_TP_ADD_TC(tp, mutex6); #endif 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(); } Index: stable/11/contrib/netbsd-tests/lib/libpthread/t_timedmutex.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/libpthread/t_timedmutex.c (nonexistent) +++ stable/11/contrib/netbsd-tests/lib/libpthread/t_timedmutex.c (revision 313680) @@ -0,0 +1,30 @@ +/* $NetBSD: t_timedmutex.c,v 1.2 2016/10/31 16:21:23 christos Exp $ */ + +/* + * Copyright (c) 2008 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 TIMEDMUTEX +#include "t_mutex.c" Property changes on: stable/11/contrib/netbsd-tests/lib/libpthread/t_timedmutex.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/lib/librumpclient/h_execthr.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/librumpclient/h_execthr.c (revision 313679) +++ stable/11/contrib/netbsd-tests/lib/librumpclient/h_execthr.c (revision 313680) @@ -1,187 +1,221 @@ -/* $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. * 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 #include #include #include #include #include #include #include #include #include #include #include +//#define VERBOSE + +#ifdef VERBOSE +#define SAY(...) printf(__VA_ARGS__) +#else +#define SAY(...) +#endif + static int canreturn = 0; /* * Use a fairly large number of threads so that we have * a better chance catching races. XXX: this is rumpuser's * MAXWORKER-1. */ #define NTHR 63 #define P1_0 3 #define P1_1 4 #define P2_0 5 #define P2_1 6 static void * wrk(void *arg) { int fd = (uintptr_t)arg; rump_sys_read(fd, &fd, sizeof(fd)); if (!canreturn) errx(1, "should not have returned"); if (fd != 37) errx(1, "got invalid magic"); return NULL; } static int getproc(pid_t mypid, struct kinfo_proc2 *p) { int name[6]; size_t len = sizeof(*p); name[0] = CTL_KERN; name[1] = KERN_PROC2; name[2] = KERN_PROC_PID; name[3] = mypid; name[4] = len; name[5] = 1; return rump_sys___sysctl(name, __arraycount(name), p, &len, NULL, 0); } int main(int argc, char *argv[], char *envp[]) { struct kinfo_proc2 p; char *execarg[3]; int p1[2], p2[2]; pid_t mypid; pthread_t pt; ssize_t n; int i, execd; char nexec[16]; if (argc > 1) execd = atoi(argv[1]); else execd = 0; sprintf(nexec, "%d", execd+1); + SAY("execd: %d\n", execd); if (rumpclient_init() == -1) { if (execd) err(1, "init execd"); else 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) errx(1, "p1 assumptions failed %d %d", p1[0], p1[1]); if (rump_sys_pipe(p2) == -1) err(1, "pipe1"); if (p2[0] != P2_0 || p2[1] != P2_1) errx(1, "p2 assumptions failed"); if (rump_sys_fcntl(p1[0], F_SETFD, FD_CLOEXEC) == -1) err(1, "cloexec"); 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++) - if (pthread_create(&pt, NULL, - wrk, (void *)(uintptr_t)p2[0]) != 0) - errx(1, "pthread_create 2 %d", i); + 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); + } + + 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]; execarg[1] = nexec; execarg[2] = NULL; if (rumpclient_exec(argv[0], execarg, envp) == -1) err(1, "exec"); } Index: stable/11/contrib/netbsd-tests/lib/librumphijack/t_tcpip.sh =================================================================== --- stable/11/contrib/netbsd-tests/lib/librumphijack/t_tcpip.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/lib/librumphijack/t_tcpip.sh (revision 313680) @@ -1,272 +1,273 @@ -# $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. # # 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. # -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 http_head() { atf_set "descr" "Start hijacked httpd and get webpage from it" } 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 \ /usr/libexec/httpd -P ./httpd.pid -b -s $(atf_get_srcdir) atf_check -s exit:0 -o file:"$(atf_get_srcdir)/netstat.expout" \ rump.netstat -a # get the webpage atf_check -s exit:0 env LD_PRELOAD=/usr/lib/librumphijack.so \ $(atf_get_srcdir)/h_netget 127.0.0.1 80 webfile # check that we got what we wanted atf_check -o match:'HTTP/1.0 200 OK' cat webfile atf_check -o match:'Content-Length: 95' cat webfile blank_line_re="$(printf '^\r$')" # matches a line with only atf_check -o file:"$(atf_get_srcdir)/index.html" \ sed -n "1,/${blank_line_re}/!p" webfile } http_cleanup() { if [ -f httpd.pid ]; then kill -9 "$(cat httpd.pid)" rm -f httpd.pid fi rump.halt } # # Starts a SSH server and sets up the client to access it. # Authentication is allowed and done using an RSA key exclusively, which # is generated on the fly as part of the test case. # XXX: Ideally, all the tests in this test program should be able to share # the generated key, because creating it can be a very slow process on some # machines. # # XXX2: copypasted from jmmv's sshd thingamob in the psshfs test. # ideally code (and keys, like jmmv notes above) could be shared # start_sshd() { echo "Setting up SSH server configuration" sed -e "s,@SRCDIR@,$(atf_get_srcdir),g" -e "s,@WORKDIR@,$(pwd),g" \ $(atf_get_srcdir)/sshd_config.in >sshd_config || \ atf_fail "Failed to create sshd_config" atf_check -s ignore -o empty -e ignore \ cp $(atf_get_srcdir)/ssh_host_key . atf_check -s ignore -o empty -e ignore \ cp $(atf_get_srcdir)/ssh_host_key.pub . atf_check -s eq:0 -o empty -e empty chmod 400 ssh_host_key atf_check -s eq:0 -o empty -e empty chmod 444 ssh_host_key.pub env LD_PRELOAD=/usr/lib/librumphijack.so \ /usr/sbin/sshd -e -f ./sshd_config while [ ! -f sshd.pid ]; do sleep 0.01 done echo "SSH server started (pid $(cat sshd.pid))" echo "Setting up SSH client configuration" atf_check -s eq:0 -o empty -e empty \ ssh-keygen -f ssh_user_key -t rsa -b 1024 -N "" -q atf_check -s eq:0 -o empty -e empty \ cp ssh_user_key.pub authorized_keys echo "127.0.0.1,localhost,::1 " \ "$(cat $(atf_get_srcdir)/ssh_host_key.pub)" >known_hosts || \ atf_fail "Failed to create known_hosts" atf_check -s eq:0 -o empty -e empty chmod 600 authorized_keys sed -e "s,@SRCDIR@,$(atf_get_srcdir),g" -e "s,@WORKDIR@,$(pwd),g" \ $(atf_get_srcdir)/ssh_config.in >ssh_config || \ atf_fail "Failed to create ssh_config" echo "sshd running" } atf_test_case ssh cleanup ssh_head() { atf_set "descr" "Test that hijacked ssh/sshd works" } ssh_body() { atf_expect_fail "PR lib/50174" atf_check -s exit:0 ${rumpnetsrv} ${RUMP_SERVER} # make sure clients die after we nuke the server export RUMPHIJACK_RETRYCONNECT='die' start_sshd # create some sort of directory for us to "ls" mkdir testdir cd testdir jot 11 | xargs touch jot 11 12 | xargs mkdir cd .. atf_check -s exit:0 -o save:ssh.out \ env LD_PRELOAD=/usr/lib/librumphijack.so \ ssh -T -F ssh_config 127.0.0.1 env BLOCKSIZE=512 \ ls -li $(pwd)/testdir atf_check -s exit:0 -o file:ssh.out env BLOCKSIZE=512 \ ls -li $(pwd)/testdir } ssh_cleanup() { rump.halt # sshd dies due to RUMPHIJACK_RETRYCONNECT=1d6 } test_nfs() { magicstr='wind in my hair' # create ffs file system we'll be serving from atf_check -s exit:0 -o ignore newfs -F -s 10000 ffs.img # start nfs kernel server. this is a mouthful export RUMP_SERVER=unix://serversock atf_check -s exit:0 rump_server $* ${RUMP_SERVER} atf_check -s exit:0 rump.ifconfig shmif0 create atf_check -s exit:0 rump.ifconfig shmif0 linkstr shmbus atf_check -s exit:0 rump.ifconfig shmif0 inet 10.1.1.1 export RUMPHIJACK_RETRYCONNECT=die export LD_PRELOAD=/usr/lib/librumphijack.so atf_check -s exit:0 mkdir -p /rump/var/run atf_check -s exit:0 mkdir -p /rump/var/db atf_check -s exit:0 touch /rump/var/db/mountdtab atf_check -s exit:0 mkdir /rump/etc atf_check -s exit:0 mkdir /rump/export atf_check -s exit:0 -x \ 'echo "/export -noresvport -noresvmnt 10.1.1.100" | \ dd of=/rump/etc/exports 2> /dev/null' atf_check -s exit:0 rump.sysctl -q -w kern.module.autoload=1 atf_check -s exit:0 -e ignore mount_ffs /dk /rump/export atf_check -s exit:0 -x "echo ${magicstr} > /rump/export/im_alive" # start rpcbind. we want /var/run/rpcbind.sock export RUMPHIJACK='blanket=/var/run,socket=all' atf_check -s exit:0 rpcbind # ok, then we want mountd in the similar fashion export RUMPHIJACK='blanket=/var/run:/var/db:/export,socket=all,path=/rump,vfs=all' atf_check -s exit:0 mountd /rump/etc/exports # finally, le nfschuck export RUMPHIJACK='blanket=/var/run,socket=all,vfs=all' atf_check -s exit:0 nfsd # # now, time for the client server and associated madness. # export RUMP_SERVER=unix://clientsock unset RUMPHIJACK unset LD_PRELOAD # at least the kernel server is easier atf_check -s exit:0 rump_server -lrumpvfs -lrumpnet -lrumpdev \ -lrumpnet_net -lrumpnet_netinet -lrumpnet_shmif -lrumpfs_nfs\ ${RUMP_SERVER} atf_check -s exit:0 rump.ifconfig shmif0 create atf_check -s exit:0 rump.ifconfig shmif0 linkstr shmbus atf_check -s exit:0 rump.ifconfig shmif0 inet 10.1.1.100 export LD_PRELOAD=/usr/lib/librumphijack.so atf_check -s exit:0 mkdir /rump/mnt atf_check -s exit:0 mount_nfs 10.1.1.1:/export /rump/mnt atf_check -s exit:0 -o inline:"${magicstr}\n" cat /rump/mnt/im_alive atf_check -s exit:0 -o match:'.*im_alive$' ls -l /rump/mnt/im_alive } atf_test_case nfs cleanup nfs_head() { atf_set "descr" "Test hijacked nfsd and mount_nfs" } nfs_body() { test_nfs -lrumpvfs -lrumpdev -lrumpnet -lrumpnet_net \ -lrumpnet_netinet -lrumpnet_local -lrumpnet_shmif -lrumpdev \ -lrumpdev_disk -lrumpfs_ffs -lrumpfs_nfs -lrumpfs_nfsserver \ -d key=/dk,hostpath=ffs.img,size=host } nfs_cleanup() { RUMP_SERVER=unix://serversock rump.halt 2> /dev/null RUMP_SERVER=unix://clientsock rump.halt 2> /dev/null : } atf_test_case nfs_autoload cleanup nfs_autoload_head() { atf_set "descr" "Test hijacked nfsd with autoload from /stand" } nfs_autoload_body() { [ `uname -m` = "i386" ] || atf_skip "test currently valid only on i386" test_nfs -lrumpvfs -lrumpdev -lrumpnet -lrumpnet_net \ -lrumpnet_netinet -lrumpnet_local -lrumpnet_shmif -lrumpdev \ -lrumpdev_disk -d key=/dk,hostpath=ffs.img,size=host } nfs_autoload_cleanup() { nfs_cleanup } atf_init_test_cases() { atf_add_test_case http atf_add_test_case ssh atf_add_test_case nfs atf_add_test_case nfs_autoload } Index: stable/11/contrib/netbsd-tests/lib/libusbhid/t_usbhid.c =================================================================== --- stable/11/contrib/netbsd-tests/lib/libusbhid/t_usbhid.c (revision 313679) +++ stable/11/contrib/netbsd-tests/lib/libusbhid/t_usbhid.c (revision 313680) @@ -1,449 +1,452 @@ -/* $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 * 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 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 HOLDER 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 -__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 #include #include #include #include #include #include ATF_TC(check_hid_logical_range); ATF_TC(check_hid_physical_range); ATF_TC(check_hid_usage); ATF_TC(check_hid_get_data); ATF_TC(check_hid_set_data); ATF_TC(check_parse_just_pop); #define MYd_ATF_CHECK_EQ(d, v) \ ATF_CHECK_EQ_MSG(d, v, "== %d", (d)) #define MYu_ATF_CHECK_EQ(d, v) \ ATF_CHECK_EQ_MSG(d, v, "== %u", (d)) #define MYx_ATF_CHECK_EQ(d, v) \ ATF_CHECK_EQ_MSG(d, v, "== 0x%x", (d)) #include "hid_test_data.c" ATF_TC_HEAD(check_hid_usage, tc) { atf_tc_set_md_var(tc, "descr", "Test libusbhid usage.c"); } ATF_TC_BODY(check_hid_usage, tc) { char usages_path[PATH_MAX]; (void)strlcpy(usages_path, atf_tc_get_config_var(tc, "srcdir"), sizeof(usages_path)); (void)strlcat(usages_path, "/test_usb_hid_usages", sizeof(usages_path)); hid_init(usages_path); ATF_CHECK_STREQ("t_usbhid_page", hid_usage_page(0xff1b)); ATF_CHECK_EQ((uint32_t)hid_parse_usage_page("t_usbhid_page"), 0xff1b); ATF_CHECK_STREQ("t_usbhid_usage", hid_usage_in_page(0xff1bff2a)); ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page( "t_usbhid_page:t_usbhid_usage"), 0xff1bff2a); ATF_CHECK_STREQ("Quick_zephyrs_blow_vexing_daft_Jim_", hid_usage_page(0xff2a)); ATF_CHECK_EQ((uint32_t)hid_parse_usage_page( "Quick_zephyrs_blow_vexing_daft_Jim_"), 0xff2a); ATF_CHECK_STREQ("Usage_ID_Zero_%", hid_usage_in_page(0xff2a0000)); ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page( "Quick_zephyrs_blow_vexing_daft_Jim_:Usage_ID_Zero_%"), 0xff2a0000); //ATF_CHECK_STREQ("Usage_ID_0_%", hid_usage_in_page(0xff2a0000)); ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page( "Quick_zephyrs_blow_vexing_daft_Jim_:Usage_ID_0_%"), 0xff2a0000); ATF_CHECK_STREQ("Usage_ID_65535_%", hid_usage_in_page(0xff2affff)); ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page( "Quick_zephyrs_blow_vexing_daft_Jim_:Usage_ID_65535_%"), 0xff2affff); MYx_ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page("0xff2a:0xff1b"), 0xff2aff1b); } ATF_TC_HEAD(check_hid_logical_range, tc) { atf_tc_set_md_var(tc, "descr", "Test hid_get_item " "Logical Minimum/Maximum results"); } ATF_TC_BODY(check_hid_logical_range, tc) { report_desc_t hrd; hid_item_t hi; uint32_t minimum, maximum; 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); ATF_REQUIRE(hid_locate(hrd, 0xff000001U, hid_input, &hi, NO_REPORT_ID) > 0); MYd_ATF_CHECK_EQ(hi.logical_minimum, -128); MYd_ATF_CHECK_EQ(hi.logical_maximum, 127); ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi, NO_REPORT_ID) > 0); MYd_ATF_CHECK_EQ(hi.logical_minimum, -32768); MYd_ATF_CHECK_EQ(hi.logical_maximum, 32767); ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi, NO_REPORT_ID) > 0); MYd_ATF_CHECK_EQ(hi.logical_minimum, -2147483648); MYd_ATF_CHECK_EQ(hi.logical_maximum, 2147483647); hid_dispose_report_desc(hrd); hrd = NULL; ATF_REQUIRE((hrd = hid_use_report_desc( unsigned_range_test_report_descriptor, __arraycount(unsigned_range_test_report_descriptor))) != NULL); ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi, NO_REPORT_ID) > 0); ATF_CHECK(hi.logical_minimum > hi.logical_maximum); minimum = (uint32_t)hi.logical_minimum & ((1ULL< 0); ATF_CHECK(hi.logical_minimum > hi.logical_maximum); minimum = hi.logical_minimum & ((1ULL< 0); ATF_CHECK(hi.logical_minimum > hi.logical_maximum); minimum = hi.logical_minimum & ((1ULL< 0); MYd_ATF_CHECK_EQ(hi.physical_minimum, -128); MYd_ATF_CHECK_EQ(hi.physical_maximum, 127); ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi, NO_REPORT_ID) > 0); MYd_ATF_CHECK_EQ(hi.physical_minimum, -32768); MYd_ATF_CHECK_EQ(hi.physical_maximum, 32767); ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi, NO_REPORT_ID) > 0); MYd_ATF_CHECK_EQ(hi.physical_minimum, -2147483648); MYd_ATF_CHECK_EQ(hi.physical_maximum, 2147483647); hid_dispose_report_desc(hrd); hrd = NULL; ATF_REQUIRE((hrd = hid_use_report_desc( unsigned_range_test_report_descriptor, __arraycount(unsigned_range_test_report_descriptor))) != NULL); ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi, NO_REPORT_ID) > 0); ATF_CHECK(hi.physical_minimum > hi.physical_maximum); minimum = (uint32_t)hi.physical_minimum & ((1ULL< 0); ATF_CHECK(hi.physical_minimum > hi.physical_maximum); minimum = hi.physical_minimum & ((1ULL< 0); ATF_CHECK(hi.physical_minimum > hi.physical_maximum); minimum = hi.physical_minimum & ((1ULL< 0); data = hid_get_data(range_test_minimum_report, &hi); MYd_ATF_CHECK_EQ(data, -128); data = hid_get_data(range_test_negative_one_report, &hi); MYd_ATF_CHECK_EQ(data, -1); data = hid_get_data(range_test_positive_one_report, &hi); MYd_ATF_CHECK_EQ(data, 1); data = hid_get_data(range_test_maximum_report, &hi); MYd_ATF_CHECK_EQ(data, 127); ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi, NO_REPORT_ID) > 0); data = hid_get_data(range_test_minimum_report, &hi); MYd_ATF_CHECK_EQ(data, -32768); data = hid_get_data(range_test_negative_one_report, &hi); MYd_ATF_CHECK_EQ(data, -1); data = hid_get_data(range_test_positive_one_report, &hi); MYd_ATF_CHECK_EQ(data, 1); data = hid_get_data(range_test_maximum_report, &hi); MYd_ATF_CHECK_EQ(data, 32767); ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi, NO_REPORT_ID) > 0); data = hid_get_data(range_test_minimum_report, &hi); MYd_ATF_CHECK_EQ(data, -2147483648); data = hid_get_data(range_test_negative_one_report, &hi); MYd_ATF_CHECK_EQ(data, -1); data = hid_get_data(range_test_positive_one_report, &hi); MYd_ATF_CHECK_EQ(data, 1); data = hid_get_data(range_test_maximum_report, &hi); MYd_ATF_CHECK_EQ(data, 2147483647); hid_dispose_report_desc(hrd); hrd = NULL; ATF_REQUIRE((hrd = hid_use_report_desc( unsigned_range_test_report_descriptor, __arraycount(unsigned_range_test_report_descriptor))) != NULL); ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi, NO_REPORT_ID) > 0); udat = hid_get_data(unsigned_range_test_minimum_report, &hi); MYu_ATF_CHECK_EQ(udat, 0); udat = hid_get_data(unsigned_range_test_positive_one_report, &hi); MYu_ATF_CHECK_EQ(udat, 1); udat = hid_get_data(unsigned_range_test_negative_one_report, &hi); MYu_ATF_CHECK_EQ(udat, 254); udat = hid_get_data(unsigned_range_test_maximum_report, &hi); MYu_ATF_CHECK_EQ(udat, 255); ATF_REQUIRE(hid_locate(hrd, 0xff000012U, hid_input, &hi, NO_REPORT_ID) > 0); udat = hid_get_data(unsigned_range_test_minimum_report, &hi); MYu_ATF_CHECK_EQ(udat, 0); udat = hid_get_data(unsigned_range_test_positive_one_report, &hi); MYu_ATF_CHECK_EQ(udat, 1); udat = hid_get_data(unsigned_range_test_negative_one_report, &hi); MYu_ATF_CHECK_EQ(udat, 65534); udat = hid_get_data(unsigned_range_test_maximum_report, &hi); MYu_ATF_CHECK_EQ(udat, 65535); ATF_REQUIRE(hid_locate(hrd, 0xff000013U, hid_input, &hi, NO_REPORT_ID) > 0); udat = hid_get_data(unsigned_range_test_minimum_report, &hi); MYu_ATF_CHECK_EQ(udat, 0); udat = hid_get_data(unsigned_range_test_positive_one_report, &hi); MYu_ATF_CHECK_EQ(udat, 1); udat = hid_get_data(unsigned_range_test_negative_one_report, &hi); MYu_ATF_CHECK_EQ(udat, 4294967294); udat = hid_get_data(unsigned_range_test_maximum_report, &hi); MYu_ATF_CHECK_EQ(udat, 4294967295); hid_dispose_report_desc(hrd); hrd = NULL; } ATF_TC_HEAD(check_hid_set_data, tc) { atf_tc_set_md_var(tc, "descr", "Test hid_set_data results"); } ATF_TC_BODY(check_hid_set_data, tc) { report_desc_t hrd; hid_item_t hi; uint8_t test_data_minimum[7]; uint8_t test_data_negative_one[7]; uint8_t test_data_positive_one[7]; uint8_t test_data_maximum[7]; ATF_REQUIRE((hrd = hid_use_report_desc( range_test_report_descriptor, __arraycount(range_test_report_descriptor))) != NULL); ATF_REQUIRE(hid_locate(hrd, 0xff000001U, hid_input, &hi, NO_REPORT_ID) > 0); hid_set_data(test_data_minimum, &hi, -128); hid_set_data(test_data_negative_one, &hi, -1); hid_set_data(test_data_positive_one, &hi, 1); hid_set_data(test_data_maximum, &hi, 127); ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi, NO_REPORT_ID) > 0); hid_set_data(test_data_minimum, &hi, -32768); hid_set_data(test_data_negative_one, &hi, -1); hid_set_data(test_data_positive_one, &hi, 1); hid_set_data(test_data_maximum, &hi, 32767); ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi, NO_REPORT_ID) > 0); hid_set_data(test_data_minimum, &hi, -2147483648); hid_set_data(test_data_negative_one, &hi, -1); hid_set_data(test_data_positive_one, &hi, 1); hid_set_data(test_data_maximum, &hi, 2147483647); ATF_CHECK(memcmp(test_data_minimum, range_test_minimum_report, sizeof test_data_minimum) == 0); ATF_CHECK(memcmp(test_data_negative_one, range_test_negative_one_report, sizeof test_data_negative_one) == 0); ATF_CHECK(memcmp(test_data_positive_one, range_test_positive_one_report, sizeof test_data_positive_one) == 0); ATF_CHECK(memcmp(test_data_maximum, range_test_maximum_report, sizeof test_data_maximum) == 0); hid_dispose_report_desc(hrd); hrd = NULL; ATF_REQUIRE((hrd = hid_use_report_desc( unsigned_range_test_report_descriptor, __arraycount(range_test_report_descriptor))) != NULL); ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi, NO_REPORT_ID) > 0); hid_set_data(test_data_minimum, &hi, 0); hid_set_data(test_data_positive_one, &hi, 1); hid_set_data(test_data_negative_one, &hi, 0xfffffffe); hid_set_data(test_data_maximum, &hi, 0xffffffff); ATF_REQUIRE(hid_locate(hrd, 0xff000012U, hid_input, &hi, NO_REPORT_ID) > 0); hid_set_data(test_data_minimum, &hi, 0); hid_set_data(test_data_positive_one, &hi, 1); hid_set_data(test_data_negative_one, &hi, 0xfffe); hid_set_data(test_data_maximum, &hi, 0xffff); ATF_REQUIRE(hid_locate(hrd, 0xff000013U, hid_input, &hi, NO_REPORT_ID) > 0); hid_set_data(test_data_minimum, &hi, 0); hid_set_data(test_data_positive_one, &hi, 1); hid_set_data(test_data_negative_one, &hi, 0xfffffffe); hid_set_data(test_data_maximum, &hi, 0xffffffff); ATF_CHECK(memcmp(test_data_minimum, unsigned_range_test_minimum_report, sizeof test_data_minimum) == 0); ATF_CHECK(memcmp(test_data_negative_one, unsigned_range_test_negative_one_report, sizeof test_data_negative_one) == 0); ATF_CHECK(memcmp(test_data_positive_one, unsigned_range_test_positive_one_report, sizeof test_data_positive_one) == 0); ATF_CHECK(memcmp(test_data_maximum, unsigned_range_test_maximum_report, sizeof test_data_maximum) == 0); hid_dispose_report_desc(hrd); hrd = NULL; } ATF_TC_HEAD(check_parse_just_pop, tc) { atf_tc_set_md_var(tc, "descr", "check Pop on empty stack bug"); } ATF_TC_BODY(check_parse_just_pop, tc) { report_desc_t hrd; hid_data_t hd; hid_item_t hi; ATF_REQUIRE((hrd = hid_use_report_desc( just_pop_report_descriptor, sizeof just_pop_report_descriptor)) != NULL); hd = hid_start_parse(hrd, 0, NO_REPORT_ID); while (hid_get_item(hd, &hi) > 0) { } hid_end_parse(hd); hid_dispose_report_desc(hrd); hrd = NULL; } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, check_hid_logical_range); ATF_TP_ADD_TC(tp, check_hid_physical_range); ATF_TP_ADD_TC(tp, check_hid_usage); ATF_TP_ADD_TC(tp, check_hid_get_data); ATF_TP_ADD_TC(tp, check_hid_set_data); ATF_TP_ADD_TC(tp, check_parse_just_pop); return atf_no_error(); } Index: stable/11/contrib/netbsd-tests/net/arp/t_arp.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/arp/t_arp.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/arp/t_arp.sh (revision 313680) @@ -1,653 +1,612 @@ -# $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. # # 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. # -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 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 atf_test_case arp_cache_expiration_10s cleanup atf_test_case arp_command cleanup atf_test_case arp_garp cleanup atf_test_case arp_cache_overwriting cleanup atf_test_case arp_proxy_arp_pub cleanup atf_test_case arp_proxy_arp_pubproxy cleanup atf_test_case arp_link_activation cleanup atf_test_case arp_static cleanup arp_cache_expiration_5s_head() { atf_set "descr" "Tests for ARP cache expiration (5s)" atf_set "require.progs" "rump_server" } arp_cache_expiration_10s_head() { atf_set "descr" "Tests for ARP cache expiration (10s)" atf_set "require.progs" "rump_server" } arp_command_head() { atf_set "descr" "Tests for arp_commands of arp(8)" atf_set "require.progs" "rump_server" } arp_garp_head() { atf_set "descr" "Tests for GARP" atf_set "require.progs" "rump_server" } arp_cache_overwriting_head() { atf_set "descr" "Tests for behavior of overwriting ARP caches" atf_set "require.progs" "rump_server" } arp_proxy_arp_pub_head() { atf_set "descr" "Tests for Proxy ARP (pub)" atf_set "require.progs" "rump_server" } arp_proxy_arp_pubproxy_head() { atf_set "descr" "Tests for Proxy ARP (pub proxy)" atf_set "require.progs" "rump_server" } arp_link_activation_head() { atf_set "descr" "Tests for activating a new MAC address" atf_set "require.progs" "rump_server" } arp_static_head() { atf_set "descr" "Tests for static ARP entries" atf_set "require.progs" "rump_server" } 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 $DEBUG && rump.ifconfig shmif0 $DEBUG && rump.arp -n -a } setup_src_server() { local keep=$1 export RUMP_SERVER=$SOCKSRC # Adjust ARP parameters 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 # Sanity check $DEBUG && rump.ifconfig shmif0 $DEBUG && rump.arp -n -a atf_check -s exit:0 -o ignore rump.arp -n $IP4SRC atf_check -s not-exit:0 -e ignore rump.arp -n $IP4DST } 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 # # Check if a cache is expired expectedly # export RUMP_SERVER=$SOCKSRC atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP4DST $DEBUG && rump.arp -n -a atf_check -s exit:0 -o ignore rump.arp -n $IP4SRC # Should be cached atf_check -s exit:0 -o ignore rump.arp -n $IP4DST atf_check -s exit:0 sleep $(($arp_keep + $bonus)) $DEBUG && rump.arp -n -a atf_check -s exit:0 -o ignore rump.arp -n $IP4SRC # Should be expired atf_check -s not-exit:0 -e ignore rump.arp -n $IP4DST } 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() { 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 export RUMP_SERVER=$SOCKSRC # We can delete the entry for the interface's IP address atf_check -s exit:0 -o ignore rump.arp -d $IP4SRC # Add and delete a static entry $DEBUG && rump.arp -n -a atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:10 $DEBUG && rump.arp -n -a atf_check -s exit:0 -o match:'b2:a0:20:00:00:10' rump.arp -n 10.0.1.10 atf_check -s exit:0 -o match:'permanent' rump.arp -n 10.0.1.10 atf_check -s exit:0 -o ignore rump.arp -d 10.0.1.10 $DEBUG && rump.arp -n -a atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.10 # Add multiple entries via a file cat - > ./list <<-EOF 10.0.1.11 b2:a0:20:00:00:11 10.0.1.12 b2:a0:20:00:00:12 10.0.1.13 b2:a0:20:00:00:13 10.0.1.14 b2:a0:20:00:00:14 10.0.1.15 b2:a0:20:00:00:15 EOF $DEBUG && rump.arp -n -a atf_check -s exit:0 -o ignore rump.arp -f ./list $DEBUG && rump.arp -n -a atf_check -s exit:0 -o match:'b2:a0:20:00:00:11' rump.arp -n 10.0.1.11 atf_check -s exit:0 -o match:'permanent' rump.arp -n 10.0.1.11 atf_check -s exit:0 -o match:'b2:a0:20:00:00:12' rump.arp -n 10.0.1.12 atf_check -s exit:0 -o match:'permanent' rump.arp -n 10.0.1.12 atf_check -s exit:0 -o match:'b2:a0:20:00:00:13' rump.arp -n 10.0.1.13 atf_check -s exit:0 -o match:'permanent' rump.arp -n 10.0.1.13 atf_check -s exit:0 -o match:'b2:a0:20:00:00:14' rump.arp -n 10.0.1.14 atf_check -s exit:0 -o match:'permanent' rump.arp -n 10.0.1.14 atf_check -s exit:0 -o match:'b2:a0:20:00:00:15' rump.arp -n 10.0.1.15 atf_check -s exit:0 -o match:'permanent' rump.arp -n 10.0.1.15 # Test arp -a atf_check -s exit:0 -o match:'10.0.1.11' rump.arp -n -a atf_check -s exit:0 -o match:'10.0.1.12' rump.arp -n -a atf_check -s exit:0 -o match:'10.0.1.13' rump.arp -n -a atf_check -s exit:0 -o match:'10.0.1.14' rump.arp -n -a atf_check -s exit:0 -o match:'10.0.1.15' rump.arp -n -a # Flush all entries $DEBUG && rump.arp -n -a atf_check -s exit:0 -o ignore rump.arp -d -a atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.11 atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.12 atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.13 atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.14 atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.15 atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.1 # Test temp option $DEBUG && rump.arp -n -a atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:10 temp $DEBUG && rump.arp -n -a atf_check -s exit:0 -o match:'b2:a0:20:00:00:10' rump.arp -n 10.0.1.10 atf_check -s exit:0 -o not-match:'permanent' rump.arp -n 10.0.1.10 # Hm? the cache doesn't expire... atf_check -s exit:0 sleep $(($arp_keep + $bonus)) $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() { local target=$1 local sender=$2 pkt="> ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42:" pkt="$pkt Request who-has $target tell $sender, length 28" echo $pkt } 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 $DEBUG && rump.ifconfig shmif0 atf_check -s exit:0 sleep 1 shmif_dumpbus -p - bus1 2>/dev/null| tcpdump -n -e -r - > ./out # A GARP packet is sent for the primary address pkt=$(make_pkt_str_arpreq 10.0.0.1 10.0.0.1) atf_check -s exit:0 -x "cat ./out |grep -q '$pkt'" # No GARP packet is sent for the alias address pkt=$(make_pkt_str_arpreq 10.0.0.2 10.0.0.2) atf_check -s not-exit:0 -x "cat ./out |grep -q '$pkt'" atf_check -s exit:0 rump.ifconfig -w 10 atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.3/24 atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.4/24 alias # No GARP packets are sent during IFF_UP shmif_dumpbus -p - bus1 2>/dev/null| tcpdump -n -e -r - > ./out pkt=$(make_pkt_str_arpreq 10.0.0.3 10.0.0.3) 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() { 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 export RUMP_SERVER=$SOCKSRC # Cannot overwrite a permanent cache atf_check -s not-exit:0 -e match:'File exists' \ rump.arp -s $IP4SRC b2:a0:20:00:00:ff $DEBUG && rump.arp -n -a atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP4DST $DEBUG && rump.arp -n -a # Can overwrite a dynamic cache atf_check -s exit:0 -o ignore rump.arp -s $IP4DST b2:a0:20:00:00:00 $DEBUG && rump.arp -n -a atf_check -s exit:0 -o match:'b2:a0:20:00:00:00' rump.arp -n $IP4DST atf_check -s exit:0 -o match:'permanent' rump.arp -n $IP4DST atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:10 temp $DEBUG && rump.arp -n -a atf_check -s exit:0 -o match:'b2:a0:20:00:00:10' rump.arp -n 10.0.1.10 atf_check -s exit:0 -o not-match:'permanent' rump.arp -n 10.0.1.10 # Can overwrite a temp cache atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:ff 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() { local ip=$1 local mac=$2 pkt="ethertype ARP (0x0806), length 42: " pkt="Reply $ip is-at $mac, length 28" echo $pkt } make_pkt_str_garp() { local ip=$1 local mac=$2 local pkt= pkt="$mac > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806)," pkt="$pkt length 42: Request who-has $ip tell $ip, length 28" 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" title="permanent published" else opts="pub proxy" title='permanent published \(proxy only\)' fi # # Test#1: First setup an endpoint then create proxy arp entry # export RUMP_SERVER=$SOCKDST atf_check -s exit:0 rump.ifconfig tap1 create atf_check -s exit:0 rump.ifconfig tap1 $IP4DST_PROXYARP1/24 up atf_check -s exit:0 rump.ifconfig -w 10 # Try to ping (should fail w/o proxy arp) export RUMP_SERVER=$SOCKSRC atf_check -s not-exit:0 -o ignore -e ignore \ 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 atf_check -s exit:0 -o ignore \ rump.arp -s $IP4DST_PROXYARP1 $macaddr_dst $opts atf_check -s exit:0 -o match:"$title" rump.arp -n $IP4DST_PROXYARP1 # Try to ping export RUMP_SERVER=$SOCKSRC if [ "$type" = "pub" ]; then # XXX fails atf_check -s not-exit:0 -o ignore -e ignore \ rump.ping -n -w 1 -c 1 $IP4DST_PROXYARP1 else atf_check -s exit:0 -o ignore \ 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) pkt2=$(make_pkt_str_garp $IP4DST_PROXYARP1 $macaddr_dst) if [ "$type" = "pub" ]; then atf_check -s not-exit:0 -x \ "cat ./out |grep -q -e '$pkt1' -e '$pkt2'" else atf_check -s exit:0 -x "cat ./out |grep -q -e '$pkt1' -e '$pkt2'" fi # # Test#2: Create proxy arp entry then set up an endpoint # export RUMP_SERVER=$SOCKDST atf_check -s exit:0 -o ignore \ rump.arp -s $IP4DST_PROXYARP2 $macaddr_dst $opts atf_check -s exit:0 -o match:"$title" rump.arp -n $IP4DST_PROXYARP2 $DEBUG && rump.netstat -nr -f inet # Try to ping (should fail because no endpoint exists) export RUMP_SERVER=$SOCKSRC 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 pkt=$(make_pkt_str_arprep $IP4DST_PROXYARP2 $macaddr_dst) atf_check -s exit:0 -x "cat ./out |grep -q '$pkt'" export RUMP_SERVER=$SOCKDST atf_check -s exit:0 rump.ifconfig tap2 create atf_check -s exit:0 rump.ifconfig tap2 $IP4DST_PROXYARP2/24 up atf_check -s exit:0 rump.ifconfig -w 10 # Try to ping export RUMP_SERVER=$SOCKSRC atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST_PROXYARP2 } 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() { 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 atf_check -s exit:0 -o ignore rump.ifconfig shmif0 link \ 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) atf_check -s not-exit:0 -x "cat ./out |grep -q '$pkt'" atf_check -s exit:0 -o ignore rump.ifconfig shmif0 link \ 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() { 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 $DEBUG && rump.arp -n -a atf_check -s exit:0 -o ignore rump.arp -s $IP4SRC $macaddr_src $DEBUG && rump.arp -n -a # 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 + rump_server_destroy_ifaces } -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 - -} - arp_cache_expiration_5s_cleanup() { $DEBUG && dump cleanup } arp_cache_expiration_10s_cleanup() { $DEBUG && dump cleanup } arp_command_cleanup() { $DEBUG && dump 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() { $DEBUG && dump cleanup } arp_proxy_arp_pub_cleanup() { $DEBUG && dump cleanup } arp_proxy_arp_pubproxy_cleanup() { $DEBUG && dump cleanup } arp_link_activation_cleanup() { $DEBUG && dump cleanup } arp_static_cleanup() { $DEBUG && dump cleanup } atf_init_test_cases() { atf_add_test_case arp_cache_expiration_5s atf_add_test_case arp_cache_expiration_10s atf_add_test_case arp_command atf_add_test_case arp_garp atf_add_test_case arp_cache_overwriting atf_add_test_case arp_proxy_arp_pub atf_add_test_case arp_proxy_arp_pubproxy atf_add_test_case arp_link_activation atf_add_test_case arp_static } Index: stable/11/contrib/netbsd-tests/net/arp/t_dad.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/arp/t_dad.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/arp/t_dad.sh (revision 313680) @@ -1,249 +1,201 @@ -# $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. # # 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. # -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 dad_basic_head() { atf_set "descr" "Tests for IPv4 DAD basic behavior" atf_set "require.progs" "rump_server" } dad_duplicated_head() { atf_set "descr" "Tests for IPv4 DAD duplicated state" 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 inet $ip/24 atf_check -s exit:0 rump.ifconfig shmif0 up atf_check -s exit:0 rump.ifconfig -w 10 $DEBUG && rump.ifconfig shmif0 } make_pkt_str() { local target=$1 local sender=$2 pkt="> ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42:" pkt="$pkt Request who-has $target tell $sender, length 28" 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 atf_check -s exit:0 rump.ifconfig shmif0 up rump.ifconfig shmif0 > ./out $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 pkt=$(make_pkt_str 10.0.0.2 0.0.0.0) atf_check -s exit:0 -x "cat ./out |grep -q '$pkt'" # No DAD for the primary address pkt=$(make_pkt_str 10.0.0.1 0.0.0.0) atf_check -s not-exit:0 -x "cat ./out |grep -q '$pkt'" # Waiting for DAD complete 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 # atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.3/24 alias # 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'" # Waiting for DAD complete 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() { local localip1=10.0.1.1 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 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 # atf_check -s exit:0 rump.ifconfig shmif0 inet $peerip alias 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" -} + atf_check -s not-exit:0 -x "rump.ifconfig shmif0 |grep $localip2 |grep -iq duplicated" -cleanup() -{ - env RUMP_SERVER=$SOCKLOCAL rump.halt - env RUMP_SERVER=$SOCKPEER rump.halt + rump_server_destroy_ifaces } -dump_local() -{ - 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 -} - -dump() -{ - dump_local - dump_peer - shmif_dumpbus -p - bus1 2>/dev/null| tcpdump -n -e -r - -} - 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() { $DEBUG && dump cleanup } atf_init_test_cases() { atf_add_test_case dad_basic atf_add_test_case dad_duplicated } Index: stable/11/contrib/netbsd-tests/net/icmp/t_icmp6_redirect.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/icmp/t_icmp6_redirect.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/icmp/t_icmp6_redirect.sh (revision 313680) @@ -1,171 +1,152 @@ -# $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. # # 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. # -netserver="rump_server -lrumpnet -lrumpnet_net -lrumpnet_shmif" -netserver="${netserver} -lrumpnet_netinet -lrumpnet_netinet6 -lrumpdev" SOCK_LOCAL=unix://commsock1 SOCK_PEER=unix://commsock2 SOCK_GW1=unix://commsock3 SOCK_GW2=unix://commsock4 BUS1=bus1 BUS2=bus2 IP6BUS1=fc00:1::/64 IP6BUS2=fc00:2::/64 IP6IF0_LOCAL=fc00:1::2 IP6IF0_PEER=fc00:2::2 IP6IF0_GW1=fc00:1::1 IP6IF1_GW1=fc00:2::1 IP6IF0_GW2=fc00:1::3 REDIRECT_TIMEOUT=5 -DEBUG=true +DEBUG=${DEBUG:-true} -get_lladdr() -{ +atf_test_case icmp6_redirect_basic cleanup - export RUMP_SERVER=${1} - rump.ifconfig ${2} inet6 | awk "/fe80/ {sub(/%$2/, \"\"); print \$2;}" - unset RUMP_SERVER - - return 0 -} - -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 atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w \ 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 \ -inet6 default ${gw1_lladdr1}%shmif0 unset RUMP_SERVER # 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 atf_check -s exit:0 -o ignore rump.route add \ -inet6 ${IP6BUS2} ${gw1_lladdr0}%shmif0 atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w \ 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 # Teach the fake gateway as the default gateway atf_check -s exit:0 -o ignore rump.route add \ -inet6 default ${gw2_lladdr0}%shmif0 $DEBUG && rump.route get -inet6 ${IP6IF0_PEER} atf_check -s exit:0 -o ignore rump.sysctl -w \ net.inet6.icmp6.redirtimeout=$REDIRECT_TIMEOUT # # Tests # atf_check -s exit:0 -o ignore rump.ping6 -c 1 -n ${IP6IF0_PEER} $DEBUG && rump.route show -inet6 # Check if a created route is correctly redirected to gateway #1 atf_check -s exit:0 -o match:"gateway: ${gw1_lladdr0}" rump.route get \ -inet6 ${IP6IF0_PEER} atf_check -s exit:0 sleep $((REDIRECT_TIMEOUT + 2)) $DEBUG && rump.route show -inet6 # Check if the created route is expired 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 } Index: stable/11/contrib/netbsd-tests/net/icmp/t_icmp_redirect.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/icmp/t_icmp_redirect.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/icmp/t_icmp_redirect.sh (revision 313680) @@ -1,339 +1,285 @@ -# $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. # # 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. # # 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 BUS=bus1 BUS2=bus2 REDIRECT_TIMEOUT=5 -DEBUG=false +DEBUG=${DEBUG:-false} atf_test_case icmp_redirect_timeout cleanup icmp_redirect_timeout_head() { atf_set "descr" "Tests for ICMP redirect timeout"; atf_set "require.progs" "rump_server"; } 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.sysctl -w \ net.inet.icmp.redirtimeout=$REDIRECT_TIMEOUT $DEBUG && rump.ifconfig $DEBUG && rump.netstat -rn -f inet } 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 $DEBUG && rump.ifconfig $DEBUG && rump.netstat -rn -f inet } 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 # Wait until DAD completes (10 sec at most) atf_check -s exit:0 -o ignore rump.ifconfig -w 10 atf_check -s not-exit:0 -x "rump.ifconfig shmif1 |grep -q tentative" $DEBUG && rump.ifconfig $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() { $DEBUG && ulimit -c unlimited setup_local setup_peer ### Testing Dynamic flag ### # # Setup a gateway 10.0.0.254. 10.0.2.1 is behind it. # setup_gw # # Teach the peer that 10.0.2.* is behind 10.0.0.254 # 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 # 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 + rump_server_destroy_ifaces } -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 -} - icmp_redirect_timeout_cleanup() { $DEBUG && dump cleanup } atf_test_case icmp_redirect cleanup icmp_redirect_head() { atf_set "descr" "Tests for icmp redirect"; atf_set "require.progs" "rump_server"; } setup_redirect() { atf_check -s exit:0 -o ignore rump.sysctl -w \ net.inet.ip.redirect=1 } teardown_redirect() { atf_check -s exit:0 -o ignore rump.sysctl -w \ net.inet.ip.redirect=0 } icmp_redirect_body() { $DEBUG && ulimit -c unlimited setup_local setup_peer # # Setup a gateway 10.0.0.254. 10.0.2.1 is behind it. # setup_gw # # Teach the peer that 10.0.2.* is behind 10.0.0.254 # 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 # 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 ### # # Disable net.inet.ip.redirect # export RUMP_SERVER=$SOCK_PEER teardown_redirect # Try ping 10.0.2.1 export RUMP_SERVER=$SOCK_LOCAL atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 10.0.2.1 $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 ### # # Enable net.inet.ip.redirect # export RUMP_SERVER=$SOCK_PEER setup_redirect # Try ping 10.0.2.1 export RUMP_SERVER=$SOCK_LOCAL 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 # 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) ### # # Disable net.inet.ip.redirect # export RUMP_SERVER=$SOCK_PEER teardown_redirect # Try ping 10.0.2.1 export RUMP_SERVER=$SOCK_LOCAL atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 10.0.2.1 $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() { $DEBUG && dump cleanup } atf_init_test_cases() { atf_add_test_case icmp_redirect atf_add_test_case icmp_redirect_timeout } Index: stable/11/contrib/netbsd-tests/net/if/t_compat.c =================================================================== --- stable/11/contrib/netbsd-tests/net/if/t_compat.c (revision 313679) +++ stable/11/contrib/netbsd-tests/net/if/t_compat.c (revision 313680) @@ -1,83 +1,85 @@ -/* $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 #include #include #include #include #include #include #include #include #include "../config/netconfig.c" /* * Test for stack smashing in compat ioctl handling. Adapted as an * atf test from code provided by Onno van der Linden in PR kern/44054 */ struct oifreq { char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ union { struct sockaddr ifru_addr; struct sockaddr ifru_dstaddr; struct sockaddr ifru_broadaddr; short ifru_flags; int ifru_metric; int ifru_mtu; int ifru_dlt; u_int ifru_value; void * ifru_data; struct { uint32_t b_buflen; void *b_buf; } ifru_b; } ifr_ifru; }; #define OOSIOCGIFBRDADDR _IOWR('i', 18, struct oifreq) ATF_TC(OOSIOCGIFBRDADDR); ATF_TC_HEAD(OOSIOCGIFBRDADDR, tc) { atf_tc_set_md_var(tc, "descr", "Checks that OOSIOCGIFBRDADDR works " "(PR kern/44054)"); } ATF_TC_BODY(OOSIOCGIFBRDADDR, tc) { int fd, ifnum; struct oifreq ifreq; struct sockaddr_in *sin; int rv; memset(&ifreq,'\0',sizeof ifreq); rump_init(); /* create an interface and give it netmask 0xffff0000 */ rv = rump_pub_shmif_create("bus", &ifnum); if (rv) atf_tc_fail("failed to create shmif: %s", strerror(rv)); 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)); /* make sure we got what we deserve */ sin = (struct sockaddr_in *)&ifreq.ifr_broadaddr; ATF_REQUIRE_EQ(sin->sin_addr.s_addr, htonl(0x0107ffff)); rump_sys_close(fd); } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, OOSIOCGIFBRDADDR); return atf_no_error(); } Index: stable/11/contrib/netbsd-tests/net/if/t_ifconfig.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/if/t_ifconfig.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/if/t_ifconfig.sh (revision 313680) @@ -1,329 +1,333 @@ -# $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. # # 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. # RUMP_SERVER1=unix://./r1 RUMP_SERVER2=unix://./r2 RUMP_FLAGS=\ "-lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_netinet6 -lrumpnet_shmif" 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() { atf_set "descr" "tests of ifconfig create and destroy" atf_set "require.progs" "rump_server" } ifconfig_create_destroy_body() { atf_check -s exit:0 rump_server ${RUMP_FLAGS} ${RUMP_SERVER1} export RUMP_SERVER=${RUMP_SERVER1} # Create and destroy (no address) atf_check -s exit:0 rump.ifconfig shmif0 create atf_check -s exit:0 rump.ifconfig shmif0 destroy # Create and destroy (with an IPv4 address) atf_check -s exit:0 rump.ifconfig shmif0 create atf_check -s exit:0 rump.ifconfig shmif0 linkstr shmbus atf_check -s exit:0 rump.ifconfig shmif0 192.168.0.1/24 atf_check -s exit:0 rump.ifconfig shmif0 up atf_check -s exit:0 rump.ifconfig shmif0 destroy # Create and destroy (with an IPv6 address) atf_check -s exit:0 rump.ifconfig shmif0 create atf_check -s exit:0 rump.ifconfig shmif0 linkstr shmbus atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::1 atf_check -s exit:0 rump.ifconfig shmif0 up atf_check -s exit:0 rump.ifconfig shmif0 destroy unset RUMP_SERVER } ifconfig_create_destroy_cleanup() { RUMP_SERVER=${RUMP_SERVER1} rump.halt } atf_test_case ifconfig_options cleanup ifconfig_options_head() { atf_set "descr" "tests of ifconfig options" atf_set "require.progs" "rump_server" } ifconfig_options_body() { export RUMP_SERVER=${RUMP_SERVER1} atf_check -s exit:0 rump_server $RUMP_FLAGS $RUMP_SERVER1 atf_check -s exit:0 -o ignore rump.ifconfig shmif0 create atf_check -s exit:0 -o ignore rump.ifconfig shmif0 linkstr bus1 atf_check -s exit:0 -o ignore rump.ifconfig shmif0 inet 10.0.0.1/24 atf_check -s exit:0 -o ignore rump.ifconfig shmif0 inet6 fc00::1/64 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 shmif0 # ifconfig [-N] interface address_family # -N resolves hostnames atf_check -s exit:0 -o match:'inet 127.0.0.1' rump.ifconfig lo0 inet atf_check -s exit:0 -o match:'inet localhost' rump.ifconfig -N lo0 inet atf_check -s exit:0 -o match:'inet6 ::1' rump.ifconfig lo0 inet6 atf_check -s exit:0 -o match:'inet6 localhost' rump.ifconfig -N lo0 inet6 atf_check -s not-exit:0 -e match:'not supported' rump.ifconfig lo0 atalk atf_check -s not-exit:0 -e match:'not supported' rump.ifconfig -N lo0 atalk atf_check -s exit:0 -o ignore rump.ifconfig lo0 link atf_check -s exit:0 -o ignore rump.ifconfig -N lo0 link # ifconfig [-hLmNvz] interface # -h -v shows statistics in human readable format atf_check -s exit:0 -o ignore rump.ifconfig -h -v lo0 # -L shows IPv6 lifetime atf_check -s exit:0 -o ignore rump.ifconfig shmif0 inet6 fc00::2 \ pltime 100 $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 # -m shows all of the supported media (not supported in shmif) $DEBUG && rump.ifconfig -m shmif0 atf_check -s exit:0 -o ignore rump.ifconfig -m shmif0 atf_check -s exit:0 -o match:'localhost' rump.ifconfig -N lo0 atf_check -s exit:0 -o match:'0 packets' rump.ifconfig -v lo0 atf_check -s exit:0 -o ignore rump.ping -c 1 -w $TIMEOUT localhost # -z clears and shows statistics at that point atf_check -s exit:0 -o match:'2 packets' rump.ifconfig -z lo0 atf_check -s exit:0 -o match:'0 packets' rump.ifconfig -v lo0 # ifconfig -a [-bdhLNmsuvz] # -a shows all interfaces in the system $DEBUG && rump.ifconfig -a atf_check -s exit:0 -o match:'shmif0' -o match:'lo0' rump.ifconfig -a # -a -b shows only broadcast interfaces atf_check -s exit:0 -o match:'shmif0' -o not-match:'lo0' rump.ifconfig -a -b # -a -d shows only down interfaces atf_check -s exit:0 -o ignore rump.ifconfig shmif0 down atf_check -s exit:0 -o match:'shmif0' rump.ifconfig -a -d atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up atf_check -s exit:0 -o not-match:'shmif0' rump.ifconfig -a -d atf_check -s exit:0 -o match:'pltime' rump.ifconfig -a -L atf_check -s exit:0 -o match:'vltime' rump.ifconfig -a -L atf_check -s exit:0 -o match:'localhost' rump.ifconfig -a -N atf_check -s exit:0 -o ignore rump.ifconfig -a -m # -a -s shows only interfaces connected to a network # (shmif is always connected) $DEBUG && rump.ifconfig -a -s atf_check -s exit:0 -o ignore rump.ifconfig -a -s # -a -u shows only up interfaces atf_check -s exit:0 -o match:'shmif0' rump.ifconfig -a -u atf_check -s exit:0 -o ignore rump.ifconfig shmif0 down atf_check -s exit:0 -o not-match:'shmif0' rump.ifconfig -a -u atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up atf_check -s exit:0 -o match:'0 packets' rump.ifconfig -a -v atf_check -s exit:0 -o ignore rump.ping -c 1 -w $TIMEOUT localhost atf_check -s exit:0 -o ignore rump.ifconfig shmif0 down atf_check -s exit:0 -o match:'2 packets' rump.ifconfig -a -z atf_check -s exit:0 -o not-match:'2 packets' rump.ifconfig -a -v atf_check -s exit:0 -o match:'0 packets' rump.ifconfig -a -v atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up # ifconfig -l [-bdsu] # -l shows only inteface names atf_check -s exit:0 -o match:'lo0' rump.ifconfig -l atf_check -s exit:0 -o match:'shmif0' rump.ifconfig -l atf_check -s exit:0 -o match:'shmif0' rump.ifconfig -l -b atf_check -s exit:0 -o not-match:'lo0' rump.ifconfig -l -b atf_check -s exit:0 -o ignore rump.ifconfig -l -d atf_check -s exit:0 -o match:'lo0' rump.ifconfig -l -s atf_check -s exit:0 -o match:'shmif0' rump.ifconfig -l -s atf_check -s exit:0 -o match:'lo0' rump.ifconfig -l -u atf_check -s exit:0 -o match:'shmif0' rump.ifconfig -l -u # ifconfig -s interface # -s interface exists with 0 / 1 if connected / disconnected atf_check -s exit:0 -o empty rump.ifconfig -s lo0 atf_check -s exit:0 -o empty rump.ifconfig -s shmif0 # ifconfig -C # -C shows all of the interface cloners available on the system atf_check -s exit:0 -o match:'shmif lo carp' rump.ifconfig -C unset RUMP_SERVER } ifconfig_options_cleanup() { env RUMP_SERVER=${RUMP_SERVER1} rump.halt } atf_test_case ifconfig_parameters cleanup ifconfig_parameters_head() { atf_set "descr" "tests of interface parameters" atf_set "require.progs" "rump_server" } ifconfig_parameters_body() { local interval= atf_check -s exit:0 rump_server ${RUMP_FLAGS} ${RUMP_SERVER1} atf_check -s exit:0 rump_server ${RUMP_FLAGS} ${RUMP_SERVER2} export RUMP_SERVER=${RUMP_SERVER1} atf_check -s exit:0 rump.ifconfig shmif0 create atf_check -s exit:0 rump.ifconfig shmif0 linkstr shmbus atf_check -s exit:0 rump.ifconfig shmif0 192.168.0.1/24 atf_check -s exit:0 rump.ifconfig shmif0 up unset RUMP_SERVER export RUMP_SERVER=${RUMP_SERVER2} atf_check -s exit:0 rump.ifconfig shmif0 create atf_check -s exit:0 rump.ifconfig shmif0 linkstr shmbus atf_check -s exit:0 rump.ifconfig shmif0 192.168.0.2/24 atf_check -s exit:0 rump.ifconfig shmif0 inet 192.168.0.3/24 alias atf_check -s exit:0 rump.ifconfig shmif0 up unset RUMP_SERVER export RUMP_SERVER=${RUMP_SERVER1} # active atf_check -s exit:0 rump.ifconfig shmif0 link b2:a0:75:00:00:01 active atf_check -s exit:0 -o match:'address:.b2:a0:75:00:00:01' \ 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 atf_check -s exit:0 -o match:'fc00::2' rump.ifconfig shmif0 inet6 # delete atf_check -s exit:0 rump.ifconfig shmif0 inet 192.168.1.1 alias atf_check -s exit:0 rump.ifconfig shmif0 inet 192.168.1.1 delete atf_check -s exit:0 -o not-match:'192.168.1.1' rump.ifconfig shmif0 inet atf_check -s exit:0 rump.ifconfig shmif0 inet 192.168.0.1 delete atf_check -s exit:0 -o not-match:'192.168.0.1' rump.ifconfig shmif0 inet atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::1 delete atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::2 delete atf_check -s exit:0 -o not-match:'fc00::1' rump.ifconfig shmif0 inet6 atf_check -s exit:0 -o not-match:'fc00::2' rump.ifconfig shmif0 inet6 # can delete inactive link atf_check -s exit:0 rump.ifconfig shmif0 link b2:a0:75:00:00:02 atf_check -s exit:0 rump.ifconfig shmif0 link b2:a0:75:00:00:02 delete # cannot delete active link atf_check -s not-exit:0 -e match:'SIOCDLIFADDR: Device busy' \ rump.ifconfig shmif0 link b2:a0:75:00:00:01 delete atf_check -s exit:0 rump.ifconfig shmif0 inet 192.168.0.1/24 # arp atf_check -s exit:0 rump.ifconfig shmif0 -arp atf_check -s not-exit:0 -o ignore -e ignore \ rump.ping -c 1 -w $TIMEOUT -n 192.168.0.3 atf_check -s exit:0 -o not-match:'192.168.0.3' rump.arp -an # The entry shouldn't appear in the routing table anymore atf_check -s exit:0 -o not-match:'192.168.0.3' rump.netstat -nr # netmask atf_check -s exit:0 rump.ifconfig shmif0 inet 172.16.0.1 netmask 255.255.255.0 alias atf_check -s exit:0 -o match:'172.16.0/24' rump.netstat -rn -f inet atf_check -s exit:0 rump.ifconfig shmif0 inet 172.16.0.1 delete # broadcast (does it not work?) atf_check -s exit:0 rump.ifconfig shmif0 inet 172.16.0.1 \ broadcast 255.255.255.255 alias atf_check -s exit:0 -o match:'broadcast 255.255.255.255' \ rump.ifconfig shmif0 inet # metric (external only) atf_check -s exit:0 rump.ifconfig shmif0 metric 10 atf_check -s exit:0 rump.ifconfig shmif0 metric 0 # prefixlen atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::1 prefixlen 70 atf_check -s exit:0 -o match:'fc00::/70' rump.netstat -rn -f inet6 # 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 atf_check -s exit:0 -o match:'fc00:1::' rump.ifconfig shmif0 inet6 unset RUMP_SERVER } ifconfig_parameters_cleanup() { env RUMP_SERVER=${RUMP_SERVER1} rump.halt env RUMP_SERVER=${RUMP_SERVER2} rump.halt } atf_init_test_cases() { atf_add_test_case ifconfig_create_destroy atf_add_test_case ifconfig_options atf_add_test_case ifconfig_parameters } Index: stable/11/contrib/netbsd-tests/net/if_bridge/t_bridge.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/if_bridge/t_bridge.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/if_bridge/t_bridge.sh (revision 313680) @@ -1,592 +1,573 @@ -# $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. # # 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. # -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 IP1=10.0.0.1 IP2=10.0.0.2 IP61=fc00::1 IP62=fc00::2 IPBR1=10.0.0.11 IPBR2=10.0.0.12 IP6BR1=fc00::11 IP6BR2=fc00::12 +DEBUG=${DEBUG:-false} TIMEOUT=5 atf_test_case bridge_ipv4 cleanup atf_test_case bridge_ipv6 cleanup atf_test_case bridge_rtable cleanup atf_test_case bridge_member_ipv4 cleanup atf_test_case bridge_member_ipv6 cleanup bridge_ipv4_head() { atf_set "descr" "Does simple if_bridge tests" atf_set "require.progs" "rump_server" } bridge_ipv6_head() { atf_set "descr" "Does simple if_bridge tests (IPv6)" atf_set "require.progs" "rump_server" } bridge_rtable_head() { atf_set "descr" "Tests route table operations of if_bridge" atf_set "require.progs" "rump_server" } bridge_member_ipv4_head() { atf_set "descr" "Tests if_bridge with members with an IP address" atf_set "require.progs" "rump_server" } bridge_member_ipv6_head() { atf_set "descr" "Tests if_bridge with members with an IP address (IPv6)" atf_set "require.progs" "rump_server" } setup_endpoint() { sock=${1} addr=${2} 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 atf_check -s exit:0 rump.ifconfig shmif0 inet ${addr} netmask 0xffffff00 fi atf_check -s exit:0 rump.ifconfig shmif0 up - rump.ifconfig shmif0 + $DEBUG && rump.ifconfig shmif0 } test_endpoint() { sock=${1} addr=${2} bus=${3} mode=${4} export RUMP_SERVER=${sock} atf_check -s exit:0 -o match:shmif0 rump.ifconfig if [ $mode = "ipv6" ]; then atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${addr} else atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 ${addr} fi } -show_endpoint() -{ - sock=${1} - - export RUMP_SERVER=${sock} - rump.ifconfig -v shmif0 -} - test_setup() { test_endpoint $SOCK1 $IP1 bus1 ipv4 test_endpoint $SOCK3 $IP2 bus2 ipv4 export RUMP_SERVER=$SOCK2 atf_check -s exit:0 -o match:shmif0 rump.ifconfig atf_check -s exit:0 -o match:shmif1 rump.ifconfig } test_setup6() { test_endpoint $SOCK1 $IP61 bus1 ipv6 test_endpoint $SOCK3 $IP62 bus2 ipv6 export RUMP_SERVER=$SOCK2 atf_check -s exit:0 -o match:shmif0 rump.ifconfig atf_check -s exit:0 -o match:shmif1 rump.ifconfig } 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 setup_bridge_server } 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 setup_bridge_server } setup_bridge() { export RUMP_SERVER=$SOCK2 atf_check -s exit:0 rump.ifconfig bridge0 create atf_check -s exit:0 rump.ifconfig bridge0 up export LD_PRELOAD=/usr/lib/librumphijack.so atf_check -s exit:0 /sbin/brconfig bridge0 add shmif0 atf_check -s exit:0 /sbin/brconfig bridge0 add shmif1 /sbin/brconfig bridge0 unset LD_PRELOAD rump.ifconfig shmif0 rump.ifconfig shmif1 } setup_member_ip() { export RUMP_SERVER=$SOCK2 export LD_PRELOAD=/usr/lib/librumphijack.so atf_check -s exit:0 rump.ifconfig shmif0 $IPBR1/24 atf_check -s exit:0 rump.ifconfig shmif1 $IPBR2/24 atf_check -s exit:0 rump.ifconfig -w 10 /sbin/brconfig bridge0 unset LD_PRELOAD rump.ifconfig shmif0 rump.ifconfig shmif1 } setup_member_ip6() { export RUMP_SERVER=$SOCK2 export LD_PRELOAD=/usr/lib/librumphijack.so atf_check -s exit:0 rump.ifconfig shmif0 inet6 $IP6BR1 atf_check -s exit:0 rump.ifconfig shmif1 inet6 $IP6BR2 atf_check -s exit:0 rump.ifconfig -w 10 /sbin/brconfig bridge0 unset LD_PRELOAD rump.ifconfig shmif0 rump.ifconfig shmif1 } teardown_bridge() { export RUMP_SERVER=$SOCK2 export LD_PRELOAD=/usr/lib/librumphijack.so /sbin/brconfig bridge0 atf_check -s exit:0 /sbin/brconfig bridge0 delete shmif0 atf_check -s exit:0 /sbin/brconfig bridge0 delete shmif1 /sbin/brconfig bridge0 unset LD_PRELOAD rump.ifconfig shmif0 rump.ifconfig shmif1 } test_setup_bridge() { export RUMP_SERVER=$SOCK2 export LD_PRELOAD=/usr/lib/librumphijack.so atf_check -s exit:0 -o match:shmif0 /sbin/brconfig bridge0 atf_check -s exit:0 -o match:shmif1 /sbin/brconfig bridge0 /sbin/brconfig bridge0 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 rump.ifconfig shmif0 down rump.ifconfig shmif0 up export RUMP_SERVER=$SOCK3 rump.ifconfig shmif0 down rump.ifconfig shmif0 up } test_ping_failure() { export RUMP_SERVER=$SOCK1 atf_check -s not-exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP2 export RUMP_SERVER=$SOCK3 atf_check -s not-exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP1 } test_ping_success() { export RUMP_SERVER=$SOCK1 rump.ifconfig -v shmif0 atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP2 rump.ifconfig -v shmif0 export RUMP_SERVER=$SOCK3 rump.ifconfig -v shmif0 atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP1 rump.ifconfig -v shmif0 } test_ping6_failure() { export RUMP_SERVER=$SOCK1 atf_check -s not-exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP62 export RUMP_SERVER=$SOCK3 atf_check -s not-exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP61 } test_ping6_success() { export RUMP_SERVER=$SOCK1 rump.ifconfig -v shmif0 atf_check -s exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP62 rump.ifconfig -v shmif0 export RUMP_SERVER=$SOCK3 rump.ifconfig -v shmif0 atf_check -s exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP61 rump.ifconfig -v shmif0 } test_ping_member() { export RUMP_SERVER=$SOCK1 rump.ifconfig -v shmif0 atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IPBR1 rump.ifconfig -v shmif0 # Test for PR#48104 atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IPBR2 rump.ifconfig -v shmif0 export RUMP_SERVER=$SOCK3 rump.ifconfig -v shmif0 # Test for PR#48104 atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IPBR1 rump.ifconfig -v shmif0 atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IPBR2 rump.ifconfig -v shmif0 } test_ping6_member() { export RUMP_SERVER=$SOCK1 rump.ifconfig -v shmif0 atf_check -s exit:0 -o ignore rump.ping6 -q -n -X $TIMEOUT -c 1 $IP6BR1 rump.ifconfig -v shmif0 # Test for PR#48104 atf_check -s exit:0 -o ignore rump.ping6 -q -n -X $TIMEOUT -c 1 $IP6BR2 rump.ifconfig -v shmif0 export RUMP_SERVER=$SOCK3 rump.ifconfig -v shmif0 # Test for PR#48104 atf_check -s exit:0 -o ignore rump.ping6 -q -n -X $TIMEOUT -c 1 $IP6BR1 rump.ifconfig -v shmif0 atf_check -s exit:0 -o ignore rump.ping6 -q -n -X $TIMEOUT -c 1 $IP6BR2 rump.ifconfig -v shmif0 } get_number_of_caches() { export RUMP_SERVER=$SOCK2 export LD_PRELOAD=/usr/lib/librumphijack.so echo $(($(/sbin/brconfig bridge0 |grep -A 100 "Address cache" |wc -l) - 1)) unset LD_PRELOAD } 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 atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP2 export RUMP_SERVER=$SOCK2 export LD_PRELOAD=/usr/lib/librumphijack.so /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 # Check the default # of caches is 100 atf_check -s exit:0 -o match:"max cache: 100" /sbin/brconfig bridge0 # Test two MAC addresses are cached n=$(get_number_of_caches) atf_check_equal $n 2 # Limit # of caches to one atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 maxaddr 1 atf_check -s exit:0 -o match:"max cache: 1" /sbin/brconfig bridge0 /sbin/brconfig bridge0 # Test just one address is cached n=$(get_number_of_caches) atf_check_equal $n 1 # Increase # of caches to two atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 maxaddr 2 atf_check -s exit:0 -o match:"max cache: 2" /sbin/brconfig bridge0 unset LD_PRELOAD # Test we can cache two addresses again export RUMP_SERVER=$SOCK1 atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP2 export RUMP_SERVER=$SOCK2 export LD_PRELOAD=/usr/lib/librumphijack.so /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 unset LD_PRELOAD } bridge_ipv4_body() { setup test_setup # Enable once PR kern/49219 is fixed #test_ping_failure setup_bridge sleep 1 test_setup_bridge test_ping_success teardown_bridge test_ping_failure + + rump_server_destroy_ifaces } bridge_ipv6_body() { setup6 test_setup6 test_ping6_failure setup_bridge sleep 1 test_setup_bridge test_ping6_success teardown_bridge test_ping6_failure + + rump_server_destroy_ifaces } bridge_rtable_body() { addr1= addr3= setup 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 # Make the bridge learn the MAC addresses of the endpoints. export RUMP_SERVER=$SOCK1 atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP2 unset RUMP_SERVER # 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 # Tests brconfig deladdr atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 deladdr "$addr1" atf_check -s exit:0 -o not-match:"$addr1 shmif0" /sbin/brconfig bridge0 atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 deladdr "$addr3" atf_check -s exit:0 -o not-match:"$addr3 shmif1" /sbin/brconfig bridge0 unset LD_PRELOAD # Refill the MAC addresses of the endpoints. export RUMP_SERVER=$SOCK1 atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP2 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 # Tests brconfig flush. atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 flush atf_check -s exit:0 -o not-match:"$addr1 shmif0" /sbin/brconfig bridge0 atf_check -s exit:0 -o not-match:"$addr3 shmif1" /sbin/brconfig bridge0 unset LD_PRELOAD # Tests brconfig timeout. export RUMP_SERVER=$SOCK2 export LD_PRELOAD=/usr/lib/librumphijack.so atf_check -s exit:0 -o match:"timeout: 1200" /sbin/brconfig bridge0 atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 timeout 10 atf_check -s exit:0 -o match:"timeout: 10" /sbin/brconfig bridge0 unset LD_PRELOAD # Tests brconfig maxaddr. test_brconfig_maxaddr # 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() { setup test_setup # Enable once PR kern/49219 is fixed #test_ping_failure setup_bridge sleep 1 test_setup_bridge test_ping_success setup_member_ip test_ping_member teardown_bridge test_ping_failure + + rump_server_destroy_ifaces } bridge_member_ipv6_body() { setup6 test_setup6 test_ping6_failure setup_bridge sleep 1 test_setup_bridge test_ping6_success setup_member_ip6 test_ping6_member 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 } atf_init_test_cases() { atf_add_test_case bridge_ipv4 atf_add_test_case bridge_ipv6 atf_add_test_case bridge_rtable atf_add_test_case bridge_member_ipv4 atf_add_test_case bridge_member_ipv6 } Index: stable/11/contrib/netbsd-tests/net/if_gif/t_gif.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/if_gif/t_gif.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/if_gif/t_gif.sh (revision 313680) @@ -1,778 +1,763 @@ -# $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. # # 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. # -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 ROUTER1_LANNET=192.168.1.0/24 ROUTER1_WANIP=10.0.0.1 ROUTER1_GIFIP=172.16.1.1 ROUTER1_WANIP_DUMMY=10.0.0.11 ROUTER1_GIFIP_DUMMY=172.16.11.1 ROUTER1_GIFIP_RECURSIVE1=172.16.101.1 ROUTER1_GIFIP_RECURSIVE2=172.16.201.1 ROUTER2_LANIP=192.168.2.1 ROUTER2_LANNET=192.168.2.0/24 ROUTER2_WANIP=10.0.0.2 ROUTER2_GIFIP=172.16.2.1 ROUTER2_WANIP_DUMMY=10.0.0.12 ROUTER2_GIFIP_DUMMY=172.16.12.1 ROUTER2_GIFIP_RECURSIVE1=172.16.102.1 ROUTER2_GIFIP_RECURSIVE2=172.16.202.1 ROUTER1_LANIP6=fc00:1::1 ROUTER1_LANNET6=fc00:1::/64 ROUTER1_WANIP6=fc00::1 ROUTER1_GIFIP6=fc00:3::1 ROUTER1_WANIP6_DUMMY=fc00::11 ROUTER1_GIFIP6_DUMMY=fc00:13::1 ROUTER1_GIFIP6_RECURSIVE1=fc00:103::1 ROUTER1_GIFIP6_RECURSIVE2=fc00:203::1 ROUTER2_LANIP6=fc00:2::1 ROUTER2_LANNET6=fc00:2::/64 ROUTER2_WANIP6=fc00::2 ROUTER2_GIFIP6=fc00:4::1 ROUTER2_WANIP6_DUMMY=fc00::12 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() { sock=${1} lan=${2} lan_mode=${3} 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 atf_check -s exit:0 rump.ifconfig shmif0 inet ${lan} netmask 0xffffff00 fi 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 atf_check -s exit:0 rump.ifconfig shmif1 inet ${wan} netmask 0xff000000 fi atf_check -s exit:0 rump.ifconfig shmif1 up rump.ifconfig shmif1 } test_router() { sock=${1} lan=${2} lan_mode=${3} wan=${4} wan_mode=${5} export RUMP_SERVER=${sock} atf_check -s exit:0 -o match:shmif0 rump.ifconfig if [ ${lan_mode} = "ipv6" ]; then atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${lan} else atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${lan} fi atf_check -s exit:0 -o match:shmif1 rump.ifconfig if [ ${wan_mode} = "ipv6" ]; then atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${wan} else atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${wan} fi } 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="" router2_lan="" router2_lan_mode="" if [ ${inner} = "ipv6" ]; then router1_lan=$ROUTER1_LANIP6 router1_lan_mode="ipv6" router2_lan=$ROUTER2_LANIP6 router2_lan_mode="ipv6" else router1_lan=$ROUTER1_LANIP router1_lan_mode="ipv4" router2_lan=$ROUTER2_LANIP router2_lan_mode="ipv4" fi if [ ${outer} = "ipv6" ]; then setup_router $SOCK1 ${router1_lan} ${router1_lan_mode} \ $ROUTER1_WANIP6 ipv6 setup_router $SOCK2 ${router2_lan} ${router2_lan_mode} \ $ROUTER2_WANIP6 ipv6 else setup_router $SOCK1 ${router1_lan} ${router1_lan_mode} \ $ROUTER1_WANIP ipv4 setup_router $SOCK2 ${router2_lan} ${router2_lan_mode} \ $ROUTER2_WANIP ipv4 fi } test_setup() { inner=${1} outer=${2} router1_lan="" router1_lan_mode="" router2_lan="" router2_lan_mode="" if [ ${inner} = "ipv6" ]; then router1_lan=$ROUTER1_LANIP6 router1_lan_mode="ipv6" router2_lan=$ROUTER2_LANIP6 router2_lan_mode="ipv6" else router1_lan=$ROUTER1_LANIP router1_lan_mode="ipv4" router2_lan=$ROUTER2_LANIP router2_lan_mode="ipv4" fi if [ ${outer} = "ipv6" ]; then test_router $SOCK1 ${router1_lan} ${router1_lan_mode} \ $ROUTER1_WANIP6 ipv6 test_router $SOCK2 ${router2_lan} ${router2_lan_mode} \ $ROUTER2_WANIP6 ipv6 else test_router $SOCK1 ${router1_lan} ${router1_lan_mode} \ $ROUTER1_WANIP ipv4 test_router $SOCK2 ${router2_lan} ${router2_lan_mode} \ $ROUTER2_WANIP ipv4 fi } setup_if_gif() { sock=${1} addr=${2} remote=${3} inner=${4} src=${5} dst=${6} peernet=${7} export RUMP_SERVER=${sock} atf_check -s exit:0 rump.ifconfig gif0 create atf_check -s exit:0 rump.ifconfig gif0 tunnel ${src} ${dst} if [ ${inner} = "ipv6" ]; then atf_check -s exit:0 rump.ifconfig gif0 inet6 ${addr}/128 ${remote} atf_check -s exit:0 -o ignore rump.route add -inet6 ${peernet} ${addr} else atf_check -s exit:0 rump.ifconfig gif0 inet ${addr}/32 ${remote} atf_check -s exit:0 -o ignore rump.route add -inet ${peernet} ${addr} fi rump.ifconfig gif0 rump.route -nL show } setup_tunnel() { inner=${1} outer=${2} addr="" remote="" src="" dst="" peernet="" if [ ${inner} = "ipv6" ]; then addr=$ROUTER1_GIFIP6 remote=$ROUTER2_GIFIP6 peernet=$ROUTER2_LANNET6 else addr=$ROUTER1_GIFIP remote=$ROUTER2_GIFIP peernet=$ROUTER2_LANNET fi if [ ${outer} = "ipv6" ]; then src=$ROUTER1_WANIP6 dst=$ROUTER2_WANIP6 else src=$ROUTER1_WANIP dst=$ROUTER2_WANIP fi setup_if_gif $SOCK1 ${addr} ${remote} ${inner} \ ${src} ${dst} ${peernet} if [ $inner = "ipv6" ]; then addr=$ROUTER2_GIFIP6 remote=$ROUTER1_GIFIP6 peernet=$ROUTER1_LANNET6 else addr=$ROUTER2_GIFIP remote=$ROUTER1_GIFIP peernet=$ROUTER1_LANNET fi if [ $outer = "ipv6" ]; then src=$ROUTER2_WANIP6 dst=$ROUTER1_WANIP6 else src=$ROUTER2_WANIP dst=$ROUTER1_WANIP fi setup_if_gif $SOCK2 ${addr} ${remote} ${inner} \ ${src} ${dst} ${peernet} } test_setup_tunnel() { mode=${1} peernet="" opt="" if [ ${mode} = "ipv6" ]; then peernet=$ROUTER2_LANNET6 opt="-inet6" else peernet=$ROUTER2_LANNET opt="-inet" fi export RUMP_SERVER=$SOCK1 atf_check -s exit:0 -o match:gif0 rump.ifconfig atf_check -s exit:0 -o match:gif0 rump.route -nL get ${opt} ${peernet} if [ ${mode} = "ipv6" ]; then peernet=$ROUTER1_LANNET6 opt="-inet6" else peernet=$ROUTER1_LANNET opt="-inet" fi export RUMP_SERVER=$SOCK2 atf_check -s exit:0 -o match:gif0 rump.ifconfig atf_check -s exit:0 -o match:gif0 rump.route -nL get ${opt} ${peernet} } teardown_tunnel() { export RUMP_SERVER=$SOCK1 atf_check -s exit:0 rump.ifconfig gif0 deletetunnel atf_check -s exit:0 rump.ifconfig gif0 destroy export RUMP_SERVER=$SOCK2 atf_check -s exit:0 rump.ifconfig gif0 deletetunnel atf_check -s exit:0 rump.ifconfig gif0 destroy } setup_dummy_if_gif() { sock=${1} addr=${2} remote=${3} inner=${4} src=${5} dst=${6} export RUMP_SERVER=${sock} atf_check -s exit:0 rump.ifconfig gif1 create atf_check -s exit:0 rump.ifconfig gif1 tunnel ${src} ${dst} if [ ${inner} = "ipv6" ]; then atf_check -s exit:0 rump.ifconfig gif1 inet6 ${addr}/128 ${remote} else atf_check -s exit:0 rump.ifconfig gif1 inet ${addr}/32 ${remote} fi rump.ifconfig gif1 } setup_dummy_tunnel() { inner=${1} outer=${2} addr="" remote="" src="" dst="" if [ ${inner} = "ipv6" ]; then addr=$ROUTER1_GIFIP6_DUMMY remote=$ROUTER2_GIFIP6_DUMMY else addr=$ROUTER1_GIFIP_DUMMY remote=$ROUTER2_GIFIP_DUMMY fi if [ ${outer} = "ipv6" ]; then src=$ROUTER1_WANIP6_DUMMY dst=$ROUTER2_WANIP6_DUMMY else src=$ROUTER1_WANIP_DUMMY dst=$ROUTER2_WANIP_DUMMY fi setup_dummy_if_gif $SOCK1 ${addr} ${remote} ${inner} \ ${src} ${dst} if [ $inner = "ipv6" ]; then addr=$ROUTER2_GIFIP6_DUMMY remote=$ROUTER1_GIFIP6_DUMMY else addr=$ROUTER2_GIFIP_DUMMY remote=$ROUTER1_GIFIP_DUMMY fi if [ $outer = "ipv6" ]; then src=$ROUTER2_WANIP6_DUMMY dst=$ROUTER1_WANIP6_DUMMY else src=$ROUTER2_WANIP_DUMMY dst=$ROUTER1_WANIP_DUMMY fi setup_dummy_if_gif $SOCK2 ${addr} ${remote} ${inner} \ ${src} ${dst} } test_setup_dummy_tunnel() { export RUMP_SERVER=$SOCK1 atf_check -s exit:0 -o match:gif1 rump.ifconfig export RUMP_SERVER=$SOCK2 atf_check -s exit:0 -o match:gif1 rump.ifconfig } teardown_dummy_tunnel() { export RUMP_SERVER=$SOCK1 atf_check -s exit:0 rump.ifconfig gif1 deletetunnel atf_check -s exit:0 rump.ifconfig gif1 destroy export RUMP_SERVER=$SOCK2 atf_check -s exit:0 rump.ifconfig gif1 deletetunnel atf_check -s exit:0 rump.ifconfig gif1 destroy } setup_recursive_if_gif() { sock=${1} gif=${2} addr=${3} remote=${4} inner=${5} src=${6} dst=${7} export RUMP_SERVER=${sock} atf_check -s exit:0 rump.ifconfig ${gif} create atf_check -s exit:0 rump.ifconfig ${gif} tunnel ${src} ${dst} if [ ${inner} = "ipv6" ]; then atf_check -s exit:0 rump.ifconfig ${gif} inet6 ${addr}/128 ${remote} else atf_check -s exit:0 rump.ifconfig ${gif} inet ${addr}/32 ${remote} fi rump.ifconfig ${gif} } # test in ROUTER1 only setup_recursive_tunnels() { mode=${1} addr="" remote="" src="" dst="" if [ ${mode} = "ipv6" ]; then addr=$ROUTER1_GIFIP6_RECURSIVE1 remote=$ROUTER2_GIFIP6_RECURSIVE1 src=$ROUTER1_GIFIP6 dst=$ROUTER2_GIFIP6 else addr=$ROUTER1_GIFIP_RECURSIVE1 remote=$ROUTER2_GIFIP_RECURSIVE1 src=$ROUTER1_GIFIP dst=$ROUTER2_GIFIP fi setup_recursive_if_gif $SOCK1 gif1 ${addr} ${remote} ${mode} \ ${src} ${dst} if [ ${mode} = "ipv6" ]; then addr=$ROUTER1_GIFIP6_RECURSIVE2 remote=$ROUTER2_GIFIP6_RECURSIVE2 src=$ROUTER1_GIFIP6_RECURSIVE1 dst=$ROUTER2_GIFIP6_RECURSIVE1 else addr=$ROUTER1_GIFIP_RECURSIVE2 remote=$ROUTER2_GIFIP_RECURSIVE2 src=$ROUTER1_GIFIP_RECURSIVE1 dst=$ROUTER2_GIFIP_RECURSIVE1 fi setup_recursive_if_gif $SOCK1 gif2 ${addr} ${remote} ${mode} \ ${src} ${dst} } # test in router1 only test_recursive_check() { mode=$1 export RUMP_SERVER=$SOCK1 if [ ${mode} = "ipv6" ]; then atf_check -s not-exit:0 -o ignore -e ignore \ rump.ping6 -n -X $TIMEOUT -c 1 $ROUTER2_GIFIP6_RECURSIVE2 else atf_check -s not-exit:0 -o ignore -e ignore \ rump.ping -n -w $TIMEOUT -c 1 $ROUTER2_GIFIP_RECURSIVE2 fi atf_check -o match:'gif0: recursively called too many times' \ -x "$HIJACKING dmesg" $HIJACKING dmesg } teardown_recursive_tunnels() { export RUMP_SERVER=$SOCK1 atf_check -s exit:0 rump.ifconfig gif1 deletetunnel atf_check -s exit:0 rump.ifconfig gif1 destroy atf_check -s exit:0 rump.ifconfig gif2 deletetunnel 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 export RUMP_SERVER=$SOCK1 if [ ${mode} = "ipv6" ]; then atf_check -s not-exit:0 -o ignore -e ignore \ rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER1_LANIP6 \ $ROUTER2_LANIP6 else atf_check -s not-exit:0 -o ignore -e ignore \ rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \ $ROUTER2_LANIP fi export RUMP_SERVER=$SOCK2 if [ ${mode} = "ipv6" ]; then atf_check -s not-exit:0 -o ignore -e ignore \ rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER2_LANIP6 \ $ROUTER1_LANIP6 else atf_check -s not-exit:0 -o ignore -e ignore \ rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \ $ROUTER2_LANIP fi } test_ping_success() { mode=$1 export RUMP_SERVER=$SOCK1 rump.ifconfig -v gif0 if [ ${mode} = "ipv6" ]; then # XXX # rump.ping6 rarely fails with the message that # "failed to get receiving hop limit". # This is a known issue being analyzed. atf_check -s exit:0 -o ignore \ rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER1_LANIP6 \ $ROUTER2_LANIP6 else atf_check -s exit:0 -o ignore \ rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \ $ROUTER2_LANIP fi rump.ifconfig -v gif0 export RUMP_SERVER=$SOCK2 rump.ifconfig -v gif0 if [ ${mode} = "ipv6" ]; then atf_check -s exit:0 -o ignore \ rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER2_LANIP6 \ $ROUTER1_LANIP6 else atf_check -s exit:0 -o ignore \ rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER2_LANIP \ $ROUTER1_LANIP fi rump.ifconfig -v gif0 } test_change_tunnel_duplicate() { mode=$1 newsrc="" newdst="" if [ ${mode} = "ipv6" ]; then newsrc=$ROUTER1_WANIP6_DUMMY newdst=$ROUTER2_WANIP6_DUMMY else newsrc=$ROUTER1_WANIP_DUMMY newdst=$ROUTER2_WANIP_DUMMY fi export RUMP_SERVER=$SOCK1 rump.ifconfig -v gif0 rump.ifconfig -v gif1 atf_check -s exit:0 -e match:SIOCSLIFPHYADDR \ rump.ifconfig gif0 tunnel ${newsrc} ${newdst} rump.ifconfig -v gif0 rump.ifconfig -v gif1 if [ ${mode} = "ipv6" ]; then newsrc=$ROUTER2_WANIP6_DUMMY newdst=$ROUTER1_WANIP6_DUMMY else newsrc=$ROUTER2_WANIP_DUMMY newdst=$ROUTER1_WANIP_DUMMY fi export RUMP_SERVER=$SOCK2 rump.ifconfig -v gif0 rump.ifconfig -v gif1 atf_check -s exit:0 -e match:SIOCSLIFPHYADDR \ rump.ifconfig gif0 tunnel ${newsrc} ${newdst} rump.ifconfig -v gif0 rump.ifconfig -v gif1 } test_change_tunnel_success() { mode=$1 newsrc="" newdst="" if [ ${mode} = "ipv6" ]; then newsrc=$ROUTER1_WANIP6_DUMMY newdst=$ROUTER2_WANIP6_DUMMY else newsrc=$ROUTER1_WANIP_DUMMY newdst=$ROUTER2_WANIP_DUMMY fi export RUMP_SERVER=$SOCK1 rump.ifconfig -v gif0 atf_check -s exit:0 \ rump.ifconfig gif0 tunnel ${newsrc} ${newdst} rump.ifconfig -v gif0 if [ ${mode} = "ipv6" ]; then newsrc=$ROUTER2_WANIP6_DUMMY newdst=$ROUTER1_WANIP6_DUMMY else newsrc=$ROUTER2_WANIP_DUMMY newdst=$ROUTER1_WANIP_DUMMY fi export RUMP_SERVER=$SOCK2 rump.ifconfig -v gif0 atf_check -s exit:0 \ rump.ifconfig gif0 tunnel ${newsrc} ${newdst} rump.ifconfig -v gif0 } basic_setup() { inner=$1 outer=$2 setup ${inner} ${outer} test_setup ${inner} ${outer} # Enable once PR kern/49219 is fixed #test_ping_failure setup_tunnel ${inner} ${outer} sleep 1 test_setup_tunnel ${inner} } basic_test() { inner=$1 outer=$2 # not use test_ping_success ${inner} } basic_teardown() { inner=$1 outer=$2 # not use teardown_tunnel test_ping_failure ${inner} } ioctl_setup() { inner=$1 outer=$2 setup ${inner} ${outer} test_setup ${inner} ${outer} # Enable once PR kern/49219 is fixed #test_ping_failure setup_tunnel ${inner} ${outer} setup_dummy_tunnel ${inner} ${outer} sleep 1 test_setup_tunnel ${inner} } ioctl_test() { inner=$1 outer=$2 test_ping_success ${inner} test_change_tunnel_duplicate ${outer} teardown_dummy_tunnel test_change_tunnel_success ${outer} } ioctl_teardown() { inner=$1 outer=$2 # not use teardown_tunnel test_ping_failure ${inner} } recursive_setup() { inner=$1 outer=$2 setup ${inner} ${outer} test_setup ${inner} ${outer} # Enable once PR kern/49219 is fixed #test_ping_failure setup_tunnel ${inner} ${outer} setup_recursive_tunnels ${inner} sleep 1 test_setup_tunnel ${inner} } recursive_test() { inner=$1 outer=$2 # not use test_recursive_check ${inner} } recursive_teardown() { inner=$1 # not use outer=$2 # not use teardown_recursive_tunnels teardown_tunnel } add_test() { category=$1 desc=$2 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 eval "${name}_head() { \ atf_set \"descr\" \"${fulldesc}\"; \ atf_set \"require.progs\" \"rump_server\"; \ }; \ ${name}_body() { \ ${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} } add_test_allproto() { category=$1 desc=$2 add_test ${category} "${desc}" ipv4 ipv4 add_test ${category} "${desc}" ipv4 ipv6 add_test ${category} "${desc}" ipv6 ipv4 add_test ${category} "${desc}" ipv6 ipv6 } atf_init_test_cases() { add_test_allproto basic "basic tests" add_test_allproto ioctl "ioctl tests" add_test_allproto recursive "recursive check tests" } Index: stable/11/contrib/netbsd-tests/net/if_pppoe/t_pppoe.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/if_pppoe/t_pppoe.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/if_pppoe/t_pppoe.sh (revision 313680) @@ -1,193 +1,416 @@ -# $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. # # 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. # 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 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 +WAITTIME=10 +DEBUG=${DEBUG:-false} -atf_test_case pap cleanup - setup() { + inet=true + + if [ $# -ne 0 ]; then + eval $@ + fi + atf_check -s exit:0 ${server} $SERVER atf_check -s exit:0 ${server} $CLIENT export RUMP_SERVER=$SERVER 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 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 $DEBUG && $HIJACKING pppoectl -d pppoe0 atf_check -s exit:0 -x "$HIJACKING pppoectl -e shmif0 pppoe0" unset RUMP_SERVER export RUMP_SERVER=$CLIENT 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 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() { local dontfail=$1 local n=$WAITTIME for i in $(seq $n); do $HIJACKING pppoectl -d pppoe0 |grep -q "state = session" [ $? = 0 ] && return 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 auth=pap + 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=$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 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 up $DEBUG && rump.ifconfig wait_for_session_established atf_check -s exit:0 -o ignore rump.ping -c 1 -w $TIMEOUT $SERVER_IP 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" unset RUMP_SERVER # test for recoonecting atf_check -s exit:0 -x "env RUMP_SERVER=$SERVER rump.ifconfig pppoe0 up" export RUMP_SERVER=$CLIENT wait_for_session_established atf_check -s exit:0 -o ignore rump.ping -c 1 -w $TIMEOUT $SERVER_IP 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 $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.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 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.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 } Index: stable/11/contrib/netbsd-tests/net/if_tap/t_tap.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/if_tap/t_tap.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/if_tap/t_tap.sh (revision 313680) @@ -1,198 +1,198 @@ -# $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. # # 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. # -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 IP4_LOCAL=10.0.0.1 IP4_TAP=10.0.0.2 IP4_REMOTE=10.0.0.3 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 tap_create_destroy_head() { atf_set "descr" "tests of creation and deletion of tap interface" atf_set "require.progs" "rump_server" } 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} # Create and destroy (no address) atf_check -s exit:0 rump.ifconfig tap0 create atf_check -s exit:0 rump.ifconfig tap0 destroy # Create and destroy (with an IPv4 address) atf_check -s exit:0 rump.ifconfig tap0 create atf_check -s exit:0 rump.ifconfig tap0 $IP4_TAP atf_check -s exit:0 rump.ifconfig tap0 up atf_check -s exit:0 rump.ifconfig tap0 destroy # Create and destroy (with an IPv6 address) atf_check -s exit:0 rump.ifconfig tap0 create atf_check -s exit:0 rump.ifconfig tap0 inet6 $IP6_TAP atf_check -s exit:0 rump.ifconfig tap0 up atf_check -s exit:0 rump.ifconfig tap0 destroy } tap_create_destroy_cleanup() { - RUMP_SERVER=${SOCK_LOCAL} rump.halt + $DEBUG && dump + cleanup } atf_test_case tap_stand_alone cleanup tap_create_destroy_head() { atf_set "descr" "tests of alone tap interface" atf_set "require.progs" "rump_server" } 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 atf_check -s exit:0 rump.ifconfig tap0 create atf_check -s exit:0 rump.ifconfig tap0 $IP4_TAP atf_check -s exit:0 rump.ifconfig tap0 inet6 $IP6_TAP atf_check -s exit:0 rump.ifconfig tap0 up atf_check -s exit:0 rump.ifconfig -w 10 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 atf_check -s exit:0 rump.ifconfig -w 10 atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP4_LOCAL # Cannot reach to an alone tap atf_check -s not-exit:0 -o ignore -e ignore \ rump.ping -n -w $TIMEOUT -c 1 $IP4_TAP atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 $IP6_LOCAL # 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 tap_bridged_head() { atf_set "descr" "tests of alone tap interface" atf_set "require.progs" "rump_server" } 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 atf_check -s exit:0 rump.ifconfig tap0 create atf_check -s exit:0 rump.ifconfig tap0 $IP4_TAP atf_check -s exit:0 rump.ifconfig tap0 inet6 $IP6_TAP atf_check -s exit:0 rump.ifconfig tap0 up atf_check -s exit:0 rump.ifconfig -w 10 atf_check -s exit:0 rump.ifconfig bridge0 create atf_check -s exit:0 rump.ifconfig bridge0 up export LD_PRELOAD=/usr/lib/librumphijack.so atf_check -s exit:0 brconfig bridge0 add shmif0 atf_check -s exit:0 brconfig bridge0 add tap0 unset LD_PRELOAD 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 atf_check -s exit:0 rump.ifconfig -w 10 atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP4_LOCAL atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP4_TAP 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() { atf_add_test_case tap_create_destroy atf_add_test_case tap_stand_alone atf_add_test_case tap_bridged } Index: stable/11/contrib/netbsd-tests/net/mcast/t_mcast.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/mcast/t_mcast.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/mcast/t_mcast.sh (revision 313680) @@ -1,110 +1,106 @@ -# $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. # # 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. # -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() { local name="$1" 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 atf_check -s exit:0 rump.ifconfig -w 10 atf_check -s not-exit:0 -x "rump.ifconfig shmif0 |grep -q tentative" # A route to the mcast address is required to join the mcast group atf_check -s exit:0 -o ignore rump.route add default 10.0.0.1 atf_check -s exit:0 -o ignore rump.route add -inet6 default fc00::1 $DEBUG && rump.ifconfig $DEBUG && rump.netstat -nr export LD_PRELOAD=/usr/lib/librumphijack.so #$DEBUG && /usr/sbin/ifmcstat # Not yet run on rump kernel if $DEBUG; then atf_check -s exit:0 -o ignore $mcast -d ${opts} else atf_check -s exit:0 $mcast ${opts} fi #$DEBUG && /usr/sbin/ifmcstat # Not yet run on rump kernel unset LD_PRELOAD } add_test() { local name=$1 local opts="$2" local desc="$3" atf_test_case "mcast_${name}" cleanup eval "mcast_${name}_head() { \ atf_set \"descr\" \"${desc}\"; \ atf_set \"require.progs\" \"rump_server\"; \ }; \ 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}" } atf_init_test_cases() { add_test conninet4 "-c -4" \ "Checks connected multicast for ipv4" add_test connmappedinet4 "-c -m -4" \ "Checks connected multicast for mapped ipv4" add_test connmappedbuginet4 "-c -m -b -4" \ "Checks connected multicast for mapped ipv4 using the v4 ioctls" add_test conninet6 "-c -6" \ "Checks connected multicast for ipv6" add_test unconninet4 "-4" \ "Checks unconnected multicast for ipv4" add_test unconnmappedinet4 "-m -4" \ "Checks unconnected multicast for mapped ipv4" add_test unconnmappedbuginet4 "-m -b -4" \ "Checks unconnected multicast for mapped ipv4 using the v4 ioctls" add_test unconninet6 "-6" \ "Checks unconnected multicast for ipv6" } Index: stable/11/contrib/netbsd-tests/net/ndp/t_dad.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/ndp/t_dad.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/ndp/t_dad.sh (revision 313680) @@ -1,250 +1,276 @@ -# $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. # # 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. # -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() { atf_set "descr" "Tests for IPv6 DAD basic behavior" atf_set "require.progs" "rump_server" } dad_duplicated_head() { atf_set "descr" "Tests for IPv6 DAD duplicated state" 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 $DEBUG && rump.ifconfig shmif0 } make_ns_pkt_str() { local id=$1 local target=$2 pkt="33:33:ff:00:00:0${id}, ethertype IPv6 (0x86dd), length 78: ::" pkt="$pkt > ff02::1:ff00:${id}: ICMP6, neighbor solicitation," pkt="$pkt who has $target, length 24" 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= local localip1=fc00::1 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 atf_check -s exit:0 rump.ifconfig shmif0 up rump.ifconfig shmif0 > ./out $DEBUG && cat ./out # The primary address doesn't start with tentative state atf_check -s not-exit:0 -x "cat ./out |grep $localip1 |grep -q 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 $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) pkt=$(make_ns_pkt_str 2 $localip2) atf_check -s exit:0 -x "cat ./out |grep -q '$pkt'" # No DAD for the primary address pkt=$(make_ns_pkt_str 1 $localip1) atf_check -s not-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 alias address left tentative atf_check -s not-exit:0 -x "rump.ifconfig shmif0 |grep $localip2 |grep -q tentative" # # Add a new address on the fly # atf_check -s exit:0 rump.ifconfig shmif0 inet6 $localip3 # 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 $localip3 |grep -q tentative" # 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() { local localip1=fc00::1 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 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 # atf_check -s exit:0 rump.ifconfig shmif0 inet6 $peerip 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() { $DEBUG && dump 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 } Index: stable/11/contrib/netbsd-tests/net/ndp/t_ndp.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/ndp/t_ndp.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/ndp/t_ndp.sh (revision 313680) @@ -1,454 +1,406 @@ -# $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. # # 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. # -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 atf_test_case ndp_commands cleanup atf_test_case ndp_cache_overwriting cleanup atf_test_case ndp_neighborgcthresh cleanup atf_test_case ndp_link_activation cleanup ndp_cache_expiration_head() { atf_set "descr" "Tests for NDP cache expiration" atf_set "require.progs" "rump_server" } ndp_commands_head() { atf_set "descr" "Tests for commands of ndp(8)" atf_set "require.progs" "rump_server" } ndp_cache_overwriting_head() { atf_set "descr" "Tests for behavior of overwriting NDP caches" atf_set "require.progs" "rump_server" } ndp_neighborgcthresh_head() { atf_set "descr" "Tests for GC of neighbor caches" atf_set "require.progs" "rump_server" } ndp_link_activation_head() { atf_set "descr" "Tests for activating a new MAC address" atf_set "require.progs" "rump_server" } 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 atf_check -s exit:0 rump.ifconfig shmif0 up atf_check -s exit:0 rump.ifconfig -w 10 $DEBUG && rump.ifconfig shmif0 $DEBUG && rump.ndp -n -a } setup_src_server() { $DEBUG && ulimit -c unlimited 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 # Sanity check $DEBUG && rump.ifconfig shmif0 $DEBUG && rump.ndp -n -a atf_check -s exit:0 -o ignore rump.ndp -n $IP6SRC atf_check -s not-exit:0 -o ignore -e ignore rump.ndp -n $IP6DST } get_timeout() { local timeout=$(env RUMP_SERVER=$SOCKSRC rump.ndp -n $IP6DST |grep $IP6DST|awk '{print $4;}') timeout=${timeout%s} echo $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 # # Check if a cache is expired expectedly # export RUMP_SERVER=$SOCKSRC atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 $IP6DST $DEBUG && rump.ndp -n -a atf_check -s exit:0 -o match:'permanent' rump.ndp -n $IP6SRC # Should be cached atf_check -s exit:0 -o not-match:'permanent' rump.ndp -n $IP6DST timeout=$(get_timeout $IP6DST) atf_check -s exit:0 sleep $(($timeout + 1)) $DEBUG && rump.ndp -n -a 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() { export RUMP_SERVER=$SOCKDST atf_check -s exit:0 rump.ifconfig shmif0 down export RUMP_SERVER=$SOCKSRC } 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 export RUMP_SERVER=$SOCKSRC # We can delete the entry for the interface's IP address atf_check -s exit:0 -o match:"$IP6SRC" rump.ndp -d $IP6SRC # Add and delete a static entry $DEBUG && rump.ndp -n -a atf_check -s exit:0 -o ignore rump.ndp -s fc00::10 b2:a0:20:00:00:10 $DEBUG && rump.ndp -n -a atf_check -s exit:0 -o match:'permanent' rump.ndp -n fc00::10 atf_check -s exit:0 -o match:'deleted' rump.ndp -d fc00::10 $DEBUG && rump.ndp -n -a atf_check -s not-exit:0 -o ignore -e ignore rump.ndp -n fc00::10 # Add multiple entries via a file (XXX not implemented) #cat - > ./list <<-EOF #fc00::11 b2:a0:20:00:00:11 #fc00::12 b2:a0:20:00:00:12 #fc00::13 b2:a0:20:00:00:13 #fc00::14 b2:a0:20:00:00:14 #fc00::15 b2:a0:20:00:00:15 #EOF #$DEBUG && rump.ndp -n -a #atf_check -s exit:0 -o ignore rump.ndp -f ./list #$DEBUG && rump.ndp -n -a atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 $IP6DST atf_check -s exit:0 -o ignore rump.ndp -s fc00::11 b2:a0:20:00:00:11 atf_check -s exit:0 -o ignore rump.ndp -s fc00::12 b2:a0:20:00:00:12 atf_check -s exit:0 -o not-match:'permanent' rump.ndp -n $IP6DST atf_check -s exit:0 -o match:'permanent' rump.ndp -n fc00::11 atf_check -s exit:0 -o match:'permanent' rump.ndp -n fc00::12 # Test ndp -a atf_check -s exit:0 -o match:'fc00::11' rump.ndp -n -a atf_check -s exit:0 -o match:'fc00::12' rump.ndp -n -a # Ensure no packet upsets the src server ifdown_dst_server # Flush all entries (-c) $DEBUG && rump.ndp -n -a atf_check -s exit:0 -o ignore rump.ndp -c atf_check -s not-exit:0 -o ignore -e ignore rump.ndp -n $IP6SRC atf_check -s not-exit:0 -o ignore -e ignore rump.ndp -n $IP6DST # Only the static caches are not deleted atf_check -s exit:0 -o ignore -e ignore rump.ndp -n fc00::11 atf_check -s exit:0 -o ignore -e ignore rump.ndp -n fc00::12 $DEBUG && rump.ndp -n -a atf_check -s exit:0 -o ignore rump.ndp -s fc00::10 b2:a0:20:00:00:10 temp rump.ndp -s fc00::10 b2:a0:20:00:00:10 temp $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 export RUMP_SERVER=$SOCKSRC # Cannot overwrite a permanent cache atf_check -s not-exit:0 -e ignore rump.ndp -s $IP6SRC b2:a0:20:00:00:ff $DEBUG && rump.ndp -n -a atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 $IP6DST $DEBUG && rump.ndp -n -a # Can overwrite a dynamic cache atf_check -s exit:0 -o ignore rump.ndp -s $IP6DST b2:a0:20:00:00:00 $DEBUG && rump.ndp -n -a atf_check -s exit:0 -o match:'permanent' rump.ndp -n $IP6DST # Test temp option (XXX it doesn't work; expire time isn't set) #atf_check -s exit:0 -o ignore rump.ndp -s fc00::10 b2:a0:20:00:00:10 temp #$DEBUG && rump.ndp -n -a #atf_check -s exit:0 -o not-match:'permanent' rump.ndp -n fc00::10 # Cannot overwrite a temp cache #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() { echo $(rump.ndp -a -n |grep -v -e Neighbor -e permanent |wc -l) } 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 export RUMP_SERVER=$SOCKDST for i in $(seq 0 9); do atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6DST}$i done export RUMP_SERVER=$SOCKSRC # ping to 3 destinations $DEBUG && rump.ndp -n -a for i in $(seq 0 2); do atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 \ ${IP6DST}$i done $DEBUG && rump.ndp -n -a # 3 caches should be created atf_check_equal $(get_n_caches) 3 # ping to additional 3 destinations for i in $(seq 3 5); do atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 \ ${IP6DST}$i done $DEBUG && rump.ndp -n -a # 6 caches should be created in total atf_check_equal $(get_n_caches) 6 # Limit the number of neighbor caches to 5 atf_check -s exit:0 -o ignore rump.sysctl -w \ net.inet6.ip6.neighborgcthresh=5 # ping to additional 4 destinations for i in $(seq 6 9); do atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 \ ${IP6DST}$i done # More than 5 caches should be created in total, but exceeded caches # should be GC-ed if [ "$(get_n_caches)" -gt 5 ]; then atf_fail "Neighbor caches are not GC-ed" fi - return 0 + rump_server_destroy_ifaces } make_pkt_str_na() { local ip=$1 local mac=$2 local pkt= pkt="$mac > 33:33:00:00:00:01, ethertype IPv6 (0x86dd), length 86:" pkt="$pkt $ip > ff02::1: ICMP6, neighbor advertisement" 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 atf_check -s exit:0 -o ignore rump.ifconfig shmif0 link \ 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;}') $DEBUG && echo $linklocal pkt=$(make_pkt_str_na $linklocal b2:a1:00:00:00:01) atf_check -s not-exit:0 -x "cat ./out |grep -q '$pkt'" atf_check -s exit:0 -o ignore rump.ifconfig shmif0 link \ 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;}') $DEBUG && echo $linklocal 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() { $DEBUG && dump cleanup } ndp_commands_cleanup() { $DEBUG && dump cleanup } ndp_cache_overwriting_cleanup() { $DEBUG && dump cleanup } ndp_neighborgcthresh_cleanup() { $DEBUG && dump cleanup } ndp_link_activation_cleanup() { $DEBUG && dump cleanup } atf_init_test_cases() { atf_add_test_case ndp_cache_expiration atf_add_test_case ndp_commands atf_add_test_case ndp_cache_overwriting atf_add_test_case ndp_neighborgcthresh atf_add_test_case ndp_link_activation } Index: stable/11/contrib/netbsd-tests/net/ndp/t_ra.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/ndp/t_ra.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/ndp/t_ra.sh (revision 313680) @@ -1,166 +1,687 @@ -# $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. # # 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. # -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 - atf_check -s exit:0 rump.ifconfig shmif0 create - atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1 + rump_server_add_iface $sock shmif0 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 } wait_term() { local PIDFILE=${1} shift while [ -f ${PIDFILE} ] do sleep 0.2 done return 0 } create_rtadvdconfig() { cat << _EOF > ${CONFIG} shmif0:\ :mtu#1300:maxinterval#4:mininterval#3: _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.+" \ + 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 + start_rtadvd $RUMPSRV $PIDFILE + sleep $WAITTIME - 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 - 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 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 } -basic_cleanup() +ra_delete_address_cleanup() { if [ -f ${PIDFILE} ]; then kill -TERM `cat ${PIDFILE}` wait_term ${PIDFILE} fi - env RUMP_SERVER=${RUMPSRV} rump.halt - env RUMP_SERVER=${RUMPCLI} rump.halt + $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.+" \ + rump.ifconfig shmif0 inet6 + unset RUMP_SERVER + + atf_check -s exit:0 kill -TERM `cat ${PIDFILE}` + wait_term ${PIDFILE} + + rump_server_destroy_ifaces +} + +ra_temporary_address_cleanup() +{ + + if [ -f ${PIDFILE} ]; then + kill -TERM `cat ${PIDFILE}` + wait_term ${PIDFILE} + fi + + $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 } Index: stable/11/contrib/netbsd-tests/net/net/t_forwarding.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/net/t_forwarding.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/net/t_forwarding.sh (revision 313680) @@ -1,563 +1,530 @@ -# $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. # # 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. # -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 IP4SRC=10.0.1.2 IP4SRCGW=10.0.1.1 IP4DSTGW=10.0.2.1 IP4DST=10.0.2.2 IP4DST_BCAST=10.0.2.255 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 atf_test_case ipforwarding_v6 cleanup atf_test_case ipforwarding_fastforward_v4 cleanup atf_test_case ipforwarding_fastforward_v6 cleanup atf_test_case ipforwarding_misc cleanup ipforwarding_v4_head() { atf_set "descr" "Does IPv4 forwarding tests" atf_set "require.progs" "rump_server" } ipforwarding_v6_head() { atf_set "descr" "Does IPv6 forwarding tests" 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" atf_set "require.progs" "rump_server" } setup_endpoint() { sock=${1} addr=${2} bus=${3} 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} else atf_check -s exit:0 rump.ifconfig shmif0 inet ${addr} netmask 0xffffff00 atf_check -s exit:0 -o ignore rump.route add default ${gw} fi atf_check -s exit:0 rump.ifconfig shmif0 up if $DEBUG; then rump.ifconfig shmif0 rump.netstat -nr fi } test_endpoint() { sock=${1} addr=${2} bus=${3} mode=${4} export RUMP_SERVER=${sock} atf_check -s exit:0 -o match:shmif0 rump.ifconfig if [ $mode = "ipv6" ]; then atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${addr} else atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 ${addr} fi } setup_forwarder() { mode=${1} + rump_server_add_iface $SOCKFWD shmif0 bus1 + rump_server_add_iface $SOCKFWD shmif1 bus2 + export RUMP_SERVER=$SOCKFWD - 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 shmif1 create - atf_check -s exit:0 rump.ifconfig shmif1 linkstr bus2 - if [ $mode = "ipv6" ]; then atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6SRCGW} atf_check -s exit:0 rump.ifconfig shmif1 inet6 ${IP6DSTGW} else atf_check -s exit:0 rump.ifconfig shmif0 inet ${IP4SRCGW} netmask 0xffffff00 atf_check -s exit:0 rump.ifconfig shmif1 inet ${IP4DSTGW} netmask 0xffffff00 fi atf_check -s exit:0 rump.ifconfig shmif0 up atf_check -s exit:0 rump.ifconfig shmif1 up if $DEBUG; then rump.netstat -nr if [ $mode = "ipv6" ]; then rump.sysctl net.inet6.ip6.forwarding else rump.sysctl net.inet.ip.forwarding fi fi } 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 setup_forwarder ipv4 } 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 export RUMP_SERVER=$SOCKFWD atf_check -s exit:0 rump.arp -d -a export RUMP_SERVER=$SOCKSRC # get the webpage atf_check -s exit:0 env LD_PRELOAD=/usr/lib/librumphijack.so \ ftp -q $TIMEOUT -o out http://$ip/$HTML_FILE } test_setup() { test_endpoint $SOCKSRC $IP4SRC bus1 ipv4 test_endpoint $SOCKDST $IP4DST bus2 ipv4 export RUMP_SERVER=$SOCKFWD atf_check -s exit:0 -o match:shmif0 rump.ifconfig atf_check -s exit:0 -o match:shmif1 rump.ifconfig atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 ${IP4SRCGW} atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 ${IP4DSTGW} } test_setup6() { test_endpoint $SOCKSRC $IP6SRC bus1 ipv6 test_endpoint $SOCKDST $IP6DST bus2 ipv6 export RUMP_SERVER=$SOCKFWD atf_check -s exit:0 -o match:shmif0 rump.ifconfig atf_check -s exit:0 -o match:shmif1 rump.ifconfig atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${IP6SRCGW} atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${IP6DSTGW} } setup_forwarding() { export RUMP_SERVER=$SOCKFWD atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.forwarding=1 } setup_forwarding6() { export RUMP_SERVER=$SOCKFWD atf_check -s exit:0 -o ignore rump.sysctl -w net.inet6.ip6.forwarding=1 } setup_directed_broadcast() { export RUMP_SERVER=$SOCKFWD atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.directed-broadcast=1 } setup_icmp_bmcastecho() { export RUMP_SERVER=$SOCKDST atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.icmp.bmcastecho=1 } teardown_forwarding() { export RUMP_SERVER=$SOCKFWD atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.forwarding=0 } teardown_forwarding6() { export RUMP_SERVER=$SOCKFWD atf_check -s exit:0 -o ignore rump.sysctl -w net.inet6.ip6.forwarding=0 } teardown_directed_broadcast() { export RUMP_SERVER=$SOCKFWD atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.directed-broadcast=0 } teardown_icmp_bmcastecho() { export RUMP_SERVER=$SOCKDST atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.icmp.bmcastecho=0 } 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() { export RUMP_SERVER=$SOCKFWD atf_check -s exit:0 -o match:"net.inet.ip.forwarding = 1" \ rump.sysctl net.inet.ip.forwarding } test_setup_forwarding6() { export RUMP_SERVER=$SOCKFWD atf_check -s exit:0 -o match:"net.inet6.ip6.forwarding = 1" \ rump.sysctl net.inet6.ip6.forwarding } test_teardown_forwarding() { export RUMP_SERVER=$SOCKFWD atf_check -s exit:0 -o match:"net.inet.ip.forwarding = 0" \ rump.sysctl net.inet.ip.forwarding } test_teardown_forwarding6() { export RUMP_SERVER=$SOCKFWD atf_check -s exit:0 -o match:"net.inet6.ip6.forwarding = 0" \ 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 atf_check -s not-exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP4DST export RUMP_SERVER=$SOCKDST atf_check -s not-exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP4SRC } test_ping_success() { export RUMP_SERVER=$SOCKSRC $DEBUG && rump.ifconfig -v shmif0 atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP4SRCGW atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP4DST $DEBUG && rump.ifconfig -v shmif0 export RUMP_SERVER=$SOCKDST $DEBUG && rump.ifconfig -v shmif0 atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP4DSTGW atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP4SRC $DEBUG && rump.ifconfig -v shmif0 } test_ping_ttl() { export RUMP_SERVER=$SOCKSRC $DEBUG && rump.ifconfig -v shmif0 atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 -T 1 $IP4SRCGW atf_check -s not-exit:0 -o match:'Time To Live exceeded' \ rump.ping -v -n -w $TIMEOUT -c 1 -T 1 $IP4DST atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 -T 2 $IP4DST $DEBUG && rump.ifconfig -v shmif0 } test_sysctl_ttl() { local ip=$1 export RUMP_SERVER=$SOCKSRC $DEBUG && rump.ifconfig -v shmif0 atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.ttl=1 # get the webpage atf_check -s not-exit:0 -e match:'timed out' \ env LD_PRELOAD=/usr/lib/librumphijack.so \ ftp -q $TIMEOUT -o out http://$ip/$HTML_FILE atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.ttl=2 # get the webpage atf_check -s exit:0 env LD_PRELOAD=/usr/lib/librumphijack.so \ ftp -q $TIMEOUT -o out http://$ip/$HTML_FILE atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.ttl=64 $DEBUG && rump.ifconfig -v shmif0 } test_directed_broadcast() { setup_icmp_bmcastecho setup_directed_broadcast export RUMP_SERVER=$SOCKSRC atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP4DST_BCAST teardown_directed_broadcast export RUMP_SERVER=$SOCKSRC atf_check -s not-exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP4DST_BCAST teardown_icmp_bmcastecho } test_ping6_failure() { export RUMP_SERVER=$SOCKSRC atf_check -s not-exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP6DST export RUMP_SERVER=$SOCKDST atf_check -s not-exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP6SRC } test_ping6_success() { export RUMP_SERVER=$SOCKSRC $DEBUG && rump.ifconfig -v shmif0 atf_check -s exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP6SRCGW atf_check -s exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP6DST $DEBUG && rump.ifconfig -v shmif0 export RUMP_SERVER=$SOCKDST $DEBUG && rump.ifconfig -v shmif0 atf_check -s exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP6DSTGW atf_check -s exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP6SRC $DEBUG && rump.ifconfig -v shmif0 } test_hoplimit() { export RUMP_SERVER=$SOCKSRC $DEBUG && rump.ifconfig -v shmif0 atf_check -s exit:0 -o ignore rump.ping6 -q -n -c 1 -h 1 -X $TIMEOUT $IP6SRCGW atf_check -s not-exit:0 -o match:'Time to live exceeded' \ rump.ping6 -v -n -c 1 -h 1 -X $TIMEOUT $IP6DST atf_check -s exit:0 -o ignore rump.ping6 -q -n -c 1 -h 2 -X $TIMEOUT $IP6DST $DEBUG && rump.ifconfig -v shmif0 } ipforwarding_v4_body() { setup test_setup setup_forwarding test_setup_forwarding test_ping_success teardown_forwarding test_teardown_forwarding test_ping_failure teardown_interfaces } ipforwarding_v6_body() { setup6 test_setup6 setup_forwarding6 test_setup_forwarding6 test_ping6_success test_hoplimit teardown_forwarding6 test_teardown_forwarding6 test_ping6_failure teardown_interfaces } ipforwarding_fastforward_v4_body() { setup test_setup 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 } ipforwarding_fastforward_v6_body() { setup6 test_setup6 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 } ipforwarding_misc_body() { setup test_setup setup_forwarding test_setup_forwarding test_ping_ttl test_directed_broadcast - setup_bozo $IP4DST + touch $HTML_FILE + start_httpd $SOCKDST $IP4DST + $DEBUG && rump.netstat -a + test_sysctl_ttl $IP4DST teardown_interfaces return 0 } 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 } atf_init_test_cases() { atf_add_test_case ipforwarding_v4 atf_add_test_case ipforwarding_v6 atf_add_test_case ipforwarding_fastforward_v4 atf_add_test_case ipforwarding_fastforward_v6 atf_add_test_case ipforwarding_misc } Index: stable/11/contrib/netbsd-tests/net/net/t_ipaddress.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/net/t_ipaddress.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/net/t_ipaddress.sh (revision 313680) @@ -1,190 +1,193 @@ -# $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. # # 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. # -SERVER="rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_shmif -lrumpdev" -SERVER6="$SERVER -lrumpnet_netinet6" SOCK_LOCAL=unix://commsock1 BUS=bus -DEBUG=false +DEBUG=${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'" -} - 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 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 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() { 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 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 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() { local name=$1 local desc="$2" atf_test_case "ipaddr_${name}" cleanup eval "ipaddr_${name}_head() { \ atf_set \"descr\" \"${desc}\"; \ atf_set \"require.progs\" \"rump_server\"; \ }; \ ipaddr_${name}_body() { \ test_${name}; \ }; \ ipaddr_${name}_cleanup() { \ + $DEBUG && dump; \ cleanup; \ }" atf_add_test_case "ipaddr_${name}" } 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" } Index: stable/11/contrib/netbsd-tests/net/net/t_ipv6_lifetime.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/net/t_ipv6_lifetime.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/net/t_ipv6_lifetime.sh (revision 313680) @@ -1,133 +1,127 @@ -# $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. # # 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. # -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 basic_head() { atf_set "descr" "Tests for IPv6 address lifetime" atf_set "require.progs" "rump_server" } basic_body() { local time=5 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 atf_check -s exit:0 rump.ifconfig shmif0 inet6 $ip $DEBUG && rump.ifconfig -L shmif0 atf_check -s exit:0 -o not-match:'pltime' rump.ifconfig -L shmif0 atf_check -s exit:0 -o not-match:'vltime' rump.ifconfig -L shmif0 atf_check -s exit:0 rump.ifconfig shmif0 inet6 $ip delete # Setting only a preferred lifetime atf_check -s exit:0 rump.ifconfig shmif0 inet6 $ip pltime $time $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 infty' rump.ifconfig -L shmif0 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) atf_check -s not-exit:0 -e match:'Invalid argument' \ rump.ifconfig shmif0 inet6 $ip vltime $time # Setting both preferred and valid lifetimes (same value) atf_check -s exit:0 rump.ifconfig shmif0 inet6 $ip \ pltime $time vltime $time $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 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 + # 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() { $DEBUG && dump cleanup } atf_init_test_cases() { atf_add_test_case basic } Index: stable/11/contrib/netbsd-tests/net/net/t_ipv6address.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/net/t_ipv6address.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/net/t_ipv6address.sh (revision 313680) @@ -1,394 +1,387 @@ -# $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. # # 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. -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 SOCKDST=unix://commsock3 IP6SRCNW=fc00:1::0/64 IP6SRC=fc00:1::1 IP6DSTNW=fc00:2::0/64 IP6DST=fc00:2::1 IP6FWD0=fc00:3::1 BUS1=bus1 BUS2=bus2 BUSSRC=bus_src BUSDST=bus_dst -DEBUG=true +DEBUG=${DEBUG:-true} TIMEOUT=3 atf_test_case linklocal cleanup atf_test_case linklocal_ops cleanup setup() { atf_check -s exit:0 ${SERVER6} ${SOCKSRC} atf_check -s exit:0 ${SERVER6} ${SOCKFWD} atf_check -s exit:0 ${SERVER6} ${SOCKDST} export RUMP_SERVER=${SOCKSRC} atf_check -s exit:0 rump.ifconfig shmif0 create atf_check -s exit:0 rump.ifconfig shmif1 create unset RUMP_SERVER export RUMP_SERVER=${SOCKDST} atf_check -s exit:0 rump.ifconfig shmif0 create atf_check -s exit:0 rump.ifconfig shmif1 create unset RUMP_SERVER export RUMP_SERVER=${SOCKFWD} atf_check -s exit:0 rump.ifconfig shmif0 create atf_check -s exit:0 rump.ifconfig shmif1 create atf_check -s exit:0 -o match:"0 -> 1" rump.sysctl \ -w net.inet6.ip6.forwarding=1 unset RUMP_SERVER setup_ifcfg export RUMP_SERVER=${SOCKSRC} $DEBUG && rump.ifconfig $DEBUG && rump.netstat -rn -f inet6 unset RUMP_SERVER export RUMP_SERVER=${SOCKDST} $DEBUG && rump.ifconfig $DEBUG && rump.netstat -rn -f inet6 unset RUMP_SERVER export RUMP_SERVER=${SOCKFWD} $DEBUG && rump.ifconfig $DEBUG && rump.netstat -rn -f inet6 unset RUMP_SERVER } setup_ifcfg() { export RUMP_SERVER=${SOCKSRC} 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 linkstr ${BUSSRC} atf_check -s exit:0 rump.ifconfig shmif1 up atf_check -s exit:0 -o ignore rump.ifconfig -w 10 unset RUMP_SERVER export RUMP_SERVER=${SOCKDST} atf_check -s exit:0 rump.ifconfig shmif0 linkstr ${BUS2} atf_check -s exit:0 rump.ifconfig shmif0 up atf_check -s exit:0 rump.ifconfig shmif1 linkstr ${BUSDST} atf_check -s exit:0 rump.ifconfig shmif1 up atf_check -s exit:0 -o ignore rump.ifconfig -w 10 unset RUMP_SERVER export RUMP_SERVER=${SOCKFWD} 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 linkstr ${BUS2} atf_check -s exit:0 rump.ifconfig shmif1 up atf_check -s exit:0 -o ignore rump.ifconfig -w 10 unset RUMP_SERVER } 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 ${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 ${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 export RUMP_SERVER=$tmp_rump_server } cleanup_bus() { local tmp_rump_server=$RUMP_SERVER $DEBUG && dump_bus export RUMP_SERVER=${SOCKSRC} atf_check -s exit:0 rump.ifconfig shmif0 down atf_check -s exit:0 rump.ifconfig shmif0 -linkstr atf_check -s exit:0 rump.ifconfig shmif1 down atf_check -s exit:0 rump.ifconfig shmif1 -linkstr unset RUMP_SERVER export RUMP_SERVER=${SOCKDST} atf_check -s exit:0 rump.ifconfig shmif0 down atf_check -s exit:0 rump.ifconfig shmif0 -linkstr atf_check -s exit:0 rump.ifconfig shmif1 down atf_check -s exit:0 rump.ifconfig shmif1 -linkstr unset RUMP_SERVER export RUMP_SERVER=${SOCKFWD} atf_check -s exit:0 rump.ifconfig shmif0 down atf_check -s exit:0 rump.ifconfig shmif0 -linkstr atf_check -s exit:0 rump.ifconfig shmif1 down atf_check -s exit:0 rump.ifconfig shmif1 -linkstr unset RUMP_SERVER atf_check -s exit:0 rm ${BUSSRC} atf_check -s exit:0 rm ${BUSDST} atf_check -s exit:0 rm ${BUS1} atf_check -s exit:0 rm ${BUS2} setup_ifcfg 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() { env RUMP_SERVER=${SOCKSRC} rump.halt env RUMP_SERVER=${SOCKDST} rump.halt env RUMP_SERVER=${SOCKFWD} rump.halt } 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} rump.ndp -n -a rump.netstat -nr -f inet6 export RUMP_SERVER=${SOCKDST} rump.ndp -n -a rump.netstat -nr -f inet6 export RUMP_SERVER=${SOCKFWD} rump.ndp -n -a rump.netstat -nr -f inet6 unset RUMP_SERVER } 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 $DEBUG && rump.netstat -rn -f inet6 # link local address to link local address atf_check -s not-exit:0 -e match:"No route to host" \ rump.ping6 -c 1 -X $TIMEOUT -n ${fwd_if0_lladdr} atf_check -s exit:0 -o match:"0.0% packet loss" \ rump.ping6 -c 1 -X $TIMEOUT -n ${fwd_if0_lladdr}%shmif0 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 atf_check -s not-exit:0 -o ignore -e ignore \ 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 # link local address to host address export RUMP_SERVER=${SOCKFWD} atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6FWD0} atf_check -s exit:0 -o ignore rump.ifconfig -w 10 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} # host address to link local address atf_check -s exit:0 -o match:"0.0% packet loss" \ rump.ping6 -c 1 -X $TIMEOUT -n ${src_if0_lladdr}%shmif0 atf_check -s not-exit:0 -o match:"100.0% packet loss" \ rump.ping6 -c 1 -X $TIMEOUT -n ${src_if1_lladdr}%shmif0 atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6FWD0} delete unset RUMP_SERVER # forwarding with link local address setup_route export RUMP_SERVER=${SOCKSRC} atf_check -s exit:0 -o match:"0.0% packet loss" rump.ping6 -c 1 \ -X $TIMEOUT -n -S ${IP6SRC} ${IP6DST} cleanup_bus $DEBUG && rump.ifconfig shmif0 atf_check -s not-exit:0 -o match:"100.0% packet loss" rump.ping6 -c 1 \ -X $TIMEOUT -n -S ${src_if0_lladdr}%shmif0 ${IP6DST} atf_check -s ignore -o not-match:"${src_if0_lladdr}" -e ignore \ -x "shmif_dumpbus -p - ${BUS2} | tcpdump -r - -n -p icmp6" cleanup_bus atf_check -s not-exit:0 -o match:"100.0% packet loss" rump.ping6 -c 1 \ -X $TIMEOUT -n -S ${IP6SRC} ${dst_if0_lladdr}%shmif0 atf_check -s ignore -o not-empty -e ignore \ -x "shmif_dumpbus -p - ${BUS2} | tcpdump -r - -n -p icmp6" unset RUMP_SERVER } linklocal_cleanup() { - $DEBUG && dump + $DEBUG && _dump $DEBUG && dump_bus cleanup_rump_servers } 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" } linklocal_ops_body() { local src_if0_lladdr= setup - src_if0_lladdr=`get_lladdr ${SOCKSRC} shmif0` + src_if0_lladdr=`get_linklocal_addr ${SOCKSRC} shmif0` export RUMP_SERVER=${SOCKSRC} # route get atf_check -s exit:0 -o match:"${src_if0_lladdr}" \ rump.route get -inet6 ${src_if0_lladdr}%shmif0 # route get without an interface name (zone index) atf_check -s not-exit:0 -e match:"not in table" \ rump.route get -inet6 ${src_if0_lladdr} # ndp atf_check -s exit:0 -o match:"${src_if0_lladdr}" \ rump.ndp -n ${src_if0_lladdr}%shmif0 # ndp without an interface name (zone index) atf_check -s not-exit:0 -o ignore -e match:"no entry" \ rump.ndp -n ${src_if0_lladdr} } linklocal_ops_cleanup() { cleanup_rump_servers } atf_init_test_cases() { atf_add_test_case linklocal atf_add_test_case linklocal_ops } Index: stable/11/contrib/netbsd-tests/net/net/t_mtudisc.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/net/t_mtudisc.sh (nonexistent) +++ stable/11/contrib/netbsd-tests/net/net/t_mtudisc.sh (revision 313680) @@ -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 +} Property changes on: stable/11/contrib/netbsd-tests/net/net/t_mtudisc.sh ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/net/net/t_mtudisc6.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/net/t_mtudisc6.sh (nonexistent) +++ stable/11/contrib/netbsd-tests/net/net/t_mtudisc6.sh (revision 313680) @@ -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 +} Property changes on: stable/11/contrib/netbsd-tests/net/net/t_mtudisc6.sh ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/net/net/t_ping6_opts.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/net/t_ping6_opts.sh (nonexistent) +++ stable/11/contrib/netbsd-tests/net/net/t_ping6_opts.sh (revision 313680) @@ -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 + 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 + 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 + 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 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 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 +} Property changes on: stable/11/contrib/netbsd-tests/net/net/t_ping6_opts.sh ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/net/net_common.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/net_common.sh (nonexistent) +++ stable/11/contrib/netbsd-tests/net/net_common.sh (revision 313680) @@ -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 +} Property changes on: stable/11/contrib/netbsd-tests/net/net_common.sh ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/net/route/t_change.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/route/t_change.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/route/t_change.sh (revision 313680) @@ -1,304 +1,304 @@ -# $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. # # 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. # netserver=\ "rump_server -lrumpdev -lrumpnet -lrumpnet_net \ -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() { atf_set "descr" "Change a reject route to blackhole" atf_set "require.progs" "rump_server" } route_change_reject2blackhole_body() { atf_check -s exit:0 ${netserver} ${RUMP_SERVER} atf_check -s exit:0 -o ignore \ rump.route add 207.46.197.32 127.0.0.1 -reject atf_check -s exit:0 -o match:UGHR -x \ "rump.route -n show -inet | grep ^207.46" atf_check -s exit:0 -o ignore \ rump.route change 207.46.197.32 127.0.0.1 -blackhole atf_check -s exit:0 -o match:' UGHBS ' -e ignore -x \ "rump.netstat -rn -f inet | grep ^207.46" } route_change_reject2blackhole_cleanup() { env RUMP_SERVER=unix://commsock rump.halt } atf_test_case route_change_gateway cleanup route_change_gateway_head() { atf_set "descr" "Change the gateway of a route" atf_set "require.progs" "rump_server" } route_change_gateway_body() { 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 bus atf_check -s exit:0 rump.ifconfig shmif0 10.0.0.10/24 up atf_check -s exit:0 -o ignore \ rump.route add -net 192.168.0.0/24 10.0.0.1 atf_check -s exit:0 -o match:'10.0.0.1' -x \ "rump.route -n show -inet | grep ^192.168" atf_check -s exit:0 -o ignore \ rump.route change -net 192.168.0.0/24 10.0.0.254 atf_check -s exit:0 -o match:'10.0.0.254' -x \ "rump.route -n show -inet | grep ^192.168" } route_change_gateway_cleanup() { env RUMP_SERVER=unix://commsock rump.halt } atf_test_case route_change_ifa cleanup route_change_ifa_head() { atf_set "descr" "Change the ifa (local address) of a route" atf_set "require.progs" "rump_server" } route_change_ifa_body() { 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 bus atf_check -s exit:0 rump.ifconfig shmif0 10.0.0.10/24 atf_check -s exit:0 rump.ifconfig shmif0 alias 10.0.0.11/24 atf_check -s exit:0 rump.ifconfig shmif0 up atf_check -s exit:0 -o ignore \ rump.route add -net 192.168.0.0/24 10.0.0.1 atf_check -s exit:0 -o match:'10.0.0.1' -x \ "rump.route -n show -inet | grep ^192.168" $DEBUG && rump.route -n show -inet cat >./expect <<-EOF route to: 192.168.0.1 destination: 192.168.0.0 mask: 255.255.255.0 gateway: 10.0.0.1 local addr: 10.0.0.10 interface: shmif0 flags: recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire EOF rump.route -n get 192.168.0.1 > ./output $DEBUG && cat ./expect ./output sed -i '$d' ./output atf_check -s exit:0 diff ./expect ./output # Change the local address of the route atf_check -s exit:0 -o ignore \ rump.route change -net 192.168.0.0/24 10.0.0.1 -ifa 10.0.0.11 $DEBUG && rump.route -n show -inet cat >./expect <<-EOF route to: 192.168.0.1 destination: 192.168.0.0 mask: 255.255.255.0 gateway: 10.0.0.1 local addr: 10.0.0.11 interface: shmif0 flags: recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire EOF rump.route -n get 192.168.0.1 > ./output $DEBUG && cat ./expect ./output sed -i '$d' ./output atf_check -s exit:0 diff ./expect ./output } route_change_ifa_cleanup() { env RUMP_SERVER=unix://commsock rump.halt } atf_test_case route_change_ifp cleanup route_change_ifp_head() { atf_set "descr" "Change a route based on an interface (ifp)" atf_set "require.progs" "rump_server" } route_change_ifp_body() { 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 bus atf_check -s exit:0 rump.ifconfig shmif0 10.0.0.10/24 up atf_check -s exit:0 rump.ifconfig shmif1 create atf_check -s exit:0 rump.ifconfig shmif1 linkstr bus atf_check -s exit:0 rump.ifconfig shmif1 10.0.0.11/24 up atf_check -s exit:0 -o ignore \ rump.route add -net 192.168.0.0/24 10.0.0.1 atf_check -s exit:0 -o match:'10.0.0.1' -x \ "rump.route -n show -inet | grep ^192.168" $DEBUG && rump.route -n show -inet cat >./expect <<-EOF route to: 192.168.0.1 destination: 192.168.0.0 mask: 255.255.255.0 gateway: 10.0.0.1 local addr: 10.0.0.10 interface: shmif0 flags: recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire EOF rump.route -n get 192.168.0.1 > ./output $DEBUG && cat ./expect ./output sed -i '$d' ./output atf_check -s exit:0 diff ./expect ./output # Change a route based on an interface atf_check -s exit:0 -o ignore \ rump.route change -net 192.168.0.0/24 10.0.0.1 -ifp shmif1 $DEBUG && rump.route -n show -inet cat >./expect <<-EOF route to: 192.168.0.1 destination: 192.168.0.0 mask: 255.255.255.0 gateway: 10.0.0.1 local addr: 10.0.0.11 interface: shmif1 flags: recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire EOF rump.route -n get 192.168.0.1 > ./output $DEBUG && cat ./expect ./output sed -i '$d' ./output atf_check -s exit:0 diff ./expect ./output } route_change_ifp_cleanup() { env RUMP_SERVER=unix://commsock rump.halt } atf_test_case route_change_ifp_ifa cleanup route_change_ifp_head() { atf_set "descr" "Change a route with -ifp and -ifa" atf_set "require.progs" "rump_server" } route_change_ifp_ifa_body() { 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 bus atf_check -s exit:0 rump.ifconfig shmif0 10.0.0.10/24 up atf_check -s exit:0 rump.ifconfig shmif1 create atf_check -s exit:0 rump.ifconfig shmif1 linkstr bus atf_check -s exit:0 rump.ifconfig shmif1 10.0.0.11/24 up atf_check -s exit:0 -o ignore \ rump.route add -net 192.168.0.0/24 10.0.0.1 atf_check -s exit:0 -o match:'10.0.0.1' -x \ "rump.route -n show -inet | grep ^192.168" $DEBUG && rump.route -n show -inet cat >./expect <<-EOF route to: 192.168.0.1 destination: 192.168.0.0 mask: 255.255.255.0 gateway: 10.0.0.1 local addr: 10.0.0.10 interface: shmif0 flags: recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire EOF rump.route -n get 192.168.0.1 > ./output $DEBUG && cat ./expect ./output sed -i '$d' ./output atf_check -s exit:0 diff ./expect ./output # Change a route with -ifa and -ifp atf_check -s exit:0 -o ignore \ rump.route change -net 192.168.0.0/24 -ifa 10.0.0.1 -ifp shmif1 $DEBUG && rump.route -n show -inet cat >./expect <<-EOF route to: 192.168.0.1 destination: 192.168.0.0 mask: 255.255.255.0 gateway: 10.0.0.1 local addr: 10.0.0.11 interface: shmif1 flags: recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire EOF rump.route -n get 192.168.0.1 > ./output $DEBUG && cat ./expect ./output sed -i '$d' ./output atf_check -s exit:0 diff ./expect ./output } route_change_ifp_ifa_cleanup() { env RUMP_SERVER=unix://commsock rump.halt } atf_init_test_cases() { atf_add_test_case route_change_reject2blackhole atf_add_test_case route_change_gateway atf_add_test_case route_change_ifa atf_add_test_case route_change_ifp atf_add_test_case route_change_ifp_ifa } Index: stable/11/contrib/netbsd-tests/net/route/t_flags.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/route/t_flags.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/route/t_flags.sh (revision 313680) @@ -1,380 +1,334 @@ -# $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. # # 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. # -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 } 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 } 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 # Wait until DAD completes (10 sec at most) atf_check -s exit:0 -o ignore rump.ifconfig -w 10 atf_check -s not-exit:0 -x "rump.ifconfig shmif1 |grep -q tentative" $DEBUG && rump.ifconfig $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() { 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() { export RUMP_SERVER=$SOCK_LOCAL atf_check -s exit:0 -o ignore rump.route add default 10.0.0.1 $DEBUG && rump.netstat -rn -f inet # Up, Gateway, Static - check_entry_flags default UGS + check_route_flags default UGS } test_static() { export RUMP_SERVER=$SOCK_LOCAL # Static route to host atf_check -s exit:0 -o ignore rump.route add 10.0.1.1 10.0.0.1 $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() { export RUMP_SERVER=$SOCK_LOCAL atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 10.0.0.1 # Delete an existing route first atf_check -s exit:0 -o ignore rump.route delete -net 10.0.0.0/24 # Gateway must be lo0 atf_check -s exit:0 -o ignore \ rump.route add -net 10.0.0.0/24 127.0.0.1 -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() { export RUMP_SERVER=$SOCK_LOCAL # Delete an existing route first atf_check -s exit:0 -o ignore rump.route delete -net 10.0.0.0/24 atf_check -s exit:0 -o ignore rump.route add -net 10.0.0.0/24 10.0.0.1 -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) # Delete an existing route first atf_check -s exit:0 -o ignore rump.route delete -net 10.0.0.0/24 atf_check -s exit:0 -o ignore \ rump.route add -net 10.0.0.0/24 127.0.0.1 -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) # Delete an existing route first atf_check -s exit:0 -o ignore rump.route delete -net 10.0.0.0/24 atf_check -s exit:0 -o ignore \ rump.route add -host 10.0.0.1/24 127.0.0.1 -iface -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 $DEBUG && rump.netstat -rn -f inet return 0 } test_icmp_redirect() { ### Testing Dynamic flag ### # # Setup a gateway 10.0.0.254. 10.0.2.1 is behind it. # setup_gw # # Teach the peer that 10.0.2.* is behind 10.0.0.254 # 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 # 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 ### Testing Modified flag ### # # Teach a wrong route to 10.0.2.2 # 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() { export RUMP_SERVER=$SOCK_LOCAL # Delete an existing route first atf_check -s exit:0 -o ignore rump.route delete -net 10.0.0.0/24 atf_check -s exit:0 -o ignore rump.route add -net 10.0.0.0/24 10.0.0.1 -proxy $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 local desc="$2" atf_test_case "route_flags_${name}" cleanup eval "route_flags_${name}_head() { \ atf_set \"descr\" \"${desc}\"; \ atf_set \"require.progs\" \"rump_server\"; \ }; \ route_flags_${name}_body() { \ setup_local; \ setup_peer; \ test_${name}; \ + rump_server_destroy_ifaces; \ }; \ route_flags_${name}_cleanup() { \ + $DEBUG && dump; \ cleanup; \ }" atf_add_test_case "route_flags_${name}" } atf_init_test_cases() { add_test lo "Tests route flags: loop back interface" add_test connected "Tests route flags: connected route" add_test default_gateway "Tests route flags: default gateway" add_test static "Tests route flags: static route" add_test blackhole "Tests route flags: blackhole route" add_test reject "Tests route flags: reject route" add_test icmp_redirect "Tests route flags: icmp redirect" add_test announce "Tests route flags: announce flag" } Index: stable/11/contrib/netbsd-tests/net/route/t_flags6.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/route/t_flags6.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/route/t_flags6.sh (revision 313680) @@ -1,304 +1,268 @@ -# $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. # # 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. # -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 BUS=bus1 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 } 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() { 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() { export RUMP_SERVER=$SOCK_LOCAL atf_check -s exit:0 -o ignore rump.route add -inet6 default $IP6_PEER $DEBUG && rump.netstat -rn -f inet6 # Up, Gateway, Static - check_entry_flags default UGS + check_route_flags default UGS } test_static6() { export RUMP_SERVER=$SOCK_LOCAL # Static route to host atf_check -s exit:0 -o ignore \ rump.route add -inet6 fc00::1:1 $IP6_PEER $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 \ rump.route add -inet6 -net fc00::/24 $IP6_PEER $DEBUG && rump.netstat -rn -f inet6 # Up, Gateway, Static - check_entry_flags fc00::/24 UGS + check_route_flags fc00::/24 UGS } test_blackhole6() { export RUMP_SERVER=$SOCK_LOCAL atf_check -s exit:0 -o ignore rump.ping6 -n -X 1 -c 1 $IP6_PEER # Delete an existing route first atf_check -s exit:0 -o ignore \ rump.route delete -inet6 -net fc00::/64 # Gateway must be lo0 atf_check -s exit:0 -o ignore \ rump.route add -inet6 -net fc00::/64 ::1 -blackhole $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() { export RUMP_SERVER=$SOCK_LOCAL # Delete an existing route first atf_check -s exit:0 -o ignore \ rump.route delete -inet6 -net fc00::/64 atf_check -s exit:0 -o ignore \ rump.route add -inet6 -net fc00::/64 $IP6_PEER -reject $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) # Delete an existing route first atf_check -s exit:0 -o ignore \ rump.route delete -inet6 -net fc00::/64 atf_check -s exit:0 -o ignore \ rump.route add -inet6 -net fc00::/64 ::1 -reject $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) # Delete an existing route first atf_check -s exit:0 -o ignore \ rump.route delete -inet6 -net fc00::/64 atf_check -s exit:0 -o ignore \ rump.route add -inet6 -host fc00::/64 ::1 -iface -reject $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 $DEBUG && rump.netstat -rn -f inet6 return 0 } test_announce6() { export RUMP_SERVER=$SOCK_LOCAL # Delete an existing route first atf_check -s exit:0 -o ignore \ rump.route delete -inet6 -net fc00::/64 atf_check -s exit:0 -o ignore \ rump.route add -inet6 -net fc00::/64 $IP6_PEER -proxy $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 local desc="$2" atf_test_case "route_flags_${name}" cleanup eval "route_flags_${name}_head() { \ atf_set \"descr\" \"${desc}\"; \ atf_set \"require.progs\" \"rump_server\"; \ }; \ route_flags_${name}_body() { \ setup_local; \ setup_peer; \ test_${name}; \ + rump_server_destroy_ifaces; \ }; \ route_flags_${name}_cleanup() { \ + $DEBUG && dump; \ cleanup; \ }" atf_add_test_case "route_flags_${name}" } atf_init_test_cases() { add_test lo6 "Tests route flags: loop back interface" add_test connected6 "Tests route flags: connected route" add_test default_gateway6 "Tests route flags: default gateway" add_test static6 "Tests route flags: static route" add_test blackhole6 "Tests route flags: blackhole route" add_test reject6 "Tests route flags: reject route" add_test announce6 "Tests route flags: announce flag" } Index: stable/11/contrib/netbsd-tests/net/route/t_route.sh =================================================================== --- stable/11/contrib/netbsd-tests/net/route/t_route.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/net/route/t_route.sh (revision 313680) @@ -1,430 +1,406 @@ -# $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. # # 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. # -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 BUS=bus1 # command_get SOCKSRC=unix://commsock1 SOCKFWD=unix://commsock2 SOCKDST=unix://commsock3 IP4SRC=10.0.1.2 IP4SRCGW=10.0.1.1 IP4DSTGW=10.0.2.1 IP4DST=10.0.2.2 IP4DST_BCAST=10.0.2.255 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 -DEBUG=false +DEBUG=${DEBUG:-false} TIMEOUT=1 PING_OPTS="-n -c 1 -w $TIMEOUT" atf_test_case route_non_subnet_gateway cleanup route_non_subnet_gateway_head() { atf_set "descr" "tests of a gateway not on the local subnet" atf_set "require.progs" "rump_server" } 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 # The gateway knows the client atf_check -s exit:0 -o match:'add net 10.0.0.1: gateway shmif0' \ rump.route add -net 10.0.0.1/32 -link -cloning -iface shmif0 $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 # Don't know a route to the gateway yet atf_check -s not-exit:0 -o match:'100.0% packet loss' \ -e match:'No route to host' rump.ping $PING_OPTS 192.168.0.1 # Teach a route to the gateway atf_check -s exit:0 -o match:'add net 192.168.0.1: gateway shmif0' \ rump.route add -net 192.168.0.1/32 -link -cloning -iface shmif0 atf_check -s exit:0 -o match:'add net default: gateway 192.168.0.1' \ rump.route add default -ifa 10.0.0.1 192.168.0.1 $DEBUG && rump.netstat -nr -f inet # 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 atf_test_case route_command_get6 cleanup route_command_get_head() { atf_set "descr" "tests of route get command" atf_set "require.progs" "rump_server" } route_command_get6_head() { atf_set "descr" "tests of route get command (IPv6)" atf_set "require.progs" "rump_server" } setup_endpoint() { local sock=${1} local addr=${2} local bus=${3} local mode=${4} 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} else atf_check -s exit:0 rump.ifconfig shmif0 inet ${addr} netmask 0xffffff00 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 rump.netstat -nr fi } 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 + rump_server_add_iface $SOCKFWD shmif0 $BUS_SRCGW + rump_server_add_iface $SOCKFWD shmif1 $BUS_DSTGW - atf_check -s exit:0 rump.ifconfig shmif1 create - atf_check -s exit:0 rump.ifconfig shmif1 linkstr $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} else atf_check -s exit:0 rump.ifconfig shmif0 inet ${IP4SRCGW} netmask 0xffffff00 atf_check -s exit:0 rump.ifconfig shmif1 inet ${IP4DSTGW} netmask 0xffffff00 fi 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 if [ $mode = "ipv6" ]; then rump.sysctl net.inet6.ip6.forwarding else rump.sysctl net.inet.ip.forwarding fi fi } setup_forwarding() { export RUMP_SERVER=$SOCKFWD atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.forwarding=1 } setup_forwarding6() { export RUMP_SERVER=$SOCKFWD atf_check -s exit:0 -o ignore rump.sysctl -w net.inet6.ip6.forwarding=1 } 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 setup_forwarder ipv4 } 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 setup_forwarder ipv6 } test_route_get() { export RUMP_SERVER=$SOCKSRC $DEBUG && rump.netstat -nr -f inet $DEBUG && rump.arp -n -a # Make sure an ARP cache to the gateway doesn't exist rump.arp -d $IP4SRCGW # Local cat >./expect <<-EOF route to: 10.0.1.2 destination: 10.0.1.2 local addr: 10.0.1.2 interface: lo0 flags: recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire EOF rump.route -n get $IP4SRC > ./output $DEBUG && cat ./expect ./output # XXX: omit the last line because expire is unstable on rump kernel. sed -i '$d' ./output atf_check -s exit:0 diff ./expect ./output # Neighbor cat >./expect <<-EOF route to: 10.0.1.1 destination: 10.0.1.0 mask: 255.255.255.0 local addr: 10.0.1.2 interface: shmif0 flags: recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire EOF rump.route -n get $IP4SRCGW > ./output $DEBUG && cat ./expect ./output sed -i '$d' ./output atf_check -s exit:0 diff ./expect ./output # Remote host cat >./expect <<-EOF route to: 10.0.2.2 destination: default mask: default gateway: 10.0.1.1 local addr: 10.0.1.2 interface: shmif0 flags: recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire EOF rump.route -n get $IP4DST > ./output $DEBUG && cat ./expect ./output sed -i '$d' ./output atf_check -s exit:0 diff ./expect ./output # Create a ARP cache atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP4SRCGW # Neighbor with a cache (no different from w/o cache) cat >./expect <<-EOF route to: 10.0.1.1 destination: 10.0.1.0 mask: 255.255.255.0 local addr: 10.0.1.2 interface: shmif0 flags: recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire EOF rump.route -n get $IP4SRCGW > ./output $DEBUG && cat ./expect ./output sed -i '$d' ./output atf_check -s exit:0 diff ./expect ./output } test_route_get6() { export RUMP_SERVER=$SOCKSRC $DEBUG && rump.netstat -nr -f inet $DEBUG && rump.ndp -n -a # Make sure an ARP cache to the gateway doesn't exist rump.ndp -d $IP6SRCGW # Local cat >./expect <<-EOF route to: fc00:0:0:1::2 destination: fc00:0:0:1::2 local addr: fc00:0:0:1::2 interface: lo0 flags: recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire EOF rump.route -n get -inet6 $IP6SRC > ./output $DEBUG && cat ./expect ./output sed -i '$d' ./output atf_check -s exit:0 diff ./expect ./output # Neighbor cat >./expect <<-EOF route to: fc00:0:0:1::1 destination: fc00:0:0:1:: mask: ffff:ffff:ffff:ffff:: local addr: fc00:0:0:1::2 interface: shmif0 flags: recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire EOF rump.route -n get -inet6 $IP6SRCGW > ./output $DEBUG && cat ./expect ./output sed -i '$d' ./output atf_check -s exit:0 diff ./expect ./output # Remote host cat >./expect <<-EOF route to: fc00:0:0:2::2 destination: :: mask: default gateway: fc00:0:0:1::1 local addr: fc00:0:0:1::2 interface: shmif0 flags: recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire EOF rump.route -n get -inet6 $IP6DST > ./output $DEBUG && cat ./expect ./output sed -i '$d' ./output atf_check -s exit:0 diff ./expect ./output # Create a NDP cache atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6SRCGW # Neighbor with a cache (no different from w/o cache) cat >./expect <<-EOF route to: fc00:0:0:1::1 destination: fc00:0:0:1:: mask: ffff:ffff:ffff:ffff:: local addr: fc00:0:0:1::2 interface: shmif0 flags: recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire EOF rump.route -n get -inet6 $IP6SRCGW > ./output $DEBUG && cat ./expect ./output sed -i '$d' ./output atf_check -s exit:0 diff ./expect ./output } route_command_get_body() { setup setup_forwarding test_route_get + rump_server_destroy_ifaces } route_command_get6_body() { setup6 setup_forwarding6 test_route_get6 + rump_server_destroy_ifaces } -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 -} - route_command_get_cleanup() { + $DEBUG && dump cleanup } route_command_get6_cleanup() { - dump + + $DEBUG && dump cleanup } atf_init_test_cases() { atf_add_test_case route_non_subnet_gateway atf_add_test_case route_command_get atf_add_test_case route_command_get6 } Index: stable/11/contrib/netbsd-tests/rump/modautoload/t_modautoload.c =================================================================== --- stable/11/contrib/netbsd-tests/rump/modautoload/t_modautoload.c (revision 313679) +++ stable/11/contrib/netbsd-tests/rump/modautoload/t_modautoload.c (revision 313680) @@ -1,87 +1,88 @@ -/* $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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../../h_macros.h" ATF_TC(modautoload); ATF_TC_HEAD(modautoload, tc) { atf_tc_set_md_var(tc, "descr", "tests that kernel module " "autoload works in rump"); } static void mountkernfs(void) { bool old_autoload, new_autoload; size_t old_len, new_len; int error; if (!rump_nativeabi_p()) atf_tc_skip("host kernel modules not supported"); rump_init(); if (rump_sys_mkdir("/kern", 0777) == -1) 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, &new_autoload, new_len); if (error != 0) atf_tc_fail_errno("could not enable module autoload"); if (rump_sys_mount(MOUNT_KERNFS, "/kern", 0, NULL, 0) == -1) atf_tc_fail_errno("could not mount kernfs"); } /* * Why use kernfs here? It talks to plenty of other parts with the * kernel (e.g. vfs_attach() in modcmd), but is still easy to verify * it's working correctly. */ #define MAGICNUM 1323 ATF_TC_BODY(modautoload, tc) { extern int rumpns_hz; char buf[64]; int fd; mountkernfs(); rumpns_hz = MAGICNUM; if ((fd = rump_sys_open("/kern/hz", O_RDONLY)) == -1) atf_tc_fail_errno("open /kern/hz"); if (rump_sys_read(fd, buf, sizeof(buf)) <= 0) atf_tc_fail_errno("read"); ATF_REQUIRE(atoi(buf) == MAGICNUM); } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, modautoload); return atf_no_error(); } Index: stable/11/contrib/netbsd-tests/rump/rumpkern/t_lwproc.c =================================================================== --- stable/11/contrib/netbsd-tests/rump/rumpkern/t_lwproc.c (revision 313679) +++ stable/11/contrib/netbsd-tests/rump/rumpkern/t_lwproc.c (revision 313680) @@ -1,317 +1,318 @@ -/* $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. * 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 #include +#include #include #include #include #include #include #include #include #include #include #include #include #include "../../h_macros.h" ATF_TC(makelwp); ATF_TC_HEAD(makelwp, tc) { atf_tc_set_md_var(tc, "descr", "tests that lwps can be attached to " "processes"); } ATF_TC_BODY(makelwp, tc) { struct lwp *l; pid_t pid; rump_init(); RZ(rump_pub_lwproc_newlwp(0)); ATF_REQUIRE_EQ(rump_pub_lwproc_newlwp(37), ESRCH); l = rump_pub_lwproc_curlwp(); RZ(rump_pub_lwproc_rfork(RUMP_RFCFDG)); ATF_REQUIRE(rump_pub_lwproc_curlwp() != l); l = rump_pub_lwproc_curlwp(); RZ(rump_pub_lwproc_newlwp(rump_sys_getpid())); ATF_REQUIRE(rump_pub_lwproc_curlwp() != l); pid = rump_sys_getpid(); ATF_REQUIRE(pid != -1 && pid != 0); } ATF_TC(proccreds); ATF_TC_HEAD(proccreds, tc) { atf_tc_set_md_var(tc, "descr", "check that procs have different creds"); } ATF_TC_BODY(proccreds, tc) { struct lwp *l1, *l2; rump_init(); RZ(rump_pub_lwproc_rfork(RUMP_RFCFDG)); l1 = rump_pub_lwproc_curlwp(); RZ(rump_pub_lwproc_newlwp(rump_sys_getpid())); RZ(rump_pub_lwproc_rfork(RUMP_RFCFDG)); l2 = rump_pub_lwproc_curlwp(); RL(rump_sys_setuid(22)); ATF_REQUIRE_EQ(rump_sys_getuid(), 22); rump_pub_lwproc_switch(l1); ATF_REQUIRE_EQ(rump_sys_getuid(), 0); /* from parent, proc0 */ RL(rump_sys_setuid(11)); ATF_REQUIRE_EQ(rump_sys_getuid(), 11); rump_pub_lwproc_switch(l2); ATF_REQUIRE_EQ(rump_sys_getuid(), 22); rump_pub_lwproc_newlwp(rump_sys_getpid()); ATF_REQUIRE_EQ(rump_sys_getuid(), 22); } ATF_TC(inherit); ATF_TC_HEAD(inherit, tc) { atf_tc_set_md_var(tc, "descr", "new processes inherit creds from " "parents"); } ATF_TC_BODY(inherit, tc) { rump_init(); RZ(rump_pub_lwproc_rfork(RUMP_RFCFDG)); RL(rump_sys_setuid(66)); ATF_REQUIRE_EQ(rump_sys_getuid(), 66); RZ(rump_pub_lwproc_rfork(RUMP_RFCFDG)); ATF_REQUIRE_EQ(rump_sys_getuid(), 66); /* release lwp and proc */ rump_pub_lwproc_releaselwp(); ATF_REQUIRE_EQ(rump_sys_getuid(), 0); } ATF_TC(lwps); ATF_TC_HEAD(lwps, tc) { atf_tc_set_md_var(tc, "descr", "proc can hold many lwps and is " "automatically g/c'd when the last one exits"); } #define LOOPS 128 ATF_TC_BODY(lwps, tc) { struct lwp *l[LOOPS]; pid_t mypid; struct lwp *l_orig; int i; rump_init(); RZ(rump_pub_lwproc_rfork(RUMP_RFCFDG)); mypid = rump_sys_getpid(); RL(rump_sys_setuid(375)); l_orig = rump_pub_lwproc_curlwp(); for (i = 0; i < LOOPS; i++) { mypid = rump_sys_getpid(); ATF_REQUIRE(mypid != -1 && mypid != 0); RZ(rump_pub_lwproc_newlwp(mypid)); l[i] = rump_pub_lwproc_curlwp(); ATF_REQUIRE_EQ(rump_sys_getuid(), 375); } rump_pub_lwproc_switch(l_orig); rump_pub_lwproc_releaselwp(); for (i = 0; i < LOOPS; i++) { rump_pub_lwproc_switch(l[i]); ATF_REQUIRE_EQ(rump_sys_getpid(), mypid); ATF_REQUIRE_EQ(rump_sys_getuid(), 375); rump_pub_lwproc_releaselwp(); ATF_REQUIRE_EQ(rump_sys_getpid(), 1); ATF_REQUIRE_EQ(rump_sys_getuid(), 0); } ATF_REQUIRE_EQ(rump_pub_lwproc_newlwp(mypid), ESRCH); } ATF_TC(nolwprelease); ATF_TC_HEAD(nolwprelease, tc) { atf_tc_set_md_var(tc, "descr", "check that lwp context is required " "for lwproc_releaselwp()"); } ATF_TC_BODY(nolwprelease, tc) { int status; switch (fork()) { case 0: rump_init(); rump_pub_lwproc_releaselwp(); atf_tc_fail("survived"); break; case -1: atf_tc_fail_errno("fork"); break; default: wait(&status); ATF_REQUIRE(WIFSIGNALED(status)); ATF_REQUIRE_EQ(WTERMSIG(status), SIGABRT); } } ATF_TC(nolwp); ATF_TC_HEAD(nolwp, tc) { atf_tc_set_md_var(tc, "descr", "check that curlwp for an implicit " "context is NULL"); } ATF_TC_BODY(nolwp, tc) { rump_init(); ATF_REQUIRE_EQ(rump_pub_lwproc_curlwp(), NULL); } ATF_TC(nullswitch); ATF_TC_HEAD(nullswitch, tc) { atf_tc_set_md_var(tc, "descr", "check that switching to NULL marks " "current lwp as not running"); } ATF_TC_BODY(nullswitch, tc) { struct lwp *l; rump_init(); RZ(rump_pub_lwproc_newlwp(0)); l = rump_pub_lwproc_curlwp(); rump_pub_lwproc_switch(NULL); /* if remains LP_RUNNING, next call will panic */ rump_pub_lwproc_switch(l); } ATF_TC(rfork); ATF_TC_HEAD(rfork, tc) { atf_tc_set_md_var(tc, "descr", "check that fork shares fd's"); } ATF_TC_BODY(rfork, tc) { struct stat sb; struct lwp *l, *l2; int fd; RZ(rump_init()); ATF_REQUIRE_EQ(rump_pub_lwproc_rfork(RUMP_RFFDG|RUMP_RFCFDG), EINVAL); RZ(rump_pub_lwproc_rfork(0)); l = rump_pub_lwproc_curlwp(); RL(fd = rump_sys_open("/file", O_RDWR | O_CREAT, 0777)); /* ok, first check rfork(RUMP_RFCFDG) does *not* preserve fd's */ RZ(rump_pub_lwproc_rfork(RUMP_RFCFDG)); ATF_REQUIRE_ERRNO(EBADF, rump_sys_write(fd, &fd, sizeof(fd)) == -1); /* then check that rfork(0) does */ rump_pub_lwproc_switch(l); RZ(rump_pub_lwproc_rfork(0)); ATF_REQUIRE_EQ(rump_sys_write(fd, &fd, sizeof(fd)), sizeof(fd)); RL(rump_sys_fstat(fd, &sb)); l2 = rump_pub_lwproc_curlwp(); /* * check that the shared fd table is really shared by * closing fd in parent */ rump_pub_lwproc_switch(l); RL(rump_sys_close(fd)); rump_pub_lwproc_switch(l2); ATF_REQUIRE_ERRNO(EBADF, rump_sys_fstat(fd, &sb) == -1); /* redo, this time copying the fd table instead of sharing it */ rump_pub_lwproc_releaselwp(); rump_pub_lwproc_switch(l); RL(fd = rump_sys_open("/file", O_RDWR, 0777)); RZ(rump_pub_lwproc_rfork(RUMP_RFFDG)); ATF_REQUIRE_EQ(rump_sys_write(fd, &fd, sizeof(fd)), sizeof(fd)); RL(rump_sys_fstat(fd, &sb)); l2 = rump_pub_lwproc_curlwp(); /* check that the fd table is copied */ rump_pub_lwproc_switch(l); RL(rump_sys_close(fd)); rump_pub_lwproc_switch(l2); RL(rump_sys_fstat(fd, &sb)); ATF_REQUIRE_EQ(sb.st_size, sizeof(fd)); } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, makelwp); ATF_TP_ADD_TC(tp, proccreds); ATF_TP_ADD_TC(tp, inherit); ATF_TP_ADD_TC(tp, lwps); ATF_TP_ADD_TC(tp, nolwprelease); ATF_TP_ADD_TC(tp, nolwp); ATF_TP_ADD_TC(tp, nullswitch); ATF_TP_ADD_TC(tp, rfork); return atf_no_error(); } Index: stable/11/contrib/netbsd-tests/sys/net/t_print.c =================================================================== --- stable/11/contrib/netbsd-tests/sys/net/t_print.c (revision 313679) +++ stable/11/contrib/netbsd-tests/sys/net/t_print.c (revision 313680) @@ -1,172 +1,178 @@ -/* $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. * 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. */ #include -__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" #include static const struct { struct dl_addr ia; const char *str; int len; } tst[] = { { { .dl_type = 6, .dl_nlen = 0, .dl_alen = 6, .dl_slen = 0, .dl_data = { (char)0x01, (char)0xa2, (char)0x03, (char)0xc4, (char)0x05, (char)0xf6, }, }, "/6#01:a2:03:c4:05:f6", 20, }, { { .dl_type = 24, .dl_nlen = 3, .dl_alen = 6, .dl_slen = 0, .dl_data = { 'l', 'o', '0', (char)0x11, (char)0x22, (char)0x33, (char)0x44, (char)0x55, (char)0x66, }, }, "lo0/24#11:22:33:44:55:66", 24, }, { { .dl_type = 24, .dl_nlen = 7, .dl_alen = 1, .dl_slen = 0, .dl_data = { 'n', 'p', 'f', 'l', 'o', 'g', '0', (char)0xa5, }, }, "npflog0/24#a5", 13, }, { { .dl_type = 0, .dl_nlen = 0, .dl_alen = 0, .dl_slen = 0, .dl_data = { '\0' }, }, "/0#", 3, }, }; ATF_TC(dl_print); ATF_TC_HEAD(dl_print, tc) { atf_tc_set_md_var(tc, "descr", "printing of link address"); } ATF_TC_BODY(dl_print, tc) { char buf[LINK_ADDRSTRLEN]; int r; size_t l = sizeof(buf); for (size_t i = 0; i < __arraycount(tst); i++) { r = dl_print(buf, l, &tst[i].ia); ATF_REQUIRE_STREQ(buf, tst[i].str); ATF_REQUIRE_EQ(r, tst[i].len); } l = 4; for (size_t i = 0; i < __arraycount(tst); i++) { r = dl_print(buf, l, &tst[i].ia); ATF_CHECK(strncmp(buf, tst[i].str, l - 1) == 0); if (r > (int)l) ATF_REQUIRE_EQ(buf[l - 1], '\0'); ATF_REQUIRE_EQ(r, tst[i].len); } } ATF_TC(sdl_print); ATF_TC_HEAD(sdl_print, tc) { atf_tc_set_md_var(tc, "descr", "printing of sockaddr_dl"); } ATF_TC_BODY(sdl_print, tc) { char buf[1024]; char res[1024]; int r, e; size_t l = sizeof(buf); struct sockaddr_dl sdl; memset(&sdl, 0, sizeof(sdl)); for (size_t i = 0; i < __arraycount(tst); i++) { 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); } l = 8; for (size_t i = 0; i < __arraycount(tst); i++) { 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); } } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, dl_print); ATF_TP_ADD_TC(tp, sdl_print); return atf_no_error(); } Index: stable/11/contrib/netbsd-tests/usr.bin/config/t_config.sh =================================================================== --- stable/11/contrib/netbsd-tests/usr.bin/config/t_config.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/usr.bin/config/t_config.sh (revision 313680) @@ -1,260 +1,278 @@ -# $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. # # 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. # +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 if [ -n "$config_str" ]; then config="d_${name}" printf "$config_str" >"${config}" else - config="$(atf_get_srcdir)/d_${name}" + config="${srcdir}/d_${name}" fi } run_and_check_pass() { local name="${1}"; shift run_and_check_prep "${name}" atf_check -o ignore -s eq:0 \ config -s "${supportdir}" -b "compile/${name}" "${config}" } run_and_check_warn() { local name="${1}"; shift run_and_check_prep "${name}" local stderr eval stderr=\$${name}_stderr atf_check -o ignore -e "${stderr}" -s eq:0 \ config -s "${supportdir}" -b "compile/${name}" "${config}" } run_and_check_fail() { local name="${1}"; shift run_and_check_prep "${name}" atf_check -o ignore -e ignore -s ne:0 \ config -s "${supportdir}" -b "compile/${name}" "${config}" } test_output() { local name="${1}"; shift local res=1 run_and_check_prep "${name}" config -s "${supportdir}" -b compile/"${name}" "${config}" >/dev/null && cd compile/"${name}" && check_${name} && cd $OLDPWD && res=0 atf_check test $res -eq 0 } # Defines a test case for config(1). test_case() { local name="${1}"; shift local type="${1}"; shift local descr="${*}" atf_test_case "${name}" eval "${name}_head() { \ atf_set descr \"${descr}\"; \ atf_set require.progs \"config\"; \ }" eval "${name}_body() { \ run_and_check_${type} '${name}'; \ }" } test_case shadow_instance pass "Checks correct handling of shadowed instances" test_case loop pass "Checks correct handling of loops" test_case loop2 pass "Checks correct handling of devices that can be their" \ "own parents" test_case pseudo_parent pass "Checks correct handling of children of pseudo" \ "devices (PR/32329)" test_case postponed_orphan fail "Checks that config catches adding an" \ "instance of a child of a negated instance as error" test_case no_pseudo fail "Checks that config catches ommited 'pseudo-device'" \ "as error (PR/34111)" 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 grep -q '^ a\.c ' $f && grep -q '^ b\.c ' $f && grep -q '^ c\.c ' $f && : } select_body() { test_output select } # 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 : >tmp grep -q '^a\.o:' $f >>tmp grep -q '^b\.o:' $f >>tmp grep -q '^c\.o:' $f >>tmp [ ! -s tmp ] && : } no_select_body() { test_output no_select } # 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 sed -ne '/^struct cfdriver \* const cfdriver_list_initial\[\]/,/^};/p' $f >tmp.cfdriver sed -ne '/^struct cfdata cfdata\[\]/,/^};/p' $f >tmp.cfdata grep -q '^CFDRIVER_DECL(d, ' $f && grep -q '&d_cd,' tmp.cfdriver && grep -q '^extern struct cfattach d_ca;$' $f && grep -q '^static const struct cfiattrdata \* const d_attrs\[\]' $f && grep -q '^static const struct cfiattrdata icf_iattrdata' $f && grep -q '{ "d",' tmp.cfdata && : } devi_body() { test_output devi } # Check minimal kernel config(1) output test_case min pass "Minimal config" check_min_files() { test -e Makefile && test -e config_file.h && test -e config_time.src && test -e ioconf.c && test -e ioconf.h && test -e locators.h && test -e swapregress.c && test -h machine && test -h regress && : } check_min_makefile() { local f=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 ] && : } check_min() { check_min_files && check_min_makefile && : } min_body() { test_output min } atf_init_test_cases() { atf_add_test_case shadow_instance atf_add_test_case loop atf_add_test_case loop2 atf_add_test_case pseudo_parent atf_add_test_case postponed_orphan atf_add_test_case no_pseudo atf_add_test_case deffs_redef atf_add_test_case undefined_opt atf_add_test_case no_undefined_opt atf_add_test_case select atf_add_test_case no_select atf_add_test_case devi atf_add_test_case min } Index: stable/11/contrib/netbsd-tests/usr.bin/netpgpverify/t_netpgpverify.sh =================================================================== --- stable/11/contrib/netbsd-tests/usr.bin/netpgpverify/t_netpgpverify.sh (revision 313679) +++ stable/11/contrib/netbsd-tests/usr.bin/netpgpverify/t_netpgpverify.sh (revision 313680) @@ -1,7441 +1,7427 @@ #! /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. # All rights reserved. # # This code is derived from software contributed to The NetBSD Foundation # by Alistair Crooks (agc@NetBSD.org) # # 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 test sets with atf_test_case # There may well be only one test set - these are tests for different # functionality, so netpgpverify has 2 sets, 1 for RSA and 1 for DSA # each test set has a # + *_head() function, to define the set, and # + *_body(), to set up the supporting input and expected output files # and some atf_check calls, which actually carry out the tests # any binary files should be uuencoded # we need to give the input and expected output files like this as tests # take place in a clean directory, so we need to be able to set them up # from the shell script # Test set 1 (rsa_signatures) for netpgpverify atf_test_case netpgpverify_testset_1_rsa_signatures netpgpverify_testset_1_rsa_signatures_head() { atf_set "descr" "Test set 1 (rsa_signatures) for netpgpverify" } netpgpverify_testset_1_rsa_signatures_body() { uudecode << EOF begin-base64 644 a.gpg owGbwMvMwMQonXHnz4HIDGXGNduSGBPD/Rq2KSuo+KWWOAW7WCn4JmanpmXmpOqU KRjqGSoYGRga6Rsa6hsZKBiYW5maWpmaKCSmJyu4VhQoqHBx6WXmJeeUpqQq2CQV p+jll+fp5WbbcXGFuAaHBLt4BtkqqFSD2U6Owa61+qXFRXpJmXn6eaklBekFZalF mWmVUMXxwR7atgol8ahSqMaXpBaXgM3vZJRhYWBkYmBjZQK5noGLUwDmp2X32f/X n4pynyaz+0jbeluli8/NgkI2bK65Ud+ecUelqkvNaXlNVo3TKyX9TuNUpmX3l7l2 t2xy4e8veH8/OpurgK9V4EXAB98rbddTgtpzTxhuWH5x0Qf3O0xOzL5MR5SfLH7/ zJMl72uqUExspt5UJuXIEw+LTj2JKfA7Mcl219+lKebOVlfqpA20HzSeXmaatynY NrX2BWfpS++vxxJiWL/wtLvzSVk/uZVunlXBsfDV/rbUxFDGPdMuNT/98f6cQ1Fz /+nLOY84rsk7K/NnulZuvNzb9jw3Qv58qPvep1saRDy6XhcUxhwOmZvh1DvLz/HG HNZMdVcl/iahoFURvHryU72zzz5eKXgoSc0SAA== ==== EOF uudecode << EOF begin-base64 644 b.gpg xA0DAAgBG2jc/MBZaCMBy4tiAAAAAABQUk9HPXAKU1JDUz1wYXJzZS5jCldBUk5T PTUKTUtNQU49bm8KQ1BQRkxBR1MrPS1nIC1PMApMREZMQUdTKz0tZyAtTzAKCi5p bmNsdWRlIDxic2QucHJvZy5taz4KCnQ6ICR7UFJPR30KCS4vJHtQUk9HfSBncGdz aWduZWQtYS5ncGcKwsBiBAABCAAWBQJQTZOaBQMAAAAACRAbaNz8wFloIwAABTcH /RhxktWLH3Cw6YkC/4Wcm9yq6flgiKQsB0VUaVgmmOfWnLxcowyH5ISENo/J6qhT S8Z0B2lAkRzBhXbfSe8GoESc/NsXTuOIvdjZEy7FBkl9Lumuqp1IlmoXh3RgPv5Z gcJ+uDCV958uXAxLn017xN/CVKi5yBiNWWk/mOJuI8FCiQCyFVQ3dOXcFU/gf4iZ YkH6OMX6eNpLQXp+s1ar6ZqpFE09QEoiFuIiDas+V6g0IG1c+PgP+TOlO5ztaKjx XxejP0Thtft0T+AKTANVrtx+aTseVt4CR3jBt0n4CJjTTRQwnIYxGML3ddgMXSPT 0c4J/4dwyMqdDuhby//52Nw= ==== EOF uudecode << EOF begin-base64 644 det VG8gRG8KPT09PT0KdGVzdHMgd2l0aCAtayBzaWcKZGV0YWNoZWQgc2lncwpEU0EK CkRvbmUKPT09PQpiYXNpY3MKbG9jYWxpc2UgcGdwX3JlYWRfcGFja2V0cwpmaXgg bGludApXQVJOUz01CmxpYiBtYW4gcGFnZQpwcm9nIG1hbiBwYWdlCmRvIHdlIGRv IGl0IHN0YXRpY2FsbHkgbGlua2VkIGFzIHdlbGw/Cm11bHRpcGxlIGZpbGVzIGlu IG5ldHBncHZlcmlmeQo= ==== EOF uudecode << EOF begin-base64 644 det.sig iQEcBAABAgAGBQJQf8gBAAoJEBto3PzAWWgjbLoH/i9MZSv2l9lJ5O+bfGmRSUxe rGeAM0dq//xi+AABByDEWNYORq2I6CO6k2eVPv7YbNE2Whn7qXA6U7LotM7Lt61l MCLRhuTv9RViV1qzsy+Z8VAQmhERAcG/qA5JSQbzjuVYhg5FexpiVmxgG9L8Z/Oj 4pU9zIId1vH7CvAcy/mfSyM8Ih8bmsrgs9b1wzMPLQKl0v0jtcrEcnwMtscXa9Mw X66bHxCHtRyGcWsHU8Ab2fJCvsCbBBMtg3JjZ7+VgDoZqPqBgIkhmppqC05vU5QR leNo8g9OwiJ6fMtdwTMsFkxqjjVKk5//X/6jQd/mf55XcxLOw4UK4ev5ADExnOU= ==== EOF uudecode << EOF begin-base64 644 jj.asc LS0tLS1CRUdJTiBQR1AgU0lHTkVEIE1FU1NBR0UtLS0tLQpIYXNoOiBTSEExCgox LiB0YWcgJiAweDNmCjIuIGxlbgoKb25lIHBhc3MgKHRhZyA0KQo9PT09PT09PQpi IHZlcnNpb246MwpiIHNpZyB0eXBlCmIgaGFzaCBhbGcKYiBwdWJrZXkgYWxnCjhi IGtleWlkCgpsaXRlcmFsIGRhdGEgKHRhZyAxMSkKPT09PT09PT09PT09PQpiIGJp bmFyeS90ZXh0CmIgbGVuZ3RoCmMgc3RyaW5nCkwgbXRpbWUKdGV4dAotLS0tLUJF R0lOIFBHUCBTSUdOQVRVUkUtLS0tLQpWZXJzaW9uOiBHbnVQRyB2MS40LjExIChO ZXRCU0QpCgppUUVjQkFFQkFnQUdCUUpRYUlaY0FBb0pFQnRvM1B6QVdXZ2o2NzhJ QUxiREhvbjNSbTZxVWhuN2sxVEZUNkQzCnlpL2p6ZjNwaVNKR3NnVWcyd0VnaHMx NzVlZEMvY0pLM2xHOUd4LzMvdVFxMDZSOWczN25WUlg4STBzSzd5VDIKWGdSK1JI b0doL2IrQ1F4ZFJOQyt1YjVRb05iOExjbUNiL01RR3EyS0s5b3RTRXhpeTRXTVVQ NEsxRGJsYUs1TAorSGc0VlRvb01vdDFOVnF5RlNvQjJhWmF1WGMyRjRaVmg1cTBm bjh3NUdFdzQ1UCtBVVVibXpwZ2JMd1hibCtJCnRNc1g1NFYxZHh5RGNDWVVzMHhV SC9WeEpVUUVlSWxEYkNPWFlNYkNWdGdnWVJxS2tzVHIrdS9yaXcvTGxucWwKalFk cTVyQlJXMVNsRDdMbDZ6L0xGMldCSk9XdEh6cDRxYm5CR1NxNXVCMXEzN0gzbVdM MjhmMXRMLy9UVWpNPQo9RVg4VwotLS0tLUVORCBQR1AgU0lHTkFUVVJFLS0tLS0K ==== EOF uudecode << EOF begin-base64 644 pubring.gpg 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 StZtC+VbuN66pfHwsAIAAw== ==== EOF uudecode << EOF begin-base64 644 NetBSD-6.0_hashes.asc.gz -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 7+a8GrRvT8y+NV0y05PKDtohZzp9m5D9rg1cckvZJY5LMft2WaihXF2bzlBlHugl YEA9kx+QsTNf4nEnbOPUWVSboNtsq8q1IOZMjW/kiqImSoCkLxd53El+Nmur2AB1 jZKwAepIySQOmU7tQRSoGEv5R9+x82bjUGC35E+SFEN9iqwnqXUnKcVSBIMG/fWH /FygpuUqlXi1IJ0NCU3qbGVtdqbma6+emJzeRl/SPdTHr8Sdj/xQapAmMkQjy/Jv S+P9Co+7va4+TKopT/qb0JUJrhaHM6w1ffT2l8J2nh2nOASIipcaDuhEp+8yjKmh Q+kXkNfooNpdxP2vB9PBGBBBKldzMsztZL8K+LFsNXlmGTn+Rmm/qm9LgGNn5zqc VKm1yaahsf2KPqvbIm/m7WUOmA4Xm+3gVp4kY60hketTuRfuhRl59pu5yt5ePTTk MSnydhbgBC84WHmeg6h4MRBNacD3WC8dd52vHDXbLIZldO4rmZYuoSfNBPjQxpvf 5D7o7dtfDZGKl6hApCCXYZKLsJWsdqOUlpSw1Pe48nvl7uqdglXrsgY51DciMZOt 79LyXnWOFAVtypJDpCAmfbWJUzZU3QuhHkELmkbhGjFIQVqnPGaxSxNoG9QDmbfk Yyk8SD/QkkBDrQ7q1aq2eno7sJd/gb7AVN4WuBioRVKRXW3jbxu5aKuPaklp5o0o X70NmUuqM7I6y5BZ9RfGo9FI2xiKdDHkv4zf/emnNvVB0P1gw9PHxiV7mOCMrN2K mspjYA8kNppkMIxMfXtPl4N97x57QSpi1sJiM9g98j4Oe0FThu28HIkjNe2M5qiH IFGgIaiVramjA+iTA2ys4wMe+F49H/rmp0weNCIBBVIb/YRB+g2eWmnyV6rR/KQ4 Lof5zrOLBIMdNaui2JI6rKycZKPT1TbVZ5c5cb0W4Hs32ACHbKWK0Z2XZrIcmePU OTNIeD8c2uNEbVCVbACsWqdeKKqS5G1YlXVI0wKQZnmf+RNRfVLlt9NbLRDCyH+u FKVGSMH2W9Zx00CXO78LuONLLfOAp1MWVAHYJEdhECiAMYQIi6QcR3k8UOFV4Trl 0hSXXFe/BQBeHzqprNIZErT17hMBfdJ7kZxOFsCIec24hCi6yLiRJAjZI0obvjwa y6eviGPU4pM+IXlJrLJ6F7tnZsm3hnk9jHP9rx/H+rtf/vJltT+DjtuXF5ObDo1r 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 0wMJQoVl5KtG+jmEtYZTF5om2G0rmWTNX8Cjdss7talTGnhKFc680KV362patZN1 aozqFIM+s8HUJVLVzVg6VafFRSFbJ5f5TpEeliXnt+jzJIHsKWg/ddE3BPSCPS6f TT+zvLc/X8AHfkUsH8rQVT0NcgeT1KL6zE8t612JMYEqKJFg0CDUSrgFuBah99Ti akYnhc52Fi7fSW5EyeE3a7emJWIzyxLyjTc+bQ7TSiF9JXMQmAyvmGk4YlVd8IKm MqcrUms1VRJHfF4ysRTgkqlSN7Qwd7J/lPURGEu5Tj5fUPdIEvDlbJq+k/JQO2Mf ATxOwQK/UzBTlxOf4odYYmNJ2uLMst6J0BO08L6lbgJQmrxvS45BnRmtxJP191aj Qpq2UwPbLi4ytNTpIcxBbgQzSXa27mJqOrmqt09IrqSVdVU1IDNsIW+TlJkEbNmv EhtcxpekkYEmxfshK1WlWJmZmZkEJjsJmDRN3TPsEecj5DfLxF7XH9KDV4mJRd6J hCV13E4HuNUM0LlFvVUICVEj97mGmfm01k5plvq1s/dD6fJAQbGdWdObH89bni60 SakCuvH3vl1LApSapWjufN19Pxx/o1lS1/TbSs0ss5m82vnKTKVZMjFVXmcDfu9n Cu/js8i/7N6kQzjXcmxLHfY8QAL6xWkKahurVqxDRQAQAGSmzkmFRYbcuh4iwywL 7PBZqjVqlYAa6pxd0sEmWHB2CSU0D23RwvdWm9NQOWERnqm8j9+BUMrRSMc7q+t5 HVrxJqrZPVVLgum8tWTn6dL7+CAYJOwAhJ4O54ABlCR1GL2cOpdrzyy97sbeDVWO uYY6dWeQImSbFAgRaGz21cGRFkwzfH5u3W8eJOJO5bWaFGfRk4uirNR9SVUGQYvE rrfUNOk9DI1Gjq45SMg+RSmSdIBQeQ0AFNwoTBlhut5iqBr6droSBbcpS2vzmdza YaqsW+8+Wn9u0W++gOaqbF/eSSc+O7XWiJJLV5P4XVSQnXS1/MSK3zzlWFV5zDqX pY5Rm3QNOrEbcvYxP7vT4/sT1iFhDWIvmxQ1HHA7Hae8NXW1WgZ5qYOLn9/pH88a Kbuc2Lmma+AMjN1gbm2s4NuCwanGysTGaIqYWt6lokrGlGjZJgMcLbudV0IO306j TIH9Wy2psIFsAWyGmDkc9pyRTTbhO60EQqofbabnd/rHd5jVDuCuU8uI7Ol2jVI/ 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 n9qZN0e0Zw1COdbDznlpgx2iCY8iPb7CEgQS7Gn2bKzJ9eQ+fffzkvVCrmS1zO+K k7TsRgQ0QrrZE2pN9lOiuEbbb3drYJ4anT16GMHeRlO0OcvmIOsQsuUl3yEv1W9W iSnA3Nx2ED394pY5Ja7dS9Xd0Hxy1777O6RJ6vTBUN2hu+IxlY/Zt1LGAVmv3Kg3 5pk9/O6HtbGV5uDms2jmvQQSdM8b9CEEG59P0m9+jCQszDzsUd3KslKR8QX0HAhb SmOT7eSz/0yyfit5GdeWGskXYRA35GJOMkybvCwaAyiF/Ghkx1KLNYIgcd2UNWcm LwWncffkilRMDg/6Mcmj0kawlBexf5CbH5sVQwLsRW3Wfqcipy9ZyH4iab/ROAXi GXVZyh4UomIdZV/oXoN6kj8nPFDN/XTyfhOSrkoMEImVFLAymFRqJaIY8i0Ln939 L+jXFEuWdIe2UymbjJoDXDLKsYa8KwRLYu2f3/WvE5KQGqA2YKlLRczuro08BMsW FFYyN7IdM5LPAWRKwLkIwGoaeMaqGdUOsyxdnVFGd+ekclkjhWFs8BU4GWpQNyc7 cPlp94iSebFBOOxH7PZX0z8rc5haNPS1WXTQg8p3yzqo8Vl2q2629tld/iqjStkv QSJARfRAh52yqoFDhkLyfSrUL5c258XkYOtbU6V1bY0teZKh2TBQjQu4vrrMl9mP T4b77mfBdWT4M9REwC7U1XbWYImaXF3tptt1DLvFqAOmaLzsACStEHJW/x6czNsh UVOzjnlutj0obWtogAKfsttJhUCtH5mgtFLqLvyV4pPuc54M+d3fUKXydHhPdNlK zMO4VOO4LmbwogCIkzzeM2G/+0FDp9uGlVsWYKU0Q2gAN8MAttgPnwr9a6KV5Pqe 3eRC5cxk1waTzlLdKLXKUrAoDX8u5C8H/dVPHYsXNmSvis+2Ms7SqJvrQJSiTxlt 52WOLXx8H4n37JqHBZyanVueWUJsTgMMJHBgfZ7S6Za1bqhaJ6uD3ARmB/9tNMMv LRRfPhfqlxDX6ozsjGWaJZ19eC5ZSPOD5Crpunve/7afCPGrhWEkdbmiYwGdTgdJ Ym+1rrF4x3ofvr2dyCPd6ZBbttB56EbTJQvHiQqmccbJ+ZaN/RFCe/tIDUU2W52P /VDnshXW4QuMTZ65PCyMFUtJ4VD66EGiTlS7HfKQaEUzltQ9t+5q7ARBqo9hUF4l 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 o1ISAXvyPwSuQhB71vALtYh4sYZknKJx49qW/CAmEdkaiw/xJCg/XtUN2WXLvpz8 tyqIlNwhRRNj3K46lymZxdG+jMqP50E7d6omJEqsrdBOyVztIJMqO/9/5t6tx7Yk OdL7R6O4X171KggDSBhAb0RcBw2J7AKbwHD+vT5bJ7MrV56duSOzzgCHZLOq67L2 3ssj3M0i3M2s++Cg6l//9sc/vtSrtkwTM3Qyk6AGQ+aMWiFFRLXou1pMamkfxeyr n2fZCtKCy7oWrxoZIH5d22OrM6LHLbNldhokyjUoysV+qNVr1wjVt45tCBU3BF4S jUFmKlOKv5RPCP8lUalm0wmwBEBkzWiQZbI0l6P9kJV99XcoxNEngr7rJXftdHNl NlVWHcPsyi4lafsw2l8O0iyiFU4tWK4V+cP2JMCutgTf3FeXwr1rdfJ+glPCLH5m zV/olkui+2woGRQNnVOM/fUlcP8cE6d6rQFMQhyztySti8v6RDPj3Wd2MYQRFGLm VJOXTu63fOs0WeY1FN5tzLwM6Hoi3Q+1xJCotRrUXNM04TcmHFllFFbQdtM8q+yd R/166N/JWkmyNy19ZBu6RQ6XI42Am1U+F131fc4vhvydqlXXGQ1fswQTryZSiLCT IryRUlT77q5/nbSEMjRe9ZyS48qAD11l1ibFgB78AGHM6Pb3d/sLFQYuOskoOFA3 u9LIlBNaFwC2/BjZGqQIOpe7xLDXQJ2TAab8EsnGidUIHU8D7JkoZFs3hH56WeQ6 L0kWSbX7rK4o4APpSX1aUqwrXtPr+/u7/JVxU1hWUmtIANUak9jtQAOeGSflSB6O VKH0zd39KpOm06VcItzEF5lCtxVlGNuMDp/z81A/8PVRCmczgeF94FuyoeWzNrr0 G6FdQiNtf0wlPn8673ZDvJsV/CXVkcsBH7rDbbDlbeTpQArsgc/LItFAPPaLug67 JlhBBJr69l3zieRyNnYXopWDh24QG5gQ2OGCTAZ03HhdtO0AyJGPgD0J64MWUk3i sqs0dkSloeZc7tbqJJAQXQtBLm9xPw3mI2G0qU7ZoTGvreEgp3bnMrwm1ZwphyH8 hU2knz37d+0i/ew7/6U20s8e/L0+0p+f+AsbST99+O/aSfr5G/krraSfPvl7vaQ/ PfJhl11X58rmlbbRt9zbqmwRdRI/pbCpsaVVPu57OvoQyohOV7rEXoRuqSYuFXXS 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 1nHtzHKb70T4633HbLJ0ppDkbIGgPoEDxZ50k1Bsfye8//yP/+kf/4v/Nginog9m 0EbuVRbNvuqeIyzPHtaZBRUy5fhekE8fJfe2bSQElczwIC5wY3ckJtlshwUhHc0V 6dixqqqkB03uzdpOuSp16zjYs1iCISPbEs1iJ2mgNxaygRW7D+WQpJfeURNJlaKT teyFzVbo74X69BOWDqel4WZj8i2RnsZh9dS9BfBuJ01RlYw3An76HL2l5rxvRleH uqYHo+RQu+6j4Mnvhf2f/nv4p7/7tUNE1kawvVo7gIoSNuAB0jCAiQ+d0MnVJb0b 9puPgkcKtkhuIAcdkxAK0OrWnMjoY5ETy2pqsJONyMhNfguHsOXSob/MKrSbvXPh uD5coU+pvrajLZxUkewxbX+g29UKPGOyFX2lQq+VzLthv/kJMRXJSHRxlwywWyCv 47oidguz9TY1D+mcb4X95nMyK7noaESKmuqy7pI1A07lxNv41A3j/gf81//5T//w j18fDB2AeYriiHeyp5qOEyW+oOlgUmrr5pvi/Avhvv0Iy0bQyRUwF8rbu5WqvwCd /BIPsdd9EH/pKFvHRzqZ29SSi5WrSWyHCxq5SM25OS6Ac5yasxQHTw3cJg2jCES3 JQ8y6xS/tFFiakZ3nK+F+farS6dBLbGFfNLlrZx1YJtWYxmyE0qXwW6Z6ZXw3j4f 2laUrCWrs2WIO5p0nyOPXG0V+1JY/9v//E//4+///j//519vLFgYvKWkQ6plvJfd JXxd4gHZ7hbVQEDpfDGyHz7FfvEOS5qRmmxVAFklWoQXGt+XIpUkFT+tukrc1vWJ Lor3MaEaR9vgnjyDhC7VEwZzXxp7Am57ie0VFgD/XtrkVM1ueV6/Y4FIMko9fy8G 98O37+QIvq92LCSlSe9vFl7SlPI26FqOVeCa/Ep8P3yEJM2dm8blEPhxuoANZGrZ HVPKSnsrxP/8P/7+//kWgCI/vuGmVXsx5MPqzYUGxhfnz8doNlvlzTDffFIiD1MX dGs657JykipqqZ1xQ4hSLUkld0JsReODJrShJk7uhXX7YKTRA7rdzslDIEsWiARe mpFPNxyPPwNvWP4BG3jKIQ+u3NUj2ADlY70Z6ptfsFvXKSN7YpbSJC4qffgaHWsP yt+0usZ8DXd/8jFy92MJFXErCalQOouASUkCOp/6Ddw+/w8d3Hr04B9ycOvRF35/ cOvRU98Y3Pr94/6owa2HT/4hB7cev4u3B7cePvaNwa3fPe800wBr/tXTi4erTX7z +qK05K231M8yKQ9S9RjKfmtfi96dDwlQFO83IDEDUAefQRAgp6DsAODmn7AOWSO+ DxnmkMy7RmU2gNhKOlInat2lKUVLsgock/dc1NMEOAb/soyXDj0slIg/TrBRgNOS lIyVFOa1QN758g76mjckbe1KkVwaeS3UAKMWqRKyfBEypeBCTO+9nqrj52zVwljM ck4aLH1KK3D22N2V8J4a+Mjw2YopS9XNkiylI9u7VC3BL0Gdg9n5dS2mp364QJpU lzq46v+n7l17dVmyq8x/5I775SMI00K01Qhjia9xbRkwbrnoBv4948m91t5vrr0u 8S6OpSoLqk6ds09mvjkz5hwjYs4xSvHB63sBSStJ4kElFFNcuxSG12yhInePFIRj vIQjGv2vprTazR4mXT7F7NIo+0xFftSBg0h1DptkLEwmrQiME3TUxPIaZ4G8yaLj 1K1VKFCLQH4uMG5Eqwpt+yJMlIAva+Bvl+11M5/ShFy9KaFNzLf0pNWgfJTmScju ZjA7YNXX8BGMdXrGCCYS0aMpVlroFV/mchaym0poEXXG2Fgp8xIbUZLWAwvo6XI2 Ij4S/RC+HwxxddzhSlJtWaEtQds1oZpB7NtbulacCNIuzSZRcZz92N53+3IDNAkd V2UmE0UkJpbr64OT+k+fWGR/DIQNkIdaQHk9tOnJDDNsYoM8qXBPexCy22VJzvo/ vL2x4sprFxTfQkTivx6F7NEcR5GxAmqi6N0pL9MOKUSoN21RvsFfknR2GLHHmQrx Io7MsuCm4KEIasQbUYiqVV1UKfDSGl5KdG5gbJm2MqpWNR6CjMyIiO9C60lfmzEd 8i5uYmth/IuZw3Baj7Fn/cMclCL1tx2tAAr/CmcBe3hgX3Fs0h3BIn4zuj+iHsZn KxjrmIewPc51EK/HEeBq6tWVrtLZJrv+bOYrbHEb4SpzEq437mUObVnBHKvCYLvI csTgPmyUnJkI4GDK17OA3S7dZ8bLUfy8VHQc60S5yTXHiZhzSpkOZdHQSYwWL3XU ITmxDcgIoX0vqA6ZWFpRZudel6iZUE3QcrUQEabMcJ0U+A0BzW8VQ47lkXsoZyG7 qy2sjBbgsOIxWg60apMGhIg4CG4dKycbwknQ7jYkAoBCrUmcoDdPtWDqCEuCsFr2 4Vmo8rIb+DObX52sw298JzPaQ/ocRGrYGNXb82jKreyeRyv3+5QCmlcoxLlR5Lq0 iIfFwjxcQkF71Cqm06kdyLXXqEzYtLLE7uk3xMC6ocWal1AweaEgoL0w3pzi8mI2 teOli1xLzgUNwkpv2rg0M58HLPfnV3UW+dIXvpTBG42IvmHiEjnNpqGvTFVh35/E LG9ekpbSonAJMJvqixbVDtSrHlCAik+j0tfu7WKECFMaWVWKqarBfhkDiyutqncY 2L8z/RuQ9LUmDvoiOQPcKFZOtrlAW/HHPbb4eHIo5+/pB2qEAnheeXfjHbNxI1cd ov4XNkErzYI4fhtUqQVsm6r2CJj8LF3UXBsUONghL3CZDH4Dj/6UEb+0C4OHsNGY 37GmEisSaKcheDOeKz77LBj9WdQ4MB3MTPqq1RXISR5AbUxQFjoJ6V32PGU7NrL0 4ljO4PcnglimgKIR0uEEQwvMH1bJu/y55yhOS6hkfYMzO9qKmhN0KT1tJpfpgC3o uivBF9ii91FxyZMZssEm+exKshNheK3KsWJh9Hk7xmrF40TbvcCGMN0qAq45iBMJ KgRf0Dc+C+LtkdfUCxVxQbxZHJwXw82W1mIX9VY1F31VyjiI3t2V2CnRqpzrw1iM 8nX96OATzeLG2JyfT7rXXvxPd4GC/aVF2y/v2NbCIliII+LzrjBgvein/07SfbxP F3fWe87NuHZNxgo19MsismKEKX4/F73UgkXRsc2H9cwcVnDGC2oFelwDh9ddWMdp NcSVGEKdNA4F4WnLgg10zSm2namjxD66d93t2t13ku7j8y+BQa9r7+C6MsvQk5Wo QOvTmjGI3DLyF4t9OunebrI83QWpXZ99nGEZmoyZRI+Ag+NQ/9iX/2WVXTc9Au0a iC5aCriokcltEjJIxYZO48V5iG/XF84JCmrm8IAR/6aaWrIAvZak5eiLo9Wdugru nowA0EDc3Y/IbDZ73cZuB4tAZWBxyt60dtE/FyUoQaW3iL9sVeiJJG2JFXdJhquK 2M4zob09txVC1hc3vUg0R4IJo83dBcnRyFReNMht2Hga0vvFhWOXuBX6DHy8wkyR U/k5ObF7d/r2/av+3IL/2ZDUsdgS4K1xqoxt1eNpsxFdYIox7muz5INW1rNbMBaR sSCobKpGMqoYI/svCE1MrWO6PeaqKJqx09hqUWy9gmJ8pOV34NJpkj4FMy/4gDCB wCybOEJD4jZI9U5sd0FNYoK61jTY+cVgnwjo20ev9tIwDRGvQCEhbAw2pra0pOuD qmwl1nYc07fXF7JHZ25Z9oyVngZyAHMb9Db6+PKQ6/cLX1vtr9t1TOr3cQ0RtyVc hBqcsoBjCMhnI9LdzHE9/fA2QtmCM/Qrs71BXzkNQyIenCG0zhyBYBiuvcY44wI7 4wI4peNhZF3wqzSnv3SbyiycNQFWDhXRZvdGTUQfIn1L1jCEsFOit2mKjDs0Y74R 3sfHj5hsxMk+VXONrWNGC3emy90wV9DcQnDk2RA/3qOMbnc05RKaBRaq1C6ciNmi Fqk82ka/j+OLmTIQwG6gOF9hc0EIj0H1Bh5j/0NYrLbDnfT7xQPaShiXqlAajAwt k0Z6+YIfDuKya8ybvRYs3lpuQkyMOY7L9irWInKruKLxjZpVoluyRiOaG+1oWFpW h/rJMEGwiTZ1lT9HmhAodftwH+jNQw8RUdWhpHApzQgd6btXDtFHGeNUFaQVfKx+ svf6VlQhoeG950WN2KMU67Voa0RxbJePkO5tKB+Dk8Ghvwm9qWrFqVJlmPQR9qx7 CahiQ3y4kX6/tMFCBa/AxOhmwFlUH0JPTCwWhgtWuQ4blGFwDjfo6cCVAi5LoE0R cVxHVUON2315Rs2gnwIkWhzEO+3oMlpPaAd59MWWF3KfYLyz0N0f2dOUFoazLi2/ hu2IziwV5qT8IQie96aJ/iBwt+vWaa6e7iLY76fws/gUhsz6KLbAlj0L26+5/Cry V61tdtJxnPXDsZUyzA8q/4mg2MmrnKdR+3VlQY+Ft4hSvlaUqmBSCdvsahrdMEDc RG31rQjxXPL2tE23COP1U3lL8FYptYeWuy2cxgiArXbJvw0a2xX4vZddgj1mV0G3 zEBis2wtoaBwGrSHJ55xNE5xUxHi8YVdLCUdLTm0TjnjXjW57Y9i9iB9YFNfHXum 4IS78wQI4J5pnKp/P0qUd+mDIti/FRlG7FqJ1yHpxmlKH2w0YoIdN6JDeHO7dBF6 d/p/Yvqq3lapKxllYA7S9TXbqO9X8DQFbIuZo8ZFY1WBQV9HFvbcQ2AGlXST2hqR gDN4NxwbYALWqbcdrZi0wI0SDZM6qqGj6vdooeRDnHr3fqv1ckrJWv4MajXD1r4P P6xAlbLDtcV3Amfur8L1LliKVc7GX0rFs20shNlxEG47CtujtUfNVjXD60MNNPoD 4+HrQu3XOJCI9RTMONzVebwy1vSGbkgVLy0Ex5GZG4H5TY57448W90gfpV61fspm kovz5JkaG5Moxk8sxtyY6ME4TmGC2wGj2+ljrCNmzpWFXlTRElNx4irK70nfweGh 1E0skll/h2iXkiy+AcuWXAI6RGPlwiYG21BHMXs8OdCD442jQo7BYBBKTKV3DqQF r9/VO/v9eo8yhqI8tG6zlVCsXqESL62IyQguT5Q99F6tasRhzB4vrWXm9ZKFEgWK c43g5DnaNsL7ltlrnPLMiLZrVQt5KmfuUjO7Ak3JXtVVkRrOoGFB19SlQceZ3irs 8aim1byV0AV1ovBY6ZbaZtEHmhjRHQbtJp3ZhZ4E9Tg0EUctqm0CPMEzWaR8UYJK nkDsCaq8O7VMxbyL5BZ7Tff4q/FUYA1h0raOtszf2sxOUXdrrhOhqO9VvMB3EVXl K/FtTOPEzbQIDgP3xhVen//qaNiIZrJzbThJJI0xTpD7huL1PvUN0+43q8AseU9F K+B13FbmAKvC8wWXq5CJqKpn9JUOZiaK7WXi4Dj/DaKP7OSY5frC3rQdhu7+0PpK 68rYdAacv2kVibEhm+7xOqQfBLfgdhK8N85kRQlYH2pV/k9Z1yjWZJtVCjCDah92 pt80Evo//uN/23961Uf4p/YPN6MLh66REpNIUkWtwohSia7WHfA71rejbCJ8/nE0 z+/FuXZX2dPqdBxxdxQVYrUCdBvA7Qf1JW/REOXscKl81LUbDXgpCNhoNeIisrHt 6kplFt8Q5bs4FkobWTlXNUSMXp/N7LjDzU13Zm+YOXzSqnH+G8rudD7r1TgRUyCc 4LdlpAmv1lV9SVGo96ONuPMbCW+YPfXrjb3muacocVfBFVBTHV7tmdDzX3+1//TT 9yJdezS512mVHfWSSjJOQHfkTKugsJQSTnku5Pd7NOGRNoX9Kx4ATBDaoL+TuPXy IbdGc4MzxjLBqL8/mFAvDrmgWj07Y+yKXYK8hqN6XnsfVuQVETlbksA1R2dei8Hh rRaQ8xTjr3TyhOdCfX92QRpVIHTFLmdau69Oxo17tXBxKcqowt5tPxHiNzdQSkqJ QygsnkfybBtdXr5Ia318/Pzelfl7+xeFEcR2EBcBe32KjOSxne1MTOy8okXcS/L7 udDe75EVAtF4rHdEbwTpfbRNX6WKSo+sgJ6C7y3WHKNScIldWWsC/is2gL0LARez o1h+F8MI4hZVqd0j5UGBzatitdo8A90GpWYYL98k1sOf9a5+/exsCqUiPB8GVuns haIqYVAiGAUFV6fvdfYnQnu/gejdRB484Acs0oN4iAEV+IVfVP5mwr4bRaXsuxWT ns6rxgg1hT5740jDdd1EJRl5kuW/nbPvt1uosa6xFWuroEQMH8LGDYSB54CFIEIa AdNHZXKLzlgoJSA5WpXpJ9Z9VcULf9GWJ+7Hgk4KvPCDCJWQKeFGtqUxaiaYim9y RAsji7l8O23ff0YprtYkML7dEtnKtMvPoIQqumWvPpNqkTP7Xua+3ysjZyz+bSvO nwJbiel/G1fYqnA1ffMzeB3V7rgzLtw1U0GjvpuU9eK1how+gSEK0pUivx3+14Hh EAXtuwggs4gGM3Qxq4Q5KOJnczhLI2e2gR9YVEGESAYGfg7HEK1l66aI7AB66cPp O3I2ipiOvh0n2IwTqhHcm9EMXaNppSAK7S9l92+H/WWbOYuwTGUjrUDErRItWoq6 OIXemWCGwGVO+ZuF+jWdWDEijhLxGG+GjafF/srwjIHPozD/w9//17//J93g51/8 KhRhKV2lwCQHLeQ7ourUVD4UG1p/d9QKyWMeRvqTO6GTl0xWYlyXTUHwymOYkRkf iqBBZoxt1YaUTOK4Z7ZtGb1goiiq5OK+O0vVC0fwNDO6IpAkhq+MKzC3kGhQjr28 yKdLQja03WmpO36bPwz2Z7+g7r1RLBHhzZvN0SFuJkqnZIl3BP140O2TeH9yG9GP SAdhGfqi9ZJEgEfYW7Gxa04TjkLOh8Tl/+n6rv6Zivf7N/kLqd7vP/wfWb7fv8Mf Ur9fL32hPv2PH47tnpPBQTPDaLwiQ9+DlthEZMgMXJjFH58M7uMtgltoytVUK2p6 CMo0fURZ1GlH5e/Odj0rjqFs642+qmERDixaMamLbovCjySQXYuWCk3iind2+gPM RnpUwpiMWjNgkqtrYkLOqKgKq1Lsk6F9fPQoioz5lb6qHBjBCddybZzEOOgpbVMq Es8E9vH6tQkZ6UJpMuuDp6yPRpyzKyjK2vbpsP6nP/28dO/4iHhhIT/E1/Rx7hzF WBLG2xsr4BjCDt8I7K+bNGb2esYENTEuEJnFN9Rgqzw8VvBTYfAlrjXt0GqcnYOx lAWj2tw2eNcQ1WriSJU5Z6FHEZAc6GsyClr3E/GTrG8+KxHAt+fWcpr6Y8oV3wjt r4fvSO5HfFusCy5bkUFVCTd6rS33jGkkrjr52eA+3IEeSdzG9ZuvgXWjX2pV3CeN itkfhfe/tf93Xf+x//6/LPvPsz3y7j3+QrZF3n32P3I75N0b/CHbILcru3+GWvv7 Df5C6uzvD/5H1tjfr/7d+vpWTLRc0rT0wiGwubAE8Gy+xpZHY2ioLUD4J6cHb68o 1A4VxfZ+7qu9I9mSrqQozoJuNSrizK901dMt4oj4F59hUF0vVUtTPHaiSzxcLiKz hWMfW6oykuolJtaueUY5LHcSN9zWimNlXa3sT+jOb0+K6XkOsWKmpaLvXGYKd4SE JKx3YQhf9w9PeH57lWboMadFQcB1hgxQjljLtKVi//EA4G/apGKkkYOU6WjE6fUa p+2rMBihgqQPXZ/zCF+H5PWKQd++6kNGufCyOKD5gAzYOkwzX4ecbEP0YIRfMiim olnNmO00S1US79FR0TjijXcsoyNtwnqWtJbtHdYiBqK32VWhrgkeUR5+hc1fh+T1 SQsb9Muo7rqiqmq3HnjSpRVUK5Kyip5RdNh+EZLXy3nVL/YomBkWTRYgUkmInCN0 O3feX4Xkh6Sov9ReOoklYPxNgLy+FpQKfKsJjVItx/l1QH5cTzlLKcrTgTLdAp9d R9DJLHStQ94tu46w9KbVLplLTmJWfV6TKYeu9biH+J8zPeh9OMPUY2R3VSDSBDpv 8OYRjMIVA5Wr5azSHe1u5VONkftzFuHT7FthoLAUjHlit0GplllKj/SoaLVdX62P FzFaPZJBilYpAd8om6yvnCUGetdG+CoUL3qigp05hOB91b9t6tCrE1ZDp98qnSLX 0LGgsV/H4lXu9NrkibU4b2iUu7AJNnfJbOvwT1cAgiCBw2zF7KV8Tk8I/n7VosMl lkAGQ65EHKEMeptN6MzebXMJT9mZ9bTO2KYPWbw+60N0Wo8uhvh1MF4edHTsXJUG txsrOs8Mu3Jt06oetOQhEatL+i+i8fqzUWcU9BHTJzHQr6nkGxb4J8YPxVtS+Nzc 97571zP7UAvpWPRPVp8CN8JWjDSyekI3Qy/qY9D33O02+lUMRAVGSfWd6Du1wpyN fCeGNYw+OSRGMp6VrrZ+CVPlVgOzbyJMtGgxpy7c6PSF5ThwTtjbYjEzyUqzN/Sd J6c9aw48DBouuDHHj3nbcz+jxuaRctmqb8pVSsa2Mi2/fGbShbFj4dbxwbJ77l4C Ict674WrqhZPDiWKGqmK6vsyIbgnP4PXSZW/exV8qwnVSJWI6+DZDdoAkNkWDrNi U/o9Sm1r56e/gN/ulLvyMsZPONUwbMCMlre0xtm1YsKkim4T2i5Ukq9uO2yLM4Zt UCkR2CFepQt0dPlIcGhhe6F/FTJ9SKJB/gfz499IgnNIEunP6gU293Twf/sFC1jD LIwxA+H0TqbvifEXgdVEixlKck/G/bfbOL2EiZ8Lw2dpKbOnWGgZmUFvwaRvhvxl xW+EwQuKG4p4R0VFOC+Ka1llFUUhF/pz3Lfj/come/IDm3QtVEEaFeFER5Bgq2f2 pymOKBnXmJSm8XlbGd0zRb1gkVD1Pu1lmuDyWKIG2IW5jftcwlssm23EgZuCjQS9 mH+IU5cvMSOEur8d7NceYpFUfaWMRS3PLCS+mIJVTpwsuGBUZpnN/V6kX7a8w0w7 CSS4EvJKO2LNhXHfyFlwZn4zwb+Qyb2UTumxEUkyWC2AWgTDo9abwUbWqaTv8e3E /rKmmersfY6NRhrz1AMpRz1/7UkcKjXf0XtnWBJbheV3NK4LovWrX7YpbALhZrPq tdz32F7cC1iPztFe9MDo46/oji7BMd1N5Hu65JUCW/h2Qn/Z4kYaCimMKUiytKSt KaoVwo6T42p9Sq1bP/L3EvnravY7Ny24yXlfS9EzFiuWNZL+x65fhvkPV/b5+NJ/ tto+Hz/y/566z8fX/aa+z9sL/pEKP59c+89W4+ez9/G/pfLzyYW/qfPz5oq3wd6/ +3e/ZvD80quKWy8klShUdilL6PvXDYfKApZF8ZOewLPbOEbYVQ61vAp1v2nR4Uy7 xZVX5HSyqWpcJwk4QgcMneqEZwanou4nJ6kelVfT/aA/Hj3liA+b6mRr+jiSvvBW LWPFeuGqzXpF7I8EnENPA/rB4/uMT+Fm0mLYrOx9zUxYfXeKjNZoV4JX0jpblR/c I5uZ7ArIQxS9KvJhStOgia/fZNdZmB+btcWBOKQXac3CmWEWn9zqYuwisioRU8Gg +pjT2N4azPH/SPR3gVCwfsZsnYOTLELLPsBiTL7pntfs4mzbF6PirX8SYxuYKaKQ U/RfWnjVrCsbCZ13fQhpLIU7bfwvMNSdGbata64LZXhznFpvOkU+GubLPO1m6Ogg bm9aqVE3Skxg6HmTj0dRvL9oDNH1jsfI+lExhcuBeXcXWm4fylu8ueLj7La+c3h8 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 -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 +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 +7z/eocFSHsydnz7lqvDwUkxqgKFJxheyU1x7i9LJpYMrknvEb5eb8KTRP5+r4awj +CYnuvOXwGi16d92W6CabaCB0LbLV4QCuc8pJRupxhOb5g94UTjsFwJs1yALXtUrW +FtbC0ccwQdCqxqi8vB0165lJI1owIKxS4B8QhEFwsHP1CT53jtaE/RRrDpny7Oco +M2m6TaBBDq1tCu6+C3wIigjonyc9df6QL4VTrN9kkbVzv1dbXdqPNjR9b+N+ElxW +UyKYjpvu5cBCcEpCRkXIyFLQuZT7WApq9d3jtoFKFetLVC7nKL8LBleMLl5QCiaQ +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 uudecode << EOF begin-base64 644 expected16 R29vZCBzaWduYXR1cmUgZm9yIGIuZ3BnIG1hZGUgTW9uIFNlcCAxMCAwMDoxNToz OCAyMDEyCnNpZ25hdHVyZSAgICAgMjA0OC9SU0EgKEVuY3J5cHQgb3IgU2lnbikg MWI2OGRjZmNjMDU5NjgyMyAyMDA0LTAxLTEyCmZpbmdlcnByaW50ICAgZDQxNSA5 ZGViIDMzNmQgZTRjYyBjZGZhIDAwY2QgMWI2OCBkY2ZjIGMwNTkgNjgyMyAKdWlk ICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BhbGlzdGFpcmNyb29rcy5j b20+CnVpZCAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAcGtnc3JjLm9y Zz4KdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BuZXRic2Qub3Jn Pgp1aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5ldGZsaXguY29t PgoK ==== EOF uudecode << EOF begin-base64 644 expected17 R29vZCBzaWduYXR1cmUgZm9yIGEuZ3BnIG1hZGUgU3VuIFNlcCAgOSAxNzo0NDox MSAyMDEyCnNpZ25hdHVyZSAgMjA0OC9SU0EgKEVuY3J5cHQgb3IgU2lnbikgMWI2 OGRjZmNjMDU5NjgyMyAyMDA0LTAxLTEyCmZpbmdlcnByaW50OiAgZDQxNSA5ZGVi IDMzNmQgZTRjYyBjZGZhIDAwY2QgMWI2OCBkY2ZjIGMwNTkgNjgyMyAKdWlkICAg ICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BhbGlzdGFpcmNyb29rcy5j b20+CnVpZCAgICAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAcGtnc3Jj Lm9yZz4KdWlkICAgICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BuZXRi c2Qub3JnPgp1aWQgICAgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5l dGZsaXguY29tPgplbmNyeXB0aW9uIDIwNDgvUlNBIChFbmNyeXB0IG9yIFNpZ24p IDc5ZGViNjFlNDg4ZWVlNzQgMjAwNC0wMS0xMgpmaW5nZXJwcmludDogIDU3YzAg 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 begin-base64 644 expected19 R29vZCBzaWduYXR1cmUgZm9yIE5ldEJTRC02LjBfUkMyX2hhc2hlcy5hc2MgbWFk ZSBXZWQgU2VwIDE5IDA3OjUzOjE4IDIwMTIKc2lnbmF0dXJlICA0MDk2L1JTQSAo RW5jcnlwdCBvciBTaWduKSAwNjQ5NzNhYzRjNGE3MDZlIDIwMDktMDYtMjMKZmlu Z2VycHJpbnQ6ICBkZGVlIDJiZGIgOWM5OCBhMGQxIGQ0ZmIgZGJmNyAwNjQ5IDcz YWMgNGM0YSA3MDZlIAp1aWQgICAgICAgICAgICAgIE5ldEJTRCBTZWN1cml0eSBP ZmZpY2VyIDxzZWN1cml0eS1vZmZpY2VyQE5ldEJTRC5vcmc+CmVuY3J5cHRpb24g NDA5Ni9SU0EgKEVuY3J5cHQgb3IgU2lnbikgOWZmMmMyNGZkZjJjZTYyMCAyMDA5 LTA2LTIzIFtFeHBpcnkgMjAxOS0wNi0yMV0KZmluZ2VycHJpbnQ6ICAxOTE1IDA4 MDEgZmJkOCBmNDVkIDg5ZjIgMDIwNSA5ZmYyIGMyNGYgZGYyYyBlNjIwIAoK ==== EOF uudecode << EOF begin-base64 644 expected20 MS4gdGFnICYgMHgzZgoyLiBsZW4KCm9uZSBwYXNzICh0YWcgNCkKPT09PT09PT0K YiB2ZXJzaW9uOjMKYiBzaWcgdHlwZQpiIGhhc2ggYWxnCmIgcHVia2V5IGFsZwo4 YiBrZXlpZAoKbGl0ZXJhbCBkYXRhICh0YWcgMTEpCj09PT09PT09PT09PT0KYiBi 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 begin-base64 644 expected22 R29vZCBzaWduYXR1cmUgZm9yIFtzdGRpbl0gbWFkZSBTdW4gU2VwIDMwIDEwOjUw OjIwIDIwMTIKc2lnbmF0dXJlICAgICAyMDQ4L1JTQSAoRW5jcnlwdCBvciBTaWdu KSAxYjY4ZGNmY2MwNTk2ODIzIDIwMDQtMDEtMTIKZmluZ2VycHJpbnQgICBkNDE1 IDlkZWIgMzM2ZCBlNGNjIGNkZmEgMDBjZCAxYjY4IGRjZmMgYzA1OSA2ODIzIAp1 aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQGFsaXN0YWlyY3Jvb2tz LmNvbT4KdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0Bwa2dzcmMu b3JnPgp1aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5ldGJzZC5v cmc+CnVpZCAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAbmV0ZmxpeC5j b20+Cgo= ==== EOF uudecode << EOF begin-base64 644 expected23 R29vZCBzaWduYXR1cmUgZm9yIFtzdGRpbl0gbWFkZSBXZWQgU2VwIDE5IDA3OjUz OjE4IDIwMTIKc2lnbmF0dXJlICA0MDk2L1JTQSAoRW5jcnlwdCBvciBTaWduKSAw NjQ5NzNhYzRjNGE3MDZlIDIwMDktMDYtMjMKZmluZ2VycHJpbnQ6ICBkZGVlIDJi ZGIgOWM5OCBhMGQxIGQ0ZmIgZGJmNyAwNjQ5IDczYWMgNGM0YSA3MDZlIAp1aWQg ICAgICAgICAgICAgIE5ldEJTRCBTZWN1cml0eSBPZmZpY2VyIDxzZWN1cml0eS1v ZmZpY2VyQE5ldEJTRC5vcmc+CmVuY3J5cHRpb24gNDA5Ni9SU0EgKEVuY3J5cHQg b3IgU2lnbikgOWZmMmMyNGZkZjJjZTYyMCAyMDA5LTA2LTIzIFtFeHBpcnkgMjAx OS0wNi0yMV0KZmluZ2VycHJpbnQ6ICAxOTE1IDA4MDEgZmJkOCBmNDVkIDg5ZjIg MDIwNSA5ZmYyIGMyNGYgZGYyYyBlNjIwIAoK ==== EOF uudecode << EOF begin-base64 644 expected24 R29vZCBzaWduYXR1cmUgZm9yIFtzdGRpbl0gbWFkZSBNb24gU2VwIDEwIDAwOjE1 OjM4IDIwMTIKc2lnbmF0dXJlICAgICAyMDQ4L1JTQSAoRW5jcnlwdCBvciBTaWdu KSAxYjY4ZGNmY2MwNTk2ODIzIDIwMDQtMDEtMTIKZmluZ2VycHJpbnQgICBkNDE1 IDlkZWIgMzM2ZCBlNGNjIGNkZmEgMDBjZCAxYjY4IGRjZmMgYzA1OSA2ODIzIAp1 aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQGFsaXN0YWlyY3Jvb2tz LmNvbT4KdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0Bwa2dzcmMu b3JnPgp1aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5ldGJzZC5v cmc+CnVpZCAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAbmV0ZmxpeC5j b20+Cgo= ==== EOF uudecode << EOF begin-base64 644 expected25 R29vZCBzaWduYXR1cmUgZm9yIE5ldEJTRC02LjBfUkMxX2hhc2hlcy5ncGcgbWFk ZSBUdWUgT2N0IDE2IDA4OjEyOjE2IDIwMTIKc2lnbmF0dXJlICA0MDk2L1JTQSAo RW5jcnlwdCBvciBTaWduKSAwNjQ5NzNhYzRjNGE3MDZlIDIwMDktMDYtMjMKZmlu Z2VycHJpbnQ6ICBkZGVlIDJiZGIgOWM5OCBhMGQxIGQ0ZmIgZGJmNyAwNjQ5IDcz YWMgNGM0YSA3MDZlIAp1aWQgICAgICAgICAgICAgIE5ldEJTRCBTZWN1cml0eSBP ZmZpY2VyIDxzZWN1cml0eS1vZmZpY2VyQE5ldEJTRC5vcmc+CmVuY3J5cHRpb24g NDA5Ni9SU0EgKEVuY3J5cHQgb3IgU2lnbikgOWZmMmMyNGZkZjJjZTYyMCAyMDA5 LTA2LTIzIFtFeHBpcnkgMjAxOS0wNi0yMV0KZmluZ2VycHJpbnQ6ICAxOTE1IDA4 MDEgZmJkOCBmNDVkIDg5ZjIgMDIwNSA5ZmYyIGMyNGYgZGYyYyBlNjIwIAoK ==== EOF uudecode << EOF begin-base64 644 expected26 R29vZCBzaWduYXR1cmUgZm9yIFtzdGRpbl0gbWFkZSBUdWUgT2N0IDE2IDA4OjEy OjE2IDIwMTIKc2lnbmF0dXJlICA0MDk2L1JTQSAoRW5jcnlwdCBvciBTaWduKSAw NjQ5NzNhYzRjNGE3MDZlIDIwMDktMDYtMjMKZmluZ2VycHJpbnQ6ICBkZGVlIDJi ZGIgOWM5OCBhMGQxIGQ0ZmIgZGJmNyAwNjQ5IDczYWMgNGM0YSA3MDZlIAp1aWQg ICAgICAgICAgICAgIE5ldEJTRCBTZWN1cml0eSBPZmZpY2VyIDxzZWN1cml0eS1v ZmZpY2VyQE5ldEJTRC5vcmc+CmVuY3J5cHRpb24gNDA5Ni9SU0EgKEVuY3J5cHQg b3IgU2lnbikgOWZmMmMyNGZkZjJjZTYyMCAyMDA5LTA2LTIzIFtFeHBpcnkgMjAx OS0wNi0yMV0KZmluZ2VycHJpbnQ6ICAxOTE1IDA4MDEgZmJkOCBmNDVkIDg5ZjIg MDIwNSA5ZmYyIGMyNGYgZGYyYyBlNjIwIAoK ==== EOF uudecode << EOF begin-base64 644 expected27 R29vZCBzaWduYXR1cmUgZm9yIFtzdGRpbl0gbWFkZSBNb24gT2N0IDE1IDA5OjI4 OjU0IDIwMTIKc2lnbmF0dXJlICAgICA0MDk2L1JTQSAoRW5jcnlwdCBvciBTaWdu KSAwNjQ5NzNhYzRjNGE3MDZlIDIwMDktMDYtMjMKZmluZ2VycHJpbnQgICBkZGVl IDJiZGIgOWM5OCBhMGQxIGQ0ZmIgZGJmNyAwNjQ5IDczYWMgNGM0YSA3MDZlIAp1 aWQgICAgICAgICAgIE5ldEJTRCBTZWN1cml0eSBPZmZpY2VyIDxzZWN1cml0eS1v ZmZpY2VyQE5ldEJTRC5vcmc+Cgo= ==== EOF uudecode << EOF begin-base64 644 expected28 R29vZCBzaWduYXR1cmUgZm9yIE5ldEJTRC02LjBfaGFzaGVzLmFzYyBtYWRlIE1v biBPY3QgMTUgMDk6Mjg6NTQgMjAxMgpzaWduYXR1cmUgICAgIDQwOTYvUlNBIChF bmNyeXB0IG9yIFNpZ24pIDA2NDk3M2FjNGM0YTcwNmUgMjAwOS0wNi0yMwpmaW5n ZXJwcmludCAgIGRkZWUgMmJkYiA5Yzk4IGEwZDEgZDRmYiBkYmY3IDA2NDkgNzNh YyA0YzRhIDcwNmUgCnVpZCAgICAgICAgICAgTmV0QlNEIFNlY3VyaXR5IE9mZmlj ZXIgPHNlY3VyaXR5LW9mZmljZXJATmV0QlNELm9yZz4KCg== ==== EOF uudecode << EOF begin-base64 644 expected29 R29vZCBzaWduYXR1cmUgZm9yIE5ldEJTRC02LjBfUkMxX2hhc2hlc19hc2NpaS5n cGcgbWFkZSBTdW4gU2VwICA5IDE3OjQxOjI0IDIwMTIKc2lnbmF0dXJlICA0MDk2 L1JTQSAoRW5jcnlwdCBvciBTaWduKSAwNjQ5NzNhYzRjNGE3MDZlIDIwMDktMDYt MjMKZmluZ2VycHJpbnQ6ICBkZGVlIDJiZGIgOWM5OCBhMGQxIGQ0ZmIgZGJmNyAw NjQ5IDczYWMgNGM0YSA3MDZlIAp1aWQgICAgICAgICAgICAgIE5ldEJTRCBTZWN1 cml0eSBPZmZpY2VyIDxzZWN1cml0eS1vZmZpY2VyQE5ldEJTRC5vcmc+CmVuY3J5 cHRpb24gNDA5Ni9SU0EgKEVuY3J5cHQgb3IgU2lnbikgOWZmMmMyNGZkZjJjZTYy MCAyMDA5LTA2LTIzIFtFeHBpcnkgMjAxOS0wNi0yMV0KZmluZ2VycHJpbnQ6ICAx OTE1IDA4MDEgZmJkOCBmNDVkIDg5ZjIgMDIwNSA5ZmYyIGMyNGYgZGYyYyBlNjIw IAoK ==== EOF uudecode << EOF begin-base64 644 expected30 R29vZCBzaWduYXR1cmUgZm9yIFtzdGRpbl0gbWFkZSBTdW4gU2VwICA5IDE3OjQx OjI0IDIwMTIKc2lnbmF0dXJlICA0MDk2L1JTQSAoRW5jcnlwdCBvciBTaWduKSAw NjQ5NzNhYzRjNGE3MDZlIDIwMDktMDYtMjMKZmluZ2VycHJpbnQ6ICBkZGVlIDJi ZGIgOWM5OCBhMGQxIGQ0ZmIgZGJmNyAwNjQ5IDczYWMgNGM0YSA3MDZlIAp1aWQg ICAgICAgICAgICAgIE5ldEJTRCBTZWN1cml0eSBPZmZpY2VyIDxzZWN1cml0eS1v ZmZpY2VyQE5ldEJTRC5vcmc+CmVuY3J5cHRpb24gNDA5Ni9SU0EgKEVuY3J5cHQg b3IgU2lnbikgOWZmMmMyNGZkZjJjZTYyMCAyMDA5LTA2LTIzIFtFeHBpcnkgMjAx OS0wNi0yMV0KZmluZ2VycHJpbnQ6ICAxOTE1IDA4MDEgZmJkOCBmNDVkIDg5ZjIg 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 begin-base64 644 expected32 R29vZCBzaWduYXR1cmUgZm9yIGIuZ3BnIG1hZGUgTW9uIFNlcCAxMCAwMDoxNToz OCAyMDEyCnNpZ25hdHVyZSAgICAgMjA0OC9SU0EgKEVuY3J5cHQgb3IgU2lnbikg MWI2OGRjZmNjMDU5NjgyMyAyMDA0LTAxLTEyCmZpbmdlcnByaW50ICAgZDQxNSA5 ZGViIDMzNmQgZTRjYyBjZGZhIDAwY2QgMWI2OCBkY2ZjIGMwNTkgNjgyMyAKdWlk ICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BhbGlzdGFpcmNyb29rcy5j b20+CnVpZCAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAcGtnc3JjLm9y Zz4KdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BuZXRic2Qub3Jn Pgp1aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5ldGZsaXguY29t PgoKR29vZCBzaWduYXR1cmUgZm9yIGIuZ3BnIG1hZGUgTW9uIFNlcCAxMCAwMDox NTozOCAyMDEyCnNpZ25hdHVyZSAgICAgMjA0OC9SU0EgKEVuY3J5cHQgb3IgU2ln bikgMWI2OGRjZmNjMDU5NjgyMyAyMDA0LTAxLTEyCmZpbmdlcnByaW50ICAgZDQx NSA5ZGViIDMzNmQgZTRjYyBjZGZhIDAwY2QgMWI2OCBkY2ZjIGMwNTkgNjgyMyAK dWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BhbGlzdGFpcmNyb29r cy5jb20+CnVpZCAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAcGtnc3Jj Lm9yZz4KdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BuZXRic2Qu b3JnPgp1aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5ldGZsaXgu Y29tPgoKR29vZCBzaWduYXR1cmUgZm9yIGIuZ3BnIG1hZGUgTW9uIFNlcCAxMCAw MDoxNTozOCAyMDEyCnNpZ25hdHVyZSAgICAgMjA0OC9SU0EgKEVuY3J5cHQgb3Ig U2lnbikgMWI2OGRjZmNjMDU5NjgyMyAyMDA0LTAxLTEyCmZpbmdlcnByaW50ICAg ZDQxNSA5ZGViIDMzNmQgZTRjYyBjZGZhIDAwY2QgMWI2OCBkY2ZjIGMwNTkgNjgy MyAKdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BhbGlzdGFpcmNy b29rcy5jb20+CnVpZCAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAcGtn c3JjLm9yZz4KdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BuZXRi c2Qub3JnPgp1aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5ldGZs 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 begin-base64 644 expected34 R29vZCBzaWduYXR1cmUgZm9yIGRldC5zaWcgbWFkZSBUaHUgT2N0IDE4IDAyOjEy OjMzIDIwMTIKc2lnbmF0dXJlICAgICAyMDQ4L1JTQSAoRW5jcnlwdCBvciBTaWdu KSAxYjY4ZGNmY2MwNTk2ODIzIDIwMDQtMDEtMTIKZmluZ2VycHJpbnQgICBkNDE1 IDlkZWIgMzM2ZCBlNGNjIGNkZmEgMDBjZCAxYjY4IGRjZmMgYzA1OSA2ODIzIAp1 aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQGFsaXN0YWlyY3Jvb2tz LmNvbT4KdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0Bwa2dzcmMu b3JnPgp1aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5ldGJzZC5v cmc+CnVpZCAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAbmV0ZmxpeC5j b20+Cgo= ==== EOF uudecode << EOF begin-base64 644 expected35 VG8gRG8KPT09PT0KdGVzdHMgd2l0aCAtayBzaWcKZGV0YWNoZWQgc2lncwpEU0EK CkRvbmUKPT09PQpiYXNpY3MKbG9jYWxpc2UgcGdwX3JlYWRfcGFja2V0cwpmaXgg bGludApXQVJOUz01CmxpYiBtYW4gcGFnZQpwcm9nIG1hbiBwYWdlCmRvIHdlIGRv IGl0IHN0YXRpY2FsbHkgbGlua2VkIGFzIHdlbGw/Cm11bHRpcGxlIGZpbGVzIGlu 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 atf_check -s eq:0 -o file:expected27 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg < NetBSD-6.0_hashes.asc atf_check -s eq:0 -o file:expected28 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg NetBSD-6.0_hashes.asc #atf_check -s eq:0 -o file:expected29 -e empty netpgpverify NetBSD-6.0_RC1_hashes_ascii.gpg #atf_check -s eq:0 -o file:expected30 -e empty netpgpverify < NetBSD-6.0_RC1_hashes_ascii.gpg atf_check -s eq:0 -o file:expected31 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c cat b.gpg b.gpg b.gpg 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 } # Test set 2 (dsa_signatures) for netpgpverify atf_test_case netpgpverify_testset_2_dsa_signatures netpgpverify_testset_2_dsa_signatures_head() { atf_set "descr" "Test set 2 (dsa_signatures) for netpgpverify" } netpgpverify_testset_2_dsa_signatures_body() { uudecode << EOF begin-base64 644 dsa-pubring.gpg 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 OTZKjAvuLXkOVnawAgAD ==== EOF uudecode << EOF begin-base64 644 in1.gpg owGbwMvMwCGoZv+8NenRnzrGNY1JzJl5hgGthk+VOfX8Ukucgl2sFHwTs1PTMnNS dcoUDPVM9QwN9AwVjAwMjfQNTPUNzBQMLawMTawMzRQS05MVXCsKFPS4uIJDnVw8 g7RtOXMykxT0wh09QxBCSZl5XFx6mXnJOaUpqQo2ScUpesWlSSmZRXq52XZcHXEs DIIcDGysTCBXMHBxCsBct0iSkWHa0k9iZ5i+mtQ43zvsb7nA9sWeSrvwubEbQw0P MNe3Vuky/C+59v/fFbGv5ofnzRSY/ld6vkfIxCtxoVEnvHZVrZeeb60BAA== ==== EOF uudecode << EOF begin-base64 644 in1.asc LS0tLS1CRUdJTiBQR1AgU0lHTkVEIE1FU1NBR0UtLS0tLQpIYXNoOiBTSEEyNTYK CiMJLk5ldEJTRDogTWFrZWZpbGUsdiAxLjUuMTAuMSAyMDEyLzA1LzA2IDE4OjE0 OjE2IGFnYyBFeHAgLgoKU1VCRElSKz0JbGliIC5XQUlUClNVQkRJUis9CWJpbgoK LmluY2x1ZGUgPGJzZC5zdWJkaXIubWs+Ci0tLS0tQkVHSU4gUEdQIFNJR05BVFVS RS0tLS0tClZlcnNpb246IEdudVBHIHYxLjQuMTEgKE5ldEJTRCkKCmlGNEVBUkVJ QUFZRkFsQ0ZNZFlBQ2drUUpqL25oV0xpL0g3Q2tRRUFnRFFyRndQRDc2SkMrNkZu T0tFei85RFAKSDdXalJSTW9JUU5UR0MzWlhSc0EvMXhhaDhlRmVQUURtVE8xc1FH bklOYmdYOXZaN0dBRk9nVGpXNyt0VmI3SAo9d3RLYgotLS0tLUVORCBQR1AgU0lH TkFUVVJFLS0tLS0K ==== EOF uudecode << EOF begin-base64 644 in2.gpg owGbwMvMwCGoZv+8NenRnzrGNU1JzJl5RgGtHj+VOfX8Ukucgl2sFHwTs1PTMnNS dcoUDPVM9QwN9AwVjAwMjfQNTPUNzBQMLawMTawMzRQS05MVXCsKFPQUuLiCQ51c PIO0bTlzMpMU9MIdPUMQQkmZeVxcepl5yTmlKakKNknFKXrFpUkpmUV6udl2XB1x LAyCHAxsrEwgZzBwcQrAnFfzjeGv9GtuvQj7X/Kv5IQ8f2s9n/36yaOmu9HPs8/V 8pg+SdfaxMhwdEOjtLVOGtuaizmXnJ8oa4fN/bfL0WfP1smOn38vsLFlBQA= ==== EOF uudecode << EOF begin-base64 644 in2.asc LS0tLS1CRUdJTiBQR1AgU0lHTkVEIE1FU1NBR0UtLS0tLQpIYXNoOiBTSEEyNTYK CiMJLk5ldEJTRDogTWFrZWZpbGUsdiAxLjUuMTAuMSAyMDEyLzA1LzA2IDE4OjE0 OjE2IGFnYyBFeHAgLiAKClNVQkRJUis9CWxpYiAuV0FJVApTVUJESVIrPQliaW4K Ci5pbmNsdWRlIDxic2Quc3ViZGlyLm1rPgotLS0tLUJFR0lOIFBHUCBTSUdOQVRV UkUtLS0tLQpWZXJzaW9uOiBHbnVQRyB2MS40LjExIChOZXRCU0QpCgppRjRFQVJF SUFBWUZBbENGU1FvQUNna1FKai9uaFdMaS9INmFLQUQ5SENMVHdZOEN3aXFUWHJ6 S3hIWjVsSFFuCnFFWmJjYlhqa0N4bGsrbS9QSFVBLzJXaGxjMHQ1WnRtSTIyMUxR eTVpblRuenB1MVU3NUU1bEp2dzBZTVRkWEoKPXY3ODgKLS0tLS1FTkQgUEdQIFNJ R05BVFVSRS0tLS0tCg== ==== EOF uudecode << EOF begin-base64 644 expected36 R29vZCBzaWduYXR1cmUgZm9yIGluMS5ncGcgbWFkZSBNb24gT2N0IDIyIDA0OjQ1 OjQxIDIwMTIKc2lnbmF0dXJlICAgICAyMDQ4L0RTQSAyNjNmZTc4NTYyZTJmYzdl IDIwMTItMTAtMjEKZmluZ2VycHJpbnQgICBkMmU1IDA3YjYgNWQ1OSAzM2QzIDlj OGQgYTYxOCAyNjNmIGU3ODUgNjJlMiBmYzdlIAp1aWQgICAgICAgICAgIERhdmlk IEFybXN0cm9uZyAoVGVzdCBEU0Ega2V5IC0gZG8gbm90IHVzZSkgPGRzYUBkc2Eu Y29tPgoK ==== EOF uudecode << EOF begin-base64 644 expected37 R29vZCBzaWduYXR1cmUgZm9yIFtzdGRpbl0gbWFkZSBNb24gT2N0IDIyIDA0OjQ1 OjQxIDIwMTIKc2lnbmF0dXJlICAgICAyMDQ4L0RTQSAyNjNmZTc4NTYyZTJmYzdl IDIwMTItMTAtMjEKZmluZ2VycHJpbnQgICBkMmU1IDA3YjYgNWQ1OSAzM2QzIDlj OGQgYTYxOCAyNjNmIGU3ODUgNjJlMiBmYzdlIAp1aWQgICAgICAgICAgIERhdmlk IEFybXN0cm9uZyAoVGVzdCBEU0Ega2V5IC0gZG8gbm90IHVzZSkgPGRzYUBkc2Eu Y29tPgoK ==== EOF uudecode << EOF begin-base64 644 expected38 R29vZCBzaWduYXR1cmUgZm9yIGluMS5hc2MgbWFkZSBNb24gT2N0IDIyIDA0OjQ1 OjI2IDIwMTIKc2lnbmF0dXJlICAgICAyMDQ4L0RTQSAyNjNmZTc4NTYyZTJmYzdl IDIwMTItMTAtMjEKZmluZ2VycHJpbnQgICBkMmU1IDA3YjYgNWQ1OSAzM2QzIDlj OGQgYTYxOCAyNjNmIGU3ODUgNjJlMiBmYzdlIAp1aWQgICAgICAgICAgIERhdmlk IEFybXN0cm9uZyAoVGVzdCBEU0Ega2V5IC0gZG8gbm90IHVzZSkgPGRzYUBkc2Eu Y29tPgoK ==== EOF uudecode << EOF begin-base64 644 expected39 R29vZCBzaWduYXR1cmUgZm9yIFtzdGRpbl0gbWFkZSBNb24gT2N0IDIyIDA0OjQ1 OjI2IDIwMTIKc2lnbmF0dXJlICAgICAyMDQ4L0RTQSAyNjNmZTc4NTYyZTJmYzdl IDIwMTItMTAtMjEKZmluZ2VycHJpbnQgICBkMmU1IDA3YjYgNWQ1OSAzM2QzIDlj OGQgYTYxOCAyNjNmIGU3ODUgNjJlMiBmYzdlIAp1aWQgICAgICAgICAgIERhdmlk IEFybXN0cm9uZyAoVGVzdCBEU0Ega2V5IC0gZG8gbm90IHVzZSkgPGRzYUBkc2Eu Y29tPgoK ==== EOF uudecode << EOF begin-base64 644 expected40 IwkuTmV0QlNEOiBNYWtlZmlsZSx2IDEuNS4xMC4xIDIwMTIvMDUvMDYgMTg6MTQ6 MTYgYWdjIEV4cCAuCgpTVUJESVIrPQlsaWIgLldBSVQKU1VCRElSKz0JYmluCgou aW5jbHVkZSA8YnNkLnN1YmRpci5taz4K ==== EOF uudecode << EOF begin-base64 644 expected41 IwkuTmV0QlNEOiBNYWtlZmlsZSx2IDEuNS4xMC4xIDIwMTIvMDUvMDYgMTg6MTQ6 MTYgYWdjIEV4cCAuCgpTVUJESVIrPQlsaWIgLldBSVQKU1VCRElSKz0JYmluCgou aW5jbHVkZSA8YnNkLnN1YmRpci5taz4K ==== EOF uudecode << EOF begin-base64 644 expected42 IwkuTmV0QlNEOiBNYWtlZmlsZSx2IDEuNS4xMC4xIDIwMTIvMDUvMDYgMTg6MTQ6 MTYgYWdjIEV4cCAuCgpTVUJESVIrPQlsaWIgLldBSVQKU1VCRElSKz0JYmluCgou aW5jbHVkZSA8YnNkLnN1YmRpci5taz4K ==== EOF uudecode << EOF begin-base64 644 expected43 IwkuTmV0QlNEOiBNYWtlZmlsZSx2IDEuNS4xMC4xIDIwMTIvMDUvMDYgMTg6MTQ6 MTYgYWdjIEV4cCAuCgpTVUJESVIrPQlsaWIgLldBSVQKU1VCRElSKz0JYmluCgou aW5jbHVkZSA8YnNkLnN1YmRpci5taz4K ==== EOF uudecode << EOF begin-base64 644 expected44 R29vZCBzaWduYXR1cmUgZm9yIGluMi5ncGcgbWFkZSBNb24gT2N0IDIyIDA2OjI0 OjA5IDIwMTIKc2lnbmF0dXJlICAgICAyMDQ4L0RTQSAyNjNmZTc4NTYyZTJmYzdl IDIwMTItMTAtMjEKZmluZ2VycHJpbnQgICBkMmU1IDA3YjYgNWQ1OSAzM2QzIDlj OGQgYTYxOCAyNjNmIGU3ODUgNjJlMiBmYzdlIAp1aWQgICAgICAgICAgIERhdmlk IEFybXN0cm9uZyAoVGVzdCBEU0Ega2V5IC0gZG8gbm90IHVzZSkgPGRzYUBkc2Eu Y29tPgoK ==== EOF uudecode << EOF begin-base64 644 expected45 R29vZCBzaWduYXR1cmUgZm9yIGluMi5hc2MgbWFkZSBNb24gT2N0IDIyIDA2OjI0 OjI2IDIwMTIKc2lnbmF0dXJlICAgICAyMDQ4L0RTQSAyNjNmZTc4NTYyZTJmYzdl IDIwMTItMTAtMjEKZmluZ2VycHJpbnQgICBkMmU1IDA3YjYgNWQ1OSAzM2QzIDlj OGQgYTYxOCAyNjNmIGU3ODUgNjJlMiBmYzdlIAp1aWQgICAgICAgICAgIERhdmlk IEFybXN0cm9uZyAoVGVzdCBEU0Ega2V5IC0gZG8gbm90IHVzZSkgPGRzYUBkc2Eu Y29tPgoK ==== EOF uudecode << EOF begin-base64 644 expected46 SWdub3JpbmcgdW51c3VhbC9yZXNlcnZlZCBzaWduYXR1cmUgc3VicGFja2V0IDE4 Ckdvb2Qgc2lnbmF0dXJlIGZvciBOZXRCU0QtNi4wX2hhc2hlcy5hc2MgbWFkZSBN b24gT2N0IDE1IDA5OjI4OjU0IDIwMTIKc2lnbmF0dXJlICA0MDk2L1JTQSAoRW5j cnlwdCBvciBTaWduKSAwNjQ5NzNhYzRjNGE3MDZlIDIwMDktMDYtMjMKZmluZ2Vy cHJpbnQ6ICBkZGVlIDJiZGIgOWM5OCBhMGQxIGQ0ZmIgZGJmNyAwNjQ5IDczYWMg NGM0YSA3MDZlIAp1aWQgICAgICAgICAgICAgIE5ldEJTRCBTZWN1cml0eSBPZmZp Y2VyIDxzZWN1cml0eS1vZmZpY2VyQE5ldEJTRC5vcmc+CmVuY3J5cHRpb24gNDA5 Ni9SU0EgKEVuY3J5cHQgb3IgU2lnbikgOWZmMmMyNGZkZjJjZTYyMCAyMDA5LTA2 LTIzIFtFeHBpcnkgMjAxOS0wNi0yMV0KZmluZ2VycHJpbnQ6ICAxOTE1IDA4MDEg ZmJkOCBmNDVkIDg5ZjIgMDIwNSA5ZmYyIGMyNGYgZGYyYyBlNjIwIAoK ==== EOF atf_check -s eq:0 -o file:expected36 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in1.gpg atf_check -s eq:0 -o file:expected37 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg < in1.gpg atf_check -s eq:0 -o file:expected38 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in1.asc atf_check -s eq:0 -o file:expected39 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg < in1.asc atf_check -s eq:0 -o file:expected40 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat in1.gpg atf_check -s eq:0 -o file:expected41 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat < in1.gpg atf_check -s eq:0 -o file:expected42 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat in1.asc atf_check -s eq:0 -o file:expected43 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat < in1.asc atf_check -s eq:0 -o file:expected44 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in2.gpg atf_check -s eq:0 -o file:expected45 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in2.asc } # all test sets atf_init_test_cases() { atf_add_test_case netpgpverify_testset_1_rsa_signatures atf_add_test_case netpgpverify_testset_2_dsa_signatures } Index: stable/11/contrib/netbsd-tests/usr.bin/xlint/lint1/d_c99_anon_union.c =================================================================== --- stable/11/contrib/netbsd-tests/usr.bin/xlint/lint1/d_c99_anon_union.c (nonexistent) +++ stable/11/contrib/netbsd-tests/usr.bin/xlint/lint1/d_c99_anon_union.c (revision 313680) @@ -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; +} Property changes on: stable/11/contrib/netbsd-tests/usr.bin/xlint/lint1/d_c99_anon_union.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/contrib/netbsd-tests/usr.bin/xlint/lint1/d_c99_union_cast.c =================================================================== --- stable/11/contrib/netbsd-tests/usr.bin/xlint/lint1/d_c99_union_cast.c (nonexistent) +++ stable/11/contrib/netbsd-tests/usr.bin/xlint/lint1/d_c99_union_cast.c (revision 313680) @@ -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; +} Property changes on: stable/11/contrib/netbsd-tests/usr.bin/xlint/lint1/d_c99_union_cast.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: stable/11/lib/libc/tests/db/Makefile =================================================================== --- stable/11/lib/libc/tests/db/Makefile (revision 313679) +++ stable/11/lib/libc/tests/db/Makefile (revision 313680) @@ -1,18 +1,20 @@ # $FreeBSD$ PACKAGE= tests BINDIR= ${TESTSDIR} PROGS= h_db PROGS+= h_lfsr ${PACKAGE}FILES+= README NETBSD_ATF_TESTS_C+= db_hash_seq_test NETBSD_ATF_TESTS_SH+= db_test ATF_TESTS_SH_SED_db_test= -e 's,/bin/csh,/bin/cat,g' +CFLAGS+= -I${SRCTOP}/lib/libc/db/btree + .include "../Makefile.netbsd-tests" .include Index: stable/11/lib/libc/tests/gen/Makefile =================================================================== --- stable/11/lib/libc/tests/gen/Makefile (revision 313679) +++ stable/11/lib/libc/tests/gen/Makefile (revision 313680) @@ -1,79 +1,89 @@ # $FreeBSD$ .include ATF_TESTS_C+= arc4random_test ATF_TESTS_C+= fmtcheck2_test ATF_TESTS_C+= fmtmsg_test ATF_TESTS_C+= fnmatch2_test ATF_TESTS_C+= fpclassify2_test ATF_TESTS_C+= ftw_test ATF_TESTS_C+= popen_test ATF_TESTS_C+= posix_spawn_test ATF_TESTS_C+= wordexp_test ATF_TESTS_C+= dlopen_empty_test -# TODO: t_closefrom, t_cpuset, t_fmtcheck, t_randomid, t_sleep +# TODO: t_closefrom, t_cpuset, t_fmtcheck, t_randomid, # TODO: t_siginfo (fixes require further inspection) # TODO: t_sethostname_test (consistently screws up the hostname) + +CFLAGS+= -DTEST_LONG_DOUBLE + +# Not sure why this isn't defined for all architectures, since most +# have long double. +.if ${MACHINE_CPUARCH} == "aarch64" || \ + ${MACHINE_CPUARCH} == "amd64" || \ + ${MACHINE_CPUARCH} == "i386" +CFLAGS+= -D__HAVE_LONG_DOUBLE +.endif NETBSD_ATF_TESTS_C= alarm_test NETBSD_ATF_TESTS_C+= assert_test NETBSD_ATF_TESTS_C+= basedirname_test NETBSD_ATF_TESTS_C+= dir_test NETBSD_ATF_TESTS_C+= floatunditf_test NETBSD_ATF_TESTS_C+= fnmatch_test NETBSD_ATF_TESTS_C+= fpclassify_test NETBSD_ATF_TESTS_C+= fpsetmask_test NETBSD_ATF_TESTS_C+= fpsetround_test NETBSD_ATF_TESTS_C+= ftok_test NETBSD_ATF_TESTS_C+= getcwd_test NETBSD_ATF_TESTS_C+= getgrent_test NETBSD_ATF_TESTS_C+= glob_test NETBSD_ATF_TESTS_C+= humanize_number_test NETBSD_ATF_TESTS_C+= isnan_test NETBSD_ATF_TESTS_C+= nice_test NETBSD_ATF_TESTS_C+= pause_test NETBSD_ATF_TESTS_C+= raise_test NETBSD_ATF_TESTS_C+= realpath_test NETBSD_ATF_TESTS_C+= setdomainname_test NETBSD_ATF_TESTS_C+= sethostname_test NETBSD_ATF_TESTS_C+= sleep_test NETBSD_ATF_TESTS_C+= syslog_test NETBSD_ATF_TESTS_C+= time_test NETBSD_ATF_TESTS_C+= ttyname_test NETBSD_ATF_TESTS_C+= vis_test .include "../Makefile.netbsd-tests" LIBADD.humanize_number_test+= util LIBADD.fpclassify_test+=m LIBADD.fpsetround_test+=m LIBADD.siginfo_test+= m LIBADD.nice_test+= pthread LIBADD.syslog_test+= pthread CFLAGS+= -I${.CURDIR} SRCS.fmtcheck2_test= fmtcheck_test.c SRCS.fnmatch2_test= fnmatch_test.c TESTS_SUBDIRS= execve TESTS_SUBDIRS+= posix_spawn # The old testcase name TEST_FNMATCH= test-fnmatch CLEANFILES+= ${GEN_SH_CASE_TESTCASES} sh-tests: .PHONY .for target in clean obj depend all @cd ${.CURDIR} && ${MAKE} PROG=${TEST_FNMATCH} \ -DNO_SUBDIR ${target} .endfor @cd ${.OBJDIR} && ./${TEST_FNMATCH} -s 1 > \ ${SRCTOP}/bin/sh/tests/builtins/case2.0 @cd ${.OBJDIR} && ./${TEST_FNMATCH} -s 2 > \ ${SRCTOP}/bin/sh/tests/builtins/case3.0 .include Index: stable/11/lib/libc/tests/sys/Makefile =================================================================== --- stable/11/lib/libc/tests/sys/Makefile (revision 313679) +++ stable/11/lib/libc/tests/sys/Makefile (revision 313680) @@ -1,90 +1,94 @@ # $FreeBSD$ PACKAGE= tests .include ATF_TESTS_C+= queue_test # TODO: clone, lwp_create, lwp_ctl, posix_fadvise, recvmmsg, # swapcontext NETBSD_ATF_TESTS_C+= access_test NETBSD_ATF_TESTS_C+= bind_test NETBSD_ATF_TESTS_C+= chroot_test NETBSD_ATF_TESTS_C+= clock_gettime_test NETBSD_ATF_TESTS_C+= connect_test NETBSD_ATF_TESTS_C+= dup_test NETBSD_ATF_TESTS_C+= fsync_test NETBSD_ATF_TESTS_C+= getcontext_test NETBSD_ATF_TESTS_C+= getgroups_test NETBSD_ATF_TESTS_C+= getitimer_test NETBSD_ATF_TESTS_C+= getlogin_test NETBSD_ATF_TESTS_C+= getpid_test NETBSD_ATF_TESTS_C+= getrusage_test NETBSD_ATF_TESTS_C+= getsid_test NETBSD_ATF_TESTS_C+= getsockname_test NETBSD_ATF_TESTS_C+= gettimeofday_test NETBSD_ATF_TESTS_C+= issetugid_test NETBSD_ATF_TESTS_C+= kevent_test NETBSD_ATF_TESTS_C+= kill_test NETBSD_ATF_TESTS_C+= link_test NETBSD_ATF_TESTS_C+= listen_test NETBSD_ATF_TESTS_C+= mincore_test NETBSD_ATF_TESTS_C+= mkdir_test NETBSD_ATF_TESTS_C+= mkfifo_test NETBSD_ATF_TESTS_C+= mknod_test NETBSD_ATF_TESTS_C+= mlock_test NETBSD_ATF_TESTS_C+= mmap_test NETBSD_ATF_TESTS_C+= mprotect_test NETBSD_ATF_TESTS_C+= msgctl_test NETBSD_ATF_TESTS_C+= msgget_test NETBSD_ATF_TESTS_C+= msgrcv_test NETBSD_ATF_TESTS_C+= msgsnd_test NETBSD_ATF_TESTS_C+= msync_test NETBSD_ATF_TESTS_C+= nanosleep_test NETBSD_ATF_TESTS_C+= pipe_test NETBSD_ATF_TESTS_C+= pipe2_test NETBSD_ATF_TESTS_C+= poll_test NETBSD_ATF_TESTS_C+= posix_fallocate_test NETBSD_ATF_TESTS_C+= revoke_test NETBSD_ATF_TESTS_C+= select_test NETBSD_ATF_TESTS_C+= setrlimit_test NETBSD_ATF_TESTS_C+= setuid_test NETBSD_ATF_TESTS_C+= sigaction_test NETBSD_ATF_TESTS_C+= sigqueue_test NETBSD_ATF_TESTS_C+= sigtimedwait_test NETBSD_ATF_TESTS_C+= socketpair_test NETBSD_ATF_TESTS_C+= stat_test NETBSD_ATF_TESTS_C+= timer_create_test NETBSD_ATF_TESTS_C+= truncate_test NETBSD_ATF_TESTS_C+= ucontext_test NETBSD_ATF_TESTS_C+= umask_test NETBSD_ATF_TESTS_C+= unlink_test NETBSD_ATF_TESTS_C+= wait_test +NETBSD_ATF_TESTS_C+= wait_noproc_test +NETBSD_ATF_TESTS_C+= wait_noproc_wnohang_test NETBSD_ATF_TESTS_C+= write_test + +CSTD?= c99 LIBADD.getpid_test+= pthread LIBADD.timer_create_test+= rt .include "../Makefile.netbsd-tests" .if ${COMPILER_TYPE} == "gcc" WARNS?= 3 .else WARNS?= 4 .endif FILESGROUPS+= truncate_test_FILES truncate_test_FILES= truncate_test.root_owned truncate_test_FILESDIR= ${TESTSDIR} truncate_test_FILESMODE= 0600 truncate_test_FILESOWNER= root truncate_test_FILESGRP= wheel truncate_test_FILESPACKAGE= ${PACKAGE} CLEANFILES= truncate_test.root_owned truncate_test.root_owned: dd if=/dev/null bs=1 count=1 of=${.TARGET} status=none .include Index: stable/11/lib/libthr/tests/Makefile =================================================================== --- stable/11/lib/libthr/tests/Makefile (revision 313679) +++ stable/11/lib/libthr/tests/Makefile (revision 313680) @@ -1,54 +1,55 @@ # $FreeBSD$ PACKAGE= tests TESTSRC= ${SRCTOP}/contrib/netbsd-tests/lib/libpthread # TODO: t_name (missing pthread_getname_np support in FreeBSD) NETBSD_ATF_TESTS_C= barrier_test NETBSD_ATF_TESTS_C+= cond_test NETBSD_ATF_TESTS_C+= condwait_test NETBSD_ATF_TESTS_C+= detach_test NETBSD_ATF_TESTS_C+= equal_test NETBSD_ATF_TESTS_C+= fork_test NETBSD_ATF_TESTS_C+= fpu_test NETBSD_ATF_TESTS_C+= join_test NETBSD_ATF_TESTS_C+= kill_test NETBSD_ATF_TESTS_C+= mutex_test NETBSD_ATF_TESTS_C+= once_test NETBSD_ATF_TESTS_C+= preempt_test NETBSD_ATF_TESTS_C+= rwlock_test NETBSD_ATF_TESTS_C+= sem_test NETBSD_ATF_TESTS_C+= sigmask_test NETBSD_ATF_TESTS_C+= sigsuspend_test NETBSD_ATF_TESTS_C+= siglongjmp_test NETBSD_ATF_TESTS_C+= sleep_test .if ${MACHINE} != "arm64" # ARM64TODO: Missing makecontext NETBSD_ATF_TESTS_C+= swapcontext_test .endif +NETBSD_ATF_TESTS_C+= timedmutex_test NETBSD_ATF_TESTS_SH= atexit_test NETBSD_ATF_TESTS_SH+= cancel_test NETBSD_ATF_TESTS_SH+= exit_test NETBSD_ATF_TESTS_SH+= resolv_test LIBADD+= pthread LIBADD.fpu_test+= m LIBADD.sem_test+= rt BINDIR= ${TESTSDIR} PROGS= h_atexit PROGS+= h_cancel PROGS+= h_exit PROGS+= h_resolv ${PACKAGE}FILES+= d_mach TESTS_SUBDIRS= dlopen .include CFLAGS.condwait_test+= -I${SRCTOP}/contrib/netbsd-tests/lib/libc/gen .include Index: stable/11/lib/msun/tests/Makefile =================================================================== --- stable/11/lib/msun/tests/Makefile (revision 313679) +++ stable/11/lib/msun/tests/Makefile (revision 313680) @@ -1,97 +1,102 @@ # $FreeBSD$ .include TESTSRC= ${SRCTOP}/contrib/netbsd-tests/lib/libm # All architectures on FreeBSD have fenv.h CFLAGS+= -DHAVE_FENV_H # For isqemu.h CFLAGS+= -I${TESTSRC:H}/libc/gen # Not sure why this isn't defined for all architectures, since most # have long double. .if ${MACHINE_CPUARCH} == "aarch64" || \ ${MACHINE_CPUARCH} == "amd64" || \ ${MACHINE_CPUARCH} == "i386" CFLAGS+= -D__HAVE_LONG_DOUBLE .endif NETBSD_ATF_TESTS_C= acos_test NETBSD_ATF_TESTS_C+= asin_test NETBSD_ATF_TESTS_C+= atan_test NETBSD_ATF_TESTS_C+= cbrt_test NETBSD_ATF_TESTS_C+= ceil_test +NETBSD_ATF_TESTS_C+= casinh_test NETBSD_ATF_TESTS_C+= cos_test NETBSD_ATF_TESTS_C+= cosh_test NETBSD_ATF_TESTS_C+= erf_test NETBSD_ATF_TESTS_C+= exp_test NETBSD_ATF_TESTS_C+= fmod_test +NETBSD_ATF_TESTS_C+= fe_round_test NETBSD_ATF_TESTS_C+= infinity_test +NETBSD_ATF_TESTS_C+= ilogb_test NETBSD_ATF_TESTS_C+= ldexp_test NETBSD_ATF_TESTS_C+= log_test NETBSD_ATF_TESTS_C+= pow_test NETBSD_ATF_TESTS_C+= precision_test NETBSD_ATF_TESTS_C+= round_test NETBSD_ATF_TESTS_C+= scalbn_test NETBSD_ATF_TESTS_C+= sin_test NETBSD_ATF_TESTS_C+= sinh_test NETBSD_ATF_TESTS_C+= sqrt_test NETBSD_ATF_TESTS_C+= tan_test NETBSD_ATF_TESTS_C+= tanh_test TAP_TESTS_C+= cexp_test TAP_TESTS_C+= conj_test .if ${MACHINE_CPUARCH} != "aarch64" # Hits an assert in llvm when building for arm64: # https://llvm.org/bugs/show_bug.cgi?id=26081 TAP_TESTS_C+= csqrt_test .endif TAP_TESTS_C+= ctrig_test TAP_TESTS_C+= exponential_test TAP_TESTS_C+= fenv_test TAP_TESTS_C+= fma_test TAP_TESTS_C+= fmaxmin_test -TAP_TESTS_C+= ilogb_test +TAP_TESTS_C+= ilogb2_test TAP_TESTS_C+= invtrig_test TAP_TESTS_C+= invctrig_test TAP_TESTS_C+= logarithm_test TAP_TESTS_C+= lrint_test # XXX: the testcase crashes on all platforms, but only on head # (bug 205451) #TAP_TESTS_C+= lround_test TAP_TESTS_C+= nan_test TAP_TESTS_C+= nearbyint_test TAP_TESTS_C+= next_test TAP_TESTS_C+= rem_test TAP_TESTS_C+= trig_test .if !empty(PROG) && !empty(TAP_TESTS_C:M${PROG}) CFLAGS+= -O0 .endif CSTD= c99 #COPTS+= -Wfloat-equal IGNORE_PRAGMA= + +SRCS.ilogb2_test= ilogb_test.c LIBADD+= m # Copied from lib/msun/Makefile .if ${MACHINE_CPUARCH} == "i386" ARCH_SUBDIR= i387 .else ARCH_SUBDIR= ${MACHINE_CPUARCH} .endif .include "../${ARCH_SUBDIR}/Makefile.inc" # XXX: for some odd reason float.h doesn't tell the full story about what the # precision is. CFLAGS+= -DLDBL_PREC=${LDBL_PREC} .include .include Index: stable/11 =================================================================== --- stable/11 (revision 313679) +++ stable/11 (revision 313680) Property changes on: stable/11 ___________________________________________________________________ Modified: svn:mergeinfo ## -0,0 +0,1 ## Merged /head:r312008