From 2980612cb55f07b6afbfc6555d098ecc633aba91 Mon Sep 17 00:00:00 2001 From: Fred Gylys-Colwell Date: Tue, 15 Dec 2020 14:29:34 -0800 Subject: [PATCH] Update version compatibility document - This updates the version compatibility document to clarify how the Android hidl interface works. - Testing of analog output was removed because the unit tests cannot verify correct behaviour. - Some buffer overflow tests have been added. --- ...devine_OEMCrypto_Version_Compatibility.pdf | Bin 136964 -> 139391 bytes oemcrypto/include/OEMCryptoCENC.h | 113 +++++++-- oemcrypto/include/level3.h | 229 +++++++++--------- oemcrypto/odk/include/odk_attributes.h | 4 +- .../test/fuzz_tests/oemcrypto_fuzz_helper.h | 4 +- .../test/fuzz_tests/oemcrypto_fuzztests.gyp | 60 +---- .../test/fuzz_tests/oemcrypto_fuzztests.gypi | 100 +++----- oemcrypto/test/oemcrypto_test.cpp | 8 +- 8 files changed, 258 insertions(+), 260 deletions(-) diff --git a/docs/Widevine_OEMCrypto_Version_Compatibility.pdf b/docs/Widevine_OEMCrypto_Version_Compatibility.pdf index 949fddba44f69b15605a29e2ef99e3f11ace8d68..996cc62efeed5069b806e8ac76ee521624d17aad 100644 GIT binary patch delta 45230 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

O&50|RH9^{C!UZV>TZRdQkz$H1FYR$Ya+5 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 F{{T^qX-xnC delta 42821 zcmZs>1yCJPvo4CWaR?gRgS)%CySoQ>A6$aFL-61P2(B9s?gZaBA;E*o<3H!z`|hpx zs%C2Se5<=xcUP^c>aOpt9~4m!N~UM!uz*XJ+I5#K!iCo>kJ_+T7FL#aYVS z)0$37fP;;LjqQJHrRb4BbEbG(0=#@|A|f81@48ONzWKwt>(1+Js6ltS$8JQJ+GTX= zFj3HdJ8zu&qo7W&mr*#rGW!2|OKRHC(;r-(%4I@l%1iehl2lK3=|qoD`>c}-vI{oy z;x$fj9WikY*a`};4US!OKYkKvna5S?=q=2CbPf1LlJD!`w_*r|Um}kQ#Kp!{Qin25 zOW#S?8&0Y&1gp_jxpUNUWU{|1)lN(8ghpqtpO9%!1|?MinicdI8-CQ<3LhjaYS z^RLM!cWv+N+54N?2Fj@0cNIM-=1GxM zemnUCbfH*}W}^G!L?dNDa+`21{%Si?%2-~Gj}W>4A1wAYVoFP<0)P05>I*z_%%co& zSG63^aJoAurH*tXI{!Q$WrPWZ2%P&Qrp(l6wfQMKG|v|WIIB3N{?hyazg8^Gcu*v?B$yPCzdYaYK@|%c)p|mH~MmNMpB6^!ti#=?i z+E+jQLKJvj zF%n3g{MsS^T){P?eNp_S2QJ@)5FB1;VS&ptp=-?t1|m(<14C0@hcMMKOZptX!f~-dJwsBsB=iPV zn*)I;^x*c&y5&;%sC0w1mAi-Obfk^3yFc^7tHQ=VkGiy|z8^E$Cg;rLXN+h3>vX7r zDUfz4OV^hpg}<7*{P7SN6gct9^!i%+$)fT6nmdT>J) zhOU#;SMVB$3rwj(wq1Hfl;42MlhMi*(}{(ozIp1zJZ#&w_&4$EKqxjI@s@(wAm2yC zmpqLD#Nu~Kq6;=<&T=O;0`jo1y`o}Cm-K0Ts@&*vY_=0qhU{q)) zEb<+;5>bO1V@pMHRZNqeYI(dRzwlzlLEfb9kaxOv&&mLbJ|Scxqyw@(dH|XI8=t-8n~%g8V*Zi#~v0& z%h9G%*~H=mmGf6vfLM8??WlS=RDnCg5dya8|%j}0!h)>?qq&PN=SFgBY?a_Y%E$d%Efcv&OIX%s5 zm*VB^&Eqi}5%R7}dHUzijU$$nTxca4NG)Y%+Q~c|PYnY0rz=_)mIbEt{P(1y`dl>LfAWf=M} zpEB4RTRyqd(zr!~H8F87hHjv6nz|z?gJY1o;4;ONsxJ|K#^L6_BLJsgV|6c>hdtmV zCWvM31X4d!iDu&gjPnS11d*XTe0cQpXdJYpeyEn{;IBmKXz2GDPfGe-N)6NaAy45E zre8`T5|&x~GBE|4S#r~po8o;l|9mLX6KAOVaiG9Z^3m~JAw>#u?8}B*nYyvCy^P52 zvWqyJ!}aR8ge-fZOl(e{*#=H`lWWzWDcsXab(4)Z8lCF~MsI}D<`dZsDX=EDFAXD0 zmLOLTNeXh87o*GuG0mSH{E~Zkguyw=VF}N zZlaY%`?*---^{K!wnmlK=U!^p3T!gFkttMLne|gTJYyA9hN7|&i2k&z9P>{;$2sd} ziPVz5=~0V2RQfz7W>y=N(sB&;Np0fff!l+Sd`sdPz>R^5DXXd?0+oj~J+QfKGtwP= zUE*7={LTFu{a`=JRnum6h3?i7{vgLixIT?a*DM+}vfxFtW=zy;MOC)5(ctMcpv*bE zg6=k`BEN zvxK;N?UyV3qraWd`|6Ns7BdX&cVP#{;&yr``Ku_kzlX`0LYO-#DG=;u>QwPqm)6W8 z7;l`L+Eu78DYY69zRImoHQSB3ntwn2Rqb1@2|%j#P1!~>^wi_BWbM4E=s0XzSgI_7 zzPj^1bE=(jVqNE|kt-A?{jd$fJ#wZL0iDRtELxWk;i&RR72s#^k4@#`pDIe>3Kjf< z-TPdNb90oJ!QDdscZ{q?u9)+Sv8^3S3Qn<(QpA{JQ$udgA`zF@bzyM)C#9rT zWsV~{tE(MsX<5*B&wwV`*e_xtmTI)a1KKDaj~NZ>j@K+m_CgKV)oP8i#AxDq(8h7m zblQJ6*gDp$@aXYb;F=4r9t6G~ad9ByW&(sJiRBaR1FB8>F|gKAVv=q7-B+P7JZ(L@ zgo7KpwcTt+b$M7x7k7CI#fXjlki^Wg{ji&&3IB&sOEXK&{@NpAftzTB#@xAi~ z4V8bR#84aptQ6hUVb?z6G{0b}Zc-Hf{FA?D>vbI#DT`9R^)+4HgBwbgj;^9gffmr_ zPvjjs|IRarz%vYklGqmK`mw`q2S;nz-L9e&tc&-;Ey&Pk2{6WilKZs1pqll%ccGlA z=Si{pt0^n0E0Q-V16RHfy4)PPR=Vq3|l zt-RpTPoXe2G;ZPyKoz$db^bI33lBKRs%8n~+ej2!5Y0*OBNte0C(@E2GZowNBMW{wdQNj5Ac~( zGuGH#!l4p5V%BK>P;Kge)v*fqFnv^nTVt`4nR*-*hLGsXJLv~dlQA=sm1^AEwWC^q{M zqv2yq?-#)s9`2QIl{Ab!-9uQZg)zClh*?$1KJKG>`@zOpK7T61WpEXRr&Q&%r&agS zDDS3KiMxLMSPYM|F8Y@qx;g?h6|&aMTAZUfB4bDykxt2dziO^Rx15WzX|7T?GshVg zmy$aAkZL+KOA0s8Ig|IKyksK5AS+8klarBb<3~v(?|H*S!AyjlJ!&|&VlZ;Bzk6ty zedwra@fXGNYM-K3bHH7zdBR6DK<9wu2)^@>%c@&?0)1m1(`3OlVXX|HaOW4jFi0-0 zi%DM-zNjTrYb+ykUG^J18J&gZj~zR%XHJNoR=ay4oFvX& z6gV21>f2N(o1TT|)1BD=nmkY$BY|5aY&}2)9-@?$S|cOm1D1f(W}?hW-C7Oe@z3g9 zv>kycy(+Pq^B1c|ZbwA!XMaDgR-bWYzf37u{Dto}$)l(-ZslIQ5ppf_L?DvXbW|okbNyfY+jf-7&-?*12a;E;M`bQfF;I-BBLv2x~dY!c#`Q)v; zHZDL{g?U-8=HB$j-;o4_`}g3^SN*DZIk@?w(6kt!&k~7RXyUJ{e>h8zm|U44ulGr^ z4{b!;I;*tdkWC_i)qX54^O{eZ;o)E;QxfMyVhGLq%4Zh1wD3wOd4Lf#F`I-HG|@P4 z6`RyN^F8T4`hlD@D5!OE2^$)X9h4TO@%Pv-6l2Zb#GfOF8Vz4Z{VPZ6T-$@F(Jry{ zoC#(P;attb+kwXu|m%NGOd+w1#6!RTp+P`;s*83IAb-3qV)_6EJ^YaXhM2uX++%Sn( ze=(c^zJ{ya!ggZiFOuOmrC^Im-7t$({}XBPo~iD!h&c-sD!bS7MicnLS0_}>h+hsb zP+?i^hgfO0Y2Q!ZjvG`i+ekVq%A)Y})(^%MnDZ7Xc zVfg+Kew+KMelXFzkP9z`rYU#=+S7mFxqR*gpjTNpyKAS~5XDN?SPl9=Ny^A35se%D zJ{DiW3|_K4%J{=Jejm`8+H`5mxkB!q zT9vQq`yhm=)$4Q30bJ|nb?a>^k#zytrm~5TW;w))1AK}6V_oTSIP=r7^GDh>ro6+_ zK;bQZqRHWK`g~*a;*B|&@>F3CN~W?r(Jn7Zyer?_1*tO0qU~7y zrr5;ZB{^#^c?H3m6raF>?>&SMhtOappe7|wE+wZ(?!^9N^WYrvxA^PwD(fgmSJCjN z<<}^b?S)$Lg1OIc{hl7=k&0^TK}jws7dyk!E(2*K;Z?XUzpgEbbEO6th>cyKGd*A(8K= zfSog$6A9i2S8Tq;6t$W&#(W)Ip5Mro_Fq~_{E7l-uMAWT!f{*J8>nWM<;VA-yGa{+ zc$Q3<8$M%h+)ZuCwx{6`jWCid0}Gu?_>i^%VxkY<+evxfy9Ymox3|0o)uVn@(djaG z87l{lQA~o*C+pqQ#{)!3F($k6Yh@s*^XdmEraazMF zPUBvw;>6HZD?zlY)`~G|%#Bo78LXHxRMVlqYT0_eZCp5~-L~U@RXg-O@0T=j%d|ee z(wk|j|3z7iqio8T!;c;hJU_4%2hdAAI$a^*&m9T8o#4dWADsO2AsZID^dUQ-&;FFl z(L&-;@`_6|c^{kbZ{{S_3`a44tTja%jqmN|>iXnd^v(P6F#25d^>Mv2>FxR4MfBNE z`c727u!IoV+S%%VW`XaLi-iL+2Ol{b`F{iz>qnc% zpi#7F_UTQV+Bg1Sl+$PmmsNi`5Lt9~p$@v`i}UICKzl4P;uHsiRSdL%14&Ta(wPp9 z{91fukzpE;gO&hQOPAI{I+2M7J(L2YTtg8u?BFvVN9{CX#cHHbW@RHu6%zbSYTlp8 z&;Slo7MZIq3JUMn*~U{?h_gIdaN@R=du~lJX+NJ9B|VuTGc!yK6?|?JMa;XGW~|u{ zCxbI}XacnXg0cub!wrokS zw*^F=h-3FN8WXQ(Gl40!JPH`jGBbU&LG zr9F2h>wkxFMG^6zFtmAT=AViT3v5KVVAu@3G%1Bm|0fmTJ(rrzVVzAJd3++}Jd6aW zq5qbR+Y$a(uGh2268dvba(hK0$H3gule#JyX>Z^R>~K>W`0i~(Bv47%)cXmOSkM~0 zU5lKyz4KL8@Y zP9nP$Mwqn79NXXC3kA-z# zU94x3wP7XwJCuZaU^r>;3l>c})64TbaC4`=(d`YsC2iRYQ~o9;m9b7eSo%eDpm^Dns9Sprlzt!>%rB6u=^@ zC{Y1L(4FHKd^Oro@URRsA{Eok0~v9iKS6mG`r_-3HD<}p6_g9pG3-r23pCZ09o>Bg zZ%9}38B+ZCS`dxRl#`u(T$^lk!Vx-81EX%Dx>ZoSypTCnj2G#5kQV>Iq3hAvd3pz;!5A{; zEPNXJ7oY>UdW&;&+I_-8owH8dc zf&O-&28F|BE7BMV>{)Y$N2aW~MAv74-;P zad=t;fmn-jMI3w;_an@XnDs=?R|eDAfgL zdZ6z&aZ!f?PBfKemy8ZINYNzx>x?ZQx~Ik{l&}3iYUuS1_+kR!5OiKO8a@m8@5-es zomQ5{4EV+aosF!Db{djtD3r-<<>pGR)(Oo5U0V&6=HS+bdUIOh>_$!WQHFEJNVfis z>FYn@>?=ok=cX{8P8ZVQI;7i&)dCvE%AwBo>bJ;)1Q{5%#vr=KoqtdPCl8^wADc*o z$~waYamY51D>wm}GAY}3EFt#EY}ap$#opyBgh@!MnLB=IU`d{X#(BAAZaQ&9yo;`SU(=;z?w z*hEoAvysm?6}FAxTp;)iHh94woua(wH_Of_tqm_V8V~TOjC_-mZS<1Vd=g4Id`(x< zQF0jjY+hD1me4cRpMU119g$Zv|IzWTxQP6WxY}W>it$my1NSD1%l{;ekhE<9I;tZv za%Z*2ZmT5aU%k2HnHu%=#@QXs^FO&y(oG+|_KD+TxNb0RLg4!*K1I@Md~Wbmwr2b% z&QXfqR_zWDo9Wkq-Rvf9#=VZBw1UBo`-1W9ElRY^8i*UwRCHSYm=ooj=D5Y?VLDiN zzrW6iJ6mp<-`1=NH@%iGvRM~!ed|PMKK2ssq9^&|x0|v2^O8eDJ159)SM3}6CZfBP z%BQCxjgMQu!+1#P9KXqcatyPku(O$a7 z1pZjUAO74Dp_@OiUpdqH$&#tu=;2XNp60VASKsJ~jjp6bk8Q7{Hh+*!%d09!5q24l zVfowQGl6-@B2zH6c!THH5MS9-Y6Ta|9c`!KQHIuliTy0()=bA~7Z%+=|C~E|7lPe} znO8iXfMH9|yL2?&QKnBc_?F~o&8;P`nzk*RK$2sNy2pBKqnj(bhn1dp$}!Y7P4NY3aX}o7tX;do}Z9B+P^NO6V!C}PePd{hdnBt?sims5HYsUQ6z};a(7dJ01H4s*Rym%%wMV$nmy9q7*%4 zC7z+l_P6%1X#KpB7^M~johz2XjKobgxXMjyPU{73t&6=Rzy z0niB4-^$D#{;Y2&VKNaTXV^w##tt;mI_>cvf9?(la8|T*rVX9|Ywowjw{v+KeSp9u zPGI5u7RuV6@15d3L@bD4I#BfaAk&4jN=B_ueTLNnk+)UV+slldG%!$4vFL9@`>lXe z+|T;cOcTwCm|weT?}=?xAtQI?rcEn@0nn`V#?;$0ww=cFAF9wL!Ph-Tq}sp9-h=1l zTeBS3bBTX==wX2M1C`UZ5o`R%4~veqA*Q{(rdbUw&;PUX>VoMs$|-;!DI zZ{&wI60RK_t)Klr!&#-ngWiza-0|bT<<(AKN0n*hivAoEg_}xK1WbA9gWKNJr%9@8 zEuIjBCH93>2tIc!_@hAJUh+!$+JVqD66=3HIBMS;R~9QzAJJ=S)t93XN{Ng(JKp41 zxKEPxZ(MSFoXH3u{21%Wl1&Zfb!Yn`Wbi-NGX1kc@1Bpv$nnY;gB$9^+1dz!*DWDR zXcsRKWw**;>Mh|Dbs!m(K60n+H+yvbEUsuUPuwGkfnvGCS2D)~V)ej{S_HgQ`L;}= zdYM_9`G^Z0x@)Ou_ks?h3>d$8`q@&4Oa!3D8ua<#)o)W>B{Y07HR&!=%2*zu3kHT` zXWV^+e8&k%GMq@OZ6AW~X(~8TIQI*|oiLilHZSNT_@;kCq$(@hNgX=vWHLSiuw$k=sRez1LtPYy?6iIaS4UuNJ-{9V2PIY~@UBM`jvFcoVA>M)bPQULqiJ ztqCBaAoTO|g@~8iHiFjA3&neE)mBcD%VCnd1hj&nPgmD9>Krtb_EigaaW7!?7Q43+ zRcDQjyT48RAqhx!Zm+Q%R={d+~yV?W$hr2MZvV}P4utsD5$btBrncgL?f zqU0rW2WtO-AU*{@dmZhXBZSMmu0Q=aSznk z%HJ%Sg7briW2yL4;yPWyY5CoG1)aEVG=@`cXK zdN%?m@l&VhvMOEUCt;vJhnwRcF*(Ez2ArIB$QHy;$-E*=MR37aI6H1IB-vk0vRZ;I zOFj>uJF)K-QV8Zb@a#c{9NTBCY z#kn_(jqRtE2`n7+bcq701||6~%t}YbG@~GqD#K{z$8Rsj4p~yIVvt zEM^G1u?h$D<(azVI;6 zE;RbuW*;Mde~Sgs<$K`9+#jpJg9~=MB)=xfSC5(4aP5ZCG2rFVwQ#JO(>oizcx|F1 z#CANHmD;*yw8TYs@kliV?srYiN69zUz9watD`co0XhT(&Bx>q)si`9UUc57deo1a5 zPfi&3tE|-3?yjgJXU>|R&d2H$`Dm>rzH{Z;#Q>!!`S=G|Y~F`LJ*mpU&jv#H(Ur&| z>Sp04m&A71j5SJ^n&Iu$^s+YiS)0q$IIwJw$Vup4^zdySa=Fm=W6D#Zb z6t&7D`JFy%_+#>+mX1FjjAOEj3j405_=WAtPx};Q`w7fh%xA0@Th+;+D{XR@;(s*T z03D<;wcq&W5Ko?s;jB<&a((MLLK(9s1;KDc;&Oku*Vd%!ldbv0H$Ph*K3VSb`(k#1!FzcbBlHfTn$B@%H+Xl@aIzGTc!N%r#Z!HJ5XU=fgtj`uLFH(Y8D1#gJD*Q(!q-`D5m$<&Zzhc+9cIVi?d{C@3T1V=5QZ*-u3D4+Y-S;muBN*-AvW;J}(E)r-cR{ z(Tsnew2)_{f&wg3DQSwQQc70H)WVa)C$CczZYJrh7TIBSwVfaT9TIXrswiIeKlx6! zl6Iv)Rg%EtjOn>XH>frJEmAGi$L#}3DDsQ~zx{5p`{#>IDZO%SP2YVD-pOTEmY?IF z8F4Y5swz)wHej{r*T=>YU@q@22ZFEvISJlBL?h`>uPVz;xTxf>ZcY1-9QsFq}Bfpo=pU3-zz@$U;ThV@II zwp+1Y^$(h6L8?mb-^%e;#vxxwpl!sV|C3iEOepaj1Ug>d$r03I$0)@QN6L)}-(FIP zXhpe!e2uJ*Za&0Xi4b|x{bQUJA$EGy_ucBMDI`M*+pZ=(_I-pEt}rwBMOonz{bD~0 zkip+cJw1;y_3hdK#ypvXE`Us3Bb$$BmRFyHl@j9VOzzc=P;@z?LqkPPM*nT?xKBiz zTC`q>=ssbzk;WB~_CDXHmh`v5e+yO@YFBo$+FLD1f$jUnQghtJ>_lBkcIQiKA zZ{m(|(mQb{Xxp@Sv^B&!7=V%v{YQKIAL35#|4ZB{mr~d*_q8e8ET;WMhhPzo!^-N1 z&Wb_*<@$OM_FV7&+U9=3b?)V9G`ff^3g>h<`{Lj!8h9;#a*_L6M_QBs^g&c|A#Ph} z0MPp|I}8LqKp=k+f4y8NHd3a$li03#Cgu&ye@Y*-_|p1)L>1!=1h~ukvffMu&ei>% zRTvhiHDj%!(ht15g!~OyLfTUN74)2LIoz2fD&o7)gSFOiw&$~H`VsrL%jW2tkn0jk zaRR=#ufyb=(BZ|_I}<0>Be982_LP0}77!xHq@2KS9 zR>VmiC++C+PVsT6GCBA8BmC3Va%6>UoszEXG;&Vn1G#3UP}kL#z^BeF`-85nbv5c) zuYz_pUQBs{3PERSd}5Lu#(2X|48zN@lG%DR29?XPjyF7f*l$?G1f*&4PZ!z5GQfhC z7RSW0{h&vI3I#aYO@|t-Fn!sA@JFiSE@rWi zp}BQr;r-QH@?-sdvfjg_#>AEXey~Uw6^T=)g=wf#XRa4QMGcp}%*NE8B7~VSg2~X2 zvgU5fAYKVGaZgMF&t>oEXO0Gzh|^&pFf`E%ZzPwcdqe(=iMJ2>2pr*zr#l`7f)1s#r=;R76&r2B^2(y^qhOe?@i+hw3)e%|JEkJ)A%oK;761> zbmAo62MkOqjv>p6cqIY~vq2Sk>wn>R`*L%>9q0nw@0K_) z9bW`+wUXcK|4ZOl%N#JTd5_5Y^hV*mx{kP5_8P6YYA0tLXnY!6g>~U7xOh9D$dI}c z6*SzP;d~q)vs!{yJwBhH`##q}mUsfP)n1e#N%1m8Jo&=nz5?g_fcgF!Ofy?<9t3*Buuf%qgXQoyv;~8#S6Dzi!8G+4fwD({8 ztj+k&FK-uTdeu*^d2D@3AHiUq{!XW+17c2vJ*QPmv&-H-2@HDu0MT@wbkYYt3l&>q z(ysBlWe2JyU>;at={$z_(22x_7!8r9%hm31pa`mZ(c0xm!`VBM=+tNZlwTZI6w{E$ zFp!IJmg>Q!_RaMVW!gcKvH0Z96A7`DFYfuB(UNsi)#7p zV|-)>W;gv-_p(C!+Yvl?_QBD=fgKdxM%Jz`uwZfmC^0%U;FcnXOu;dRxb;{L0=w1p zg-UKq5foV@>gE-=8~nTS7Eaj8abRx-uQ>0cVdV~mHlJ~glH6xv6yMWM!5k9QNQie_f zP4U)*i)hLel-Mv<=dgU$6qO&Q#N19!>_E6E;+jwGu2EXKQbv-ZOf=X0S;9UnpOZ3L zd6cb^+0t-6A4w79d@^^I$iCInKWM~L<|TFuhx`!SCXJ!;yv|%A1r!Pv{mdu%^949<{?Vi+cmH|>?1UaI zo!qKl@A^di+X8|jwnT;Yc0?Qnel^k-(4Zrjz=;sy`6S@q4@lG$ler7U=3u$5&q+2- z!c5RU|D?q5U}5@_NolynrDn*#xa`Q+*lz8FV9GrkKUzAcp>+2>jrBXN{7Yu=kabSa z%&)iYe@3>6BM$m$;$Z5O?b+BCfLsvi+5+4%>Y$(Sjzuod#+Fs6g8zJq7a**WmXici z3zvIM_@I?$lJ=J04}Ly*IVW8Ed{VJ`b5^YZTOEA955gh5*TIj-9Gi>+5F+HKSC|BHDHeRj+91S~T z8^Z7q7V(PJ1>yUun$+5R!gOxR24ov= zVHiF|Aq&5TprwxrU+9|7b?$ISvKvD)e}%a@@u_-{x6mb2ec29*Ci9mv$==!y8EN# zyMLdh+0b#)6r6u67%e(djM8&g*Bn_wa{ogpN>g$EEo-!#-{QybgdY0YWW{VvNui^P z%+1_m{_voMAFkfd+CzKFVEZazKrYv8CxiL(?D8|(HbKnYw}Zyeu1MZL9}+f(HC}wZ zk*xiJx>US8{-_9lMb%x~@HmY774ENRGU^Ba03N+Q`EGiXhv@KZ{xl}X-?8ObSNS@+ z3%?gGzu7Sc9PVMd@@t|HW51IdzR z<68fLg8l>X{4dD!KM*~2;2i#CMDX_Y}JX6A1i94{6*_E6|=;m-?Yy;Wf=*r z6+BD_yZokia2aqgI-amOk>s77`~z`+gxY=mAq9{06R$U`(3-h~4oNc6;NWuH^u?vs zl#?)lb%rD>a<1-FPW`~YCX_0ESQHXHi?;*+pRk(u0=+%5d*9pan#ox9ztXp__Gb)w zeR8~~(%4^RZZR0j_^Qd|iqr*Z{Uh|+?<(QI=HSIFb1(~__)3Sk+y+Z!&R%|uMDOYE zyw=(OKt@Wm8}Kx~@_B^&&&xlJXU&@P-@Ruegu$k0w9H!2)MUFKPP&!5Pb%M_n+^>8m7&aS{>C28ENYi&8wo*G0iLLpGGw#FMwAFVxZ zCHZV>Rs4ema3kC6>8^O|D@)qjO782FZdtp(@+VQP)t#jq&gcXH^28fIC@DWchB}^;Dv!pJ3_7 z17&G`%6aT(JW&Z7GIz3W2{Uvz#2+ zY=8Q>!hGlFToFC_^_^D{&jsT4(#U5%eq z=NnoOkfD3lWP@Y7WQY#f;(UB-TwwRxq1z5hVcQJGdR(y2&ODpH|yeh?)oX z4f>~fcUKhr_di|nOyBe4!FAv3-RT`*QvLK%R5cyT>i^5{;9_q(%7G3;eJ5_ebJ&_Y3MPB!)re?7X+p~-0{3pgu-6|RY^EMY6~VOG!eTu-{u z*~DQ(_Hckq41L#Mzh}46w=RjGY*|7$EYwGL70Ga34`D$0805-&LN3~ftKzUAks$;9 z!105)!?7+GXpk@ho0e(Q#k|*c;xo>A?&HUh3KsjKwu=PAgbcl{(3`<5v#335O|t%u zQTBqa{rRQS+mp;wsNC;pO^>MuD2K{~n@pB3UEhJg?egnoFS^bbII#&ErRdD5u9l!{ z*n^MRBe#n_f|(5l1x!&GP=}`DKLvGKeV!LR5{MS=%;mtwnjaf4>c1|CJzx?r9pxzjtEhGoL@z$ zT%-oReWk^wqe3f&Mg=99Dcu(5D}$!YWb7cb$eH{0jiI>31(JxXSONo~v+&dVK0AlA zu+9-C7vwjgybsLx1JP{#<_Py`+hVkEm^R`FV8<~jf(WJviZL02C~`0{@dAAe`7@zA z1)@2r6y~8M3m66+g#yDIYoCfKDr{dqMglOuDq@Qm{6Htehf@MlGzWn>=*0Qr2i@tE z3qz3UBniUJL5x_huu+oyV1{pEd@vTEn&J--xd_t%x^EJCuvD0dQ4SH7n6D%b=F}1- z4w%aW$NO#sD3+LsdyS+HSc!-v=CF$t`TY$BlP9MO-&u)!YY0$`i$&~#=tY={y1Ot?O1 zCYpb|Pl7Q&?g9p#HNqysX*Ts4=5W9$;u<0pfx>45sspV70hkE)? z6|w3gt;bc(Nj%BBiFL@k!v@I)6e4uN)%)h{$U0O;GZ2J!rUxX)h##PaC@)Y$=meI@ z1jNe~9()Rs9Ty!$bHxQKgWlls%!R>3=CEMqMl6U4Is6u1&n3EI2B1RE234-AeceI+6lZzm#E4hGG*-ZMR; zLOd?`z@)w~5K`X{5R(W*h~GUwIOqZg{DP?(4Ar-D0lymAh~J6X3)%#khP}Ts_afae zGn9e2g_8G#H{^i@gQnoZ{eTO`)wl~ZUs6beIdEkR+@nRifLSqL@w-DVn2)7>p-iOi zdAidB5ra`!sR9vAD#F1WIzf{}`D3%z96ZPWcQY zq6G9J0g*|V!AO0QzBs{27cLiw5u-avprpZ3&|BgK?*%Tg#68Bn=GBTTjEMNXD!MAz zJi>Ia5~Mm{iWv+mo9fcvcJUE>zT**52|d_;0yP<71< z-raV56m3_28}0jb)9}82S^uv^5NJCAj(A?qH!9u=)^GaW@{~oVogUep7n0oag5%e3 zEH^61_IO?h+D=B>l|@IK9_QXxZ{Dc#UdP{lD8FI9TkrC`V78q^zwZt?J&tZv0MBH3 zuYlRY-3zc<(f9EF@m8%YI_~r+{~n2ZUU2IAP1;69(Q}gW+gpJ$@V5UR=YKsUP;>wb ztX&E`xe(qQa&w>#%%5Lq2uvxr60{ge5*67=cpqJv%Ox%Buh9AZ<}hi;3Yqh-MVrL|b zL0d$%LQOV$1sJM-QZdJPrTfs*rI`}Uvz9v(sX9lv86L1myOAL?fVwL_aU-(zHYBo< z`1uTfUtxnn%JG!2wgKU>&jtV0>o&9L{4~`_f!re^X2zeS*a(vKEm6o6;qj?qi zxA4!i2e?2#bMUh3W0lG4z}EG`ub)106YfoV3<8PJu%wF9rakQQT;X!hMcyz&Ow8LZ z>g9%tio2=W)9^~Cf(TX~U0gGIq^WEB;<-}d#@yZUJBo-)+#YFO477$n51$W-(2Kg! zT^hSHoaKsajLwJ~c0*e~X||Adxdrt`cRpkA0rHMkaQYIY^$1Mj&)%w-;3Pt?a&Oi%cr8je{^3PAd>c6U!@vk>U;_6 zehTV6MYn6bP2M1$l1U$?qBLe`TXA-TKj(KVY|)zT&~=1a#+BL$w|3^&OYs{^x>Wj@ z0jDmIppamxH?cQ`H+ngVL^dNm3L)~LNK#111^yiEVVvZ!`7W1RefCfeeHN`8XZdK^ zr?RZFJ@uCn*V4tX-B6C$h&C2$h=5&mAY5r z`_g=f+dRy@i@UqITe|Cf>2yMTqR~y3Zj$U@-d4UaZ=drMnqQM8gEf^b?X7kU_~}|M z-=XfO`w+b*&LPi!E5voL&-QPRaIzvvGpjw6csQPkvP9LFNXm`WX1DqtaS<6QA0LHr zw6~+m)RRL+AAfJGFINa7V_$ofTr*TSTNKWC|L!LFo`VGKJcVZ$pA0us-es0eD0JD5 zXj8W6lchOtU9rb;kljxanxx_vpoc&>OmJ-23Rg%xF*RkMK|`9SziW|dl6s~1{2w`P ztPE|+UWjl=&2Z%L=JSqpwHxcb&?WX9lS%At6{62MUW+qXTG2q8l!WSdoB==4N_&jR zfa;tATg}RsQ%Bf(Sy6*z#r-xj-W2F`2ETY;c!PVF9S?g}hef@XGT9G`z;IDa5p_)} zO*_~%1CrQ7*i(VjZXqJg{42>mQ-Dmj6WU3hzy3Gv%_3fjOEXeXgzr`F{*UpAvqG?qGtoYI#7vV?5{sSyUD1gqwu>fFdp5&AGpTn@gRu;P#;x;qHN)cT;FTL^RNg)YSG z!0Jl1Gnx@-&UTho~`I#IHe@KZP84Py{ zVA|XunzClfpdd6k)X%Oaaw*ciqD%6Mlp)9?Yn4J;N(KiGiwWMapA+ZdF}Zm%@3Ak7 zX$syH;NW2bywk4tedbzMnnQu?1`{`I*`Qq zqJw)|;v;l>xI!F)UHf8J`MK$JN;kg>eZ4pE%glH~VLbMaX(QQX?C|t*kl+g9#Rc6>+eO3NX{uvC zQZ#GfKj}KGxRHe=aSsEmc39f!gw~kXT3Ci-v|4OIdtLJx-&2Aytu6YvVpEP-8*MCl zi|qsn*`{F)tnOcvk2u=!GGOcCY88rxm+>%X9M|ZehnhxLM&oJGn|2q#n+FYs4|l77 z{n`#F3G98IP1cx-v+raho@1)vb4r0}o^0)0uL*fKOG$)XHE94!z&j=kWr)e{^b37* zBaJdM4WgJKNu<zl4H!`rG&Ot z8L9rX!S>HRho=e)0@A!=`;if1W-D`Dkuj0kS$Hn0ua#SA%}^_Pj5%!6=^Z8!yOs5j zEWfmxS%d}QwAPv@&n0X#@qermX+6%0ofc?u4YxeVnaep|FGac!$k1|xk{TOJoPE@V z%Vzj>DINi4$-CQL|DdWqG}s9bn(*6CV@_gb)!HSV&v&%$rA$u~y-7Qg^3IeWY-Q$~ z8`kyt-`J>z&t;J2yN)vcj zPiLR+WeB>a)o0nON_Pj}vjiMJD=%~Vd6iucFR*EbT{A7F88z?J5>ANh#Yz7g)W}UK zJ~jzYvw~Xy83h#MC!;`b&A6gJ^qV-J`HA*hFM3l}`Fv6ymn@)Y>N2xZ#XPxsk{dTzjCa{VMurv{xO41L8yE9 zO(6GUz}Zfm2BmC8sKsp^zdN;Q#k28xP+?u6w5n-wrIvP1lIW#z?g&R$MWAf`@UN%& zTZEe%U8eAcQyg@E?uLC^hGbDZ<3KivanZo{0SrI8AG{rmPE zKdB;fH29gE{zTDlJe;fylcUUc_&S{JvjW8Y#6|cd^>ST4G!8^JxaVU56tCW8=->Ip zmgz(nS0y2ESSioC<%tv#x^_5K5};C9cqG^gnvvJaGe{8w48&7K%gFAl|MJ=cN2lIzoCUdxu%X&plo|baKQ8}Ep<4cpkWLz}j^_Px7>;#=}-;1r5d>`({WgBE0e4#y@~|$VH6T3M62X|% ztK(v^5#DW4+>Us+5{8MMYs=En2VX@{G7J3DgoR_fIwU81r=`!)m z%pF3-y$~+p;x!1Vhx~GR zxsf9wXwZWib!Frj7pOGuLPkG?dT=gO_>f`Qth^-_h>Bv>DN$=^GfYGw>6zhxnZHZD z^ok$~Y&sbgmVlV9!>)(Gk}xC57@b7CN&wy{mXW>;2ABq;5FRSH2C(2c%C|{Gt&A)J zT0V9Tw{tN$|24W4bB-PM%hSBN8iG}^*k+-$IpxSd^rt42%d%akzJMfk$^DC5b2Z1G z_Wosd7jLf*J$ZhIsf8tJ&hR^>aAwr1RT8);+xD|086h7UMQc{p3|$Wh@_a_y%vFq; zVK_qss4?LbDy&B`6o4XqzQfpIF!a8$kc9U;Py?u=k2P}uzEl+qB6$YN4egrT@=Jyq28mU? zLd>kkTea3~6a61~Ko?F&8`hM8zIkW^%Z(~bBWw9~C%`B*u;0W0tC?F6u|8?Fv?|2* z5*{vN)o%LLUZSO%19QmW&Zao|nrXHj^wOqv<9v5m)zpn7@@w|JCG1d8nqDk^TYxF= zva5@nmc(K{xG&adNBksj~rzeT?Qe#$qsXeQX^HYyY$HHOK zo!FwC{k@jdom}JDO3~=>bz%sNc()<*Q7}KNf838@?DfmsQ?N~$bbaX zaDa{0Jam@OP@H;*);(;cTE|#jYB>zSA_hDA&m)$sxx zkQqhO;E6b6aTL>n=1;$LVU2lMTP(ybEP(2Wq6^%{SX`O4N*htfpFpvoPo7R*xJ&^R zJVCr{?6;}1LI9fKDdCZ=Yw?zpSgpo6Ukxi6Bg$D8CpB3Tb$h)4>Deb7Mf%5Z>>pvT z6R1r;_>}0tTwAz=!mynpPLjbj% z&Xv|xXZMO3wiE?hiY#UYuZ4p=ongd=@Tzysx_AxI&}w}p2`HzTS^WBK(QIm#^a>(tt!I ztd?l!LmUKo+6p@1`Os8F;kkLO@_@4cC?riiNW|f-)<(r@`J0PTLfsUFGX^`BMM>SV zxX>^Yakz$*TKNr}=h0-U>U2|6$_rF!4J284WB1;$-x0`n52mcWY=l0YA}j`LtZ~Q~ zP%Krp=xcoJ99GqG?5L#9fdVigqcdsn_#LEi2pvT1!1F~L%aXMsJhTI~K%iwIMwyT# zv7FH$kxS;Iu2$*tXSV8oKTJ7e6RukBK#AJl%jZ~II@*{&h+yFr$WB*tO@C)GvVwjq zu^Wdl1pO)s-z)G}!xV%`RA>}TlXN-s<`Vm(%_5X0I70nIAxF_uj6XMXf^>*&Ns}8i zZfufOui+6t4j$6Mv<3+L`w6ss%Q0xy4fFZ_tBQCsgY7x) zkR{)CX$~j-^S+7NEX>x?|TimP~pjv5})5 zt+f_!hdgF{dtY{)iUZhlCp_l4b`Zjr+*_4bB~%_$p<~iB@mBL%o<{Omah75ltFXDN z#2B;|_08$4C})_uX=tma*tD9oy7;?99XhUaL+*3gWc{nJoLV#e2d7bgr%C(gd3kt^7Lq!E{23)#M*Fu`#k+na>^Ky<(na?%QAGl zrQcI4wGtB7#_t;0N_eo|wGt9`F4{PeZ1ef!TGnOX)H&VR{#R)J4M{1&pxMM#R?0Zc zBF@Oc-C}o-(5k_9bPbPvgHk|?v!($m>xLl#6VIzs0`K4a&kG4;{?J- z6@=DTIWQl0Jd*mrDH5HEgteg3jqI6fJoj+5Exzko5jd3b^S z$s?WI81uA#Qv?J?3^6sP8C#KiVXJ$4DqT$8NKyW#g|>v)fZNegtbkjN*l7M!N7dt8 zcZU9jnsyu-mtQShQGA&zdubC^^Jxw-i_7`S@BAt?Zxp(Ci)!E8i#^7N+ zO-IEfow3hEH+(NbM>ZMsId~a~yBJ)S(}!{{ot-BY?32`J%16p0x02{O?ZEl#ww^T9 zJdi_pGIX(foR{QTs7#GAQAkz=CWp1oB0`2dg#uCjyL`7#c%%0bRWTpi7-EL3)~^a# zdJRGfvP704!#l}mYS>14fbzMZuiM!Hp;p73B&4k`sU<HMH1^yG@;c=+>}?C~_M3m`u?FvObfJ{xl^!GS8I zk)M?wU2RtOj;hzZ@_FR=QutCxOpa-iZ;CX}cMRdq$*Q3CQlykm##t#XBM%|qwL#q; zN-zlUp_?h>vIzGEB~ZhFnaSma0MpA+Ot~>ppP+ejx?EpCBJU(Hg~O!$Pko4Arua~^6s+Ys@nCHhzbG-l1O2{{?LPt<;HWmLuy76r;z^mkb*AX z^*9@9H#zfx^eIKm9XRochE07J*~G$5hcnx@32(eu0mVDf@&W%QF|z$mu%{4^B#W^fdTbF9*M2zaJmb-_lR_5dItaTnCE*e>CpI zdo~G{NS?Bdxp?|HDsqMPPtz03N7z@?SB9+%@oiSL;VW)`H6+#P0XUgeug+Eq?ae{e z%J$+)Ib!>J%xr>YW$lb+FcY_@v27ftp&=v=agsXG2?gCS;91M>_{SMJq5biz33#6PDd-dow8QXTgYUHQ?e4 zqf`=}|2IhYwk}2b4$wW(xkByy3@>uA$T1;ZJ3|%IT6LgHm&84)K%Sz&LUtBwgE)S( zzo+mL^=lwjx2Aln&re!i1#K+1{*I=NXP1hpsWI#_5oxpdw>&XLNZxC9Yj5sIE=$~t z>2dWu9}(4^+ke zc)A7=yG`VqRM$yjBn;p>8g+to;&Jk(P1B=xEaDjF8P`Z-)U{?|=Nd8F$ou;7kVfM% z7yKr&K}tzS23VB*F^33XuY}~PmuRjEg??GWQ!LC7|88ykrmt!vnNDq4jB{D>GNHU4 zp735c*8v1Q^p^_YGQw*J;Vb2zg&la$x{9DmZqVcJaFs@zk-on zU%;j)73#kWU%bfQ5B{O>5?t`)Nca2|=wRt4mR5}S!=VXFmz1%}2%haMpM&N`ZNlF| zs%FjJVV;QHK}4?e#bd8#(CNNN?lk3)*=+Oi8Tfpg*3x~AND=2l`XW9&QOsv(P;_`$ zbgdSraA+Q&2}KYW(Q?bP%35fOJq}xQDTbzrwi|tp33gf3cWePI#ci$a7->roeCWAG#Zzy`pNX(4H9uO<<^VYMEBI^|bp=Qyk>g6>YC4 zU`^JI$9K9u1mE+@FNFNlgu zT$r=}hJI@DN9v2l%WCg=uwMEWI}S@0pxDip!CaMQ%S%jsv_$)uy7=M$M%%J;v=*x~ zVHAOGy=9wT=<_(E#}V8sjW^?(18+V+(p7gtLUcmGh1o2rdk8#w#~!xI~H2#yytoQfP%At zONt!5^Wy8hH8m(pEuU#v+joui5gq04uAr1SmCWJ?;@F00ZVw6hNQb)QX5VP+l^bN; zJT!h@FTonQ*VAcZLx=*YX|t+Zog!kC8tMgTOJ9ZoNKGQYyr>wa93SciyP%aoYIw*j zt|1q^V5*nobRzwE(Khn--PP8g+z{86vTg{bWy9BzNO%FuNn1ZIccef;KEj4q!x$&leFT763>wog1&_fCOr zOjbJ%UdNCHM8=Rruc%JCC2KrPlmszreHg>&pzT9!VTijr(|Yg&-bguMQZkXNvQR$1 zK&B!OV^j19bGfi3B)n230Hd1`b5%Y^^1F@{OaT@+Onwht_$q^{O?)Ilj{*&gOQhHwA7b8^z+>h}-g< zd!t9?AxoS;ffI*x^3Jg2!V)cYBx!3{)qdSr=S(xbrPW-)*`jRHm8s_7=F#pd$-H<@ z@~lcY2CwTG(Gv`iUB>is;Ve^XfIg)qp{w&-_*a&U=>x7w&S3Jh}-kED2UW4te2+PL}!@T9si_h=AxAw;$96(D! zJ#ScZMi+=~$9I-Q)v8VT3ahWUv(lj^-OJyu(h2^W8O?ye`5>%BEb6aqG}i-JK!fX@w6lv;f3HeE%^bu8%bZVY&TcY-yw{f=A%6B*qMx5;~8XfuhSBpX~vrAI3(*W@4XliK4nWkIyyN?&ydSe)$9#~=;Uavnvzc_aPT$?v_LZ5HZU>T zd5~F5kff!ya3jQcSeIOYQtV`es7@IAa6EQ=lYqJBf@Q^UgfWD89sN@`=idU&M~7Gm z(dQop0s1o#dK@|)!qBhhZ$i57GTR3SLD3;A`5)N=O3t=?*0q10oGu4D<1@0jWhIiv zCW&bP3bIS^=49Q2k!;O{efclrjZd*Z5n_X<+M zWYNaU@HJYB@f<`)+m8(z4Q4a#f8SqmeQ59db6~5|T3x*S=YqYC;VoLPuDa*T*pUrk zrqjN=p79Nxx=gF2lp4l}+c#T3Sav-)WsoofNM@_35gKfmQ74A-@z)@{iP&CPa;_Iy z^)Wq}(_>LKcP_8yA=j-jcy~xSeW`Z!3@_mUGyszA+PitPq#B)e5%ng?c56k!Lw-aYpWEN4L1>RXyD{W|4UDCpI3JxmNe$A25 zu;~Ur1~hC<#yRCUwLZ{fv@Ep(yO$J!9Pw06;;QLXun-7abgrYe7monz#&p>DZa;q5xn!x>$;H@_ZBibr0f2h zwb`0ZF?_Cm&OZ{kjCpI?mysq5FbR_hnGcxT#^x8+bJup+%H3n~4j-_5A?}fYXvX3k z0AGi$L9^tY5yhQ44Dg0Yb7}^lSa84FnIZKnXRO-0qG2BB?R|zZj}2$?MKYk@O_sJG zx9ychJR+uZbd|g;S#S(xYoSf`90fx}u6Td#*Kb-9GNmz9PT6_Py`R zDvizf7D&bSIC9_LL6WaADs2J8HHsoj;!Y)#Cc}rA&sG-ahHY6&rkht;q=%(@o@jQ7 zE6DdiP+>z0G+3BuhLBnM!9{1md*&Gh>|2b0gq+k0@F6`vQ*MfL-RvB-EMF0(%>p>s z^2Z5PpOlnOAf$e4Iy%|NL(t}tUS@2=)Fm@ETP76vfBJh^B_xOr#YX|xxiJ>cjiCn{ z+GAM^UQ5xkRA71NA?Y8E=9By0HODa1f*E#nT`Ju?K(u}ss=3qTMa+%Et?h=op;1X$ z4T&$P}qwSkJ6QUDwsVQwp=lXk~5$Hh&miLgmJ&>quZq&Yb`kx1Fa@axALr(N2< zzWG^)GB%e{xA(gn+})9;m+EIrw*W1L$%S8CG(8q^Q!=U1 zs`X8R*9>iaRMasO>X-FBE!+jtIz!r-_AmcA+k$5Wj@KvIR25BD& zCOQ|N0F0#~RBk%@$lW(~TsU+F&vWVaP*{d?Q@yS8t9CB$hr0x^MZ0wSB1V4G@#Hpu z;kK@-dAa+tVKylWQRb5S5>}hL%2V9`c+nlPcB`@~Ik!leJz6_iJL1~mx{B{LaSGBl zq5E@)P?jsI} zm{_1L!RK8kPC`xcaP<_asUv96uebY5I@VUOS*Y$#2OoSF3e#8?W@hH2s!rweUCBDA z61wI|Y(+YBV%7{yGvvEEd^+87x{SD7ClyHeaD=O>W1ka!Ln>EamA}mY0|wawgCOoM z35>gS_+c_fgj}DL6)YfJoTPKrCRH4?N-i|C-1fb>TXH|AWOcGWh!gVX@LIcNd0f#+ z(=-s`!FQuR1n_|+Nj~GrxQqV>$gmX;jqUWK2`AtQG zT$W-60_I#Mf_oAKSEI?SQ+a*k3%s~dz+XWHj;tV~wM+=g97G5{5krqX-98U@8Kyyy z5lmbZ{W;1*-a4{Re4lJKQXer2Ql=nrG}LPGA}rx*f+iAkO5n38-2BlKj7_M@01NQY zD#jMkwE1Z@WRXvBRb+BPV6#wFEJ;AfA`W_!p)25X!yFX$T8v{el$F0Y({r&0SX|*V z9nUJr`~@FWwQ5Yl?N`$K%FHl7foI1x5Xh5~Dgy1xIY+H!Z5L|~3NiO|Y&PsADQV93 z^v-%eES8%neW2unfe{8`Y$;Dd3&z8u)hGorRAhpEL6$&FC43lKr&*dz4vlh%+Yg_{ z?=-&*m-btbF+88dQZ&GP{P*t@AWl1ddxtHJNS*>soK!O}ua^b3ypT~7Oga~(Fl?N} zhPD!AS@OKmCAg_rrdDHv#Ab;Nn=Oqm5Mk)4@Tn02?mDgeH~rwioWUi`fWbWb-zaxQ zuAMaG{5_Qq$_(9A@l0B)a@r~>o@ zNs03WB;3B!y(5S;VF3*kS*|e4kNCb)^YTin@I+51qB}XIUU|#1CV80YQq2-1m_T{s z6n~@uc+k2Fc%+_}Bwmu(wG*&UN*@qCJ-y!TW2vc~-V9`|*CYDaRf}YyM@zp9eQ``B zTctk?U=4#EQSEJ5BTnTLz@#olmLRkBf(*?uN4fza>evNsQCt!H1GdTMM)1o|Y0k_G z{2wr&77~MD9}mZ&F3UAx+&98|700dx{?diKG~Q20KKXWRXQ8BwI+=c4dn9$6(Sl(d ztMC`h8b;+K)=`wOqp;$5lLgYF0@^a}g(y>^5!MAei6Z2vb-a(gKoOiG5O6@%tf zQL-RZ+r);A?Jfr$XE*=xh5(cT;KHNC#uz9-VZ_nWaRSRvlDa zra$N>$BJNnm=Z~RtAqAds}nnmOwJj;7Uw@u{_riq9xj=u#%cU4qkmlk+Wp2equ2di8Q%XZ3wV4Tzib>@%Dh9lu56_Rvi zYmImj6-L81)rK4Ck9d|}|7sqvqk>s1MKj<<1N`7NX60tm6B?C2u$pNq;*0BEZP4bQ z7G_@Ao|*i|0AuMq$c7)B(xPA!CpCJ^JG7YYA7}v}5CN1^kstM1lNU4Kip#x?pY|U| z|Jr;-5|kdeFO#p!w#|7ue3{kN`BzNpGpbVi=#q1a*>`C(p5@^7lJ)yF`Ww1Y-ws{Z zYPVQcdmEXMV7n{zn>6QSR%u5Kno?;4&e(TzrNh&ffoo&hid3eCS0CFEOjhhv)rOag z*Gv5oFvD`n7F^B?HtLDm$9b(A)v8LOp{OsKpr0ixcil(i@AJrXxX?{Y-VR^#R_$nK zCEFD2-b4FZSTX)CT)U}hDn&5Y4&2Dp`u4hy%HPM*AHkn5^{byvzAfu%g1Elyj;&en z$-8GIv~D{#_JwC|960)eiJKAMSLBOh%G}PdQdL9tFJ8NL9@>>ksRsgZPJVlBn4P86 zZi1i!|4MyxmJ_P^Cn9k8VlqtJ-%fSh3!VZ|Ei~v-A{MV5UmZ3)b|;xFd2-oopH?5t zeu)P2Zz?ko!!W<=ChuOCJnh-s-hPI3>C&q+98UM&pdJT(byM2V+_v8JS9JkbS5s&> z;rfAZt7(`t#0@!ozgtLqshAGGxKOnQfahq~EVJ)l)%X+D4XW7HppxhZzX#`%PDk#k+$Xz^mK0c{Zq!J@~cXic|{dS}*}U-Kgj}IshpwzHYW)$PzsM4~9-}iV2GA z68!KMfTCiQ*Y;#KFE*$w9}8!Da?EI&Cc)1_vk%LC!>HtGbqEGWN zz1$rBDnC>Gq7e@a%e|Rk1A=Iy%#tNq^|nPLIXXUX7##Lme{y*q4VHaF8HqB*Gr!q`Z+|PmS{bpm>Zu8!&xALG@b(>403CHjLXJpq9 zcHcKtR2u@pu=JTQ9lyPB`8%-ZfpHakRNLe6Y`69bewBhBvL0(2q7C=;RINmNC)9aE z?X^fbLHcH(BVNDZzw-ZhVKd;t-q*lb-c9v^H9MpzSbwv?tTyiRr0IYgfQ8l4=#CwF znTVwi^e1?gXn-`Ey`wA4O0iGd?l2>~?RS1m$8 zf~W|6L~9Fe&;){F2WP)i%Et&UqVuL8-><`=X2EdG3Yce?=UPLL_c=yPCQ}snD7C@A zZ}vF^MMc<3?Q@`c0;D6WdV}faVp!;XVi}y(MTZIfO1BcblrM#U6TKDPCHW|MNOOK> z$0H2DdDA4!b6`thjzpzi=dN042U>6h14MyP|6GXw44fXaMBo1< z9r=jFgD-X{3{eJ{p7pT#lZG9l30ToJD*6BJvqXRRMd2VgzD~?>6xi*%(`68AlTv1W zbSuJ*M5K8WBoD7%BL{Kl_MhJrI;bL~lyHfEo)NrM1Pm9!W2IOicKx@`cBZ}_7s0F6 zZ<_>2)gl1Ly^iXmN@leJhlB6{8j-yP;EiTSymvVZf=+y_|89*HImV#Q28FG?^;^4Q z-roL`MqOx9{OyInTD}eA=SXP5pu?WMLttq{!H{U(>)Y*gxf4}$eQJrC5&euTT(Om5 zk9f!_D+B&rve9}9V7H~89mdlQi*^&2nS~|I9s(RszO=mm2%QN~ac@9gDgb6UwQO^Y zycshGRryBV0U1DV^W$dquIFbmfiLFL*Xa3?m*Xcl=JZ?20s)snL#>{>h&#w`b>H*T zADY*ipf7xupNqw@1cd2_tzj*b$u<2^n|$#lv>ug&uG)+FyX z4^U!$HKTXX23dQ)ke?-!KDg(~eq|>gFT0$q1@FH$C?=%)! zd1fpV3X&=NShgW?+fuBzJyp!$LFyxl8)IsQV^pvawbl6`)67j%k}b7RN-zxYeKXIN zdi^)Rr5Myl<>Bah-!9MOwOt$7x#sVxklgI!nYW(GGUr?~!qhRZF4Nzps7EsW0LS7M zgL84kYE4jaony9E2#&NWbF3NTqXFx2y5B?99#co8mE$X?M*Z)P9N2%pm*`g@)CTnV zoqY-(*=#2cG7F3IOEY`e1N{l5t5r2TYZeqyNF*AJ8(DUkO#- z%5~|{|E&mXP14ZL>h#jgmB0WK!U;2kJjjQk+fdZmB8#%3moylpCBN75cd6OsIHs31k^ZM3CSPPz5et8<*g?8@KE#p=7fJfJp-qiGx7@MlUjW>4$XB2 zdk-=vElZ$4j$_Q&K7rt>QYYE$atQ=xy;t7k*U_EHh$`!PJf{NiAxGM>(c9Xe?v81maaZ~`t$rbybaEN_(bSC&u z?4#kgUI8rF$O1Udwb=iJLk!!ok?=opfM42XJ22nJks19H_@4}NrpFfi_)o%|SO~>X z99bOTaXFn2X5)m8akv~$M)Qb6rvI;RGO7@a^CiQa|4F1%BB2SeqGMnz zaUc%iG?L(dHV{iZ$SFAbpL1MG7y`#>J!-Iz!*=lh+L;5x$7XPl!wyiK@Ps3T2ONX{ zrwqgi;rP%0Do@sQ`u*C~;ts#nDk@d9qrlIyeGkC~9?^nh7)dOOvWYd5EXHLI zEe;_>JT*BBgH_EzE8{&I%}vn7JE;#8F~TCs(_ zv?kqR#G1bp6B-F0(;7MmGQ4$WY->tguy6)NYAb>fKpl!sFx^b#Cv!&>Qt|D>XauBN zc;1TGSCaU7R)ijl@`-rEZ&EN^4cx&8STV{O5{)SOVnYZ=@51A{HD)B#+7N_5f*FDl zt%x3!7Y)=Nco(GcPJI_)FOIF+p`qihU#k6?B0bxoiw*9z)%xD`vqZClK#w5f%O&5{iG=$3CY7lDrmV~sUgGkf0Oj}A9U%f<^sS9Mm`MG zxS|`L({_kG*decn+QqjT`Z@xH0$LL9OH+NAAKyf`gw_70%Om&*xs$IwIV?rV>KPSzM}`a0OqM^s*KciM;AgV;A&fztAv$a@rQaDt>OjQ7BMK2e&Gj7e+CU#1Fe)gPLdJ zhv#Hso)QM1I_)bO(}Zzj^JcpVa#l&YK)r7MRCl%kNyCFGB!2n0Yr$>084e4Iu z@g_PseZI>M=ziyR(<@+s&ow=5MG)TE6P7+r(TtC0!LQdKHWnNwa@9Toe=46JhtsBR zMjABt4q+usn^=ZxOnY8iLo~}gyg%?P4HTsA@ah6IM`rY248?q4;&G3ROQ+CC0zlCS z)40$CBVjMc)J21x5`p{)G1o$v2B=e5)6rw+7f9w3lph7_E(|Q)zG@VM7PsHv9n%9m z7(yXgAwACB4v(G6#Y0(`spfEg+(e_^g!>DSQ2ua4=28CcAtKO^9g&hvI3|^#3?Hj} z+YIg)OqQDOfciM!3LQuG3V1ZdM8#hjSS|HT`ieKuGIiq$X#w8nCQ@Gkr*}emI_JxU zfB|!l&8I&pP4+UL9*RXxOij!}h%21ei&waw>CgbtL&whHO+&g{S7pnx8{B+IRLo?B z-D!1|MKyOt754Wv%j%cxaZ7cRsmiLg_G`*&qoJnCDy}6}T&oJznnRl?z480*GLIB! zqg8Ywo~vR}FyPEyOSILba%71ynDRbb!C?C}vWqBoq!+^`EQ82s-xRj8w6MA`8g-Y; zNCfTCs_c|#`&D5#vg@GEIS#JjGOi9x@97({;Wjk;@Bs5M8?#E-`4{JWTD2|${Z0RU z&htIwbdhI=Hx*gc=ep_jt(w(psnSqi#u@dOQK!495#Y`7=BS}iTh{!FHi^BKLk`7b zmr@*cE%9h*@RM6Wwc!W@jr4+k$@%dxRFL~nHmJU!|Lp3Q>dWm%Yk*zv?_-Yk=8D9e zl+(4VOdeNXjZGcRwD246@xAI_t(iWm%0ZPh(^5n2UEpyx9_y0LDlSJZ$VZ}qEbBi>_bq0%K+|mvZXkH=`L=eO!ubC~mHA)#A2JY*l%VN%&n*9g)_!H1Zr%m8&>#8ur)ZJS%8yAEZ(CyOI6d4yg{}sJZ8wq|? zdHl0s;|-14B&Dh}ziVAo#uicA$O1 zWQ_yRCuX$*AvgpH5hGT#{?~@;4W|2K{nMHP#M%7PssA~7U#%8?IZn=N0skV&!t?#_ z;t-*j{>Q6jbF3Pl&q{GwHbIQd=Ww+A;^$_dafK3>{Evof4g6jBU(*S5hyP>YS|5De zf>27zQUraqL402D`xs&A*Jez65^SFTacQOx_ZsAO2|Tt!^=~B1~eLv0Ne>5WcbrSHTj;>CE)Vsas?TS1-Yk(8}h_YJW)}k~AeJeryDnl?keI zK(DmmT62y>&e2`J>#KL#shtp#R$Pb71f`w`57!fkU)Ts^O zQ)#>gh?2%NJ4~ytcoWjIOsh!!X(h1K%TC9}%Mx0@6yd@~521eiNth(XgjnT~X%nd5 z{UQ1&dvH+;hc5+vsZvqslb$X4_L`mgjUtbHyV0u%gSXI6025J)&6Z9-XU-SZZY>D# z+!Dng%Zb9=l;!C39hu@ub2VYAYOGR?r258&L<2V56z%dalvQaCzPPo#Kehx{f$;xn z?5%_92)=z^+=IJAfZ!I~U4yf6cXx*{xVyV2kc|X)w_w2?HXbxM1c%G-+&Xp7t@rBH z`)_J$&8+UJ?w-|aRe!#-C}*UXGzVa>8WC+WYfXK}60B`7VwKohgv8Uth7Tjz`j466 zO7eY_dUVIVT%#+JaH>+IPI~0OPzX;=x)As)UvOz{ z<#9BMyA<7pYLoFaaF{so8CjjLpkTqmceij*WPVE5CK%cosVTN#lu_AlpOPzeDBml| z`7Ls*GT&k0J_)vLwPGCHZg$o5-zeE-9bQ#OTw#!*YhIyd2gU+=-x6v^uw5uVXH7u~ zs1N%0^W6`dIuYsjiPH}vL(9N~a4?0VGA#OujEDfDDVSFJ5PfXLi(%#_EY9_Qt4k0W52Dt3V8?1POFQ&f)t~}X_EX; z`{bX`K}=fm?BFtR4O)qp+YTCku4Fp#11w@M1LROLkFC^MwF zkSM-Y(Abv46WPmcZy=Xjkqy@}1$dbOpq+nH&W9#j;qvRe9ki@txT3p9_Iw^!4j9?Y zu6#EVtBdTLqTHWxpep`=3(y#Lv%{>%eEi4mw|zS0W(hg1ryV?nqfz{?w&Q$r%?tR+ zt94BzXVGG+!6c#GBJ%Fswh3bP8B0lAp+=R*!$mbJvwuIu3%pwyyj!6tMguvCuy@C+ z?B3v$7v#Oi<95b>KROGDg7!Q?+Gd=7s2_~oIEj(|w0|z7Ddj+xIR!1G)2Ca1nuPkd z4&{Ypkg7G@NVGt3IZ)wsx3t?l@+XyV3Fm;amu@HkIF@?(_`O_vlk&^mBy$uBp#bzq zouFsK&_bFLY3EIjN74-TkTP)dO0y%(h}amZ0UgTYr=gbaJfL~dWbvSBjFycmQdNYZsADgjGtp&%xhWz$4& zvsT;q_)Ye#ws3WSP?OihX+FxGS6dg@MQK#H%Go?bwm!#u(s#<>ZRadcGzh=t{m>D{ zYLYWjF_vB0n#PE6xYMD%KcB8d?oq3xWXGncitiaGOc11n!$-;7~WK&s=MBuR=Crn(po@Q_M{LMO#&VJWgawG=76F6^suCCWtIeK`P7;s;Sy`q{_r!r6tu4*@-=IArBnKJvjx0e^dhh z?)<{4(D}xDVUFv^E$kXn_`E!n_)+z8-DykK`w}RiDBk=de#c&8epn;(QWMS!?FBjb z#0Q&0(Y*Y&lXumN8@S-)TuQ_5Bttx({Ne67PO(i1gh&qPKXs#k8}z+wJOJ|9l3`Lg+CL)st}f z{V#ChRJDzxPw8;_^_9Xc`pX90ziOf8p05+RDI94vhaC4TZG?8n2~OwqwOd4im|hG% zUW!plcikgTlKM8i7P_ZJ-U2A1>n?IaON%Xm_sMJ0I-;s-6`s<`bhOISuFlezvdI6m z0|TfavW?d#GbmOos_f#41OqKoz4;L=&VB$^q8H*ity z1cZ?+h*22nV*>V>wqvkNeSP}n{k#6+q}Y_1ouO+aE8mE3sS)B7fdb~32o6x zX!z7jkC;-p#f|?Lk#s#(aH2`ip$`5h4Or~^to&YxBQ)dC07{c-&FrKhXB;z@q5Fei z>BwVbYQiY2_Cv%F^MGGoIOk^LGk|w@67@+j^{p;OG zW0AMl(~|?><$NttbPDo9@v(E!`u}AI$@?D$X(ssvG$p{v%ggtF?Sk|xH{Qjh-vYxa z)+9(FZ0xvh%DJ6*0;D#DYw{7evsBqPZ`!P`U z${_9p_FMrBV-Wz*{cDw>#G_Bvf z0y5J9Ouu9>DNCw?OUJyN(clPR5N+wln#`OrJwp$!(&?0gRkWa=`RLipr;j4#CMgpc zOW#b1Q_B&REwnxp8)PanmlFYpi#$!V|4a2^sl5AZlm-v6_UCiC=wE_uUc%DyCxJxk zk+d&XHQX$M&16j(W0q}aOIBqm>Lp5$Y7+Q5?bsQ@k}xh$jG2$t5jFn6TKl)bNW$pv zT8do*@OBEFAK=$7D=KOOWIqJ&2ofWJp#}!tQ|0jtVZPsFa~Zd+9#dMRm{Hbett6%4 zm(`&&s=2%^Bgtc4`-bS|zh;jJ!y-Oh(^3x}7o7dlx|WFR{cw63k@NyB6+yj-=$`ty zEX+^b!uk6TIpV&!-#LD8fJhmFV{t{Dds+*b;X9MNdlY}_;wr}!=jgQyc{W5K}OYfg%)FPx76Ca1_6ayN& zMWyj)TPo#=_)wbMk6yY^6XPGNN0Q0Qc(B>Fg#L|u{g}H`we8j);No1mw@90(DK#kY z7;n{tFsr0MO+3WExpeoN*L1Z0N&^aWD;1a)dEVBy!l<(hHY=5&qj@>XIk{Te7PXp7 z>;}YN9eU3A^a@G3I6GP1O*)hZ}7pS4GW|yv-oTs+2WCHV$ zO0{-3A&4{SlgLQ}IW1g-;4hB2cv^1>5Sohm@B@We1&!WgC6*97ech&Q%H9vv+(=+Y zC^>n(S}sCHB`E25P#uqW({EAjWUVY}Eo(ch#(F#u2|BgGre0`Kdi94g>fidrXrTY{ z-|+w6{~5U>w&qH|JFV?E29w+G_~K2~RjV$TTM>)Ia0@(8Wi%{0#AxYsK_$b-TH#9n z-`)D}UU6$Fuf9M0W+1I+8l#i{Lwb5lOVg1r%H^y5hY+o1o+KcK%h{G)GkcYuvC5Ty ziSoZcK(m`uM+Z&h0udVCFo3j2NS9nH&`7x}8E)bOhp zXB17RPDWJ)NC!-Lvp{Ur6NbRrg%yHBL;vq4>($u`3xOq7-MCli~ z_^7%Mhp9Q%U7{515z`Jycmpb|pERZK?w)WL&H&v|Z1kP1mX>3s@6@0U>K4l0_^v)e z_&=4xMYmock%(MDn@T5XHgchq*5Q^2cHTwjH5!JxDp<5nBSVC&Qo5LnJ88)g&)mZ( z6ENfh`xmv5`bmGFaO}jNcd)d+(A2t%gltTx#XTUE*1NXrE{&M6xnJoMn!O0N;CpdR zr~Y&F00{*(q970szn68yxzDgj8;?s{BT_&}EkE>s!(fr?4v{t<(g0sP7e zCxhidKTC@jD+*W799;W3cW8my=N~vMo>-b0mik5w! zHC|^^d$5C2-EFLk$UFkS-pdJhg&PhP(OUR@h?I}R9$lwd^bB-inyr3-K1~*Dk_BY1 z^zmw94QrE^x#Fx4^fW?$P1_r>hu;m@S+YvoAI+On8Oy&)toqqd5O~v8@f!T#CA#Ls zdA`#)TDd#d{N_KCDbMxAIEA5Rz^u7c0o9HNqz5pipAiSr&7&eK6(_L!+1*n6D{rQ<|wwc(BiaAvh?+c)UQz<>>PKRF3K`l=lt#Z7|X0xnA%7sm*nr9E! z1TpC7m)}QM!tc`6+&Jvg(P`kG7e65x1NzsV3uaH~4=idS8{=SAb)EGGyNYjf}ZaF`u(bDd_%YLv0;E4*~prhIH>@ z$DXGxLi8H8$NL-2xKAL%qVPFsW6_Ul zXFC$_K(a20+QZfk;Os>(P=hi7;~jaTiPyqjB6wf|pXTZ_^YQhDAAyB2GT!X9e1f|13OAYM^eQkJ4QhT&-OO<-- z;Mbv^1Yb5~&X)GWnz7n>7iMB7MAG3>ZM*Aiap1%0(GFV&fbIMXzRdrOVvwd-8J2Xn zk{OHOt^*sZKE9oaGWttl@uGbR(@*HMVU~Qp5BenI9>9x&WB}^Y&15%OY97Wz;VVji zx@%iV5;iB2y2&E& zGm0twp;4FlN5eQ3X;smZi66xzYLhCtk8=nm@#}rOos37cp_@ zrRN>jn{`3SGu2M(XuOXUzHc5+1IB?wum8rEwtwA;eto_@$xM8E++2DWvLk(^2s}h) zc#n)Td9R_l0ZvY?|4YBlz%Z7y4e#r@v09>hZ+%TSJe7%xSr2?YnnOWq69FPmY}e#l zqNcj`(TRs=qJEd@DB1*?HZ7#Iw6c^b-A|-Yx$)xSh4Gb>CIfi&cnpYn$NSjbUv1yK zP-FmzObvctd0ql(;|(dwX#;_~KzZO@yYBMlvCAOvnYOVcj~CU|5nq>!Vx2CL}X;)+vhdx}EWBmGbFQ?Ht7h zp|{%SWOvioMxnP8sT>B@G+s`TrVN{8g(!Z>;mR&4Tb&Y<(T*l5j{m6DodQmO^@_3y zR_TvgU|7}q)|z@bQKG&re?=kC}>XLH1m6!$>aX0%*~2UFcW zB2(1_*|OC@YoQZlYEw1$#$JsG$JK)GEW8C(xS1P@Qx}an41{K`G7sA36o?1lGHEJT z(zAg&cdL9HRCm3Ha9D{zp#^U7WrJGkxJ;L*?Jlgn zXN%~lwn?A!&2 zUl|r7o-MKLRW&CrwW&?{V;(}h_GqA_=crdFGZ$5~sHIKDr?XvC{Q=4DJtkCIwIgEJ zd|%V?D;v#2^z;L2sH!<>tNOU8D;hu`M0D)+<<+2~NgjmRBzzXw2;%>8U-^IBFPacz z&94CeX)&^sgQJ+LH3_V(Tx?RYw?lFO4y{swhR_Wb^G$ciZKvEwmp^WhG+5!x#hF)D$GBTv0~lY>Jg{ z`RA08E88_UIVduC#Qm?*KEH?uj{)#y(X9}iV;0xFjLrq=V=MPy_jUTNr4fF0W6AHG zGY#zR5tY=%?;HiIGCa9;I^Ndg3}pZO0FZni4;zAyDY981pwixl&po9 zxlpe-qIaNxxWbdjWHl%$Wae(fHD~Kvh1+rEXCGPxM>)uvnTjXl1;0s>uFlUe7siaT zrjw|bR}vjVmCsVwli7e%+UgNv;ur_Vg7ME)71_C-tLvmjhDcPQW)$MB2&~9tIDr66 zU8whw|GXWSxM9UA)6HYL*BR5l)^3S&YsR&*fb+;Kr^ z)#rY*lN!drK}wxPc3Skw`OyzhDIgMS{J5Cgtpjm(ij$7I z40C`Yf007;BM<)l=Y7_TKd+}JHFol+_0tJSvl=-bg9_5r(TL&|+z>caVtMa+)L05e zOsIxkFdMeybHIZVhmy491xjDww8kzHoaqOk2bn);aSLwURHv+R<+>SFz(B_`Y1{ z=;C}okp>c`Lhyh2<**XaY$|4MiZqji)0?wu%SR(w(brc*r+M5vp?0kv8VUB^S%)8M zJEw8`l|Fv}i~4*P<`d|NJys#6rifuflv@N%`zKNj z_`q@)+bM(K!qp-5U8*^2*NIROmHosY-JtzVp-$k_w^>OUZK6@i{pgqd*Eh2_x4J@J zh1`t+_Gpam=K(^*ja}prm*XWjmNw!q8+Q88KSi+FBA&tHDWIe@?k&sF(;B(8`I+0X z4cS08=WN`BM+|bqRy35KhDJ(wRl!e)sOpTAl0t;)-5rs0w;0-dt>kM)!2O`RKVfar+vSkja2M^1oO z9CAGzA`GYk224!VnDZXteAPqC5YtHN@m|8zr;Tf2b!E>pkz5M%;r4PK_F6{tc|+!h z5)YM^5Qill$O<;-lB>a*5O3Ic#_ zK<4@__n_~TWf*$ub4;K`7vaqSEQM|g0$F1P!@T>U(8)H-w0xM7X^rYsF^2CX zW8O8DFCmSt>qOJ6c3hDZe8rCxDeUK*V8&kqF;3MYE=Ga%e{0^1wytixPkbRFZ&XKo zK3mK^W}M^q6g>Y%<8r`eQpuv^mu4n*iy{emqB0)eOf2Tg&%Ms2}C1TeD>jG$oqKe(;ac@NBK1({j=xkdTQJlcx?~3+m2M}33$0W zqIi3F+`j7=c!TM|>I}{#gN7l`1QEc1fOmZ%HW^ztcMnQV_Rnm}l$^Z(Bl|a`qpLz9 zkNL{M+L$t!O#o zC+zYxlGX*V3v?-9pDw5bvy@KU^w_e3^^EId-@$=`Oip8e72C2PQ@{Se9O)?%_-Q%l##O%|~P@yOm*+v=TL( z9Q=ovIJ3w2MI&LZ-m)%x@WxlThhoWk=$+GAZzc8p+jaRLPtf0~?msujrDn?DnKM>f z9@ea_F&?(3@|A;?=jN>GMu+{$^PhI=nI0MO`!vSQ#>`_}_nLt6E6a(UfdxhR?usXO z*J!uaT-Q;F-DV*+_RHn_0ktp6YzS$BoS&Aai@_9LB9@VV%nX!&#@Z_BGJ*E3c_McOjYZ>I=X7R_z$YgO3JAdoLxa zFb8Jr6W&6Ivm8u=L7G#X9&Wc`{wOcefi;^g8BaM2He3M4upnEJb|F%SjZImBrUZihmyfIW+mjv>U0yE1%JtvIQI zreb=s{KUznh7$?zx-YRElMk8X`OiI8f(i=cv=_{R^k*XJ3%@tHuV=5ITxm>-I$v-q zhGDBJCEbADQoHxH@Wj03uP~2b4lb`)Ggp@iecf)}_M(JwGi>L+5oQ%*F^r0yVzF>0 z_3^aH!og1S-~R0~R=NcrXTQ%3Sl0gW%W66`ojl)X_FInqlFNN)r&TaEg(R-!dS%4& z$Q`R%DmtLZH$%Zw%B-wx8@jA*ft#vlL3%&pll6cXc6AD9YY@(zZ1NRuJS)=+Tz4U5 z(>m#o!oDfChDu%GHRvLUO3XtBJNPeS9OGT8sfY9{9v3L^Lk_jSJ1&|)EiITB!}|jd zb+2Yk{GLcV)bl`R11p1VFdG#yBX7wrqttdq&Q@O}QkrMZxR`WQvfa_@ULZYpRcanJ zsV5LNl@Br?IgKu9F!Np29q&pdPuS~M=ZwvFxu+>bR5FVqyoxgVNlLWBKv}RbLZF4n zN-45F2y2Ztx>4u~y~I0m2B94E%FkDH7f^Y52(Q}lc^`(k>-!iXPvIMLN%{p=*L;>s}o6I^>rgHEQ! zKZA+X6lQC@&`n4JHvGq|OzhDz8R?ncpKDY?dH!aA5RCAG-dc7bA`2<)@7QAO@?+NWG07j>oEALY1s|yodx9sd9tO z8!7dT%nYO}g+FrSRgP1HB0#9?gewhj{I)MMbsnLp3j6pSYFe)A1FMdzI4P}CUpOM- zesyk3Ojmj?Vvz)8Bx!4#)>4lHz26n>VR!huVcKn%Eue^-O@pI>JJ|u6SFtPA z2Sta$_o;PYya4#}IGs?9dEuzv5(Gq9YvRk)if*#m=iyqtBP=^w#4Qed8564D(qQ>R zT3VA&&?}TS`qG8SI+S#j>OHUWl;JOnoA7aZUACpbkaw`wsr7R^~G!DNtyDU+f$SZ5PE?V>7=t?FIJ z*@!!1Zb-zDrINaM0+Q0$L&5xmx;pfqWs5@YqoDvI;45Vz)Fkx8&gG z<>xhLH{-J6Fg4?5=i}q!=CR^tx8fBMvfwu5x8Sqj<~QZwx8h^BGB>ySY{|*NW5&+O z&cVUUE@H^0?(FPA$;JO(hf`t{*H&GA2e$t=@?C@|ufaMJ)7 za(jOE_*U4fg9(TAML0BK2O9SVVM7d~s5mPN6=7p=V@gF+{j4rWDCq-qpgr>FkTdpS)i{Q;TyA6wbVZv@5`sOO(Y|; fEU`p)(UDieoJ=iB7;;n|ZXOO4T3Trp8I=D8>`&91 diff --git a/oemcrypto/include/OEMCryptoCENC.h b/oemcrypto/include/OEMCryptoCENC.h index e63c92e..f55e31e 100644 --- a/oemcrypto/include/OEMCryptoCENC.h +++ b/oemcrypto/include/OEMCryptoCENC.h @@ -480,8 +480,8 @@ typedef enum OEMCrypto_ProvisioningMethod { OEMCrypto_ProvisioningError = 0, // Device cannot be provisioned. OEMCrypto_DrmCertificate = 1, // Device has baked in DRM certificate // (level 3 only) - OEMCrypto_Keybox = 2, // Device has factory installed unique keybox. - OEMCrypto_OEMCertificate = 3 // Device has factory installed OEM certificate. + OEMCrypto_Keybox = 2, // Device has factory installed unique keybox. + OEMCrypto_OEMCertificate = 3 // Device has factory installed OEM certificate. } OEMCrypto_ProvisioningMethod; /** @@ -489,7 +489,7 @@ typedef enum OEMCrypto_ProvisioningMethod { */ #define OEMCrypto_Supports_RSA_2048bit 0x1 #define OEMCrypto_Supports_RSA_3072bit 0x2 -#define OEMCrypto_Supports_RSA_CAST 0x10 +#define OEMCrypto_Supports_RSA_CAST 0x10 #define OEMCrypto_Supports_ECC_secp256r1 0x100 #define OEMCrypto_Supports_ECC_secp384r1 0x200 #define OEMCrypto_Supports_ECC_secp521r1 0x400 @@ -504,12 +504,12 @@ typedef enum OEMCrypto_ProvisioningMethod { /** * Return values from OEMCrypto_GetAnalogOutputFlags. */ -#define OEMCrypto_No_Analog_Output 0x0 -#define OEMCrypto_Supports_Analog_Output 0x1 -#define OEMCrypto_Can_Disable_Analog_Ouptput 0x2 -#define OEMCrypto_Supports_CGMS_A 0x4 +#define OEMCrypto_No_Analog_Output 0x0 +#define OEMCrypto_Supports_Analog_Output 0x1 +#define OEMCrypto_Can_Disable_Analog_Ouptput 0x2 +#define OEMCrypto_Supports_CGMS_A 0x4 // Unknown_Analog_Output is used only for backwards compatibility. -#define OEMCrypto_Unknown_Analog_Output (1<<31) +#define OEMCrypto_Unknown_Analog_Output (1 << 31) /// @} @@ -622,6 +622,8 @@ typedef enum OEMCrypto_ProvisioningMethod { #define OEMCrypto_DecryptCENC _oecc105 #define OEMCrypto_LoadDRMPrivateKey _oecc107 #define OEMCrypto_MinorAPIVersion _oecc108 +#define OEMCrypto_AllocateSecureBuffer _oecc109 +#define OEMCrypto_FreeSecureBuffer _oecc110 // clang-format on /// @addtogroup initcontrol @@ -4723,12 +4725,25 @@ OEMCryptoResult OEMCrypto_FreeSecureBuffer( * current version of OEMCrypto. They are being declared here to help with * backwards compatibility. */ + +/* + * OEMCrypto_GenerateSignature + * @deprecated + * Not required for the current version of OEMCrypto. Declared here to + * help with backward compatibility. + */ OEMCryptoResult OEMCrypto_GenerateSignature(OEMCrypto_SESSION session, const uint8_t* message, size_t message_length, uint8_t* signature, size_t* signature_length); +/* + * OEMCrypto_RewrapDeviceRSAKey30 + * @deprecated + * Not required for the current version of OEMCrypto. Declared here to + * help with backward compatibility. + */ OEMCryptoResult OEMCrypto_RewrapDeviceRSAKey30( OEMCrypto_SESSION session, const uint32_t* unaligned_nonce, const uint8_t* encrypted_message_key, size_t encrypted_message_key_length, @@ -4736,6 +4751,12 @@ OEMCryptoResult OEMCrypto_RewrapDeviceRSAKey30( const uint8_t* enc_rsa_key_iv, uint8_t* wrapped_rsa_key, size_t* wrapped_rsa_key_length); +/* + * OEMCrypto_RewrapDeviceRSAKey + * @deprecated + * Not required for the current version of OEMCrypto. Declared here to + * help with backward compatibility. + */ OEMCryptoResult OEMCrypto_RewrapDeviceRSAKey( OEMCrypto_SESSION session, const uint8_t* message, size_t message_length, const uint8_t* signature, size_t signature_length, @@ -4743,26 +4764,70 @@ OEMCryptoResult OEMCrypto_RewrapDeviceRSAKey( size_t enc_rsa_key_length, const uint8_t* enc_rsa_key_iv, uint8_t* wrapped_rsa_key, size_t* wrapped_rsa_key_length); +/* + * OEMCrypto_UpdateUsageTable + * @deprecated + * Not required for the current version of OEMCrypto. Declared here to + * help with backward compatibility. + */ OEMCryptoResult OEMCrypto_UpdateUsageTable(void); -OEMCryptoResult OEMCrypto_DeleteUsageEntry(OEMCrypto_SESSION, const uint8_t*, - size_t, const uint8_t*, size_t, - const uint8_t*, size_t); +/* + * OEMCrypto_DeleteUsageEntry + * @deprecated + * Not required for the current version of OEMCrypto. Declared here to + * help with backward compatibility. + */ +OEMCryptoResult OEMCrypto_DeleteUsageEntry( + OEMCrypto_SESSION session, const uint8_t* pst, size_t pst_length, + const uint8_t* message, size_t message_length, const uint8_t* signature, + size_t signature_length); -OEMCryptoResult OEMCrypto_ForceDeleteUsageEntry(const uint8_t*, size_t); +/* + * OEMCrypto_ForceDeleteUsageEntry + * @deprecated + * Not required for the current version of OEMCrypto. Declared here to + * help with backward compatibility. + */ +OEMCryptoResult OEMCrypto_ForceDeleteUsageEntry(const uint8_t* pst, + size_t pst_length); +/* + * OEMCrypto_CopyOldUsageEntry + * @deprecated + * Not required for the current version of OEMCrypto. Declared here to + * help with backward compatibility. + */ OEMCryptoResult OEMCrypto_CopyOldUsageEntry(OEMCrypto_SESSION session, const uint8_t* pst, size_t pst_length); +/* + * OEMCrypto_DeleteOldUsageTable + * @deprecated + * Not required for the current version of OEMCrypto. Declared here to + * help with backward compatibility. + */ OEMCryptoResult OEMCrypto_DeleteOldUsageTable(void); +/* + * OEMCrypto_CreateOldUsageEntry + * @deprecated + * Not required for the current version of OEMCrypto. Declared here to + * help with backward compatibility. + */ OEMCryptoResult OEMCrypto_CreateOldUsageEntry( uint64_t time_since_license_received, uint64_t time_since_first_decrypt, uint64_t time_since_last_decrypt, OEMCrypto_Usage_Entry_Status status, uint8_t* server_mac_key, uint8_t* client_mac_key, const uint8_t* pst, size_t pst_length); +/* + * OEMCrypto_GenerateDerivedKeys_V15 + * @deprecated + * Not required for the current version of OEMCrypto. Declared here to + * help with backward compatibility. + */ OEMCryptoResult OEMCrypto_GenerateDerivedKeys_V15( OEMCrypto_SESSION session, const uint8_t* mac_key_context, uint32_t mac_key_context_length, const uint8_t* enc_key_context, @@ -4774,18 +4839,36 @@ typedef struct { size_t offset; // offset into the pattern in blocks for this call. } OEMCrypto_CENCEncryptPatternDesc_V15; +/* + * OEMCrypto_DecryptCENC_V15 + * @deprecated + * Not required for the current version of OEMCrypto. Declared here to + * help with backward compatibility. + */ OEMCryptoResult OEMCrypto_DecryptCENC_V15( - OEMCrypto_SESSION session, const uint8_t* data_addr, size_t data_length, - bool is_encrypted, const uint8_t* iv, + OEMCrypto_SESSION session, const uint8_t* data_addr, + size_t data_addr_length, bool is_encrypted, const uint8_t* iv, size_t block_offset, // used for CTR "cenc" mode only. - OEMCrypto_DestBufferDesc* out_buffer_descriptor, + OEMCrypto_DestBufferDesc* out_buffer, const OEMCrypto_CENCEncryptPatternDesc_V15* pattern, uint8_t subsample_flags); +/* + * OEMCrypto_GetOEMPublicCertificate_V15 + * @deprecated + * Not required for the current version of OEMCrypto. Declared here to + * help with backward compatibility. + */ OEMCryptoResult OEMCrypto_GetOEMPublicCertificate_V15( OEMCrypto_SESSION session, uint8_t* public_cert, size_t* public_cert_length); +/* + * OEMCrypto_LoadDeviceRSAKey + * @deprecated + * Not required for the current version of OEMCrypto. Declared here to + * help with backward compatibility. + */ OEMCryptoResult OEMCrypto_LoadDeviceRSAKey(OEMCrypto_SESSION session, const uint8_t* wrapped_rsa_key, size_t wrapped_rsa_key_length); diff --git a/oemcrypto/include/level3.h b/oemcrypto/include/level3.h index 846e7ee..7616c14 100644 --- a/oemcrypto/include/level3.h +++ b/oemcrypto/include/level3.h @@ -14,8 +14,8 @@ #include #include -#include "level3_file_system.h" #include "OEMCryptoCENC.h" +#include "level3_file_system.h" #include "oemcrypto_adapter.h" namespace wvoec3 { @@ -33,13 +33,10 @@ namespace wvoec3 { #define Level3_WrapKeyboxOrOEMCert _lcc08 #define Level3_OpenSession _lcc09 #define Level3_CloseSession _lcc10 -#define Level3_DecryptCENC _lcc11 -#define Level3_GenerateDerivedKeys _lcc12 #define Level3_GenerateSignature _lcc13 #define Level3_GenerateNonce _lcc14 #define Level3_RewrapDeviceRSAKey _lcc18 #define Level3_LoadDeviceRSAKey _lcc19 -#define Level3_GenerateRSASignature _lcc20 #define Level3_DeriveKeysFromSessionKey _lcc21 #define Level3_APIVersion _lcc22 #define Level3_SecurityLevel _lcc23 @@ -47,22 +44,16 @@ namespace wvoec3 { #define Level3_Generic_Decrypt _lcc25 #define Level3_Generic_Sign _lcc26 #define Level3_Generic_Verify _lcc27 -#define Level3_GetHDCPCapability _lcc28 #define Level3_SupportsUsageTable _lcc29 -#define Level3_UpdateUsageTable _lcc30 -#define Level3_DeactivateUsageEntry _lcc31 #define Level3_ReportUsage _lcc32 -#define Level3_DeleteUsageEntry _lcc33 -#define Level3_DeleteOldUsageTable _lcc34 #define Level3_GetMaxNumberOfSessions _lcc37 #define Level3_GetNumberOfOpenSessions _lcc38 #define Level3_IsAntiRollbackHwPresent _lcc39 #define Level3_QueryKeyControl _lcc41 -#define Level3_ForceDeleteUsageEntry _lcc43 +#define Level3_GetHDCPCapability _lcc44 #define Level3_LoadTestRSAKey _lcc45 #define Level3_SecurityPatchLevel _lcc46 #define Level3_GetProvisioningMethod _lcc49 -#define Level3_GetOEMPublicCertificate _lcc50 #define Level3_RewrapDeviceRSAKey30 _lcc51 #define Level3_SupportedCertificates _lcc52 #define Level3_IsSRMUpdateSupported _lcc53 @@ -76,8 +67,6 @@ namespace wvoec3 { #define Level3_UpdateUsageEntry _lcc65 #define Level3_ShrinkUsageTableHeader _lcc67 #define Level3_MoveEntry _lcc68 -#define Level3_CopyOldUsageEntry _lcc69 -#define Level3_CreateOldUsageEntry _lcc70 #define Level3_GetAnalogOutputFlags _lcc71 #define Level3_LoadTestKeybox _lcc78 #define Level3_SelectKey _lcc81 @@ -91,6 +80,21 @@ namespace wvoec3 { #define Level3_RefreshKeys _lcc91 #define Level3_LoadEntitledContentKeys _lcc92 #define Level3_CopyBuffer _lcc93 +#define Level3_MaximumUsageTableHeaderSize _lcc94 +#define Level3_GenerateDerivedKeys _lcc95 +#define Level3_PrepAndSignLicenseRequest _lcc96 +#define Level3_PrepAndSignRenewalRequest _lcc97 +#define Level3_PrepAndSignProvisioningRequest _lcc98 +#define Level3_LoadLicense _lcc99 +#define Level3_LoadRenewal _lcc101 +#define Level3_LoadProvisioning _lcc102 +#define Level3_LoadOEMPrivateKey _lcc103 +#define Level3_GetOEMPublicCertificate _lcc104 +#define Level3_DecryptCENC _lcc105 +#define Level3_LoadDRMPrivateKey _lcc107 +#define Level3_MinorAPIVersion _lcc108 +#define Level3_AllocateSecureBuffer _lcc111 +#define Level3_FreeSecureBuffer _lcc112 #else #define Level3_IsInApp _oecc00 #define Level3_Initialize _oecc01 @@ -103,7 +107,6 @@ namespace wvoec3 { #define Level3_WrapKeyboxOrOEMCert _oecc08 #define Level3_OpenSession _oecc09 #define Level3_CloseSession _oecc10 -#define Level3_GenerateDerivedKeys _oecc12 #define Level3_GenerateSignature _oecc13 #define Level3_GenerateNonce _oecc14 #define Level3_RewrapDeviceRSAKey _oecc18 @@ -116,22 +119,16 @@ namespace wvoec3 { #define Level3_Generic_Sign _oecc26 #define Level3_Generic_Verify _oecc27 #define Level3_SupportsUsageTable _oecc29 -#define Level3_UpdateUsageTable _oecc30 #define Level3_ReportUsage _oecc32 -#define Level3_DeleteUsageEntry _oecc33 -#define Level3_DeleteOldUsageTable _oecc34 #define Level3_GenerateRSASignature _oecc36 #define Level3_GetMaxNumberOfSessions _oecc37 #define Level3_GetNumberOfOpenSessions _oecc38 #define Level3_IsAntiRollbackHwPresent _oecc39 #define Level3_QueryKeyControl _oecc41 -#define Level3_ForceDeleteUsageEntry _oecc43 #define Level3_GetHDCPCapability _oecc44 #define Level3_LoadTestRSAKey _oecc45 #define Level3_SecurityPatchLevel _oecc46 -#define Level3_DecryptCENC _oecc48 #define Level3_GetProvisioningMethod _oecc49 -#define Level3_GetOEMPublicCertificate _oecc50 #define Level3_RewrapDeviceRSAKey30 _oecc51 #define Level3_SupportedCertificates _oecc52 #define Level3_IsSRMUpdateSupported _oecc53 @@ -146,8 +143,6 @@ namespace wvoec3 { #define Level3_DeactivateUsageEntry _oecc66 #define Level3_ShrinkUsageTableHeader _oecc67 #define Level3_MoveEntry _oecc68 -#define Level3_CopyOldUsageEntry _oecc69 -#define Level3_CreateOldUsageEntry _oecc70 #define Level3_GetAnalogOutputFlags _oecc71 #define Level3_LoadTestKeybox _oecc78 #define Level3_SelectKey _oecc81 @@ -161,6 +156,21 @@ namespace wvoec3 { #define Level3_RefreshKeys _oecc91 #define Level3_LoadEntitledContentKeys _oecc92 #define Level3_CopyBuffer _oecc93 +#define Level3_MaximumUsageTableHeaderSize _oecc94 +#define Level3_GenerateDerivedKeys _oecc95 +#define Level3_PrepAndSignLicenseRequest _oecc96 +#define Level3_PrepAndSignRenewalRequest _oecc97 +#define Level3_PrepAndSignProvisioningRequest _oecc98 +#define Level3_LoadLicense _oecc99 +#define Level3_LoadRenewal _oecc101 +#define Level3_LoadProvisioning _oecc102 +#define Level3_LoadOEMPrivateKey _oecc103 +#define Level3_GetOEMPublicCertificate _oecc104 +#define Level3_DecryptCENC _oecc105 +#define Level3_LoadDRMPrivateKey _oecc107 +#define Level3_MinorAPIVersion _oecc108 +#define Level3_AllocateSecureBuffer _oecc111 +#define Level3_FreeSecureBuffer _oecc112 #endif #define Level3_GetInitializationState _oecl3o01 @@ -171,88 +181,69 @@ extern "C" { bool Level3_IsInApp(); OEMCryptoResult Level3_Initialize(void); OEMCryptoResult Level3_Terminate(void); -OEMCryptoResult Level3_OpenSession(OEMCrypto_SESSION *session); +OEMCryptoResult Level3_OpenSession(OEMCrypto_SESSION* session); OEMCryptoResult Level3_CloseSession(OEMCrypto_SESSION session); OEMCryptoResult Level3_GenerateDerivedKeys(OEMCrypto_SESSION session, - const uint8_t *mac_key_context, - uint32_t mac_key_context_length, - const uint8_t *enc_key_context, - uint32_t enc_key_context_length); + const uint8_t* mac_key_context, + size_t mac_key_context_length, + const uint8_t* enc_key_context, + size_t enc_key_context_length); OEMCryptoResult Level3_GenerateNonce(OEMCrypto_SESSION session, uint32_t* nonce); -OEMCryptoResult Level3_GenerateSignature(OEMCrypto_SESSION session, - const uint8_t* message, - size_t message_length, - uint8_t* signature, - size_t* signature_length); OEMCryptoResult Level3_QueryKeyControl(OEMCrypto_SESSION session, const uint8_t* key_id, size_t key_id_length, uint8_t* key_control_block, size_t* key_control_block_length); OEMCryptoResult Level3_DecryptCENC( - OEMCrypto_SESSION session, const uint8_t* data_addr, size_t data_length, - bool is_encrypted, const uint8_t* iv, size_t block_offset, - OEMCrypto_DestBufferDesc* out_buffer_descriptor, - const OEMCrypto_CENCEncryptPatternDesc_V15* pattern, - uint8_t subsample_flags); + OEMCrypto_SESSION session, const OEMCrypto_SampleDescription* samples, + size_t samples_length, const OEMCrypto_CENCEncryptPatternDesc* pattern); OEMCryptoResult Level3_InstallKeyboxOrOEMCert(const uint8_t* rot, size_t rotLength); OEMCryptoResult Level3_IsKeyboxOrOEMCertValid(void); -OEMCryptoResult Level3_WrapKeyboxOrOEMCert(const uint8_t* rot, - size_t rotLength, +OEMCryptoResult Level3_WrapKeyboxOrOEMCert(const uint8_t* rot, size_t rotLength, uint8_t* wrappedRot, size_t* wrappedRotLength, const uint8_t* transportKey, size_t transportKeyLength); OEMCrypto_ProvisioningMethod Level3_GetProvisioningMethod(); -OEMCryptoResult Level3_GetOEMPublicCertificate(OEMCrypto_SESSION session, - uint8_t *public_cert, - size_t *public_cert_length); -OEMCryptoResult Level3_GetDeviceID(uint8_t* deviceID, - size_t *idLength); -OEMCryptoResult Level3_GetKeyData(uint8_t* keyData, - size_t *keyDataLength); -OEMCryptoResult Level3_GetRandom(uint8_t* randomData, - size_t dataLength); -OEMCryptoResult Level3_RewrapDeviceRSAKey30(OEMCrypto_SESSION session, - const uint32_t *nonce, - const uint8_t* encrypted_message_key, - size_t encrypted_message_key_length, - const uint8_t* enc_rsa_key, - size_t enc_rsa_key_length, - const uint8_t* enc_rsa_key_iv, - uint8_t* wrapped_rsa_key, - size_t* wrapped_rsa_key_length); -OEMCryptoResult Level3_RewrapDeviceRSAKey(OEMCrypto_SESSION session, - const uint8_t* message, - size_t message_length, - const uint8_t* signature, - size_t signature_length, - const uint32_t *nonce, - const uint8_t* enc_rsa_key, - size_t enc_rsa_key_length, - const uint8_t* enc_rsa_key_iv, - uint8_t* wrapped_rsa_key, - size_t *wrapped_rsa_key_length); -OEMCryptoResult Level3_LoadDeviceRSAKey(OEMCrypto_SESSION session, - const uint8_t* wrapped_rsa_key, - size_t wrapped_rsa_key_length); +OEMCryptoResult Level3_GetOEMPublicCertificate(uint8_t* public_cert, + size_t* public_cert_length); +OEMCryptoResult Level3_GetDeviceID(uint8_t* deviceID, size_t* idLength); +OEMCryptoResult Level3_GetKeyData(uint8_t* keyData, size_t* keyDataLength); +OEMCryptoResult Level3_GetRandom(uint8_t* randomData, size_t dataLength); +OEMCryptoResult Level3_LoadOEMPrivateKey(OEMCrypto_SESSION session); +OEMCryptoResult Level3_LoadDRMPrivateKey(OEMCrypto_SESSION session, + OEMCrypto_PrivateKeyType key_type, + const uint8_t* wrapped_rsa_key, + size_t wrapped_rsa_key_length); +OEMCryptoResult Level3_LoadProvisioning( + OEMCrypto_SESSION session, const uint8_t* message, size_t message_length, + size_t core_message_length, const uint8_t* signature, + size_t signature_length, uint8_t* wrapped_private_key, + size_t* wrapped_private_key_length); +OEMCryptoResult Level3_RewrapDeviceRSAKey( + OEMCrypto_SESSION session, const uint8_t* message, size_t message_length, + const uint8_t* signature, size_t signature_length, const uint32_t* nonce, + const uint8_t* enc_rsa_key, size_t enc_rsa_key_length, + const uint8_t* enc_rsa_key_iv, uint8_t* wrapped_rsa_key, + size_t* wrapped_rsa_key_length); OEMCryptoResult Level3_LoadTestRSAKey(); OEMCryptoResult Level3_GenerateRSASignature(OEMCrypto_SESSION session, const uint8_t* message, size_t message_length, uint8_t* signature, - size_t *signature_length, + size_t* signature_length, RSA_Padding_Scheme padding_scheme); OEMCryptoResult Level3_DeriveKeysFromSessionKey(OEMCrypto_SESSION session, const uint8_t* enc_session_key, size_t enc_session_key_length, - const uint8_t *mac_key_context, + const uint8_t* mac_key_context, size_t mac_key_context_length, - const uint8_t *enc_key_context, + const uint8_t* enc_key_context, size_t enc_key_context_length); uint32_t Level3_APIVersion(); +uint32_t Level3_MinorAPIVersion(); uint8_t Level3_SecurityPatchLevel(); const char* Level3_SecurityLevel(); OEMCryptoResult Level3_GetHDCPCapability(OEMCrypto_HDCP_Capability* current, @@ -264,14 +255,12 @@ OEMCryptoResult Level3_GetMaxNumberOfSessions(size_t* maximum); uint32_t Level3_SupportedCertificates(); OEMCryptoResult Level3_Generic_Encrypt(OEMCrypto_SESSION session, const uint8_t* in_buffer, - size_t buffer_length, - const uint8_t* iv, + size_t buffer_length, const uint8_t* iv, OEMCrypto_Algorithm algorithm, uint8_t* out_buffer); OEMCryptoResult Level3_Generic_Decrypt(OEMCrypto_SESSION session, const uint8_t* in_buffer, - size_t buffer_length, - const uint8_t* iv, + size_t buffer_length, const uint8_t* iv, OEMCrypto_Algorithm algorithm, uint8_t* out_buffer); OEMCryptoResult Level3_Generic_Sign(OEMCrypto_SESSION session, @@ -286,39 +275,24 @@ OEMCryptoResult Level3_Generic_Verify(OEMCrypto_SESSION session, OEMCrypto_Algorithm algorithm, const uint8_t* signature, size_t signature_length); -OEMCryptoResult Level3_UpdateUsageTable(); OEMCryptoResult Level3_DeactivateUsageEntry(OEMCrypto_SESSION session, - const uint8_t *pst, + const uint8_t* pst, size_t pst_length); OEMCryptoResult Level3_ReportUsage(OEMCrypto_SESSION session, - const uint8_t *pst, - size_t pst_length, - uint8_t *buffer, - size_t *buffer_length); -OEMCryptoResult Level3_DeleteUsageEntry(OEMCrypto_SESSION session, - const uint8_t* pst, - size_t pst_length, - const uint8_t *message, - size_t message_length, - const uint8_t *signature, - size_t signature_length); -OEMCryptoResult Level3_ForceDeleteUsageEntry(const uint8_t* pst, - size_t pst_length); -OEMCryptoResult Level3_DeleteOldUsageTable(); + const uint8_t* pst, size_t pst_length, + uint8_t* buffer, size_t* buffer_length); bool Level3_IsSRMUpdateSupported(); OEMCryptoResult Level3_GetCurrentSRMVersion(uint16_t* version); -OEMCryptoResult Level3_LoadSRM(const uint8_t* buffer, - size_t buffer_length); +OEMCryptoResult Level3_LoadSRM(const uint8_t* buffer, size_t buffer_length); OEMCryptoResult Level3_RemoveSRM(); OEMCryptoResult Level3_CreateUsageTableHeader(uint8_t* header_buffer, size_t* header_buffer_length); OEMCryptoResult Level3_LoadUsageTableHeader(const uint8_t* buffer, size_t buffer_length); OEMCryptoResult Level3_CreateNewUsageEntry(OEMCrypto_SESSION session, - uint32_t *usage_entry_number); -OEMCryptoResult Level3_LoadUsageEntry(OEMCrypto_SESSION session, - uint32_t index, - const uint8_t *buffer, + uint32_t* usage_entry_number); +OEMCryptoResult Level3_LoadUsageEntry(OEMCrypto_SESSION session, uint32_t index, + const uint8_t* buffer, size_t buffer_size); OEMCryptoResult Level3_UpdateUsageEntry(OEMCrypto_SESSION session, uint8_t* header_buffer, @@ -328,24 +302,18 @@ OEMCryptoResult Level3_UpdateUsageEntry(OEMCrypto_SESSION session, OEMCryptoResult Level3_ShrinkUsageTableHeader(uint32_t new_table_size, uint8_t* header_buffer, size_t* header_buffer_length); -OEMCryptoResult Level3_MoveEntry(OEMCrypto_SESSION session, - uint32_t new_index); -OEMCryptoResult Level3_CopyOldUsageEntry(OEMCrypto_SESSION session, - const uint8_t*pst, - size_t pst_length); -OEMCryptoResult Level3_CreateOldUsageEntry(uint64_t time_since_license_received, - uint64_t time_since_first_decrypt, - uint64_t time_since_last_decrypt, - OEMCrypto_Usage_Entry_Status status, - uint8_t *server_mac_key, - uint8_t *client_mac_key, - const uint8_t* pst, - size_t pst_length); +OEMCryptoResult Level3_MoveEntry(OEMCrypto_SESSION session, uint32_t new_index); uint32_t Level3_GetAnalogOutputFlags(); OEMCryptoResult Level3_LoadTestKeybox(const uint8_t* buffer, size_t length); OEMCryptoResult Level3_SelectKey(const OEMCrypto_SESSION session, const uint8_t* key_id, size_t key_id_length, OEMCryptoCipherMode cipher_mode); +OEMCryptoResult Level3_LoadLicense(OEMCrypto_SESSION session, + const uint8_t* message, + size_t message_length, + size_t core_message_length, + const uint8_t* signature, + size_t signature_length); OEMCryptoResult Level3_LoadKeys( OEMCrypto_SESSION session, const uint8_t* message, size_t message_length, const uint8_t* signature, size_t signature_length, @@ -364,10 +332,18 @@ OEMCryptoResult Level3_SetDecryptHash(OEMCrypto_SESSION session, OEMCryptoResult Level3_GetHashErrorCode(OEMCrypto_SESSION session, uint32_t* failed_frame_number); const char* Level3_BuildInformation(); -OEMCryptoResult Level3_RefreshKeys( - OEMCrypto_SESSION session, const uint8_t* message, size_t message_length, - const uint8_t* signature, size_t signature_length, size_t num_keys, - const OEMCrypto_KeyRefreshObject* key_array); +OEMCryptoResult Level3_LoadRenewal(OEMCrypto_SESSION session, + const uint8_t* message, + size_t message_length, + size_t core_message_length, + const uint8_t* signature, + size_t signature_length); +OEMCryptoResult Level3_RefreshKeys(OEMCrypto_SESSION session, + const uint8_t* message, + size_t message_length, + const uint8_t* signature, + size_t signature_length, size_t num_keys, + const OEMCrypto_KeyRefreshObject* key_array); OEMCryptoResult Level3_LoadEntitledContentKeys( OEMCrypto_SESSION session, const uint8_t* message, size_t message_length, size_t num_keys, const OEMCrypto_EntitledContentKeyObject* key_array); @@ -375,7 +351,22 @@ OEMCryptoResult Level3_CopyBuffer( OEMCrypto_SESSION session, const uint8_t* data_addr, size_t data_length, const OEMCrypto_DestBufferDesc* out_buffer_descriptor, uint8_t subsample_flags); - +OEMCryptoResult Level3_PrepAndSignProvisioningRequest( + OEMCrypto_SESSION session, uint8_t* message, size_t message_length, + size_t* core_message_length, uint8_t* signature, size_t* signature_length); +OEMCryptoResult Level3_PrepAndSignLicenseRequest( + OEMCrypto_SESSION session, uint8_t* message, size_t message_length, + size_t* core_message_length, uint8_t* signature, size_t* signature_length); +OEMCryptoResult Level3_PrepAndSignRenewalRequest( + OEMCrypto_SESSION session, uint8_t* message, size_t message_length, + size_t* core_message_length, uint8_t* signature, size_t* signature_length); +size_t Level3_MaximumUsageTableHeaderSize(); +OEMCryptoResult Level3_AllocateSecureBuffer( + OEMCrypto_SESSION session, size_t buffer_size, + OEMCrypto_DestBufferDesc* output_descriptor, int* secure_fd); +OEMCryptoResult Level3_FreeSecureBuffer( + OEMCrypto_SESSION session, OEMCrypto_DestBufferDesc* output_descriptor, + int secure_fd); // The following are specific to Google's Level 3 implementation and are not // required. @@ -448,7 +439,7 @@ void Level3_OutputErrorLogs(); // serial number or any other character sequence representing that device. // The parameter |len| needs to be changed to reflect the length of the // unique identifier. -const char *getUniqueID(size_t *len); +const char* getUniqueID(size_t* len); // Returns a 64-bit unsigned integer to be used as a random seed for RNG. // If the operation is unsuccessful, this function returns 0. diff --git a/oemcrypto/odk/include/odk_attributes.h b/oemcrypto/odk/include/odk_attributes.h index 623a057..d14a666 100644 --- a/oemcrypto/odk/include/odk_attributes.h +++ b/oemcrypto/odk/include/odk_attributes.h @@ -6,9 +6,9 @@ #define WIDEVINE_ODK_INCLUDE_ODK_ATTRIBUTES_H_ #if defined(__GNUC__) || defined(__clang__) -#define UNUSED __attribute__((__unused__)) +# define UNUSED __attribute__((__unused__)) #else -#define UNUSED +# define UNUSED #endif #endif // WIDEVINE_ODK_INCLUDE_ODK_ATTRIBUTES_H_ diff --git a/oemcrypto/test/fuzz_tests/oemcrypto_fuzz_helper.h b/oemcrypto/test/fuzz_tests/oemcrypto_fuzz_helper.h index 7dc707e..c524196 100644 --- a/oemcrypto/test/fuzz_tests/oemcrypto_fuzz_helper.h +++ b/oemcrypto/test/fuzz_tests/oemcrypto_fuzz_helper.h @@ -36,9 +36,7 @@ class OEMCryptoLicenseAPIFuzz : public InitializeFuzz { session_.GenerateNonce(); } - ~OEMCryptoLicenseAPIFuzz() { - session_.close(); - } + ~OEMCryptoLicenseAPIFuzz() { session_.close(); } LicenseRoundTrip& license_messages() { return license_messages_; } diff --git a/oemcrypto/test/fuzz_tests/oemcrypto_fuzztests.gyp b/oemcrypto/test/fuzz_tests/oemcrypto_fuzztests.gyp index 8d818be..8eaeabf 100644 --- a/oemcrypto/test/fuzz_tests/oemcrypto_fuzztests.gyp +++ b/oemcrypto/test/fuzz_tests/oemcrypto_fuzztests.gyp @@ -5,60 +5,22 @@ # Builds under the CDM ./build.py (target platform) build system # Refer to the distribution package's README for details. { - 'target_defaults': { - 'type': 'executable', - 'includes': [ - 'oemcrypto_fuzztests.gypi', - ], + 'variables': { + 'oemcrypto_lib%': '', + 'openssl_config%': 'system', + 'openssl_target%': '', }, 'targets': [ { - 'target_name': 'oemcrypto_load_license_fuzz', + 'target_name': 'wv_ce_cdm_oemcrypto_generate_signature_fuzz_test', + 'type': 'executable', 'sources': [ - 'oemcrypto_load_license_fuzz.cc', + # The test runner and the testing device certificate. + 'oemcrypto_generate_signature.cc', ], - }, - { - 'target_name': 'oemcrypto_load_provisioning_fuzz', - 'sources': [ - 'oemcrypto_load_provisioning_fuzz.cc', + 'includes': [ + 'oemcrypto_fuzztests.gypi', ], - }, - { - 'target_name': 'oemcrypto_load_renewal_fuzz', - 'sources': [ - 'oemcrypto_load_renewal_fuzz.cc', - ], - }, - { - 'target_name': 'oemcrypto_license_request_fuzz', - 'sources': [ - 'oemcrypto_license_request_fuzz.cc', - ], - }, - { - 'target_name': 'oemcrypto_provisioning_request_fuzz', - 'sources': [ - 'oemcrypto_provisioning_request_fuzz.cc', - ], - }, - { - 'target_name': 'oemcrypto_renewal_request_fuzz', - 'sources': [ - 'oemcrypto_renewal_request_fuzz.cc', - ], - }, - { - 'target_name': 'oemcrypto_decrypt_cenc_fuzz', - 'sources': [ - 'oemcrypto_decrypt_cenc_fuzz.cc', - ], - }, - { - 'target_name': 'oemcrypto_load_entitled_content_keys_fuzz', - 'sources': [ - 'oemcrypto_load_entitled_content_keys_fuzz.cc', - ], - }, + }, ], } diff --git a/oemcrypto/test/fuzz_tests/oemcrypto_fuzztests.gypi b/oemcrypto/test/fuzz_tests/oemcrypto_fuzztests.gypi index 63293f4..0363515 100644 --- a/oemcrypto/test/fuzz_tests/oemcrypto_fuzztests.gypi +++ b/oemcrypto/test/fuzz_tests/oemcrypto_fuzztests.gypi @@ -1,88 +1,48 @@ # Copyright 2018 Google LLC. All Rights Reserved. This file and proprietary #source code may only be used and distributed under the Widevine Master License #Agreement. - +# +# Include this in any custom unit test targets. +# Does not include the test runner main. { - 'variables': { - 'boringssl_libcrypto_path%': '../../../third_party/boringssl/boringssl.gyp:crypto', - 'boringssl_libssl_path%': '../../../third_party/boringssl/boringssl.gyp:ssl', - 'oemcrypto_dir': '../..', - 'platform_specific_dir': '../../../linux/src', - 'privacy_crypto_impl%': 'boringssl', - # Flag used to generate source based code coverage reports. - 'generate_code_coverage_report%': 'false', - 'util_dir': '../../../util', - }, 'sources': [ - '../../odk/src/core_message_deserialize.cpp', - '../../odk/src/core_message_serialize.cpp', '../oec_device_features.cpp', '../oec_key_deriver.cpp', - '../oemcrypto_corpus_generator_helper.cpp', '../oec_session_util.cpp', - '../oemcrypto_corpus_generator_helper.cpp', - 'oemcrypto_fuzz_helper.cc', '../oemcrypto_session_tests_helper.cpp', - '<(platform_specific_dir)/file_store.cpp', - '<(platform_specific_dir)/log.cpp', - '<(util_dir)/src/platform.cpp', - '<(util_dir)/src/rw_lock.cpp', - '<(util_dir)/src/string_conversions.cpp', - '<(util_dir)/test/test_sleep.cpp', - '<(util_dir)/test/test_clock.cpp', + '../oemcrypto_session_tests_helper.h', + '../../../cdm/test/device_cert.cpp', + '../../../cdm/test/device_cert.h', ], 'include_dirs': [ - '../../../third_party/fuzz', - '<(util_dir)/include', - '<(util_dir)/test', - '<(oemcrypto_dir)/include', - '<(oemcrypto_dir)/ref/src', - '<(oemcrypto_dir)/test', - '<(oemcrypto_dir)/test/fuzz_tests', - '<(oemcrypto_dir)/odk/include', - '<(oemcrypto_dir)/odk/src', - ], - 'includes': [ - '../../../util/libssl_dependency.gypi', - '../../ref/oec_ref.gypi', - ], - 'dependencies': [ - '../../../third_party/gmock.gyp:gtest', - '../../../third_party/gmock.gyp:gmock', + '../../../core/include', # log.h + '../../include', + '../../ref/src', # oemcrypto_key_ref.h + '../', + '../../../cdm/test', ], 'defines': [ + 'OEMCRYPTO_TESTS', 'OEMCRYPTO_FUZZ_TESTS', ], - 'conditions': [ - ['generate_code_coverage_report=="false"', { - # Include flags to build fuzzer binaries for cluster fuzz. - 'cflags_cc': [ - '-std=c++11', - '-fsanitize=fuzzer,address,undefined', - # Need -g flag to include source line numbers in error stack trace. - '-g', - ], - 'ldflags': [ - '-fPIC', - '-fsanitize=fuzzer,address,undefined', - ], - }], - ['generate_code_coverage_report=="true"', { - # Include flags to build fuzzer binaries to generate source based code coverage reports. - 'cflags_cc': [ - '-std=c++11', - '-fprofile-instr-generate', - '-fcoverage-mapping', - ], - 'ldflags': [ - '-fPIC', - '-fsanitize=fuzzer,address,undefined', - '-fprofile-instr-generate', - '-fcoverage-mapping', - ], - }], - ], # conditions 'libraries': [ - '-lpthread', + '../../../third_party/fuzz/platforms/x86-64/libFuzzer.a', + ], + 'dependencies': [ + '../../../cdm/cdm.gyp:widevine_ce_cdm_shared', + '../../../third_party/gmock.gyp:gmock', + '../../../third_party/gmock.gyp:gtest', + ], + 'conditions': [ + ['oemcrypto_lib==""', { + 'includes': [ + '../../ref/oec_ref.gypi', + ], + }, { + 'libraries': [ + '../../../third_party/fuzz/platforms/x86-64/libFuzzer.a', + '<(oemcrypto_lib)', + ], + }], ], } diff --git a/oemcrypto/test/oemcrypto_test.cpp b/oemcrypto/test/oemcrypto_test.cpp index 3210aca..dc7e1ac 100644 --- a/oemcrypto/test/oemcrypto_test.cpp +++ b/oemcrypto/test/oemcrypto_test.cpp @@ -217,7 +217,9 @@ TEST_F(OEMCryptoClientTest, VersionNumber) { EXPECT_EQ(ODK_MAJOR_VERSION, 16); // Note on minor versions. Widevine requires version 16.3 or greater for CE // CDM and Android devices. For CE CDM devices that do not support usage - // tables, we strongly recommend 16.4. + // tables, we strongly recommend 16.4. Note: This is the version of the ODK + // library built into the tests, which might be different from the version + // that is pre-compiled into liboemcrypto.so. EXPECT_GE(ODK_MINOR_VERSION, 3); EXPECT_LE(ODK_MINOR_VERSION, 4); EXPECT_EQ(kCurrentAPI, 16u); @@ -226,7 +228,9 @@ TEST_F(OEMCryptoClientTest, VersionNumber) { ASSERT_EQ('L', level[0]); cout << " OEMCrypto Security Level is " << level << endl; uint32_t version = OEMCrypto_APIVersion(); - cout << " OEMCrypto API version is " << version << endl; + uint32_t minor_version = OEMCrypto_MinorAPIVersion(); + cout << " OEMCrypto API version is " << version << "." + << minor_version << endl; if (OEMCrypto_SupportsUsageTable()) { cout << " OEMCrypto supports usage tables" << endl; } else {