+
    漰i                         ^ RI HtHt ^ RIt^ RIHtHt ^ RIHtH	t	 ^ RI
t
^ RIt^ RIt^ RIt^ RIHu Ht ^ RIt^ RIt^ RIHt ^ RIHt ^ RIHt ^ RIHt R	R
RRRR/tR	RRR/tR	RRRRR/t ! R R]4      tR# )    )BaseHTTPRequestHandler
HTTPServerN)urlparseparse_qs)Requesturlopen)serialization)hashes)padding)	b64encodewidevinez,https://widevine.keyos.com/api/v4/getLicense	playreadyz-https://playready.keyos.com/api/v4/getLicensefairplayz,https://fairplay.keyos.com/api/v4/getLicensez0https://widevine.keyos.com/api/v4/getCertificatez0https://fairplay.keyos.com/api/v4/getCertificateapplication/octet-streamtext/xml; charset=utf-8text/plain; charset=utf-8c                      a  ] tR t^(t o Rt]P                  ! 4       tR]n        ]P                  ]n
        R tR tRR ltR tRR ltR	 tR
 tRtV tR# )LAProxy_RequestHandler(5448EC23A7492E3CB26596ACEA7B0D6B2A91206AFc                   \        R R4      ;_uu_ 4       p\        P                  ! V4      pRRR4       XP                  R4      p\        VR4      ;_uu_ 4       p\        P
                  ! VP                  4       RR7      pRRR4       \        P                  ! R4      p\        P                  P                  \        P                  P                  4      pV\        P                  ! ^R7      ,           pVP                  R4      R!,          P                  R	4      ^ ,          p	VP                  R
4      R,          \        P                   ! VR4      n        VP                  R
4      R,          \        P                   ! VR4      n        \%        \&        P(                  ! 4       4      \        P                   ! VR4      n        V	\        P                   ! VR4      n        \        P                   ! VRRRRR/4      p
\        P                   ! VRRR/4      pR\        P                   ! VR4      n        \        P                   ! VRRR/4       \        P                   ! VR4       \+        XP-                  \        P.                  ! V4      \0        P2                  ! 4       \4        P6                  ! 4       4      4      p\        P                  ! R4      pVP9                  V4       VP;                  4       \        P                   ! VR4      n        \+        \        P.                  ! V4      4      P;                  R 4      pV#   + '       g   i     EL; i  + '       g   i     EL; i)"zconfig.jsonrNKEYOS_KEY_FILErb)passwordData)minutes/.z%Y-%m-%d %H:%M:%S.%f:r      NGenerationTimeExpirationTimeUniqueIdRSAPubKeyIdWidevinePolicy
fl_CanPlaytruefl_CanPersistfalseWidevineContentKeySpec	TrackTypeHD1SecurityLevelLicensetypesimpleFairPlayPolicyKeyOSAuthenticationXML	Signaturezutf-8)openjsonloadgetr	   load_pem_private_keyreadETElementdatetimenowtimezoneutc	timedeltasplitstrftime
SubElementtextstruuiduuid4r   signtostringr   PKCS1v15r
   SHA1appenddecode)selffconfig_datakeyos_key_filekey_fileprivate_keydata_elgeneration_timeexpiration_timekey_namewv_content_policywv_content_key_spec_el	signatureroot_elauth_xmls   &              E/Users/206896366@bwt3.com/workspace/fah_poc_player/drm/keyos_proxy.py_fetch_auth_xml&LAProxy_RequestHandler._fetch_auth_xml?   sg   -%%))A,K &$)9:.$''8'<<X]]_W[\K (**V$"++//0A0A0E0EF)H,>,>q,II!'',R066s;A>8G8P8PQg8him8ng/058G8P8PQg8him8ng/0525djjl2Cgz*/5=g}-2 MM'3ClTZ\kmtEuv!#w8PS^`dRe!fFI,o>C 	gy68*<= 	g/0k..r{{7/CWEUEUEWY_YdYdYfgh	**56w3<3C3C3Eg{+0bkk'23::7C? &%% (''s   L3'M3M	M	c                r    V P                  R R4       V P                  RR4       V P                  RR4       R# )zAccess-Control-Allow-Origin*zAccess-Control-Allow-MethodszGET, POST, OPTIONSzAccess-Control-Allow-HeadersContent-TypeN)send_headerrO   s   &r^   _send_cors_headers)LAProxy_RequestHandler._send_cors_headersb   s6    6<79MN7H    c                6   \        V4      \        J d   \        VR 4      pV P                  V4       V P	                  RV4       V P	                  R\        V4      4       V P                  4        V P                  4        V P                  P                  V4       R# )zUTF-8rc   Content-LengthN)
r/   rF   bytessend_responserd   lenrf   end_headerswfilewrite)rO   data
error_codecontent_types   &&&&r^   _respondLAProxy_RequestHandler._respondg   sw    :w'D:&6)3t95!

rh   c                h    V P                  ^4       V P                  4        V P                  4        R# )   N)rl   rf   rn   re   s   &r^   
do_OPTIONS!LAProxy_RequestHandler.do_OPTIONSr   s(    3!rh   Nc                H   \        WW$R7      p \        V4      ;_uu_ 4       pVP                  4       VP                  3uuRRR4       #   + '       g   i     R# ; i  \         d:   p\        TR4      '       d"   TP                  4       TP                  3u Rp?# h Rp?ii ; i)z9Sends a request to KeyOS and returns (body, status_code).)rq   headersmethodNr:   )r   r   r:   status	Exceptionhasattrcode)rO   urlr{   payloadr|   reqrespes   &&&&&   r^   _forward_to_keyos(LAProxy_RequestHandler._forward_to_keyosw   sp    cH	yy{DKK/  	q&!!vvx''	s?   A A	
A 	A	A A B!(-BB!BB!c                (    \        V P                  4      P                  pVR8w  d   V P                  RR4      # \        R,          RP	                  V P
                  4      ,           pRV P                  4       /pV P                  W#RR7      w  rEV P                  WER	4      #   \         dg   p\        R4       \        P                  ! \        P                  R
7       \        R4       T P                  RP	                  T4      R4      u Rp?# Rp?ii ; i)zHandles FairPlay certificate request.
The playback client fetches the FPS certificate before it can generate the license challenge (SPC).z/fps/certificatez
Not found.i  r   z?certHash={}x-keyos-authorizationGET)r|   r   fileSorry, there was an error. {}  N<------------------------------------------------------------)r   pathrt   	CERT_URLSformat_fps_cert_hashr_   r   r~   print	traceback	print_excsysstdout)rO   r   cert_urlr{   bodyr}   r   s   &      r^   do_GETLAProxy_RequestHandler.do_GET   s    	QDII&++D))}}\377 ,~/D/DTEXEX/YYH')=)=)?G  11(E1RLD==/JKK 	Q(OSZZ0(O==!@!G!G!JCPP	Qs$   7B  A%B   D+ADDDc                    \        V P                  R ,          4      pV P                  P                  V4      pV'       g   V P	                  RR4      # \        V P                  4      P                  p\        V4      pRV9  d   V P	                  RR4      # VR,          ^ ,          P                  4       p\        P                  V4      pV'       g   V P	                  RR4      # RR/pVR8X  dL   VR	8X  dE   V P                  4       VR
&   V P                  \        R,          Wr4      w  rV P	                  WR4      # V P                  4       VR
&   VR8X  d   RVR&   V P                  WgV4      w  rV P	                  W\        V,          4      #   \          dg   p
\#        R4       \$        P&                  ! \(        P*                  R7       \#        R4       T P	                  RP-                  T
4      R4      u Rp
?
# Rp
?
ii ; i)rj   z!Can't read the license challenge.r   zdrm-typez'drm-type' query param not set.z,Can't determine the license acquisition URL.rc   r   r   s   r   r   r   zAhttp://schemas.microsoft.com/DRM/2007/03/protocols/AcquireLicense
soapactionr   r   Nr   )intr{   rfiler:   rt   r   r   queryr   lowerLA_URLSr8   r_   r   r   RESPONSE_TYPESr~   r   r   r   r   r   r   )rO   content_lengthr   r   query_componentsdrm_typela_urlr{   r   r}   r   s   &          r^   do_POSTLAProxy_RequestHandler.do_POST   s   -	Q .>!?@Njjoon5G}}%I3OO TYY'--E'!11}}%H#NN'
3A6<<>H[[*F}}%TVYZZ &'@AG :%'[*@373G3G3I/0#55i
6KW^}}T3MNN 04/C/C/EG+, ;&(k%11&7KLD==~h/GHH 	Q(OSZZ0(O==!@!G!G!JCPP	Qs@   AF	 AF	 :F	 F	 #AF	 9AF	 	G:AG5/G:5G: )ztext/html; charset=utf-8)NPOST)__name__
__module____qualname____firstlineno__r   sslcreate_default_context_ssl_ctxcheck_hostname	CERT_NONEverify_moder_   rf   rt   rx   r   r   r   __static_attributes____classdictcell__)__classdict__s   @r^   r   r   (   s[     ?N ))+H#H==H  FI
	
	Q..Q .Qrh   r   )http.serverr   r   r6   urllib.parser   r   urllib.requestr   r   r   r   r   xml.etree.ElementTreeetreeElementTreer;   r=   rG   cryptography.hazmat.primitivesr	   r
   )cryptography.hazmat.primitives.asymmetricr   base64r   r   r   r   r   r   rh   r^   <module>r      s    :  + + 
   " "   8 1 =  >@> BB	 **+_Q3 _Qrh   