summaryrefslogtreecommitdiff
path: root/security
diff options
context:
space:
mode:
authorEric Biggers <ebiggers@kernel.org>2025-08-09 10:19:39 -0700
committerJarkko Sakkinen <jarkko@kernel.org>2025-09-27 21:05:06 +0300
commiteed0e3d305530066b4fc5370107cff8ef1a0d229 (patch)
treea0c27772822b9234c1d01b986134d9d8ae595376 /security
parentfec734e8d564d55fb6bd4909ae2e68814d21d0a1 (diff)
downloadlinux-eed0e3d305530066b4fc5370107cff8ef1a0d229.tar.gz
linux-eed0e3d305530066b4fc5370107cff8ef1a0d229.tar.bz2
linux-eed0e3d305530066b4fc5370107cff8ef1a0d229.zip
KEYS: trusted_tpm1: Compare HMAC values in constant time
To prevent timing attacks, HMAC value comparison needs to be constant time. Replace the memcmp() with the correct function, crypto_memneq(). [For the Fixes commit I used the commit that introduced the memcmp(). It predates the introduction of crypto_memneq(), but it was still a bug at the time even though a helper function didn't exist yet.] Fixes: d00a1c72f7f4 ("keys: add new trusted key-type") Cc: stable@vger.kernel.org Signed-off-by: Eric Biggers <ebiggers@kernel.org> Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org> Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
Diffstat (limited to 'security')
-rw-r--r--security/keys/trusted-keys/trusted_tpm1.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/security/keys/trusted-keys/trusted_tpm1.c b/security/keys/trusted-keys/trusted_tpm1.c
index 89c9798d1800..e73f2c6c817a 100644
--- a/security/keys/trusted-keys/trusted_tpm1.c
+++ b/security/keys/trusted-keys/trusted_tpm1.c
@@ -7,6 +7,7 @@
*/
#include <crypto/hash_info.h>
+#include <crypto/utils.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/parser.h>
@@ -241,7 +242,7 @@ int TSS_checkhmac1(unsigned char *buffer,
if (ret < 0)
goto out;
- if (memcmp(testhmac, authdata, SHA1_DIGEST_SIZE))
+ if (crypto_memneq(testhmac, authdata, SHA1_DIGEST_SIZE))
ret = -EINVAL;
out:
kfree_sensitive(sdesc);
@@ -334,7 +335,7 @@ static int TSS_checkhmac2(unsigned char *buffer,
TPM_NONCE_SIZE, ononce, 1, continueflag1, 0, 0);
if (ret < 0)
goto out;
- if (memcmp(testhmac1, authdata1, SHA1_DIGEST_SIZE)) {
+ if (crypto_memneq(testhmac1, authdata1, SHA1_DIGEST_SIZE)) {
ret = -EINVAL;
goto out;
}
@@ -343,7 +344,7 @@ static int TSS_checkhmac2(unsigned char *buffer,
TPM_NONCE_SIZE, ononce, 1, continueflag2, 0, 0);
if (ret < 0)
goto out;
- if (memcmp(testhmac2, authdata2, SHA1_DIGEST_SIZE))
+ if (crypto_memneq(testhmac2, authdata2, SHA1_DIGEST_SIZE))
ret = -EINVAL;
out:
kfree_sensitive(sdesc);
U(\ڬƕvl[7 }/+~kY.fW BX=)B;9o,=1~W-Yq"%:e.F8pe9́G?7@0J2jpF |/%h}v 5\]UUR\#8.M^w H8mj \U颯\a1`*LQ*>8c5bH?§N'=SF?Oya&@щ])Icho1-DN_ǒG1P0AMD 0ׯ0C}[?,?}jXX LPT ]!ovJby h(j~Zw2X$2P%9de-5|,d415I0|v(`}}x `&>%F1 ﴦnޫ04-¥fP ~mi7l6vdh '!Q+Q{da7N)Y+J=8+eVg$[αӦ\n"5ugk.rs>&E&QmUQ_蓞kyrsׅI]a~:gkL2uc^-M{Uey\2\g;ZVo18I,<_;wx>~H*oc;G3Vr|8KCEWEQ8u6[gUu^D uMXWJ ,NUZO]v>5lV-v rsUw^mo7ߙ7xuqHRad5X]]BwSQS[mDs1cӞ  "$T.XT>FC헜{4}QM{sqZ'D/L>=A{l{&p= ޺]/[dMJm0 0z1 ;q C=A7޼l?s{7[n,9h\hkGe^I/ apcudEeVD ;{٬>f%"~O Z>'^y)reۑmi؊p"`ԾDip-8/.*~*!T^{M]SxU3Lƒ71; y;.msG y;Q8\`Kr/{e[xt"0ҁ"pP&-Orц5^h+ Ok蠈غ}vP4SN+_Ju@1QZ~6ͻfz6u,دz89pӜUYFEi~@:zú͏ϺUٵ?wk_64tEgyPl5:x, u[cMv|>eF uW}T. hL`v;]U]Ѫ|m-݈igUX|e<=Kz3ףC8z/ hL=>}{7 X.+W]uWV^ʨuYy 㵴cK81v{w 5t-|C3KzmzM=Nc[T>+zd?ڏ%1due~Mtgozy^ ¦&jr݃XXe°vȅPɧ׼[.>f w a{2qyL+^9B͘Oа? ] e pm ^uͶDٌzlpi@gB2=gb;~oa_-)*Y ˢoW{^':rv5XlS*(ׂ8dtvͭq՜7b>7WuNV|p74kw[^.6UީU?=|z=xqR6hVW-ԅj//9ַ}LS-5xXUQtk+7cvߏ7wH]9G>svO'֊̽[&s{HĸG&0h#n({6g02pj2Uk%08 rK|xM&mb#f>i.tsk BE}G"1hzY&p$31S⇬慁;z3p՝t$d5Rz<98*Vj`qى{|xrZ)8яq1¬\mn뛛cH1btv+8U1VQËF*5`UӁd YUmmU[mڪm9m+VT@7\܍"8dU-̢cn۶նmUUۜ6lpUWvUm(A.^3tW,9&I3 F8F3>] v9k7 I&#z殜qFr8䭮:YibI̖ej(lh>.S`869wE)-ٲJ.Yp+J8ӒSU9",wds;uż)7ӛwIt!Hx5>EIwmmn/crI_ex1$Pi4^(A(?߿?_ uN8aľLaBO~iEZλ8ԋ݅JEO?Ȉ.,&SH `3A10DL "UpQ,cȘ#a ([#?=nK! % &WyĿvK L"~QfE&'2λ>|XyE=xIa qIl2U 2([Dbj` B6!_v>WЖtV##(¡,e]^ˡڨ~}~a?VS?1AϹ(*Z.DO{@G7efC­ekXKtj` =&c'w8۝q jrk7p$Nv_~.v2Ґ~>syQ\Z?YdB6D)AT67$QRW-jFJ>0ahRK$)7p?VtXaLY{ǎ:l'T(1BȔ|v.:Y7;Ί$qr$_ar XU9( {@h}$qn:#-Cx)'_.򯿳ߺnuD@ v$z uˇ|3+2(+!p \iQpAZya[$ιW!>'i_ol>ϠFr0։"lB?kR95o=Yq-H1*+GW?_>9>8s.}IUJSTo:ض$D6j6̝M'2I舽5HE5< E l"mJ>~ޘdZ}C] MRPs,(t` !xaYͧFsD)c IL^&Ȩ$UVxx_}a S_LHyUg/1CգߦQw#w?j mn=lP잓Ia$/s0ڒ ʈ1(Z#}H4x ؽziۯ%ͳosnbohP=yȠl۪r c|pL9ʁM`QjӳkMoão?h3Ɖ?[Ƀl" KBji{ ^yͤ}7*'YFDc1#<'h݀S鿞eR Bvo臻p,)eܶXe5: u76&Oϣن](TK9?@?04۳2ZbX'vu1[esGvxnLQ߄4X([+wz|so1x;A|R9OD-֨y DeW{.^ZАy.Y%E 0ׅ ~5h" 0hR1!(B 6V~mPF&0*D=]#m3Fe/8r65PX qRSPVֹZ,Yb2`,oDw47Le2&"ߤ\Ż&4>~xfgbQ7[M1NCK0<B(C5CQ0^@Vz^ $N.+|!.l剖1 )n*{L=^>a?uбi%U/Vr&ze?%pTŧTcu#He٣x≃$~q r$,aZSGKGUuZ~}>v#d; Y,|`@wz0*.6rt7_W.L (p4 ͫWN+k5p/$^v06!Yݝ=3-v'GV\r垚pvs׷e{gh"Akj^TilX:͝4C,ig㕫<ۺV٦ɍW:[VE/ݑ0;pSQ(ZZ_MW[ds# MyZeAG]ϼpO-P~}KWf|Q|d}3p֢`&2 8sͦ nŗXW-t6ZC奿:xn.( o$B3x}`]~^vw3y]϶Iub+9DGWzUT2H)> ~ژhR 3tfOFQj盈[{)5t6\#0ʡ0O,Hz$p>߳{pͳWTUEddsͅEѶsjhs珃@wޅ1sWҟlQ>+r㳎@{'Q勇˜5sǁ!"(4nQ1%w4,c!y۶O ]2ґCYezS #{Hüzff:)Pmp i/ K{oNv ɩ`Z-gö"`@ a<w*43h8A!ry/uJ㕮>^Y-.t6x<#Ջ'8ߏv7 .U;oٞz/ǵ y΂nAi[)G'js9s"(1ה^Wy&̾jj"Axd@ 쫆8+Z惶hPp$A'dt=XKDNŜdG֔Cʋ!/StfAVVtsr}*`Eޕ'eE l-֍B:ǞNzNؽTgTKR9H>g;wO&ǹZxDșYN(G#jքoAȜG}!䕹st\؇,/js>^FQ5n}YtSܬqtpqѳgϜԃvFcg%36@+խeB1@B?DzїT)즮}r/'o0V_fxB 7m*3L(@8;Bj`P1)/sѷN]WκS8u9):1P0>ҞšҿkvL/ -(nl|n3}d*8D!;dpA[d/Ydb$_.q0#Hsjs^8>fb[HhL*| gk mۈȌ⪄)h,y*< N _ j;{RuS"(/i,h퐬SPl[ŨVAH Y2!m@#G\7kHh+rǜC@Ҩ睜TuX*hq9׮2,DU(Sn-\u)eyˋkؿ,bq8oUy@Zs-"oFӎA5YéPoςn>/䞳 !})0SZ-hmPMW7ܜpEk68NVA,C\_e O@NٓϭYͥ?& 1rn!rw+[Iex?}LJ**_ǹ,>K:yc}Qkѵߩo:u0z"NA[DmIk+ŽxJ caKG'Lk͂TwV{h(vrUYߐ6c6? \qDA2@5%6G8${e] ੳҷച騋҆GE_t^p.Q;'ݖwQaCêARAtZ;?_;DOZ9[ CJ"V@Օ2…Zȧd-Z$ 9VzBH4FI$>0[ل[ D&)'/~e/B w1:urHX@maw8q;v3dFps~+Oׇ R۬~x#Aז/Ry{;cx=GЉR\>URJ-EsP [5zܫ]Ѽ33sCezwXZy];ַ8%&֥ROm&|yqوN / J& }9!('KZd7 .b4Շ:~ i ?zc1Y9vӂ i} |z ѿUXNx9S_tc" ͌Z:\XVm {j>;CItf3cAդqO^W4Qt f$ _UY(w0v @[&Buy< -cZP0jBsVu9TLi,W0 _&> _!|9aR#3B!H(]Jc 3l+Q@$BzG"~-M׭7oߌI|v;\V abN:ėDfgUȋD/ַ: AܙyO`HရKw`r^aA*B_9\RGt"@D ZzIc!XA׋7x A@y}9 _q@Lv"p:aN5>׈^97m B>x_!h. }; ]/Dm^]kܖ-&T6A"*Dx"AJ}h:۳MmHraipDzsY_9`/h']Yuf痧jb0}z7 C%H)Ĺ>Ru޻n IG@>HdWxf;rB:ߣ>0}VsGFIzp, a􁋿MLKjq۽̔cjăU6L!EPe(&![ـĜwQmsFȍ\}LWjp i;iSǛ_[U95I|Ȏ#9]˝v!.ԃMco5lo6em!2MG 9ݏ-yx`f2L_K&eT#o+>|*'M%\r_e=,-C:2E>s"W^ = j0D=CLk狵 C˖@6R* aE PFUކjn3" ^wzA?H `xwp $=`}$h$CEQA8nXK[)_?ðyPjI;SZlĞH!T2$!&*0x=8CKzza)[ wN眺&zJ$?&ϯw8cbM*&n_ H}'Pv>^{>gS{Q[JJXկ ;T b]UG&y@Hs*A9zv|{{x`W AeLHJźM?4J\ECqOx,8 `@GW˸WGK  *>͞lLN}֜H'n:pUӾ((ہA;5s ߡpu^U cc]`v|fj$6pX.9|:vwם[.0_fpe tS(u[ٯ_AS>J`|dmK\:\p4q~?~wn|!{nLhC4FpQ@#"7Hڥﲛ>onM:&mL"}ܶk\"?74x=\6JHPnOƶ6hun`ۛ[c|opЈ2MԛM%k-;y8m;BU׹Ҧ vF5lVJNnXpY(4,llYmdZJ FaH3Z8U"3^ _1C2nv֫ ͔%ı}kNPع# _}=S).5V0K 7*K I H:y-wfqG$k!ӏwEr- fgRgp>dѥ8Դ';W'Pby8^C~S!%.Ǚ)MʪqI0w`-.E=xn+5a(`%?Ł(5$/R ^CoF3uh:;GC9׉C4l3V(|'5ӻd%3 \WpPn8.yŌqY:Bm]I-VPL#khUqixC:=i/n)9w?uf}q隻5G=-IッN˰~ԙuOrCx'*6T!8ǢaAkX];bk HUA$0z B ڿY󅨰iRj鰘@uL00rsgDg+(RtCHI3 i!z@Ok,TC@fX-5OY#B>y~L,z< Ē2| ŽNbGe>>Zq6{ƽ=N8٦,:׋S3xdx Krj1QYYtJx-EK(Zl*R|1FG-xxc^_g̣=_rOWF1u5sW Hs;qr>LM*"pwZv_I%^[?G764`PnPđ*PxH *OkOرXG*ͻYHK^j[/hcrcfolȮ̿7gC`[K0eKSA0) 7" {Rqa MZ[ʏPX0*Nq{|3:wwWll j?t";6n mw kB3\8lug?FOu}#p΋ 6X^ow"ٸ-Gl ˝BP6"i4t.I!O)B%LU"BaJmtLZO}.-K ;UE-VwAmw|iH<ۿ)Fq3aX:Q tZ J5 _H" #*O9Zxjh 5I'é-2X{_iu]W>ZvqivmzD_[AF`h!GD:nqBM/k )!-a4t@> +ʄJǤTiΪŜ\27f5p3:Id"(q#e% دas  ppV>"cYn WwR>b}G=r2kKP TA딨 `@&>T7VO??~)u,0m;v[;|fC?) 󛓤\+߸EJST23ʭa:PYdcs;|yL3 7sKƭdM$EՙAz25 K f$OsDL'c2F뷼 8  (,?l'4kW[?k+bÑ9ߕ9Ӿŷh|Ļxé*hGo8JW]$wOp?39ʨT«~;Q~h1D2v$\\h9mBa)w1| N6Q(|[DFE^ Z8LΒ*os $Kj)'% |NduXi0p>`s{L'[IeR)уfiebHtSͅD&VPEr u-ӛ ˾Y-\1 ? |^rPiԐ:^)_f+f 5NͶ]t÷gp[>S1%""$Rq%EQQ,Rԉ#ą, "V^4 Y Ku[]X,G7l q1GXijC5j\di#ӯ3-f5.)- ƹWqJ$hz֎=bu8wN23&drf+OOOZ-3I$nasr;4="5;lH@ #`2UqXpguSZ~&Ǻ#AbH*W; ΅<}:#mjhI>%u$7FL mQPö;C/] Ed-yK(!;<zԕ0?L,tx;6e /T43Ys6KQTA2Ϲ+.lZ=çNCk^?VaWYwɲ;G1b;B ;YPEەb:G;8abJelxhAyUkזּetLu`q2S(Uƍ,d;lNUՆ)zUEqB [n$ec; &QrSyG$s*͉LW`Zod 122AfˣM;H3;EhZ\g3 nѹzqT_hU є9%nRpAJ=qiAY'5bԗB=trsh&yb|(NPx^FDnDFբfjXM; &tJ8vN:Iq{~7E%%T4 ZdY!V*mMIAbB/7g# 6G<u]2A~h~(%1{="f2W2@łȅUmE"C?1ý3 #\ðEa$4JT[&RYY{ Pqn J[M.)hF(s0"@ctx@= ,"ZDH# UnWQꟐF>΢fkx["DQ GGp9_T]|ȹhwZ3t%$p@7+L~v0~Q]bd8,fSeUr9|E( +E0ͫC.QˢAH BVU|ǜҠcP90%V ٻƟR*'e7niý8^X(NG1P5.hsxA XyN^KQ'}9Fl"u?Å0d(68z]L#đ~C-'m5ލ.2ת_(U_љQHCлNbnӬ{+G7vݯE]e5 |dWJw0|s'nE$ѐ߽HB!?/F X:ޔ6g}wXMPGuzpE@лNȭb@z^уZM PIhHI?3ٔpw^gWJ!P۾A3"?J_Osq׷/ͻ!,bfTyue1M;^"Zd?Z:tͳ%3ٞ\gڟJ&Aor]]VQd\?*ybQ .D ͨ?(u*~m)dim:Rbh#(0GyAw 8{- ÃhP{t fCu\Y28/@0ڢ_UDy ˪Ya9_*;91[>9`YW.I5xo?Y C+R#Ω'($^k^5ac'XJ#أXGo ¶צ;psH^x۽*imgyYOfT#U87B|GAY_BzWO 5G.ix9"?7Wġ8פcݹLo1z?T+yb/EY1wv&lDڍb ֟՞80SqKjj|׬$QhU'x-ҟ1sQ EGXed0T,]^[U&B)Ghl t/1bċ?"g8* nH6Lχ8H ݏս-u}X9& YR @&C&}P_8=9:U|X֭y=l,ïsu<ώjߖZKY,VS׆;VZ;s[ pvCkj-47 #ҜZ::|5-9o9Vא!RzPaZm.͒O>G-\ Ps޽Ps4siz']7uh.K͗Zфgt:u7R?'YfAmi90Dv\ W-:;IP,d$u36%玩 s`"(fOpTBki= @KCTjsU$.q3_uB|gxΧ4'\mNkocS,h$gŠHuFӸ嶍9e_tᓂ!n}z]cfhFS),%לOArh6ybыN.s;V.u#ˤ 0^d)~|"Sw![u+YI&+ C:"@zjMb}!;7!HqO?<>q`uEJI6G m0&x+(?raTR<]c\@ӕҿL ̷+@\ \.pCV , /vz:a `OH[%,zE-Th{ߨԪ∴78+Y ~$;)7ؤ(^j17Gkref`.z~rnc3]9J1CU,s:!rI4vYJbBQvb}4ґ[oujlk5{ DzLAGكEլSa0~8ۀ=xMd12S~K9|5}:Ba:+1bI,@UnoBK:F ⷌ@v\Ɉz<;?L𥶣o#B./.d :f'v\8aX3 L+0QD>(p>cKU $K'P1ȀƼOMع@pKS G^ȎmoJ܁pvQִR4o5Q캀xL-UZ*0|yxͻ/U Ty}]Wz,V ۲(ܰ;l 8РD)`12&]Kc҉@Jnd_^bZB&A87k߲K@u'5|䕞4}">u?H m*vv7ci@L^G~_$[f4R GFGkF"|07g鼖pYCk~,T\6zo F zDQQQ T_{I| PӨ652 VTz5I4Z 02F1 ՜ F)HcStaVA*H{R{$F.P[UůnŔrDd!DVcƞ%xQcëO%ϭy-q2^}2Dv>DžFKT3ZC,funoC0{z ~k-@+7BW%w$!#x;wau߷d1:6J`tO )BH#}},뛑~g?vMU}'fy wݗdΪ($>"$^V *i|ʡ *859/}RܩÚ`YSj}T>CtTI4TCIɳd uE5 \&-QyDq_mh-A"{PWB-cȎ\_OyDW_ |`9 @[p{rZ>B҇f: {C.[tA3J?5e_n(8h]$P4M?wqsg ww>(!&脈xnV3o B\9.R_IfLd*ޖf!$5/njVe،K8$BUEq![TeVf?#db\`Y,`FϬrێ+(\ Q2ux0 IT_Y%#@mH& \Y++ս1#H{0qdzi~&k~u|`X9BLFH_p'L:V#tsM)GGǩvՅ :4}U/2"0d [ZYSg퀂5 k;53Xv~wOgoC e4p B4ocB~y9 oҒy~0aL#UN4$lBk`}6 r%dvphSOY$dr6b2G(={*1O\\C Ez切Q6w.aV G-v2y) ]ۨ DIq$G{u~9ݱ**Wa77H\\di19Xf||`-PGg=S3c`\nXOQTOtz=$Tnp*\2a), քֶQzs/әD0fñt{vG7?Nިԇ#g"ͯD>|C 3gZ48 He.6|<Yy$PAگ9I?(<}p89B{Nt؛;&^0.$)D;؞̎䲄.B)E:s9M ؅ֳ`qކ9 s1֕o()'Bf_75C-vy? W*5k_DՊU̦m]:m&UUpAeJfڴx{$ʏ21U)pSso~Qh_P!u!еY"]ć_hP{ ꠂC< qZ:81@)%]| 5G5=YTh_[Ta~,j[W߿!YuSgX$vĸJRcND{N.ƃ9e{, ڎRl> .| dw'5 Œ"v`]'õucf^5n^ELMBArh,pdA֚s[Y M~ lY=bA!DY&+rq-HJ1KQ:H+uև-S@/~7PS9A+fȏ1 -$;vS &1ȥR")&Ǝڙ]d7Mf+S>5-')!dϗn8d%9~\8YxBd!Gk#etbz0jR '= I'=]!WbZ sspNs-AzAD>L`eآ|y'WCeNbȓȝ,kHnݲbH PEppUfS 7H$'s8+9*ypSzܢeF:oZ[@3 KzODp fX~rY>KDov8%0F@9|9x;"hkkOeY>\XԠT0' UgsEkZQI!j% &hGK|_]፯# .sSݾ=s;\Gڏ "jr`6JY誶YW & `Fzc o7y3 \ݏFTxI_ڻUuBӑR+=JfMm`{B0%K%L+H# `4`]GO"OdIS[p?yYc742;3\_n[H"Wfs Lmp}4b`Id"p<=UWNI<1rC[^˝p~ Ys3&\c5n?o''LGB_Q1 '(,aN _Yw3`"~|5<5:E)jw {wgZVTOb鞕{'7m7ݾxBL:3)DȑbC YExPTcQk$qAbXk|E:dQ|)M֞Pv:}S47lS_a| Ac#LJd'Q0+w>DaZh嶥'Z" hY$[]B;=Z7R:[`uPw>o:&)5EG.$3 8Ex#J5J`36SHq*.e澁N6^jϽEkfwm# Wf8Q~ NǮ経K;k~=NN9*x'it,Lg,_6G}͒.YTzXrWkax2#/ɬhisxOw" ? n9Sd"+%Q %n;8~8E ĥ589TòM!9*-"(vɓqF@ 4!+7IA5Sַ7~.{0l5G9;&)\.z ]|=n״3lb6=RlK1|>v~h-,mNDmWDD~צ9!+iHo$kJB,2 {T<vpYZ_ !?gѼ+s٨#J/hx,tk'+43lp2;O=^eGB'.Io jڽ( >vQPk أF]/):;C^W$!@/"#>'ӐKH<~*tVFޯ  >d_:7;ʛyK^-7,ڇUcCJ vڒZ4jp+@MA?DP7OKWH\/r oc] $02pAkL;=L/%a}T)BARxI({OmOӮPd3z{VKCE\cuOp-EWMakWSɹa0[$ IM &wVߨG)O叄\^|oU)҅6lY>ZF,AQf q'XSjX?Z -U vC+ċ/@B]8ɾ\ 襉At(1IN`sK(y*?/[2b8E#^v%mbAmQi r~,ξ.'[0׼Y^i1ʩ=k*}`H.t=EX1i]RuX= H/!ЄsJ47i=##y7;B1&scQ82HsXt"ڊ( A,Fd][&hfsr]b&_#lLvMoL:ƻ{S$f\ګ9=egY0ZuWR,O(vYYX:Y1CqxNGW UT5_hgnO/p"Kk\%{?.rc``rt 0blUPjfxtYt/?ͽ~Zu;'o$8 4|IUIFյ;sx&W_ i!C&ù k풿2"ȱE!|(~m5wqבQx<.u!R3rzNL "a5\s [C#ܡ,P|(?s4 sw:Wv{G5k%"/@P"/ٷ#QF8D 9 6?]"Ƀ[CK+5f @Gr޻:7AcE2߂)lP"Z"XpPƜNzC W<пD췸If K`:LԵx*Ó$cjP0"l*)jj83A]++`;5 QF!qWR+|Y; g3Wܩ}Tv={L[;0 >&0R`b_S4󨈐C^,w*f{>QR}<|_B@|C>󣁱!"{ut$oթ<>˝G 7\F!@myqUq?pv҈j53I?=ۣYC.V.P/~* Kj!~`>B\ﷻz,et;rR >0R3r0{]Q ,}4Ɓ`Sjh&{`;<|m{k4MZ z#"|>}v,v-qO,J99hE)թ8È_(1+o[- oP/ 0h)r9?[Zt i @b%@FO6nKO)43Ճ n/ DuTǰiKDוv;%y ҋY*18nQz}%c ?ST|wu$oC|RӾڒuN| !GN\<."ӧLS忹d}`Udb1&HҡlM3]JFZ+k(}t%3F I(ID(JU s{ޭ{;T]ȁ=iHHTCYry}>S=$:Vw4у4.{XC5iv"@~f##~_C+,jvc֤ϫS TpATsꅣ鍱 _a}N;ChysJ ҤлĕV&E)bޯ ju(kRTH۾ SUĴ;{ɶ>3냡}4L ӟQvJ9#hlA5;$l[oG՞pv I',k$i3=NKHI!YӾepݿӫmC0i(t]I2dgHk!sS0? rVkffTj0zIf=҃?^kLMY "OM\R\JUc:g|۽~[xD4^5#D` p] *~#B133 +Bibp[ç^1{l /=-^iX ~v4Fbr{4( $w\>VUV^$L>VQ@ FGhF( (BԿ!]q xUvp1DrSu ր$rd0 =om.TqUVGDmAV$ ݜsc M>$1/whp*.W;7Cϩ)hЎO?rf>~mB~\9N4?ș11.^omBĢB \zwF J;`h'U%P =S>,^@w 'f+yHcswm5{0|Sd#Zlhi,`%dnm,n؆Kdcta0 oj#L:p 1 14fr^^M$?Ne:ơs0W0ZKxc5p5ٍ=(<Jn/]LT tj5C0~u!vi@Pnx(K/+c RRAϒR1TyJWײ>8d^ @z>$mvϣ.*$[,uz酄tp},88JlrW*yXe2SU=d$z.`%J'Q j5: TQԢHS&DYO|laGV453T /8 Қ{4=q )ztQo "M Xy~'%ϛvMzR;6|6,jO4|ؖM="xT(I>O?":0u{"/—=Zf\z5;~L2~UQ]|f[nrS>F`4H1L(8_d9ӏٵbtl=ݎuӅLJ9LHk:!}D&>'j66_m\k~/~b}s_fhQ;(*K"#iE]?U?g wiu`{=ТN 1RD,"X #9o  е-thoа9ޫø|wZ>>53siу,Nԓ.^>W\RD3|)QΪf 0aEhiL9s :H0- 89gJq0x@q!jRgjǞc0bws*ڣH'!}WZj` <\n}6u ltL,QN‰ݿNk9~JXzr821u. ,Vwiz8[xZ<Q1 (o Rl@8 0نtj>C{P9Q%xuRB`0ta6t$Dל+ -yTtȏAGCPPmS-=Zy<39~]hW@)@.gathn_ ";t-!'B3\v@yxV5 H u.9VJ7<K.J4_ML.Gv^^,.Lۛ_A,UAݷfG ?V[ vȂ! /s/qT6!lQ>c]؁r/MUw.1l:!b "nc u\ECy,csm *mi0sӬ qa+ZGE+ݙ9ۜ.9Oz~<ǝ_`BLQ ;;}bh,y9뎸j83ϓ;F{?# ɮկ-4ߠvT5g]^eULVf:7X|n jYk |`M9`ꗌ2R-uJ˳|'rir>S&4nWks/liɔ'TFw36Lѡ=[5mePqvi:GcГhx! 5٘"qR/e:3޸YgGKA[݉qǂb!hgfLѴo/1;+tor[%R$=ƤЌfr^DcK̚xy\/E Rw0D`ziQ¥m >4Rն5y6IN*;wXxDaoaC4{<٢\psnk}y5!f3dcL2G.ǥ=_VqŽu]urqFj>v>T<v@K:[\/Cbe´M^_.D70=X1bD$FJ1ŧé~D]fG8~61 ܢuXXtHUqY}g(&$2POVF-i KELnVqM`{Ec=jˇ=$ @&mΙff7j"14?-;Մvw5(5U5isj#@NɻR}Hz`y4>_ ;vM'ߌYt?ɫ~Ɖ8y^u/B/xku_ᑧB;toO1*O-П,ЀQYkapWTv8W\:rڼ?{9%ͩ$2KXU_!-i\_pP v=vS\а# RQKJ5jKoQm0SтImm6A|S3}W8)Iv,!Ț0W3-Td<r j~-,T33De %vSLC}j[ MGhewBI /3bJzcm0T̏YH$HWq?8~̯gWPO^*1Fn\F|OpQl.+ ͚h F>ɸ936_sbz1Iŭ"UQVLI)QqǷ76/ Turˑ#?oluΧ"a碼Jڏs8|nM?"h:mhwG?Iתol@Q"&2G$LPgJIҏQxAG$,^K}f;Ds>6b["kopWS}搤GY3`w_u?Xz'Th%tt*ئ?J1D BWaMY&i^Qi}7@]{ЬOudu B<\zZf{:9,C}%s~o`7p6CU?[ P}aҹj-Pmt?z)Z{J!hzJrPM${uYw 3Glʐ߬mx ئ lA_Pңu J ue3DnZM%bu(y*.[ڡMݴ OPCP6%>(=Jrӹjg`AQT}!B9{c'+ZOMV~Gsf\49R8 623̑A!X|t9|:KIVYh7ۨdG kU`FZ_mmYpr 0*R {Xm 51tЧ~1oȃcc2^9rGǓ'q飚ek{.{i*E"v9ӂhC!Љ 6j$Q 8t"DJrחsgSj;X\"`W ?{@ \ ,2$a?keΣʅ>'̵[;?7i.J'CT_3yG g ")CvfZ±SbSolߐba)T%?ǗܣďjL کH2C0lQ%8^XWIʪ &2P#=L7YJa Ü碐l1gJSFQX!8uZcYWgEu&*D rq18d,gFø(8+ils5vv鯲ǚʙVEJ4u MH]KW WǽN; xs&BFm~,QehD g!]oirQ;glxmQEIAX--}{f^[7֥ukmI:pki4owpX?F 7k8JZ"IV O+}k.~0$e^Sk|5"  D Us/{vAE[2֋rz]:;/kGrFCFKuK$ nFS:`#М3*6Bb  b b­f :!7S;vɣtuP^,rSS1 0xm̐laAB7qDEk'KB֋gܔv $!>/qVM׶Jي]6>$vA 65QD/Jw ƄuBYVat_~+O~R˄u@ܲsX 3JɌ>!M&x꿥RR-<bD/;{*  FKCz\ % Z/<6Rx=3 7.D{ S?0?iky^"dv'8ʳ)&#EՎn;~gFvɌ@V%eCEs{?QÚ>P!Z>wFkL10\6AEYlCj> /V@U f2tUw?挆9Dou{J#'+&CްNT;Oh 9_[/9hMX&򧟝Ii3R-C=k'ֵZ|\lM翟: \Vn[Ԯ!akƙv9/%L;ڠ?oK޸|/Lx G<'9g҆c1yE_ո--Da,˾;ɖ f1z%$uo1Jwwj}fy $d&|vu۔Ni.sT6M/'B-H zF;u7v]UͲ 9/3)"I1E$MSiBQ(7҅UD4\7 cOyvթu *|\kSdH8 ^і ¼u8E&Ru&<.`C8E=S ^ @ip|ރWyX­ZD߀kZk7JNxVGW4ҙs"c(ݽ윹Q}_)pHs\4,v):鏗 ]nܞ~k~MsUT\qm$ْb8b F2i_ t`ÿͣ'K 9b;S9eٹI- c_up/C6|PP]xr@5=n+eҪ训5Z wFha-7 RG?IA T@|>;{e[͂0_%4hb!мĈ A2_% h ^rSr4LF)Dt q?KHCF#6!= pe[$'5]m?ߖ"$% P`;D9z>Λy꾂 jz=ǯzt>JxAY]6[I QHV@ޠM''.z/T3vZItƖg.YǙ!hDo{mkA #K5U; M跞̰ZnQ5Z%{IƗ4IKlU>K|zy.3V[JGof-WURZWv8[K:.ZH[j*:nzKuX#%GRy׃8wCq *вXř W7P|FQr/RkCpс@K;SUpੌH=0N?ŏwvI~_v5|9G]!fk&*7˹.~j(8E`Qk_զ~QNU1#y@(<~[͸]B@VBAd! Qޅ2x'JtIR̠8OO+Y9DXu| a@ gt q43%@f)Tbxt]8|K^QzzX+ n%5SE7yORqҽ WȪ;}X<>>GBAHDk7Z@ͳ3;eQ!"W<=( CCiHJ% @AD,"R E_GaRiЩ ))h0L)@HovΩiAM/gx\" nJƾQO_˖૏']-{>6*'w|?=K_A~BX-3}cnӅ{v{j*h`KX|}8NW|]m`K_<6R^O_s~1?vѯ0?VC?eJN}Ϯ% ^~[VÉgLgܖvQGʚLK0BCj"(VŸDX&k7˲ES] ]56)`Fb~#[r;2@2 Sè=|4}m߬O0,ߒ7l9h7-XvJΆ;?OX:@s|ku^6) { N@vz+Ss`'B>69TG Gvx RxshUw_n25`_րa+v~7 Wt0vxq%m)71L>,Ï>,f͞e,wN[>ǟ6wXK0n{4ݿ_A[_轏nYݻƈ^ }GJ Q^oD)@HyRDh:_$Ӆg WA8*D|owHڒNHK ̨-(WE;O=?\1AaS1z;X'/[}6z?w;v7;Pso#/M?pp|PV kjޱaIb V-gklӓ 01:*EQϑ!,,elu*WVeƩyAQ 7hodz+xY5jtE18G|Gy|O.kfx'GOKwG C%cfAz,LBO?;Zw PP+@W;u'ު̻v/'}IǝpI78-eE"‘{x,yo=?Wmip?~|=ۗl|6+=V ,ѧ`9;GKak]}$Q=3+m^]w1s^Bmo;[췘E7VGΣۅ)xkptO<57XǎOs/]]{rMghnhOtE~mwM7tjϫ ~fcb|)Ĝ s 5j_6>+)_:'|_R7k/Z*ಽ^<|^d~Y 7i^gX=v肐Bzv=^kϲ|;ӔJ3Xed5FnCU|bSjGυȻH`U%#WH8K0S;w:/{!<ǭGns eģEJ}pXVJ"^уWt9.Aɸ1.,\i m#p4ǒNGR :*\ Aaŭ?>++>0K(*PG%g<9X̫֠Vd>UbN)? KB'omR}OIct@I]ggh¢6Tg ka4Kh:}hgݲ?߈fYÕsHғFU|+SM;TzR Wf‘XmF*:O9G7m"~K(2QZoUKwwIZd~3_nZ"3Za{Vqa',С^2rPF^ %sҸط9WΡQISY9Q +oot|W}M{,aUG9ҔJWgn)i@,* 4Cܤ]7Ç9|?,UHV˾QSVɊW>`)\QWee𶉆"DQ >:V֢!$d#I?UW?P'Ouؖ ]C oE.j@AP ~JxEx]mGתlpPxF%߻;t0ÙynzD{~m` [ pǛol3=&ណ d'- =8 ]1/u`&M6ɒa 2r}'0(^DLZbFY!$qx"?~ﻊP_v|hz]5Yy?@ Cum;t&9WWx<>#}I 7W9P`8wj\Zb;GtNV&<{_>թ}y>6/|g#SQ{"DnvX,H[.{$&c،`n_{ýz4[rr:x\rwք*(@Gb=nNNҾ% ~2hLk#@3bTQઢF_t ޱX(n~>4se::rZWl'gRtOCȹ 0aT#sGk`~Va[_?wq>y(4!;ѡn}VBzDSB ٛj8(NEzPpe/9}MP5▹,XXv0/K[?7T1eﴘj=3!JKD()C0> i>;cP5W倿ps -0葱,V28S=j8ç?ogqm+W.X?x\0FvJ4C|tBohVްЮs:u,>%8Do2ޗqq Imŗ?J3SarcE3s]O^ve"5s˕\DL2[fe 8Y|c{FrQB1s٥“2|HA%e5:C(V53b,뜆nl{:^S}ԄICTUV+L: \HI՞}21Ww6SR-e0( 9RΫԶjҶ͏Ne6piٮLjJtqRƎn~1,M'i?.j\;5,=wCړEInAΏU C ag%CҩQ}u(E1IW1e] #/$w%gNS.NUbԮL5ڥ۩-Q ** %RP0Vq|zjsXX*vICr-4ХK낆&T I:[NaTe2ъ[ӆ6L!5]<;Sg{} &hIF(ԛM-k.2tKV8G4.8Bq¬JzOp JF J0Cեy;ox}ԇ_i1 7ջQn_FxmC%M5_tiWQn8`? /.(k!max; b ; "òKJ7L]qRFi-J,lXV}紿^G: %!*r"ۑe+T7|8V:Lxk'L-,8ѴAփ5&D 7>]i7޳(SCDn"(:n:ɂ\R*ms셟?(=*S甾E9Cg:1)`fl?)he=4쯖NXf䪢!?ї4D] Y^_r?g!ڸ wsa~f үAA@GqϜ} aGvqȴND!Kkxa #{:c lYw^{1, Dm -E䩎"],|p;k]g;v(ahXv͋ȄN7Pa@϶J[>L5@:Wʨbca#jem…XZ `ҕ\ |:5vzJ1,ޣY]-7I ?DgW&U?=+~ ,J1P(02L.T tD`g.Md4`(c$. XKƿ 8"i s6L);5(xZb#K P&@d;m֢h  @+w$U0"Ïւِ6ZU2" ?eXopA΁=,|vD`w޻0{bHt "QF^me#~EI{WwЯ~6h\BZ5`5gU*inXADl3MAtAO/5r?};v}!L= ѳFC`TMuʬ&v߳ހbM;oֵES8m/p5A]9.핽F<5Qv==6ei/tkZLycTiwL;\>og-2iCO6aMY㎼n7Ҏ Fw lǟ^wg܈pΑFX 7~L$c\fRcxh|.[b;!?rI~uB^tP݂Dj[(f3tG9m+,E!gZa]/hXhnز \egP33poE42#DOw[=~|35>A =)e7<V}(ĝI_q^]W&z J[mVn׮pgE$U !PԲq-aiXR؂(AWߍkmjZaL=SԜFˆp1ewǜx6?^1o/ȸ& ѡru4usSB=֝-rw@03H?Ff*m_+D^X\0ʤ1Vd_l336DxDg=eQuvfi5;Vl!!@Жb[#.`|7ksT3&k zicӷM4jRG V"l5 ft-?G C{k'rSOb;L hu{4xK.w߮lt݇ JԿݢ)glSM"vkXabE NxP;7W]TMb~F; d;see檥žmPUM34:-I@`|5+W Mѳ @ ] ͈DA 7\#BKgt*碋}PCl0uw~PwFzyMsr9:˄ Zi 9Uڃ6[u^5܀F£& YDpls>6٭ڙlN'o!xEHITQDTQHQE QE QE%TQCTQCTQH4PP4PPEIUUTD$)ۮ=V_M]o޻6: W|/` /?: @; ᑑWݸ̆fe\0M[Y8aGt1xU6P6w.9C2wBoU H"EAM {d"Ur"G (٫qľ6IJH#d@*Z h *&*" )JU"@@((hJFa@:& Τllׯ:=r J R@HШ(H@i DJbE((P DY(Itt4/%X XZ!r"ka$bGE(&8PPPAF [n>) !3Jԑ8}Twfkokay=@\LU]%d-ū.x=*xTwWn e'&k.7~ `=t< /87=6'Z'~Tp8cÄa:12#F*\cnhsXG -.:Qj*Jpbl/ծ!N9q# WoKr?yHwe[;f>6=Cxx>4+LQS7sePG7zQ*Qz-3 [A)$#BREl e/i@.qأR1DhVL_Zg ( 8Rh *r)fCcy"g_j4et4hu8ɜݷ32wfۅd2Taf4!BBMb36K2"~7~T0LF?;L/-b_QWlPUPdq6p[+gօI6LKV-lgó=vA[DT;մ'߳\- tMDB*?gwsrl?/j&^Uk4l7s~? _[jN8κQmN]sO |pk 45=6۳t)m݁yCyo[ۼ[eq=|kKK_/?o!`H9J (@!ڽ@WMPn`@&4T _mXqDek!_u]=3 yb >7tЫoI\Vd=adg`L;NoQ>Eto& e&MXb*G rR+j|"8MRuY@242#  >A$S||Q? RBwآǭmQVlV!BZE210 "LR gL3wѪ엎 ^3S~f1(x6) bBwHhBi@ K]fe7irU/ !.;8;T*D>XjLޔפ՞`dDC/k1~oꤷIff+ROw=c_W|vI7s1 .{t|0W]q"P 'Lj\.T-q2IhVJQ䯨q==/bzyE_5*ximegZ۵m|LAǝ~BCLq~>X(iIF JIF% *P5nK(@)ԫw; %AI229Ixcŷs#h*1E! FPGRs@;o.۪ ºN}L"Ȗ@8D,R-K7>'9vq[9bD{tj2N/\Qc]oa`8|ln)vFZZ}k[Cl[)U J).3| RǞU8Q}p؋axs-]Gùf<GşٷzdD+=EOJ|[0OuMgZmM)$tz^燿CΟ3kB5K 9 _8(A'=^gp nwm.8PrT }(/KX{!=8ip Pf9ս[d4RHHɖxrځ ȴȈ>M\-.%b# is <][C%F.Em4u2GK2ab2Q-DmnƷƻ7 H./1G1.qr\u~my'צND-jW+QvŴIo-9:wI6FҰQW6-ȿuN|΋ɑbR&.Pw{z?v^cnӽ%h"ϕ\O0 :e0V3 El@sKoo7gsx?y @H$(0BRI$->Gc l1x}ॖ"J%!X{I>59(eg|!5zqg;5tAd`7 %癱cyB)0OMqsS"">q~0fx"8쫷fq_^!((b$^Zdentv4WS}utԸ+N+V|Kej-8;E۸V"$0c-oKL&HEVpڟ DDX]G-p>kQWvIo't"1~e}|0+u'G Or8iY])G,|nq(qL k0ud%g>"Pcq%w{E_B1@(:XmfJ 4t*~,FY|v{őu4p;jD^A "Hx%>h^5/GNK~-aG'?BS=Jd\PNF.j̱6|LIH#sYgP46A-  <*\􃈴,D0$2WNQ?}Wo/+Uw{͓"9Ƀa#ƍ2MCDT۪)Dݿ|4tٻH)Өf,Uz{+ѫ&(!}6QsU;ߩ"rx\P[?ܕz"~҂KlNFc{I5/ѿؾQK~+ጡ~}rapD,]cKk9`NGK |I3 a(b(R`*?1.NsX`4Y&,@3!HZV|~}08%:sחY[0M1T@'ה< [H&Z@" Ց^yu~!(y^T2]ABCGҠ$R?(q.Bn[Y~XrZݵEZ5_|5`a0iB5_˚<|j7uע\Ps4!]$vn{\F[ ĺ|: 炣5,=Z7z7Q-kU~ ?HuGC䒪q.DG. DKd(1ht}uV/fymk̛xx8ފ>t#?3NcoKRZ/__評RGY]n֫YE^',ȼ/3{t*#1KS.0z#|(wQow]w=&gˎ ׿Mb0̈tw@%E1 TXlr|FMg{ ٫v?)1~ i+dG ;fUc v$ PS ACţ8Z q#^0ge !bQ`u댍N0C*?t]m"[8UqKH S_)Q47´&"єw%`nxW~&3%8B 'JVWFWBZ.:f r/ *as6(k^VO]ƞ`k'Tz\7p۳V4J3P!?q콚c7`˛˼'II$lO! rp0ĐAH1%#i?ny